hexagon-editor 0.1.9 → 0.1.10

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 (210) hide show
  1. package/README.md +145 -118
  2. package/dist/MarkdownEditor.vue.d.ts +21 -895
  3. package/dist/MarkdownEditor.vue.d.ts.map +1 -1
  4. package/dist/{MarkdownEditorLinkForm-nx1gDLpK.js → MarkdownEditorLinkForm-BAIb4QJp.js} +95 -92
  5. package/dist/{base-BOV5nzwj.js → base-B5Cf0K33.js} +9 -6
  6. package/dist/classname.d.ts.map +1 -1
  7. package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts +12 -19
  8. package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts.map +1 -1
  9. package/dist/components/MarkdownEditorImageActions.vue.d.ts +8 -9
  10. package/dist/components/MarkdownEditorImageActions.vue.d.ts.map +1 -1
  11. package/dist/components/MarkdownEditorToolbar.vue.d.ts +24 -22
  12. package/dist/components/MarkdownEditorToolbar.vue.d.ts.map +1 -1
  13. package/dist/components/MarkdownEditorToolbarIcon.vue.d.ts +2 -1
  14. package/dist/components/MarkdownEditorToolbarIcon.vue.d.ts.map +1 -1
  15. package/dist/composables/useFloatingPanel.d.ts +2 -2
  16. package/dist/composables/useFloatingPanel.d.ts.map +1 -1
  17. package/dist/composables/useMarkdownEditorValue.d.ts +1 -1
  18. package/dist/composables/useMarkdownEditorValue.d.ts.map +1 -1
  19. package/dist/configure.d.ts.map +1 -1
  20. package/dist/core/actions.d.ts.map +1 -1
  21. package/dist/core/basic-editor-atomic-source.d.ts +1 -1
  22. package/dist/core/basic-editor-atomic-source.d.ts.map +1 -1
  23. package/dist/core/basic-editor-command-helpers.d.ts +7 -7
  24. package/dist/core/basic-editor-command-helpers.d.ts.map +1 -1
  25. package/dist/core/basic-editor-markdown.d.ts +4 -2
  26. package/dist/core/basic-editor-markdown.d.ts.map +1 -1
  27. package/dist/core/basic-editor-renderers.d.ts +2 -2
  28. package/dist/core/basic-editor-renderers.d.ts.map +1 -1
  29. package/dist/core/basic-editor-runtime-plugins.d.ts +3 -3
  30. package/dist/core/basic-editor-runtime-plugins.d.ts.map +1 -1
  31. package/dist/core/basic-editor-selection.d.ts +3 -3
  32. package/dist/core/basic-editor-selection.d.ts.map +1 -1
  33. package/dist/core/basic-editor-types.d.ts +9 -9
  34. package/dist/core/basic-editor-types.d.ts.map +1 -1
  35. package/dist/core/basic-editor.d.ts +7 -4
  36. package/dist/core/basic-editor.d.ts.map +1 -1
  37. package/dist/core/content-handler.d.ts +2 -2
  38. package/dist/core/content-handler.d.ts.map +1 -1
  39. package/dist/core/editor-instance.d.ts +2 -2
  40. package/dist/core/editor-instance.d.ts.map +1 -1
  41. package/dist/core/events.d.ts.map +1 -1
  42. package/dist/core/extension-builder.d.ts +4 -4
  43. package/dist/core/extension-builder.d.ts.map +1 -1
  44. package/dist/core/extensions-manager.d.ts +7 -5
  45. package/dist/core/extensions-manager.d.ts.map +1 -1
  46. package/dist/core/index.d.ts +1 -1
  47. package/dist/core/index.d.ts.map +1 -1
  48. package/dist/core/lists.d.ts +3 -2
  49. package/dist/core/lists.d.ts.map +1 -1
  50. package/dist/core/logger.d.ts +1 -1
  51. package/dist/core/logger.d.ts.map +1 -1
  52. package/dist/core/markdown-parser.d.ts +3 -3
  53. package/dist/core/markdown-parser.d.ts.map +1 -1
  54. package/dist/core/markdown.d.ts +3 -2
  55. package/dist/core/markdown.d.ts.map +1 -1
  56. package/dist/core/markup-commands.d.ts +1 -1
  57. package/dist/core/markup-commands.d.ts.map +1 -1
  58. package/dist/core/markup-editor.d.ts +1 -1
  59. package/dist/core/markup-editor.d.ts.map +1 -1
  60. package/dist/core/registries.d.ts +6 -3
  61. package/dist/core/registries.d.ts.map +1 -1
  62. package/dist/core/schema-dynamic-modifier.d.ts +1 -1
  63. package/dist/core/schema-dynamic-modifier.d.ts.map +1 -1
  64. package/dist/core/vue-renderer.d.ts +6 -4
  65. package/dist/core/vue-renderer.d.ts.map +1 -1
  66. package/dist/core.d.ts +1 -0
  67. package/dist/core.js +17 -16
  68. package/dist/directives-CqalziGj.js +11 -0
  69. package/dist/directives.d.ts +23 -4
  70. package/dist/directives.d.ts.map +1 -1
  71. package/dist/extensions/additional/folding-heading.d.ts +3 -2
  72. package/dist/extensions/additional/folding-heading.d.ts.map +1 -1
  73. package/dist/extensions/additional/math.d.ts +7 -5
  74. package/dist/extensions/additional/math.d.ts.map +1 -1
  75. package/dist/extensions/additional/mermaid.d.ts +7 -5
  76. package/dist/extensions/additional/mermaid.d.ts.map +1 -1
  77. package/dist/extensions/additional/quote-link.d.ts +7 -5
  78. package/dist/extensions/additional/quote-link.d.ts.map +1 -1
  79. package/dist/extensions/additional/yfm-html-block.d.ts +7 -5
  80. package/dist/extensions/additional/yfm-html-block.d.ts.map +1 -1
  81. package/dist/extensions/base.d.ts +1 -1
  82. package/dist/extensions/base.d.ts.map +1 -1
  83. package/dist/extensions/behavior/clicks-on-edges.d.ts +2 -2
  84. package/dist/extensions/behavior/clicks-on-edges.d.ts.map +1 -1
  85. package/dist/extensions/behavior/clipboard.d.ts +2 -2
  86. package/dist/extensions/behavior/cursor.d.ts +4 -3
  87. package/dist/extensions/behavior/cursor.d.ts.map +1 -1
  88. package/dist/extensions/behavior/editor-mode-keymap.d.ts +1 -1
  89. package/dist/extensions/behavior/editor-mode-keymap.d.ts.map +1 -1
  90. package/dist/extensions/behavior/history.d.ts +2 -2
  91. package/dist/extensions/behavior/history.d.ts.map +1 -1
  92. package/dist/extensions/behavior/placeholder.d.ts +1 -1
  93. package/dist/extensions/behavior/placeholder.d.ts.map +1 -1
  94. package/dist/extensions/behavior/resizable.d.ts +1 -1
  95. package/dist/extensions/behavior/selection-commands.d.ts +3 -2
  96. package/dist/extensions/behavior/selection-commands.d.ts.map +1 -1
  97. package/dist/extensions/behavior/selection-context.d.ts +3 -3
  98. package/dist/extensions/behavior/selection-context.d.ts.map +1 -1
  99. package/dist/extensions/behavior/selection.d.ts +1 -1
  100. package/dist/extensions/behavior/selection.d.ts.map +1 -1
  101. package/dist/extensions/markdown/background-color.d.ts +6 -5
  102. package/dist/extensions/markdown/background-color.d.ts.map +1 -1
  103. package/dist/extensions/markdown/blockquote-specs.d.ts +4 -3
  104. package/dist/extensions/markdown/blockquote-specs.d.ts.map +1 -1
  105. package/dist/extensions/markdown/blockquote.d.ts +3 -3
  106. package/dist/extensions/markdown/blockquote.d.ts.map +1 -1
  107. package/dist/extensions/markdown/bold-specs.d.ts +4 -3
  108. package/dist/extensions/markdown/bold.d.ts +3 -3
  109. package/dist/extensions/markdown/bold.d.ts.map +1 -1
  110. package/dist/extensions/markdown/breaks-specs.d.ts +4 -3
  111. package/dist/extensions/markdown/breaks-specs.d.ts.map +1 -1
  112. package/dist/extensions/markdown/breaks.d.ts +2 -2
  113. package/dist/extensions/markdown/breaks.d.ts.map +1 -1
  114. package/dist/extensions/markdown/code-block-specs.d.ts +4 -3
  115. package/dist/extensions/markdown/code-block.d.ts +3 -3
  116. package/dist/extensions/markdown/code-block.d.ts.map +1 -1
  117. package/dist/extensions/markdown/code-specs.d.ts +4 -3
  118. package/dist/extensions/markdown/code.d.ts +4 -3
  119. package/dist/extensions/markdown/code.d.ts.map +1 -1
  120. package/dist/extensions/markdown/color.d.ts +6 -5
  121. package/dist/extensions/markdown/color.d.ts.map +1 -1
  122. package/dist/extensions/markdown/deflist-specs.d.ts +4 -3
  123. package/dist/extensions/markdown/deflist-specs.d.ts.map +1 -1
  124. package/dist/extensions/markdown/deflist.d.ts +5 -5
  125. package/dist/extensions/markdown/deflist.d.ts.map +1 -1
  126. package/dist/extensions/markdown/heading-specs.d.ts +4 -3
  127. package/dist/extensions/markdown/heading.d.ts +3 -3
  128. package/dist/extensions/markdown/heading.d.ts.map +1 -1
  129. package/dist/extensions/markdown/horizontal-rule-specs.d.ts +4 -3
  130. package/dist/extensions/markdown/horizontal-rule.d.ts +3 -3
  131. package/dist/extensions/markdown/horizontal-rule.d.ts.map +1 -1
  132. package/dist/extensions/markdown/html.d.ts +4 -3
  133. package/dist/extensions/markdown/html.d.ts.map +1 -1
  134. package/dist/extensions/markdown/image.d.ts +7 -6
  135. package/dist/extensions/markdown/image.d.ts.map +1 -1
  136. package/dist/extensions/markdown/italic-specs.d.ts +4 -3
  137. package/dist/extensions/markdown/italic.d.ts +3 -3
  138. package/dist/extensions/markdown/italic.d.ts.map +1 -1
  139. package/dist/extensions/markdown/link-specs.d.ts +5 -4
  140. package/dist/extensions/markdown/link.d.ts +3 -3
  141. package/dist/extensions/markdown/link.d.ts.map +1 -1
  142. package/dist/extensions/markdown/list-specs.d.ts +3 -2
  143. package/dist/extensions/markdown/list-specs.d.ts.map +1 -1
  144. package/dist/extensions/markdown/lists.d.ts +3 -3
  145. package/dist/extensions/markdown/lists.d.ts.map +1 -1
  146. package/dist/extensions/markdown/mark.d.ts +5 -4
  147. package/dist/extensions/markdown/mark.d.ts.map +1 -1
  148. package/dist/extensions/markdown/strike.d.ts +5 -4
  149. package/dist/extensions/markdown/strike.d.ts.map +1 -1
  150. package/dist/extensions/markdown/subscript.d.ts +5 -4
  151. package/dist/extensions/markdown/subscript.d.ts.map +1 -1
  152. package/dist/extensions/markdown/table-actions.d.ts +2 -2
  153. package/dist/extensions/markdown/table-actions.d.ts.map +1 -1
  154. package/dist/extensions/markdown/table-specs.d.ts +4 -3
  155. package/dist/extensions/markdown/table-specs.d.ts.map +1 -1
  156. package/dist/extensions/markdown/table.d.ts +1 -1
  157. package/dist/extensions/markdown/table.d.ts.map +1 -1
  158. package/dist/extensions/markdown/underline.d.ts +5 -4
  159. package/dist/extensions/markdown/underline.d.ts.map +1 -1
  160. package/dist/extensions.d.ts +1 -0
  161. package/dist/extensions.js +1 -1
  162. package/dist/forms/MarkdownEditorForm.vue.d.ts +14 -21
  163. package/dist/forms/MarkdownEditorForm.vue.d.ts.map +1 -1
  164. package/dist/forms/MarkdownEditorImageForm.vue.d.ts +13 -81
  165. package/dist/forms/MarkdownEditorImageForm.vue.d.ts.map +1 -1
  166. package/dist/forms/MarkdownEditorLinkForm.vue.d.ts +9 -79
  167. package/dist/forms/MarkdownEditorLinkForm.vue.d.ts.map +1 -1
  168. package/dist/forms/MarkdownEditorTextInput.vue.d.ts +8 -9
  169. package/dist/forms/MarkdownEditorTextInput.vue.d.ts.map +1 -1
  170. package/dist/forms.d.ts +1 -0
  171. package/dist/forms.js +1 -1
  172. package/dist/{full-s-sYdwp2.js → full-DakJ7Z5o.js} +1 -1
  173. package/dist/{full-specs-Cm3QffD5.js → full-specs-CE16SWE6.js} +1 -1
  174. package/dist/i18n/index.d.ts +1 -1
  175. package/dist/i18n.d.ts +1 -0
  176. package/dist/index.css +1 -1
  177. package/dist/index.d.ts +1 -1
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +906 -860
  180. package/dist/{markup-commands-DW5NFQUO.js → markup-commands-C-IL6Ajf.js} +2286 -2233
  181. package/dist/presets/commonmark-specs.d.ts +2 -2
  182. package/dist/presets/commonmark.d.ts +11 -11
  183. package/dist/presets/commonmark.d.ts.map +1 -1
  184. package/dist/presets/default.d.ts +2 -2
  185. package/dist/presets/full-specs.d.ts +2 -2
  186. package/dist/presets/full.d.ts +7 -7
  187. package/dist/presets/full.d.ts.map +1 -1
  188. package/dist/presets/zero.d.ts +2 -2
  189. package/dist/presets/zero.d.ts.map +1 -1
  190. package/dist/presets.d.ts +1 -0
  191. package/dist/presets.js +2 -2
  192. package/dist/public-types.d.ts +1 -1
  193. package/dist/public-types.d.ts.map +1 -1
  194. package/dist/renderer/MarkdownRenderer.vue.d.ts +11 -9
  195. package/dist/renderer/MarkdownRenderer.vue.d.ts.map +1 -1
  196. package/dist/renderer/index.d.ts +1 -1
  197. package/dist/renderer/index.d.ts.map +1 -1
  198. package/dist/renderer/markdown.d.ts +3 -2
  199. package/dist/renderer/markdown.d.ts.map +1 -1
  200. package/dist/renderer.css +1 -1
  201. package/dist/renderer.d.ts +1 -0
  202. package/dist/renderer.js +509 -484
  203. package/dist/toolbar/config.d.ts +2 -2
  204. package/dist/toolbar/config.d.ts.map +1 -1
  205. package/dist/toolbar/index.d.ts.map +1 -1
  206. package/dist/toolbar.d.ts +1 -0
  207. package/dist/use-markdown-editor.d.ts +3 -3
  208. package/dist/use-markdown-editor.d.ts.map +1 -1
  209. package/dist/version.d.ts +1 -1
  210. package/package.json +104 -105
