@atlaskit/editor-plugin-media 1.39.3 → 1.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/nodeviews/mediaSingle.js +2 -1
  3. package/dist/cjs/nodeviews/mediaSingleNext.js +2 -1
  4. package/dist/cjs/toolbar/mediaInline.js +5 -2
  5. package/dist/cjs/ui/ResizableMediaSingle/ResizableMediaSingleNext.js +96 -43
  6. package/dist/es2019/nodeviews/mediaSingle.js +1 -0
  7. package/dist/es2019/nodeviews/mediaSingleNext.js +2 -1
  8. package/dist/es2019/toolbar/mediaInline.js +5 -2
  9. package/dist/es2019/ui/ResizableMediaSingle/ResizableMediaSingleNext.js +80 -28
  10. package/dist/esm/nodeviews/mediaSingle.js +2 -1
  11. package/dist/esm/nodeviews/mediaSingleNext.js +2 -1
  12. package/dist/esm/toolbar/mediaInline.js +5 -2
  13. package/dist/esm/ui/ResizableMediaSingle/ResizableMediaSingleNext.js +97 -44
  14. package/dist/types/nodeviews/lazy-media-group.d.ts +1 -1
  15. package/dist/types/nodeviews/lazy-media-inline.d.ts +1 -1
  16. package/dist/types/nodeviews/lazy-media-single.d.ts +1 -1
  17. package/dist/types/nodeviews/lazy-media.d.ts +1 -1
  18. package/dist/types/nodeviews/mediaGroup.d.ts +1 -1
  19. package/dist/types/nodeviews/mediaInline.d.ts +1 -1
  20. package/dist/types/nodeviews/mediaNodeView/index.d.ts +1 -1
  21. package/dist/types/types.d.ts +2 -0
  22. package/dist/types/ui/ResizableMediaSingle/ResizableMediaSingleNext.d.ts +1 -1
  23. package/dist/types/ui/ResizableMediaSingle/types.d.ts +2 -0
  24. package/dist/types-ts4.5/nodeviews/lazy-media-group.d.ts +1 -1
  25. package/dist/types-ts4.5/nodeviews/lazy-media-inline.d.ts +1 -1
  26. package/dist/types-ts4.5/nodeviews/lazy-media-single.d.ts +1 -1
  27. package/dist/types-ts4.5/nodeviews/lazy-media.d.ts +1 -1
  28. package/dist/types-ts4.5/nodeviews/mediaGroup.d.ts +1 -1
  29. package/dist/types-ts4.5/nodeviews/mediaInline.d.ts +1 -1
  30. package/dist/types-ts4.5/nodeviews/mediaNodeView/index.d.ts +1 -1
  31. package/dist/types-ts4.5/types.d.ts +2 -0
  32. package/dist/types-ts4.5/ui/ResizableMediaSingle/ResizableMediaSingleNext.d.ts +1 -1
  33. package/dist/types-ts4.5/ui/ResizableMediaSingle/types.d.ts +2 -0
  34. package/package.json +14 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 1.40.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#161860](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/161860)
