|
|
# time-range-field — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto)
|
|
|
|
|
|
- **Familia**: fields (rango de horas; dos endpoints TimeField) · **Método**: solo análisis; evidencia por dimensión · demos fuera
|
|
|
- **Capas leídas**: [morfo](../../../src/uix/morfo/components/time-range-field.ts) (63 líneas; censo `semantic:`=0, **`apg:`=0**) · [soma types](../../../src/uix/soma/components/time-range-field/types.ts) superficie · arquitectura de delegación verificada en el gemelo [date-range-field](date-range-field.md) (mismo patrón per-endpoint)
|
|
|
- **Máquina**: **NEEDS-WORK** — `E-2.3` (falta README eidos) · `R-1.3` (`data-readonly` sin estilo) · `R-1.4` (**`data-invalid` sin estilo**)
|
|
|
|
|
|
## Dimensiones (evidencia leída)
|
|
|
|
|
|
| # | Dimensión | Estado | Evidencia |
|
|
|
| ----------------- | -------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
|
| 1 | Composición | ✓ | Mismo patrón del gemelo: cada Input = TimeField completo por endpoint; 0 eventos propios = delegación by-design |
|
|
|
| 2 | Naming | ✓ | `value: TimeRange` + `onValueChange` + `onStartValueChange`/`onEndValueChange` — coherente con date-range ✓ |
|
|
|
| 3 | Coherencia semántica | condicionada + cuestión de diseño | Delegada a time-field (que SÍ tiene commit-set ✓, 1 evento)… **pero time-field no tiene pack** → este range entero suena a default crudo mientras date-range suena tuneado: la asimetría SYS-3 en su forma más visible. Comparte con el gemelo la falta de evento rango-completo (F-1 conjunta) |
|
|
|
| 8 | Contrato morfo | **gap menor** | **F-2**: SIN cita `apg:` — su gemelo cita spinbutton y time-field single también; una línea de asimetría documental |
|
|
|
| 12 | Estados | **hallazgo doble (máquina)** | R-1.3 readonly Y **R-1.4 invalid** sin materializar — el único de la familia donde INVALID tampoco pinta: un rango inválido (end < start) valida en soma pero NO SE VE → F-3 prioritario |
|
|
|
| 14 | Docs | gap | Sin README eidos (E-2.3) |
|
|
|
| 4-7, 9-11, 13, 15 | | heredan del single | Wrapper de composición |
|
|
|
|
|
|
## Hallazgos y propuestas
|
|
|
|
|
|
| ID | Hallazgo | Propuesta |
|
|
|
| ------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
|
| **F-1** | Sin evento de rango-completo (compartida con date-range F-1) | Misma decisión, mismo fix para ambos ranges |
|
|
|
| **F-2** | Sin cita APG (gemelo y single la tienen) | Añadir `apg: spinbutton` — una línea; verificar por qué el guard F-1.x no lo cazó |
|
|
|
| **F-3** | `data-invalid` sin estilo (R-1.4) — la validación de rango existe y no pinta | Materializar invalid (border `--{c}-border-invalid` como el gemelo) — y a largo plazo vía composición Field (SYS-6) |
|
|
|
| **F-4** | readonly sin estilo (R-1.3) | Censo de familia ×4 |
|
|
|
| **F-5** | README eidos ausente | SYS-4 |
|
|
|
| **F-6** | Compuesto SIN `expression` declarada (canon `'delegated'` existe; primos pickers lo usan) | Añadir `expression: 'delegated'` — SYS-11, mismo pase que el gemelo |
|
|
|
|
|
|
## Escalan al sistema
|
|
|
|
|
|
SYS-3 (el range hace VISIBLE la asimetría del trío: gemelos que suenan distinto) · SYS-4 · SYS-6 · censos R-1.3/R-1.4.
|
|
|
|
|
|
## Veredictos
|
|
|
|
|
|
_(pendiente — checkpoint post-barrido)_
|