@atlaskit/editor-plugin-layout 10.3.3 → 10.3.5

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 (62) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/layoutPlugin.js +4 -0
  3. package/dist/cjs/pm-plugins/actions.js +102 -7
  4. package/dist/cjs/pm-plugins/column-resize-divider.js +7 -9
  5. package/dist/cjs/pm-plugins/consts.js +4 -1
  6. package/dist/cjs/pm-plugins/utils/redistribute-proportionally.js +111 -0
  7. package/dist/cjs/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +69 -0
  8. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +7 -9
  9. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +11 -10
  10. package/dist/cjs/ui/LayoutColumnMenu/components.js +21 -0
  11. package/dist/cjs/ui/LayoutColumnMenu/index.js +39 -11
  12. package/dist/cjs/ui/LayoutColumnMenu/keys.js +10 -2
  13. package/dist/cjs/ui/LayoutColumnMenu/layoutColumnSelection.js +21 -0
  14. package/dist/cjs/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +20 -0
  15. package/dist/es2019/layoutPlugin.js +5 -1
  16. package/dist/es2019/pm-plugins/actions.js +98 -1
  17. package/dist/es2019/pm-plugins/column-resize-divider.js +8 -9
  18. package/dist/es2019/pm-plugins/consts.js +3 -0
  19. package/dist/es2019/pm-plugins/utils/redistribute-proportionally.js +89 -0
  20. package/dist/es2019/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +64 -0
  21. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +6 -11
  22. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +7 -10
  23. package/dist/es2019/ui/LayoutColumnMenu/components.js +22 -1
  24. package/dist/es2019/ui/LayoutColumnMenu/index.js +34 -13
  25. package/dist/es2019/ui/LayoutColumnMenu/keys.js +12 -2
  26. package/dist/es2019/ui/LayoutColumnMenu/layoutColumnSelection.js +9 -0
  27. package/dist/es2019/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +10 -0
  28. package/dist/esm/layoutPlugin.js +5 -1
  29. package/dist/esm/pm-plugins/actions.js +101 -7
  30. package/dist/esm/pm-plugins/column-resize-divider.js +8 -9
  31. package/dist/esm/pm-plugins/consts.js +3 -0
  32. package/dist/esm/pm-plugins/utils/redistribute-proportionally.js +104 -0
  33. package/dist/esm/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +61 -0
  34. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +8 -10
  35. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +9 -9
  36. package/dist/esm/ui/LayoutColumnMenu/components.js +22 -1
  37. package/dist/esm/ui/LayoutColumnMenu/index.js +40 -13
  38. package/dist/esm/ui/LayoutColumnMenu/keys.js +9 -1
  39. package/dist/esm/ui/LayoutColumnMenu/layoutColumnSelection.js +15 -0
  40. package/dist/esm/ui/LayoutColumnMenu/useCurrentLayoutColumn.js +14 -0
  41. package/dist/types/layoutPluginType.d.ts +3 -2
  42. package/dist/types/pm-plugins/actions.d.ts +6 -0
  43. package/dist/types/pm-plugins/consts.d.ts +3 -0
  44. package/dist/types/pm-plugins/utils/redistribute-proportionally.d.ts +1 -0
  45. package/dist/types/ui/LayoutColumnMenu/InsertColumnDropdownItem.d.ts +10 -0
  46. package/dist/types/ui/LayoutColumnMenu/keys.d.ts +2 -0
  47. package/dist/types/ui/LayoutColumnMenu/layoutColumnSelection.d.ts +7 -0
  48. package/dist/types/ui/LayoutColumnMenu/useCurrentLayoutColumn.d.ts +5 -0
  49. package/dist/types-ts4.5/layoutPluginType.d.ts +3 -2
  50. package/dist/types-ts4.5/pm-plugins/actions.d.ts +6 -0
  51. package/dist/types-ts4.5/pm-plugins/consts.d.ts +3 -0
  52. package/dist/types-ts4.5/pm-plugins/utils/redistribute-proportionally.d.ts +1 -0
  53. package/dist/types-ts4.5/ui/LayoutColumnMenu/InsertColumnDropdownItem.d.ts +10 -0
  54. package/dist/types-ts4.5/ui/LayoutColumnMenu/keys.d.ts +2 -0
  55. package/dist/types-ts4.5/ui/LayoutColumnMenu/layoutColumnSelection.d.ts +7 -0
  56. package/dist/types-ts4.5/ui/LayoutColumnMenu/useCurrentLayoutColumn.d.ts +5 -0
  57. package/package.json +5 -5
  58. package/dist/cjs/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.js +0 -22
  59. package/dist/es2019/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.js +0 -14
  60. package/dist/esm/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.js +0 -16
  61. package/dist/types/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.d.ts +0 -11
  62. package/dist/types-ts4.5/ui/LayoutColumnMenu/useCurrentLayoutColumnValign.d.ts +0 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @atlaskit/editor-plugin-layout
2
2
 