8
+ [`a147e2be38608`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/a147e2be38608) -
9
+ [ux] ED-25319 Support forced media resize handle positions in media options
10
+ - [#161860](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/161860)
11
+ [`4b8000830cac4`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/4b8000830cac4) -
12
+ [ux] ED-25319 support new forceHandlePositioning media option for chromeless editors
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies
17
+
18
+ ## 1.39.4
19
+
20
+ ### Patch Changes
21
+
22
+ - [#160815](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/160815)
23
+ [`40198d061572a`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/40198d061572a) -
24
+ migrate inline media preview icon
25
+
3
26
  ## 1.39.3
4
27
 
5
28
  ### Patch Changes
@@ -439,7 +439,8 @@ var MediaSingleNode = exports.default = /*#__PURE__*/function (_Component) {
439
439
  allowBreakoutSnapPoints: mediaOptions && mediaOptions.allowBreakoutSnapPoints,
440
440
  selected: isSelected,
441
441
  dispatchAnalyticsEvent: dispatchAnalyticsEvent,
442
- pluginInjectionApi: pluginInjectionApi
442
+ pluginInjectionApi: pluginInjectionApi,
443
+ forceHandlePositioning: mediaOptions === null || mediaOptions === void 0 ? void 0 : mediaOptions.forceHandlePositioning
443
444
  }, mediaSingleProps);
444
445
  var canResize = !!this.props.mediaOptions.allowResizing && !editorDisabled && !editorViewMode;
445
446
  if (!this.props.mediaOptions.allowResizingInTables) {
@@ -544,7 +544,8 @@ var MediaSingleNodeNext = exports.MediaSingleNodeNext = function MediaSingleNode
544
544
  hasFallbackContainer: false,
545
545
  mediaSingleWidth: mediaSingleWidth,
546
546
  editorAppearance: editorAppearance,
547
- showLegacyNotification: widthType !== 'pixel'
547
+ showLegacyNotification: widthType !== 'pixel',
548
+ forceHandlePositioning: mediaOptions === null || mediaOptions === void 0 ? void 0 : mediaOptions.forceHandlePositioning
548
549
  }, MediaChildren) : (0, _react2.jsx)(_ResizableMediaSingle.default, {
549
550
  view: view,
550
551
  getPos: getPos,
@@ -12,6 +12,7 @@ var _card = require("@atlaskit/editor-common/card");
12
12
  var _messages = _interopRequireWildcard(require("@atlaskit/editor-common/messages"));
13
13
  var _state2 = require("@atlaskit/editor-prosemirror/state");
14
14
  var _delete = _interopRequireDefault(require("@atlaskit/icon/core/delete"));
15
+ var _expand = _interopRequireDefault(require("@atlaskit/icon/core/expand"));
15
16
  var _imageFullscreen = _interopRequireDefault(require("@atlaskit/icon/core/image-fullscreen"));
16
17
  var _imageInline = _interopRequireDefault(require("@atlaskit/icon/core/image-inline"));
17
18
  var _download = _interopRequireDefault(require("@atlaskit/icon/core/migration/download"));
@@ -76,7 +77,8 @@ var generateMediaInlineFloatingToolbar = exports.generateMediaInlineFloatingTool
76
77
  id: 'editor.media.viewer',
77
78
  testId: 'file-preview-toolbar-button',
78
79
  type: 'button',
79
- icon: _filePreview.default,
80
+ icon: _expand.default,
81
+ iconFallback: _filePreview.default,
80
82
  title: intl.formatMessage(_mediaUi.messages.preview),
81
83
  onClick: function onClick() {
82
84
  var _handleShowMediaViewe;
@@ -247,7 +249,8 @@ var getMediaInlineImageToolbar = function getMediaInlineImageToolbar(state, intl
247
249
  id: 'editor.media.viewer',
248
250
  testId: 'file-preview-toolbar-button',
249
251
  type: 'button',
250
- icon: _filePreview.default,
252
+ icon: _expand.default,
253
+ iconFallback: _filePreview.default,
251
254
  title: intl.formatMessage(_mediaUi.messages.preview),
252
255
  onClick: function onClick() {
253
256
  var _handleShowMediaViewe2;
@@ -69,7 +69,7 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
69
69
  dynamicGuides = _generateDynamicGuide.dynamicGuides;
70
70
 
71
71
  // disable guidelines for nested media single node
72
- var dynamicGuidelines = _this.isNestedNode() ? [] : dynamicGuides;
72
+ var dynamicGuidelines = _this.isAdjacentMode() ? [] : dynamicGuides;
73
73
  _this.setState({
74
74
  relativeGuides: relativeGuides,
75
75
  guidelines: [].concat((0, _toConsumableArray2.default)(defaultGuidelines), (0, _toConsumableArray2.default)(dynamicGuidelines))
@@ -87,7 +87,7 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
87
87
  return layout;
88
88
  }
89
89
  }
90
- return _this.calcUnwrappedLayout(newWidth, containerWidth || 0, lineLength, fullWidthMode, _this.isNestedNode());
90
+ return _this.calcUnwrappedLayout(newWidth, containerWidth || 0, lineLength, fullWidthMode, _this.isAdjacentMode());
91
91
  });
92
92
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "calcUnwrappedLayout", function (width, containerWidth, contentWidth, fullWidthMode, isNestedNode) {
93
93
  if (isNestedNode) {
@@ -144,7 +144,7 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
144
144
  return dispatch(tr);
145
145
  }, _mediaSingle.MEDIA_SINGLE_RESIZE_THROTTLE_TIME));
146
146
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "calcMaxWidth", (0, _memoizeOne.default)(function (contentWidth, containerWidth, fullWidthMode) {
147
- if (_this.isNestedNode() || fullWidthMode) {
147
+ if (_this.isAdjacentMode() || fullWidthMode) {
148
148
  return contentWidth;
149
149
  }
150
150
  return (0, _mediaSingle.calcMediaSingleMaxWidth)(containerWidth, _this.props.editorAppearance);
@@ -287,6 +287,21 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
287
287
  updateSize(newWidth, newLayout);
288
288
  });
289
289
  });
290
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getMaxWidth", function () {
291
+ var _this$props6 = _this.props,
292
+ lineLength = _this$props6.lineLength,
293
+ containerWidth = _this$props6.containerWidth,
294
+ fullWidthMode = _this$props6.fullWidthMode,
295
+ editorAppearance = _this$props6.editorAppearance,
296
+ forceHandlePositioning = _this$props6.forceHandlePositioning;
297
+ var isResizing = _this.state.isResizing;
298
+ if (editorAppearance === 'chromeless' && forceHandlePositioning === 'adjacent' && (0, _platformFeatureFlags.fg)('platform_editor_inline_resize_media_to_edge')) {
299
+ return containerWidth - _mediaSingle.MEDIA_SINGLE_ADJACENT_HANDLE_MARGIN * 2;
300
+ }
301
+ return !isResizing && _this.isAdjacentMode() ?
302
+ // set undefined to fall back to 100%
303
+ undefined : _this.calcMaxWidth(lineLength, containerWidth, fullWidthMode);
304
+ });
290
305
  var initialWidth = props.mediaSingleWidth || _mediaSingle.DEFAULT_IMAGE_WIDTH;
