@gravity-ui/markdown-editor 15.21.0 → 15.22.1

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 (132) hide show
  1. package/build/cjs/bundle/ToolbarView.js +2 -1
  2. package/build/cjs/bundle/ToolbarView.js.map +1 -1
  3. package/build/cjs/bundle/settings/index.js +4 -1
  4. package/build/cjs/bundle/settings/index.js.map +1 -1
  5. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +3 -1
  6. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  7. package/build/cjs/common/layout.d.ts +3 -0
  8. package/build/cjs/common/layout.js +7 -0
  9. package/build/cjs/common/layout.js.map +1 -0
  10. package/build/cjs/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
  11. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
  12. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +11 -9
  13. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  14. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  15. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
  16. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  17. package/build/cjs/extensions/additional/Mermaid/index.d.ts +4 -0
  18. package/build/cjs/extensions/additional/Mermaid/index.js +4 -4
  19. package/build/cjs/extensions/additional/Mermaid/index.js.map +1 -1
  20. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +11 -8
  21. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  22. package/build/cjs/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
  23. package/build/cjs/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  24. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
  25. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  26. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
  27. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  28. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
  29. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  30. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
  31. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
  32. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
  33. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
  34. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
  35. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
  36. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +177 -0
  37. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
  38. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
  39. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
  40. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +36 -22
  41. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  42. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
  43. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  44. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
  45. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
  46. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
  47. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
  48. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +50 -0
  49. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
  50. package/build/cjs/i18n/common/en.json +2 -1
  51. package/build/cjs/i18n/common/index.d.ts +2 -1
  52. package/build/cjs/i18n/common/ru.json +2 -1
  53. package/build/cjs/react-utils/hooks/useAutoSave.d.ts +23 -0
  54. package/build/cjs/react-utils/hooks/useAutoSave.js +59 -0
  55. package/build/cjs/react-utils/hooks/useAutoSave.js.map +1 -0
  56. package/build/cjs/react-utils/hooks.d.ts +1 -1
  57. package/build/cjs/react-utils/hooks.js +3 -1
  58. package/build/cjs/react-utils/hooks.js.map +1 -1
  59. package/build/cjs/toolbar/ToolbarListButton.js +3 -1
  60. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  61. package/build/cjs/utils/get-target-z-index.d.ts +1 -0
  62. package/build/cjs/utils/get-target-z-index.js +13 -0
  63. package/build/cjs/utils/get-target-z-index.js.map +1 -0
  64. package/build/cjs/version.js +1 -1
  65. package/build/cjs/version.js.map +1 -1
  66. package/build/esm/bundle/ToolbarView.js +2 -1
  67. package/build/esm/bundle/ToolbarView.js.map +1 -1
  68. package/build/esm/bundle/settings/index.js +4 -1
  69. package/build/esm/bundle/settings/index.js.map +1 -1
  70. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +3 -1
  71. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  72. package/build/esm/common/layout.d.ts +3 -0
  73. package/build/esm/common/layout.js +4 -0
  74. package/build/esm/common/layout.js.map +1 -0
  75. package/build/esm/extensions/additional/FoldingHeading/plugins/folding.css +12 -9
  76. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.d.ts +2 -0
  77. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +12 -10
  78. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  79. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  80. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +3 -1
  81. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  82. package/build/esm/extensions/additional/Mermaid/index.d.ts +4 -0
  83. package/build/esm/extensions/additional/Mermaid/index.js +4 -4
  84. package/build/esm/extensions/additional/Mermaid/index.js.map +1 -1
  85. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +12 -9
  86. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  87. package/build/esm/extensions/additional/YfmHtmlBlock/index.d.ts +4 -0
  88. package/build/esm/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  89. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -1
  90. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  91. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.d.ts +1 -1
  92. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenu/FloatingMenu.js.map +1 -1
  93. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js +1 -0
  94. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  95. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js +10 -7
  96. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/PlusButton.js.map +1 -1
  97. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.d.ts +2 -2
  98. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js +2 -2
  99. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/const.js.map +1 -1
  100. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.d.ts +31 -0
  101. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js +173 -0
  102. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd-ghost.js.map +1 -0
  103. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.css +71 -6
  104. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.d.ts +1 -0
  105. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js +37 -23
  106. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/dnd/dnd.js.map +1 -1
  107. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js +4 -7
  108. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/nodeviews/yfm-table-cell-view.js.map +1 -1
  109. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.d.ts +13 -4
  110. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js +11 -9
  111. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.js.map +1 -1
  112. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.d.ts +4 -0
  113. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js +46 -0
  114. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/utils.js.map +1 -0
  115. package/build/esm/i18n/common/en.json +2 -1
  116. package/build/esm/i18n/common/index.d.ts +2 -1
  117. package/build/esm/i18n/common/ru.json +2 -1
  118. package/build/esm/react-utils/hooks/useAutoSave.d.ts +23 -0
  119. package/build/esm/react-utils/hooks/useAutoSave.js +55 -0
  120. package/build/esm/react-utils/hooks/useAutoSave.js.map +1 -0
  121. package/build/esm/react-utils/hooks.d.ts +1 -1
  122. package/build/esm/react-utils/hooks.js +1 -0
  123. package/build/esm/react-utils/hooks.js.map +1 -1
  124. package/build/esm/toolbar/ToolbarListButton.js +3 -1
  125. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  126. package/build/esm/utils/get-target-z-index.d.ts +1 -0
  127. package/build/esm/utils/get-target-z-index.js +10 -0
  128. package/build/esm/utils/get-target-z-index.js.map +1 -0
  129. package/build/esm/version.js +1 -1
  130. package/build/esm/version.js.map +1 -1
  131. package/build/styles.css +83 -15
  132. package/package.json +1 -1
@@ -4,20 +4,29 @@ type FromTo = {
4
4
  from: number;
5
5
  to: number;
6
6
  };
7
+ type CellMods = {
8
+ 'first-row'?: boolean;
9
+ 'last-row'?: boolean;
10
+ 'first-column'?: boolean;
11
+ 'last-column'?: boolean;
12
+ };
13
+ export type SelectedCellPos = FromTo & {
14
+ mods: CellMods;
15
+ };
7
16
  export declare function activateRows(tr: Transaction, params: {
8
17
  controlCell: FromTo;
9
- rows: FromTo[];
18
+ cells: SelectedCellPos[];
10
19
  uniqKey: number;
11
20
  }): Transaction;
12
21
  export declare function deactivateRow(tr: Transaction, uniqKey: number): Transaction;
13
22
  export declare function activateColumns(tr: Transaction, params: {
14
23
  controlCell: FromTo;
15
- cells: FromTo[];
24
+ cells: SelectedCellPos[];
16
25
  uniqKey: number;
17
26
  }): Transaction;
18
27
  export declare function deactivateColumn(tr: Transaction, uniqKey: number): Transaction;
19
- export declare function selectDraggedRow(tr: Transaction, rows: FromTo[]): Transaction;
20
- export declare function selectDraggedColumn(tr: Transaction, cells: FromTo[]): Transaction;
28
+ export declare function selectDraggedRow(tr: Transaction, cells: SelectedCellPos[]): Transaction;
29
+ export declare function selectDraggedColumn(tr: Transaction, cells: SelectedCellPos[]): Transaction;
21
30
  export declare function clearAllSelections(tr: Transaction): Transaction;
22
31
  export declare const yfmTableDndPlugin: () => Plugin<DecorationSet>;
23
32
  export {};
@@ -10,7 +10,9 @@ exports.selectDraggedColumn = selectDraggedColumn;
10
10
  exports.clearAllSelections = clearAllSelections;
11
11
  const state_1 = require("../../../../../../pm/state.js");
12
12
  const view_1 = require("../../../../../../pm/view.js");
13
+ const classname_1 = require("../../../../../../classname.js");
13
14
  const const_1 = require("../const.js");
15
+ const b = (0, classname_1.cn)('yfm-table-selected-cell');
14
16
  const key = new state_1.PluginKey('yfm-table-dnd-decos');