3
+ ## 10.3.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [`626fb6e8ce019`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/626fb6e8ce019) -
8
+ Wire layout column menu insert actions with proportional width redistribution.
9
+ - Updated dependencies
10
+
11
+ ## 10.3.4
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies
16
+
3
17
  ## 10.3.3
4
18
 
5
19
  ### Patch Changes
@@ -309,6 +309,10 @@ var layoutPlugin = exports.layoutPlugin = function layoutPlugin(_ref) {
309
309
  return _pluginKey.pluginKey.getState(editorState);
310
310
  },
311
311
  commands: {
312
+ insertLayoutColumn: function insertLayoutColumn(side) {
313
+ var _api$analytics4;
314
+ return (0, _actions.insertLayoutColumn)(side, api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions);
315
+ },
312
316
  setLayoutColumnValign: _actions.setLayoutColumnValign,
313
317
  toggleLayoutColumnMenu: _actions.toggleLayoutColumnMenu
314
318
  }
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.fixColumnStructure = exports.fixColumnSizes = exports.deleteActiveLayoutNode = exports.createMultiColumnLayoutSection = exports.createDefaultLayoutSection = exports.TWO_COL_LAYOUTS = exports.THREE_COL_LAYOUTS = exports.ONE_COL_LAYOUTS = void 0;
8
8
  exports.forceSectionToPresetLayout = forceSectionToPresetLayout;
9
- exports.toggleLayoutColumnMenu = exports.setPresetLayout = exports.setLayoutColumnValign = exports.insertLayoutColumnsWithAnalytics = exports.insertLayoutColumns = exports.getSelectedLayout = exports.getPresetLayout = void 0;
9
+ exports.getEffectiveMaxLayoutColumns = getEffectiveMaxLayoutColumns;
10
+ exports.toggleLayoutColumnMenu = exports.setPresetLayout = exports.setLayoutColumnValign = exports.insertLayoutColumnsWithAnalytics = exports.insertLayoutColumns = exports.insertLayoutColumn = exports.getSelectedLayout = exports.getPresetLayout = void 0;
10
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
12
  var _analytics = require("@atlaskit/editor-common/analytics");
12
13
  var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
@@ -19,6 +20,7 @@ var _expValEqualsNoExposure = require("@atlaskit/tmp-editor-statsig/exp-val-equa
19
20
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
20
21
  var _consts = require("./consts");
21
22
  var _pluginKey = require("./plugin-key");
23
+ var _redistributeProportionally = require("./utils/redistribute-proportionally");
22
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
25
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
26
  var ONE_COL_LAYOUTS = exports.ONE_COL_LAYOUTS = ['single'];
@@ -549,9 +551,102 @@ var formatLayoutName = function formatLayoutName(layout) {
549
551
  return _analytics.LAYOUT_TYPE.THREE_WITH_SIDEBARS;
550
552
  }
551
553
  };
