@gravity-ui/markdown-editor 13.5.2 → 13.6.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 (124) hide show
  1. package/build/cjs/bundle/Editor.js +8 -5
  2. package/build/cjs/bundle/config/icons.d.ts +1 -1
  3. package/build/cjs/bundle/config/icons.js +1 -0
  4. package/build/cjs/bundle/config/wysiwyg.d.ts +2 -1
  5. package/build/cjs/bundle/config/wysiwyg.js +13 -2
  6. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeading.d.ts +12 -0
  7. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeading.js +22 -0
  8. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.d.ts +2 -0
  9. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.js +9 -0
  10. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.d.ts +11 -0
  11. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.js +5 -0
  12. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.d.ts +1 -0
  13. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.js +4 -0
  14. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.d.ts +3 -0
  15. package/build/cjs/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.js +17 -0
  16. package/build/cjs/extensions/yfm/FoldingHeading/actions.d.ts +2 -0
  17. package/build/cjs/extensions/yfm/FoldingHeading/actions.js +10 -0
  18. package/build/cjs/extensions/yfm/FoldingHeading/commands/index.d.ts +3 -0
  19. package/build/cjs/extensions/yfm/FoldingHeading/commands/index.js +6 -0
  20. package/build/cjs/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.d.ts +2 -0
  21. package/build/cjs/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.js +27 -0
  22. package/build/cjs/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.d.ts +2 -0
  23. package/build/cjs/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.js +17 -0
  24. package/build/cjs/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.d.ts +2 -0
  25. package/build/cjs/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.js +26 -0
  26. package/build/cjs/extensions/yfm/FoldingHeading/const.d.ts +1 -0
  27. package/build/cjs/extensions/yfm/FoldingHeading/const.js +6 -0
  28. package/build/cjs/extensions/yfm/FoldingHeading/index.d.ts +1 -0
  29. package/build/cjs/extensions/yfm/FoldingHeading/index.js +5 -0
  30. package/build/cjs/extensions/yfm/FoldingHeading/input-rules.d.ts +4 -0
  31. package/build/cjs/extensions/yfm/FoldingHeading/input-rules.js +31 -0
  32. package/build/cjs/extensions/yfm/FoldingHeading/plugins/Folding.d.ts +3 -0
  33. package/build/cjs/extensions/yfm/FoldingHeading/plugins/Folding.js +167 -0
  34. package/build/cjs/extensions/yfm/FoldingHeading/utils.d.ts +10 -0
  35. package/build/cjs/extensions/yfm/FoldingHeading/utils.js +30 -0
  36. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
  37. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +1 -1
  38. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +4 -4
  39. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +9 -1
  40. package/build/cjs/i18n/menubar/en.json +2 -0
  41. package/build/cjs/i18n/menubar/index.d.ts +3 -1
  42. package/build/cjs/i18n/menubar/ru.json +2 -0
  43. package/build/cjs/icons/index.d.ts +1 -1
  44. package/build/cjs/icons/index.js +2 -1
  45. package/build/cjs/toolbar/ToolbarButton.js +3 -2
  46. package/build/cjs/version.js +1 -1
  47. package/build/esm/bundle/Editor.js +8 -5
  48. package/build/esm/bundle/config/icons.d.ts +1 -1
  49. package/build/esm/bundle/config/icons.js +2 -1
  50. package/build/esm/bundle/config/wysiwyg.d.ts +2 -1
  51. package/build/esm/bundle/config/wysiwyg.js +12 -1
  52. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeading.d.ts +12 -0
  53. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeading.js +18 -0
  54. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.d.ts +2 -0
  55. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/FoldingHeadingSpecs.js +5 -0
  56. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.d.ts +11 -0
  57. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/const.js +2 -0
  58. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.d.ts +1 -0
  59. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/index.js +1 -0
  60. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.d.ts +3 -0
  61. package/build/esm/extensions/yfm/FoldingHeading/FoldingHeadingSpec/md/skip-heading-sections.js +13 -0
  62. package/build/esm/extensions/yfm/FoldingHeading/actions.d.ts +2 -0
  63. package/build/esm/extensions/yfm/FoldingHeading/actions.js +7 -0
  64. package/build/esm/extensions/yfm/FoldingHeading/commands/index.d.ts +3 -0
  65. package/build/esm/extensions/yfm/FoldingHeading/commands/index.js +3 -0
  66. package/build/esm/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.d.ts +2 -0
  67. package/build/esm/extensions/yfm/FoldingHeading/commands/openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading.js +23 -0
  68. package/build/esm/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.d.ts +2 -0
  69. package/build/esm/extensions/yfm/FoldingHeading/commands/removeFoldingIfCursorAtStartOfHeading.js +13 -0
  70. package/build/esm/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.d.ts +2 -0
  71. package/build/esm/extensions/yfm/FoldingHeading/commands/toggleFoldingOfHeading.js +22 -0
  72. package/build/esm/extensions/yfm/FoldingHeading/const.d.ts +1 -0
  73. package/build/esm/extensions/yfm/FoldingHeading/const.js +1 -0
  74. package/build/esm/extensions/yfm/FoldingHeading/index.d.ts +1 -0
  75. package/build/esm/extensions/yfm/FoldingHeading/index.js +1 -0
  76. package/build/esm/extensions/yfm/FoldingHeading/input-rules.d.ts +4 -0
  77. package/build/esm/extensions/yfm/FoldingHeading/input-rules.js +27 -0
  78. package/build/esm/extensions/yfm/FoldingHeading/plugins/Folding.d.ts +4 -0
  79. package/build/esm/extensions/yfm/FoldingHeading/plugins/Folding.js +164 -0
  80. package/build/esm/extensions/yfm/FoldingHeading/utils.d.ts +10 -0
  81. package/build/esm/extensions/yfm/FoldingHeading/utils.js +19 -0
  82. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
  83. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +1 -1
  84. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +4 -4
  85. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +9 -1
  86. package/build/esm/i18n/menubar/en.json +2 -0
  87. package/build/esm/i18n/menubar/index.d.ts +3 -1
  88. package/build/esm/i18n/menubar/ru.json +2 -0
  89. package/build/esm/icons/index.d.ts +1 -1
  90. package/build/esm/icons/index.js +1 -1
  91. package/build/esm/toolbar/ToolbarButton.js +3 -2
  92. package/build/esm/version.js +1 -1
  93. package/build/styles.css +0 -381
  94. package/package.json +10 -5
  95. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +0 -26
  96. package/build/cjs/extensions/markdown/Table/plugins/TableCellContextPlugin/floating.css +0 -11
  97. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/skeleton.css +0 -8
  98. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.css +0 -12
  99. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImageForm/ImageForm.css +0 -8
  100. package/build/cjs/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgNodeView.css +0 -4
  101. package/build/cjs/extensions/yfm/Mermaid/MermaidNodeView/Mermaid.css +0 -33
  102. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +0 -3
  103. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/skeleton.css +0 -8
  104. package/build/cjs/extensions/yfm/YfmFile/YfmFileWidget/view.css +0 -7
  105. package/build/cjs/extensions/yfm/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlock.css +0 -66
  106. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -66
  107. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/view.css +0 -83
  108. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/yfmTableCellView.css +0 -37
  109. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +0 -9
  110. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +0 -26
  111. package/build/esm/extensions/markdown/Table/plugins/TableCellContextPlugin/floating.css +0 -11
  112. package/build/esm/extensions/yfm/ImgSize/ImagePaste/skeleton.css +0 -8
  113. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.css +0 -12
  114. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImageForm/ImageForm.css +0 -8
  115. package/build/esm/extensions/yfm/ImgSize/plugins/ImgSizeNodeView/ImgNodeView.css +0 -4
  116. package/build/esm/extensions/yfm/Mermaid/MermaidNodeView/Mermaid.css +0 -33
  117. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +0 -3
  118. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/skeleton.css +0 -8
  119. package/build/esm/extensions/yfm/YfmFile/YfmFileWidget/view.css +0 -7
  120. package/build/esm/extensions/yfm/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlock.css +0 -66
  121. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -66
  122. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/view.css +0 -83
  123. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/yfmTableCellView.css +0 -37
  124. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +0 -9
