@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';
|
|
4
|
+
import { RawEdit } from './rawMarkdownCommands';
|
|
5
|
+
import { HeadingLevel, ToolbarItemId } from './types';
|
|
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,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createWysiwygApi = createWysiwygApi;
|
|
4
|
+
exports.createRawApi = createRawApi;
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
const rawMarkdownCommands_1 = require("./rawMarkdownCommands");
|
|
7
|
+
const WYSIWYG_MARK = {
|
|
8
|
+
[constants_1.TOOLBAR_ITEM.Bold]: 'bold',
|
|
9
|
+
[constants_1.TOOLBAR_ITEM.Italic]: 'italic',
|
|
10
|
+
[constants_1.TOOLBAR_ITEM.Strikethrough]: 'strike',
|
|
11
|
+
[constants_1.TOOLBAR_ITEM.InlineCode]: 'code',
|
|
12
|
+
[constants_1.TOOLBAR_ITEM.BulletList]: 'bulletList',
|
|
13
|
+
[constants_1.TOOLBAR_ITEM.OrderedList]: 'orderedList',
|
|
14
|
+
[constants_1.TOOLBAR_ITEM.BlockQuote]: 'blockquote',
|
|
15
|
+
[constants_1.TOOLBAR_ITEM.BlockCode]: 'codeBlock',
|
|
16
|
+
};
|
|
17
|
+
function createWysiwygApi(editor) {
|
|
18
|
+
const toggleCommand = {
|
|
19
|
+
[constants_1.TOOLBAR_ITEM.Bold]: () => editor.chain().focus().toggleBold().run(),
|
|
20
|
+
[constants_1.TOOLBAR_ITEM.Italic]: () => editor.chain().focus().toggleItalic().run(),
|
|
21
|
+
[constants_1.TOOLBAR_ITEM.Strikethrough]: () => editor.chain().focus().toggleStrike().run(),
|
|
22
|
+
[constants_1.TOOLBAR_ITEM.InlineCode]: () => editor.chain().focus().toggleCode().run(),
|
|
23
|
+
[constants_1.TOOLBAR_ITEM.BulletList]: () => editor.chain().focus().toggleBulletList().run(),
|
|
24
|
+
[constants_1.TOOLBAR_ITEM.OrderedList]: () => editor.chain().focus().toggleOrderedList().run(),
|
|
25
|
+
[constants_1.TOOLBAR_ITEM.BlockQuote]: () => editor.chain().focus().toggleBlockquote().run(),
|
|
26
|
+
[constants_1.TOOLBAR_ITEM.BlockCode]: () => editor.chain().focus().toggleCodeBlock().run(),
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
mode: 'wysiwyg',
|
|
30
|
+
focus: () => editor.chain().focus().run(),
|
|
31
|
+
isActive: id => {
|
|
32
|
+
const mark = WYSIWYG_MARK[id];
|
|
33
|
+
return mark ? editor.isActive(mark) : false;
|
|
34
|
+
},
|
|
35
|
+
isHeadingActive: level => editor.isActive('heading', { level }),
|
|
36
|
+
toggle: id => toggleCommand[id]?.(),
|
|
37
|
+
toggleHeading: level => editor.chain().focus().toggleHeading({ level }).run(),
|
|
38
|
+
setParagraph: () => editor.chain().focus().setParagraph().run(),
|
|
39
|
+
getLinkHref: () => editor.getAttributes('link').href,
|
|
40
|
+
// Видимый текст ссылки = выделенный текст (для префилла поля «текст ссылки»).
|
|
41
|
+
getLinkTitle: () => {
|
|
42
|
+
const { from, to } = editor.state.selection;
|
|
43
|
+
return from === to ? undefined : editor.state.doc.textBetween(from, to);
|
|
44
|
+
},
|
|
45
|
+
setLink: ({ href, title }) => {
|
|
46
|
+
if (!href) {
|
|
47
|
+
editor.chain().focus().extendMarkRange('link').unsetLink().run();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const chain = editor.chain().focus().extendMarkRange('link');
|
|
51
|
+
// Нет выделения, но задан текст — вставляем текст-ссылку. Иначе оборачиваем выделение.
|
|
52
|
+
if (editor.state.selection.empty && title) {
|
|
53
|
+
chain.insertContent({ type: 'text', text: title, marks: [{ type: 'link', attrs: { href } }] }).run();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
chain.setLink({ href }).run();
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
insertImage: (src, alt) => editor.chain().focus().setImage({ src, alt }).run(),
|
|
60
|
+
insertTable: (rows, cols) => editor.chain().focus().insertTable({ rows, cols, withHeaderRow: true }).run(),
|
|
61
|
+
subscribe: callback => {
|
|
62
|
+
editor.on('selectionUpdate', callback);
|
|
63
|
+
editor.on('transaction', callback);
|
|
64
|
+
return () => {
|
|
65
|
+
editor.off('selectionUpdate', callback);
|
|
66
|
+
editor.off('transaction', callback);
|
|
67
|
+
};
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function createRawApi(textareaRef, commit, labels) {
|
|
72
|
+
const run = (compute) => {
|
|
73
|
+
const el = textareaRef.current;
|
|
74
|
+
if (!el)
|
|
75
|
+
return;
|
|
76
|
+
const edit = compute(el.value, el.selectionStart, el.selectionEnd);
|
|
77
|
+
if (edit)
|
|
78
|
+
commit(edit);
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
mode: 'raw',
|
|
82
|
+
focus: () => textareaRef.current?.focus(),
|
|
83
|
+
// В raw-режиме разбор разметки под курсором не делаем — кнопки без checked-стейта.
|
|
84
|
+
isActive: () => false,
|
|
85
|
+
isHeadingActive: () => false,
|
|
86
|
+
toggle: id => run((value, start, end) => (0, rawMarkdownCommands_1.applyInlineToggle)(id, value, start, end) ?? (0, rawMarkdownCommands_1.applyBlockToggle)(id, value, start, end)),
|
|
87
|
+
toggleHeading: level => run((value, start, end) => (0, rawMarkdownCommands_1.applyHeading)(value, start, end, level)),
|
|
88
|
+
setParagraph: () => run((value, start, end) => (0, rawMarkdownCommands_1.applyParagraph)(value, start, end)),
|
|
89
|
+
getLinkHref: () => undefined,
|
|
90
|
+
getLinkTitle: () => undefined,
|
|
91
|
+
// В raw-режиме ссылка вставляется как сырой markdown-шаблон `[текст](href)` прямо в textarea
|
|
92
|
+
// (без модалки). href может быть пустым — пользователь дописывает URL в исходнике.
|
|
93
|
+
setLink: ({ href, title }) => {
|
|
94
|
+
run((value, start, end) => (0, rawMarkdownCommands_1.applyLink)(value, start, end, href ?? '', title ?? '', labels.linkText));
|
|
95
|
+
},
|
|
96
|
+
insertImage: (src, alt) => run((value, start, end) => (0, rawMarkdownCommands_1.applyImage)(value, start, end, src, alt)),
|
|
97
|
+
insertTable: (rows, cols) => run((value, start, end) => (0, rawMarkdownCommands_1.applyTable)(value, start, end, rows, cols, labels.tableColumn)),
|
|
98
|
+
subscribe: () => () => { },
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -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';
|
|
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,9 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
type CodeBlockProps = {
|
|
3
|
+
/** `<code>`-элемент с подсветкой, который react-markdown передаёт внутрь `pre`. */
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
/** Колбэк на копирование. Получает сырой код блока. */
|
|
6
|
+
onCopyClick?(code: string): void;
|
|
7
|
+
};
|
|
8
|
+
export declare function CodeBlock({ children, onCopyClick }: CodeBlockProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from '@cloud-ru/ds-button';
|
|
3
|
+
import { CheckSVG, CopySVG } from '@cloud-ru/ds-icons/interface/system';
|
|
4
|
+
import { Scroll } from '@cloud-ru/ds-scroll';
|
|
5
|
+
import { copyToClipboard } from '@cloud-ru/ds-utils';
|
|
6
|
+
import cn from 'classnames';
|
|
7
|
+
import { Children, isValidElement, useRef, useState } from 'react';
|
|
8
|
+
import { TEST_IDS } from '../../constants.js';
|
|
9
|
+
import { markdownLocale } from '../../locale/index.js';
|
|
10
|
+
import styles from './styles.module.css';
|
|
11
|
+
const LANGUAGE_PATTERN = /language-([\w-]+)/;
|
|
12
|
+
const COPIED_RESET_MS = 1600;
|
|
13
|
+
/** Рекурсивно собирает текстовое содержимое узла — для копирования и подсчёта строк. */
|
|
14
|
+
function extractText(node) {
|
|
15
|
+
if (node === null || node === undefined || typeof node === 'boolean')
|
|
16
|
+
return '';
|
|
17
|
+
if (typeof node === 'string' || typeof node === 'number')
|
|
18
|
+
return String(node);
|
|
19
|
+
if (Array.isArray(node))
|
|
20
|
+
return node.map(extractText).join('');
|
|
21
|
+
if (isValidElement(node))
|
|
22
|
+
return extractText(node.props.children);
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
export function CodeBlock({ children, onCopyClick }) {
|
|
26
|
+
const { t } = markdownLocale.useTranslations();
|
|
27
|
+
const [copied, setCopied] = useState(false);
|
|
28
|
+
const resetTimer = useRef(null);
|
|
29
|
+
const codeElement = Children.toArray(children).find(child => isValidElement(child));
|
|
30
|
+
const codeProps = isValidElement(codeElement)
|
|
31
|
+
? codeElement.props
|
|
32
|
+
: { className: '', children };
|
|
33
|
+
const className = codeProps.className ?? '';
|
|
34
|
+
const codeChildren = codeProps.children;
|
|
35
|
+
const language = LANGUAGE_PATTERN.exec(className)?.[1];
|
|
36
|
+
const raw = extractText(codeChildren).replace(/\n$/, '');
|
|
37
|
+
const lineCount = raw.length === 0 ? 1 : raw.split('\n').length;
|
|
38
|
+
const markCopied = () => {
|
|
39
|
+
setCopied(true);
|
|
40
|
+
if (resetTimer.current)
|
|
41
|
+
clearTimeout(resetTimer.current);
|
|
42
|
+
resetTimer.current = setTimeout(() => setCopied(false), COPIED_RESET_MS);
|
|
43
|
+
};
|
|
44
|
+
const handleCopy = () => {
|
|
45
|
+
onCopyClick?.(raw);
|
|
46
|
+
// `copyToClipboard` из @cloud-ru/ds-utils сам падает на execCommand, если Clipboard API недоступен
|
|
47
|
+
// (insecure-context). Ждать результат не нужно: галочка показывается по факту клика.
|
|
48
|
+
copyToClipboard(raw);
|
|
49
|
+
markCopied();
|
|
50
|
+
};
|
|
51
|
+
return (_jsxs("div", { className: styles.codeBlock, children: [_jsxs("div", { className: styles.codeHeader, children: [_jsx("span", { className: styles.codeLang, children: language ?? 'text' }), _jsx(Button, { view: 'function', appearance: 'neutral', size: 'm', icon: copied ? _jsx(CheckSVG, {}) : _jsx(CopySVG, {}), className: styles.codeCopy, "data-test-id": TEST_IDS.viewerCodeCopy, "data-copied": copied || undefined, "aria-label": copied ? t('copied') : t('copy'), onClick: handleCopy })] }), _jsxs("div", { className: styles.codeBody, children: [_jsx("span", { className: styles.codeGutter, "aria-hidden": 'true', children: Array.from({ length: lineCount }, (_, i) => (_jsx("span", { className: styles.codeLineNo, children: i + 1 }, i))) }), _jsx(Scroll, { className: styles.codeScroll, overflow: { y: 'hidden' }, children: _jsx("pre", { className: styles.codePre, children: _jsx("code", { className: cn(styles.codeContent, className), children: codeChildren }) }) })] })] }));
|
|
52
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { extractSupportProps } from '@cloud-ru/ds-utils';
|
|
3
|
+
import cn from 'classnames';
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import ReactMarkdown from 'react-markdown';
|
|
6
|
+
import rehypeHighlight from 'rehype-highlight';
|
|
7
|
+
import remarkGfm from 'remark-gfm';
|
|
8
|
+
import { TEST_IDS } from '../../constants.js';
|
|
9
|
+
import syntaxStyles from '../../styles/syntax.module.css';
|
|
10
|
+
import { CodeBlock } from './CodeBlock.js';
|
|
11
|
+
import styles from './styles.module.css';
|
|
12
|
+
export function Markdown({ value, remarkPlugins, rehypePlugins, components, skipHtml = true, onCodeCopyClick, className, 'data-test-id': dataTestId = TEST_IDS.viewer, ...rest }) {
|
|
13
|
+
const supportProps = extractSupportProps(rest);
|
|
14
|
+
const mergedComponents = useMemo(() => ({
|
|
15
|
+
pre: ({ children }) => _jsx(CodeBlock, { onCopyClick: onCodeCopyClick, children: children }),
|
|
16
|
+
...components,
|
|
17
|
+
}), [components, onCodeCopyClick]);
|
|
18
|
+
return (_jsx("div", { ...supportProps, className: cn(styles.root, syntaxStyles.syntax, className), "data-test-id": dataTestId, children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm, ...(remarkPlugins ?? [])], rehypePlugins: [[rehypeHighlight, { detect: true }], ...(rehypePlugins ?? [])], skipHtml: skipHtml, components: mergedComponents, children: value }) }));
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Markdown.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Markdown.js';
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
.root{
|
|
2
|
+
box-sizing:border-box;
|
|
3
|
+
max-width:100%;
|
|
4
|
+
font-family:var(--sn-brand-font-fontFamily-regular-body, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface));
|
|
5
|
+
font-size:var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px));
|
|
6
|
+
line-height:var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px));
|
|
7
|
+
color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
|
|
8
|
+
}
|
|
9
|
+
.root p,
|
|
10
|
+
.root h1,
|
|
11
|
+
.root h2,
|
|
12
|
+
.root h3,
|
|
13
|
+
.root h4,
|
|
14
|
+
.root h5,
|
|
15
|
+
.root ul,
|
|
16
|
+
.root ol,
|
|
17
|
+
.root blockquote,
|
|
18
|
+
.root pre,
|
|
19
|
+
.root table,
|
|
20
|
+
.root hr,
|
|
21
|
+
.root img{
|
|
22
|
+
margin:0;
|
|
23
|
+
}
|
|
24
|
+
.root h1{
|
|
25
|
+
font-family:var(--sn-regular-headline-l-fontFamily, var(--sn-brand-font-fontFamily-regular-headline, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
|
|
26
|
+
font-weight:var(--sn-regular-headline-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-headline-l, var(--sn-brand-font-fontWeight-light-regular-headline-l, var(--sn-primitive-font-fontWeightValue-600, 600))));
|
|
27
|
+
line-height:var(--sn-regular-headline-l-lineHeight, var(--sn-density-typography-roleHeadline-lineHeightL, var(--sn-primitive-font-lineHeight-by40, 48px)));
|
|
28
|
+
font-size:var(--sn-regular-headline-l-fontSize, var(--sn-density-typography-roleHeadline-fontSizeL, var(--sn-primitive-font-fontSize-36, 36px)));
|
|
29
|
+
letter-spacing:var(--sn-regular-headline-l-letterSpacing, var(--sn-primitive-font-letterSpacing-xs, -0.5px));
|
|
30
|
+
paragraph-spacing:var(--sn-regular-headline-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize32, 16px));
|
|
31
|
+
}
|
|
32
|
+
.root h2{
|
|
33
|
+
font-family:var(--sn-regular-headline-m-fontFamily, var(--sn-brand-font-fontFamily-regular-headline, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
|
|
34
|
+
font-weight:var(--sn-regular-headline-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-headline-m, var(--sn-brand-font-fontWeight-light-regular-headline-m, var(--sn-primitive-font-fontWeightValue-600, 600))));
|
|
35
|
+
line-height:var(--sn-regular-headline-m-lineHeight, var(--sn-density-typography-roleHeadline-lineHeightM, var(--sn-primitive-font-lineHeight-by32, 40px)));
|
|
36
|
+
font-size:var(--sn-regular-headline-m-fontSize, var(--sn-density-typography-roleHeadline-fontSizeM, var(--sn-primitive-font-fontSize-32, 32px)));
|
|
37
|
+
letter-spacing:var(--sn-regular-headline-m-letterSpacing, var(--sn-primitive-font-letterSpacing-xs, -0.5px));
|
|
38
|
+
paragraph-spacing:var(--sn-regular-headline-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize28, 14px));
|
|
39
|
+
}
|
|
40
|
+
.root h3{
|
|
41
|
+
font-family:var(--sn-regular-headline-s-fontFamily, var(--sn-brand-font-fontFamily-regular-headline, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
|
|
42
|
+
font-weight:var(--sn-regular-headline-s-fontWeight, var(--sn-theme-typography-fontWeight-regular-headline-s, var(--sn-brand-font-fontWeight-light-regular-headline-s, var(--sn-primitive-font-fontWeightValue-600, 600))));
|
|
43
|
+
line-height:var(--sn-regular-headline-s-lineHeight, var(--sn-density-typography-roleHeadline-lineHeightS, var(--sn-primitive-font-lineHeight-by24, 32px)));
|
|
44
|
+
font-size:var(--sn-regular-headline-s-fontSize, var(--sn-density-typography-roleHeadline-fontSizeS, var(--sn-primitive-font-fontSize-24, 24px)));
|
|
45
|
+
letter-spacing:var(--sn-regular-headline-s-letterSpacing, var(--sn-primitive-font-letterSpacing-xs, -0.5px));
|
|
46
|
+
paragraph-spacing:var(--sn-regular-headline-s-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize24, 12px));
|
|
47
|
+
}
|
|
48
|
+
.root h4{
|
|
49
|
+
font-family:var(--sn-regular-title-l-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
|
|
50
|
+
font-weight:var(--sn-regular-title-l-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-l, var(--sn-brand-font-fontWeight-light-regular-title-l, var(--sn-primitive-font-fontWeightValue-600, 600))));
|
|
51
|
+
line-height:var(--sn-regular-title-l-lineHeight, var(--sn-density-typography-roleTitle-lineHeightL, var(--sn-primitive-font-lineHeight-by20, 28px)));
|
|
52
|
+
font-size:var(--sn-regular-title-l-fontSize, var(--sn-density-typography-roleTitle-fontSizeL, var(--sn-primitive-font-fontSize-20, 20px)));
|
|
53
|
+
letter-spacing:var(--sn-regular-title-l-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
|
|
54
|
+
paragraph-spacing:var(--sn-regular-title-l-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize20, 10px));
|
|
55
|
+
}
|
|
56
|
+
.root h5{
|
|
57
|
+
font-family:var(--sn-regular-title-m-fontFamily, var(--sn-brand-font-fontFamily-regular-title, var(--sn-primitive-fontFamily-brandA-sans, SB Sans Interface)));
|
|
58
|
+
font-weight:var(--sn-regular-title-m-fontWeight, var(--sn-theme-typography-fontWeight-regular-title-m, var(--sn-brand-font-fontWeight-light-regular-title-m, var(--sn-primitive-font-fontWeightValue-600, 600))));
|
|
59
|
+
line-height:var(--sn-regular-title-m-lineHeight, var(--sn-density-typography-roleTitle-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px)));
|
|
60
|
+
font-size:var(--sn-regular-title-m-fontSize, var(--sn-density-typography-roleTitle-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px)));
|
|
61
|
+
letter-spacing:var(--sn-regular-title-m-letterSpacing, var(--sn-primitive-font-letterSpacing-l, 0.15px));
|
|
62
|
+
paragraph-spacing:var(--sn-regular-title-m-paragraphSpacing, var(--sn-primitive-font-paragraphSpacing-byFontSize16, 8px));
|
|
63
|
+
}
|
|
64
|
+
.root ul,
|
|
65
|
+
.root ol{
|
|
66
|
+
padding-left:var(--sn-primitive-dimension-24, 24px);
|
|
67
|
+
}
|
|
68
|
+
.root blockquote{
|
|
69
|
+
padding:var(--sn-markdown-anatomy-size-syntax-quote-wrapper-paddingVertical, var(--sn-primitive-dimension-8, 8px)) var(--sn-markdown-anatomy-size-syntax-quote-wrapper-paddingHorizontal, var(--sn-primitive-dimension-8, 8px));
|
|
70
|
+
border-left:var(--sn-markdown-anatomy-size-syntax-quote-wrapper-borderWidth, var(--sn-primitive-strokeWeight-strokeSemiBold, 2px)) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
71
|
+
color:var(--sn-theme-color-available-version-textMain, var(--sn-brand-color-text-version-main, #41424e));
|
|
72
|
+
background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
73
|
+
}
|
|
74
|
+
.root code{
|
|
75
|
+
min-height:var(--sn-markdown-anatomy-size-syntax-inlineCode-minHeight, var(--sn-primitive-dimension-20, 20px));
|
|
76
|
+
padding:0 var(--sn-markdown-anatomy-size-syntax-inlineCode-paddingHorizontal, var(--sn-primitive-dimension-4, 4px));
|
|
77
|
+
border-radius:var(--sn-markdown-anatomy-size-syntax-inlineCode-borderRadius, var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px)));
|
|
78
|
+
font-family:var(--sn-brand-font-fontFamily-mono-body, var(--sn-primitive-fontFamily-brandA-mono, SB Sans Text Mono));
|
|
79
|
+
background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
80
|
+
}
|
|
81
|
+
.root a{
|
|
82
|
+
color:var(--sn-theme-color-neutral-accent, var(--sn-brand-color-neutral-55, var(--sn-primitive-color-gray-55, #8b8fa7)));
|
|
83
|
+
text-decoration:underline;
|
|
84
|
+
}
|
|
85
|
+
.root table{
|
|
86
|
+
border-collapse:collapse;
|
|
87
|
+
width:100%;
|
|
88
|
+
}
|
|
89
|
+
.root th,
|
|
90
|
+
.root td{
|
|
91
|
+
min-height:var(--sn-markdown-anatomy-size-syntax-table-tableCell-minHeight, var(--sn-primitive-dimension-40, 40px));
|
|
92
|
+
padding:var(--sn-markdown-anatomy-size-syntax-table-tableCell-paddingVertical, var(--sn-primitive-dimension-8, 8px)) var(--sn-markdown-anatomy-size-syntax-table-tableCell-paddingHorizontal, var(--sn-primitive-dimension-16, 16px));
|
|
93
|
+
border-bottom:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
94
|
+
text-align:left;
|
|
95
|
+
}
|
|
96
|
+
.root th{
|
|
97
|
+
font-weight:600;
|
|
98
|
+
background:var(--sn-theme-color-neutral-decorTransparent, var(--sn-brand-color-neutral-transparent-forLightMode, rgba(124, 131, 182, 0.0784313725)));
|
|
99
|
+
}
|
|
100
|
+
.root > *:not(:first-child){
|
|
101
|
+
margin-top:10px;
|
|
102
|
+
}
|
|
103
|
+
.root > ul:not(:first-child),
|
|
104
|
+
.root > ol:not(:first-child){
|
|
105
|
+
margin-top:5px;
|
|
106
|
+
}
|
|
107
|
+
.root > h1:not(:first-child){
|
|
108
|
+
margin-top:var(--sn-markdown-anatomy-size-syntax-headings-h1-paddingTop, var(--sn-primitive-dimension-20, 20px));
|
|
109
|
+
}
|
|
110
|
+
.root > h2:not(:first-child){
|
|
111
|
+
margin-top:18px;
|
|
112
|
+
}
|
|
113
|
+
.root > h3:not(:first-child){
|
|
114
|
+
margin-top:var(--sn-markdown-anatomy-size-syntax-headings-h3-paddingTop, var(--sn-primitive-dimension-16, 16px));
|
|
115
|
+
}
|
|
116
|
+
.root > h4:not(:first-child){
|
|
117
|
+
margin-top:14px;
|
|
118
|
+
}
|
|
119
|
+
.root > h5:not(:first-child){
|
|
120
|
+
margin-top:var(--sn-markdown-anatomy-size-syntax-headings-h5-paddingTop, var(--sn-primitive-dimension-12, 12px));
|
|
121
|
+
}
|
|
122
|
+
.root > blockquote:not(:first-child){
|
|
123
|
+
margin-top:5px;
|
|
124
|
+
}
|
|
125
|
+
.root > pre:not(:first-child){
|
|
126
|
+
margin-top:5px;
|
|
127
|
+
}
|
|
128
|
+
.root > table:not(:first-child){
|
|
129
|
+
margin-top:5px;
|
|
130
|
+
}
|
|
131
|
+
.root > img:not(:first-child){
|
|
132
|
+
margin-top:5px;
|
|
133
|
+
}
|
|
134
|
+
.root > hr:not(:first-child){
|
|
135
|
+
margin-top:10px;
|
|
136
|
+
}
|
|
137
|
+
.root .codeBlock{
|
|
138
|
+
overflow:hidden;
|
|
139
|
+
border:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
140
|
+
border-radius:var(--sn-density-radius-2xs, var(--sn-primitive-dimension-4, 4px));
|
|
141
|
+
background:var(--sn-theme-color-neutral-background2Level, var(--sn-brand-color-neutral-99, var(--sn-primitive-color-gray-99, #ffffff)));
|
|
142
|
+
}
|
|
143
|
+
.root .codeHeader{
|
|
144
|
+
display:flex;
|
|
145
|
+
gap:var(--sn-primitive-dimension-8, 8px);
|
|
146
|
+
align-items:center;
|
|
147
|
+
justify-content:space-between;
|
|
148
|
+
padding:var(--sn-primitive-dimension-6, 6px) var(--sn-primitive-dimension-12, 12px);
|
|
149
|
+
border-bottom:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
150
|
+
}
|
|
151
|
+
.root .codeLang{
|
|
152
|
+
font-family:var(--sn-brand-font-fontFamily-mono-body, var(--sn-primitive-fontFamily-brandA-mono, SB Sans Text Mono));
|
|
153
|
+
font-size:var(--sn-density-typography-roleBody-fontSizeS, var(--sn-primitive-font-fontSize-14, 14px));
|
|
154
|
+
line-height:var(--sn-density-typography-roleBody-lineHeightS, var(--sn-primitive-font-lineHeight-by14, 20px));
|
|
155
|
+
color:var(--sn-theme-color-available-version-textSecondary, var(--sn-brand-color-text-version-secondary, rgba(65, 66, 78, 0.8)));
|
|
156
|
+
text-transform:lowercase;
|
|
157
|
+
}
|
|
158
|
+
.root .codeCopy[data-copied]{
|
|
159
|
+
color:var(--sn-theme-color-green-text, var(--sn-primitive-color-green-45, #438b4b));
|
|
160
|
+
}
|
|
161
|
+
.root .codeBody{
|
|
162
|
+
display:flex;
|
|
163
|
+
max-width:100%;
|
|
164
|
+
}
|
|
165
|
+
.root .codeGutter{
|
|
166
|
+
-webkit-user-select:none;
|
|
167
|
+
-moz-user-select:none;
|
|
168
|
+
user-select:none;
|
|
169
|
+
display:flex;
|
|
170
|
+
flex-direction:column;
|
|
171
|
+
flex-shrink:0;
|
|
172
|
+
padding:var(--sn-primitive-dimension-12, 12px) 0;
|
|
173
|
+
border-right:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
174
|
+
font-family:var(--sn-brand-font-fontFamily-mono-body, var(--sn-primitive-fontFamily-brandA-mono, SB Sans Text Mono));
|
|
175
|
+
font-size:var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px));
|
|
176
|
+
line-height:var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px));
|
|
177
|
+
color:var(--sn-theme-color-available-version-textTertiary, var(--sn-brand-color-text-version-tertiary, rgba(65, 66, 78, 0.5490196078)));
|
|
178
|
+
text-align:right;
|
|
179
|
+
}
|
|
180
|
+
.root .codeLineNo{
|
|
181
|
+
padding:0 var(--sn-primitive-dimension-12, 12px);
|
|
182
|
+
}
|
|
183
|
+
.root .codeScroll{
|
|
184
|
+
flex:1;
|
|
185
|
+
margin:0;
|
|
186
|
+
}
|
|
187
|
+
.root .codePre{
|
|
188
|
+
margin:0;
|
|
189
|
+
padding:var(--sn-primitive-dimension-12, 12px);
|
|
190
|
+
}
|
|
191
|
+
.root .codeContent{
|
|
192
|
+
min-height:0;
|
|
193
|
+
padding:0;
|
|
194
|
+
font-size:var(--sn-density-typography-roleBody-fontSizeM, var(--sn-primitive-font-fontSize-16, 16px));
|
|
195
|
+
line-height:var(--sn-density-typography-roleBody-lineHeightM, var(--sn-primitive-font-lineHeight-by16, 24px));
|
|
196
|
+
background:transparent;
|
|
197
|
+
}
|
|
198
|
+
.root hr{
|
|
199
|
+
border:0;
|
|
200
|
+
border-top:var(--sn-primitive-strokeWeight-strokeRegular, 1px) solid var(--sn-theme-color-available-borderColor, var(--sn-brand-color-state-neutralBorder-forLightMode-default-borderColor, rgba(159, 166, 198, 0.3019607843)));
|
|
201
|
+
}
|
|
202
|
+
.root img{
|
|
203
|
+
max-width:100%;
|
|
204
|
+
height:auto;
|
|
205
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { MarkdownEditorProps } from '../../types.js';
|
|
2
|
+
export declare function MarkdownEditor({ value, defaultValue, onChange, preview, defaultPreview, onPreviewChange, label, previewLabel, hideHeader, placeholder, spellCheck, resizable, toolbar, className, 'data-test-id': dataTestId, ...rest }: MarkdownEditorProps): import("react/jsx-runtime").JSX.Element;
|