diff --git a/app/components/book/BookPlayer.vue b/app/components/book/BookPlayer.vue
index 29a90dd..f652877 100644
--- a/app/components/book/BookPlayer.vue
+++ b/app/components/book/BookPlayer.vue
@@ -87,7 +87,13 @@
ref="contentEl"
:style="contentStyle"
>
-
Paroles à venir pour « {{ chapterSong.title }} »
+Aucun morceau associé à ce chapitre
+')
+ .replace(/\n/g, '
')
+ .replace(/^/, '
') + .replace(/$/, '
') +}) + // ── CSS columns pagination ── const contentStyle = computed(() => { if (isScrollMode.value) return {} @@ -276,10 +286,9 @@ function recalcPages() { let resizeObs: ResizeObserver | null = null -// Recalc when chapter content changes -watch(activeChapter, async () => { +// Recalc when chapter changes +watch(chapterIdx, async () => { currentPage.value = 0 - // Wait for ContentRenderer to update DOM await nextTick() await nextTick() setTimeout(recalcPages, 100) @@ -357,7 +366,7 @@ function prevPage() { audioPlayer.loadAndPlay(song) } // After content loads, go to last page - watch(activeChapter, async () => { + watch(chapterIdx, async () => { await nextTick() await nextTick() setTimeout(() => { @@ -809,7 +818,33 @@ onUnmounted(() => { .reader-columns :deep(ol) { break-inside: avoid; } -/* p with pre-line (lyrics) can be taller than a column — allow break */ +/* Lyrics content */ +.lyrics-content { + white-space: pre-line; + line-height: 1.9; + font-size: clamp(0.9rem, 2vw, 1.05rem); +} +.lyrics-content :deep(.lyrics-tag) { + display: block; + margin-top: 1.5rem; + margin-bottom: 0.5rem; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; + opacity: 0.35; +} +.lyrics-content :deep(p) { + break-inside: auto; + overflow-y: auto; +} +.lyrics-empty { + display: flex; + align-items: center; + justify-content: center; + min-height: 200px; +} + .reader-columns :deep(p) { break-inside: auto; overflow-y: auto;