@@ -16,7 +16,7 @@ const YfmHeadingSpecs = (builder, opts) => {
16
16
  [const_1.YfmHeadingAttr.Id]: { default: '' },
17
17
  [const_1.YfmHeadingAttr.Level]: { default: 1 },
18
18
  [const_1.YfmHeadingAttr.DataLine]: { default: null },
19
- [const_1.YfmHeadingAttr.Folding]: { default: false },
19
+ [const_1.YfmHeadingAttr.Folding]: { default: null },
20
20
  },
21
21
  content: '(text | inline)*',
22
22
  group: 'block',
@@ -39,7 +39,7 @@ const YfmHeadingSpecs = (builder, opts) => {
39
39
  {
40
40
  id: id || null,
41
41
  [const_1.YfmHeadingAttr.DataLine]: lineNumber,
42
- [`data-${const_1.YfmHeadingAttr.Folding}`]: folding ? '' : null,
42
+ [`data-${const_1.YfmHeadingAttr.Folding}`]: folding,
43
43
  },
44
44
  0,
45
45
  // [
@@ -74,14 +74,14 @@ const YfmHeadingSpecs = (builder, opts) => {
74
74
  // attrs[YfmHeadingAttr.Id] = slugify(tokens[index + 1].content);
75
75
  // }
76
76
  // attrs have id only if it explicitly specified manually
77
- return Object.assign({ [const_1.YfmHeadingAttr.Level]: Number(token.tag.slice(1)), [const_1.YfmHeadingAttr.Folding]: (_a = token.meta) === null || _a === void 0 ? void 0 : _a.folding }, attrs);
77
+ return Object.assign({ [const_1.YfmHeadingAttr.Level]: Number(token.tag.slice(1)), [const_1.YfmHeadingAttr.Folding]: ((_a = token.meta) === null || _a === void 0 ? void 0 : _a.folding) === true ? true : null }, attrs);
78
78
  },
79
79
  },
80
80
  },