15
17
  function activateRows(tr, params) {
16
18
  const meta = { action: 'row-control-active', ...params };
@@ -32,8 +34,8 @@ function deactivateColumn(tr, uniqKey) {
32
34
  tr.setMeta(key, meta);
33
35
  return tr;
34
36
  }
35
- function selectDraggedRow(tr, rows) {
36
- const meta = { action: 'drag-rows', rows };
37
+ function selectDraggedRow(tr, cells) {
38
+ const meta = { action: 'drag-rows', cells };
37
39
  tr.setMeta(key, meta);
38
40
  return tr;
39
41
  }
@@ -60,15 +62,15 @@ const yfmTableDndPlugin = () => {
60
62
  return view_1.DecorationSet.empty;
61
63
  }
62
64
  if (meta?.action === 'row-control-active') {
63
- const { controlCell, rows, uniqKey } = meta;
65
+ const { controlCell, cells, uniqKey } = meta;
64
66
  return view_1.DecorationSet.create(tr.doc, [
65
67
  view_1.Decoration.node(controlCell.from, controlCell.to, {}, {
66
68
  [const_1.YfmTableDecorationUniqKey]: uniqKey,
67
69
  [const_1.YfmTableDecorationTypeKey]: const_1.YfmTableDecorationType.OpenRowMenu,
68
70
  }),
69
- ...rows.map((row) => view_1.Decoration.node(row.from, row.to, { class: 'g-md-yfm-table-active-row' }, {
71
+ ...cells.map((cell) => view_1.Decoration.node(cell.from, cell.to, { class: b(cell.mods) }, {
70
72
  [const_1.YfmTableDecorationUniqKey]: uniqKey,
71
- [const_1.YfmTableDecorationTypeKey]: const_1.YfmTableDecorationType.ActivateRow,
73
+ [const_1.YfmTableDecorationTypeKey]: const_1.YfmTableDecorationType.ActivateRowCells,
72
74
  })),
73
75
  ]);
74
76
  }
@@ -84,7 +86,7 @@ const yfmTableDndPlugin = () => {
84
86
  [const_1.YfmTableDecorationUniqKey]: uniqKey,
85
87
  [const_1.YfmTableDecorationTypeKey]: const_1.YfmTableDecorationType.OpenColumnMenu,
86
88
  }),
87
- ...cells.map((pos) => view_1.Decoration.node(pos.from, pos.to, { class: 'g-md-yfm-table-active-column-cell' }, {
89
+ ...cells.map((pos) => view_1.Decoration.node(pos.from, pos.to, { class: b(pos.mods) }, {
88
90
  [const_1.YfmTableDecorationUniqKey]: uniqKey,
89
91
  [const_1.YfmTableDecorationTypeKey]: const_1.YfmTableDecorationType.ActivateColumnCells,
90
92
  })),
@@ -96,13 +98,13 @@ const yfmTableDndPlugin = () => {
96
98
  return value.remove(decos).map(tr.mapping, tr.doc);
97
99
  }
98
100
  if (meta?.action === 'drag-rows') {
99
- return view_1.DecorationSet.create(tr.doc, meta.rows.map((row) => view_1.Decoration.node(row.from, row.to, {
100
- class: 'g-md-yfm-table-dnd-dragged-row',
101
+ return view_1.DecorationSet.create(tr.doc, meta.cells.map((cell) => view_1.Decoration.node(cell.from, cell.to, {
102
+ class: b(cell.mods, 'dragged-cell'),
101
103
  })));
102
104
  }
103
105
  if (meta?.action === 'drag-columns') {
104
106
  return view_1.DecorationSet.create(tr.doc, meta.cells.map((cell) => view_1.Decoration.node(cell.from, cell.to, {
105
- class: 'g-md-yfm-table-dnd-dragged-column-cell',
107
+ class: b(cell.mods, 'dragged-cell'),
106
108
  })));
107
109
  }
108
110
  return value.map(tr.mapping, tr.doc);
@@ -1 +1 @@
1
- {"version":3,"file":"dnd-plugin.js","sourceRoot":"../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Plugin, PluginKey, type Transaction} from '#pm/state';\nimport {Decoration, DecorationSet} from '#pm/view';\n\nimport {\n YfmTableDecorationType,\n YfmTableDecorationTypeKey,\n YfmTableDecorationUniqKey,\n} from '../const';\n\ntype FromTo = {\n from: number;\n to: number;\n};\n\ntype DndMeta =\n | {action: 'row-control-active'; controlCell: FromTo; rows: FromTo[]; uniqKey: number}\n | {action: 'column-control-active'; controlCell: FromTo; cells: FromTo[]; uniqKey: number}\n | {action: 'row-control-non-active'; uniqKey: number}\n | {action: 'column-control-non-active'; uniqKey: number}\n | {action: 'drag-rows'; rows: FromTo[]}\n | {action: 'drag-columns'; cells: FromTo[]}\n | {action: 'hide'};\n\nconst key = new PluginKey<DecorationSet>('yfm-table-dnd-decos');\n\nexport function activateRows(\n tr: Transaction,\n params: {controlCell: FromTo; rows: FromTo[]; uniqKey: number},\n): Transaction {\n const meta: DndMeta = {action: 'row-control-active', ...params};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function deactivateRow(tr: Transaction, uniqKey: number): Transaction {\n const meta: DndMeta = {action: 'row-control-non-active', uniqKey};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function activateColumns(\n tr: Transaction,\n params: {controlCell: FromTo; cells: FromTo[]; uniqKey: number},\n): Transaction {\n const meta: DndMeta = {action: 'column-control-active', ...params};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function deactivateColumn(tr: Transaction, uniqKey: number): Transaction {\n const meta: DndMeta = {action: 'column-control-non-active', uniqKey};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function selectDraggedRow(tr: Transaction, rows: FromTo[]): Transaction {\n const meta: DndMeta = {action: 'drag-rows', rows};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function selectDraggedColumn(tr: Transaction, cells: FromTo[]): Transaction {\n const meta: DndMeta = {action: 'drag-columns', cells};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function clearAllSelections(tr: Transaction): Transaction {\n const meta: DndMeta = {action: 'hide'};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport const yfmTableDndPlugin = () => {\n return new Plugin<DecorationSet>({\n key,\n state: {\n init() {\n return DecorationSet.empty;\n },\n apply(tr, value) {\n const meta: DndMeta = tr.getMeta(key);\n\n if (meta?.action === 'hide') {\n return DecorationSet.empty;\n }\n\n if (meta?.action === 'row-control-active') {\n const {controlCell, rows, uniqKey} = meta;\n return DecorationSet.create(tr.doc, [\n Decoration.node(\n controlCell.from,\n controlCell.to,\n {},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]: YfmTableDecorationType.OpenRowMenu,\n },\n ),\n ...rows.map((row) =>\n Decoration.node(\n row.from,\n row.to,\n {class: 'g-md-yfm-table-active-row'},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]: YfmTableDecorationType.ActivateRow,\n },\n ),\n ),\n ]);\n }\n\n if (meta?.action === 'row-control-non-active') {\n const {uniqKey} = meta;\n const decos = value.find(\n undefined,\n undefined,\n (spec) => spec[YfmTableDecorationUniqKey] === uniqKey,\n );\n return value.remove(decos).map(tr.mapping, tr.doc);\n }\n\n if (meta?.action === 'column-control-active') {\n const {controlCell, cells, uniqKey} = meta;\n return DecorationSet.create(tr.doc, [\n Decoration.node(\n controlCell.from,\n controlCell.to,\n {},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]: YfmTableDecorationType.OpenColumnMenu,\n },\n ),\n ...cells.map((pos) =>\n Decoration.node(\n pos.from,\n pos.to,\n {class: 'g-md-yfm-table-active-column-cell'},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]:\n YfmTableDecorationType.ActivateColumnCells,\n },\n ),\n ),\n ]);\n }\n\n if (meta?.action === 'column-control-non-active') {\n const {uniqKey} = meta;\n const decos = value.find(\n undefined,\n undefined,\n (spec) => spec[YfmTableDecorationUniqKey] === uniqKey,\n );\n return value.remove(decos).map(tr.mapping, tr.doc);\n }\n\n if (meta?.action === 'drag-rows') {\n return DecorationSet.create(\n tr.doc,\n meta.rows.map((row) =>\n Decoration.node(row.from, row.to, {\n class: 'g-md-yfm-table-dnd-dragged-row',\n }),\n ),\n );\n }\n\n if (meta?.action === 'drag-columns') {\n return DecorationSet.create(\n tr.doc,\n meta.cells.map((cell) =>\n Decoration.node(cell.from, cell.to, {\n class: 'g-md-yfm-table-dnd-dragged-column-cell',\n }),\n ),\n );\n }\n\n return value.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations(state) {\n return this.getState(state);\n },\n },\n });\n};\n"]}
1
+ {"version":3,"file":"dnd-plugin.js","sourceRoot":"../../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/plugins/dnd-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Plugin, PluginKey, type Transaction} from '#pm/state';\nimport {Decoration, DecorationSet} from '#pm/view';\nimport {cn} from 'src/classname';\n\nimport {\n YfmTableDecorationType,\n YfmTableDecorationTypeKey,\n YfmTableDecorationUniqKey,\n} from '../const';\n\nconst b = cn('yfm-table-selected-cell');\n\ntype FromTo = {\n from: number;\n to: number;\n};\n\ntype CellMods = {\n 'first-row'?: boolean;\n 'last-row'?: boolean;\n 'first-column'?: boolean;\n 'last-column'?: boolean;\n};\n\nexport type SelectedCellPos = FromTo & {\n mods: CellMods;\n};\n\ntype DndMeta =\n | {action: 'row-control-active'; controlCell: FromTo; cells: SelectedCellPos[]; uniqKey: number}\n | {\n action: 'column-control-active';\n controlCell: FromTo;\n cells: SelectedCellPos[];\n uniqKey: number;\n }\n | {action: 'row-control-non-active'; uniqKey: number}\n | {action: 'column-control-non-active'; uniqKey: number}\n | {action: 'drag-rows'; cells: SelectedCellPos[]}\n | {action: 'drag-columns'; cells: SelectedCellPos[]}\n | {action: 'hide'};\n\nconst key = new PluginKey<DecorationSet>('yfm-table-dnd-decos');\n\nexport function activateRows(\n tr: Transaction,\n params: {controlCell: FromTo; cells: SelectedCellPos[]; uniqKey: number},\n): Transaction {\n const meta: DndMeta = {action: 'row-control-active', ...params};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function deactivateRow(tr: Transaction, uniqKey: number): Transaction {\n const meta: DndMeta = {action: 'row-control-non-active', uniqKey};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function activateColumns(\n tr: Transaction,\n params: {controlCell: FromTo; cells: SelectedCellPos[]; uniqKey: number},\n): Transaction {\n const meta: DndMeta = {action: 'column-control-active', ...params};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function deactivateColumn(tr: Transaction, uniqKey: number): Transaction {\n const meta: DndMeta = {action: 'column-control-non-active', uniqKey};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function selectDraggedRow(tr: Transaction, cells: SelectedCellPos[]): Transaction {\n const meta: DndMeta = {action: 'drag-rows', cells};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function selectDraggedColumn(tr: Transaction, cells: SelectedCellPos[]): Transaction {\n const meta: DndMeta = {action: 'drag-columns', cells};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport function clearAllSelections(tr: Transaction): Transaction {\n const meta: DndMeta = {action: 'hide'};\n tr.setMeta(key, meta);\n return tr;\n}\n\nexport const yfmTableDndPlugin = () => {\n return new Plugin<DecorationSet>({\n key,\n state: {\n init() {\n return DecorationSet.empty;\n },\n apply(tr, value) {\n const meta: DndMeta = tr.getMeta(key);\n\n if (meta?.action === 'hide') {\n return DecorationSet.empty;\n }\n\n if (meta?.action === 'row-control-active') {\n const {controlCell, cells, uniqKey} = meta;\n return DecorationSet.create(tr.doc, [\n Decoration.node(\n controlCell.from,\n controlCell.to,\n {},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]: YfmTableDecorationType.OpenRowMenu,\n },\n ),\n ...cells.map((cell) =>\n Decoration.node(\n cell.from,\n cell.to,\n {class: b(cell.mods)},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]:\n YfmTableDecorationType.ActivateRowCells,\n },\n ),\n ),\n ]);\n }\n\n if (meta?.action === 'row-control-non-active') {\n const {uniqKey} = meta;\n const decos = value.find(\n undefined,\n undefined,\n (spec) => spec[YfmTableDecorationUniqKey] === uniqKey,\n );\n return value.remove(decos).map(tr.mapping, tr.doc);\n }\n\n if (meta?.action === 'column-control-active') {\n const {controlCell, cells, uniqKey} = meta;\n return DecorationSet.create(tr.doc, [\n Decoration.node(\n controlCell.from,\n controlCell.to,\n {},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]: YfmTableDecorationType.OpenColumnMenu,\n },\n ),\n ...cells.map((pos) =>\n Decoration.node(\n pos.from,\n pos.to,\n {class: b(pos.mods)},\n {\n [YfmTableDecorationUniqKey]: uniqKey,\n [YfmTableDecorationTypeKey]:\n YfmTableDecorationType.ActivateColumnCells,\n },\n ),\n ),\n ]);\n }\n\n if (meta?.action === 'column-control-non-active') {\n const {uniqKey} = meta;\n const decos = value.find(\n undefined,\n undefined,\n (spec) => spec[YfmTableDecorationUniqKey] === uniqKey,\n );\n return value.remove(decos).map(tr.mapping, tr.doc);\n }\n\n if (meta?.action === 'drag-rows') {\n return DecorationSet.create(\n tr.doc,\n meta.cells.map((cell) =>\n Decoration.node(cell.from, cell.to, {\n class: b(cell.mods, 'dragged-cell'),\n }),\n ),\n );\n }\n\n if (meta?.action === 'drag-columns') {\n return DecorationSet.create(\n tr.doc,\n meta.cells.map((cell) =>\n Decoration.node(cell.from, cell.to, {\n class: b(cell.mods, 'dragged-cell'),\n }),\n ),\n );\n }\n\n return value.map(tr.mapping, tr.doc);\n },\n },\n props: {\n decorations(state) {\n return this.getState(state);\n },\n },\n });\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import type { TableColumnRange, TableDescBinded, TableRowRange } from "../../../../../table-utils/table-desc.js";
2
+ import type { SelectedCellPos } from "./plugins/dnd-plugin.js";
3
+ export declare function getSelectedCellsForRows(tableDesc: TableDescBinded, range: TableRowRange): SelectedCellPos[];
4
+ export declare function getSelectedCellsForColumns(tableDesc: TableDescBinded, range: TableColumnRange): SelectedCellPos[];
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSelectedCellsForRows = getSelectedCellsForRows;
4
+ exports.getSelectedCellsForColumns = getSelectedCellsForColumns;
5
+ function getSelectedCellsForRows(tableDesc, range) {
6
+ const cells = [];
7
+ for (let rowIdx = range.startIdx; rowIdx <= range.endIdx; rowIdx++) {
8
+ for (let colIdx = 0; colIdx < tableDesc.cols; colIdx++) {
9
+ const cell = getSelectedCellPos(tableDesc, rowIdx, colIdx);
10
+ if (cell)
11
+ cells.push(cell);
12
+ }
13
+ }
14
+ return cells;
15
+ }
16
+ function getSelectedCellsForColumns(tableDesc, range) {
17
+ const cells = [];
18
+ for (let rowIdx = 0; rowIdx < tableDesc.rows; rowIdx++) {
19
+ for (let colIdx = range.startIdx; colIdx <= range.endIdx; colIdx++) {
20
+ const cell = getSelectedCellPos(tableDesc, rowIdx, colIdx);
21
+ if (cell)
22
+ cells.push(cell);
23
+ }
24
+ }
25
+ return cells;
26
+ }
27
+ function getSelectedCellPos(tableDesc, rowIdx, colIdx) {
28
+ const pos = tableDesc.getPosForCell(rowIdx, colIdx);
29
+ if (pos.type === 'virtual')
30
+ return null;
31
+ const cell = {
32
+ from: pos.from,
33
+ to: pos.to,
34
+ mods: {
35
+ 'first-row': rowIdx === 0,
36
+ 'last-row': rowIdx === tableDesc.rows - 1,
37
+ 'first-column': colIdx === 0,
38
+ 'last-column': colIdx === tableDesc.cols - 1,
39
+ },
40
+ };
41
+ const { rowspan, colspan } = tableDesc.base.rowsDesc[rowIdx].cells[colIdx];
42
+ if (rowspan && rowspan > 0 && rowIdx + rowspan >= tableDesc.rows) {
43
+ cell.mods['last-row'] = true;
44
+ }
45
+ if (colspan && colspan > 0 && colIdx + colspan >= tableDesc.cols) {
46
+ cell.mods['last-column'] = true;
47
+ }
48
+ return cell;
49
+ }
50
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../../../src","sources":["extensions/yfm/YfmTable/plugins/YfmTableControls/utils.ts"],"names":[],"mappings":";;AASA,0DAcC;AAED,gEAcC;AA9BD,SAAgB,uBAAuB,CACnC,SAA0B,EAC1B,KAAoB;IAEpB,MAAM,KAAK,GAAsB,EAAE,CAAC;IAEpC,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACjE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAgB,0BAA0B,CACtC,SAA0B,EAC1B,KAAuB;IAEvB,MAAM,KAAK,GAAsB,EAAE,CAAC;IAEpC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;QACrD,KAAK,IAAI,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3D,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CACvB,SAA0B,EAC1B,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,IAAI,GAAoB;QAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE;YACF,WAAW,EAAE,MAAM,KAAK,CAAC;YACzB,UAAU,EAAE,MAAM,KAAK,SAAS,CAAC,IAAI,GAAG,CAAC;YACzC,cAAc,EAAE,MAAM,KAAK,CAAC;YAC5B,aAAa,EAAE,MAAM,KAAK,SAAS,CAAC,IAAI,GAAG,CAAC;SAC/C;KACJ,CAAC;IAEF,MAAM,EAAC,OAAO,EAAE,OAAO,EAAC,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;IAC9F,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,GAAG,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;IACjC,CAAC;IACD,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,IAAI,MAAM,GAAG,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import type {\n TableCellRealDesc,\n TableColumnRange,\n TableDescBinded,\n TableRowRange,\n} from 'src/table-utils/table-desc';\n\nimport type {SelectedCellPos} from './plugins/dnd-plugin';\n\nexport function getSelectedCellsForRows(\n tableDesc: TableDescBinded,\n range: TableRowRange,\n): SelectedCellPos[] {\n const cells: SelectedCellPos[] = [];\n\n for (let rowIdx = range.startIdx; rowIdx <= range.endIdx; rowIdx++) {\n for (let colIdx = 0; colIdx < tableDesc.cols; colIdx++) {\n const cell = getSelectedCellPos(tableDesc, rowIdx, colIdx);\n if (cell) cells.push(cell);\n }\n }\n\n return cells;\n}\n\nexport function getSelectedCellsForColumns(\n tableDesc: TableDescBinded,\n range: TableColumnRange,\n): SelectedCellPos[] {\n const cells: SelectedCellPos[] = [];\n\n for (let rowIdx = 0; rowIdx < tableDesc.rows; rowIdx++) {\n for (let colIdx = range.startIdx; colIdx <= range.endIdx; colIdx++) {\n const cell = getSelectedCellPos(tableDesc, rowIdx, colIdx);\n if (cell) cells.push(cell);\n }\n }\n\n return cells;\n}\n\nfunction getSelectedCellPos(\n tableDesc: TableDescBinded,\n rowIdx: number,\n colIdx: number,\n): SelectedCellPos | null {\n const pos = tableDesc.getPosForCell(rowIdx, colIdx);\n if (pos.type === 'virtual') return null;\n\n const cell: SelectedCellPos = {\n from: pos.from,\n to: pos.to,\n mods: {\n 'first-row': rowIdx === 0,\n 'last-row': rowIdx === tableDesc.rows - 1,\n 'first-column': colIdx === 0,\n 'last-column': colIdx === tableDesc.cols - 1,\n },\n };\n\n const {rowspan, colspan} = tableDesc.base.rowsDesc[rowIdx].cells[colIdx] as TableCellRealDesc;\n if (rowspan && rowspan > 0 && rowIdx + rowspan >= tableDesc.rows) {\n cell.mods['last-row'] = true;\n }\n if (colspan && colspan > 0 && colIdx + colspan >= tableDesc.cols) {\n cell.mods['last-column'] = true;\n }\n\n return cell;\n}\n"]}
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "cancel": "Cancel",
3
+ "close": "Close",
3
4
  "delete": "Delete",
4
5
  "edit": "Edit",
5
6
  "preview": "Preview",
6
7
  "remove": "Remove",
7
8
  "save": "Save",
8
9
  "toolbar_action_disabled": "Incompatible markup element"
9
- }
10
+ }
@@ -1,7 +1,8 @@
1
- export declare const i18n: <G extends "cancel" | "remove" | "delete" | "edit" | "preview" | "save" | "toolbar_action_disabled", S extends string>(key: G | (string extends S ? S : never), params?: {
1
+ export declare const i18n: <G extends "cancel" | "close" | "remove" | "delete" | "edit" | "preview" | "save" | "toolbar_action_disabled", S extends string>(key: G | (string extends S ? S : never), params?: {
2
2
  [key: string]: any;
3
3
  }) => S extends G ? {
4
4
  cancel: string;
5
+ close: string;
5
6
  delete: string;
6
7
  edit: string;
7
8
  preview: string;
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "cancel": "Отмена",
3
+ "close": "Закрыть",
3
4
  "delete": "Удалить",
4
5
  "edit": "Редактировать",
5
6
  "preview": "Предпросмотр",
6
7
  "remove": "Удалить",
7
8
  "save": "Сохранить",
8
9
  "toolbar_action_disabled": "Несовместимый элемент разметки"
9
- }
10
+ }
@@ -0,0 +1,23 @@
1
+ export interface AutoSaveOptions {
2
+ enabled?: boolean;
3
+ delay?: number;
4
+ }
5
+ export interface UseAutoSaveProps {
6
+ initialValue: string;
7
+ onSave: (value: string, shouldClose?: boolean) => void;
8
+ onClose: () => void;
9
+ autoSave?: AutoSaveOptions;
10
+ }
11
+ export interface UseAutoSaveReturn {
12
+ value: string;
13
+ hasUnsavedChanges: boolean;
14
+ handleChange: (newValue: string) => void;
15
+ handleManualSave: () => void;
16
+ handleClearTimeout: () => void;
17
+ isAutoSaveEnabled: boolean;
18
+ isSaveDisabled: boolean;
19
+ }
20
+ /**
21
+ * autosave functionality for extensions with edit block
22
+ */
23
+ export declare const useAutoSave: ({ autoSave, initialValue, onClose, onSave, }: UseAutoSaveProps) => UseAutoSaveReturn;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAutoSave = void 0;
4
+ const react_1 = require("react");
5
+ const DEFAULT_AUTOSAVE = {
6
+ enabled: true,
7
+ delay: 500,
8
+ };
9
+ /**
10
+ * autosave functionality for extensions with edit block
11
+ */
12
+ const useAutoSave = ({ autoSave, initialValue, onClose, onSave, }) => {
13
+ const { enabled: autoSaveEnabled, delay: autoSaveDelay } = autoSave ?? DEFAULT_AUTOSAVE;
14
+ const isAutoSaveEnabled = Boolean(autoSaveEnabled);
15
+ const [value, setValue] = (0, react_1.useState)(initialValue || '');
16
+ const [hasUnsavedChanges, setHasUnsavedChanges] = (0, react_1.useState)(false);
17
+ const autoSaveTimeoutRef = (0, react_1.useRef)();
18
+ const handleClearTimeout = () => {
19
+ if (autoSaveTimeoutRef.current) {
20
+ clearTimeout(autoSaveTimeoutRef.current);
21
+ }
22
+ };
23
+ const handleChange = (newValue) => {
24
+ setValue(newValue);
25
+ const hasChanges = newValue !== initialValue;
26
+ setHasUnsavedChanges(hasChanges);
27
+ if (isAutoSaveEnabled && hasChanges) {
28
+ handleClearTimeout();
29
+ const delay = autoSaveDelay ?? DEFAULT_AUTOSAVE.delay;
30
+ autoSaveTimeoutRef.current = setTimeout(() => {
31
+ onSave(newValue);
32
+ setHasUnsavedChanges(false);
33
+ }, delay);
34
+ }
35
+ };
36
+ const handleManualSave = () => {
37
+ handleClearTimeout();
38
+ onSave(value);
39
+ onClose();
40
+ };
41
+ // сleanup timeout on unmount
42
+ (0, react_1.useEffect)(() => {
43
+ return () => {
44
+ handleClearTimeout();
45
+ };
46
+ }, []);
47
+ const isSaveDisabled = isAutoSaveEnabled && !hasUnsavedChanges;
48
+ return {
49
+ value,
50
+ hasUnsavedChanges,
51
+ handleChange,
52
+ handleManualSave,
53
+ handleClearTimeout,
54
+ isAutoSaveEnabled,
55
+ isSaveDisabled,
56
+ };
57
+ };
58
+ exports.useAutoSave = useAutoSave;
59
+ //# sourceMappingURL=useAutoSave.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAutoSave.js","sourceRoot":"../../../../src","sources":["react-utils/hooks/useAutoSave.ts"],"names":[],"mappings":";;;AAAA,iCAAkD;AAwBlD,MAAM,gBAAgB,GAAG;IACrB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,GAAG;CACb,CAAC;AAEF;;GAEG;AACI,MAAM,WAAW,GAAG,CAAC,EACxB,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,MAAM,GACS,EAAqB,EAAE;IACtC,MAAM,EAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAC,GAAG,QAAQ,IAAI,gBAAgB,CAAC;IACtF,MAAM,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEnD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAClE,MAAM,kBAAkB,GAAG,IAAA,cAAM,GAAkB,CAAC;IAEpD,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC5B,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC7B,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACtC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnB,MAAM,UAAU,GAAG,QAAQ,KAAK,YAAY,CAAC;QAC7C,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,iBAAiB,IAAI,UAAU,EAAE,CAAC;YAClC,kBAAkB,EAAE,CAAC;YAErB,MAAM,KAAK,GAAG,aAAa,IAAI,gBAAgB,CAAC,KAAK,CAAC;YACtD,kBAAkB,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBACzC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC,EAAE,KAAK,CAAC,CAAC;QACd,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC1B,kBAAkB,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,OAAO,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,6BAA6B;IAC7B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,OAAO,GAAG,EAAE;YACR,kBAAkB,EAAE,CAAC;QACzB,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,iBAAiB,IAAI,CAAC,iBAAiB,CAAC;IAE/D,OAAO;QACH,KAAK;QACL,iBAAiB;QACjB,YAAY;QACZ,gBAAgB;QAChB,kBAAkB;QAClB,iBAAiB;QACjB,cAAc;KACjB,CAAC;AACN,CAAC,CAAC;AA3DW,QAAA,WAAW,eA2DtB","sourcesContent":["import {useEffect, useRef, useState} from 'react';\n\nexport interface AutoSaveOptions {\n enabled?: boolean;\n delay?: number;\n}\n\nexport interface UseAutoSaveProps {\n initialValue: string;\n onSave: (value: string, shouldClose?: boolean) => void;\n onClose: () => void;\n autoSave?: AutoSaveOptions;\n}\n\nexport interface UseAutoSaveReturn {\n value: string;\n hasUnsavedChanges: boolean;\n handleChange: (newValue: string) => void;\n handleManualSave: () => void;\n handleClearTimeout: () => void;\n isAutoSaveEnabled: boolean;\n isSaveDisabled: boolean;\n}\n\nconst DEFAULT_AUTOSAVE = {\n enabled: true,\n delay: 500,\n};\n\n/**\n * autosave functionality for extensions with edit block\n */\nexport const useAutoSave = ({\n autoSave,\n initialValue,\n onClose,\n onSave,\n}: UseAutoSaveProps): UseAutoSaveReturn => {\n const {enabled: autoSaveEnabled, delay: autoSaveDelay} = autoSave ?? DEFAULT_AUTOSAVE;\n const isAutoSaveEnabled = Boolean(autoSaveEnabled);\n\n const [value, setValue] = useState(initialValue || '');\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const autoSaveTimeoutRef = useRef<NodeJS.Timeout>();\n\n const handleClearTimeout = () => {\n if (autoSaveTimeoutRef.current) {\n clearTimeout(autoSaveTimeoutRef.current);\n }\n };\n\n const handleChange = (newValue: string) => {\n setValue(newValue);\n const hasChanges = newValue !== initialValue;\n setHasUnsavedChanges(hasChanges);\n\n if (isAutoSaveEnabled && hasChanges) {\n handleClearTimeout();\n\n const delay = autoSaveDelay ?? DEFAULT_AUTOSAVE.delay;\n autoSaveTimeoutRef.current = setTimeout(() => {\n onSave(newValue);\n setHasUnsavedChanges(false);\n }, delay);\n }\n };\n\n const handleManualSave = () => {\n handleClearTimeout();\n onSave(value);\n onClose();\n };\n\n // сleanup timeout on unmount\n useEffect(() => {\n return () => {\n handleClearTimeout();\n };\n }, []);\n\n const isSaveDisabled = isAutoSaveEnabled && !hasUnsavedChanges;\n\n return {\n value,\n hasUnsavedChanges,\n handleChange,\n handleManualSave,\n handleClearTimeout,\n isAutoSaveEnabled,\n isSaveDisabled,\n };\n};\n"]}
@@ -7,4 +7,4 @@ export declare const useComponentWillMount: (cb: () => void) => void;
7
7
  export declare const useRenderTime: (cb: (time: number) => void) => void;
8
8
  type AnyFunction = (...args: any[]) => any;
9
9
  export declare function useDebounce<Fn extends AnyFunction>(cb: Fn, wait: number): import("lodash").DebouncedFunc<(...args: Parameters<Fn>) => void>;
10
- export {};
10
+ export { useAutoSave, type AutoSaveOptions, type UseAutoSaveProps, type UseAutoSaveReturn, } from "./hooks/useAutoSave.js";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useRenderTime = exports.useComponentWillMount = exports.useElementState = void 0;
3
+ exports.useAutoSave = exports.useRenderTime = exports.useComponentWillMount = exports.useElementState = void 0;
4
4
  exports.useBooleanState = useBooleanState;
5
5
  exports.useDebounce = useDebounce;
6
6
  const react_1 = require("react");
@@ -43,4 +43,6 @@ function useDebounce(cb, wait) {
43
43
  (0, react_1.useEffect)(() => () => debouncedFn.cancel(), [debouncedFn]);
44
44
  return debouncedFn;
45
45
  }
46
+ var useAutoSave_1 = require("./hooks/useAutoSave.js");
47
+ Object.defineProperty(exports, "useAutoSave", { enumerable: true, get: function () { return useAutoSave_1.useAutoSave; } });
46
48
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"../../../src","sources":["react-utils/hooks.ts"],"names":[],"mappings":";;;AAYA,0CAUC;AAuBD,kCAeC;AA5DD,iCAAwE;AAExE,yCAAmD;AAEnD,yCAAmC;AAE5B,MAAM,eAAe,GAAG,GAA4D,EAAE,CACzF,IAAA,gBAAQ,EAAW,IAAI,CAAC,CAAC;AADhB,QAAA,eAAe,mBACC;AAK7B,SAAgB,eAAe,CAC3B,OAAkC;IAElC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAU,OAAO,CAAC,CAAC;IACrD,OAAO;QACH,KAAK;QACL,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACrC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACtC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;KACjD,CAAC;AACN,CAAC;AAEM,MAAM,qBAAqB,GAAG,CAAC,EAAc,EAAE,EAAE;IACpD,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,SAAS,CAAC,OAAO;QAAE,EAAE,EAAE,CAAC;IAE5B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC9B,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC;AAEK,MAAM,aAAa,GAAG,CAAC,EAA0B,EAAE,EAAE;IACxD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAA,6BAAqB,EAAC,GAAG,EAAE;QACvB,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAGF,SAAgB,WAAW,CAAyB,EAAM,EAAE,IAAY;IACpE,MAAM,QAAQ,GAAG,IAAA,qBAAS,EAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CACD,IAAA,iBAAQ,EAAC,CAAC,GAAG,IAAoB,EAAE,EAAE;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,EAAE,IAAI,CAAC,EACZ,CAAC,QAAQ,EAAE,IAAI,CAAC,CACnB,CAAC;IAEF,6BAA6B;IAC7B,IAAA,iBAAS,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3D,OAAO,WAAW,CAAC;AACvB,CAAC","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nimport {debounce} from '../lodash';\n\nexport const useElementState = <T extends HTMLElement>(): [T | null, React.RefCallback<T>] =>\n useState<T | null>(null);\n\ntype SetTrue = () => void;\ntype SetFalse = () => void;\ntype Toggle = () => void;\nexport function useBooleanState(\n initial: boolean | (() => boolean),\n): [boolean, SetTrue, SetFalse, Toggle] {\n const [value, setValue] = useState<boolean>(initial);\n return [\n value,\n useCallback(() => setValue(true), []),\n useCallback(() => setValue(false), []),\n useCallback(() => setValue((val) => !val), []),\n ];\n}\n\nexport const useComponentWillMount = (cb: () => void) => {\n const willMount = useRef(true);\n\n if (willMount.current) cb();\n\n willMount.current = false;\n};\n\nexport const useRenderTime = (cb: (time: number) => void) => {\n let time = 0;\n\n useComponentWillMount(() => {\n time = Date.now();\n });\n\n useEffectOnce(() => {\n cb(Date.now() - time);\n });\n};\n\ntype AnyFunction = (...args: any[]) => any;\nexport function useDebounce<Fn extends AnyFunction>(cb: Fn, wait: number) {\n const latestCb = useLatest(cb);\n\n const debouncedFn = useMemo(\n () =>\n debounce((...args: Parameters<Fn>) => {\n latestCb.current.apply(null, args);\n }, wait),\n [latestCb, wait],\n );\n\n // cancel function on unmount\n useEffect(() => () => debouncedFn.cancel(), [debouncedFn]);\n\n return debouncedFn;\n}\n"]}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"../../../src","sources":["react-utils/hooks.ts"],"names":[],"mappings":";;;AAYA,0CAUC;AAuBD,kCAeC;AA5DD,iCAAwE;AAExE,yCAAmD;AAEnD,yCAAmC;AAE5B,MAAM,eAAe,GAAG,GAA4D,EAAE,CACzF,IAAA,gBAAQ,EAAW,IAAI,CAAC,CAAC;AADhB,QAAA,eAAe,mBACC;AAK7B,SAAgB,eAAe,CAC3B,OAAkC;IAElC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAU,OAAO,CAAC,CAAC;IACrD,OAAO;QACH,KAAK;QACL,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACrC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACtC,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;KACjD,CAAC;AACN,CAAC;AAEM,MAAM,qBAAqB,GAAG,CAAC,EAAc,EAAE,EAAE;IACpD,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,SAAS,CAAC,OAAO;QAAE,EAAE,EAAE,CAAC;IAE5B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;AAC9B,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC;AAEK,MAAM,aAAa,GAAG,CAAC,EAA0B,EAAE,EAAE;IACxD,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAA,6BAAqB,EAAC,GAAG,EAAE;QACvB,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAVW,QAAA,aAAa,iBAUxB;AAGF,SAAgB,WAAW,CAAyB,EAAM,EAAE,IAAY;IACpE,MAAM,QAAQ,GAAG,IAAA,qBAAS,EAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,WAAW,GAAG,IAAA,eAAO,EACvB,GAAG,EAAE,CACD,IAAA,iBAAQ,EAAC,CAAC,GAAG,IAAoB,EAAE,EAAE;QACjC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,EAAE,IAAI,CAAC,EACZ,CAAC,QAAQ,EAAE,IAAI,CAAC,CACnB,CAAC;IAEF,6BAA6B;IAC7B,IAAA,iBAAS,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAE3D,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,sDAK6B;AAJzB,0GAAA,WAAW,OAAA","sourcesContent":["import {useCallback, useEffect, useMemo, useRef, useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nimport {debounce} from '../lodash';\n\nexport const useElementState = <T extends HTMLElement>(): [T | null, React.RefCallback<T>] =>\n useState<T | null>(null);\n\ntype SetTrue = () => void;\ntype SetFalse = () => void;\ntype Toggle = () => void;\nexport function useBooleanState(\n initial: boolean | (() => boolean),\n): [boolean, SetTrue, SetFalse, Toggle] {\n const [value, setValue] = useState<boolean>(initial);\n return [\n value,\n useCallback(() => setValue(true), []),\n useCallback(() => setValue(false), []),\n useCallback(() => setValue((val) => !val), []),\n ];\n}\n\nexport const useComponentWillMount = (cb: () => void) => {\n const willMount = useRef(true);\n\n if (willMount.current) cb();\n\n willMount.current = false;\n};\n\nexport const useRenderTime = (cb: (time: number) => void) => {\n let time = 0;\n\n useComponentWillMount(() => {\n time = Date.now();\n });\n\n useEffectOnce(() => {\n cb(Date.now() - time);\n });\n};\n\ntype AnyFunction = (...args: any[]) => any;\nexport function useDebounce<Fn extends AnyFunction>(cb: Fn, wait: number) {\n const latestCb = useLatest(cb);\n\n const debouncedFn = useMemo(\n () =>\n debounce((...args: Parameters<Fn>) => {\n latestCb.current.apply(null, args);\n }, wait),\n [latestCb, wait],\n );\n\n // cancel function on unmount\n useEffect(() => () => debouncedFn.cancel(), [debouncedFn]);\n\n return debouncedFn;\n}\n\nexport {\n useAutoSave,\n type AutoSaveOptions,\n type UseAutoSaveProps,\n type UseAutoSaveReturn,\n} from './hooks/useAutoSave';\n"]}
@@ -5,6 +5,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const icons_1 = require("@gravity-ui/icons");
7
7
  const uikit_1 = require("@gravity-ui/uikit");
8
+ const layout_1 = require("../common/layout.js");
9
+ const get_target_z_index_1 = require("../utils/get-target-z-index.js");
8
10
  const classname_1 = require("../classname.js");
9
11
  const common_1 = require("../i18n/common/index.js");
10
12
  const lodash_1 = require("../lodash.js");
@@ -43,7 +45,7 @@ function ToolbarListButton({ className, editor, focus, onClick, icon, title, wit
43
45
  setPopupItem(undefined);
44
46
  else
45
47
  toggleOpen();
46
- }, disableTooltip: disableTooltip || popupOpen, children: buttonContent }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, children: (0, jsx_runtime_1.jsx)(uikit_1.Menu, { size: "l", className: b('menu'), qa: qaMenu, "data-toolbar-menu-for": titleText, children: data
48
+ }, disableTooltip: disableTooltip || popupOpen, children: buttonContent }), (0, jsx_runtime_1.jsx)(uikit_1.Popup, { anchorElement: anchorElement, open: popupOpen, onOpenChange: hide, zIndex: (0, get_target_z_index_1.getTargetZIndex)(layout_1.LAYOUT.STICKY_TOOLBAR), children: (0, jsx_runtime_1.jsx)(uikit_1.Menu, { size: "l", className: b('menu'), qa: qaMenu, "data-toolbar-menu-for": titleText, children: data
47
49
  .map((data) => {
48
50
  const { id, title, icon, hotkey, isActive, isEnable, exec, hint, hintWhenDisabled, preview, } = data;
49
51
  const titleText = (0, lodash_1.isFunction)(title) ? title() : title;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":";;AA+BA,8CA+KC;;AA9MD,iCAAoD;AAEpD,6CAA8C;AAC9C,6CAA+E;AAE/E,+CAAgC;AAChC,oDAAoC;AACpC,yCAAqC;AACrC,mDAAsE;AAEtE,wDAAgD;AAChD,sDAAkD;AAQlD,mCAAkC;AAElC,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,qBAAqB,CAAC,CAAC;AAUpC,SAAgB,iBAAiB,CAAI,EACjC,SAAS,EACT,MAAM,EACN,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,SAAS,EACT,IAAI,EACJ,YAAY,EACZ,iBAAiB,EACjB,EAAE,EACF,MAAM,EACN,uBAAuB,GAAG,mCAAmC,EAC7D,aAAa,EACb,cAAc,EACd,cAAc,GACU;IACxB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,IAAA,uBAAe,GAAE,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,AAAD,EAAG,IAAI,EAAE,UAAU,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,GAA6B,CAAC;IAExE,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC;IAE3C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACX,IAAI,eAAe,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;QACX,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAE5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE9D,IAAI,iBAAiB,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;QAChD,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,uBAAC,YAAI,IAAS,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,IAAzC,CAAC,CAA4C,CAAC,CAAC;IACjF,IAAI,SAAS,EAAE,CAAC;QACZ,aAAa,CAAC,IAAI,CAAC,uBAAC,gBAAQ,cAAU,EAAE,IAAN,CAAC,CAAiB,CAAC,CAAC;QACtD,aAAa,CAAC,IAAI,CAAC,uBAAC,YAAI,IAAS,IAAI,EAAE,mBAAW,EAAE,IAAI,EAAE,EAAE,IAA9B,CAAC,CAAiC,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAW,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAE9D,OAAO,CACH,6DACI,uBAAC,iCAAiB,IACd,EAAE,EAAE,EAAE,EACN,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,CAAC,aAAa,EACvB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,SAAS,EAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAC7C,OAAO,EAAE,GAAG,EAAE;oBACV,IAAI,SAAS;wBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;;wBAClC,UAAU,EAAE,CAAC;gBACtB,CAAC,EACD,cAAc,EAAE,cAAc,IAAI,SAAS,YAE1C,aAAa,GACE,EACpB,uBAAC,aAAK,IAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,YACpE,uBAAC,YAAI,IAAC,IAAI,EAAC,GAAG,EAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,2BAAyB,SAAS,YAC5E,IAAI;yBACA,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;wBACV,MAAM,EACF,EAAE,EACF,KAAK,EACL,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,gBAAgB,EAChB,OAAO,GACV,GAAG,IAAI,CAAC;wBAET,MAAM,SAAS,GAAG,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;wBACtD,MAAM,QAAQ,GAAG,IAAA,mBAAU,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBAElD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;wBAEnC,MAAM,oBAAoB,GAAG,gBAAgB,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;wBACrE,MAAM,oBAAoB,GACtB,OAAO,gBAAgB,KAAK,QAAQ;4BAChC,CAAC,CAAC,gBAAgB;4BAClB,CAAC,CAAC,OAAO,gBAAgB,KAAK,UAAU;gCACtC,CAAC,CAAC,gBAAgB,EAAE;gCACpB,CAAC,CAAC,IAAA,aAAI,EAAC,yBAAyB,CAAC,CAAC;wBAE5C,MAAM,WAAW,GAAG,GAAG,EAAE;4BACrB,IAAI,EAAE,CAAC;4BAEP,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gCACpB,YAAY,CAAC,IAAI,CAAC,CAAC;4BACvB,CAAC;iCAAM,CAAC;gCACJ,YAAY,CAAC,SAAS,CAAC,CAAC;gCACxB,KAAK,EAAE,CAAC;gCACR,IAAI,CAAC,MAAM,CAAC,CAAC;gCACb,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;4BAClB,CAAC;wBACL,CAAC,CAAC;wBAEF,OAAO,CACH,uBAAC,eAAO,IACJ,SAAS,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACvC,OAAO,EACH,gCAAK,SAAS,EAAE,CAAC,CAAC,yBAAyB,CAAC,YACvC,oBAAoB,GACnB,EAEV,SAAS,EAAC,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,EAAE,EAAE,uBAAuB,YAG1B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CACb,uBAAC,+BAAc,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,YACtD,uBAAC,YAAI,CAAC,IAAI,IAEN,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC3B,OAAO,EAAE,WAAW,EACpB,SAAS,EACL,uBAAC,YAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,GAAI,EAEpD,UAAU,EAAE;wCACR,GAAG,KAAK;wCACR,YAAY,EAAE,SAAS;qCAC1B,YAED,iCAAK,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,aACpB,SAAS,EACT,CAAC,aAAa,IAAI,CACf,iCAAK,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aACrB,MAAM,IAAI,uBAAC,cAAM,IAAC,KAAK,EAAE,MAAM,GAAI,EACnC,QAAQ,IAAI,CACT,uBAAC,gBAAQ,IACL,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EACpB,YAAY,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,YAE3B,QAAQ,GACF,CACd,IACC,CACT,IACC,IA5BD,EAAE,CA6BC,GACC,CACpB,IApCI,EAAE,CAqCD,CACb,CAAC;oBACN,CAAC,CAAC;yBACD,MAAM,CAAC,OAAO,CAAC,GACjB,GACH,EACP,SAAS;gBACN,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC;oBAClB,GAAG,SAAS;oBACZ,MAAM;oBACN,KAAK;oBACL,OAAO;oBACP,aAAa;oBACb,IAAI,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;iBACtC,CAAC;gBACJ,CAAC,CAAC,IAAI,IACX,CACN,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAI,IAAwB;IAC5C,OAAO,OAAO,CAAE,IAAkC,CAAC,WAAW,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n qaActionDisabledPopover?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n qaActionDisabledPopover = 'g-md-toolbar-action-disabled-hint',\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n const titleText: string = isFunction(title) ? title() : title;\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n disableTooltip={disableTooltip || popupOpen}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup anchorElement={anchorElement} open={popupOpen} onOpenChange={hide}>\n <Menu size=\"l\" className={b('menu')} qa={qaMenu} data-toolbar-menu-for={titleText}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa={qaActionDisabledPopover}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview} disabled={disablePreview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n {!disableHotkey && (\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n )}\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
1
+ {"version":3,"file":"ToolbarListButton.js","sourceRoot":"../../../src","sources":["toolbar/ToolbarListButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, useEffect, useState} from 'react';\n\nimport {ChevronDown} from '@gravity-ui/icons';\nimport {HelpMark, Hotkey, Icon, Menu, Popover, Popup} from '@gravity-ui/uikit';\n\nimport {LAYOUT} from 'src/common/layout';\nimport {getTargetZIndex} from 'src/utils/get-target-z-index';\n\nimport {cn} from '../classname';\nimport {i18n} from '../i18n/common';\nimport {isFunction} from '../lodash';\nimport {useBooleanState, useElementState} from '../react-utils/hooks';\n\nimport {PreviewTooltip} from './PreviewTooltip';\nimport {ToolbarButtonView} from './ToolbarButton';\nimport type {\n ToolbarBaseProps,\n ToolbarButtonPopupData,\n ToolbarItemData,\n ToolbarListButtonData,\n} from './types';\n\nimport './ToolbarListButton.scss';\n\nconst b = cn('toolbar-list-button');\n\nexport type {ToolbarListButtonData};\n\nexport type ToolbarListButtonProps<E> = ToolbarBaseProps<E> &\n ToolbarListButtonData<E> & {\n qaMenu?: string;\n qaActionDisabledPopover?: string;\n };\n\nexport function ToolbarListButton<E>({\n className,\n editor,\n focus,\n onClick,\n icon,\n title,\n withArrow,\n data,\n alwaysActive,\n replaceActiveIcon,\n qa,\n qaMenu,\n qaActionDisabledPopover = 'g-md-toolbar-action-disabled-hint',\n disableHotkey,\n disablePreview,\n disableTooltip,\n}: ToolbarListButtonProps<E>) {\n const [anchorElement, setAnchorElement] = useElementState();\n const [open, , hide, toggleOpen] = useBooleanState(false);\n const [popupItem, setPopupItem] = useState<ToolbarButtonPopupData<E>>();\n\n const everyDisabled = alwaysActive ? false : data.every((item) => !item.isEnable(editor));\n const popupOpen = everyDisabled ? false : open;\n const shouldForceHide = open && !popupOpen;\n\n useEffect(() => {\n if (shouldForceHide) {\n hide();\n }\n }, [hide, shouldForceHide]);\n\n if (data.length === 0) return null;\n\n const activeItem = data.find((item) => item.isActive(editor) && !item.doNotActivateList);\n const someActive = alwaysActive ? false : Boolean(activeItem);\n\n if (replaceActiveIcon && someActive && activeItem) {\n icon = activeItem.icon;\n }\n\n const buttonContent = [<Icon key={1} data={icon.data} size={icon.size ?? 16} />];\n if (withArrow) {\n buttonContent.push(<Fragment key={2}>{''}</Fragment>);\n buttonContent.push(<Icon key={3} data={ChevronDown} size={16} />);\n }\n const titleText: string = isFunction(title) ? title() : title;\n\n return (\n <>\n <ToolbarButtonView\n qa={qa}\n ref={setAnchorElement}\n active={someActive}\n enabled={!everyDisabled}\n title={title}\n className={b({arrow: withArrow}, [className])}\n onClick={() => {\n if (popupItem) setPopupItem(undefined);\n else toggleOpen();\n }}\n disableTooltip={disableTooltip || popupOpen}\n >\n {buttonContent}\n </ToolbarButtonView>\n <Popup\n anchorElement={anchorElement}\n open={popupOpen}\n onOpenChange={hide}\n zIndex={getTargetZIndex(LAYOUT.STICKY_TOOLBAR)}\n >\n <Menu size=\"l\" className={b('menu')} qa={qaMenu} data-toolbar-menu-for={titleText}>\n {data\n .map((data) => {\n const {\n id,\n title,\n icon,\n hotkey,\n isActive,\n isEnable,\n exec,\n hint,\n hintWhenDisabled,\n preview,\n } = data;\n\n const titleText = isFunction(title) ? title() : title;\n const hintText = isFunction(hint) ? hint() : hint;\n\n const disabled = !isEnable(editor);\n\n const hideHintWhenDisabled = hintWhenDisabled === false || !disabled;\n const hintWhenDisabledText =\n typeof hintWhenDisabled === 'string'\n ? hintWhenDisabled\n : typeof hintWhenDisabled === 'function'\n ? hintWhenDisabled()\n : i18n('toolbar_action_disabled');\n\n const handleClick = () => {\n hide();\n\n if (isPopupItem(data)) {\n setPopupItem(data);\n } else {\n setPopupItem(undefined);\n focus();\n exec(editor);\n onClick?.(id);\n }\n };\n\n return (\n <Popover\n className={b('action-disabled-popover')}\n content={\n <div className={b('action-disabled-tooltip')}>\n {hintWhenDisabledText}\n </div>\n }\n placement=\"left\"\n modal={false}\n disabled={hideHintWhenDisabled}\n qa={qaActionDisabledPopover}\n key={id}\n >\n {(props, ref) => (\n <PreviewTooltip preview={preview} disabled={disablePreview}>\n <Menu.Item\n key={id}\n ref={ref}\n active={isActive(editor)}\n disabled={!isEnable(editor)}\n onClick={handleClick}\n iconStart={\n <Icon data={icon.data} size={icon.size ?? 16} />\n }\n extraProps={{\n ...props,\n 'aria-label': titleText,\n }}\n >\n <div className={b('item')}>\n {titleText}\n {!disableHotkey && (\n <div className={b('extra')}>\n {hotkey && <Hotkey value={hotkey} />}\n {hintText && (\n <HelpMark\n className={b('hint')}\n popoverProps={{modal: false}}\n >\n {hintText}\n </HelpMark>\n )}\n </div>\n )}\n </div>\n </Menu.Item>\n </PreviewTooltip>\n )}\n </Popover>\n );\n })\n .filter(Boolean)}\n </Menu>\n </Popup>\n {popupItem\n ? popupItem.renderPopup({\n ...popupItem,\n editor,\n focus,\n onClick,\n anchorElement,\n hide: () => setPopupItem(undefined),\n })\n : null}\n </>\n );\n}\n\nfunction isPopupItem<E>(item: ToolbarItemData<E>): item is ToolbarButtonPopupData<E> {\n return Boolean((item as ToolbarButtonPopupData<E>).renderPopup);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function getTargetZIndex(dataLayoutSelector: string, offset?: number): number;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTargetZIndex = getTargetZIndex;
4
+ function getTargetZIndex(dataLayoutSelector, offset = 10) {
5
+ const targetLayerElement = document.querySelector(`[data-layout="${dataLayoutSelector}"]`);
6
+ if (!targetLayerElement) {
7
+ return offset;
8
+ }
9
+ const computedStyle = window.getComputedStyle(targetLayerElement);
10
+ const targetZIndex = parseInt(computedStyle.zIndex, 10);
11
+ return Number.isFinite(targetZIndex) ? targetZIndex + offset : offset;
12
+ }
13
+ //# sourceMappingURL=get-target-z-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-target-z-index.js","sourceRoot":"../../../src","sources":["utils/get-target-z-index.ts"],"names":[],"mappings":";;AAAA,0CAWC;AAXD,SAAgB,eAAe,CAAC,kBAA0B,EAAE,MAAM,GAAG,EAAE;IACnE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,kBAAkB,IAAI,CAAC,CAAC;IAE3F,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAExD,OAAO,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1E,CAAC","sourcesContent":["export function getTargetZIndex(dataLayoutSelector: string, offset = 10) {\n const targetLayerElement = document.querySelector(`[data-layout=\"${dataLayoutSelector}\"]`);\n\n if (!targetLayerElement) {\n return offset;\n }\n\n const computedStyle = window.getComputedStyle(targetLayerElement);\n const targetZIndex = parseInt(computedStyle.zIndex, 10);\n\n return Number.isFinite(targetZIndex) ? targetZIndex + offset : offset;\n}\n"]}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
4
  /** During build process, the current version will be injected here */
5
- exports.VERSION = typeof '15.21.0' !== 'undefined' ? '15.21.0' : 'unknown';
5
+ exports.VERSION = typeof '15.22.1' !== 'undefined' ? '15.22.1' : 'unknown';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.21.0' !== 'undefined' ? '15.21.0' : 'unknown';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.22.1' !== 'undefined' ? '15.22.1' : 'unknown';\n"]}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useLayoutEffect, useRef } from 'react';
3
3
  import { useUpdate } from 'react-use';
4
+ import { LAYOUT } from "../common/layout.js";
4
5
  import { i18n } from "../i18n/menubar/index.js";
5
6
  import { useSticky } from "../react-utils/useSticky.js";
6
7
  import { FlexToolbar } from "../toolbar/index.js";
@@ -20,6 +21,6 @@ export function ToolbarView({ editor, editorMode, toolbarEditor, toolbarFocus, t
20
21
  withSettings: settingsVisible,
21
22
  stickyActive: isStickyActive,
22
23
  isSticky: stickyToolbar,
23
- }, [className]), children: [_jsx(FlexToolbar, { data: toolbarConfig, hiddenActions: hiddenActionsConfig, editor: toolbarEditor, focus: toolbarFocus, dotsTitle: i18n('more_action'), onClick: (id, attrs) => editor.emit('toolbar-action', { id, attrs, editorMode }), display: toolbarDisplay, disableTooltip: mobile, disableHotkey: mobile, disablePreview: mobile }), children] }));
24
+ }, [className]), "data-layout": LAYOUT.STICKY_TOOLBAR, children: [_jsx(FlexToolbar, { data: toolbarConfig, hiddenActions: hiddenActionsConfig, editor: toolbarEditor, focus: toolbarFocus, dotsTitle: i18n('more_action'), onClick: (id, attrs) => editor.emit('toolbar-action', { id, attrs, editorMode }), display: toolbarDisplay, disableTooltip: mobile, disableHotkey: mobile, disablePreview: mobile }), children] }));
24
25
  }
25
26
  //# sourceMappingURL=ToolbarView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarView.js","sourceRoot":"../../../src","sources":["bundle/ToolbarView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,eAAe,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAC,IAAI,EAAC,iCAAwB;AACrC,OAAO,EAAC,SAAS,EAAC,oCAAiC;AACnD,OAAO,EAAC,WAAW,EAA8D,4BAAmB;AAGpG,OAAO,EAAC,QAAQ,EAAC,0BAAiB;AAiBlC,MAAM,UAAU,WAAW,CAAI,EAC3B,MAAM,EACN,UAAU,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,aAAa,EACb,EAAE,GACgB;IAClB,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACR,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC;IAE9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE7B,OAAO,CACH,0BACa,EAAE,EACX,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,QAAQ,CAAC,OAAO,CACvB;YACI,YAAY,EAAE,eAAe;YAC7B,YAAY,EAAE,cAAc;YAC5B,QAAQ,EAAE,aAAa;SAC1B,EACD,CAAC,SAAS,CAAC,CACd,aAED,KAAC,WAAW,IACR,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,mBAAmB,EAClC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAC9B,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAC,CAAC,EAC9E,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACxB,EACD,QAAQ,IACP,CACT,CAAC;AACN,CAAC","sourcesContent":["import {useLayoutEffect, useRef} from 'react';\n\nimport type {QAProps} from '@gravity-ui/uikit';\nimport {useUpdate} from 'react-use';\n\nimport type {ClassNameProps} from '../classname';\nimport {i18n} from '../i18n/menubar';\nimport {useSticky} from '../react-utils/useSticky';\nimport {FlexToolbar, type ToolbarData, type ToolbarDisplay, type ToolbarItemData} from '../toolbar';\n\nimport type {EditorInt} from './Editor';\nimport {stickyCn} from './sticky';\nimport type {MarkdownEditorMode} from './types';\n\nexport type ToolbarViewProps<T> = ClassNameProps &\n QAProps & {\n editor: EditorInt;\n editorMode: MarkdownEditorMode;\n toolbarEditor: T;\n toolbarFocus: () => void;\n toolbarConfig: ToolbarData<T>;\n settingsVisible?: boolean;\n hiddenActionsConfig?: ToolbarItemData<T>[];\n children?: React.ReactNode;\n stickyToolbar: boolean;\n toolbarDisplay?: ToolbarDisplay;\n };\n\nexport function ToolbarView<T>({\n editor,\n editorMode,\n toolbarEditor,\n toolbarFocus,\n toolbarConfig,\n toolbarDisplay,\n hiddenActionsConfig,\n settingsVisible,\n className,\n children,\n stickyToolbar,\n qa,\n}: ToolbarViewProps<T>) {\n const rerender = useUpdate();\n useLayoutEffect(() => {\n editor.on('rerender-toolbar', rerender);\n return () => {\n editor.off('rerender-toolbar', rerender);\n };\n }, [editor, rerender]);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isStickyActive = useSticky(wrapperRef) && stickyToolbar;\n\n const mobile = editor.mobile;\n\n return (\n <div\n data-qa={qa}\n ref={wrapperRef}\n className={stickyCn.toolbar(\n {\n withSettings: settingsVisible,\n stickyActive: isStickyActive,\n isSticky: stickyToolbar,\n },\n [className],\n )}\n >\n <FlexToolbar\n data={toolbarConfig}\n hiddenActions={hiddenActionsConfig}\n editor={toolbarEditor}\n focus={toolbarFocus}\n dotsTitle={i18n('more_action')}\n onClick={(id, attrs) => editor.emit('toolbar-action', {id, attrs, editorMode})}\n display={toolbarDisplay}\n disableTooltip={mobile}\n disableHotkey={mobile}\n disablePreview={mobile}\n />\n {children}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ToolbarView.js","sourceRoot":"../../../src","sources":["bundle/ToolbarView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,eAAe,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAC,MAAM,EAAC,4BAA0B;AAGzC,OAAO,EAAC,IAAI,EAAC,iCAAwB;AACrC,OAAO,EAAC,SAAS,EAAC,oCAAiC;AACnD,OAAO,EAAC,WAAW,EAA8D,4BAAmB;AAGpG,OAAO,EAAC,QAAQ,EAAC,0BAAiB;AAiBlC,MAAM,UAAU,WAAW,CAAI,EAC3B,MAAM,EACN,UAAU,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,QAAQ,EACR,aAAa,EACb,EAAE,GACgB;IAClB,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;IAC7B,eAAe,CAAC,GAAG,EAAE;QACjB,MAAM,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACR,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC;IAE9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE7B,OAAO,CACH,0BACa,EAAE,EACX,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,QAAQ,CAAC,OAAO,CACvB;YACI,YAAY,EAAE,eAAe;YAC7B,YAAY,EAAE,cAAc;YAC5B,QAAQ,EAAE,aAAa;SAC1B,EACD,CAAC,SAAS,CAAC,CACd,iBACY,MAAM,CAAC,cAAc,aAElC,KAAC,WAAW,IACR,IAAI,EAAE,aAAa,EACnB,aAAa,EAAE,mBAAmB,EAClC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,EAC9B,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAC,CAAC,EAC9E,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACxB,EACD,QAAQ,IACP,CACT,CAAC;AACN,CAAC","sourcesContent":["import {useLayoutEffect, useRef} from 'react';\n\nimport type {QAProps} from '@gravity-ui/uikit';\nimport {useUpdate} from 'react-use';\n\nimport {LAYOUT} from 'src/common/layout';\n\nimport type {ClassNameProps} from '../classname';\nimport {i18n} from '../i18n/menubar';\nimport {useSticky} from '../react-utils/useSticky';\nimport {FlexToolbar, type ToolbarData, type ToolbarDisplay, type ToolbarItemData} from '../toolbar';\n\nimport type {EditorInt} from './Editor';\nimport {stickyCn} from './sticky';\nimport type {MarkdownEditorMode} from './types';\n\nexport type ToolbarViewProps<T> = ClassNameProps &\n QAProps & {\n editor: EditorInt;\n editorMode: MarkdownEditorMode;\n toolbarEditor: T;\n toolbarFocus: () => void;\n toolbarConfig: ToolbarData<T>;\n settingsVisible?: boolean;\n hiddenActionsConfig?: ToolbarItemData<T>[];\n children?: React.ReactNode;\n stickyToolbar: boolean;\n toolbarDisplay?: ToolbarDisplay;\n };\n\nexport function ToolbarView<T>({\n editor,\n editorMode,\n toolbarEditor,\n toolbarFocus,\n toolbarConfig,\n toolbarDisplay,\n hiddenActionsConfig,\n settingsVisible,\n className,\n children,\n stickyToolbar,\n qa,\n}: ToolbarViewProps<T>) {\n const rerender = useUpdate();\n useLayoutEffect(() => {\n editor.on('rerender-toolbar', rerender);\n return () => {\n editor.off('rerender-toolbar', rerender);\n };\n }, [editor, rerender]);\n\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isStickyActive = useSticky(wrapperRef) && stickyToolbar;\n\n const mobile = editor.mobile;\n\n return (\n <div\n data-qa={qa}\n ref={wrapperRef}\n className={stickyCn.toolbar(\n {\n withSettings: settingsVisible,\n stickyActive: isStickyActive,\n isSticky: stickyToolbar,\n },\n [className],\n )}\n data-layout={LAYOUT.STICKY_TOOLBAR}\n >\n <FlexToolbar\n data={toolbarConfig}\n hiddenActions={hiddenActionsConfig}\n editor={toolbarEditor}\n focus={toolbarFocus}\n dotsTitle={i18n('more_action')}\n onClick={(id, attrs) => editor.emit('toolbar-action', {id, attrs, editorMode})}\n display={toolbarDisplay}\n disableTooltip={mobile}\n disableHotkey={mobile}\n disablePreview={mobile}\n />\n {children}\n </div>\n );\n}\n"]}
@@ -4,6 +4,8 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
4
4
  import { memo, useState } from 'react';
5
5
  import { Eye, Gear, LogoMarkdown } from '@gravity-ui/icons';
6
6
  import { ActionTooltip, Button, Checkbox, HelpMark, Icon, Menu, Popup, } from '@gravity-ui/uikit';
7
+ import { LAYOUT } from "../../common/layout.js";
8
+ import { getTargetZIndex } from "../../utils/get-target-z-index.js";
7
9
  import { cn } from "../../classname.js";
8
10
  import { i18n } from "../../i18n/bundle/index.js";
9
11
  import WysiwygModeIcon from "../../icons/WysiwygMode.js";
@@ -21,7 +23,7 @@ export const EditorSettings = memo(function EditorSettings(props) {
21
23
  const [chevronElement, setChevronElement] = useState(null);
22
24
  const [popupShown, , hidePopup, togglePopup] = useBooleanState(false);
23
25
  const areSettingsVisible = settingsVisible === true || (Array.isArray(settingsVisible) && settingsVisible.length > 0);
24
- return (_jsxs("div", { className: bSettings(null, [className]), children: [renderPreviewButton && (_jsxs(_Fragment, { children: [_jsx(ActionTooltip, { openDelay: ToolbarTooltipDelay.Open, closeDelay: ToolbarTooltipDelay.Close, title: i18n('preview_hint'), hotkey: "mod+shift+p", children: _jsx(Button, { qa: "g-md-markup-preview-button", size: "m", view: "flat", pin: "round-round", className: bSettings('preview-button'), onClick: () => onShowPreviewChange?.(!showPreview), selected: showPreview, children: _jsx(Icon, { data: Eye }) }) }), settingsVisible && _jsx("div", { className: bSettings('separator') })] })), areSettingsVisible && (_jsxs(_Fragment, { children: [_jsx(Button, { size: "m", view: "flat", pin: "round-round", onClick: togglePopup, ref: setChevronElement, qa: "g-md-settings-button", className: bSettings('dropdown-button'), children: _jsx(Icon, { data: Gear }) }), _jsx(Popup, { open: popupShown, anchorElement: chevronElement, placement: placement, onOpenChange: hidePopup, children: _jsx(SettingsContent, { ...props, qa: "g-md-settings-content", onClose: hidePopup, className: bSettings('content') }) })] }))] }));
26
+ return (_jsxs("div", { className: bSettings(null, [className]), children: [renderPreviewButton && (_jsxs(_Fragment, { children: [_jsx(ActionTooltip, { openDelay: ToolbarTooltipDelay.Open, closeDelay: ToolbarTooltipDelay.Close, title: i18n('preview_hint'), hotkey: "mod+shift+p", children: _jsx(Button, { qa: "g-md-markup-preview-button", size: "m", view: "flat", pin: "round-round", className: bSettings('preview-button'), onClick: () => onShowPreviewChange?.(!showPreview), selected: showPreview, children: _jsx(Icon, { data: Eye }) }) }), settingsVisible && _jsx("div", { className: bSettings('separator') })] })), areSettingsVisible && (_jsxs(_Fragment, { children: [_jsx(Button, { size: "m", view: "flat", pin: "round-round", onClick: togglePopup, ref: setChevronElement, qa: "g-md-settings-button", className: bSettings('dropdown-button'), children: _jsx(Icon, { data: Gear }) }), _jsx(Popup, { open: popupShown, anchorElement: chevronElement, placement: placement, onOpenChange: hidePopup, zIndex: getTargetZIndex(LAYOUT.STICKY_TOOLBAR), children: _jsx(SettingsContent, { ...props, qa: "g-md-settings-content", onClose: hidePopup, className: bSettings('content') }) })] }))] }));
25
27
  });
26
28
  const mdHelpPlacement = ['bottom', 'bottom-end', 'right-start', 'right', 'left'];
27
29
  const SettingsContent = function SettingsContent({ mode, onClose, onModeChange, toolbarVisibility, onToolbarVisibilityChange, onSplitModeChange, splitMode = false, splitModeEnabled, className, showPreview, settingsVisible, qa, disableMark, }) {
@@ -38,6 +40,7 @@ const SettingsContent = function SettingsContent({ mode, onClose, onModeChange,
38
40
  }, iconStart: _jsx(Icon, { data: LogoMarkdown }), children: [i18n('settings_markup'), !disableMark && (_jsx(HelpMark, { popoverProps: {
39
41
  placement: mdHelpPlacement,
40
42
  modal: false,
43
+ zIndex: getTargetZIndex(LAYOUT.STICKY_TOOLBAR),
41
44
  }, className: bContent('mode-help'), children: _jsx("div", { onClick: (e) => {
42
45
  // stop clicks propagation
43
46
  // because otherwise click in MarkdownHints handled as click on MenuItem