hexagon-editor 0.1.6 → 0.1.8

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 (145) hide show
  1. package/README.md +385 -49
  2. package/dist/MarkdownEditor.vue.d.ts +16 -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/{base-BPdMUtQo.js → base-BOV5nzwj.js} +1005 -728
  6. package/dist/classname.d.ts.map +1 -1
  7. package/dist/{index-D_CMntQU.js → color-7y9Yd6c7.js} +512 -442
  8. package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts +5 -1
  9. package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts.map +1 -1
  10. package/dist/components/MarkdownEditorImageActions.vue.d.ts.map +1 -1
  11. package/dist/components/MarkdownEditorToolbar.vue.d.ts +5 -2
  12. package/dist/components/MarkdownEditorToolbar.vue.d.ts.map +1 -1
  13. package/dist/components/MarkdownEditorToolbarIcon.vue.d.ts.map +1 -1
  14. package/dist/composables/useFloatingPanel.d.ts.map +1 -1
  15. package/dist/composables/useMarkdownEditorValue.d.ts.map +1 -1
  16. package/dist/configure.d.ts.map +1 -1
  17. package/dist/core/actions.d.ts.map +1 -1
  18. package/dist/core/basic-editor-atomic-source.d.ts.map +1 -1
  19. package/dist/core/basic-editor-command-helpers.d.ts +2 -1
  20. package/dist/core/basic-editor-command-helpers.d.ts.map +1 -1
  21. package/dist/core/basic-editor-markdown.d.ts.map +1 -1
  22. package/dist/core/basic-editor-renderers.d.ts.map +1 -1
  23. package/dist/core/basic-editor-runtime-plugins.d.ts.map +1 -1
  24. package/dist/core/basic-editor-selection.d.ts.map +1 -1
  25. package/dist/core/basic-editor-table-controls.d.ts.map +1 -1
  26. package/dist/core/basic-editor-types.d.ts +2 -1
  27. package/dist/core/basic-editor-types.d.ts.map +1 -1
  28. package/dist/core/basic-editor.d.ts.map +1 -1
  29. package/dist/core/content-handler.d.ts.map +1 -1
  30. package/dist/core/editor-instance.d.ts.map +1 -1
  31. package/dist/core/events.d.ts.map +1 -1
  32. package/dist/core/extension-builder.d.ts +1 -1
  33. package/dist/core/extension-builder.d.ts.map +1 -1
  34. package/dist/core/extensions-manager.d.ts.map +1 -1
  35. package/dist/core/lists.d.ts.map +1 -1
  36. package/dist/core/logger.d.ts.map +1 -1
  37. package/dist/core/markdown-parser.d.ts.map +1 -1
  38. package/dist/core/markdown.d.ts.map +1 -1
  39. package/dist/core/markup-commands.d.ts.map +1 -1
  40. package/dist/core/markup-editor.d.ts.map +1 -1
  41. package/dist/core/registries.d.ts.map +1 -1
  42. package/dist/core/schema-dynamic-modifier.d.ts.map +1 -1
  43. package/dist/core/vue-renderer.d.ts.map +1 -1
  44. package/dist/core.js +2 -2
  45. package/dist/directives.d.ts.map +1 -1
  46. package/dist/extensions/additional/folding-heading.d.ts.map +1 -1
  47. package/dist/extensions/additional/math.d.ts.map +1 -1
  48. package/dist/extensions/additional/mermaid.d.ts.map +1 -1
  49. package/dist/extensions/additional/quote-link.d.ts.map +1 -1
  50. package/dist/extensions/additional/yfm-html-block.d.ts.map +1 -1
  51. package/dist/extensions/base.d.ts.map +1 -1
  52. package/dist/extensions/behavior/clicks-on-edges.d.ts.map +1 -1
  53. package/dist/extensions/behavior/clipboard.d.ts.map +1 -1
  54. package/dist/extensions/behavior/cursor.d.ts.map +1 -1
  55. package/dist/extensions/behavior/editor-mode-keymap.d.ts.map +1 -1
  56. package/dist/extensions/behavior/history.d.ts.map +1 -1
  57. package/dist/extensions/behavior/placeholder.d.ts.map +1 -1
  58. package/dist/extensions/behavior/resizable.d.ts.map +1 -1
  59. package/dist/extensions/behavior/selection-commands.d.ts.map +1 -1
  60. package/dist/extensions/behavior/selection-context.d.ts.map +1 -1
  61. package/dist/extensions/behavior/selection.d.ts.map +1 -1
  62. package/dist/extensions/markdown/blockquote-specs.d.ts.map +1 -1
  63. package/dist/extensions/markdown/blockquote.d.ts.map +1 -1
  64. package/dist/extensions/markdown/bold-specs.d.ts.map +1 -1
  65. package/dist/extensions/markdown/bold.d.ts.map +1 -1
  66. package/dist/extensions/markdown/breaks-specs.d.ts.map +1 -1
  67. package/dist/extensions/markdown/breaks.d.ts +1 -1
  68. package/dist/extensions/markdown/breaks.d.ts.map +1 -1
  69. package/dist/extensions/markdown/code-block-specs.d.ts.map +1 -1
  70. package/dist/extensions/markdown/code-block.d.ts +1 -1
  71. package/dist/extensions/markdown/code-block.d.ts.map +1 -1
  72. package/dist/extensions/markdown/code-specs.d.ts.map +1 -1
  73. package/dist/extensions/markdown/code.d.ts.map +1 -1
  74. package/dist/extensions/markdown/color.d.ts +15 -0
  75. package/dist/extensions/markdown/color.d.ts.map +1 -0
  76. package/dist/extensions/markdown/deflist-specs.d.ts.map +1 -1
  77. package/dist/extensions/markdown/deflist.d.ts +1 -1
  78. package/dist/extensions/markdown/deflist.d.ts.map +1 -1
  79. package/dist/extensions/markdown/heading-specs.d.ts.map +1 -1
  80. package/dist/extensions/markdown/heading.d.ts +1 -1
  81. package/dist/extensions/markdown/heading.d.ts.map +1 -1
  82. package/dist/extensions/markdown/horizontal-rule-specs.d.ts.map +1 -1
  83. package/dist/extensions/markdown/horizontal-rule.d.ts.map +1 -1
  84. package/dist/extensions/markdown/html.d.ts.map +1 -1
  85. package/dist/extensions/markdown/image.d.ts +1 -1
  86. package/dist/extensions/markdown/image.d.ts.map +1 -1
  87. package/dist/extensions/markdown/italic-specs.d.ts.map +1 -1
  88. package/dist/extensions/markdown/italic.d.ts +1 -1
  89. package/dist/extensions/markdown/italic.d.ts.map +1 -1
  90. package/dist/extensions/markdown/link-specs.d.ts.map +1 -1
  91. package/dist/extensions/markdown/link.d.ts +1 -1
  92. package/dist/extensions/markdown/link.d.ts.map +1 -1
  93. package/dist/extensions/markdown/list-specs.d.ts.map +1 -1
  94. package/dist/extensions/markdown/lists.d.ts.map +1 -1
  95. package/dist/extensions/markdown/mark.d.ts.map +1 -1
  96. package/dist/extensions/markdown/strike.d.ts.map +1 -1
  97. package/dist/extensions/markdown/subscript.d.ts.map +1 -1
  98. package/dist/extensions/markdown/table-actions.d.ts.map +1 -1
  99. package/dist/extensions/markdown/table-specs.d.ts.map +1 -1
  100. package/dist/extensions/markdown/table.d.ts +2 -2
  101. package/dist/extensions/markdown/table.d.ts.map +1 -1
  102. package/dist/extensions/markdown/underline.d.ts.map +1 -1
  103. package/dist/extensions.js +2 -2
  104. package/dist/forms/MarkdownEditorForm.vue.d.ts.map +1 -1
  105. package/dist/forms/MarkdownEditorImageForm.vue.d.ts.map +1 -1
  106. package/dist/forms/MarkdownEditorLinkForm.vue.d.ts.map +1 -1
  107. package/dist/forms/MarkdownEditorTextInput.vue.d.ts.map +1 -1
  108. package/dist/forms/index.d.ts.map +1 -1
  109. package/dist/forms.js +1 -1
  110. package/dist/{full-Da8esvj2.js → full-s-sYdwp2.js} +1 -1
  111. package/dist/{full-specs-hXKoMF-0.js → full-specs-Cm3QffD5.js} +1 -1
  112. package/dist/{heading-specs-D7Bj4aIM.js → heading-specs-Dnjn5FYs.js} +136 -51
  113. package/dist/i18n/index.d.ts +7 -0
  114. package/dist/i18n/index.d.ts.map +1 -1
  115. package/dist/i18n.js +17 -3
  116. package/dist/index.css +1 -1
  117. package/dist/index.d.ts +8 -8
  118. package/dist/index.d.ts.map +1 -1
  119. package/dist/index.js +1388 -3609
  120. package/dist/{markup-commands-BYsx8ADT.js → markup-commands-uq7LBcNQ.js} +4056 -4404
  121. package/dist/presets/commonmark-specs.d.ts.map +1 -1
  122. package/dist/presets/commonmark.d.ts.map +1 -1
  123. package/dist/presets/default.d.ts.map +1 -1
  124. package/dist/presets/full-specs.d.ts.map +1 -1
  125. package/dist/presets/full.d.ts.map +1 -1
  126. package/dist/presets/index.d.ts.map +1 -1
  127. package/dist/presets/zero.d.ts.map +1 -1
  128. package/dist/presets.js +2 -2
  129. package/dist/public-types.d.ts.map +1 -1
  130. package/dist/renderer/MarkdownRenderer.vue.d.ts.map +1 -1
  131. package/dist/renderer/index.d.ts.map +1 -1
  132. package/dist/renderer/markdown.d.ts.map +1 -1
  133. package/dist/renderer.css +1 -1
  134. package/dist/renderer.js +3644 -193
  135. package/dist/specs.js +53 -14
  136. package/dist/toolbar/config.d.ts +1 -1
  137. package/dist/toolbar/config.d.ts.map +1 -1
  138. package/dist/toolbar/index.d.ts.map +1 -1
  139. package/dist/toolbar.js +1 -3
  140. package/dist/use-markdown-editor.d.ts.map +1 -1
  141. package/dist/version.d.ts +1 -1
  142. package/dist/version.d.ts.map +1 -1
  143. package/package.json +1 -2
  144. package/dist/core/basic-editor-table-popover.d.ts +0 -5
  145. package/dist/core/basic-editor-table-popover.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,20 +1,292 @@
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
- ## Read-only rendering
13
+ ```ts
14
+ // nuxt.config.ts
15
+ export default defineNuxtConfig({
16
+ css: ['hexagon-editor/style.css'], // редактор и рендерер
17
+ });
18
+ ```
19
+
20
+ Для страницы только с предпросмотром достаточно меньшего набора стилей:
21
+
22
+ ```ts
23
+ export default defineNuxtConfig({
24
+ css: ['hexagon-editor/renderer.css'],
25
+ });
26
+ ```
27
+
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 библиотеки автоматически.
53
+
54
+ ## Быстрый старт
55
+
56
+ ```vue
57
+ <script setup lang="ts">
58
+ import {ref} from 'vue';
59
+ import {MarkdownEditor} from 'hexagon-editor';
60
+
61
+ const markdown = ref('# Документ\n\nНачните писать…');
62
+ const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
63
+ </script>
64
+
65
+ <template>
66
+ <MarkdownEditor
67
+ v-model="markdown"
68
+ v-model:mode="mode"
69
+ locale="ru"
70
+ theme="auto"
71
+ />
72
+ </template>
73
+ ```
74
+
75
+ `v-model` всегда содержит Markdown-исходник, независимо от текущего режима. Режимы: `wysiwyg` — визуальный редактор, `markup` — редактор исходного Markdown, `split` — оба представления одновременно.
76
+
77
+ ## Возможности Markdown и YFM
78
+
79
+ Редактор поддерживает следующие конструкции; preset `full` добавляет кнопки для всех доступных действий панели.
16
80
 
