@atlaskit/editor-plugin-breakout 2.5.1 → 2.5.2

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,14 @@
1
1
  # @atlaskit/editor-plugin-breakout
2
2
 
3
+ ## 2.5.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#164895](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/164895)
8
+ [`e8158addf8fda`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/e8158addf8fda) -
9
+ Add platform_editor_breakout_resizing_hello_release fg - add snapping logic for pragmatic resizer
10
+ - Updated dependencies
11
+
3
12
  ## 2.5.1
4
13
 
5
14
  ### Patch Changes
@@ -10,6 +10,7 @@ var _styles = require("@atlaskit/editor-common/styles");
10
10
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
11
11
  var WIDTHS = {
12
12
  MIN: _editorSharedStyles.akEditorDefaultLayoutWidth,
13
+ WIDE: _editorSharedStyles.akEditorCalculatedWideLayoutWidth,
13
14
  MAX: _editorSharedStyles.akEditorFullWidthLayoutWidth
14
15
  };
15
16
  var GUIDELINE_KEYS = {
@@ -44,7 +45,6 @@ var getGuidelines = exports.getGuidelines = (0, _memoizeOne.default)(function (i
44
45
  width = _ref.width,
45
46
  lineLength = _ref.lineLength;
46
47
  // TODO: ED-28109 - use breakoutWideScaleRatio to calculate wide guideline
47
- var wide = _editorSharedStyles.akEditorCalculatedWideLayoutWidth;
48
48
  var fullWidth = width ? Math.min(WIDTHS.MAX, width - 2 * (0, _editorSharedStyles.akEditorGutterPaddingDynamic)() - _editorSharedStyles.akEditorGutterPadding) : undefined;
49
49
  if (lineLength) {
50
50
  guidelines.push({
@@ -65,16 +65,16 @@ var getGuidelines = exports.getGuidelines = (0, _memoizeOne.default)(function (i
65
65
  guidelines.push({
66
66
  key: "".concat(GUIDELINE_KEYS.wide, "_left"),
67
67
  position: {
68
- x: -roundToNearest(wide / 2 + innerPaddingOffset)
68
+ x: -roundToNearest(WIDTHS.WIDE / 2 + innerPaddingOffset)
69
69
  },
70
- active: newWidth === wide
70
+ active: newWidth === WIDTHS.WIDE
71
71
  });
72
72
  guidelines.push({
73
73
  key: "".concat(GUIDELINE_KEYS.wide, "_right"),
74
74
  position: {
75
- x: roundToNearest(wide / 2 + innerPaddingOffset)
75
+ x: roundToNearest(WIDTHS.WIDE / 2 + innerPaddingOffset)
76
76
  },
77
- active: newWidth === wide
77
+ active: newWidth === WIDTHS.WIDE
78
78
  });
79
79
  if (fullWidth) {
80
80
  guidelines.push({
@@ -1,16 +1,49 @@
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.createPragmaticResizer = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _bindEventListener = require("bind-event-listener");
7
10
  var _adapter = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
8
11
  var _disableNativeDragPreview = require("@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview");
9
12
  var _preventUnhandled = require("@atlaskit/pragmatic-drag-and-drop/prevent-unhandled");
10
13
  var createPragmaticResizer = exports.createPragmaticResizer = function createPragmaticResizer(_ref) {
11
- var onDragStart = _ref.onDragStart,
14
+ var target = _ref.target,
15
+ _onDragStart = _ref.onDragStart,
12
16
  onDrag = _ref.onDrag,
13
17
  _onDrop = _ref.onDrop;
18
+ var state = 'default';
19
+ var createHandle = function createHandle(side) {
20
+ var handle = document.createElement('div');
21
+ handle.contentEditable = 'false';
22
+ handle.classList.add('pm-breakout-resize-handle-container');
23
+ var rail = document.createElement('div');
24
+ rail.classList.add('pm-breakout-resize-handle-rail');
25
+ if (side === 'left') {
26
+ handle.classList.add('pm-breakout-resize-handle-container--left');
27
+ handle.setAttribute('data-testid', 'pragmatic-resizer-handle-left');
28
+ } else {
29
+ handle.classList.add('pm-breakout-resize-handle-container--right');
30
+ handle.setAttribute('data-testid', 'pragmatic-resizer-handle-right');
31
+ }
32
+ var handleHitBox = document.createElement('div');
33
+ handleHitBox.classList.add('pm-breakout-resize-handle-hit-box');
34
+ var thumb = document.createElement('div');
35
+ thumb.classList.add('pm-breakout-resize-handle-thumb');
36
+ rail.appendChild(thumb);
37
+ handle.appendChild(rail);
38
+ handle.appendChild(handleHitBox);
39
+ return {
40
+ handle: handle,
41
+ rail: rail,
42
+ handleHitBox: handleHitBox
43
+ };
44
+ };
45
+ var rightHandle = createHandle('right');
46
+ var leftHandle = createHandle('left');
14
47
  var registerHandle = function registerHandle(handleElement, handleSide) {
15
48
  return (0, _adapter.draggable)({
16
49
  element: handleElement,
@@ -26,40 +59,50 @@ var createPragmaticResizer = exports.createPragmaticResizer = function createPra
26
59
  handleSide: handleSide
27
60
  };
28
61
  },
29
- onDragStart: onDragStart,
62
+ onDragStart: function onDragStart(args) {
63
+ state = 'resizing';
64
+ handleElement.classList.add('pm-breakout-resize-handle-container--active');
65
+ _onDragStart(args);
66
+ },
30
67
  onDrag: onDrag,
31
68
  onDrop: function onDrop(args) {
32
69
  _preventUnhandled.preventUnhandled.stop();
70
+ state = 'default';
71
+ handleElement.classList.remove('pm-breakout-resize-handle-container--active');
33
72
  _onDrop(args);
34
73
  }
35
74
  });
36
75
  };
37
- var createHandle = function createHandle(side) {
38
- var handle = document.createElement('div');
39
- handle.contentEditable = 'false';
40
- handle.classList.add('pm-breakout-resize-handle');
41
- if (side === 'left') {
42
- handle.classList.add('pm-breakout-resize-handle-left');
43
- handle.setAttribute('data-testid', 'pragmatic-resizer-handle-left');
44
- } else {
45
- handle.classList.add('pm-breakout-resize-handle-right');
46
- handle.setAttribute('data-testid', 'pragmatic-resizer-handle-right');
47
- }
48
- var handleInner = document.createElement('div');
49
- handleInner.classList.add('pm-breakout-resize-handle-inner');
50
- handle.appendChild(handleInner);
51
- return handle;
76
+ var registerEvents = function registerEvents(element) {
77
+ return [(0, _bindEventListener.bind)(element, {
78
+ type: 'mouseenter',
79
+ listener: function listener() {
80
+ rightHandle.rail.style.setProperty('opacity', '1');
81
+ leftHandle.rail.style.setProperty('opacity', '1');
82
+ }
83
+ }), (0, _bindEventListener.bind)(element, {
84
+ type: 'mouseleave',
85
+ listener: function listener() {
86
+ if (state === 'resizing') {
87
+ return;
88
+ }
89
+ rightHandle.rail.style.removeProperty('opacity');
90
+ leftHandle.rail.style.removeProperty('opacity');
91
+ }
92
+ })];
52
93
  };
53
- var rightHandle = createHandle('right');
54
- var leftHandle = createHandle('left');
55
- var rightHandleCleanup = registerHandle(rightHandle, 'right');
56
- var leftHandleCleanup = registerHandle(leftHandle, 'left');
94
+ var unbindFns = [].concat((0, _toConsumableArray2.default)(registerEvents(target)), (0, _toConsumableArray2.default)(registerEvents(rightHandle.handleHitBox)), (0, _toConsumableArray2.default)(registerEvents(leftHandle.handleHitBox)), (0, _toConsumableArray2.default)(registerEvents(rightHandle.rail)), (0, _toConsumableArray2.default)(registerEvents(leftHandle.rail)));
95
+ var destroyFns = [registerHandle(rightHandle.handle, 'right'), registerHandle(leftHandle.handle, 'left')];
57
96
  return {
58
- rightHandle: rightHandle,
59
- leftHandle: leftHandle,
97
+ rightHandle: rightHandle.handle,
98
+ leftHandle: leftHandle.handle,
60
99
  destroy: function destroy() {
61
- rightHandleCleanup();
62
- leftHandleCleanup();
100
+ destroyFns.forEach(function (destroyFn) {
101
+ return destroyFn();
102
+ });
103
+ unbindFns.forEach(function (unbindFn) {
104
+ return unbindFn();
105
+ });
63
106
  }
64
107
  };
65
108
  };
@@ -6,12 +6,15 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.createResizerCallbacks = createResizerCallbacks;
7
7
  exports.getProposedWidth = getProposedWidth;
8
8
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
9
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
9
10
  var _setBreakoutWidth = require("../editor-commands/set-breakout-width");
10
11
  var _getGuidelines = require("./get-guidelines");
11
12
  var _resizingMarkView = require("./resizing-mark-view");
12
13
  var RESIZE_RATIO = 2;
14
+ var SNAP_GAP = 10;
13
15
  var WIDTHS = {
14
16
  MIN: _editorSharedStyles.akEditorDefaultLayoutWidth,
17
+ WIDE: _editorSharedStyles.akEditorCalculatedWideLayoutWidth,
15
18
  MAX: _editorSharedStyles.akEditorFullWidthLayoutWidth
16
19
  };
17
20
  function getProposedWidth(_ref) {
@@ -22,13 +25,19 @@ function getProposedWidth(_ref) {
22
25
  source = _ref.source;
23
26
  var directionMultiplier = source.data.handleSide === 'left' ? -1 : 1;
24
27
  var diffX = (location.current.input.clientX - location.initial.input.clientX) * RESIZE_RATIO * directionMultiplier;
25
-
26
- // TODO: ED-28024 - add snapping logic
27
-
28
28
  var containerWidth = ((api === null || api === void 0 || (_api$width$sharedStat = api.width.sharedState) === null || _api$width$sharedStat === void 0 || (_api$width$sharedStat = _api$width$sharedStat.currentState()) === null || _api$width$sharedStat === void 0 ? void 0 : _api$width$sharedStat.width) || 0) - 2 * (0, _editorSharedStyles.akEditorGutterPaddingDynamic)() - _editorSharedStyles.akEditorGutterPadding;
29
29
 
30
30
  // the node width may be greater than the container width so we resize using the smaller value
31
31
  var proposedWidth = Math.min(initialWidth, containerWidth) + diffX;
32
+ if ((0, _platformFeatureFlags.fg)('platform_editor_breakout_resizing_hello_release')) {
33
+ var snapPoints = [WIDTHS.MIN, WIDTHS.WIDE, Math.min(containerWidth, WIDTHS.MAX)];
34
+ for (var _i = 0, _snapPoints = snapPoints; _i < _snapPoints.length; _i++) {
35
+ var snapPoint = _snapPoints[_i];
36
+ if (snapPoint - SNAP_GAP < proposedWidth && snapPoint + SNAP_GAP > proposedWidth) {
37
+ return snapPoint;
38
+ }
39
+ }
40
+ }
32
41
  return Math.min(Math.max(WIDTHS.MIN, Math.min(proposedWidth, containerWidth)), WIDTHS.MAX);
33
42
  }
34
43
  function createResizerCallbacks(_ref2) {
@@ -5,11 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.ResizingMarkView = exports.LOCAL_RESIZE_PROPERTY = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
9
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
10
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
11
  var _styles = require("@atlaskit/editor-common/styles");
11
12
  var _pragmaticResizer = require("./pragmatic-resizer");
12
13
  var _resizerCallbacks = require("./resizer-callbacks");
14
+ 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; }
15
+ 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; }
13
16
  var LOCAL_RESIZE_PROPERTY = exports.LOCAL_RESIZE_PROPERTY = '--local-resizing-width';
14
17
  var ResizingMarkView = exports.ResizingMarkView = /*#__PURE__*/function () {
15
18
  /**
@@ -38,6 +41,7 @@ var ResizingMarkView = exports.ResizingMarkView = /*#__PURE__*/function () {
38
41
  // contentDOM - styles
39
42
  contentDOM.style.gridRow = '1';
40
43
  contentDOM.style.gridColumn = '1';
44
+ contentDOM.style.zIndex = '1';
41
45
  if (mark.attrs.width) {
42
46
  contentDOM.style.minWidth = "min(var(".concat(LOCAL_RESIZE_PROPERTY, ", ").concat(mark.attrs.width, "px), calc(100cqw - var(--ak-editor--breakout-full-page-guttering-padding)))");
43
47
  } else {
@@ -56,7 +60,9 @@ var ResizingMarkView = exports.ResizingMarkView = /*#__PURE__*/function () {
56
60
  mark: mark,
57
61
  api: api
58
62
  });
59
- var _createPragmaticResiz = (0, _pragmaticResizer.createPragmaticResizer)(callbacks),
63
+ var _createPragmaticResiz = (0, _pragmaticResizer.createPragmaticResizer)(_objectSpread({
64
+ target: contentDOM
65
+ }, callbacks)),
60
66
  leftHandle = _createPragmaticResiz.leftHandle,
61
67
  rightHandle = _createPragmaticResiz.rightHandle,
62
68
  destroy = _createPragmaticResiz.destroy;
@@ -3,6 +3,7 @@ import { EXPAND_CONTAINER_PADDING, LAYOUT_COLUMN_PADDING, resizerHandleThumbWidt
3
3
  import { akEditorGutterPaddingDynamic, akEditorGutterPadding, akEditorCalculatedWideLayoutWidth, akEditorFullWidthLayoutWidth, akEditorDefaultLayoutWidth } from '@atlaskit/editor-shared-styles';
4
4
  const WIDTHS = {
5
5
  MIN: akEditorDefaultLayoutWidth,
6
+ WIDE: akEditorCalculatedWideLayoutWidth,
6
7
  MAX: akEditorFullWidthLayoutWidth
7
8
  };
8
9
  const GUIDELINE_KEYS = {
@@ -35,7 +36,6 @@ export const getGuidelines = memoizeOne((isResizing, newWidth, getEditorWidth, n
35
36
  lineLength
36
37
  } = getEditorWidth() || {};
37
38
  // TODO: ED-28109 - use breakoutWideScaleRatio to calculate wide guideline
38
- const wide = akEditorCalculatedWideLayoutWidth;
39
39
  const fullWidth = width ? Math.min(WIDTHS.MAX, width - 2 * akEditorGutterPaddingDynamic() - akEditorGutterPadding) : undefined;
40
40
  if (lineLength) {
41
41
  guidelines.push({
@@ -56,16 +56,16 @@ export const getGuidelines = memoizeOne((isResizing, newWidth, getEditorWidth, n
56
56
  guidelines.push({
57
57
  key: `${GUIDELINE_KEYS.wide}_left`,
58
58
  position: {
59
- x: -roundToNearest(wide / 2 + innerPaddingOffset)
59
+ x: -roundToNearest(WIDTHS.WIDE / 2 + innerPaddingOffset)
60
60
  },
61
- active: newWidth === wide
61
+ active: newWidth === WIDTHS.WIDE
62
62
  });
63
63
  guidelines.push({
64
64
  key: `${GUIDELINE_KEYS.wide}_right`,
65
65
  position: {
66
- x: roundToNearest(wide / 2 + innerPaddingOffset)
66
+ x: roundToNearest(WIDTHS.WIDE / 2 + innerPaddingOffset)
67
67
  },
68
- active: newWidth === wide
68
+ active: newWidth === WIDTHS.WIDE
69
69
  });
70
70
  if (fullWidth) {
71
71
  guidelines.push({
@@ -1,11 +1,42 @@
1
+ import { bind } from 'bind-event-listener';
1
2
  import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
2
3
  import { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';
3
4
  import { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';
4
5
  export const createPragmaticResizer = ({
6
+ target,
5
7
  onDragStart,
6
8
  onDrag,
7
9
  onDrop
8
10
  }) => {
11
+ let state = 'default';
12
+ const createHandle = side => {
13
+ const handle = document.createElement('div');
14
+ handle.contentEditable = 'false';
15
+ handle.classList.add('pm-breakout-resize-handle-container');
16
+ const rail = document.createElement('div');
17
+ rail.classList.add('pm-breakout-resize-handle-rail');
18
+ if (side === 'left') {
19
+ handle.classList.add('pm-breakout-resize-handle-container--left');
20
+ handle.setAttribute('data-testid', 'pragmatic-resizer-handle-left');
21
+ } else {
22
+ handle.classList.add('pm-breakout-resize-handle-container--right');
23
+ handle.setAttribute('data-testid', 'pragmatic-resizer-handle-right');
24
+ }
25
+ const handleHitBox = document.createElement('div');
26
+ handleHitBox.classList.add('pm-breakout-resize-handle-hit-box');
27
+ const thumb = document.createElement('div');
28
+ thumb.classList.add('pm-breakout-resize-handle-thumb');
29
+ rail.appendChild(thumb);
30
+ handle.appendChild(rail);
31
+ handle.appendChild(handleHitBox);
32
+ return {
33
+ handle,
34
+ rail,
35
+ handleHitBox
36
+ };
37
+ };
38
+ const rightHandle = createHandle('right');
39
+ const leftHandle = createHandle('left');
9
40
  const registerHandle = (handleElement, handleSide) => {
10
41
  return draggable({
11
42
  element: handleElement,
@@ -20,40 +51,46 @@ export const createPragmaticResizer = ({
20
51
  getInitialData: () => ({
21
52
  handleSide
22
53
  }),
23
- onDragStart,
54
+ onDragStart(args) {
55
+ state = 'resizing';
56
+ handleElement.classList.add('pm-breakout-resize-handle-container--active');
57
+ onDragStart(args);
58
+ },
24
59
  onDrag,
25
60
  onDrop(args) {
26
61
  preventUnhandled.stop();
62
+ state = 'default';
63
+ handleElement.classList.remove('pm-breakout-resize-handle-container--active');
27
64
  onDrop(args);
28
65
  }
29
66
  });
30
67
  };
31
- const createHandle = side => {
32
- const handle = document.createElement('div');
33
- handle.contentEditable = 'false';
34
- handle.classList.add('pm-breakout-resize-handle');
35
- if (side === 'left') {
36
- handle.classList.add('pm-breakout-resize-handle-left');
37
- handle.setAttribute('data-testid', 'pragmatic-resizer-handle-left');
38
- } else {
39
- handle.classList.add('pm-breakout-resize-handle-right');
40
- handle.setAttribute('data-testid', 'pragmatic-resizer-handle-right');
41
- }
42
- const handleInner = document.createElement('div');
43
- handleInner.classList.add('pm-breakout-resize-handle-inner');
44
- handle.appendChild(handleInner);
45
- return handle;
68
+ const registerEvents = element => {
69
+ return [bind(element, {
70
+ type: 'mouseenter',
71
+ listener: () => {
72
+ rightHandle.rail.style.setProperty('opacity', '1');
73
+ leftHandle.rail.style.setProperty('opacity', '1');
74
+ }
75
+ }), bind(element, {
76
+ type: 'mouseleave',
77
+ listener: () => {
78
+ if (state === 'resizing') {
79
+ return;
80
+ }
81
+ rightHandle.rail.style.removeProperty('opacity');
82
+ leftHandle.rail.style.removeProperty('opacity');
83
+ }
84
+ })];
46
85
  };
47
- const rightHandle = createHandle('right');
48
- const leftHandle = createHandle('left');
49
- const rightHandleCleanup = registerHandle(rightHandle, 'right');
50
- const leftHandleCleanup = registerHandle(leftHandle, 'left');
86
+ const unbindFns = [...registerEvents(target), ...registerEvents(rightHandle.handleHitBox), ...registerEvents(leftHandle.handleHitBox), ...registerEvents(rightHandle.rail), ...registerEvents(leftHandle.rail)];
87
+ const destroyFns = [registerHandle(rightHandle.handle, 'right'), registerHandle(leftHandle.handle, 'left')];
51
88
  return {
52
- rightHandle,
53
- leftHandle,
89
+ rightHandle: rightHandle.handle,
90
+ leftHandle: leftHandle.handle,
54
91
  destroy: () => {
55
- rightHandleCleanup();
56
- leftHandleCleanup();
92
+ destroyFns.forEach(destroyFn => destroyFn());
93
+ unbindFns.forEach(unbindFn => unbindFn());
57
94
  }
58
95
  };
59
96
  };
@@ -1,10 +1,13 @@
1
- import { akEditorGutterPaddingDynamic, akEditorGutterPadding, akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth } from '@atlaskit/editor-shared-styles';
1
+ import { akEditorGutterPaddingDynamic, akEditorGutterPadding, akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth, akEditorCalculatedWideLayoutWidth } from '@atlaskit/editor-shared-styles';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { setBreakoutWidth } from '../editor-commands/set-breakout-width';
3
4
  import { getGuidelines } from './get-guidelines';
4
5
  import { LOCAL_RESIZE_PROPERTY } from './resizing-mark-view';
5
6
  const RESIZE_RATIO = 2;
7
+ const SNAP_GAP = 10;
6
8
  const WIDTHS = {
7
9
  MIN: akEditorDefaultLayoutWidth,
10
+ WIDE: akEditorCalculatedWideLayoutWidth,
8
11
  MAX: akEditorFullWidthLayoutWidth
9
12
  };
10
13
  export function getProposedWidth({
@@ -16,13 +19,18 @@ export function getProposedWidth({
16
19
  var _api$width$sharedStat, _api$width$sharedStat2;
17
20
  const directionMultiplier = source.data.handleSide === 'left' ? -1 : 1;
18
21
  const diffX = (location.current.input.clientX - location.initial.input.clientX) * RESIZE_RATIO * directionMultiplier;
19
-
20
- // TODO: ED-28024 - add snapping logic
21
-
22
22
  const containerWidth = ((api === null || api === void 0 ? void 0 : (_api$width$sharedStat = api.width.sharedState) === null || _api$width$sharedStat === void 0 ? void 0 : (_api$width$sharedStat2 = _api$width$sharedStat.currentState()) === null || _api$width$sharedStat2 === void 0 ? void 0 : _api$width$sharedStat2.width) || 0) - 2 * akEditorGutterPaddingDynamic() - akEditorGutterPadding;
23
23
 
24
24
  // the node width may be greater than the container width so we resize using the smaller value
25
25
  const proposedWidth = Math.min(initialWidth, containerWidth) + diffX;
26
+ if (fg('platform_editor_breakout_resizing_hello_release')) {
27
+ const snapPoints = [WIDTHS.MIN, WIDTHS.WIDE, Math.min(containerWidth, WIDTHS.MAX)];
28
+ for (const snapPoint of snapPoints) {
29
+ if (snapPoint - SNAP_GAP < proposedWidth && snapPoint + SNAP_GAP > proposedWidth) {
30
+ return snapPoint;
31
+ }
32
+ }
33
+ }
26
34
  return Math.min(Math.max(WIDTHS.MIN, Math.min(proposedWidth, containerWidth)), WIDTHS.MAX);
27
35
  }
28
36
  export function createResizerCallbacks({
@@ -28,6 +28,7 @@ export class ResizingMarkView {
28
28
  // contentDOM - styles
29
29
  contentDOM.style.gridRow = '1';
30
30
  contentDOM.style.gridColumn = '1';
31
+ contentDOM.style.zIndex = '1';
31
32
  if (mark.attrs.width) {
32
33
  contentDOM.style.minWidth = `min(var(${LOCAL_RESIZE_PROPERTY}, ${mark.attrs.width}px), calc(100cqw - var(--ak-editor--breakout-full-page-guttering-padding)))`;
33
34
  } else {
@@ -50,7 +51,10 @@ export class ResizingMarkView {
50
51
  leftHandle,
51
52
  rightHandle,
52
53
  destroy
53
- } = createPragmaticResizer(callbacks);
54
+ } = createPragmaticResizer({
55
+ target: contentDOM,
56
+ ...callbacks
57
+ });
54
58
  dom.prepend(leftHandle);
55
59
  dom.appendChild(rightHandle);
56
60
  this.dom = dom;
@@ -3,6 +3,7 @@ import { EXPAND_CONTAINER_PADDING, LAYOUT_COLUMN_PADDING, resizerHandleThumbWidt
3
3
  import { akEditorGutterPaddingDynamic, akEditorGutterPadding, akEditorCalculatedWideLayoutWidth, akEditorFullWidthLayoutWidth, akEditorDefaultLayoutWidth } from '@atlaskit/editor-shared-styles';
4
4
  var WIDTHS = {
5
5
  MIN: akEditorDefaultLayoutWidth,
6
+ WIDE: akEditorCalculatedWideLayoutWidth,
6
7
  MAX: akEditorFullWidthLayoutWidth
7
8
  };
8
9
  var GUIDELINE_KEYS = {
@@ -37,7 +38,6 @@ export var getGuidelines = memoizeOne(function (isResizing, newWidth, getEditorW
37
38
  width = _ref.width,
38
39
  lineLength = _ref.lineLength;
39
40
  // TODO: ED-28109 - use breakoutWideScaleRatio to calculate wide guideline
40
- var wide = akEditorCalculatedWideLayoutWidth;
41
41
  var fullWidth = width ? Math.min(WIDTHS.MAX, width - 2 * akEditorGutterPaddingDynamic() - akEditorGutterPadding) : undefined;
42
42
  if (lineLength) {
43
43
  guidelines.push({
@@ -58,16 +58,16 @@ export var getGuidelines = memoizeOne(function (isResizing, newWidth, getEditorW
58
58
  guidelines.push({
59
59
  key: "".concat(GUIDELINE_KEYS.wide, "_left"),
60
60
  position: {
61
- x: -roundToNearest(wide / 2 + innerPaddingOffset)
61
+ x: -roundToNearest(WIDTHS.WIDE / 2 + innerPaddingOffset)
62
62
  },
63
- active: newWidth === wide
63
+ active: newWidth === WIDTHS.WIDE
64
64
  });
65
65
  guidelines.push({
66
66
  key: "".concat(GUIDELINE_KEYS.wide, "_right"),
67
67
  position: {
68
- x: roundToNearest(wide / 2 + innerPaddingOffset)
68
+ x: roundToNearest(WIDTHS.WIDE / 2 + innerPaddingOffset)
69
69
  },
70
- active: newWidth === wide
70
+ active: newWidth === WIDTHS.WIDE
71
71
  });
72
72
  if (fullWidth) {
73
73
  guidelines.push({
@@ -1,10 +1,42 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import { bind } from 'bind-event-listener';
1
3
  import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
2
4
  import { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';
3
5
  import { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';
4
6
  export var createPragmaticResizer = function createPragmaticResizer(_ref) {
5
- var onDragStart = _ref.onDragStart,
7
+ var target = _ref.target,
8
+ _onDragStart = _ref.onDragStart,
6
9
  onDrag = _ref.onDrag,
7
10
  _onDrop = _ref.onDrop;
11
+ var state = 'default';
12
+ var createHandle = function createHandle(side) {
13
+ var handle = document.createElement('div');
14
+ handle.contentEditable = 'false';
15
+ handle.classList.add('pm-breakout-resize-handle-container');
16
+ var rail = document.createElement('div');
17
+ rail.classList.add('pm-breakout-resize-handle-rail');
18
+ if (side === 'left') {
19
+ handle.classList.add('pm-breakout-resize-handle-container--left');
20
+ handle.setAttribute('data-testid', 'pragmatic-resizer-handle-left');
21
+ } else {
22
+ handle.classList.add('pm-breakout-resize-handle-container--right');
23
+ handle.setAttribute('data-testid', 'pragmatic-resizer-handle-right');
24
+ }
25
+ var handleHitBox = document.createElement('div');
26
+ handleHitBox.classList.add('pm-breakout-resize-handle-hit-box');
27
+ var thumb = document.createElement('div');
28
+ thumb.classList.add('pm-breakout-resize-handle-thumb');
29
+ rail.appendChild(thumb);
30
+ handle.appendChild(rail);
31
+ handle.appendChild(handleHitBox);
32
+ return {
33
+ handle: handle,
34
+ rail: rail,
35
+ handleHitBox: handleHitBox
36
+ };
37
+ };
38
+ var rightHandle = createHandle('right');
39
+ var leftHandle = createHandle('left');
8
40
  var registerHandle = function registerHandle(handleElement, handleSide) {
9
41
  return draggable({
10
42
  element: handleElement,
@@ -20,40 +52,50 @@ export var createPragmaticResizer = function createPragmaticResizer(_ref) {
20
52
  handleSide: handleSide
21
53
  };
22
54
  },
23
- onDragStart: onDragStart,
55
+ onDragStart: function onDragStart(args) {
56
+ state = 'resizing';
57
+ handleElement.classList.add('pm-breakout-resize-handle-container--active');
58
+ _onDragStart(args);
59
+ },
24
60
  onDrag: onDrag,
25
61
  onDrop: function onDrop(args) {
26
62
  preventUnhandled.stop();
63
+ state = 'default';
64
+ handleElement.classList.remove('pm-breakout-resize-handle-container--active');
27
65
  _onDrop(args);
28
66
  }
29
67
  });
30
68
  };
31
- var createHandle = function createHandle(side) {
32
- var handle = document.createElement('div');
33
- handle.contentEditable = 'false';
34
- handle.classList.add('pm-breakout-resize-handle');
35
- if (side === 'left') {
36
- handle.classList.add('pm-breakout-resize-handle-left');
37
- handle.setAttribute('data-testid', 'pragmatic-resizer-handle-left');
38
- } else {
39
- handle.classList.add('pm-breakout-resize-handle-right');
40
- handle.setAttribute('data-testid', 'pragmatic-resizer-handle-right');
41
- }
42
- var handleInner = document.createElement('div');
43
- handleInner.classList.add('pm-breakout-resize-handle-inner');
44
- handle.appendChild(handleInner);
45
- return handle;
69
+ var registerEvents = function registerEvents(element) {
70
+ return [bind(element, {
71
+ type: 'mouseenter',
72
+ listener: function listener() {
73
+ rightHandle.rail.style.setProperty('opacity', '1');
74
+ leftHandle.rail.style.setProperty('opacity', '1');
75
+ }
76
+ }), bind(element, {
77
+ type: 'mouseleave',
78
+ listener: function listener() {
79
+ if (state === 'resizing') {
80
+ return;
81
+ }
82
+ rightHandle.rail.style.removeProperty('opacity');
83
+ leftHandle.rail.style.removeProperty('opacity');
84
+ }
85
+ })];
46
86
  };
47
- var rightHandle = createHandle('right');
48
- var leftHandle = createHandle('left');
49
- var rightHandleCleanup = registerHandle(rightHandle, 'right');
50
- var leftHandleCleanup = registerHandle(leftHandle, 'left');
87
+ var unbindFns = [].concat(_toConsumableArray(registerEvents(target)), _toConsumableArray(registerEvents(rightHandle.handleHitBox)), _toConsumableArray(registerEvents(leftHandle.handleHitBox)), _toConsumableArray(registerEvents(rightHandle.rail)), _toConsumableArray(registerEvents(leftHandle.rail)));
88
+ var destroyFns = [registerHandle(rightHandle.handle, 'right'), registerHandle(leftHandle.handle, 'left')];
51
89
  return {
52
- rightHandle: rightHandle,
53
- leftHandle: leftHandle,
90
+ rightHandle: rightHandle.handle,
91
+ leftHandle: leftHandle.handle,
54
92
  destroy: function destroy() {
55
- rightHandleCleanup();
56
- leftHandleCleanup();
93
+ destroyFns.forEach(function (destroyFn) {
94
+ return destroyFn();
95
+ });
96
+ unbindFns.forEach(function (unbindFn) {
97
+ return unbindFn();
98
+ });
57
99
  }
58
100
  };
59
101
  };
@@ -1,10 +1,13 @@
1
- import { akEditorGutterPaddingDynamic, akEditorGutterPadding, akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth } from '@atlaskit/editor-shared-styles';
1
+ import { akEditorGutterPaddingDynamic, akEditorGutterPadding, akEditorDefaultLayoutWidth, akEditorFullWidthLayoutWidth, akEditorCalculatedWideLayoutWidth } from '@atlaskit/editor-shared-styles';
2
+ import { fg } from '@atlaskit/platform-feature-flags';
2
3
  import { setBreakoutWidth } from '../editor-commands/set-breakout-width';
3
4
  import { getGuidelines } from './get-guidelines';
4
5
  import { LOCAL_RESIZE_PROPERTY } from './resizing-mark-view';
5
6
  var RESIZE_RATIO = 2;
7
+ var SNAP_GAP = 10;
6
8
  var WIDTHS = {
7
9
  MIN: akEditorDefaultLayoutWidth,
10
+ WIDE: akEditorCalculatedWideLayoutWidth,
8
11
  MAX: akEditorFullWidthLayoutWidth
9
12
  };
10
13
  export function getProposedWidth(_ref) {
@@ -15,13 +18,19 @@ export function getProposedWidth(_ref) {
15
18
  source = _ref.source;
16
19
  var directionMultiplier = source.data.handleSide === 'left' ? -1 : 1;
17
20
  var diffX = (location.current.input.clientX - location.initial.input.clientX) * RESIZE_RATIO * directionMultiplier;
18
-
19
- // TODO: ED-28024 - add snapping logic
20
-
21
21
  var containerWidth = ((api === null || api === void 0 || (_api$width$sharedStat = api.width.sharedState) === null || _api$width$sharedStat === void 0 || (_api$width$sharedStat = _api$width$sharedStat.currentState()) === null || _api$width$sharedStat === void 0 ? void 0 : _api$width$sharedStat.width) || 0) - 2 * akEditorGutterPaddingDynamic() - akEditorGutterPadding;
22
22
 
23
23
  // the node width may be greater than the container width so we resize using the smaller value
24
24
  var proposedWidth = Math.min(initialWidth, containerWidth) + diffX;
25
+ if (fg('platform_editor_breakout_resizing_hello_release')) {
26
+ var snapPoints = [WIDTHS.MIN, WIDTHS.WIDE, Math.min(containerWidth, WIDTHS.MAX)];
27
+ for (var _i = 0, _snapPoints = snapPoints; _i < _snapPoints.length; _i++) {
28
+ var snapPoint = _snapPoints[_i];
29
+ if (snapPoint - SNAP_GAP < proposedWidth && snapPoint + SNAP_GAP > proposedWidth) {
30
+ return snapPoint;
31
+ }
32
+ }
33
+ }
25
34
  return Math.min(Math.max(WIDTHS.MIN, Math.min(proposedWidth, containerWidth)), WIDTHS.MAX);
26
35
  }
27
36
  export function createResizerCallbacks(_ref2) {
@@ -1,5 +1,8 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
1
2
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
3
  import _createClass from "@babel/runtime/helpers/createClass";
4
+ 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; }
5
+ 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; }
3
6
  import { BreakoutCssClassName } from '@atlaskit/editor-common/styles';
4
7
  import { createPragmaticResizer } from './pragmatic-resizer';
5
8
  import { createResizerCallbacks } from './resizer-callbacks';
@@ -31,6 +34,7 @@ export var ResizingMarkView = /*#__PURE__*/function () {
31
34
  // contentDOM - styles
32
35
  contentDOM.style.gridRow = '1';
33
36
  contentDOM.style.gridColumn = '1';
37
+ contentDOM.style.zIndex = '1';
34
38
  if (mark.attrs.width) {
35
39
  contentDOM.style.minWidth = "min(var(".concat(LOCAL_RESIZE_PROPERTY, ", ").concat(mark.attrs.width, "px), calc(100cqw - var(--ak-editor--breakout-full-page-guttering-padding)))");
36
40
  } else {
@@ -49,7 +53,9 @@ export var ResizingMarkView = /*#__PURE__*/function () {
49
53
  mark: mark,
50
54
  api: api
51
55
  });
52
- var _createPragmaticResiz = createPragmaticResizer(callbacks),
56
+ var _createPragmaticResiz = createPragmaticResizer(_objectSpread({
57
+ target: contentDOM
58
+ }, callbacks)),
53
59
  leftHandle = _createPragmaticResiz.leftHandle,
54
60
  rightHandle = _createPragmaticResiz.rightHandle,
55
61
  destroy = _createPragmaticResiz.destroy;
@@ -1,6 +1,7 @@
1
1
  import type { BaseEventPayload, ElementDragType } from '@atlaskit/pragmatic-drag-and-drop/types';
2
- export declare const createPragmaticResizer: ({ onDragStart, onDrag, onDrop, }: {
3
- onDragStart: () => void;
2
+ export declare const createPragmaticResizer: ({ target, onDragStart, onDrag, onDrop, }: {
3
+ target: HTMLElement;
4
+ onDragStart: (args: BaseEventPayload<ElementDragType>) => void;
4
5
  onDrag: (args: BaseEventPayload<ElementDragType>) => void;
5
6
  onDrop: (args: BaseEventPayload<ElementDragType>) => void;
6
7
  }) => {
@@ -4,7 +4,7 @@ import { EditorView } from '@atlaskit/editor-prosemirror/view';
4
4
  import { ElementDragPayload } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
5
5
  import { BaseEventPayload, DragLocationHistory, ElementDragType } from '@atlaskit/pragmatic-drag-and-drop/types';
6
6
  import { BreakoutPlugin } from '../breakoutPluginType';
7
- export declare function getProposedWidth({ initialWidth, location, api, source }: {
7
+ export declare function getProposedWidth({ initialWidth, location, api, source, }: {
8
8
  initialWidth: number;
9
9
  location: DragLocationHistory;
10
10
  api: ExtractInjectionAPI<BreakoutPlugin> | undefined;
@@ -1,6 +1,7 @@
1
1
  import type { BaseEventPayload, ElementDragType } from '@atlaskit/pragmatic-drag-and-drop/types';
2
- export declare const createPragmaticResizer: ({ onDragStart, onDrag, onDrop, }: {
3
- onDragStart: () => void;
2
+ export declare const createPragmaticResizer: ({ target, onDragStart, onDrag, onDrop, }: {
3
+ target: HTMLElement;
4
+ onDragStart: (args: BaseEventPayload<ElementDragType>) => void;
4
5
  onDrag: (args: BaseEventPayload<ElementDragType>) => void;
5
6
  onDrop: (args: BaseEventPayload<ElementDragType>) => void;
6
7
  }) => {
@@ -4,7 +4,7 @@ import { EditorView } from '@atlaskit/editor-prosemirror/view';
4
4
  import { ElementDragPayload } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
5
5
  import { BaseEventPayload, DragLocationHistory, ElementDragType } from '@atlaskit/pragmatic-drag-and-drop/types';
6
6
  import { BreakoutPlugin } from '../breakoutPluginType';
7
- export declare function getProposedWidth({ initialWidth, location, api, source }: {
7
+ export declare function getProposedWidth({ initialWidth, location, api, source, }: {
8
8
  initialWidth: number;
9
9
  location: DragLocationHistory;
10
10
  api: ExtractInjectionAPI<BreakoutPlugin> | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-breakout",
3
- "version": "2.5.1",
3
+ "version": "2.5.2",
4
4
  "description": "Breakout plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@atlaskit/adf-schema": "^47.6.0",
37
- "@atlaskit/editor-common": "^106.1.0",
37
+ "@atlaskit/editor-common": "^106.3.0",
38
38
  "@atlaskit/editor-plugin-block-controls": "^3.15.0",
39
39
  "@atlaskit/editor-plugin-editor-disabled": "^2.0.0",
40
40
  "@atlaskit/editor-plugin-editor-viewmode": "^4.0.0",
@@ -48,10 +48,11 @@
48
48
  "@atlaskit/platform-feature-flags": "^1.1.0",
49
49
  "@atlaskit/pragmatic-drag-and-drop": "^1.7.0",
50
50
  "@atlaskit/theme": "^18.0.0",
51
- "@atlaskit/tmp-editor-statsig": "^5.10.0",
51
+ "@atlaskit/tmp-editor-statsig": "^5.13.0",
52
52
  "@atlaskit/tokens": "^5.0.0",
53
53
  "@babel/runtime": "^7.0.0",
54
54
  "@emotion/react": "^11.7.1",
55
+ "bind-event-listener": "^3.0.0",
55
56
  "memoize-one": "^6.0.0"
56
57
  },
57
58
  "peerDependencies": {
@@ -113,6 +114,9 @@
113
114
  },
114
115
  "platform_editor_hide_expand_selection_states": {
115
116
  "type": "boolean"
117
+ },
118
+ "platform_editor_breakout_resizing_hello_release": {
119
+ "type": "boolean"
116
120
  }
117
121
  }
118
122
  }