|
|
# editable — ficha de auditoría (RE-AUDITADA 2026-07-07, profundidad piloto)
|
|
|
|
|
|
- **Familia**: fields (texto in-place preview↔edit) · **Método**: solo análisis; evidencia por dimensión · demos fuera
|
|
|
- **Capas leídas**: [morfo](../../../src/uix/morfo/components/editable.ts) completo (1-110+) · [soma types](../../../src/uix/soma/components/editable/types.ts) completo · provider dirigido (autoResize :30,:374-377) · pack ✓
|
|
|
- **Máquina**: PASS limpio · tests ✓ (con 1 error de tipos en la línea base de `check` — `data-editing` indexado, a absorber en fixes) · README ×2 ✓
|
|
|
|
|
|
## Dimensiones (evidencia leída)
|
|
|
|
|
|
| # | Dimensión | Estado | Evidencia |
|
|
|
|---|---|---|---|
|
|
|
| 1 | Composición | ✓ | Area/Control/Preview/Input/EditTrigger(+Submit/Cancel) compositivos |
|
|
|
| 2 | Naming | **4 datos de censo** | **`defaultValue`** (types :16-21 — PRIMER uncontrolled-initial del catálogo, doc React-style "read once at mount") → ¿canon o redundante con `$bindable(inicial)`? · par `onValueChange` (cambia el comprometido) + `onValueCommit` (cada commit) :60-63 — distinción sutil que el resto no hace · **`onValueRevert: () => void`** crudo SIN payload (:64-65 — encaja la regla "crudo solo señal sin dato" ✓) · `editing/onEditingChange` par bindable ✓ |
|
|
|
| 3 | Coherencia semántica | ✓ | `shift-enter-mode` (shift, sin intent — cambio de contexto ✓) · `commit-save` affirm · `commit-cancel` **neutral** (commit exige intent por política de familia; neutral es correcto — verificado contra la doctrina) |
|
|
|
| 4 | API | ✓ rica | `activationMode: focus\|click\|dblclick\|none` + `submitMode: enter\|blur\|both\|none` (:32-49); `selectOnFocus`; hidden-input por `name` (:26-27) |
|
|
|
| 5 | Tokens | ✓ | Recipe canónico |
|
|
|
| 6 | Sema | ✓ | Pack ✓ (enter/save/cancel con carácter) |
|
|
|
| 7 | Animaciones | ✓ | Sin keyframes |
|
|
|
| 8 | Contrato morfo | ✓ | Preview `role='textbox'` en div (patrón Chakra/Ark del valor-como-textbox-readonly, :102-110); `data-editing/empty/placeholder-shown` flags; aria-required/invalid condicionales |
|
|
|
| 9 | A11y | ✓ | Activación por foco accesible por defecto; triggers con textos |
|
|
|
| 10 | Theming | ✓ | Focus o5 → censo SYS-5; state-hover preview ✓ tier neutro |
|
|
|
| 11 | Composición interna | verificar | Como tags-input: sin mención de OR-merge con Field en types → verificación dirigida (pass SYS-6) |
|
|
|
| 12 | Estados | ✓ con gap menor | editing/empty/disabled/readonly/invalid ✓; **F-1**: `maxLength` (:54-55) SIN señal de overflow (0 hits) — textarea tiene el contrato `signal-warn-count-overflow` untilFix para lo mismo |
|
|
|
| 13 | Runtime | ✓ **por diseño** | `autoResize` dimensiona por `ch` desde el valor + `min-width: 2ch` (provider :374-377) — **cero medición de DOM** (evita la clase de reflow de textarea F-1 por construcción); el contraste correcto: ch para una línea, medición-diferida para multilínea |
|
|
|
| 14 | Docs+tests | ✓ | README ×2, suite ✓ (+ el error de tipos baseline a absorber) |
|
|
|
| 15 | i18n | ✓ | texts morfo |
|
|
|
|
|
|
## Hallazgos y propuestas
|
|
|
|
|
|
| ID | Hallazgo | Propuesta |
|
|
|
|---|---|---|
|
|
|
| **F-1** | `maxLength` sin contrato de overflow (asimetría con textarea) | Adoptar `signal-warn-count-overflow` del hermano (untilFix + persistent-trace) o documentar por qué no aplica al in-place |
|
|
|
| **F-2** | `defaultValue` — patrón uncontrolled único en el catálogo | Veredicto _naming: ¿se canoniza (y entonces quién más lo necesita) o se poda (el `$bindable(inicial)` de Svelte 5 cubre el caso)? |
|
|
|
| **F-3** | Error de tipos preexistente en su suite (baseline check) | Fix trivial en fase de fixes |
|
|
|
| **F-4** | Participación Field sin documentar | Verificación dirigida (con tags-input) |
|
|
|
|
|
|
## Escalan al sistema
|
|
|
|
|
|
_naming (defaultValue · el par Change/Commit · Revert crudo ✓ como regla) · patrón "ch-sizing vs medición-diferida" como doctrina de autoResize (exportable).
|
|
|
|
|
|
## Veredictos
|
|
|
|
|
|
*(pendiente — checkpoint post-barrido)*
|