Перейти к основному содержанию

Настройка

EditorConfig и RendererConfig: точки входа для любой настройки. Передайте один из них в Editor.create() или Renderer.render() соответственно. Обязательны только containerId (и data для рендерера); все остальные параметры имеют безопасные значения по умолчанию.

EditorConfig

Передайте EditorConfig как единственный аргумент в Editor.create(). Обязательный containerId должен совпадать с id существующего элемента DOM.

ПараметрТипОбязательноОписание
containerIdstringДаID DOM-элемента, в котором будет размещён редактор. Должен существовать в DOM до вызова Editor.create().
maxHeightnumberНетМаксимальная высота редактора в пикселях. Установите 0 (по умолчанию) для снятия ограничения высоты.
minHeightnumberНетМинимальная высота редактора в пикселях. По умолчанию 300.
onChange(data: EditorData) => voidНетОбратный вызов, срабатывающий при каждом изменении документа. Получает полный снимок EditorData.
onReady() => voidНетОбратный вызов, срабатывающий после полной инициализации редактора и готовности принимать вызовы API.
placeholderstringНетЗамещающий текст, отображаемый когда редактор пуст. По умолчанию 'Start writing...'.
initialDataEditorDataНетПредварительно заполненный EditorData для загрузки при монтировании редактора.
initialView'edit' | 'preview' | 'json'НетНачальный режим просмотра. Одно из: edit, preview, json. По умолчанию 'edit'.
allowJsonViewEditingbooleanНетЕсли true, представление JSON доступно для редактирования, а изменения распространяются обратно в документ. По умолчанию false.
hasViewSwitcherbooleanНетЕсли false, кнопки редактирования, предпросмотра и JSON убираются с панели действий. По умолчанию true.
hasDocumentActionsbooleanНетЕсли false, кнопки копирования, скачивания и очистки убираются с панели действий. Если hasViewSwitcher тоже false, панель действий не отображается. По умолчанию true.
onClearRequest() => Promise<boolean>НетВызывается при нажатии «Очистить». Страница очищается, только если результат равен true; отказ оставляет страницу как есть. Если не задан, очистка происходит сразу.
marginsBlockMarginsНетГлобальные верхний и нижний отступы (в пикселях), применяемые к каждому блоку. Конфигурации на уровне блока имеют приоритет.
stylesEditorStylesНетОбъект EditorStyles для тонкой CSS-настройки интерфейса редактора (панели инструментов, диалоги, элементы управления).
classNamesEditorClassNamesНетОбъект EditorClassNames для прикрепления имён CSS-классов к элементам интерфейса редактора.
imageUploaderUploadFunctionНетАсинхронная функция, загружающая файл изображения и возвращающая строку с публичным URL.
audioUploaderUploadFunctionНетАсинхронная функция, загружающая аудиофайл и возвращающая строку с публичным URL.
videoUploaderUploadFunctionНетАсинхронная функция, загружающая видеофайл и возвращающая строку с публичным URL.
fileUploaderUploadFunctionНетФункция загрузки, переносящая вложения файлового блока в ваше хранилище.
localestringНетЕдинственная локаль, которую редактирует редактор. Многоязычные блоки сводятся к этой локали.
defaultLocalestringНетЗапасная локаль, если у блока нет содержимого для запрошенной локали.
onLocaleFallback(info: { blockId: string; locale: string }) => voidНетВызывается, когда блок откатывается к другой локали, чтобы хост показал индикатор.
onInlineRewrite(selection: string, action: InlineRewriteAction) => Promise<string | null>НетФункция, переписывающая выделенный текст с помощью ИИ; если задана, панель показывает кнопку переписывания.
inlineRewriteLabelsPartial<Record<InlineRewriteAction, string>>НетПереопределяет подписи действий меню переписывания, для локализации.
inlineRewriteTooltipstringНетПереопределяет подсказку волшебной палочки переписывания на встроенной панели инструментов, для локализации.
blockToolLabelsPartial<Record<BlockToolType, string>>НетПереопределяет подписи блочных инструментов в панели и слэш-меню, для локализации.
blockToolbarLabelsPartial<Record<BlockToolbarLabel, string>>НетПереопределяет тексты панели блока (добавить, переместить, удалить и прочие) и подсказки в пустых полях блоков, для локализации.
controlLabelsPartial<Record<ControlLabel, string>>НетПереопределяет названия кнопок панели действий (редактировать, предпросмотр, JSON, копировать, скачать, очистить), которые служат их доступными именами и подсказками, для локализации.
dialogLabelsPartial<Record<DialogLabel, string>>НетСлова диалогов ссылки, подсказки и статуса по именам: заголовки, подписи полей, подсказки в полях, стили статуса, «Отмена» и «Применить». Если не заданы, на английском.
resolveLink(url: string) => Promise<Partial<EmbedData>>НетЗаполняет снимок вставленного встраивания с вашего сервера: заголовок, файл Drive, файлы gist или причина, по которой живой просмотр невозможен. Запрос, завершившийся ошибкой, рисует карточку как «инструмент не ответил» с кнопкой Повторить рядом.
onEmbedAction(action: EmbedAction, blockId: string) => voidНетДействие рядом с причиной на карточке, которое может выполнить только хост: connectGoogle отправляет участника подключить аккаунт Google; retry редактор обрабатывает сам.
disabledEmbedProvidersreadonly string[]НетОтключённые рабочим пространством инструменты встраивания по ключу (figma, miro, loom, google_drive, github_gist); их ссылки рисуются карточками с указанием причины.
pasteEmbeds'live' | 'offer' | 'card'НетЧто делает вставка поддерживаемой ссылки: показать вживую (по умолчанию), предложить это или показать карточку.
embedLabelsPartial<Record<EmbedLabel, string>>НетПереведённые слова для строк причин, действий и подписей gist блока встраивания, по ключу EmbedLabel; иначе английский.
resolveIssues(urls: string[]) => Promise<Record<string, IssueSnapshot>>НетОтвечает на ссылки задач страницы их снимками по ключу URL. Если не задано, чипы и карточки хранят то, что сохранил документ, и ничего не обновляется.
onIssueAction(action: IssueAction, tool: string) => voidНетИсправление рядом с причиной задачи, которое может выполнить только хост: подключить инструмент, что ведёт на страницу интеграций хоста.
issueCards'off' | 'on'НетСтановится ли ссылка задачи, вставленная на отдельной строке, карточкой; off, если не задано. Чип во фразе всегда остаётся чипом.
issueChip{ assignee: boolean; status: boolean }НетДва переключателя чипа участника: индикатор статуса и исполнитель. Оба включены, если не задано.
issueLabelsPartial<Record<IssueLabel, string>>НетПереведённые слова для чипа задачи, карточки и таблицы связанных задач, по ключу IssueLabel; иначе английский.
jiraSitesreadonly string[]НетURL сайтов Jira, доступных подключениям рабочего пространства, чтобы ссылка на собственном домене сайта распознавалась как задача.
allowedBlockToolsreadonly BlockToolType[]НетТипы блоков, которые редактор предлагает в меню блоков, его поиске, меню преобразования и при вставке. Без указания все зарегистрированные блоки; сохранённый блок вне списка по-прежнему отображается.
allowedInlineToolsreadonly InlineToolType[]НетПометки, которые предлагает встроенная панель инструментов. Без указания все зарегистрированные пометки.
theme'auto' | 'light' | 'dark'НетЦветовая схема. Одно из: auto (следует системе), light, dark. По умолчанию auto.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }НетПереопределения токенов по режиму. Предоставьте карты токенов light и/или dark для настройки цветов без замены всей темы.
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