554
+ /**
555
+ * Returns the active maximum layout column count for the current advanced layouts experiment state.
556
+ */
557
+ function getEffectiveMaxLayoutColumns() {
558
+ return (0, _experiments.editorExperiment)('advanced_layouts', true) ? _consts.MAX_LAYOUT_COLUMNS : _consts.MAX_STANDARD_LAYOUT_COLUMNS;
559
+ }
560
+ var getSelectedLayoutColumnInSection = function getSelectedLayoutColumnInSection(_ref4) {
561
+ var doc = _ref4.doc,
562
+ selection = _ref4.selection;
563
+ var _doc$type$schema$node = doc.type.schema.nodes,
564
+ layoutColumn = _doc$type$schema$node.layoutColumn,
565
+ layoutSection = _doc$type$schema$node.layoutSection;
566
+ if (!(selection instanceof _state.NodeSelection) || selection.node.type !== layoutColumn) {
567
+ return;
568
+ }
569
+ var $from = selection.$from;
570
+ if ($from.parent.type !== layoutSection) {
571
+ return;
572
+ }
573
+ var selectedColumnIndex = $from.index($from.depth);
574
+ var selectedColumnNode = selection.node;
575
+ var selectedColumnPos = selection.from;
576
+ var layoutSectionPos = $from.before($from.depth);
577
+ return {
578
+ layoutSectionNode: $from.parent,
579
+ layoutSectionPos: layoutSectionPos,
580
+ selectedColumnIndex: selectedColumnIndex,
581
+ selectedColumnNode: selectedColumnNode,
582
+ selectedColumnPos: selectedColumnPos
583
+ };
584
+ };
585
+ var insertLayoutColumnAt = function insertLayoutColumnAt(side, editorAnalyticsAPI) {
586
+ return function (_ref5) {
587
+ var tr = _ref5.tr;
588
+ if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
589
+ return null;
590
+ }
591
+ var selectedColumn = getSelectedLayoutColumnInSection(tr);
592
+ if (!selectedColumn) {
593
+ return null;
594
+ }
595
+ var layoutSectionNode = selectedColumn.layoutSectionNode,
596
+ layoutSectionPos = selectedColumn.layoutSectionPos,
597
+ selectedColumnIndex = selectedColumn.selectedColumnIndex;
598
+ if (layoutSectionNode.childCount >= getEffectiveMaxLayoutColumns()) {
599
+ return null;
600
+ }
601
+ var insertIndex = side === 'left' ? selectedColumnIndex : selectedColumnIndex + 1;
602
+ var existingWidths = (0, _utils.mapChildren)(layoutSectionNode, function (column) {
603
+ return column.attrs.width;
604
+ });
605
+ var redistributedWidths = (0, _redistributeProportionally.redistributeProportionally)(existingWidths, insertIndex, getEffectiveMaxLayoutColumns(), _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT);
606
+ if (redistributedWidths === existingWidths) {
607
+ return null;
608
+ }
609
+ var layoutColumn = tr.doc.type.schema.nodes.layoutColumn;
610
+ var newColumn = layoutColumn.createAndFill({
611
+ width: redistributedWidths[insertIndex]
612
+ });
613
+ if (!newColumn) {
614
+ return null;
615
+ }
616
+ var updatedColumns = [];
617
+ layoutSectionNode.forEach(function (column, _offset, index) {
618
+ if (index === insertIndex) {
619
+ updatedColumns.push(newColumn);
620
+ }
621
+ updatedColumns.push(column);
622
+ });
623
+ if (insertIndex === layoutSectionNode.childCount) {
624
+ updatedColumns.push(newColumn);
625
+ }
626
+ var updatedLayoutSectionNode = layoutSectionNode.copy(_model.Fragment.fromArray(updatedColumns));
627
+ tr.replaceWith(layoutSectionPos + 1, layoutSectionPos + layoutSectionNode.nodeSize - 1, columnWidth(updatedLayoutSectionNode, tr.doc.type.schema, redistributedWidths));
628
+ editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
629
+ action: _analytics.ACTION.INSERTED,
630
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
631
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.LAYOUT_COLUMN,
632
+ attributes: {
633
+ columnCount: redistributedWidths.length,
634
+ inputMethod: _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU,
635
+ selectedIndex: selectedColumnIndex,
636
+ side: side
637
+ },
638
+ eventType: _analytics.EVENT_TYPE.TRACK
639
+ })(tr);
640
+ tr.setMeta('scrollIntoView', false);
641
+ return tr;
642
+ };
643
+ };
644
+ var insertLayoutColumn = exports.insertLayoutColumn = function insertLayoutColumn(side, editorAnalyticsAPI) {
645
+ return insertLayoutColumnAt(side, editorAnalyticsAPI);
646
+ };
552
647
  var setLayoutColumnValign = exports.setLayoutColumnValign = function setLayoutColumnValign(valign) {
553
- return function (_ref4) {
554
- var tr = _ref4.tr;
648
+ return function (_ref6) {
649
+ var tr = _ref6.tr;
555
650
  if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
556
651
  return null;
557
652
  }
@@ -573,10 +668,10 @@ var setLayoutColumnValign = exports.setLayoutColumnValign = function setLayoutCo
573
668
  return tr;
574
669
  };
575
670
  };