17
- Sites that only display documents can import the standalone renderer without bundling the editor, ProseMirror, CodeMirror, toolbar, or editor styles:
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>
214
+ ```
215
+
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
18
290
 
19
291
  ```vue
20
292
  <script setup lang="ts">
@@ -28,89 +300,153 @@ defineProps<{content: string}>();
28
300
  </template>
29
301
  ```
30
302
 
31
- `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.
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-*` для именованных цветов текста.
32
304
 
33
- Math and Mermaid engines are optional and are not included in the base installation. Install only what the application uses:
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 не входят в зависимости пакета. Установите только необходимое:
34
312
 
35
313
  ```bash
36
- pnpm add katex
37
- pnpm add mermaid
314
+ pnpm add katex mermaid
38
315
  ```
39
316
 
40
- Pass local adapters through `features`; Mermaid can be loaded lazily, and KaTeX styles must be imported by the application:
41
-
42
317
  ```ts
43
318
  import katex from 'katex';
44
319
  import 'katex/dist/katex.min.css';
45
320
  import type {MarkdownFeatures} from 'hexagon-editor';
46
321
 
47
- const features: MarkdownFeatures = {
48
- math: {renderToString: (latex, display) => katex.renderToString(latex, {displayMode: display, throwOnError: true})},
49
- mermaid: {load: () => import('mermaid').then(({default: mermaid}) => mermaid)},
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
+ };
339
+
340
+ export const rendererFeatures: MarkdownFeatures = {
341
+ math: editorFeatures.math,
342
+ mermaid: editorFeatures.mermaid,
50
343
  };
