@atlaskit/editor-common 96.7.1 → 96.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @atlaskit/editor-common
2
2
 
3
+ ## 96.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#181266](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/181266)
8
+ [`4b4994d4a2620`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/4b4994d4a2620) -
9
+ ED-25613: Keyboard shortcuts to resize layout
10
+ - Updated dependencies
11
+
12
+ ## 96.8.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [#180960](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/180960)
17
+ [`3ee72a54bc1bb`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/3ee72a54bc1bb) -
18
+ ED-26040 fix editor layout padding issue
19
+
3
20
  ## 96.7.1
4
21
 
5
22
  ### Patch Changes
@@ -80,5 +80,10 @@ var toolbarMessages = exports.toolbarMessages = (0, _reactIntlNext.defineMessage
80
80
  id: 'fabric.editor.layout.columnOption',
81
81
  defaultMessage: '{count, plural, one { Column} other {{count} Columns}}',
82
82
  description: 'column option text for layout'
83
+ },
84
+ resizeLayout: {
85
+ id: 'fabric.editor.layout.resizeLayout',
86
+ defaultMessage: 'Resize layout',
87
+ description: 'resize layout'
83
88
  }
84
89
  });
@@ -17,7 +17,7 @@ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return
17
17
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
18
18
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
19
19
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
20
- var packageVersion = "96.7.1";
20
+ var packageVersion = "96.8.1";
21
21
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
22
22
  // Remove URL as it has UGC
23
23
  // TODO: Sanitise the URL instead of just removing it
@@ -8,16 +8,19 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.ignoreResizerMutations = exports.BreakoutResizer = void 0;
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
+ var _bindEventListener = require("bind-event-listener");
11
12
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
12
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
14
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
14
15
  var _analytics = require("../analytics");
15
16
  var _styles = require("../styles");
17
+ var _browser = require("../utils/browser");
16
18
  var _Resizer = _interopRequireDefault(require("./Resizer"));
17
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
18
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
21
  var breakoutSupportedNodes = ['layoutSection', 'expand', 'codeBlock'];