576
- var toggleLayoutColumnMenu = exports.toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref5) {
577
- var isOpen = _ref5.isOpen;
578
- return function (_ref6) {
579
- var tr = _ref6.tr;
671
+ var toggleLayoutColumnMenu = exports.toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref7) {
672
+ var isOpen = _ref7.isOpen;
673
+ return function (_ref8) {
674
+ var tr = _ref8.tr;
580
675
  tr.setMeta('toggleLayoutColumnMenu', {
581
676
  isOpen: isOpen
582
677
  });
@@ -9,6 +9,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
9
9
  var _bindEventListener = require("bind-event-listener");
10
10
  var _model = require("@atlaskit/editor-prosemirror/model");
11
11
  var _view = require("@atlaskit/editor-prosemirror/view");
12
+ var _consts = require("./consts");
12
13
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
14
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
15
  // Class names for the column resize divider widget — must stay in sync with layout.ts in editor-core
@@ -16,9 +17,6 @@ var layoutColumnDividerClassName = 'layout-column-divider';
16
17
  var layoutColumnDividerRailClassName = 'layout-column-divider-rail';
17
18
  var layoutColumnDividerThumbClassName = 'layout-column-divider-thumb';
18
19
 
19
- // Minimum column width percentage to prevent columns from collapsing
20
- var MIN_COLUMN_WIDTH_PERCENT = 5;
21
-
22
20
  // Module-level drag state so it survives widget DOM recreation during transactions.
23
21
  var dragState = null;
24
22
 
@@ -79,12 +77,12 @@ var calcDragWidths = function calcDragWidths(clientX) {
79
77
  var deltaPercent = deltaX / columnsWidth * 100;
80
78
  var leftWidth = dragState.startLeftWidth + deltaPercent;
81
79
  var rightWidth = dragState.startRightWidth - deltaPercent;
82
- if (leftWidth < MIN_COLUMN_WIDTH_PERCENT) {
83
- leftWidth = MIN_COLUMN_WIDTH_PERCENT;
84
- rightWidth = combinedWidth - MIN_COLUMN_WIDTH_PERCENT;
85
- } else if (rightWidth < MIN_COLUMN_WIDTH_PERCENT) {
86
- rightWidth = MIN_COLUMN_WIDTH_PERCENT;
87
- leftWidth = combinedWidth - MIN_COLUMN_WIDTH_PERCENT;
80
+ if (leftWidth < _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT) {
81
+ leftWidth = _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
82
+ rightWidth = combinedWidth - _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
83
+ } else if (rightWidth < _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT) {
84
+ rightWidth = _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
85
+ leftWidth = combinedWidth - _consts.MIN_LAYOUT_COLUMN_WIDTH_PERCENT;
88
86
  }
89
87
  return {
90
88
  leftWidth: leftWidth,
@@ -3,7 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.EVEN_DISTRIBUTED_COL_WIDTHS = void 0;
6
+ exports.MIN_LAYOUT_COLUMN_WIDTH_PERCENT = exports.MAX_STANDARD_LAYOUT_COLUMNS = exports.MAX_LAYOUT_COLUMNS = exports.EVEN_DISTRIBUTED_COL_WIDTHS = void 0;
7
+ var MAX_STANDARD_LAYOUT_COLUMNS = exports.MAX_STANDARD_LAYOUT_COLUMNS = 3;
8
+ var MAX_LAYOUT_COLUMNS = exports.MAX_LAYOUT_COLUMNS = 5;
9
+ var MIN_LAYOUT_COLUMN_WIDTH_PERCENT = exports.MIN_LAYOUT_COLUMN_WIDTH_PERCENT = 5;
7
10
  var EVEN_DISTRIBUTED_COL_WIDTHS = exports.EVEN_DISTRIBUTED_COL_WIDTHS = {
8
11
  1: 100,
9
12
  2: 50,
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.redistributeProportionally = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var roundLayoutColumnWidth = function roundLayoutColumnWidth(width) {
10
+ return Number(width.toFixed(2));
11
+ };
12
+ var sumWidths = function sumWidths(widths) {
13
+ return widths.reduce(function (sum, width) {
14
+ return sum + width;
15
+ }, 0);
16
+ };
17
+ var isValidWidth = function isValidWidth(width) {
18
+ return Number.isFinite(width) && width > 0;
19
+ };
20
+ var normaliseWidthsTotal = function normaliseWidthsTotal(widths, totalWidth, minWidth) {
21
+ var roundedWidths = widths.map(roundLayoutColumnWidth);
22
+ var remainder = roundLayoutColumnWidth(totalWidth - sumWidths(roundedWidths));
23
+ if (remainder === 0 || roundedWidths.length === 0) {
24
+ return roundedWidths;
25
+ }
26
+ var adjustmentIndex = 0;
27
+ roundedWidths.forEach(function (width, index) {
28
+ if (width > roundedWidths[adjustmentIndex]) {
29
+ adjustmentIndex = index;
30
+ }
31
+ });
32
+ var adjustedWidth = roundLayoutColumnWidth(roundedWidths[adjustmentIndex] + remainder);
33
+ if (adjustedWidth < minWidth) {
34
+ return roundedWidths;
35
+ }
36
+ return roundedWidths.map(function (width, index) {
37
+ return index === adjustmentIndex ? adjustedWidth : width;
38
+ });
39
+ };
40
+ var redistributeWithMinimumWidth = function redistributeWithMinimumWidth(_ref) {
41
+ var minWidth = _ref.minWidth,
42
+ totalWidth = _ref.totalWidth,
43
+ weights = _ref.weights;
44
+ if (weights.length * minWidth > totalWidth) {
45
+ return;
46
+ }
47
+ var widths = Array(weights.length).fill(0);
48
+ var clampedIndexes = new Set();
49
+ var remainingWidth = totalWidth;
50
+ var remainingWeight = sumWidths(weights);
51
+ var _loop = function _loop() {
52
+ var remainingWidthForPass = remainingWidth;
53
+ var remainingWeightForPass = remainingWeight;
54
+ var indexesToClamp = [];
55
+ weights.forEach(function (weight, index) {
56
+ if (clampedIndexes.has(index)) {
57
+ return;
58
+ }
59
+ var proportionalWidth = remainingWeightForPass > 0 ? weight / remainingWeightForPass * remainingWidthForPass : 0;
60
+ if (proportionalWidth < minWidth) {
61
+ indexesToClamp.push(index);
62
+ }
63
+ });
64
+ if (indexesToClamp.length === 0) {
65
+ return 1; // break
66
+ }
67
+ indexesToClamp.forEach(function (index) {
68
+ widths[index] = minWidth;
69
+ clampedIndexes.add(index);
70
+ remainingWidth -= minWidth;
71
+ remainingWeight -= weights[index];
72
+ });
73
+ };
74
+ while (clampedIndexes.size < weights.length) {
75
+ if (_loop()) break;
76
+ }
77
+ weights.forEach(function (weight, index) {
78
+ if (!clampedIndexes.has(index)) {
79
+ widths[index] = remainingWeight > 0 ? weight / remainingWeight * remainingWidth : minWidth;
80
+ }
81
+ });
82
+ return widths;
83
+ };
84
+ var redistributeProportionally = exports.redistributeProportionally = function redistributeProportionally(currentWidths, insertIndex, maxColumns, minWidth) {
85
+ if (currentWidths.length === 0 || !Number.isInteger(maxColumns) || maxColumns <= 0 || currentWidths.length >= maxColumns || insertIndex < 0 || insertIndex > currentWidths.length || !isValidWidth(minWidth) || currentWidths.some(function (width) {
86
+ return !isValidWidth(width);
87
+ })) {
88
+ return currentWidths;
89
+ }
90
+ var currentTotalWidth = sumWidths(currentWidths);
91
+ if (!isValidWidth(currentTotalWidth)) {
92
+ return currentWidths;
93
+ }
94
+ var targetTotalWidth = Math.round(currentTotalWidth) === 100 ? 100 : currentTotalWidth;
95
+ var newColumnWidth = Math.max(minWidth, roundLayoutColumnWidth(targetTotalWidth / (currentWidths.length + 1)));
96
+ var existingColumnsTotalWidth = targetTotalWidth - newColumnWidth;
97
+ if (existingColumnsTotalWidth < currentWidths.length * minWidth) {
98
+ return currentWidths;
99
+ }
100
+ var redistributedExistingWidths = redistributeWithMinimumWidth({
101
+ weights: currentWidths,
102
+ totalWidth: existingColumnsTotalWidth,
103
+ minWidth: minWidth
104
+ });
105
+ if (!redistributedExistingWidths) {
106
+ return currentWidths;
107
+ }
108
+ var nextWidths = (0, _toConsumableArray2.default)(redistributedExistingWidths);
109
+ nextWidths.splice(insertIndex, 0, newColumnWidth);
110
+ return normaliseWidthsTotal(nextWidths, targetTotalWidth, minWidth);
111
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.InsertColumnDropdownItem = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactIntl = require("react-intl");
10
+ var _messages = require("@atlaskit/editor-common/messages");
11
+ var _editorToolbar = require("@atlaskit/editor-toolbar");
12
+ var _actions = require("../../pm-plugins/actions");
13
+ var _layoutColumnSelection = require("./layoutColumnSelection");
14
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
16
+ var INSERT_COLUMN_OPTIONS = {
17
+ left: {
18
+ Icon: _editorToolbar.TableColumnAddLeftIcon,
19
+ label: _messages.layoutMessages.insertColumnLeft,
20
+ side: 'left'
21
+ },
22
+ right: {
23
+ Icon: _editorToolbar.TableColumnAddRightIcon,
24
+ label: _messages.layoutMessages.insertColumnRight,
25
+ side: 'right'
26
+ }
27
+ };
28
+ var InsertColumnDropdownItem = exports.InsertColumnDropdownItem = function InsertColumnDropdownItem(_ref) {
29
+ var api = _ref.api,
30
+ side = _ref.side;
31
+ var _useIntl = (0, _reactIntl.useIntl)(),
32
+ formatMessage = _useIntl.formatMessage;
33
+ var _INSERT_COLUMN_OPTION = INSERT_COLUMN_OPTIONS[side],
34
+ Icon = _INSERT_COLUMN_OPTION.Icon,
35
+ label = _INSERT_COLUMN_OPTION.label;
36
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
37
+ var currentLayoutSection = (0, _useCurrentLayoutColumn.useCurrentLayoutSection)(api);
38
+ var columnCount = (0, _layoutColumnSelection.getLayoutSectionColumnCount)(currentLayoutSection);
39
+ var maxColumnCount = (0, _actions.getEffectiveMaxLayoutColumns)();
40
+ var canInsertColumn = currentColumn !== undefined && columnCount < maxColumnCount;
41
+ var onClick = (0, _react.useCallback)(function () {
42
+ var _api$layout, _api$core;
43
+ var insertCommand = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.insertLayoutColumn(side);
44
+ api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (props) {
45
+ var _api$layout2;
46
+ var tr = insertCommand === null || insertCommand === void 0 ? void 0 : insertCommand(props);
47
+ if (!tr) {
48
+ return tr !== null && tr !== void 0 ? tr : null;
49
+ }
50
+ api === null || api === void 0 || (_api$layout2 = api.layout) === null || _api$layout2 === void 0 || _api$layout2.commands.toggleLayoutColumnMenu({
51
+ isOpen: false
52
+ })({
53
+ tr: tr
54
+ });
55
+ return tr;
56
+ });
57
+ }, [api, side]);
58
+ if (!canInsertColumn) {
59
+ return null;
60
+ }
61
+ return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
62
+ elemBefore: /*#__PURE__*/_react.default.createElement(Icon, {
63
+ color: "currentColor",
64
+ label: "",
65
+ size: "small"
66
+ }),
67
+ onClick: onClick
68
+ }, formatMessage(label));
69
+ };
@@ -8,7 +8,8 @@ exports.VerticalAlignDropdownItem = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactIntl = require("react-intl");
10
10
  var _editorToolbar = require("@atlaskit/editor-toolbar");
11
- var _useCurrentLayoutColumnValign = require("./useCurrentLayoutColumnValign");
11
+ var _layoutColumnSelection = require("./layoutColumnSelection");
12
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
12
13
  var _verticalAlignIcons = require("./verticalAlignIcons");
13
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
15
  var VerticalAlignDropdownItem = exports.VerticalAlignDropdownItem = function VerticalAlignDropdownItem(_ref) {
@@ -17,24 +18,21 @@ var VerticalAlignDropdownItem = exports.VerticalAlignDropdownItem = function Ver
17
18
  value = _ref.value;
18
19
  var _useIntl = (0, _reactIntl.useIntl)(),
19
20
  formatMessage = _useIntl.formatMessage;
20
- var _useCurrentLayoutColu = (0, _useCurrentLayoutColumnValign.useCurrentLayoutColumnValign)(api),
21
- currentValign = _useCurrentLayoutColu.currentValign,
22
- selectedColumn = _useCurrentLayoutColu.selectedColumn;
21
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
22
+ var currentValign = (0, _react.useMemo)(function () {
23
+ return (0, _layoutColumnSelection.getLayoutColumnValign)(currentColumn);
24
+ }, [currentColumn]);
23
25
  var Icon = _verticalAlignIcons.VERTICAL_ALIGN_ICONS[value];
24
26
  var onClick = (0, _react.useCallback)(function () {
25
27
  var _api$core, _api$layout;
26
28
  api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.setLayoutColumnValign(value));
27
29
  }, [api, value]);
28
- if (!selectedColumn) {
29
- return null;
30
- }
31
30
  return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
32
31
  elemBefore: /*#__PURE__*/_react.default.createElement(Icon, {
33
32
  label: "",
34
33
  size: "small"
35
34
  }),
36
35
  isSelected: currentValign === value,
37
- onClick: onClick,
38
- testId: "layout-column-align-".concat(value)
36
+ onClick: onClick
39
37
  }, formatMessage(label));
40
38
  };
@@ -1,26 +1,29 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.VerticalAlignNestedMenu = void 0;
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactIntl = require("react-intl");
10
10
  var _messages = require("@atlaskit/editor-common/messages");
11
11
  var _editorToolbar = require("@atlaskit/editor-toolbar");
12
- var _useCurrentLayoutColumnValign = require("./useCurrentLayoutColumnValign");
12
+ var _layoutColumnSelection = require("./layoutColumnSelection");
13
+ var _useCurrentLayoutColumn = require("./useCurrentLayoutColumn");
13
14
  var _verticalAlignIcons = require("./verticalAlignIcons");
15
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
16
  var VerticalAlignNestedMenu = exports.VerticalAlignNestedMenu = function VerticalAlignNestedMenu(_ref) {
15
17
  var api = _ref.api,
16
18
  children = _ref.children;
17
19
  var _useIntl = (0, _reactIntl.useIntl)(),
18
20
  formatMessage = _useIntl.formatMessage;
19
- var _useCurrentLayoutColu = (0, _useCurrentLayoutColumnValign.useCurrentLayoutColumnValign)(api),
20
- currentValign = _useCurrentLayoutColu.currentValign,
21
- selectedColumn = _useCurrentLayoutColu.selectedColumn;
21
+ var currentColumn = (0, _useCurrentLayoutColumn.useCurrentLayoutColumn)(api);
22
+ var currentValign = (0, _react.useMemo)(function () {
23
+ return (0, _layoutColumnSelection.getLayoutColumnValign)(currentColumn);
24
+ }, [currentColumn]);
22
25
  var TriggerIcon = currentValign ? _verticalAlignIcons.VERTICAL_ALIGN_ICONS[currentValign] : _editorToolbar.LayoutIcon;
23
- if (!selectedColumn) {
26
+ if (!currentColumn) {
24
27
  return null;
25
28
  }
26
29
  return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarNestedDropdownMenu, {
@@ -32,8 +35,6 @@ var VerticalAlignNestedMenu = exports.VerticalAlignNestedMenu = function Vertica
32
35
  label: "",
33
36
  size: "small"
34
37
  }),
35
- text: formatMessage(_messages.layoutMessages.alignColumn),
36
- testId: "layout-column-align-menu",
37
- dropdownTestId: "layout-column-align-dropdown"
38
+ text: formatMessage(_messages.layoutMessages.alignColumn)
38
39
  }, children);
39
40
  };
