@atlaskit/editor-plugin-layout 10.8.1 → 10.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/layoutPlugin.js +2 -5
  3. package/dist/cjs/pm-plugins/actions.js +71 -67
  4. package/dist/cjs/pm-plugins/utils/layout-column-selection.js +56 -98
  5. package/dist/cjs/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +1 -1
  6. package/dist/cjs/ui/LayoutColumnMenu/DistributeColumnsDropdownItem.js +10 -5
  7. package/dist/cjs/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +2 -2
  8. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +1 -1
  9. package/dist/cjs/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +1 -1
  10. package/dist/cjs/ui/LayoutColumnMenu/index.js +1 -1
  11. package/dist/cjs/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +4 -3
  12. package/dist/cjs/ui/toolbar.js +70 -11
  13. package/dist/es2019/layoutPlugin.js +3 -6
  14. package/dist/es2019/pm-plugins/actions.js +50 -51
  15. package/dist/es2019/pm-plugins/utils/layout-column-selection.js +54 -94
  16. package/dist/es2019/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +1 -1
  17. package/dist/es2019/ui/LayoutColumnMenu/DistributeColumnsDropdownItem.js +11 -5
  18. package/dist/es2019/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +2 -2
  19. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +1 -1
  20. package/dist/es2019/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +1 -1
  21. package/dist/es2019/ui/LayoutColumnMenu/index.js +1 -1
  22. package/dist/es2019/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +6 -4
  23. package/dist/es2019/ui/toolbar.js +68 -11
  24. package/dist/esm/layoutPlugin.js +3 -6
  25. package/dist/esm/pm-plugins/actions.js +71 -67
  26. package/dist/esm/pm-plugins/utils/layout-column-selection.js +55 -97
  27. package/dist/esm/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +1 -1
  28. package/dist/esm/ui/LayoutColumnMenu/DistributeColumnsDropdownItem.js +10 -5
  29. package/dist/esm/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +2 -2
  30. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignDropdownItem.js +1 -1
  31. package/dist/esm/ui/LayoutColumnMenu/VerticalAlignNestedMenu.js +1 -1
  32. package/dist/esm/ui/LayoutColumnMenu/index.js +1 -1
  33. package/dist/esm/ui/LayoutColumnMenu/useSelectedLayoutColumns.js +5 -4
  34. package/dist/esm/ui/toolbar.js +71 -12
  35. package/dist/types/layoutPluginType.d.ts +2 -2
  36. package/dist/types/pm-plugins/actions.d.ts +9 -1
  37. package/dist/types/pm-plugins/utils/layout-column-selection.d.ts +8 -7
  38. package/dist/types-ts4.5/layoutPluginType.d.ts +2 -2
  39. package/dist/types-ts4.5/pm-plugins/actions.d.ts +9 -1
  40. package/dist/types-ts4.5/pm-plugins/utils/layout-column-selection.d.ts +8 -7
  41. package/package.json +3 -3
@@ -3,7 +3,6 @@ import { useIntl } from 'react-intl';
3
3
  import { layoutMessages } from '@atlaskit/editor-common/messages';
4
4
  import { TableColumnAddLeftIcon, TableColumnAddRightIcon, ToolbarDropdownItem } from '@atlaskit/editor-toolbar';
5
5
  import { getEffectiveMaxLayoutColumns } from '../../pm-plugins/actions';
6
- import { getLayoutSectionColumnCount } from '../../pm-plugins/utils/layout-column-selection';
7
6
  import { useSelectedLayoutColumns } from './useSelectedLayoutColumns';
