11 KiB
Words
Words es el componente rich-text/editor del ecosistema ActiveUIX.
Este directorio no sustituye a las capas UIX. Existe como carpeta de coordinacion porque el componente es mas complejo que un control normal: necesita un motor de documento, seleccion, comandos, history, serializacion, plugins y una superficie visual compuesta.
La implementacion publica debe seguir viviendo en las capas canonicas:
| Capa | Ruta prevista | Ownership |
|---|---|---|
| Morfo | src/uix/morfo/components/words.ts |
Contrato DOM, partes, estados, data attrs, ARIA, keyboard y eventos declarados. |
| Soma | src/uix/soma/components/words/ |
Motor headless, documento, seleccion, comandos, history, clipboard, normalizacion y plugins. |
| Sema | src/uix/sema/components/words.ts |
Proyeccion perceptiva de eventos semanticos de alto nivel. |
| Eidos | src/uix/eidos/components/words/ |
Wrapper visual compound, recipe CSS y partes visuales. |
| Demo | web/routes/uix/components/words/+page.svelte |
Demo auditada con Live, API, Morfo, Sema, Recipe y A11y. |
Decision de arquitectura
No se unifica fisicamente el componente en una sola carpeta runtime. La separacion Morfo/Soma/Sema/Eidos es parte del contrato de ActiveUIX y permite auditar que el motor no se mezcle con la piel visual.
Si una carpeta unica fuera necesaria para investigacion, debe limitarse a docs
o referencias como esta carpeta src/uix/words. El codigo ejecutable debe
entrar por las capas.
Regla de dependencias
Words no puede depender en runtime de Tiptap, ProseMirror, Lexical,
svelte-lexical, Slate ni paquetes equivalentes.
Las librerias externas se usan solo como referencia funcional y de arquitectura. El motor debe ser propio y apoyarse en capacidades nativas del navegador:
contenteditable- Selection API
- Input Events /
beforeinput - Clipboard API a traves de ActiveUIX cuando proceda
- Drag and drop nativo cuando entre en alcance
Referencia local copiada
El snapshot de referencia esta en:
tmp/lexical/packages/svelte-lexical
No contiene el motor completo de Meta Lexical; contiene la integracion Svelte,
plugins, nodos decoradores, toolbar y demos. El motor real aparece como
dependencia lexical@0.40.0 y multiples @lexical/*.
El dossier filtrado esta en:
src/uix/words/references/svelte-lexical-dossier.md
Alcance recomendado
Estado 2026-05-24: alcance V1 firmado, motor puro Soma, Provider
contenteditable, wrappers Eidos, receta visual, pack Sema y demo UIX de 6
tabs implementados.
V1
- Documento JSON canonico.
- Bloques: paragraph, heading, quote.
- Inline marks: bold, italic, underline, strike, code.
- Listas: unordered, ordered, checklist.
- Checklist interactiva con marcador visual, click para marcar/desmarcar y
Ctrl/Cmd+Entersobre el item actual. - Links con sanitizacion.
- Toolbar principal.
- Undo/redo.
- Clear formatting.
- Readonly y disabled.
- Placeholder.
- Logger ActiveUIX para errores de configuracion, parsing, comandos invalidos, nodos desconocidos y HTML inseguro.
V1.1
- Import/export HTML y Markdown como operaciones controladas, no como estado canonico.
- Bubble toolbar y link popover.
- Toolbar Eidos por familias/submenus para comandos de texto, bloque, listas, alineacion, insercion, tablas, enlaces y herramientas.
- Sincronizacion controlada de
valueexterno sin remount. - Find/replace con match case, whole word, regex validada, find-in-selection, preserve case, replace-current y replace-all.
- Slash commands con
Words.SlashMenu:/queryabre un menu anclado al caret con comandos de bloque/lista, navegacion por teclado y commit atomico del rango slash + comando. - Code block canonico con HTML
<pre><code>, fences Markdown y comandocode-block. El bloque preservalanguagenormalizado en JSON/HTML/Markdown y Soma exponecurrentCodeLanguage/setCodeLanguage()para composiciones externas. Eidos incluyeWords.CodeLanguagePickercomo selector visual de lenguaje, y el render runtime aplica syntax highlighting ligero condata-words-code-tokensin contaminar el HTML exportado. Enter crea saltos internos yCtrl/Cmd+Entersale a un parrafo posterior.Tab/Shift+Tabgestionan indentacion basica de linea. - Tablas canonicas: bloque
tablecontable-rowytable-cell, insercion por comandoinsert-table/slashtable, comandos de fila/columna, navegacion por celdas conTab/Shift+Tab, render DOM nativo, busqueda por paths de celda, formato inline dentro de celdas, header row/column, alineacion horizontal/vertical de celda, tonos de celda, striped rows, compact table y HTML con formato preservado. Markdown sigue usando pipe-table conservadora. - Atajos Markdown al escribir: el Provider intercepta el espacio tras marcadores
iniciales para convertir
#,##,###,>, listas, checklist y fences de code block en nodos canonicos sin pasar por toolbar. Tambien convierte marcadores inline al final del texto (**bold**,*italic*,_italic_,~~strike~~,`code`y[label](url)) en marcas o links reales, y autolinkea URLs desnudas con protocolo permitido al escribir el espacio siguiente. Pegar una unica URL segura inserta un link, o aplica esa URL al texto seleccionado. - Enter en
quotecontinua la cita cuando hay contenido y sale a un parrafo normal cuando la cita esta vacia.
V2
- Imagenes y archivos via servicios ActiveApp/ActiveUIX.
- Registro externo/async de comandos slash.
- Tablas avanzadas: resizing y seleccion multi-celda.
- Drag handle.
- Comentarios o anotaciones.
- Colaboracion, solo como pack posterior y no en core.
Pre-flight de componente
Antes de implementar:
- Leer
web/routes/uix/lib/COMPONENT_AUDIT_GUIDE.md. - Leer
web/routes/uix/lib/DEMO_AUTHORING_GUIDE.md. - Leer
src/uix/eidos/components/README.md. - Comparar con
morfo-runtime/Air si existiera un equivalente. - Comparar contra referencias externas relevantes.
- Presentar alcance cerrado al usuario antes de escribir codigo runtime.
Audit inicial de referencias
Esta tabla es una base de decision, no cierre de implementacion.
| Referencia | Que aporta | Riesgo para ActiveUIX | Decision |
|---|---|---|---|
svelte-lexical |
Composer, ContentEditable, plugins, toolbar, nodos decoradores y demos Svelte. | Depende de Lexical y mezcla UI/motor en plugins concretos. | Usar como mapa, no como dependencia. |
| Lexical | Comandos, editor state, nodos, selection, history, decorators. | Runtime externo amplio; APIs internas no pertenecen a ActiveUIX. | Recrear ideas, no importar. |
| Edra/Tiptap | Cobertura UX rica y feature benchmark. | Tiptap/ProseMirror viola la regla de 0 dependencias runtime. | Benchmark visual/funcional solamente. |
| ProseMirror | Modelo transaccional y schema de documento. | Demasiado pesado y dependiente; no encaja como core. | Referencia conceptual para schema/history. |
| Slate | Modelo JSON y transforms. | Arquitectura React-first y runtime externo. | Referencia conceptual para operaciones. |
| WAI-ARIA/APG + HTML editing APIs | Roles, textbox multiline, keyboard, input/selection nativos. | El navegador tiene comportamiento desigual entre motores. | Fuente obligatoria para A11y y edge cases. |
Resultado a adjuntar
El resultado de analisis externo debe pegarse o guardarse como un fichero nuevo
en src/uix/words/references/.
Si el resultado es de ChatGPT, usar esta convencion:
src/uix/words/references/chatgpt-analysis-YYYY-MM-DD.md
Ese fichero debe contener:
- resumen ejecutivo;
- riesgos detectados;
- propuesta de motor;
- correcciones frente a
svelte-lexical; - decisiones para Morfo, Soma, Sema y Eidos;
- alcance V1/V2.
Auditorias externas incorporadas
| Fichero | Resultado |
|---|---|
references/analisis-kimi-1.md |
Bloqueo de Provider/Eidos hasta corregir paths profundos, rangos multi-nodo, listas e history. |
references/analisis-glm51-1.md |
Coincide con Kimi y concreta Morfo/Soma/Sema/Eidos, manteniendo el avance visual bloqueado. |
references/words-find-replace-regex-audit-2026-05-26.md |
Mini matriz para regex en find/replace; decide regex validada, preserve case, estado invalido y reemplazos con capturas. |
references/words-slash-command-audit-2026-05-27.md |
Mini matriz para slash commands; decide trigger /query, listbox, commit atomico y comandos de bloque/lista V1.1. |
references/words-table-audit-2026-05-27.md |
Mini matriz para tablas; decide nodo canonico, celdas inline, comandos de estructura, navegacion por Tab y HTML/Markdown simple. |
src/uix/soma/components/words/engine/engine.test.ts |
Barrera de motor puro: 19 tests de listas, rangos, Selection API, paste, IME y undo. |
src/uix/soma/components/words/words-provider.svelte.test.ts |
Barrera Soma Provider: attrs, contenteditable, selection/input, commands, tablas, hidden input y logger. |
src/uix/eidos/components/words/ |
Wrapper compound, receta CSS y README de auditoria Eidos. |
src/uix/sema/components/words.ts |
Pack Sema para foco, commit, formato, history, clear e input invalido. |
web/routes/uix/components/words/+page.svelte |
Demo UIX de 6 tabs con stage permanente, snippets y reproduccion Sema. |