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

+220 -761
View File
File diff suppressed because it is too large. Load diff
+52
View File
@@ -0,0 +1,52 @@
import { render, screen, fireEvent } from '@testing-library/react';
import { vi, test, expect } from 'vitest';
const noop = () => {};
const ctx = {
goHome: noop,
readerBookAbbrev: 'JHN', setReaderBookAbbrev: noop,
readerTranslation: 'ESV', setReaderTranslation: noop,
readerTheme: 'paper', setReaderTheme: noop,
readerLayout: 'flow', setReaderLayout: noop,
readerChapter: 3, setReaderChapter: noop,
readerVerses: [{ number: 1, text: 'Now there was a man of the Pharisees.' }, { number: 2, text: 'This man came to Jesus by night.' }],
readerTotalChapters: 21, readerLoading: false, readerError: '',
readerInterlinear: null, readerSelectedVerse: null, setReaderSelectedVerse: vi.fn(),
readerFontSize: 1, setReaderFontSize: noop, readerBookmarks: {},
readerCrossRefs: null, setReaderCrossRefs: noop, readerCrossRefsLoading: false,
readerShowCrossRefs: false, setReaderShowCrossRefs: noop,
readerSearch: '', setReaderSearch: noop, setReaderSearchActive: noop,
readerSearchScope: 'chapter', setReaderSearchScope: noop,
readerAudioState: { status: 'idle' }, audioProgress: { currentTime: 0, duration: 0 },
bibleIndexStatus: 'idle', audioNarrator: 'david', setAudioNarrator: noop,
_bibleIndexCacheRef: { current: {} },
readerGoToPreviousChapter: noop, readerGoToNextChapter: noop, jumpToReaderVerse: noop,
toggleReaderBookmark: noop, cycleBookmarkColor: noop, loadReaderCrossRefs: noop, loadBibleIndex: noop,
handlePlayReaderAudio: noop, handleToggleReaderAudioPause: noop, handleStopBookAudio: noop,
handleSeekAudio: noop, handleSeekAudioTo: noop,
readerInkByPage: {}, updateReaderPageInk: noop, readerTextHighlights: [], addTextHighlight: noop, removeTextHighlight: noop,
planProgress: [], toggleDay: noop,
};
vi.mock('../context/AppContext.js', () => ({ useApp: () => ctx }));
import ReaderPage from './ReaderPage.jsx';
test('renders the chapter, chrome and opens the tool sheets', () => {
render(<ReaderPage />);
expect(screen.getByText('John 3 · ESV')).toBeTruthy();
expect(screen.getByText(/man of the Pharisees/)).toBeTruthy();
fireEvent.click(screen.getByText('John 3 · ESV'));
expect(screen.getByText('Go to')).toBeTruthy();
fireEvent.click(screen.getByLabelText('Close'));
fireEvent.click(screen.getByLabelText('Reading settings'));
expect(screen.getByText('Text size')).toBeTruthy();
fireEvent.click(screen.getByLabelText('Close'));
fireEvent.click(screen.getByLabelText('Search'));
expect(screen.getByPlaceholderText(/Search John 3/)).toBeTruthy();
});
test('tapping a verse selects it', () => {
render(<ReaderPage />);
fireEvent.click(screen.getByText(/This man came to Jesus/));
expect(ctx.setReaderSelectedVerse).toHaveBeenCalledWith(2);
});