@gravity-ui/markdown-editor 15.32.0 → 15.33.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 (138) hide show
  1. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  2. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  3. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  4. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  5. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  6. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +95 -0
  7. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  8. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  9. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  10. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +54 -30
  11. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  12. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  13. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +27 -0
  14. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  15. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  16. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +5 -0
  17. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  18. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  19. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +55 -0
  20. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  21. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  22. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +80 -0
  23. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  24. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  25. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +9 -0
  26. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  27. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  28. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  29. package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +8 -0
  30. package/build/cjs/extensions/markdown/CodeBlock/index.js +4 -0
  31. package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
  32. package/build/cjs/i18n/codeblock/en.json +1 -0
  33. package/build/cjs/i18n/codeblock/index.d.ts +2 -1
  34. package/build/cjs/i18n/codeblock/ru.json +1 -0
  35. package/build/cjs/i18n/viewer/en.json +3 -0
  36. package/build/cjs/i18n/viewer/index.d.ts +5 -0
  37. package/build/cjs/i18n/viewer/index.js +10 -0
  38. package/build/cjs/i18n/viewer/index.js.map +1 -0
  39. package/build/cjs/i18n/viewer/ru.json +3 -0
  40. package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -1
  41. package/build/cjs/plugins/BaseTooltip/index.js +1 -1
  42. package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
  43. package/build/cjs/toolbar/ToolbarButton.d.ts +1 -1
  44. package/build/cjs/toolbar/ToolbarButton.js +2 -2
  45. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  46. package/build/cjs/toolbar/types.d.ts +1 -0
  47. package/build/cjs/toolbar/types.js.map +1 -1
  48. package/build/cjs/types/node-view.d.ts +11 -0
  49. package/build/cjs/types/node-view.js +3 -0
  50. package/build/cjs/types/node-view.js.map +1 -0
  51. package/build/cjs/utils/truthy.d.ts +4 -0
  52. package/build/cjs/utils/truthy.js +11 -0
  53. package/build/cjs/utils/truthy.js.map +1 -0
  54. package/build/cjs/version.js +1 -1
  55. package/build/cjs/version.js.map +1 -1
  56. package/build/cjs/view/hocs/index.d.ts +1 -0
  57. package/build/cjs/view/hocs/index.js +5 -0
  58. package/build/cjs/view/hocs/index.js.map +1 -0
  59. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  60. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js +16 -0
  61. package/build/cjs/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  62. package/build/cjs/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  63. package/build/cjs/view/hocs/withCodeBlockActions/index.js +63 -0
  64. package/build/cjs/view/hocs/withCodeBlockActions/index.js.map +1 -0
  65. package/build/cjs/view/hocs/withCodeBlockActions/styles.css +27 -0
  66. package/build/cjs/view/index.d.ts +1 -0
  67. package/build/cjs/view/index.js +1 -0
  68. package/build/cjs/view/index.js.map +1 -1
  69. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.css +18 -5
  70. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +3 -0
  71. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +22 -99
  72. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  73. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.d.ts +1 -0
  74. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js +91 -0
  75. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockNodeView.js.map +1 -0
  76. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/TooltipView.css +1 -5
  77. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +6 -1
  78. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +57 -33
  79. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  80. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.d.ts +1 -0
  81. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js +21 -0
  82. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.js.map +1 -0
  83. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.d.ts +1 -0
  84. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js +2 -0
  85. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/const.js.map +1 -0
  86. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.d.ts +1 -0
  87. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +51 -0
  88. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -0
  89. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.d.ts +1 -0
  90. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js +72 -0
  91. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.js.map +1 -0
  92. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.d.ts +1 -0
  93. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +6 -0
  94. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -0
  95. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +1 -0
  96. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  97. package/build/esm/extensions/markdown/CodeBlock/index.d.ts +8 -0
  98. package/build/esm/extensions/markdown/CodeBlock/index.js +4 -0
  99. package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
  100. package/build/esm/i18n/codeblock/en.json +1 -0
  101. package/build/esm/i18n/codeblock/index.d.ts +2 -1
  102. package/build/esm/i18n/codeblock/ru.json +1 -0
  103. package/build/esm/i18n/viewer/en.json +3 -0
  104. package/build/esm/i18n/viewer/index.d.ts +5 -0
  105. package/build/esm/i18n/viewer/index.js +6 -0
  106. package/build/esm/i18n/viewer/index.js.map +1 -0
  107. package/build/esm/i18n/viewer/ru.json +3 -0
  108. package/build/esm/plugins/BaseTooltip/index.d.ts +1 -1
  109. package/build/esm/plugins/BaseTooltip/index.js +1 -1
  110. package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
  111. package/build/esm/toolbar/ToolbarButton.d.ts +1 -1
  112. package/build/esm/toolbar/ToolbarButton.js +2 -2
  113. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  114. package/build/esm/toolbar/types.d.ts +1 -0
  115. package/build/esm/toolbar/types.js.map +1 -1
  116. package/build/esm/types/node-view.d.ts +11 -0
  117. package/build/esm/types/node-view.js +2 -0
  118. package/build/esm/types/node-view.js.map +1 -0
  119. package/build/esm/utils/truthy.d.ts +4 -0
  120. package/build/esm/utils/truthy.js +7 -0
  121. package/build/esm/utils/truthy.js.map +1 -0
  122. package/build/esm/version.js +1 -1
  123. package/build/esm/version.js.map +1 -1
  124. package/build/esm/view/hocs/index.d.ts +1 -0
  125. package/build/esm/view/hocs/index.js +2 -0
  126. package/build/esm/view/hocs/index.js.map +1 -0
  127. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.d.ts +4 -0
  128. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js +13 -0
  129. package/build/esm/view/hocs/withCodeBlockActions/TextWrappingButton.js.map +1 -0
  130. package/build/esm/view/hocs/withCodeBlockActions/index.d.ts +15 -0
  131. package/build/esm/view/hocs/withCodeBlockActions/index.js +60 -0
  132. package/build/esm/view/hocs/withCodeBlockActions/index.js.map +1 -0
  133. package/build/esm/view/hocs/withCodeBlockActions/styles.css +27 -0
  134. package/build/esm/view/index.d.ts +1 -0
  135. package/build/esm/view/index.js +1 -0
  136. package/build/esm/view/index.js.map +1 -1
  137. package/build/styles.css +46 -10
  138. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toggleLineWrapping = exports.toggleLineNumbers = exports.isLineNumbersVisible = void 0;
