# 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](../../../src/uix/morfo/components/date-field.ts) · [soma](../../../src/uix/soma/components/date-field/) · [eidos](../../../src/uix/eidos/components/date-field/) · [sema pack](../../../src/uix/sema/components/date-field.ts) ✓ - **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 | ~~Demo testbed~~ | 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)_