hexagon-editor 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/README.md +381 -52
  2. package/dist/MarkdownEditor.vue.d.ts +28 -4
  3. package/dist/MarkdownEditor.vue.d.ts.map +1 -1
  4. package/dist/{MarkdownEditorLinkForm-B9dEX3WT.js → MarkdownEditorLinkForm-nx1gDLpK.js} +17 -6
  5. package/dist/background-color-DJ1tENTK.js +80 -0
  6. package/dist/{base-BPdMUtQo.js → base-BOV5nzwj.js} +1005 -728
  7. package/dist/classname.d.ts.map +1 -1
  8. package/dist/{index-D_CMntQU.js → color-DYgeN76h.js} +530 -459
  9. package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts +9 -1
  10. package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts.map +1 -1
  11. package/dist/components/MarkdownEditorImageActions.vue.d.ts.map +1 -1
  12. package/dist/components/MarkdownEditorToolbar.vue.d.ts +8 -2
  13. package/dist/components/MarkdownEditorToolbar.vue.d.ts.map +1 -1
  14. package/dist/components/MarkdownEditorToolbarIcon.vue.d.ts.map +1 -1
  15. package/dist/composables/useFloatingPanel.d.ts.map +1 -1
  16. package/dist/composables/useMarkdownEditorValue.d.ts.map +1 -1
  17. package/dist/configure.d.ts.map +1 -1
  18. package/dist/core/actions.d.ts.map +1 -1
  19. package/dist/core/basic-editor-atomic-source.d.ts.map +1 -1
  20. package/dist/core/basic-editor-command-helpers.d.ts +4 -1
  21. package/dist/core/basic-editor-command-helpers.d.ts.map +1 -1
  22. package/dist/core/basic-editor-markdown.d.ts.map +1 -1
  23. package/dist/core/basic-editor-renderers.d.ts.map +1 -1
  24. package/dist/core/basic-editor-runtime-plugins.d.ts.map +1 -1
  25. package/dist/core/basic-editor-selection.d.ts.map +1 -1
  26. package/dist/core/basic-editor-table-controls.d.ts.map +1 -1
  27. package/dist/core/basic-editor-types.d.ts +4 -1
  28. package/dist/core/basic-editor-types.d.ts.map +1 -1
  29. package/dist/core/basic-editor.d.ts.map +1 -1
  30. package/dist/core/content-handler.d.ts.map +1 -1
  31. package/dist/core/editor-instance.d.ts.map +1 -1
  32. package/dist/core/events.d.ts.map +1 -1
  33. package/dist/core/extension-builder.d.ts +1 -1
  34. package/dist/core/extension-builder.d.ts.map +1 -1
  35. package/dist/core/extensions-manager.d.ts.map +1 -1
  36. package/dist/core/lists.d.ts.map +1 -1
  37. package/dist/core/logger.d.ts.map +1 -1
  38. package/dist/core/markdown-parser.d.ts.map +1 -1
  39. package/dist/core/markdown.d.ts.map +1 -1
  40. package/dist/core/markup-commands.d.ts.map +1 -1
  41. package/dist/core/markup-editor.d.ts.map +1 -1
  42. package/dist/core/registries.d.ts.map +1 -1
  43. package/dist/core/schema-dynamic-modifier.d.ts.map +1 -1
  44. package/dist/core/vue-renderer.d.ts.map +1 -1
  45. package/dist/core.js +2 -2
  46. package/dist/directives.d.ts.map +1 -1
  47. package/dist/extensions/additional/folding-heading.d.ts.map +1 -1
  48. package/dist/extensions/additional/math.d.ts.map +1 -1
  49. package/dist/extensions/additional/mermaid.d.ts.map +1 -1
  50. package/dist/extensions/additional/quote-link.d.ts.map +1 -1
  51. package/dist/extensions/additional/yfm-html-block.d.ts.map +1 -1
  52. package/dist/extensions/base.d.ts.map +1 -1
  53. package/dist/extensions/behavior/clicks-on-edges.d.ts.map +1 -1
  54. package/dist/extensions/behavior/clipboard.d.ts.map +1 -1
  55. package/dist/extensions/behavior/cursor.d.ts.map +1 -1
  56. package/dist/extensions/behavior/editor-mode-keymap.d.ts.map +1 -1
  57. package/dist/extensions/behavior/history.d.ts.map +1 -1
  58. package/dist/extensions/behavior/placeholder.d.ts.map +1 -1
  59. package/dist/extensions/behavior/resizable.d.ts.map +1 -1
  60. package/dist/extensions/behavior/selection-commands.d.ts.map +1 -1
  61. package/dist/extensions/behavior/selection-context.d.ts.map +1 -1
  62. package/dist/extensions/behavior/selection.d.ts.map +1 -1
  63. package/dist/extensions/index.d.ts +1 -0
  64. package/dist/extensions/index.d.ts.map +1 -1
  65. package/dist/extensions/markdown/background-color.d.ts +16 -0
  66. package/dist/extensions/markdown/background-color.d.ts.map +1 -0
  67. package/dist/extensions/markdown/blockquote-specs.d.ts.map +1 -1
  68. package/dist/extensions/markdown/blockquote.d.ts.map +1 -1
  69. package/dist/extensions/markdown/bold-specs.d.ts.map +1 -1
  70. package/dist/extensions/markdown/bold.d.ts.map +1 -1
  71. package/dist/extensions/markdown/breaks-specs.d.ts.map +1 -1
  72. package/dist/extensions/markdown/breaks.d.ts +1 -1
  73. package/dist/extensions/markdown/breaks.d.ts.map +1 -1
  74. package/dist/extensions/markdown/code-block-specs.d.ts.map +1 -1
  75. package/dist/extensions/markdown/code-block.d.ts +1 -1
  76. package/dist/extensions/markdown/code-block.d.ts.map +1 -1
  77. package/dist/extensions/markdown/code-specs.d.ts.map +1 -1
  78. package/dist/extensions/markdown/code.d.ts.map +1 -1
  79. package/dist/extensions/markdown/color.d.ts +16 -0
  80. package/dist/extensions/markdown/color.d.ts.map +1 -0
  81. package/dist/extensions/markdown/deflist-specs.d.ts.map +1 -1
  82. package/dist/extensions/markdown/deflist.d.ts +1 -1
  83. package/dist/extensions/markdown/deflist.d.ts.map +1 -1
  84. package/dist/extensions/markdown/heading-specs.d.ts.map +1 -1
  85. package/dist/extensions/markdown/heading.d.ts +1 -1
  86. package/dist/extensions/markdown/heading.d.ts.map +1 -1
  87. package/dist/extensions/markdown/horizontal-rule-specs.d.ts.map +1 -1
  88. package/dist/extensions/markdown/horizontal-rule.d.ts.map +1 -1
  89. package/dist/extensions/markdown/html.d.ts.map +1 -1
  90. package/dist/extensions/markdown/image.d.ts +1 -1
  91. package/dist/extensions/markdown/image.d.ts.map +1 -1
  92. package/dist/extensions/markdown/italic-specs.d.ts.map +1 -1
  93. package/dist/extensions/markdown/italic.d.ts +1 -1
  94. package/dist/extensions/markdown/italic.d.ts.map +1 -1
  95. package/dist/extensions/markdown/link-specs.d.ts.map +1 -1
  96. package/dist/extensions/markdown/link.d.ts +1 -1
  97. package/dist/extensions/markdown/link.d.ts.map +1 -1
  98. package/dist/extensions/markdown/list-specs.d.ts.map +1 -1
  99. package/dist/extensions/markdown/lists.d.ts.map +1 -1
  100. package/dist/extensions/markdown/mark.d.ts.map +1 -1
  101. package/dist/extensions/markdown/strike.d.ts.map +1 -1
  102. package/dist/extensions/markdown/subscript.d.ts.map +1 -1
  103. package/dist/extensions/markdown/table-actions.d.ts.map +1 -1
  104. package/dist/extensions/markdown/table-specs.d.ts.map +1 -1
  105. package/dist/extensions/markdown/table.d.ts +2 -2
  106. package/dist/extensions/markdown/table.d.ts.map +1 -1
  107. package/dist/extensions/markdown/underline.d.ts.map +1 -1
  108. package/dist/extensions.js +121 -111
  109. package/dist/forms/MarkdownEditorForm.vue.d.ts.map +1 -1
  110. package/dist/forms/MarkdownEditorImageForm.vue.d.ts.map +1 -1
  111. package/dist/forms/MarkdownEditorLinkForm.vue.d.ts.map +1 -1
  112. package/dist/forms/MarkdownEditorTextInput.vue.d.ts.map +1 -1
  113. package/dist/forms/index.d.ts.map +1 -1
  114. package/dist/forms.js +1 -1
  115. package/dist/{full-Da8esvj2.js → full-s-sYdwp2.js} +1 -1
  116. package/dist/{full-specs-hXKoMF-0.js → full-specs-Cm3QffD5.js} +1 -1
  117. package/dist/{heading-specs-D7Bj4aIM.js → heading-specs-Dnjn5FYs.js} +136 -51
  118. package/dist/i18n/index.d.ts +17 -0
  119. package/dist/i18n/index.d.ts.map +1 -1
  120. package/dist/i18n.js +39 -5
  121. package/dist/index.css +1 -1
  122. package/dist/index.d.ts +8 -8
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +960 -802
  125. package/dist/{markup-commands-BYsx8ADT.js → markup-commands-DW5NFQUO.js} +4082 -4411
  126. package/dist/presets/commonmark-specs.d.ts.map +1 -1
  127. package/dist/presets/commonmark.d.ts.map +1 -1
  128. package/dist/presets/default.d.ts.map +1 -1
  129. package/dist/presets/full-specs.d.ts.map +1 -1
  130. package/dist/presets/full.d.ts.map +1 -1
  131. package/dist/presets/index.d.ts.map +1 -1
  132. package/dist/presets/zero.d.ts.map +1 -1
  133. package/dist/presets.js +2 -2
  134. package/dist/public-types.d.ts.map +1 -1
  135. package/dist/renderer/MarkdownRenderer.vue.d.ts.map +1 -1
  136. package/dist/renderer/index.d.ts.map +1 -1
  137. package/dist/renderer/markdown.d.ts.map +1 -1
  138. package/dist/renderer.css +1 -1
  139. package/dist/renderer.js +672 -568
  140. package/dist/specs.js +53 -14
  141. package/dist/toolbar/config.d.ts +2 -2
  142. package/dist/toolbar/config.d.ts.map +1 -1
  143. package/dist/toolbar/index.d.ts.map +1 -1
  144. package/dist/toolbar.js +21 -22
  145. package/dist/use-markdown-editor.d.ts.map +1 -1
  146. package/dist/version.d.ts +1 -1
  147. package/dist/version.d.ts.map +1 -1
  148. package/package.json +1 -2
  149. package/dist/core/basic-editor-table-popover.d.ts +0 -5
  150. package/dist/core/basic-editor-table-popover.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,123 +1,452 @@
