@gravity-ui/markdown-editor 15.20.0 → 15.22.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 (114) hide show
  1. package/build/cjs/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
  2. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +11 -9
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  6. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
  7. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  8. package/build/cjs/extensions/additional/Mermaid/index.d.ts +4 -0
  9. package/build/cjs/extensions/additional/Mermaid/index.js +4 -4
  10. package/build/cjs/extensions/additional/Mermaid/index.js.map +1 -1
  11. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +11 -8
  12. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  13. package/build/cjs/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
  14. package/build/cjs/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  15. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
  16. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  17. package/build/cjs/extensions/yfm/YfmConfigs/index.d.ts +5 -1
  18. package/build/cjs/extensions/yfm/YfmConfigs/index.js +7 -1
  19. package/build/cjs/extensions/yfm/YfmConfigs/index.js.map +1 -1
  20. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
  21. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  22. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
  23. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  24. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
  25. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
  26. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
  27. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
  28. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
  29. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
  30. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +177 -0
  31. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
  32. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
  33. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
  34. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +40 -25
  35. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  36. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
  37. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  38. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
  39. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
  40. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
  41. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
  42. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +50 -0
  43. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
  44. package/build/cjs/react-utils/hooks/useAutoSave.d.ts +23 -0
  45. package/build/cjs/react-utils/hooks/useAutoSave.js +59 -0
  46. package/build/cjs/react-utils/hooks/useAutoSave.js.map +1 -0
  47. package/build/cjs/react-utils/hooks.d.ts +1 -1
  48. package/build/cjs/react-utils/hooks.js +3 -1
  49. package/build/cjs/react-utils/hooks.js.map +1 -1
  50. package/build/cjs/version.js +1 -1
  51. package/build/cjs/version.js.map +1 -1
  52. package/build/cjs/view/components/YfmHtml/YfmStaticView.d.ts +13 -0
  53. package/build/cjs/view/components/YfmHtml/YfmStaticView.js +10 -4
  54. package/build/cjs/view/components/YfmHtml/YfmStaticView.js.map +1 -1
  55. package/build/cjs/view/components/YfmHtml/index.d.ts +1 -1
  56. package/build/cjs/view/components/YfmHtml/index.js.map +1 -1
  57. package/build/esm/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
  58. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
  59. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +12 -10
  60. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  61. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  62. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
  63. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  64. package/build/esm/extensions/additional/Mermaid/index.d.ts +4 -0
  65. package/build/esm/extensions/additional/Mermaid/index.js +4 -4
  66. package/build/esm/extensions/additional/Mermaid/index.js.map +1 -1
  67. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +12 -9
  68. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  69. package/build/esm/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
  70. package/build/esm/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  71. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
  72. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  73. package/build/esm/extensions/yfm/YfmConfigs/index.d.ts +5 -1
  74. package/build/esm/extensions/yfm/YfmConfigs/index.js +7 -1
  75. package/build/esm/extensions/yfm/YfmConfigs/index.js.map +1 -1
  76. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
  77. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  78. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
  79. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  80. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
  81. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
  82. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
  83. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
  84. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
  85. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
  86. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +173 -0
  87. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
  88. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
  89. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
  90. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +41 -26
  91. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  92. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
  93. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  94. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
  95. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
  96. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
  97. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
  98. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +46 -0
  99. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
  100. package/build/esm/react-utils/hooks/useAutoSave.d.ts +23 -0
  101. package/build/esm/react-utils/hooks/useAutoSave.js +55 -0
  102. package/build/esm/react-utils/hooks/useAutoSave.js.map +1 -0
  103. package/build/esm/react-utils/hooks.d.ts +1 -1
  104. package/build/esm/react-utils/hooks.js +1 -0
  105. package/build/esm/react-utils/hooks.js.map +1 -1
  106. package/build/esm/version.js +1 -1
  107. package/build/esm/version.js.map +1 -1
  108. package/build/esm/view/components/YfmHtml/YfmStaticView.d.ts +13 -0
  109. package/build/esm/view/components/YfmHtml/YfmStaticView.js +9 -3
  110. package/build/esm/view/components/YfmHtml/YfmStaticView.js.map +1 -1
  111. package/build/esm/view/components/YfmHtml/index.d.ts +1 -1
  112. package/build/esm/view/components/YfmHtml/index.js.map +1 -1
  113. package/build/styles.css +83 -15
  114. package/package.json +1 -1
@@ -57,6 +57,7 @@ const FloatingMenuControl = function YfmTableFloatingMenuControl({ type, multipl
57
57
  ]);
