@atlaskit/editor-plugin-layout 11.0.4 → 11.1.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 (39) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/layoutPlugin.js +19 -4
  3. package/dist/cjs/pm-plugins/actions.js +30 -10
  4. package/dist/cjs/pm-plugins/keymap.js +31 -0
  5. package/dist/cjs/pm-plugins/main.js +90 -21
  6. package/dist/cjs/pm-plugins/utils/layout-column-selection.js +36 -12
  7. package/dist/cjs/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +25 -5
  8. package/dist/cjs/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +7 -1
  9. package/dist/cjs/ui/LayoutColumnMenu/index.js +51 -4
  10. package/dist/cjs/ui/global-styles.js +11 -1
  11. package/dist/es2019/layoutPlugin.js +18 -5
  12. package/dist/es2019/pm-plugins/actions.js +26 -11
  13. package/dist/es2019/pm-plugins/keymap.js +26 -0
  14. package/dist/es2019/pm-plugins/main.js +97 -25
  15. package/dist/es2019/pm-plugins/utils/layout-column-selection.js +33 -8
  16. package/dist/es2019/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +26 -6
  17. package/dist/es2019/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +8 -2
  18. package/dist/es2019/ui/LayoutColumnMenu/index.js +52 -5
  19. package/dist/es2019/ui/global-styles.js +9 -1
  20. package/dist/esm/layoutPlugin.js +20 -5
  21. package/dist/esm/pm-plugins/actions.js +30 -10
  22. package/dist/esm/pm-plugins/keymap.js +25 -0
  23. package/dist/esm/pm-plugins/main.js +90 -21
  24. package/dist/esm/pm-plugins/utils/layout-column-selection.js +35 -11
  25. package/dist/esm/ui/LayoutColumnMenu/DeleteColumnDropdownItem.js +26 -6
  26. package/dist/esm/ui/LayoutColumnMenu/InsertColumnDropdownItem.js +8 -2
  27. package/dist/esm/ui/LayoutColumnMenu/index.js +52 -5
  28. package/dist/esm/ui/global-styles.js +11 -1
  29. package/dist/types/layoutPluginType.d.ts +5 -7
  30. package/dist/types/pm-plugins/actions.d.ts +8 -4
  31. package/dist/types/pm-plugins/keymap.d.ts +10 -0
  32. package/dist/types/pm-plugins/types.d.ts +2 -0
  33. package/dist/types/pm-plugins/utils/layout-column-selection.d.ts +1 -0
  34. package/dist/types-ts4.5/layoutPluginType.d.ts +5 -7
  35. package/dist/types-ts4.5/pm-plugins/actions.d.ts +8 -4
  36. package/dist/types-ts4.5/pm-plugins/keymap.d.ts +10 -0
  37. package/dist/types-ts4.5/pm-plugins/types.d.ts +2 -0
  38. package/dist/types-ts4.5/pm-plugins/utils/layout-column-selection.d.ts +1 -0
  39. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/editor-plugin-layout
2
2
 
3
+ ## 11.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`5182f0ffac22f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5182f0ffac22f) -
8
+ Add keyboard shortcuts and danger preview to layout column menu actions.
9
+
10
+ Fix keyboard navigation in the layout column menu.
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies
15
+
3
16
  ## 11.0.4
4
17
 
5
18
  ### Patch Changes
@@ -19,6 +19,7 @@ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
19
19
  var _expValEqualsNoExposure = require("@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure");
20
20
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
21
21
  var _actions = require("./pm-plugins/actions");
22
+ var _keymap = _interopRequireDefault(require("./pm-plugins/keymap"));
22
23
  var _main = _interopRequireDefault(require("./pm-plugins/main"));
23
24
  var _pluginKey = require("./pm-plugins/plugin-key");
24
25
  var _resizing = _interopRequireDefault(require("./pm-plugins/resizing"));
@@ -57,7 +58,7 @@ var selectIntoLayoutSection = exports.selectIntoLayoutSection = function selectI
57
58
  return tr;
58
59
  };
59
60
  var layoutPlugin = exports.layoutPlugin = function layoutPlugin(_ref) {
60
- var _api$analytics2, _api$analytics5;
61
+ var _api$analytics2;
61
62
  var _ref$config = _ref.config,
62
63
  options = _ref$config === void 0 ? {} : _ref$config,
63
64
  api = _ref.api;
@@ -109,6 +110,16 @@ var layoutPlugin = exports.layoutPlugin = function layoutPlugin(_ref) {
109
110
  return (0, _main.default)(options, api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions);
110
111
  }
111
112
  }];