1
1
  # hexagon-editor
2
2
 
3
- Vue 3 editor for Markdown and YFM with visual, markup and split modes.
3
+ `hexagon-editor` — Vue 3-редактор Markdown и YFM. Он умеет работать в визуальном (`wysiwyg`), исходном (`markup`) и разделённом (`split`) режимах, а также поставляет лёгкий SSR-совместимый рендерер для страниц, где редактирование не требуется.
4
4
 
5
- ## Install
5
+ ## Установка
6
6
 
7
7
  ```bash
8
8
  pnpm add hexagon-editor
9
9
  ```
10
10
 
11
- Component styles are included automatically when importing the editor or renderer. The
12
- `hexagon-editor/style.css` export is available only for integrations that need to load
13
- the complete stylesheet explicitly.
11
+ Единственная peer dependency — Vue `^3.5.0`. Подключите stylesheet явно: библиотечные JS entry point'ы не импортируют CSS как side effect.
14
12
 
15
13
  ```ts
14
+ // nuxt.config.ts
16
15
  export default defineNuxtConfig({
17
- css: ['hexagon-editor/renderer.css'],
16
+ css: ['hexagon-editor/style.css'], // редактор и рендерер
18
17
  });
18
+ ```
19
+
20
+ Для страницы только с предпросмотром достаточно меньшего набора стилей:
19
21
 