51
344
  ```
52
345
 
53
- 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:
54
347
 
55
- 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
+ ```
56
352
 
57
- 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.
353
+ Mermaid загружается лениво, только когда в документе есть диаграмма. В браузерном приложении `features.html` вызывается для YFM HTML-блоков визуального редактора. `MarkdownRenderer` не использует этот адаптер и всегда выводит `:::html` как экранированный исходник; trusted HTML из `::: html` он вставляет напрямую.
58
354
 
59
- ## Component API
355
+ ## Пользовательские директивы
356
+
357
+ Отобразите блок `::: note` собственным Vue-компонентом. В визуальном редакторе `updateContent` записывает изменённый Markdown; в рендерере он намеренно является no-op и `readonly` равен `true`.
60
358
 
61
359
  ```vue
360
+ <!-- NoteDirective.vue -->
62
361
  <script setup lang="ts">
63
- import {ref} from 'vue';
64
- import {MarkdownEditor} from 'hexagon-editor';
362
+ import type {MarkdownDirectiveComponentProps} from 'hexagon-editor';
65
363
 
66
- const value = ref('# Document');
67
- const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
364
+ const props = defineProps<MarkdownDirectiveComponentProps>();
68
365
  </script>
69
366
 
70
367
  <template>
71
- <MarkdownEditor
72
- v-model="value"
73
- v-model:mode="mode"
74
- locale="ru"
75
- theme="auto"
76
- />
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>
77
376
  </template>
78
377
  ```
