Commit Graph
36 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 5 b9f9b97cba Add chapter skip and 10s seek controls to audio players
Build and Push Docker Image / build-and-push (push) Successful in 5m42s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-23 11:49:32 -04:00
nmemmertandClaude Opus 5.5 5287b471d0 Redesign project header and study navigation
Build and Push Docker Image / build-and-push (push) Failing after 20s
- Header: navigation buttons grouped; Study Guide, Podcast, and
  Pronunciation Guide move into a Tools menu (disabled until a chunk
  exists), set apart from Export and Share by a divider.
- Only one header dropdown is open at a time, and it closes on an
  outside click or Escape.
- Study page: drop the duplicate Prev/Next and counter at the top; the
  fixed bottom bar is the single chunk navigation and now shows a
  readable "Chunk N of M".
- Mobile empty-state hint points to Back to Chunks.
- Tests: Tools menu, one-dropdown-at-a-time, Escape/outside click.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 15:37:29 -04:00
nmemmertandClaude Opus 5.5 33e3f2bdc6 Fix Greek lookup test expecting a single 'faith, belief' field
Build and Push Docker Image / build-and-push (push) Successful in 4m7s
With no gloss-map entry, the English gloss falls back to the KJV
definition, so both English Gloss and Short Definition show it. Assert
both instead of failing on the duplicate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 15:35:32 -04:00
nmemmertandClaude Opus 5.5 d08c701698 Fix Pronunciation page Speak buttons; tidy App.jsx
Build and Push Docker Image / build-and-push (push) Successful in 7m53s
PronunciationPage still read speakOriginalWord from context after it
moved to utils/wordStudy, so Speak would have thrown. Import it directly.
App.jsx: consolidate imports, update comments, list all pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 15:04:55 -04:00
nmemmertandClaude Opus 5.5 0f1a9c3d5b Move chunk builder into SetupPage via useChunkBuilder
- The setup form, active chapter tab, verse range selection, typed/bulk/
  cross-chapter chunk creation, reorder, and delete move out of App.
- Setup now opens on the chapter holding the chunk last studied (e.g.
  after Back to Chunks), and the Add Chapter form suggests the chapter
  after the project's last one instead of repeating the current one.
- openNewProject/goHome/resume/import no longer reset setup state by hand;
  SetupPage starts fresh each time it opens.
- Tests: add-chapter default, Back to Chunks chapter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 15:01:53 -04:00
nmemmertandClaude Opus 5.5 bf02e071fa Move study editor state into StudyPage and hooks
- StudyPage owns layout/tabs/collapsed sections, tags, DOCX script
  import, chunk navigation, keyboard shortcuts, and the selected-chunk
  values derived from the project.
- useStudyResources: commentary + interlinear for the selected chunk's
  chapter. These now load only on the study page (they previously also
  fetched while on Setup).
- useCrossRefs: typed refs, dataset suggestions, verse text.
- useWordStudy: word entries, Strong's lookups, suggestion picker.
- Fix: study-page messages (word suggestions, DOCX import, lookups) set a
  status that only SetupPage displayed, so they were never seen. They
  now show as a toast on the study page.
- copyVerse moves into ReaderPage.
- Tests: toast, arrow-key navigation, cross-refs, tags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:59:22 -04:00
nmemmertandClaude Opus 5.5 4b14b3fbe6 Extract project header, share link, exports, and auth status
- ProjectHeader component replaces the headerButtons JSX in context; it
  owns the export menu and share panel state.
- useShareLink (share status/enable/revoke/copy) and useSharedView
  (?share= read-only view, now used directly by the router).
- utils/projectExport: HTML/Markdown/DOCX download and print-to-PDF.
- AuthStatus component replaces the authStatus JSX in context.
- Pages import wordStudy helpers directly instead of via context.
- Remove dead copyPronunciationGuide (PronunciationPage has its own).
- Tests: Markdown export, enabling a share link, the ?share= view.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:56:31 -04:00
nmemmertandClaude Opus 5.5 365fb1b567 Keep draw pen settings inside DrawCanvas
Only the Reader's canvas uses them now. A module-level lastPen keeps the
chosen tool/color/size when Draw mode is toggled off and on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:53:17 -04:00
nmemmertandClaude Opus 5.5 a7e00a76b5 Split Home: local UI state, useProjectLibrary, useReadingPlan
- Search, tag filter, full-text note search, and rename state live in
  HomePage. The sort choice is remembered in localStorage.
