|
|
# natural-time-picker — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto)
|
|
|
|
|
|
- **Familia**: pickers (reloj natural: cielo/astros) · **Método**: solo análisis; evidencia por dimensión · demos fuera
|
|
|
- **Capas leídas**: [morfo](../../../src/uix/morfo/components/natural-time-picker.ts) COMPLETO (117 líneas) · delegación verificada en [picker](picker.md) genérico
|
|
|
- **Máquina**: NEEDS-WORK — `A-1.4` (sin URL APG) · `R-2.1` (9 colores crudos) · `R-1.3`/`R-1.4` (readonly/invalid sin estilo) · `E-2.3` (sin README) · tests **0**
|
|
|
- **CORRECCIÓN MAYOR sobre el pass superficial**: el "A-3.1 interactivo con 0 eventos = sema ciego por diseño roto" era INJUSTO. El header del morfo (:4-19) documenta la composición completa (Picker genérico = host transaccional Listo/Cancelar/Borrar + deferValue · TimeField segmentado · Slider banda · Button steppers/chips · PickerShell footer) y la razón: "Open/close are delegated to the composed Popover, so this morfo declares no dialog semantics **and no events**". `scope: ['soma','eidos']` (sin sema :23) — coherente. La delegación es REAL y está escrita… pero ver F-1: el eslabón transaccional delega en un Picker que AÚN no tiene eventos.
|
|
|
|
|
|
## Dimensiones (evidencia leída)
|
|
|
|
|
|
| # | Dimensión | Estado | Evidencia |
|
|
|
|---|---|---|---|
|
|
|
| 1 | Composición | ✓ documentada | Header :10-15: solo el gradiente daylight es bespoke; todo lo demás compone primitivos del sistema — el espíritu "compose existing components" cumplido y ESCRITO |
|
|
|
| 3 | Coherencia semántica | **gap heredado, no propio** | **F-1**: la cadena semántica tiene un eslabón hueco — el valor comete por TimeField (commit-set ✓ del embebido), pero Listo/Cancelar/Borrar fluyen por el Picker genérico cuyo morfo declara 0 eventos (deuda RECONOCIDA en picker :18-19 "candidate commit-* events for a later sema pass"). El "Listo" de un picker (el gesto más commit del patrón) suena a Button contact genérico |
|
|
|
| 5 | Tokens | hallazgo matizado | Los 9 hex (R-2.1) son los CIELOS — la excepción *physically-fixed* existe justo para esto PERO exige anotación `/* literal: … */` línea a línea y no la llevan → F-2 (anotar, NO tokenizar) |
|
|
|
| 8 | Contrato morfo | ✓ moderno | `data-state` CON values `['open','closed']` enumerados (:39,:75,:96 — el patrón que calendar F-3 pide) + `data-starting-style`/`data-ending-style` condicionales (:97-106, hooks de motion) + flags disabled/readonly/required/invalid |
|
|
|
| 9 | A11y | gap menor | Trigger completo (haspopup dialog + expanded + label vía translationRef ✓ :76-85); Content con Escape/Tab trap (:109-113); **F-3**: sin cita APG (A-1.4) — la razón "Popover posee el diálogo" merece la cita del patrón compuesto como hace date-picker (apg ×2) |
|
|
|
| 12 | Estados | hallazgo máquina | R-1.3/R-1.4 readonly/invalid sin materializar |
|
|
|
| 14 | Docs+tests | **gap triple** | Sin README (ninguno de los dos niveles), sin tests |
|
|
|
| 15 | i18n | ✓ | texts + translationRef localizados (:24-27,:82) |
|
|
|
|
|
|
## Hallazgos y propuestas
|
|
|
|
|
|
| ID | Hallazgo | Propuesta |
|
|
|
|---|---|---|
|
|
|
| **F-1** | El footer transaccional no tiene semántica (deuda del Picker genérico, reconocida allí) | Resolver EN el Picker genérico (commit-set fulfill en Accept / commit-cancel neutral / commit-clear neutral) — ntp y los 5 pickers a migrar lo heredan gratis; NO declarar eventos propios aquí (rompería la delegación correcta) |
|
|
|
| **F-2** | 9 hex sin anotación (R-2.1) | Anotar cada uno `/* literal: physically-fixed sky/astro color */`; NO tokenizar |
|
|
|
| **F-3** | Sin cita APG (A-1.4) | Citar el patrón compuesto (dialog vía Popover) como date-picker; valorar además slider APG para la banda |
|
|
|
| **F-4** | readonly/invalid sin estilo | Patrón familia |
|
|
|
| **F-5** | Sin README ×2, sin tests | Paquete de estándares completo (SYS-9: iniciativa a medias) |
|
|
|
|
|
|
## Escalan al sistema
|
|
|
|
|
|
SYS-2 · SYS-4 · SYS-9 · **corrección del censo A-3.1**: ntp EXONERADO con matiz (delegación documentada; la deuda vive en picker :18-19) — pin-input queda como el único caso desnudo · la máquina debe leer scope-sin-sema + header de composición antes de flaguear A-3.1.
|
|
|
|
|
|
## Veredictos
|
|
|
|
|
|
*(pendiente — checkpoint post-barrido)*
|