Adds a "Save GIF" button to the replay panel. On click, the component
renders each step of the replay to an offscreen canvas (both fabric
panels side-by-side, FRONT/BACK labels, active-side border, dashed
pattern guides for undrawn edges, drawn stitches in thread colour,
dashed start marker, red current-vertex dot) and feeds the frames
through gifenc — dynamically imported so the ~8 KB chunk only loads
when the user actually exports.
Frame timing: 200 ms between stitches, 900 ms hold on the first and
last frames. Palette is quantised to 64 colours per frame, which keeps
a Snowflake tour (~53 frames at 684×376) around 150–250 KB. The
button flips to "Encoding…" while busy and a sonner toast reports the
file size on success or the error on failure.
https://claude.ai/code/session_01KNdXjQczMCRGMK7K3Qderw
- 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>