Put every preference in Settings; same header on every page
Build and Push Docker Image / build-and-push (push) Successful in 5m7s

- Settings > Preferences: typeface, line spacing, verse numbers, highlight colour names,
  My Studies grid/list and sort, verse-of-the-day Bible and picture, commentary sources, study templates
- Header uses one fixed width and reserves scrollbar space so the nav sits in the same place on every page

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 5.5 committed 2026-10-06 14:10:12 -04:00
1 parent a2185ba1dd
commit 512c6b6889
7 files changed
+204 -1

No files matched your search

+25
View File
@@ -83,6 +83,31 @@ describe('Authentication', () => {
expect(await screen.findByDisplayValue('My Show')).toBeInTheDocument();
});
test('every reading and display preference can be set from Settings', async () => {
stubApi({ session: user });
const u = userEvent.setup();
render(<App />);
await openAccountMenu(u);
await u.click(await screen.findByRole('menuitem', { name: /settings/i }));
await u.click(await screen.findByRole('tab', { name: 'Preferences' }));
for (const name of ['Text size', 'Typeface', 'Line spacing', 'Verse numbers', 'Reading width', 'Verse layout', 'Theme', 'Home page']) {
expect(screen.getByRole('group', { name })).toBeInTheDocument();
}
await u.click(within(screen.getByRole('group', { name: 'Typeface' })).getByRole('button', { name: 'Sans' }));
expect(localStorage.getItem('reader-font')).toBe('sans');
await u.click(within(screen.getByRole('group', { name: 'Verse numbers' })).getByRole('button', { name: 'Hide' }));
expect(localStorage.getItem('reader-verse-numbers')).toBe('off');
// highlight colour names
await u.type(screen.getByLabelText('Name for yellow highlights'), 'Promise');
expect(JSON.parse(localStorage.getItem('reader-color-labels'))['#fef08a']).toBe('Promise');
// the My Studies page
await u.click(within(screen.getByRole('group', { name: 'Show studies as' })).getByRole('button', { name: 'List' }));
expect(localStorage.getItem('homeView')).toBe('list');
await u.selectOptions(screen.getByLabelText('Sort studies by'), 'title');
expect(localStorage.getItem('homeSort')).toBe('title');
expect(screen.getByRole('heading', { name: 'Study templates' })).toBeInTheDocument();
});
test('Settings is split into tabs, one group at a time', async () => {
stubApi({ session: user });
const u = userEvent.setup();