58
58
  return ((0, jsx_runtime_1.jsx)(FloatingMenu_1.FloatingMenu, { dirtype: type, canDrag: dndHandler ? dndHandler.canDrag() : false, onOpenToggle: onMenuOpenToggle, anchorElement: acnhorElement, switcherMouseProps: dndHandler
59
59
  ? {
60
+ onMouseLeave: dndHandler.control_handleMouseLeave,
60
61
  onMouseDown: dndHandler.control_handleMouseDown,
61
62
  onMouseMove: dndHandler.control_handleMouseMove,
62
63
  onMouseUp: dndHandler.control_handleMouseUp,
@@ -1 +1 @@
1
- {"version":3,"file":"FloatingMenuControl.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx"],"names":[],"mappings":";;;;AAAA,iCAA8B;AAE9B,6CAQ2B;AAC3B,6CAAuC;AAEvC,4EAAwC;AAGxC,kEAAkF;AAe3E,MAAM,mBAAmB,GAC5B,SAAS,2BAA2B,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACrB;IACG,MAAM,aAAa,GAAG,IAAA,eAAO,EACzB,GAAG,EAAE,CACD;QACI;YACI;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,GAAG,IAAI,aAAa,CAAC;gBAChC,EAAE,EAAE,6BAA6B,IAAI,SAAS;gBAC9C,MAAM,EAAE,mBAAmB;gBAC3B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,eAAO,CAAC,CAAC,CAAC,iBAAS,GAAI;aAClE;YACD;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,GAAG,IAAI,YAAY,CAAC;gBAC/B,EAAE,EAAE,6BAA6B,IAAI,QAAQ;gBAC7C,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAS,CAAC,CAAC,CAAC,kBAAU,GAAI;aACrE;SACJ;QACD;YACI;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,aAAa,CAAC;gBACzB,EAAE,EAAE,kBAAkB,IAAI,cAAc;gBACxC,MAAM,EAAE,iBAAiB;gBACzB,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,mBAAU,GAAI;aACxC;SACJ;QACD;YACI;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,GAAG,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1D,EAAE,EAAE,gCAAgC,IAAI,EAAE;gBAC1C,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,aAAK,GAAI;aACnC;YACD;gBACI,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,IAAA,gBAAI,EAAC,cAAc,CAAC;gBAC1B,EAAE,EAAE,oCAAoC;gBACxC,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,gBAAQ,GAAI;aACtC;SACJ;KACyC,EAClD;QACI,IAAI;QACJ,QAAQ;QACR,iBAAiB;QACjB,kBAAkB;QAClB,mBAAmB;QACnB,kBAAkB;QAClB,kBAAkB;KACrB,CACJ,CAAC;IAEF,OAAO,CACH,uBAAC,2BAAY,IACT,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,EAClD,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EACd,UAAU;YACN,CAAC,CAAC;gBACI,WAAW,EAAE,UAAU,CAAC,uBAAuB;gBAC/C,WAAW,EAAE,UAAU,CAAC,uBAAuB;gBAC/C,SAAS,EAAE,UAAU,CAAC,qBAAqB;aAC9C;YACH,CAAC,CAAC,SAAS,EAEnB,aAAa,EAAE,aAAa,GAC9B,CACL,CAAC;AACN,CAAC,CAAC;AAnFO,QAAA,mBAAmB,uBAmF1B","sourcesContent":["import {useMemo} from 'react';\n\nimport {\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n BroomMotion as ClearCells,\n TrashBin,\n Xmark,\n} from '@gravity-ui/icons';\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {i18n} from 'src/i18n/yfm-table';\n\nimport type {DnDControlHandler} from '../../dnd/dnd';\nimport {FloatingMenu, type FloatingMenuProps} from '../FloatingMenu/FloatingMenu';\n\nexport type FloatingMenuControlProps = {\n acnhorElement: Element;\n multiple: boolean;\n type: FloatingMenuProps['dirtype'];\n dndHandler?: DnDControlHandler;\n onMenuOpenToggle: FloatingMenuProps['onOpenToggle'];\n onClearCellsClick: () => void;\n onInsertBeforeClick: () => void;\n onInsertAfterClick: () => void;\n onRemoveRangeClick: () => void;\n onRemoveTableClick: () => void;\n};\n\nexport const FloatingMenuControl: React.FC<FloatingMenuControlProps> =\n function YfmTableFloatingMenuControl({\n type,\n multiple,\n dndHandler,\n acnhorElement,\n onMenuOpenToggle,\n onClearCellsClick,\n onInsertBeforeClick,\n onInsertAfterClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n }) {\n const dropdownItems = useMemo<FloatingMenuProps['dropdownItems']>(\n () =>\n [\n [\n {\n text: i18n(`${type}.add.before`),\n qa: `g-md-yfm-table-action-add-${type}-before`,\n action: onInsertBeforeClick,\n iconStart: <Icon data={type === 'row' ? ArrowUp : ArrowLeft} />,\n },\n {\n text: i18n(`${type}.add.after`),\n qa: `g-md-yfm-table-action-add-${type}-after`,\n action: onInsertAfterClick,\n iconStart: <Icon data={type === 'row' ? ArrowDown : ArrowRight} />,\n },\n ],\n [\n {\n text: i18n('cells.clear'),\n qa: `g-md-yfm-table-${type}-clear-cells`,\n action: onClearCellsClick,\n iconStart: <Icon data={ClearCells} />,\n },\n ],\n [\n {\n text: i18n(`${type}.remove${multiple ? '.multiple' : ''}`),\n qa: `g-md-yfm-table-action-remove-${type}`,\n action: onRemoveRangeClick,\n iconStart: <Icon data={Xmark} />,\n },\n {\n theme: 'danger',\n text: i18n('table.remove'),\n qa: 'g-md-yfm-table-action-remove-table',\n action: onRemoveTableClick,\n iconStart: <Icon data={TrashBin} />,\n },\n ],\n ] satisfies FloatingMenuProps['dropdownItems'],\n [\n type,\n multiple,\n onClearCellsClick,\n onInsertAfterClick,\n onInsertBeforeClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n ],\n );\n\n return (\n <FloatingMenu\n dirtype={type}\n canDrag={dndHandler ? dndHandler.canDrag() : false}\n onOpenToggle={onMenuOpenToggle}\n anchorElement={acnhorElement}\n switcherMouseProps={\n dndHandler\n ? {\n onMouseDown: dndHandler.control_handleMouseDown,\n onMouseMove: dndHandler.control_handleMouseMove,\n onMouseUp: dndHandler.control_handleMouseUp,\n }\n : undefined\n }\n dropdownItems={dropdownItems}\n />\n );\n };\n"]}
1
+ {"version":3,"file":"FloatingMenuControl.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.tsx"],"names":[],"mappings":";;;;AAAA,iCAA8B;AAE9B,6CAQ2B;AAC3B,6CAAuC;AAEvC,4EAAwC;AAGxC,kEAAkF;AAe3E,MAAM,mBAAmB,GAC5B,SAAS,2BAA2B,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GACrB;IACG,MAAM,aAAa,GAAG,IAAA,eAAO,EACzB,GAAG,EAAE,CACD;QACI;YACI;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,GAAG,IAAI,aAAa,CAAC;gBAChC,EAAE,EAAE,6BAA6B,IAAI,SAAS;gBAC9C,MAAM,EAAE,mBAAmB;gBAC3B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,eAAO,CAAC,CAAC,CAAC,iBAAS,GAAI;aAClE;YACD;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,GAAG,IAAI,YAAY,CAAC;gBAC/B,EAAE,EAAE,6BAA6B,IAAI,QAAQ;gBAC7C,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAS,CAAC,CAAC,CAAC,kBAAU,GAAI;aACrE;SACJ;QACD;YACI;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,aAAa,CAAC;gBACzB,EAAE,EAAE,kBAAkB,IAAI,cAAc;gBACxC,MAAM,EAAE,iBAAiB;gBACzB,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,mBAAU,GAAI;aACxC;SACJ;QACD;YACI;gBACI,IAAI,EAAE,IAAA,gBAAI,EAAC,GAAG,IAAI,UAAU,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1D,EAAE,EAAE,gCAAgC,IAAI,EAAE;gBAC1C,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,aAAK,GAAI;aACnC;YACD;gBACI,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,IAAA,gBAAI,EAAC,cAAc,CAAC;gBAC1B,EAAE,EAAE,oCAAoC;gBACxC,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,uBAAC,YAAI,IAAC,IAAI,EAAE,gBAAQ,GAAI;aACtC;SACJ;KACyC,EAClD;QACI,IAAI;QACJ,QAAQ;QACR,iBAAiB;QACjB,kBAAkB;QAClB,mBAAmB;QACnB,kBAAkB;QAClB,kBAAkB;KACrB,CACJ,CAAC;IAEF,OAAO,CACH,uBAAC,2BAAY,IACT,OAAO,EAAE,IAAI,EACb,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,EAClD,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EACd,UAAU;YACN,CAAC,CAAC;gBACI,YAAY,EAAE,UAAU,CAAC,wBAAwB;gBACjD,WAAW,EAAE,UAAU,CAAC,uBAAuB;gBAC/C,WAAW,EAAE,UAAU,CAAC,uBAAuB;gBAC/C,SAAS,EAAE,UAAU,CAAC,qBAAqB;aAC9C;YACH,CAAC,CAAC,SAAS,EAEnB,aAAa,EAAE,aAAa,GAC9B,CACL,CAAC;AACN,CAAC,CAAC;AApFO,QAAA,mBAAmB,uBAoF1B","sourcesContent":["import {useMemo} from 'react';\n\nimport {\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n BroomMotion as ClearCells,\n TrashBin,\n Xmark,\n} from '@gravity-ui/icons';\nimport {Icon} from '@gravity-ui/uikit';\n\nimport {i18n} from 'src/i18n/yfm-table';\n\nimport type {DnDControlHandler} from '../../dnd/dnd';\nimport {FloatingMenu, type FloatingMenuProps} from '../FloatingMenu/FloatingMenu';\n\nexport type FloatingMenuControlProps = {\n acnhorElement: Element;\n multiple: boolean;\n type: FloatingMenuProps['dirtype'];\n dndHandler?: DnDControlHandler;\n onMenuOpenToggle: FloatingMenuProps['onOpenToggle'];\n onClearCellsClick: () => void;\n onInsertBeforeClick: () => void;\n onInsertAfterClick: () => void;\n onRemoveRangeClick: () => void;\n onRemoveTableClick: () => void;\n};\n\nexport const FloatingMenuControl: React.FC<FloatingMenuControlProps> =\n function YfmTableFloatingMenuControl({\n type,\n multiple,\n dndHandler,\n acnhorElement,\n onMenuOpenToggle,\n onClearCellsClick,\n onInsertBeforeClick,\n onInsertAfterClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n }) {\n const dropdownItems = useMemo<FloatingMenuProps['dropdownItems']>(\n () =>\n [\n [\n {\n text: i18n(`${type}.add.before`),\n qa: `g-md-yfm-table-action-add-${type}-before`,\n action: onInsertBeforeClick,\n iconStart: <Icon data={type === 'row' ? ArrowUp : ArrowLeft} />,\n },\n {\n text: i18n(`${type}.add.after`),\n qa: `g-md-yfm-table-action-add-${type}-after`,\n action: onInsertAfterClick,\n iconStart: <Icon data={type === 'row' ? ArrowDown : ArrowRight} />,\n },\n ],\n [\n {\n text: i18n('cells.clear'),\n qa: `g-md-yfm-table-${type}-clear-cells`,\n action: onClearCellsClick,\n iconStart: <Icon data={ClearCells} />,\n },\n ],\n [\n {\n text: i18n(`${type}.remove${multiple ? '.multiple' : ''}`),\n qa: `g-md-yfm-table-action-remove-${type}`,\n action: onRemoveRangeClick,\n iconStart: <Icon data={Xmark} />,\n },\n {\n theme: 'danger',\n text: i18n('table.remove'),\n qa: 'g-md-yfm-table-action-remove-table',\n action: onRemoveTableClick,\n iconStart: <Icon data={TrashBin} />,\n },\n ],\n ] satisfies FloatingMenuProps['dropdownItems'],\n [\n type,\n multiple,\n onClearCellsClick,\n onInsertAfterClick,\n onInsertBeforeClick,\n onRemoveRangeClick,\n onRemoveTableClick,\n ],\n );\n\n return (\n <FloatingMenu\n dirtype={type}\n canDrag={dndHandler ? dndHandler.canDrag() : false}\n onOpenToggle={onMenuOpenToggle}\n anchorElement={acnhorElement}\n switcherMouseProps={\n dndHandler\n ? {\n onMouseLeave: dndHandler.control_handleMouseLeave,\n onMouseDown: dndHandler.control_handleMouseDown,\n onMouseMove: dndHandler.control_handleMouseMove,\n onMouseUp: dndHandler.control_handleMouseUp,\n }\n : undefined\n }\n dropdownItems={dropdownItems}\n />\n );\n };\n"]}
@@ -14,13 +14,16 @@ const PlusButton = function YfmTablePlusButton({ qa, onClick, onHoverChange, })
14
14
  return ((0, jsx_runtime_1.jsx)(uikit_1.Flex, { centerContent: true, width: 20, height: 20, onMouseEnter: setHovered, onMouseLeave: unsetHovered, style: {
15
15
  borderRadius: '100px', // button circle border radius
16
16
  backgroundColor: hovered ? 'var(--g-color-base-background)' : undefined,
17
- }, children: (0, jsx_runtime_1.jsx)(uikit_1.Button, { qa: qa, size: "xs", pin: "circle-circle", view: hovered ? 'outlined-action' : 'normal', onClick: onClick, style: {
18
- '--g-button-height': hovered ? undefined : '4px',
19
- '--_--background-color-hover': hovered
20
- ? 'var(--g-color-base-background)'
21
- : undefined,
22
- color: hovered ? undefined : 'var(--g-color-base-generic)',
23
- }, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Plus }) }) }));
17
+ }, children: (0, jsx_runtime_1.jsx)(uikit_1.Button, { qa: qa, size: "xs", pin: "circle-circle", view: hovered ? 'outlined-action' : 'normal', onClick: onClick, style: hovered
18
+ ? {
19
+ '--g-button-background-color-hover': 'var(--g-color-base-background)',
20
+ }
21
+ : {
22
+ color: 'transparent',
23
+ '--g-button-height': '4px',
24
+ '--g-button-background-color': 'var(--g-color-line-generic-accent)',
25
+ '--g-button-border-color': 'var(--g-color-line-generic-accent)',
26
+ }, children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { data: icons_1.Plus }) }) }));
24
27
  };
