@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/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 {};