feat(audit): component re-audit + fixes P0–P5 (P4 complete, P5 in progress)
Re-audit of the whole component catalog at pilot depth (91 fichas + the
checkpoint verdicts in docs/audit/components/) and the executed fix packages.
- P0–P3: doctrine (sema participation, CANON §3 intent, component-guide §5 +
API naming, §32 outline), guards (morfo-vocabulary-check S10/S11d,
component-audit A-3.1/A-1.4/S9, eidos-lint classHooks), morfo contracts
(role=application removed ×4, aria-selected off the Day, drp translationRef,
field data-state prune, pin-input commit-set, media-player renames), 13 new
sema packs + 12 morfos family-default → pack.
- P4 (N1–N10) COMPLETE: selectionMode (select/combobox/toggle-group/calendar);
onValueCommit terminal-callback norm (pin-input/search/password/textarea +
date/time/color-field add); typed validation reason + onInvalid (tags-input,
css-field); index/onIndexChange (carousel); deselectable; openDelay/
groupSkipDelay; allowCustomValue; defaultValue prune.
- P5 (in progress): S1 class-hooks codemod (22 hooks → data-attrs across
cropper/button/image-picker/toggle/image-adjustments); S5 outline remnant in
field.css; depth pass (data-depth=overlay on tooltip/toast/float-panel);
touch-rows (--touch-target token, decoupled ::before hit-slop, area-not-visual,
44 AAA). S6 (Field composition) + S8 (calendar-surface) pending.
Verification: errors-outside-(alpha|words|palabras|chronos) == 59 (baseline);
morfo-vocabulary-check exit 0; eidos-lint class-hooks/invalid 0 on touched
components; per-component vitest suites green.
Handoff + remaining plan: docs/process/continue-audit-fixes-2026-07.md
Excluded (broken by the N1 rename, left broken per user decision, not staged):
words/**, palabras/**, chronos, web/routes/alpha/**.
Reconciliation pending: the touch-rows ::before for checkbox/switch reverses
changelog §37's earlier pseudo-element rejection (WCAG-overlap) that had routed
markers to a labeled-row/Field task — flagged for the user in the handoff.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3 months ago
|
|
|
|
# time-field — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto)
|
|
|
|
|
|
|
|
|
|
|
|
- **Familia**: fields (trío de segmentos) · **Método**: solo análisis; evidencia por dimensión · demos fuera
|
|
|
|
|
|
- **Capas leídas**: [morfo](../../../src/uix/morfo/components/time-field.ts) completo (1-100+teclado) · [soma types](../../../src/uix/soma/components/time-field/types.ts) completo · provider dirigido (commit wiring :436) · [wrapper eidos](../../../src/uix/eidos/components/time-field/time-field.svelte) completo · css/recipe (censo familia: focus o2/b1, alturas, marker compartido) · sema: sin pack, **declarado** (`expression: "family-default"`, morfo :8)
|
|
|
|
|
|
- **Máquina**: PASS limpio · tests ✓ · README ×2 ✓
|
|
|
|
|
|
|
|
|
|
|
|
## Dimensiones (evidencia leída)
|
|
|
|
|
|
|
|
|
|
|
|
| # | Dimensión | Estado | Evidencia |
|
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
| 1 | Composición | ✓ | Partes compositivas (Provider/Input/Segment/Label/HiddenInput); snippet `segments` ordenado (types :20-22) |
|
|
|
|
|
|
| 2 | Naming | ✓ conforme | `value/onValueChange` + `placeholder/onPlaceholderChange` (types :30-36); `validate/onInvalid`, `minValue/maxValue`, `readonlySegments`, `granularity`, `hideTimeZone`, `errorMessageId`, `locale/dir/hourCycle` (:38-67) — fila conforme en [_naming.md](./_naming.md) |
|
|
|
|
|
|
| 3 | Coherencia semántica | **hallazgo de trío** | Solo `commit-set` (morfo :14-25) — **date-field además emite `commit-reset`** al limpiar: vaciar un time-field no produce señal semántica → F-1. `intent: neutral`, `sequence: post` ✓ canon |
|
|
|
|
|
|
| 4 | API | ✓ | Espejo exacto de date-field (sin `kind`, correcto: no aplica a horas); bindables declarados; fallbacks reactivos documentados (types :59-67) |
|
|
|
|
|
|
| 5 | Tokens | ✓ con dup | Recipe canónico; `height-{k}` re-declara el bundle (SYS-6, evidencia matriz familia) |
|
|
|
|
|
|
| 6 | Sema | declarado, cuestionado | `family-default` EXPLÍCITO en morfo — el trío roto es elección declarada, no olvido; la pregunta SYS-3 pasa a ser: ¿debe el trío compartir UNA expression (los tres pack o los tres default)? El provider usa `fallbackTarget` en el trigger (:436 ✓ el fix de partes doble-registradas) |
|
|
|
|
|
|
| 7 | Animaciones | ✓ | Sin keyframes; transición solo-background heredada del patrón de familia |
|
|
|
|
|
|
| 8 | Contrato morfo | ✓ más rico que su hermano | APG spinbutton ✓; teclado 5 teclas (verificado — sin Home/End, F-2); **su bloque ARIA del Input es MÁS completo que el de date-field**: añade `aria-readonly` ariaBoolean + `aria-invalid` condicional (morfo :76-90) que date-field no tiene → F-3 (unificar el trío al bloque rico) |
|
|
|
|
|
|
| 9 | A11y | ✓ con F-2 | aria-value\* por segmento, labelledby condicional; falta Home/End |
|
|
|
|
|
|
| 10 | Theming | censo | Focus outline (o2/b1) → SYS-5; segment marker compartido ✓ (state-layer llega) |
|
|
|
|
|
|
| 11 | Composición interna | mandato | Sin wrapper `[data-field]` (SYS-6/B.1 — fue LA sonda en vivo de esta familia); wrapper eidos espejo exacto de date-field (leído) |
|
|
|
|
|
|
| 12 | Estados | ✓ | invalid/disabled/readonly/required + readonlySegments granular; hidden-input forms ✓ |
|
|
|
|
|
|
| 13 | Runtime | ✓ | Sin timers/listeners crudos en lo dirigido; fallbackTarget ✓ |
|
|
|
|
|
|
| 14 | Docs+tests | ✓ | README ×2, suite ✓ |
|
|
|
|
|
|
| 15 | i18n | ✓ | texts morfo; formatter por locale reactivo; `$libs/days` ✓ |
|
|
|
|
|
|
|
|
|
|
|
|
## Hallazgos y propuestas
|
|
|
|
|
|
|
|
|
|
|
|
| ID | Hallazgo | Propuesta |
|
|
|
|
|
|
|---|---|---|
|
|
|
|
|
|
| **F-1** | Falta `commit-reset` (date-field lo tiene; limpiar no suena) | Añadir el evento al morfo + wiring en provider (espejo de date-field) — como parte del veredicto de trío SYS-3 |
|
|
|
|
|
|
| **F-2** | Sin Home/End (APG spinbutton) | Pass de familia de segmentos (con date/color) |
|
|
|
|
|
|
| **F-3** | ARIA del Input asimétrico en el trío (este es el RICO) | Unificar: date-field adopta aria-readonly/aria-invalid de time-field |
|
|
|
|
|
|
| **F-4** | `height-{k}` duplicadas | SYS-6 |
|
|
|
|
|
|
|
|
|
|
|
|
## Escalan al sistema
|
|
|
|
|
|
|
|
|
|
|
|
SYS-3 **matizado con evidencia nueva**: el trío declara expressions distintas a propósito (`pack` vs `family-default` ×2) — el veredicto es de COHERENCIA declarada, no de olvido. · SYS-5 · SYS-6.
|
|
|
|
|
|
|
|
|
|
|
|
## Veredictos
|
|
|
|
|
|
|
|
|
|
|
|
*(pendiente — checkpoint post-barrido)*
|