Sem Panela
참석자 명단, 균형 잡힌 팀 추첨, 경기 비용 관리 기능을 제공합니다
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗PWA de PadelReserve para organizar americanos y torneos de pádel en La Marina Sport Club: setup en 60 segundos, cuadro vivo con cronómetro, marcador táctil, ranking animado en tiempo real y Modo TV para las pantallas de la terraza y el bar.
Stack: Next.js 15 (App Router) · React 19 · TypeScript · Tailwind CSS 4 · Framer Motion · Lucide · Zustand. Lista para Vercel.
| Ruta | Qué hace |
|---|---|
/ | Inicio: cuatro entradas, Americanos, Americano HABIBI Tournament, Torneos y Árbitros (y Tenis solo si el club lo tiene encendido) |
| Menú (☰ arriba a la derecha) | Todas las secciones: Americanos, Torneos, Árbitros, Nuevo americano/torneo de pádel (Tenis y Nuevo torneo de tenis solo en clubes con tenis), Ranking FVP, Manual y Ajustes (Mi club, Árbitros del club, Claves). Lo del staff lleva candado y pide el mismo PIN del staff |
/arbitro | Panel del árbitro (tablet): se registra una sola vez en el club (nombre, teléfono, PIN de árbitros y un código propio de 4 dígitos) y sirve para todos los torneos, luego entra tocando su nombre y su código. Ve su turno y su pista, llama, empieza, anota y toma las fotos de las duplas |
/americanos | Eventos activos e historial, acceso rápido a Modo TV |
/setup | Asistente de 5 pasos: categoría, formato y puntuación, pistas y horario, jugadores, resumen con sorteo |
/evento/:id | Cuadro vivo: rondas con hora, cronómetro con alarma, pistas activas, carga de score |
/evento/:id/tabla | Podio + ranking (PJ, PG, PP, PF, PC, +/-, PTS) con animación de posiciones |
/evento/:id/tv | Dashboard fullscreen 1920×1080 que se escala a cualquier pantalla, con QR para seguir el ranking |
/habibi | Americano HABIBI Tournament: torneos activos, historial y cómo se juega |
/habibi/nuevo | (staff) Asistente de 5 pasos: nombre y categoría, duplas de los grupos A y B, reglas y pistas de los grupos, dónde arranca la llave (octavos, cuartos o semis directo), reglas de la llave y de la final, 3er puesto |
/habibi/:id | El torneo: tablas de los dos grupos con la línea de clasificación, botón "Armar la llave" y la llave completa; el staff toca un cruce para cargar el marcador y el ganador avanza solo. Es también lo que abre el QR |
/habibi/:id/tv | Modo TV del HABIBI: logo del club grande y difuminado de fondo, grupos lado a lado, después la ronda en juego y el camino a la final, y al terminar los campeones |
/club | Ajustes (staff): pistas, horarios por día, contacto y claves de torneos |
/torneos | Torneos del club; crear uno nuevo (staff) |
/torneos/:id | En vivo: pistas, llamados, W.O., próximos, resultados; Imprevistos (staff) |
/torneos/:id/categorias | Inscritos por categoría, cabezas de serie, pegar lista, reglas y Sorteo |
/torneos/:id/cuadros | Grupos con tabla y "¿Por qué este orden?", llaves con byes, 3er puesto, consolación |
/torneos/:id/programacion | Horarios por día y pista, "¿Cuándo juego?", Programar / Desde ahora / Imprevistos |
/torneos/:id/partido/:partido | Partido para los atletas (con la clave): comparativa de estadísticas, tabla por jugador y punto a punto |
/torneos/:id/anotar/:partido | Anotador del árbitro o del staff: asistente previo (fotos, sorteo con la pelota según FIP, lado, quién saca), un toque por punto, detalle opcional sin barra de tiempo, saque solo y aviso de cambio de lado con cronómetro FIP (directo tras el 1-0, 1:30 en impares, 2:00 entre sets) que también sale en la TV de la pista |
/torneos/:id/arbitros | Árbitros (staff): el plantel del club con lo que anotó cada uno en ese torneo, pausar o borrar, y turnos por día, franja y pista con reparto automático |
/torneos/:id/pista/:n | Pantalla de la esquina de cada pista (1920×1080) para el público: marcador, datos por dupla y relato sin métricas individuales |
/torneos/:id/tv | Modo TV del torneo: todas las pistas, próximos, resultados y patrocinadores |
/torneos/:id/estadisticas | Rankings y ficha por jugador; resumen para el club (staff) |
/inscripcion/:id | Inscripción online (pública): portada del torneo, cupos por categoría, formulario paso a paso de la dupla (datos, talla, lado, alergias, reglamento), pago con datos para copiar, referencia y foto del comprobante, código para consultar el estado y ayuda por WhatsApp |
/torneos/:id/inscripciones | Inscripciones online (staff): verificar pagos, confirmar (la dupla entra a Inscritos con su chequeo FVP) o rechazar con motivo, tallas de franelas, alergias, QR del enlace y Excel |
/torneos/:id/ajustes | Días, pistas, desempates, patrocinadores, historial y eliminar (staff) |
/manual | Manual de la app de la A a la Z como libro digital (americanos, torneos, árbitros, pantallas, jugadores, dueño), con capturas |
/manual/imprimir | El mismo manual hoja por hoja en A5, para imprimir o guardar como PDF |
| /tenis | Tenis: dos puertas, Cancha dura (hard court) y Arcilla (clay court), y los partidos en cancha ahora |
| /tenis/:superficie | dura o arcilla: torneos, partidos en vivo y consejos de esa superficie, con su color |
| /tenis/nuevo | (staff) Torneo con cuadro, liga o partido rápido; singles o dobles; formato ITF; pega la lista con (1), (2) para las cabezas de serie |
| /tenis/t/:id | Cuadro (o tabla de la liga), partidos e inscritos; llamar a cancha, anotar, W.O. o retiro |
| /tenis/t/:id/p/:partido | Partido para el público: marcador vivo, cancha con quién saca, gráfico de impulso y estadísticas |
| /tenis/t/:id/p/:partido/anotar | Anotador (staff o árbitro): sorteo con moneda, orden de saque, faltas y doble falta, ace, reloj de 25 s, cambios de lado y descansos ITF, canto en voz alta y revisión de marca en arcilla |
| /tenis/t/:id/tv | Modo TV de tenis con el color de la superficie |
| /tenis/jugadores | Ranking de jugadores con su récord en cancha dura y en arcilla |
Botón verde IA abajo a la derecha (solo con sesión de staff) y Registrar con IA en el paso de jugadores del americano, en el del Americano Torneo y en las categorías de un torneo. Se le habla (dictado del navegador, gratis) o se le escribe.
components/manual/paginas.tsx, que va en el prompt) y lo que pasa ahora (eventos activos, borrador, ranking) con un resumen que manda la pantalla, sin teléfonos ni cédulas. Lo que no es de la app lo rechaza.app/api/asistente/route.ts (solo staff, tope de 60 mensajes cada 10 min por IP) llama a Gemini con la clave gratis GEMINI_API_KEY (endpoint compatible con OpenAI, prueba los Flash vigentes en orden como el copiloto de La Fructosa; lib/server/asistente/gemini.ts). Si no hay clave de Gemini y sí ANTHROPIC_API_KEY, usa Claude. Las herramientas solo devuelven propuestas; lib/asistente/ejecutar.ts las valida y llena cada formulario.INDIVIDUAL_ROTATIVO + categoría MIXTO.lib/evento.ts, lib/lluvia.ts): el staff toca Suspender en una pista del cuadro vivo. El partido que se jugaba ahí queda en espera con su marcador y entra primero en la ronda siguiente, en otra pista; las rondas que faltan se vuelven a sortear con las pistas que quedan, sin repetir cruces (si era la última ronda, se agrega una para terminarlo). Reactivar devuelve la pista. En el Americano Torneo se aplica a los grupos y a la llave a la vez; en Torneos, el botón de la tarjeta de cada pista hace lo mismo que Imprevistos para esa pista.lib/rotation.ts): nadie repite compañero mientras sea posible, se minimizan rivales repetidos, se equilibra el nivel entre parejas, los descansos se reparten parejo y en Mixto cada pareja es hombre + mujer. Es determinista por semilla.Torneo recreativo de dos fases (lib/habibi.ts):
Se guarda como eventos normales de /api/americanos (no hace falta tabla nueva): cada grupo lleva habibi = { rol: "GRUPO", torneoId, letra } y la llave, que es la ficha del torneo, habibi = { rol: "LLAVE", grupos, inicio, tercerPuesto, siembra }; sus rondas son las fases y la final puede traer su propia puntuacion. Si se corrige un marcador de la llave, avanza el nuevo ganador y se limpia lo que dependía del anterior.
/torneos/ranking.Apagado por defecto. La Marina no tiene tenis: esta sección es para ofrecer el sistema en clubes de Caracas. Se enciende con
NEXT_PUBLIC_TENIS=1en el despliegue de ese club (lib/tenis/activo.ts). Apagado no sale en el inicio ni en el menú,/tenisda 404,/api/tenisno responde y los datos de prueba no cargan tenis.
lib/tenis/marcador.ts): 15-30-40 con ventaja o sin ventaja (punto decisivo); sets a 6 con tie-break a 7; formatos Clásico, Súper tie-break (tercer set a 10), Sets cortos (a 4), Pro set (a 8) y Grand Slam (mejor de 5, tie-break a 10 en 6-6 del quinto). Saque que rota por juego (en dobles entre los cuatro), en el tie-break 1 y luego 2; cambios de lado en juegos impares (sin descanso tras el primero, 90 s), 120 s entre sets y cada 6 puntos del tie-break.lib/tenis/torneo.ts): eliminación con cabezas de serie en sus líneas y byes para los mejores, liga todos contra todos con tabla, o partido único. El ganador avanza solo./api/tenis (GET público, POST staff o árbitro). Por ahora cada torneo es una fila de eventos_extras (evento_id = 'tenis', tipo = 'tenis'), así no hace falta una tabla nueva.Los jugadores ven todo sin cuenta (cuadro, ranking, Modo TV y el QR). Crear eventos, cargar marcadores y configurar el club es solo para el staff: PIN del club (demo: 1234, cámbialo con STAFF_PIN) o usuario de PadelReserve con rol staff.
Al crear el evento se elige cómo suma cada jugador: todos los puntos de su pareja en cada partido (americano clásico, por defecto), solo los de las rondas ganadas, o por victorias (3 por ganar, 1 por empate).
npm install
npm run dev # http://localhost:3000
npm test # tests: americanos (rotación, marcadores, horarios, fusión, plantel, validación) y torneos (sorteo, desempates, programación, lluvia, sedes, anotador, reglamento FIP)
node tests/e2e/robustez.e2e.mjs # 22 pruebas en navegador (con la app corriendo)
node tests/e2e/horario.e2e.mjs # 18 pruebas del selector de fecha y horas (celular y computadora)
node tests/e2e/habibi.e2e.mjs # Americano HABIBI de punta a punta: asistente, grupos, llave desde octavos, empate con punto de oro, campeones, TV
npm run typecheck
npm run build
Sin variables de entorno corre en modo DEMO, en memoria y vacía. Para enseñarla se cargan datos de prueba con POST /api/demo (staff, {"accion":"cargar"}; ya no hay botón en Ajustes): crea 3 americanos, un torneo de hoy en pleno juego (clave MARINA), la Copa Navidad con la inscripción online abierta y 6 árbitros de ejemplo (código 1234, PIN de árbitros 2468 si no había uno); {"accion":"borrar"} los quita sin tocar lo real. Los datos salen de data/mockData.json (americanos: node --experimental-strip-types scripts/generar-mock.ts; torneo: node --experimental-strip-types scripts/generar-torneo-demo.ts). Las pruebas de navegador los cargan solas. Para conectar Supabase ver docs/BACKEND.md.
lamarinasportclub.vercel.app en Settings → Domains.STAFF_PIN y STAFF_SECRET (y luego las de Supabase) en Settings → Environment Variables. Ver .env.example.app/ páginas y API routes (app/api/americanos, club, torneos, marcadores, staff)
components/ UI (ScoreModal, Leaderboard, Cronometro, EventoShell, …) y components/torneo/
lib/ lógica pura: rotation, scoring, evento, horarios, store, torneosStore
lib/torneo/ categorias, cuadro, tabla, torneo, programacion, imprevistos, marcador, acceso, validacion
lib/server/ repositorio DEMO / Supabase, sesión de staff y acceso a torneos
types/ americano.ts y torneo.ts
public/ manifest.json, sw.js, iconos y logo
eventos_extrasinscripcion