Add Insights, Observe-first, compare, handout layouts, richer search, backup nudge

- Commentary and study aids wait for 15 words of your own Observe notes.
- Insights page: this week's own work, themes across studies, words you keep
  studying, what slipped in recalls, open follow-ups.
- Recall can record what slipped; session notes (teach it back, who came,
  group notes, follow-ups); "Pray about this" from Apply.
- Compare any two passages side by side.
- Handout layouts: standard, questions only, large print, note-taking.
- Search understands "in <book>", "last week/month/year" and a year.
- Home shows the last backup age and nudges after two weeks.
- Phone: the stage bar scrolls instead of clipping Script and Export.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 5.5 committed 2026-10-14 12:42:11 -04:00
1 parent 2ddc4e1ff6
commit d8e522dd06
24 files changed
+540 -28

No files matched your search

+16
View File
@@ -46,3 +46,19 @@ test('one session only, and no writing lines when switched off', () => {
expect(html).toContain('Session 2');
expect(html).not.toContain('class="rule"');
});
import { buildHandoutHtml as buildLayoutHtml } from './handout.js';
test('layouts change what the handout prints', () => {
const project = { id: 'p', title: 'T', translation: 'BSB', outline: [], chapters: [{ book: 'John', bookAbbrev: 'Jhn', chapter: '3', verses: [{ number: 16, text: 'For God so loved.' }], chunks: [{ id: 'c', startVerse: 16, endVerse: 16, discussionQuestions: 'Why did he give?', application: 'Trust him.', outline: [{ id: 'n', text: 'Point one', children: [] }] }] }] };
const standard = buildLayoutHtml(project);
const questions = buildLayoutHtml(project, null, { layout: 'questions' });
const notes = buildLayoutHtml(project, null, { layout: 'notes' });
const large = buildLayoutHtml(project, null, { layout: 'large' });
expect(standard).toContain('Point one');
expect(questions).not.toContain('Point one');
expect(questions).toContain('Why did he give?');
expect(notes).not.toContain('Why did he give?');
expect(notes.match(/class="rule"/g).length).toBeGreaterThanOrEqual(16);
expect(large).toContain('class="page large"');
});