Commit Graph
35 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 4.6 95c0da5c51 Redesign student UI and add OnlyOffice document integration
Build and Push Docker Image / build-and-push (push) Successful in 33s
- Student section: new hero gradient header, fixed bottom nav bar with
  icon+label pills (Today/Courses/Spelling/Inbox/Docs)
- Today rows: card style with left accent stripe, lift on hover
- Course cards: grid layout with top color bar per course
- Docs tab: list view with doc cards, OnlyOffice editor embedded via
  iframe using server-signed JWT config
- Server: documents table, CRUD routes, OnlyOffice callback endpoint
  for auto-save, /api/docs/:id/editor-config returns signed config
- Blank DOCX template embedded as base64 for new document creation
- OnlyOffice server: https://onlyoffice.necloud.us (set ONLYOFFICE_JWT_SECRET
  env var to match your Document Server JWT secret)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-19 14:12:39 -04:00
nmemmertandClaude Sonnet 4.6 a92db291c7 Add paper/print alternatives for off-screen learning
Build and Push Docker Image / build-and-push (push) Successful in 3m35s
- Spelling: "Blank test" print button per word list (numbered lines, no words shown) for dictated paper tests
- Spelling: "Record Paper Test" form in admin to log a paper test score to the gradebook
- Gradebook: "Record Paper Score" form to log a paper quiz/assignment score for any course item
- Flashcards: "Print" button per deck generates a cut-and-fold card sheet (fronts page + backs page)
- Crossword: print now includes a second page with a filled answer key
- Lessons + Assignments: 🖨 Print button in student view generates a clean printable page
- Word lists: new "CSV file" import tab — upload a .csv with word, sentence, definition columns

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-19 12:43:38 -04:00
nmemmertandClaude Sonnet 4.6 6baea15986 Fix TTS audio stalling and add back/previous-word navigation in spelling
Build and Push Docker Image / build-and-push (push) Successful in 55s
- Add timeout fallback in ttsDrain so the queue never permanently stalls
  when the browser fails to fire onend (common Chrome/Safari bug after
  extended use)
- Call speechSynthesis.resume() before speak() to un-stick suspended
  synthesis on mobile
- Rename "← Stop" / "← Cancel" to "← Back" on practice and test views
- Add "← Previous word" button in spelling test so kids can go back one
  word (e.g. when audio broke) — pops the saved answer and replays

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-26 15:52:28 -04:00
nmemmertandClaude Sonnet 4.6 44b481e177 Add in-app and OS notifications for new messages
Polls every 30s for unread messages on both kid and admin sides.
Kid app shows a tappable in-page toast and fires a browser OS
notification when a parent message arrives while the tab is open.
Admin app shows a toast and OS notification when a student replies.
Clicking the OS notification focuses the tab and opens the messages view.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-24 10:19:29 -04:00
Nate EmmertandClaude Sonnet 4.6 4574bd3785 Limit practice sessions to the assigned list only
Remove cross-list review words (Leitner spaced repetition) from practice
sessions so only the currently assigned list's words are shown. Also remove
the now-unused dueReviews count from the state endpoint and student UI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-21 08:34:36 -04:00
nmemmertandClaude Sonnet 4.6 43aa367f63 Add Graded sub-tab to student inbox
New grades show in the New tab on first visit; on return they move to the Graded tab so the inbox stays clean without losing the history.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-20 13:58:43 -04:00
nmemmertandClaude Sonnet 4.6 556b570b60 Add worksheet short-answer grading view, student inbox, and parent-student messaging
- Grading queue now shows short-answer questions and student responses inline so the parent can read answers before scoring
- Student inbox tab shows all graded items with score, percentage, and parent feedback; unread badge appears on login
- Parent-student messaging: students send messages from the Inbox tab; Messages panel in admin shows threads with unread count badge, full conversation history, and reply compose

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-20 13:28:28 -04:00
nmemmertandClaude Sonnet 4.6 2834738598 Track each spelling practice pass as a separate activity record
Each time a student completes a pass through a spelling_practice course
item — initial round, missed-words drill, or a retry — a row is now
written to submission_history so the parent sees individual attempts
instead of a single day-grouped entry.

- app.js: send sessionAttempted/sessionCorrect with /complete calls
- server.js: write to submission_history on each spelling_practice
  completion; add GET /api/spelling-sessions endpoint