8
7
  const INSERT_COLUMN_OPTIONS = {
9
8
  left: {
@@ -21,6 +20,7 @@ export const InsertColumnDropdownItem = ({
21
20
  api,
22
21
  side
23
22
  }) => {
23
+ var _selectedLayoutColumn, _selectedLayoutColumn2;
24
24
  const {
25
25
  formatMessage
26
26
  } = useIntl();
@@ -29,7 +29,7 @@ export const InsertColumnDropdownItem = ({
29
29
  label
30
30
  } = INSERT_COLUMN_OPTIONS[side];
31
31
  const selectedLayoutColumns = useSelectedLayoutColumns(api);
32
- const columnCount = getLayoutSectionColumnCount(selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.layoutSectionNode);
32
+ const columnCount = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : (_selectedLayoutColumn2 = selectedLayoutColumns.layoutSectionNode) === null || _selectedLayoutColumn2 === void 0 ? void 0 : _selectedLayoutColumn2.childCount) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : 0;
33
33
  const maxColumnCount = getEffectiveMaxLayoutColumns();
34
34
  const canInsertColumn = selectedLayoutColumns !== undefined && columnCount < maxColumnCount;
35
35
  const onClick = useCallback(() => {
@@ -14,7 +14,7 @@ export const VerticalAlignDropdownItem = ({
14
14
  formatMessage
15
15
  } = useIntl();
16
16
  const selectedLayoutColumns = useSelectedLayoutColumns(api);
17
- const isSelected = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedColumns.every(({
17
+ const isSelected = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedLayoutColumns.every(({
18
18
  node
19
19
  }) => getLayoutColumnValign(node) === value)) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : false;
20
20
  const Icon = VERTICAL_ALIGN_ICONS[value];
@@ -14,7 +14,7 @@ export const VerticalAlignNestedMenu = ({
14
14
  } = useIntl();
15
15
  const selectedLayoutColumns = useSelectedLayoutColumns(api);
16
16
  const currentValign = useMemo(() => {
17
- const selectedColumns = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedColumns;
17
+ const selectedColumns = selectedLayoutColumns === null || selectedLayoutColumns === void 0 ? void 0 : selectedLayoutColumns.selectedLayoutColumns;
18
18
  const firstColumn = selectedColumns === null || selectedColumns === void 0 ? void 0 : selectedColumns[0];
19
19
  const firstValign = getLayoutColumnValign(firstColumn === null || firstColumn === void 0 ? void 0 : firstColumn.node);
20
20
  if (!firstValign || !(selectedColumns !== null && selectedColumns !== void 0 && selectedColumns.every(({
@@ -18,7 +18,7 @@ const TOOLBAR_MENU_SELECTOR = '[data-toolbar-component="menu"]';
18
18
  */
19
19
  const getLayoutColumnMenuTarget = (editorView, selection, anchorPosFromHandle) => {
20
20
  var _columnDomRef$parentE;
21
- const anchorPos = getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle);
21
+ const anchorPos = selection && getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle);
22
22
  if (anchorPos === undefined) {
23
23
  return null;
24
24
  }
@@ -1,6 +1,8 @@
1
1
  import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
2
- import { getSelectedLayoutColumns } from '../../pm-plugins/utils/layout-column-selection';
3
- export const useSelectedLayoutColumns = api => useSharedPluginStateWithSelector(api, ['selection'], states => {
4
- var _states$selectionStat;
5
- return getSelectedLayoutColumns((_states$selectionStat = states.selectionState) === null || _states$selectionStat === void 0 ? void 0 : _states$selectionStat.selection);
2
+ import { getSelectedLayoutColumnsFromSelection } from '../../pm-plugins/utils/layout-column-selection';
3
+ export const useSelectedLayoutColumns = api => useSharedPluginStateWithSelector(api, ['selection'], ({
4
+ selectionState
5
+ }) => {
6
+ const selectedLayoutColumns = (selectionState === null || selectionState === void 0 ? void 0 : selectionState.selection) && getSelectedLayoutColumnsFromSelection(selectionState.selection);
7
+ return selectedLayoutColumns !== null && selectedLayoutColumns !== void 0 && selectedLayoutColumns.selectedLayoutColumns.length ? selectedLayoutColumns : undefined;
6
8
  });
@@ -12,8 +12,11 @@ import LayoutThreeColumnsSidebarsIcon from '@atlaskit/icon/core/layout-three-col
12
12
  import LayoutTwoColumnsIcon from '@atlaskit/icon/core/layout-two-columns';
13
13
  import LayoutTwoColumnsSidebarLeftIcon from '@atlaskit/icon/core/layout-two-columns-sidebar-left';
14
14
  import LayoutTwoColumnsSidebarRightIcon from '@atlaskit/icon/core/layout-two-columns-sidebar-right';
15
+ import TableColumnsDistributeIcon from '@atlaskit/icon/core/table-columns-distribute';
16
+ import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
15
17
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
16
- import { deleteActiveLayoutNode, getPresetLayout, setPresetLayout } from '../pm-plugins/actions';
18
+ import { deleteActiveLayoutNode, distributeLayoutColumns, getPresetLayout, setPresetLayout } from '../pm-plugins/actions';
19
+ import { isDistributedUniformly } from '../pm-plugins/utils/layout-column-distribution';
17
20
  import { EditorLayoutFiveColumnsIcon, EditorLayoutFourColumnsIcon } from './icons/LayoutColumnsIcon';
18
21
  import { LayoutThreeWithLeftSidebarsIcon } from './icons/LayoutThreeWithLeftSidebars';
19
22
  import { LayoutThreeWithRightSidebarsIcon } from './icons/LayoutThreeWithRightSidebars';
@@ -52,7 +55,7 @@ const SIDEBAR_LAYOUT_TYPES = [{
52
55
  }];
53
56
 
54
57
  // These are used for advanced layout options
55
- const LAYOUT_WITH_TWO_COL_DISTRIBUTION = [{
58
+ const LAYOUT_WITH_TWO_COL_DISTRIBUTION_OLD = [{
56
59
  id: 'editor.layout.twoEquals',
57
60
  type: 'two_equal',
58
61
  title: toolbarMessages.twoColumns,
@@ -68,7 +71,7 @@ const LAYOUT_WITH_TWO_COL_DISTRIBUTION = [{
68
71
  title: toolbarMessages.leftSidebar,
69
72
  icon: LayoutTwoColumnsSidebarLeftIcon
70
73
  }];
71
- const LAYOUT_WITH_THREE_COL_DISTRIBUTION = [{
74
+ const LAYOUT_WITH_THREE_COL_DISTRIBUTION_OLD = [{
72
75
  id: 'editor.layout.threeEquals',
73
76
  type: 'three_equal',
74
77
  title: toolbarMessages.threeColumns,
@@ -91,6 +94,35 @@ const LAYOUT_WITH_THREE_COL_DISTRIBUTION = [{
91
94
  icon: LayoutThreeWithLeftSidebarsIcon,
92
95
  iconFallback: LayoutThreeWithLeftSidebarsIcon
93
96
  }];
97
+ const LAYOUT_WITH_TWO_COL_DISTRIBUTION = [{
98
+ id: 'editor.layout.twoRightSidebar',
99
+ type: 'two_right_sidebar',
100
+ title: toolbarMessages.rightSidebar,
101
+ icon: LayoutTwoColumnsSidebarRightIcon
102
+ }, {
103
+ id: 'editor.layout.twoLeftSidebar',
104
+ type: 'two_left_sidebar',
105
+ title: toolbarMessages.leftSidebar,
106
+ icon: LayoutTwoColumnsSidebarLeftIcon
107
+ }];
108
+ const LAYOUT_WITH_THREE_COL_DISTRIBUTION = [{
109
+ id: 'editor.layout.threeWithSidebars',
110
+ type: 'three_with_sidebars',
111
+ title: toolbarMessages.threeColumnsWithSidebars,
112
+ icon: LayoutThreeColumnsSidebarsIcon
113
+ }, {
114
+ id: 'editor.layout.threeRightSidebars',
115
+ type: 'three_right_sidebars',
116
+ title: toolbarMessages.threeColumnsWithRightSidebars,
117
+ icon: LayoutThreeWithRightSidebarsIcon,
118
+ iconFallback: LayoutThreeWithRightSidebarsIcon
119
+ }, {
120
+ id: 'editor.layout.threeLeftSidebars',
121
+ type: 'three_left_sidebars',
122
+ title: toolbarMessages.threeColumnsWithLeftSidebars,
123
+ icon: LayoutThreeWithLeftSidebarsIcon,
124
+ iconFallback: LayoutThreeWithLeftSidebarsIcon
125
+ }];
94
126
  const buildLayoutButton = (intl, item, currentLayout, editorAnalyticsAPI) => ({
95
127
  id: item.id,
96
128
  type: 'button',
@@ -103,7 +135,9 @@ const buildLayoutButton = (intl, item, currentLayout, editorAnalyticsAPI) => ({
103
135
  tabIndex: null
104
136
  });
105
137
  export const layoutToolbarTitle = 'Layout floating controls';
106
- const iconPlaceholder = LayoutTwoColumnsIcon; // TODO: ED-25466 - Replace with proper icon
138
+ const iconPlaceholder = /*#__PURE__*/React.createElement(LayoutTwoColumnsIcon, {
139
+ label: ""
140
+ }); // TODO: ED-25466 - Replace with proper icon
107
141
 
108
142
  const getLayoutColumnsIcons = colCount => {
109
143
  if (!editorExperiment('single_column_layouts', true) && !editorExperiment('platform_editor_controls', 'variant1')) {
@@ -130,11 +164,13 @@ const getLayoutColumnsIcons = colCount => {
130
164
  return undefined;
131
165
  }
132
166
  };
167
+ const getLayoutColumnWidths = node => {
168
+ return node.children.map(child => child.attrs.width);
169
+ };
133
170
  const getAdvancedLayoutItems = ({
134
171
  addSidebarLayouts,
135
172
  intl,
136
173
  editorAnalyticsAPI,
137
- state,
138
174
  node,
139
175
  nodeType,
140
176
  separator,
@@ -143,7 +179,8 @@ const getAdvancedLayoutItems = ({
143
179
  allowAdvancedSingleColumnLayout
144
180
  }) => {
145
181
  const numberOfColumns = node.content.childCount || 2;
146
- const distributionOptions = numberOfColumns === 2 ? LAYOUT_WITH_TWO_COL_DISTRIBUTION : numberOfColumns === 3 ? LAYOUT_WITH_THREE_COL_DISTRIBUTION : [];
182
+ const isLayoutColumnMenuEnabled = expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true);
183
+ const distributionOptions = isLayoutColumnMenuEnabled ? numberOfColumns === 2 ? LAYOUT_WITH_TWO_COL_DISTRIBUTION : numberOfColumns === 3 ? LAYOUT_WITH_THREE_COL_DISTRIBUTION : [] : numberOfColumns === 2 ? LAYOUT_WITH_TWO_COL_DISTRIBUTION_OLD : numberOfColumns === 3 ? LAYOUT_WITH_THREE_COL_DISTRIBUTION_OLD : [];
147
184
  const columnOptions = [{
148
185
  title: intl.formatMessage(layoutMessages.columnOption, {
149
186
  count: 2
@@ -177,7 +214,7 @@ const getAdvancedLayoutItems = ({
177
214
  onClick: setPresetLayout(editorAnalyticsAPI)('five_equal'),
178
215
  selected: numberOfColumns === 5
179
216
  }];
180
- const singleColumnOption = allowAdvancedSingleColumnLayout ? {
217
+ const dropdownOptions = [...(allowAdvancedSingleColumnLayout ? [{
181
218
  title: intl.formatMessage(layoutMessages.columnOption, {
182
219
  count: 1
183
220
  }),
@@ -185,17 +222,38 @@ const getAdvancedLayoutItems = ({
185
222
  icon: getLayoutColumnsIcons(1) || iconPlaceholder,
186
223
  onClick: setPresetLayout(editorAnalyticsAPI)('single'),
187
224
  selected: numberOfColumns === 1
188
- } : [];
225
+ }] : []), ...columnOptions];
226
+ const distributeColumnsButton = isLayoutColumnMenuEnabled && numberOfColumns > 1 ? {
227
+ disabled: isDistributedUniformly(getLayoutColumnWidths(node)),
228
+ icon: TableColumnsDistributeIcon,
229
+ onClick: (editorState, dispatch) => {
230
+ const tr = distributeLayoutColumns({
231
+ editorAnalyticsAPI,
232
+ inputMethod: INPUT_METHOD.FLOATING_TB,
233
+ target: 'allColumns'
234
+ })({
235
+ tr: editorState.tr
236
+ });
237
+ if (!tr) {
238
+ return false;
239
+ }
240
+ dispatch === null || dispatch === void 0 ? void 0 : dispatch(tr);
241
+ return true;
242
+ },
243
+ testId: 'layout-distribute-columns',
244
+ title: intl.formatMessage(layoutMessages.distributeColumns),
245
+ type: 'button'
246
+ } : undefined;
189
247
  return [{
190
248
  type: 'dropdown',
191
249
  title: intl.formatMessage(layoutMessages.columnOption, {
192
250
  count: numberOfColumns
193
251
  }),
194
252
  //`${numberOfColumns}-columns`,
195
- options: [singleColumnOption, columnOptions].flat(),
253
+ options: dropdownOptions,
196
254
  showSelected: true,
197
255
  testId: 'column-options-button'
198
- }, ...(distributionOptions.length > 0 ? [separator] : []), ...(addSidebarLayouts ? distributionOptions.map(i => buildLayoutButton(intl, i, currentLayout, editorAnalyticsAPI)) : [])];
256
+ }, ...(distributionOptions.length > 0 || distributeColumnsButton ? [separator] : []), ...(addSidebarLayouts ? distributionOptions.map(i => buildLayoutButton(intl, i, currentLayout, editorAnalyticsAPI)) : []), ...(distributeColumnsButton ? [distributeColumnsButton] : [])];
199
257
  };
200
258
  const fullHeightSeparator = {
201
259
  type: 'separator',
@@ -283,7 +341,6 @@ export const buildToolbar = (state, intl, pos, _allowBreakout, addSidebarLayouts
283
341
  addSidebarLayouts,
284
342
  intl,
285
343
  editorAnalyticsAPI,
286
- state,
287
344
  nodeType,
288
345
  node,
289
346
  separator,
@@ -11,7 +11,7 @@ import { fg } from '@atlaskit/platform-feature-flags';
11
11
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
12
12
  import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
13
13
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
14
- import { createDefaultLayoutSection, createMultiColumnLayoutSection, deleteLayoutColumn as _deleteLayoutColumn, distributeLayoutColumns as _distributeLayoutColumns, insertLayoutColumn as _insertLayoutColumn, insertLayoutColumnsWithAnalytics, setLayoutColumnValign as _setLayoutColumnValign, toggleLayoutColumnMenu } from './pm-plugins/actions';
14
+ import { createDefaultLayoutSection, createDistributeLayoutColumnsCommand, createMultiColumnLayoutSection, deleteLayoutColumn as _deleteLayoutColumn, insertLayoutColumn as _insertLayoutColumn, insertLayoutColumnsWithAnalytics, setLayoutColumnValign as _setLayoutColumnValign, toggleLayoutColumnMenu } from './pm-plugins/actions';
15
15
  import { default as createLayoutPlugin } from './pm-plugins/main';
16
16
  import { pluginKey } from './pm-plugins/plugin-key';
17
17
  import { default as createLayoutResizingPlugin } from './pm-plugins/resizing';
@@ -50,7 +50,7 @@ export var selectIntoLayoutSection = function selectIntoLayoutSection(tr) {
50
50
  return tr;
51
51
  };
52
52
  export var layoutPlugin = function layoutPlugin(_ref) {
53
- var _api$analytics;
53
+ var _api$analytics, _api$analytics5;
54
54
  var _ref$config = _ref.config,
55
55
  options = _ref$config === void 0 ? {} : _ref$config,
56
56
  api = _ref.api;
@@ -374,10 +374,7 @@ export var layoutPlugin = function layoutPlugin(_ref) {
374
374
  var _api$analytics4;
375
375
  return _deleteLayoutColumn(api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions)(props);
376
376
  },
377
- distributeLayoutColumns: function distributeLayoutColumns(props) {
378
- var _api$analytics5;
379
- return _distributeLayoutColumns(api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions)(props);
380
- },
377
+ distributeLayoutColumns: createDistributeLayoutColumnsCommand(api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions),
381
378
  insertLayoutColumn: function insertLayoutColumn(side) {
382
379
  var _api$analytics6;
383
380
  return _insertLayoutColumn(side, api === null || api === void 0 || (_api$analytics6 = api.analytics) === null || _api$analytics6 === void 0 ? void 0 : _api$analytics6.actions);
@@ -13,7 +13,7 @@ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
13
13
  import { EVEN_DISTRIBUTED_COL_WIDTHS, MAX_LAYOUT_COLUMNS, MAX_STANDARD_LAYOUT_COLUMNS, MIN_LAYOUT_COLUMN_WIDTH_PERCENT } from './consts';
14
14
  import { pluginKey } from './plugin-key';
15
15
  import { calculateDistribution, isDistributedUniformly, redistributeAfterDeletion, redistributeProportionally } from './utils/layout-column-distribution';
16
- import { getSelectedLayoutColumns } from './utils/layout-column-selection';
16
+ import { getAllLayoutColumnsFromSelection, getSelectedLayoutColumnsFromSelection } from './utils/layout-column-selection';
17
17
  export var ONE_COL_LAYOUTS = ['single'];
18
18
  export var TWO_COL_LAYOUTS = ['two_equal', 'two_left_sidebar', 'two_right_sidebar'];
19
19
  export var THREE_COL_LAYOUTS = ['three_equal', 'three_with_sidebars'];
@@ -554,18 +554,17 @@ var insertLayoutColumnAt = function insertLayoutColumnAt(side, editorAnalyticsAP
554
554
  if (!expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
555
555
  return null;
556
556
  }
557
- var selectedLayoutColumns = getSelectedLayoutColumns(tr.selection);
558
- if (!selectedLayoutColumns) {
557
+ var selectedLayoutColumnsResult = getSelectedLayoutColumnsFromSelection(tr.selection);
558
+ if (!selectedLayoutColumnsResult || selectedLayoutColumnsResult.selectedLayoutColumns.length === 0) {
559
559
  return null;
560
560
  }
561
- var layoutSectionNode = selectedLayoutColumns.layoutSectionNode,
562
- layoutSectionPos = selectedLayoutColumns.layoutSectionPos,
563
- selectedColumnIndices = selectedLayoutColumns.selectedColumnIndices,
564
- selectedColumns = selectedLayoutColumns.selectedColumns;
565
- var startIndex = selectedColumnIndices[0];
566
- var endIndex = selectedColumnIndices[selectedColumnIndices.length - 1];
561
+ var layoutSectionNode = selectedLayoutColumnsResult.layoutSectionNode,
562
+ layoutSectionPos = selectedLayoutColumnsResult.layoutSectionPos,
563
+ startIndex = selectedLayoutColumnsResult.startIndex,
564
+ endIndex = selectedLayoutColumnsResult.endIndex,
565
+ selectedLayoutColumns = selectedLayoutColumnsResult.selectedLayoutColumns;
567
566
  var selectedColumnIndex = side === 'left' ? startIndex : endIndex;
568
- var selectedColumnCount = selectedColumns.length;
567
+ var selectedColumnCount = selectedLayoutColumns.length;
569
568
  if (layoutSectionNode.childCount >= getEffectiveMaxLayoutColumns()) {
570
569
  return null;
571
570
  }
@@ -623,22 +622,20 @@ export var setLayoutColumnValign = function setLayoutColumnValign(valign, editor
623
622
  if (!expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
624
623
  return null;
625
624
  }
626
- var selectedLayoutColumns = getSelectedLayoutColumns(tr.selection);
627
- if (!selectedLayoutColumns) {
625
+ var selectedLayoutColumnsResult = getSelectedLayoutColumnsFromSelection(tr.selection);
626
+ if (!selectedLayoutColumnsResult) {
628
627
  return null;
629
628
  }
630
- var selectedColumnIndices = selectedLayoutColumns.selectedColumnIndices,
631
- selectedColumns = selectedLayoutColumns.selectedColumns;
632
- var columnsToUpdate = selectedColumns.filter(function (_ref6) {
629
+ var startIndex = selectedLayoutColumnsResult.startIndex,
630
+ endIndex = selectedLayoutColumnsResult.endIndex,
631
+ selectedLayoutColumns = selectedLayoutColumnsResult.selectedLayoutColumns;
632
+ var columnsToUpdate = selectedLayoutColumns.filter(function (_ref6) {
633
633
  var node = _ref6.node;
634
634
  return node.attrs.valign !== valign;
635
635
  });
636
636
  if (columnsToUpdate.length === 0) {
637
637
  return null;
638
638
  }
639
- var startIndex = selectedColumnIndices[0];
640
- var endIndex = selectedColumnIndices[selectedColumnIndices.length - 1];
641
- var selectedColumnCount = selectedColumns.length;
642
639
  var updatedColumnCount = columnsToUpdate.length;
643
640
  columnsToUpdate.forEach(function (_ref7) {
644
641
  var node = _ref7.node,
@@ -654,7 +651,7 @@ export var setLayoutColumnValign = function setLayoutColumnValign(valign, editor
654
651
  attributes: {
655
652
  endIndex: endIndex,
656
653
  inputMethod: INPUT_METHOD.LAYOUT_COLUMN_MENU,
657
- selectedCount: selectedColumnCount,
654
+ selectedCount: selectedLayoutColumns.length,
658
655
  startIndex: startIndex,
659
656
  updatedCount: updatedColumnCount,
660
657
  valign: valign
@@ -665,28 +662,31 @@ export var setLayoutColumnValign = function setLayoutColumnValign(valign, editor
665
662
  return tr;
666
663
  };
667
664
  };
668
- export var distributeLayoutColumns = function distributeLayoutColumns(editorAnalyticsAPI) {
669
- var inputMethod = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : INPUT_METHOD.LAYOUT_COLUMN_MENU;
670
- return function (_ref8) {
671
- var tr = _ref8.tr;
665
+ export var distributeLayoutColumns = function distributeLayoutColumns() {
666
+ var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
667
+ editorAnalyticsAPI = _ref8.editorAnalyticsAPI,
668
+ _ref8$inputMethod = _ref8.inputMethod,
669
+ inputMethod = _ref8$inputMethod === void 0 ? INPUT_METHOD.LAYOUT_COLUMN_MENU : _ref8$inputMethod,
670
+ _ref8$target = _ref8.target,
671
+ target = _ref8$target === void 0 ? 'selectedColumns' : _ref8$target;
672
+ return function (_ref9) {
673
+ var tr = _ref9.tr;
672
674
  if (!expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
673
675
  return null;
674
676
  }
675
- var selectedLayoutColumns = getSelectedLayoutColumns(tr.selection);
676
- if (!selectedLayoutColumns || selectedLayoutColumns.selectedColumns.length < 2) {
677
+ var selectedLayoutColumnsResult = target === 'allColumns' ? getAllLayoutColumnsFromSelection(tr.selection) : getSelectedLayoutColumnsFromSelection(tr.selection);
678
+ if (!selectedLayoutColumnsResult || selectedLayoutColumnsResult.selectedLayoutColumns.length < 2) {
677
679
  return null;
678
680
  }
679
- var layoutSectionNode = selectedLayoutColumns.layoutSectionNode,
680
- selectedColumnIndices = selectedLayoutColumns.selectedColumnIndices,
681
- selectedColumns = selectedLayoutColumns.selectedColumns;
682
- var endIndex = selectedColumnIndices[selectedColumnIndices.length - 1];
683
- var selectedColumnCount = selectedColumns.length;
684
- var totalColumnCount = layoutSectionNode.childCount;
681
+ var layoutSectionNode = selectedLayoutColumnsResult.layoutSectionNode,
682
+ startIndex = selectedLayoutColumnsResult.startIndex,
683
+ endIndex = selectedLayoutColumnsResult.endIndex,
684
+ selectedLayoutColumns = selectedLayoutColumnsResult.selectedLayoutColumns;
685
685
  var existingWidths = mapChildren(layoutSectionNode, function (column) {
686
686
  return column.attrs.width;
687
687
  });
688
- var selectedWidths = selectedColumns.map(function (_ref9) {
689
- var node = _ref9.node;
688
+ var selectedWidths = selectedLayoutColumns.map(function (_ref0) {
689
+ var node = _ref0.node;
690
690
  return node.attrs.width;
691
691
  });
692
692
  var distribution = calculateDistribution(selectedWidths);
@@ -702,15 +702,14 @@ export var distributeLayoutColumns = function distributeLayoutColumns(editorAnal
702
702
  // Build new widths array: selected columns get equal share, unselected unchanged.
703
703
  // Assign rounded (2dp) equal widths to all selected cols except the last, which absorbs
704
704
  // the rounding remainder so the sum of selected widths equals selectedTotal exactly.
705
- var selectedIndexSet = new Set(selectedColumnIndices);
706
705
  var assignedToSelected = 0;
707
706
  var selectedAssignedCount = 0;
708
707
  var newWidths = existingWidths.map(function (w, idx) {
709
- if (!selectedIndexSet.has(idx)) {
708
+ if (idx < startIndex || idx > endIndex) {
710
709
  return w;
711
710
  }
712
711
  selectedAssignedCount += 1;
713
- if (selectedAssignedCount < selectedColumnCount) {
712
+ if (selectedAssignedCount < selectedLayoutColumns.length) {
714
713
  assignedToSelected += equalWidth;
715
714
  return equalWidth;
716
715
  }
@@ -719,10 +718,10 @@ export var distributeLayoutColumns = function distributeLayoutColumns(editorAnal
719
718
  });
720
719
 
721
720
  // Apply widths via setNodeMarkup per selected column — keeps nodes in place (preserves identity, marks, decorations)
722
- selectedColumns.forEach(function (_ref0, i) {
723
- var node = _ref0.node,
724
- pos = _ref0.pos;
725
- var colIdx = selectedColumnIndices[i];
721
+ selectedLayoutColumns.forEach(function (_ref1, i) {
722
+ var node = _ref1.node,
723
+ pos = _ref1.pos;
724
+ var colIdx = startIndex + i;
726
725
  tr.setNodeMarkup(pos, node.type, _objectSpread(_objectSpread({}, node.attrs), {}, {
727
726
  width: newWidths[colIdx]
728
727
  }));
@@ -732,11 +731,11 @@ export var distributeLayoutColumns = function distributeLayoutColumns(editorAnal
732
731
  actionSubject: ACTION_SUBJECT.DOCUMENT,
733
732
  actionSubjectId: ACTION_SUBJECT_ID.LAYOUT_COLUMN,
734
733
  attributes: {
735
- columnCount: totalColumnCount,
734
+ columnCount: layoutSectionNode.childCount,
736
735
  endIndex: endIndex,
737
736
  inputMethod: inputMethod,
738
- selectedCount: selectedColumnCount,
739
- startIndex: selectedColumnIndices[0]
737
+ selectedCount: selectedLayoutColumns.length,
738
+ startIndex: startIndex
740
739
  },
741
740
  eventType: EVENT_TYPE.TRACK
742
741
  })(tr);
@@ -744,11 +743,19 @@ export var distributeLayoutColumns = function distributeLayoutColumns(editorAnal
744
743
  return tr;
745
744
  };
746
745
  };
747
- export var toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref1) {
748
- var anchorPos = _ref1.anchorPos,
749
- isOpen = _ref1.isOpen;
750
- return function (_ref10) {
751
- var tr = _ref10.tr;
746
+ export var createDistributeLayoutColumnsCommand = function createDistributeLayoutColumnsCommand(editorAnalyticsAPI) {
747
+ return function () {
748
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
749
+ return distributeLayoutColumns(_objectSpread(_objectSpread({}, options), {}, {
750
+ editorAnalyticsAPI: editorAnalyticsAPI
751
+ }));
752
+ };
753
+ };
754
+ export var toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref10) {
755
+ var anchorPos = _ref10.anchorPos,
756
+ isOpen = _ref10.isOpen;
757
+ return function (_ref11) {
758
+ var tr = _ref11.tr;
752
759
  tr.setMeta('toggleLayoutColumnMenu', {
753
760
  anchorPos: anchorPos,
754
761
  isOpen: isOpen
@@ -758,23 +765,20 @@ export var toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref1) {
758
765
  };
759
766
  };
760
767
  export var deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI) {
761
- return function (_ref11) {
762
- var tr = _ref11.tr;
768
+ return function (_ref12) {
769
+ var tr = _ref12.tr;
763
770
  if (!expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
764
771
  return null;
765
772
  }
766
- var selectedLayoutColumns = getSelectedLayoutColumns(tr.selection);
767
- if (!selectedLayoutColumns) {
773
+ var selectedLayoutColumnsResult = getSelectedLayoutColumnsFromSelection(tr.selection);
774
+ if (!selectedLayoutColumnsResult || selectedLayoutColumnsResult.selectedLayoutColumns.length === 0) {
768
775
  return null;
769
776
  }
770
- var layoutSectionNode = selectedLayoutColumns.layoutSectionNode,
771
- layoutSectionPos = selectedLayoutColumns.layoutSectionPos,
772
- selectedColumnIndices = selectedLayoutColumns.selectedColumnIndices,
773
- selectedColumns = selectedLayoutColumns.selectedColumns;
774
- var startIndex = selectedColumnIndices[0];
775
- var endIndex = selectedColumnIndices[selectedColumnIndices.length - 1];
776
- var selectedColumnCount = selectedColumns.length;
777
- var selectedColumnIndexSet = new Set(selectedColumnIndices);
777
+ var layoutSectionNode = selectedLayoutColumnsResult.layoutSectionNode,
778
+ layoutSectionPos = selectedLayoutColumnsResult.layoutSectionPos,
779
+ selectedLayoutColumns = selectedLayoutColumnsResult.selectedLayoutColumns,
780
+ startIndex = selectedLayoutColumnsResult.startIndex,
781
+ endIndex = selectedLayoutColumnsResult.endIndex;
778
782
  var emitDeleteColumnAnalytics = function emitDeleteColumnAnalytics(columnCount) {
779
783
  editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 || editorAnalyticsAPI.attachAnalyticsEvent({
780
784
  action: ACTION.DELETED,
@@ -784,7 +788,7 @@ export var deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI)
784
788
  columnCount: columnCount,
785
789
  endIndex: endIndex,
786
790
  inputMethod: INPUT_METHOD.LAYOUT_COLUMN_MENU,
787
- selectedCount: selectedColumnCount,
791
+ selectedCount: selectedLayoutColumns.length,
788
792
  startIndex: startIndex
789
793
  },
790
794
  eventType: EVENT_TYPE.TRACK
@@ -792,7 +796,7 @@ export var deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI)
792
796
  };
793
797
 
794
798
  // If all columns are selected, remove the entire layoutSection
795
- if (selectedColumnCount === layoutSectionNode.childCount) {
799
+ if (selectedLayoutColumns.length === layoutSectionNode.childCount) {
796
800
  tr.delete(layoutSectionPos, layoutSectionPos + layoutSectionNode.nodeSize);
797
801
  emitDeleteColumnAnalytics(0);
798
802
  tr.setMeta('scrollIntoView', false);
@@ -802,7 +806,7 @@ export var deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI)
802
806
  // Build new column list without the selected columns
803
807
  var remainingColumns = [];
804
808
  layoutSectionNode.forEach(function (column, _offset, index) {
805
- if (!selectedColumnIndexSet.has(index)) {
809
+ if (index < startIndex || index > endIndex) {
806
810
  remainingColumns.push(column);
807
811
  }
808
812
  });
@@ -811,12 +815,12 @@ export var deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI)
811
815
  var existingWidths = mapChildren(layoutSectionNode, function (column) {
812
816
  return column.attrs.width;
813
817
  });
814
- var redistributed = selectedColumnIndices.slice()
818
+ var redistributed = selectedLayoutColumns.map(function (_, i) {
819
+ return startIndex + i;
820
+ })
815
821
  // Delete highest indices first so lower original indices still point at the same columns
816
822
  // as each redistribution step shrinks the widths array.
817
- .sort(function (a, b) {
818
- return b - a;
819
- }).reduce(function (widths, selectedIndex) {
823
+ .reverse().reduce(function (widths, selectedIndex) {
820
824
  return redistributeAfterDeletion(widths, selectedIndex, MIN_LAYOUT_COLUMN_WIDTH_PERCENT);
821
825
  }, existingWidths);
822
826
  var updatedLayoutSectionNode = layoutSectionNode.copy(Fragment.fromArray(remainingColumns));