diff --git a/website/package.json b/website/package.json
index 4130a6f2..0693b945 100644
--- a/website/package.json
+++ b/website/package.json
@@ -40,6 +40,8 @@
"@mdit/plugin-img-size": "^0.4.8",
"@mdit/plugin-include": "^0.4.8",
"@mdit/plugin-tab": "^0.4.8",
+ "@types/lodash.groupby": "^4.6.7",
+ "@types/markdown-it": "^13.0.1",
"@typescript-eslint/eslint-plugin": "^6.5.0",
"@typescript-eslint/parser": "^6.5.0",
"eslint": "^8.48.0",
@@ -70,9 +72,12 @@
},
"dependencies": {
"@mdi/js": "^7.2.96",
+ "@tanstack/vue-query": "^4.34.0",
"axios": "^1.5.0",
"element-plus": "^2.3.12",
"lodash.groupby": "^4.6.0",
+ "markdown-it": "^13.0.1",
+ "moment": "^2.29.4",
"vitepress-plugin-auto-sidebar": "^1.1.0"
}
}
diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml
index c4415526..7b06ed8b 100644
--- a/website/pnpm-lock.yaml
+++ b/website/pnpm-lock.yaml
@@ -1,13 +1,12 @@
lockfileVersion: '6.0'
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
dependencies:
'@mdi/js':
specifier: ^7.2.96
version: 7.2.96
+ '@tanstack/vue-query':
+ specifier: ^4.34.0
+ version: 4.34.0(vue@3.3.4)
axios:
specifier: ^1.5.0
version: 1.5.0
@@ -17,6 +16,12 @@ dependencies:
lodash.groupby:
specifier: ^4.6.0
version: 4.6.0
+ markdown-it:
+ specifier: ^13.0.1
+ version: 13.0.1
+ moment:
+ specifier: ^2.29.4
+ version: 2.29.4
vitepress-plugin-auto-sidebar:
specifier: ^1.1.0
version: 1.1.0
@@ -43,6 +48,12 @@ devDependencies:
'@mdit/plugin-tab':
specifier: ^0.4.8
version: 0.4.8
+ '@types/lodash.groupby':
+ specifier: ^4.6.7
+ version: 4.6.7
+ '@types/markdown-it':
+ specifier: ^13.0.1
+ version: 13.0.1
'@typescript-eslint/eslint-plugin':
specifier: ^6.5.0
version: 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2)
@@ -765,6 +776,33 @@ packages:
resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
dev: false
+ /@tanstack/match-sorter-utils@8.8.4:
+ resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==}
+ engines: {node: '>=12'}
+ dependencies:
+ remove-accents: 0.4.2
+ dev: false
+
+ /@tanstack/query-core@4.33.0:
+ resolution: {integrity: sha512-qYu73ptvnzRh6se2nyBIDHGBQvPY1XXl3yR769B7B6mIDD7s+EZhdlWHQ67JI6UOTFRaI7wupnTnwJ3gE0Mr/g==}
+ dev: false
+
+ /@tanstack/vue-query@4.34.0(vue@3.3.4):
+ resolution: {integrity: sha512-jXqvP5z+9mAuUVELH4A9j+KYhu84IpBFDGo60Z+9GV/td+CeDBLRoijBEixBg87SEilCCpJugc0yx2MOCwlwew==}
+ peerDependencies:
+ '@vue/composition-api': ^1.1.2
+ vue: ^2.5.0 || ^3.0.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ dependencies:
+ '@tanstack/match-sorter-utils': 8.8.4
+ '@tanstack/query-core': 4.33.0
+ '@vue/devtools-api': 6.5.0
+ vue: 3.3.4
+ vue-demi: 0.13.11(vue@3.3.4)
+ dev: false
+
/@types/eslint@8.44.2:
resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==}
dependencies:
@@ -794,9 +832,14 @@ packages:
'@types/lodash': 4.14.197
dev: false
+ /@types/lodash.groupby@4.6.7:
+ resolution: {integrity: sha512-dFUR1pqdMgjIBbgPJ/8axJX6M1C7zsL+HF4qdYMQeJ7XOp0Qbf37I3zh9gpXr/ks6tgEYPDRqyZRAnFYvewYHQ==}
+ dependencies:
+ '@types/lodash': 4.14.197
+ dev: true
+
/@types/lodash@4.14.197:
resolution: {integrity: sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==}
- dev: false
/@types/markdown-it@12.2.3:
resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
@@ -805,6 +848,13 @@ packages:
'@types/mdurl': 1.0.2
dev: true
+ /@types/markdown-it@13.0.1:
+ resolution: {integrity: sha512-SUEb8Frsxs3D5Gg9xek6i6EG6XQ5s+O+ZdQzIPESZVZw3Pv3CPQfjCJBI+RgqZd1IBeu18S0Rn600qpPnEK37w==}
+ dependencies:
+ '@types/linkify-it': 3.0.2
+ '@types/mdurl': 1.0.2
+ dev: true
+
/@types/mdurl@1.0.2:
resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
dev: true
@@ -996,7 +1046,6 @@ packages:
/@vue/devtools-api@6.5.0:
resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==}
- dev: true
/@vue/reactivity-transform@3.3.4:
resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==}
@@ -1237,7 +1286,6 @@ packages:
/argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- dev: true
/array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
@@ -1700,7 +1748,6 @@ packages:
/entities@3.0.1:
resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==}
engines: {node: '>=0.12'}
- dev: true
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
@@ -2732,7 +2779,6 @@ packages:
resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==}
dependencies:
uc.micro: 1.0.6
- dev: true
/lint-staged@14.0.1:
resolution: {integrity: sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==}
@@ -2875,7 +2921,6 @@ packages:
linkify-it: 4.0.1
mdurl: 1.0.1
uc.micro: 1.0.6
- dev: true
/markdown-it@8.4.2:
resolution: {integrity: sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==}
@@ -2947,7 +2992,6 @@ packages:
/mdurl@1.0.1:
resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
- dev: true
/memoize-one@6.0.0:
resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
@@ -3048,6 +3092,10 @@ packages:
resolution: {integrity: sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==}
dev: true
+ /moment@2.29.4:
+ resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
+ dev: false
+
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
dev: true
@@ -3385,6 +3433,10 @@ packages:
functions-have-names: 1.2.3
dev: true
+ /remove-accents@0.4.2:
+ resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==}
+ dev: false
+
/require-from-string@2.0.2:
resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
engines: {node: '>=0.10.0'}
@@ -3970,7 +4022,6 @@ packages:
/uc.micro@1.0.6:
resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
- dev: true
/unbox-primitive@1.0.2:
resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
@@ -4117,6 +4168,21 @@ packages:
resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
dev: true
+ /vue-demi@0.13.11(vue@3.3.4):
+ resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ '@vue/composition-api': ^1.0.0-rc.1
+ vue: ^3.0.0-0 || ^2.6.0
+ peerDependenciesMeta:
+ '@vue/composition-api':
+ optional: true
+ dependencies:
+ vue: 3.3.4
+ dev: false
+
/vue-demi@0.14.6(vue@3.3.4):
resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
engines: {node: '>=12'}
@@ -4254,3 +4320,7 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
dev: true
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
diff --git a/website/src/.vitepress/config/scripts/languages.ts b/website/src/.vitepress/config/scripts/languages.ts
index dd3fdc6f..01ed77cb 100644
--- a/website/src/.vitepress/config/scripts/languages.ts
+++ b/website/src/.vitepress/config/scripts/languages.ts
@@ -1,12 +1,12 @@
-export function simpleLangName(code) {
+export function simpleLangName(code: string) {
if (code === "all") {
return "All";
}
const namesInEnglish = new Intl.DisplayNames(["en"], { type: "language" });
- return namesInEnglish.of(code);
+ return namesInEnglish.of(code)!;
}
-export function langName(code) {
+export function langName(code: string) {
if (code === "all") {
return "All";
}
diff --git a/website/src/.vitepress/theme/components/DownloadButtons.vue b/website/src/.vitepress/theme/components/DownloadButtons.vue
new file mode 100644
index 00000000..531631ef
--- /dev/null
+++ b/website/src/.vitepress/theme/components/DownloadButtons.vue
@@ -0,0 +1,75 @@
+
+
+
+
+ This is the fancy loading indicator
+
+
+ This is the error message: {{ errorStable }}
+
+
+ This is the error message: {{ errorPreview }}
+
+
+
+
+ Requires Android 6.0 or higher.
+
+
+
+
+
diff --git a/website/src/.vitepress/theme/components/Extensions/ExtensionsWrapper.vue b/website/src/.vitepress/theme/components/Extensions/ExtensionsWrapper.vue
index be8e8eb0..d24ebfde 100644
--- a/website/src/.vitepress/theme/components/Extensions/ExtensionsWrapper.vue
+++ b/website/src/.vitepress/theme/components/Extensions/ExtensionsWrapper.vue
@@ -1,102 +1,91 @@
-
-
-
+
+
diff --git a/website/src/.vitepress/theme/components/ReleaseDate.vue b/website/src/.vitepress/theme/components/ReleaseDate.vue
new file mode 100644
index 00000000..6053b235
--- /dev/null
+++ b/website/src/.vitepress/theme/components/ReleaseDate.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/website/src/.vitepress/theme/components/WhatsNew.vue b/website/src/.vitepress/theme/components/WhatsNew.vue
new file mode 100644
index 00000000..5733e62c
--- /dev/null
+++ b/website/src/.vitepress/theme/components/WhatsNew.vue
@@ -0,0 +1,52 @@
+
+
+
+
+ This is the fancy loading indicator
+
+
+ This is the error message: {{ error }}
+
+
+
What's new
+
+
+
+ View the full release
+
+ here
+
+
+
+
+
+
+
diff --git a/website/src/.vitepress/theme/index.ts b/website/src/.vitepress/theme/index.ts
index 1a9f3ce4..1a50ae84 100644
--- a/website/src/.vitepress/theme/index.ts
+++ b/website/src/.vitepress/theme/index.ts
@@ -7,6 +7,8 @@ import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import "element-plus/theme-chalk/dark/css-vars.css";
+import { VueQueryPlugin } from "@tanstack/vue-query"
+
import { enhanceAppWithTabs } from "vitepress-plugin-tabs/client";
export default {
@@ -18,6 +20,7 @@ export default {
},
enhanceApp({ app, router, siteData }) {
app.use(ElementPlus);
+ app.use(VueQueryPlugin);
enhanceAppWithTabs(app);
},
};
diff --git a/website/src/.vitepress/theme/queries/useExtensionsRepositoryQuery.ts b/website/src/.vitepress/theme/queries/useExtensionsRepositoryQuery.ts
new file mode 100644
index 00000000..5d988d49
--- /dev/null
+++ b/website/src/.vitepress/theme/queries/useExtensionsRepositoryQuery.ts
@@ -0,0 +1,47 @@
+import { useQuery } from "@tanstack/vue-query";
+import axios from "axios";
+import { GITHUB_EXTENSION_JSON } from "../../config/constants";
+
+export type ReleaseType = "stable" | "preview";
+
+export interface Extension {
+ name: string
+ pkg: string
+ apk: string
+ lang: string
+ code: number
+ version: string
+ nsfw: number
+ hasReadme: number
+ hasChangelog: number
+ sources: Source[]
+}
+
+export interface Source {
+ name: string
+ lang: string
+ id: string
+ baseUrl: string
+ versionId: number
+ hasCloudflare: string
+}
+
+export interface GitHubAsset {
+ name: string
+ content_type: string
+ browser_download_url: string
+}
+
+
+export default function useExtensionsRepositoryQuery() {
+ return useQuery({
+ queryKey: ["extensions"],
+ queryFn: async () => {
+ const { data } = await axios.get(GITHUB_EXTENSION_JSON);
+
+ return data;
+ },
+ initialData: () => [],
+ refetchOnWindowFocus: false,
+ })
+}
diff --git a/website/src/.vitepress/theme/queries/useReleaseQuery.ts b/website/src/.vitepress/theme/queries/useReleaseQuery.ts
new file mode 100644
index 00000000..641a88ee
--- /dev/null
+++ b/website/src/.vitepress/theme/queries/useReleaseQuery.ts
@@ -0,0 +1,39 @@
+import { useQuery } from "@tanstack/vue-query";
+import axios from "axios";
+import { GITHUB_STABLE_API, GITHUB_PREVIEW_API } from "../../config/constants";
+import { unref, type Ref } from 'vue';
+
+export type ReleaseType = "stable" | "preview";
+
+export interface GitHubRelease {
+ body: string
+ tag_name: string
+ name: string
+ assets: GitHubAsset[]
+ published_at: string
+}
+
+export interface GitHubAsset {
+ name: string
+ content_type: string
+ browser_download_url: string
+}
+
+const apiUrls: Record = {
+ stable: GITHUB_STABLE_API,
+ preview: GITHUB_PREVIEW_API,
+};
+
+export default function useReleaseQuery(type: ReleaseType | Ref) {
+ return useQuery({
+ queryKey: ["release", type],
+ queryFn: async () => {
+ const typeKey = unref(type);
+ const { data } = await axios.get(apiUrls[typeKey]);
+
+ return data;
+ },
+ initialData: () => null,
+ refetchOnWindowFocus: false,
+ })
+}
diff --git a/website/src/download/index.md b/website/src/download/index.md
index 46f5eec6..1e49aae5 100644
--- a/website/src/download/index.md
+++ b/website/src/download/index.md
@@ -3,8 +3,16 @@ title: Download
description: Download page that allows users to access and install the latest version of the app.
---
+
+
# Download
-Download page that allows users to access and install the latest version of the app.
+Download the latest stable version of **Tachiyomi** that released or the preview version that released .
-![GitHub all releases](https://img.shields.io/github/downloads/tachiyomiorg/tachiyomi/total?label=downloads&labelColor=27303D&color=0D1117&logo=github&logoColor=FFFFFF&style=flat)
+
+
+