291
306
  _this.state = {
292
307
  isVideoFile: true,
@@ -377,9 +392,9 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
377
392
  }, {
378
393
  key: "aspectRatio",
379
394
  get: function get() {
380
- var _this$props6 = this.props,
381
- width = _this$props6.width,
382
- height = _this$props6.height;
395
+ var _this$props7 = this.props,
396
+ width = _this$props7.width,
397
+ height = _this$props7.height;
383
398
  if (width) {
384
399
  return width / height;
385
400
  }
@@ -421,16 +436,34 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
421
436
  var $pos = this.$pos;
422
437
  return !!($pos && $pos.depth !== 0);
423
438
  }
439
+
440
+ // Check if adjacement mode should be activated;
441
+ }, {
442
+ key: "isAdjacentMode",
443
+ value: function isAdjacentMode() {
444
+ var _this$isNestedNode;
445
+ if ((0, _platformFeatureFlags.fg)('platform_editor_inline_resize_media_to_edge')) {
446
+ if (this.props.forceHandlePositioning === 'adjacent') {
447
+ return true;
448
+ }
449
+ }
450
+ return (_this$isNestedNode = this.isNestedNode()) !== null && _this$isNestedNode !== void 0 ? _this$isNestedNode : false;
451
+ }
452
+ }, {
453
+ key: "getHandlePositioning",
454
+ value: function getHandlePositioning() {
455
+ return this.isAdjacentMode() ? 'adjacent' : undefined;
456
+ }
424
457
  }, {
425
458
  key: "getDefaultGuidelines",
426
459
  value: function getDefaultGuidelines() {
427
- var _this$props7 = this.props,
428
- lineLength = _this$props7.lineLength,
429
- containerWidth = _this$props7.containerWidth,
430
- fullWidthMode = _this$props7.fullWidthMode;
460
+ var _this$props8 = this.props,
461
+ lineLength = _this$props8.lineLength,
462
+ containerWidth = _this$props8.containerWidth,
463
+ fullWidthMode = _this$props8.fullWidthMode;
431
464
 
432
465
  // disable guidelines for nested media single node
433
- return this.isNestedNode() ? [] : (0, _guideline.generateDefaultGuidelines)(lineLength, containerWidth || 0, fullWidthMode);
466
+ return this.isAdjacentMode() ? [] : (0, _guideline.generateDefaultGuidelines)(lineLength, containerWidth || 0, fullWidthMode);
434
467
  }
435
468
  }, {
436
469
  key: "checkVideoFile",
@@ -482,15 +515,15 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
482
515
  key: "render",
483
516
  value: function render() {
484
517
  var _this2 = this;
485
- var _this$props8 = this.props,
486
- origWidth = _this$props8.width,
487
- layout = _this$props8.layout,
488
- containerWidth = _this$props8.containerWidth,
489
- fullWidthMode = _this$props8.fullWidthMode,
490
- selected = _this$props8.selected,
491
- children = _this$props8.children,
492
- lineLength = _this$props8.lineLength,
493
- showLegacyNotification = _this$props8.showLegacyNotification;
518
+ var _this$props9 = this.props,
519
+ origWidth = _this$props9.width,
520
+ layout = _this$props9.layout,
521
+ containerWidth = _this$props9.containerWidth,
522
+ fullWidthMode = _this$props9.fullWidthMode,
523
+ selected = _this$props9.selected,
524
+ children = _this$props9.children,
525
+ lineLength = _this$props9.lineLength,
526
+ showLegacyNotification = _this$props9.showLegacyNotification;
494
527
  var _this$state = this.state,
495
528
  isResizing = _this$state.isResizing,
496
529
  size = _this$state.size,
@@ -510,10 +543,9 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
510
543
  'rich-media-wrapped': layout === 'wrap-left' || layout === 'wrap-right'
511
544
  });