113
+ if ((0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
114
+ plugins.push({
115
+ name: 'layoutKeymap',
116
+ plugin: function plugin() {
117
+ return (0, _keymap.default)({
118
+ api: api
119
+ });
120
+ }
121
+ });
122
+ }
112
123
  if ((options.editorAppearance === 'full-page' || options.editorAppearance === 'full-width' || options.editorAppearance === 'max' && (0, _experiments.editorExperiment)('platform_editor_layout_column_resize_handle', true)) && api && (0, _experiments.editorExperiment)('advanced_layouts', true)) {
113
124
  plugins.push({
114
125
  name: 'layoutResizing',
@@ -379,15 +390,19 @@ var layoutPlugin = exports.layoutPlugin = function layoutPlugin(_ref) {
379
390
  return _pluginKey.pluginKey.getState(editorState);
380
391
  },
381
392
  commands: {
382
- deleteLayoutColumn: (0, _actions.deleteLayoutColumn)(api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions, api),
393
+ deleteLayoutColumn: function deleteLayoutColumn(inputMethod) {
394
+ var _api$analytics5;
395
+ return (0, _actions.deleteLayoutColumn)(api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions, api, inputMethod);
396
+ },
383
397
  distributeLayoutColumns: function distributeLayoutColumns(options) {
384
398
  var _api$analytics6;
385
399
  return (0, _actions.distributeLayoutColumns)(api === null || api === void 0 || (_api$analytics6 = api.analytics) === null || _api$analytics6 === void 0 ? void 0 : _api$analytics6.actions, api)(options);
386
400
  },
387
- insertLayoutColumn: function insertLayoutColumn(side) {
401
+ insertLayoutColumn: function insertLayoutColumn(side, inputMethod) {
388
402
  var _api$analytics7;
389
- return (0, _actions.insertLayoutColumn)(side, api === null || api === void 0 || (_api$analytics7 = api.analytics) === null || _api$analytics7 === void 0 ? void 0 : _api$analytics7.actions, api);
403
+ return (0, _actions.insertLayoutColumn)(side, api === null || api === void 0 || (_api$analytics7 = api.analytics) === null || _api$analytics7 === void 0 ? void 0 : _api$analytics7.actions, api, inputMethod);
390
404
  },
405
+ setLayoutColumnDangerPreview: _actions.setLayoutColumnDangerPreview,
391
406
  setLayoutColumnValign: function setLayoutColumnValign(valign) {
392
407
  var _api$analytics8;
393
408
  return (0, _actions.setLayoutColumnValign)(valign, api === null || api === void 0 || (_api$analytics8 = api.analytics) === null || _api$analytics8 === void 0 ? void 0 : _api$analytics8.actions, api);
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.fixColumnStructure = exports.fixColumnSizes = exports.distributeLayoutColumns = exports.deleteLayoutColumn = exports.deleteActiveLayoutNode = exports.createMultiColumnLayoutSection = exports.createDefaultLayoutSection = exports.TWO_COL_LAYOUTS = exports.THREE_COL_LAYOUTS = exports.ONE_COL_LAYOUTS = exports.LAYOUT_COLUMN_INSERT_META = void 0;
8
8
  exports.forceSectionToPresetLayout = forceSectionToPresetLayout;
9
9
  exports.getEffectiveMaxLayoutColumns = getEffectiveMaxLayoutColumns;
10
- exports.toggleLayoutColumnMenu = exports.setPresetLayout = exports.setLayoutColumnValign = exports.insertLayoutColumnsWithAnalytics = exports.insertLayoutColumns = exports.insertLayoutColumn = exports.getSelectedLayout = exports.getPresetLayout = void 0;
10
+ exports.toggleLayoutColumnMenu = exports.setPresetLayout = exports.setLayoutColumnValign = exports.setLayoutColumnDangerPreview = exports.insertLayoutColumnsWithAnalytics = exports.insertLayoutColumns = exports.insertLayoutColumn = exports.getSelectedLayout = exports.getPresetLayout = void 0;
11
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
12
  var _analytics = require("@atlaskit/editor-common/analytics");
13
13
  var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
@@ -581,12 +581,13 @@ function getEffectiveMaxLayoutColumns() {
581
581
  return (0, _experiments.editorExperiment)('advanced_layouts', true) ? _consts.MAX_LAYOUT_COLUMNS : _consts.MAX_STANDARD_LAYOUT_COLUMNS;
582
582
  }
583
583
  var insertLayoutColumnAt = function insertLayoutColumnAt(side, editorAnalyticsAPI) {
584
+ var inputMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU;
584
585
  return function (_ref4) {
585
586
  var tr = _ref4.tr;
586
587
  if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
587
588
  return null;
588
589
  }
589
- var selectedLayoutColumnsResult = (0, _layoutColumnSelection.getSelectedLayoutColumnsFromSelection)(tr.selection);
590
+ var selectedLayoutColumnsResult = (0, _layoutColumnSelection.getLayoutColumnsFromContentSelection)(tr.selection);
590
591
  if (!selectedLayoutColumnsResult || selectedLayoutColumnsResult.selectedLayoutColumns.length === 0) {
591
592
  return null;
592
593
  }
@@ -646,7 +647,7 @@ var insertLayoutColumnAt = function insertLayoutColumnAt(side, editorAnalyticsAP
646
647
  attributes: {
647
648
  columnCount: redistributedWidths.length,
648
649
  endIndex: endIndex,
649
- inputMethod: _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU,
650
+ inputMethod: inputMethod,
650
651
  selectedCount: selectedColumnCount,
651
652
  side: side,
652
653
  startIndex: startIndex
@@ -658,9 +659,10 @@ var insertLayoutColumnAt = function insertLayoutColumnAt(side, editorAnalyticsAP
658
659
  };
659
660
  };
660
661
  var insertLayoutColumn = exports.insertLayoutColumn = function insertLayoutColumn(side, editorAnalyticsAPI, api) {
662
+ var inputMethod = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU;
661
663
  return function (_ref5) {
662
664
  var tr = _ref5.tr;
663
- var result = insertLayoutColumnAt(side, editorAnalyticsAPI)({
665
+ var result = insertLayoutColumnAt(side, editorAnalyticsAPI, inputMethod)({
664
666
  tr: tr
665
667
  });
666
668
  if (result) {
@@ -801,25 +803,43 @@ var distributeLayoutColumns = exports.distributeLayoutColumns = function distrib
801
803
  };
802
804
  var toggleLayoutColumnMenu = exports.toggleLayoutColumnMenu = function toggleLayoutColumnMenu(_ref11) {
803
805
  var anchorPos = _ref11.anchorPos,
804
- isOpen = _ref11.isOpen;
806
+ isOpen = _ref11.isOpen,
807
+ openedViaKeyboard = _ref11.openedViaKeyboard;
805
808
  return function (_ref12) {
806
809
  var tr = _ref12.tr;
807
810
  tr.setMeta('toggleLayoutColumnMenu', {
808
811
  anchorPos: anchorPos,
809
- isOpen: isOpen
812
+ isOpen: isOpen,
813
+ openedViaKeyboard: openedViaKeyboard
810
814
  });
811
815
  tr.setMeta('scrollIntoView', false);
812
816
  return tr;
813
817
  };
814
818
  };
815
- var deleteLayoutColumn = exports.deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI, api) {
819
+ var setLayoutColumnDangerPreview = exports.setLayoutColumnDangerPreview = function setLayoutColumnDangerPreview(show) {
816
820
  return function (_ref13) {
817
- var _api$blockControls4;
821
+ var _selectedLayoutColumn;
818
822
  var tr = _ref13.tr;
823
+ var selectedLayoutColumnsResult = (0, _layoutColumnSelection.getSelectedLayoutColumnsFromSelection)(tr.selection);
824
+ var positions = show ? (_selectedLayoutColumn = selectedLayoutColumnsResult === null || selectedLayoutColumnsResult === void 0 ? void 0 : selectedLayoutColumnsResult.selectedLayoutColumns.map(function (_ref14) {
825
+ var pos = _ref14.pos;
826
+ return pos;
827
+ })) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : [] : null;
828
+ tr.setMeta('layoutColumnDangerPreview', positions);
829
+ tr.setMeta('addToHistory', false);
830
+ tr.setMeta('scrollIntoView', false);
831
+ return tr;
832
+ };
833
+ };
834
+ var deleteLayoutColumn = exports.deleteLayoutColumn = function deleteLayoutColumn(editorAnalyticsAPI, api) {
835
+ var inputMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU;
836
+ return function (_ref15) {
837
+ var _api$blockControls4;
838
+ var tr = _ref15.tr;
819
839
  if (!(0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
820
840
  return null;
821
841
  }
822
- var selectedLayoutColumnsResult = (0, _layoutColumnSelection.getSelectedLayoutColumnsFromSelection)(tr.selection);
842
+ var selectedLayoutColumnsResult = (0, _layoutColumnSelection.getLayoutColumnsFromContentSelection)(tr.selection);
823
843
  if (!selectedLayoutColumnsResult || selectedLayoutColumnsResult.selectedLayoutColumns.length === 0) {
824
844
  return null;
825
845
  }
@@ -836,7 +856,7 @@ var deleteLayoutColumn = exports.deleteLayoutColumn = function deleteLayoutColum
836
856
  attributes: {
837
857
  columnCount: columnCount,
838
858
  endIndex: endIndex,
839
- inputMethod: _analytics.INPUT_METHOD.LAYOUT_COLUMN_MENU,
859
+ inputMethod: inputMethod,
840
860
  selectedCount: selectedLayoutColumns.length,
841
861
  startIndex: startIndex
842
862
  },
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _analytics = require("@atlaskit/editor-common/analytics");
8
+ var _keymaps = require("@atlaskit/editor-common/keymaps");
9
+ var _actions = require("./actions");
10
+ var bindLayoutColumnShortcut = function bindLayoutColumnShortcut(shortcut, command, list) {
11
+ if (!shortcut) {
12
+ return;
13
+ }
14
+ (0, _keymaps.bindKeymapWithEditorCommand)(shortcut, command, list);
15
+ };
16
+
17
+ /**
18
+ * Creates shortcut handlers for layout column actions.
19
+ */
20
+ function keymapPlugin(_ref) {
21
+ var _api$analytics, _api$analytics2, _api$analytics3, _api$analytics4, _api$analytics5;
22
+ var api = _ref.api;
23
+ var list = {};
24
+ bindLayoutColumnShortcut(_keymaps.addColumnBefore.common, (0, _actions.insertLayoutColumn)('left', api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions, api, _analytics.INPUT_METHOD.KEYBOARD), list);
25
+ bindLayoutColumnShortcut(_keymaps.addColumnBeforeVO.common, (0, _actions.insertLayoutColumn)('left', api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions, api, _analytics.INPUT_METHOD.KEYBOARD), list);
26
+ bindLayoutColumnShortcut(_keymaps.addColumnAfter.common, (0, _actions.insertLayoutColumn)('right', api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 ? void 0 : _api$analytics3.actions, api, _analytics.INPUT_METHOD.KEYBOARD), list);
27
+ bindLayoutColumnShortcut(_keymaps.addColumnAfterVO.common, (0, _actions.insertLayoutColumn)('right', api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions, api, _analytics.INPUT_METHOD.KEYBOARD), list);
28
+ bindLayoutColumnShortcut(_keymaps.deleteColumn.common, (0, _actions.deleteLayoutColumn)(api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions, api, _analytics.INPUT_METHOD.KEYBOARD), list);
29
+ return (0, _keymaps.keymap)(list);
30
+ }
31
+ var _default = exports.default = keymapPlugin;
@@ -59,6 +59,18 @@ var getNodeDecoration = function getNodeDecoration(pos, node) {
59
59
  class: 'selected'
60
60
  })];
61
61
  };
62
+ var getDangerPreviewDecorations = function getDangerPreviewDecorations(state, positions) {
63
+ var _positions$flatMap;
64
+ return (_positions$flatMap = positions === null || positions === void 0 ? void 0 : positions.flatMap(function (pos) {
65
+ var node = state.doc.nodeAt(pos);
66
+ if (!node) {
67
+ return [];
68
+ }
69
+ return [_view2.Decoration.node(pos, pos + node.nodeSize, {
70
+ class: 'layout-column-danger-preview'
71
+ })];
72
+ })) !== null && _positions$flatMap !== void 0 ? _positions$flatMap : [];
73
+ };
62
74
  var getInitialPluginState = function getInitialPluginState(options, state) {
63
75
  var maybeLayoutSection = (0, _utils3.getMaybeLayoutSection)(state);
64
76
  var allowBreakout = options.allowBreakout || false;
@@ -74,9 +86,52 @@ var getInitialPluginState = function getInitialPluginState(options, state) {
74
86
  allowSingleColumnLayout: allowSingleColumnLayout,
75
87
  isResizing: false,
76
88
  isLayoutColumnMenuOpen: false,
77
- layoutColumnMenuAnchorPos: undefined
89
+ layoutColumnMenuOpenedViaKeyboard: false,
90
+ layoutColumnMenuAnchorPos: undefined,
91
+ dangerPreviewLayoutColumnPositions: undefined
78
92
  };
79
93
  };
94
+ var reduceLayoutColumnMenuState = function reduceLayoutColumnMenuState(pluginState, action) {
95
+ switch (action.type) {
96
+ case 'toggleLayoutColumnMenu':
97
+ {
98
+ var _action$meta = action.meta,
99
+ anchorPos = _action$meta.anchorPos,
100
+ isOpen = _action$meta.isOpen,
101
+ openedViaKeyboard = _action$meta.openedViaKeyboard;
102
+ var nextIsOpen = isOpen !== null && isOpen !== void 0 ? isOpen : !pluginState.isLayoutColumnMenuOpen;
103
+ return _objectSpread(_objectSpread({}, pluginState), {}, {
104
+ isLayoutColumnMenuOpen: nextIsOpen,
105
+ layoutColumnMenuOpenedViaKeyboard: nextIsOpen ? openedViaKeyboard !== null && openedViaKeyboard !== void 0 ? openedViaKeyboard : false : false,
106
+ layoutColumnMenuAnchorPos: nextIsOpen ? anchorPos : undefined,
107
+ dangerPreviewLayoutColumnPositions: nextIsOpen ? pluginState.dangerPreviewLayoutColumnPositions : undefined
108
+ });
109
+ }
110
+ case 'setDangerPreview':
111
+ return _objectSpread(_objectSpread({}, pluginState), {}, {
112
+ dangerPreviewLayoutColumnPositions: action.positions
113
+ });
114
+ case 'clearDangerPreview':
115
+ return _objectSpread(_objectSpread({}, pluginState), {}, {
116
+ dangerPreviewLayoutColumnPositions: undefined
117
+ });
118
+ case 'setResizeState':
119
+ return _objectSpread(_objectSpread({}, pluginState), {}, {
120
+ isResizing: action.isResizing
121
+ });
122
+ case 'syncSelectionState':
123
+ {
124
+ var maybeLayoutSection = (0, _utils3.getMaybeLayoutSection)(action.state);
125
+ return _objectSpread(_objectSpread({}, pluginState), {}, {
126
+ pos: maybeLayoutSection ? maybeLayoutSection.pos : null,
127
+ selectedLayout: (0, _actions.getSelectedLayout)(maybeLayoutSection && maybeLayoutSection.node,
128
+ // Ignored via go/ees005
129
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
130
+ pluginState.selectedLayout)
131
+ });
132
+ }
133
+ }
134
+ };
80
135
 
81
136
  // To prevent a single-column layout,
82
137
  // if a user attempts to delete a layout column and
@@ -123,28 +178,39 @@ var _default = exports.default = function _default(options, editorAnalyticsAPI)
123
178
  return getInitialPluginState(options, state);
124
179
  },
125
180
  apply: function apply(tr, pluginState, oldState, newState) {
126
- var _columnMenuMeta$isOpe, _tr$getMeta, _pluginKey$getState;
181
+ var _tr$getMeta, _pluginKey$getState;
182
+ var nextPluginState = pluginState;
127
183
  var columnMenuMeta = tr.getMeta('toggleLayoutColumnMenu');
128
- var nextPluginState = columnMenuMeta ? _objectSpread(_objectSpread({}, pluginState), {}, {
129
- isLayoutColumnMenuOpen: (_columnMenuMeta$isOpe = columnMenuMeta.isOpen) !== null && _columnMenuMeta$isOpe !== void 0 ? _columnMenuMeta$isOpe : !pluginState.isLayoutColumnMenuOpen,
130
- layoutColumnMenuAnchorPos: columnMenuMeta.isOpen === false ? undefined : columnMenuMeta.anchorPos
131
- }) : pluginState;
184
+ var dangerPreviewMeta = tr.getMeta('layoutColumnDangerPreview');
185
+ if (columnMenuMeta) {
186
+ nextPluginState = reduceLayoutColumnMenuState(nextPluginState, {
187
+ meta: columnMenuMeta,
188
+ type: 'toggleLayoutColumnMenu'
189
+ });
190
+ }
191
+ if (tr.getMeta('layoutColumnDangerPreview') !== undefined) {
192
+ nextPluginState = reduceLayoutColumnMenuState(nextPluginState, {
193
+ positions: dangerPreviewMeta !== null && dangerPreviewMeta !== void 0 ? dangerPreviewMeta : undefined,
194
+ type: 'setDangerPreview'
195
+ });
196
+ }
197
+ if (tr.docChanged) {
198
+ nextPluginState = reduceLayoutColumnMenuState(nextPluginState, {
199
+ type: 'clearDangerPreview'
200
+ });
201
+ }
132
202
  var isResizing = (0, _experiments.editorExperiment)('single_column_layouts', true) ? (_tr$getMeta = tr.getMeta('is-resizer-resizing')) !== null && _tr$getMeta !== void 0 ? _tr$getMeta : (_pluginKey$getState = _pluginKey.pluginKey.getState(oldState)) === null || _pluginKey$getState === void 0 ? void 0 : _pluginKey$getState.isResizing : false;
203
+ nextPluginState = reduceLayoutColumnMenuState(nextPluginState, {
204
+ isResizing: isResizing,
205
+ type: 'setResizeState'
206
+ });
133
207
  if (tr.docChanged || tr.selectionSet) {
134
- var maybeLayoutSection = (0, _utils3.getMaybeLayoutSection)(newState);
135
- var newPluginState = _objectSpread(_objectSpread({}, nextPluginState), {}, {
136
- pos: maybeLayoutSection ? maybeLayoutSection.pos : null,
137
- isResizing: isResizing,
138
- selectedLayout: (0, _actions.getSelectedLayout)(maybeLayoutSection && maybeLayoutSection.node,
139
- // Ignored via go/ees005
140
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
141
- pluginState.selectedLayout)
208
+ return reduceLayoutColumnMenuState(nextPluginState, {
209
+ state: newState,
210
+ type: 'syncSelectionState'
142
211
  });
143
- return newPluginState;
144
212
  }
145
- return _objectSpread(_objectSpread({}, nextPluginState), {}, {
146
- isResizing: isResizing
147
- });
213
+ return nextPluginState;
148
214
  }
149
215
  },
150
216
  props: {
@@ -154,14 +220,17 @@ var _default = exports.default = function _default(options, editorAnalyticsAPI)
154
220
  if ((0, _experiments.editorExperiment)('advanced_layouts', true) && (0, _experiments.editorExperiment)('platform_editor_layout_column_resize_handle', true) && isLayoutResizingPluginAvailable) {
155
221
  var dividerDecorations = (0, _columnResizeDivider.getColumnDividerDecorations)(state, editorViewRef, editorAnalyticsAPI);
156
222
  var selectedDecorations = layoutState.pos !== null ? getNodeDecoration(layoutState.pos, state.doc.nodeAt(layoutState.pos)) : [];
157
- var allDecorations = [].concat((0, _toConsumableArray2.default)(selectedDecorations), (0, _toConsumableArray2.default)(dividerDecorations));
223
+ var _dangerPreviewDecorations = getDangerPreviewDecorations(state, layoutState.dangerPreviewLayoutColumnPositions);
224
+ var allDecorations = [].concat((0, _toConsumableArray2.default)(selectedDecorations), (0, _toConsumableArray2.default)(dividerDecorations), (0, _toConsumableArray2.default)(_dangerPreviewDecorations));
158
225
  if (allDecorations.length > 0) {
159
226
  return _view2.DecorationSet.create(state.doc, allDecorations);
160
227
  }
161
228
  return undefined;
162
229
  }
163
- if (layoutState.pos !== null) {
164
- return _view2.DecorationSet.create(state.doc, getNodeDecoration(layoutState.pos, state.doc.nodeAt(layoutState.pos)));
230
+ var dangerPreviewDecorations = getDangerPreviewDecorations(state, layoutState.dangerPreviewLayoutColumnPositions);
231
+ if (layoutState.pos !== null || dangerPreviewDecorations.length > 0) {
232
+ var _selectedDecorations = layoutState.pos !== null ? getNodeDecoration(layoutState.pos, state.doc.nodeAt(layoutState.pos)) : [];
233
+ return _view2.DecorationSet.create(state.doc, [].concat((0, _toConsumableArray2.default)(_selectedDecorations), (0, _toConsumableArray2.default)(dangerPreviewDecorations)));
165
234
  }
166
235
  return undefined;
167
236
  },
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getSelectedLayoutColumnsFromSelection = exports.getLayoutColumnValign = exports.getLayoutColumnMenuAnchorPos = exports.getAllLayoutColumnsFromSelection = void 0;
6
+ exports.getSelectedLayoutColumnsFromSelection = exports.getLayoutColumnsFromContentSelection = exports.getLayoutColumnValign = exports.getLayoutColumnMenuAnchorPos = exports.getAllLayoutColumnsFromSelection = void 0;
7
7
  var _state = require("@atlaskit/editor-prosemirror/state");
8
8
  var _utils = require("@atlaskit/editor-prosemirror/utils");
9
9
  var findLayoutSectionFromSelection = function findLayoutSectionFromSelection(selection) {
@@ -28,7 +28,7 @@ var findLayoutColumnsFromLayoutSection = function findLayoutColumnsFromLayoutSec
28
28
  };
29
29
  });
30
30
  };
31
- var getSelectedLayoutColumnsFromSelection = exports.getSelectedLayoutColumnsFromSelection = function getSelectedLayoutColumnsFromSelection(selection) {
31
+ var getSelectedLayoutColumns = function getSelectedLayoutColumns(selection, isColumnSelected) {
32
32
  var layoutSection = findLayoutSectionFromSelection(selection);
33
33
  if (!layoutSection) {
34
34
  return undefined;
@@ -41,17 +41,15 @@ var getSelectedLayoutColumnsFromSelection = exports.getSelectedLayoutColumnsFrom
41
41
  }
42
42
  var startIndex = -1;
43
43
  var endIndex = -1;
44
- var selectedLayoutColumns = allLayoutColumns.filter(function (_ref2, index) {
45
- var node = _ref2.node,
46
- pos = _ref2.pos;
47
- var isSelected = selection.from <= pos && selection.to >= pos + node.nodeSize;
48
- if (isSelected) {
44
+ var selectedLayoutColumns = allLayoutColumns.filter(function (column, index) {
45
+ if (isColumnSelected(column, index)) {
49
46
  if (startIndex === -1) {
50
47
  startIndex = index;
51
48
  }
52
49
  endIndex = index;
50
+ return true;
53
51
  }
54
- return isSelected;
52
+ return false;
55
53
  });
56
54
  return {
57
55
  layoutSectionNode: layoutSectionNode,
@@ -61,6 +59,32 @@ var getSelectedLayoutColumnsFromSelection = exports.getSelectedLayoutColumnsFrom
61
59
  endIndex: endIndex
62
60
  };
63
61
  };
62
+ var getSelectedLayoutColumnsFromSelection = exports.getSelectedLayoutColumnsFromSelection = function getSelectedLayoutColumnsFromSelection(selection) {
63
+ return getSelectedLayoutColumns(selection, function (_ref2) {
64
+ var node = _ref2.node,
65
+ pos = _ref2.pos;
66
+ // NodeSelection on a layout column is clearly selected.
67
+ if (selection instanceof _state.NodeSelection && selection.node === node) {
68
+ return true;
69
+ }
70
+
71
+ // For TextSelection, only count columns that are fully contained within the selection
72
+ // (not partial text selections inside a column).
73
+ var nodeEndPos = pos + node.nodeSize;
74
+ return !selection.empty && selection.from <= pos && selection.to >= nodeEndPos;
75
+ });
76
+ };
77
+ var getLayoutColumnsFromContentSelection = exports.getLayoutColumnsFromContentSelection = function getLayoutColumnsFromContentSelection(selection) {
78
+ return getSelectedLayoutColumns(selection, function (_ref3) {
79
+ var node = _ref3.node,
80
+ pos = _ref3.pos;
81
+ if (selection instanceof _state.NodeSelection && selection.node === node) {
82
+ return true;
83
+ }
84
+ var nodeEndPos = pos + node.nodeSize;
85
+ return selection.empty ? selection.from > pos && selection.from < nodeEndPos : selection.from < nodeEndPos && selection.to > pos;
86
+ });
87
+ };
64
88
  var getAllLayoutColumnsFromSelection = exports.getAllLayoutColumnsFromSelection = function getAllLayoutColumnsFromSelection(selection) {
65
89
  var layoutSection = findLayoutSectionFromSelection(selection);
66
90
  if (!layoutSection) {
@@ -79,8 +103,8 @@ var getAllLayoutColumnsFromSelection = exports.getAllLayoutColumnsFromSelection
79
103
  };
80
104
  };
81
105
  var getLayoutColumnValign = exports.getLayoutColumnValign = function getLayoutColumnValign(layoutColumn) {
82
- var _ref3;
83
- return layoutColumn ? (_ref3 = layoutColumn.attrs.valign) !== null && _ref3 !== void 0 ? _ref3 : 'top' : undefined;
106
+ var _ref4;
107
+ return layoutColumn ? (_ref4 = layoutColumn.attrs.valign) !== null && _ref4 !== void 0 ? _ref4 : 'top' : undefined;
84
108
  };
85
109
  var getLayoutColumnMenuAnchorPos = exports.getLayoutColumnMenuAnchorPos = function getLayoutColumnMenuAnchorPos(selection, anchorPosFromHandle) {
86
110
  var _clickedSelectedColum, _selectedLayoutColumn;
@@ -88,8 +112,8 @@ var getLayoutColumnMenuAnchorPos = exports.getLayoutColumnMenuAnchorPos = functi
88
112
  if (!selectedLayoutColumns) {
89
113
  return undefined;
90
114
  }
91
- var clickedSelectedColumn = selectedLayoutColumns.selectedLayoutColumns.find(function (_ref4) {
92
- var pos = _ref4.pos;
115
+ var clickedSelectedColumn = selectedLayoutColumns.selectedLayoutColumns.find(function (_ref5) {
116
+ var pos = _ref5.pos;
93
117
  return pos === anchorPosFromHandle;
94
118
  });
95
119
  return (_clickedSelectedColum = clickedSelectedColumn === null || clickedSelectedColumn === void 0 ? void 0 : clickedSelectedColumn.pos) !== null && _clickedSelectedColum !== void 0 ? _clickedSelectedColum : (_selectedLayoutColumn = selectedLayoutColumns.selectedLayoutColumns[0]) === null || _selectedLayoutColumn === void 0 ? void 0 : _selectedLayoutColumn.pos;
@@ -7,25 +7,37 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.DeleteColumnDropdownItem = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactIntl = require("react-intl");
10
+ var _keymaps = require("@atlaskit/editor-common/keymaps");
10
11
  var _messages = require("@atlaskit/editor-common/messages");
11
12
  var _editorToolbar = require("@atlaskit/editor-toolbar");
12
13
  var _useSelectedLayoutColumns = require("./useSelectedLayoutColumns");
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 DeleteColumnDropdownItem = exports.DeleteColumnDropdownItem = function DeleteColumnDropdownItem(_ref) {
16
+ var _tooltip;
15
17
  var api = _ref.api;
16
18
  var _useIntl = (0, _reactIntl.useIntl)(),
17
19
  formatMessage = _useIntl.formatMessage;
18
20
  var selectedLayoutColumns = (0, _useSelectedLayoutColumns.useSelectedLayoutColumns)(api);
21
+ var setDangerPreview = (0, _react.useCallback)(function (show) {
22
+ var _api$core, _api$layout;
23
+ 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.setLayoutColumnDangerPreview(show));
24
+ }, [api]);
25
+ var showDangerPreview = (0, _react.useCallback)(function () {
26
+ setDangerPreview(true);
27
+ }, [setDangerPreview]);
28
+ var hideDangerPreview = (0, _react.useCallback)(function () {
29
+ setDangerPreview(false);
30
+ }, [setDangerPreview]);
19
31
  var onClick = (0, _react.useCallback)(function () {
20
- var _api$layout, _api$core;
21
- var deleteCommand = api === null || api === void 0 || (_api$layout = api.layout) === null || _api$layout === void 0 ? void 0 : _api$layout.commands.deleteLayoutColumn;
22
- api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (props) {
23
- var _api$layout2;
32
+ var _api$layout2, _api$core2;
33
+ var deleteCommand = api === null || api === void 0 || (_api$layout2 = api.layout) === null || _api$layout2 === void 0 ? void 0 : _api$layout2.commands.deleteLayoutColumn();
34
+ api === null || api === void 0 || (_api$core2 = api.core) === null || _api$core2 === void 0 || _api$core2.actions.execute(function (props) {
35
+ var _api$layout3;
24
36
  var tr = deleteCommand === null || deleteCommand === void 0 ? void 0 : deleteCommand(props);
25
37
  if (!tr) {
26
38
  return tr !== null && tr !== void 0 ? tr : null;
27
39
  }
28
- api === null || api === void 0 || (_api$layout2 = api.layout) === null || _api$layout2 === void 0 || _api$layout2.commands.toggleLayoutColumnMenu({
40
+ api === null || api === void 0 || (_api$layout3 = api.layout) === null || _api$layout3 === void 0 || _api$layout3.commands.toggleLayoutColumnMenu({
29
41
  isOpen: false
30
42
  })({
31
43
  tr: tr
@@ -38,11 +50,19 @@ var DeleteColumnDropdownItem = exports.DeleteColumnDropdownItem = function Delet
38
50
  }
39
51
  var selectedColumnCount = selectedLayoutColumns.selectedLayoutColumns.length;
40
52
  return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
53
+ ariaKeyshortcuts: (0, _keymaps.getAriaKeyshortcuts)(_keymaps.deleteColumn),
41
54
  onClick: onClick,
55
+ onFocus: showDangerPreview,
56
+ onMouseEnter: showDangerPreview,
57
+ onBlur: hideDangerPreview,
58
+ onMouseLeave: hideDangerPreview,
42
59
  elemBefore: /*#__PURE__*/_react.default.createElement(_editorToolbar.DeleteIcon, {
43
60
  color: "currentColor",
44
61
  label: "",
45
62
  size: "small"
63
+ }),
64
+ elemAfter: /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarKeyboardShortcutHint, {
65
+ shortcut: (_tooltip = (0, _keymaps.tooltip)(_keymaps.deleteColumn)) !== null && _tooltip !== void 0 ? _tooltip : ''
46
66
  })
47
67
  }, formatMessage(_messages.layoutMessages.deleteColumn, {
48
68
  count: selectedColumnCount
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.InsertColumnDropdownItem = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _reactIntl = require("react-intl");
10
+ var _keymaps = require("@atlaskit/editor-common/keymaps");
10
11
  var _messages = require("@atlaskit/editor-common/messages");
11
12
  var _editorToolbar = require("@atlaskit/editor-toolbar");
12
13
  var _actions = require("../../pm-plugins/actions");
@@ -25,7 +26,7 @@ var INSERT_COLUMN_OPTIONS = {
25
26
  }
26
27
  };
27
28
  var InsertColumnDropdownItem = exports.InsertColumnDropdownItem = function InsertColumnDropdownItem(_ref) {
28
- var _selectedLayoutColumn, _selectedLayoutColumn2;
29
+ var _selectedLayoutColumn, _selectedLayoutColumn2, _tooltip;
29
30
  var api = _ref.api,
30
31
  side = _ref.side;
31
32
  var _useIntl = (0, _reactIntl.useIntl)(),
@@ -33,6 +34,7 @@ var InsertColumnDropdownItem = exports.InsertColumnDropdownItem = function Inser
33
34
  var _INSERT_COLUMN_OPTION = INSERT_COLUMN_OPTIONS[side],
34
35
  Icon = _INSERT_COLUMN_OPTION.Icon,
35
36
  label = _INSERT_COLUMN_OPTION.label;
37
+ var shortcut = side === 'left' ? _keymaps.addColumnBefore : _keymaps.addColumnAfter;
36
38
  var selectedLayoutColumns = (0, _useSelectedLayoutColumns.useSelectedLayoutColumns)(api);
37
39
  var columnCount = (_selectedLayoutColumn = selectedLayoutColumns === null || selectedLayoutColumns === void 0 || (_selectedLayoutColumn2 = selectedLayoutColumns.layoutSectionNode) === null || _selectedLayoutColumn2 === void 0 ? void 0 : _selectedLayoutColumn2.childCount) !== null && _selectedLayoutColumn !== void 0 ? _selectedLayoutColumn : 0;
38
40
  var maxColumnCount = (0, _actions.getEffectiveMaxLayoutColumns)();
@@ -58,11 +60,15 @@ var InsertColumnDropdownItem = exports.InsertColumnDropdownItem = function Inser
58
60
  return null;
59
61
  }
60
62
  return /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarDropdownItem, {
63
+ ariaKeyshortcuts: (0, _keymaps.getAriaKeyshortcuts)(shortcut),
61
64
  elemBefore: /*#__PURE__*/_react.default.createElement(Icon, {
62
65
  color: "currentColor",
63
66
  label: "",
64
67
  size: "small"
65
68
  }),
69
+ elemAfter: /*#__PURE__*/_react.default.createElement(_editorToolbar.ToolbarKeyboardShortcutHint, {
70
+ shortcut: (_tooltip = (0, _keymaps.tooltip)(shortcut)) !== null && _tooltip !== void 0 ? _tooltip : ''
71
+ }),
66
72
  onClick: onClick
67
73
  }, formatMessage(label));
68
74
  };