22
+ ```ts
20
23
  export default defineNuxtConfig({
21
- css: ['hexagon-editor/style.css'],
24
+ css: ['hexagon-editor/renderer.css'],
22
25
  });
23
26
  ```
24
27
 
25
- ## Read-only rendering
28
+ ### Обычный Vue 3 / Vite
29
+
30
+ В обычном Vue-приложении импортируйте stylesheet один раз в точке входа. Все примеры пакета используют TypeScript, поэтому файл называется `main.ts`:
31
+
32
+ ```ts
33
+ // src/main.ts
34
+ import {createApp} from 'vue';
35
+ import App from './App.vue';
36
+ import 'hexagon-editor/style.css';
37
+
38
+ createApp(App).mount('#app');
39
+ ```
40
+
41
+ Если приложение использует только `MarkdownRenderer`, вместо полного stylesheet подключите более компактный:
42
+
43
+ ```ts
44
+ // src/main.ts
45
+ import {createApp} from 'vue';
46
+ import App from './App.vue';
47
+ import 'hexagon-editor/renderer.css';
48
+
49
+ createApp(App).mount('#app');
50
+ ```
51
+
52
+ Импортируйте stylesheet один раз на стороне приложения. Это особенно важно для SSR и для сборщиков, которые не добавляют CSS-asset библиотеки автоматически.
26
53
 
27
- Sites that only display documents can import the standalone renderer without bundling the editor, ProseMirror, CodeMirror, toolbar, or editor styles:
54
+ ## Быстрый старт
28
55
 
29
56
  ```vue
30
57
  <script setup lang="ts">
31
- import { MarkdownRenderer } from 'hexagon-editor/renderer';
58
+ import {ref} from 'vue';
59
+ import {MarkdownEditor} from 'hexagon-editor';
32
60
 
33
- defineProps<{ content: string }>();
61
+ const markdown = ref('# Документ\n\nНачните писать…');
62
+ const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
34
63
  </script>
35
64
 
36
65
  <template>
37
- <MarkdownRenderer :content="content" />
66
+ <MarkdownEditor
67
+ v-model="markdown"
68
+ v-model:mode="mode"
69
+ locale="ru"
70
+ theme="auto"
71
+ />
38
72
  </template>
39
73
  ```
40
74
 
41
- `MarkdownRenderer` supports server rendering. Mermaid source is emitted as a stable fallback during SSR and is replaced with an SVG after hydration. The Mermaid runtime is loaded lazily only when a document contains a diagram.
75
+ `v-model` всегда содержит Markdown-исходник, независимо от текущего режима. Режимы: `wysiwyg` — визуальный редактор, `markup` — редактор исходного Markdown, `split` — оба представления одновременно.
42
76
 
43
- Math and Mermaid engines are optional and are not included in the base installation. Install only what the application uses:
77
+ ## Возможности Markdown и YFM
44
78
 