512
545
  var resizerNextClassName = (0, _classnames.default)(className, _styles.resizerStyles);
513
- var isNestedNode = this.isNestedNode();
514
- var maxWidth = !isResizing && isNestedNode ?
515
- // set undefined to fall back to 100%
516
- undefined : this.calcMaxWidth(lineLength, containerWidth, fullWidthMode);
546
+ var isNestedNode = this.isAdjacentMode();
547
+ var handlePositioning = this.getHandlePositioning();
548
+ var maxWidth = this.getMaxWidth();
517
549
  var minWidth = this.calcMinWidth(isVideoFile, lineLength);
518
550
 
519
551
  // while is not resizing, we take 100% as min-width if the container width is less than the min-width
@@ -544,7 +576,7 @@ var ResizableMediaSingleNext = /*#__PURE__*/function (_React$Component) {
544
576
  resizeRatio: _utils.nonWrappedLayouts.includes(layout) ? 2 : 1,
545
577
  "data-testid": resizerNextTestId,
546
578
  isHandleVisible: selected,
547
- handlePositioning: isNestedNode ? 'adjacent' : undefined,
579
+ handlePositioning: handlePositioning,
548
580
  handleHighlight: "full-height"
549
581
  }, children, showLegacyNotification && (0, _react2.jsx)(_ResizableMediaMigrationNotification.ResizableMediaMigrationNotification, null)));
550
582
  }
@@ -679,7 +711,8 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
679
711
  pluginInjectionApi = props.pluginInjectionApi,
680
712
  updateSize = props.updateSize,
681
713
  view = props.view,
682
- viewMediaClientConfig = props.viewMediaClientConfig;
714
+ viewMediaClientConfig = props.viewMediaClientConfig,
715
+ forceHandlePositioning = props.forceHandlePositioning;
683
716
  var initialWidth = (0, _react.useMemo)(function () {
684
717
  return mediaSingleWidth || _mediaSingle.DEFAULT_IMAGE_WIDTH;
685
718
  }, [mediaSingleWidth]);
@@ -725,6 +758,14 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
725
758
  var $pos = view.state.doc.resolve(nodePosition);
726
759
  return !!($pos && $pos.depth !== 0);
727
760
  }, [nodePosition, view]);
761
+ var isAdjacentMode = (0, _react.useMemo)(function () {
762
+ if ((0, _platformFeatureFlags.fg)('platform_editor_inline_resize_media_to_edge')) {
763
+ if (forceHandlePositioning === 'adjacent') {
764
+ return true;
765
+ }
766
+ }
767
+ return isNestedNode;
768
+ }, [isNestedNode, forceHandlePositioning]);
728
769
  var maybeContainerWidth = containerWidth || origWidth;