4
+ const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
5
+ const codeBlockLineWrappingPlugin_1 = require("../plugins/codeBlockLineWrappingPlugin.js");
6
+ const utils_1 = require("../utils.js");
7
+ /** @internal */
8
+ var utils_2 = require("../utils.js");
9
+ Object.defineProperty(exports, "isLineNumbersVisible", { enumerable: true, get: function () { return utils_2.isLineNumbersVisible; } });
10
+ /** @internal */
11
+ const toggleLineNumbers = ({ node, pos, state, dispatch }) => {
12
+ const showLineNumbers = (0, utils_1.isLineNumbersVisible)(node);
13
+ dispatch(state.tr.setNodeAttribute(pos, CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers, showLineNumbers ? '' : 'true'));
14
+ };
15
+ exports.toggleLineNumbers = toggleLineNumbers;
16
+ /** @internal */
17
+ const toggleLineWrapping = ({ pos, state, dispatch }) => {
18
+ const { tr } = state;
19
+ const hasLineWrapping = (0, codeBlockLineWrappingPlugin_1.isNodeHasLineWrapping)(state, pos);
20
+ if (hasLineWrapping)
21
+ (0, codeBlockLineWrappingPlugin_1.disableLineWrapping)(tr, pos);
22
+ else
23
+ (0, codeBlockLineWrappingPlugin_1.enableLineWrapping)(tr, pos);
24
+ dispatch(tr);
25
+ };
26
+ exports.toggleLineWrapping = toggleLineWrapping;
27
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/utils.ts"],"names":[],"mappings":";;;AAGA,kEAAuD;AACvD,2FAIgD;AAChD,uCAA8C;AAE9C,gBAAgB;AAChB,qCAA8C;AAAtC,6GAAA,oBAAoB,OAAA;AAE5B,gBAAgB;AACT,MAAM,iBAAiB,GAKjB,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC1C,MAAM,eAAe,GAAG,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,CACJ,KAAK,CAAC,EAAE,CAAC,gBAAgB,CACrB,GAAG,EACH,kCAAiB,CAAC,eAAe,EACjC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAChC,CACJ,CAAC;AACN,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEF,gBAAgB;AACT,MAAM,kBAAkB,GAKlB,CAAC,EAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;IACpC,MAAM,EAAC,EAAE,EAAC,GAAG,KAAK,CAAC;IACnB,MAAM,eAAe,GAAG,IAAA,mDAAqB,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,eAAe;QAAE,IAAA,iDAAmB,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;;QAC7C,IAAA,gDAAkB,EAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC,CAAC;AAXW,QAAA,kBAAkB,sBAW7B","sourcesContent":["import type {Node} from '#pm/model';\nimport type {EditorState, Transaction} from '#pm/state';\n\nimport {CodeBlockNodeAttr} from '../../CodeBlockSpecs';\nimport {\n disableLineWrapping,\n enableLineWrapping,\n isNodeHasLineWrapping,\n} from '../plugins/codeBlockLineWrappingPlugin';\nimport {isLineNumbersVisible} from '../utils';\n\n/** @internal */\nexport {isLineNumbersVisible} from '../utils';\n\n/** @internal */\nexport const toggleLineNumbers: (params: {\n node: Node;\n pos: number;\n state: EditorState;\n dispatch: (tr: Transaction) => void;\n}) => void = ({node, pos, state, dispatch}) => {\n const showLineNumbers = isLineNumbersVisible(node);\n dispatch(\n state.tr.setNodeAttribute(\n pos,\n CodeBlockNodeAttr.ShowLineNumbers,\n showLineNumbers ? '' : 'true',\n ),\n );\n};\n\n/** @internal */\nexport const toggleLineWrapping: (params: {\n node: Node;\n pos: number;\n state: EditorState;\n dispatch: (tr: Transaction) => void;\n}) => void = ({pos, state, dispatch}) => {\n const {tr} = state;\n const hasLineWrapping = isNodeHasLineWrapping(state, pos);\n if (hasLineWrapping) disableLineWrapping(tr, pos);\n else enableLineWrapping(tr, pos);\n dispatch(tr);\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const PlainTextLang = "plaintext";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PlainTextLang = void 0;
4
+ exports.PlainTextLang = 'plaintext';
5
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,aAAa,GAAG,WAAW,CAAC","sourcesContent":["export const PlainTextLang = 'plaintext';\n"]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codeBlockLineNumbersPlugin = void 0;
4
+ const state_1 = require("../../../../../pm/state.js");
5
+ const utils_1 = require("../../../../../pm/utils.js");
6
+ const view_1 = require("../../../../../pm/view.js");
7
+ const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
8
+ const utils_2 = require("../utils.js");
9
+ const pluginKey = new state_1.PluginKey('code_block_line_numbers_decorations');
10
+ /** @internal */
11
+ const codeBlockLineNumbersPlugin = () => {
12
+ return new state_1.Plugin({
13
+ key: pluginKey,
14
+ state: {
15
+ init(_config, state) {
16
+ return getDecorations(state.doc);
17
+ },
18
+ apply(tr, decos) {
19
+ if (tr.docChanged) {
20
+ return getDecorations(tr.doc);
21
+ }
22
+ return decos.map(tr.mapping, tr.doc);
23
+ },
24
+ },
25
+ props: {
26
+ decorations(state) {
27
+ return pluginKey.getState(state);
28
+ },
29
+ },
30
+ });
31
+ };
32
+ exports.codeBlockLineNumbersPlugin = codeBlockLineNumbersPlugin;
33
+ function getDecorations(doc) {
34
+ const decos = [];
35
+ for (const { node, pos } of (0, utils_1.findChildrenByType)(doc, (0, CodeBlockSpecs_1.codeBlockType)(doc.type.schema), true)) {
36
+ if (!(0, utils_2.isLineNumbersVisible)(node))
37
+ continue;
38
+ const codeContent = node.textContent;
39
+ const contentByLines = codeContent.split('\n');
40
+ const maxDigits = String(contentByLines.length).length;
41
+ let shift = 0;
42
+ for (let i = 0; i < contentByLines.length; i++) {
43
+ const line = contentByLines[i];
44
+ {
45
+ const elem = document.createElement('span');
46
+ elem.classList.add('yfm-line-number');
47
+ elem.textContent = String(i + 1).padStart(maxDigits, ' ');
48
+ decos.push(view_1.Decoration.widget(pos + shift + 1, elem, { side: 1, ignoreSelection: true }));
49
+ }
50
+ shift += line.length + 1;
51
+ }
52
+ }
53
+ return view_1.DecorationSet.create(doc, decos);
54
+ }
55
+ //# sourceMappingURL=codeBlockLineNumbersPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeBlockLineNumbersPlugin.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.ts"],"names":[],"mappings":";;;AACA,sDAA4C;AAC5C,sDAA6C;AAC7C,oDAAmD;AAEnD,kEAAmD;AACnD,uCAA8C;AAE9C,MAAM,SAAS,GAAG,IAAI,iBAAS,CAAgB,qCAAqC,CAAC,CAAC;AAEtF,gBAAgB;AACT,MAAM,0BAA0B,GAAG,GAAG,EAAE;IAC3C,OAAO,IAAI,cAAM,CAAgB;QAC7B,GAAG,EAAE,SAAS;QACd,KAAK,EAAE;YACH,IAAI,CAAC,OAAO,EAAE,KAAK;gBACf,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YACD,KAAK,CAAC,EAAE,EAAE,KAAK;gBACX,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;oBAChB,OAAO,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;gBAED,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC;SACJ;QACD,KAAK,EAAE;YACH,WAAW,CAAC,KAAK;gBACb,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;SACJ;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AArBW,QAAA,0BAA0B,8BAqBrC;AAEF,SAAS,cAAc,CAAC,GAAS;IAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,IAAI,IAAA,0BAAkB,EAAC,GAAG,EAAE,IAAA,8BAAa,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACtF,IAAI,CAAC,IAAA,4BAAoB,EAAC,IAAI,CAAC;YAAE,SAAS;QAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAEvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAE/B,CAAC;gBACG,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAE1D,KAAK,CAAC,IAAI,CACN,iBAAU,CAAC,MAAM,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAC,CAAC,CAC7E,CAAC;YACN,CAAC;YAED,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,OAAO,oBAAa,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import type {Node} from '#pm/model';\nimport {Plugin, PluginKey} from '#pm/state';\nimport {findChildrenByType} from '#pm/utils';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {codeBlockType} from '../../CodeBlockSpecs';\nimport {isLineNumbersVisible} from '../utils';\n\nconst pluginKey = new PluginKey<DecorationSet>('code_block_line_numbers_decorations');\n\n/** @internal */\nexport const codeBlockLineNumbersPlugin = () => {\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config, state) {\n return getDecorations(state.doc);\n },\n apply(tr, decos) {\n if (tr.docChanged) {\n return getDecorations(tr.doc);\n }\n\n return decos.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations(state) {\n return pluginKey.getState(state);\n },\n },\n });\n};\n\nfunction getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n if (!isLineNumbersVisible(node)) continue;\n\n const codeContent = node.textContent;\n const contentByLines = codeContent.split('\\n');\n\n const maxDigits = String(contentByLines.length).length;\n\n let shift = 0;\n for (let i = 0; i < contentByLines.length; i++) {\n const line = contentByLines[i];\n\n {\n const elem = document.createElement('span');\n elem.classList.add('yfm-line-number');\n elem.textContent = String(i + 1).padStart(maxDigits, ' ');\n\n decos.push(\n Decoration.widget(pos + shift + 1, elem, {side: 1, ignoreSelection: true}),\n );\n }\n\n shift += line.length + 1;\n }\n }\n\n return DecorationSet.create(doc, decos);\n}\n"]}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.codeBlockLineWrappingPlugin = exports.isNodeHasLineWrapping = exports.hasLineWrappingDecoration = void 0;
4
+ exports.enableLineWrapping = enableLineWrapping;
5
+ exports.disableLineWrapping = disableLineWrapping;
6
+ const state_1 = require("../../../../../pm/state.js");
7
+ const view_1 = require("../../../../../pm/view.js");
8
+ const CodeBlockSpecs_1 = require("../../CodeBlockSpecs/index.js");
9
+ const pluginKey = new state_1.PluginKey('code_block_line_wrapping');
10
+ const WRAPPING_SPEC_KEY = '__code_block_line_wrapping';
11
+ const WRAPPING_SPEC_VALUE = true;
12
+ const isLineWrappingDecoration = (deco) => deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;
13
+ /** @internal */
14
+ const hasLineWrappingDecoration = (decorations) => {
15
+ return decorations.some(isLineWrappingDecoration);
16
+ };
17
+ exports.hasLineWrappingDecoration = hasLineWrappingDecoration;
18
+ /** @internal */
19
+ const isNodeHasLineWrapping = (state, pos) => {
20
+ const node = state.doc.nodeAt(pos);
21
+ if (!node || node.type !== (0, CodeBlockSpecs_1.codeBlockType)(state.doc.type.schema))
22
+ return false;
23
+ const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);
24
+ return decos?.some(isLineWrappingDecoration) ?? false;
25
+ };
26
+ exports.isNodeHasLineWrapping = isNodeHasLineWrapping;
27
+ /** @internal */
28
+ function enableLineWrapping(tr, pos) {
29
+ return tr.setMeta(pluginKey, { type: 'add', pos });
30
+ }
31
+ /** @internal */
32
+ function disableLineWrapping(tr, pos) {
33
+ return tr.setMeta(pluginKey, { type: 'remove', pos });
34
+ }
35
+ /** @internal */
36
+ const codeBlockLineWrappingPlugin = () => {
37
+ return new state_1.Plugin({
38
+ key: pluginKey,
39
+ state: {
40
+ init() {
41
+ return {
42
+ decorations: view_1.DecorationSet.empty,
43
+ };
44
+ },
45
+ apply(tr, value) {
46
+ let decorations = value.decorations.map(tr.mapping, tr.doc);
47
+ if (tr.getMeta(pluginKey)) {
48
+ const meta = tr.getMeta(pluginKey);
49
+ if (meta.type === 'add') {
50
+ const node = tr.doc.nodeAt(meta.pos);
51
+ if (node?.type === (0, CodeBlockSpecs_1.codeBlockType)(tr.doc.type.schema)) {
52
+ const from = meta.pos;
53
+ const to = meta.pos + node.nodeSize;
54
+ decorations = decorations.add(tr.doc, [
55
+ view_1.Decoration.node(from, to, {}, { [WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE }),
56
+ ]);
57
+ }
58
+ }
59
+ else if (meta.type === 'remove') {
60
+ const node = tr.doc.nodeAt(meta.pos);
61
+ if (node?.type === (0, CodeBlockSpecs_1.codeBlockType)(tr.doc.type.schema)) {
62
+ const start = meta.pos + 1;
63
+ const end = meta.pos + node.nodeSize - 1;
64
+ const found = decorations.find(start, end);
65
+ decorations = decorations.remove(found);
66
+ }
67
+ }
68
+ }
69
+ return { decorations };
70
+ },
71
+ },
72
+ props: {
73
+ decorations(state) {
74
+ return pluginKey.getState(state)?.decorations;
75
+ },
76
+ },
77
+ });
78
+ };
79
+ exports.codeBlockLineWrappingPlugin = codeBlockLineWrappingPlugin;
80
+ //# sourceMappingURL=codeBlockLineWrappingPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeBlockLineWrappingPlugin.js","sourceRoot":"../../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineWrappingPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {type EditorState, Plugin, PluginKey, type Transaction} from '#pm/state';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {codeBlockType} from '../../CodeBlockSpecs';\n\ntype StateShape = {\n decorations: DecorationSet;\n};\n\nconst pluginKey = new PluginKey<StateShape>('code_block_line_wrapping');\n\ntype Meta = {\n type: 'add' | 'remove';\n pos: number;\n};\n\nconst WRAPPING_SPEC_KEY = '__code_block_line_wrapping';\nconst WRAPPING_SPEC_VALUE = true;\n\nconst isLineWrappingDecoration = (deco: Decoration) =>\n deco.spec?.[WRAPPING_SPEC_KEY] === WRAPPING_SPEC_VALUE;\n\n/** @internal */\nexport const hasLineWrappingDecoration = (decorations: readonly Decoration[]): boolean => {\n return decorations.some(isLineWrappingDecoration);\n};\n\n/** @internal */\nexport const isNodeHasLineWrapping = (state: EditorState, pos: number): boolean => {\n const node = state.doc.nodeAt(pos);\n if (!node || node.type !== codeBlockType(state.doc.type.schema)) return false;\n const decos = pluginKey.getState(state)?.decorations.find(pos + 1, pos + node.nodeSize - 1);\n return decos?.some(isLineWrappingDecoration) ?? false;\n};\n\n/** @internal */\nexport function enableLineWrapping(tr: Transaction, pos: number): Transaction {\n return tr.setMeta(pluginKey, {type: 'add', pos} satisfies Meta);\n}\n\n/** @internal */\nexport function disableLineWrapping(tr: Transaction, pos: number): Transaction {\n return tr.setMeta(pluginKey, {type: 'remove', pos} satisfies Meta);\n}\n\n/** @internal */\nexport const codeBlockLineWrappingPlugin = () => {\n return new Plugin<StateShape>({\n key: pluginKey,\n state: {\n init() {\n return {\n decorations: DecorationSet.empty,\n };\n },\n apply(tr, value) {\n let decorations = value.decorations.map(tr.mapping, tr.doc);\n\n if (tr.getMeta(pluginKey)) {\n const meta = tr.getMeta(pluginKey) as Meta;\n\n if (meta.type === 'add') {\n const node = tr.doc.nodeAt(meta.pos);\n if (node?.type === codeBlockType(tr.doc.type.schema)) {\n const from = meta.pos;\n const to = meta.pos + node.nodeSize;\n decorations = decorations.add(tr.doc, [\n Decoration.node(\n from,\n to,\n {},\n {[WRAPPING_SPEC_KEY]: WRAPPING_SPEC_VALUE},\n ),\n ]);\n }\n } else if (meta.type === 'remove') {\n const node = tr.doc.nodeAt(meta.pos);\n if (node?.type === codeBlockType(tr.doc.type.schema)) {\n const start = meta.pos + 1;\n const end = meta.pos + node.nodeSize - 1;\n const found = decorations.find(start, end);\n decorations = decorations.remove(found);\n }\n }\n }\n\n return {decorations};\n },\n },\n props: {\n decorations(state) {\n return pluginKey.getState(state)?.decorations;\n },\n },\n });\n};\n"]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isLineNumbersVisible = isLineNumbersVisible;
4
+ const CodeBlockSpecs_1 = require("../CodeBlockSpecs/index.js");
5
+ /** @internal */
6
+ function isLineNumbersVisible(node) {
7
+ return node.attrs[CodeBlockSpecs_1.CodeBlockNodeAttr.ShowLineNumbers] === 'true';
8
+ }
9
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/utils.ts"],"names":[],"mappings":";;AAKA,oDAEC;AALD,+DAAoD;AAEpD,gBAAgB;AAChB,SAAgB,oBAAoB,CAAC,IAAU;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,kCAAiB,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC;AACpE,CAAC","sourcesContent":["import type {Node} from '#pm/model';\n\nimport {CodeBlockNodeAttr} from '../CodeBlockSpecs';\n\n/** @internal */\nexport function isLineNumbersVisible(node: Node): boolean {\n return node.attrs[CodeBlockNodeAttr.ShowLineNumbers] === 'true';\n}\n"]}
@@ -22,6 +22,7 @@ export type LineNumbersOptions = {
22
22
  };
23
23
  export type CodeBlockSpecsOptions = {
24
24
  nodeview?: ExtensionNodeSpec['view'];
25
+ /** Configure line numbers in code block */
25
26
  lineNumbers?: LineNumbersOptions;
26
27
  };
27
28
  export declare const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n /** Configure line numbers in code block */\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
@@ -7,6 +7,14 @@ export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlock
7
7
  export type CodeBlockOptions = CodeBlockSpecsOptions & {
8
8
  codeBlockKey?: string | null;
9
9
  langs?: HighlightLangMap;
10
+ /** Configure line wrapping toggle in code block */
11
+ lineWrapping?: {
12
+ /**
13
+ * Enable line wrapping toggling in code block
14
+ * @default false
15
+ */
16
+ enabled?: boolean;
17
+ };
10
18
  };
11
19
  export declare const CodeBlock: ExtensionAuto<CodeBlockOptions>;
12
20
  declare global {
@@ -19,6 +19,9 @@ Object.defineProperty(exports, "codeBlockType", { enumerable: true, get: functio
19
19
  const CodeBlock = (builder, opts) => {
20
20
  const optsNormalized = {
21
21
  ...opts,
22
+ lineWrapping: {
23
+ enabled: opts.lineWrapping?.enabled || false,
24
+ },
22
25
  lineNumbers: {
23
26
  enabled: typeof opts.lineNumbers?.enabled === 'boolean'
24
27
  ? opts.lineNumbers.enabled
@@ -54,6 +57,7 @@ const CodeBlock = (builder, opts) => {
54
57
  builder.use(CodeBlockHighlight_1.CodeBlockHighlight, {
55
58
  langs: optsNormalized.langs,
56
59
  lineNumbers: optsNormalized.lineNumbers,
60
+ lineWrapping: optsNormalized.lineWrapping,
57
61
  });
58
62
  }
59
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":";;;AAEA,gDAA8C;AAC9C,+CAAsC;AACtC,6DAA4D;AAC5D,qDAA+C;AAE/C,mFAAkG;AAClG,8DAA4E;AAC5E,4CAA2E;AAC3E,sCAA2E;AAC3E,4EAAoE;AAEpE,0CAA0C;AAAlC,0GAAA,cAAc,OAAA;AACtB,4DAAqF;AAA7E,mHAAA,iBAAiB,OAAA;AAAE,mHAAA,iBAAiB,OAAA;AAAE,+GAAA,aAAa,OAAA;AAOpD,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,MAAM,cAAc,GAAqB;QACrC,GAAG,IAAI;QACP,WAAW,EAAE;YACT,OAAO,EACH,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,KAAK,SAAS;gBAC1C,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO;gBAC1B,CAAC,CAAC,iCAAyB,CAAC,OAAO;YAC3C,aAAa,EACT,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,KAAK,SAAS;gBAChD,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa;gBAChC,CAAC,CAAC,iCAAyB,CAAC,aAAa;SACpD;KACJ,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,+BAAc,EAAE,cAAc,CAAC,CAAC;IAE5C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,EAAC,YAAY,EAAC,GAAG,cAAc,CAAC;QACtC,MAAM,QAAQ,GAAW,EAAC,KAAK,EAAE,wBAAa,EAAE,SAAS,EAAE,yBAAc,EAAC,CAAC;QAC3E,IAAI,YAAY,EAAE,CAAC;YACf,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAA,sBAAa,EAAC,YAAY,EAAE,IAAA,2BAAgB,EAAC,IAAI,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,aAAa,CAAC,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,SAAS,CAAC,gBAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;QACjC,MAAM,EAAE,GAAG,IAAA,qBAAa,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO;YACH,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,2BAAmB,EAAC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;YAC7D,QAAQ,EAAE,IAAA,2BAAgB,EAAC,IAAI,CAAC;YAChC,GAAG,EAAE,IAAA,2BAAgB,EAAC,IAAI,CAAC;SAC9B,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,SAAS,CAAC,2CAAoB,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/D,IAAI,IAAA,mBAAU,EAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,uCAAkB,EAAE;YAC5B,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,WAAW,EAAE,cAAc,CAAC,WAAW;SAC1C,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAC;AA9CW,QAAA,SAAS,aA8CpB;AAUF,mEAAmE;AACnE,6DAA6D;AAC7D,SAAS,aAAa,CAAC,QAAkB;IACrC,OAAO,IAAA,mCAAsB,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {hasParentNodeOfType} from '#pm/utils';\nimport {isFunction} from 'src/lodash';\nimport {textblockTypeInputRule} from 'src/utils/inputrules';\nimport {withLogAction} from 'src/utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {CodeBlockSpecs, type CodeBlockSpecsOptions} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType, lineNumbersOptionsDefault} from './const';\nimport {codeBlockPastePlugin} from './plugins/codeBlockPastePlugin';\n\nexport {resetCodeblock} from './commands';\nexport {codeBlockNodeName, CodeBlockNodeAttr, codeBlockType} from './CodeBlockSpecs';\n\nexport type CodeBlockOptions = CodeBlockSpecsOptions & {\n codeBlockKey?: string | null;\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {\n const optsNormalized: CodeBlockOptions = {\n ...opts,\n lineNumbers: {\n enabled:\n typeof opts.lineNumbers?.enabled === 'boolean'\n ? opts.lineNumbers.enabled\n : lineNumbersOptionsDefault.enabled,\n showByDefault:\n typeof opts.lineNumbers?.showByDefault === 'boolean'\n ? opts.lineNumbers.showByDefault\n : lineNumbersOptionsDefault.showByDefault,\n },\n };\n\n builder.use(CodeBlockSpecs, optsNormalized);\n\n builder.addKeymap((deps) => {\n const {codeBlockKey} = optsNormalized;\n const bindings: Keymap = {Enter: newlineInCode, Backspace: resetCodeblock};\n if (codeBlockKey) {\n bindings[codeBlockKey] = withLogAction('code_block', setCodeBlockType(deps));\n }\n return bindings;\n });\n\n builder.addInputRules(({schema}) => ({rules: [codeBlockRule(codeBlockType(schema))]}));\n builder.addAction(cbAction, (deps) => {\n const cb = codeBlockType(deps.schema);\n return {\n isActive: (state) => hasParentNodeOfType(cb)(state.selection),\n isEnable: setCodeBlockType(deps),\n run: setCodeBlockType(deps),\n };\n });\n\n builder.addPlugin(codeBlockPastePlugin, builder.Priority.High);\n\n if (isFunction(optsNormalized.langs)) {\n builder.use(optsNormalized.langs);\n } else {\n builder.use(CodeBlockHighlight, {\n langs: optsNormalized.langs,\n lineNumbers: optsNormalized.lineNumbers,\n });\n }\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [cbAction]: Action;\n }\n }\n}\n\n// Given a code block node type, returns an input rule that turns a\n// textblock starting with three backticks into a code block.\nfunction codeBlockRule(nodeType: NodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {hasParentNodeOfType} from '#pm/utils';\nimport {isFunction} from 'src/lodash';\nimport {textblockTypeInputRule} from 'src/utils/inputrules';\nimport {withLogAction} from 'src/utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {CodeBlockSpecs, type CodeBlockSpecsOptions} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType, lineNumbersOptionsDefault} from './const';\nimport {codeBlockPastePlugin} from './plugins/codeBlockPastePlugin';\n\nexport {resetCodeblock} from './commands';\nexport {codeBlockNodeName, CodeBlockNodeAttr, codeBlockType} from './CodeBlockSpecs';\n\nexport type CodeBlockOptions = CodeBlockSpecsOptions & {\n codeBlockKey?: string | null;\n langs?: HighlightLangMap;\n /** Configure line wrapping toggle in code block */\n lineWrapping?: {\n /**\n * Enable line wrapping toggling in code block\n * @default false\n */\n enabled?: boolean;\n };\n};\n\nexport const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {\n const optsNormalized: CodeBlockOptions = {\n ...opts,\n lineWrapping: {\n enabled: opts.lineWrapping?.enabled || false,\n },\n lineNumbers: {\n enabled:\n typeof opts.lineNumbers?.enabled === 'boolean'\n ? opts.lineNumbers.enabled\n : lineNumbersOptionsDefault.enabled,\n showByDefault:\n typeof opts.lineNumbers?.showByDefault === 'boolean'\n ? opts.lineNumbers.showByDefault\n : lineNumbersOptionsDefault.showByDefault,\n },\n };\n\n builder.use(CodeBlockSpecs, optsNormalized);\n\n builder.addKeymap((deps) => {\n const {codeBlockKey} = optsNormalized;\n const bindings: Keymap = {Enter: newlineInCode, Backspace: resetCodeblock};\n if (codeBlockKey) {\n bindings[codeBlockKey] = withLogAction('code_block', setCodeBlockType(deps));\n }\n return bindings;\n });\n\n builder.addInputRules(({schema}) => ({rules: [codeBlockRule(codeBlockType(schema))]}));\n builder.addAction(cbAction, (deps) => {\n const cb = codeBlockType(deps.schema);\n return {\n isActive: (state) => hasParentNodeOfType(cb)(state.selection),\n isEnable: setCodeBlockType(deps),\n run: setCodeBlockType(deps),\n };\n });\n\n builder.addPlugin(codeBlockPastePlugin, builder.Priority.High);\n\n if (isFunction(optsNormalized.langs)) {\n builder.use(optsNormalized.langs);\n } else {\n builder.use(CodeBlockHighlight, {\n langs: optsNormalized.langs,\n lineNumbers: optsNormalized.lineNumbers,\n lineWrapping: optsNormalized.lineWrapping,\n });\n }\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [cbAction]: Action;\n }\n }\n}\n\n// Given a code block node type, returns an input rule that turns a\n// textblock starting with three backticks into a code block.\nfunction codeBlockRule(nodeType: NodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "remove": "Remove",
3
3
  "empty_option": "No matches found",
4
+ "code_wrapping": "Text wrapping",
4
5
  "show_line_numbers": "Line numbers"
5
6
  }
@@ -1,7 +1,8 @@
1
- export declare const i18n: <G extends "remove" | "empty_option" | "show_line_numbers", S extends string>(key: G | (string extends S ? S : never), params?: {
1
+ export declare const i18n: <G extends "remove" | "empty_option" | "code_wrapping" | "show_line_numbers", S extends string>(key: G | (string extends S ? S : never), params?: {
2
2
  [key: string]: any;
3
3
  }) => S extends G ? {
4
4
  remove: string;
5
5
  empty_option: string;
6
+ code_wrapping: string;
6
7
  show_line_numbers: string;
7
8
  }[G] : string;
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "remove": "Удалить",
3
3
  "empty_option": "Ничего не найдено",
4
+ "code_wrapping": "Перенос текста",
4
5
  "show_line_numbers": "Нумерация строк"
5
6
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "code_wrapping": "Text wrapping"
3
+ }
@@ -0,0 +1,5 @@
1
+ export declare const i18n: <G extends "code_wrapping", S extends string>(key: G | (string extends S ? S : never), params?: {
2
+ [key: string]: any;
3
+ }) => S extends G ? {
4
+ code_wrapping: string;
5
+ }[G] : string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.i18n = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const i18n_1 = require("../i18n.js");
6
+ const en_json_1 = tslib_1.__importDefault(require("./en.json"));
7
+ const ru_json_1 = tslib_1.__importDefault(require("./ru.json"));
8
+ const KEYSET = 'widgets';
9
+ exports.i18n = (0, i18n_1.registerKeyset)(KEYSET, { en: en_json_1.default, ru: ru_json_1.default });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["i18n/viewer/index.ts"],"names":[],"mappings":";;;;AAAA,qCAAuC;AAEvC,gEAA2B;AAC3B,gEAA2B;AAE3B,MAAM,MAAM,GAAG,SAAS,CAAC;AAEZ,QAAA,IAAI,GAAG,IAAA,qBAAc,EAAC,MAAM,EAAE,EAAC,EAAE,EAAF,iBAAE,EAAE,EAAE,EAAF,iBAAE,EAAC,CAAC,CAAC","sourcesContent":["import {registerKeyset} from '../i18n';\n\nimport en from './en.json';\nimport ru from './ru.json';\n\nconst KEYSET = 'widgets';\n\nexport const i18n = registerKeyset(KEYSET, {en, ru});\n"]}
@@ -0,0 +1,3 @@
1
+ {
2
+ "code_wrapping": "Перенос текста"
3
+ }
@@ -9,7 +9,7 @@ export type BaseTooltipNode = {
9
9
  node: Node;
10
10
  dom: HTMLElement | null;
11
11
  };
12
- export type TooltipContentCb = (view: EditorView, node: BaseTooltipNode, onChange?: (attrs: Record<string, string>) => void, forceEdit?: boolean, onOutsideClick?: () => void) => React.ReactElement | null;
12
+ export type TooltipContentCb = (view: EditorView, node: BaseTooltipNode, onChange?: (attrs: Record<string, string>) => void, forceEdit?: boolean, onOutsideClick?: () => void, rerender?: () => void) => React.ReactElement | null;
13
13
  export interface BaseTooltipPluginOptions {
14
14
  idPrefix: string;
15
15
  content?: TooltipContentCb;
@@ -163,7 +163,7 @@ class BaseTooltipPluginView {
163
163
  return null;
164
164
  // hack for popup rerender
165
165
  window.dispatchEvent(new CustomEvent('scroll'));
166
- return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || exports.defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: (0, jsx_runtime_1.jsx)("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb) }) }));
166
+ return ((0, jsx_runtime_1.jsx)(uikit_1.Popup, { open: true, hasArrow: false, anchorElement: currentNode.dom, placement: this.popupPlacement || exports.defaultPlacement, onOpenChange: this.popupOpenChangeHandler, children: (0, jsx_runtime_1.jsx)("div", { className: b(), children: this.content(this.view, currentNode, this.changeAttrsCb, undefined, undefined, () => this.render()) }) }));
167
167
  }
168
168
  createRenderItem() {
169
169
  return (0, extensions_1.getReactRendererFromState)(this.view.state).createItem(this.idPrefix, () => this.currentNode && !this.manualHidden ? ((0, jsx_runtime_1.jsx)(ErrorBoundary_1.ErrorLoggerBoundary, { children: this.renderContent(this.currentNode) })) : null);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["plugins/BaseTooltip/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {Mark, MarkType, Node, NodeType} from 'prosemirror-model';\nimport {NodeSelection, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos, findParentNodeOfType, findSelectedNodeOfType} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../classname';\nimport {type RendererItem, getReactRendererFromState} from '../../extensions';\nimport {ErrorLoggerBoundary} from '../../react-utils/ErrorBoundary';\n\nimport './index.scss';\n\nexport type BaseTooltipNode = {\n pos: number;\n node: Node;\n dom: HTMLElement | null;\n};\n\nexport type TooltipContentCb = (\n view: EditorView,\n node: BaseTooltipNode,\n onChange?: (attrs: Record<string, string>) => void,\n forceEdit?: boolean,\n onOutsideClick?: () => void,\n) => React.ReactElement | null;\n\nexport interface BaseTooltipPluginOptions {\n idPrefix: string;\n content?: TooltipContentCb;\n nodeType: NodeType | MarkType;\n popupPlacement?: PopupPlacement;\n disableHideOnEscapeKeyDown?: boolean;\n}\n\nexport const BaseTooltipCn = cn('base-tooltip');\nexport const defaultPlacement: PopupPlacement = [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n];\nconst b = BaseTooltipCn;\nexport const baseTooltipContentCn = cn('base-tooltip-content');\n\nexport type TooltipOnChangeCallback = (\n attrs: Record<string, string>,\n options?: {setFocus?: boolean; setSelection?: boolean; hideTooltip?: boolean; marks?: Mark[]},\n) => void;\n\nexport type TooltipContentProps = {\n node: BaseTooltipNode;\n view: EditorView;\n onChange?: TooltipOnChangeCallback;\n toggleEdit?: () => void;\n};\n\nexport class BaseTooltipPluginView implements PluginView {\n protected view: EditorView;\n protected currentNode: BaseTooltipNode | null = null;\n protected readonly content?: TooltipContentCb;\n protected readonly nodeType: NodeType | MarkType;\n protected readonly popupPlacement?: PopupPlacement;\n protected manualHidden = false;\n protected destroyed = false;\n\n protected readonly disableHideOnEscapeKeyDown?: boolean;\n\n protected focusTrackingRafId: number | null = null;\n\n private readonly idPrefix: string;\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, options: BaseTooltipPluginOptions) {\n this.view = view;\n this.idPrefix = options.idPrefix;\n this.content = options.content;\n this.nodeType = options.nodeType;\n this.popupPlacement = options.popupPlacement;\n this.disableHideOnEscapeKeyDown = options.disableHideOnEscapeKeyDown;\n }\n\n update(view: EditorView) {\n this.view = view;\n\n this.updateTooltipView();\n }\n\n destroy() {\n this.destroyed = true;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown = (): boolean => {\n if (this.disableHideOnEscapeKeyDown) return false;\n if (this.currentNode && !this.manualHidden) {\n this.hidePopupManual();\n return true;\n }\n return false;\n };\n\n protected setCurrentNode(node: NodeType) {\n const view = this.view;\n const domAtPos = view.domAtPos.bind(view);\n\n const {selection} = view.state;\n const {$from, $to} = selection;\n\n const parent =\n findSelectedNodeOfType(node)(selection) || findParentNodeOfType(node)(selection);\n\n if (!parent || !$from.node(parent.depth).eq($to.node(parent.depth))) {\n this.currentNode = null;\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n return;\n }\n\n if (\n !this.currentNode ||\n !this.currentNode.node.eq(parent.node) ||\n this.currentNode.pos !== parent.pos\n ) {\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n }\n\n const {pos, node: parentNode} = parent;\n const dom = findDomRefAtPos(pos, domAtPos) as HTMLElement;\n\n this.currentNode = {\n pos,\n node: parentNode,\n dom,\n };\n }\n\n protected changeAttrsCb: TooltipOnChangeCallback = (attrs, options) => {\n if (this.currentNode) {\n let tr = this.view.state.tr.setNodeMarkup(\n this.currentNode.pos,\n undefined,\n {\n ...this.currentNode.node.attrs,\n ...attrs,\n },\n options?.marks || [],\n );\n\n if (options?.setSelection) {\n tr = tr.setSelection(NodeSelection.create(tr.doc, this.currentNode.pos));\n }\n\n this.view.dispatch(tr);\n\n if (options?.setFocus) {\n this.view.focus();\n }\n\n if (options?.hideTooltip) {\n this.hidePopupManual();\n }\n }\n };\n\n protected updateTooltipView() {\n const oldNode = this.currentNode;\n this.setCurrentNode(this.view.state.schema.nodes[this.nodeType.name]);\n\n // Do not rerender if we have the same node in selection\n if (\n oldNode &&\n this.currentNode?.node.eq(oldNode.node) &&\n this.currentNode.pos === oldNode.pos &&\n this.currentNode.dom === oldNode.dom\n )\n return;\n\n this.render();\n }\n\n protected render() {\n if (this.destroyed) return;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n protected onOutsideClick: PopupProps['onOutsideClick'] = () => {\n this.hidePopupManual();\n };\n\n protected popupOpenChangeHandler: PopupProps['onOpenChange'] = (open, event, reason) => {\n if (open) return;\n if (reason === 'focus-out' && (event as FocusEvent).relatedTarget === this.view.dom) return;\n if (this.disableHideOnEscapeKeyDown && reason === 'escape-key') return;\n\n this.hidePopupManual();\n\n requestAnimationFrame(() => {\n if (this.destroyed || this.view.hasFocus()) return;\n this.startTrackingViewFocus();\n });\n };\n\n protected startTrackingViewFocus() {\n this.focusTrackingRafId = requestAnimationFrame(() => {\n if (this.destroyed) return;\n if (this.view.hasFocus()) {\n this.focusTrackingRafId = null;\n this.manualHidden = false;\n this.render();\n return;\n }\n this.startTrackingViewFocus();\n });\n }\n\n protected stopTrackingViewFocus() {\n if (this.focusTrackingRafId !== null) {\n cancelAnimationFrame(this.focusTrackingRafId);\n this.focusTrackingRafId = null;\n }\n }\n\n protected hidePopupManual() {\n this.manualHidden = true;\n this.render();\n }\n\n protected renderContent(currentNode: BaseTooltipNode): React.ReactNode {\n if (!this.content) return null;\n // hack for popup rerender\n window.dispatchEvent(new CustomEvent('scroll'));\n return (\n <Popup\n open\n hasArrow={false}\n anchorElement={currentNode.dom}\n placement={this.popupPlacement || defaultPlacement}\n onOpenChange={this.popupOpenChangeHandler}\n >\n <div className={b()}>\n {this.content(this.view, currentNode, this.changeAttrsCb)}\n </div>\n </Popup>\n );\n }\n\n protected createRenderItem() {\n return getReactRendererFromState(this.view.state)!.createItem(this.idPrefix, () =>\n this.currentNode && !this.manualHidden ? (\n <ErrorLoggerBoundary>{this.renderContent(this.currentNode)}</ErrorLoggerBoundary>\n ) : null,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["plugins/BaseTooltip/index.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {Mark, MarkType, Node, NodeType} from 'prosemirror-model';\nimport {NodeSelection, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos, findParentNodeOfType, findSelectedNodeOfType} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../classname';\nimport {type RendererItem, getReactRendererFromState} from '../../extensions';\nimport {ErrorLoggerBoundary} from '../../react-utils/ErrorBoundary';\n\nimport './index.scss';\n\nexport type BaseTooltipNode = {\n pos: number;\n node: Node;\n dom: HTMLElement | null;\n};\n\nexport type TooltipContentCb = (\n view: EditorView,\n node: BaseTooltipNode,\n onChange?: (attrs: Record<string, string>) => void,\n forceEdit?: boolean,\n onOutsideClick?: () => void,\n rerender?: () => void,\n) => React.ReactElement | null;\n\nexport interface BaseTooltipPluginOptions {\n idPrefix: string;\n content?: TooltipContentCb;\n nodeType: NodeType | MarkType;\n popupPlacement?: PopupPlacement;\n disableHideOnEscapeKeyDown?: boolean;\n}\n\nexport const BaseTooltipCn = cn('base-tooltip');\nexport const defaultPlacement: PopupPlacement = [\n 'bottom-start',\n 'top-start',\n 'bottom-end',\n 'top-end',\n];\nconst b = BaseTooltipCn;\nexport const baseTooltipContentCn = cn('base-tooltip-content');\n\nexport type TooltipOnChangeCallback = (\n attrs: Record<string, string>,\n options?: {setFocus?: boolean; setSelection?: boolean; hideTooltip?: boolean; marks?: Mark[]},\n) => void;\n\nexport type TooltipContentProps = {\n node: BaseTooltipNode;\n view: EditorView;\n onChange?: TooltipOnChangeCallback;\n toggleEdit?: () => void;\n};\n\nexport class BaseTooltipPluginView implements PluginView {\n protected view: EditorView;\n protected currentNode: BaseTooltipNode | null = null;\n protected readonly content?: TooltipContentCb;\n protected readonly nodeType: NodeType | MarkType;\n protected readonly popupPlacement?: PopupPlacement;\n protected manualHidden = false;\n protected destroyed = false;\n\n protected readonly disableHideOnEscapeKeyDown?: boolean;\n\n protected focusTrackingRafId: number | null = null;\n\n private readonly idPrefix: string;\n private renderItem?: RendererItem;\n\n constructor(view: EditorView, options: BaseTooltipPluginOptions) {\n this.view = view;\n this.idPrefix = options.idPrefix;\n this.content = options.content;\n this.nodeType = options.nodeType;\n this.popupPlacement = options.popupPlacement;\n this.disableHideOnEscapeKeyDown = options.disableHideOnEscapeKeyDown;\n }\n\n update(view: EditorView) {\n this.view = view;\n\n this.updateTooltipView();\n }\n\n destroy() {\n this.destroyed = true;\n this.renderItem?.remove();\n this.renderItem = undefined;\n }\n\n onEscapeDown = (): boolean => {\n if (this.disableHideOnEscapeKeyDown) return false;\n if (this.currentNode && !this.manualHidden) {\n this.hidePopupManual();\n return true;\n }\n return false;\n };\n\n protected setCurrentNode(node: NodeType) {\n const view = this.view;\n const domAtPos = view.domAtPos.bind(view);\n\n const {selection} = view.state;\n const {$from, $to} = selection;\n\n const parent =\n findSelectedNodeOfType(node)(selection) || findParentNodeOfType(node)(selection);\n\n if (!parent || !$from.node(parent.depth).eq($to.node(parent.depth))) {\n this.currentNode = null;\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n return;\n }\n\n if (\n !this.currentNode ||\n !this.currentNode.node.eq(parent.node) ||\n this.currentNode.pos !== parent.pos\n ) {\n this.manualHidden = false;\n this.stopTrackingViewFocus();\n }\n\n const {pos, node: parentNode} = parent;\n const dom = findDomRefAtPos(pos, domAtPos) as HTMLElement;\n\n this.currentNode = {\n pos,\n node: parentNode,\n dom,\n };\n }\n\n protected changeAttrsCb: TooltipOnChangeCallback = (attrs, options) => {\n if (this.currentNode) {\n let tr = this.view.state.tr.setNodeMarkup(\n this.currentNode.pos,\n undefined,\n {\n ...this.currentNode.node.attrs,\n ...attrs,\n },\n options?.marks || [],\n );\n\n if (options?.setSelection) {\n tr = tr.setSelection(NodeSelection.create(tr.doc, this.currentNode.pos));\n }\n\n this.view.dispatch(tr);\n\n if (options?.setFocus) {\n this.view.focus();\n }\n\n if (options?.hideTooltip) {\n this.hidePopupManual();\n }\n }\n };\n\n protected updateTooltipView() {\n const oldNode = this.currentNode;\n this.setCurrentNode(this.view.state.schema.nodes[this.nodeType.name]);\n\n // Do not rerender if we have the same node in selection\n if (\n oldNode &&\n this.currentNode?.node.eq(oldNode.node) &&\n this.currentNode.pos === oldNode.pos &&\n this.currentNode.dom === oldNode.dom\n )\n return;\n\n this.render();\n }\n\n protected render() {\n if (this.destroyed) return;\n this.renderItem = this.renderItem ?? this.createRenderItem();\n this.renderItem.rerender();\n }\n\n protected onOutsideClick: PopupProps['onOutsideClick'] = () => {\n this.hidePopupManual();\n };\n\n protected popupOpenChangeHandler: PopupProps['onOpenChange'] = (open, event, reason) => {\n if (open) return;\n if (reason === 'focus-out' && (event as FocusEvent).relatedTarget === this.view.dom) return;\n if (this.disableHideOnEscapeKeyDown && reason === 'escape-key') return;\n\n this.hidePopupManual();\n\n requestAnimationFrame(() => {\n if (this.destroyed || this.view.hasFocus()) return;\n this.startTrackingViewFocus();\n });\n };\n\n protected startTrackingViewFocus() {\n this.focusTrackingRafId = requestAnimationFrame(() => {\n if (this.destroyed) return;\n if (this.view.hasFocus()) {\n this.focusTrackingRafId = null;\n this.manualHidden = false;\n this.render();\n return;\n }\n this.startTrackingViewFocus();\n });\n }\n\n protected stopTrackingViewFocus() {\n if (this.focusTrackingRafId !== null) {\n cancelAnimationFrame(this.focusTrackingRafId);\n this.focusTrackingRafId = null;\n }\n }\n\n protected hidePopupManual() {\n this.manualHidden = true;\n this.render();\n }\n\n protected renderContent(currentNode: BaseTooltipNode): React.ReactNode {\n if (!this.content) return null;\n // hack for popup rerender\n window.dispatchEvent(new CustomEvent('scroll'));\n return (\n <Popup\n open\n hasArrow={false}\n anchorElement={currentNode.dom}\n placement={this.popupPlacement || defaultPlacement}\n onOpenChange={this.popupOpenChangeHandler}\n >\n <div className={b()}>\n {this.content(\n this.view,\n currentNode,\n this.changeAttrsCb,\n undefined,\n undefined,\n () => this.render(),\n )}\n </div>\n </Popup>\n );\n }\n\n protected createRenderItem() {\n return getReactRendererFromState(this.view.state)!.createItem(this.idPrefix, () =>\n this.currentNode && !this.manualHidden ? (\n <ErrorLoggerBoundary>{this.renderContent(this.currentNode)}</ErrorLoggerBoundary>\n ) : null,\n );\n }\n}\n"]}
@@ -2,7 +2,7 @@ import { type ReactNode } from 'react';
2
2
  import type { ToolbarBaseProps, ToolbarItemData } from "./types.js";
3
3
  import "./ToolbarButton.css";
4
4
  export type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;
5
- export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'> & {
5
+ export type ToolbarButtonViewProps = Pick<ToolbarItemData<unknown>, 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa' | 'theme'> & {
6
6
  active: boolean;
7
7
  enabled: boolean;
8
8
  onClick: () => void;
@@ -12,7 +12,7 @@ const const_1 = require("./const.js");
12
12
  require("./ToolbarButton.css");
13
13
  const b = (0, classname_1.cn)('toolbar-button');
14
14
  const DEFAULT_ICON_SIZE = 16;
15
- exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, hintWhenDisabled, active, enabled, onClick, className, qa, id, disableTooltip, ...props }, ref) {
15
+ exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({ title, hint, hotkey, theme = 'normal', hintWhenDisabled, active, enabled, onClick, className, qa, id, disableTooltip, ...props }, ref) {
16
16
  const disabled = !active && !enabled;
17
17
  const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
18
18
  const hintText = (0, lodash_1.isFunction)(hint) ? hint() : hint;
@@ -26,7 +26,7 @@ exports.ToolbarButtonView = (0, react_1.forwardRef)(function ToolbarButtonView({
26
26
  (0, uikit_1.setRef)(ref, elem);
27
27
  (0, uikit_1.setRef)(refForPopover, elem);
28
28
  (0, uikit_1.setRef)(refForTooltip, elem);
29
- }, selected: active, disabled: disabled, view: active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
29
+ }, selected: active, disabled: disabled, view: theme === 'danger' ? 'flat-danger' : active ? 'normal' : 'flat', onClick: onClick, className: b(null, [className]), "aria-label": titleText, "data-toolbar-item": id, children: 'icon' in props ? ((0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: props.icon.data, size: props.icon.size ?? DEFAULT_ICON_SIZE })) : (props.children) })) })) }));
30
30
  });
