@atlaskit/editor-common 125.2.1 → 125.4.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 (95) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/dist/cjs/element-browser/components/ElementBrowserLoader.js +8 -31
  3. package/dist/cjs/extensions/buildMenuItem.js +6 -3
  4. package/dist/cjs/extensions/extension-handlers.js +17 -96
  5. package/dist/cjs/floating-toolbar/DropdownMenuExtensionItems.js +4 -25
  6. package/dist/cjs/icons/index.js +10 -33
  7. package/dist/cjs/monitoring/error.js +1 -1
  8. package/dist/cjs/quick-insert/CompactQuickInsertMenuItem.compiled.css +0 -1
  9. package/dist/cjs/quick-insert/CompactQuickInsertMenuItem.js +22 -28
  10. package/dist/cjs/quick-insert/QuickInsertHoverPreview.compiled.css +42 -1
  11. package/dist/cjs/quick-insert/QuickInsertHoverPreview.js +147 -68
  12. package/dist/cjs/quick-insert/QuickInsertMenuItem.js +4 -0
  13. package/dist/cjs/quick-insert/QuickInsertMenuSection.js +11 -4
  14. package/dist/cjs/quick-insert/assets/index.js +257 -888
  15. package/dist/cjs/quick-insert/confluence-attribution-icon.js +18 -0
  16. package/dist/cjs/quick-insert/jira-attribution-icon.js +18 -0
  17. package/dist/cjs/quick-insert/messages.js +30 -0
  18. package/dist/cjs/quick-insert/preview.js +5 -0
  19. package/dist/cjs/quick-insert/snippetPreviewImageUrls.js +43 -43
  20. package/dist/cjs/quick-insert/use-menu-list-height.js +58 -0
  21. package/dist/cjs/quick-insert/use-menu-popup-sizing.js +60 -0
  22. package/dist/cjs/toolbar-flag-check.js +2 -2
  23. package/dist/cjs/ui/DropList/index.js +1 -1
  24. package/dist/cjs/ui/Mention/mention-with-profilecard.js +19 -30
  25. package/dist/cjs/ui/Popup/index.js +101 -17
  26. package/dist/es2019/element-browser/components/ElementBrowserLoader.js +2 -16
  27. package/dist/es2019/extensions/buildMenuItem.js +5 -1
  28. package/dist/es2019/extensions/extension-handlers.js +15 -70
  29. package/dist/es2019/floating-toolbar/DropdownMenuExtensionItems.js +2 -16
  30. package/dist/es2019/icons/index.js +3 -17
  31. package/dist/es2019/monitoring/error.js +1 -1
  32. package/dist/es2019/quick-insert/CompactQuickInsertMenuItem.compiled.css +0 -1
  33. package/dist/es2019/quick-insert/CompactQuickInsertMenuItem.js +20 -29
  34. package/dist/es2019/quick-insert/QuickInsertHoverPreview.compiled.css +42 -1
  35. package/dist/es2019/quick-insert/QuickInsertHoverPreview.js +130 -55
  36. package/dist/es2019/quick-insert/QuickInsertMenuItem.js +4 -0
  37. package/dist/es2019/quick-insert/QuickInsertMenuSection.js +11 -4
  38. package/dist/es2019/quick-insert/assets/index.js +66 -386
  39. package/dist/es2019/quick-insert/confluence-attribution-icon.js +10 -0
  40. package/dist/es2019/quick-insert/jira-attribution-icon.js +10 -0
  41. package/dist/es2019/quick-insert/messages.js +30 -0
  42. package/dist/es2019/quick-insert/preview.js +1 -0
  43. package/dist/es2019/quick-insert/snippetPreviewImageUrls.js +43 -43
  44. package/dist/es2019/quick-insert/use-menu-list-height.js +37 -0
  45. package/dist/es2019/quick-insert/use-menu-popup-sizing.js +49 -0
  46. package/dist/es2019/toolbar-flag-check.js +2 -2
  47. package/dist/es2019/ui/DropList/index.js +1 -1
  48. package/dist/es2019/ui/Mention/mention-with-profilecard.js +12 -15
  49. package/dist/es2019/ui/Popup/index.js +89 -7
  50. package/dist/esm/element-browser/components/ElementBrowserLoader.js +6 -28
  51. package/dist/esm/extensions/buildMenuItem.js +6 -3
  52. package/dist/esm/extensions/extension-handlers.js +17 -97
  53. package/dist/esm/floating-toolbar/DropdownMenuExtensionItems.js +4 -24
  54. package/dist/esm/icons/index.js +7 -29
  55. package/dist/esm/monitoring/error.js +1 -1
  56. package/dist/esm/quick-insert/CompactQuickInsertMenuItem.compiled.css +0 -1
  57. package/dist/esm/quick-insert/CompactQuickInsertMenuItem.js +23 -29
  58. package/dist/esm/quick-insert/QuickInsertHoverPreview.compiled.css +42 -1
  59. package/dist/esm/quick-insert/QuickInsertHoverPreview.js +150 -68
  60. package/dist/esm/quick-insert/QuickInsertMenuItem.js +4 -0
  61. package/dist/esm/quick-insert/QuickInsertMenuSection.js +11 -4
  62. package/dist/esm/quick-insert/assets/index.js +194 -764
  63. package/dist/esm/quick-insert/confluence-attribution-icon.js +12 -0
  64. package/dist/esm/quick-insert/jira-attribution-icon.js +12 -0
  65. package/dist/esm/quick-insert/messages.js +30 -0
  66. package/dist/esm/quick-insert/preview.js +1 -0
  67. package/dist/esm/quick-insert/snippetPreviewImageUrls.js +43 -43
  68. package/dist/esm/quick-insert/use-menu-list-height.js +51 -0
  69. package/dist/esm/quick-insert/use-menu-popup-sizing.js +53 -0
  70. package/dist/esm/toolbar-flag-check.js +2 -2
  71. package/dist/esm/ui/DropList/index.js +1 -1
  72. package/dist/esm/ui/Mention/mention-with-profilecard.js +16 -25
  73. package/dist/esm/ui/Popup/index.js +101 -17
  74. package/dist/types/extensions/types/extension-manifest.d.ts +5 -0
  75. package/dist/types/extensions/types/utils.d.ts +2 -0
  76. package/dist/types/icons/index.d.ts +3 -5
  77. package/dist/types/provider-factory/profile-card-provider.d.ts +14 -1
  78. package/dist/types/provider-factory/quick-insert-provider.d.ts +3 -0
  79. package/dist/types/quick-insert/CompactQuickInsertMenuItem.d.ts +1 -1
  80. package/dist/types/quick-insert/QuickInsertHoverPreview.d.ts +7 -6
  81. package/dist/types/quick-insert/QuickInsertMenuItem.d.ts +7 -2
  82. package/dist/types/quick-insert/assets/index.d.ts +32 -34
  83. package/dist/types/quick-insert/confluence-attribution-icon.d.ts +3 -0
  84. package/dist/types/quick-insert/jira-attribution-icon.d.ts +3 -0
  85. package/dist/types/quick-insert/messages.d.ts +5 -2
  86. package/dist/types/quick-insert/preview.d.ts +16 -0
  87. package/dist/types/quick-insert/use-menu-list-height.d.ts +6 -0
  88. package/dist/types/quick-insert/use-menu-popup-sizing.d.ts +11 -0
  89. package/dist/types/ui/Popup/index.d.ts +11 -0
  90. package/package.json +6 -6
  91. package/quick-insert/confluence-attribution-icon/package.json +10 -0
  92. package/quick-insert/jira-attribution-icon/package.json +10 -0
  93. package/quick-insert/preview/package.json +10 -0
  94. package/quick-insert/use-menu-list-height/package.json +10 -0
  95. package/quick-insert/use-menu-popup-sizing/package.json +10 -0