package/README.md CHANGED
@@ -13,7 +13,7 @@ pnpm add hexagon-editor
13
13
  ```ts
14
14
  // nuxt.config.ts
15
15
  export default defineNuxtConfig({
16
- css: ['hexagon-editor/style.css'], // редактор и рендерер
16
+ css: ['hexagon-editor/style.css'], // редактор и рендерер
17
17
  });
18
18
  ```
19
19
 
@@ -21,7 +21,7 @@ export default defineNuxtConfig({
21
21
 
22
22
  ```ts
23
23
  export default defineNuxtConfig({
24
- css: ['hexagon-editor/renderer.css'],
24
+ css: ['hexagon-editor/renderer.css'],
25
25
  });
26
26
  ```
27
27
 
@@ -31,7 +31,7 @@ export default defineNuxtConfig({
31
31
 
32
32
  ```ts
33
33
  // src/main.ts
34
- import {createApp} from 'vue';
34
+ import { createApp } from 'vue';
35
35
  import App from './App.vue';
36
36
  import 'hexagon-editor/style.css';
37
37
 
@@ -42,7 +42,7 @@ createApp(App).mount('#app');
42
42
 
43
43
  ```ts
44
44
  // src/main.ts
45
- import {createApp} from 'vue';
45
+ import { createApp } from 'vue';
46
46
  import App from './App.vue';
47
47
  import 'hexagon-editor/renderer.css';
48
48
 
@@ -55,8 +55,8 @@ createApp(App).mount('#app');
55
55
 
56
56
  ```vue
57
57
  <script setup lang="ts">
58
- import {ref} from 'vue';
59
- import {MarkdownEditor} from 'hexagon-editor';
58
+ import { ref } from 'vue';
59
+ import { MarkdownEditor } from 'hexagon-editor';
60
60
 
61
61
  const markdown = ref('# Документ\n\nНачните писать…');
62
62
  const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
@@ -76,14 +76,14 @@ const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
76
76
 
77
77
  ## Возможности Markdown и YFM
78
78
 
79
- Редактор поддерживает следующие конструкции; preset `full` добавляет кнопки для всех доступных действий панели.
79
+ Редактор поддерживает следующие конструкции; preset `full` добавляет расширенный набор кнопок панели.
80
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 |
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
87
 
88
88
  Пример документа, покрывающий расширенные возможности:
89
89
 
@@ -92,7 +92,7 @@ const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
92
92
 
93
93
  ##+ Сворачиваемый раздел
94
94
 
95
- **Жирный**, *курсив*, ~~зачёркнутый~~, __подчёркнутый__, ==выделенный==, H~2~O и {blue}(синий текст).
95
+ **Жирный**, _курсив_, ~~зачёркнутый~~, ++подчёркнутый++, ==выделенный==, H~2~O, {blue}(синий текст) и {bg-yellow}(текст на жёлтом фоне).
96
96
 
97
97
  > Цитата
98
98
 
@@ -100,14 +100,14 @@ const mode = ref<'wysiwyg' | 'markup' | 'split'>('wysiwyg');
100
100
 
101
101
  Текст quote link.
102
102
 
103
- [Ссылка](https://example.com "Подсказка") и ![Логотип](https://example.com/logo.svg)
103
+ [Ссылка](https://example.com 'Подсказка') и ![Логотип](https://example.com/logo.svg)
104
104
 
105
105
  Термин
106
106
  : Определение
107
107
 
108
108
  | Слева | По центру | Справа |
109
- | :--- | :---: | ---: |
110
- | 1 | 2 | 3 |
109
+ | :---- | :-------: | -----: |
110
+ | 1 | 2 | 3 |
111
111
 
112
112
  Формула: $E = mc^2$
113
113
 
@@ -141,14 +141,14 @@ graph LR
141
141
 
142
142
  ```vue
143
143
  <script setup lang="ts">
144
- import {ref} from 'vue';
145
- import {MarkdownEditor} from 'hexagon-editor';
144
+ import { ref } from 'vue';
145
+ import { MarkdownEditor } from 'hexagon-editor';
146
146
 
147
147
  const value = ref('');
148
148
  const mode = ref<'wysiwyg' | 'markup' | 'split'>('split');
149
149
 
150
150
  function save(markdown: string) {
151
- console.log(markdown);
151
+ console.log(markdown);
152
152
  }
153
153
  </script>
154
154
 
@@ -166,21 +166,21 @@ function save(markdown: string) {
166
166
  </template>
167
167
  ```
168
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`.
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
+ | `directives` | `MarkdownDirectives` | Плагины блоковых директив |
181
+ | `uploadImage` | `(file: File) => Promise<string>` | Обработчик загрузки в форме изображения |
182
+
183
+ `modelValue`, `mode`, `locale`, `toolbarPreset`, `toolbarConfig`, `theme` и `uploadImage` обновляются без перемонтирования компонента. Изменение `mode`, `readonly` или `features` пересоздаёт editor hosts, поэтому текущие selection и история undo/redo сбрасываются. `placeholder` и `directives` применяются при следующем монтировании; чтобы обновить их у уже созданного редактора, измените его `:key`.
184
184
 
185
185
  События: `update:modelValue`, `change` (новый Markdown), `update:mode` и `mode-change` (новый режим), а также `submit` и `cancel` без параметров. Последние возникают в визуальном редакторе по `Mod+Enter` и `Escape`; в режиме `markup` на них полагаться не следует. Компонент также принимает:
186
186
 
@@ -193,23 +193,27 @@ function save(markdown: string) {
193
193
 
194
194
  ```vue
195
195
  <script setup lang="ts">
196
- import {ref} from 'vue';
197
- import {MarkdownEditor} from 'hexagon-editor';
198
- import type {MarkdownEditorExposed} from 'hexagon-editor';
196
+ import { ref } from 'vue';
197
+ import { MarkdownEditor } from 'hexagon-editor';
198
+ import type { MarkdownEditorExposed } from 'hexagon-editor';
199
199
 
200
+ const value = ref('');
200
201
  const editor = ref<MarkdownEditorExposed>();
201
202
 
202
203
  async function insertTemplate() {
203
- editor.value?.append('## Новый раздел');
204
- await editor.value?.setMode('markup');
205
- editor.value?.moveCursor('end');
206
- editor.value?.focus();
204
+ editor.value?.append('## Новый раздел');
205
+ await editor.value?.setMode('markup');
206
+ editor.value?.moveCursor('end');
207
+ editor.value?.focus();
207
208
  }
208
209
  </script>
209
210
 
210
211
  <template>
211
212
  <button @click="insertTemplate">Добавить раздел</button>
212
- <MarkdownEditor ref="editor" v-model="value" />
213
+ <MarkdownEditor
214
+ ref="editor"
215
+ v-model="value"
216
+ />
213
217
  </template>
214
218
  ```
215
219
 
@@ -219,35 +223,31 @@ async function insertTemplate() {
219
223
 
220
224
  Presets: `zero`, `commonmark`, `default`, `full` и совместимый `minimal`.
221
225
 
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 и таблицы |
226
+ | Preset | Содержимое |
227
+ | ------------ | ---------------------------------------------------------------------------------------------------------- |
228
+ | `zero` | undo / redo |
229
+ | `commonmark` | история, жирный, курсив, заголовки, списки, ссылка, цитата, code, code block, горизонтальное правило |
230
+ | `default` | `commonmark` + зачёркивание |
231
+ | `minimal` | история, базовое форматирование, списки, цитата, сворачиваемые заголовки, ссылка |
232
+ | `full` | расширенный набор кнопок: underline, mark, цвет текста и фона, image, formula, Mermaid, YFM HTML и таблицы |
229
233
 
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`.
234
+ Все идентификаторы кнопок: `undo`, `redo`, `heading`, `bold`, `italic`, `underline`, `strike`, `mark`, `code`, `bullet-list`, `ordered-list`, `quote`, `fold-heading`, `code-block`, `code-language`, `link`, `color`, `background-color`, `image`, `formula`, `mermaid`, `html`, `horizontal-rule`, `table`. `code-language` доступен только в контекстном меню выбранного code block и не отображается в основной панели.
231
235
 
232
236
  Соберите панель с нужным порядком и контекстными условиями:
233
237
 
234
238
  ```ts
235
- import {
236
- createToolbarConfig,
237
- createToolbarGroup,
238
- createToolbarItem,
239
- } from 'hexagon-editor';
240
- import type {MarkdownEditorToolbarConfig} from 'hexagon-editor';
239
+ import { createToolbarConfig, createToolbarGroup, createToolbarItem } from 'hexagon-editor';
240
+ import type { MarkdownEditorToolbarConfig } from 'hexagon-editor';
241
241
 
242
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
- ]),
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
251
  ]);
252
252
  ```
253
253
 
@@ -263,36 +263,42 @@ export const toolbar: MarkdownEditorToolbarConfig = createToolbarConfig([
263
263
 
264
264
  ```vue
265
265
  <script setup lang="ts">
266
- import {MarkdownEditor} from 'hexagon-editor';
266
+ import { ref } from 'vue';
267
+ import { MarkdownEditor } from 'hexagon-editor';
267
268
 
269
+ const value = ref('');
268
270
  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;
271
+ const body = new FormData();
272
+ body.append('image', file);
273
+ const response = await fetch('/api/images', { method: 'POST', body });
274
+ if (!response.ok) throw new Error('Image upload failed');
275
+
276
+ const result: unknown = await response.json();
277
+ if (typeof result !== 'object' || result === null || !('url' in result) || typeof result.url !== 'string') {
278
+ throw new Error('The API must return {url: string}');
279
+ }
280
+ return result.url;
279
281
  }
280
282
  </script>
281
283
 
282
284
  <template>
283
- <MarkdownEditor v-model="value" :upload-image="uploadImage" toolbar-preset="full" />
285
+ <MarkdownEditor
286
+ v-model="value"
287
+ :upload-image="uploadImage"
288
+ toolbar-preset="full"
289
+ />
284
290
  </template>
285
291
  ```
286
292
 
287
- Встроенная форма позволяет указать URL, alt-текст, title, имя и размеры. `MarkdownEditorImageForm`, `MarkdownEditorLinkForm`, `MarkdownEditorForm` и `MarkdownEditorTextInput` экспортируются также для самостоятельного использования. Типы payload: `MarkdownEditorImageSubmitParams` и `MarkdownEditorLinkSubmitParams`.
293
+ Встроенная форма позволяет указать URL, alt-текст, title и загрузку файла. Имя и размеры доступны в самостоятельной форме (variant="full" по умолчанию); variant="basic" скрывает их. Размеры вставленного изображения изменяются существующими инструментами редактора. `MarkdownEditorImageForm`, `MarkdownEditorLinkForm`, `MarkdownEditorForm` и `MarkdownEditorTextInput` экспортируются также для самостоятельного использования. Типы payload: `MarkdownEditorImageSubmitParams` и `MarkdownEditorLinkSubmitParams`.
288
294
 
289
295
  ## Рендерер для read-only и SSR
290
296
 
291
297
  ```vue
292
298
  <script setup lang="ts">
293
- import {MarkdownRenderer} from 'hexagon-editor/renderer';
299
+ import { MarkdownRenderer } from 'hexagon-editor/renderer';
294
300
 
295
- defineProps<{content: string}>();
301
+ defineProps<{ content: string }>();
296
302
  </script>
297
303
 
298
304
  <template>
@@ -304,7 +310,7 @@ defineProps<{content: string}>();
304
310
 
305
311
  Raw Markdown HTML отображается как исходный текст. HTML внутри директивы с пробелом после маркера — `::: html` — рендерится как HTML, а `:::html` является YFM-блоком. Передавайте в HTML только доверенный контент: пакет не санитизирует его.
306
312
 
307
- `MarkdownRenderer` также принимает `directiveComponents`; зарегистрированные компоненты монтируются в блоки `::: name`, получают `readonly: true`, а их `updateContent()` намеренно ничего не делает.
313
+ `MarkdownRenderer` также принимает `directives`; зарегистрированные компоненты монтируются в блоки `::: name`, получают `readonly: true`, а их `updateContent()` и `updateAttrs()` намеренно ничего не делают.
308
314
 
309
315
  ## Опциональные движки: KaTeX, Mermaid и HTML
310
316
 
@@ -317,29 +323,30 @@ pnpm add katex mermaid
317
323
  ```ts
318
324
  import katex from 'katex';
319
325
  import 'katex/dist/katex.min.css';
320
- import type {MarkdownFeatures} from 'hexagon-editor';
326
+ import type { MarkdownFeatures } from 'hexagon-editor';
321
327
 
322
328
  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
- },
329
+ math: {
330
+ renderToString: (latex, display) =>
331
+ katex.renderToString(latex, {
332
+ displayMode: display,
333
+ throwOnError: true,
334
+ }),
335
+ },
336
+ mermaid: {
337
+ load: () => import('mermaid').then(({ default: mermaid }) => mermaid),
338
+ },
339
+ // source приходит из :::html ... ::: — возвращайте только безопасный DOM.
340
+ html: (source) => {
341
+ const element = document.createElement('div');
342
+ element.textContent = source;
343
+ return element;
344
+ },
338
345
  };
339
346
 
340
347
  export const rendererFeatures: MarkdownFeatures = {
341
- math: editorFeatures.math,
342
- mermaid: editorFeatures.mermaid,
348
+ math: editorFeatures.math,
349
+ mermaid: editorFeatures.mermaid,
343
350
  };
344
351
  ```
345
352
 
@@ -359,7 +366,7 @@ Mermaid загружается лениво, только когда в доку
359
366
  ```vue
360
367
  <!-- NoteDirective.vue -->
361
368
  <script setup lang="ts">
362
- import type {MarkdownDirectiveComponentProps} from 'hexagon-editor';
369
+ import type { MarkdownDirectiveComponentProps } from 'hexagon-editor';
363
370
 
364
371
  const props = defineProps<MarkdownDirectiveComponentProps>();
365
372
  </script>
@@ -378,19 +385,31 @@ const props = defineProps<MarkdownDirectiveComponentProps>();
378
385
 
379
386
  ```vue
380
387
  <script setup lang="ts">
381
- import {MarkdownEditor} from 'hexagon-editor';
388
+ import { MarkdownEditor } from 'hexagon-editor';
382
389
  import NoteDirective from './NoteDirective.vue';
383
390
 
384
- const directiveComponents = {note: NoteDirective};
391
+ const directives = {
392
+ note: {
393
+ component: NoteDirective,
394
+ label: 'Note',
395
+ toolbar: true,
396
+ insert: { content: '', attrs: { variant: 'info' } },
397
+ parseAttributes: (raw: string) => JSON.parse('{' + raw + '}'),
398
+ serializeAttributes: (attrs) => JSON.stringify(attrs).slice(1, -1),
399
+ },
400
+ };
385
401
  </script>
386
402
 
387
403
  <template>
388
- <MarkdownEditor v-model="value" :directive-components="directiveComponents" />
404
+ <MarkdownEditor
405
+ v-model="value"
406
+ :directives="directives"
407
+ />
389
408
  </template>
390
409
  ```
391
410
 
392
411
  ```markdown
393
- ::: note
412
+ ::: note {"variant":"info"}
394
413
  Текст заметки
395
414
  :::
396
415
  ```
@@ -400,19 +419,19 @@ const directiveComponents = {note: NoteDirective};
400
419
  `useMarkdownEditor()` создаёт framework-neutral экземпляр и автоматически уничтожает его при размонтировании Vue-компонента. Это API управляет состоянием и событиями; монтирование визуальных поверхностей выполняется компонентом `MarkdownEditor` или низкоуровневыми функциями из `/core`.
401
420
 
402
421
  ```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(),
422
+ import { useMarkdownEditor } from 'hexagon-editor';
423
+
424
+ const { editor, value, mode, readonly, toolbarVisible, destroy } = useMarkdownEditor({
425
+ initialValue: '# Черновик',
426
+ mode: 'markup',
427
+ preset: 'full',
428
+ onChange: (markdown) => saveDraft(markdown),
429
+ beforeEditorModeChange: ({ mode }) => mode !== 'split' || canUseSplitMode(),
411
430
  });
412
431
 
413
432
  editor.append('Новый абзац');
414
433
  editor.setReadonly(true);
415
- editor.changeToolbarVisibility({visible: false});
434
+ editor.changeToolbarVisibility({ visible: false });
416
435
  editor.on('modeChange', (nextMode) => console.log(nextMode));
417
436
  // destroy() требуется только вне Vue lifecycle или для раннего освобождения.
418
437
  ```
@@ -424,12 +443,12 @@ editor.on('modeChange', (nextMode) => console.log(nextMode));
424
443
  Используйте public subpaths, когда строите свой ProseMirror-based редактор:
425
444
 
426
445
  ```ts
427
- import {ExtensionsManager} from 'hexagon-editor/core';
428
- import {DefaultPreset} from 'hexagon-editor/presets';
429
- import {Math, Mermaid} from 'hexagon-editor/extensions';
446
+ import { ExtensionsManager } from 'hexagon-editor/core';
447
+ import { DefaultPreset } from 'hexagon-editor/presets';
448
+ import { Math, Mermaid } from 'hexagon-editor/extensions';
430
449
 
431
450
  const extensions = new ExtensionsManager((builder) => {
432
- builder.use(DefaultPreset, {}).use(Math).use(Mermaid);
451
+ builder.use(DefaultPreset, {}).use(Math).use(Mermaid);
433
452
  }).build();
434
453
  ```
435
454
 
@@ -441,7 +460,7 @@ const extensions = new ExtensionsManager((builder) => {
441
460
 
442
461
  ## Доступность и адаптивность
443
462
 
444
- У toolbar-кнопок и меню переключения режима есть доступные подписи и ARIA-роли. На узком экране toolbar прокручивается горизонтально, а split-режим становится вертикальным. Переключатель режимов реализован как меню, а не как tablist; специальные сочетания `ArrowLeft`, `ArrowRight`, `Home` и `End` для него не поддерживаются.
463
+ У toolbar-кнопок и меню переключения режима есть доступные подписи и ARIA-роли. На узком экране группы toolbar переносятся на новую строку, а split-режим становится вертикальным. Переключатель режимов реализован как меню, а не как tablist; специальные сочетания `ArrowLeft`, `ArrowRight`, `Home` и `End` для него не поддерживаются.
445
464
 
446
465
  ## Локальный playground
447
466
 
@@ -450,3 +469,11 @@ pnpm dev
450
469
  ```
451
470
 
452
471
  Playground содержит демонстрацию полного toolbar, Markdown/YFM, live-переключатели языка и темы, KaTeX/Mermaid и пример загрузки изображений.
472
+
473
+ ### Уточнения API
474
+
475
+ Readonly блокирует пользовательские команды и закрывает формы редактирования. Программные методы `setValue()`, `replace()` и `insert()` остаются доступными. В split метод `hasFocus()` проверяет только визуальную поверхность.
476
+
477
+ `MarkdownRenderer` поддерживает замену `content`, `directives` и `features` после mount. При замене или удалении адаптеров исходный Markdown обрабатывается заново; устаревшие асинхронные результаты игнорируются. Без адаптера сохраняется текстовый fallback; SSR не запускает Mermaid.
478
+
479
+ В контракте директив `parseAttributes` получает содержимое внешних фигурных скобок, а `serializeAttributes` возвращает содержимое без скобок. Для JSON-объекта parser восстанавливает скобки, serializer удаляет их, как в примере выше.