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.
- package/README.md +145 -118
- package/dist/MarkdownEditor.vue.d.ts +21 -895
- package/dist/MarkdownEditor.vue.d.ts.map +1 -1
- package/dist/{MarkdownEditorLinkForm-nx1gDLpK.js → MarkdownEditorLinkForm-BAIb4QJp.js} +95 -92
- package/dist/{base-BOV5nzwj.js → base-B5Cf0K33.js} +9 -6
- package/dist/classname.d.ts.map +1 -1
- package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts +12 -19
- package/dist/components/MarkdownEditorFloatingMenus.vue.d.ts.map +1 -1
- package/dist/components/MarkdownEditorImageActions.vue.d.ts +8 -9
- package/dist/components/MarkdownEditorImageActions.vue.d.ts.map +1 -1
- package/dist/components/MarkdownEditorToolbar.vue.d.ts +24 -22
- package/dist/components/MarkdownEditorToolbar.vue.d.ts.map +1 -1
- package/dist/components/MarkdownEditorToolbarIcon.vue.d.ts +2 -1
- package/dist/components/MarkdownEditorToolbarIcon.vue.d.ts.map +1 -1
- package/dist/composables/useFloatingPanel.d.ts +2 -2
- package/dist/composables/useFloatingPanel.d.ts.map +1 -1
- package/dist/composables/useMarkdownEditorValue.d.ts +1 -1
- package/dist/composables/useMarkdownEditorValue.d.ts.map +1 -1
- package/dist/configure.d.ts.map +1 -1
- package/dist/core/actions.d.ts.map +1 -1
- package/dist/core/basic-editor-atomic-source.d.ts +1 -1
- package/dist/core/basic-editor-atomic-source.d.ts.map +1 -1
- package/dist/core/basic-editor-command-helpers.d.ts +7 -7
- package/dist/core/basic-editor-command-helpers.d.ts.map +1 -1
- package/dist/core/basic-editor-markdown.d.ts +4 -2
- package/dist/core/basic-editor-markdown.d.ts.map +1 -1
- package/dist/core/basic-editor-renderers.d.ts +2 -2
- package/dist/core/basic-editor-renderers.d.ts.map +1 -1
- package/dist/core/basic-editor-runtime-plugins.d.ts +3 -3
- package/dist/core/basic-editor-runtime-plugins.d.ts.map +1 -1
- package/dist/core/basic-editor-selection.d.ts +3 -3
- package/dist/core/basic-editor-selection.d.ts.map +1 -1
- package/dist/core/basic-editor-types.d.ts +9 -9
- package/dist/core/basic-editor-types.d.ts.map +1 -1
- package/dist/core/basic-editor.d.ts +7 -4
- package/dist/core/basic-editor.d.ts.map +1 -1
- package/dist/core/content-handler.d.ts +2 -2
- package/dist/core/content-handler.d.ts.map +1 -1
- package/dist/core/editor-instance.d.ts +2 -2
- package/dist/core/editor-instance.d.ts.map +1 -1
- package/dist/core/events.d.ts.map +1 -1
- package/dist/core/extension-builder.d.ts +4 -4
- package/dist/core/extension-builder.d.ts.map +1 -1
- package/dist/core/extensions-manager.d.ts +7 -5
- package/dist/core/extensions-manager.d.ts.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/lists.d.ts +3 -2
- package/dist/core/lists.d.ts.map +1 -1
- package/dist/core/logger.d.ts +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/markdown-parser.d.ts +3 -3
- package/dist/core/markdown-parser.d.ts.map +1 -1
- package/dist/core/markdown.d.ts +3 -2
- package/dist/core/markdown.d.ts.map +1 -1
- package/dist/core/markup-commands.d.ts +1 -1
- package/dist/core/markup-commands.d.ts.map +1 -1
- package/dist/core/markup-editor.d.ts +1 -1
- package/dist/core/markup-editor.d.ts.map +1 -1
- package/dist/core/registries.d.ts +6 -3
- package/dist/core/registries.d.ts.map +1 -1
- package/dist/core/schema-dynamic-modifier.d.ts +1 -1
- package/dist/core/schema-dynamic-modifier.d.ts.map +1 -1
- package/dist/core/vue-renderer.d.ts +6 -4
- package/dist/core/vue-renderer.d.ts.map +1 -1
- package/dist/core.d.ts +1 -0
- package/dist/core.js +17 -16
- package/dist/directives-CqalziGj.js +11 -0
- package/dist/directives.d.ts +23 -4
- package/dist/directives.d.ts.map +1 -1
- package/dist/extensions/additional/folding-heading.d.ts +3 -2
- package/dist/extensions/additional/folding-heading.d.ts.map +1 -1
- package/dist/extensions/additional/math.d.ts +7 -5
- package/dist/extensions/additional/math.d.ts.map +1 -1
- package/dist/extensions/additional/mermaid.d.ts +7 -5
- package/dist/extensions/additional/mermaid.d.ts.map +1 -1
- package/dist/extensions/additional/quote-link.d.ts +7 -5
- package/dist/extensions/additional/quote-link.d.ts.map +1 -1
- package/dist/extensions/additional/yfm-html-block.d.ts +7 -5
- package/dist/extensions/additional/yfm-html-block.d.ts.map +1 -1
- package/dist/extensions/base.d.ts +1 -1
- package/dist/extensions/base.d.ts.map +1 -1
- package/dist/extensions/behavior/clicks-on-edges.d.ts +2 -2
- package/dist/extensions/behavior/clicks-on-edges.d.ts.map +1 -1
- package/dist/extensions/behavior/clipboard.d.ts +2 -2
- package/dist/extensions/behavior/cursor.d.ts +4 -3
- package/dist/extensions/behavior/cursor.d.ts.map +1 -1
- package/dist/extensions/behavior/editor-mode-keymap.d.ts +1 -1
- package/dist/extensions/behavior/editor-mode-keymap.d.ts.map +1 -1
- package/dist/extensions/behavior/history.d.ts +2 -2
- package/dist/extensions/behavior/history.d.ts.map +1 -1
- package/dist/extensions/behavior/placeholder.d.ts +1 -1
- package/dist/extensions/behavior/placeholder.d.ts.map +1 -1
- package/dist/extensions/behavior/resizable.d.ts +1 -1
- package/dist/extensions/behavior/selection-commands.d.ts +3 -2
- package/dist/extensions/behavior/selection-commands.d.ts.map +1 -1
- package/dist/extensions/behavior/selection-context.d.ts +3 -3
- package/dist/extensions/behavior/selection-context.d.ts.map +1 -1
- package/dist/extensions/behavior/selection.d.ts +1 -1
- package/dist/extensions/behavior/selection.d.ts.map +1 -1
- package/dist/extensions/markdown/background-color.d.ts +6 -5
- package/dist/extensions/markdown/background-color.d.ts.map +1 -1
- package/dist/extensions/markdown/blockquote-specs.d.ts +4 -3
- package/dist/extensions/markdown/blockquote-specs.d.ts.map +1 -1
- package/dist/extensions/markdown/blockquote.d.ts +3 -3
- package/dist/extensions/markdown/blockquote.d.ts.map +1 -1
- package/dist/extensions/markdown/bold-specs.d.ts +4 -3
- package/dist/extensions/markdown/bold.d.ts +3 -3
- package/dist/extensions/markdown/bold.d.ts.map +1 -1
- package/dist/extensions/markdown/breaks-specs.d.ts +4 -3
- package/dist/extensions/markdown/breaks-specs.d.ts.map +1 -1
- package/dist/extensions/markdown/breaks.d.ts +2 -2
- package/dist/extensions/markdown/breaks.d.ts.map +1 -1
- package/dist/extensions/markdown/code-block-specs.d.ts +4 -3
- package/dist/extensions/markdown/code-block.d.ts +3 -3
- package/dist/extensions/markdown/code-block.d.ts.map +1 -1
- package/dist/extensions/markdown/code-specs.d.ts +4 -3
- package/dist/extensions/markdown/code.d.ts +4 -3
- package/dist/extensions/markdown/code.d.ts.map +1 -1
- package/dist/extensions/markdown/color.d.ts +6 -5
- package/dist/extensions/markdown/color.d.ts.map +1 -1
- package/dist/extensions/markdown/deflist-specs.d.ts +4 -3
- package/dist/extensions/markdown/deflist-specs.d.ts.map +1 -1
- package/dist/extensions/markdown/deflist.d.ts +5 -5
- package/dist/extensions/markdown/deflist.d.ts.map +1 -1
- package/dist/extensions/markdown/heading-specs.d.ts +4 -3
- package/dist/extensions/markdown/heading.d.ts +3 -3
- package/dist/extensions/markdown/heading.d.ts.map +1 -1
- package/dist/extensions/markdown/horizontal-rule-specs.d.ts +4 -3
- package/dist/extensions/markdown/horizontal-rule.d.ts +3 -3
- package/dist/extensions/markdown/horizontal-rule.d.ts.map +1 -1
- package/dist/extensions/markdown/html.d.ts +4 -3
- package/dist/extensions/markdown/html.d.ts.map +1 -1
- package/dist/extensions/markdown/image.d.ts +7 -6
- package/dist/extensions/markdown/image.d.ts.map +1 -1
- package/dist/extensions/markdown/italic-specs.d.ts +4 -3
- package/dist/extensions/markdown/italic.d.ts +3 -3
- package/dist/extensions/markdown/italic.d.ts.map +1 -1
- package/dist/extensions/markdown/link-specs.d.ts +5 -4
- package/dist/extensions/markdown/link.d.ts +3 -3
- package/dist/extensions/markdown/link.d.ts.map +1 -1
- package/dist/extensions/markdown/list-specs.d.ts +3 -2
- package/dist/extensions/markdown/list-specs.d.ts.map +1 -1
- package/dist/extensions/markdown/lists.d.ts +3 -3
- package/dist/extensions/markdown/lists.d.ts.map +1 -1
- package/dist/extensions/markdown/mark.d.ts +5 -4
- package/dist/extensions/markdown/mark.d.ts.map +1 -1
- package/dist/extensions/markdown/strike.d.ts +5 -4
- package/dist/extensions/markdown/strike.d.ts.map +1 -1
- package/dist/extensions/markdown/subscript.d.ts +5 -4
- package/dist/extensions/markdown/subscript.d.ts.map +1 -1
- package/dist/extensions/markdown/table-actions.d.ts +2 -2
- package/dist/extensions/markdown/table-actions.d.ts.map +1 -1
- package/dist/extensions/markdown/table-specs.d.ts +4 -3
- package/dist/extensions/markdown/table-specs.d.ts.map +1 -1
- package/dist/extensions/markdown/table.d.ts +1 -1
- package/dist/extensions/markdown/table.d.ts.map +1 -1
- package/dist/extensions/markdown/underline.d.ts +5 -4
- package/dist/extensions/markdown/underline.d.ts.map +1 -1
- package/dist/extensions.d.ts +1 -0
- package/dist/extensions.js +1 -1
- package/dist/forms/MarkdownEditorForm.vue.d.ts +14 -21
- package/dist/forms/MarkdownEditorForm.vue.d.ts.map +1 -1
- package/dist/forms/MarkdownEditorImageForm.vue.d.ts +13 -81
- package/dist/forms/MarkdownEditorImageForm.vue.d.ts.map +1 -1
- package/dist/forms/MarkdownEditorLinkForm.vue.d.ts +9 -79
- package/dist/forms/MarkdownEditorLinkForm.vue.d.ts.map +1 -1
- package/dist/forms/MarkdownEditorTextInput.vue.d.ts +8 -9
- package/dist/forms/MarkdownEditorTextInput.vue.d.ts.map +1 -1
- package/dist/forms.d.ts +1 -0
- package/dist/forms.js +1 -1
- package/dist/{full-s-sYdwp2.js → full-DakJ7Z5o.js} +1 -1
- package/dist/{full-specs-Cm3QffD5.js → full-specs-CE16SWE6.js} +1 -1
- package/dist/i18n/index.d.ts +1 -1
- package/dist/i18n.d.ts +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +906 -860
- package/dist/{markup-commands-DW5NFQUO.js → markup-commands-C-IL6Ajf.js} +2286 -2233
- package/dist/presets/commonmark-specs.d.ts +2 -2
- package/dist/presets/commonmark.d.ts +11 -11
- package/dist/presets/commonmark.d.ts.map +1 -1
- package/dist/presets/default.d.ts +2 -2
- package/dist/presets/full-specs.d.ts +2 -2
- package/dist/presets/full.d.ts +7 -7
- package/dist/presets/full.d.ts.map +1 -1
- package/dist/presets/zero.d.ts +2 -2
- package/dist/presets/zero.d.ts.map +1 -1
- package/dist/presets.d.ts +1 -0
- package/dist/presets.js +2 -2
- package/dist/public-types.d.ts +1 -1
- package/dist/public-types.d.ts.map +1 -1
- package/dist/renderer/MarkdownRenderer.vue.d.ts +11 -9
- package/dist/renderer/MarkdownRenderer.vue.d.ts.map +1 -1
- package/dist/renderer/index.d.ts +1 -1
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/markdown.d.ts +3 -2
- package/dist/renderer/markdown.d.ts.map +1 -1
- package/dist/renderer.css +1 -1
- package/dist/renderer.d.ts +1 -0
- package/dist/renderer.js +509 -484
- package/dist/toolbar/config.d.ts +2 -2
- package/dist/toolbar/config.d.ts.map +1 -1
- package/dist/toolbar/index.d.ts.map +1 -1
- package/dist/toolbar.d.ts +1 -0
- package/dist/use-markdown-editor.d.ts +3 -3
- package/dist/use-markdown-editor.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
|
84
|
-
| Форматирование
|
|
85
|
-
| Структура
|
|
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
|
-
**Жирный**,
|
|
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
|
|
103
|
+
[Ссылка](https://example.com 'Подсказка') и 
|
|
104
104
|
|
|
105
105
|
Термин
|
|
106
106
|
: Определение
|
|
107
107
|
|
|
108
108
|
| Слева | По центру | Справа |
|
|
109
|
-
|
|
|
110
|
-
| 1
|
|
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
|
-
|
|
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`
|
|
172
|
-
| `mode`
|
|
173
|
-
| `locale`
|
|
174
|
-
| `theme`
|
|
175
|
-
| `placeholder`
|
|
176
|
-
| `readonly`
|
|
177
|
-
| `toolbarPreset` | см. ниже, `default`
|
|
178
|
-
| `toolbarConfig` | `MarkdownEditorToolbarConfig`
|
|
179
|
-
| `features`
|
|
180
|
-
| `
|
|
181
|
-
| `uploadImage`
|
|
182
|
-
|
|
183
|
-
`modelValue`, `mode`, `locale`, `toolbarPreset`, `toolbarConfig`, `theme` и `uploadImage` обновляются без перемонтирования компонента. Изменение `mode`, `readonly` или `features` пересоздаёт editor hosts, поэтому текущие selection и история undo/redo сбрасываются. `placeholder` и `
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
|
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`
|
|
225
|
-
| `commonmark` | история, жирный, курсив, заголовки, списки, ссылка, цитата, code, code block, горизонтальное правило
|
|
226
|
-
| `default`
|
|
227
|
-
| `minimal`
|
|
228
|
-
| `full`
|
|
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
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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 {
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
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
|
|
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` также принимает `
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
},
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
342
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
|
|
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
|
|
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 удаляет их, как в примере выше.
|