Each player picks ANY avatar from a combined 16-emoji roster (8 sparkle + 8 shred); their color, move sound, and particle FX follow that avatar's CAMP, so one nibling can rock unicorns/rainbows while the other brings skulls/metal. A 3-way STAGE selector (Sparkle / Shred / Mixed) sets the global backdrop, fonts, and winner vibe. Camps and stages are orthogonal, driven by CSS custom properties (.camp-* and [data-stage]). - Combined avatar grids for both players with a same-avatar guard - Per-camp Web Audio SFX (sine chimes vs sawtooth power chords) + mute toggle - Per-player glow on displays, scoreboard, and board pieces; winner screen adopts the winner's camp; screen shake on shred moves; themed celebration - Persist names/avatars/stage/scores/mute via localStorage; reset-scores button - Fix nested-scroll / clipped-top bug (center with margin:auto, not flex + max-height); no horizontal overflow 320px-desktop; SVG favicon - Keyboard-navigable board, ARIA roles, live status, prefers-reduced-motion - Containerize for OrbStack: Dockerfile (nginx:alpine), nginx.conf (gzip + cache/security headers), docker-compose.yml — one command on :8080 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
17 lines
571 B
Docker
17 lines
571 B
Docker
# Ultimate Tic-Tac-Toe — static site served by nginx.
|
|
# No build step: copy the static assets into the nginx web root.
|
|
FROM nginx:1.27-alpine
|
|
|
|
# Tuned server config (gzip, cache + security headers, SPA-safe fallback).
|
|
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
|
|
# Static assets.
|
|
COPY index.html style.css script.js /usr/share/nginx/html/
|
|
|
|
EXPOSE 80
|
|
|
|
# Liveness probe for `docker ps` / orchestration.
|
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
CMD wget -q -O /dev/null http://localhost/ || exit 1
|
|
|
|
CMD ["nginx", "-g", "daemon off;"]
|