729
770
  var memoizedCss = (0, _react.useMemo)(function () {
730
771
  return (0, _styled.wrapperStyle)({
@@ -732,22 +773,25 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
732
773
  containerWidth: maybeContainerWidth,
733
774
  fullWidthMode: fullWidthMode,
734
775
  mediaSingleWidth: dimensions.width,
735
- isNestedNode: isNestedNode,
776
+ isNestedNode: isAdjacentMode,
736
777
  isExtendedResizeExperienceOn: true
737
778
  });
738
- }, [layout, maybeContainerWidth, fullWidthMode, dimensions.width, isNestedNode]);
779
+ }, [layout, maybeContainerWidth, fullWidthMode, dimensions.width, isAdjacentMode]);
739
780
  var maxWidth = (0, _react.useMemo)(function () {
740
- if (!isResizing && isNestedNode) {
781
+ if (editorAppearance === 'chromeless' && forceHandlePositioning === 'adjacent' && (0, _platformFeatureFlags.fg)('platform_editor_inline_resize_media_to_edge')) {
782
+ return containerWidth - _mediaSingle.MEDIA_SINGLE_ADJACENT_HANDLE_MARGIN * 2;
783
+ }
784
+ if (!isResizing && isAdjacentMode) {
741
785
  return undefined;
742
786
  }
743
- if (isNestedNode || fullWidthMode) {
787
+ if (isAdjacentMode || fullWidthMode) {
744
788
  return lineLength;
745
789
  }
746
790
  return calcMaxWidth({
747
791
  containerWidth: containerWidth,
748
792
  editorAppearance: editorAppearance
749
793
  });
750
- }, [isNestedNode, fullWidthMode, lineLength, editorAppearance, containerWidth, isResizing]);
794
+ }, [isAdjacentMode, fullWidthMode, lineLength, editorAppearance, containerWidth, isResizing, forceHandlePositioning]);
751
795
  var minWidth = calcMinWidth({
752
796
  isVideoFile: isVideoFile,
753
797
  contentWidth: lineLength
@@ -782,11 +826,11 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
782
826
  }, {});
783
827
  }, [layout, isInsideInlineLike]);
784
828
  var defaultGuidelines = (0, _react.useMemo)(function () {
785
- if (isNestedNode) {
829
+ if (isAdjacentMode) {
786
830
  return [];
787
831
  }
788
832
  return (0, _guideline.generateDefaultGuidelines)(lineLength, containerWidth, fullWidthMode);
789
- }, [isNestedNode, lineLength, containerWidth, fullWidthMode]);
833
+ }, [isAdjacentMode, lineLength, containerWidth, fullWidthMode]);
790
834
  var relativeGuidesRef = (0, _react.useRef)({});
791
835
  var guidelinesRef = (0, _react.useRef)([]);
792
836
  var updateGuidelines = (0, _react.useCallback)(function () {
@@ -800,10 +844,10 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
800
844
  dynamicGuides = _generateDynamicGuide2.dynamicGuides;
801
845
 
802
846
  // disable guidelines for nested media single node
803
- var dynamicGuidelines = isNestedNode ? [] : dynamicGuides;
847
+ var dynamicGuidelines = isAdjacentMode ? [] : dynamicGuides;
804
848
  relativeGuidesRef.current = relativeGuides;
805
849
  guidelinesRef.current = [].concat((0, _toConsumableArray2.default)(defaultGuidelines), (0, _toConsumableArray2.default)(dynamicGuidelines));
806
- }, [view, lineLength, defaultGuidelines, isNestedNode]);
850
+ }, [view, lineLength, defaultGuidelines, isAdjacentMode]);
807
851
  var isGuidelineEnabled = (0, _react.useMemo)(function () {
808
852
  return !!(pluginInjectionApi !== null && pluginInjectionApi !== void 0 && pluginInjectionApi.guideline);
809
853
  }, [pluginInjectionApi]);
@@ -866,7 +910,7 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
866
910
  containerWidth: containerWidth,
867
911
  lineLength: lineLength,
868
912
  fullWidthMode: fullWidthMode,
