- ci.yml: run Playwright tests on every push to main, then deploy to VPS
if tests pass; includes post-deploy health check
- audit.yml: weekly npm audit (Mondays 07:00 UTC), fails on high/critical
- Requires VPS_SSH_KEY secret (already configured in repo settings)
- Blind base map (grey slots for all comarques)
- Shuffled tray at the bottom with each comarca's shape + name
- Drag-and-drop with pointer events (works on touch + mouse)
- Hit test: SVG isPointInFill (precise) + 65px center fallback for small comarques
- Correct placement: comarca snaps to map with color + label
- Wrong drop: piece shakes and returns to tray (counts errors)
- Score = total pieces - errors; stars via showResult(8)
- Respects active group filter (same piece count as other map levels)
- Add +/−/⊠ zoom buttons overlay on the SVG map container
- Implement viewBox-based zoom (1×–8×) centered on map midpoint
- Add drag-to-pan when zoomed in (pointer events, ignores comarca clicks)
- Add pinch-to-zoom gesture support for touch devices
- Zoom resets to full view at the start of each new game
- Add comarca-paths.js entries for Lluçanès (OSM relation 15803523, 40 pts)
and Moianès (TopoJSON dts_comarques_cat_2025, 121 pts)
- Remove noMap:true flag from both comarques so they appear in all levels
including Level 5 (map), Level 6 (blind map) and Level 7 (Milionari)
- 6 nivells de dificultat (flashcards, tria, uneix, escriu, mapa, mapa cec)
- Registre de jugadors sense contrasenya (nom + emoji avatar)
- Backend Node.js + Express + PostgreSQL (pg)
- Mapa SVG interactiu amb dades GeoJSON reals (ICGC)
- Filtre de comarques per jugador (muntanya, BCN, GI, LL, T, totes)
- Estadistiques per nivell guardades a PostgreSQL
- Panel d'administrador amb PIN
- Manual integrat per a nens de 10-12 anys
- Mode offline (fallback sense backend)
- Deploy: Docker + Nginx + Let's Encrypt a Oracle Cloud ARM