diff --git a/ui/src/routes/books/[slug]/chapters/[n]/+page.svelte b/ui/src/routes/books/[slug]/chapters/[n]/+page.svelte
index df4441e..0a2ef3e 100644
--- a/ui/src/routes/books/[slug]/chapters/[n]/+page.svelte
+++ b/ui/src/routes/books/[slug]/chapters/[n]/+page.svelte
@@ -286,23 +286,36 @@
const wordCount = $derived(
html ? (html.replace(/<[^>]*>/g, '').match(/\S+/g)?.length ?? 0) : 0
);
+
+ // Audio panel: auto-open if this chapter is already loaded/playing in the store
+ // svelte-ignore state_referenced_locally
+ let audioExpanded = $state(
+ audioStore.slug === data.book.slug && audioStore.chapter === data.chapter.number
+ );
+ $effect(() => {
+ // Expand automatically when the store starts playing this chapter
+ if (audioStore.slug === data.book.slug && audioStore.chapter === data.chapter.number && audioStore.isPlaying) {
+ audioExpanded = true;
+ }
+ });
- {m.reader_words({ n: wordCount.toLocaleString() })} - · - ~{Math.max(1, Math.round(wordCount / 200))} min read -
- {/if} -+ {m.reader_words({ n: wordCount.toLocaleString() })} + · + ~{Math.max(1, Math.round(wordCount / 200))} min +
{/if} - {/each} - {#if !data.isPro} - Upgrade to Pro - {/if} + + {#if !data.isPreview} +{m.reader_signin_for_audio()}
-{m.reader_signin_audio_desc()}
+ {#if !page.data.user} + +{m.reader_signin_for_audio()}
+{m.reader_signin_audio_desc()}
+Daily audio limit reached
-Free users can listen to 3 chapters per day. Upgrade to Pro for unlimited audio.
+ {:else if audioProRequired} +Daily audio limit reached
+Upgrade to Pro for unlimited audio.
+Tap left/right · Arrow keys · Space
{:else} - +{m.reader_next_chapter()}
++ {m.reader_chapter_n({ n: String(data.next) })} +
+Typography
Layout