79
378
 
80
- 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';
81
383
 
82
- Events: `update:modelValue`, `change`, `update:mode`, and `mode-change`.
384
+ const directiveComponents = {note: NoteDirective};
385
+ </script>
83
386
 
84
- `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.
387
+ <template>
388
+ <MarkdownEditor v-model="value" :directive-components="directiveComponents" />
389
+ </template>
390
+ ```
85
391
 
86
- The component ref exposes `focus()`, `hasFocus()`, `getValue()`, `setValue()`/`replace()`, `clear()`, `prepend()`, `append()`, `insert()`, `isEmpty()`, `moveCursor()`, `getMode()`, and `setMode()`.
392
+ ```markdown
393
+ ::: note
394
+ Текст заметки
395
+ :::
396
+ ```
87
397
 
88
- ## Composable and headless API
398
+ ## Composable и headless API
89
399
 
90
- `useMarkdownEditor(options)` returns reactive `value` and `mode`, the `MarkdownEditor` instance, and `destroy()`.
400
+ `useMarkdownEditor()` создаёт framework-neutral экземпляр и автоматически уничтожает его при размонтировании Vue-компонента. Это API управляет состоянием и событиями; монтирование визуальных поверхностей выполняется компонентом `MarkdownEditor` или низкоуровневыми функциями из `/core`.
91
401
 
