diff --git a/package-lock.json b/package-lock.json index 7fa7358..90a0e04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "z-reader", "version": "0.0.1", "dependencies": { + "@zip.js/zip.js": "^2.7.20", "panzoom": "^9.4.3" }, "devDependencies": { @@ -885,6 +886,15 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.20", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.20.tgz", + "integrity": "sha512-rh5cby/bBOYC+hcK9qElDzbiIDeL3nhHPUTIE6/FQZR8mhY7azpthPdYbSNMOYBfv0AM188RNJ2yjtXsUfbAuQ==", + "engines": { + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -3698,6 +3708,11 @@ "eslint-visitor-keys": "^3.3.0" } }, + "@zip.js/zip.js": { + "version": "2.7.20", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.20.tgz", + "integrity": "sha512-rh5cby/bBOYC+hcK9qElDzbiIDeL3nhHPUTIE6/FQZR8mhY7azpthPdYbSNMOYBfv0AM188RNJ2yjtXsUfbAuQ==" + }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", diff --git a/package.json b/package.json index 03c44fa..3ca43a6 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ }, "type": "module", "dependencies": { + "@zip.js/zip.js": "^2.7.20", "panzoom": "^9.4.3" } } diff --git a/src/app.css b/src/app.css index b1ac2b8..9532c0d 100644 --- a/src/app.css +++ b/src/app.css @@ -13,6 +13,7 @@ button { border: none; + font-family: var(--font-family); background-color: transparent; color: white; } diff --git a/src/lib/assets/001.jpg b/src/lib/assets/001.jpg new file mode 100644 index 0000000..7cf39e2 Binary files /dev/null and b/src/lib/assets/001.jpg differ diff --git a/src/lib/assets/049.jpg b/src/lib/assets/049.jpg new file mode 100644 index 0000000..0f12383 Binary files /dev/null and b/src/lib/assets/049.jpg differ diff --git a/src/lib/catalog/index.ts b/src/lib/catalog/index.ts index e9424fd..b4a0be6 100644 --- a/src/lib/catalog/index.ts +++ b/src/lib/catalog/index.ts @@ -1,4 +1,5 @@ -import type { Manga } from "$lib/types/catalog"; +import type { Manga, Volume } from "$lib/types/catalog"; import { writable } from "svelte/store"; export const currentManga = writable(undefined); +export const currentVolume = writable(undefined); diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte index 61a2b5b..fae57bf 100644 --- a/src/lib/components/Button.svelte +++ b/src/lib/components/Button.svelte @@ -41,6 +41,7 @@ style:--color={color} style:--background-color={backgroundColor} style:--active={activeColor} + {...$$restProps} on:click > diff --git a/src/lib/components/Catalog.svelte b/src/lib/components/Catalog.svelte index 39508bd..64e8754 100644 --- a/src/lib/components/Catalog.svelte +++ b/src/lib/components/Catalog.svelte @@ -11,32 +11,92 @@ { title: 'Manga name', cover: image1, - currentPage: 26, - totalPages: 100 + volumes: [ + { + cover: image1, + title: 'Volume 1', + currentPage: 0, + totalPages: 100 + }, + { + cover: image1, + title: 'Volume 2', + currentPage: 0, + totalPages: 100 + } + ] }, { title: 'Another', cover: image2, - currentPage: 0, - totalPages: 120 + volumes: [ + { + cover: image2, + title: 'Volume 1', + currentPage: 0, + totalPages: 100 + }, + { + cover: image2, + title: 'Volume 2', + currentPage: 0, + totalPages: 100 + } + ] }, { title: 'Awooo', cover: image3, - currentPage: 69, - totalPages: 96 + volumes: [ + { + cover: image3, + title: 'Volume 1', + currentPage: 0, + totalPages: 100 + }, + { + cover: image3, + title: 'Volume 2', + currentPage: 0, + totalPages: 100 + } + ] }, { title: 'Title', cover: image4, - currentPage: 9, - totalPages: 59 + volumes: [ + { + cover: image4, + title: 'Volume 1', + currentPage: 0, + totalPages: 100 + }, + { + cover: image4, + title: 'Volume 2', + currentPage: 0, + totalPages: 100 + } + ] }, { title: 'sdhfjksdh', cover: image5, - currentPage: 19, - totalPages: 200 + volumes: [ + { + cover: image5, + title: 'Volume 1', + currentPage: 0, + totalPages: 100 + }, + { + cover: image5, + title: 'Volume 2', + currentPage: 0, + totalPages: 100 + } + ] } ]; diff --git a/src/lib/components/CatalogItem.svelte b/src/lib/components/CatalogItem.svelte index f694e51..b92ea48 100644 --- a/src/lib/components/CatalogItem.svelte +++ b/src/lib/components/CatalogItem.svelte @@ -1,13 +1,14 @@ @@ -16,7 +17,6 @@
{title} {title} - {currentPage} / {totalPages}
diff --git a/src/lib/components/FileUpload.svelte b/src/lib/components/FileUpload.svelte new file mode 100644 index 0000000..d43e3d8 --- /dev/null +++ b/src/lib/components/FileUpload.svelte @@ -0,0 +1,56 @@ + + + + + + + diff --git a/src/lib/components/NavBar.svelte b/src/lib/components/NavBar.svelte index b3704c0..d4eab2a 100644 --- a/src/lib/components/NavBar.svelte +++ b/src/lib/components/NavBar.svelte @@ -1,16 +1,51 @@ - - export let title: string | undefined = undefined; + diff --git a/src/lib/components/Reader/MangaPage.svelte b/src/lib/components/Reader/MangaPage.svelte new file mode 100644 index 0000000..b5490a0 --- /dev/null +++ b/src/lib/components/Reader/MangaPage.svelte @@ -0,0 +1,195 @@ + + +
+
+ + +
+ Page 1 + {#each textBoxes as { left, top, width, height, lines, fontSize, writingMode }} +
+ {#each lines as line} +

{line}

+ {/each} +
+
+ {/each} +
+ + diff --git a/src/lib/components/Reader/Reader.svelte b/src/lib/components/Reader/Reader.svelte new file mode 100644 index 0000000..b27cce4 --- /dev/null +++ b/src/lib/components/Reader/Reader.svelte @@ -0,0 +1,26 @@ + + +{#if volume} +
+ +
+ + + +{/if} + + diff --git a/src/lib/components/VolumeItem.svelte b/src/lib/components/VolumeItem.svelte new file mode 100644 index 0000000..5d28e9d --- /dev/null +++ b/src/lib/components/VolumeItem.svelte @@ -0,0 +1,36 @@ + + + +
+ {title} + {title} + {currentPage} / {totalPages} +
+
+ + diff --git a/src/lib/panzoom/util.ts b/src/lib/panzoom/util.ts index 1821cfb..c83655b 100644 --- a/src/lib/panzoom/util.ts +++ b/src/lib/panzoom/util.ts @@ -65,8 +65,6 @@ export function panAlign(alignX: PanX, alignY: PanY) { break; } - console.log(x, y); - pz?.moveTo(x, y) } diff --git a/src/lib/types/catalog.ts b/src/lib/types/catalog.ts index 3c7a375..ae3feff 100644 --- a/src/lib/types/catalog.ts +++ b/src/lib/types/catalog.ts @@ -1,6 +1,12 @@ -export type Manga = { +export type Volume = { title: string; cover: string; currentPage: number; totalPages: number; +} + +export type Manga = { + title: string; + cover: string; + volumes: Volume[]; }; \ No newline at end of file diff --git a/src/lib/upload/index.ts b/src/lib/upload/index.ts new file mode 100644 index 0000000..4e01b44 --- /dev/null +++ b/src/lib/upload/index.ts @@ -0,0 +1,8 @@ +import { BlobReader, ZipReader } from "@zip.js/zip.js"; + +export async function unzipManga(file: File) { + const zipFileReader = new BlobReader(file); + const zipReader = new ZipReader(zipFileReader); + + return await zipReader.getEntries() +} \ No newline at end of file diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte deleted file mode 100644 index 9135601..0000000 --- a/src/routes/(app)/+layout.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - - -
- -
- - diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte deleted file mode 100644 index aee9828..0000000 --- a/src/routes/(app)/+page.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..d11617d --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,16 @@ + + + + +
+ +
+ + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..1b03d94 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,12 @@ + + + + diff --git a/src/routes/[manga]/+layout.svelte b/src/routes/[manga]/+layout.svelte deleted file mode 100644 index 76958de..0000000 --- a/src/routes/[manga]/+layout.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - diff --git a/src/routes/[manga]/+page.svelte b/src/routes/[manga]/+page.svelte index af1e4f5..7901cbe 100644 --- a/src/routes/[manga]/+page.svelte +++ b/src/routes/[manga]/+page.svelte @@ -4,24 +4,30 @@ import { onMount } from 'svelte'; import Button from '$lib/components/Button.svelte'; import { panAlign, Panzoom, zoomOriginal } from '$lib/panzoom'; + import VolumeItem from '$lib/components/VolumeItem.svelte'; const manga = $currentManga; + + onMount(() => { + if (!manga) { + goto('/'); + } + }); -{#if manga} -
- -
- - {manga.title} - -{/if} +
+ {#if manga} + {#each manga.volumes as volume} + + {/each} + {/if} +
diff --git a/src/routes/[manga]/[volume]/+layout.svelte b/src/routes/[manga]/[volume]/+layout.svelte new file mode 100644 index 0000000..8c36425 --- /dev/null +++ b/src/routes/[manga]/[volume]/+layout.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/src/routes/[manga]/[volume]/+page.svelte b/src/routes/[manga]/[volume]/+page.svelte new file mode 100644 index 0000000..c6245fe --- /dev/null +++ b/src/routes/[manga]/[volume]/+page.svelte @@ -0,0 +1,5 @@ + + + diff --git a/src/routes/upload/+page.svelte b/src/routes/upload/+page.svelte new file mode 100644 index 0000000..97aa999 --- /dev/null +++ b/src/routes/upload/+page.svelte @@ -0,0 +1,24 @@ + + + + +{#if promise} + {#await promise} +

Loading...

+ {:then entries} + {#each entries as entry} +

{entry.filename}

+ {/each} + {/await} +{/if}