- admin.html/js: new "Practice Sessions" table shows one row per pass

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-14 09:08:53 -04:00
nmemmertandClaude Sonnet 4.6 bb56b9b9e8 Fix drill missed words button — shuffle was not defined
ReferenceError on click prevented the drill session from starting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 13:37:38 -04:00
nmemmertandClaude Sonnet 4.6 6b7baf7297 Add school name and logo to home screen and admin header
- School name now appears on the student home screen and updates the page title
- Logo can be uploaded in Settings (PNG/JPG/GIF/WebP/SVG, max 2 MB); stored in the data volume so it persists across container restarts
- When a logo is uploaded the text school name is hidden in favour of the logo
- Admin header shows the school name instead of hardcoded "Homeschool", updates live when saved
- New server endpoints: GET /api/logo, POST /api/admin/upload-logo, DELETE /api/admin/logo
- /api/public-settings now includes school_name and has_logo

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 16:46:00 -04:00
nmemmertandClaude Sonnet 4.6 1eedfc7715 Add birthday celebrations for students
Parents can set a birthday (MM-DD) per student in the Kids panel. During the student's birthday week (Mon–Sun), a festive overlay appears on login with balloons, birthday cake, confetti, and a personalized message — shown once per day via sessionStorage. Summer birthdays (June–Aug) show a note in admin suggesting the parent set an alternate school-week date to celebrate early.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-10 09:02:48 -04:00
nmemmertandClaude Sonnet 4.6 7f6268d6e5 Add word list preview, young learner mode, and practice improvements
- Show full word list before practice starts so students can study words first
- Add per-student young learner mode (set in admin): word stays visible while typing
- Center all practice card content (speak button, prompt, feedback, check button)
- Remove 10-word-per-session cap so large lists (25-30 words) practice all words
- Double the misspelled-word study countdown from 4s to 8s
- Fix word list preview numbering for 10+ items (inline numbers, no clipping)
- Add young_learner column to students table with admin toggle

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-05 10:43:24 -04:00
nmemmertandClaude Sonnet 4.6 006c865b87 Add emoji toggle setting to parent dashboard Settings panel
Parent can turn the floating school emoji on/off from Settings > Student home screen. Setting persists in the DB and is read via a public /api/public-settings endpoint on the student home page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-04 17:00:42 -04:00
nmemmertandClaude Sonnet 4.6 8d6bcbe132 Liven up parent and student login screens
Parent: floating card with box-shadow over a soft multi-radial gradient background; decorative emoji header above PIN form.
Student: each kid card gets a colored top border matching their saved theme; subtle floating emoji (stars, books, pencil, rainbow) drift in the background.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-04 16:42:20 -04:00
nmemmertandClaude Sonnet 4.6 538522cfe7 Fix 7 UX pain points: grading filter, next-item nav, lesson prose, gradebook calc, auto-schedule skip, lesson item defaults, planner improvements
- Grading: add student filter dropdown, Enter-to-save, and point max always defaults to 100
- Student side: show next-item/back-to-course actions after completing a lesson or assignment
- Lesson body: apply prose typography styles (headings, lists, blockquotes, links, hr)
- Gradebook: fix % display when points_possible is 0 (default to 100 on grade save)
- Auto-schedule: skip items that already have a submission
- Item editor: default new/existing item point values to 100 instead of 10
- Planner: friendly week date header, per-day short date, today highlight, course color on task pills, done toggle, within-day drag reorder, Today button

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-04 16:33:59 -04:00
nmemmertandClaude Sonnet 4.6 61f9288aa5 Add student delight features: celebrations, sounds, animations, and background patterns
- Confetti + pop sound on lesson/assignment completion
- Done stamp animation (awaitable, shows below toast)
- Welcome toast on first login only (not back-navigation)
- Web Audio ding/buzz during spelling practice and flashcards
- Fanfare on all-day completion
- Score counter animate-up on practice/test results
- 3D flashcard flip animation (rotateY via CSS keyframes)
- Tab slide transition (Today/Courses/Spelling, directional)
- Staggered card entrance + time-of-day greeting on home screen
- Emoji wobble on kid card hover
- Word card green/red flash on correct/wrong spelling answer
- Combo streak celebration at milestones (3, 5, 7, 10 in a row)
- Random cheer messages for generic celebrations
- Button bounce on :active (scale + translateY)
- Progress bar smooth transition (0.5s ease-out)
- Background pattern picker: dots, stripes, grid, stars, bubbles
- bg_pattern persisted per-student via PATCH /api/students/:id/bg-pattern
- Theme switching preserves bg pattern class

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-04 13:15:53 -04:00
nmemmertandClaude Sonnet 4.6 6f73acd03e Add Worksheet item type with paste-and-parse authoring, digital submission, and print-blank
- New `worksheet` item type: admin pastes raw worksheet text, parser auto-detects fill-in-the-blank (___), true/false (T   F   ...), section headers (Part N —), and short-answer questions
- Admin editor shows each parsed question with inputs to set correct answers for FITB and T/F; short answers are marked parent-grades
- Kid view renders FITB as inline underline inputs, T/F as tap-to-toggle T/F buttons, and short answer as a textarea; Name/Date header auto-populated
- Auto-grades T/F (exact) and FITB (case-insensitive); worksheets with short answers go to grading queue as status=done
- Print blank button opens a formatted print window with underlines, circled T/F, and ruled lines for short answers
- "I handed in my paper copy" button lets kids mark a printed worksheet as turned in without digital submission, queuing it for parent grading

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-03 15:59:13 -04:00
nmemmertandClaude Sonnet 4.6 07853890e8 Upgrade spelling worksheet to a proper print sheet
- Name/Date header line on every print
- Numbered words (1. after, 2. again…)
- Ruled write slots: solid baseline + faint midline guide instead of bare underline
- Mode picker (screen-only): toggle between Practice (word shown, write twice) and Dictation/Test (numbered blank lines only) before hitting Print

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-03 11:20:06 -04:00
Nate EmmertandClaude Sonnet 4.6 2a21045e70 Fix crossword clue scrollIntoView jumping the page
Replace scrollIntoView (which escapes to the window when the list isn't
tall enough to scroll) with manual scrollTop logic that stays strictly
within the clue list container.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-01 20:28:10 -04:00
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 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
nmemmertandClaude Sonnet 4.6 be9d58e972 Render assignment body as HTML instead of escaped text
Assignment body was being run through esc() which turned <details>/<iframe>
tags into visible raw text. Set innerHTML directly to render the HTML.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-30 09:34:57 -04:00
nmemmertandClaude Sonnet 4.6 723bbb93c8 Redesign course unit list into collapsible cards on student and admin views
Student view auto-opens the unit whose item due-dates span today (falls back
to most-recent past unit, earliest future unit, then first with incomplete
work). Admin view starts all units expanded. Both share the same card design:
unit-number badge, name, progress/count indicator, animated chevron toggle.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-29 16:24:44 -04:00
nmemmertandClaude Sonnet 4.6 b048ebbd85 Add spelling test polish: date filter, CSV export, student history, planner badges
- Gradebook: period dropdown (all time / 30 / 90 days) and CSV export for
  Spelling Test History section