@@ -17,6 +17,7 @@ var _bindEventListener = require("bind-event-listener");
17
17
  var _focusTrap = _interopRequireDefault(require("focus-trap"));
18
18
  var _rafSchd = _interopRequireDefault(require("raf-schd"));
19
19
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
20
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
20
21
  var _utils = require("./utils");
21
22
  var _validatePosition = require("./validatePosition");
22
23
  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; }
@@ -36,10 +37,45 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
36
37
  _this = _callSuper(this, Popup, [].concat(args));
37
38
  (0, _defineProperty2.default)(_this, "rafIds", new Set());
38
39
  (0, _defineProperty2.default)(_this, "state", {
40
+ targetVisible: true,
39
41
  validPosition: true
40
42
  });
41
43
  (0, _defineProperty2.default)(_this, "popupRef", /*#__PURE__*/_react.default.createRef());
42
44
  (0, _defineProperty2.default)(_this, "placement", ['', '']);
45
+ (0, _defineProperty2.default)(_this, "setTargetVisibility", function (targetVisible) {
46
+ if (targetVisible !== _this.state.targetVisible) {
47
+ if (!targetVisible) {
48
+ var _this$focusTrap;
49
+ // Let consumers preserve focus before the popup becomes hidden.
50
+ _this.reportTargetVisibility(targetVisible);
51
+ (_this$focusTrap = _this.focusTrap) === null || _this$focusTrap === void 0 || _this$focusTrap.pause();
52
+ _this.setState({
53
+ targetVisible: targetVisible
54
+ });
55
+ return;
56
+ }
57
+
58
+ // Reveal the popup before consumers restore focus to its contents.
59
+ _this.setState({
60
+ targetVisible: targetVisible
61
+ }, function () {
62
+ if (_this.props.focusTrap) {
63
+ var _this$focusTrap2;
64
+ (_this$focusTrap2 = _this.focusTrap) === null || _this$focusTrap2 === void 0 || _this$focusTrap2.unpause();
65
+ }
66
+ _this.reportTargetVisibility(targetVisible);
67
+ });
68
+ return;
69
+ }
70
+ _this.reportTargetVisibility(targetVisible);
71
+ });
72
+ (0, _defineProperty2.default)(_this, "reportTargetVisibility", function (targetVisible) {
73
+ if (targetVisible !== _this.reportedTargetVisibility) {
74
+ var _this$props$onTargetV, _this$props;
75
+ _this.reportedTargetVisibility = targetVisible;
76
+ (_this$props$onTargetV = (_this$props = _this.props).onTargetVisibilityChanged) === null || _this$props$onTargetV === void 0 || _this$props$onTargetV.call(_this$props, targetVisible);
77
+ }
78
+ });
43
79
  (0, _defineProperty2.default)(_this, "handleRef", function (popup) {
44
80
  if (!popup) {
45
81
  return;
@@ -162,6 +198,41 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
162
198
  });
163
199
  }
164
200
  }
