@atlaskit/editor-plugin-block-controls 12.0.1 → 12.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/editor-plugin-block-controls
2
2
 
3
+ ## 12.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
+
16
+ ## 12.0.2
17
+
18
+ ### Patch Changes
19
+
20
+ - [`4c8035c5703fd`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/4c8035c5703fd) -
21
+ Add multiBodiedExtension support to block controls
22
+
3
23
  ## 12.0.1
4
24
 
5
25
  ### Patch Changes
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.getActiveDropTargetDecorations = exports.canMoveNodeOrSliceToPos = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
7
10
  var _selection = require("@atlaskit/editor-common/selection");
8
11
  var _utils = require("@atlaskit/editor-common/utils");
9
12
  var _utils2 = require("@atlaskit/editor-prosemirror/utils");
13
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
14
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
11
15
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
12
16
  var _decorationsCommon = require("./decorations-common");
@@ -19,18 +23,17 @@ var _validation = require("./utils/validation");
19
23
  * List of parent node types that can have child nodes
20
24
  */
21
25
  var PARENT_WITH_END_DROP_TARGET = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension'];
22
- var PARENT_WITH_END_DROP_TARGET_SYNC_BLOCK = [].concat(PARENT_WITH_END_DROP_TARGET, ['bodiedSyncBlock']);
23
26
 
24
27
  /**
25
28
  * List of node types that does not allow drop targets at before or after the node.
26
29
  */
27
30
  var NODE_WITH_NO_PARENT_POS = ['tableCell', 'tableHeader', 'layoutColumn'];
28
31
  var UNSUPPORTED_LAYOUT_CONTENT = ['syncBlock', 'bodiedSyncBlock'];
