neighbor-sum-avoidance (T2-T6):
- Start button now reads just "Start" (no mode suffix).
- Available numbers and shuffled preview arrangements render pre-start
so the arena isn't empty while the user is still deciding.
- Mode switch + count slider stay mounted once active; they're just
disabled, so starting no longer causes a layout jump.
- Guided-mode instructions expanded to call out light grey edges, red
violation arcs, and the green valid-neighbor line explicitly.
- Draggable numbers honor isActive for the draggable attribute and
onDragStart, showing opacity-60 + cursor-not-allowed when locked.
computing-pi (new interactive under Miscellany):
- N parallel first-passage simulations: toss until heads > tails,
record the fraction. Average × 4 converges to π.
- Header row: runs slider | live average × 4 | Start/Reset.
- Tile grid uses a mask-gradient marquee so long sequences scroll
their tail while staying readable.
- Click any tile once all runs complete to see the full toss sequence
in a Dialog.
- Safety cap of 1000 tosses per run (first-passage time has infinite
expectation, so without the cap a pathological run could block).
- Registered in interactives.ts + InteractiveRenderer + the parallel
interactive-components map. Filled in three-bank-accounts in the
latter while there, since it was missing.
admin-data.json updated to mark T2-T6 done with remarks, remove the
implemented Computing Pi idea, and add an implementation note.
Agents processing todos/ideas from admin-data.json should mirror them
as cards on the author's Fizzy board. Slug → tag, progress → Review
column, staging branch link in the card description. PAT is read
from FIZZY_PAT env var; never hardcoded.
- Replace literal admin password with a pointer to where it lives and
the ADMIN_PASSWORD env var override.
- Add a design section covering the shadcn-first approach, OKLCH
design tokens, mandatory dark-mode pairing, typography pairing
(Castoro serif display + Imprima/Geist sans), radius scale, motion
libraries and reduced-motion handling, and the tab/card/alert
patterns that published interactives tend to share.
Documents the three-place registration dance for interactives
(interactives.ts, InteractiveRenderer.tsx, interactive-components.ts),
the admin function's text-editing of source files, routing, and
Netlify-specific build workarounds.
Server side: writeData() now takes a message, and each action in the
POST handler computes its own — e.g. "admin: add idea "Title"", "admin:
clear note on slug". For setTodos (which ships the whole blob), diff
old vs new per slug to produce messages like "neighbor-sum-avoidance:
add T6" or "mark T1 done, add T5".
Client side: syncFromServer() falls back to the bundled admin-data.json
when /api/admin is unreachable, so the admin panel reflects committed
state under `astro dev` (which doesn't run Netlify Functions).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Show the circle arena before the user clicks Start (greyed via
opacity-60 pointer-events-none), and guard drag/drop/click handlers on
isActive. Clicking Start enables interactions and kicks off the timer
as before. Also resync slot count with the Numbers slider while idle.
Marks T1 done.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The form.tsx UI component imported react-hook-form and
@radix-ui/react-slot which aren't installed. Nothing uses
this component — removing it cleans up the dev server output.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove Astro adapter (causes esbuild bundling errors on Netlify)
and use a pure static build + standalone Netlify Function instead.
- Removed @astrojs/netlify adapter — site builds as fully static
- Created netlify/functions/admin.mts as a standalone Netlify Function
- Function handles all admin API operations via GitHub API
- Removed src/pages/api/admin.ts (Astro SSR route)
- Local dev: admin syncs to localStorage (server sync fails silently)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Vite/Rollup generates chunk names with !~{} characters that cause
esbuild syntax errors on Netlify's build system. Added sanitizeFileName
to replace special characters with underscores.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Set esbuild charset to utf8 and target to es2022 to avoid
syntax errors from ASCII-escaped unicode in the bundled output
on Netlify's build environment.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Netlify's asset post-processing was re-minifying Vite's output
and causing esbuild syntax errors. Disable it since Astro/Vite
already handles bundling and minification.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Swap @astrojs/node for @astrojs/netlify adapter
- Admin API reads/writes admin-data.json via GitHub API in production
- Status changes (commitStatus) and deletes commit directly to repo
- Env vars: ADMIN_PASSWORD, GITHUB_TOKEN
- Local dev falls back to filesystem (no env vars needed)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Astro-based site with 40+ interactive math games, puzzles, and explorations.
Includes admin dashboard, todo system, blog, theme/subcategory navigation,
and embed pages for iframe embedding.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>