@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,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';
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;
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MarkdownEditor = MarkdownEditor;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const button_1 = require("@cloud-ru/ds-button");
9
+ const fields_1 = require("@cloud-ru/ds-fields");
10
+ const system_1 = require("@cloud-ru/ds-icons/interface/system");
11
+ const scroll_1 = require("@cloud-ru/ds-scroll");
12
+ const toggles_1 = require("@cloud-ru/ds-toggles");
13
+ const utils_1 = require("@cloud-ru/ds-utils");
14
+ const extension_code_block_lowlight_1 = __importDefault(require("@tiptap/extension-code-block-lowlight"));
15
+ const extension_image_1 = require("@tiptap/extension-image");
16
+ const extension_placeholder_1 = __importDefault(require("@tiptap/extension-placeholder"));
17
+ const extension_table_1 = require("@tiptap/extension-table");
18
+ const extension_table_cell_1 = require("@tiptap/extension-table-cell");
19
+ const extension_table_header_1 = require("@tiptap/extension-table-header");
20
+ const extension_table_row_1 = require("@tiptap/extension-table-row");
21
+ const markdown_1 = require("@tiptap/markdown");
22
+ const react_1 = require("@tiptap/react");
23
+ const starter_kit_1 = __importDefault(require("@tiptap/starter-kit"));
24
+ const classnames_1 = __importDefault(require("classnames"));
25
+ const react_2 = require("react");
26
+ const react_textarea_autosize_1 = __importDefault(require("react-textarea-autosize"));
27
+ const constants_1 = require("../../constants");
28
+ const locale_1 = require("../../locale");
29
+ const lowlight_1 = require("../../lowlight");
30
+ const syntax_module_scss_1 = __importDefault(require('../../styles/syntax.module.css'));
31
+ const toolbarApi_1 = require("../../toolbarApi");
32
+ const Toolbar_1 = require("../Toolbar");
33
+ const styles_module_scss_1 = __importDefault(require('./styles.module.css'));
34
+ function MarkdownEditor({ value, defaultValue, onChange, preview, defaultPreview, onPreviewChange, label = 'Markdown field', previewLabel = 'Preview', hideHeader = false, placeholder, spellCheck = true, resizable = true, toolbar, className, 'data-test-id': dataTestId = constants_1.TEST_IDS.editor, ...rest }) {
35
+ const supportProps = (0, utils_1.extractSupportProps)(rest);
36
+ const { t } = locale_1.markdownLocale.useTranslations();
37
+ // onChange не передаём в useValueControl: внутреннее значение обновляется сразу (uncontrolled
38
+ // рендер, видимость clear), а наружу onChange уходит с дебаунсом ON_CHANGE_DEBOUNCE_MS.
39
+ const [currentValue, setValue] = (0, utils_1.useValueControl)({ value, defaultValue });
40
+ const latestMarkdown = (0, react_2.useRef)(currentValue ?? '');
41
+ const textareaRef = (0, react_2.useRef)(null);
42
+ const editorContentRef = (0, react_2.useRef)(null);
43
+ const emitChange = (0, utils_1.useDebounce)(() => onChange?.(latestMarkdown.current), constants_1.ON_CHANGE_DEBOUNCE_MS);
44
+ const [previewMode, setPreview] = (0, utils_1.useValueControl)({
45
+ value: preview,
46
+ defaultValue: defaultPreview ?? false,
47
+ onChange: onPreviewChange,
48
+ });
49
+ const [previewFocusVisible, setPreviewFocusVisible] = (0, react_2.useState)(false);
50
+ const [previewHover, setPreviewHover] = (0, react_2.useState)(false);
51
+ const extensions = (0, react_2.useMemo)(() => [
52
+ starter_kit_1.default.configure({
53
+ codeBlock: false,
54
+ link: { openOnClick: true },
55
+ }),
56
+ markdown_1.Markdown,
57
+ extension_placeholder_1.default.configure({ placeholder: placeholder ?? '' }),
58
+ extension_table_1.Table.configure({ resizable: true }),
59
+ extension_table_row_1.TableRow,
60
+ extension_table_header_1.TableHeader,
61
+ extension_table_cell_1.TableCell,
62
+ extension_code_block_lowlight_1.default.configure({ lowlight: lowlight_1.lowlight }),
63
+ // Ресайз картинок не включаем: контент сериализуется в markdown (`![alt](src)`),
64
+ // а синтаксис markdown не хранит ширину/высоту — размер всё равно терялся бы на round-trip.
65
+ extension_image_1.Image,
66
+ ], [placeholder]);
67
+ const editor = (0, react_1.useEditor)({
68
+ extensions,
69
+ content: currentValue ?? '',
70
+ // Начальное значение — markdown-строка, парсим её в rich-узлы (а не как HTML/text).
71
+ contentType: 'markdown',
72
+ immediatelyRender: false,
73
+ onUpdate({ editor }) {
74
+ const markdown = editor.getMarkdown();
75
+ latestMarkdown.current = markdown;
76
+ setValue(markdown);
77
+ emitChange();
78
+ },
79
+ }, [extensions]);
80
+ (0, react_2.useEffect)(() => {
81
+ if (!editor || value === undefined) {
82
+ return;
83
+ }
84
+ // Во время ввода не перетираем контент (иначе курсор прыгает на конец) —
85
+ // синхронизируем только внешние изменения value, пока редактор не в фокусе.
86
+ if (editor.isFocused) {
87
+ return;
88
+ }
89
+ if (editor.getMarkdown() === value) {
90
+ return;
91
+ }
92
+ editor.commands.setContent(value, { contentType: 'markdown' });
93
+ }, [editor, value]);
94
+ (0, react_2.useEffect)(() => {
95
+ // При переходе raw → preview подтягиваем в TipTap последний markdown,
96
+ // набранный в textarea (latestMarkdown держит актуальное значение обоих режимов).
97
+ if (!editor || !previewMode) {
98
+ return;
99
+ }
100
+ const markdown = latestMarkdown.current;
101
+ if (editor.getMarkdown() === markdown) {
102
+ return;
103
+ }
104
+ editor.commands.setContent(markdown, { contentType: 'markdown' });
105
+ }, [editor, previewMode]);
106
+ // Toolbar форматирует WYSIWYG в preview-режиме; в raw-режиме (textarea) он виден, но
107
+ // кнопки вставляют markdown-разметку. `toolbar === false` прячет тулбар целиком.
108
+ const toolbarItems = toolbar === false ? null : (toolbar ?? Toolbar_1.DEFAULT_TOOLBAR);
109
+ const showHeader = !hideHeader;
110
+ const hasValue = Boolean(currentValue && currentValue.length > 0);
111
+ const handleRawValueChange = (0, react_2.useCallback)((e) => {
112
+ const markdown = e.target.value;
113
+ latestMarkdown.current = markdown;
114
+ setValue(markdown);
115
+ emitChange();
116
+ }, [emitChange, setValue]);
117
+ // Применяет результат raw-команды тулбара к textarea: новый текст + восстановление выделения.
118
+ const applyRawEdit = (0, react_2.useCallback)((edit) => {
119
+ latestMarkdown.current = edit.text;
120
+ setValue(edit.text);
121
+ emitChange();
122
+ // Восстанавливаем фокус и выделение после того, как React применит новое значение textarea.
123
+ if ((0, utils_1.isBrowser)()) {
124
+ requestAnimationFrame(() => {
125
+ const el = textareaRef.current;
126
+ if (!el) {
127
+ return;
128
+ }
129
+ el.focus();
130
+ el.setSelectionRange(edit.selStart, edit.selEnd);
131
+ });
132
+ }
133
+ }, [setValue, emitChange]);
134
+ // Тулбар работает в обоих режимах: WYSIWYG (TipTap) в preview, markdown-исходник (textarea) — в raw.
135
+ const toolbarApi = (0, react_2.useMemo)(() => {
136
+ if (previewMode) {
137
+ return editor ? (0, toolbarApi_1.createWysiwygApi)(editor) : null;
138
+ }
139
+ return (0, toolbarApi_1.createRawApi)(textareaRef, applyRawEdit, {
140
+ linkText: t('linkText'),
141
+ tableColumn: index => t('table.column', { index }),
142
+ });
143
+ }, [previewMode, editor, applyRawEdit, t]);
144
+ const handleClearButtonClick = (0, react_2.useCallback)(() => {
145
+ latestMarkdown.current = '';
146
+ setValue('');
147
+ emitChange();
148
+ editor?.commands.clearContent(true);
149
+ textareaRef.current?.focus();
150
+ }, [editor, emitChange, setValue]);
151
+ const handlePreviewFocus = (0, react_2.useCallback)((event) => {
152
+ setPreviewFocusVisible(event.target.matches(':focus-visible'));
153
+ }, []);
154
+ const handlePreviewBlur = (0, react_2.useCallback)(() => setPreviewFocusVisible(false), []);
155
+ // Клик в пустую зону поля (ниже контента, когда поле растянуто ресайзом, но контент короткий)
156
+ // переводит фокус в активный инпут и ставит курсор в конец — паритет с FieldTextArea, где
157
+ // контент сам не заполняет всю высоту. Клики по самому инпуту/кнопкам/скроллбару не трогаем.
158
+ const handleContentClick = (0, react_2.useCallback)((event) => {
159
+ const textarea = textareaRef.current;
160
+ const target = event.target;
161
+ // Клик по самому инпуту (textarea / WYSIWYG-контейнеру) обрабатывается нативно, фокус не форвардим.
162
+ if (target === textarea || editorContentRef.current?.contains(target)) {
163
+ return;
164
+ }
165
+ if (previewMode) {
166
+ editor?.commands.focus('end');
167
+ return;
168
+ }
169
+ if (textarea) {
170
+ textarea.focus();
171
+ textarea.setSelectionRange(textarea.value.length, textarea.value.length);
172
+ }
173
+ }, [previewMode, editor]);
174
+ const toolbarNode = toolbarItems && toolbarApi ? ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.toolbarSlot, children: (0, jsx_runtime_1.jsx)(Toolbar_1.Toolbar, { api: toolbarApi, items: toolbarItems }) })) : undefined;
175
+ return ((0, jsx_runtime_1.jsxs)("div", { ...supportProps, className: (0, classnames_1.default)(styles_module_scss_1.default.root, syntax_module_scss_1.default.syntax, className), "data-test-id": dataTestId, "data-preview": previewMode || undefined, children: [showHeader && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.header, "data-test-id": constants_1.TEST_IDS.editorHeader, children: [(0, jsx_runtime_1.jsxs)("label", { className: styles_module_scss_1.default.previewToggle, children: [(0, jsx_runtime_1.jsx)(toggles_1.Switch, { size: 's', checked: previewMode, onChange: setPreview, "data-test-id": constants_1.TEST_IDS.editorPreviewToggle }), (0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_1.default.previewToggleLabel, children: previewLabel })] }), label && ((0, jsx_runtime_1.jsx)("span", { className: styles_module_scss_1.default.label, "data-test-id": constants_1.TEST_IDS.editorLabel, children: label }))] })), (0, jsx_runtime_1.jsx)(fields_1.FieldShell, { "data-test-id": constants_1.TEST_IDS.editorField, header: toolbarNode, focusVisible: previewFocusVisible, hover: previewHover, onMouseEnter: () => setPreviewHover(true), onMouseLeave: () => setPreviewHover(false), children: (0, jsx_runtime_1.jsxs)("div", { className: styles_module_scss_1.default.contentArea, onClick: handleContentClick, onFocus: handlePreviewFocus, onBlur: handlePreviewBlur, children: [(0, jsx_runtime_1.jsx)(scroll_1.Scroll, { className: styles_module_scss_1.default.resizeBox, size: 's', resize: resizable ? 'vertical' : 'none', overflow: { x: 'hidden' }, children: previewMode ? ((0, jsx_runtime_1.jsx)(react_1.EditorContent, { ref: editorContentRef, editor: editor, className: styles_module_scss_1.default.content, "data-test-id": constants_1.TEST_IDS.editorContent, spellCheck: spellCheck })) : ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.rawInputWrapper, children: (0, jsx_runtime_1.jsx)(react_textarea_autosize_1.default, { ref: textareaRef, className: styles_module_scss_1.default.rawInput, "data-test-id": constants_1.TEST_IDS.editorRawInput, value: currentValue ?? '', onChange: handleRawValueChange, placeholder: placeholder, spellCheck: spellCheck }) })) }), hasValue && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_scss_1.default.postfix, children: (0, jsx_runtime_1.jsx)(button_1.Button, { view: 'function', appearance: 'neutral', size: 'm', icon: (0, jsx_runtime_1.jsx)(system_1.CrossCircleSVG, {}), "data-test-id": constants_1.TEST_IDS.editorClear, "aria-label": t('clear'), onClick: handleClearButtonClick }) }))] }) })] }));
176
+ }
@@ -0,0 +1 @@
1
+ export * from './MarkdownEditor';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./MarkdownEditor"), exports);