|
|
|
|
@ -9,6 +9,46 @@
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ESTADO 2026-07-21 — F-A multilenguaje ✅ (à la field-langs) + warnings resueltos
|
|
|
|
|
|
|
|
|
|
> Dos features nuevas pedidas por el usuario: **F-A** (multilenguaje del CONTENIDO à la
|
|
|
|
|
> field-langs) y **F-B** (soporte agentivo — un agente rellena el contenido). F-A HECHA en 3 chunks;
|
|
|
|
|
> F-B es lo siguiente (forma sin firmar: ¿qué emite el agente · one-shot vs streaming · dónde entra ·
|
|
|
|
|
> doc entero vs caret/rango?). Antes de esto: los dos **warnings** que reportó el usuario resueltos —
|
|
|
|
|
> `state_proxy_equality_mismatch` (mi fast-path comparaba proxy↔raw en `syncExternalState`; ahora
|
|
|
|
|
> cachea `publishedExternal`, proxy↔proxy; `81dca0f14`) y el ruido de langs (`ts` de engine desalineado
|
|
|
|
|
> con `t`/mono; gate del emit a `depth>0`, framework; `45543ab95`). FD.4 (firma perceptual) POSPUESTA a
|
|
|
|
|
> futuro por el usuario («complicado para un editor»).
|
|
|
|
|
|
|
|
|
|
### F-A — multilenguaje (todo en `alpha-0.1-sec-dom` → `gita`)
|
|
|
|
|
|
|
|
|
|
- **Chunk 1 · motor — `090b27391`**: contrato detrás de `languages` (retrocompatible). `value:
|
|
|
|
|
PalabrasDocument | Record<LangCode,PalabrasDocument>`; `languages: LangSpec[]` (1º=activo);
|
|
|
|
|
`requiredLangs` (⚠️ NO `required`, colisión con el field bool); `activeLang` bindable + `onLangChange`.
|
|
|
|
|
Provider: **historia POR IDIOMA** (`langHistories` Map; el activo es `this.history`, los inactivos en
|
|
|
|
|
el mapa; seed en construcción desde `$state.snapshot` del value map; switch nunca cruza pilas de undo).
|
|
|
|
|
`writeExternalValue` escribe el mapa ENTERO (raw) en multi. `syncExternalState` resuelve el doc activo
|
|
|
|
|
del value (doc|map). Api: `multilingual`/`activeLang`/`setActiveLang`/`languageSpecs`/`missingRequiredLangs`/
|
|
|
|
|
`langFilled`; requiredLangs→isInvalid. **58/58** provider (5 nuevos: modo, switch+writeback, historia
|
|
|
|
|
por idioma, validez, mono retrocompatible).
|
|
|
|
|
- **Chunk 2 · switcher — `fb90bd140`**: `palabras-lang-switcher.svelte` (segmentado ≤3 / Popover-select
|
|
|
|
|
>3, punto de completitud por idioma vía `langFilled`, teclado de radiogroup). Lee la `api`. `languageSpecs`
|
|
|
|
|
expuesto para honrar etiquetas de LangSpec; `LangCode`/`LangSpec`/`PalabrasLangValues` re-exportados.
|
|
|
|
|
- **Chunk 3 · ubicación+CSS+demo — `b2ca761e1`**: switcher por modo (spec del usuario): menubar→fin de
|
|
|
|
|
barra (antes de la papelera); flotante/drawer→migas tras «Documento». Prop `langSwitcher` en el
|
|
|
|
|
breadcrumb (lo suprime en menubar). **FIX UX**: `setActiveLang` limpia el bloque activo (el id viejo no
|
|
|
|
|
vive en el nuevo doc) → el breadcrumb se ocultaba y el switcher desaparecía tras el 1er cambio; ahora,
|
|
|
|
|
si es multilenguaje, el breadcrumb muestra siempre al menos «Documento» + switcher (crumbs sintéticos).
|
|
|
|
|
CSS sobrio (tokens del chrome, 0 hex). Demo = es/en. **Verificado Playwright**: flotante=1 switcher
|
|
|
|
|
(miga, persiste, es↔en cambia el contenido y lo preserva), menubar=1 (barra, sin duplicado), 0 errores.
|
|
|
|
|
|
|
|
|
|
### Próximo (F-B agentivo) — decisión de forma pendiente
|
|
|
|
|
Base existente: `api.importContent(content, format)` + `insertBlockOfType`. Sin firmar: (1) qué emite el
|
|
|
|
|
agente (JSON PalabrasDocument nativo · markdown · schema agent-friendly), (2) one-shot vs streaming (bloque
|
|
|
|
|
a bloque en vivo), (3) dónde entra (API del host · `/ai` en el slash · botón), (4) doc entero vs caret/rango.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ESTADO 2026-07-19 — UI de F4 CERRADA (listas · merge/split · count/TOC · resize)
|
|
|
|
|
|
|
|
|
|
> El usuario eligió «las tres en orden» de la **UI de F4** (el MOTOR ya estaba desde 2026-07-14).
|
|
|
|
|
|