@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.
Files changed (212) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/README.md +273 -0
  4. package/dist/cjs/components/Markdown/CodeBlock.d.ts +9 -0
  5. package/dist/cjs/components/Markdown/CodeBlock.js +58 -0
  6. package/dist/cjs/components/Markdown/Markdown.d.ts +2 -0
  7. package/dist/cjs/components/Markdown/Markdown.js +25 -0
  8. package/dist/cjs/components/Markdown/index.d.ts +1 -0
  9. package/dist/cjs/components/Markdown/index.js +17 -0
  10. package/dist/cjs/components/Markdown/styles.module.css +205 -0
  11. package/dist/cjs/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
  12. package/dist/cjs/components/MarkdownEditor/MarkdownEditor.js +176 -0
  13. package/dist/cjs/components/MarkdownEditor/index.d.ts +1 -0
  14. package/dist/cjs/components/MarkdownEditor/index.js +17 -0
  15. package/dist/cjs/components/MarkdownEditor/styles.module.css +273 -0
  16. package/dist/cjs/components/Toolbar/Toolbar.d.ts +9 -0
  17. package/dist/cjs/components/Toolbar/Toolbar.js +173 -0
  18. package/dist/cjs/components/Toolbar/constants.d.ts +13 -0
  19. package/dist/cjs/components/Toolbar/constants.js +40 -0
  20. package/dist/cjs/components/Toolbar/hooks/index.d.ts +2 -0
  21. package/dist/cjs/components/Toolbar/hooks/index.js +18 -0
  22. package/dist/cjs/components/Toolbar/hooks/useToolbarHotkeys.d.ts +21 -0
  23. package/dist/cjs/components/Toolbar/hooks/useToolbarHotkeys.js +59 -0
  24. package/dist/cjs/components/Toolbar/hooks/useToolbarOverflow.d.ts +14 -0
  25. package/dist/cjs/components/Toolbar/hooks/useToolbarOverflow.js +87 -0
  26. package/dist/cjs/components/Toolbar/index.d.ts +2 -0
  27. package/dist/cjs/components/Toolbar/index.js +20 -0
  28. package/dist/cjs/components/Toolbar/styles.module.css +17 -0
  29. package/dist/cjs/components/index.d.ts +2 -0
  30. package/dist/cjs/components/index.js +20 -0
  31. package/dist/cjs/constants.d.ts +65 -0
  32. package/dist/cjs/constants.js +67 -0
  33. package/dist/cjs/helperComponents/ButtonHeading/ButtonHeading.d.ts +6 -0
  34. package/dist/cjs/helperComponents/ButtonHeading/ButtonHeading.js +61 -0
  35. package/dist/cjs/helperComponents/ButtonHeading/index.d.ts +1 -0
  36. package/dist/cjs/helperComponents/ButtonHeading/index.js +17 -0
  37. package/dist/cjs/helperComponents/ButtonHeading/styles.module.css +3 -0
  38. package/dist/cjs/helperComponents/Buttons/Buttons.d.ts +10 -0
  39. package/dist/cjs/helperComponents/Buttons/Buttons.js +21 -0
  40. package/dist/cjs/helperComponents/Buttons/index.d.ts +1 -0
  41. package/dist/cjs/helperComponents/Buttons/index.js +17 -0
  42. package/dist/cjs/helperComponents/Buttons/styles.module.css +17 -0
  43. package/dist/cjs/helperComponents/Modals/CustomizeTableModal.d.ts +8 -0
  44. package/dist/cjs/helperComponents/Modals/CustomizeTableModal.js +39 -0
  45. package/dist/cjs/helperComponents/Modals/ImageModal.d.ts +7 -0
  46. package/dist/cjs/helperComponents/Modals/ImageModal.js +44 -0
  47. package/dist/cjs/helperComponents/Modals/LinkModal.d.ts +13 -0
  48. package/dist/cjs/helperComponents/Modals/LinkModal.js +42 -0
  49. package/dist/cjs/helperComponents/Modals/index.d.ts +3 -0
  50. package/dist/cjs/helperComponents/Modals/index.js +19 -0
  51. package/dist/cjs/helperComponents/Modals/styles.module.css +17 -0
  52. package/dist/cjs/helperComponents/PrivateButton/PrivateButton.d.ts +17 -0
  53. package/dist/cjs/helperComponents/PrivateButton/PrivateButton.js +27 -0
  54. package/dist/cjs/helperComponents/PrivateButton/index.d.ts +1 -0
  55. package/dist/cjs/helperComponents/PrivateButton/index.js +17 -0
  56. package/dist/cjs/helperComponents/PrivateButton/styles.module.css +140 -0
  57. package/dist/cjs/helperComponents/TableSelectItem/TableSelectItem.d.ts +11 -0
  58. package/dist/cjs/helperComponents/TableSelectItem/TableSelectItem.js +12 -0
  59. package/dist/cjs/helperComponents/TableSelectItem/index.d.ts +1 -0
  60. package/dist/cjs/helperComponents/TableSelectItem/index.js +17 -0
  61. package/dist/cjs/helperComponents/TableSelectItem/styles.module.css +101 -0
  62. package/dist/cjs/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.d.ts +4 -0
  63. package/dist/cjs/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.js +27 -0
  64. package/dist/cjs/helperComponents/TableSelectSettingsGrid/index.d.ts +1 -0
  65. package/dist/cjs/helperComponents/TableSelectSettingsGrid/index.js +17 -0
  66. package/dist/cjs/helperComponents/TableSelectSettingsGrid/styles.module.css +54 -0
  67. package/dist/cjs/helperComponents/index.d.ts +6 -0
  68. package/dist/cjs/helperComponents/index.js +22 -0
  69. package/dist/cjs/index.d.ts +4 -0
  70. package/dist/cjs/index.js +20 -0
  71. package/dist/cjs/locale/index.d.ts +199 -0
  72. package/dist/cjs/locale/index.js +104 -0
  73. package/dist/cjs/lowlight.d.ts +14 -0
  74. package/dist/cjs/lowlight.js +35 -0
  75. package/dist/cjs/mixins.css +0 -0
  76. package/dist/cjs/package.json +3 -0
  77. package/dist/cjs/rawMarkdownCommands.d.ts +16 -0
  78. package/dist/cjs/rawMarkdownCommands.js +145 -0
  79. package/dist/cjs/style.css +875 -0
  80. package/dist/cjs/styles/syntax.module.css +47 -0
  81. package/dist/cjs/toolbarApi.d.ts +33 -0
  82. package/dist/cjs/toolbarApi.js +100 -0
  83. package/dist/cjs/types.d.ts +52 -0
  84. package/dist/cjs/types.js +2 -0
  85. package/dist/esm/components/Markdown/CodeBlock.d.ts +9 -0
  86. package/dist/esm/components/Markdown/CodeBlock.js +52 -0
  87. package/dist/esm/components/Markdown/Markdown.d.ts +2 -0
  88. package/dist/esm/components/Markdown/Markdown.js +19 -0
  89. package/dist/esm/components/Markdown/index.d.ts +1 -0
  90. package/dist/esm/components/Markdown/index.js +1 -0
  91. package/dist/esm/components/Markdown/styles.module.css +205 -0
  92. package/dist/esm/components/MarkdownEditor/MarkdownEditor.d.ts +2 -0
  93. package/dist/esm/components/MarkdownEditor/MarkdownEditor.js +170 -0
  94. package/dist/esm/components/MarkdownEditor/index.d.ts +1 -0
  95. package/dist/esm/components/MarkdownEditor/index.js +1 -0
  96. package/dist/esm/components/MarkdownEditor/styles.module.css +273 -0
  97. package/dist/esm/components/Toolbar/Toolbar.d.ts +9 -0
  98. package/dist/esm/components/Toolbar/Toolbar.js +167 -0
  99. package/dist/esm/components/Toolbar/constants.d.ts +13 -0
  100. package/dist/esm/components/Toolbar/constants.js +37 -0
  101. package/dist/esm/components/Toolbar/hooks/index.d.ts +2 -0
  102. package/dist/esm/components/Toolbar/hooks/index.js +2 -0
  103. package/dist/esm/components/Toolbar/hooks/useToolbarHotkeys.d.ts +21 -0
  104. package/dist/esm/components/Toolbar/hooks/useToolbarHotkeys.js +56 -0
  105. package/dist/esm/components/Toolbar/hooks/useToolbarOverflow.d.ts +14 -0
  106. package/dist/esm/components/Toolbar/hooks/useToolbarOverflow.js +84 -0
  107. package/dist/esm/components/Toolbar/index.d.ts +2 -0
  108. package/dist/esm/components/Toolbar/index.js +2 -0
  109. package/dist/esm/components/Toolbar/styles.module.css +17 -0
  110. package/dist/esm/components/index.d.ts +2 -0
  111. package/dist/esm/components/index.js +4 -0
  112. package/dist/esm/constants.d.ts +65 -0
  113. package/dist/esm/constants.js +61 -0
  114. package/dist/esm/helperComponents/ButtonHeading/ButtonHeading.d.ts +6 -0
  115. package/dist/esm/helperComponents/ButtonHeading/ButtonHeading.js +55 -0
  116. package/dist/esm/helperComponents/ButtonHeading/index.d.ts +1 -0
  117. package/dist/esm/helperComponents/ButtonHeading/index.js +1 -0
  118. package/dist/esm/helperComponents/ButtonHeading/styles.module.css +3 -0
  119. package/dist/esm/helperComponents/Buttons/Buttons.d.ts +10 -0
  120. package/dist/esm/helperComponents/Buttons/Buttons.js +13 -0
  121. package/dist/esm/helperComponents/Buttons/index.d.ts +1 -0
  122. package/dist/esm/helperComponents/Buttons/index.js +1 -0
  123. package/dist/esm/helperComponents/Buttons/styles.module.css +17 -0
  124. package/dist/esm/helperComponents/Modals/CustomizeTableModal.d.ts +8 -0
  125. package/dist/esm/helperComponents/Modals/CustomizeTableModal.js +33 -0
  126. package/dist/esm/helperComponents/Modals/ImageModal.d.ts +7 -0
  127. package/dist/esm/helperComponents/Modals/ImageModal.js +38 -0
  128. package/dist/esm/helperComponents/Modals/LinkModal.d.ts +13 -0
  129. package/dist/esm/helperComponents/Modals/LinkModal.js +36 -0
  130. package/dist/esm/helperComponents/Modals/index.d.ts +3 -0
  131. package/dist/esm/helperComponents/Modals/index.js +3 -0
  132. package/dist/esm/helperComponents/Modals/styles.module.css +17 -0
  133. package/dist/esm/helperComponents/PrivateButton/PrivateButton.d.ts +17 -0
  134. package/dist/esm/helperComponents/PrivateButton/PrivateButton.js +21 -0
  135. package/dist/esm/helperComponents/PrivateButton/index.d.ts +1 -0
  136. package/dist/esm/helperComponents/PrivateButton/index.js +1 -0
  137. package/dist/esm/helperComponents/PrivateButton/styles.module.css +140 -0
  138. package/dist/esm/helperComponents/TableSelectItem/TableSelectItem.d.ts +11 -0
  139. package/dist/esm/helperComponents/TableSelectItem/TableSelectItem.js +6 -0
  140. package/dist/esm/helperComponents/TableSelectItem/index.d.ts +1 -0
  141. package/dist/esm/helperComponents/TableSelectItem/index.js +1 -0
  142. package/dist/esm/helperComponents/TableSelectItem/styles.module.css +101 -0
  143. package/dist/esm/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.d.ts +4 -0
  144. package/dist/esm/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.js +21 -0
  145. package/dist/esm/helperComponents/TableSelectSettingsGrid/index.d.ts +1 -0
  146. package/dist/esm/helperComponents/TableSelectSettingsGrid/index.js +1 -0
  147. package/dist/esm/helperComponents/TableSelectSettingsGrid/styles.module.css +54 -0
  148. package/dist/esm/helperComponents/index.d.ts +6 -0
  149. package/dist/esm/helperComponents/index.js +6 -0
  150. package/dist/esm/index.d.ts +4 -0
  151. package/dist/esm/index.js +4 -0
  152. package/dist/esm/locale/index.d.ts +199 -0
  153. package/dist/esm/locale/index.js +101 -0
  154. package/dist/esm/lowlight.d.ts +14 -0
  155. package/dist/esm/lowlight.js +29 -0
  156. package/dist/esm/mixins.css +0 -0
  157. package/dist/esm/rawMarkdownCommands.d.ts +16 -0
  158. package/dist/esm/rawMarkdownCommands.js +135 -0
  159. package/dist/esm/style.css +875 -0
  160. package/dist/esm/styles/syntax.module.css +47 -0
  161. package/dist/esm/toolbarApi.d.ts +33 -0
  162. package/dist/esm/toolbarApi.js +96 -0
  163. package/dist/esm/types.d.ts +52 -0
  164. package/dist/esm/types.js +1 -0
  165. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  166. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  167. package/package.json +84 -0
  168. package/src/components/Markdown/CodeBlock.tsx +96 -0
  169. package/src/components/Markdown/Markdown.tsx +47 -0
  170. package/src/components/Markdown/index.ts +1 -0
  171. package/src/components/Markdown/styles.module.scss +105 -0
  172. package/src/components/MarkdownEditor/MarkdownEditor.tsx +322 -0
  173. package/src/components/MarkdownEditor/index.ts +1 -0
  174. package/src/components/MarkdownEditor/styles.module.scss +201 -0
  175. package/src/components/Toolbar/Toolbar.tsx +292 -0
  176. package/src/components/Toolbar/constants.tsx +63 -0
  177. package/src/components/Toolbar/hooks/index.ts +2 -0
  178. package/src/components/Toolbar/hooks/useToolbarHotkeys.ts +74 -0
  179. package/src/components/Toolbar/hooks/useToolbarOverflow.ts +102 -0
  180. package/src/components/Toolbar/index.ts +2 -0
  181. package/src/components/Toolbar/styles.module.scss +29 -0
  182. package/src/components/index.ts +4 -0
  183. package/src/constants.ts +67 -0
  184. package/src/helperComponents/ButtonHeading/ButtonHeading.tsx +100 -0
  185. package/src/helperComponents/ButtonHeading/index.ts +1 -0
  186. package/src/helperComponents/ButtonHeading/styles.module.scss +5 -0
  187. package/src/helperComponents/Buttons/Buttons.tsx +30 -0
  188. package/src/helperComponents/Buttons/index.ts +1 -0
  189. package/src/helperComponents/Buttons/styles.module.scss +26 -0
  190. package/src/helperComponents/Modals/CustomizeTableModal.tsx +82 -0
  191. package/src/helperComponents/Modals/ImageModal.tsx +84 -0
  192. package/src/helperComponents/Modals/LinkModal.tsx +92 -0
  193. package/src/helperComponents/Modals/index.ts +3 -0
  194. package/src/helperComponents/Modals/styles.module.scss +21 -0
  195. package/src/helperComponents/PrivateButton/PrivateButton.tsx +88 -0
  196. package/src/helperComponents/PrivateButton/index.ts +1 -0
  197. package/src/helperComponents/PrivateButton/styles.module.scss +77 -0
  198. package/src/helperComponents/TableSelectItem/TableSelectItem.tsx +43 -0
  199. package/src/helperComponents/TableSelectItem/index.ts +1 -0
  200. package/src/helperComponents/TableSelectItem/styles.module.scss +26 -0
  201. package/src/helperComponents/TableSelectSettingsGrid/TableSelectSettingsGrid.tsx +48 -0
  202. package/src/helperComponents/TableSelectSettingsGrid/index.ts +1 -0
  203. package/src/helperComponents/TableSelectSettingsGrid/styles.module.scss +65 -0
  204. package/src/helperComponents/index.ts +6 -0
  205. package/src/index.ts +4 -0
  206. package/src/locale/index.ts +105 -0
  207. package/src/lowlight.ts +30 -0
  208. package/src/mixins.scss +123 -0
  209. package/src/rawMarkdownCommands.ts +179 -0
  210. package/src/styles/syntax.module.scss +54 -0
  211. package/src/toolbarApi.ts +152 -0
  212. 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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,2 @@
1
+ import { MarkdownProps } from '../../types.js';
2
+ export declare function Markdown({ value, remarkPlugins, rehypePlugins, components, skipHtml, onCodeCopyClick, className, 'data-test-id': dataTestId, ...rest }: MarkdownProps): import("react/jsx-runtime").JSX.Element;
@@ -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;