@gravity-ui/markdown-editor 15.34.4 → 15.35.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 (137) hide show
  1. package/build/cjs/bundle/MarkupEditorView.js +1 -1
  2. package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
  3. package/build/cjs/bundle/ToolbarView.d.ts +1 -2
  4. package/build/cjs/bundle/ToolbarView.js +22 -10
  5. package/build/cjs/bundle/ToolbarView.js.map +1 -1
  6. package/build/cjs/bundle/WysiwygEditorView.d.ts +1 -1
  7. package/build/cjs/bundle/WysiwygEditorView.js +4 -4
  8. package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
  9. package/build/cjs/bundle/config/markup.js +1 -0
  10. package/build/cjs/bundle/config/markup.js.map +1 -1
  11. package/build/cjs/bundle/config/wysiwyg.js +2 -0
  12. package/build/cjs/bundle/config/wysiwyg.js.map +1 -1
  13. package/build/cjs/bundle/emoji.js +3 -0
  14. package/build/cjs/bundle/emoji.js.map +1 -1
  15. package/build/cjs/bundle/toolbar/wysiwyg/WToolbarColors.js +36 -2
  16. package/build/cjs/bundle/toolbar/wysiwyg/WToolbarColors.js.map +1 -1
  17. package/build/cjs/extensions/behavior/Placeholder/index.js +54 -20
  18. package/build/cjs/extensions/behavior/Placeholder/index.js.map +1 -1
  19. package/build/cjs/extensions/markdown/Lists/commands.d.ts +1 -0
  20. package/build/cjs/extensions/markdown/Lists/commands.js +14 -0
  21. package/build/cjs/extensions/markdown/Lists/commands.js.map +1 -1
  22. package/build/cjs/extensions/markdown/Lists/index.js +1 -0
  23. package/build/cjs/extensions/markdown/Lists/index.js.map +1 -1
  24. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.d.ts +27 -0
  25. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.js +81 -0
  26. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.js.map +1 -0
  27. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +33 -0
  28. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  29. package/build/cjs/modules/toolbars/items.js +2 -0
  30. package/build/cjs/modules/toolbars/items.js.map +1 -1
  31. package/build/cjs/modules/toolbars/types.d.ts +1 -0
  32. package/build/cjs/modules/toolbars/types.js.map +1 -1
  33. package/build/cjs/react-utils/memo.d.ts +1 -0
  34. package/build/cjs/react-utils/memo.js +8 -0
  35. package/build/cjs/react-utils/memo.js.map +1 -0
  36. package/build/cjs/styles/markdown.css +1 -1
  37. package/build/cjs/styles/styles.css +5 -0
  38. package/build/cjs/styles/yfm-overrides.css +1 -1
  39. package/build/cjs/toolbar/Toolbar.d.ts +4 -0
  40. package/build/cjs/toolbar/Toolbar.js +9 -4
  41. package/build/cjs/toolbar/Toolbar.js.map +1 -1
  42. package/build/cjs/toolbar/ToolbarButton.js +3 -3
  43. package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
  44. package/build/cjs/toolbar/ToolbarButtonPopup.js +3 -3
  45. package/build/cjs/toolbar/ToolbarButtonPopup.js.map +1 -1
  46. package/build/cjs/toolbar/ToolbarGroup.js +5 -4
  47. package/build/cjs/toolbar/ToolbarGroup.js.map +1 -1
  48. package/build/cjs/toolbar/ToolbarListButton.js +9 -6
  49. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  50. package/build/cjs/toolbar/ToolbarRerender.d.ts +3 -0
  51. package/build/cjs/toolbar/ToolbarRerender.js +48 -0
  52. package/build/cjs/toolbar/ToolbarRerender.js.map +1 -0
  53. package/build/cjs/toolbar/context.d.ts +10 -0
  54. package/build/cjs/toolbar/context.js +12 -0
  55. package/build/cjs/toolbar/context.js.map +1 -0
  56. package/build/cjs/toolbar/hooks.d.ts +8 -0
  57. package/build/cjs/toolbar/hooks.js +68 -0
  58. package/build/cjs/toolbar/hooks.js.map +1 -0
  59. package/build/cjs/toolbar/index.d.ts +1 -0
  60. package/build/cjs/toolbar/index.js +4 -0
  61. package/build/cjs/toolbar/index.js.map +1 -1
  62. package/build/cjs/toolbar/types.d.ts +1 -0
  63. package/build/cjs/toolbar/types.js.map +1 -1
  64. package/build/cjs/version.js +1 -1
  65. package/build/cjs/version.js.map +1 -1
  66. package/build/cjs/view/hocs/withMermaid/index.js +6 -1
  67. package/build/cjs/view/hocs/withMermaid/index.js.map +1 -1
  68. package/build/esm/bundle/MarkupEditorView.js +1 -1
  69. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  70. package/build/esm/bundle/ToolbarView.d.ts +1 -2
  71. package/build/esm/bundle/ToolbarView.js +24 -12
  72. package/build/esm/bundle/ToolbarView.js.map +1 -1
  73. package/build/esm/bundle/WysiwygEditorView.d.ts +1 -1
  74. package/build/esm/bundle/WysiwygEditorView.js +3 -4
  75. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  76. package/build/esm/bundle/config/markup.js +1 -0
  77. package/build/esm/bundle/config/markup.js.map +1 -1
  78. package/build/esm/bundle/config/wysiwyg.js +2 -0
  79. package/build/esm/bundle/config/wysiwyg.js.map +1 -1
  80. package/build/esm/bundle/emoji.js +3 -0
  81. package/build/esm/bundle/emoji.js.map +1 -1
  82. package/build/esm/bundle/toolbar/wysiwyg/WToolbarColors.js +36 -2
  83. package/build/esm/bundle/toolbar/wysiwyg/WToolbarColors.js.map +1 -1
  84. package/build/esm/extensions/behavior/Placeholder/index.js +55 -21
  85. package/build/esm/extensions/behavior/Placeholder/index.js.map +1 -1
  86. package/build/esm/extensions/markdown/Lists/commands.d.ts +1 -0
  87. package/build/esm/extensions/markdown/Lists/commands.js +13 -0
  88. package/build/esm/extensions/markdown/Lists/commands.js.map +1 -1
  89. package/build/esm/extensions/markdown/Lists/index.js +2 -1
  90. package/build/esm/extensions/markdown/Lists/index.js.map +1 -1
  91. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.d.ts +27 -0
  92. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.js +77 -0
  93. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.js.map +1 -0
  94. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +33 -0
  95. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  96. package/build/esm/modules/toolbars/items.js +2 -0
  97. package/build/esm/modules/toolbars/items.js.map +1 -1
  98. package/build/esm/modules/toolbars/types.d.ts +1 -0
  99. package/build/esm/modules/toolbars/types.js.map +1 -1
  100. package/build/esm/react-utils/memo.d.ts +1 -0
  101. package/build/esm/react-utils/memo.js +5 -0
  102. package/build/esm/react-utils/memo.js.map +1 -0
  103. package/build/esm/styles/markdown.css +1 -1
  104. package/build/esm/styles/styles.css +5 -0
  105. package/build/esm/styles/yfm-overrides.css +1 -1
  106. package/build/esm/toolbar/Toolbar.d.ts +4 -0
  107. package/build/esm/toolbar/Toolbar.js +9 -4
  108. package/build/esm/toolbar/Toolbar.js.map +1 -1
  109. package/build/esm/toolbar/ToolbarButton.js +3 -3
  110. package/build/esm/toolbar/ToolbarButton.js.map +1 -1
  111. package/build/esm/toolbar/ToolbarButtonPopup.js +3 -3
  112. package/build/esm/toolbar/ToolbarButtonPopup.js.map +1 -1
  113. package/build/esm/toolbar/ToolbarGroup.js +5 -4
  114. package/build/esm/toolbar/ToolbarGroup.js.map +1 -1
  115. package/build/esm/toolbar/ToolbarListButton.js +9 -6
  116. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  117. package/build/esm/toolbar/ToolbarRerender.d.ts +3 -0
  118. package/build/esm/toolbar/ToolbarRerender.js +44 -0
  119. package/build/esm/toolbar/ToolbarRerender.js.map +1 -0
  120. package/build/esm/toolbar/context.d.ts +10 -0
  121. package/build/esm/toolbar/context.js +8 -0
  122. package/build/esm/toolbar/context.js.map +1 -0
  123. package/build/esm/toolbar/hooks.d.ts +8 -0
  124. package/build/esm/toolbar/hooks.js +64 -0
  125. package/build/esm/toolbar/hooks.js.map +1 -0
  126. package/build/esm/toolbar/index.d.ts +1 -0
  127. package/build/esm/toolbar/index.js +1 -0
  128. package/build/esm/toolbar/index.js.map +1 -1
  129. package/build/esm/toolbar/types.d.ts +1 -0
  130. package/build/esm/toolbar/types.js.map +1 -1
  131. package/build/esm/version.js +1 -1
  132. package/build/esm/version.js.map +1 -1
  133. package/build/esm/view/hocs/withMermaid/index.js +6 -1
  134. package/build/esm/view/hocs/withMermaid/index.js.map +1 -1
  135. package/build/styles.css +7 -2
  136. package/package.json +17 -79
  137. package/README.md +0 -89
@@ -2,11 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.joinPrevList = void 0;
4
4
  exports.toList = toList;
5
+ exports.liftEmptyListItem = liftEmptyListItem;
5
6
  exports.sinkOnlySelectedListItem = sinkOnlySelectedListItem;
7
+ const prosemirror_commands_1 = require("prosemirror-commands");
6
8
  const prosemirror_model_1 = require("prosemirror-model");
7
9
  const prosemirror_schema_list_1 = require("prosemirror-schema-list");
8
10
  const prosemirror_transform_1 = require("prosemirror-transform");
9
11
  const join_1 = require("../../../commands/join.js");
12
+ const selection_1 = require("../../../utils/selection.js");
10
13
  const utils_1 = require("./utils.js");