31
31
  function ToolbarButton(props) {
32
32
  const { id, editor, focus, isActive, isEnable, exec, onClick } = props;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n id?: string;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode}) &\n Pick<ToolbarBaseProps<unknown>, 'disableTooltip'>;\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {\n title,\n hint,\n hotkey,\n hintWhenDisabled,\n active,\n enabled,\n onClick,\n className,\n qa,\n id,\n disableTooltip,\n ...props\n },\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n disabled={disableTooltip}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={active ? 'normal' : 'flat'}\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n data-toolbar-item={id}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
1
+ {"version":3,"file":"ToolbarButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, forwardRef} from 'react';\n\nimport {ActionTooltip, Button, Icon, Popover, setRef} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\n\nimport {ToolbarTooltipDelay} from './const';\nimport type {ToolbarBaseProps, ToolbarItemData} from './types';\n\nimport './ToolbarButton.scss';\n\nconst b = cn('toolbar-button');\n\nexport type ToolbarButtonProps<E> = ToolbarBaseProps<E> & ToolbarItemData<E>;\n\nexport type ToolbarButtonViewProps = Pick<\n ToolbarItemData<unknown>,\n 'title' | 'hint' | 'hotkey' | 'hintWhenDisabled' | 'qa' | 'theme'\n> & {\n active: boolean;\n enabled: boolean;\n onClick: () => void;\n id?: string;\n className?: string;\n} & (Pick<ToolbarItemData<unknown>, 'icon'> | {children: ReactNode}) &\n Pick<ToolbarBaseProps<unknown>, 'disableTooltip'>;\n\nconst DEFAULT_ICON_SIZE = 16;\n\nexport const ToolbarButtonView = forwardRef<HTMLButtonElement, ToolbarButtonViewProps>(\n function ToolbarButtonView(\n {\n title,\n hint,\n hotkey,\n theme = 'normal',\n hintWhenDisabled,\n active,\n enabled,\n onClick,\n className,\n qa,\n id,\n disableTooltip,\n ...props\n },\n ref,\n ) {\n const disabled = !active && !enabled;\n const titleText: string = isFunction(title) ? title() : title;\n const hintText: string | undefined = isFunction(hint) ? hint() : hint;\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n return (\n <Popover\n content={<div className={b('action-disabled-tooltip')}>{hintWhenDisabledText}</div>}\n disabled={hideHintWhenDisabled}\n placement={['bottom']}\n >\n {(_, refForPopover) => (\n <ActionTooltip\n openDelay={ToolbarTooltipDelay.Open}\n closeDelay={ToolbarTooltipDelay.Close}\n description={hintText}\n title={titleText}\n hotkey={hotkey}\n disabled={disableTooltip}\n >\n {(__, refForTooltip) => (\n <Button\n qa={qa}\n size=\"m\"\n ref={(elem: HTMLButtonElement) => {\n setRef(ref, elem);\n setRef(refForPopover, elem);\n setRef(refForTooltip, elem);\n }}\n selected={active}\n disabled={disabled}\n view={\n theme === 'danger' ? 'flat-danger' : active ? 'normal' : 'flat'\n }\n onClick={onClick}\n className={b(null, [className])}\n aria-label={titleText}\n data-toolbar-item={id}\n >\n {'icon' in props ? (\n <Icon\n data={props.icon.data}\n size={props.icon.size ?? DEFAULT_ICON_SIZE}\n />\n ) : (\n props.children\n )}\n </Button>\n )}\n </ActionTooltip>\n )}\n </Popover>\n );\n },\n);\n\nexport function ToolbarButton<E>(props: ToolbarButtonProps<E>) {\n const {id, editor, focus, isActive, isEnable, exec, onClick} = props;\n\n const active = isActive(editor);\n const enabled = isEnable(editor);\n\n const handleClick = () => {\n focus();\n exec(editor);\n onClick?.(id);\n };\n\n return <ToolbarButtonView {...props} active={active} enabled={enabled} onClick={handleClick} />;\n}\n"]}
@@ -22,6 +22,7 @@ export type ToolbarItemData<E> = QAProps & {
22
22
  hint?: string | (() => string);
23
23
  hotkey?: HotkeyProps['value'];
24
24
  preview?: React.ReactNode;
25
+ theme?: 'normal' | 'danger';
25
26
  /**
26
27
  * Alternative IDs that can be used to find this command
27
28
  */