45
- ```bash
46
- pnpm add katex
47
- pnpm add mermaid
79
+ Редактор поддерживает следующие конструкции; preset `full` добавляет кнопки для всех доступных действий панели.
80
+
81
+ | Категория | Возможности |
82
+ | --- | --- |
83
+ | CommonMark | заголовки, абзацы, цитаты, горизонтальные правила, ссылки, изображения, inline/fenced code, вложенные маркированные и нумерованные списки, переносы |
84
+ | Форматирование | **жирный**, *курсив*, `inline code`, зачёркивание, подчёркивание, выделение (`==text==`), нижний индекс, семь именованных цветов |
85
+ | Структура | таблицы с выравниванием, definition lists, атрибуты заголовков, сворачиваемые заголовки `##+` |
86
+ | YFM и расширения | quote links, блоки raw HTML, YFM HTML `:::html`, пользовательские директивы `::: name`, LaTeX, Mermaid |
87
+
88
+ Пример документа, покрывающий расширенные возможности:
89
+
90
+ ````markdown
91
+ # Справка {#guide .page-title}
92
+
93
+ ##+ Сворачиваемый раздел
94
+
95
+ **Жирный**, *курсив*, ~~зачёркнутый~~, __подчёркнутый__, ==выделенный==, H~2~O и {blue}(синий текст).
96
+
97
+ > Цитата
98
+
99
+ > [Источник цитаты](https://example.com/source){data-quotelink=true}
100
+
101
+ Текст quote link.
102
+
103
+ [Ссылка](https://example.com "Подсказка") и ![Логотип](https://example.com/logo.svg)
104
+
105
+ Термин
106
+ : Определение
107
+
108
+ | Слева | По центру | Справа |
109
+ | :--- | :---: | ---: |
110
+ | 1 | 2 | 3 |
111
+
112
+ Формула: $E = mc^2$
113
+
114
+ $$
115
+ \sum_{i=1}^{n} i = \frac{n(n + 1)}{2}
116
+ $$
117
+
118
+ ```mermaid
119
+ graph LR
120
+ Markdown --> Editor
121
+ ```
122
+
123
+ :::html
124
+ <section>Доверенный YFM HTML</section>
125
+ :::
126
+ ````
127
+
128
+ Формулы и Mermaid сохраняются и редактируются без дополнительных пакетов. Для их визуального рендеринга передайте адаптеры из раздела «Опциональные движки». Некорректная Mermaid-диаграмма остаётся видимой как исходный текст.
129
+
130
+ ### Цвет текста
131
+
132
+ Кнопка `color` в preset `full` открывает палитру: `gray`, `yellow`, `orange`, `red`, `green`, `blue` и `violet`. Выделите текст и выберите цвет; без выделения цвет применяется к последующему вводу. Значение сохраняется в переносимом Markdown-формате, а не в HTML:
133
+
134
+ ```markdown
135
+ {red}(Важное сообщение) и {blue}(текст с **другим** форматированием).
136
+ ```
137
+
138
+ Имена чувствительны к регистру. Неизвестное имя, например `{pink}(текст)`, остаётся обычным Markdown-текстом. И редактор, и `MarkdownRenderer` используют CSS-переменные `--markdown-editor-color-gray`, `--markdown-editor-color-yellow`, `--markdown-editor-color-orange`, `--markdown-editor-color-red`, `--markdown-editor-color-green`, `--markdown-editor-color-blue` и `--markdown-editor-color-violet`, поэтому палитру можно переопределить в контейнере компонента.
139
+
140
+ ## `MarkdownEditor`: props, события и слоты
141
+
142
+ ```vue
143
+ <script setup lang="ts">
144
+ import {ref} from 'vue';
145
+ import {MarkdownEditor} from 'hexagon-editor';
146
+
147
+ const value = ref('');
148
+ const mode = ref<'wysiwyg' | 'markup' | 'split'>('split');
149
+
150
+ function save(markdown: string) {
151
+ console.log(markdown);
152
+ }
153
+ </script>
154
+
155
+ <template>
156
+ <MarkdownEditor
157
+ v-model="value"
158
+ v-model:mode="mode"
159
+ locale="en"
160
+ theme="dark"
161
+ placeholder="Write a document"
162
+ toolbar-preset="full"
163
+ @change="save"
164
+ @mode-change="console.log('mode:', $event)"
165
+ />
166
+ </template>
167
+ ```
168
+
169
+ | Prop | Тип / значение по умолчанию | Назначение |
170
+ | --- | --- | --- |
171
+ | `modelValue` | `string`, `''` | Markdown-значение для `v-model` |
172
+ | `mode` | `wysiwyg \| markup \| split`, `wysiwyg` | Режим, поддерживает `v-model:mode` |
173
+ | `locale` | `ru \| en`, `ru` | Язык интерфейса |
174
+ | `theme` | `auto \| light \| dark`, `auto` | Тема интерфейса |
175
+ | `placeholder` | `string`, `''` | Текст пустого визуального редактора |
176
+ | `readonly` | `boolean`, `false` | Режим чтения: панель инструментов скрыта |
177
+ | `toolbarPreset` | см. ниже, `default` | Встроенная конфигурация панели |
178
+ | `toolbarConfig` | `MarkdownEditorToolbarConfig` | Полностью заменяет выбранный preset |
179
+ | `features` | `MarkdownFeatures` | Адаптеры математики, Mermaid и trusted HTML |
180
+ | `directiveComponents` | `Record<string, Component>` | Vue-компоненты для блоковых директив |
181
+ | `uploadImage` | `(file: File) => Promise<string>` | Обработчик загрузки в форме изображения |
182
+
183
+ `modelValue`, `mode`, `locale`, `toolbarPreset`, `toolbarConfig`, `theme` и `uploadImage` обновляются без перемонтирования компонента. Изменение `mode`, `readonly` или `features` пересоздаёт editor hosts, поэтому текущие selection и история undo/redo сбрасываются. `placeholder` и `directiveComponents` применяются при следующем монтировании; чтобы обновить их у уже созданного редактора, измените его `:key`.
184
+
185
+ События: `update:modelValue`, `change` (новый Markdown), `update:mode` и `mode-change` (новый режим), а также `submit` и `cancel` без параметров. Последние возникают в визуальном редакторе по `Mod+Enter` и `Escape`; в режиме `markup` на них полагаться не следует. Компонент также принимает:
186
+
187
+ - слот `header` — содержимое над toolbar;
188
+ - слот `toolbar` — дополнительное содержимое после встроенных групп toolbar; он их не заменяет. В slot props передаются `{commands, execute}`.
189
+
190
+ В режиме `readonly` исходник не меняется; `MarkdownRenderer` обычно лучше подходит для публичного отображения документов.
191
+
192
+ ### Методы через template ref
193
+
194
+ ```vue
195
+ <script setup lang="ts">
196
+ import {ref} from 'vue';
197
+ import {MarkdownEditor} from 'hexagon-editor';
198
+ import type {MarkdownEditorExposed} from 'hexagon-editor';
199
+
200
+ const editor = ref<MarkdownEditorExposed>();
201
+
202
+ async function insertTemplate() {
203
+ editor.value?.append('## Новый раздел');
204
+ await editor.value?.setMode('markup');
205
+ editor.value?.moveCursor('end');
206
+ editor.value?.focus();
207
+ }
208
+ </script>
209
+
210
+ <template>
211
+ <button @click="insertTemplate">Добавить раздел</button>
212
+ <MarkdownEditor ref="editor" v-model="value" />
213
+ </template>
48
214
  ```
49
215
 
50
- Pass local adapters through `features`; Mermaid can be loaded lazily, and KaTeX styles must be imported by the application:
216
+ Доступны `focus()`, `hasFocus()`, `getValue()`, `setValue()` и синоним `replace()`, `clear()`, `prepend()`, `append()`, `insert()`, `isEmpty()`, `getMode()`, `setMode()` и `moveCursor('start' | 'end' | {line})`. В `split` позиция `{line}` применяется к исходному редактору.
217
+
218
+ ## Панель инструментов
219
+
220
+ Presets: `zero`, `commonmark`, `default`, `full` и совместимый `minimal`.
221
+
222
+ | Preset | Содержимое |
223
+ | --- | --- |
224
+ | `zero` | undo / redo |
225
+ | `commonmark` | история, жирный, курсив, заголовки, списки, ссылка, цитата, code, code block, горизонтальное правило |
226
+ | `default` | `commonmark` + зачёркивание |
227
+ | `minimal` | история, базовое форматирование, списки, цитата, сворачиваемые заголовки, ссылка |
228
+ | `full` | все кнопки пакета, включая underline, mark, image, formula, Mermaid, YFM HTML и таблицы |
229
+
230
+ Все идентификаторы кнопок: `undo`, `redo`, `heading`, `bold`, `italic`, `underline`, `strike`, `mark`, `code`, `bullet-list`, `ordered-list`, `quote`, `fold-heading`, `code-block`, `code-language`, `link`, `color`, `image`, `formula`, `mermaid`, `html`, `horizontal-rule`, `table`.
231
+
232
+ Соберите панель с нужным порядком и контекстными условиями:
233
+
234
+ ```ts
235
+ import {
236
+ createToolbarConfig,
237
+ createToolbarGroup,
238
+ createToolbarItem,
239
+ } from 'hexagon-editor';
240
+ import type {MarkdownEditorToolbarConfig} from 'hexagon-editor';
241
+
242
+ export const toolbar: MarkdownEditorToolbarConfig = createToolbarConfig([
243
+ createToolbarGroup('history', ['undo', 'redo']),
244
+ createToolbarGroup('text', ['heading', 'bold', 'italic', 'code']),
245
+ createToolbarGroup('insert', [
246
+ 'link',
247
+ createToolbarItem('table', {
248
+ isAvailable: (state) => !state.codeBlock,
249
+ }),
250
+ ]),
251
+ ]);
252
+ ```
253
+
254
+ ```vue
255
+ <MarkdownEditor v-model="value" :toolbar-config="toolbar" />
256
+ ```
257
+
258
+ Для продвинутых интеграций объект из `createToolbarItem` принимает `action`: `run({commands, execute, state})`, а также `isActive(state)` и `isEnabled(state)`. Готовые конфигурации `zeroToolbarConfig`, `commonmarkToolbarConfig`, `defaultToolbarConfig`, `fullToolbarConfig` и `minimalToolbarConfig`, как и фабрики, экспортируются из корня и `hexagon-editor/toolbar`.
259
+
260
+ ## Загрузка и настройка изображений
261
+
262
+ Редактор не диктует транспорт загрузки: верните URL загруженного файла из `uploadImage`. Форма принимает изображения (`image/*`), показывает ошибку при неудаче и принимает HTTP(S) либо `data:image/` URL.
263
+
264
+ ```vue
265
+ <script setup lang="ts">
266
+ import {MarkdownEditor} from 'hexagon-editor';
267
+
268
+ async function uploadImage(file: File): Promise<string> {
269
+ const body = new FormData();
270
+ body.append('image', file);
271
+ const response = await fetch('/api/images', {method: 'POST', body});
272
+ if (!response.ok) throw new Error('Image upload failed');
273
+
274
+ const result: unknown = await response.json();
275
+ if (typeof result !== 'object' || result === null || !('url' in result) || typeof result.url !== 'string') {
276
+ throw new Error('The API must return {url: string}');
277
+ }
278
+ return result.url;
279
+ }
280
+ </script>
281
+
282
+ <template>
283
+ <MarkdownEditor v-model="value" :upload-image="uploadImage" toolbar-preset="full" />
284
+ </template>
285
+ ```
286
+
287
+ Встроенная форма позволяет указать URL, alt-текст, title, имя и размеры. `MarkdownEditorImageForm`, `MarkdownEditorLinkForm`, `MarkdownEditorForm` и `MarkdownEditorTextInput` экспортируются также для самостоятельного использования. Типы payload: `MarkdownEditorImageSubmitParams` и `MarkdownEditorLinkSubmitParams`.
288
+
289
+ ## Рендерер для read-only и SSR
290
+
291
+ ```vue
292
+ <script setup lang="ts">
293
+ import {MarkdownRenderer} from 'hexagon-editor/renderer';
294
+
295
+ defineProps<{content: string}>();
296
+ </script>
297
+
298
+ <template>
299
+ <MarkdownRenderer :content="content" />
300
+ </template>
301
+ ```
302
+
303
+ Этот entry point не тянет редактор, ProseMirror, CodeMirror и toolbar. Он SSR-совместим: Mermaid при SSR выводится как стабильный исходный fallback, а после hydration заменяется SVG. Базовую типографику можно переопределить через `.markdown-renderer`, её семантические потомки и CSS-переменные `--markdown-renderer-link`, `--markdown-renderer-code-background`, а также `--markdown-editor-color-*` для именованных цветов текста.
304
+
305
+ Raw Markdown HTML отображается как исходный текст. HTML внутри директивы с пробелом после маркера — `::: html` — рендерится как HTML, а `:::html` является YFM-блоком. Передавайте в HTML только доверенный контент: пакет не санитизирует его.
306
+
307
+ `MarkdownRenderer` также принимает `directiveComponents`; зарегистрированные компоненты монтируются в блоки `::: name`, получают `readonly: true`, а их `updateContent()` намеренно ничего не делает.
308
+
309
+ ## Опциональные движки: KaTeX, Mermaid и HTML
310
+
311
+ KaTeX и Mermaid не входят в зависимости пакета. Установите только необходимое:
312
+
313
+ ```bash
314
+ pnpm add katex mermaid
315
+ ```
51
316
 
52
317
  ```ts
53
318
  import katex from 'katex';
54
319
  import 'katex/dist/katex.min.css';
55
- import type { MarkdownFeatures } from 'hexagon-editor';
320
+ import type {MarkdownFeatures} from 'hexagon-editor';
321
+
322
+ export const editorFeatures: MarkdownFeatures = {
323
+ math: {
324
+ renderToString: (latex, display) => katex.renderToString(latex, {
325
+ displayMode: display,
326
+ throwOnError: true,
327
+ }),
328
+ },
329
+ mermaid: {
330
+ load: () => import('mermaid').then(({default: mermaid}) => mermaid),
331
+ },
332
+ // source приходит из :::html ... ::: — возвращайте только безопасный DOM.
333
+ html: (source) => {
334
+ const element = document.createElement('div');
335
+ element.textContent = source;
336
+ return element;
337
+ },
338
+ };
56
339
 
57
- const features: MarkdownFeatures = {
58
- math: {
59
- renderToString: (latex, display) => katex.renderToString(latex, { displayMode: display, throwOnError: true }),
60
- },
61
- mermaid: { load: () => import('mermaid').then(({ default: mermaid }) => mermaid) },
340
+ export const rendererFeatures: MarkdownFeatures = {
341
+ math: editorFeatures.math,
342
+ mermaid: editorFeatures.mermaid,
62
343
  };
63
344
  ```
64
345
 
65
- Without a corresponding feature, formulas and Mermaid remain safe editable Markdown fallbacks. `features.html` accepts a local trusted HTML renderer for editor HTML blocks.
346
+ Передайте адаптер `html` только редактору. Рендереру нужны только адаптеры math/Mermaid:
66
347
 
67
- The renderer includes basic typography for headings, links, and inline code. Override its `.markdown-renderer` root, semantic descendants, or the `--markdown-renderer-link` and `--markdown-renderer-code-background` custom properties to match the consuming site. KaTeX output requires host-provided styles if the site wants the standard KaTeX appearance.
348
+ ```vue
349
+ <MarkdownEditor v-model="value" :features="editorFeatures" toolbar-preset="full" />
350
+ <MarkdownRenderer :content="value" :features="rendererFeatures" />
351
+ ```
352
+
353
+ Mermaid загружается лениво, только когда в документе есть диаграмма. В браузерном приложении `features.html` вызывается для YFM HTML-блоков визуального редактора. `MarkdownRenderer` не использует этот адаптер и всегда выводит `:::html` как экранированный исходник; trusted HTML из `::: html` он вставляет напрямую.
68
354
 
69
- Raw Markdown HTML and the contents of `:::html ... :::` are displayed as source text. Only the spaced `::: html ... :::` directive is rendered as HTML. Pass trusted content to that directive; the renderer does not sanitize it.
355
+ ## Пользовательские директивы
70
356
 
71
- ## Component API
357
+ Отобразите блок `::: note` собственным Vue-компонентом. В визуальном редакторе `updateContent` записывает изменённый Markdown; в рендерере он намеренно является no-op и `readonly` равен `true`.
72
358
 
73
359
  ```vue
360
+ <!-- NoteDirective.vue -->
74
361
  <script setup lang="ts">
75
- import { ref } from 'vue';
76
- import { MarkdownEditor } from 'hexagon-editor';
362
+ import type {MarkdownDirectiveComponentProps} from 'hexagon-editor';
77
363
 
78
- const value = ref('# Document');
79
- const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
364
+ const props = defineProps<MarkdownDirectiveComponentProps>();
80
365
  </script>
81
366
 
82
367
  <template>
83
- <MarkdownEditor v-model="value" v-model:mode="mode" locale="ru" theme="auto" />
368
+ <aside class="note">
369
+ <textarea
370
+ v-if="!props.readonly"
371
+ :value="props.content"
372
+ @input="props.updateContent(($event.target as HTMLTextAreaElement).value)"
373
+ />
374
+ <template v-else>{{ props.content }}</template>
375
+ </aside>
84
376
  </template>
85
377
  ```
86
378
 
87
- Props: `modelValue`, `mode`, `locale` (`ru` or `en`), `theme` (`light`, `dark`, or `auto`), `placeholder`, `readonly`, `toolbarPreset`, and `toolbarConfig`. Built-in toolbar presets are `zero`, `commonmark`, `default`, `full`, and the compatibility preset `minimal`. `toolbarConfig` overrides the preset with ordered toolbar groups and supports action bindings plus contextual `isAvailable`, `isActive`, and `isEnabled` predicates. The exported preset configs and `createToolbarItem`/`createToolbarGroup`/`createToolbarConfig` factories can be reused to build integrations.
379
+ ```vue
380
+ <script setup lang="ts">
381
+ import {MarkdownEditor} from 'hexagon-editor';
382
+ import NoteDirective from './NoteDirective.vue';
383
+
384
+ const directiveComponents = {note: NoteDirective};
385
+ </script>
88
386
 
89
- Events: `update:modelValue`, `change`, `update:mode`, and `mode-change`.
387
+ <template>
388
+ <MarkdownEditor v-model="value" :directive-components="directiveComponents" />
389
+ </template>
390
+ ```
90
391
 
91
- `MarkdownEditorLinkForm` and `MarkdownEditorImageForm` are exported for hosts that need to reuse the editor forms outside the built-in toolbar. They share the exported `MarkdownEditorForm` and `MarkdownEditorTextInput` primitives, support `en`/`ru`, validation, disabled/readonly states, and typed submit payloads. The image payload includes optional width and height. File uploads are deliberately not part of the package API.
392
+ ```markdown
393
+ ::: note
394
+ Текст заметки
395
+ :::
396
+ ```
92
397
 
93
- The component ref exposes `focus()`, `hasFocus()`, `getValue()`, `setValue()`/`replace()`, `clear()`, `prepend()`, `append()`, `insert()`, `isEmpty()`, `moveCursor()`, `getMode()`, and `setMode()`.
398
+ ## Composable и headless API
94
399
 
95
- ## Composable and headless API
400
+ `useMarkdownEditor()` создаёт framework-neutral экземпляр и автоматически уничтожает его при размонтировании Vue-компонента. Это API управляет состоянием и событиями; монтирование визуальных поверхностей выполняется компонентом `MarkdownEditor` или низкоуровневыми функциями из `/core`.
96
401
 
97
- `useMarkdownEditor(options)` returns reactive `value` and `mode`, the `MarkdownEditor` instance, and `destroy()`.
402
+ ```ts
403
+ import {useMarkdownEditor} from 'hexagon-editor';
404
+
405
+ const {editor, value, mode, readonly, toolbarVisible, destroy} = useMarkdownEditor({
406
+ initialValue: '# Черновик',
407
+ mode: 'markup',
408
+ preset: 'full',
409
+ onChange: (markdown) => saveDraft(markdown),
410
+ beforeEditorModeChange: ({mode}) => mode !== 'split' || canUseSplitMode(),
411
+ });
98
412
 
99
- The instance supports the same common value/cursor methods, `currentMode`, `setEditorMode()`/`changeEditorMode()`, readonly and toolbar visibility state, typed `on()`/`off()` events, and `destroy()`. The composable mirrors value, mode, readonly, and toolbar visibility as readonly Vue refs.
413
+ editor.append('Новый абзац');
414
+ editor.setReadonly(true);
415
+ editor.changeToolbarVisibility({visible: false});
416
+ editor.on('modeChange', (nextMode) => console.log(nextMode));
417
+ // destroy() требуется только вне Vue lifecycle или для раннего освобождения.
418
+ ```
100
419
 
101
- Headless integrations can compose the exported `ZeroPreset`, `CommonMarkPreset`, `DefaultPreset`, and scoped `FullPreset`. Matching `CommonMarkSpecsPreset` and `FullSpecsPreset` entry points are provided for compatibility with upstream's split preset API; the Vue port keeps schema, parser, serializer, and runtime registrations in the same extension modules.
420
+ Экземпляр предоставляет методы значения и курсора из component ref, `setReadonly()`, `changeToolbarVisibility()`, `action(name)`, `on()`/`off()` и `destroy()`. События: `change`, `modeChange`, `changeEditorMode`, `changeReadonly`, `changeToolbarVisibility`, `destroy`. Реактивные `value`, `mode`, `readonly` и `toolbarVisible` composable доступны только для чтения.
102
421
 
103
- ## Stable entry points
422
+ ## Расширения, presets и низкоуровневый API
104
423
 
105
- The root entry exports the complete supported public API. Focused integrations may use the documented subpaths: `./core`, `./extensions`, `./specs`, `./presets`, `./renderer`, `./toolbar`, `./forms`, `./configure`, and `./classname`. Other internal source paths are not part of the compatibility contract.
424
+ Используйте public subpaths, когда строите свой ProseMirror-based редактор:
106
425
 
107
- `configure({lang})` sets process-wide defaults. `cn(block)` provides the `hx-md-` BEM classname convention without a React dependency.
426
+ ```ts
427
+ import {ExtensionsManager} from 'hexagon-editor/core';
428
+ import {DefaultPreset} from 'hexagon-editor/presets';
429
+ import {Math, Mermaid} from 'hexagon-editor/extensions';
108
430
 
109
- ## Supported Markdown
431
+ const extensions = new ExtensionsManager((builder) => {
432
+ builder.use(DefaultPreset, {}).use(Math).use(Mermaid);
433
+ }).build();
434
+ ```
110
435
 
111
- The editor supports CommonMark blocks and marks, tables, definition lists, heading attributes and folding headings (`##+`), quote links, raw HTML, directives, Math/LaTeX (`$…$` and `$$…$$`), Mermaid fences, and YFM HTML blocks (`:::html`).
436
+ `ZeroPreset` содержит базовую схему, input rules и keymap; `CommonMarkPreset` добавляет CommonMark-узлы и marks; `DefaultPreset` — таблицы и зачёркивание; `FullPreset` — YFM/расширения, историю, placeholder, clipboard, cursor, selection и responsive behavior. Совместимые `CommonMarkSpecsPreset` и `FullSpecsPreset` также экспортируются.
112
437
 
113
- KaTeX and Mermaid render only when their local `features` adapters are supplied.
438
+ Корневой entry point экспортирует полный публичный API. Стабильные subpaths: `hexagon-editor/core`, `/extensions`, `/specs`, `/presets`, `/renderer`, `/toolbar`, `/forms`, `/configure`, `/classname`, `/i18n`. Внутренние пути `src/**` не входят в контракт совместимости.
114
439
 
115
- Invalid Mermaid source remains visible as an editable fallback. YFM HTML source remains visible unless the host supplies a renderer.
440
+ `configure({lang: 'en'})` устанавливает process-wide конфигурацию; `getConfig()` читает её, а `subscribeConfigure()` подписывает на изменения. Текущий `MarkdownEditor` не подписывается на неё автоматически: передавайте `locale` каждому экземпляру. `cn('editor')` из `/classname` создаёт BEM-имена с префиксом `hx-md-`.
116
441
 
117
- ## Accessibility and responsive behavior
442
+ ## Доступность и адаптивность
118
443
 
119
- The mode selector is a keyboard-accessible tablist: use `ArrowLeft`, `ArrowRight`, `Home`, and `End`. Toolbar controls have accessible labels. On narrow viewports, the toolbar scrolls horizontally and split mode becomes vertical.
444
+ У toolbar-кнопок и меню переключения режима есть доступные подписи и ARIA-роли. На узком экране toolbar прокручивается горизонтально, а split-режим становится вертикальным. Переключатель режимов реализован как меню, а не как tablist; специальные сочетания `ArrowLeft`, `ArrowRight`, `Home` и `End` для него не поддерживаются.
120
445
 
121
- ## Playground
446
+ ## Локальный playground
447
+
448
+ ```bash
449
+ pnpm dev
450
+ ```
122
451
 
123
- Run `pnpm dev` and open the displayed local URL. The playground includes a complete extension sample, visual/markup/split controls, and live locale/theme switches.
452
+ Playground содержит демонстрацию полного toolbar, Markdown/YFM, live-переключатели языка и темы, KaTeX/Mermaid и пример загрузки изображений.
@@ -46,6 +46,8 @@ declare function __VLS_template(): {
46
46
  refs: {
47
47
  floatingMenus: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
48
48
  codeVisible: boolean;
49
+ backgroundColorVisible: boolean;
50
+ colorVisible: boolean;
49
51
  formulaVisible: boolean;
50
52
  headingVisible: boolean;
51
53
  listVisible: boolean;
@@ -57,6 +59,8 @@ declare function __VLS_template(): {
57
59
  translate: (key: MarkdownEditorMessageKey) => string;
58
60
  }> & Readonly<{
59
61
  "onCode-block"?: (() => any) | undefined;
62
+ "onSelect-background-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
63
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
60
64
  "onInline-code"?: (() => any) | undefined;
61
65
  "onInline-formula"?: (() => any) | undefined;
62
66
  "onMath-block"?: (() => any) | undefined;
@@ -67,9 +71,11 @@ declare function __VLS_template(): {
67
71
  "onIndent-list"?: (() => any) | undefined;
68
72
  "onOutdent-list"?: (() => any) | undefined;
69
73
  }>, {
70
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
74
+ getElement(name: "background-color" | "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
71
75
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
72
76
  "code-block": () => any;
77
+ "select-background-color": (color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any;
78
+ "select-color": (color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any;
73
79
  "inline-code": () => any;
74
80
  "inline-formula": () => any;
75
81
  "math-block": () => any;
@@ -80,6 +86,8 @@ declare function __VLS_template(): {
80
86
  "indent-list": () => any;
81
87
  "outdent-list": () => any;
82
88
  }, import('vue').PublicProps, {}, false, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
89
+ backgroundColor: HTMLDivElement;
90
+ color: HTMLDivElement;
83
91
  code: HTMLDivElement;
84
92
  heading: HTMLDivElement;
85
93
  formula: HTMLDivElement;
@@ -94,6 +102,8 @@ declare function __VLS_template(): {
94
102
  Defaults: {};
95
103
  }, Readonly<{
96
104
  codeVisible: boolean;
105
+ backgroundColorVisible: boolean;
106
+ colorVisible: boolean;
97
107
  formulaVisible: boolean;
98
108
  headingVisible: boolean;
99
109
  listVisible: boolean;
@@ -105,6 +115,8 @@ declare function __VLS_template(): {
105
115
  translate: (key: MarkdownEditorMessageKey) => string;
106
116
  }> & Readonly<{
107
117
  "onCode-block"?: (() => any) | undefined;
118
+ "onSelect-background-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
119
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
108
120
  "onInline-code"?: (() => any) | undefined;
109
121
  "onInline-formula"?: (() => any) | undefined;
110
122
  "onMath-block"?: (() => any) | undefined;
@@ -115,7 +127,7 @@ declare function __VLS_template(): {
115
127
  "onIndent-list"?: (() => any) | undefined;
116
128
  "onOutdent-list"?: (() => any) | undefined;
117
129
  }>, {
118
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
130
+ getElement(name: "background-color" | "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
119
131
  }, {}, {}, {}, {}> | null;
120
132
  linkForm: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
121
133
  autofocus?: boolean;
@@ -505,6 +517,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
505
517
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
506
518
  floatingMenus: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
507
519
  codeVisible: boolean;
520
+ backgroundColorVisible: boolean;
521
+ colorVisible: boolean;
508
522
  formulaVisible: boolean;
509
523
  headingVisible: boolean;
510
524
  listVisible: boolean;
@@ -516,6 +530,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
516
530
  translate: (key: MarkdownEditorMessageKey) => string;
517
531
  }> & Readonly<{
518
532
  "onCode-block"?: (() => any) | undefined;
533
+ "onSelect-background-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
534
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
519
535
  "onInline-code"?: (() => any) | undefined;
520
536
  "onInline-formula"?: (() => any) | undefined;
521
537
  "onMath-block"?: (() => any) | undefined;
@@ -526,9 +542,11 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
526
542
  "onIndent-list"?: (() => any) | undefined;
527
543
  "onOutdent-list"?: (() => any) | undefined;
528
544
  }>, {
529
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
545
+ getElement(name: "background-color" | "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
530
546
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
531
547
  "code-block": () => any;
548
+ "select-background-color": (color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any;
549
+ "select-color": (color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any;
532
550
  "inline-code": () => any;
533
551
  "inline-formula": () => any;
534
552
  "math-block": () => any;
@@ -539,6 +557,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
539
557
  "indent-list": () => any;
540
558
  "outdent-list": () => any;
541
559
  }, import('vue').PublicProps, {}, false, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
560
+ backgroundColor: HTMLDivElement;
561
+ color: HTMLDivElement;
542
562
  code: HTMLDivElement;
543
563
  heading: HTMLDivElement;
544
564
  formula: HTMLDivElement;
@@ -553,6 +573,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
553
573
  Defaults: {};
554
574
  }, Readonly<{
555
575
  codeVisible: boolean;
576
+ backgroundColorVisible: boolean;
577
+ colorVisible: boolean;
556
578
  formulaVisible: boolean;
557
579
  headingVisible: boolean;
558
580
  listVisible: boolean;
@@ -564,6 +586,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
564
586
  translate: (key: MarkdownEditorMessageKey) => string;
565
587
  }> & Readonly<{
566
588
  "onCode-block"?: (() => any) | undefined;
589
+ "onSelect-background-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
590
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet" | "default") => any) | undefined;
567
591
  "onInline-code"?: (() => any) | undefined;
568
592
  "onInline-formula"?: (() => any) | undefined;
569
593
  "onMath-block"?: (() => any) | undefined;
@@ -574,7 +598,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
574
598
  "onIndent-list"?: (() => any) | undefined;
575
599
  "onOutdent-list"?: (() => any) | undefined;
576
600
  }>, {
577
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
601
+ getElement(name: "background-color" | "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
578
602
  }, {}, {}, {}, {}> | null;
579
603
  linkForm: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
580
604
  autofocus?: boolean;