92
- 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.
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
+ });
412
+
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
+ ```
93
419
 
94
- 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 доступны только для чтения.
95
421
 
96
- ## Stable entry points
422
+ ## Расширения, presets и низкоуровневый API
97
423
 
98
- 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 редактор:
99
425
 
100
- `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';
101
430
 
102
- ## Supported Markdown
431
+ const extensions = new ExtensionsManager((builder) => {
432
+ builder.use(DefaultPreset, {}).use(Math).use(Mermaid);
433
+ }).build();
434
+ ```
435
+
436
+ `ZeroPreset` содержит базовую схему, input rules и keymap; `CommonMarkPreset` добавляет CommonMark-узлы и marks; `DefaultPreset` — таблицы и зачёркивание; `FullPreset` — YFM/расширения, историю, placeholder, clipboard, cursor, selection и responsive behavior. Совместимые `CommonMarkSpecsPreset` и `FullSpecsPreset` также экспортируются.
103
437
 
104
- 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`).
438
+ Корневой entry point экспортирует полный публичный API. Стабильные subpaths: `hexagon-editor/core`, `/extensions`, `/specs`, `/presets`, `/renderer`, `/toolbar`, `/forms`, `/configure`, `/classname`, `/i18n`. Внутренние пути `src/**` не входят в контракт совместимости.
105
439
 
106
- KaTeX and Mermaid render only when their local `features` adapters are supplied.
440
+ `configure({lang: 'en'})` устанавливает process-wide конфигурацию; `getConfig()` читает её, а `subscribeConfigure()` подписывает на изменения. Текущий `MarkdownEditor` не подписывается на неё автоматически: передавайте `locale` каждому экземпляру. `cn('editor')` из `/classname` создаёт BEM-имена с префиксом `hx-md-`.
107
441
 
108
- Invalid Mermaid source remains visible as an editable fallback. YFM HTML source remains visible unless the host supplies a renderer.
442
+ ## Доступность и адаптивность
109
443
 
110
- ## Accessibility and responsive behavior
444
+ У toolbar-кнопок и меню переключения режима есть доступные подписи и ARIA-роли. На узком экране toolbar прокручивается горизонтально, а split-режим становится вертикальным. Переключатель режимов реализован как меню, а не как tablist; специальные сочетания `ArrowLeft`, `ArrowRight`, `Home` и `End` для него не поддерживаются.
111
445
 
112
- 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.
446
+ ## Локальный playground
113
447
 
114
- ## Playground
448
+ ```bash
449
+ pnpm dev
450
+ ```
115
451
 
