Saltar al contenido principal

Configuración

EditorConfig y RendererConfig son los puntos de entrada para toda personalización. Pase uno u otro a Editor.create() o Renderer.render() respectivamente. Solo containerId (y data para el renderer) son obligatorios; todas las demás opciones tienen valores predeterminados seguros.

EditorConfig

Pase EditorConfig como único argumento a Editor.create(). El containerId requerido debe coincidir con el id de un elemento DOM existente.

OpciónTipoRequeridoDescripción
containerIdstringSíID del elemento DOM que alojará el editor. Debe existir en el DOM antes de que se llame a Editor.create().
maxHeightnumberNoAltura máxima del editor en píxeles. Establezca en 0 (el valor predeterminado) para no tener límite de altura.
minHeightnumberNoAltura mínima del editor en píxeles. Por defecto es 300.
onChange(data: EditorData) => voidNoCallback que se activa cada vez que el documento cambia. Recibe la captura completa de EditorData.
onReady() => voidNoCallback que se activa una vez que el editor está completamente inicializado y listo para aceptar llamadas API.
placeholderstringNoTexto de marcador de posición que se muestra cuando el editor está vacío. Por defecto es 'Start writing...'.
initialDataEditorDataNoEditorData precargada para cargar cuando el editor se monta.
initialView'edit' | 'preview' | 'json'NoModo de vista inicial. Uno de: edit, preview, json. Por defecto es 'edit'.
allowJsonViewEditingbooleanNoCuando es true, la vista JSON es editable y los cambios se propagan de vuelta al documento. Por defecto es false.
hasViewSwitcherbooleanNoCuando es false, los botones de editar, vista previa y JSON se quitan de la barra de acciones. Por defecto es true.
hasDocumentActionsbooleanNoCuando es false, los botones de copiar, descargar y vaciar se quitan de la barra de acciones. Si hasViewSwitcher también es false, no se dibuja la barra de acciones. Por defecto es true.
onClearRequest() => Promise<boolean>NoSe llama al pulsar Vaciar. La página solo se vacía si se resuelve en true; un rechazo deja la página intacta. Si no se indica, Vaciar vacía al instante.
marginsBlockMarginsNoMargen superior e inferior global (en píxeles) aplicado a cada bloque. Las configuraciones por bloque tienen precedencia.
stylesEditorStylesNoObjeto EditorStyles para personalización CSS detallada del chrome del editor (barras de herramientas, diálogos, controles).
classNamesEditorClassNamesNoObjeto EditorClassNames para adjuntar nombres de clases CSS a elementos del chrome del editor.
imageUploaderUploadFunctionNoFunción asíncrona que sube un archivo de imagen y devuelve una cadena de URL pública.
audioUploaderUploadFunctionNoFunción asíncrona que sube un archivo de audio y devuelve una cadena de URL pública.
videoUploaderUploadFunctionNoFunción asíncrona que sube un archivo de vídeo y devuelve una cadena de URL pública.
fileUploaderUploadFunctionNoFunción de subida que lleva los adjuntos del bloque de archivo a tu almacenamiento.
localestringNoLa única locale que edita el editor. Los bloques multilingües se aplanan a esta locale.
defaultLocalestringNoLocale de respaldo cuando un bloque no tiene contenido para la locale solicitada.
onLocaleFallback(info: { blockId: string; locale: string }) => voidNoSe llama cuando un bloque cae a otra locale, para que el host muestre un indicador.
onInlineRewrite(selection: string, action: InlineRewriteAction) => Promise<string | null>NoFunción que reescribe el texto seleccionado con IA; si se define, la barra muestra el botón de reescritura.
inlineRewriteLabelsPartial<Record<InlineRewriteAction, string>>NoAnula las etiquetas de las acciones del menú de reescritura, para localización.
inlineRewriteTooltipstringNoAnula la descripción emergente de la varita de reescritura en la barra de herramientas en línea, para localización.
blockToolLabelsPartial<Record<BlockToolType, string>>NoAnula las etiquetas de las herramientas de bloque en la caja y el menú slash, para localización.
blockToolbarLabelsPartial<Record<BlockToolbarLabel, string>>NoAnula los textos de la barra de bloque (añadir, mover, eliminar y demás) y las indicaciones que se muestran en los campos de bloque vacíos, para localización.
controlLabelsPartial<Record<ControlLabel, string>>NoAnula los nombres de los botones de la barra de acciones (editar, vista previa, JSON, copiar, descargar, vaciar), que se usan como nombres accesibles y descripciones emergentes, para localización.
dialogLabelsPartial<Record<DialogLabel, string>>NoLas palabras de los diálogos de enlace, información emergente y estado, por nombre: títulos, etiquetas de campo, textos de ejemplo, estilos de estado, Cancelar y Aplicar. En inglés si no se indican.
resolveLink(url: string) => Promise<Partial<EmbedData>>NoRellena la instantánea de un embed pegado desde tu servidor: título, archivo de Drive, archivos del gist o el motivo por el que no es posible la vista en directo. Una búsqueda que falla dibuja la tarjeta como si la herramienta no hubiera respondido, con Reintentar al lado.
onEmbedAction(action: EmbedAction, blockId: string) => voidNoLa solución junto al motivo de una tarjeta que solo el anfitrión puede realizar: connectGoogle envía al miembro a conectar su cuenta de Google; retry lo gestiona el propio editor.
disabledEmbedProvidersreadonly string[]NoLas herramientas de embed desactivadas por el espacio de trabajo, por clave (figma, miro, loom, google_drive, github_gist); sus enlaces se dibujan como tarjetas que dicen por qué.
pasteEmbeds'live' | 'offer' | 'card'NoQué hace pegar un enlace compatible: mostrarlo en directo (por defecto), ofrecerlo o mostrar una tarjeta.
embedLabelsPartial<Record<EmbedLabel, string>>NoPalabras traducidas para las líneas de motivo, acciones y etiquetas de gist del bloque embed, indexadas por EmbedLabel; inglés por defecto en otro caso.
resolveIssues(urls: string[]) => Promise<Record<string, IssueSnapshot>>NoResponde a los enlaces de incidencias de una página con sus instantáneas, indexadas por URL. Si falta, fichas y tarjetas conservan lo que el documento guardó y nada se actualiza.
onIssueAction(action: IssueAction, tool: string) => voidNoLa corrección junto a un motivo de incidencia que solo el anfitrión puede realizar: conectar la herramienta, lo que lleva a la página de Integraciones del anfitrión.
issueCards'off' | 'on'NoSi un enlace de incidencia pegado en su propia línea se convierte en tarjeta; off si falta. Una ficha en una frase siempre es una ficha.
issueChip{ assignee: boolean; status: boolean }NoLos dos interruptores de ficha del miembro: la píldora de estado y el responsable. Ambos activos si falta.
issueLabelsPartial<Record<IssueLabel, string>>NoPalabras traducidas para la ficha de incidencia, la tarjeta y la tabla de incidencias enlazadas, indexadas por IssueLabel; inglés por defecto en otro caso.
jiraSitesreadonly string[]NoLas URL de los sitios Jira que alcanzan las conexiones del espacio de trabajo, para que un enlace en el dominio propio de un sitio se reconozca como incidencia.
allowedBlockToolsreadonly BlockToolType[]NoLos tipos de bloque que el editor ofrece en el menú de bloques, su búsqueda, el menú de conversión y al pegar. Todos los bloques registrados si se omite; un bloque guardado fuera de la lista sigue mostrándose.
allowedInlineToolsreadonly InlineToolType[]NoLas marcas que ofrece la barra de herramientas en línea. Todas las marcas registradas si se omite.
theme'auto' | 'light' | 'dark'NoEsquema de colores. Uno de: auto (sigue el sistema), light, dark. Por defecto es auto.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }NoSustituciones de tokens por modo. Proporcione mapas de tokens light y/o dark para personalizar colores sin reemplazar el tema completo.
TypeScript
import { Editor } from '@clepit/core';