81
81
  toMd: (state, node) => {
82
82
  const folding = node.attrs[const_1.YfmHeadingAttr.Folding];
83
83
  const level = node.attrs[const_1.YfmHeadingAttr.Level];
84
- state.write(state.repeat('#', level) + (folding ? '+' : '') + ' ');
84
+ state.write(state.repeat('#', level) + (typeof folding === 'boolean' ? '+' : '') + ' ');
85
85
  state.renderInline(node);
86
86
  const anchor = node.attrs[const_1.YfmHeadingAttr.Id];
87
87
  if (anchor /*&& anchor !== node.firstChild?.textContent*/) {
@@ -10,9 +10,17 @@ Object.defineProperty(exports, "headingRule", { enumerable: true, get: function
10
10
  const getNodeAttrs = (level) => (node) => ({
11
11
  [const_1.YfmHeadingAttr.Level]: level,
12
12
  [const_1.YfmHeadingAttr.Id]: node.getAttribute('id') || '',
13
- [const_1.YfmHeadingAttr.Folding]: node.hasAttribute(`data-${const_1.YfmHeadingAttr.Folding}`),
13
+ [const_1.YfmHeadingAttr.Folding]: getFoldingAttr(node),
14
14
  });
15
15
  exports.getNodeAttrs = getNodeAttrs;
16
+ function getFoldingAttr(node) {
17
+ const value = node.getAttribute(`data-${const_1.YfmHeadingAttr.Folding}`);
18
+ if (value === 'true')
19
+ return true;
20
+ if (value === 'false')
21
+ return false;
22
+ return null;
23
+ }
16
24
  // export const slugify = (str: string) =>
17
25
  // // same config as in yfm-transform
18
26
  // // https://github.com/yandex-cloud/yfm-transform/blob/master/lib/plugins/anchors/index.js#L97-L100
@@ -17,6 +17,8 @@
17
17
  "cut": "Cut",
18
18
  "emoji": "Emoji",
19
19
  "file": "File",
20
+ "folding-heading": "Collapsed section",
21
+ "folding-heading_hint": "The text under the heading can be collapsed or expanded",
20
22
  "heading": "Heading",
21
23
  "heading1": "Heading 1",
22
24
  "heading2": "Heading 2",
@@ -1,4 +1,4 @@
1
- export declare const i18n: <G extends "bold" | "code" | "link" | "italic" | "strike" | "underline" | "mark" | "quote" | "colorify" | "mono" | "text" | "html" | "cut" | "table" | "image" | "code_inline" | "heading" | "note" | "file" | "codeblock" | "checkbox" | "emoji" | "list" | "tabs" | "math" | "heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "undo" | "redo" | "math_inline" | "math_block" | "colorify__color_blue" | "colorify__color_default" | "colorify__color_gray" | "colorify__color_green" | "colorify__color_orange" | "colorify__color_red" | "colorify__color_violet" | "colorify__color_yellow" | "colorify__group_text" | "hrule" | "list__action_lift" | "list__action_sink" | "list_action_disabled" | "mermaid" | "more_action" | "olist" | "ulist", S extends string>(key: G | (string extends S ? S : never), params?: {
1
+ export declare const i18n: <G extends "bold" | "code" | "link" | "italic" | "strike" | "underline" | "mark" | "quote" | "colorify" | "mono" | "text" | "html" | "cut" | "table" | "image" | "code_inline" | "heading" | "note" | "file" | "codeblock" | "checkbox" | "emoji" | "list" | "tabs" | "math" | "heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "undo" | "redo" | "math_inline" | "math_block" | "colorify__color_blue" | "colorify__color_default" | "colorify__color_gray" | "colorify__color_green" | "colorify__color_orange" | "colorify__color_red" | "colorify__color_violet" | "colorify__color_yellow" | "colorify__group_text" | "folding-heading" | "folding-heading_hint" | "hrule" | "list__action_lift" | "list__action_sink" | "list_action_disabled" | "mermaid" | "more_action" | "olist" | "ulist", S extends string>(key: G | (string extends S ? S : never), params?: {
2
2
  [key: string]: any;
3
3
  } | undefined) => S extends G ? {
4
4
  bold: string;
@@ -19,6 +19,8 @@ export declare const i18n: <G extends "bold" | "code" | "link" | "italic" | "str
19
19
  cut: string;
20
20
  emoji: string;
21
21
  file: string;
22
+ "folding-heading": string;
23
+ "folding-heading_hint": string;
22
24
  heading: string;
23
25
  heading1: string;
24
26
  heading2: string;
@@ -17,6 +17,8 @@
17
17
  "cut": "Кат",
18
18
  "emoji": "Эмодзи",
19
19
  "file": "Файл",
20
+ "folding-heading": "Свёрнутый раздел",
21
+ "folding-heading_hint": "Текст под заголовком можно свернуть или раскрыть",
20
22
  "heading": "Заголовок",
21
23
  "heading1": "Заголовок 1",
22
24
  "heading2": "Заголовок 2",
@@ -2,4 +2,4 @@ import MermaidIcon from './Mermaid';
2
2
  import MonoIcon from './Mono';
3
3
  import TabsIcon from './Tabs';
4
4
  export { MermaidIcon, MonoIcon, TabsIcon };
5
- export { ArrowUturnCcwLeft as UndoIcon, ArrowUturnCwRight as RedoIcon, Bold as BoldIcon, Italic as ItalicIcon, Underline as UnderlineIcon, Strikethrough as StrikethroughIcon, FontCursor as MarkIcon, Text as TextIcon, Heading as HeadingIcon, Heading1 as Heading1Icon, Heading2 as Heading2Icon, Heading3 as Heading3Icon, Heading4 as Heading4Icon, Heading5 as Heading5Icon, Heading6 as Heading6Icon, ListUl as ListBlIcon, ListOl as ListOlIcon, TextOutdent as LiftIcon, TextIndent as SinkIcon, Font as TextColorIcon, Link as LinkIcon, QuoteClose as QuoteIcon, Scissors as CutIcon, Sticker as NoteIcon, Paperclip as FileIcon, Minus as HRuleIcon, LayoutList as TableIcon, ChevronsExpandHorizontal as IframeIcon, SquareCheck as CheckListIcon, Picture as ImageIcon, Person as UserIcon, FaceSmile as EmojiIcon, Code as CodeInlineIcon, FileCode as CodeBlockIcon, Function as FunctionInlineIcon, CurlyBracketsFunction as FunctionBlockIcon, Hashtag as AnchorIcon, SquareDashedText as BlockIcon, LayoutColumns3 as LayoutIcon, Pencil as DrawIoIcon, FolderCode as HtmlBlockIcon, } from '@gravity-ui/icons';
5
+ export { ArrowUturnCcwLeft as UndoIcon, ArrowUturnCwRight as RedoIcon, Bold as BoldIcon, Italic as ItalicIcon, Underline as UnderlineIcon, Strikethrough as StrikethroughIcon, FontCursor as MarkIcon, Text as TextIcon, Heading as HeadingIcon, Heading1 as Heading1Icon, Heading2 as Heading2Icon, Heading3 as Heading3Icon, Heading4 as Heading4Icon, Heading5 as Heading5Icon, Heading6 as Heading6Icon, ListUl as ListBlIcon, ListOl as ListOlIcon, TextOutdent as LiftIcon, TextIndent as SinkIcon, Font as TextColorIcon, Link as LinkIcon, QuoteClose as QuoteIcon, Scissors as CutIcon, Sticker as NoteIcon, Paperclip as FileIcon, Minus as HRuleIcon, LayoutList as TableIcon, ChevronsExpandHorizontal as IframeIcon, SquareCheck as CheckListIcon, Picture as ImageIcon, Person as UserIcon, FaceSmile as EmojiIcon, Code as CodeInlineIcon, FileCode as CodeBlockIcon, Function as FunctionInlineIcon, CurlyBracketsFunction as FunctionBlockIcon, Hashtag as AnchorIcon, SquareDashedText as BlockIcon, LayoutColumns3 as LayoutIcon, Pencil as DrawIoIcon, FolderCode as HtmlBlockIcon, ArrowChevronRight as FoldingHeadingIcon, } from '@gravity-ui/icons';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HtmlBlockIcon = exports.DrawIoIcon = exports.LayoutIcon = exports.BlockIcon = exports.AnchorIcon = exports.FunctionBlockIcon = exports.FunctionInlineIcon = exports.CodeBlockIcon = exports.CodeInlineIcon = exports.EmojiIcon = exports.UserIcon = exports.ImageIcon = exports.CheckListIcon = exports.IframeIcon = exports.TableIcon = exports.HRuleIcon = exports.FileIcon = exports.NoteIcon = exports.CutIcon = exports.QuoteIcon = exports.LinkIcon = exports.TextColorIcon = exports.SinkIcon = exports.LiftIcon = exports.ListOlIcon = exports.ListBlIcon = exports.Heading6Icon = exports.Heading5Icon = exports.Heading4Icon = exports.Heading3Icon = exports.Heading2Icon = exports.Heading1Icon = exports.HeadingIcon = exports.TextIcon = exports.MarkIcon = exports.StrikethroughIcon = exports.UnderlineIcon = exports.ItalicIcon = exports.BoldIcon = exports.RedoIcon = exports.UndoIcon = exports.TabsIcon = exports.MonoIcon = exports.MermaidIcon = void 0;
3
+ exports.FoldingHeadingIcon = exports.HtmlBlockIcon = exports.DrawIoIcon = exports.LayoutIcon = exports.BlockIcon = exports.AnchorIcon = exports.FunctionBlockIcon = exports.FunctionInlineIcon = exports.CodeBlockIcon = exports.CodeInlineIcon = exports.EmojiIcon = exports.UserIcon = exports.ImageIcon = exports.CheckListIcon = exports.IframeIcon = exports.TableIcon = exports.HRuleIcon = exports.FileIcon = exports.NoteIcon = exports.CutIcon = exports.QuoteIcon = exports.LinkIcon = exports.TextColorIcon = exports.SinkIcon = exports.LiftIcon = exports.ListOlIcon = exports.ListBlIcon = exports.Heading6Icon = exports.Heading5Icon = exports.Heading4Icon = exports.Heading3Icon = exports.Heading2Icon = exports.Heading1Icon = exports.HeadingIcon = exports.TextIcon = exports.MarkIcon = exports.StrikethroughIcon = exports.UnderlineIcon = exports.ItalicIcon = exports.BoldIcon = exports.RedoIcon = exports.UndoIcon = exports.TabsIcon = exports.MonoIcon = exports.MermaidIcon = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const Mermaid_1 = tslib_1.__importDefault(require("./Mermaid"));
6
6
  exports.MermaidIcon = Mermaid_1.default;
@@ -62,3 +62,4 @@ Object.defineProperty(exports, "LayoutIcon", { enumerable: true, get: function (
62
62
  //
63
63
  Object.defineProperty(exports, "DrawIoIcon", { enumerable: true, get: function () { return icons_1.Pencil; } });
64
64
  Object.defineProperty(exports, "HtmlBlockIcon", { enumerable: true, get: function () { return icons_1.FolderCode; } });
65
+ Object.defineProperty(exports, "FoldingHeadingIcon", { enumerable: true, get: function () { return icons_1.ArrowChevronRight; } });
@@ -9,10 +9,11 @@ const common_1 = require("../i18n/common");
9
9
  const lodash_1 = require("../lodash");
10
10
  const const_1 = require("./const");
11
11
  const b = (0, classname_1.cn)('toolbar-button');
12
- exports.ToolbarButtonView = react_1.default.forwardRef(function ToolbarButtonView({ icon, title, hotkey, disabledPopoverVisible = true, hintWhenDisabled, active, enabled, onClick, className, }, ref) {
12
+ exports.ToolbarButtonView = react_1.default.forwardRef(function ToolbarButtonView({ icon, title, hint, hotkey, disabledPopoverVisible = true, hintWhenDisabled, active, enabled, onClick, className, }, ref) {
13
13
  var _a;
14
14
  const disabled = !active && !enabled;
15
15
  const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
16
+ const hintText = (0, lodash_1.isFunction)(hint) ? hint() : hint;
16
17
  const hideHintWhenDisabled = hintWhenDisabled === false || !disabledPopoverVisible || !disabled;
17
18
  const hintWhenDisabledText = typeof hintWhenDisabled === 'string'
18
19
  ? hintWhenDisabled
@@ -20,7 +21,7 @@ exports.ToolbarButtonView = react_1.default.forwardRef(function ToolbarButtonVie
20
21
  ? hintWhenDisabled()
21
22
  : (0, common_1.i18n)('toolbar_action_disabled');
22
23
  return (react_1.default.createElement(uikit_1.Popover, { content: hintWhenDisabledText, disabled: hideHintWhenDisabled, tooltipContentClassName: b('action-disabled-tooltip'), placement: ['bottom'] },
23
- react_1.default.createElement(uikit_1.ActionTooltip, { openDelay: const_1.ToolbarTooltipDelay.Open, closeDelay: const_1.ToolbarTooltipDelay.Close, title: titleText, hotkey: hotkey },
24
+ react_1.default.createElement(uikit_1.ActionTooltip, { openDelay: const_1.ToolbarTooltipDelay.Open, closeDelay: const_1.ToolbarTooltipDelay.Close, description: hintText, title: titleText, hotkey: hotkey },
24
25
  react_1.default.createElement(uikit_1.Button, { size: "m", ref: ref, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), extraProps: { 'aria-label': titleText } },
25
26
  react_1.default.createElement(uikit_1.Icon, { data: icon.data, size: (_a = icon.size) !== null && _a !== void 0 ? _a : 16 })))));
26
27
  });
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '13.5.2' !== 'undefined' ? '13.5.2' : 'unknown';
5
+ exports.VERSION = typeof '13.6.0' !== 'undefined' ? '13.6.0' : 'unknown';
@@ -238,15 +238,18 @@ export class EditorImpl extends SafeEventEmitter {
238
238
  }
239
239
  return this.currentEditor.moveCursor(position);
240
240
  }
241
- moveCursorToLine(line) {
241
+ moveCursorToLine(/** 0-based line number */ line) {
242
242
  const mode = this.currentMode;
243
243
  switch (mode) {
244
244
  case 'markup': {
245
- const lineNumber = line + 1;
246
245
  const view = this.markupEditor.cm;
247
- if (lineNumber > 0 && lineNumber <= view.state.doc.lines) {
248
- view.dispatch({ selection: { anchor: view.state.doc.line(lineNumber).from } });
249
- }
246
+ let cmLine = line + 1; // lines in codemirror is 1-based
247
+ cmLine = Math.max(cmLine, 1);
248
+ cmLine = Math.min(cmLine, view.state.doc.lines);
249
+ view.dispatch({
250
+ scrollIntoView: true,
251
+ selection: { anchor: view.state.doc.line(cmLine).from },
252
+ });
250
253
  break;
251
254
  }
252
255
  case 'wysiwyg': {
@@ -1,5 +1,5 @@
1
1
  import { ToolbarIconData } from '../../toolbar/types';
2
- declare type Icon = 'undo' | 'redo' | 'bold' | 'italic' | 'underline' | 'strikethrough' | 'mono' | 'mark' | 'textColor' | 'text' | 'headline' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'bulletList' | 'orderedList' | 'sink' | 'lift' | 'cut' | 'note' | 'code' | 'codeBlock' | 'link' | 'image' | 'table' | 'quote' | 'checklist' | 'horizontalRule' | 'file' | 'functionInline' | 'functionBlock' | 'emoji' | 'tabs' | 'mermaid' | 'html';
2
+ declare type Icon = 'undo' | 'redo' | 'bold' | 'italic' | 'underline' | 'strikethrough' | 'mono' | 'mark' | 'textColor' | 'text' | 'headline' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'bulletList' | 'orderedList' | 'sink' | 'lift' | 'cut' | 'note' | 'code' | 'codeBlock' | 'link' | 'image' | 'table' | 'quote' | 'checklist' | 'horizontalRule' | 'file' | 'functionInline' | 'functionBlock' | 'emoji' | 'tabs' | 'mermaid' | 'html' | 'foldingHeading';
3
3
  declare type Icons = Record<Icon, ToolbarIconData>;
4
4
  export declare const icons: Icons;
5
5
  export {};
@@ -1,4 +1,4 @@
1
- import { BoldIcon, CheckListIcon, CodeBlockIcon, CodeInlineIcon, CutIcon, EmojiIcon, FileIcon, FunctionBlockIcon, FunctionInlineIcon, HRuleIcon, Heading1Icon, Heading2Icon, Heading3Icon, Heading4Icon, Heading5Icon, Heading6Icon, HeadingIcon, HtmlBlockIcon, ImageIcon, ItalicIcon, LiftIcon, LinkIcon, ListBlIcon, ListOlIcon, MarkIcon, MermaidIcon, MonoIcon, NoteIcon, QuoteIcon, RedoIcon, SinkIcon, StrikethroughIcon, TableIcon, TabsIcon, TextColorIcon, TextIcon, UnderlineIcon, UndoIcon, } from '../../icons';
1
+ import { BoldIcon, CheckListIcon, CodeBlockIcon, CodeInlineIcon, CutIcon, EmojiIcon, FileIcon, FoldingHeadingIcon, FunctionBlockIcon, FunctionInlineIcon, HRuleIcon, Heading1Icon, Heading2Icon, Heading3Icon, Heading4Icon, Heading5Icon, Heading6Icon, HeadingIcon, HtmlBlockIcon, ImageIcon, ItalicIcon, LiftIcon, LinkIcon, ListBlIcon, ListOlIcon, MarkIcon, MermaidIcon, MonoIcon, NoteIcon, QuoteIcon, RedoIcon, SinkIcon, StrikethroughIcon, TableIcon, TabsIcon, TextColorIcon, TextIcon, UnderlineIcon, UndoIcon, } from '../../icons';
2
2
  export const icons = {
3
3
  undo: { data: UndoIcon },
4
4
  redo: { data: RedoIcon },
@@ -38,4 +38,5 @@ export const icons = {
38
38
  emoji: { data: EmojiIcon },
39
39
  tabs: { data: TabsIcon },
40
40
  mermaid: { data: MermaidIcon },
41
+ foldingHeading: { data: FoldingHeadingIcon },
41
42
  };
@@ -1,5 +1,5 @@
1
1
  import { ActionStorage } from 'src/core';
2
- import type { SelectionContextConfig } from '../../extensions/behavior/SelectionContext';
2
+ import type { SelectionContextConfig, SelectionContextItemData } from '../../extensions/behavior/SelectionContext';
3
3
  import { ToolbarData } from '../../toolbar/Toolbar';
4
4
  import { ToolbarGroupData } from '../../toolbar/ToolbarGroup';
5
5
  import { ToolbarListButtonData } from '../../toolbar/ToolbarListButton';
@@ -49,6 +49,7 @@ export declare const wCommandMenuConfig: WToolbarItemData[];
49
49
  export declare const wHiddenData: WToolbarItemData[];
50
50
  /** prepared wysiwyg toolbar config */
51
51
  export declare const wToolbarConfig: WToolbarData;
52
+ export declare const wToggleHeadingFoldingItemData: SelectionContextItemData;
52
53
  export declare const wSelectionMenuConfig: SelectionContextConfig;
53
54
  export declare const wMermaidItemData: WToolbarSingleItemData;
54
55
  export declare const wToolbarConfigByPreset: Record<EditorPreset, WToolbarData>;
@@ -440,6 +440,17 @@ export const wToolbarConfig = [
440
440
  ],
441
441
  [wImageItemData, wFileItemData, wTableItemData, wCheckboxItemData],
442
442
  ];
443
+ export const wToggleHeadingFoldingItemData = {
444
+ id: 'folding-heading',
445
+ type: ToolbarDataType.SingleButton,
446
+ icon: icons.foldingHeading,
447
+ title: () => i18n('folding-heading'),
448
+ hint: () => i18n('folding-heading_hint'),
449
+ isActive: (editor) => { var _a, _b; return (_b = (_a = editor.actions.toggleHeadingFolding) === null || _a === void 0 ? void 0 : _a.isActive()) !== null && _b !== void 0 ? _b : false; },
450
+ isEnable: (editor) => { var _a, _b; return (_b = (_a = editor.actions.toggleHeadingFolding) === null || _a === void 0 ? void 0 : _a.isEnable()) !== null && _b !== void 0 ? _b : false; },
451
+ exec: (editor) => editor.actions.toggleHeadingFolding.run(),
452
+ condition: 'enabled',
453
+ };
443
454
  const textContextItemData = {
444
455
  id: 'text',
445
456
  type: ToolbarDataType.ReactComponent,
@@ -453,7 +464,7 @@ const textContextItemData = {
453
464
  },
454
465
  };
455
466
  export const wSelectionMenuConfig = [
456
- [textContextItemData],
467
+ [wToggleHeadingFoldingItemData, textContextItemData],
457
468
  [...wBiusGroupConfig, wCodeItemData],
458
469
  [
459
470
  {
@@ -0,0 +1,12 @@
1
+ import type { Action, ExtensionAuto } from '../../../core';
2
+ import '@diplodoc/folding-headings-extension/runtime/styles.css';
3
+ declare const action = "toggleHeadingFolding";
4
+ export declare const FoldingHeading: ExtensionAuto;
5
+ declare global {
6
+ namespace WysiwygEditor {
7
+ interface Actions {
8
+ [action]: Action;
9
+ }
10
+ }
11
+ }
12
+ export {};
@@ -0,0 +1,18 @@
1
+ import { FoldingHeadingSpecs } from './FoldingHeadingSpec';
2
+ import { toggleHeadingFoldingAction } from './actions';
3
+ import { openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading, removeFoldingIfCursorAtStartOfHeading, } from './commands';
4
+ import { foldingHeadingRule } from './input-rules';
5
+ import { foldingPlugin } from './plugins/Folding';
6
+ import { headingType } from './utils';
7
+ import '@diplodoc/folding-headings-extension/runtime/styles.css';
8
+ const action = 'toggleHeadingFolding';
9
+ export const FoldingHeading = (builder) => {
10
+ builder.use(FoldingHeadingSpecs);
11
+ builder.addAction(action, () => toggleHeadingFoldingAction);
12
+ builder.addInputRules(({ schema }) => ({ rules: [foldingHeadingRule(headingType(schema), 6)] }));
13
+ builder.addKeymap(() => ({
14
+ Enter: openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading,
15
+ Backspace: removeFoldingIfCursorAtStartOfHeading,
16
+ }), builder.Priority.High);
17
+ builder.addPlugin(foldingPlugin);
18
+ };
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAuto } from '../../../../core';
2
+ export declare const FoldingHeadingSpecs: ExtensionAuto;
@@ -0,0 +1,5 @@
1
+ import { transform } from '@diplodoc/folding-headings-extension';
2
+ import { skipSectionsPlugin } from './md/skip-heading-sections';
3
+ export const FoldingHeadingSpecs = (builder) => {
4
+ builder.configureMd((md) => md.use(transform({ bundle: false })).use(skipSectionsPlugin));
5
+ };
@@ -0,0 +1,11 @@
1
+ export declare const TokenType: Pick<{
2
+ readonly Heading: "heading";
3
+ readonly HeadingOpen: "heading_open";
4
+ readonly HeadingClose: "heading_close";
5
+ readonly Section: "heading_section";
6
+ readonly SectionOpen: "heading_section_open";
7
+ readonly SectionClose: "heading_section_close";
8
+ readonly Content: "heading_section_content";
9
+ readonly ContentOpen: "heading_section_content_open";
10
+ readonly ContentClose: "heading_section_content_close";
11
+ }, "Heading" | "Section" | "Content">;
@@ -0,0 +1,2 @@
1
+ import { TokenType as MdTokenType } from '@diplodoc/folding-headings-extension';
2
+ export const TokenType = MdTokenType;
@@ -0,0 +1 @@
1
+ export * from './FoldingHeadingSpecs';
@@ -0,0 +1 @@
1
+ export * from './FoldingHeadingSpecs';
@@ -0,0 +1,3 @@
1
+ import type { PluginSimple } from 'markdown-it';
2
+ /** Filter heading section tokens, which are not needed in prosemirror-document */
3
+ export declare const skipSectionsPlugin: PluginSimple;
@@ -0,0 +1,13 @@
1
+ import { TokenType } from '@diplodoc/folding-headings-extension';
2
+ const ignoreTokenTypes = [
3
+ TokenType.SectionOpen,
4
+ TokenType.SectionClose,
5
+ TokenType.ContentOpen,
6
+ TokenType.ContentClose,
7
+ ];
8
+ /** Filter heading section tokens, which are not needed in prosemirror-document */
9
+ export const skipSectionsPlugin = (md) => {
10
+ md.core.ruler.push('skip-heading-sections', (state) => {
11
+ state.tokens = state.tokens.filter((token) => !ignoreTokenTypes.includes(token.type));
12
+ });
13
+ };
@@ -0,0 +1,2 @@
1
+ import type { ActionSpec } from '../../../core';
2
+ export declare const toggleHeadingFoldingAction: ActionSpec;
@@ -0,0 +1,7 @@
1
+ import { toggleFoldingOfHeading } from './commands';
2
+ import { hasFolding } from './utils';
3
+ export const toggleHeadingFoldingAction = {
4
+ isActive: (state) => hasFolding(state.selection),
5
+ isEnable: toggleFoldingOfHeading,
6
+ run: toggleFoldingOfHeading,
7
+ };
@@ -0,0 +1,3 @@
1
+ export * from './removeFoldingIfCursorAtStartOfHeading';
2
+ export * from './toggleFoldingOfHeading';
3
+ export * from './openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading';
@@ -0,0 +1,3 @@
1
+ export * from './removeFoldingIfCursorAtStartOfHeading';
2
+ export * from './toggleFoldingOfHeading';
3
+ export * from './openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading';
@@ -0,0 +1,2 @@
1
+ import { Command } from 'prosemirror-state';
2
+ export declare const openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading: Command;
@@ -0,0 +1,23 @@
1
+ import { TextSelection } from 'prosemirror-state';
2
+ import { get$Cursor } from '../../../../utils/selection';
3
+ import { pType } from '../../../base/specs';
4
+ import { YfmHeadingAttr } from '../const';
5
+ import { isFoldedHeading } from '../utils';
6
+ export const openHeadingAndCreateParagraphAfterIfCursorAtEndOfHeading = (state, dispatch) => {
7
+ const $cursor = get$CursorAtBlockEnd(state.selection);
8
+ if (!$cursor || !isFoldedHeading($cursor.parent))
9
+ return false;
10
+ if (dispatch) {
11
+ const tr = state.tr
12
+ .setNodeAttribute($cursor.before(), YfmHeadingAttr.Folding, false)
13
+ .insert($cursor.after(), pType(state.schema).createAndFill());
14
+ dispatch(tr.setSelection(TextSelection.create(tr.doc, $cursor.after() + 1)).scrollIntoView());
15
+ }
16
+ return true;
17
+ };
18
+ function get$CursorAtBlockEnd(selection) {
19
+ const $cursor = get$Cursor(selection);
20
+ if (!$cursor || $cursor.parent.isInline || $cursor.parentOffset < $cursor.parent.content.size)
21
+ return null;
22
+ return $cursor;
23
+ }
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'prosemirror-state';
2
+ export declare const removeFoldingIfCursorAtStartOfHeading: Command;
@@ -0,0 +1,13 @@
1
+ import { get$Cursor } from '../../../../utils/selection';
2
+ import { YfmHeadingAttr } from '../const';
3
+ import { isFoldingHeading } from '../utils';
4
+ export const removeFoldingIfCursorAtStartOfHeading = (state, dispatch) => {
5
+ const $cursor = get$Cursor(state.selection);
6
+ if (!$cursor)
7
+ return false;
8
+ if ($cursor.parentOffset === 0 && isFoldingHeading($cursor.parent)) {
9
+ dispatch === null || dispatch === void 0 ? void 0 : dispatch(state.tr.setNodeAttribute($cursor.before(), YfmHeadingAttr.Folding, null));
10
+ return true;
11
+ }
12
+ return false;
13
+ };
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'prosemirror-state';
2
+ export declare const toggleFoldingOfHeading: Command;
@@ -0,0 +1,22 @@
1
+ import { pType } from '../../../base/specs';
2
+ import { YfmHeadingAttr } from '../const';
3
+ import { insideHeading, isFoldingHeading, parseLevel } from '../utils';
4
+ export const toggleFoldingOfHeading = (state, dispatch) => {
5
+ if (!insideHeading(state.selection))
6
+ return false;
7
+ if (dispatch) {
8
+ const { $head } = state.selection;
9
+ const folding = isFoldingHeading($head.parent);
10
+ const level = parseLevel($head.parent);
11
+ const tr = state.tr.setNodeAttribute($head.before(), YfmHeadingAttr.Folding, folding ? null : false);
12
+ if (!folding) {
13
+ // insert empty paragraph if content of new folding heading is empty
14
+ const nextNode = $head.node(-1).maybeChild($head.indexAfter(-1));
15
+ if (!nextNode || (isFoldingHeading(nextNode) && parseLevel(nextNode) <= level)) {
16
+ tr.insert($head.after(), pType(state.schema).create());
17
+ }
18
+ }
19
+ dispatch(tr);
20
+ }
21
+ return true;
22
+ };
@@ -0,0 +1 @@
1
+ export { YfmHeadingAttr, headingNodeName, type HeadingLevel } from '../YfmHeading/const';
@@ -0,0 +1 @@
1
+ export { YfmHeadingAttr, headingNodeName } from '../YfmHeading/const';
@@ -0,0 +1 @@
1
+ export { FoldingHeading } from './FoldingHeading';
@@ -0,0 +1 @@
1
+ export { FoldingHeading } from './FoldingHeading';
@@ -0,0 +1,4 @@
1
+ import { InputRule } from 'prosemirror-inputrules';
2
+ import type { NodeType } from 'prosemirror-model';
3
+ import { type HeadingLevel } from './const';
4
+ export declare function foldingHeadingRule(nodeType: NodeType, maxLevel: HeadingLevel): InputRule;
@@ -0,0 +1,27 @@
1
+ import { InputRule } from 'prosemirror-inputrules';
2
+ import { hasCodeMark } from '../../../utils/inputrules';
3
+ import { pType } from '../../base/specs';
4
+ import { YfmHeadingAttr } from './const';
5
+ import { isFoldingHeading, isHeading, parseLevel } from './utils';
6
+ export function foldingHeadingRule(nodeType, maxLevel) {
7
+ return new InputRule(new RegExp('^(#{1,' + maxLevel + '})\\+\\s$'), (state, match, start, end) => {
8
+ if (hasCodeMark(state, match, start, end))
9
+ return null;
10
+ const $start = state.doc.resolve(start);
11
+ if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType))
12
+ return null;
13
+ const level = match[1].length;
14
+ const pos = $start.before();
15
+ const tr = state.tr.delete(start, end);
16
+ if (!isHeading($start.parent))
17
+ tr.setNodeMarkup(pos, nodeType);
18
+ tr.setNodeAttribute(pos, YfmHeadingAttr.Level, level);
19
+ tr.setNodeAttribute(pos, YfmHeadingAttr.Folding, false);
20
+ // insert empty paragraph if content of new folding heading is empty
21
+ const nextNode = $start.node(-1).maybeChild($start.indexAfter(-1));
22
+ if (!nextNode || (isFoldingHeading(nextNode) && parseLevel(nextNode) <= level)) {
23
+ tr.insert(tr.mapping.map($start.after()), pType(state.schema).create());
24
+ }
25
+ return tr;
26
+ });
27
+ }
@@ -0,0 +1,4 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { DecorationSet } from 'prosemirror-view';
3
+ import './folding.css';
4
+ export declare const foldingPlugin: () => Plugin<DecorationSet>;