From 7ea19e2247924c25d1311905ea9e589ac34d953b Mon Sep 17 00:00:00 2001 From: Yvv Date: Sat, 28 Feb 2026 17:46:38 +0100 Subject: [PATCH] Viewer PDF.js mode livre avec signets, fix hydratation SSR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Viewer PDF.js mode livre : double page côte à côte, navigation prev/next visuelle et clavier - Panneau signets (outline) avec tout déplier/replier, highlight du spread courant - Page 1 = couverture seule, puis paires 2-3, 4-5, etc. - Navigation clavier : flèches, espace, Home/End - Redimensionnement auto des canvas au resize - Fix hydratation SSR : bookData.init() sans await dans ChapterHeader et SongBadges - BookPdfReader : iframe vers /pdfjs/viewer.html au lieu du viewer natif - Script postinstall pour copier pdf.min.mjs depuis node_modules Co-Authored-By: Claude Opus 4.6 --- .gitignore | 4 + app/components/book/BookPdfReader.vue | 7 +- app/components/book/ChapterHeader.vue | 11 +- app/components/book/ChapterToc.vue | 159 ++++++++ app/components/song/SongBadges.vue | 2 +- app/pages/admin/book/index.vue | 2 +- package.json | 3 +- pnpm-lock.yaml | 141 +++++++ public/pdfjs/viewer.html | 546 ++++++++++++++++++++++++++ scripts/copy-pdfjs.sh | 12 + 10 files changed, 874 insertions(+), 13 deletions(-) create mode 100644 app/components/book/ChapterToc.vue create mode 100644 public/pdfjs/viewer.html create mode 100755 scripts/copy-pdfjs.sh diff --git a/.gitignore b/.gitignore index 4453835..529aa28 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ logs .fleet .idea +# PDF.js (copié depuis node_modules par postinstall) +public/pdfjs/pdf.min.mjs +public/pdfjs/pdf.worker.min.mjs + # Sources originales (PDF, JPG — pas servies par l'appli) sources/ diff --git a/app/components/book/BookPdfReader.vue b/app/components/book/BookPdfReader.vue index 646a527..cf52c7c 100644 --- a/app/components/book/BookPdfReader.vue +++ b/app/components/book/BookPdfReader.vue @@ -50,10 +50,9 @@ const isOpen = computed({ const pdfUrl = computed(() => { const base = bookData.getPdfUrl() - const fragments: string[] = [] - if (props.page) fragments.push(`page=${props.page}`) - fragments.push('pagemode=bookmarks') - return `${base}#${fragments.join('&')}` + const viewerBase = `/pdfjs/viewer.html?file=${encodeURIComponent(base)}` + if (props.page) return `${viewerBase}#page=${props.page}` + return viewerBase }) function close() { diff --git a/app/components/book/ChapterHeader.vue b/app/components/book/ChapterHeader.vue index 2a145dd..32b2293 100644 --- a/app/components/book/ChapterHeader.vue +++ b/app/components/book/ChapterHeader.vue @@ -15,8 +15,9 @@ {{ description }}

+ +
-
-
-
-
- + @@ -55,7 +54,7 @@ const props = defineProps<{ const bookData = useBookData() const { loadAndPlay } = useAudioPlayer() -await bookData.init() +bookData.init() const songs = computed(() => bookData.getChapterSongs(props.chapterSlug)) const pdfPage = computed(() => bookData.getChapterPage(props.chapterSlug)) diff --git a/app/components/book/ChapterToc.vue b/app/components/book/ChapterToc.vue new file mode 100644 index 0000000..791f6e6 --- /dev/null +++ b/app/components/book/ChapterToc.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/app/components/song/SongBadges.vue b/app/components/song/SongBadges.vue index 05a8863..851c84b 100644 --- a/app/components/song/SongBadges.vue +++ b/app/components/song/SongBadges.vue @@ -17,7 +17,7 @@ const props = defineProps<{ }>() const bookData = useBookData() -await bookData.init() +bookData.init() const songs = computed(() => bookData.getChapterSongs(props.chapterSlug)) diff --git a/app/pages/admin/book/index.vue b/app/pages/admin/book/index.vue index 53c3f45..219721c 100644 --- a/app/pages/admin/book/index.vue +++ b/app/pages/admin/book/index.vue @@ -1,7 +1,7 @@