32
+ var getContainerNodeTypes = (0, _memoizeOne.default)(function () {
33
+ return [].concat(PARENT_WITH_END_DROP_TARGET, (0, _toConsumableArray2.default)((0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []), (0, _toConsumableArray2.default)((0, _experiments.editorExperiment)('platform_synced_block', true) ? ['bodiedSyncBlock'] : []));
34
+ });
29
35
  var isContainerNode = function isContainerNode(node) {
30
- if ((0, _experiments.editorExperiment)('platform_synced_block', true)) {
31
- return PARENT_WITH_END_DROP_TARGET_SYNC_BLOCK.includes(node.type.name);
32
- }
33
- return PARENT_WITH_END_DROP_TARGET.includes(node.type.name);
36
+ return getContainerNodeTypes().includes(node.type.name);
34
37
  };
35
38
  var canMoveNodeOrSliceToPos = exports.canMoveNodeOrSliceToPos = function canMoveNodeOrSliceToPos(state, node, parent, index, $toPos, activeNode) {
36
39
  // For deciding to show drop targets or not when multiple nodes are selected
@@ -6,11 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.findDropTargetDecs = exports.dropTargetDecorations = exports.createLayoutDropTargetDecoration = exports.createDropTargetDecoration = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
10
  var _react = require("react");
11
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
10
12
  var _uuid = _interopRequireDefault(require("uuid"));
11
13
  var _selection = require("@atlaskit/editor-common/selection");
12
14
  var _utils = require("@atlaskit/editor-common/utils");
13
15
  var _view = require("@atlaskit/editor-prosemirror/view");
16
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
17
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
15
18
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
16
19
  var _consts = require("../ui/consts");
@@ -23,8 +26,10 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
23
26
  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; } // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
24
27
  var IGNORE_NODES = ['tableCell', 'tableHeader', 'tableRow', 'layoutColumn', 'listItem', 'caption'];
25
28
  var PARENT_WITH_END_DROP_TARGET = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension'];
26
- var PARENT_WITH_END_DROP_TARGET_NEXT = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension', 'bodiedSyncBlock'];
27
29
  var DISABLE_CHILD_DROP_TARGET = ['orderedList', 'bulletList'];
30
+ var getParentTypesWithEndDropTarget = (0, _memoizeOne.default)(function () {
31
+ return [].concat(PARENT_WITH_END_DROP_TARGET, (0, _toConsumableArray2.default)((0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []), (0, _toConsumableArray2.default)((0, _experiments.editorExperiment)('platform_synced_block', true) ? ['bodiedSyncBlock'] : []));
32
+ });
28
33
  var shouldDescend = function shouldDescend(node) {
29
34
  return !['mediaSingle', 'paragraph', 'heading'].includes(node.type.name);
30
35
  };
@@ -197,6 +202,7 @@ var dropTargetDecorations = exports.dropTargetDecorations = function dropTargetD
197
202
  var selectionFrom = Math.min(expandedAnchor.pos, expandedHead.pos);
198
203
  var selectionTo = Math.max(expandedAnchor.pos, expandedHead.pos);
199
204
  var handleInsideSelection = activeNodePos !== undefined && activeNodePos >= selectionFrom && activeNodePos <= selectionTo;
205
+ var parentTypesWithEndDropTarget = getParentTypesWithEndDropTarget();
200
206
  newState.doc.nodesBetween(docFrom, docTo, function (node, pos, parent, index) {
201
207
  var depth = 0;
202
208
  // drop target deco at the end position
@@ -244,7 +250,6 @@ var dropTargetDecorations = exports.dropTargetDecorations = function dropTargetD
244
250
  pushNodeStack(node, depth);
245
251
  return false; //not valid pos, so nested not valid either
246
252
  }
247
- var parentTypesWithEndDropTarget = (0, _experiments.editorExperiment)('platform_synced_block', true) ? PARENT_WITH_END_DROP_TARGET_NEXT : PARENT_WITH_END_DROP_TARGET;
248
253
  var parentTypeName = (0, _expValEquals.expValEquals)('platform_editor_nest_table_in_panel', 'isEnabled', true) ? (0, _utils.getBaseNodeTypeName)(parent.type) : parent.type.name;
249
254
  if (parent.lastChild === node && !(0, _utils.isEmptyParagraph)(node) && parentTypesWithEndDropTarget.includes(parentTypeName)) {
250
255
  endPos = pos + node.nodeSize;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.calculatePosition = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
9
10
  var _consts = require("../ui/consts");
10
11
  var _anchorName = require("../ui/utils/anchor-name");
11
12
  var _domAttrName = require("../ui/utils/dom-attr-name");
@@ -34,7 +35,7 @@ var calculatePosition = exports.calculatePosition = function calculatePosition(_
34
35
  });
35
36
  var dom = view.dom.querySelector("[".concat((0, _domAttrName.getAnchorAttrName)(), "=\"").concat(safeAnchorName, "\"]"));
36
37
  var hasResizer = rootNodeType === 'table' || rootNodeType === 'mediaSingle';
37
- var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension';
38
+ var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension' || rootNodeType === 'multiBodiedExtension' && (0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension');
38
39
  var isBlockCard = rootNodeType === 'blockCard';
39
40
  var isEmbedCard = rootNodeType === 'embedCard';
40
41
  var isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.shouldMaskNodeControls = exports.shouldBeSticky = exports.getTopPosition = exports.getNodeHeight = exports.getLeftPosition = exports.getControlHeightCSSValue = exports.getControlBottomCSSValue = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
7
10
  var _styles = require("@atlaskit/editor-common/styles");
11
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
8
12
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
9
13
  var _consts = require("../../ui/consts");
10
14
  var STICKY_NODES = ['panel', 'table', 'expand', 'layoutSection', 'bodiedExtension'];
@@ -59,8 +63,11 @@ var getLeftPosition = exports.getLeftPosition = function getLeftPosition(dom, ty
59
63
  var getNodeHeight = exports.getNodeHeight = function getNodeHeight(dom, anchor, anchorRectCache) {
60
64
  return (anchorRectCache === null || anchorRectCache === void 0 ? void 0 : anchorRectCache.getHeight(anchor)) || (dom === null || dom === void 0 ? void 0 : dom.offsetHeight);
61
65
  };
66
+ var getStickyNodes = (0, _memoizeOne.default)(function () {
67
+ return [].concat(STICKY_NODES, (0, _toConsumableArray2.default)((0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []));
68
+ });
62
69
  var shouldBeSticky = exports.shouldBeSticky = function shouldBeSticky(nodeType) {
63
- return (0, _experiments.editorExperiment)('platform_editor_controls', 'variant1') && STICKY_NODES.includes(nodeType);
70
+ return (0, _experiments.editorExperiment)('platform_editor_controls', 'variant1') && getStickyNodes().includes(nodeType);
64
71
  };
65
72
  var getControlBottomCSSValue = exports.getControlBottomCSSValue = function getControlBottomCSSValue(anchor, isSticky, isTopLevelNode, isLayoutColumn) {
66
73
  return (0, _experiments.editorExperiment)('advanced_layouts', true) && isLayoutColumn || !isSticky || !isTopLevelNode ? {
@@ -9,6 +9,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
9
9
  var _styles = require("@atlaskit/editor-common/styles");
10
10
  var _utils = require("@atlaskit/editor-common/utils");
11
11
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
12
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
13
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
13
14
  var _dropTargetMarginMap;
14
15
  var DRAG_HANDLE_HEIGHT = exports.DRAG_HANDLE_HEIGHT = 24;
@@ -92,6 +93,11 @@ var getNestedNodeLeftPaddingMargin = exports.getNestedNodeLeftPaddingMargin = fu
92
93
  switch (nodeType) {
93
94
  case 'bodiedExtension':
94
95
  return '28px';
96
+ case 'multiBodiedExtension':
97
+ if ((0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension')) {
98
+ return '28px';
99
+ }
100
+ return "".concat(_styles.DRAG_HANDLE_WIDTH + DRAG_HANDLE_NARROW_GAP, "px");
95
101
  case 'expand':
96
102
  case 'nestedExpand':
97
103
  return '24px';
@@ -234,6 +240,10 @@ var spacingBetweenNodesForPreview = exports.spacingBetweenNodesForPreview = {
234
240
  top: '0',
235
241
  bottom: '0'
236
242
  },
243
+ multiBodiedExtension: {
244
+ top: '0',
245
+ bottom: '0'
246
+ },
237
247
  extension: {
238
248
  top: '0',
239
249
  bottom: '0'
@@ -313,6 +323,10 @@ var nodeMargins = exports.nodeMargins = {
313
323
  top: 0,
314
324
  bottom: 0
315
325
  },
326
+ multiBodiedExtension: {
327
+ top: 0,
328
+ bottom: 0
329
+ },
316
330
  extension: {
317
331
  top: 12,
318
332
  bottom: 12
@@ -469,7 +469,8 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
469
469
  if (nodeType === 'layoutColumn' && (0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
470
470
  tr.setMeta('toggleLayoutColumnMenu', {
471
471
  anchorPos: startPos,
472
- isOpen: true
472
+ isOpen: true,
473
+ openedViaKeyboard: false
473
474
  });
474
475
  }
475
476
  var resolvedStartPos = tr.doc.resolve(startPos);
@@ -523,7 +524,8 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
523
524
  if (nodeType === 'layoutColumn' && (0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
524
525
  tr.setMeta('toggleLayoutColumnMenu', {
525
526
  anchorPos: startPos,
526
- isOpen: true
527
+ isOpen: true,
528
+ openedViaKeyboard: false
527
529
  });
528
530
  }
529
531
  var mSelect = api === null || api === void 0 || (_api$blockControls$sh = api.blockControls.sharedState.currentState()) === null || _api$blockControls$sh === void 0 ? void 0 : _api$blockControls$sh.multiSelectDnD;
@@ -611,6 +613,13 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
611
613
  api === null || api === void 0 || (_api$blockControls4 = api.blockControls) === null || _api$blockControls4 === void 0 || _api$blockControls4.commands.startPreservingSelection()({
612
614
  tr: tr
613
615
  });
616
+ if (nodeType === 'layoutColumn' && (0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_layout_column_menu', 'isEnabled', true)) {
617
+ tr.setMeta('toggleLayoutColumnMenu', {
618
+ anchorPos: startPos,
619
+ isOpen: true,
620
+ openedViaKeyboard: true
621
+ });
622
+ }
614
623
  var rootPos = (0, _experiments.editorExperiment)('platform_synced_block', true) ? tr.doc.resolve(startPos).before(1) : undefined;
615
624
  var triggerByNode = (0, _experiments.editorExperiment)('platform_synced_block', true) ? {
616
625
  nodeType: nodeType,
@@ -819,7 +828,7 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
819
828
  }) : anchorName;
820
829
  var dom = view.dom.querySelector("[".concat((0, _domAttrName.getAnchorAttrName)(), "=\"").concat(safeAnchorName, "\"]"));
821
830
  var hasResizer = nodeType === 'table' || nodeType === 'mediaSingle';
822
- var isExtension = nodeType === 'extension' || nodeType === 'bodiedExtension' || nodeType === 'multiBodiedExtension';
831
+ var isExtension = nodeType === 'extension' || nodeType === 'bodiedExtension' || nodeType === 'multiBodiedExtension' && (0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension');
823
832
  var isBlockCard = nodeType === 'blockCard' && !!blockCardWidth;
824
833
  var isEmbedCard = nodeType === 'embedCard';
825
834
  var isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -10,6 +10,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
10
10
  var _react = require("react");
11
11
  var _react2 = require("@emotion/react");
12
12
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
13
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
14
  var _box = require("@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box");
14
15
  var _adapter = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
15
16
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
@@ -83,7 +84,7 @@ var getWidthOffset = function getWidthOffset(node, width, position) {
83
84
  return isLeftPosition ? "0.5*(var(--ak-editor--line-length) - ".concat(width, ")") : "-0.5*(var(--ak-editor--line-length) - ".concat(width, ")");
84
85
  }
85
86
  }
86
- if (node.type.name === 'bodiedExtension' || node.type.name === 'extension') {
87
+ if (node.type.name === 'bodiedExtension' || node.type.name === 'extension' || node.type.name === 'multiBodiedExtension' && (0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension')) {
87
88
  return '-12px';
88
89
  }
89
90
  };
@@ -191,7 +191,7 @@ var TypeAheadControl = exports.TypeAheadControl = function TypeAheadControl(_ref
191
191
  });
192
192
  var dom = view.dom.querySelector("[".concat((0, _domAttrName.getAnchorAttrName)(), "=\"").concat(safeAnchorName, "\"]"));
193
193
  var hasResizer = rootNodeType === 'table' || rootNodeType === 'mediaSingle';
194
- var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension';
194
+ var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension' || rootNodeType === 'multiBodiedExtension' && (0, _platformFeatureFlags.fg)('confluence_frontend_native_tabs_extension');
195
195
  var isBlockCard = rootNodeType === 'blockCard';
196
196
  var isEmbedCard = rootNodeType === 'embedCard';
197
197
  var isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -1,6 +1,8 @@
1
+ import memoizeOne from 'memoize-one';
1
2
  import { expandSelectionBounds } from '@atlaskit/editor-common/selection';
2
3
  import { isEmptyParagraph } from '@atlaskit/editor-common/utils';
3
4
  import { findChildrenByType } from '@atlaskit/editor-prosemirror/utils';
5
+ import { fg } from '@atlaskit/platform-feature-flags';
4
6
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
5
7
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
6
8
  import { getNodeAnchor } from './decorations-common';
@@ -14,18 +16,15 @@ import { canMoveNodeToIndex, canMoveSliceToIndex, isInSameLayout } from './utils
14
16
  * List of parent node types that can have child nodes
15
17
  */
16
18
  const PARENT_WITH_END_DROP_TARGET = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension'];
17
- const PARENT_WITH_END_DROP_TARGET_SYNC_BLOCK = [...PARENT_WITH_END_DROP_TARGET, 'bodiedSyncBlock'];
18
19
 
19
20
  /**
20
21
  * List of node types that does not allow drop targets at before or after the node.
21
22
  */
22
23
  const NODE_WITH_NO_PARENT_POS = ['tableCell', 'tableHeader', 'layoutColumn'];
23
24
  const UNSUPPORTED_LAYOUT_CONTENT = ['syncBlock', 'bodiedSyncBlock'];
25
+ const getContainerNodeTypes = memoizeOne(() => [...PARENT_WITH_END_DROP_TARGET, ...(fg('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []), ...(editorExperiment('platform_synced_block', true) ? ['bodiedSyncBlock'] : [])]);
24
26
  const isContainerNode = node => {
25
- if (editorExperiment('platform_synced_block', true)) {
26
- return PARENT_WITH_END_DROP_TARGET_SYNC_BLOCK.includes(node.type.name);
27
- }
28
- return PARENT_WITH_END_DROP_TARGET.includes(node.type.name);
27
+ return getContainerNodeTypes().includes(node.type.name);
29
28
  };
30
29
  export const canMoveNodeOrSliceToPos = (state, node, parent, index, $toPos, activeNode) => {
31
30
  // For deciding to show drop targets or not when multiple nodes are selected
@@ -1,9 +1,11 @@
1
1
  import { createElement } from 'react';
2
+ import memoizeOne from 'memoize-one';
2
3
  // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
3
4
  import uuid from 'uuid';
4
5
  import { expandSelectionBounds } from '@atlaskit/editor-common/selection';
5
6
  import { getBaseNodeTypeName, isEmptyParagraph } from '@atlaskit/editor-common/utils';
6
7
  import { Decoration } from '@atlaskit/editor-prosemirror/view';
8
+ import { fg } from '@atlaskit/platform-feature-flags';
7
9
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
8
10
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
9
11
  import { nodeMargins } from '../ui/consts';
@@ -14,8 +16,8 @@ import { maxLayoutColumnSupported } from './utils/consts';
14
16
  import { canMoveNodeToIndex, canMoveSliceToIndex, isInSameLayout } from './utils/validation';
15
17
  const IGNORE_NODES = ['tableCell', 'tableHeader', 'tableRow', 'layoutColumn', 'listItem', 'caption'];
16
18
  const PARENT_WITH_END_DROP_TARGET = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension'];
17
- const PARENT_WITH_END_DROP_TARGET_NEXT = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension', 'bodiedSyncBlock'];
18
19
  const DISABLE_CHILD_DROP_TARGET = ['orderedList', 'bulletList'];
20
+ const getParentTypesWithEndDropTarget = memoizeOne(() => [...PARENT_WITH_END_DROP_TARGET, ...(fg('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []), ...(editorExperiment('platform_synced_block', true) ? ['bodiedSyncBlock'] : [])]);
19
21
  const shouldDescend = node => {
20
22
  return !['mediaSingle', 'paragraph', 'heading'].includes(node.type.name);
21
23
  };
@@ -186,6 +188,7 @@ export const dropTargetDecorations = (newState, api, formatMessage, nodeViewPort
186
188
  const selectionFrom = Math.min(expandedAnchor.pos, expandedHead.pos);
187
189
  const selectionTo = Math.max(expandedAnchor.pos, expandedHead.pos);
188
190
  const handleInsideSelection = activeNodePos !== undefined && activeNodePos >= selectionFrom && activeNodePos <= selectionTo;
191
+ const parentTypesWithEndDropTarget = getParentTypesWithEndDropTarget();
189
192
  newState.doc.nodesBetween(docFrom, docTo, (node, pos, parent, index) => {
190
193
  let depth = 0;
191
194
  // drop target deco at the end position
@@ -233,7 +236,6 @@ export const dropTargetDecorations = (newState, api, formatMessage, nodeViewPort
233
236
  pushNodeStack(node, depth);
234
237
  return false; //not valid pos, so nested not valid either
235
238
  }
236
- const parentTypesWithEndDropTarget = editorExperiment('platform_synced_block', true) ? PARENT_WITH_END_DROP_TARGET_NEXT : PARENT_WITH_END_DROP_TARGET;
237
239
  const parentTypeName = expValEquals('platform_editor_nest_table_in_panel', 'isEnabled', true) ? getBaseNodeTypeName(parent.type) : parent.type.name;
238
240
  if (parent.lastChild === node && !isEmptyParagraph(node) && parentTypesWithEndDropTarget.includes(parentTypeName)) {
239
241
  endPos = pos + node.nodeSize;
@@ -1,3 +1,4 @@
1
+ import { fg } from '@atlaskit/platform-feature-flags';
1
2
  import { rootElementGap, topPositionAdjustment, QUICK_INSERT_DIMENSIONS, QUICK_INSERT_LEFT_OFFSET } from '../ui/consts';
2
3
  import { refreshAnchorName } from '../ui/utils/anchor-name';
3
4
  import { getAnchorAttrName } from '../ui/utils/dom-attr-name';
@@ -26,7 +27,7 @@ export const calculatePosition = ({
26
27
  });
27
28
  const dom = view.dom.querySelector(`[${getAnchorAttrName()}="${safeAnchorName}"]`);
28
29
  const hasResizer = rootNodeType === 'table' || rootNodeType === 'mediaSingle';
29
- const isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension';
30
+ const isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension' || rootNodeType === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension');
30
31
  const isBlockCard = rootNodeType === 'blockCard';
31
32
  const isEmbedCard = rootNodeType === 'embedCard';
32
33
  const isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -1,4 +1,6 @@
1
+ import memoizeOne from 'memoize-one';
1
2
  import { DRAG_HANDLE_WIDTH } from '@atlaskit/editor-common/styles';
3
+ import { fg } from '@atlaskit/platform-feature-flags';
2
4
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
3
5
  import { DRAG_HANDLE_DIVIDER_TOP_ADJUSTMENT, DRAG_HANDLE_H1_TOP_ADJUSTMENT, DRAG_HANDLE_H2_TOP_ADJUSTMENT, DRAG_HANDLE_H4_TOP_ADJUSTMENT, DRAG_HANDLE_H5_TOP_ADJUSTMENT, DRAG_HANDLE_H6_TOP_ADJUSTMENT, DRAG_HANDLE_HEIGHT, DRAG_HANDLE_PARAGRAPH_SMALL_TOP_ADJUSTMENT, DRAG_HANDLE_PARAGRAPH_TOP_ADJUSTMENT, dragHandleGap } from '../../ui/consts';
4
6
  const STICKY_NODES = ['panel', 'table', 'expand', 'layoutSection', 'bodiedExtension'];
@@ -51,8 +53,9 @@ export const getLeftPosition = (dom, type, innerContainer, macroInteractionUpdat
51
53
 
52
54
  // anchorRectCache seems to have a 100% cache miss rate
53
55
  export const getNodeHeight = (dom, anchor, anchorRectCache) => (anchorRectCache === null || anchorRectCache === void 0 ? void 0 : anchorRectCache.getHeight(anchor)) || (dom === null || dom === void 0 ? void 0 : dom.offsetHeight);
56
+ const getStickyNodes = memoizeOne(() => [...STICKY_NODES, ...(fg('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : [])]);
54
57
  export const shouldBeSticky = nodeType => {
55
- return editorExperiment('platform_editor_controls', 'variant1') && STICKY_NODES.includes(nodeType);
58
+ return editorExperiment('platform_editor_controls', 'variant1') && getStickyNodes().includes(nodeType);
56
59
  };
57
60
  export const getControlBottomCSSValue = (anchor, isSticky, isTopLevelNode, isLayoutColumn) => {
58
61
  return editorExperiment('advanced_layouts', true) && isLayoutColumn || !isSticky || !isTopLevelNode ? {
@@ -1,6 +1,7 @@
1
1
  import { DRAG_HANDLE_WIDTH } from '@atlaskit/editor-common/styles';
2
2
  import { breakoutResizableNodes as breakoutResizableNodesNew } from '@atlaskit/editor-common/utils';
3
3
  import { akEditorUnitZIndex, akRichMediaResizeZIndex } from '@atlaskit/editor-shared-styles';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
5
6
  export const DRAG_HANDLE_HEIGHT = 24;
6
7
  export const DRAG_HANDLE_BORDER_RADIUS = 4;
@@ -83,6 +84,11 @@ export const getNestedNodeLeftPaddingMargin = nodeType => {
83
84
  switch (nodeType) {
84
85
  case 'bodiedExtension':
85
86
  return '28px';
87
+ case 'multiBodiedExtension':
88
+ if (fg('confluence_frontend_native_tabs_extension')) {
89
+ return '28px';
90
+ }
91
+ return `${DRAG_HANDLE_WIDTH + DRAG_HANDLE_NARROW_GAP}px`;
86
92
  case 'expand':
87
93
  case 'nestedExpand':
88
94
  return '24px';
@@ -243,6 +249,10 @@ export const spacingBetweenNodesForPreview = {
243
249
  top: '0',
244
250
  bottom: '0'
245
251
  },
252
+ multiBodiedExtension: {
253
+ top: '0',
254
+ bottom: '0'
255
+ },
246
256
  extension: {
247
257
  top: '0',
248
258
  bottom: '0'
@@ -322,6 +332,10 @@ export const nodeMargins = {
322
332
  top: 0,
323
333
  bottom: 0
324
334
  },
335
+ multiBodiedExtension: {
336
+ top: 0,
337
+ bottom: 0
338
+ },
325
339
  extension: {
326
340
  top: 12,
327
341
  bottom: 12
@@ -444,7 +444,8 @@ export const DragHandle = ({
444
444
  if (nodeType === 'layoutColumn' && expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
445
445
  tr.setMeta('toggleLayoutColumnMenu', {
446
446
  anchorPos: startPos,
447
- isOpen: true
447
+ isOpen: true,
448
+ openedViaKeyboard: false
448
449
  });
449
450
  }
450
451
  const resolvedStartPos = tr.doc.resolve(startPos);
@@ -499,7 +500,8 @@ export const DragHandle = ({
499
500
  if (nodeType === 'layoutColumn' && expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
500
501
  tr.setMeta('toggleLayoutColumnMenu', {
501
502
  anchorPos: startPos,
502
- isOpen: true
503
+ isOpen: true,
504
+ openedViaKeyboard: false
503
505
  });
504
506
  }
505
507
  const mSelect = api === null || api === void 0 ? void 0 : (_api$blockControls$sh = api.blockControls.sharedState.currentState()) === null || _api$blockControls$sh === void 0 ? void 0 : _api$blockControls$sh.multiSelectDnD;
@@ -587,6 +589,13 @@ export const DragHandle = ({
587
589
  api === null || api === void 0 ? void 0 : (_api$blockControls4 = api.blockControls) === null || _api$blockControls4 === void 0 ? void 0 : _api$blockControls4.commands.startPreservingSelection()({
588
590
  tr
589
591
  });
592
+ if (nodeType === 'layoutColumn' && expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
593
+ tr.setMeta('toggleLayoutColumnMenu', {
594
+ anchorPos: startPos,
595
+ isOpen: true,
596
+ openedViaKeyboard: true
597
+ });
598
+ }
590
599
  const rootPos = editorExperiment('platform_synced_block', true) ? tr.doc.resolve(startPos).before(1) : undefined;
591
600
  const triggerByNode = editorExperiment('platform_synced_block', true) ? {
592
601
  nodeType,
@@ -799,7 +808,7 @@ export const DragHandle = ({
799
808
  }) : anchorName;
800
809
  const dom = view.dom.querySelector(`[${getAnchorAttrName()}="${safeAnchorName}"]`);
801
810
  const hasResizer = nodeType === 'table' || nodeType === 'mediaSingle';
802
- const isExtension = nodeType === 'extension' || nodeType === 'bodiedExtension' || nodeType === 'multiBodiedExtension';
811
+ const isExtension = nodeType === 'extension' || nodeType === 'bodiedExtension' || nodeType === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension');
803
812
  const isBlockCard = nodeType === 'blockCard' && !!blockCardWidth;
804
813
  const isEmbedCard = nodeType === 'embedCard';
805
814
  const isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -8,6 +8,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
8
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled, @typescript-eslint/consistent-type-imports
9
9
  import { css, jsx } from '@emotion/react';
10
10
  import { akEditorBreakoutPadding } from '@atlaskit/editor-shared-styles';
11
+ import { fg } from '@atlaskit/platform-feature-flags';
11
12
  import { DropIndicator } from '@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box';
12
13
  import { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
13
14
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
@@ -72,7 +73,7 @@ const getWidthOffset = (node, width, position) => {
72
73
  return isLeftPosition ? `0.5*(var(--ak-editor--line-length) - ${width})` : `-0.5*(var(--ak-editor--line-length) - ${width})`;
73
74
  }
74
75
  }
75
- if (node.type.name === 'bodiedExtension' || node.type.name === 'extension') {
76
+ if (node.type.name === 'bodiedExtension' || node.type.name === 'extension' || node.type.name === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension')) {
76
77
  return '-12px';
77
78
  }
78
79
  };
@@ -180,7 +180,7 @@ export const TypeAheadControl = ({
180
180
  });
181
181
  const dom = view.dom.querySelector(`[${getAnchorAttrName()}="${safeAnchorName}"]`);
182
182
  const hasResizer = rootNodeType === 'table' || rootNodeType === 'mediaSingle';
183
- const isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension';
183
+ const isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension' || rootNodeType === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension');
184
184
  const isBlockCard = rootNodeType === 'blockCard';
185
185
  const isEmbedCard = rootNodeType === 'embedCard';
186
186
  const isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -1,6 +1,9 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import memoizeOne from 'memoize-one';
1
3
  import { expandSelectionBounds } from '@atlaskit/editor-common/selection';
2
4
  import { isEmptyParagraph } from '@atlaskit/editor-common/utils';
3
5
  import { findChildrenByType } from '@atlaskit/editor-prosemirror/utils';
6
+ import { fg } from '@atlaskit/platform-feature-flags';
4
7
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
5
8
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
6
9
  import { getNodeAnchor } from './decorations-common';
@@ -14,18 +17,17 @@ import { canMoveNodeToIndex, canMoveSliceToIndex, isInSameLayout } from './utils
14
17
  * List of parent node types that can have child nodes
15
18
  */
16
19
  var PARENT_WITH_END_DROP_TARGET = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension'];
17
- var PARENT_WITH_END_DROP_TARGET_SYNC_BLOCK = [].concat(PARENT_WITH_END_DROP_TARGET, ['bodiedSyncBlock']);
18
20
 
19
21
  /**
20
22
  * List of node types that does not allow drop targets at before or after the node.
21
23
  */
22
24
  var NODE_WITH_NO_PARENT_POS = ['tableCell', 'tableHeader', 'layoutColumn'];
23
25
  var UNSUPPORTED_LAYOUT_CONTENT = ['syncBlock', 'bodiedSyncBlock'];
26
+ var getContainerNodeTypes = memoizeOne(function () {
27
+ return [].concat(PARENT_WITH_END_DROP_TARGET, _toConsumableArray(fg('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []), _toConsumableArray(editorExperiment('platform_synced_block', true) ? ['bodiedSyncBlock'] : []));
28
+ });
24
29
  var isContainerNode = function isContainerNode(node) {
25
- if (editorExperiment('platform_synced_block', true)) {
26
- return PARENT_WITH_END_DROP_TARGET_SYNC_BLOCK.includes(node.type.name);
27
- }
28
- return PARENT_WITH_END_DROP_TARGET.includes(node.type.name);
30
+ return getContainerNodeTypes().includes(node.type.name);
29
31
  };
30
32
  export var canMoveNodeOrSliceToPos = function canMoveNodeOrSliceToPos(state, node, parent, index, $toPos, activeNode) {
31
33
  // For deciding to show drop targets or not when multiple nodes are selected
@@ -1,12 +1,15 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
3
  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; }
3
4
  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) { _defineProperty(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; }
4
5
  import { createElement } from 'react';
6
+ import memoizeOne from 'memoize-one';
5
7
  // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
6
8
  import uuid from 'uuid';
7
9
  import { expandSelectionBounds } from '@atlaskit/editor-common/selection';
8
10
  import { getBaseNodeTypeName, isEmptyParagraph } from '@atlaskit/editor-common/utils';
9
11
  import { Decoration } from '@atlaskit/editor-prosemirror/view';
12
+ import { fg } from '@atlaskit/platform-feature-flags';
10
13
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
11
14
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
12
15
  import { nodeMargins } from '../ui/consts';
@@ -17,8 +20,10 @@ import { maxLayoutColumnSupported } from './utils/consts';
17
20
  import { canMoveNodeToIndex, canMoveSliceToIndex, isInSameLayout } from './utils/validation';
18
21
  var IGNORE_NODES = ['tableCell', 'tableHeader', 'tableRow', 'layoutColumn', 'listItem', 'caption'];
19
22
  var PARENT_WITH_END_DROP_TARGET = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension'];
20
- var PARENT_WITH_END_DROP_TARGET_NEXT = ['tableCell', 'tableHeader', 'panel', 'layoutColumn', 'expand', 'nestedExpand', 'bodiedExtension', 'bodiedSyncBlock'];
21
23
  var DISABLE_CHILD_DROP_TARGET = ['orderedList', 'bulletList'];
24
+ var getParentTypesWithEndDropTarget = memoizeOne(function () {
25
+ return [].concat(PARENT_WITH_END_DROP_TARGET, _toConsumableArray(fg('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []), _toConsumableArray(editorExperiment('platform_synced_block', true) ? ['bodiedSyncBlock'] : []));
26
+ });
22
27
  var shouldDescend = function shouldDescend(node) {
23
28
  return !['mediaSingle', 'paragraph', 'heading'].includes(node.type.name);
24
29
  };
@@ -191,6 +196,7 @@ export var dropTargetDecorations = function dropTargetDecorations(newState, api,
191
196
  var selectionFrom = Math.min(expandedAnchor.pos, expandedHead.pos);
192
197
  var selectionTo = Math.max(expandedAnchor.pos, expandedHead.pos);
193
198
  var handleInsideSelection = activeNodePos !== undefined && activeNodePos >= selectionFrom && activeNodePos <= selectionTo;
199
+ var parentTypesWithEndDropTarget = getParentTypesWithEndDropTarget();
194
200
  newState.doc.nodesBetween(docFrom, docTo, function (node, pos, parent, index) {
195
201
  var depth = 0;
196
202
  // drop target deco at the end position
@@ -238,7 +244,6 @@ export var dropTargetDecorations = function dropTargetDecorations(newState, api,
238
244
  pushNodeStack(node, depth);
239
245
  return false; //not valid pos, so nested not valid either
240
246
  }
241
- var parentTypesWithEndDropTarget = editorExperiment('platform_synced_block', true) ? PARENT_WITH_END_DROP_TARGET_NEXT : PARENT_WITH_END_DROP_TARGET;
242
247
  var parentTypeName = expValEquals('platform_editor_nest_table_in_panel', 'isEnabled', true) ? getBaseNodeTypeName(parent.type) : parent.type.name;
243
248
  if (parent.lastChild === node && !isEmptyParagraph(node) && parentTypesWithEndDropTarget.includes(parentTypeName)) {
244
249
  endPos = pos + node.nodeSize;
@@ -1,6 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  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; }
3
3
  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) { _defineProperty(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; }
4
+ import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import { rootElementGap, topPositionAdjustment, QUICK_INSERT_DIMENSIONS, QUICK_INSERT_LEFT_OFFSET } from '../ui/consts';
5
6
  import { refreshAnchorName } from '../ui/utils/anchor-name';
6
7
  import { getAnchorAttrName } from '../ui/utils/dom-attr-name';
@@ -28,7 +29,7 @@ export var calculatePosition = function calculatePosition(_ref) {
28
29
  });
29
30
  var dom = view.dom.querySelector("[".concat(getAnchorAttrName(), "=\"").concat(safeAnchorName, "\"]"));
30
31
  var hasResizer = rootNodeType === 'table' || rootNodeType === 'mediaSingle';
31
- var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension';
32
+ var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension' || rootNodeType === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension');
32
33
  var isBlockCard = rootNodeType === 'blockCard';
33
34
  var isEmbedCard = rootNodeType === 'embedCard';
34
35
  var isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -1,4 +1,7 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import memoizeOne from 'memoize-one';
1
3
  import { DRAG_HANDLE_WIDTH } from '@atlaskit/editor-common/styles';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
2
5
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
3
6
  import { DRAG_HANDLE_DIVIDER_TOP_ADJUSTMENT, DRAG_HANDLE_H1_TOP_ADJUSTMENT, DRAG_HANDLE_H2_TOP_ADJUSTMENT, DRAG_HANDLE_H4_TOP_ADJUSTMENT, DRAG_HANDLE_H5_TOP_ADJUSTMENT, DRAG_HANDLE_H6_TOP_ADJUSTMENT, DRAG_HANDLE_HEIGHT, DRAG_HANDLE_PARAGRAPH_SMALL_TOP_ADJUSTMENT, DRAG_HANDLE_PARAGRAPH_TOP_ADJUSTMENT, dragHandleGap } from '../../ui/consts';
4
7
  var STICKY_NODES = ['panel', 'table', 'expand', 'layoutSection', 'bodiedExtension'];
@@ -53,8 +56,11 @@ export var getLeftPosition = function getLeftPosition(dom, type, innerContainer,
53
56
  export var getNodeHeight = function getNodeHeight(dom, anchor, anchorRectCache) {
54
57
  return (anchorRectCache === null || anchorRectCache === void 0 ? void 0 : anchorRectCache.getHeight(anchor)) || (dom === null || dom === void 0 ? void 0 : dom.offsetHeight);
55
58
  };
59
+ var getStickyNodes = memoizeOne(function () {
60
+ return [].concat(STICKY_NODES, _toConsumableArray(fg('confluence_frontend_native_tabs_extension') ? ['multiBodiedExtension'] : []));
61
+ });
56
62
  export var shouldBeSticky = function shouldBeSticky(nodeType) {
57
- return editorExperiment('platform_editor_controls', 'variant1') && STICKY_NODES.includes(nodeType);
63
+ return editorExperiment('platform_editor_controls', 'variant1') && getStickyNodes().includes(nodeType);
58
64
  };
59
65
  export var getControlBottomCSSValue = function getControlBottomCSSValue(anchor, isSticky, isTopLevelNode, isLayoutColumn) {
60
66
  return editorExperiment('advanced_layouts', true) && isLayoutColumn || !isSticky || !isTopLevelNode ? {
@@ -3,6 +3,7 @@ var _dropTargetMarginMap;
3
3
  import { DRAG_HANDLE_WIDTH } from '@atlaskit/editor-common/styles';
4
4
  import { breakoutResizableNodes as breakoutResizableNodesNew } from '@atlaskit/editor-common/utils';
5
5
  import { akEditorUnitZIndex, akRichMediaResizeZIndex } from '@atlaskit/editor-shared-styles';
6
+ import { fg } from '@atlaskit/platform-feature-flags';
6
7
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
7
8
  export var DRAG_HANDLE_HEIGHT = 24;
8
9
  export var DRAG_HANDLE_BORDER_RADIUS = 4;
@@ -85,6 +86,11 @@ export var getNestedNodeLeftPaddingMargin = function getNestedNodeLeftPaddingMar
85
86
  switch (nodeType) {
86
87
  case 'bodiedExtension':
87
88
  return '28px';
89
+ case 'multiBodiedExtension':
90
+ if (fg('confluence_frontend_native_tabs_extension')) {
91
+ return '28px';
92
+ }
93
+ return "".concat(DRAG_HANDLE_WIDTH + DRAG_HANDLE_NARROW_GAP, "px");
88
94
  case 'expand':
89
95
  case 'nestedExpand':
90
96
  return '24px';
@@ -227,6 +233,10 @@ export var spacingBetweenNodesForPreview = {
227
233
  top: '0',
228
234
  bottom: '0'
229
235
  },
236
+ multiBodiedExtension: {
237
+ top: '0',
238
+ bottom: '0'
239
+ },
230
240
  extension: {
231
241
  top: '0',
232
242
  bottom: '0'
@@ -306,6 +316,10 @@ export var nodeMargins = {
306
316
  top: 0,
307
317
  bottom: 0
308
318
  },
319
+ multiBodiedExtension: {
320
+ top: 0,
321
+ bottom: 0
322
+ },
309
323
  extension: {
310
324
  top: 12,
311
325
  bottom: 12
@@ -465,7 +465,8 @@ export var DragHandle = function DragHandle(_ref) {
465
465
  if (nodeType === 'layoutColumn' && expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
466
466
  tr.setMeta('toggleLayoutColumnMenu', {
467
467
  anchorPos: startPos,
468
- isOpen: true
468
+ isOpen: true,
469
+ openedViaKeyboard: false
469
470
  });
470
471
  }
471
472
  var resolvedStartPos = tr.doc.resolve(startPos);
@@ -519,7 +520,8 @@ export var DragHandle = function DragHandle(_ref) {
519
520
  if (nodeType === 'layoutColumn' && expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
520
521
  tr.setMeta('toggleLayoutColumnMenu', {
521
522
  anchorPos: startPos,
522
- isOpen: true
523
+ isOpen: true,
524
+ openedViaKeyboard: false
523
525
  });
524
526
  }
525
527
  var mSelect = api === null || api === void 0 || (_api$blockControls$sh = api.blockControls.sharedState.currentState()) === null || _api$blockControls$sh === void 0 ? void 0 : _api$blockControls$sh.multiSelectDnD;
@@ -607,6 +609,13 @@ export var DragHandle = function DragHandle(_ref) {
607
609
  api === null || api === void 0 || (_api$blockControls4 = api.blockControls) === null || _api$blockControls4 === void 0 || _api$blockControls4.commands.startPreservingSelection()({
608
610
  tr: tr
609
611
  });
612
+ if (nodeType === 'layoutColumn' && expValEqualsNoExposure('platform_editor_layout_column_menu', 'isEnabled', true)) {
613
+ tr.setMeta('toggleLayoutColumnMenu', {
614
+ anchorPos: startPos,
615
+ isOpen: true,
616
+ openedViaKeyboard: true
617
+ });
618
+ }
610
619
  var rootPos = editorExperiment('platform_synced_block', true) ? tr.doc.resolve(startPos).before(1) : undefined;
611
620
  var triggerByNode = editorExperiment('platform_synced_block', true) ? {
612
621
  nodeType: nodeType,
@@ -815,7 +824,7 @@ export var DragHandle = function DragHandle(_ref) {
815
824
  }) : anchorName;
816
825
  var dom = view.dom.querySelector("[".concat(getAnchorAttrName(), "=\"").concat(safeAnchorName, "\"]"));
817
826
  var hasResizer = nodeType === 'table' || nodeType === 'mediaSingle';
818
- var isExtension = nodeType === 'extension' || nodeType === 'bodiedExtension' || nodeType === 'multiBodiedExtension';
827
+ var isExtension = nodeType === 'extension' || nodeType === 'bodiedExtension' || nodeType === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension');
819
828
  var isBlockCard = nodeType === 'blockCard' && !!blockCardWidth;
820
829
  var isEmbedCard = nodeType === 'embedCard';
821
830
  var isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
@@ -10,6 +10,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
10
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled, @typescript-eslint/consistent-type-imports
11
11
  import { css, jsx } from '@emotion/react';
12
12
  import { akEditorBreakoutPadding } from '@atlaskit/editor-shared-styles';
13
+ import { fg } from '@atlaskit/platform-feature-flags';
13
14
  import { DropIndicator } from '@atlaskit/pragmatic-drag-and-drop-react-drop-indicator/box';
14
15
  import { dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
15
16
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
@@ -74,7 +75,7 @@ var getWidthOffset = function getWidthOffset(node, width, position) {
74
75
  return isLeftPosition ? "0.5*(var(--ak-editor--line-length) - ".concat(width, ")") : "-0.5*(var(--ak-editor--line-length) - ".concat(width, ")");
75
76
  }
76
77
  }
77
- if (node.type.name === 'bodiedExtension' || node.type.name === 'extension') {
78
+ if (node.type.name === 'bodiedExtension' || node.type.name === 'extension' || node.type.name === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension')) {
78
79
  return '-12px';
79
80
  }
80
81
  };
@@ -185,7 +185,7 @@ export var TypeAheadControl = function TypeAheadControl(_ref) {
185
185
  });
186
186
  var dom = view.dom.querySelector("[".concat(getAnchorAttrName(), "=\"").concat(safeAnchorName, "\"]"));
187
187
  var hasResizer = rootNodeType === 'table' || rootNodeType === 'mediaSingle';
188
- var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension';
188
+ var isExtension = rootNodeType === 'extension' || rootNodeType === 'bodiedExtension' || rootNodeType === 'multiBodiedExtension' && fg('confluence_frontend_native_tabs_extension');
189
189
  var isBlockCard = rootNodeType === 'blockCard';
190
190
  var isEmbedCard = rootNodeType === 'embedCard';
191
191
  var isMacroInteractionUpdates = macroInteractionUpdates && isExtension;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-block-controls",
3
- "version": "12.0.1",
3
+ "version": "12.1.0",
4
4
  "description": "Block controls plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -41,7 +41,7 @@
41
41
  "@atlaskit/editor-plugin-quick-insert": "^11.0.0",
42
42
  "@atlaskit/editor-plugin-selection": "^11.0.0",
43
43
  "@atlaskit/editor-plugin-toolbar": "^8.0.0",
44
- "@atlaskit/editor-plugin-type-ahead": "^11.0.0",
44
+ "@atlaskit/editor-plugin-type-ahead": "^11.1.0",
45
45
  "@atlaskit/editor-plugin-user-intent": "^9.0.0",
46
46
  "@atlaskit/editor-plugin-width": "^12.0.0",
47
47
  "@atlaskit/editor-prosemirror": "^7.3.0",
@@ -56,8 +56,8 @@
56
56
  "@atlaskit/pragmatic-drag-and-drop-react-drop-indicator": "^3.2.0",
57
57
  "@atlaskit/primitives": "^19.0.0",
58
58
  "@atlaskit/theme": "^25.0.0",
59
- "@atlaskit/tmp-editor-statsig": "^89.0.0",
60
- "@atlaskit/tokens": "^13.1.0",
59
+ "@atlaskit/tmp-editor-statsig": "^89.4.0",
60
+ "@atlaskit/tokens": "^13.3.0",
61
61
  "@atlaskit/tooltip": "^22.6.0",
62
62
  "@babel/runtime": "^7.0.0",
63
63
  "@emotion/react": "^11.7.1",
@@ -67,7 +67,7 @@
67
67
  "uuid": "^3.1.0"
68
68
  },
69
69
  "peerDependencies": {
70
- "@atlaskit/editor-common": "^115.2.0",
70
+ "@atlaskit/editor-common": "^115.7.0",
71
71
  "react": "^18.2.0",
72
72
  "react-dom": "^18.2.0",
73
73
  "react-intl": "^5.25.1 || ^6.0.0 || ^7.0.0"
@@ -146,6 +146,9 @@
146
146
  },
147
147
  "confluence_remix_button_right_side_block_fg": {
148
148
  "type": "boolean"
149
+ },
150
+ "confluence_frontend_native_tabs_extension": {
151
+ "type": "boolean"
149
152
  }
150
153
  },
151
154
  "devDependencies": {