25
28
  exports.PlusButton = PlusButton;
26
29
  //# sourceMappingURL=PlusButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlusButton.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.tsx"],"names":[],"mappings":";;;;AAAA,iCAAgC;AAEhC,6CAAmD;AACnD,6CAAmE;AAEnE,2EAAgD;AAOzC,MAAM,UAAU,GAA8B,SAAS,kBAAkB,CAAC,EAC7E,EAAE,EACF,OAAO,EACP,aAAa,GAChB;IACG,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,IAAA,6BAAe,EAAC,KAAK,CAAC,CAAC;IACnE,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7B,OAAO,CACH,uBAAC,YAAI,IACD,aAAa,QACb,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE;YACH,YAAY,EAAE,OAAO,EAAE,8BAA8B;YACrD,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,SAAS;SAC1E,YAED,uBAAC,cAAM,IACH,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,IAAI,EACT,GAAG,EAAC,eAAe,EACnB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAC5C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE;gBACH,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;gBAChD,6BAA6B,EAAE,OAAO;oBAClC,CAAC,CAAC,gCAAgC;oBAClC,CAAC,CAAC,SAAS;gBACf,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B;aAC7D,YAED,uBAAC,YAAI,IAAC,IAAI,EAAE,YAAQ,GAAI,GACnB,GACN,CACV,CAAC;AACN,CAAC,CAAC;AAxCW,QAAA,UAAU,cAwCrB","sourcesContent":["import {useEffect} from 'react';\n\nimport {Plus as PlusIcon} from '@gravity-ui/icons';\nimport {Button, Flex, Icon, type QAProps} from '@gravity-ui/uikit';\n\nimport {useBooleanState} from 'src/react-utils';\n\nexport type PlusButtonProps = QAProps & {\n onClick: () => void;\n onHoverChange: (hover: boolean) => void;\n};\n\nexport const PlusButton: React.FC<PlusButtonProps> = function YfmTablePlusButton({\n qa,\n onClick,\n onHoverChange,\n}) {\n const [hovered, setHovered, unsetHovered] = useBooleanState(false);\n useEffect(() => {\n onHoverChange(hovered);\n }, [hovered, onHoverChange]);\n\n return (\n <Flex\n centerContent\n width={20} // xs button\n height={20} // xs button\n onMouseEnter={setHovered}\n onMouseLeave={unsetHovered}\n style={{\n borderRadius: '100px', // button circle border radius\n backgroundColor: hovered ? 'var(--g-color-base-background)' : undefined,\n }}\n >\n <Button\n qa={qa}\n size=\"xs\"\n pin=\"circle-circle\"\n view={hovered ? 'outlined-action' : 'normal'}\n onClick={onClick}\n style={{\n '--g-button-height': hovered ? undefined : '4px',\n '--_--background-color-hover': hovered\n ? 'var(--g-color-base-background)'\n : undefined,\n color: hovered ? undefined : 'var(--g-color-base-generic)',\n }}\n >\n <Icon data={PlusIcon} />\n </Button>\n </Flex>\n );\n};\n"]}
