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.
12 KiB
12 KiB
date-field — ficha de auditoría de componente
- Fecha: 2026-07-07 · Auditoría: componentes (piloto 2)
- Método: solo análisis — fixes tras el barrido completo; la ficha registra hallazgos + propuestas de solución (locales y las que escalan al sistema).
- Tier: campo compuesto (segmentos) · Morfo scope:
['soma','sema','eidos']· Familia: fields - Capas: morfo · soma · eidos · sema pack ✓
- Máquina (
component:audit --only date-field): PASS — R-rules limpias. (Reglas D-* de demo excluidas — corrección de alcance 2026-07-07.) - Vigencia re-auditoría: ficha piloto — YA a profundidad de referencia; este retrofit solo extrae las demos del alcance.
Tabla de dimensiones
| # | Dimensión | Estado | Evidencia / nota |
|---|---|---|---|
| 1 | Composición vs declaración | ✓ | Partes compositivas (Provider/Input/Segment/Label como children); snippet segments ordenados para render libre |
| 2 | Naming de props | ✓ | value/onValueChange + placeholder/onPlaceholderChange (patrón bindable canónico); minValue/maxValue; readonlySegments; kind ⊥ granularity con la ortogonalidad DOCUMENTADA (consistencia de trío) |
| 3 | Coherencia semántica | ✓ | commit-set/commit-reset post, intent neutral (canon de fields); expression 'pack' |
| 4 | API normalizada | ✓ | Bindables declarados; validate/onInvalid (Standard-Schema-friendly); locale con fallback reactivo soma.langs; dir RTL invierte flechas; hourCycle con cadena de fallbacks |
| 5 | Tokens usados | ✓ | CSS consume SOLO sus tokens de recipe (--date-field-*) — TSC-canónico; segment-height fantasma eliminado en auditoría B.1 (antecedente resuelto) |
| 6 | Parte semántica | ✓ ejemplar | Pack con semaSelector tipado, targets al part input (nota de dónde estampa el engine), tunings COMPUESTOS (form.commit.soft / subtle + delta {op:'add', -80} + contour) — el patrón de doctrina exacto |
| 7 | Animaciones | ✓ | Transición SOLO de background con razón documentada (border-color instantáneo: el increment provoca blur/refocus y un border transicionado parpadea) |
| 8 | Contrato morfo | ✓ | APG spinbutton enlazado; role='group' en Input + role='spinbutton' por segmento con aria-value{min,max,now,text} completos; teclado declarado; ariaBoolean para aria-disabled con nota de por qué |
| 9 | Accesibilidad | ✓ con hallazgo | Labels/aria-labelledby condicionales por part-present; errorMessageId → describedby; F-1: faltan Home/End (APG spinbutton: saltar a min/max) |
| 10 | Adopción theming | hallazgo doctrinal | Focus = outline flush (:has(segment:focus-visible) + border swap) con razón técnica sólida — pero la doctrina §32 vigente dice "los CAMPOS quedan en box-shadow (anillo interior parametrizable)" → S-1. State-layer de segmentos vía capa compartida ✓ (data-field-segment estampado en soma) |
| 11 | Composición interna | el mandato | FieldProvider consumido en soma (merge) ✓ — pero sin wrapper Field a nivel DOM/eidos: [data-field][data-size] ausente (sondado en la familia), Label propio en vez de la base Field → S-2 (mandato B.1 ya registrado) |
| 12 | Estados y ciclo | ✓ | invalid/disabled/readonly/required en data-attrs por parte; readonlySegments granular; hidden-input para FormData (name + ISO) ✓; controlled/uncontrolled ✓ |
| 13 | Disciplina runtime | ✓ | 0 timers/listeners crudos a nivel grep en 57KB de provider; memoria institucional dentro (incidencia range-placeholder 2026-05-20 #1 documentada con su porqué) |
| 14 | fuera de alcance | Demos excluidas de la auditoría (corrección 2026-07-07) | |
| 15 | Docs + tests | ✓ | README en AMBOS niveles (soma 14KB con ## Sema events; eidos 4KB) — el patrón que S-4 de button propone ratificar; tests de provider (8KB) ✓ |
| 16 | i18n | ✓ | langs.ts propio; texts de morfo localizados; formatter por locale reactivo; tipos $libs/days (doctrina, nunca @internationalized/date) |
Hallazgos y propuestas de solución — del componente
| ID | Hallazgo | Propuesta de solución |
|---|---|---|
| F-1 | Teclado de segmento sin Home/End (APG spinbutton los recomienda: saltar a aria-valuemin/max) |
Añadir { key: 'Home', action: 'set-min' } / { key: 'End', action: 'set-max' } al morfo + implementación en provider; extensivo a time-field/color-field (misma familia de segmentos) |
| F-2 | El outline de focus lleva outline-offset: 0 hardcodeado (razonado: flush, sin hueco) y no participa --focus-ring-inner-width |
Sin acción si S-1 canoniza el modelo outline-flush para segment-fields (el 0 es semántica del modelo, anotarlo como literal razonado); si S-1 devuelve a box-shadow, se resuelve solo |
| F-3 | Alturas re-declaradas: el recipe date-field duplica height-{xs..xl} = var(--size-{k}-control-height) que la familia field ya expone |
Cubierta por S-2 (des-duplicación de familia — mandato B.1) |
Hallazgos que escalan al sistema / theming
| ID | Hallazgo | Propuesta |
|---|---|---|
| S-1 | Doctrina §32 vs realidad de los segment-fields: §32/changelog dicen "los campos quedan en box-shadow (anillo interior parametrizable)", pero date-field migró a outline flush con razón técnica sólida y documentada (un border/box-shadow transicionado parpadea en cada increment por el blur/refocus del segmento; el outline sobrevive forced-colors). Afecta a toda la familia de segment-fields (date/time/color y sus range) | Decisión doctrinal (checkpoint post-barrido): (a) matizar §32 — text-fields = dos anillos box-shadow; segment-fields = outline flush (canonizar la razón del flicker, nota fechada en changelog §32) — recomendada; o (b) devolver los segment-fields a box-shadow resolviendo el flicker de otra forma. El barrido debe censar qué hace cada field (time/color/search/password/mask) para dimensionar |
| S-2 | Composición Field (mandato B.1, evidencia por-componente): el soma participa de FieldProvider (merge ✓) pero el DOM no envuelve en [data-field][data-size]; Label propio; alturas duplicadas; el token de familia --field-segment-height (size-driven, TSC scope size:) no puede aterrizar hasta esto |
Ya mandatado en next-features.md: incorporar la base Field (wrapper + label/helper/error), token de familia con scope size:, morir las copias height-{k} y segment-height per-componente. Esta ficha aporta la lista concreta de piezas de date-field a tocar |
Veredictos
(pendiente — checkpoint único post-barrido)