Cuadro vivo y ranking de pádel en tiempo real.
Translation pending
Sports & fitnessGitHub @Lfzv98OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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