- Student portal spelling tab: shows last 10 tests as a Recent Tests list
- Planner: completed standalone spelling tests appear as read-only ⭐ badges
  on the day they were taken (week and month views)
- Removed dead s.tests query from /api/overview (now served by dedicated endpoints)
- New endpoints: GET /api/spelling-tests/csv, GET /api/students/:id/tests,
  GET /api/admin/students/:id/tests-range

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 14:26:47 -04:00
nmemmertandClaude Sonnet 4.6 84b8f77a37 Fix back button from course view returning to My Courses tab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 17:06:51 -04:00
nmemmertandClaude Sonnet 4.6 3c22fe05f8 Add kid engagement features and planner drag-and-drop
- Streak tracker: server-side streak counting per kid, celebration overlay
  when all today's tasks are done for the first time that day
- Kid themes: 5 colour palettes (blue/green/purple/orange/pink), picked via
  colour dots on the kid home screen; parents can set it from the Kids panel
- Grading badge: Grading nav pill turns red and shows a pending count
- Print worksheets: 🖨 Worksheet button per word list in admin Spelling panel;
  kids also get "Print my words" on the Spelling tab
- Parent feedback: gold 💬 badge on Today rows with unread comments; more
  prominent callout styling inside the assignment view
- Planner drag-and-drop: tasks can be dragged between days; PATCH
  /api/schedule/:id moves the task, drop zones highlight on hover

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-21 16:40:07 -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 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
nmemmertandClaude Sonnet 4.6 a7de24b1da Add evidence submission, 3-state offline tasks, parent comments, and retake policies
- Evidence on assignments: photo upload + notes + student self-note (needs help / not sure)
- Evidence required/optional/none flag per item; grading queue shows evidence with lightbox thumbnail
- Parent comment field when grading; shown to student on graded items
- Offline tasks: 3-state status (not started → in progress → done) with inline evidence form
- Retake policy per item: latest / highest / average — gradebook computes effective score accordingly
- Grading queue expanded to include lessons and practices (not just assignments) when evidence present

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 13:33:42 -04:00
nmemmertandClaude Sonnet 4.6 02909e1edc Add retakes, quiz templates, score history, due dates, CSV export, and prerequisites
- allow_retakes flag on items: quizzes, spelling tests, and assignments can all be retaken
- Quiz templates: save any quiz as a reusable template and load it into new items
- Score history: every quiz/test attempt logged to submission_history; click a gradebook score to see all attempts
- Due dates: optional due date per item, shown in course view and gradebook (overdue flagged with ⚠️)
- Gradebook CSV export: one-click download of any course gradebook
- Prerequisites: lock an item until a prior one is completed; locked items show 🔒 in course view

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 13:22:58 -04:00
nmemmertandClaude Sonnet 4.6 23b24b5d21 Add GitHub Actions workflow and update docker-compose to use GHCR
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-14 12:05:52 -04:00