尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
App móvil-first para registrar estadísticas de handball en vivo: eventos por zona de cancha, cuadrante del arco, rendimiento de arqueros, heatmap, evolución de temporada. • Metodología Superpowers — spec → plan → chunks testeables → review. • Design system UI UX Pro Max — Soft UI Evolution + Dimensional Layering, paleta OLED para uso al costado de la cancha. • Stack moderno — Vite + React 18 + TypeScript strict + Tailwind + Zustand + TanStack Query + Zod + Vitest. Pantallas pendientes (siguientes milestones): Live Match, Match Analysis, Teams, Evolution, Stats.檢視完整 README ↗
App móvil-first para registrar estadísticas de handball en vivo: eventos por zona de cancha, cuadrante del arco, rendimiento de arqueros, heatmap, evolución de temporada.
Reescritura completa de la v8 aplicando:
| Capa | Estado |
|---|---|
| Setup del proyecto (Vite, TS strict, Tailwind, paths) | ✅ |
| Design system (tokens CSS, Inter + JetBrains Mono, paleta) | ✅ |
Capa de dominio con tipos (CourtZoneId, GoalZoneId, HandballEvent…) | ✅ |
Lógica pura: computeScore, computeMatchStats, buildGoalkeeperMap, buildHeatCounts, buildScorers, buildSeasonStats | ✅ |
| 28 tests unitarios del dominio — todos passing | ✅ |
| UI base: Button, Card, Dialog, Badge, Input, Feedback (Spinner, EmptyState) | ✅ |
Componentes de dominio: CourtView (geometría corregida), GoalGrid (arco con franjas) | ✅ |
| Store global (Zustand) + query client (TanStack Query) | ✅ |
| Cliente Supabase tipado (placeholder hasta que cargues las env vars) | ✅ |
| Router + shell (header + bottom nav) | ✅ |
| Pantalla Matches completa (season summary + live banner + history + new match modal) | ✅ |
| Seed data de ejemplo para ver la UI sin Supabase | ✅ |
Pantallas pendientes (siguientes milestones): Live Match, Match Analysis, Teams, Evolution, Stats.
# 1. Instalar deps
npm install
# 2. (Opcional) Conectar Supabase
cp .env.example .env.local
# → pegá tu VITE_SUPABASE_URL y VITE_SUPABASE_ANON_KEY
# 3. Correr en dev
npm run dev
# abre http://localhost:5173
# Otros
npm run typecheck # verifica tipos
npm run test # tests en watch
npm run test:run # tests una sola vez
npm run build # build producción
Sin .env.local, la app igual arranca pero muestra data seed local. Ideal para iterar el diseño.
src/
├── app/ # Shell, router, providers
├── domain/ # Lógica pura — sin React ni Supabase
│ ├── types.ts # CourtZoneId, GoalZoneId, HandballEvent, MatchSummary…
│ ├── constants.ts # COURT_ZONES, GOAL_QUADRANTS, EVENT_TYPES, NAV_ITEMS
│ ├── events.ts # mapDbEvent, mapDbMatch, computeScore, calcNextScore
│ ├── stats.ts # computeMatchStats, buildGoalkeeperMap, buildHeatCounts…
│ └── __tests__/ # Vitest — 28 tests
├── features/ # Feature verticals
│ ├── matches/ # ← implementada en M1
│ ├── live-match/ # (placeholder)
│ ├── match-analysis/ # (placeholder)
│ ├── teams/ # (placeholder)
│ └── evolution/ # (placeholder)
├── components/
│ ├── ui/ # Primitives (button, card, dialog, badge, input, feedback)
│ └── handball/ # Domain-specific (court-view, goal-grid)
├── lib/ # Infra: supabase client, zustand store, cn(), seed
└── styles/
└── globals.css # Design tokens + resets
La capa de dominio es pura — funciones que reciben eventos y devuelven stats. No importa nada de React ni de Supabase, y está 100% cubierta por tests. Si rompés algo en la UI, los tests del dominio siguen pasando y te dicen dónde no rompiste.
CourtView usa viewBox="0 0 360 300". Las 9 zonas se definen con paths SVG:
| ID | Descripción | Ubicación |
|---|---|---|
extreme_left | Extremo Izq. | Borde izquierdo, contra arco de 6m |
lateral_left | Lateral Izq. | Anillo entre 6m y 9m, izquierda |
center_above | Centro | Anillo entre 6m y 9m, centro |
lateral_right | Lateral Der. | Anillo entre 6m y 9m, derecha |
extreme_right | Extremo Der. | Borde derecho, contra arco de 6m |
near_left | Cerca Izq. | Abajo del arco de 9m, izq |
near_center | Pivote | Abajo del arco de 9m, centro |
near_right | Cerca Der. | Abajo del arco de 9m, der |
7m | Penal 7m | Badge blanco centrado, también cubierto por center_above |
Corrección v11: en v8 las zonas LI/CE/LD se extendían desde la línea de 9m hasta el borde superior del SVG. En v11 están contenidas en el "anillo" real entre arcos de 6m y 9m, que es dónde físicamente se ejecutan esos lanzamientos.
GoalGrid usa viewBox="0 0 320 148". 9 cuadrantes (tl/tc/tr/ml/mc/mr/bl/bc/br) + meta-regiones out (fuera), post (palo/travesaño) y long_range (arco-a-arco). Los postes y el travesaño conservan las franjas alternadas rojo/blanco del diseño original — es código visual del handball real.
Todos en src/styles/globals.css como variables HSL. Tailwind los consume como bg-surface, text-fg, bg-goal, bg-save, bg-danger, etc.
| Token | Uso |
|---|---|
--bg | Fondo de página #0A0F1C |
--surface | Cards #131B2E |
--surface-2 | Elevadas #1C2742 |
--primary | Azul brand #3B82F6 |
--goal | Gol #10B981 |
--save | Atajada #60A5FA |
--danger | Error/roja #EF4444 |
--warning | Amarilla/sanción #F59E0B |
--exclusion | Exclusión 2' #F97316 |
28/28 tests passing · typecheck limpio · build 91kB gzipped