|
|
# 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](../../../src/uix/morfo/components/calendar.ts) COMPLETO (358 líneas) · [soma types](../../../src/uix/soma/components/calendar/types.ts) superficie (:25,:44-68,:112-118) · [provider](../../../src/uix/soma/components/calendar/calendar-provider.svelte.ts) 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-shadow` congelados 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)_
|