co-rich-text-editor
Editor completo con toolbar inline o flotante, presets, soporte de imágenes, variables, menciones y más.
shadow: false — light DOM para que ProseMirror controle el DOM editable.
El sistema de Rich Text de Cobalt provee edición de texto enriquecido basada en Tiptap v3 / ProseMirror, empaquetada como Web Components reutilizables.
co-rich-text-editor
Editor completo con toolbar inline o flotante, presets, soporte de imágenes, variables, menciones y más.
shadow: false — light DOM para que ProseMirror controle el DOM editable.
co-rich-text-toolbar
Barra de herramientas que recibe el editor como propiedad. Normalmente renderizada internamente por el editor, pero puede usarse standalone.
shadow: true
co-rich-text-viewer
Visor de solo lectura. En modo html solo carga DOMPurify (~7 KB). En modo json importa lazy el serializador.
shadow: true
| Paquete | Rol |
|---|---|
@prolibu-suite/cobalt-rich-text | Motor aislado: createEditor, presets, serializadores, sanitizador, config de toolbar, extensiones |
@prolibu-suite/cobalt-core | Web Components co-rich-text-editor, co-rich-text-toolbar, co-rich-text-viewer |
@prolibu-suite/cobalt-vue | Wrappers Vue 3 (CoRichTextEditor, etc.) |
@prolibu-suite/cobalt-react | Wrappers React |
┌─────────────────────────────────────────────────────────────┐│ Tu app (suite-v2 / vanilla / React / Vue / iframe) │└────┬──────────────────┬──────────────────┬──────────────────┘ │ │ │┌────▼─────────────┐ ┌──▼──────────────┐ ┌─▼───────────────────┐│ cobalt-vue │ │ cobalt-react │ │ cobalt-core ││ (CoRichText- │ │ (CoRichText- │ │ (co-rich-text- ││ Editor, etc.) │ │ Editor, etc.) │ │ editor, etc.) │└────┬─────────────┘ └────┬────────────┘ └─────┬───────────────┘ │ │ │ └──────────┬─────────┘ │ │ lazy import │ ┌─────▼──────────────────────────────▼───┐ │ @prolibu-suite/cobalt-rich-text │ │ createEditor · presets · serializers │ │ sanitizer · toolbar-config · extensions │ └─────┬──────────────────────────────────┘ │ ┌─────▼──────────────────────────────────┐ │ Tiptap v3 / ProseMirror / DOMPurify │ └─────────────────────────────────────────┘value (JSON string) → parseValue() → contenido inicial → createEditor(...) monta ProseMirror.onUpdate → buildOutput(editor) → { json, html, text } (HTML sanitizado) → emite coInput.coChange + coBlur (valor confirmado).value → @Watch('value') compara con lastEmitted; si es diferente, llama setContent() con guard para evitar loop.<co-rich-text-editor preset="task" label="Descripción" placeholder="Escribe aquí…"></co-rich-text-editor>
<script> const editor = document.querySelector('co-rich-text-editor'); editor.addEventListener('coChange', (e) => { console.log(e.detail); // { json, html, text } });</script><template> <CoRichTextEditor preset="task" label="Descripción" placeholder="Escribe aquí…" @co-change="onSave" /></template>
<script setup>import { CoRichTextEditor } from '@prolibu-suite/cobalt-vue';
function onSave(e) { const { json, html, text } = e.detail;}</script>import { CoRichTextEditor } from '@prolibu-suite/cobalt-react';
function MyForm() { return ( <CoRichTextEditor preset="task" label="Descripción" placeholder="Escribe aquí…" onCoChange={(e) => console.log(e.detail)} /> );}{ "type": "String", "uiCom": "HtmlEditor", "label": "Notas", "placeholder": "Escribe aquí…", "preset": "task"}En el sistema de formularios, uiCom: 'HtmlEditor' resuelve a FieldRichText.vue → co-rich-text-editor. El valor se persiste como HTML (compatible con Quill).
<!-- Modo HTML (ligero, sin Tiptap) --><co-rich-text-viewer format="html" preset="document" value="<p>Contenido <strong>enriquecido</strong></p>"></co-rich-text-viewer>
<!-- Modo JSON (importa serializer lazy) --><co-rich-text-viewer format="json" preset="task" value='{"type":"doc","content":[...]}'></co-rich-text-viewer>