@cloud-ru/ds-markdown 1.0.0
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/CHANGELOG.md +8 -0
- package/LICENSE +201 -0
- package/README.md +273 -0
- package/dist/cjs/components/Markdown/CodeBlock.d.ts +9 -0
- package/dist/cjs/components/Markdown/CodeBlock.js +58 -0
- package/dist/cjs/components/Markdown/Markdown.d.ts +2 -0
- package/dist/cjs/components/Markdown/Markdown.js +25 -0
- package/dist/cjs/components/Markdown/index.d.ts +1 -0
- package/dist/cjs/components/Markdown/index.js +17 -0
- package/dist/cjs/components/Markdown/styles.module.css +205 -0
- package/dist/cjs/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
- package/dist/cjs/components/MarkdownEditor/MarkdownEditor.js +176 -0
- package/dist/cjs/components/MarkdownEditor/index.d.ts +1 -0
- package/dist/cjs/components/MarkdownEditor/index.js +17 -0
- package/dist/cjs/components/MarkdownEditor/styles.module.css +273 -0
- package/dist/cjs/components/Toolbar/Toolbar.d.ts +9 -0
- package/dist/cjs/components/Toolbar/Toolbar.js +173 -0
- package/dist/cjs/components/Toolbar/constants.d.ts +13 -0
- package/dist/cjs/components/Toolbar/constants.js +40 -0
- package/dist/cjs/components/Toolbar/hooks/index.d.ts +2 -0
- package/dist/cjs/components/Toolbar/hooks/index.js +18 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarHotkeys.d.ts +21 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarHotkeys.js +59 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarOverflow.d.ts +14 -0
- package/dist/cjs/components/Toolbar/hooks/useToolbarOverflow.js +87 -0
- package/dist/cjs/components/Toolbar/index.d.ts +2 -0
- package/dist/cjs/components/Toolbar/index.js +20 -0
- package/dist/cjs/components/Toolbar/styles.module.css +17 -0
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/index.js +20 -0
- package/dist/cjs/constants.d.ts +65 -0
- package/dist/cjs/constants.js +67 -0
- package/dist/cjs/helperComponents/ButtonHeading/ButtonHeading.d.ts +6 -0
- package/dist/cjs/helperComponents/ButtonHeading/ButtonHeading.js +61 -0
- package/dist/cjs/helperComponents/ButtonHeading/index.d.ts +1 -0
- package/dist/cjs/helperComponents/ButtonHeading/index.js +17 -0
- package/dist/cjs/helperComponents/ButtonHeading/styles.module.css +3 -0
- package/dist/cjs/helperComponents/Buttons/Buttons.d.ts +10 -0
- package/dist/cjs/helperComponents/Buttons/Buttons.js +21 -0
- package/dist/cjs/helperComponents/Buttons/index.d.ts +1 -0
- package/dist/cjs/helperComponents/Buttons/index.js +17 -0
- package/dist/cjs/helperComponents/Buttons/styles.module.css +17 -0
- package/dist/cjs/helperComponents/Modals/CustomizeTableModal.d.ts +8 -0
- package/dist/cjs/helperComponents/Modals/CustomizeTableModal.js +39 -0
- package/dist/cjs/helperComponents/Modals/ImageModal.d.ts +7 -0
- package/dist/cjs/helperComponents/Modals/ImageModal.js +44 -0
- package/dist/cjs/helperComponents/Modals/LinkModal.d.ts +13 -0
- package/dist/cjs/helperComponents/Modals/LinkModal.js +42 -0
- package/dist/cjs/helperComponents/Modals/index.d.ts +3 -0
- package/dist/cjs/helperComponents/Modals/index.js +19 -0
- package/dist/cjs/helperComponents/Modals/styles.module.css +17 -0
- package/dist/cjs/helperComponents/PrivateButton/PrivateButton.d.ts +17 -0
- package/dist/cjs/helperComponents/PrivateButton/PrivateButton.js +27 -0
- package/dist/cjs/helperComponents/PrivateButton/index.d.ts +1 -0
- package/dist/cjs/helperComponents/PrivateButton/index.js +17 -0
- package/dist/cjs/helperComponents/PrivateButton/styles.module.css +140 -0
- package/dist/cjs/helperComponents/TableSelectItem/TableSelectItem.d.ts +11 -0
- package/dist/cjs/helperComponents/TableSelectItem/TableSelectItem.js +12 -0
- package/dist/cjs/helperComponents/TableSelectItem/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TableSelectItem/index.js +17 -0
- package/dist/cjs/helperComponents/TableSelectItem/styles.module.css +101 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.d.ts +4 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.js +27 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/index.d.ts +1 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/index.js +17 -0
- package/dist/cjs/helperComponents/TableSelectSettingsGrid/styles.module.css +54 -0
- package/dist/cjs/helperComponents/index.d.ts +6 -0
- package/dist/cjs/helperComponents/index.js +22 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/locale/index.d.ts +199 -0
- package/dist/cjs/locale/index.js +104 -0
- package/dist/cjs/lowlight.d.ts +14 -0
- package/dist/cjs/lowlight.js +35 -0
- package/dist/cjs/mixins.css +0 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/rawMarkdownCommands.d.ts +16 -0
- package/dist/cjs/rawMarkdownCommands.js +145 -0
- package/dist/cjs/style.css +875 -0
- package/dist/cjs/styles/syntax.module.css +47 -0
- package/dist/cjs/toolbarApi.d.ts +33 -0
- package/dist/cjs/toolbarApi.js +100 -0
- package/dist/cjs/types.d.ts +52 -0
- package/dist/cjs/types.js +2 -0
- package/dist/esm/components/Markdown/CodeBlock.d.ts +9 -0
- package/dist/esm/components/Markdown/CodeBlock.js +52 -0
- package/dist/esm/components/Markdown/Markdown.d.ts +2 -0
- package/dist/esm/components/Markdown/Markdown.js +19 -0
- package/dist/esm/components/Markdown/index.d.ts +1 -0
- package/dist/esm/components/Markdown/index.js +1 -0
- package/dist/esm/components/Markdown/styles.module.css +205 -0
- package/dist/esm/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
- package/dist/esm/components/MarkdownEditor/MarkdownEditor.js +170 -0
- package/dist/esm/components/MarkdownEditor/index.d.ts +1 -0
- package/dist/esm/components/MarkdownEditor/index.js +1 -0
- package/dist/esm/components/MarkdownEditor/styles.module.css +273 -0
- package/dist/esm/components/Toolbar/Toolbar.d.ts +9 -0
- package/dist/esm/components/Toolbar/Toolbar.js +167 -0
- package/dist/esm/components/Toolbar/constants.d.ts +13 -0
- package/dist/esm/components/Toolbar/constants.js +37 -0
- package/dist/esm/components/Toolbar/hooks/index.d.ts +2 -0
- package/dist/esm/components/Toolbar/hooks/index.js +2 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarHotkeys.d.ts +21 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarHotkeys.js +56 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarOverflow.d.ts +14 -0
- package/dist/esm/components/Toolbar/hooks/useToolbarOverflow.js +84 -0
- package/dist/esm/components/Toolbar/index.d.ts +2 -0
- package/dist/esm/components/Toolbar/index.js +2 -0
- package/dist/esm/components/Toolbar/styles.module.css +17 -0
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.js +4 -0
- package/dist/esm/constants.d.ts +65 -0
- package/dist/esm/constants.js +61 -0
- package/dist/esm/helperComponents/ButtonHeading/ButtonHeading.d.ts +6 -0
- package/dist/esm/helperComponents/ButtonHeading/ButtonHeading.js +55 -0
- package/dist/esm/helperComponents/ButtonHeading/index.d.ts +1 -0
- package/dist/esm/helperComponents/ButtonHeading/index.js +1 -0
- package/dist/esm/helperComponents/ButtonHeading/styles.module.css +3 -0
- package/dist/esm/helperComponents/Buttons/Buttons.d.ts +10 -0
- package/dist/esm/helperComponents/Buttons/Buttons.js +13 -0
- package/dist/esm/helperComponents/Buttons/index.d.ts +1 -0
- package/dist/esm/helperComponents/Buttons/index.js +1 -0
- package/dist/esm/helperComponents/Buttons/styles.module.css +17 -0
- package/dist/esm/helperComponents/Modals/CustomizeTableModal.d.ts +8 -0
- package/dist/esm/helperComponents/Modals/CustomizeTableModal.js +33 -0
- package/dist/esm/helperComponents/Modals/ImageModal.d.ts +7 -0
- package/dist/esm/helperComponents/Modals/ImageModal.js +38 -0
- package/dist/esm/helperComponents/Modals/LinkModal.d.ts +13 -0
- package/dist/esm/helperComponents/Modals/LinkModal.js +36 -0
- package/dist/esm/helperComponents/Modals/index.d.ts +3 -0
- package/dist/esm/helperComponents/Modals/index.js +3 -0
- package/dist/esm/helperComponents/Modals/styles.module.css +17 -0
- package/dist/esm/helperComponents/PrivateButton/PrivateButton.d.ts +17 -0
- package/dist/esm/helperComponents/PrivateButton/PrivateButton.js +21 -0
- package/dist/esm/helperComponents/PrivateButton/index.d.ts +1 -0
- package/dist/esm/helperComponents/PrivateButton/index.js +1 -0
- package/dist/esm/helperComponents/PrivateButton/styles.module.css +140 -0
- package/dist/esm/helperComponents/TableSelectItem/TableSelectItem.d.ts +11 -0
- package/dist/esm/helperComponents/TableSelectItem/TableSelectItem.js +6 -0
- package/dist/esm/helperComponents/TableSelectItem/index.d.ts +1 -0
- package/dist/esm/helperComponents/TableSelectItem/index.js +1 -0
- package/dist/esm/helperComponents/TableSelectItem/styles.module.css +101 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.d.ts +4 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.js +21 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/index.d.ts +1 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/index.js +1 -0
- package/dist/esm/helperComponents/TableSelectSettingsGrid/styles.module.css +54 -0
- package/dist/esm/helperComponents/index.d.ts +6 -0
- package/dist/esm/helperComponents/index.js +6 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/locale/index.d.ts +199 -0
- package/dist/esm/locale/index.js +101 -0
- package/dist/esm/lowlight.d.ts +14 -0
- package/dist/esm/lowlight.js +29 -0
- package/dist/esm/mixins.css +0 -0
- package/dist/esm/rawMarkdownCommands.d.ts +16 -0
- package/dist/esm/rawMarkdownCommands.js +135 -0
- package/dist/esm/style.css +875 -0
- package/dist/esm/styles/syntax.module.css +47 -0
- package/dist/esm/toolbarApi.d.ts +33 -0
- package/dist/esm/toolbarApi.js +96 -0
- package/dist/esm/types.d.ts +52 -0
- package/dist/esm/types.js +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +84 -0
- package/src/components/Markdown/CodeBlock.tsx +96 -0
- package/src/components/Markdown/Markdown.tsx +47 -0
- package/src/components/Markdown/index.ts +1 -0
- package/src/components/Markdown/styles.module.scss +105 -0
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +322 -0
- package/src/components/MarkdownEditor/index.ts +1 -0
- package/src/components/MarkdownEditor/styles.module.scss +201 -0
- package/src/components/Toolbar/Toolbar.tsx +292 -0
- package/src/components/Toolbar/constants.tsx +63 -0
- package/src/components/Toolbar/hooks/index.ts +2 -0
- package/src/components/Toolbar/hooks/useToolbarHotkeys.ts +74 -0
- package/src/components/Toolbar/hooks/useToolbarOverflow.ts +102 -0
- package/src/components/Toolbar/index.ts +2 -0
- package/src/components/Toolbar/styles.module.scss +29 -0
- package/src/components/index.ts +4 -0
- package/src/constants.ts +67 -0
- package/src/helperComponents/ButtonHeading/ButtonHeading.tsx +100 -0
- package/src/helperComponents/ButtonHeading/index.ts +1 -0
- package/src/helperComponents/ButtonHeading/styles.module.scss +5 -0
- package/src/helperComponents/Buttons/Buttons.tsx +30 -0
- package/src/helperComponents/Buttons/index.ts +1 -0
- package/src/helperComponents/Buttons/styles.module.scss +26 -0
- package/src/helperComponents/Modals/CustomizeTableModal.tsx +82 -0
- package/src/helperComponents/Modals/ImageModal.tsx +84 -0
- package/src/helperComponents/Modals/LinkModal.tsx +92 -0
- package/src/helperComponents/Modals/index.ts +3 -0
- package/src/helperComponents/Modals/styles.module.scss +21 -0
- package/src/helperComponents/PrivateButton/PrivateButton.tsx +88 -0
- package/src/helperComponents/PrivateButton/index.ts +1 -0
- package/src/helperComponents/PrivateButton/styles.module.scss +77 -0
- package/src/helperComponents/TableSelectItem/TableSelectItem.tsx +43 -0
- package/src/helperComponents/TableSelectItem/index.ts +1 -0
- package/src/helperComponents/TableSelectItem/styles.module.scss +26 -0
- package/src/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.tsx +48 -0
- package/src/helperComponents/TableSelectSettingsGrid/index.ts +1 -0
- package/src/helperComponents/TableSelectSettingsGrid/styles.module.scss +65 -0
- package/src/helperComponents/index.ts +6 -0
- package/src/index.ts +4 -0
- package/src/locale/index.ts +105 -0
- package/src/lowlight.ts +30 -0
- package/src/mixins.scss +123 -0
- package/src/rawMarkdownCommands.ts +179 -0
- package/src/styles/syntax.module.scss +54 -0
- package/src/toolbarApi.ts +152 -0
- package/src/types.ts +56 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
.syntax :global(.hljs-comment),
|
|
2
|
+
.syntax :global(.hljs-quote){
|
|
3
|
+
font-style:italic;
|
|
4
|
+
color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
|
|
5
|
+
}
|
|
6
|
+
.syntax :global(.hljs-keyword),
|
|
7
|
+
.syntax :global(.hljs-selector-tag),
|
|
8
|
+
.syntax :global(.hljs-built_in),
|
|
9
|
+
.syntax :global(.hljs-name),
|
|
10
|
+
.syntax :global(.hljs-tag){
|
|
11
|
+
color:var(--sn-theme-color-blue-text, var(--sn-primitive-color-blue-45, #3b6fad));
|
|
12
|
+
}
|
|
13
|
+
.syntax :global(.hljs-string),
|
|
14
|
+
.syntax :global(.hljs-title),
|
|
15
|
+
.syntax :global(.hljs-section),
|
|
16
|
+
.syntax :global(.hljs-attribute),
|
|
17
|
+
.syntax :global(.hljs-literal),
|
|
18
|
+
.syntax :global(.hljs-template-tag),
|
|
19
|
+
.syntax :global(.hljs-template-variable),
|
|
20
|
+
.syntax :global(.hljs-type),
|
|
21
|
+
.syntax :global(.hljs-addition){
|
|
22
|
+
color:var(--sn-theme-color-green-text, var(--sn-primitive-color-green-45, #438b4b));
|
|
23
|
+
}
|
|
24
|
+
.syntax :global(.hljs-number),
|
|
25
|
+
.syntax :global(.hljs-symbol),
|
|
26
|
+
.syntax :global(.hljs-bullet),
|
|
27
|
+
.syntax :global(.hljs-link),
|
|
28
|
+
.syntax :global(.hljs-meta),
|
|
29
|
+
.syntax :global(.hljs-selector-id),
|
|
30
|
+
.syntax :global(.hljs-selector-class){
|
|
31
|
+
color:var(--sn-theme-color-blue-accent, var(--sn-primitive-color-blue-55, #4387e2));
|
|
32
|
+
}
|
|
33
|
+
.syntax :global(.hljs-deletion),
|
|
34
|
+
.syntax :global(.hljs-regexp),
|
|
35
|
+
.syntax :global(.hljs-variable),
|
|
36
|
+
.syntax :global(.hljs-template-variable){
|
|
37
|
+
color:var(--sn-theme-color-red-text, var(--sn-primitive-color-red-45, #a93533));
|
|
38
|
+
}
|
|
39
|
+
.syntax :global(.hljs-emphasis){
|
|
40
|
+
font-style:italic;
|
|
41
|
+
}
|
|
42
|
+
.syntax :global(.hljs-strong){
|
|
43
|
+
font-weight:600;
|
|
44
|
+
}
|
|
45
|
+
.syntax :global(.hljs-link){
|
|
46
|
+
text-decoration:underline;
|
|
47
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Editor } from '@tiptap/react';
|
|
2
|
+
import { RefObject } from 'react';
|
|
3
|
+
import { LinkProps } from './helperComponents/index.js';
|
|
4
|
+
import { RawEdit } from './rawMarkdownCommands.js';
|
|
5
|
+
import { HeadingLevel, ToolbarItemId } from './types.js';
|
|
6
|
+
export type ToolbarApi = {
|
|
7
|
+
/** Режим бэкенда: `wysiwyg` (TipTap, preview) либо `raw` (markdown-исходник в textarea). */
|
|
8
|
+
mode: 'wysiwyg' | 'raw';
|
|
9
|
+
focus(): void;
|
|
10
|
+
/** Активна ли кнопка (checked-стейт). В raw-режиме — всегда false. */
|
|
11
|
+
isActive(id: ToolbarItemId): boolean;
|
|
12
|
+
/** Активен ли заголовок уровня `level` на текущей строке. В raw-режиме — false. */
|
|
13
|
+
isHeadingActive(level: HeadingLevel): boolean;
|
|
14
|
+
/** Toggle инлайн/блочной кнопки (bold…block-code). */
|
|
15
|
+
toggle(id: ToolbarItemId): void;
|
|
16
|
+
toggleHeading(level: HeadingLevel): void;
|
|
17
|
+
setParagraph(): void;
|
|
18
|
+
getLinkHref(): string | undefined;
|
|
19
|
+
getLinkTitle(): string | undefined;
|
|
20
|
+
setLink(props: LinkProps): void;
|
|
21
|
+
insertImage(src: string, alt: string): void;
|
|
22
|
+
insertTable(rows: number, cols: number): void;
|
|
23
|
+
/** Подписка на изменение selection/контента — для перерисовки checked-стейтов. */
|
|
24
|
+
subscribe(callback: () => void): () => void;
|
|
25
|
+
};
|
|
26
|
+
export declare function createWysiwygApi(editor: Editor): ToolbarApi;
|
|
27
|
+
export type RawApiLabels = {
|
|
28
|
+
/** Текст-заглушка ссылки, когда выделения нет. */
|
|
29
|
+
linkText: string;
|
|
30
|
+
/** Подпись колонки таблицы по 1-based индексу. */
|
|
31
|
+
tableColumn(index: number): string;
|
|
32
|
+
};
|
|
33
|
+
export declare function createRawApi(textareaRef: RefObject<HTMLTextAreaElement | null>, commit: (edit: RawEdit) => void, labels: RawApiLabels): ToolbarApi;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { TOOLBAR_ITEM } from './constants.js';
|
|
2
|
+
import { applyBlockToggle, applyHeading, applyImage, applyInlineToggle, applyLink, applyParagraph, applyTable, } from './rawMarkdownCommands.js';
|
|
3
|
+
const WYSIWYG_MARK = {
|
|
4
|
+
[TOOLBAR_ITEM.Bold]: 'bold',
|
|
5
|
+
[TOOLBAR_ITEM.Italic]: 'italic',
|
|
6
|
+
[TOOLBAR_ITEM.Strikethrough]: 'strike',
|
|
7
|
+
[TOOLBAR_ITEM.InlineCode]: 'code',
|
|
8
|
+
[TOOLBAR_ITEM.BulletList]: 'bulletList',
|
|
9
|
+
[TOOLBAR_ITEM.OrderedList]: 'orderedList',
|
|
10
|
+
[TOOLBAR_ITEM.BlockQuote]: 'blockquote',
|
|
11
|
+
[TOOLBAR_ITEM.BlockCode]: 'codeBlock',
|
|
12
|
+
};
|
|
13
|
+
export function createWysiwygApi(editor) {
|
|
14
|
+
const toggleCommand = {
|
|
15
|
+
[TOOLBAR_ITEM.Bold]: () => editor.chain().focus().toggleBold().run(),
|
|
16
|
+
[TOOLBAR_ITEM.Italic]: () => editor.chain().focus().toggleItalic().run(),
|
|
17
|
+
[TOOLBAR_ITEM.Strikethrough]: () => editor.chain().focus().toggleStrike().run(),
|
|
18
|
+
[TOOLBAR_ITEM.InlineCode]: () => editor.chain().focus().toggleCode().run(),
|
|
19
|
+
[TOOLBAR_ITEM.BulletList]: () => editor.chain().focus().toggleBulletList().run(),
|
|
20
|
+
[TOOLBAR_ITEM.OrderedList]: () => editor.chain().focus().toggleOrderedList().run(),
|
|
21
|
+
[TOOLBAR_ITEM.BlockQuote]: () => editor.chain().focus().toggleBlockquote().run(),
|
|
22
|
+
[TOOLBAR_ITEM.BlockCode]: () => editor.chain().focus().toggleCodeBlock().run(),
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
mode: 'wysiwyg',
|
|
26
|
+
focus: () => editor.chain().focus().run(),
|
|
27
|
+
isActive: id => {
|
|
28
|
+
const mark = WYSIWYG_MARK[id];
|
|
29
|
+
return mark ? editor.isActive(mark) : false;
|
|
30
|
+
},
|
|
31
|
+
isHeadingActive: level => editor.isActive('heading', { level }),
|
|
32
|
+
toggle: id => toggleCommand[id]?.(),
|
|
33
|
+
toggleHeading: level => editor.chain().focus().toggleHeading({ level }).run(),
|
|
34
|
+
setParagraph: () => editor.chain().focus().setParagraph().run(),
|
|
35
|
+
getLinkHref: () => editor.getAttributes('link').href,
|
|
36
|
+
// Видимый текст ссылки = выделенный текст (для префилла поля «текст ссылки»).
|
|
37
|
+
getLinkTitle: () => {
|
|
38
|
+
const { from, to } = editor.state.selection;
|
|
39
|
+
return from === to ? undefined : editor.state.doc.textBetween(from, to);
|
|
40
|
+
},
|
|
41
|
+
setLink: ({ href, title }) => {
|
|
42
|
+
if (!href) {
|
|
43
|
+
editor.chain().focus().extendMarkRange('link').unsetLink().run();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const chain = editor.chain().focus().extendMarkRange('link');
|
|
47
|
+
// Нет выделения, но задан текст — вставляем текст-ссылку. Иначе оборачиваем выделение.
|
|
48
|
+
if (editor.state.selection.empty && title) {
|
|
49
|
+
chain.insertContent({ type: 'text', text: title, marks: [{ type: 'link', attrs: { href } }] }).run();
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
chain.setLink({ href }).run();
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
insertImage: (src, alt) => editor.chain().focus().setImage({ src, alt }).run(),
|
|
56
|
+
insertTable: (rows, cols) => editor.chain().focus().insertTable({ rows, cols, withHeaderRow: true }).run(),
|
|
57
|
+
subscribe: callback => {
|
|
58
|
+
editor.on('selectionUpdate', callback);
|
|
59
|
+
editor.on('transaction', callback);
|
|
60
|
+
return () => {
|
|
61
|
+
editor.off('selectionUpdate', callback);
|
|
62
|
+
editor.off('transaction', callback);
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function createRawApi(textareaRef, commit, labels) {
|
|
68
|
+
const run = (compute) => {
|
|
69
|
+
const el = textareaRef.current;
|
|
70
|
+
if (!el)
|
|
71
|
+
return;
|
|
72
|
+
const edit = compute(el.value, el.selectionStart, el.selectionEnd);
|
|
73
|
+
if (edit)
|
|
74
|
+
commit(edit);
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
mode: 'raw',
|
|
78
|
+
focus: () => textareaRef.current?.focus(),
|
|
79
|
+
// В raw-режиме разбор разметки под курсором не делаем — кнопки без checked-стейта.
|
|
80
|
+
isActive: () => false,
|
|
81
|
+
isHeadingActive: () => false,
|
|
82
|
+
toggle: id => run((value, start, end) => applyInlineToggle(id, value, start, end) ?? applyBlockToggle(id, value, start, end)),
|
|
83
|
+
toggleHeading: level => run((value, start, end) => applyHeading(value, start, end, level)),
|
|
84
|
+
setParagraph: () => run((value, start, end) => applyParagraph(value, start, end)),
|
|
85
|
+
getLinkHref: () => undefined,
|
|
86
|
+
getLinkTitle: () => undefined,
|
|
87
|
+
// В raw-режиме ссылка вставляется как сырой markdown-шаблон `[текст](href)` прямо в textarea
|
|
88
|
+
// (без модалки). href может быть пустым — пользователь дописывает URL в исходнике.
|
|
89
|
+
setLink: ({ href, title }) => {
|
|
90
|
+
run((value, start, end) => applyLink(value, start, end, href ?? '', title ?? '', labels.linkText));
|
|
91
|
+
},
|
|
92
|
+
insertImage: (src, alt) => run((value, start, end) => applyImage(value, start, end, src, alt)),
|
|
93
|
+
insertTable: (rows, cols) => run((value, start, end) => applyTable(value, start, end, rows, cols, labels.tableColumn)),
|
|
94
|
+
subscribe: () => () => { },
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ValueOf, WithSupportProps } from '@cloud-ru/ds-utils';
|
|
2
|
+
import { Components } from 'react-markdown';
|
|
3
|
+
import { PluggableList } from 'unified';
|
|
4
|
+
import { HEADING_LEVEL, TOOLBAR_ITEM } from './constants.js';
|
|
5
|
+
export type ToolbarItemId = ValueOf<typeof TOOLBAR_ITEM>;
|
|
6
|
+
export type HeadingLevel = ValueOf<typeof HEADING_LEVEL>;
|
|
7
|
+
export type MarkdownProps = WithSupportProps<{
|
|
8
|
+
/** Markdown-исходник */
|
|
9
|
+
value: string;
|
|
10
|
+
/** Доп. remark-плагины */
|
|
11
|
+
remarkPlugins?: PluggableList;
|
|
12
|
+
/** Доп. rehype-плагины */
|
|
13
|
+
rehypePlugins?: PluggableList;
|
|
14
|
+
/** Override рендера элементов */
|
|
15
|
+
components?: Components;
|
|
16
|
+
/** По умолчанию true — сырой HTML вырезается */
|
|
17
|
+
skipHtml?: boolean;
|
|
18
|
+
/** Колбэк кнопки Copy на code-блоке */
|
|
19
|
+
onCodeCopyClick?(code: string): void;
|
|
20
|
+
/** CSS-класс корневого элемента. */
|
|
21
|
+
className?: string;
|
|
22
|
+
}>;
|
|
23
|
+
export type MarkdownEditorProps = WithSupportProps<{
|
|
24
|
+
/** Controlled markdown */
|
|
25
|
+
value?: string;
|
|
26
|
+
/** Uncontrolled */
|
|
27
|
+
defaultValue?: string;
|
|
28
|
+
/** Колбэк изменения markdown. Вызывается с дебаунсом `ON_CHANGE_DEBOUNCE_MS` после остановки ввода. */
|
|
29
|
+
onChange?(markdown: string): void;
|
|
30
|
+
/** Controlled preview-режим: показывает форматированный WYSIWYG с активным тулбаром. Выключен — редактирование «сырого» markdown-текста в textarea */
|
|
31
|
+
preview?: boolean;
|
|
32
|
+
/** Uncontrolled */
|
|
33
|
+
defaultPreview?: boolean;
|
|
34
|
+
/** Колбэк переключения Preview-тогла в шапке */
|
|
35
|
+
onPreviewChange?(preview: boolean): void;
|
|
36
|
+
/** Подпись в шапке справа. По умолчанию — `Markdown field`. `false` — без подписи. */
|
|
37
|
+
label?: string | false;
|
|
38
|
+
/** Текст тогла Preview в шапке. По умолчанию `Preview`. */
|
|
39
|
+
previewLabel?: string;
|
|
40
|
+
/** Скрыть шапку с тоглом Preview и подписью */
|
|
41
|
+
hideHeader?: boolean;
|
|
42
|
+
/** Placeholder пустого редактора. */
|
|
43
|
+
placeholder?: string;
|
|
44
|
+
/** Нативная проверка орфографии (`spellcheck`). По умолчанию `true`. */
|
|
45
|
+
spellCheck?: boolean;
|
|
46
|
+
/** Может ли пользователь менять размеры поля перетаскиванием уголка. По умолчанию `true`. */
|
|
47
|
+
resizable?: boolean;
|
|
48
|
+
/** Какие кнопки тулбара показать. false — без тулбара */
|
|
49
|
+
toolbar?: false | ToolbarItemId[];
|
|
50
|
+
/** CSS-класс корневого элемента. */
|
|
51
|
+
className?: string;
|
|
52
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|