Commit Graph
15 Commits
Author SHA1 Message Date
Nate EmmertandClaude Sonnet 4.6 747cc76be6 Remove preventScroll from crossword cell focus
preventScroll was blocking the viewport from scrolling to the grid cell
when a clue was clicked from the sidebar. The clue list overflow fix is
sufficient to contain scrollIntoView without needing preventScroll.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 20:20:35 -04:00
Nate EmmertandClaude Sonnet 4.6 d88d5d22c7 Fix narrow views and crossword scroll-jump issues
Widen quiz, flashcards, practice, test, and crossword views to match the
960px max-width already used by course/lesson/assignment. Fix crossword
jumping to top on cell focus by using preventScroll and containing clue
list scrollIntoView within a max-height overflow container.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 20:14:07 -04:00
Nate EmmertandClaude Sonnet 4.6 10b4e3ae09 Rename crossword WORD placeholder to ANSWER for clarity
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 18:17:56 -04:00
Nate EmmertandClaude Sonnet 4.6 682534a061 Add crossword puzzle item type
Admin enters Across/Down words and clues; server auto-generates the grid
using a backtracking placement algorithm (longest-first, intersection-based).
Students fill in the interactive grid with click-to-select, direction toggle,
arrow-key navigation, and Tab-to-next-word. Auto-graded per word on submit,
with correct/wrong color highlighting on the results view. Includes a print
worksheet option for blank paper practice.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 17:56:46 -04:00
Nate EmmertandClaude Sonnet 4.6 60bfe3ca4a Add instructions field to quiz and matching item types
Instructions are optional free text shown to the student above the questions/word bank.
Admin enters them in the item editor; stored in items.body for quiz and matching types.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 16:57:52 -04:00
Nate EmmertandClaude Sonnet 4.6 f9cc515cec Fix matching type showing undefined in admin unit view; add print worksheet
- Add matching to TYPE_ICON/TYPE_LABEL in admin.js (was missing, caused undefined)
- Add 🖨 Print worksheet button on matching exercise (prints word bank + clue blanks)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 16:55:15 -04:00
Nate EmmertandClaude Sonnet 4.6 05cfdf7b09 Add matching quiz type, more theme colors, animal icon picker, and fix color persistence
- Fix theme not saving across sessions: /api/state was missing `theme` in SELECT
- Add 4 new color themes: red, teal, yellow, indigo (student + admin)
- Add animal icon picker (32 animals) with PATCH /api/students/:id/emoji endpoint
- Add Matching item type: word bank (A, B, C… alphabetical) + clue blanks, auto-graded
- Matching submit button stays disabled until all blanks are filled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 16:27:22 -04:00
Nate EmmertandClaude Sonnet 4.6 ca68e9df52 Switch data volume from bind mount to named Docker volume
Bind mount (./data:/app/data) was relative to the working directory,
so data was lost whenever the project was re-cloned or compose was run
from a different path. A named volume is managed by Docker and persists
across container rebuilds and image pulls.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 20:20:01 -04:00
Nate EmmertandClaude Sonnet 4.6 3dc4ddea4b Add rich text editor for lesson content input
Replaces the plain textarea with a WYSIWYG contenteditable editor so
the formatting the parent sees while writing matches what the student
sees when reading. Toolbar supports bold, italic, underline, H2/H3,
bullet/numbered lists, links, and YouTube embeds. Selection is saved
on editor blur and restored before each execCommand so toolbar clicks
don't lose the user's selection.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 20:00:03 -04:00
Nate EmmertandClaude Sonnet 4.6 39d690bf93 Fix piper: keep all bundled libs, register with ldconfig
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 10:36:53 -04:00
Nate EmmertandClaude Sonnet 4.6 984834e896 Add piper error detail to TTS response for debugging
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 10:35:03 -04:00
Nate EmmertandClaude Sonnet 4.6 fd88d964f7 Fix piper: add libespeak-ng1 dep and remove invalid spawnSync encoding
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 10:27:44 -04:00
Nate EmmertandClaude Sonnet 4.6 8fa906b559 Fix speechSynthesis cancel before speak to unblock audio
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:38:20 -04:00
Nate EmmertandClaude Sonnet 4.6 6dd7e03d21 Fix piper download URL in Dockerfile
v1.2.0 uses piper_amd64.tar.gz; switch to 2023.11.14-2 which has piper_linux_x86_64.tar.gz.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 09:01:44 -04:00
Nate EmmertandClaude Sonnet 4.6 6f2281e2a7 Add spelling improvements and local Piper TTS
Practice: fire streak badge, first-letter hint on wrong answers, missed-words drill session after practice completes.
Test: audio-only mode with listening state before input appears, larger re-read button.
Words: definition field (DB migration + admin editor + TTS playback).
TTS: replace speechSynthesis with local Piper via /api/tts, WAV cached in data/tts-cache, falls back to browser voice when Piper is not installed.
Dockerfile: switched to node:26-slim, installs Piper binary + en_US-lessac-medium voice.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 08:47:10 -04:00