Redesign the Reader; add ESV
Build and Push Docker Image / build-and-push (push) Failing after 20s

New reading surface with paper/sepia/dark themes, slim top and bottom bars,
and sheets for navigation, search, settings, audio and per-verse study tools.
Plan progress is built into the reader. Page-flip mode removed. ESV added via
the server-side proxy (ESV_API_KEY).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 5.5 committed 2026-09-29 09:11:47 -04:00
1 parent 9e8420a1ae
commit 9e722a296d
17 files changed
+903 -791

No files matched your search

+37
View File
@@ -0,0 +1,37 @@
import Sheet from './Sheet.jsx';
import AudioPlayer from '../AudioPlayer.jsx';
// Wraps the existing player. Audio is BSB-only, so licensed translations get a note.
export default function AudioSheet({ open, onClose, translation, bookName, chapter, audio, narrator, onNarrator, onNext, nextDisabled }) {
return (
<Sheet open={open} onClose={onClose} title="Listen">
<AudioPlayer
title={`${bookName} ${chapter}`}
subtitle={audio.state.status === 'error'
? "Couldn't load audio for this chapter/narrator."
: translation !== 'BSB'
? `Audio is BSB only — no ${translation} audio is available, so it won't match the ${translation} text on screen.`
: 'Audio follows the chapter as you browse.'}
status={audio.state.status}
currentTime={audio.progress.currentTime}
duration={audio.progress.duration}
onPlay={audio.play}
onTogglePause={audio.togglePause}
onSeekBack={() => audio.seek(-10)}
onSeekForward={() => audio.seek(10)}
onSeekTo={audio.seekTo}
onNext={onNext}
nextDisabled={nextDisabled}
onStop={audio.stop}
controls={(
<select value={narrator} onChange={(e) => onNarrator(e.target.value)}
className="rounded-xl border border-[var(--r-line)] bg-[var(--r-bg)] px-2 py-1.5 text-sm text-[var(--r-text)]">
<option value="david">David</option>
<option value="hays">Hays</option>
<option value="souer">Souer</option>
</select>
)}
/>
</Sheet>
);
}