- Total issues found: 25+ (tracked in MASTER_ISSUE_TRACKER.md)
- Total issues fixed: 18 (8 P0 + 10 P1)
- Total issues remaining: ~7 (P2)
- Build status: Clean compile, zero warnings
- File:
Header.js,Footer.js - Fix: Removed "Templates" link from Header nav and Footer. Header nav now has Create / Play / Play / About (two Play links were adjacent — the fix removed the duplicate Play that replaced Templates). Footer Create section now links to About instead.
- Impact: Navigation no longer leads to a 404.
- File:
public/index.html - Fix: Removed the old
<link>to Google Fonts for Nunito (was the pre-redesign font). The new fonts (Playfair Display, Source Serif 4, Inter, JetBrains Mono) are loaded via@importinindex.css. - Impact: Eliminates ~30KB unnecessary font download, matches actual design system.
- File:
PuzzleGame.js - Fix: Replaced all hardcoded dark-blue colors (
#16213e,#0f172a,#1e293b,#94a3b8) with BOOP's warm dark-mode palette (#1C1915paper-dark,#28231Dpaper-light,#3E352Bborder,#BFB09Cink-light,#E2D8C8ink,#FDFAF5paper-light). Updated font stacks to use Playfair Display and JetBrains Mono. - Impact: Downloaded share images now match BOOP's editorial identity.
- File:
GenerationProgress.js,GenerationProgress.css - Fix: Deleted both files. This component was defined but never imported anywhere in the app.
- Impact: Eliminates confusion, reduces bundle size slightly.
- File:
PuzzleCreator.js - Fix: Moved title validation from
onChangetoonBlur. Error only appears when the user leaves the title field with invalid characters, not during typing. - Impact: Cleaner UX, no error flash while typing.
- File:
PuzzleGame.js - Fix: Replaced plain spinner + text with animated shimmer progress bar + loading text styled to match the design system. Uses the same progress bar visual language as the main book generation flow.
- Impact: Users can see that generation is actively progressing.
- File:
public/index.html - Fix: Changed
theme-colormeta tag from#4a6fa5(blue, old design) to#3D6B3D(BOOP green). - Impact: Mobile browser chrome now matches brand color.
- File:
PuzzleCreator.js - Fix: Added
generatedFile && !showSuccessto the button'sdisabledcondition, preventing a second generation while a completed file exists. - Impact: Prevents accidental duplicate generation requests.
- File:
Tooltip.css - Fix: Replaced
background: var(--dark)withbackground: var(--ink)andcolor: whitewithcolor: var(--paper-light). Addedfont-family: var(--font-ui), properborder-radius: var(--radius-sm), andbox-shadow: var(--shadow-md). - Impact: Tooltips now adapt properly to both light and dark themes.
- File:
ThemeToggle.js - Fix: Swapped the SVG icons: now shows moon icon when in dark mode (click to go light), sun icon when in light mode (click to go dark). Matches common UX convention.
- Impact: Intuitive icon meaning.
- File:
PuzzlePreview.js - Fix: Added a
seedRefthat generates a stable seed on mount. Grid generation usesgenGrid(seed + i)instead ofgenGrid(), so grids are deterministic within a session. Removed unstableconst grid = useMemo(...)that depended on[page, totalPuzzles]. - Impact: Preview grids stay stable when flipping pages.
- File:
FileUploader.js - Fix: Changed
alt="Preview"toalt="" role="presentation". The image is decorative (shows uploaded image preview), not informative. - Impact: Screen readers skip the irrelevant announcement.
- File:
PuzzleGame.js - Fix: Changed loading wrapper from
<div className="card">to<div className="pg-start-card">which uses the design system's card styling with double-border effect. - Impact: Consistent card appearance across all loading states.
- File:
LoadingOverlay.js,GenerationStatus.js - Fix: Added
role="alert" aria-live="polite" aria-busy={isGenerating}to LoadingOverlay. Addedrole="status" aria-live="polite"to GenerationStatus container. - Impact: Screen readers announce generation progress and status changes.
- File:
HeroLetterGrid.js - Fix: Added
getInkColor()function that readsdata-themeattribute and returns appropriate RGB string. AddedMutationObserverto dynamically update color when theme toggles. - Impact: Letter grid uses correct ink color in both light and dark modes.
- File:
HeroLetterGrid.js - Fix: Added
prefersReducedMotion()check. When reduced motion is preferred, the canvas renders a static frame (flicker = 0.04, norequestAnimationFrameloop). - Impact: Users with motion sensitivity get a static display.
- Note: The existing hint cooldown messaging ("Hint in Xs") was already adequate. Skipped as sufficient.
| # | Issue | Effort |
|---|---|---|
| 19 | App.js wake-up API call runs on every mount — debug artifact |
Low |
| 20 | Footer heading hierarchy skips levels (h3→h4) | Low |
| 21 | PuzzleGame inline styles should be CSS classes | Low |
| 22 | No loading="lazy" on images |
Low |
| 23 | forceTick interval for cooldown UI — ref-based would be cleaner |
Medium |
| 24 | GenerationProgress had duplicated step logic (now deleted) | — |
| 25 | Legal page data is inline JS — could be JSON | High |