Contrato UI — Agenda del día (US1 + VII/VIII)
Ruta: app/(panel)/agenda. Componente raíz <AgendaDia profesionalId fecha /> (Server Component que pide GET /api/agenda).
Props y estados
- Props:
{ profesionalId: string; fecha: string /* YYYY-MM-DD */ }. - Estados:
cargando(esqueleto) ·lista(citas + huecos) ·vacia(La jornada está libre) ·error(avisoes-ES+ reintentar). - Cada tarjeta de cita muestra:
tramoTexto(10:00–10:45), servicio, paciente yEstado(Reservada/Completada/Cancelada/No asistida) — sin jerga, enes-ES. - Acciones por tarjeta
reservada:Completar·Cancelar·No se presentó(confirman y llamanPATCH /api/citas/[id]/estadoen <15 s — SC-004). - Alta: botón
Nueva cita→ formulario conprofesional/servicio/paciente/día/hora; muestrafincalculado y erroresHUECO_OCUPADO/PASADOtal cual devuelve la API.
Accesibilidad y responsive (VII)
- Contraste AA, foco visible, letra base ≥16px, toques ≥44px;
lang="es-ES". - Portátil 1440px: columna agenda + lateral de detalle. Móvil 390px: lista apilada, acciones a pulgar, sin scroll horizontal.
- Importes siempre
40,00 €; fechas siempre05/10/2026, 10:00–10:45.
Glosario código ↔ etiqueta (es-ES)
Trazabilidad e2e (Playwright)
agenda-dia.spec.ts: María con citas ⇒ tramos ocupados + resto libre; Jorge sin citas ⇒La jornada está libre; 1440px y 390px legibles.alta-cita.spec.ts: válida <60 s; solapada ⇒Ese tramo ya está ocupado; pasada ⇒No se pueden crear citas en el pasado.desenlace.spec.ts: cada final <15 s; ilegal ⇒ aviso;canceladalibera hueco.acceso-semilla.spec.ts: clave ok/ko, semilla Eleva idéntica tras reset.