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