869
- isNestedNode: isNestedNode
913
+ isNestedNode: isAdjacentMode
870
914
  })(size, delta, false, aspectRatioRef.current),
871
915
  width = _calculateSizeState.width,
872
916
  height = _calculateSizeState.height,
@@ -890,7 +934,7 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
890
934
  if (newLayout !== layout) {
891
935
  updateSize(width, newLayout);
892
936
  }
893
- }, [view, updateSize, layout, isGuidelineEnabled, containerWidth, lineLength, fullWidthMode, isNestedNode, updateActiveGuidelines]);
937
+ }, [view, updateSize, layout, isGuidelineEnabled, containerWidth, lineLength, fullWidthMode, isAdjacentMode, updateActiveGuidelines]);
894
938
  var handleResizeStop = (0, _react.useCallback)(function (size, delta) {
895
939
  var _pluginInjectionApi$g3;
896
940
  if (typeof nodePosition !== 'number') {
@@ -901,7 +945,7 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
901
945
  containerWidth: containerWidth,
902
946
  lineLength: lineLength,
903
947
  fullWidthMode: fullWidthMode,
904
- isNestedNode: isNestedNode
948
+ isNestedNode: isAdjacentMode
905
949
  })(size, delta, false, aspectRatioRef.current),
906
950
  width = _calculateSizeState2.width,
907
951
  height = _calculateSizeState2.height,
@@ -938,7 +982,7 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
938
982
  height: height
939
983
  });
940
984
  updateSize(newWidth, newLayout);
941
- }, [nodeType, dispatchAnalyticsEvent, containerWidth, fullWidthMode, isNestedNode, layout, lineLength, view, nodePosition, pluginInjectionApi, updateSize]);
985
+ }, [nodeType, dispatchAnalyticsEvent, containerWidth, fullWidthMode, isAdjacentMode, layout, lineLength, view, nodePosition, pluginInjectionApi, updateSize]);
942
986
  var mountedRef = _react.default.useRef(true);
943
987
  (0, _react.useLayoutEffect)(function () {
944
988
  mountedRef.current = true;
@@ -974,6 +1018,12 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
974
1018
  }
975
1019
  });
976
1020
  }, [view, viewMediaClientConfig, nodePosition]);
1021
+ var handlePositioning = (0, _react.useMemo)(function () {
1022
+ if (forceHandlePositioning) {
1023
+ return forceHandlePositioning;
1024
+ }
1025
+ return isAdjacentMode ? 'adjacent' : undefined;
1026
+ }, [forceHandlePositioning, isAdjacentMode]);
977
1027
  return (0, _react2.jsx)("div", {
978
1028
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values, @atlaskit/design-system/consistent-css-prop-usage -- Ignored via go/DSP-18766
979
1029
  css: memoizedCss
@@ -993,7 +1043,7 @@ var ResizableMediaSingleNextFunctional = exports.ResizableMediaSingleNextFunctio
993
1043
  resizeRatio: _utils.nonWrappedLayouts.includes(layout) ? 2 : 1,
994
1044
  "data-testid": resizerNextTestId,
995
1045
  isHandleVisible: selected,
996
- handlePositioning: isNestedNode ? 'adjacent' : undefined,
1046
+ handlePositioning: handlePositioning,
997
1047
  handleHighlight: "full-height"
998
1048
  }, children, showLegacyNotification && (0, _react2.jsx)(_ResizableMediaMigrationNotification.ResizableMediaMigrationNotification, null)));
999
1049
  };