const editor = Editor.create({
  containerId: 'editor',
  minHeight: 400,
  placeholder: 'Start writing...',
  theme: 'auto',
  onChange: data => console.log(data),
  onReady: () => console.log('Editor ready'),
  imageUploader: async file => {
    const form = new FormData();
    form.append('file', file);
    const res = await fetch('/api/upload', { body: form, method: 'POST' });
    const { url } = await res.json();
    return url;
  },
});

RendererConfig

Pase RendererConfig como único argumento a Renderer.render(). Tanto containerId como data son obligatorios.

OpciónTipoRequeridoDescripción
containerIdstringSíID del elemento DOM donde se inyectará el resultado renderizado.
dataEditorDataSíEl documento EditorData a renderizar. Obligatorio.
marginsBlockMarginsNoMargen superior e inferior global (en píxeles) aplicado a cada bloque renderizado.
stylesBlockStylesNoMapa BlockStyles para personalización CSS por tipo de bloque del output renderizado.
classNamesBlockClassNamesNoMapa BlockClassNames para nombres de clases CSS por tipo de bloque en el output renderizado.
editorClassNamesEditorClassNamesNoEditorClassNames pasados a bloques que renderizan componentes interactivos (p.ej. classNames de tooltip para párrafos).
configsPartial<BlockTypeOutputConfigs>NoMapa parcial de objetos OutputConfig por bloque. Cada entrada puede establecer márgenes a nivel de bloque y nombres de clases de tooltip.
theme'auto' | 'light' | 'dark'NoEsquema de colores. Uno de: auto, light, dark.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }NoSustituciones de tokens por modo para el output renderizado.
TypeScript
import { Renderer } from '@clepit/core';
import type { EditorData } from '@clepit/core';

const data: EditorData = await fetch('/api/content/123').then(r => r.json());

Renderer.render({
  containerId: 'output',
  data,
  theme: 'auto',
  margins: { bottom: 16, top: 16 },
});

Estilo a nivel de bloque

Tanto EditorConfig como RendererConfig aceptan styles, classNames y configs indexados por tipo de bloque. Úselos para sustituciones específicas; consulte la página de Themes para la referencia completa por token.

TypeScript
import { Editor, Renderer } from '@clepit/core';
import type { BlockStyles, BlockClassNames, EditorStyles } from '@clepit/core';

const editorStyles: EditorStyles = {
  blockToolbar: { container: { borderRadius: '8px' } },
};

const blockStyles: BlockStyles = {
  header: { h1: { fontFamily: 'Georgia, serif' } },
  paragraph: { lineHeight: '1.75' },
  table: { cell: { padding: '8px 12px' } },
};

const blockClassNames: BlockClassNames = {
  paragraph: 'prose-paragraph',
  header: { h1: 'prose-h1', h2: 'prose-h2' },
  alert: { info: 'alert-info', error: 'alert-error' },
};

Editor.create({
  containerId: 'editor',
  styles: editorStyles,
});

Renderer.render({
  containerId: 'output',
  data,
  styles: blockStyles,
  classNames: blockClassNames,
});