@@ -11,6 +11,7 @@ var _messages = require("@atlaskit/editor-common/messages");
11
11
  var _editorToolbar = require("@atlaskit/editor-toolbar");
12
12
  var _toolbarMenuContainer = require("@atlaskit/editor-toolbar/toolbar-menu-container");
13
13
  var _DistributeColumnsDropdownItem = require("./DistributeColumnsDropdownItem");
14
+ var _InsertColumnDropdownItem = require("./InsertColumnDropdownItem");
14
15
  var _keys = require("./keys");
15
16
  var _VerticalAlignDropdownItem = require("./VerticalAlignDropdownItem");
16
17
  var _VerticalAlignNestedMenu = require("./VerticalAlignNestedMenu");
@@ -30,6 +31,26 @@ var getLayoutColumnMenuComponents = exports.getLayoutColumnMenuComponents = func
30
31
  parents: [_objectSpread(_objectSpread({}, _keys.LAYOUT_COLUMN_MENU), {}, {
31
32
  rank: _keys.LAYOUT_COLUMN_MENU_RANK[_keys.LAYOUT_COLUMN_MENU_SECTION.key]
32
33
  })]
34
+ }), _objectSpread(_objectSpread({}, _keys.INSERT_COLUMN_LEFT_MENU_ITEM), {}, {
35
+ component: function component() {
36
+ return /*#__PURE__*/_react.default.createElement(_InsertColumnDropdownItem.InsertColumnDropdownItem, {
37
+ api: api,
38
+ side: "left"
39
+ });
40
+ },
41
+ parents: [_objectSpread(_objectSpread({}, _keys.LAYOUT_COLUMN_MENU_SECTION), {}, {
42
+ rank: _keys.LAYOUT_COLUMN_MENU_SECTION_RANK[_keys.INSERT_COLUMN_LEFT_MENU_ITEM.key]
43
+ })]
44
+ }), _objectSpread(_objectSpread({}, _keys.INSERT_COLUMN_RIGHT_MENU_ITEM), {}, {
45
+ component: function component() {
46
+ return /*#__PURE__*/_react.default.createElement(_InsertColumnDropdownItem.InsertColumnDropdownItem, {
47
+ api: api,
48
+ side: "right"
49
+ });
50
+ },
51
+ parents: [_objectSpread(_objectSpread({}, _keys.LAYOUT_COLUMN_MENU_SECTION), {}, {
52
+ rank: _keys.LAYOUT_COLUMN_MENU_SECTION_RANK[_keys.INSERT_COLUMN_RIGHT_MENU_ITEM.key]
53
+ })]
33
54
  }), _objectSpread(_objectSpread({}, _keys.DISTRIBUTE_COLUMNS_MENU_ITEM), {}, {
34
55
  component: (0, _DistributeColumnsDropdownItem.createDistributeColumnsDropdownItem)(api),
35
56
  parents: [_objectSpread(_objectSpread({}, _keys.LAYOUT_COLUMN_MENU_SECTION), {}, {
@@ -1,33 +1,43 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.LayoutColumnMenu = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
8
10
  var _react = _interopRequireWildcard(require("react"));
9
11
  var _hooks = require("@atlaskit/editor-common/hooks");
12
+ var _styles = require("@atlaskit/editor-common/styles");
10
13
  var _toolbar = require("@atlaskit/editor-common/toolbar");
11
14
  var _ui = require("@atlaskit/editor-common/ui");
12
15
  var _uiReact = require("@atlaskit/editor-common/ui-react");
13
- var _utils = require("@atlaskit/editor-prosemirror/utils");
14
16
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
15
17
  var _editorToolbar = require("@atlaskit/editor-toolbar");
16
18
  var _editorUiControlModel = require("@atlaskit/editor-ui-control-model");
17
19
  var _components = require("./components");
18
20
  var _keys = require("./keys");
21
+ var _layoutColumnSelection = require("./layoutColumnSelection");
19
22
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
20
23
  var PopupWithListeners = (0, _uiReact.withReactEditorViewOuterListeners)(_ui.Popup);
21
- var LAYOUT_COLUMN_MENU_POPUP_OFFSET = [0, 10];
22
- var getLayoutColumnMenuTarget = function getLayoutColumnMenuTarget(editorView, selectionAnchorPos) {
23
- if (selectionAnchorPos === undefined) {
24
+ var FALLBACK_MENU_HEIGHT = 300;
25
+ var LAYOUT_COLUMN_MENU_POPUP_OFFSET = [0, 4];
26
+
27
+ /**
28
+ * Returns the drag handle button for the selected layout column.
29
+ */
30
+ var getLayoutColumnMenuTarget = function getLayoutColumnMenuTarget(editorView, selection) {
31
+ var _columnDomRef$parentE;
32
+ if (!(0, _layoutColumnSelection.getLayoutColumnAtSelection)(selection) || (selection === null || selection === void 0 ? void 0 : selection.from) === undefined) {
24
33
  return null;
25
34
  }
26
- var selectionNode = editorView.state.doc.nodeAt(selectionAnchorPos);
27
- if ((selectionNode === null || selectionNode === void 0 ? void 0 : selectionNode.type.name) !== 'layoutColumn') {
35
+ var columnDomRef = editorView.nodeDOM(selection.from);
36
+ if (!(columnDomRef instanceof HTMLElement)) {
28
37
  return null;
29
38
  }
30
- return (0, _utils.findDomRefAtPos)(selectionAnchorPos, editorView.domAtPos.bind(editorView));
39
+ var dragHandleContainer = (_columnDomRef$parentE = columnDomRef.parentElement) === null || _columnDomRef$parentE === void 0 ? void 0 : _columnDomRef$parentE.querySelector(':scope > [data-blocks-drag-handle-container]');
40
+ return dragHandleContainer === null || dragHandleContainer === void 0 ? void 0 : dragHandleContainer.querySelector(_styles.DRAG_HANDLE_SELECTOR);
31
41
  };
32
42
  var LayoutColumnMenu = exports.LayoutColumnMenu = /*#__PURE__*/_react.default.memo(function LayoutColumnMenu(_ref) {
33
43
  var _api$uiControlRegistr, _api$uiControlRegistr2;
@@ -47,6 +57,18 @@ var LayoutColumnMenu = exports.LayoutColumnMenu = /*#__PURE__*/_react.default.me
47
57
  selection = _useSharedPluginState.selection;
48
58
  var setOutsideClickTargetRef = (0, _react.useContext)(_uiReact.OutsideClickTargetRefContext);
49
59
  var menuRef = (0, _react.useRef)(null);
60
+ var popupRef = (0, _react.useRef)(undefined);
61
+ var _React$useState = _react.default.useState(FALLBACK_MENU_HEIGHT),
62
+ _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
63
+ menuHeight = _React$useState2[0],
64
+ setMenuHeight = _React$useState2[1];
65
+ (0, _react.useLayoutEffect)(function () {
66
+ var _popupRef$current;
67
+ if (!isLayoutColumnMenuOpen) {
68
+ return;
69
+ }
70
+ setMenuHeight(((_popupRef$current = popupRef.current) === null || _popupRef$current === void 0 ? void 0 : _popupRef$current.clientHeight) || FALLBACK_MENU_HEIGHT);
71
+ }, [isLayoutColumnMenuOpen]);
50
72
  var closeLayoutColumnMenu = (0, _react.useCallback)(function () {
51
73
  var _api$core, _api$layout;
52
74
  api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.toggleLayoutColumnMenu({
@@ -71,9 +93,14 @@ var LayoutColumnMenu = exports.LayoutColumnMenu = /*#__PURE__*/_react.default.me
71
93
  var handleMenuRef = (0, _react.useCallback)(function (el) {
72
94
  setOutsideClickTargetRef === null || setOutsideClickTargetRef === void 0 || setOutsideClickTargetRef(el);
73
95
  menuRef.current = el;
96
+ if (el) {
97
+ popupRef.current = el;
98
+ }
74
99
  }, [setOutsideClickTargetRef]);
75
100
  var components = (_api$uiControlRegistr = api === null || api === void 0 || (_api$uiControlRegistr2 = api.uiControlRegistry) === null || _api$uiControlRegistr2 === void 0 ? void 0 : _api$uiControlRegistr2.actions.getComponents(_keys.LAYOUT_COLUMN_MENU.key)) !== null && _api$uiControlRegistr !== void 0 ? _api$uiControlRegistr : [];
76
- var target = isLayoutColumnMenuOpen ? getLayoutColumnMenuTarget(editorView, selection === null || selection === void 0 ? void 0 : selection.from) : null;
101
+ var target = (0, _react.useMemo)(function () {
102
+ return isLayoutColumnMenuOpen ? getLayoutColumnMenuTarget(editorView, selection) : null;
103
+ }, [editorView, isLayoutColumnMenuOpen, selection]);
77
104
  var hasValidTarget = target instanceof HTMLElement;
78
105
  (0, _react.useEffect)(function () {
79
106
  if (isLayoutColumnMenuOpen && (!hasValidTarget || components.length === 0)) {
@@ -88,10 +115,11 @@ var LayoutColumnMenu = exports.LayoutColumnMenu = /*#__PURE__*/_react.default.me
88
115
  mountTo: mountTo,
89
116
  boundariesElement: boundariesElement,
90
117
  scrollableElement: scrollableElement,
91
- zIndex: _editorSharedStyles.akEditorFloatingPanelZIndex,
118
+ zIndex: _editorSharedStyles.akEditorFloatingOverlapPanelZIndex,
92
119
  alignX: "center",
93
- alignY: "top",
94
- forcePlacement: true,
120
+ fitHeight: menuHeight,
121
+ preventOverflow: true,
122
+ stick: true,
95
123
  offset: LAYOUT_COLUMN_MENU_POPUP_OFFSET,
96
124
  handleClickOutside: handleClickOutside,
97
125
  handleEscapeKeydown: closeLayoutColumnMenu