MarkdownEditor
WYSIWYG-редактор на TipTap с тулбаром форматирования и preview-тоглом. Работает в controlled (value / onChange) и uncontrolled (defaultValue) режимах. Готовый результат показывайте через Markdown.
Когда использовать
- Поле ввода форматированного текста с тулбаром и предпросмотром: описания, комментарии, заметки.
- Редактирование markdown, который потом сохраняется и рендерится в публичной части.
Когда не нужен:
- Для простого многострочного текста без форматирования:
- нативный
textareaили поле ввода из@cloud-ru/ds-fields.
- нативный
- Для показа готового markdown без редактирования:
- компонент
Markdown.
- компонент
Анатомия
Редактор состоит из:
header— тоглPreviewслева и подпись (label) справа.toolbar— кнопки форматирования, сгруппированные по смыслу; лишние сворачиваются в меню «Ещё».content— редактируемая область с кнопкой очистки.
Preview (default false)
Переключает форму редактирования (обе редактируемы, тулбар работает в обеих):
false(по умолчанию) — редактирование «сырого» markdown-текста в textarea. Кнопки тулбара вставляют markdown-разметку (**жирный**,# заголовок,- список) в исходник.true— форматированный WYSIWYG-редактор; те же кнопки применяют форматирование к rich-узлам.
Управляется тоглом в шапке либо пропами preview / defaultPreview / onPreviewChange.
Toolbar (default — полный набор)
Какие кнопки показать:
toolbar={[...]}— массив значенийTOOLBAR_ITEM(показываются только перечисленные кнопки).toolbar={false}— без тулбара.- не указан — полный набор кнопок.
Header (default — виден)
Шапка с тоглом Preview и подписью:
label— подпись справа.false— без подписи.previewLabel— текст тогла Preview.hideHeader— скрыть шапку целиком.
Resizable (default true)
Может ли пользователь менять размеры поля перетаскиванием уголка.
Установка
pnpm add @cloud-ru/ds-markdown
import { MarkdownEditor, TOOLBAR_ITEM } from '@cloud-ru/ds-markdown'
Редактор использует порталы (тултипы, выпадающие меню) — оборачивайте его в PortalContextProvider из @cloud-ru/ds-portal-context.
Примеры использования
Редактор (uncontrolled)
Markdown field
tsx
import { MarkdownEditor } from '@cloud-ru/ds-markdown';
const INITIAL = `# Заметка
Печатайте текст и форматируйте его через тулбар. Поддерживается **markdown**.
`;
export function EditorUncontrolled() {
return <MarkdownEditor defaultValue={INITIAL} placeholder='Начните писать…' />;
}Редактор (controlled) + Preview
Описание
tsx
import { MarkdownEditor } from '@cloud-ru/ds-markdown';
import { useState } from 'react';
export function EditorControlled() {
const [value, setValue] = useState('# Controlled\n\nЗначение хранится во внешнем `useState`.');
const [preview, setPreview] = useState(false);
return (
<MarkdownEditor value={value} onChange={setValue} preview={preview} onPreviewChange={setPreview} label='Описание' />
);
}Свой набор кнопок тулбара
Комментарий
tsx
import { MarkdownEditor, TOOLBAR_ITEM } from '@cloud-ru/ds-markdown';
const INITIAL = `Оставьте в тулбаре только нужные кнопки через \`toolbar\`.
`;
export function EditorCustomToolbar() {
return (
<MarkdownEditor
defaultValue={INITIAL}
label='Комментарий'
toolbar={[TOOLBAR_ITEM.Bold, TOOLBAR_ITEM.Italic, TOOLBAR_ITEM.Link, TOOLBAR_ITEM.BulletList]}
/>
);
}Props
Types
Props
MarkdownEditorProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
className | string | — | no | CSS-класс корневого элемента. |
data-test-id | string | markdown-editor | no | |
defaultPreview | boolean | — | no | Uncontrolled |
defaultValue | string | — | no | Uncontrolled |
hideHeader | boolean | false | no | Скрыть шапку с тоглом Preview и подписью |
label | string | false | Markdown field | no | Подпись в шапке справа. По умолчанию — `Markdown field`. `false` — без подписи. |
onChange | ((markdown: string) => void) | — | no | Колбэк изменения markdown. Вызывается с дебаунсом `ON_CHANGE_DEBOUNCE_MS` после остановки ввода. |
onPreviewChange | ((preview: boolean) => void) | — | no | Колбэк переключения Preview-тогла в шапке |
placeholder | string | — | no | Placeholder пустого редактора. |
preview | boolean | — | no | Controlled preview-режим: показывает форматированный WYSIWYG с активным тулбаром. Выключен — редактирование «сырого» markdown-текста в textarea |
previewLabel | string | Preview | no | Текст т огла Preview в шапке. По умолчанию `Preview`. |
resizable | boolean | true | no | Может ли пользователь менять размеры поля перетаскиванием уголка. По умолчанию `true`. |
spellCheck | boolean | true | no | Нативная проверка орфографии (`spellcheck`). По умолчанию `true`. |
toolbar | false | ToolbarItemId[] | — | no | Какие кнопки тулбара показать. false — без тулбара |
value | string | — | no | Controlled markdown |