- useProjectLibrary owns opening/renaming/deleting projects and the
  server reconcile (auto-restore + newer-on-server list).
- useReadingPlan owns the reading plan shared by Home and Reader.
- Tests: note search, rename, delete, sort memory, reading plan. Test
  setup now resets the storage namespace between tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:52:46 -04:00
nmemmertandClaude Opus 5.5 8bb3b104c8 Move import state into ImportPage; share translation list via hook
The session-list import form, preview, and runEpisodeImport now live in
ImportPage. useAvailableTranslations fetches the translation list once per
visit for both Import and Setup. Drops the never-read importFile state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:50:21 -04:00
nmemmertandClaude Opus 5.5 d7bbbe60de Move word-study helpers into utils/wordStudy
Strong's dictionary loaders, lexicon lookup, gloss helpers, cross-ref
formatting, and speech move out of App. Dictionaries are now cached at
module level (still one download per visit), and a failed download is no
longer cached forever, so the next lookup retries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:49:21 -04:00
nmemmertandClaude Opus 5.5 8c55765ae6 Move admin state into AdminPage
Build and Push Docker Image / build-and-push (push) Failing after 21s
All admin state (tab, users, projects, loading/error, preview, reset
result) and the data loader were only used by AdminPage, so they now live
there as local state instead of in App's context. The page loads its data
when it opens (still gated on authUser.isAdmin; the server enforces it too).

Add tests: admin sees users and projects, deleting a user reloads the
list, and non-admins get no Admin button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:46:35 -04:00
nmemmertandClaude Opus 5.5 49ffefed54 Extract auth into hooks/useAuth; move form state into its pages
Build and Push Docker Image / build-and-push (push) Successful in 6m28s
- useAuth owns authUser/authServerDown, the startup session check, and
  signIn/logout, so every sign-in path runs the same follow-up (switch
  local storage to the account, load reader ink). Previously reader ink
  only loaded on a page refresh, not right after logging in.
- Login/2FA form state now lives in AuthPage, and 2FA setup, password
  change, and podcast name state in SettingsPage (23 fewer context
  values; typing in these forms no longer re-renders all of App).
- Add tests for form sign-in, 2FA, session restore + logout, and the
  Settings podcast-name prefill.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:44:52 -04:00
nmemmertandClaude Opus 5.5 009fa1e78f Extract shared audio player into hooks/useAudio
Build and Push Docker Image / build-and-push (push) Failing after 2m25s
The Home page's whole-book player and the Reader's chapter player share one
<audio> element, so they move together. App now just calls
useAudio(readerBook, readerChapter) and spreads the result into context.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:36:59 -04:00
nmemmertandClaude Opus 5.5 ade7f1af6f Speed up the app, run production build, remove chunk ink, start App.jsx split
Performance:
- Lazy-load pages, docx, and mammoth (initial JS 1,298 KB -> ~290 KB)
- Gzip responses and cache hashed assets for a year
- Memoize DrawCanvas strokes so ink isn't redrawn on every render
- Precompute whole-Bible search index and defer the query while typing
- Reload once if a lazy chunk is missing after a deploy

Deployment:
- setup.sh builds and runs one production server on APP_PORT (default
  5173); --dev keeps the old Vite dev setup
- Session cookie uses secure: 'auto' so login works behind any proxy

Chunk editor:
- Remove the Draw layout, Ink Notes panel, and ink in HTML export
  (existing inkStrokes data is left in saved projects)