1
+ {"version":3,"file":"PlusButton.js","sourceRoot":"../../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.tsx"],"names":[],"mappings":";;;;AAAA,iCAAgC;AAEhC,6CAAmD;AACnD,6CAAmE;AAEnE,2EAAgD;AAOzC,MAAM,UAAU,GAA8B,SAAS,kBAAkB,CAAC,EAC7E,EAAE,EACF,OAAO,EACP,aAAa,GAChB;IACG,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,IAAA,6BAAe,EAAC,KAAK,CAAC,CAAC;IACnE,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7B,OAAO,CACH,uBAAC,YAAI,IACD,aAAa,QACb,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE;YACH,YAAY,EAAE,OAAO,EAAE,8BAA8B;YACrD,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,SAAS;SAC1E,YAED,uBAAC,cAAM,IACH,EAAE,EAAE,EAAE,EACN,IAAI,EAAC,IAAI,EACT,GAAG,EAAC,eAAe,EACnB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAC5C,OAAO,EAAE,OAAO,EAChB,KAAK,EACD,OAAO;gBACH,CAAC,CAAC;oBACI,mCAAmC,EAAE,gCAAgC;iBACxE;gBACH,CAAC,CAAC;oBACI,KAAK,EAAE,aAAa;oBACpB,mBAAmB,EAAE,KAAK;oBAC1B,6BAA6B,EAAE,oCAAoC;oBACnE,yBAAyB,EAAE,oCAAoC;iBAClE,YAGX,uBAAC,YAAI,IAAC,IAAI,EAAE,YAAQ,GAAI,GACnB,GACN,CACV,CAAC;AACN,CAAC,CAAC;AA7CW,QAAA,UAAU,cA6CrB","sourcesContent":["import {useEffect} from 'react';\n\nimport {Plus as PlusIcon} from '@gravity-ui/icons';\nimport {Button, Flex, Icon, type QAProps} from '@gravity-ui/uikit';\n\nimport {useBooleanState} from 'src/react-utils';\n\nexport type PlusButtonProps = QAProps & {\n onClick: () => void;\n onHoverChange: (hover: boolean) => void;\n};\n\nexport const PlusButton: React.FC<PlusButtonProps> = function YfmTablePlusButton({\n qa,\n onClick,\n onHoverChange,\n}) {\n const [hovered, setHovered, unsetHovered] = useBooleanState(false);\n useEffect(() => {\n onHoverChange(hovered);\n }, [hovered, onHoverChange]);\n\n return (\n <Flex\n centerContent\n width={20} // xs button\n height={20} // xs button\n onMouseEnter={setHovered}\n onMouseLeave={unsetHovered}\n style={{\n borderRadius: '100px', // button circle border radius\n backgroundColor: hovered ? 'var(--g-color-base-background)' : undefined,\n }}\n >\n <Button\n qa={qa}\n size=\"xs\"\n pin=\"circle-circle\"\n view={hovered ? 'outlined-action' : 'normal'}\n onClick={onClick}\n style={\n hovered\n ? {\n '--g-button-background-color-hover': 'var(--g-color-base-background)',\n }\n : {\n color: 'transparent',\n '--g-button-height': '4px',\n '--g-button-background-color': 'var(--g-color-line-generic-accent)',\n '--g-button-border-color': 'var(--g-color-line-generic-accent)',\n }\n }\n >\n <Icon data={PlusIcon} />\n </Button>\n </Flex>\n );\n};\n"]}
@@ -6,8 +6,8 @@ export declare enum YfmTableDecorationType {
6
6
  ShowColumnControl = "cell--show-column-control",// to show the column control in the cell
7
7
  OpenRowMenu = "cell--open-row-menu",// sign of opening the row menu in the cell
8
8
  OpenColumnMenu = "cell--open-column-menu",// sign of opening the column menu in the cell
9
- ActivateRow = "row--active",
9
+ ActivateRowCells = "cell--active-row",
10
10
  ActivateColumnCells = "cell--active-column",
11
- ActivateDangerRow = "row--danger",
11
+ ActivateDangerRowCells = "cell--danger-row",
12
12
  ActivateDangerColumnCells = "cell--danger-column"
13
13
  }
@@ -10,9 +10,9 @@ var YfmTableDecorationType;
10
10
  YfmTableDecorationType["ShowColumnControl"] = "cell--show-column-control";
11
11
  YfmTableDecorationType["OpenRowMenu"] = "cell--open-row-menu";
12
12
  YfmTableDecorationType["OpenColumnMenu"] = "cell--open-column-menu";
13
- YfmTableDecorationType["ActivateRow"] = "row--active";
13
+ YfmTableDecorationType["ActivateRowCells"] = "cell--active-row";
14
14
  YfmTableDecorationType["ActivateColumnCells"] = "cell--active-column";
15
- YfmTableDecorationType["ActivateDangerRow"] = "row--danger";
15
+ YfmTableDecorationType["ActivateDangerRowCells"] = "cell--danger-row";
16
16
  YfmTableDecorationType["ActivateDangerColumnCells"] = "cell--danger-column";
17
17
  })(YfmTableDecorationType || (exports.YfmTableDecorationType = YfmTableDecorationType = {}));
