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.
svelte-kit-vice/docs/audit/components/calendar.md

46 lines
16 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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)_

Powered by TurnKey Linux.