Передайте RendererConfig как единственный аргумент в Renderer.render(). Требуются оба: containerId и data.

ПараметрТипОбязательноОписание
containerIdstringДаID DOM-элемента, в который будет инжектирован отрендеренный вывод.
dataEditorDataДаДокумент EditorData для рендеринга. Обязателен.
marginsBlockMarginsНетГлобальные верхний и нижний отступы (в пикселях), применяемые к каждому отрендеренному блоку.
stylesBlockStylesНетКарта BlockStyles для CSS-настройки по типам блоков в отрендеренном выводе.
classNamesBlockClassNamesНетКарта BlockClassNames для имён CSS-классов по типам блоков в отрендеренном выводе.
editorClassNamesEditorClassNamesНетEditorClassNames, передаваемые блокам, отрисовывающим интерактивные компоненты (например, classNames подсказок для абзацев).
configsPartial<BlockTypeOutputConfigs>НетЧастичная карта объектов OutputConfig для каждого блока. Каждая запись может задавать отступы на уровне блока и имена классов подсказок.
theme'auto' | 'light' | 'dark'НетЦветовая схема. Одно из: auto, light, dark.
themeOverrides{ light?: ThemeTokens; dark?: ThemeTokens }НетПереопределения токенов по режиму для отрендеренного вывода.
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 },
});

Стилизация на уровне блока

И EditorConfig, и RendererConfig принимают styles, classNames и configs с ключом по типу блока. Используйте их для целевых переопределений; полную справку по токенам смотрите на странице Themes.

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,
});