20
22
  var getHandleStyle = function getHandleStyle(node) {
23
+ var layoutMarginOffset = (0, _platformFeatureFlags.fg)('platform_editor_advanced_layouts_post_fix_patch_2') ? 12 : 8;
21
24
  switch (node) {
22
25
  case 'codeBlock':
23
26
  return {
@@ -30,7 +33,7 @@ var getHandleStyle = function getHandleStyle(node) {
30
33
  };
31
34
  // expand and layout section elements have a negative margin applied
32
35
  default:
33
- var handleOffset = (0, _experiments.editorExperiment)('nested-dnd', true) ? _styles.LAYOUT_SECTION_MARGIN * 2 + 8 : _styles.LAYOUT_COLUMN_PADDING * 2;
36
+ var handleOffset = (0, _experiments.editorExperiment)('nested-dnd', true) ? _styles.LAYOUT_SECTION_MARGIN * 2 + layoutMarginOffset : _styles.LAYOUT_COLUMN_PADDING * 2;
34
37
  return {
35
38
  left: {
36
39
  left: "-".concat(handleOffset, "px"),
@@ -70,6 +73,7 @@ var resizingStyles = {
70
73
  var defaultStyles = {
71
74
  display: 'grid'
72
75
  };
76
+ var RESIZE_STEP_VALUE = 10;
73
77
 
74
78
  /**
75
79
  * BreakoutResizer is a common component used to resize nodes that support the 'Breakout' mark, so it requires
@@ -98,6 +102,8 @@ var BreakoutResizer = exports.BreakoutResizer = function BreakoutResizer(_ref) {
98
102
  maxWidth = _useState2$.maxWidth,
99
103
  isResizing = _useState2$.isResizing,
100
104
  setResizingState = _useState2[1];
105
+ var areResizeMetaKeysPressed = (0, _react.useRef)(false);
106
+ var resizerRef = (0, _react.useRef)(null);
101
107
 
102
108
  // Relying on re-renders caused by selection changes inside/around node
103
109
  var isSelectionInNode = (0, _react.useMemo)(function () {
@@ -175,6 +181,99 @@ var BreakoutResizer = exports.BreakoutResizer = function BreakoutResizer(_ref) {
175
181
  maxWidth: undefined
176
182
  });
177
183
  }, [getPos, editorView, displayGapCursor, editorAnalyticsApi]);
184
+ var handleEscape = (0, _react.useCallback)(function () {
185
+ editorView === null || editorView === void 0 || editorView.focus();
186
+ }, [editorView]);
187
+ var handleLayoutSizeChangeOnKeypress = (0, _react.useCallback)(function (step) {
188
+ if (!parentRef) {
189
+ return;
190
+ }
191
+ var resizerItem = parentRef.closest('.resizer-item');
192
+ if (!(resizerItem instanceof HTMLElement)) {
193
+ return;
194
+ }
195
+ var newWidth = resizerItem.offsetWidth + step;
196
+ if (maxWidth && newWidth > maxWidth || minWidth && newWidth < minWidth) {
197
+ return;
198
+ }
199
+ handleResizeStop({
200
+ width: resizerItem.offsetWidth,
201
+ x: 0,
202
+ y: 0,
203
+ height: 0
204
+ }, {
205
+ width: step,
206
+ height: 0
207
+ });
208
+ }, [handleResizeStop, maxWidth, minWidth, parentRef]);
209
+ var resizeHandleKeyDownHandler = (0, _react.useCallback)(function (event) {
210
+ var isBracketKey = event.code === 'BracketRight' || event.code === 'BracketLeft';
211
+ var metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
212
+ if (event.altKey || metaKey || event.shiftKey) {
213
+ areResizeMetaKeysPressed.current = true;
214
+ }
215
+ if (event.altKey && metaKey) {
216
+ if (isBracketKey) {
217
+ event.preventDefault();
218
+ handleLayoutSizeChangeOnKeypress(event.code === 'BracketRight' ? RESIZE_STEP_VALUE : -RESIZE_STEP_VALUE);
219
+ }
220
+ } else if (!areResizeMetaKeysPressed.current) {
221
+ handleEscape();
222
+ }
223
+ }, [handleEscape, handleLayoutSizeChangeOnKeypress]);
224
+ var resizeHandleKeyUpHandler = (0, _react.useCallback)(function (event) {
225
+ if (event.altKey || event.metaKey) {
226
+ areResizeMetaKeysPressed.current = false;
227
+ }
228
+ return;
229
+ }, [areResizeMetaKeysPressed]);
230
+ var resizerGlobalKeyDownHandler = (0, _react.useCallback)(function (event) {
231
+ if (!resizerRef.current) {
232
+ return;
233
+ }
234
+ var resizeHandleThumbEl = resizerRef.current.getResizerThumbEl();
235
+ var metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
236
+ var isTargetResizeHandle = event.target instanceof HTMLElement && event.target.classList.contains('resizer-handle-thumb');
237
+ if (event.altKey && event.shiftKey && metaKey && event.code === 'KeyR' || isTargetResizeHandle && (event.altKey || metaKey || event.shiftKey)) {
238
+ event.preventDefault();
239
+ if (!resizeHandleThumbEl) {
240
+ return;
241
+ }
242
+ resizeHandleThumbEl.focus();
243
+ resizeHandleThumbEl.scrollIntoView({
244
+ behavior: 'smooth',
245
+ block: 'center',
246
+ inline: 'nearest'
247
+ });
248
+ }
249
+ }, [resizerRef]);
250
+ (0, _react.useLayoutEffect)(function () {
251
+ if (!resizerRef.current || !editorView) {
252
+ return;
253
+ }
254
+ var resizeHandleThumbEl = resizerRef.current.getResizerThumbEl();
255
+ if (!resizeHandleThumbEl) {
256
+ return;
257
+ }
258
+ if ((0, _platformFeatureFlags.fg)('platform_editor_advanced_layouts_a11y')) {
259
+ var editorViewDom = editorView.dom;
260
+ var unbindEditorViewDom = (0, _bindEventListener.bind)(editorViewDom, {
261
+ type: 'keydown',
262
+ listener: resizerGlobalKeyDownHandler
263
+ });
264
+ var unbindResizeHandle = (0, _bindEventListener.bindAll)(resizeHandleThumbEl, [{
265
+ type: 'keydown',
266
+ listener: resizeHandleKeyDownHandler
267
+ }, {
268
+ type: 'keyup',
269
+ listener: resizeHandleKeyUpHandler
270
+ }]);
271
+ return function () {
272
+ unbindEditorViewDom();
273
+ unbindResizeHandle();
274
+ };
275
+ }
276
+ }, [editorView, resizerGlobalKeyDownHandler, resizeHandleKeyDownHandler, resizeHandleKeyUpHandler]);
178
277
  (0, _react.useEffect)(function () {
179
278
  // clean up gap cursor if node was unmounting when resizing (e.g. during collab)
180
279
  return function () {
@@ -190,6 +289,7 @@ var BreakoutResizer = exports.BreakoutResizer = function BreakoutResizer(_ref) {
190
289
  });
191
290
  }
192
291
  return /*#__PURE__*/_react.default.createElement(_Resizer.default, {
292
+ ref: resizerRef,
193
293
  enable: {
194
294
  left: true,
195
295
  right: true
@@ -23,7 +23,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
23
23
  * @jsx jsx
24
24
  */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
25
25
  var packageName = "@atlaskit/editor-common";
26
- var packageVersion = "96.7.1";
26
+ var packageVersion = "96.8.1";
27
27
  var halfFocusRing = 1;
28
28
  var dropOffset = '0, 8';
29
29
  var DropList = /*#__PURE__*/function (_Component) {
@@ -74,5 +74,10 @@ export const toolbarMessages = defineMessages({
74
74
  id: 'fabric.editor.layout.columnOption',
75
75
  defaultMessage: '{count, plural, one { Column} other {{count} Columns}}',
76
76
  description: 'column option text for layout'
77
+ },
78
+ resizeLayout: {
79
+ id: 'fabric.editor.layout.resizeLayout',
80
+ defaultMessage: 'Resize layout',
81
+ description: 'resize layout'
77
82
  }
78
83
  });
@@ -1,7 +1,7 @@
1
1
  import { isFedRamp } from './environment';
2
2
  const SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
3
3
  const packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
4
- const packageVersion = "96.7.1";
4
+ const packageVersion = "96.8.1";
5
5
  const sanitiseSentryEvents = (data, _hint) => {
6
6
  // Remove URL as it has UGC
7
7
  // TODO: Sanitise the URL instead of just removing it
@@ -1,12 +1,15 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useRef, useState, useLayoutEffect } from 'react';
2
+ import { bind, bindAll } from 'bind-event-listener';
2
3
  import { akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth, akEditorGutterPadding, akEditorGutterPaddingDynamic } from '@atlaskit/editor-shared-styles';
3
4
  import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
5
6
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '../analytics';
6
7
  import { LAYOUT_COLUMN_PADDING, LAYOUT_SECTION_MARGIN } from '../styles';
8
+ import { browser } from '../utils/browser';
7
9
  import Resizer from './Resizer';
8
10
  const breakoutSupportedNodes = ['layoutSection', 'expand', 'codeBlock'];
9
11
  const getHandleStyle = node => {
12
+ const layoutMarginOffset = fg('platform_editor_advanced_layouts_post_fix_patch_2') ? 12 : 8;
10
13
  switch (node) {
11
14
  case 'codeBlock':
12
15
  return {
@@ -19,7 +22,7 @@ const getHandleStyle = node => {
19
22
  };
20
23
  // expand and layout section elements have a negative margin applied
21
24
  default:
22
- const handleOffset = editorExperiment('nested-dnd', true) ? LAYOUT_SECTION_MARGIN * 2 + 8 : LAYOUT_COLUMN_PADDING * 2;
25
+ const handleOffset = editorExperiment('nested-dnd', true) ? LAYOUT_SECTION_MARGIN * 2 + layoutMarginOffset : LAYOUT_COLUMN_PADDING * 2;
23
26
  return {
24
27
  left: {
25
28
  left: `-${handleOffset}px`,
@@ -59,6 +62,7 @@ const resizingStyles = {
59
62
  const defaultStyles = {
60
63
  display: 'grid'
61
64
  };
65
+ const RESIZE_STEP_VALUE = 10;
62
66
 
63
67
  /**
64
68
  * BreakoutResizer is a common component used to resize nodes that support the 'Breakout' mark, so it requires
@@ -86,6 +90,8 @@ const BreakoutResizer = ({
86
90
  maxWidth: undefined,
87
91
  isResizing: false
88
92
  });
93
+ const areResizeMetaKeysPressed = useRef(false);
94
+ const resizerRef = useRef(null);
89
95
 
90
96
  // Relying on re-renders caused by selection changes inside/around node
91
97
  const isSelectionInNode = useMemo(() => {
@@ -170,6 +176,99 @@ const BreakoutResizer = ({
170
176
  maxWidth: undefined
171
177
  });
172
178
  }, [getPos, editorView, displayGapCursor, editorAnalyticsApi]);
179
+ const handleEscape = useCallback(() => {
180
+ editorView === null || editorView === void 0 ? void 0 : editorView.focus();
181
+ }, [editorView]);
182
+ const handleLayoutSizeChangeOnKeypress = useCallback(step => {
183
+ if (!parentRef) {
184
+ return;
185
+ }
186
+ const resizerItem = parentRef.closest('.resizer-item');
187
+ if (!(resizerItem instanceof HTMLElement)) {
188
+ return;
189
+ }
190
+ const newWidth = resizerItem.offsetWidth + step;
191
+ if (maxWidth && newWidth > maxWidth || minWidth && newWidth < minWidth) {
192
+ return;
193
+ }
194
+ handleResizeStop({
195
+ width: resizerItem.offsetWidth,
196
+ x: 0,
197
+ y: 0,
198
+ height: 0
199
+ }, {
200
+ width: step,
201
+ height: 0
202
+ });
203
+ }, [handleResizeStop, maxWidth, minWidth, parentRef]);
204
+ const resizeHandleKeyDownHandler = useCallback(event => {
205
+ const isBracketKey = event.code === 'BracketRight' || event.code === 'BracketLeft';
206
+ const metaKey = browser.mac ? event.metaKey : event.ctrlKey;
207
+ if (event.altKey || metaKey || event.shiftKey) {
208
+ areResizeMetaKeysPressed.current = true;
209
+ }
210
+ if (event.altKey && metaKey) {
211
+ if (isBracketKey) {
212
+ event.preventDefault();
213
+ handleLayoutSizeChangeOnKeypress(event.code === 'BracketRight' ? RESIZE_STEP_VALUE : -RESIZE_STEP_VALUE);
214
+ }
215
+ } else if (!areResizeMetaKeysPressed.current) {
216
+ handleEscape();
217
+ }
218
+ }, [handleEscape, handleLayoutSizeChangeOnKeypress]);
219
+ const resizeHandleKeyUpHandler = useCallback(event => {
220
+ if (event.altKey || event.metaKey) {
221
+ areResizeMetaKeysPressed.current = false;
222
+ }
223
+ return;
224
+ }, [areResizeMetaKeysPressed]);
225
+ const resizerGlobalKeyDownHandler = useCallback(event => {
226
+ if (!resizerRef.current) {
227
+ return;
228
+ }
229
+ const resizeHandleThumbEl = resizerRef.current.getResizerThumbEl();
230
+ const metaKey = browser.mac ? event.metaKey : event.ctrlKey;
231
+ const isTargetResizeHandle = event.target instanceof HTMLElement && event.target.classList.contains('resizer-handle-thumb');
232
+ if (event.altKey && event.shiftKey && metaKey && event.code === 'KeyR' || isTargetResizeHandle && (event.altKey || metaKey || event.shiftKey)) {
233
+ event.preventDefault();
234
+ if (!resizeHandleThumbEl) {
235
+ return;
236
+ }
237
+ resizeHandleThumbEl.focus();
238
+ resizeHandleThumbEl.scrollIntoView({
239
+ behavior: 'smooth',
240
+ block: 'center',
241
+ inline: 'nearest'
242
+ });
243
+ }
244
+ }, [resizerRef]);
245
+ useLayoutEffect(() => {
246
+ if (!resizerRef.current || !editorView) {
247
+ return;
248
+ }
249
+ const resizeHandleThumbEl = resizerRef.current.getResizerThumbEl();
250
+ if (!resizeHandleThumbEl) {
251
+ return;
252
+ }
253
+ if (fg('platform_editor_advanced_layouts_a11y')) {
254
+ const editorViewDom = editorView.dom;
255
+ const unbindEditorViewDom = bind(editorViewDom, {
256
+ type: 'keydown',
257
+ listener: resizerGlobalKeyDownHandler
258
+ });
259
+ const unbindResizeHandle = bindAll(resizeHandleThumbEl, [{
260
+ type: 'keydown',
261
+ listener: resizeHandleKeyDownHandler
262
+ }, {
263
+ type: 'keyup',
264
+ listener: resizeHandleKeyUpHandler
265
+ }]);
266
+ return () => {
267
+ unbindEditorViewDom();
268
+ unbindResizeHandle();
269
+ };
270
+ }
271
+ }, [editorView, resizerGlobalKeyDownHandler, resizeHandleKeyDownHandler, resizeHandleKeyUpHandler]);
173
272
  useEffect(() => {
174
273
  // clean up gap cursor if node was unmounting when resizing (e.g. during collab)
175
274
  return () => {
@@ -183,6 +282,7 @@ const BreakoutResizer = ({
183
282
  });
184
283
  }
185
284
  return /*#__PURE__*/React.createElement(Resizer, {
285
+ ref: resizerRef,
186
286
  enable: {
187
287
  left: true,
188
288
  right: true
@@ -13,7 +13,7 @@ import withAnalyticsContext from '@atlaskit/analytics-next/withAnalyticsContext'
13
13
  import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
14
14
  import Layer from '../Layer';
15
15
  const packageName = "@atlaskit/editor-common";
16
- const packageVersion = "96.7.1";
16
+ const packageVersion = "96.8.1";
17
17
  const halfFocusRing = 1;
18
18
  const dropOffset = '0, 8';
19
19
  class DropList extends Component {
@@ -74,5 +74,10 @@ export var toolbarMessages = defineMessages({
74
74
  id: 'fabric.editor.layout.columnOption',
75
75
  defaultMessage: '{count, plural, one { Column} other {{count} Columns}}',
76
76
  description: 'column option text for layout'
77
+ },
78
+ resizeLayout: {
79
+ id: 'fabric.editor.layout.resizeLayout',
80
+ defaultMessage: 'Resize layout',
81
+ description: 'resize layout'
77
82
  }
78
83
  });
@@ -7,7 +7,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
7
7
  import { isFedRamp } from './environment';
8
8
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
9
9
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
10
- var packageVersion = "96.7.1";
10
+ var packageVersion = "96.8.1";
11
11
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
12
12
  // Remove URL as it has UGC
13
13
  // TODO: Sanitise the URL instead of just removing it
@@ -1,13 +1,16 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import React, { useCallback, useEffect, useMemo, useRef, useState, useLayoutEffect } from 'react';
3
+ import { bind, bindAll } from 'bind-event-listener';
3
4
  import { akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth, akEditorGutterPadding, akEditorGutterPaddingDynamic } from '@atlaskit/editor-shared-styles';
4
5
  import { fg } from '@atlaskit/platform-feature-flags';
5
6
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
6
7
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '../analytics';
7
8
  import { LAYOUT_COLUMN_PADDING, LAYOUT_SECTION_MARGIN } from '../styles';
9
+ import { browser } from '../utils/browser';
8
10
  import Resizer from './Resizer';
9
11
  var breakoutSupportedNodes = ['layoutSection', 'expand', 'codeBlock'];
10
12
  var getHandleStyle = function getHandleStyle(node) {
13
+ var layoutMarginOffset = fg('platform_editor_advanced_layouts_post_fix_patch_2') ? 12 : 8;
11
14
  switch (node) {
12
15
  case 'codeBlock':
13
16
  return {
@@ -20,7 +23,7 @@ var getHandleStyle = function getHandleStyle(node) {
20
23
  };
21
24
  // expand and layout section elements have a negative margin applied
22
25
  default:
23
- var handleOffset = editorExperiment('nested-dnd', true) ? LAYOUT_SECTION_MARGIN * 2 + 8 : LAYOUT_COLUMN_PADDING * 2;
26
+ var handleOffset = editorExperiment('nested-dnd', true) ? LAYOUT_SECTION_MARGIN * 2 + layoutMarginOffset : LAYOUT_COLUMN_PADDING * 2;
24
27
  return {
25
28
  left: {
26
29
  left: "-".concat(handleOffset, "px"),
@@ -60,6 +63,7 @@ var resizingStyles = {
60
63
  var defaultStyles = {
61
64
  display: 'grid'
62
65
  };
66
+ var RESIZE_STEP_VALUE = 10;
63
67
 
64
68
  /**
65
69
  * BreakoutResizer is a common component used to resize nodes that support the 'Breakout' mark, so it requires
@@ -88,6 +92,8 @@ var BreakoutResizer = function BreakoutResizer(_ref) {
88
92
  maxWidth = _useState2$.maxWidth,
89
93
  isResizing = _useState2$.isResizing,
90
94
  setResizingState = _useState2[1];
95
+ var areResizeMetaKeysPressed = useRef(false);
96
+ var resizerRef = useRef(null);
91
97
 
92
98
  // Relying on re-renders caused by selection changes inside/around node
93
99
  var isSelectionInNode = useMemo(function () {
@@ -165,6 +171,99 @@ var BreakoutResizer = function BreakoutResizer(_ref) {
165
171
  maxWidth: undefined
166
172
  });
167
173
  }, [getPos, editorView, displayGapCursor, editorAnalyticsApi]);
174
+ var handleEscape = useCallback(function () {
175
+ editorView === null || editorView === void 0 || editorView.focus();
176
+ }, [editorView]);
177
+ var handleLayoutSizeChangeOnKeypress = useCallback(function (step) {
178
+ if (!parentRef) {
179
+ return;
180
+ }
181
+ var resizerItem = parentRef.closest('.resizer-item');
182
+ if (!(resizerItem instanceof HTMLElement)) {
183
+ return;
184
+ }
185
+ var newWidth = resizerItem.offsetWidth + step;
186
+ if (maxWidth && newWidth > maxWidth || minWidth && newWidth < minWidth) {
187
+ return;
188
+ }
189
+ handleResizeStop({
190
+ width: resizerItem.offsetWidth,
191
+ x: 0,
192
+ y: 0,
193
+ height: 0
194
+ }, {
195
+ width: step,
196
+ height: 0
197
+ });
198
+ }, [handleResizeStop, maxWidth, minWidth, parentRef]);
199
+ var resizeHandleKeyDownHandler = useCallback(function (event) {
200
+ var isBracketKey = event.code === 'BracketRight' || event.code === 'BracketLeft';
201
+ var metaKey = browser.mac ? event.metaKey : event.ctrlKey;
202
+ if (event.altKey || metaKey || event.shiftKey) {
203
+ areResizeMetaKeysPressed.current = true;
204
+ }
205
+ if (event.altKey && metaKey) {
206
+ if (isBracketKey) {
207
+ event.preventDefault();
208
+ handleLayoutSizeChangeOnKeypress(event.code === 'BracketRight' ? RESIZE_STEP_VALUE : -RESIZE_STEP_VALUE);
209
+ }
210
+ } else if (!areResizeMetaKeysPressed.current) {
211
+ handleEscape();
212
+ }
213
+ }, [handleEscape, handleLayoutSizeChangeOnKeypress]);
214
+ var resizeHandleKeyUpHandler = useCallback(function (event) {
215
+ if (event.altKey || event.metaKey) {
216
+ areResizeMetaKeysPressed.current = false;
217
+ }
218
+ return;
219
+ }, [areResizeMetaKeysPressed]);
220
+ var resizerGlobalKeyDownHandler = useCallback(function (event) {
221
+ if (!resizerRef.current) {
222
+ return;
223
+ }
224
+ var resizeHandleThumbEl = resizerRef.current.getResizerThumbEl();
225
+ var metaKey = browser.mac ? event.metaKey : event.ctrlKey;
226
+ var isTargetResizeHandle = event.target instanceof HTMLElement && event.target.classList.contains('resizer-handle-thumb');
227
+ if (event.altKey && event.shiftKey && metaKey && event.code === 'KeyR' || isTargetResizeHandle && (event.altKey || metaKey || event.shiftKey)) {
228
+ event.preventDefault();
229
+ if (!resizeHandleThumbEl) {
230
+ return;
231
+ }
232
+ resizeHandleThumbEl.focus();
233
+ resizeHandleThumbEl.scrollIntoView({
234
+ behavior: 'smooth',
235
+ block: 'center',
236
+ inline: 'nearest'
237
+ });
238
+ }
239
+ }, [resizerRef]);
240
+ useLayoutEffect(function () {
241
+ if (!resizerRef.current || !editorView) {
242
+ return;
243
+ }
244
+ var resizeHandleThumbEl = resizerRef.current.getResizerThumbEl();
245
+ if (!resizeHandleThumbEl) {
246
+ return;
247
+ }
248
+ if (fg('platform_editor_advanced_layouts_a11y')) {
249
+ var editorViewDom = editorView.dom;
250
+ var unbindEditorViewDom = bind(editorViewDom, {
251
+ type: 'keydown',
252
+ listener: resizerGlobalKeyDownHandler
253
+ });
254
+ var unbindResizeHandle = bindAll(resizeHandleThumbEl, [{
255
+ type: 'keydown',
256
+ listener: resizeHandleKeyDownHandler
257
+ }, {
258
+ type: 'keyup',
259
+ listener: resizeHandleKeyUpHandler
260
+ }]);
261
+ return function () {
262
+ unbindEditorViewDom();
263
+ unbindResizeHandle();
264
+ };
265
+ }
266
+ }, [editorView, resizerGlobalKeyDownHandler, resizeHandleKeyDownHandler, resizeHandleKeyUpHandler]);
168
267
  useEffect(function () {
169
268
  // clean up gap cursor if node was unmounting when resizing (e.g. during collab)
170
269
  return function () {
@@ -180,6 +279,7 @@ var BreakoutResizer = function BreakoutResizer(_ref) {
180
279
  });
181
280
  }
182
281
  return /*#__PURE__*/React.createElement(Resizer, {
282
+ ref: resizerRef,
183
283
  enable: {
184
284
  left: true,
185
285
  right: true
@@ -20,7 +20,7 @@ import withAnalyticsContext from '@atlaskit/analytics-next/withAnalyticsContext'
20
20
  import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
21
21
  import Layer from '../Layer';
22
22
  var packageName = "@atlaskit/editor-common";
23
- var packageVersion = "96.7.1";
23
+ var packageVersion = "96.8.1";
24
24
  var halfFocusRing = 1;
25
25
  var dropOffset = '0, 8';
26
26
  var DropList = /*#__PURE__*/function (_Component) {
@@ -74,4 +74,9 @@ export declare const toolbarMessages: {
74
74
  defaultMessage: string;
75
75
  description: string;
76
76
  };
77
+ resizeLayout: {
78
+ id: string;
79
+ defaultMessage: string;
80
+ description: string;
81
+ };
77
82
  };
@@ -74,4 +74,9 @@ export declare const toolbarMessages: {
74
74
  defaultMessage: string;
75
75
  description: string;
76
76
  };
77
+ resizeLayout: {
78
+ id: string;
79
+ defaultMessage: string;
80
+ description: string;
81
+ };
77
82
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-common",
3
- "version": "96.7.1",
3
+ "version": "96.8.1",
4
4
  "description": "A package that contains common classes and components for editor and renderer",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -140,7 +140,7 @@
140
140
  "@atlaskit/media-file-preview": "^0.9.0",
141
141
  "@atlaskit/media-picker": "^67.0.0",
142
142
  "@atlaskit/media-ui": "^27.1.0",
143
- "@atlaskit/media-viewer": "49.5.0",
143
+ "@atlaskit/media-viewer": "49.5.1",
144
144
  "@atlaskit/mention": "^23.4.0",
145
145
  "@atlaskit/menu": "^2.13.0",
146
146
  "@atlaskit/onboarding": "^12.2.0",
@@ -163,6 +163,7 @@
163
163
  "@sentry/browser": "^6.18.2",
164
164
  "@sentry/integrations": "^6.18.2",
165
165
  "@sentry/types": "^6.18.2",
166
+ "bind-event-listener": "^3.0.0",
166
167
  "chromatism": "^2.6.0",
167
168
  "classnames": "^2.2.5",
168
169
  "clipboard-polyfill": "4.0.1",
@@ -304,6 +305,9 @@
304
305
  "platform_editor_selection_toolbar_scroll_fix": {
305
306
  "type": "boolean"
306
307
  },
308
+ "platform_editor_advanced_layouts_a11y": {
309
+ "type": "boolean"
310
+ },
307
311
  "platform_editor_legacy_content_macro": {
308
312
  "type": "boolean"
309
313
  },