You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
16 KiB
16 KiB
calendar — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto)
- Familia: calendar (EL donante de la familia) · Método: solo análisis; evidencia por dimensión · demos fuera
- Capas leídas: morfo COMPLETO (358 líneas) · soma types superficie (:25,:44-68,:112-118) · provider dirigido (:63,:102-106,:328,:564) · pack sema ✓ existe
- Máquina: PASS limpio · tests ✓ · README ×2 ✓
- Antecedente resuelto (auditoría B.2):
day-holiday-shadow/event-shadowcongelados en:root→scope:'host'; pintan por primera vez (festivo = subrayado acento, evento = anillo)
Dimensiones (evidencia leída)
| # | Dimensión | Estado | Evidencia |
|---|---|---|---|
| 1 | Composición | ✓ | 14 partes compositivas (Provider→Grid <table>→GridRow <tr>→Cell <td>→Day); MonthSelect/YearSelect <select> nativos; WeekNumber opcional |
| 2 | Naming | ✓ + censo | type: 'single'|'multiple' (provider :63 — range va aparte en range-calendar, split limpio ✓); preventDeselect (types :112, Radix-style) — nuevo concepto para _naming; CalendarView = 'day'|'month'|'year' (:25, el view-switch) |
| 3 | Coherencia semántica | ✓ con cuestión | commit-select/commit-unselect (affirm, target day) + shift-navigate (sin intent ✓ shift); pack propio ✓; F-5: commit-unselect con intent affirm mientras date-field commit-reset es neutral y editable commit-cancel neutral — ¿la DES-selección es afirmativa? → censo transversal "intent de deshacer" |
| 4 | API | ✓ | min/maxValue + minViewValue (:118, límite del view-switch); preventDeselect; isDateHoliday inyectable (types :56) |
| 5 | Tokens | ✓ | Acentos por privados --_calendar-accent-* con 8 retunes por color ✓; antecedente B.2 resuelto |
| 6 | Sema | ✓ | Pack propio existe (sema/components/calendar.ts) — el único de la familia calendar con carácter |
| 7 | Animaciones | ✓ | Sin keyframes en morfo/recipe leídos |
| 8 | Contrato morfo | ✓ ejemplar con 2 gaps | TRES razones de no-archetype escritas (GridRow :248-250 "hover over the entire week bug" · Cell :271-274 chrome de listbox-row · Day :309-313 el item-tint pisaba el fill de selección) — memoria institucional del gotcha archetype-item ×3 ✓; ariaBoolean con nota de compat boolToStr ×6; F-3: data-type declarado SIN enum (morfo :54) cuando soma tiene unión cerrada (provider :63) — el compilador no puede validar valores |
| 9 | A11y | 2 hallazgos | Teclado APG-grid COMPLETO en Provider (:70-81: flechas, PageUp/Down mes, Home/End semana, Enter/Space) ✓ — date-field F-1 (Home/End) aquí SÍ está; F-1: Provider role='application' (:51) — decisión pesada (desactiva el cursor virtual del lector para TODO el árbol) SIN razón documentada, en un morfo que documenta hasta 3 razones de archetype (react-aria la usa en Calendar; bits-ui no — es debate APG real, pero aquí está muda); F-2: Day role='button' lleva aria-selected (:340-344) — ARIA inválido (aria-selected solo soporta gridcell/option/row/tab/treeitem...); el Cell (role=gridcell :277,:292-297) YA la lleva legítimamente |
| 10 | Theming | ✓ | Focus outline (o1) → censo SYS-5; vocabulario de estado de celda rico (selected/today/weekend/holiday/unavailable/outside-month) |
| 11 | Composición interna | el mandato de familia | Es el DONANTE informal: range-calendar (79 tokens), month/year-grid (65), pickers (38+4) chupan su vocabulario cross-component → mandato calendar-surface (SYS-8, ya en next-features); chronos beberá de ella |
| 12 | Estados | ✓ | 8 data-attrs por celda/día; readonly/disabled/invalid en provider |
| 13 | Runtime | ✓ | runtime.trigger('shift-navigate', {targetOverride}) (:328) — el patrón targetOverride correcto para partes doble-registradas |
| 14 | Docs+tests | ✓ | README ×2; tests ✓ |
| 15 | i18n | hallazgo | texts + commonRefs localizados ✓; PERO F-4: weekend = "Saturday or Sunday (weekend in Gregorian)" HARDCODEADO (types :53-54) — el weekend es por-LOCALE, no por calendario (ar-SA/IL = vie/sáb): Intl.Locale.getWeekInfo() existe; un framework con locale reactivo pintando data-weekend incorrecto en media región del mundo |
Hallazgos y propuestas
| ID | Hallazgo | Propuesta |
|---|---|---|
| F-1 | role='application' sin razón documentada (morfo :51) |
Decisión + doc in-place: mantenerla (estilo react-aria, intercepta flechas en SRs antiguos) documentando el porqué, o bajar a sin-role/region (estilo bits-ui) — el teclado ya vive en el grid APG. El barrido censa si otros overlays/grids la usan |
| F-2 | aria-selected sobre role='button' (Day :340-344) — ARIA inválido; duplicada con el Cell |
Quitar aria-selected del Day (el gridcell la posee) o cambiar Day a aria-pressed si se quiere estado en el botón; validar con el linter ARIA que la máquina use |
| F-3 | data-type sin enum en morfo (unión cerrada en soma :63) |
Declarar enum: ['single','multiple'] en el morfo — el compilador valida y eidos puede selector por valor. Censar más data-attrs sin enum en la familia |
| F-4 | weekend hardcodea sáb/dom (types :53-54) — incorrecto en locales vie/sáb |
$libs/days: exponer weekInfo por locale (Intl.Locale.getWeekInfo con fallback) y derivar weekend de ahí; el hardcode queda como fallback documentado |
| F-5 | commit-unselect intent affirm vs neutral de los deshacer de la familia fields |
Censo transversal "intent de deshacer/des-seleccionar" (calendar unselect=affirm · date-field reset=neutral · editable cancel=neutral) → doctrina única en el veredicto |
| F-6 | Marcas holiday/event scoped al host — los prestatarios NO las reciben (antecedente B.2) | Cubierto por el mandato calendar-surface (SYS-8) |
Escalan al sistema
SYS-8 (ancla del donante) · censo "intent de deshacer" (F-5) · censo data-attrs sin enum (F-3, con textarea data-resize) · F-4 abre la cuestión weekInfo en $libs/days (afecta a TODA la familia calendar).
Veredictos
(pendiente — checkpoint post-barrido)