116
- 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,7 @@ declare function __VLS_template(): {
46
46
  refs: {
47
47
  floatingMenus: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
48
48
  codeVisible: boolean;
49
+ colorVisible: boolean;
49
50
  formulaVisible: boolean;
50
51
  headingVisible: boolean;
51
52
  listVisible: boolean;
@@ -57,6 +58,7 @@ declare function __VLS_template(): {
57
58
  translate: (key: MarkdownEditorMessageKey) => string;
58
59
  }> & Readonly<{
59
60
  "onCode-block"?: (() => any) | undefined;
61
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet") => any) | undefined;
60
62
  "onInline-code"?: (() => any) | undefined;
61
63
  "onInline-formula"?: (() => any) | undefined;
62
64
  "onMath-block"?: (() => any) | undefined;
@@ -67,9 +69,10 @@ declare function __VLS_template(): {
67
69
  "onIndent-list"?: (() => any) | undefined;
68
70
  "onOutdent-list"?: (() => any) | undefined;
69
71
  }>, {
70
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
72
+ getElement(name: "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
71
73
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
72
74
  "code-block": () => any;
75
+ "select-color": (color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet") => any;
73
76
  "inline-code": () => any;
74
77
  "inline-formula": () => any;
75
78
  "math-block": () => any;
@@ -80,6 +83,7 @@ declare function __VLS_template(): {
80
83
  "indent-list": () => any;
81
84
  "outdent-list": () => any;
82
85
  }, import('vue').PublicProps, {}, false, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
86
+ color: HTMLDivElement;
83
87
  code: HTMLDivElement;
84
88
  heading: HTMLDivElement;
85
89
  formula: HTMLDivElement;
@@ -94,6 +98,7 @@ declare function __VLS_template(): {
94
98
  Defaults: {};
95
99
  }, Readonly<{
96
100
  codeVisible: boolean;
101
+ colorVisible: boolean;
97
102
  formulaVisible: boolean;
98
103
  headingVisible: boolean;
99
104
  listVisible: boolean;
@@ -105,6 +110,7 @@ declare function __VLS_template(): {
105
110
  translate: (key: MarkdownEditorMessageKey) => string;
106
111
  }> & Readonly<{
107
112
  "onCode-block"?: (() => any) | undefined;
113
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet") => any) | undefined;
108
114
  "onInline-code"?: (() => any) | undefined;
109
115
  "onInline-formula"?: (() => any) | undefined;
110
116
  "onMath-block"?: (() => any) | undefined;
@@ -115,7 +121,7 @@ declare function __VLS_template(): {
115
121
  "onIndent-list"?: (() => any) | undefined;
116
122
  "onOutdent-list"?: (() => any) | undefined;
117
123
  }>, {
118
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
124
+ getElement(name: "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
119
125
  }, {}, {}, {}, {}> | null;
120
126
  linkForm: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
121
127
  autofocus?: boolean;
@@ -505,6 +511,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
505
511
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
506
512
  floatingMenus: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
507
513
  codeVisible: boolean;
514
+ colorVisible: boolean;
508
515
  formulaVisible: boolean;
509
516
  headingVisible: boolean;
510
517
  listVisible: boolean;
@@ -516,6 +523,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
516
523
  translate: (key: MarkdownEditorMessageKey) => string;
517
524
  }> & Readonly<{
518
525
  "onCode-block"?: (() => any) | undefined;
526
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet") => any) | undefined;
519
527
  "onInline-code"?: (() => any) | undefined;
520
528
  "onInline-formula"?: (() => any) | undefined;
521
529
  "onMath-block"?: (() => any) | undefined;
@@ -526,9 +534,10 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
526
534
  "onIndent-list"?: (() => any) | undefined;
527
535
  "onOutdent-list"?: (() => any) | undefined;
528
536
  }>, {
529
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
537
+ getElement(name: "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
530
538
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
531
539
  "code-block": () => any;
540
+ "select-color": (color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet") => any;
532
541
  "inline-code": () => any;
533
542
  "inline-formula": () => any;
534
543
  "math-block": () => any;
@@ -539,6 +548,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
539
548
  "indent-list": () => any;
540
549
  "outdent-list": () => any;
541
550
  }, import('vue').PublicProps, {}, false, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {
551
+ color: HTMLDivElement;
542
552
  code: HTMLDivElement;
543
553
  heading: HTMLDivElement;
544
554
  formula: HTMLDivElement;
@@ -553,6 +563,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
553
563
  Defaults: {};
554
564
  }, Readonly<{
555
565
  codeVisible: boolean;
566
+ colorVisible: boolean;
556
567
  formulaVisible: boolean;
557
568
  headingVisible: boolean;
558
569
  listVisible: boolean;
@@ -564,6 +575,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
564
575
  translate: (key: MarkdownEditorMessageKey) => string;
565
576
  }> & Readonly<{
566
577
  "onCode-block"?: (() => any) | undefined;
578
+ "onSelect-color"?: ((color: "gray" | "yellow" | "orange" | "red" | "green" | "blue" | "violet") => any) | undefined;
567
579
  "onInline-code"?: (() => any) | undefined;
568
580
  "onInline-formula"?: (() => any) | undefined;
569
581
  "onMath-block"?: (() => any) | undefined;
@@ -574,7 +586,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {
574
586
  "onIndent-list"?: (() => any) | undefined;
575
587
  "onOutdent-list"?: (() => any) | undefined;
576
588
  }>, {
577
- getElement(name: "code" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
589
+ getElement(name: "code" | "color" | "formula" | "heading" | "list" | "mode"): HTMLElement | undefined;
578
590
  }, {}, {}, {}, {}> | null;
579
591
  linkForm: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<{
580
592
  autofocus?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.vue.d.ts","sourceRoot":"","sources":["../src/MarkdownEditor.vue"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownEditor.vue.d.ts","sourceRoot":"","sources":["../src/MarkdownEditor.vue"],"names":[],"mappings":"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"}