diff --git a/package.json b/package.json index 004fd5b..bec343a 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "@sveltejs/kit": "^2.62.0", "@sveltejs/vite-plugin-svelte": "^7.1.2", "@tauri-apps/cli": "^2.11.2", + "@types/node": "^25.9.3", + "phosphor-svelte": "^3.1.0", "svelte": "^5.56.1", "svelte-check": "^4.5.0", "typescript": "^6.0.3", @@ -42,7 +44,6 @@ "@tauri-apps/plugin-store": "^2.4.3", "capacitor-native-biometric": "^4.2.2", "clsx": "^2.1.1", - "phosphor-svelte": "^3.1.0", "tauri-plugin-discord-rpc-api": "github:Youwes09/tauri-plugin-discord-rpc" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a23e29..c309f43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,28 +53,31 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 - phosphor-svelte: - specifier: ^3.1.0 - version: 3.1.0(svelte@5.56.1)(vite@8.0.16) tauri-plugin-discord-rpc-api: specifier: github:Youwes09/tauri-plugin-discord-rpc version: https://codeload.github.com/Youwes09/tauri-plugin-discord-rpc/tar.gz/d2fd312945d0573153e0e7e2d2dfb131acecc52c devDependencies: '@sveltejs/adapter-node': specifier: ^5.5.4 - version: 5.5.4(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16)) + version: 5.5.4(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3))) '@sveltejs/adapter-static': specifier: ^3.0.10 - version: 3.0.10(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16)) + version: 3.0.10(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3))) '@sveltejs/kit': specifier: ^2.62.0 - version: 2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16) + version: 2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)) '@sveltejs/vite-plugin-svelte': specifier: ^7.1.2 - version: 7.1.2(svelte@5.56.1)(vite@8.0.16) + version: 7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)) '@tauri-apps/cli': specifier: ^2.11.2 version: 2.11.2 + '@types/node': + specifier: ^25.9.3 + version: 25.9.3 + phosphor-svelte: + specifier: ^3.1.0 + version: 3.1.0(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)) svelte: specifier: ^5.56.1 version: 5.56.1 @@ -86,7 +89,7 @@ importers: version: 6.0.3 vite: specifier: ^8.0.16 - version: 8.0.16 + version: 8.0.16(@types/node@25.9.3) packages: @@ -578,6 +581,9 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/node@25.9.3': + resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -874,6 +880,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + vite@8.0.16: resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1171,23 +1180,23 @@ snapshots: dependencies: acorn: 8.16.0 - '@sveltejs/adapter-node@5.5.4(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16))': + '@sveltejs/adapter-node@5.5.4(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)))': dependencies: '@rollup/plugin-commonjs': 29.0.3(rollup@4.61.0) '@rollup/plugin-json': 6.1.0(rollup@4.61.0) '@rollup/plugin-node-resolve': 16.0.3(rollup@4.61.0) - '@sveltejs/kit': 2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16) + '@sveltejs/kit': 2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)) rollup: 4.61.0 - '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)))': dependencies: - '@sveltejs/kit': 2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16) + '@sveltejs/kit': 2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)) - '@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16)': + '@sveltejs/kit@2.62.0(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)))(svelte@5.56.1)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3))': dependencies: '@standard-schema/spec': 1.1.0 '@sveltejs/acorn-typescript': 1.0.10(acorn@8.16.0) - '@sveltejs/vite-plugin-svelte': 7.1.2(svelte@5.56.1)(vite@8.0.16) + '@sveltejs/vite-plugin-svelte': 7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)) '@types/cookie': 0.6.0 acorn: 8.16.0 cookie: 0.6.0 @@ -1199,18 +1208,18 @@ snapshots: set-cookie-parser: 3.1.0 sirv: 3.0.2 svelte: 5.56.1 - vite: 8.0.16 + vite: 8.0.16(@types/node@25.9.3) optionalDependencies: typescript: 6.0.3 - '@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16)': + '@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3))': dependencies: deepmerge: 4.3.1 magic-string: 0.30.21 obug: 2.1.1 svelte: 5.56.1 - vite: 8.0.16 - vitefu: 1.1.3(vite@8.0.16) + vite: 8.0.16(@types/node@25.9.3) + vitefu: 1.1.3(vite@8.0.16(@types/node@25.9.3)) '@tauri-apps/api@2.11.0': {} @@ -1298,6 +1307,10 @@ snapshots: '@types/estree@1.0.9': {} + '@types/node@25.9.3': + dependencies: + undici-types: 7.24.6 + '@types/resolve@1.20.2': {} '@types/trusted-types@2.0.7': {} @@ -1436,13 +1449,13 @@ snapshots: path-parse@1.0.7: {} - phosphor-svelte@3.1.0(svelte@5.56.1)(vite@8.0.16): + phosphor-svelte@3.1.0(svelte@5.56.1)(vite@8.0.16(@types/node@25.9.3)): dependencies: estree-walker: 3.0.3 magic-string: 0.30.21 svelte: 5.56.1 optionalDependencies: - vite: 8.0.16 + vite: 8.0.16(@types/node@25.9.3) picocolors@1.1.1: {} @@ -1579,7 +1592,9 @@ snapshots: typescript@6.0.3: {} - vite@8.0.16: + undici-types@7.24.6: {} + + vite@8.0.16(@types/node@25.9.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -1587,10 +1602,11 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: + '@types/node': 25.9.3 fsevents: 2.3.3 - vitefu@1.1.3(vite@8.0.16): + vitefu@1.1.3(vite@8.0.16(@types/node@25.9.3)): optionalDependencies: - vite: 8.0.16 + vite: 8.0.16(@types/node@25.9.3) zimmerframe@1.1.4: {} diff --git a/src/lib/components/browse/GenreDrillPage.svelte b/src/lib/components/browse/GenreDrillPage.svelte index 2afe8b4..7e6c9b0 100644 --- a/src/lib/components/browse/GenreDrillPage.svelte +++ b/src/lib/components/browse/GenreDrillPage.svelte @@ -6,14 +6,25 @@ import { dedupeMangaById, shouldHideNsfw } from "$lib/core/util"; import Thumbnail from "$lib/components/shared/manga/Thumbnail.svelte"; import ContextMenu from "$lib/components/shared/ui/ContextMenu.svelte"; - import { ArrowLeft, BookmarkSimple, FolderSimplePlus, Folder, CircleNotch } from "phosphor-svelte"; + import { ArrowLeftIcon, BookmarkSimpleIcon, FolderSimplePlusIcon, FolderIcon, CircleNotchIcon } from "phosphor-svelte"; import type { Manga, Source, Category } from "$lib/types"; - import type { MenuEntry } from "$lib/components/shared/ui/ContextMenu.svelte"; import { PAGE_SIZE, INITIAL_PAGES, MAX_SOURCES, parseTags, tagsLabel, matchesAllTags, runConcurrent, } from "$lib/components/browse/lib/searchFilter"; + interface MenuItem { + label: string; + icon?: any; + onClick: () => void; + danger?: boolean; + disabled?: boolean; + separator?: never; + children?: MenuEntry[]; + } + interface MenuSeparator { separator: true } + type MenuEntry = MenuItem | MenuSeparator; + interface Props { genre: string; onBack: () => void; @@ -63,17 +74,17 @@ const t = parseTags(filter); const pt = t[0] ?? ""; - getAdapter().getMangaList({}).then((result) => { + getAdapter().getMangaList({}).then((result: { items: Manga[] }) => { if (!ctrl.signal.aborted) libraryManga = result.items; }).catch(() => {}); - getAdapter().getSources().then(async (allSources) => { + getAdapter().getSources().then(async (allSources: Source[]) => { if (ctrl.signal.aborted) return; const srcs = allSources.filter((s: Source) => s.id !== "0").slice(0, MAX_SOURCES); sources = srcs; for (const src of srcs) nextPageMap.set(src.id, -1); - await runConcurrent(srcs, async (src) => { + await runConcurrent(srcs, async (src: Source) => { if (ctrl.signal.aborted) return; const pageItems: Manga[] = []; for (let page = 1; page <= INITIAL_PAGES; page++) { @@ -108,7 +119,7 @@ const ctrl = new AbortController(); abortCtrl = ctrl; try { - await runConcurrent(srcs, async (src) => { + await runConcurrent(srcs, async (src: Source) => { const page = nextPageMap.get(src.id)!; if (ctrl.signal.aborted) return; let result: { items: Manga[]; hasNextPage: boolean } | null = null; @@ -131,7 +142,7 @@ if (!catsLoaded) { catsLoaded = true; getAdapter().getCategories() - .then((cats) => { categories = cats.filter((c) => c.id !== 0); }) + .then((cats: Category[]) => { categories = cats.filter((c: Category) => c.id !== 0); }) .catch(console.error); } } @@ -140,7 +151,7 @@ return [ { label: m.inLibrary ? "In Library" : "Add to library", - icon: BookmarkSimple, + icon: BookmarkSimpleIcon, disabled: m.inLibrary, onClick: () => getAdapter().addToLibrary(String(m.id)) .then(() => { sourceManga = sourceManga.map((x) => x.id === m.id ? { ...x, inLibrary: true } : x); }) @@ -149,17 +160,17 @@ ...(categories.length > 0 ? [ { separator: true } as MenuEntry, ...categories.map((cat): MenuEntry => ({ - label: (cat.mangas?.nodes ?? []).some((x: { id: number }) => x.id === m.id) ? `✓ ${cat.name}` : cat.name, - icon: Folder, + label: (cat.mangas ?? []).some((x: Manga) => x.id === m.id) ? `✓ ${cat.name}` : cat.name, + icon: FolderIcon, onClick: () => getAdapter().updateMangaCategories(String(m.id), [cat.id], []).catch(console.error), })), ] : []), { separator: true }, { label: "New folder & add", - icon: FolderSimplePlus, + icon: FolderSimplePlusIcon, onClick: async () => { - const name = prompt("Folder name:"); + const name = prompt("FolderIcon name:"); if (!name?.trim()) return; const cat = await getAdapter().createCategory(name.trim()).catch(console.error); if (cat) { @@ -177,7 +188,7 @@