18
18
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,yBAAyB,GAAG,uBAAuB,CAAC;AACpD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,IAAY,sBAcX;AAdD,WAAY,sBAAsB;IAC9B,qDAA2B,CAAA;IAE3B,mEAAyC,CAAA;IACzC,yEAA+C,CAAA;IAE/C,6DAAmC,CAAA;IACnC,mEAAyC,CAAA;IAEzC,qDAA2B,CAAA;IAC3B,qEAA2C,CAAA;IAE3C,2DAAiC,CAAA;IACjC,2EAAiD,CAAA;AACrD,CAAC,EAdW,sBAAsB,sCAAtB,sBAAsB,QAcjC","sourcesContent":["export const YfmTableDecorationTypeKey = '__yfm-table-deco-type';\nexport const YfmTableDecorationUniqKey = '__yfm-table-deco-uniq-key';\n\nexport enum YfmTableDecorationType {\n FocusTable = 'table--focus',\n\n ShowRowControl = 'cell--show-row-control', // to show the row control in the cell\n ShowColumnControl = 'cell--show-column-control', // to show the column control in the cell\n\n OpenRowMenu = 'cell--open-row-menu', // sign of opening the row menu in the cell\n OpenColumnMenu = 'cell--open-column-menu', // sign of opening the column menu in the cell\n\n ActivateRow = 'row--active',\n ActivateColumnCells = 'cell--active-column',\n\n ActivateDangerRow = 'row--danger',\n ActivateDangerColumnCells = 'cell--danger-column',\n}\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,yBAAyB,GAAG,uBAAuB,CAAC;AACpD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AAErE,IAAY,sBAcX;AAdD,WAAY,sBAAsB;IAC9B,qDAA2B,CAAA;IAE3B,mEAAyC,CAAA;IACzC,yEAA+C,CAAA;IAE/C,6DAAmC,CAAA;IACnC,mEAAyC,CAAA;IAEzC,+DAAqC,CAAA;IACrC,qEAA2C,CAAA;IAE3C,qEAA2C,CAAA;IAC3C,2EAAiD,CAAA;AACrD,CAAC,EAdW,sBAAsB,sCAAtB,sBAAsB,QAcjC","sourcesContent":["export const YfmTableDecorationTypeKey = '__yfm-table-deco-type';\nexport const YfmTableDecorationUniqKey = '__yfm-table-deco-uniq-key';\n\nexport enum YfmTableDecorationType {\n FocusTable = 'table--focus',\n\n ShowRowControl = 'cell--show-row-control', // to show the row control in the cell\n ShowColumnControl = 'cell--show-column-control', // to show the column control in the cell\n\n OpenRowMenu = 'cell--open-row-menu', // sign of opening the row menu in the cell\n OpenColumnMenu = 'cell--open-column-menu', // sign of opening the column menu in the cell\n\n ActivateRowCells = 'cell--active-row',\n ActivateColumnCells = 'cell--active-column',\n\n ActivateDangerRowCells = 'cell--danger-row',\n ActivateDangerColumnCells = 'cell--danger-column',\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { EditorView } from "../../../../../../pm/view.js";
2
+ import type { TableDescBinded } from "../../../../../../table-utils/table-desc.js";
3
+ type Event = Pick<MouseEvent, 'clientX' | 'clientY' | 'target'>;
4
+ export type YfmTableDnDGhostParams = {
5
+ initial: Event;
6
+ type: 'row' | 'column';
7
+ rangeIdx: number;
8
+ tableDesc: TableDescBinded;
9
+ };
10
+ export declare class YfmTableDnDGhost {
11
+ private _x;
12
+ private _y;
13
+ private readonly _dndBackgroundElem;
14
+ private readonly _ghostTable;
15
+ private readonly _ghostButton;
16
+ private readonly _tblShiftX;
17
+ private readonly _tblShiftY;
18
+ private readonly _btnShiftX;
19
+ private readonly _btnShiftY;
20
+ private _rafId;
21
+ constructor(view: EditorView, params: YfmTableDnDGhostParams);
22
+ move(event: Event): void;
23
+ destroy(): void;
24
+ private _startAnimation;
25
+ private _updatePositions;
26
+ private _buildRowGhost;
27
+ private _buildColumnGhost;
28
+ private _buildGhostButton;
29
+ private _buildGhostContainer;
30
+ }
31
+ export {};
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.YfmTableDnDGhost = void 0;
4
+ class YfmTableDnDGhost {
5
+ _x;
6
+ _y;
7
+ _dndBackgroundElem;
8
+ _ghostTable;
9
+ _ghostButton = null;
10
+ _tblShiftX;
11
+ _tblShiftY;
12
+ _btnShiftX = 0;
13
+ _btnShiftY = 0;
14
+ _rafId;
15
+ constructor(view, params) {
16
+ this._x = params.initial.clientX;
17
+ this._y = params.initial.clientY;
18
+ const document = view.dom.ownerDocument;
19
+ this._dndBackgroundElem = document.createElement('div');
20
+ this._dndBackgroundElem.classList.add('g-md-yfm-table-dnd-cursor-background');
21
+ {
22
+ const res = this._buildGhostButton(params);
23
+ if (res) {
24
+ this._ghostButton = res.domElement;
25
+ this._btnShiftX = res.shiftX;
26
+ this._btnShiftY = res.shiftY;
27
+ this._dndBackgroundElem.appendChild(this._ghostButton);
28
+ }
29
+ }
30
+ {
31
+ const { domElement, shiftX, shiftY } = params.type === 'row'
32
+ ? this._buildRowGhost(view, params)
33
+ : this._buildColumnGhost(view, params);
34
+ this._ghostTable = domElement;
35
+ this._tblShiftX = shiftX;
36
+ this._tblShiftY = shiftY;
37
+ this._dndBackgroundElem.appendChild(this._ghostTable);
38
+ }
39
+ this._updatePositions();
40
+ this._rafId = requestAnimationFrame(() => {
41
+ document.body.append(this._dndBackgroundElem);
42
+ this._startAnimation();
43
+ });
44
+ }
45
+ move(event) {
46
+ this._x = event.clientX;
47
+ this._y = event.clientY;
48
+ }
49
+ destroy() {
50
+ cancelAnimationFrame(this._rafId);
51
+ this._dndBackgroundElem.remove();
52
+ }
53
+ _startAnimation() {
54
+ const self = this;
55
+ let last = { x: self._x, y: self._y };
56
+ self._rafId = requestAnimationFrame(function update() {
57
+ if (self._x !== last.x || self._y !== last.y) {
58
+ last = { x: self._x, y: self._y };
59
+ self._updatePositions();
60
+ }
61
+ self._rafId = requestAnimationFrame(update);
62
+ });
63
+ }
64
+ _updatePositions() {
65
+ {
66
+ const tx = this._x + this._tblShiftX;
67
+ const ty = this._y + this._tblShiftY;
68
+ this._ghostTable.style.transform = `translate(${tx}px, ${ty}px)`;
69
+ }
70
+ if (this._ghostButton) {
71
+ const tx = this._x + this._btnShiftX;
72
+ const ty = this._y + this._btnShiftY;
73
+ this._ghostButton.style.transform = `translate(${tx}px, ${ty}px)`;
74
+ }
75
+ }
76
+ _buildRowGhost(view, { tableDesc, rangeIdx }) {
77
+ let shiftX = 0;
78
+ let shiftY = 0;
79
+ const document = view.dom.ownerDocument;
80
+ const container = this._buildGhostContainer(view);
81
+ const table = container.appendChild(document.createElement('table'));
82
+ const tbody = table.appendChild(document.createElement('tbody'));
83
+ {
84
+ const tablePos = tableDesc.pos;
85
+ const tableNode = view.domAtPos(tablePos + 1).node;
86
+ const rect = tableNode.getBoundingClientRect();
87
+ table.style.width = rect.width + 'px';
88
+ }
89
+ const range = tableDesc.base.getRowRanges()[rangeIdx];
90
+ for (let rowIdx = range.startIdx; rowIdx <= range.endIdx; rowIdx++) {
91
+ const tr = tbody.appendChild(document.createElement('tr'));
92
+ for (let colIdx = 0; colIdx < tableDesc.cols; colIdx++) {
93
+ const cellPos = tableDesc.getPosForCell(rowIdx, colIdx);
94
+ if (cellPos.type === 'real') {
95
+ const origNode = view.domAtPos(cellPos.from + 1).node;
96
+ const cloned = tr.appendChild(origNode.cloneNode(true));
97
+ const rect = origNode.getBoundingClientRect();
98
+ cloned.style.width = rect.width + 'px';
99
+ cloned.style.height = rect.height + 'px';
100
+ if (rowIdx === range.startIdx && colIdx === 0) {
101
+ shiftX = rect.left - this._x;
102
+ shiftY = rect.top - this._y;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ removeIdAttributes(table);
108
+ return { domElement: container, shiftX, shiftY };
109
+ }
110
+ _buildColumnGhost(view, { tableDesc, rangeIdx }) {
111
+ let shiftX = 0;
112
+ let shiftY = 0;
113
+ const document = view.dom.ownerDocument;
114
+ const container = this._buildGhostContainer(view);
115
+ {
116
+ const tablePos = tableDesc.pos;
117
+ const table = view.domAtPos(tablePos + 1).node;
118
+ const rect = table.getBoundingClientRect();
119
+ container.style.height = rect.height + 'px';
120
+ }
121
+ const table = container.appendChild(document.createElement('table'));
122
+ const tbody = table.appendChild(document.createElement('tbody'));
123
+ const range = tableDesc.base.getColumnRanges()[rangeIdx];
124
+ for (let rowIdx = 0; rowIdx < tableDesc.rows; rowIdx++) {
125
+ const tr = tbody.appendChild(document.createElement('tr'));
126
+ for (let colIdx = range.startIdx; colIdx <= range.endIdx; colIdx++) {
127
+ const cellPos = tableDesc.getPosForCell(rowIdx, colIdx);
128
+ if (cellPos.type === 'real') {
129
+ const origNode = view.domAtPos(cellPos.from + 1).node;
130
+ const cloned = tr.appendChild(origNode.cloneNode(true));
131
+ const rect = origNode.getBoundingClientRect();
132
+ cloned.style.width = rect.width + 'px';
133
+ cloned.style.height = rect.height + 'px';
134
+ if (rowIdx === 0 && colIdx === range.startIdx) {
135
+ container.style.minWidth = rect.width + 'px';
136
+ shiftX = rect.left - this._x;
137
+ shiftY = rect.top - this._y;
138
+ }
139
+ }
140
+ }
141
+ }
142
+ removeIdAttributes(table);
143
+ return { domElement: container, shiftX, shiftY };
144
+ }
145
+ _buildGhostButton({ initial: { target }, }) {
146
+ if (!(target instanceof Element))
147
+ return null;
148
+ const button = target.closest('.g-button');
149
+ if (!button)
150
+ return null;
151
+ const container = button.ownerDocument.createElement('div');
152
+ container.classList.add('g-md-yfm-table-dnd-ghost-button');
153
+ const rect = button.getBoundingClientRect();
154
+ const cloned = container.appendChild(button.cloneNode(true));
155
+ removeIdAttributes(cloned);
156
+ cloned.style.cursor = '';
157
+ cloned.style.pointerEvents = 'none';
158
+ return {
159
+ domElement: container,
160
+ shiftX: rect.left - this._x,
161
+ shiftY: rect.top - this._y,
162
+ };
163
+ }
164
+ _buildGhostContainer(view) {
165
+ const container = view.dom.ownerDocument.createElement('div');
166
+ container.setAttribute('aria-hidden', 'true');
167
+ const yfmClasses = Array.from(view.dom.classList).filter((val) => val.startsWith('yfm_'));
168
+ container.classList.add('g-md-yfm-table-dnd-ghost', 'yfm', ...yfmClasses);
169
+ return container;
170
+ }
171
+ }
172
+ exports.YfmTableDnDGhost = YfmTableDnDGhost;
173
+ function removeIdAttributes(elem) {
174
+ elem.removeAttribute('id');
175
+ elem.querySelectorAll('[id]').forEach((el) => el.removeAttribute('id'));
176
+ }
177
+ //# sourceMappingURL=dnd-ghost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dnd-ghost.js","sourceRoot":"../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from '#pm/view';\nimport type {TableDescBinded} from 'src/table-utils/table-desc';\n\ntype Event = Pick<MouseEvent, 'clientX' | 'clientY' | 'target'>;\n\ntype BuildGhostResult = {\n domElement: HTMLElement;\n shiftX: number;\n shiftY: number;\n};\n\nexport type YfmTableDnDGhostParams = {\n initial: Event;\n type: 'row' | 'column';\n rangeIdx: number;\n tableDesc: TableDescBinded;\n};\n\nexport class YfmTableDnDGhost {\n private _x: number;\n private _y: number;\n\n private readonly _dndBackgroundElem: HTMLElement;\n private readonly _ghostTable: HTMLElement;\n private readonly _ghostButton: HTMLElement | null = null;\n\n private readonly _tblShiftX: number;\n private readonly _tblShiftY: number;\n\n private readonly _btnShiftX: number = 0;\n private readonly _btnShiftY: number = 0;\n\n private _rafId: number;\n\n constructor(view: EditorView, params: YfmTableDnDGhostParams) {\n this._x = params.initial.clientX;\n this._y = params.initial.clientY;\n\n const document = view.dom.ownerDocument;\n\n this._dndBackgroundElem = document.createElement('div');\n this._dndBackgroundElem.classList.add('g-md-yfm-table-dnd-cursor-background');\n\n {\n const res = this._buildGhostButton(params);\n if (res) {\n this._ghostButton = res.domElement;\n this._btnShiftX = res.shiftX;\n this._btnShiftY = res.shiftY;\n this._dndBackgroundElem.appendChild(this._ghostButton);\n }\n }\n\n {\n const {domElement, shiftX, shiftY} =\n params.type === 'row'\n ? this._buildRowGhost(view, params)\n : this._buildColumnGhost(view, params);\n\n this._ghostTable = domElement;\n this._tblShiftX = shiftX;\n this._tblShiftY = shiftY;\n this._dndBackgroundElem.appendChild(this._ghostTable);\n }\n\n this._updatePositions();\n\n this._rafId = requestAnimationFrame(() => {\n document.body.append(this._dndBackgroundElem);\n this._startAnimation();\n });\n }\n\n move(event: Event) {\n this._x = event.clientX;\n this._y = event.clientY;\n }\n\n destroy() {\n cancelAnimationFrame(this._rafId);\n this._dndBackgroundElem.remove();\n }\n\n private _startAnimation() {\n const self = this;\n let last = {x: self._x, y: self._y};\n\n self._rafId = requestAnimationFrame(function update() {\n if (self._x !== last.x || self._y !== last.y) {\n last = {x: self._x, y: self._y};\n self._updatePositions();\n }\n self._rafId = requestAnimationFrame(update);\n });\n }\n\n private _updatePositions() {\n {\n const tx = this._x + this._tblShiftX;\n const ty = this._y + this._tblShiftY;\n this._ghostTable.style.transform = `translate(${tx}px, ${ty}px)`;\n }\n\n if (this._ghostButton) {\n const tx = this._x + this._btnShiftX;\n const ty = this._y + this._btnShiftY;\n this._ghostButton.style.transform = `translate(${tx}px, ${ty}px)`;\n }\n }\n\n private _buildRowGhost(\n view: EditorView,\n {tableDesc, rangeIdx}: YfmTableDnDGhostParams,\n ): BuildGhostResult {\n let shiftX = 0;\n let shiftY = 0;\n\n const document = view.dom.ownerDocument;\n const container = this._buildGhostContainer(view);\n\n const table = container.appendChild(document.createElement('table'));\n const tbody = table.appendChild(document.createElement('tbody'));\n\n {\n const tablePos = tableDesc.pos;\n const tableNode = view.domAtPos(tablePos + 1).node;\n const rect = (tableNode as Element).getBoundingClientRect();\n table.style.width = rect.width + 'px';\n }\n\n const range = tableDesc.base.getRowRanges()[rangeIdx];\n for (let rowIdx = range.startIdx; rowIdx <= range.endIdx; rowIdx++) {\n const tr = tbody.appendChild(document.createElement('tr'));\n\n for (let colIdx = 0; colIdx < tableDesc.cols; colIdx++) {\n const cellPos = tableDesc.getPosForCell(rowIdx, colIdx);\n if (cellPos.type === 'real') {\n const origNode = view.domAtPos(cellPos.from + 1).node as HTMLElement;\n const cloned = tr.appendChild(origNode.cloneNode(true));\n\n const rect = origNode.getBoundingClientRect();\n (cloned as HTMLElement).style.width = rect.width + 'px';\n (cloned as HTMLElement).style.height = rect.height + 'px';\n\n if (rowIdx === range.startIdx && colIdx === 0) {\n shiftX = rect.left - this._x;\n shiftY = rect.top - this._y;\n }\n }\n }\n }\n\n removeIdAttributes(table);\n\n return {domElement: container, shiftX, shiftY};\n }\n\n private _buildColumnGhost(\n view: EditorView,\n {tableDesc, rangeIdx}: YfmTableDnDGhostParams,\n ): BuildGhostResult {\n let shiftX = 0;\n let shiftY = 0;\n\n const document = view.dom.ownerDocument;\n const container = this._buildGhostContainer(view);\n\n {\n const tablePos = tableDesc.pos;\n const table = view.domAtPos(tablePos + 1).node;\n const rect = (table as Element).getBoundingClientRect();\n container.style.height = rect.height + 'px';\n }\n\n const table = container.appendChild(document.createElement('table'));\n const tbody = table.appendChild(document.createElement('tbody'));\n\n const range = tableDesc.base.getColumnRanges()[rangeIdx];\n for (let rowIdx = 0; rowIdx < tableDesc.rows; rowIdx++) {\n const tr = tbody.appendChild(document.createElement('tr'));\n\n for (let colIdx = range.startIdx; colIdx <= range.endIdx; colIdx++) {\n const cellPos = tableDesc.getPosForCell(rowIdx, colIdx);\n if (cellPos.type === 'real') {\n const origNode = view.domAtPos(cellPos.from + 1).node as HTMLElement;\n const cloned = tr.appendChild(origNode.cloneNode(true));\n\n const rect = origNode.getBoundingClientRect();\n (cloned as HTMLElement).style.width = rect.width + 'px';\n (cloned as HTMLElement).style.height = rect.height + 'px';\n\n if (rowIdx === 0 && colIdx === range.startIdx) {\n container.style.minWidth = rect.width + 'px';\n\n shiftX = rect.left - this._x;\n shiftY = rect.top - this._y;\n }\n }\n }\n }\n\n removeIdAttributes(table);\n\n return {domElement: container, shiftX, shiftY};\n }\n\n private _buildGhostButton({\n initial: {target},\n }: YfmTableDnDGhostParams): BuildGhostResult | null {\n if (!(target instanceof Element)) return null;\n\n const button = target.closest('.g-button');\n if (!button) return null;\n\n const container = button.ownerDocument.createElement('div');\n container.classList.add('g-md-yfm-table-dnd-ghost-button');\n\n const rect = button.getBoundingClientRect();\n const cloned = container.appendChild(button.cloneNode(true) as HTMLElement);\n\n removeIdAttributes(cloned);\n cloned.style.cursor = '';\n cloned.style.pointerEvents = 'none';\n\n return {\n domElement: container,\n shiftX: rect.left - this._x,\n shiftY: rect.top - this._y,\n };\n }\n\n private _buildGhostContainer(view: EditorView): HTMLElement {\n const container = view.dom.ownerDocument.createElement('div');\n container.setAttribute('aria-hidden', 'true');\n\n const yfmClasses = Array.from(view.dom.classList).filter((val) => val.startsWith('yfm_'));\n container.classList.add('g-md-yfm-table-dnd-ghost', 'yfm', ...yfmClasses);\n\n return container;\n }\n}\n\nfunction removeIdAttributes(elem: HTMLElement) {\n elem.removeAttribute('id');\n elem.querySelectorAll('[id]').forEach((el) => el.removeAttribute('id'));\n}\n"]}
@@ -7,13 +7,78 @@
7
7
  background: transparent;
8
8
  }
9
9
 
10
- .yfm.ProseMirror .g-md-yfm-table-dnd-dragged-row,
11
- .yfm.ProseMirror .g-md-yfm-table-dnd-dragged-column-cell {
12
- opacity: 0.3;
13
- background-color: var(--g-color-base-selection);
10
+ .yfm.g-md-yfm-table-dnd-ghost,
11
+ .g-md-yfm-table-dnd-ghost-button {
12
+ position: fixed;
13
+ cursor: grabbing;
14
+ pointer-events: none;
15
+ transition: none;
16
+ will-change: transform;
17
+ }
18
+
19
+ .yfm.g-md-yfm-table-dnd-ghost > table {
20
+ border-color: var(--g-color-line-brand);
21
+ box-shadow: 0 8px 20px 1px var(--g-color-sfx-shadow);
22
+ }
23
+ .yfm.g-md-yfm-table-dnd-ghost > table > tbody > tr > td {
24
+ border-color: var(--g-color-line-brand);
25
+ }
26
+
27
+ .g-md-yfm-table-dnd-ghost-button {
28
+ --g-button-background-color-hover: var(--g-color-base-background);
29
+ --g-button-background-color: var(--g-color-base-background);
30
+ --g-button-border-color: var(--g-color-line-brand);
31
+ --g-button-text-color: var(--g-color-text-brand);
32
+ z-index: 2;
14
33
  }
15
34
 
16
- .yfm.ProseMirror .g-md-yfm-table-active-row,
17
- .yfm.ProseMirror .g-md-yfm-table-active-column-cell {
35
+ .yfm.ProseMirror table td {
36
+ position: relative;
37
+ }
38
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell {
39
+ overflow: unset;
40
+ border-color: var(--g-color-line-brand);
18
41
  background-color: var(--g-color-base-selection);
42
+ }
43
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell::after {
44
+ position: absolute;
45
+ z-index: 2;
46
+ inset: -1px;
47
+ display: inline-block;
48
+ content: "";
49
+ pointer-events: none;
50
+ border: 1px solid var(--g-color-line-brand);
51
+ }
52
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_first-row::after {
53
+ top: 0;
54
+ }
55
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_last-row::after {
56
+ bottom: 0;
57
+ }
58
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_first-column::after {
59
+ left: 0;
60
+ }
61
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_last-column::after {
62
+ right: 0;
63
+ }
64
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_first-row.g-md-yfm-table-selected-cell_first-column::after {
65
+ border-top-left-radius: 8px;
66
+ }
67
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_first-row.g-md-yfm-table-selected-cell_last-column::after {
68
+ border-top-right-radius: 8px;
69
+ }
70
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_last-row.g-md-yfm-table-selected-cell_first-column::after {
71
+ border-bottom-left-radius: 8px;
72
+ }
73
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell_last-row.g-md-yfm-table-selected-cell_last-column::after {
74
+ border-bottom-right-radius: 8px;
75
+ }
76
+ .yfm.ProseMirror table td.g-md-yfm-table-selected-cell.dragged-cell::before {
77
+ position: absolute;
78
+ inset: 0;
79
+ display: inline-block;
80
+ content: "";
81
+ pointer-events: none;
82
+ opacity: 0.7;
83
+ background-color: var(--g-color-base-background);
19
84
  }
@@ -8,6 +8,7 @@ export type DnDControlHandler = {
8
8
  control_handleMouseDown: React.MouseEventHandler<HTMLButtonElement>;
9
9
  control_handleMouseMove: React.MouseEventHandler<HTMLButtonElement>;
10
10
  control_handleMouseUp: React.MouseEventHandler<HTMLButtonElement>;
11
+ control_handleMouseLeave: React.MouseEventHandler<HTMLButtonElement>;
11
12
  };
12
13
  interface TableHandler {
13
14
  update(node: Node): void;
@@ -10,7 +10,9 @@ const table_desc_1 = require("../../../../../../table-utils/table-desc.js");
10
10
  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
+ const utils_2 = require("../utils.js");
13
14
  const dnd_drop_cursor_1 = require("./dnd-drop-cursor.js");
15
+ const dnd_ghost_1 = require("./dnd-ghost.js");
14
16
  require("./dnd.css");
15
17
  const MOUSE_MOVE_DEBOUNCE = 100; // ms
16
18
  const DRAG_START_THRESHOLD = 4; // px
@@ -58,7 +60,7 @@ class YfmTableDnDAbstractHandler {
58
60
  }
59
61
  destroy() {
60
62
  this.__destroyed = true;
61
- this._clearDragging();
63
+ this._clearDragging(false);
62
64
  }
63
65
  control_handleMouseDown = (event) => {
64
66
  this.__dragMouseDown = { pageX: event.pageX, pageY: event.pageY };
@@ -67,12 +69,15 @@ class YfmTableDnDAbstractHandler {
67
69
  control_handleMouseUp = () => {
68
70
  this.__dragMouseDown = false;
69
71
  };
72
+ control_handleMouseLeave = () => {
73
+ this.__dragMouseDown = false;
74
+ };
70
75
  control_handleMouseMove = (event) => {
71
76
  if (!this._dragMouseDown || !isDragThresholdPassed(this._dragMouseDown, event))
72
77
  return;
73
78
  if (this._editorView.dragging || this._dragging)
74
79
  return;
75
- this._startDragging();
80
+ this._startDragging(event);
76
81
  };
77
82
  get _cellNode() {
78
83
  return this.__cellNode;
@@ -105,12 +110,13 @@ class YfmTableDnDAbstractHandler {
105
110
  }
106
111
  : null;
107
112
  }
108
- _clearDragging() {
113
+ _clearDragging(clearDecorations) {
109
114
  this.__dragging = false;
110
115
  this.__dragMouseDown = false;
111
116
  this._dropCursor.clear();
112
117
  this._editorView.dragging = null;
113
- this._editorView.dispatch((0, dnd_plugin_1.clearAllSelections)(this._editorView.state.tr));
118
+ if (clearDecorations !== false)
119
+ this._editorView.dispatch((0, dnd_plugin_1.clearAllSelections)(this._editorView.state.tr));
114
120
  }
115
121
  }
116
122
  class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {
@@ -128,7 +134,7 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {
128
134
  const rowRange = res.tableDesc.base.getRowRangeByRowIdx(res.cellInfo.row);
129
135
  return rowRange.safeTopBoundary && rowRange.safeBottomBoundary;
130
136
  }
131
- _startDragging = () => {
137
+ _startDragging = (event) => {
132
138
  const info = this._getTableDescAndCellInfo();
133
139
  if (!info)
134
140
  return;
@@ -142,7 +148,7 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {
142
148
  {
143
149
  const { tr } = this._editorView.state;
144
150
  (0, focus_plugin_1.hideHoverDecos)(tr);
145
- (0, dnd_plugin_1.selectDraggedRow)(tr, (0, lodash_1.range)(currRowRange.startIdx, currRowRange.endIdx + 1).map((rowIdx) => tableDesc.getPosForRow(rowIdx)));
151
+ (0, dnd_plugin_1.selectDraggedRow)(tr, (0, utils_2.getSelectedCellsForRows)(info.tableDesc, currRowRange));
146
152
  this._editorView.dispatch(tr);
147
153
  }
148
154
  {
@@ -153,20 +159,27 @@ class YfmTableRowDnDHandler extends YfmTableDnDAbstractHandler {
153
159
  slice: this._editorView.state.doc.slice(from, to, false),
154
160
  };
155
161
  }
156
- const dndBackground = document.createElement('div');
157
- dndBackground.classList.add('g-md-yfm-table-dnd-cursor-background');
158
- document.body.append(dndBackground);
159
162
  const draggedRangeIdx = rowRanges.indexOf(currRowRange);
160
- const onMove = (0, lodash_1.debounce)((event) => {
163
+ const ghost = new dnd_ghost_1.YfmTableDnDGhost(this._editorView, {
164
+ type: 'row',
165
+ initial: event,
166
+ rangeIdx: draggedRangeIdx,
167
+ tableDesc,
168
+ });
169
+ const onMoveDebounced = (0, lodash_1.debounce)((event) => {
161
170
  this._moveDragging(event, {
162
171
  rangeIdx: draggedRangeIdx,
163
172
  tableDesc,
164
173
  });
165
174
  }, MOUSE_MOVE_DEBOUNCE, { maxWait: MOUSE_MOVE_DEBOUNCE });
175
+ const onMove = (event) => {
176
+ ghost.move(event);
177
+ onMoveDebounced(event);
178
+ };
166
179
  document.addEventListener('mousemove', onMove);
167
180
  document.addEventListener('mouseup', () => {
168
- onMove.flush();
169
- dndBackground.remove();
181
+ onMoveDebounced.flush();
182
+ ghost.destroy();
170
183
  document.removeEventListener('mousemove', onMove);
171
184
  this._endDragging(currRowRange, tableDesc);
172
185
  }, { once: true });
@@ -284,7 +297,7 @@ class YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {
284
297
  const rowRange = res.tableDesc.base.getColumnRangeByColumnIdx(res.cellInfo.column);
285
298
  return rowRange.safeLeftBoundary && rowRange.safeRightBoundary;
286
299
  }
287
- _startDragging() {
300
+ _startDragging(event) {
288
301
  const info = this._getTableDescAndCellInfo();
289
302
  if (!info)
290
303
  return;
@@ -296,14 +309,9 @@ class YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {
296
309
  this._dragging = true;
297
310
  this._logger.event({ event: 'column-drag-start' });
298
311
  {
299
- const columnCellsPos = [];
300
- for (const i of (0, lodash_1.range)(currColumnRange.startIdx, currColumnRange.endIdx + 1)) {
301
- columnCellsPos.push(...tableDesc.getPosForColumn(i));
302
- }
303
- const realPos = columnCellsPos.filter((cell) => cell.type === 'real');
304
312
  const { tr } = this._editorView.state;
305
313
  (0, focus_plugin_1.hideHoverDecos)(tr);
306
- (0, dnd_plugin_1.selectDraggedColumn)(tr, realPos);
314
+ (0, dnd_plugin_1.selectDraggedColumn)(tr, (0, utils_2.getSelectedCellsForColumns)(tableDesc, currColumnRange));
307
315
  this._editorView.dispatch(tr);
308
316
  }
309
317
  {
@@ -312,20 +320,27 @@ class YfmTableColumnDnDHandler extends YfmTableDnDAbstractHandler {
312
320
  slice: model_1.Slice.empty,
313
321
  };
314
322
  }
315
- const dndBackground = document.createElement('div');
316
- dndBackground.classList.add('g-md-yfm-table-dnd-cursor-background');
317
- document.body.append(dndBackground);
318
323
  const draggedRangeIdx = columnRanges.indexOf(currColumnRange);
319
- const onMove = (0, lodash_1.debounce)((event) => {
324
+ const ghost = new dnd_ghost_1.YfmTableDnDGhost(this._editorView, {
325
+ type: 'column',
326
+ initial: event,
327
+ rangeIdx: draggedRangeIdx,
328
+ tableDesc,
329
+ });
330
+ const onMoveDebounced = (0, lodash_1.debounce)((event) => {
320
331
  this._moveDragging(event, {
321
332
  rangeIdx: draggedRangeIdx,
322
333
  tableDesc,
323
334
  });
324
335
  }, MOUSE_MOVE_DEBOUNCE, { maxWait: MOUSE_MOVE_DEBOUNCE });
336
+ const onMove = (event) => {
337
+ ghost.move(event);
338
+ onMoveDebounced(event);
339
+ };
325
340
  document.addEventListener('mousemove', onMove);
326
341
  document.addEventListener('mouseup', () => {
327
- onMove.flush();
328
- dndBackground.remove();
342
+ onMoveDebounced.flush();
343
+ ghost.destroy();
329
344
  document.removeEventListener('mousemove', onMove);
330
345
  this._endDragging(currColumnRange, tableDesc);
331
346
  }, { once: true });