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

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-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.