@@ -1026,7 +1076,8 @@ var ResizableMediaSingleToggle = function ResizableMediaSingleToggle(_ref9) {
1026
1076
  updateSize = _ref9.updateSize,
1027
1077
  view = _ref9.view,
1028
1078
  viewMediaClientConfig = _ref9.viewMediaClientConfig,
1029
- width = _ref9.width;
1079
+ width = _ref9.width,
1080
+ forceHandlePositioning = _ref9.forceHandlePositioning;
1030
1081
  if ((0, _platformFeatureFlags.fg)('platform_editor_react18_phase2__media_single')) {
1031
1082
  return (0, _react2.jsx)(ResizableMediaSingleNextFunctional, {
1032
1083
  allowBreakoutSnapPoints: allowBreakoutSnapPoints,
@@ -1059,7 +1110,8 @@ var ResizableMediaSingleToggle = function ResizableMediaSingleToggle(_ref9) {
1059
1110
  updateSize: updateSize,
1060
1111
  view: view,
1061
1112
  viewMediaClientConfig: viewMediaClientConfig,
1062
- width: width
1113
+ width: width,
1114
+ forceHandlePositioning: forceHandlePositioning
1063
1115
  });
1064
1116
  }
1065
1117
  return (0, _react2.jsx)(ResizableMediaSingleNext, {
@@ -1093,7 +1145,8 @@ var ResizableMediaSingleToggle = function ResizableMediaSingleToggle(_ref9) {
1093
1145
  updateSize: updateSize,
1094
1146
  view: view,
1095
1147
  viewMediaClientConfig: viewMediaClientConfig,
1096
- width: width
1148
+ width: width,
1149
+ forceHandlePositioning: forceHandlePositioning
1097
1150
  });
1098
1151
  };
1099
1152
  var _default = exports.default = ResizableMediaSingleToggle;
@@ -353,6 +353,7 @@ export default class MediaSingleNode extends Component {
353
353
  selected: isSelected,
354
354
  dispatchAnalyticsEvent: dispatchAnalyticsEvent,
355
355
  pluginInjectionApi: pluginInjectionApi,
356
+ forceHandlePositioning: mediaOptions === null || mediaOptions === void 0 ? void 0 : mediaOptions.forceHandlePositioning,
356
357
  ...mediaSingleProps
357
358
  };
358
359
  let canResize = !!this.props.mediaOptions.allowResizing && !editorDisabled && !editorViewMode;
@@ -504,7 +504,8 @@ export const MediaSingleNodeNext = mediaSingleNodeNextProps => {
504
504
  hasFallbackContainer: false,
505
505
  mediaSingleWidth: mediaSingleWidth,
506
506
  editorAppearance: editorAppearance,
507
- showLegacyNotification: widthType !== 'pixel'
507
+ showLegacyNotification: widthType !== 'pixel',
508
+ forceHandlePositioning: mediaOptions === null || mediaOptions === void 0 ? void 0 : mediaOptions.forceHandlePositioning
508
509
  }, MediaChildren) : jsx(ResizableMediaSingle, {
509
510
  view: view,
510
511
  getPos: getPos,
@@ -4,6 +4,7 @@ import { IconCard, IconEmbed, IconInline } from '@atlaskit/editor-common/card';
4
4
  import commonMessages, { cardMessages, mediaAndEmbedToolbarMessages } from '@atlaskit/editor-common/messages';
5
5
  import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
6
6
  import DeleteIcon from '@atlaskit/icon/core/delete';
7
+ import ExpandIcon from '@atlaskit/icon/core/expand';
7
8
  import ImageFullscreenIcon from '@atlaskit/icon/core/image-fullscreen';
8
9
  import ImageInlineIcon from '@atlaskit/icon/core/image-inline';
9
10
  import DownloadIcon from '@atlaskit/icon/core/migration/download';
@@ -65,7 +66,8 @@ export const generateMediaInlineFloatingToolbar = (state, intl, mediaPluginState
65
66
  id: 'editor.media.viewer',
66
67
  testId: 'file-preview-toolbar-button',
67
68
  type: 'button',
68
- icon: FilePreviewIcon,
69
+ icon: ExpandIcon,
70
+ iconFallback: FilePreviewIcon,
69
71
  title: intl.formatMessage(messages.preview),
70
72
  onClick: () => {
71
73
  var _handleShowMediaViewe;
@@ -241,7 +243,8 @@ const getMediaInlineImageToolbar = (state, intl, mediaPluginState, hoverDecorati
241
243
  id: 'editor.media.viewer',
242
244
  testId: 'file-preview-toolbar-button',
243
245
  type: 'button',
244
- icon: FilePreviewIcon,
246
+ icon: ExpandIcon,
247
+ iconFallback: FilePreviewIcon,
245
248
  title: intl.formatMessage(messages.preview),
246
249
  onClick: () => {
247
250
  var _handleShowMediaViewe2;