11
14
  function toList(listType) {
12
15
  return (state, dispatch) => {
@@ -24,6 +27,17 @@ exports.joinPrevList = (0, join_1.joinPreviousBlock)({
24
27
  checkPrevNode: utils_1.isListNode,
25
28
  skipNode: utils_1.isListOrItemNode,
26
29
  });
30
+ function liftEmptyListItem(itemType) {
31
+ return (state, dispatch) => {
32
+ const $cursor = (0, selection_1.get$CursorAtBlockStart)(state.selection);
33
+ if (!$cursor ||
34
+ $cursor.parent.content.size !== 0 ||
35
+ $cursor.node(-1).type !== itemType ||
36
+ $cursor.node(-1).childCount !== 1)
37
+ return false;
38
+ return (0, prosemirror_commands_1.liftEmptyBlock)(state, dispatch);
39
+ };
40
+ }
27
41
  /*
28
42
  Simplified `sinkListItem` from `prosemirror-schema-list` without `state`/`dispatch`,
29
43
  sinks list items deeper.
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type NodeRange, type NodeType, Slice} from 'prosemirror-model';\nimport {wrapInList} from 'prosemirror-schema-list';\nimport type {Command, Transaction} from 'prosemirror-state';\nimport {ReplaceAroundStep, liftTarget} from 'prosemirror-transform';\n\nimport {joinPreviousBlock} from '../../../commands/join';\n\nimport {findAnyParentList, isListNode, isListOrItemNode} from './utils';\n\nexport function toList(listType: NodeType): Command {\n return (state, dispatch) => {\n const parentList = findAnyParentList(state.schema)(state.selection);\n if (parentList) {\n if (listType === parentList.node.type) return true;\n\n dispatch?.(state.tr.setNodeMarkup(parentList.pos, listType));\n return true;\n }\n return wrapInList(listType)(state, dispatch);\n };\n}\n\nexport const joinPrevList = joinPreviousBlock({\n checkPrevNode: isListNode,\n skipNode: isListOrItemNode,\n});\n\n/*\n Simplified `sinkListItem` from `prosemirror-schema-list` without `state`/`dispatch`,\n sinks list items deeper.\n */\nconst sink = (tr: Transaction, range: NodeRange, itemType: NodeType) => {\n const before = tr.mapping.map(range.start);\n const after = tr.mapping.map(range.end);\n const startIndex = tr.mapping.map(range.startIndex);\n\n const parent = range.parent;\n const nodeBefore = parent.child(startIndex - 1);\n\n const nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type === parent.type;\n const inner = Fragment.from(nestedBefore ? itemType.create() : null);\n const slice = new Slice(\n Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))),\n nestedBefore ? 3 : 1,\n 0,\n );\n\n tr.step(\n new ReplaceAroundStep(\n before - (nestedBefore ? 3 : 1),\n after,\n before,\n after,\n slice,\n 1,\n true,\n ),\n );\n return true;\n};\n\nexport function sinkOnlySelectedListItem(itemType: NodeType): Command {\n return ({tr, selection}, dispatch) => {\n const {$from, $to} = selection;\n const selectionRange = $from.blockRange(\n $to,\n (node) => node.childCount > 0 && node.firstChild!.type === itemType,\n );\n if (!selectionRange) {\n return false;\n }\n\n const {startIndex, parent, start, end} = selectionRange;\n if (startIndex === 0) {\n return false;\n }\n\n const nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type !== itemType) {\n return false;\n }\n\n if (dispatch) {\n // lifts following list items sequentially to prepare correct nesting structure\n let currentEnd = end - 1;\n while (currentEnd > start) {\n const selectionEnd = tr.mapping.map($to.pos);\n\n const $candidateBlockEnd = tr.doc.resolve(currentEnd);\n const candidateBlockStartPos = $candidateBlockEnd.before($candidateBlockEnd.depth);\n const $candidateBlockStart = tr.doc.resolve(candidateBlockStartPos);\n const candidateBlockRange = $candidateBlockStart.blockRange($candidateBlockEnd);\n\n if (candidateBlockRange?.start) {\n const $rangeStart = tr.doc.resolve(candidateBlockRange.start);\n const shouldLift =\n candidateBlockRange.start > selectionEnd && isListNode($rangeStart.parent);\n\n if (shouldLift) {\n currentEnd = candidateBlockRange.start;\n\n const targetDepth = liftTarget(candidateBlockRange);\n if (targetDepth !== null) {\n tr.lift(candidateBlockRange, targetDepth);\n }\n }\n }\n\n currentEnd--;\n }\n\n // sinks the selected list item deeper into the list hierarchy\n sink(tr, selectionRange, itemType);\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n return true;\n };\n}\n"]}
1
+ {"version":3,"file":"commands.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/commands.ts"],"names":[],"mappings":";;;AAWA,wBAWC;AAOD,8CAaC;AAoCD,4DA0DC;AAxID,+DAAoD;AACpD,yDAAiF;AACjF,qEAAmD;AAEnD,iEAAoE;AAEpE,oDAAyD;AACzD,2DAAgE;AAEhE,sCAAwE;AAExE,SAAgB,MAAM,CAAC,QAAkB;IACrC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvB,MAAM,UAAU,GAAG,IAAA,yBAAiB,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpE,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,QAAQ,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YAEnD,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,IAAA,oCAAU,EAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC,CAAC;AACN,CAAC;AAEY,QAAA,YAAY,GAAG,IAAA,wBAAiB,EAAC;IAC1C,aAAa,EAAE,kBAAU;IACzB,QAAQ,EAAE,wBAAgB;CAC7B,CAAC,CAAC;AAEH,SAAgB,iBAAiB,CAAC,QAAkB;IAChD,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,IAAA,kCAAsB,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxD,IACI,CAAC,OAAO;YACR,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC;YAEjC,OAAO,KAAK,CAAC;QAEjB,OAAO,IAAA,qCAAc,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,IAAI,GAAG,CAAC,EAAe,EAAE,KAAgB,EAAE,QAAkB,EAAE,EAAE;IACnE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;IACvF,MAAM,KAAK,GAAG,4BAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,yBAAK,CACnB,4BAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,4BAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EACpF,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACpB,CAAC,CACJ,CAAC;IAEF,EAAE,CAAC,IAAI,CACH,IAAI,yCAAiB,CACjB,MAAM,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/B,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,CAAC,EACD,IAAI,CACP,CACJ,CAAC;IACF,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,SAAgB,wBAAwB,CAAC,QAAkB;IACvD,OAAO,CAAC,EAAC,EAAE,EAAE,SAAS,EAAC,EAAE,QAAQ,EAAE,EAAE;QACjC,MAAM,EAAC,KAAK,EAAE,GAAG,EAAC,GAAG,SAAS,CAAC;QAC/B,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CACnC,GAAG,EACH,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,UAAW,CAAC,IAAI,KAAK,QAAQ,CACtE,CAAC;QACF,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,EAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAC,GAAG,cAAc,CAAC;QACxD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACX,+EAA+E;YAC/E,IAAI,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC;YACzB,OAAO,UAAU,GAAG,KAAK,EAAE,CAAC;gBACxB,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE7C,MAAM,kBAAkB,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACnF,MAAM,oBAAoB,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;gBACpE,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;gBAEhF,IAAI,mBAAmB,EAAE,KAAK,EAAE,CAAC;oBAC7B,MAAM,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;oBAC9D,MAAM,UAAU,GACZ,mBAAmB,CAAC,KAAK,GAAG,YAAY,IAAI,IAAA,kBAAU,EAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAE/E,IAAI,UAAU,EAAE,CAAC;wBACb,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC;wBAEvC,MAAM,WAAW,GAAG,IAAA,kCAAU,EAAC,mBAAmB,CAAC,CAAC;wBACpD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;4BACvB,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;wBAC9C,CAAC;oBACL,CAAC;gBACL,CAAC;gBAED,UAAU,EAAE,CAAC;YACjB,CAAC;YAED,8DAA8D;YAC9D,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAEnC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACN,CAAC","sourcesContent":["import {liftEmptyBlock} from 'prosemirror-commands';\nimport {Fragment, type NodeRange, type NodeType, Slice} from 'prosemirror-model';\nimport {wrapInList} from 'prosemirror-schema-list';\nimport type {Command, Transaction} from 'prosemirror-state';\nimport {ReplaceAroundStep, liftTarget} from 'prosemirror-transform';\n\nimport {joinPreviousBlock} from '../../../commands/join';\nimport {get$CursorAtBlockStart} from '../../../utils/selection';\n\nimport {findAnyParentList, isListNode, isListOrItemNode} from './utils';\n\nexport function toList(listType: NodeType): Command {\n return (state, dispatch) => {\n const parentList = findAnyParentList(state.schema)(state.selection);\n if (parentList) {\n if (listType === parentList.node.type) return true;\n\n dispatch?.(state.tr.setNodeMarkup(parentList.pos, listType));\n return true;\n }\n return wrapInList(listType)(state, dispatch);\n };\n}\n\nexport const joinPrevList = joinPreviousBlock({\n checkPrevNode: isListNode,\n skipNode: isListOrItemNode,\n});\n\nexport function liftEmptyListItem(itemType: NodeType): Command {\n return (state, dispatch) => {\n const $cursor = get$CursorAtBlockStart(state.selection);\n if (\n !$cursor ||\n $cursor.parent.content.size !== 0 ||\n $cursor.node(-1).type !== itemType ||\n $cursor.node(-1).childCount !== 1\n )\n return false;\n\n return liftEmptyBlock(state, dispatch);\n };\n}\n\n/*\n Simplified `sinkListItem` from `prosemirror-schema-list` without `state`/`dispatch`,\n sinks list items deeper.\n */\nconst sink = (tr: Transaction, range: NodeRange, itemType: NodeType) => {\n const before = tr.mapping.map(range.start);\n const after = tr.mapping.map(range.end);\n const startIndex = tr.mapping.map(range.startIndex);\n\n const parent = range.parent;\n const nodeBefore = parent.child(startIndex - 1);\n\n const nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type === parent.type;\n const inner = Fragment.from(nestedBefore ? itemType.create() : null);\n const slice = new Slice(\n Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))),\n nestedBefore ? 3 : 1,\n 0,\n );\n\n tr.step(\n new ReplaceAroundStep(\n before - (nestedBefore ? 3 : 1),\n after,\n before,\n after,\n slice,\n 1,\n true,\n ),\n );\n return true;\n};\n\nexport function sinkOnlySelectedListItem(itemType: NodeType): Command {\n return ({tr, selection}, dispatch) => {\n const {$from, $to} = selection;\n const selectionRange = $from.blockRange(\n $to,\n (node) => node.childCount > 0 && node.firstChild!.type === itemType,\n );\n if (!selectionRange) {\n return false;\n }\n\n const {startIndex, parent, start, end} = selectionRange;\n if (startIndex === 0) {\n return false;\n }\n\n const nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type !== itemType) {\n return false;\n }\n\n if (dispatch) {\n // lifts following list items sequentially to prepare correct nesting structure\n let currentEnd = end - 1;\n while (currentEnd > start) {\n const selectionEnd = tr.mapping.map($to.pos);\n\n const $candidateBlockEnd = tr.doc.resolve(currentEnd);\n const candidateBlockStartPos = $candidateBlockEnd.before($candidateBlockEnd.depth);\n const $candidateBlockStart = tr.doc.resolve(candidateBlockStartPos);\n const candidateBlockRange = $candidateBlockStart.blockRange($candidateBlockEnd);\n\n if (candidateBlockRange?.start) {\n const $rangeStart = tr.doc.resolve(candidateBlockRange.start);\n const shouldLift =\n candidateBlockRange.start > selectionEnd && isListNode($rangeStart.parent);\n\n if (shouldLift) {\n currentEnd = candidateBlockRange.start;\n\n const targetDepth = liftTarget(candidateBlockRange);\n if (targetDepth !== null) {\n tr.lift(candidateBlockRange, targetDepth);\n }\n }\n }\n\n currentEnd--;\n }\n\n // sinks the selected list item deeper into the list hierarchy\n sink(tr, selectionRange, itemType);\n\n dispatch(tr.scrollIntoView());\n return true;\n }\n return true;\n };\n}\n"]}
@@ -28,6 +28,7 @@ const Lists = (builder, opts) => {
28
28
  return {
29
29
  Tab: (0, commands_1.sinkOnlySelectedListItem)((0, ListsSpecs_1.liType)(schema)),
30
30
  'Shift-Tab': (0, prosemirror_schema_list_1.liftListItem)((0, ListsSpecs_1.liType)(schema)),
31
+ Backspace: (0, commands_1.liftEmptyListItem)((0, ListsSpecs_1.liType)(schema)),
31
32
  'Mod-[': (0, prosemirror_schema_list_1.liftListItem)((0, ListsSpecs_1.liType)(schema)),
32
33
  'Mod-]': (0, commands_1.sinkOnlySelectedListItem)((0, ListsSpecs_1.liType)(schema)),
33
34
  ...bindings,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/index.ts"],"names":[],"mappings":";;;AAAA,qEAAoE;AAGpE,qDAAoD;AAEpD,sDAAgE;AAChE,0CAAkC;AAClC,4CAA0E;AAC1E,sCAAmC;AACnC,gDAAmF;AACnF,0EAAkE;AAClE,oEAA4D;AAE5D,oDAAyE;AAAjE,sGAAA,QAAQ,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,oGAAA,MAAM,OAAA;AAQ5C,MAAM,KAAK,GAAgC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,uBAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,YAAY,EAAE,IAAA,iBAAM,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,aAAa,EAAE,IAAA,iBAAM,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,IAAA,mCAAwB,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YAC7C,WAAW,EAAE,IAAA,sCAAY,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YAEzC,OAAO,EAAE,IAAA,sCAAY,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,IAAA,mCAAwB,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YAEjD,GAAG,QAAQ;SACd,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,SAAS,CACb,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,IAAA,uCAAa,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;QACpC,SAAS,EAAE,uBAAY;KAC1B,CAAC,EACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,qCAAwB,EAAE,EAAC,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IAEjF,OAAO,CAAC,SAAS,CAAC,mCAAgB,CAAC,CAAC;IAEpC,OAAO,CAAC,SAAS,CAAC,yCAAmB,CAAC,CAAC;IAEvC,OAAO;SACF,SAAS,CAAC,kBAAU,CAAC,YAAY,EAAE,iBAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,kBAAU,CAAC,aAAa,EAAE,iBAAO,CAAC,aAAa,CAAC;SAC1D,SAAS,CAAC,kBAAU,CAAC,YAAY,EAAE,iBAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,kBAAU,CAAC,YAAY,EAAE,iBAAO,CAAC,YAAY,CAAC,CAAC;AAClE,CAAC,CAAC;AAvCW,QAAA,KAAK,SAuChB","sourcesContent":["import {liftListItem, splitListItem} from 'prosemirror-schema-list';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {ListsSpecs, blType, liType, olType} from './ListsSpecs';\nimport {actions} from './actions';\nimport {joinPrevList, sinkOnlySelectedListItem, toList} from './commands';\nimport {ListAction} from './const';\nimport {ListsInputRulesExtension, type ListsInputRulesOptions} from './inputrules';\nimport {collapseListsPlugin} from './plugins/CollapseListsPlugin';\nimport {mergeListsPlugin} from './plugins/MergeListsPlugin';\n\nexport {ListNode, ListsAttr, blType, liType, olType} from './ListsSpecs';\n\nexport type ListsOptions = {\n ulKey?: string | null;\n olKey?: string | null;\n ulInputRules?: ListsInputRulesOptions['bulletListInputRule'];\n};\n\nexport const Lists: ExtensionAuto<ListsOptions> = (builder, opts) => {\n builder.use(ListsSpecs);\n\n builder.addKeymap(({schema}) => {\n const {ulKey, olKey} = opts ?? {};\n const bindings: Keymap = {};\n if (ulKey) bindings[ulKey] = withLogAction('bulletList', toList(blType(schema)));\n if (olKey) bindings[olKey] = withLogAction('orderedList', toList(olType(schema)));\n\n return {\n Tab: sinkOnlySelectedListItem(liType(schema)),\n 'Shift-Tab': liftListItem(liType(schema)),\n\n 'Mod-[': liftListItem(liType(schema)),\n 'Mod-]': sinkOnlySelectedListItem(liType(schema)),\n\n ...bindings,\n };\n }, builder.Priority.High);\n\n builder.addKeymap(\n ({schema}) => ({\n Enter: splitListItem(liType(schema)),\n Backspace: joinPrevList,\n }),\n builder.Priority.Low,\n );\n\n builder.use(ListsInputRulesExtension, {bulletListInputRule: opts?.ulInputRules});\n\n builder.addPlugin(mergeListsPlugin);\n\n builder.addPlugin(collapseListsPlugin);\n\n builder\n .addAction(ListAction.ToBulletList, actions.toBulletList)\n .addAction(ListAction.ToOrderedList, actions.toOrderedList)\n .addAction(ListAction.SinkListItem, actions.sinkListItem)\n .addAction(ListAction.LiftListItem, actions.liftListItem);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [ListAction.ToBulletList]: Action;\n [ListAction.ToOrderedList]: Action;\n [ListAction.SinkListItem]: Action;\n [ListAction.LiftListItem]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Lists/index.ts"],"names":[],"mappings":";;;AAAA,qEAAoE;AAGpE,qDAAoD;AAEpD,sDAAgE;AAChE,0CAAkC;AAClC,4CAA6F;AAC7F,sCAAmC;AACnC,gDAAmF;AACnF,0EAAkE;AAClE,oEAA4D;AAE5D,oDAAyE;AAAjE,sGAAA,QAAQ,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,oGAAA,MAAM,OAAA;AAQ5C,MAAM,KAAK,GAAgC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChE,OAAO,CAAC,GAAG,CAAC,uBAAU,CAAC,CAAC;IAExB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,EAAC,KAAK,EAAE,KAAK,EAAC,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,YAAY,EAAE,IAAA,iBAAM,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,KAAK;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,aAAa,EAAE,IAAA,iBAAM,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO;YACH,GAAG,EAAE,IAAA,mCAAwB,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YAC7C,WAAW,EAAE,IAAA,sCAAY,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YACzC,SAAS,EAAE,IAAA,4BAAiB,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YAE5C,OAAO,EAAE,IAAA,sCAAY,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,IAAA,mCAAwB,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;YAEjD,GAAG,QAAQ;SACd,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO,CAAC,SAAS,CACb,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,IAAA,uCAAa,EAAC,IAAA,mBAAM,EAAC,MAAM,CAAC,CAAC;QACpC,SAAS,EAAE,uBAAY;KAC1B,CAAC,EACF,OAAO,CAAC,QAAQ,CAAC,GAAG,CACvB,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,qCAAwB,EAAE,EAAC,mBAAmB,EAAE,IAAI,EAAE,YAAY,EAAC,CAAC,CAAC;IAEjF,OAAO,CAAC,SAAS,CAAC,mCAAgB,CAAC,CAAC;IAEpC,OAAO,CAAC,SAAS,CAAC,yCAAmB,CAAC,CAAC;IAEvC,OAAO;SACF,SAAS,CAAC,kBAAU,CAAC,YAAY,EAAE,iBAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,kBAAU,CAAC,aAAa,EAAE,iBAAO,CAAC,aAAa,CAAC;SAC1D,SAAS,CAAC,kBAAU,CAAC,YAAY,EAAE,iBAAO,CAAC,YAAY,CAAC;SACxD,SAAS,CAAC,kBAAU,CAAC,YAAY,EAAE,iBAAO,CAAC,YAAY,CAAC,CAAC;AAClE,CAAC,CAAC;AAxCW,QAAA,KAAK,SAwChB","sourcesContent":["import {liftListItem, splitListItem} from 'prosemirror-schema-list';\n\nimport type {Action, ExtensionAuto, Keymap} from '../../../core';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {ListsSpecs, blType, liType, olType} from './ListsSpecs';\nimport {actions} from './actions';\nimport {joinPrevList, liftEmptyListItem, sinkOnlySelectedListItem, toList} from './commands';\nimport {ListAction} from './const';\nimport {ListsInputRulesExtension, type ListsInputRulesOptions} from './inputrules';\nimport {collapseListsPlugin} from './plugins/CollapseListsPlugin';\nimport {mergeListsPlugin} from './plugins/MergeListsPlugin';\n\nexport {ListNode, ListsAttr, blType, liType, olType} from './ListsSpecs';\n\nexport type ListsOptions = {\n ulKey?: string | null;\n olKey?: string | null;\n ulInputRules?: ListsInputRulesOptions['bulletListInputRule'];\n};\n\nexport const Lists: ExtensionAuto<ListsOptions> = (builder, opts) => {\n builder.use(ListsSpecs);\n\n builder.addKeymap(({schema}) => {\n const {ulKey, olKey} = opts ?? {};\n const bindings: Keymap = {};\n if (ulKey) bindings[ulKey] = withLogAction('bulletList', toList(blType(schema)));\n if (olKey) bindings[olKey] = withLogAction('orderedList', toList(olType(schema)));\n\n return {\n Tab: sinkOnlySelectedListItem(liType(schema)),\n 'Shift-Tab': liftListItem(liType(schema)),\n Backspace: liftEmptyListItem(liType(schema)),\n\n 'Mod-[': liftListItem(liType(schema)),\n 'Mod-]': sinkOnlySelectedListItem(liType(schema)),\n\n ...bindings,\n };\n }, builder.Priority.High);\n\n builder.addKeymap(\n ({schema}) => ({\n Enter: splitListItem(liType(schema)),\n Backspace: joinPrevList,\n }),\n builder.Priority.Low,\n );\n\n builder.use(ListsInputRulesExtension, {bulletListInputRule: opts?.ulInputRules});\n\n builder.addPlugin(mergeListsPlugin);\n\n builder.addPlugin(collapseListsPlugin);\n\n builder\n .addAction(ListAction.ToBulletList, actions.toBulletList)\n .addAction(ListAction.ToOrderedList, actions.toOrderedList)\n .addAction(ListAction.SinkListItem, actions.sinkListItem)\n .addAction(ListAction.LiftListItem, actions.liftListItem);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [ListAction.ToBulletList]: Action;\n [ListAction.ToOrderedList]: Action;\n [ListAction.SinkListItem]: Action;\n [ListAction.LiftListItem]: Action;\n }\n }\n}\n"]}
@@ -0,0 +1,27 @@
1
+ type AutoScrollDirection = 'horizontal' | 'vertical' | 'both';
2
+ type AutoScrollOptions = {
3
+ edgeThreshold?: number;
4
+ maxSpeed?: number;
5
+ };
6
+ export declare class DnDAutoScroller {
7
+ private readonly _container;
8
+ private readonly _direction;
9
+ private readonly _edgeThreshold;
10
+ private readonly _maxSpeed;
11
+ private _clientX;
12
+ private _clientY;
13
+ private _rafId;
14
+ private _active;
15
+ constructor(scrollContainer: HTMLElement, direction: AutoScrollDirection, options?: AutoScrollOptions);
16
+ update(clientX: number, clientY: number): void;
17
+ destroy(): void;
18
+ private _startLoop;
19
+ private _getVisibleRect;
20
+ private _scrollStep;
21
+ /**
22
+ * Returns scroll delta for one axis.
23
+ * Negative when cursor is near the start edge, positive when near the end edge.
24
+ */
25
+ private _calcDelta;
26
+ }
27
+ export {};
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DnDAutoScroller = void 0;
4
+ const DEFAULT_EDGE_THRESHOLD = 40; // px
5
+ const DEFAULT_MAX_SPEED = 15; // px per frame
6
+ class DnDAutoScroller {
7
+ _container;
8
+ _direction;
9
+ _edgeThreshold;
10
+ _maxSpeed;
11
+ _clientX = 0;
12
+ _clientY = 0;
13
+ _rafId = null;
14
+ _active = false;
15
+ constructor(scrollContainer, direction, options) {
16
+ this._container = scrollContainer;
17
+ this._direction = direction;
18
+ this._edgeThreshold = options?.edgeThreshold ?? DEFAULT_EDGE_THRESHOLD;
19
+ this._maxSpeed = options?.maxSpeed ?? DEFAULT_MAX_SPEED;
20
+ }
21
+ update(clientX, clientY) {
22
+ this._clientX = clientX;
23
+ this._clientY = clientY;
24
+ if (!this._active) {
25
+ this._active = true;
26
+ this._startLoop();
27
+ }
28
+ }
29
+ destroy() {
30
+ if (this._rafId !== null) {
31
+ cancelAnimationFrame(this._rafId);
32
+ this._rafId = null;
33
+ }
34
+ }
35
+ _startLoop() {
36
+ const tick = () => {
37
+ this._scrollStep();
38
+ this._rafId = requestAnimationFrame(tick);
39
+ };
40
+ this._rafId = requestAnimationFrame(tick);
41
+ }
42
+ _getVisibleRect() {
43
+ if (this._container === this._container.ownerDocument.documentElement) {
44
+ return { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
45
+ }
46
+ return this._container.getBoundingClientRect();
47
+ }
48
+ _scrollStep() {
49
+ const rect = this._getVisibleRect();
50
+ let dx = 0;
51
+ let dy = 0;
52
+ if (this._direction === 'horizontal' || this._direction === 'both') {
53
+ dx = this._calcDelta(this._clientX, rect.left, rect.right);
54
+ }
55
+ if (this._direction === 'vertical' || this._direction === 'both') {
56
+ dy = this._calcDelta(this._clientY, rect.top, rect.bottom);
57
+ }
58
+ if (dx !== 0 || dy !== 0) {
59
+ this._container.scrollBy(dx, dy);
60
+ }
61
+ }
62
+ /**
63
+ * Returns scroll delta for one axis.
64
+ * Negative when cursor is near the start edge, positive when near the end edge.
65
+ */
66
+ _calcDelta(cursor, edgeStart, edgeEnd) {
67
+ const distToStart = cursor - edgeStart;
68
+ const distToEnd = edgeEnd - cursor;
69
+ if (distToStart >= 0 && distToStart < this._edgeThreshold) {
70
+ const ratio = 1 - distToStart / this._edgeThreshold;
71
+ return -Math.round(this._maxSpeed * ratio);
72
+ }
73
+ if (distToEnd >= 0 && distToEnd < this._edgeThreshold) {
74
+ const ratio = 1 - distToEnd / this._edgeThreshold;
75
+ return Math.round(this._maxSpeed * ratio);
76
+ }
77
+ return 0;
78
+ }
79
+ }
80
+ exports.DnDAutoScroller = DnDAutoScroller;
81
+ //# sourceMappingURL=dnd-auto-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dnd-auto-scroll.js","sourceRoot":"../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-auto-scroll.ts"],"names":[],"mappings":"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","sourcesContent":["type AutoScrollDirection = 'horizontal' | 'vertical' | 'both';\n\ntype AutoScrollOptions = {\n edgeThreshold?: number;\n maxSpeed?: number;\n};\n\nconst DEFAULT_EDGE_THRESHOLD = 40; // px\nconst DEFAULT_MAX_SPEED = 15; // px per frame\n\nexport class DnDAutoScroller {\n private readonly _container: HTMLElement;\n private readonly _direction: AutoScrollDirection;\n private readonly _edgeThreshold: number;\n private readonly _maxSpeed: number;\n\n private _clientX = 0;\n private _clientY = 0;\n private _rafId: number | null = null;\n private _active = false;\n\n constructor(\n scrollContainer: HTMLElement,\n direction: AutoScrollDirection,\n options?: AutoScrollOptions,\n ) {\n this._container = scrollContainer;\n this._direction = direction;\n this._edgeThreshold = options?.edgeThreshold ?? DEFAULT_EDGE_THRESHOLD;\n this._maxSpeed = options?.maxSpeed ?? DEFAULT_MAX_SPEED;\n }\n\n update(clientX: number, clientY: number): void {\n this._clientX = clientX;\n this._clientY = clientY;\n\n if (!this._active) {\n this._active = true;\n this._startLoop();\n }\n }\n\n destroy(): void {\n if (this._rafId !== null) {\n cancelAnimationFrame(this._rafId);\n this._rafId = null;\n }\n }\n\n private _startLoop(): void {\n const tick = () => {\n this._scrollStep();\n this._rafId = requestAnimationFrame(tick);\n };\n this._rafId = requestAnimationFrame(tick);\n }\n\n private _getVisibleRect(): {left: number; right: number; top: number; bottom: number} {\n if (this._container === this._container.ownerDocument.documentElement) {\n return {left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight};\n }\n return this._container.getBoundingClientRect();\n }\n\n private _scrollStep(): void {\n const rect = this._getVisibleRect();\n let dx = 0;\n let dy = 0;\n\n if (this._direction === 'horizontal' || this._direction === 'both') {\n dx = this._calcDelta(this._clientX, rect.left, rect.right);\n }\n\n if (this._direction === 'vertical' || this._direction === 'both') {\n dy = this._calcDelta(this._clientY, rect.top, rect.bottom);\n }\n\n if (dx !== 0 || dy !== 0) {\n this._container.scrollBy(dx, dy);\n }\n }\n\n /**\n * Returns scroll delta for one axis.\n * Negative when cursor is near the start edge, positive when near the end edge.\n */\n private _calcDelta(cursor: number, edgeStart: number, edgeEnd: number): number {\n const distToStart = cursor - edgeStart;\n const distToEnd = edgeEnd - cursor;\n\n if (distToStart >= 0 && distToStart < this._edgeThreshold) {\n const ratio = 1 - distToStart / this._edgeThreshold;\n return -Math.round(this._maxSpeed * ratio);\n }\n\n if (distToEnd >= 0 && distToEnd < this._edgeThreshold) {\n const ratio = 1 - distToEnd / this._edgeThreshold;\n return Math.round(this._maxSpeed * ratio);\n }\n\n return 0;\n }\n}\n"]}
@@ -11,6 +11,7 @@ const YfmTableSpecs_1 = require("../../../YfmTableSpecs/index.js");
11
11
  const dnd_plugin_1 = require("../plugins/dnd-plugin.js");
12
12
  const focus_plugin_1 = require("../plugins/focus-plugin.js");
13
13
  const utils_2 = require("../utils.js");
14
+ const dnd_auto_scroll_1 = require("./dnd-auto-scroll.js");
14
15
  const dnd_drop_cursor_1 = require("./dnd-drop-cursor.js");
15
16
  const dnd_ghost_1 = require("./dnd-ghost.js");
16
17
  require("./dnd.css");
@@ -166,6 +167,10 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {
166
167
  rangeIdx: draggedRangeIdx,
167
168
  tableDesc,
168
169
  });
170
+ const scrollContainer = findScrollableAncestor(this._editorView.dom, 'vertical');
171
+ const autoScroller = scrollContainer
172
+ ? new dnd_auto_scroll_1.DnDAutoScroller(scrollContainer, 'vertical')
173
+ : null;
169
174
  const onMoveDebounced = (0, lodash_1.debounce)((event) => {
170
175
  this._moveDragging(event, {
171
176
  rangeIdx: draggedRangeIdx,
@@ -174,11 +179,13 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {
174
179
  }, MOUSE_MOVE_DEBOUNCE, { maxWait: MOUSE_MOVE_DEBOUNCE });
175
180
  const onMove = (event) => {
176
181
  ghost.move(event);
182
+ autoScroller?.update(event.clientX, event.clientY);
177
183
  onMoveDebounced(event);
178
184
  };
179
185
  document.addEventListener('mousemove', onMove);
180
186
  document.addEventListener('mouseup', () => {
181
187
  onMoveDebounced.flush();
188
+ autoScroller?.destroy();
182
189
  ghost.destroy();
183
190
  document.removeEventListener('mousemove', onMove);
184
191
  this._endDragging(currRowRange, tableDesc);
@@ -327,6 +334,8 @@ class YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {
327
334
  rangeIdx: draggedRangeIdx,
328
335
  tableDesc,
329
336
  });
337
+ const { node: tableElem } = this._editorView.domAtPos(tableDesc.pos + 1);
338
+ const autoScroller = tableElem instanceof HTMLElement ? new dnd_auto_scroll_1.DnDAutoScroller(tableElem, 'horizontal') : null;
330
339
  const onMoveDebounced = (0, lodash_1.debounce)((event) => {
331
340
  this._moveDragging(event, {
332
341
  rangeIdx: draggedRangeIdx,
@@ -335,11 +344,13 @@ class YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {
335
344
  }, MOUSE_MOVE_DEBOUNCE, { maxWait: MOUSE_MOVE_DEBOUNCE });
336
345
  const onMove = (event) => {
337
346
  ghost.move(event);
347
+ autoScroller?.update(event.clientX, event.clientY);
338
348
  onMoveDebounced(event);
339
349
  };
340
350
  document.addEventListener('mousemove', onMove);
341
351
  document.addEventListener('mouseup', () => {
342
352
  onMoveDebounced.flush();
353
+ autoScroller?.destroy();
343
354
  ghost.destroy();
344
355
  document.removeEventListener('mousemove', onMove);
345
356
  this._endDragging(currColumnRange, tableDesc);
@@ -479,4 +490,26 @@ function isDragThresholdPassed(init, curr) {
479
490
  return (Math.abs(init.pageX - curr.pageX) >= DRAG_START_THRESHOLD ||
480
491
  Math.abs(init.pageY - curr.pageY) >= DRAG_START_THRESHOLD);
481
492
  }
493
+ function findScrollableAncestor(element, axis) {
494
+ const prop = axis === 'vertical' ? 'overflowY' : 'overflowX';
495
+ let current = element.parentElement;
496
+ while (current && current !== document.documentElement) {
497
+ const overflow = getComputedStyle(current)[prop];
498
+ if (overflow === 'auto' || overflow === 'scroll') {
499
+ const hasScroll = axis === 'vertical'
500
+ ? current.scrollHeight > current.clientHeight
501
+ : current.scrollWidth > current.clientWidth;
502
+ if (hasScroll)
503
+ return current;
504
+ }
505
+ current = current.parentElement;
506
+ }
507
+ const docEl = element.ownerDocument.documentElement;
508
+ const hasDocScroll = axis === 'vertical'
509
+ ? docEl.scrollHeight > docEl.clientHeight
510
+ : docEl.scrollWidth > docEl.clientWidth;
511
+ if (hasDocScroll)
512
+ return docEl;
513
+ return null;
514
+ }
482
515
  //# sourceMappingURL=dnd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dnd.js","sourceRoot":"../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.ts"],"names":[],"mappings":";;;AAAA,yDAA2C;AAC3C,yDAAwC;AACxC,yDAAqD;AAErD,wDAAoC;AAEpC,wEAA4C;AAC5C,4EAOoC;AAEpC,mEAAoD;AACpD,yDAAgG;AAChG,6DAAuD;AACvD,uCAA6E;AAE7E,0DAK2B;AAC3B,8CAA6C;AAE7C,qBAAoB;AAEpB,MAAM,mBAAmB,GAAG,GAAG,CAAC,CAAC,KAAK;AACtC,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAC,KAAK;AAwBrC,MAAa,kBAAkB;IACV,WAAW,CAAwB;IACnC,cAAc,CAA2B;IAE1D,IAAI,GAAG;QACH,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,YAAY,IAAgB,EAAE,MAAgC;QAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACH,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;CACJ;AA1BD,gDA0BC;AAED,MAAe,0BAA0B;IAClB,WAAW,CAA2B;IACtC,WAAW,CAAa;IACxB,OAAO,CAAkB;IACzB,WAAW,CAAa;IAEnC,UAAU,CAAO;IACjB,UAAU,GAAG,KAAK,CAAC;IACnB,WAAW,GAAG,KAAK,CAAC;IACpB,eAAe,GAAuB,KAAK,CAAC;IAEpD,YACI,IAAgB,EAChB,MAA+E;QAE/E,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,QAAc;QACjB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAED,OAAO;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAID,uBAAuB,GAA+C,CAAC,KAAK,EAAE,EAAE;QAC5E,IAAI,CAAC,eAAe,GAAG,EAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAC,CAAC;QAChE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,qBAAqB,GAA+C,GAAG,EAAE;QACrE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC,CAAC;IAEF,wBAAwB,GAA+C,GAAG,EAAE;QACxE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC,CAAC;IAEF,uBAAuB,GAA+C,CAAC,KAAK,EAAE,EAAE;QAC5E,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC;YAAE,OAAO;QAEvF,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QACxD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,IAAc,SAAS;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAc,SAAS;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,IAAc,SAAS,CAAC,GAAY;QAChC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1B,CAAC;IAED,IAAc,UAAU;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAc,cAAc;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAIS,wBAAwB;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,SAAS,GACX,QAAQ,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAA,kCAA0B,EACtB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC5C,yBAAW,CACd,CAAC;QACZ,MAAM,SAAS,GAAG,SAAS,IAAI,sBAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,OAAO,QAAQ;YACX,CAAC,CAAC;gBACI,OAAO,EAAE,QAAS;gBAClB,KAAK,EAAE,SAAU;gBACjB,SAAS,EAAE,SAAU;gBACrB,QAAQ;aACX;YACH,CAAC,CAAC,IAAI,CAAC;IACf,CAAC;IAES,cAAc,CAAC,gBAA0B;QAC/C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC;QACjC,IAAI,gBAAgB,KAAK,KAAK;YAC1B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAA,+BAAkB,EAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;CACJ;AAED,MAAM,qBAAsB,SAAQ,0BAA0B;IAC1D,YAAY,IAAgB,EAAE,MAAgC;QAC1D,KAAK,CAAC,IAAI,EAAE;YACR,GAAG,MAAM;YACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,SAAS,EAAE,iBAAiB,EAAC,CAAC;YAC5D,UAAU,EAAE,IAAI,oCAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;SAC9D,CAAC,CAAC;IACP,CAAC;IAED,OAAO;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1E,OAAO,QAAQ,CAAC,eAAe,IAAI,QAAQ,CAAC,kBAAkB,CAAC;IACnE,CAAC;IAES,cAAc,GAAG,CAAC,KAAuB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC;QACnC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,YAAY,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC,kBAAkB;YAAE,OAAO;QAE9E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,gBAAgB,EAAC,CAAC,CAAC;QAE9C,CAAC;YACG,MAAM,EAAC,EAAE,EAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACpC,IAAA,6BAAc,EAAC,EAAE,CAAC,CAAC;YACnB,IAAA,6BAAgB,EAAC,EAAE,EAAE,IAAA,+BAAuB,EAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,CAAC;YACG,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YAChE,MAAM,EAAE,GAAG,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG;gBACxB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC;aAC3D,CAAC;QACN,CAAC;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,IAAI,4BAAgB,CAAC,IAAI,CAAC,WAAW,EAAE;YACjD,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,eAAe;YACzB,SAAS;SACZ,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAA,iBAAQ,EAC5B,CAAC,KAAiB,EAAE,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBACtB,QAAQ,EAAE,eAAe;gBACzB,SAAS;aACZ,CAAC,CAAC;QACP,CAAC,EACD,mBAAmB,EACnB,EAAC,OAAO,EAAE,mBAAmB,EAAC,CACjC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,EAAE;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAE/C,QAAQ,CAAC,gBAAgB,CACrB,SAAS,EACT,GAAG,EAAE;YACD,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,EACD,EAAC,IAAI,EAAE,IAAI,EAAC,CACf,CAAC;IACN,CAAC,CAAC;IAEM,aAAa,CACjB,KAAiB,EACjB,EACI,QAAQ,EACR,SAAS,EAAE,gBAAgB,GAI9B;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE/C,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,MAAM,EAAC,SAAS,EAAC,GAAG,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAE7C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAA8B,EAAE,EAAE;YACxD,MAAM,gBAAgB,GAAG,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACrE,MAAM,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC;YACxC,MAAM,aAAa,GAAG,UAAU,CAAC,EAAE,CAAC;YAEpC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,IAAe,CAAC;YACrF,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAEzD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,IAAe,CAAC;YACnF,MAAM,UAAU,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;YAEvD,OAAO;gBACH,GAAG,EAAE,EAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAC;gBAChD,IAAI,EAAE;oBACF,GAAG,EAAE,WAAW,CAAC,GAAG;oBACpB,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC5B;gBACD,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;aAC/C,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,CAAC,GAAkB,EAAE;YAC7B,MAAM,EAAC,OAAO,EAAC,GAAG,KAAK,CAAC;YACxB,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,cAAc,GAAG,QAAQ,KAAK,CAAC,CAAC;YACtC,MAAM,aAAa,GAAG,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAEpD,IAAI,CAAC,cAAc,IAAI,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACxD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;oBACnD,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG;wBAAE,SAAS;oBACrC,IAAI,CAAC,GAAG,CAAC,eAAe;wBAAE,SAAS;oBACnC,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,aAAa,IAAI,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1D,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC1C,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM;wBAAE,SAAS;oBACxC,IAAI,CAAC,GAAG,CAAC,kBAAkB;wBAAE,SAAS;oBACtC,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,CAAC;gBACD,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;YACrD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAEO,YAAY,CAAC,YAAqC,EAAE,gBAAiC;QACzF,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,cAAc,EAAC,CAAC,CAAC;QAE5C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACpE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,EAAC,EAAE,EAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QACpC,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;QACjE,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACpB,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9B,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,qBAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,EAAE,CAAC,cAAc,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAE9B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ;AAED,MAAM,wBAAyB,SAAQ,0BAA0B;IAC7D,YAAY,IAAgB,EAAE,MAAgC;QAC1D,KAAK,CAAC,IAAI,EAAE;YACR,GAAG,MAAM;YACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAC,SAAS,EAAE,oBAAoB,EAAC,CAAC;YAC/D,UAAU,EAAE,IAAI,uCAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC;SACjE,CAAC,CAAC;IACP,CAAC;IAED,OAAO;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnF,OAAO,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,iBAAiB,CAAC;IACnE,CAAC;IAES,cAAc,CAAC,KAAuB;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC;QACnC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACtD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClF,IAAI,CAAC,eAAe,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,iBAAiB;YAAE,OAAO;QAEpF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,mBAAmB,EAAC,CAAC,CAAC;QAEjD,CAAC;YACG,MAAM,EAAC,EAAE,EAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACpC,IAAA,6BAAc,EAAC,EAAE,CAAC,CAAC;YACnB,IAAA,gCAAmB,EAAC,EAAE,EAAE,IAAA,kCAA0B,EAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QACD,CAAC;YACG,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG;gBACxB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,aAAK,CAAC,KAAK;aACrB,CAAC;QACN,CAAC;QAED,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE9D,MAAM,KAAK,GAAG,IAAI,4BAAgB,CAAC,IAAI,CAAC,WAAW,EAAE;YACjD,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,eAAe;YACzB,SAAS;SACZ,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAA,iBAAQ,EAC5B,CAAC,KAAiB,EAAE,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBACtB,QAAQ,EAAE,eAAe;gBACzB,SAAS;aACZ,CAAC,CAAC;QACP,CAAC,EACD,mBAAmB,EACnB,EAAC,OAAO,EAAE,mBAAmB,EAAC,CACjC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,EAAE;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAE/C,QAAQ,CAAC,gBAAgB,CACrB,SAAS,EACT,GAAG,EAAE;YACD,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC,EACD,EAAC,IAAI,EAAE,IAAI,EAAC,CACf,CAAC;IACN,CAAC;IAEO,aAAa,CACjB,KAAiB,EACjB,EACI,QAAQ,EACR,SAAS,EAAE,gBAAgB,GAI9B;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE/C,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QAED,MAAM,EAAC,SAAS,EAAC,GAAG,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAEhD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAiC,EAAE,EAAE;YAC3D,MAAM,gBAAgB,GAAG,UAAU,CAC/B,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAC1C,OAAO,CACV,CAAC;YACF,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAEpD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,IAAe,CAAC;YACrF,MAAM,WAAW,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC;YAEzD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,IAAe,CAAC;YACnF,MAAM,UAAU,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;YAEvD,OAAO;gBACH,GAAG,EAAE,EAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAC;gBAChD,IAAI,EAAE;oBACF,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,KAAK,EAAE,UAAU,CAAC,KAAK;iBAC1B;gBACD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;aAC7C,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,CAAC,GAAkB,EAAE;YAC7B,MAAM,EAAC,OAAO,EAAC,GAAG,KAAK,CAAC;YACxB,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,cAAc,GAAG,QAAQ,KAAK,CAAC,CAAC;YACtC,MAAM,aAAa,GAAG,QAAQ,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAEpD,IAAI,CAAC,cAAc,IAAI,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;oBACnD,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACtC,IAAI,CAAC,GAAG,CAAC,gBAAgB;wBAAE,SAAS;oBACpC,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB,CAAC;gBACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,aAAa,IAAI,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACzD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC1C,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK;wBAAE,SAAS;oBACvC,IAAI,CAAC,GAAG,CAAC,iBAAiB;wBAAE,SAAS;oBACrC,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,CAAC;gBACD,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;YACrD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAEO,YAAY,CAChB,YAAwC,EACxC,gBAAiC;QAEjC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,iBAAiB,EAAC,CAAC,CAAC;QAE/C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,EAAE,CAAC;YACzD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,aAAa,GACf,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,CACxD,CAAC,IAAI,CAAC;QACP,MAAM,WAAW,GAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAiB;aACpF,EAAE,CAAC;QAER,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,WAAW;YAAE,OAAO;QAE7D,MAAM,iBAAiB,GAAG,CAAC,GAAkB,EAAE;YAC3C,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC/B,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,4BAAY,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YAEvE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAE3B,OAAO,QAAQ,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,EAAE,CAAC;QAEL,IACI,iBAAiB,KAAK,IAAI;YAC1B,iBAAiB,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC1C,iBAAiB,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAChD,CAAC;YACC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO;QACX,CAAC;QAED,MAAM,EAAC,EAAE,EAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAEpC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,UAAU,CACnB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC3D,OAAO,CACV,CAAC;YACF,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;YACxF,IAAI,IAAI,KAAK,EAAE;gBAAE,SAAS;YAE1B,IAAI,SAAS,CAAC;YACd,IAAI,iBAAiB,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3D,CAAC;iBAAM,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;gBACjC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACJ,SAAS,GAAG,UAAU,CAClB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACvD,OAAO,CACV,CAAC;YACN,CAAC;YAED,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC;gBACvD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,CAAC;QACL,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ;AAED,SAAS,UAAU,CAAC,GAAY,EAAE,GAAoB;IAClD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,UAAU,CAAC;IAClD,OAAO,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAgB,EAAE,IAAgB;IAC7D,OAAO,CACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,oBAAoB;QACzD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAC5D,CAAC;AACN,CAAC","sourcesContent":["import {type Node, Slice} from '#pm/model';\nimport {TextSelection} from '#pm/state';\nimport {findParentNodeClosestToPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {debounce} from 'src/lodash';\nimport type {Logger2} from 'src/logger';\nimport {isTableNode} from 'src/table-utils';\nimport {\n type CellPos,\n type RealCellPos,\n type TableColumnRange,\n TableDesc,\n type TableDescBinded,\n type TableRowRange,\n} from 'src/table-utils/table-desc';\n\nimport {YfmTableNode} from '../../../YfmTableSpecs';\nimport {clearAllSelections, selectDraggedColumn, selectDraggedRow} from '../plugins/dnd-plugin';\nimport {hideHoverDecos} from '../plugins/focus-plugin';\nimport {getSelectedCellsForColumns, getSelectedCellsForRows} from '../utils';\n\nimport {\n type DropCursor,\n type DropCursorParams,\n TableColumnDropCursor,\n TableRowDropCursor,\n} from './dnd-drop-cursor';\nimport {YfmTableDnDGhost} from './dnd-ghost';\n\nimport './dnd.scss';\n\nconst MOUSE_MOVE_DEBOUNCE = 100; // ms\nconst DRAG_START_THRESHOLD = 4; // px\n\ntype PageCoords = Pick<MouseEvent, 'pageX' | 'pageY'>;\n\nexport type DnDControlHandler = {\n canDrag(): boolean;\n control_handleMouseDown: React.MouseEventHandler<HTMLButtonElement>;\n control_handleMouseMove: React.MouseEventHandler<HTMLButtonElement>;\n control_handleMouseUp: React.MouseEventHandler<HTMLButtonElement>;\n control_handleMouseLeave: React.MouseEventHandler<HTMLButtonElement>;\n};\n\ninterface TableHandler {\n update(node: Node): void;\n destroy(): void;\n}\n\nexport type YfmTableDnDHandlerParams = {\n cellNode: Node;\n cellGetPos: () => number | undefined;\n logger: Logger2.ILogger;\n dropCursor?: DropCursorParams;\n};\n\nexport class YfmTableDnDHandler implements TableHandler {\n private readonly _rowHandler: YfmTableRowDnDHandler;\n private readonly _columnHandler: YfmTableColumnDnDHandler;\n\n get row(): DnDControlHandler {\n return this._rowHandler;\n }\n\n get column(): DnDControlHandler {\n return this._columnHandler;\n }\n\n constructor(view: EditorView, params: YfmTableDnDHandlerParams) {\n this._rowHandler = new YfmTableRowDnDHandler(view, params);\n this._columnHandler = new YfmTableColumnDnDHandler(view, params);\n }\n\n update(node: Node): void {\n this._rowHandler.update(node);\n this._columnHandler.update(node);\n }\n\n destroy(): void {\n this._rowHandler.destroy();\n this._columnHandler.destroy();\n }\n}\n\nabstract class YfmTableDnDAbstractHandler implements TableHandler, DnDControlHandler {\n protected readonly _cellGetPos: () => number | undefined;\n protected readonly _editorView: EditorView;\n protected readonly _logger: Logger2.ILogger;\n protected readonly _dropCursor: DropCursor;\n\n private __cellNode: Node;\n private __dragging = false;\n private __destroyed = false;\n private __dragMouseDown: false | PageCoords = false;\n\n constructor(\n view: EditorView,\n params: Omit<YfmTableDnDHandlerParams, 'dropCursor'> & {dropCursor: DropCursor},\n ) {\n this._editorView = view;\n this.__cellNode = params.cellNode;\n this._cellGetPos = params.cellGetPos;\n this._logger = params.logger;\n this._dropCursor = params.dropCursor;\n }\n\n update(cellnode: Node) {\n this.__cellNode = cellnode;\n }\n\n destroy() {\n this.__destroyed = true;\n this._clearDragging(false);\n }\n\n abstract canDrag(): boolean;\n\n control_handleMouseDown: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n this.__dragMouseDown = {pageX: event.pageX, pageY: event.pageY};\n this._dropCursor.clear();\n };\n\n control_handleMouseUp: React.MouseEventHandler<HTMLButtonElement> = () => {\n this.__dragMouseDown = false;\n };\n\n control_handleMouseLeave: React.MouseEventHandler<HTMLButtonElement> = () => {\n this.__dragMouseDown = false;\n };\n\n control_handleMouseMove: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n if (!this._dragMouseDown || !isDragThresholdPassed(this._dragMouseDown, event)) return;\n\n if (this._editorView.dragging || this._dragging) return;\n this._startDragging(event);\n };\n\n protected get _cellNode(): Node {\n return this.__cellNode;\n }\n\n protected get _dragging() {\n return this.__dragging;\n }\n\n protected set _dragging(val: boolean) {\n this.__dragging = val;\n }\n\n protected get _destroyed() {\n return this.__destroyed;\n }\n\n protected get _dragMouseDown() {\n return this.__dragMouseDown;\n }\n\n protected abstract _startDragging(event: React.MouseEvent): void;\n\n protected _getTableDescAndCellInfo() {\n const tcellPos = this._cellGetPos();\n const tableNode =\n tcellPos === undefined\n ? undefined\n : findParentNodeClosestToPos(\n this._editorView.state.doc.resolve(tcellPos),\n isTableNode,\n );\n const tableDesc = tableNode && TableDesc.create(tableNode.node)?.bind(tableNode.pos);\n const cellInfo = tableDesc?.base.getCellInfo(this._cellNode);\n return cellInfo\n ? {\n cellPos: tcellPos!,\n table: tableNode!,\n tableDesc: tableDesc!,\n cellInfo,\n }\n : null;\n }\n\n protected _clearDragging(clearDecorations?: boolean) {\n this.__dragging = false;\n this.__dragMouseDown = false;\n this._dropCursor.clear();\n this._editorView.dragging = null;\n if (clearDecorations !== false)\n this._editorView.dispatch(clearAllSelections(this._editorView.state.tr));\n }\n}\n\nclass YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {\n constructor(view: EditorView, params: YfmTableDnDHandlerParams) {\n super(view, {\n ...params,\n logger: params.logger.nested({component: 'row-dnd-handler'}),\n dropCursor: new TableRowDropCursor(view, params.dropCursor),\n });\n }\n\n canDrag(): boolean {\n const res = this._getTableDescAndCellInfo();\n if (!res) return false;\n const rowRange = res.tableDesc.base.getRowRangeByRowIdx(res.cellInfo.row);\n return rowRange.safeTopBoundary && rowRange.safeBottomBoundary;\n }\n\n protected _startDragging = (event: React.MouseEvent) => {\n const info = this._getTableDescAndCellInfo();\n if (!info) return;\n\n const {tableDesc, cellInfo} = info;\n const rowRanges = tableDesc.base.getRowRanges();\n const currRowRange = tableDesc.base.getRowRangeByRowIdx(cellInfo.row);\n if (!currRowRange.safeTopBoundary || !currRowRange.safeBottomBoundary) return;\n\n this._dragging = true;\n this._logger.event({event: 'row-drag-start'});\n\n {\n const {tr} = this._editorView.state;\n hideHoverDecos(tr);\n selectDraggedRow(tr, getSelectedCellsForRows(info.tableDesc, currRowRange));\n this._editorView.dispatch(tr);\n }\n\n {\n const from = tableDesc.getPosForRow(currRowRange.startIdx).from;\n const to = tableDesc.getPosForRow(currRowRange.endIdx).to;\n this._editorView.dragging = {\n move: true,\n slice: this._editorView.state.doc.slice(from, to, false),\n };\n }\n\n const draggedRangeIdx = rowRanges.indexOf(currRowRange);\n\n const ghost = new YfmTableDnDGhost(this._editorView, {\n type: 'row',\n initial: event,\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n\n const onMoveDebounced = debounce(\n (event: MouseEvent) => {\n this._moveDragging(event, {\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n },\n MOUSE_MOVE_DEBOUNCE,\n {maxWait: MOUSE_MOVE_DEBOUNCE},\n );\n\n const onMove = (event: MouseEvent) => {\n ghost.move(event);\n onMoveDebounced(event);\n };\n\n document.addEventListener('mousemove', onMove);\n\n document.addEventListener(\n 'mouseup',\n () => {\n onMoveDebounced.flush();\n ghost.destroy();\n document.removeEventListener('mousemove', onMove);\n this._endDragging(currRowRange, tableDesc);\n },\n {once: true},\n );\n };\n\n private _moveDragging(\n event: MouseEvent,\n {\n rangeIdx,\n tableDesc: initialTableDesc,\n }: {\n rangeIdx: number;\n tableDesc: TableDescBinded;\n },\n ) {\n if (this._destroyed || !this._dragging) return;\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._clearDragging();\n return;\n }\n\n const {tableDesc} = info;\n const ranges = tableDesc.base.getRowRanges();\n\n const boxes = ranges.map((range: Readonly<TableRowRange>) => {\n const firstRowStartPos = tableDesc.getPosForRow(range.startIdx).from;\n const lastRowPos = tableDesc.getPosForRow(range.endIdx);\n const lastRowStartPos = lastRowPos.from;\n const lastRowEndPos = lastRowPos.to;\n\n const firstRowElem = this._editorView.domAtPos(firstRowStartPos + 1).node as Element;\n const firstRowBox = firstRowElem.getBoundingClientRect();\n\n const lastRowElem = this._editorView.domAtPos(lastRowStartPos + 1).node as Element;\n const lastRowBox = lastRowElem.getBoundingClientRect();\n\n return {\n pos: {from: firstRowStartPos, to: lastRowEndPos},\n rect: {\n top: firstRowBox.top,\n bottom: lastRowBox.bottom,\n },\n safeTopBoundary: range.safeTopBoundary,\n safeBottomBoundary: range.safeBottomBoundary,\n };\n });\n\n const pos = ((): number | null => {\n const {clientY} = event;\n const draggedRangeBox = boxes[rangeIdx];\n const isDraggedFirst = rangeIdx === 0;\n const isDraggedLast = rangeIdx === boxes.length - 1;\n\n if (!isDraggedFirst && clientY < draggedRangeBox.rect.top) {\n for (const box of boxes.slice(0, rangeIdx).reverse()) {\n if (clientY < box.rect.top) continue;\n if (!box.safeTopBoundary) continue;\n return box.pos.from;\n }\n return boxes[0].pos.from;\n }\n\n if (!isDraggedLast && clientY > draggedRangeBox.rect.bottom) {\n for (const box of boxes.slice(rangeIdx + 1)) {\n if (clientY > box.rect.bottom) continue;\n if (!box.safeBottomBoundary) continue;\n return box.pos.to;\n }\n return boxes.at(-1)!.pos.to;\n }\n\n return null;\n })();\n\n if (typeof pos === 'number') this._dropCursor.setPos(pos);\n else this._dropCursor.clear();\n }\n\n private _endDragging(draggedRange: Readonly<TableRowRange>, initialTableDesc: TableDescBinded) {\n if (this._destroyed || !this._dragging) return;\n\n const point = this._dropCursor.getPos();\n this._clearDragging();\n this._logger.event({event: 'row-drag-end'});\n\n if (point === null) {\n this._editorView.focus();\n return;\n }\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._editorView.focus();\n return;\n }\n\n const rangeFrom = info.tableDesc.getPosForRow(draggedRange.startIdx).from;\n const rangeTo = info.tableDesc.getPosForRow(draggedRange.endIdx).to;\n if (point === rangeFrom || point === rangeTo) {\n this._editorView.focus();\n return;\n }\n\n const {tr} = this._editorView.state;\n const fragment = tr.doc.slice(rangeFrom, rangeTo, false).content;\n if (point > rangeFrom) {\n tr.insert(point, fragment);\n tr.delete(rangeFrom, rangeTo);\n } else {\n tr.delete(rangeFrom, rangeTo);\n tr.insert(point, fragment);\n }\n tr.setSelection(TextSelection.near(tr.doc.resolve(tr.mapping.map(point + 1)), 1));\n tr.scrollIntoView();\n this._editorView.dispatch(tr);\n\n this._editorView.focus();\n }\n}\n\nclass YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {\n constructor(view: EditorView, params: YfmTableDnDHandlerParams) {\n super(view, {\n ...params,\n logger: params.logger.nested({component: 'column-dnd-handler'}),\n dropCursor: new TableColumnDropCursor(view, params.dropCursor),\n });\n }\n\n canDrag(): boolean {\n const res = this._getTableDescAndCellInfo();\n if (!res) return false;\n const rowRange = res.tableDesc.base.getColumnRangeByColumnIdx(res.cellInfo.column);\n return rowRange.safeLeftBoundary && rowRange.safeRightBoundary;\n }\n\n protected _startDragging(event: React.MouseEvent) {\n const info = this._getTableDescAndCellInfo();\n if (!info) return;\n\n const {tableDesc, cellInfo} = info;\n const columnRanges = tableDesc.base.getColumnRanges();\n const currColumnRange = tableDesc.base.getColumnRangeByColumnIdx(cellInfo.column);\n if (!currColumnRange.safeLeftBoundary || !currColumnRange.safeRightBoundary) return;\n\n this._dragging = true;\n this._logger.event({event: 'column-drag-start'});\n\n {\n const {tr} = this._editorView.state;\n hideHoverDecos(tr);\n selectDraggedColumn(tr, getSelectedCellsForColumns(tableDesc, currColumnRange));\n this._editorView.dispatch(tr);\n }\n {\n this._editorView.dragging = {\n move: true,\n slice: Slice.empty,\n };\n }\n\n const draggedRangeIdx = columnRanges.indexOf(currColumnRange);\n\n const ghost = new YfmTableDnDGhost(this._editorView, {\n type: 'column',\n initial: event,\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n\n const onMoveDebounced = debounce(\n (event: MouseEvent) => {\n this._moveDragging(event, {\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n },\n MOUSE_MOVE_DEBOUNCE,\n {maxWait: MOUSE_MOVE_DEBOUNCE},\n );\n\n const onMove = (event: MouseEvent) => {\n ghost.move(event);\n onMoveDebounced(event);\n };\n\n document.addEventListener('mousemove', onMove);\n\n document.addEventListener(\n 'mouseup',\n () => {\n onMoveDebounced.flush();\n ghost.destroy();\n document.removeEventListener('mousemove', onMove);\n this._endDragging(currColumnRange, tableDesc);\n },\n {once: true},\n );\n }\n\n private _moveDragging(\n event: MouseEvent,\n {\n rangeIdx,\n tableDesc: initialTableDesc,\n }: {\n rangeIdx: number;\n tableDesc: TableDescBinded;\n },\n ) {\n if (this._destroyed || !this._dragging) return;\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._clearDragging();\n return;\n }\n\n const {tableDesc} = info;\n const ranges = tableDesc.base.getColumnRanges();\n\n const boxes = ranges.map((range: Readonly<TableColumnRange>) => {\n const firstColStartPos = getCellPos(\n tableDesc.getPosForCell(0, range.startIdx),\n 'start',\n );\n const lastColPos = tableDesc.getPosForCell(0, range.startIdx);\n const lastColStartPos = getCellPos(lastColPos, 'start');\n const lastColEndPos = getCellPos(lastColPos, 'end');\n\n const firstColElem = this._editorView.domAtPos(firstColStartPos + 1).node as Element;\n const firstColBox = firstColElem.getBoundingClientRect();\n\n const lastColElem = this._editorView.domAtPos(lastColStartPos + 1).node as Element;\n const lastColBox = lastColElem.getBoundingClientRect();\n\n return {\n pos: {from: firstColStartPos, to: lastColEndPos},\n rect: {\n left: firstColBox.left,\n right: lastColBox.right,\n },\n safeLeftBoundary: range.safeLeftBoundary,\n safeRightBoundary: range.safeRightBoundary,\n };\n });\n\n const pos = ((): number | null => {\n const {clientX} = event;\n const draggedRangeBox = boxes[rangeIdx];\n const isDraggedFirst = rangeIdx === 0;\n const isDraggedLast = rangeIdx === boxes.length - 1;\n\n if (!isDraggedFirst && clientX < draggedRangeBox.rect.left) {\n for (const box of boxes.slice(0, rangeIdx).reverse()) {\n if (clientX < box.rect.left) continue;\n if (!box.safeLeftBoundary) continue;\n return box.pos.from;\n }\n return boxes[0].pos.from;\n }\n\n if (!isDraggedLast && clientX > draggedRangeBox.rect.right) {\n for (const box of boxes.slice(rangeIdx + 1)) {\n if (clientX > box.rect.right) continue;\n if (!box.safeRightBoundary) continue;\n return box.pos.to;\n }\n return boxes.at(-1)!.pos.to;\n }\n\n return null;\n })();\n\n if (typeof pos === 'number') this._dropCursor.setPos(pos);\n else this._dropCursor.clear();\n }\n\n private _endDragging(\n draggedRange: Readonly<TableColumnRange>,\n initialTableDesc: TableDescBinded,\n ) {\n if (this._destroyed || !this._dragging) return;\n\n const point = this._dropCursor.getPos();\n this._clearDragging();\n this._logger.event({event: 'column-drag-end'});\n\n if (point === null) {\n this._editorView.focus();\n return;\n }\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._editorView.focus();\n return;\n }\n\n const currRangeFrom = (\n info.tableDesc.getPosForCell(0, draggedRange.startIdx) as RealCellPos\n ).from;\n const currRangeTo = (info.tableDesc.getPosForCell(0, draggedRange.endIdx) as RealCellPos)\n .to;\n\n if (point === currRangeFrom || point === currRangeTo) return;\n\n const targetColumnIndex = ((): number | null => {\n if (point === info.tableDesc.getPosForRow(0).to - 1) {\n return info.tableDesc.cols;\n }\n\n const cellNode = this._editorView.state.doc.nodeAt(point);\n if (!cellNode || cellNode.type.name !== YfmTableNode.Cell) return null;\n\n const cellInfo = info.tableDesc.base.getCellInfo(cellNode);\n if (!cellInfo) return null;\n\n return cellInfo.column;\n })();\n\n if (\n targetColumnIndex === null ||\n targetColumnIndex === info.cellInfo.column ||\n targetColumnIndex === info.cellInfo.column + 1\n ) {\n this._editorView.focus();\n return;\n }\n\n const {tr} = this._editorView.state;\n\n for (let rowIdx = 0; rowIdx < info.tableDesc.rows; rowIdx++) {\n const from = getCellPos(\n info.tableDesc.getPosForCell(rowIdx, draggedRange.startIdx),\n 'start',\n );\n const to = getCellPos(info.tableDesc.getPosForCell(rowIdx, draggedRange.endIdx), 'end');\n if (from === to) continue;\n\n let targetPos;\n if (targetColumnIndex === info.tableDesc.cols) {\n targetPos = info.tableDesc.getPosForRow(rowIdx).to - 1;\n } else if (targetColumnIndex === 0) {\n targetPos = info.tableDesc.getPosForRow(rowIdx).from + 1;\n } else {\n targetPos = getCellPos(\n info.tableDesc.getPosForCell(rowIdx, targetColumnIndex),\n 'start',\n );\n }\n\n if (targetPos !== from && targetPos !== to) {\n const fragment = tr.doc.slice(from, to, false).content;\n tr.insert(tr.mapping.map(targetPos), fragment);\n tr.delete(tr.mapping.map(from), tr.mapping.map(to));\n }\n }\n\n this._editorView.dispatch(tr.scrollIntoView());\n this._editorView.focus();\n }\n}\n\nfunction getCellPos(pos: CellPos, dir: 'start' | 'end'): number {\n if (pos.type === 'virtual') return pos.closestPos;\n return dir === 'start' ? pos.from : pos.to;\n}\n\nfunction isDragThresholdPassed(init: PageCoords, curr: PageCoords): boolean {\n return (\n Math.abs(init.pageX - curr.pageX) >= DRAG_START_THRESHOLD ||\n Math.abs(init.pageY - curr.pageY) >= DRAG_START_THRESHOLD\n );\n}\n"]}
1
+ {"version":3,"file":"dnd.js","sourceRoot":"../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Node, Slice} from '#pm/model';\nimport {TextSelection} from '#pm/state';\nimport {findParentNodeClosestToPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {debounce} from 'src/lodash';\nimport type {Logger2} from 'src/logger';\nimport {isTableNode} from 'src/table-utils';\nimport {\n type CellPos,\n type RealCellPos,\n type TableColumnRange,\n TableDesc,\n type TableDescBinded,\n type TableRowRange,\n} from 'src/table-utils/table-desc';\n\nimport {YfmTableNode} from '../../../YfmTableSpecs';\nimport {clearAllSelections, selectDraggedColumn, selectDraggedRow} from '../plugins/dnd-plugin';\nimport {hideHoverDecos} from '../plugins/focus-plugin';\nimport {getSelectedCellsForColumns, getSelectedCellsForRows} from '../utils';\n\nimport {DnDAutoScroller} from './dnd-auto-scroll';\nimport {\n type DropCursor,\n type DropCursorParams,\n TableColumnDropCursor,\n TableRowDropCursor,\n} from './dnd-drop-cursor';\nimport {YfmTableDnDGhost} from './dnd-ghost';\n\nimport './dnd.scss';\n\nconst MOUSE_MOVE_DEBOUNCE = 100; // ms\nconst DRAG_START_THRESHOLD = 4; // px\n\ntype PageCoords = Pick<MouseEvent, 'pageX' | 'pageY'>;\n\nexport type DnDControlHandler = {\n canDrag(): boolean;\n control_handleMouseDown: React.MouseEventHandler<HTMLButtonElement>;\n control_handleMouseMove: React.MouseEventHandler<HTMLButtonElement>;\n control_handleMouseUp: React.MouseEventHandler<HTMLButtonElement>;\n control_handleMouseLeave: React.MouseEventHandler<HTMLButtonElement>;\n};\n\ninterface TableHandler {\n update(node: Node): void;\n destroy(): void;\n}\n\nexport type YfmTableDnDHandlerParams = {\n cellNode: Node;\n cellGetPos: () => number | undefined;\n logger: Logger2.ILogger;\n dropCursor?: DropCursorParams;\n};\n\nexport class YfmTableDnDHandler implements TableHandler {\n private readonly _rowHandler: YfmTableRowDnDHandler;\n private readonly _columnHandler: YfmTableColumnDnDHandler;\n\n get row(): DnDControlHandler {\n return this._rowHandler;\n }\n\n get column(): DnDControlHandler {\n return this._columnHandler;\n }\n\n constructor(view: EditorView, params: YfmTableDnDHandlerParams) {\n this._rowHandler = new YfmTableRowDnDHandler(view, params);\n this._columnHandler = new YfmTableColumnDnDHandler(view, params);\n }\n\n update(node: Node): void {\n this._rowHandler.update(node);\n this._columnHandler.update(node);\n }\n\n destroy(): void {\n this._rowHandler.destroy();\n this._columnHandler.destroy();\n }\n}\n\nabstract class YfmTableDnDAbstractHandler implements TableHandler, DnDControlHandler {\n protected readonly _cellGetPos: () => number | undefined;\n protected readonly _editorView: EditorView;\n protected readonly _logger: Logger2.ILogger;\n protected readonly _dropCursor: DropCursor;\n\n private __cellNode: Node;\n private __dragging = false;\n private __destroyed = false;\n private __dragMouseDown: false | PageCoords = false;\n\n constructor(\n view: EditorView,\n params: Omit<YfmTableDnDHandlerParams, 'dropCursor'> & {dropCursor: DropCursor},\n ) {\n this._editorView = view;\n this.__cellNode = params.cellNode;\n this._cellGetPos = params.cellGetPos;\n this._logger = params.logger;\n this._dropCursor = params.dropCursor;\n }\n\n update(cellnode: Node) {\n this.__cellNode = cellnode;\n }\n\n destroy() {\n this.__destroyed = true;\n this._clearDragging(false);\n }\n\n abstract canDrag(): boolean;\n\n control_handleMouseDown: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n this.__dragMouseDown = {pageX: event.pageX, pageY: event.pageY};\n this._dropCursor.clear();\n };\n\n control_handleMouseUp: React.MouseEventHandler<HTMLButtonElement> = () => {\n this.__dragMouseDown = false;\n };\n\n control_handleMouseLeave: React.MouseEventHandler<HTMLButtonElement> = () => {\n this.__dragMouseDown = false;\n };\n\n control_handleMouseMove: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n if (!this._dragMouseDown || !isDragThresholdPassed(this._dragMouseDown, event)) return;\n\n if (this._editorView.dragging || this._dragging) return;\n this._startDragging(event);\n };\n\n protected get _cellNode(): Node {\n return this.__cellNode;\n }\n\n protected get _dragging() {\n return this.__dragging;\n }\n\n protected set _dragging(val: boolean) {\n this.__dragging = val;\n }\n\n protected get _destroyed() {\n return this.__destroyed;\n }\n\n protected get _dragMouseDown() {\n return this.__dragMouseDown;\n }\n\n protected abstract _startDragging(event: React.MouseEvent): void;\n\n protected _getTableDescAndCellInfo() {\n const tcellPos = this._cellGetPos();\n const tableNode =\n tcellPos === undefined\n ? undefined\n : findParentNodeClosestToPos(\n this._editorView.state.doc.resolve(tcellPos),\n isTableNode,\n );\n const tableDesc = tableNode && TableDesc.create(tableNode.node)?.bind(tableNode.pos);\n const cellInfo = tableDesc?.base.getCellInfo(this._cellNode);\n return cellInfo\n ? {\n cellPos: tcellPos!,\n table: tableNode!,\n tableDesc: tableDesc!,\n cellInfo,\n }\n : null;\n }\n\n protected _clearDragging(clearDecorations?: boolean) {\n this.__dragging = false;\n this.__dragMouseDown = false;\n this._dropCursor.clear();\n this._editorView.dragging = null;\n if (clearDecorations !== false)\n this._editorView.dispatch(clearAllSelections(this._editorView.state.tr));\n }\n}\n\nclass YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {\n constructor(view: EditorView, params: YfmTableDnDHandlerParams) {\n super(view, {\n ...params,\n logger: params.logger.nested({component: 'row-dnd-handler'}),\n dropCursor: new TableRowDropCursor(view, params.dropCursor),\n });\n }\n\n canDrag(): boolean {\n const res = this._getTableDescAndCellInfo();\n if (!res) return false;\n const rowRange = res.tableDesc.base.getRowRangeByRowIdx(res.cellInfo.row);\n return rowRange.safeTopBoundary && rowRange.safeBottomBoundary;\n }\n\n protected _startDragging = (event: React.MouseEvent) => {\n const info = this._getTableDescAndCellInfo();\n if (!info) return;\n\n const {tableDesc, cellInfo} = info;\n const rowRanges = tableDesc.base.getRowRanges();\n const currRowRange = tableDesc.base.getRowRangeByRowIdx(cellInfo.row);\n if (!currRowRange.safeTopBoundary || !currRowRange.safeBottomBoundary) return;\n\n this._dragging = true;\n this._logger.event({event: 'row-drag-start'});\n\n {\n const {tr} = this._editorView.state;\n hideHoverDecos(tr);\n selectDraggedRow(tr, getSelectedCellsForRows(info.tableDesc, currRowRange));\n this._editorView.dispatch(tr);\n }\n\n {\n const from = tableDesc.getPosForRow(currRowRange.startIdx).from;\n const to = tableDesc.getPosForRow(currRowRange.endIdx).to;\n this._editorView.dragging = {\n move: true,\n slice: this._editorView.state.doc.slice(from, to, false),\n };\n }\n\n const draggedRangeIdx = rowRanges.indexOf(currRowRange);\n\n const ghost = new YfmTableDnDGhost(this._editorView, {\n type: 'row',\n initial: event,\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n\n const scrollContainer = findScrollableAncestor(this._editorView.dom, 'vertical');\n const autoScroller = scrollContainer\n ? new DnDAutoScroller(scrollContainer, 'vertical')\n : null;\n\n const onMoveDebounced = debounce(\n (event: MouseEvent) => {\n this._moveDragging(event, {\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n },\n MOUSE_MOVE_DEBOUNCE,\n {maxWait: MOUSE_MOVE_DEBOUNCE},\n );\n\n const onMove = (event: MouseEvent) => {\n ghost.move(event);\n autoScroller?.update(event.clientX, event.clientY);\n onMoveDebounced(event);\n };\n\n document.addEventListener('mousemove', onMove);\n\n document.addEventListener(\n 'mouseup',\n () => {\n onMoveDebounced.flush();\n autoScroller?.destroy();\n ghost.destroy();\n document.removeEventListener('mousemove', onMove);\n this._endDragging(currRowRange, tableDesc);\n },\n {once: true},\n );\n };\n\n private _moveDragging(\n event: MouseEvent,\n {\n rangeIdx,\n tableDesc: initialTableDesc,\n }: {\n rangeIdx: number;\n tableDesc: TableDescBinded;\n },\n ) {\n if (this._destroyed || !this._dragging) return;\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._clearDragging();\n return;\n }\n\n const {tableDesc} = info;\n const ranges = tableDesc.base.getRowRanges();\n\n const boxes = ranges.map((range: Readonly<TableRowRange>) => {\n const firstRowStartPos = tableDesc.getPosForRow(range.startIdx).from;\n const lastRowPos = tableDesc.getPosForRow(range.endIdx);\n const lastRowStartPos = lastRowPos.from;\n const lastRowEndPos = lastRowPos.to;\n\n const firstRowElem = this._editorView.domAtPos(firstRowStartPos + 1).node as Element;\n const firstRowBox = firstRowElem.getBoundingClientRect();\n\n const lastRowElem = this._editorView.domAtPos(lastRowStartPos + 1).node as Element;\n const lastRowBox = lastRowElem.getBoundingClientRect();\n\n return {\n pos: {from: firstRowStartPos, to: lastRowEndPos},\n rect: {\n top: firstRowBox.top,\n bottom: lastRowBox.bottom,\n },\n safeTopBoundary: range.safeTopBoundary,\n safeBottomBoundary: range.safeBottomBoundary,\n };\n });\n\n const pos = ((): number | null => {\n const {clientY} = event;\n const draggedRangeBox = boxes[rangeIdx];\n const isDraggedFirst = rangeIdx === 0;\n const isDraggedLast = rangeIdx === boxes.length - 1;\n\n if (!isDraggedFirst && clientY < draggedRangeBox.rect.top) {\n for (const box of boxes.slice(0, rangeIdx).reverse()) {\n if (clientY < box.rect.top) continue;\n if (!box.safeTopBoundary) continue;\n return box.pos.from;\n }\n return boxes[0].pos.from;\n }\n\n if (!isDraggedLast && clientY > draggedRangeBox.rect.bottom) {\n for (const box of boxes.slice(rangeIdx + 1)) {\n if (clientY > box.rect.bottom) continue;\n if (!box.safeBottomBoundary) continue;\n return box.pos.to;\n }\n return boxes.at(-1)!.pos.to;\n }\n\n return null;\n })();\n\n if (typeof pos === 'number') this._dropCursor.setPos(pos);\n else this._dropCursor.clear();\n }\n\n private _endDragging(draggedRange: Readonly<TableRowRange>, initialTableDesc: TableDescBinded) {\n if (this._destroyed || !this._dragging) return;\n\n const point = this._dropCursor.getPos();\n this._clearDragging();\n this._logger.event({event: 'row-drag-end'});\n\n if (point === null) {\n this._editorView.focus();\n return;\n }\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._editorView.focus();\n return;\n }\n\n const rangeFrom = info.tableDesc.getPosForRow(draggedRange.startIdx).from;\n const rangeTo = info.tableDesc.getPosForRow(draggedRange.endIdx).to;\n if (point === rangeFrom || point === rangeTo) {\n this._editorView.focus();\n return;\n }\n\n const {tr} = this._editorView.state;\n const fragment = tr.doc.slice(rangeFrom, rangeTo, false).content;\n if (point > rangeFrom) {\n tr.insert(point, fragment);\n tr.delete(rangeFrom, rangeTo);\n } else {\n tr.delete(rangeFrom, rangeTo);\n tr.insert(point, fragment);\n }\n tr.setSelection(TextSelection.near(tr.doc.resolve(tr.mapping.map(point + 1)), 1));\n tr.scrollIntoView();\n this._editorView.dispatch(tr);\n\n this._editorView.focus();\n }\n}\n\nclass YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {\n constructor(view: EditorView, params: YfmTableDnDHandlerParams) {\n super(view, {\n ...params,\n logger: params.logger.nested({component: 'column-dnd-handler'}),\n dropCursor: new TableColumnDropCursor(view, params.dropCursor),\n });\n }\n\n canDrag(): boolean {\n const res = this._getTableDescAndCellInfo();\n if (!res) return false;\n const rowRange = res.tableDesc.base.getColumnRangeByColumnIdx(res.cellInfo.column);\n return rowRange.safeLeftBoundary && rowRange.safeRightBoundary;\n }\n\n protected _startDragging(event: React.MouseEvent) {\n const info = this._getTableDescAndCellInfo();\n if (!info) return;\n\n const {tableDesc, cellInfo} = info;\n const columnRanges = tableDesc.base.getColumnRanges();\n const currColumnRange = tableDesc.base.getColumnRangeByColumnIdx(cellInfo.column);\n if (!currColumnRange.safeLeftBoundary || !currColumnRange.safeRightBoundary) return;\n\n this._dragging = true;\n this._logger.event({event: 'column-drag-start'});\n\n {\n const {tr} = this._editorView.state;\n hideHoverDecos(tr);\n selectDraggedColumn(tr, getSelectedCellsForColumns(tableDesc, currColumnRange));\n this._editorView.dispatch(tr);\n }\n {\n this._editorView.dragging = {\n move: true,\n slice: Slice.empty,\n };\n }\n\n const draggedRangeIdx = columnRanges.indexOf(currColumnRange);\n\n const ghost = new YfmTableDnDGhost(this._editorView, {\n type: 'column',\n initial: event,\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n\n const {node: tableElem} = this._editorView.domAtPos(tableDesc.pos + 1);\n const autoScroller =\n tableElem instanceof HTMLElement ? new DnDAutoScroller(tableElem, 'horizontal') : null;\n\n const onMoveDebounced = debounce(\n (event: MouseEvent) => {\n this._moveDragging(event, {\n rangeIdx: draggedRangeIdx,\n tableDesc,\n });\n },\n MOUSE_MOVE_DEBOUNCE,\n {maxWait: MOUSE_MOVE_DEBOUNCE},\n );\n\n const onMove = (event: MouseEvent) => {\n ghost.move(event);\n autoScroller?.update(event.clientX, event.clientY);\n onMoveDebounced(event);\n };\n\n document.addEventListener('mousemove', onMove);\n\n document.addEventListener(\n 'mouseup',\n () => {\n onMoveDebounced.flush();\n autoScroller?.destroy();\n ghost.destroy();\n document.removeEventListener('mousemove', onMove);\n this._endDragging(currColumnRange, tableDesc);\n },\n {once: true},\n );\n }\n\n private _moveDragging(\n event: MouseEvent,\n {\n rangeIdx,\n tableDesc: initialTableDesc,\n }: {\n rangeIdx: number;\n tableDesc: TableDescBinded;\n },\n ) {\n if (this._destroyed || !this._dragging) return;\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._clearDragging();\n return;\n }\n\n const {tableDesc} = info;\n const ranges = tableDesc.base.getColumnRanges();\n\n const boxes = ranges.map((range: Readonly<TableColumnRange>) => {\n const firstColStartPos = getCellPos(\n tableDesc.getPosForCell(0, range.startIdx),\n 'start',\n );\n const lastColPos = tableDesc.getPosForCell(0, range.startIdx);\n const lastColStartPos = getCellPos(lastColPos, 'start');\n const lastColEndPos = getCellPos(lastColPos, 'end');\n\n const firstColElem = this._editorView.domAtPos(firstColStartPos + 1).node as Element;\n const firstColBox = firstColElem.getBoundingClientRect();\n\n const lastColElem = this._editorView.domAtPos(lastColStartPos + 1).node as Element;\n const lastColBox = lastColElem.getBoundingClientRect();\n\n return {\n pos: {from: firstColStartPos, to: lastColEndPos},\n rect: {\n left: firstColBox.left,\n right: lastColBox.right,\n },\n safeLeftBoundary: range.safeLeftBoundary,\n safeRightBoundary: range.safeRightBoundary,\n };\n });\n\n const pos = ((): number | null => {\n const {clientX} = event;\n const draggedRangeBox = boxes[rangeIdx];\n const isDraggedFirst = rangeIdx === 0;\n const isDraggedLast = rangeIdx === boxes.length - 1;\n\n if (!isDraggedFirst && clientX < draggedRangeBox.rect.left) {\n for (const box of boxes.slice(0, rangeIdx).reverse()) {\n if (clientX < box.rect.left) continue;\n if (!box.safeLeftBoundary) continue;\n return box.pos.from;\n }\n return boxes[0].pos.from;\n }\n\n if (!isDraggedLast && clientX > draggedRangeBox.rect.right) {\n for (const box of boxes.slice(rangeIdx + 1)) {\n if (clientX > box.rect.right) continue;\n if (!box.safeRightBoundary) continue;\n return box.pos.to;\n }\n return boxes.at(-1)!.pos.to;\n }\n\n return null;\n })();\n\n if (typeof pos === 'number') this._dropCursor.setPos(pos);\n else this._dropCursor.clear();\n }\n\n private _endDragging(\n draggedRange: Readonly<TableColumnRange>,\n initialTableDesc: TableDescBinded,\n ) {\n if (this._destroyed || !this._dragging) return;\n\n const point = this._dropCursor.getPos();\n this._clearDragging();\n this._logger.event({event: 'column-drag-end'});\n\n if (point === null) {\n this._editorView.focus();\n return;\n }\n\n const info = this._getTableDescAndCellInfo();\n if (!info || info.tableDesc.base !== initialTableDesc.base) {\n this._editorView.focus();\n return;\n }\n\n const currRangeFrom = (\n info.tableDesc.getPosForCell(0, draggedRange.startIdx) as RealCellPos\n ).from;\n const currRangeTo = (info.tableDesc.getPosForCell(0, draggedRange.endIdx) as RealCellPos)\n .to;\n\n if (point === currRangeFrom || point === currRangeTo) return;\n\n const targetColumnIndex = ((): number | null => {\n if (point === info.tableDesc.getPosForRow(0).to - 1) {\n return info.tableDesc.cols;\n }\n\n const cellNode = this._editorView.state.doc.nodeAt(point);\n if (!cellNode || cellNode.type.name !== YfmTableNode.Cell) return null;\n\n const cellInfo = info.tableDesc.base.getCellInfo(cellNode);\n if (!cellInfo) return null;\n\n return cellInfo.column;\n })();\n\n if (\n targetColumnIndex === null ||\n targetColumnIndex === info.cellInfo.column ||\n targetColumnIndex === info.cellInfo.column + 1\n ) {\n this._editorView.focus();\n return;\n }\n\n const {tr} = this._editorView.state;\n\n for (let rowIdx = 0; rowIdx < info.tableDesc.rows; rowIdx++) {\n const from = getCellPos(\n info.tableDesc.getPosForCell(rowIdx, draggedRange.startIdx),\n 'start',\n );\n const to = getCellPos(info.tableDesc.getPosForCell(rowIdx, draggedRange.endIdx), 'end');\n if (from === to) continue;\n\n let targetPos;\n if (targetColumnIndex === info.tableDesc.cols) {\n targetPos = info.tableDesc.getPosForRow(rowIdx).to - 1;\n } else if (targetColumnIndex === 0) {\n targetPos = info.tableDesc.getPosForRow(rowIdx).from + 1;\n } else {\n targetPos = getCellPos(\n info.tableDesc.getPosForCell(rowIdx, targetColumnIndex),\n 'start',\n );\n }\n\n if (targetPos !== from && targetPos !== to) {\n const fragment = tr.doc.slice(from, to, false).content;\n tr.insert(tr.mapping.map(targetPos), fragment);\n tr.delete(tr.mapping.map(from), tr.mapping.map(to));\n }\n }\n\n this._editorView.dispatch(tr.scrollIntoView());\n this._editorView.focus();\n }\n}\n\nfunction getCellPos(pos: CellPos, dir: 'start' | 'end'): number {\n if (pos.type === 'virtual') return pos.closestPos;\n return dir === 'start' ? pos.from : pos.to;\n}\n\nfunction isDragThresholdPassed(init: PageCoords, curr: PageCoords): boolean {\n return (\n Math.abs(init.pageX - curr.pageX) >= DRAG_START_THRESHOLD ||\n Math.abs(init.pageY - curr.pageY) >= DRAG_START_THRESHOLD\n );\n}\n\nfunction findScrollableAncestor(\n element: HTMLElement,\n axis: 'vertical' | 'horizontal',\n): HTMLElement | null {\n const prop = axis === 'vertical' ? 'overflowY' : 'overflowX';\n let current = element.parentElement;\n\n while (current && current !== document.documentElement) {\n const overflow = getComputedStyle(current)[prop];\n if (overflow === 'auto' || overflow === 'scroll') {\n const hasScroll =\n axis === 'vertical'\n ? current.scrollHeight > current.clientHeight\n : current.scrollWidth > current.clientWidth;\n if (hasScroll) return current;\n }\n current = current.parentElement;\n }\n\n const docEl = element.ownerDocument.documentElement;\n const hasDocScroll =\n axis === 'vertical'\n ? docEl.scrollHeight > docEl.clientHeight\n : docEl.scrollWidth > docEl.clientWidth;\n if (hasDocScroll) return docEl;\n\n return null;\n}\n"]}
@@ -704,10 +704,12 @@ exports.colorifyItemView = {
704
704
  };
705
705
  exports.colorifyItemWysiwyg = {
706
706
  component: WToolbarColors_1.WToolbarColors,
707
+ noRerenderOnUpdate: true, // WToolbarColors uses toolbar context to update its own state
707
708
  width: 42,
708
709
  };
709
710
  exports.colorifyItemMarkup = {
710
711
  component: MToolbarColors_1.MToolbarColors,
712
+ noRerenderOnUpdate: true, // static state in markup mode
711
713
  width: 42,
712
714
  };
713
715
  // ---- GPT ----