201
+ }, {
202
+ key: "initTargetVisibilityObserver",
203
+ value: function initTargetVisibilityObserver() {
204
+ var _this$targetVisibilit,
205
+ _observedTarget$owner,
206
+ _this3 = this;
207
+ var _this$props2 = this.props,
208
+ hideWhenTargetOutOfView = _this$props2.hideWhenTargetOutOfView,
209
+ target = _this$props2.target,
210
+ visibilityTarget = _this$props2.visibilityTarget;
211
+ var observedTarget = visibilityTarget !== null && visibilityTarget !== void 0 ? visibilityTarget : target;
212
+ (_this$targetVisibilit = this.targetVisibilityObserver) === null || _this$targetVisibilit === void 0 || _this$targetVisibilit.disconnect();
213
+ this.targetVisibilityObserver = undefined;
214
+ if (!hideWhenTargetOutOfView || !(0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_popup_target_visibility')) {
215
+ if (!this.state.targetVisible) {
216
+ this.setTargetVisibility(true);
217
+ }
218
+ return;
219
+ }
220
+ this.reportedTargetVisibility = undefined;
221
+ var IntersectionObserverConstructor = observedTarget === null || observedTarget === void 0 || (_observedTarget$owner = observedTarget.ownerDocument.defaultView) === null || _observedTarget$owner === void 0 ? void 0 : _observedTarget$owner.IntersectionObserver;
222
+ if (!IntersectionObserverConstructor || !observedTarget) {
223
+ this.setTargetVisibility(true);
224
+ return;
225
+ }
226
+ this.targetVisibilityObserver = new IntersectionObserverConstructor(function (entries) {
227
+ var _entry$isIntersecting;
228
+ var entry = entries[entries.length - 1];
229
+ _this3.setTargetVisibility((_entry$isIntersecting = entry === null || entry === void 0 ? void 0 : entry.isIntersecting) !== null && _entry$isIntersecting !== void 0 ? _entry$isIntersecting : true);
230
+ }, {
231
+ root: null
232
+ });
233
+ this.targetVisibilityObserver.observe(observedTarget);
234
+ this.setTargetVisibility(true);
235
+ }
165
236
  }, {
166
237
  key: "cannotSetPopup",
167
238
  value: function cannotSetPopup(popup, target, overflowScrollParent) {
@@ -229,9 +300,9 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
229
300
  * Deactivates the focus trap if it exists
230
301
  */
231
302
  function destroyFocusTrap() {
232
- var _this$focusTrap;
303
+ var _this$focusTrap3;
233
304
  this.initFocusTrap.cancel();
234
- (_this$focusTrap = this.focusTrap) === null || _this$focusTrap === void 0 || _this$focusTrap.deactivate();
305
+ (_this$focusTrap3 = this.focusTrap) === null || _this$focusTrap3 === void 0 || _this$focusTrap3.deactivate();
235
306
  }
236
307
 
237
308
  /**
@@ -243,8 +314,8 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
243
314
  if (prevProps.focusTrap !== this.props.focusTrap) {
244
315
  // If currently set to disable, then pause the trap if it exists
245
316
  if (!this.props.focusTrap) {
246
- var _this$focusTrap2;
247
- return (_this$focusTrap2 = this.focusTrap) === null || _this$focusTrap2 === void 0 ? void 0 : _this$focusTrap2.pause();
317
+ var _this$focusTrap4;
318
+ return (_this$focusTrap4 = this.focusTrap) === null || _this$focusTrap4 === void 0 ? void 0 : _this$focusTrap4.pause();
248
319
  }
249
320
 
250
321
  // If set to enabled and trap already exists, unpause
@@ -265,10 +336,10 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
265
336
  key: "initScrollElement",
266
337
  value: function initScrollElement() {
267
338
  var _this$unbindScroll;
268
- var _this$props = this.props,
269
- stick = _this$props.stick,
270
- target = _this$props.target,
271
- scrollableElement = _this$props.scrollableElement;
339
+ var _this$props3 = this.props,
340
+ stick = _this$props3.stick,
341
+ target = _this$props3.target,
342
+ scrollableElement = _this$props3.scrollableElement;
272
343
  (_this$unbindScroll = this.unbindScroll) === null || _this$unbindScroll === void 0 || _this$unbindScroll.call(this);
273
344
  if (this.scrollElement && this.resizeObserver) {
274
345
  this.resizeObserver.unobserve(this.scrollElement);
@@ -294,6 +365,11 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
294
365
  if (prevProps.scrollableElement !== this.props.scrollableElement) {
295
366
  this.initScrollElement();
296
367
  }
368
+ // Reconfigure while enabled, or once after disabling to clean up the existing observer.
369
+ // A different target must be observed again.
370
+ if ((prevProps.hideWhenTargetOutOfView || this.props.hideWhenTargetOutOfView) && (prevProps.hideWhenTargetOutOfView !== this.props.hideWhenTargetOutOfView || prevProps.target !== this.props.target || prevProps.visibilityTarget !== this.props.visibilityTarget)) {
371
+ this.initTargetVisibilityObserver();
372
+ }
297
373
  if (this.props !== prevProps) {
298
374
  this.scheduledUpdatePosition(prevProps);
299
375
  }
@@ -305,14 +381,18 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
305
381
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
306
382
  window.addEventListener('resize', this.onResize);
307
383
  this.initScrollElement();
384
+ if (this.props.hideWhenTargetOutOfView) {
385
+ this.initTargetVisibilityObserver();
386
+ }
308
387
  }
309
388
  }, {
310
389
  key: "componentWillUnmount",
311
390
  value: function componentWillUnmount() {
312
- var _this$unbindScroll2, _this$resizeObserver3;
391
+ var _this$targetVisibilit2, _this$unbindScroll2, _this$resizeObserver3;
313
392
  // Ignored via go/ees005
314
393
  // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
315
394
  window.removeEventListener('resize', this.onResize);
395
+ (_this$targetVisibilit2 = this.targetVisibilityObserver) === null || _this$targetVisibilit2 === void 0 || _this$targetVisibilit2.disconnect();
316
396
  (_this$unbindScroll2 = this.unbindScroll) === null || _this$unbindScroll2 === void 0 || _this$unbindScroll2.call(this);
317
397
  if (this.scrollElement) {
318
398
  // Ignored via go/ees005
@@ -331,8 +411,10 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
331
411
  key: "renderPopup",
332
412
  value: function renderPopup() {
333
413
  var _this$props$ariaLabel,
334
- _this3 = this;
335
- var position = this.state.position;
414
+ _this4 = this;
415
+ var _this$state = this.state,
416
+ position = _this$state.position,
417
+ targetVisible = _this$state.targetVisible;
336
418
  var shouldRenderPopup = this.props.shouldRenderPopup;
337
419
  if (shouldRenderPopup && !shouldRenderPopup(position || {})) {
338
420
  return null;
@@ -349,18 +431,20 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
349
431
  // use role = dialog as default role, as dialog role itself is not a parent role that requires specific children to function as some other ARIA roles(menu) do
350
432
  // if set default role to menu, tons of integration tests will fail as many of our popup usages do not have children that satisfy menu role requirements
351
433
  if (ariaLabel) {
352
- return _this3.props.role || 'dialog';
434
+ return _this4.props.role || 'dialog';
353
435
  }
354
436
  return undefined;
355
437
  };
356
438
  return /*#__PURE__*/_react.default.createElement("div", {
357
439
  ref: this.handleRef,
358
- style: _objectSpread(_objectSpread({
440
+ style: _objectSpread(_objectSpread(_objectSpread({
359
441
  // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
360
442
  position: 'absolute',
361
443
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
362
444
  zIndex: this.props.zIndex || _editorSharedStyles.akEditorFloatingPanelZIndex
363
- }, position), this.props.style),
445
+ }, position), this.props.style), this.props.hideWhenTargetOutOfView && (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_popup_target_visibility') && !targetVisible && {
446
+ visibility: 'hidden'
447
+ }),
364
448
  role: getRole(),
365
449
  "aria-label": ariaLabel,
366
450
  "data-testid": "popup-wrapper"
@@ -372,9 +456,9 @@ var Popup = exports.default = /*#__PURE__*/function (_React$Component) {
372
456
  }, {
373
457
  key: "render",
374
458
  value: function render() {
375
- var _this$props2 = this.props,
376
- target = _this$props2.target,
377
- mountTo = _this$props2.mountTo;
459
+ var _this$props4 = this.props,
460
+ target = _this$props4.target,
461
+ mountTo = _this$props4.mountTo;
378
462
  var validPosition = this.state.validPosition;
379
463
  if (!target || !validPosition) {
380
464
  return null;
@@ -7,11 +7,6 @@ import React from 'react';
7
7
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
8
  import { css, jsx } from '@emotion/react';
9
9
  import Loadable from 'react-loadable';
10
- // oxlint-disable-next-line @atlassian/no-restricted-imports
11
- import { lazy, LazySuspense } from 'react-loosely-lazy';
12
-
13
- // oxlint-disable-next-line @atlassian/no-restricted-imports
14
- import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
15
10
  import Spinner from '@atlaskit/spinner/spinner';
16
11
  const spinnerContainer = css({
17
12
  display: 'flex',
@@ -20,11 +15,8 @@ const spinnerContainer = css({
20
15
  height: '100%',
21
16
  width: '100%'
22
17
  });
23
- const loadElementBrowser = () => import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(module => module.default);
24
- const ElementBrowserLazy = lazy(() => import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(module => module.default));
25
- ElementBrowserLazy.displayName = 'lazy(ElementBrowser)';
26
- const ElementBrowserLoadable = Loadable({
27
- loader: loadElementBrowser,
18
+ const ElementBrowserLoader = Loadable({
19
+ loader: () => import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(module => module.default),
28
20
  loading: () => jsx("div", {
29
21
  css: spinnerContainer
30
22
  }, jsx(Spinner, {
@@ -32,10 +24,4 @@ const ElementBrowserLoadable = Loadable({
32
24
  interactionName: "element-browser-spinner"
33
25
  }))
34
26
  });
35
- const ElementBrowserLoader = props => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? jsx(LazySuspense, {
36
- fallback: null
37
- }, jsx(ElementBrowserLazy, props)) :
38
- // eslint-disable-next-line react/jsx-props-no-spreading
39
- jsx(ElementBrowserLoadable, props);
40
- ElementBrowserLoader.preload = () => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? ElementBrowserLazy.preload() : ElementBrowserLoadable.preload();
41
27
  export default ElementBrowserLoader;
@@ -1,10 +1,11 @@
1
1
  import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
2
2
  import { buildAction } from './manifest-helpers';
3
3
  export function buildMenuItem(manifest, extensionModule) {
4
- var _extensionModule$cate, _ref, _extensionModule$app;
4
+ var _extensionModule$prev, _extensionModule$cate, _ref, _extensionModule$app;
5
5
  const title = extensionModule.title || manifest.title;
6
6
  const key = `${manifest.key}:${extensionModule.key}`;
7
7
  const node = buildAction(extensionModule.action, manifest);
8
+ const preview = (_extensionModule$prev = extensionModule.preview) !== null && _extensionModule$prev !== void 0 ? _extensionModule$prev : manifest.preview;
8
9
  const category = isExperimentEnabled('platform_editor_slash_command') ? (_extensionModule$cate = extensionModule.category) !== null && _extensionModule$cate !== void 0 ? _extensionModule$cate : manifest.category : undefined;
9
10
  if (!node) {
10
11
  throw new Error(`Couldn't find any action for ${title} (${key})`);
@@ -31,6 +32,9 @@ export function buildMenuItem(manifest, extensionModule) {
31
32
  summary: manifest.summary,
32
33
  documentationUrl: manifest.documentationUrl,
33
34
  priority: extensionModule.priority,
35
+ ...(preview != null && {
36
+ preview
37
+ }),
34
38
  ...(extensionModule.lozenge != null && {
35
39
  lozenge: extensionModule.lozenge
36
40
  }),
@@ -1,11 +1,6 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
1
  import React from 'react';
4
2
  import { useIntl } from 'react-intl';
5
3
  import Loadable from 'react-loadable';
6
- // oxlint-disable-next-line @atlassian/no-restricted-imports
7
- import { lazy, LazySuspense } from 'react-loosely-lazy';
8
- import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
9
4
  import { getExtensionKeyAndNodeKey, resolveImport } from './manifest-helpers';
10
5
  import { messages } from './messages';
11
6
  import { resolveImportSync } from './resolveImportSync';
@@ -64,38 +59,6 @@ function isUnknownConfluenceMacroWithBody(extensionNode) {
64
59
  var _extensionNode$parame, _extensionNode$parame2, _extensionNode$parame3;
65
60
  return extensionNode !== null && extensionNode.type === 'extension' && extensionNode.extensionType === 'com.atlassian.confluence.macro.core' && !!((_extensionNode$parame = extensionNode.parameters) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame2 = _extensionNode$parame.macroParams) !== null && _extensionNode$parame2 !== void 0 && (_extensionNode$parame3 = _extensionNode$parame2.__bodyContent) !== null && _extensionNode$parame3 !== void 0 && _extensionNode$parame3.value);
66
61
  }
67
- // eslint-disable-next-line @repo/internal/react/no-class-components -- error boundaries require a class component
68
- class ExtensionRendererErrorBoundary extends React.Component {
69
- constructor(...args) {
70
- super(...args);
71
- _defineProperty(this, "state", {});
72
- }
73
- static getDerivedStateFromError(error) {
74
- return {
75
- error
76
- };
77
- }
78
- componentDidCatch(error) {
79
- // eslint-disable-next-line no-console
80
- console.error('Error rendering extension', error);
81
- }
82
- render() {
83
- return this.state.error ? renderExtensionLoadingError(this.state.error, this.props.fallbackProps) : this.props.children;
84
- }
85
- }
86
- const noop = () => {};
87
- function renderExtensionLoadingError(error, props) {
88
- // Needed because the old react-loadable (older code-splitting library) error handling behaviour might be relied on by extensions.
89
- // https://unpkg.com/react-loadable@5.2.2/lib/index.js
90
- return /*#__PURE__*/React.createElement(ExtensionLoading, _extends({
91
- isLoading: false,
92
- pastDelay: true,
93
- timedOut: false,
94
- error: error,
95
- retry: noop
96
- // eslint-disable-next-line react/jsx-props-no-spreading
97
- }, props));
98
- }
99
62
  function ExtensionLoading(props) {
100
63
  const intl = useIntl();
101
64
  const extensionNode = props.node;
@@ -118,45 +81,27 @@ function ExtensionLoading(props) {
118
81
 
119
82
  // eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
120
83
  export function getNodeRenderer(extensionProvider, extensionType, extensionKey) {
121
- const loadNodeRenderer = () => {
122
- var _renderSync, _ref;
123
- const maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
124
- if (maybePromise instanceof Promise) {
125
- return maybePromise.then(node => resolveImport(node.render()));
126
- }
127
- const preloaded = maybePromise === null || maybePromise === void 0 ? void 0 : (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
128
- // Only product implemented preloading will return sync result
129
- // However the out-of-box won't handle this. Confluence uses a custom implementation
130
- return preloaded ?
131
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
- resolveImportSync(preloaded) : resolveImport(maybePromise.render());
133
- };
134
- const LazyNodeRenderer = lazy(() => loadNodeRenderer());
135
- LazyNodeRenderer.displayName = 'lazy(NodeRenderer)';
136
- // Ignored via go/ees005
137
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
- const LoadableNodeRenderer = Loadable({
139
- loader: loadNodeRenderer,
84
+ return Loadable({
85
+ loader: () => {
86
+ const maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
87
+ if (maybePromise instanceof Promise) {
88
+ return maybePromise.then(node => resolveImport(node.render()));
89
+ } else {
90
+ var _renderSync, _ref;
91
+ const preloaded = maybePromise === null || maybePromise === void 0 ? void 0 : (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
92
+ // Only product implemented preloading will return sync result
93
+ // However the out-of-box won't handle this. Confluence uses a custom implementation
94
+ return preloaded ?
95
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
96
+ resolveImportSync(preloaded) : resolveImport(maybePromise.render());
97
+ }
98
+ },
140
99
  // react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
141
100
  // but its TypeScript types only expect LoadingComponentProps. We cast here because
142
101
  // ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
143
102
  // react-loadable will pass through but doesn't know about in its type definitions.
144
103
  loading: ExtensionLoading
145
104
  });
146
- const NodeRenderer = props => {
147
- var _props$loadingFallbac;
148
- if (!isExperimentEnabled('platform_editor_loosely_lazy_migration')) {
149
- // eslint-disable-next-line react/jsx-props-no-spreading
150
- return /*#__PURE__*/React.createElement(LoadableNodeRenderer, props);
151
- }
152
- return /*#__PURE__*/React.createElement(ExtensionRendererErrorBoundary, {
153
- fallbackProps: props
154
- }, /*#__PURE__*/React.createElement(LazySuspense, {
155
- fallback: (_props$loadingFallbac = props.loadingFallback) !== null && _props$loadingFallbac !== void 0 ? _props$loadingFallbac : null
156
- }, /*#__PURE__*/React.createElement(LazyNodeRenderer, props)));
157
- };
158
- NodeRenderer.preload = () => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? LazyNodeRenderer.preload() : LoadableNodeRenderer.preload();
159
- return NodeRenderer;
160
105
  }
161
106
  // eslint-disable-next-line @atlaskit/editor/no-re-export
162
107
  export { getExtensionManifest } from './getExtensionManifest';
@@ -1,8 +1,5 @@
1
1
  import React, { useEffect, useRef, useState } from 'react';
2
2
  import Loadable from 'react-loadable';
3
- // oxlint-disable-next-line @atlassian/no-restricted-imports
4
- import { lazy, LazySuspense } from 'react-loosely-lazy';
5
- import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
6
3
  import { getContextualToolbarItemsFromModule } from '../extensions';
7
4
  import { nodeToJSON } from '../utils';
8
5
  import { DropdownMenuItem } from './DropdownMenuItem';
@@ -65,21 +62,10 @@ const DropdownMenuExtensionItem = ({
65
62
  // Use ref to keep icon component stable across renders
66
63
  const iconRef = useRef(null);
67
64
  if (!iconRef.current && item.icon) {
68
- const loadIcon = () => resolveExtensionIcon(item.icon);
69
- const IconLazy = lazy(() => resolveExtensionIcon(item.icon));
70
- IconLazy.displayName = 'lazy(ExtensionIcon)';
71
- const IconLoadable = Loadable({
72
- loader: loadIcon,
65
+ iconRef.current = Loadable({
66
+ loader: () => resolveExtensionIcon(item.icon),
73
67
  loading: noop
74
68
  });
75
- const Icon = props => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/React.createElement(LazySuspense, {
76
- fallback: null
77
- }, /*#__PURE__*/React.createElement(IconLazy, props)) :
78
- /*#__PURE__*/
79
- // eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
80
- React.createElement(IconLoadable, props);
81
- Icon.preload = () => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? IconLazy.preload() : IconLoadable.preload();
82
- iconRef.current = Icon;
83
69
  }
84
70
  const dropdownItem = convertExtensionToDropdownMenuItem({
85
71
  item,
@@ -1,11 +1,7 @@
1
1
  // Disable no-re-export rule for entry point files
2
2
  /* eslint-disable @atlaskit/editor/no-re-export */
3
3
 
4
- import React from 'react';
5
4
  import Loadable from 'react-loadable';
6
- // oxlint-disable-next-line @atlassian/no-restricted-imports
7
- import { lazy, LazySuspense } from 'react-loosely-lazy';
8
- import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
9
5
  export { PanelInfoIcon } from './shared/PanelInfoIcon';
10
6
  export { PanelWarningIcon } from './shared/PanelWarningIcon';
11
7
  export { PanelErrorIcon } from './shared/PanelErrorIcon';
@@ -14,17 +10,7 @@ export { PanelNoteIcon } from './shared/PanelNoteIcon';
14
10
  export { BorderIcon } from './shared/BorderIcon';
15
11
  export { SteppedRainbowIconDecoration, rainbow, disabledRainbow } from './shared/SteppedRainbowIconDecoration';
16
12
  export { DynamicStrokeIconDecoration } from './shared/DynamicStrokeIconDecoration';
17
- const loadIconTable = () => import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(module => module.default);
18
- const IconTableLazy = lazy(() => import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(module => module.default));
19
- IconTableLazy.displayName = 'lazy(IconTable)';
20
- const IconTableLoadable = Loadable({
21
- loader: loadIconTable,
13
+ export const IconTable = Loadable({
14
+ loader: () => import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(module => module.default),
22
15
  loading: () => null
23
- });
24
- export const IconTable = props => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/React.createElement(LazySuspense, {
25
- fallback: null
26
- }, /*#__PURE__*/React.createElement(IconTableLazy, props)) :
27
- /*#__PURE__*/
28
- // eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
29
- React.createElement(IconTableLoadable, props);
30
- IconTable.preload = () => isExperimentEnabled('platform_editor_loosely_lazy_migration') ? IconTableLazy.preload() : IconTableLoadable.preload();
16
+ });
@@ -13,7 +13,7 @@ const NETWORK_FAILURE_REGEX = /^network failure/i;
13
13
  const RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
14
14
  const SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
15
15
  const packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
16
- const packageVersion = "125.2.0";
16
+ const packageVersion = "125.3.0";
17
17
  const sanitiseSentryEvents = (data, _hint) => {
18
18
  // Remove URL as it has UGC
19
19
  // Ignored via go/ees007
@@ -1,7 +1,6 @@
1
1
  ._11c8wadc{font:var(--ds-font-body-small,normal 400 9pt/1pc "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
2
2
  ._2rko12b0{border-radius:var(--ds-radius-small,4px)}
3
3
  ._2rko1mok{border-radius:var(--ds-radius-large,8px)}
4
- ._2rko1qi0{border-radius:var(--ds-radius-medium,6px)}
5
4
  ._189ee4h9{border-width:var(--ds-border-width,1px)}
6
5
  ._18zr1b66{padding-inline:var(--ds-space-050,4px)}
7
6
  ._1dqonqa1{border-style:solid}
@@ -1,9 +1,7 @@
1
1
  /* CompactQuickInsertMenuItem.tsx generated by @compiled/babel-plugin v3.0.2 */
2
2
  import "./CompactQuickInsertMenuItem.compiled.css";
3
3
  import { ax, ix } from "@compiled/react/runtime";
4
- import React, { useState } from 'react';
5
- import ButtonItem from '@atlaskit/menu/button-item';
6
- import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
4
+ import React, { useId, useMemo, useState } from 'react';
7
5
  // eslint-disable-next-line @atlaskit/design-system/no-emotion-primitives -- Compiled primitives do not provide Pressable.
8
6
  import { Pressable, xcss } from '@atlaskit/primitives';
9
7
  import { Box, Inline, Text } from '@atlaskit/primitives/compiled';
@@ -13,7 +11,6 @@ import { useQuickInsertContext } from './useQuickInsertContext';
13
11
  const styles = {
14
12
  iconContainer: "_4cvr1h6o _1e0c1txw _1o9zidpf _1bah1h6o _1tke1tcg _1ul91tcg",
15
13
  content: "_16jlkb7n _1o9zkb7n _i0dlidpf _1ul9idpf",
16
- icon: "_2rko1qi0 _1reo15vq _18m915vq _1h6d1l7x _1dqonqa1 _189ee4h9 _4cvr1h6o _bfhk1bhr _1e0c1txw _4t3izwfg _1bah1h6o _1bsbzwfg",
17
14
  iconLarge: "_2rko1mok _1reo15vq _18m915vq _1h6d1l7x _1dqonqa1 _189ee4h9 _4cvr1h6o _bfhk1bhr _1e0c1txw _4t3izwfg _1bah1h6o _1bsbzwfg",
18
15
  shortcut: "_2rko12b0 _11c8wadc _1rjcv77o _18zr1b66 _bfhki8nm _syazazsu"
19
16
  };
@@ -72,14 +69,18 @@ const disabledItemStyles = xcss({
72
69
  });
73
70
  export const CompactQuickInsertMenuItem = ({
74
71
  ariaLabel,
72
+ description,
75
73
  iconBefore,
76
74
  isDisabled,
77
75
  onSelect,
76
+ preview,
78
77
  previewImageUrls,
79
78
  shortcut,
79
+ shouldShowPreview = true,
80
80
  shouldWrapIcon = true,
81
81
  title
82
82
  }) => {
83
+ var _ref, _resolvedPreview$imag, _resolvedPreview$imag2, _resolvedPreview$attr;
83
84
  const {
84
85
  item
85
86
  } = useQuickInsertContext();
@@ -90,35 +91,22 @@ export const CompactQuickInsertMenuItem = ({
90
91
  id: undefined,
91
92
  isSelected: false
92
93
  };
94
+ const resolvedDescription = description !== null && description !== void 0 ? description : item === null || item === void 0 ? void 0 : item.description;
95
+ const previewId = useId();
93
96
  const handleClick = useQuickInsertMenuItemSelection(onSelect);
94
97
  const [referenceElement, setReferenceElement] = useState(null);
95
- if (!isExperimentEnabled('platform_editor_slash_command')) {
96
- const wrappedIcon = iconBefore && shouldWrapIcon ? /*#__PURE__*/React.createElement(Box, {
97
- xcss: styles.icon
98
- }, iconBefore) : iconBefore;
99
- return /*#__PURE__*/React.createElement(ButtonItem, {
100
- "aria-label": ariaLabel,
101
- "aria-selected": isSelected,
102
- iconBefore: wrappedIcon,
103
- id: id,
104
- isDisabled: isDisabled,
105
- isSelected: isSelected,
106
- onClick: handleClick,
107
- role: "option"
108
- }, /*#__PURE__*/React.createElement(Inline, {
109
- alignBlock: "center",
110
- spread: "space-between"
111
- }, /*#__PURE__*/React.createElement(Text, null, title), shortcut && /*#__PURE__*/React.createElement(Box, {
112
- as: "span",
113
- xcss: styles.shortcut
114
- }, shortcut)));
115
- }
98
+ const resolvedPreview = useMemo(() => preview !== null && preview !== void 0 ? preview : previewImageUrls ? {
99
+ image: previewImageUrls
100
+ } : {}, [preview, previewImageUrls]);
101
+ const shouldRenderPreview = shouldShowPreview && isSelected && !isDisabled;
102
+ const hasAccessiblePreview = Boolean(resolvedDescription || (resolvedPreview === null || resolvedPreview === void 0 ? void 0 : resolvedPreview.attribution));
116
103
  const wrappedIcon = iconBefore && shouldWrapIcon ? /*#__PURE__*/React.createElement(Box, {
117
104
  xcss: styles.iconLarge
118
105
  }, iconBefore) : iconBefore;
119
106
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Pressable, {
120
107
  ref: setReferenceElement,
121
108
  "aria-label": ariaLabel,
109
+ "aria-describedby": shouldRenderPreview && hasAccessiblePreview ? previewId : undefined,
122
110
  "aria-selected": isSelected,
123
111
  id: id,
124
112
  isDisabled: isDisabled,
@@ -134,9 +122,12 @@ export const CompactQuickInsertMenuItem = ({
134
122
  }, /*#__PURE__*/React.createElement(Text, null, title), shortcut && /*#__PURE__*/React.createElement(Box, {
135
123
  as: "span",
136
124
  xcss: styles.shortcut
137
- }, shortcut))), isSelected && !isDisabled && (previewImageUrls === null || previewImageUrls === void 0 ? void 0 : previewImageUrls.light) && referenceElement && /*#__PURE__*/React.createElement(QuickInsertHoverPreview, {
138
- key: previewImageUrls.light,
139
- previewImageUrls: previewImageUrls,
140
- referenceElement: referenceElement
125
+ }, shortcut))), shouldRenderPreview && referenceElement && /*#__PURE__*/React.createElement(QuickInsertHoverPreview, {
126
+ key: (_ref = (_resolvedPreview$imag = (_resolvedPreview$imag2 = resolvedPreview.image) === null || _resolvedPreview$imag2 === void 0 ? void 0 : _resolvedPreview$imag2.light) !== null && _resolvedPreview$imag !== void 0 ? _resolvedPreview$imag : (_resolvedPreview$attr = resolvedPreview.attribution) === null || _resolvedPreview$attr === void 0 ? void 0 : _resolvedPreview$attr.name) !== null && _ref !== void 0 ? _ref : title,
127
+ id: previewId,
128
+ description: resolvedDescription,
129
+ preview: resolvedPreview,
130
+ referenceElement: referenceElement,
131
+ title: title
141
132
  }));
142
133
  };
@@ -1,4 +1,45 @@
1
+ ._11c81qyo{font:var(--ds-font-heading-xsmall,normal 653 14px/20px "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
2
+ ._11c8fhey{font:var(--ds-font-body,normal 400 14px/20px "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
+ ._11c8wadc{font:var(--ds-font-body-small,normal 400 9pt/1pc "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
4
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}
5
+ ._2rko1qi0{border-radius:var(--ds-radius-medium,6px)}
6
+ ._zulp1b66{gap:var(--ds-space-050,4px)}
7
+ ._zulpu2gc{gap:var(--ds-space-100,8px)}
8
+ ._18zrutpp{padding-inline:var(--ds-space-150,9pt)}
9
+ ._1rjcutpp{padding-block:var(--ds-space-150,9pt)}
10
+ ._16jlidpf{flex-grow:0}
11
+ ._16qs130s{box-shadow:var(--ds-shadow-overlay,0 8px 9pt #1e1f2126,0 0 1px #1e1f214f)}
12
+ ._18m915vq{overflow-y:hidden}
13
+ ._1bah1h6o{justify-content:center}
14
+ ._1bsb1osq{width:100%}
15
+ ._1bsb7vkz{width:1pc}
16
+ ._1bsbncxg{width:264px}
17
+ ._1bsbp3fh{width:15pc}
18
+ ._1e0c1txw{display:flex}
1
19
  ._1e0c1ule{display:block}
20
+ ._1e0ccj1k{display:-webkit-box}
21
+ ._1i4qfg65{overflow-wrap:anywhere}
22
+ ._1o9zidpf{flex-shrink:0}
2
23
  ._1pby16oo{z-index:510}
24
+ ._1reo15vq{overflow-x:hidden}
25
+ ._1yyjcs5v{-webkit-line-clamp:2}
26
+ ._1yyjegat{-webkit-line-clamp:4}
27
+ ._2lx21bp4{flex-direction:column}
3
28
  ._3um015vq{visibility:hidden}
4
- ._3um0ewfl{visibility:visible}
29
+ ._4cvr1h6o{align-items:center}
30
+ ._4t3i1osq{height:100%}
31
+ ._4t3i68cl{height:90pt}
32
+ ._4t3i7vkz{height:1pc}
33
+ ._5ral1f51{object-fit:contain}
34
+ ._6rthu2gc{margin-block-end:var(--ds-space-100,8px)}
35
+ ._bfhk1bhr{background-color:var(--ds-surface-overlay,#fff)}
36
+ ._bfhkhfxm{background-color:var(--ds-surface-sunken,#f8f8f8)}
37
+ ._c71l1kw7{max-height:inherit}
38
+ ._c71lk6is{max-height:calc(100vh - 1pc)}
39
+ ._i0dlexct{flex-basis:16px}
40
+ ._p12f1oec{max-width:calc(100vw - 1pc)}
41
+ ._p12f1osq{max-width:100%}
42
+ ._sudp1e54{-webkit-box-orient:vertical}
43
+ ._syazazsu{color:var(--ds-text-subtle,#505258)}
44
+ ._syazi7uo{color:var(--ds-text,#292a2e)}
45
+ ._vchhusvi{box-sizing:border-box}