Repository navigation
feat(hackaton): páginas del #1 Hackatón NaN (frontend) - #7
Conversation
- Landing /hackaton con CTA dependiente de fase y sesión, + fechas del
evento (7–13 jun · Demo Day domingo 14) vía i18n es/en.
- Páginas /hackaton/{checkin,me,submission,projects,leaderboard} y
componentes Preact (RegisterForm, CheckinForm, ReassignForm,
SubmissionForm, VoteButton).
- Proxy SSR /api/hackaton/[...path] hacia CLOUD_API_URL: preserva la
cookie de sesión y bloquea admin/* desde el navegador.
- CTA de login apunta al login real de NaN (Discord OAuth en cloud-api,
/api/auth/discord); no existe página /login propia.
- Tests vitest del proxy.
npm run build en verde.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…n con quórum y submission
Barra de inscripciones (RegistrationBar.astro, hackaton.astro):
- Nuevo componente que muestra plazas ocupadas/restantes antes del formulario,
con aviso de "pool de reservas" al llenarse las 40 principales y estado
"inscripciones completas" al llegar a 50. Lee `registered` de /event.
Detección de ya-inscrito y mensajería por fase (hackaton.astro):
- Consulta /me en todas las fases y distingue: no abierto (draft), inscripción
abierta, ya inscrito, inscripciones cerradas, y panel del participante según
fase (check-in pendiente / check-in hecho / en curso).
- Interpolación correcta de {cap}/{res} en los textos de capacidad.
Check-in (checkin.astro):
- El frontend refleja cuando el usuario ya hizo check-in (deja de ofrecer la
opción en bucle).
Reasignación (ReassignForm.tsx, me.astro):
- Botón de información que explica qué es y qué ocurre al convocar.
- UI del quórum=2: muestra "Convocatoria registrada, falta confirmación
(1/2)", y los resultados filled / no_pool / ya-convocada.
Submission (SubmissionForm.tsx, submission.astro):
- Si el equipo ya tiene submission, prefija los campos, muestra el banner
"Submission enviada ✓" con los checks persistidos y cambia el botón a
"Actualizar submission" (evita reenvíos a ciegas).
Login y navegación (LoginForm.tsx, api/auth/login-request.ts, Base.astro,
LoginButton.astro, VoteButton.tsx):
- Flujo de login por magic-link y enlace "Hackatón" en la barra superior.
i18n (es/en): textos de capacidad, fases, reasignación (incl. quórum) y
submission.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… congelada
Mejoras de UX en las páginas del hackatón, alineadas con el backend.
Votación (projects.astro, VoteButton.tsx):
- La galería lee el voto actual del usuario (my_vote vía /me con cookie) y
marca la tarjeta votada con "Tu voto ✓"; el resto muestran "Votar por
este". Tras votar o cambiar se recarga para dejar un único ✓ coherente.
Landing por fase (hackaton.astro):
- En "voting" el panel del participante enlaza a la galería ("La votación
está abierta" -> Ver proyectos y votar); en "closed" enlaza al
leaderboard ("Resultados publicados").
Navegación (me.astro):
- Añade enlace "Volver" a la landing en la pantalla "Mi equipo".
Entrega (submission.astro, SubmissionForm.tsx):
- La entrega solo es editable durante "building"; en fases posteriores se
muestra congelada en solo-lectura ("plazo cerrado") con sus checks.
- El formulario superficie los errores del backend (validation_failed,
wrong_state) en vez de fallar en silencio; marca los campos opcionales.
i18n (es/en): claves nuevas para fase (voting/results), submission
(closed/errores) y projects (yourVote/changeVote).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…en votación Cuestionario de submission: botón "Adjuntar media" que despliega un campo de vídeo de YouTube (con info que sugiere subirlo oculto/no listado) y un campo de imagen de portada. La galería de votación muestra la portada (image_url) y un enlace "▶ Vídeo presentación" (video_url); la vista congelada lista ambos por separado. Incluye claves i18n es/en. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…stro check
Las páginas e islas del hackatón accedían a .data/.ok/.error sobre el
resultado de res.json(), que con @cloudflare/workers-types se infiere como
{} y rompía el type-check de CI. Se castean las respuestas al patrón del
repo ((await x.json()) as {...}) y se exportan FormStrings/LoginStrings
para tipar las llamadas tObj de los formularios.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Review — Frontend HackatónFull review by the NaN team agents. 🔴 Blockers (must fix before merge)
🟡 Important
🟢 Nits
Build state
Generated by the NaN review team — happy to clarify any item. |
Blockers:
- CSP img-src 'self' data: -> 'self' https: (Page/Base/Docs layouts):
allow external HTTPS covers and drop the data: SVG XSS vector
- proxy: use Headers.getSetCookie() to forward multiple Set-Cookie
without comma-collapsing (login + refresh, onboarding handoff)
Security/robustness:
- isAdminPath: normalize path (decode %2f, lowercase, collapse slashes)
- stop forwarding Authorization (auth is cookie-based)
- forward client IP in both CF-Connecting-IP and X-Forwarded-For
- projects: validate URL scheme (http/https only) before rendering
SSR/UX:
- parallelize independent SSR fetches with Promise.all
(hackaton/me/submission/projects)
- treat /me 401 as expired session -> render LoginForm
- VoteButton: no hard reload; sync islands via CustomEvent('nan:voted')
- SubmissionForm: re-validate phase before submit
- RegistrationBar: guard capacity === 0
i18n/a11y:
- preserve ?lang on internal navigation via withLang() helper
- move hardcoded strings out of ReassignForm into i18n
- CheckinForm: render error state; RegisterForm: handle 429/rate_limited
- add sr-only labels / aria-label to form inputs
Types/tests:
- add Participant/Team/MeData types and jsonData() helper
- type SubmissionForm checks; drop remaining any
- tune hydration directives (visible/idle)
- expand tests: admin normalization, proxy e2e (404/cookie/multi
Set-Cookie/500), login-request IP forwarding
Verified: astro check (0/0/0), npm test (148 passing), npm run build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Acompaña la eliminación del check-in en el backend: el participante inscrito pasa directo a la fase de equipos, sin pantalla de confirmación. - borrados checkin.astro y CheckinForm.tsx - hackaton.astro: panel sin ramas de check-in - lib/hackaton.ts: fuera checkin_at del tipo Participant - i18n es/en: quitadas claves phase.checkin*, el bloque checkin y limpiados poolExplain y reassignInfo Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Three blocking issues from PR review: - SubmissionForm: replace sr-only-placeholder pattern with visible labels consistent with RegisterForm (labelCls + violet uppercase). Field context stays visible while typing — WCAG 1.3.1 + 3.3.2. - SubmissionForm: narrow b.data and existing into Checks via toChecks() runtime validator. Removes unsafe `as unknown as Checks` cast and `any` destructuring; UI no longer breaks silently if the backend response shape drifts. - projects.astro: meaningful alt on project cover image (`title — team_name`) — WCAG 1.1.1 for the vote gallery flow. Also adds `decoding="async"`. Tests: 148 pass, astro check 0 errors, npm run build clean.
Qué
Frontend del #1 Hackatón NaN (Astro 6 SSR + Preact islands + Tailwind v4):
landing por fase, inscripción, check-in, panel
/me, entrega (submission),galería de proyectos con votación y leaderboard. Habla con el backend
(
nan-cloud-api) vía el proxy interno.Pantallas / componentes
hackaton.astro: landing con CTA según estado del evento y barra deinscripciones (aforo + reservas).
hackaton/me.astro+ReassignForm: equipo, compañeros y reasignación conquórum.
hackaton/submission.astro+SubmissionForm: cuestionario editable durantebuilding, congelado después. Botón "+ Adjuntar media" con campo devídeo (YouTube) (+ info de subirlo oculto/no listado) y portada.
hackaton/projects.astro+VoteButton: galería con portada y enlace"▶ Vídeo presentación"; voto recolocable (marca "Tu voto ✓" y permite
cambiarlo).
hackaton/leaderboard.astro: ranking público al cerrar la votación.Por qué
UI del recorrido completo del hackatón sobre la API del backend (PR de
nan-cloud-api). El leaderboard se mantiene oculto durante la votación (evitabandwagon) y se revela al cerrar.
Pruebas (las 3 que corre CI)
npm test✓ (143 tests)npx astro check✓ (0 errores)npm run build✓🤖 Generated with Claude Code