Refactor:
- Move module-level helpers out of App.jsx into src/utils/*
- Extract Bible reader state and logic into hooks/useBibleReader

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-22 14:34:13 -04:00
nmemmertandClaude Sonnet 4.6 00932dee4a Update restart.sh to reference Gitea instead of GitHub
Build and Push Docker Image / build-and-push (push) Successful in 2m36s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-02 09:39:49 -04:00
nmemmertandClaude Sonnet 4.6 85fc566ade Add Pronunciation Guide page with word cards and TTS
Build and Push Docker Image / build-and-push (push) Successful in 3m37s
Replace the copy-to-clipboard button with a dedicated page that shows
all collected Greek/Hebrew words as cards grouped by language. Each
card displays the original script large, transliteration, Strong's
number, English gloss, definition, part of speech, and a Speak button.
Includes a search/filter and a "Copy all" fallback for the old behavior.

Move buildPronunciationGuide to bibleUtils.jsx to avoid circular imports.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-02 09:27:52 -04:00
nmemmertandClaude Sonnet 4.6 7b2920b9e6 Default study layout to split view
Build and Push Docker Image / build-and-push (push) Successful in 3m16s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-02 09:22:02 -04:00
nmemmertandClaude Sonnet 4.6 9b9de74084 Fix Vite parsing git objects as JS modules on dev server
Build and Push Docker Image / build-and-push (push) Successful in 3m2s
- Add server.watch.ignored for .git/** so chokidar doesn't pick up
  changes to git object files during git pull/fetch on the server
- Add .dockerignore to exclude .git, node_modules, and dist from
  the Docker build context

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-02 09:20:26 -04:00
nmemmertandClaude Sonnet 4.6 b98aae741f Fix circular imports causing React dispatcher null error
Build and Push Docker Image / build-and-push (push) Successful in 4m0s
Extract shared utilities (constants, helpers, components) from App.jsx
into src/utils/bibleUtils.jsx so page components can import from there
instead of from App.jsx. This breaks the App.jsx <-> pages circular
dependency that was triggering vite:import-analysis warnings and causing
the React hook dispatcher to be null at runtime.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-26 18:36:21 -04:00
nmemmert ce93b42b83 Merge pull request #16 from nmemmert/claude/bible-reader-feature-qn0pz6 2026-06-11 23:41:09 -04:00
nmemmert be62be0aa6 Merge pull request #15 from nmemmert/claude/greek-suggest-cross-device-sync
Fix sync: consistent lastEdited timestamp + persistent error + retry …
2026-05-28 15:00:41 -04:00
nmemmert 0b4bb46866 Merge pull request #14 from nmemmert/claude/greek-suggest-cross-device-sync
Add English word field to Greek word cards
2026-05-28 13:33:18 -04:00
nmemmert 7117f70e4b Merge pull request #13 from nmemmert/claude/greek-suggest-cross-device-sync
Use macula-greek English glosses in suggest modal instead of KJV kjv_def
2026-05-28 13:19:36 -04:00
nmemmert b6a277e16c Merge pull request #12 from nmemmert/claude/greek-suggest-cross-device-sync
Clean up English word display in suggest modal
2026-05-28 13:05:20 -04:00
nmemmert d5c9761584 Merge pull request #11 from nmemmert/claude/greek-suggest-cross-device-sync
Fix suggest modal: portal to body + English word first
2026-05-28 12:59:43 -04:00
nmemmert 1ae39118c9 Merge pull request #10 from nmemmert/claude/greek-suggest-cross-device-sync
Replace auto-add with word picker modal for Greek suggest
2026-05-28 12:55:26 -04:00
nmemmert 337006c72d Merge pull request #9 from nmemmert/claude/greek-suggest-cross-device-sync
Fix Greek suggest: use local macula-greek concordance instead of brok…
2026-05-28 12:47:15 -04:00
nmemmert 945ff15a4f Merge pull request #8 from nmemmert/claude/greek-suggest-cross-device-sync
Add passage-aware Greek word suggest and cross-device stale-project sync
2026-05-28 12:27:01 -04:00
nmemmert 6034aa26a2 Merge pull request #7 from nmemmert/claude/test-coverage-analysis-R2olv
Hide lookup links when word is found
2026-05-27 13:47:38 -04:00
nmemmert 0c0d4a0ae2 Merge pull request #6 from nmemmert/claude/test-coverage-analysis-R2olv
Show external lookup links when Greek word not found
2026-05-27 13:43:49 -04:00
nmemmert 25f0328c15 Merge pull request #5 from nmemmert/claude/test-coverage-analysis-R2olv
Fix Greek lookup returning "Lookup failed"
2026-05-27 13:39:47 -04:00
nmemmert f35ae80dd9 Merge pull request #4 from nmemmert/claude/test-coverage-analysis-R2olv
Merge feature branch into main
2026-05-27 13:34:54 -04:00
nmemmert 8b44250579 Merge pull request #3 from nmemmert/claude/test-coverage-analysis-R2olv
Fix Greek lookup: auto-prepend G prefix and use search endpoint for E…
2026-05-27 13:16:03 -04:00
nmemmert f3313c2721 Merge pull request #2 from nmemmert/claude/test-coverage-analysis-R2olv
Run dev server in background with nohup so it survives terminal close
2026-05-27 09:24:05 -04:00
nmemmert 4daed768ff Merge pull request #1 from nmemmert/claude/test-coverage-analysis-R2olv
Claude/test coverage analysis r2olv
2026-05-27 09:15:15 -04:00