@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.
- package/CHANGELOG.md +61 -0
- package/dist/cjs/element-browser/components/ElementBrowserLoader.js +8 -31
- package/dist/cjs/extensions/buildMenuItem.js +6 -3
- package/dist/cjs/extensions/extension-handlers.js +17 -96
- package/dist/cjs/floating-toolbar/DropdownMenuExtensionItems.js +4 -25
- package/dist/cjs/icons/index.js +10 -33
- package/dist/cjs/monitoring/error.js +1 -1
- package/dist/cjs/quick-insert/CompactQuickInsertMenuItem.compiled.css +0 -1
- package/dist/cjs/quick-insert/CompactQuickInsertMenuItem.js +22 -28
- package/dist/cjs/quick-insert/QuickInsertHoverPreview.compiled.css +42 -1
- package/dist/cjs/quick-insert/QuickInsertHoverPreview.js +147 -68
- package/dist/cjs/quick-insert/QuickInsertMenuItem.js +4 -0
- package/dist/cjs/quick-insert/QuickInsertMenuSection.js +11 -4
- package/dist/cjs/quick-insert/assets/index.js +257 -888
- package/dist/cjs/quick-insert/confluence-attribution-icon.js +18 -0
- package/dist/cjs/quick-insert/jira-attribution-icon.js +18 -0
- package/dist/cjs/quick-insert/messages.js +30 -0
- package/dist/cjs/quick-insert/preview.js +5 -0
- package/dist/cjs/quick-insert/snippetPreviewImageUrls.js +43 -43
- package/dist/cjs/quick-insert/use-menu-list-height.js +58 -0
- package/dist/cjs/quick-insert/use-menu-popup-sizing.js +60 -0
- package/dist/cjs/toolbar-flag-check.js +2 -2
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/ui/Mention/mention-with-profilecard.js +19 -30
- package/dist/cjs/ui/Popup/index.js +101 -17
- package/dist/es2019/element-browser/components/ElementBrowserLoader.js +2 -16
- package/dist/es2019/extensions/buildMenuItem.js +5 -1
- package/dist/es2019/extensions/extension-handlers.js +15 -70
- package/dist/es2019/floating-toolbar/DropdownMenuExtensionItems.js +2 -16
- package/dist/es2019/icons/index.js +3 -17
- package/dist/es2019/monitoring/error.js +1 -1
- package/dist/es2019/quick-insert/CompactQuickInsertMenuItem.compiled.css +0 -1
- package/dist/es2019/quick-insert/CompactQuickInsertMenuItem.js +20 -29
- package/dist/es2019/quick-insert/QuickInsertHoverPreview.compiled.css +42 -1
- package/dist/es2019/quick-insert/QuickInsertHoverPreview.js +130 -55
- package/dist/es2019/quick-insert/QuickInsertMenuItem.js +4 -0
- package/dist/es2019/quick-insert/QuickInsertMenuSection.js +11 -4
- package/dist/es2019/quick-insert/assets/index.js +66 -386
- package/dist/es2019/quick-insert/confluence-attribution-icon.js +10 -0
- package/dist/es2019/quick-insert/jira-attribution-icon.js +10 -0
- package/dist/es2019/quick-insert/messages.js +30 -0
- package/dist/es2019/quick-insert/preview.js +1 -0
- package/dist/es2019/quick-insert/snippetPreviewImageUrls.js +43 -43
- package/dist/es2019/quick-insert/use-menu-list-height.js +37 -0
- package/dist/es2019/quick-insert/use-menu-popup-sizing.js +49 -0
- package/dist/es2019/toolbar-flag-check.js +2 -2
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/ui/Mention/mention-with-profilecard.js +12 -15
- package/dist/es2019/ui/Popup/index.js +89 -7
- package/dist/esm/element-browser/components/ElementBrowserLoader.js +6 -28
- package/dist/esm/extensions/buildMenuItem.js +6 -3
- package/dist/esm/extensions/extension-handlers.js +17 -97
- package/dist/esm/floating-toolbar/DropdownMenuExtensionItems.js +4 -24
- package/dist/esm/icons/index.js +7 -29
- package/dist/esm/monitoring/error.js +1 -1
- package/dist/esm/quick-insert/CompactQuickInsertMenuItem.compiled.css +0 -1
- package/dist/esm/quick-insert/CompactQuickInsertMenuItem.js +23 -29
- package/dist/esm/quick-insert/QuickInsertHoverPreview.compiled.css +42 -1
- package/dist/esm/quick-insert/QuickInsertHoverPreview.js +150 -68
- package/dist/esm/quick-insert/QuickInsertMenuItem.js +4 -0
- package/dist/esm/quick-insert/QuickInsertMenuSection.js +11 -4
- package/dist/esm/quick-insert/assets/index.js +194 -764
- package/dist/esm/quick-insert/confluence-attribution-icon.js +12 -0
- package/dist/esm/quick-insert/jira-attribution-icon.js +12 -0
- package/dist/esm/quick-insert/messages.js +30 -0
- package/dist/esm/quick-insert/preview.js +1 -0
- package/dist/esm/quick-insert/snippetPreviewImageUrls.js +43 -43
- package/dist/esm/quick-insert/use-menu-list-height.js +51 -0
- package/dist/esm/quick-insert/use-menu-popup-sizing.js +53 -0
- package/dist/esm/toolbar-flag-check.js +2 -2
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/ui/Mention/mention-with-profilecard.js +16 -25
- package/dist/esm/ui/Popup/index.js +101 -17
- package/dist/types/extensions/types/extension-manifest.d.ts +5 -0
- package/dist/types/extensions/types/utils.d.ts +2 -0
- package/dist/types/icons/index.d.ts +3 -5
- package/dist/types/provider-factory/profile-card-provider.d.ts +14 -1
- package/dist/types/provider-factory/quick-insert-provider.d.ts +3 -0
- package/dist/types/quick-insert/CompactQuickInsertMenuItem.d.ts +1 -1
- package/dist/types/quick-insert/QuickInsertHoverPreview.d.ts +7 -6
- package/dist/types/quick-insert/QuickInsertMenuItem.d.ts +7 -2
- package/dist/types/quick-insert/assets/index.d.ts +32 -34
- package/dist/types/quick-insert/confluence-attribution-icon.d.ts +3 -0
- package/dist/types/quick-insert/jira-attribution-icon.d.ts +3 -0
- package/dist/types/quick-insert/messages.d.ts +5 -2
- package/dist/types/quick-insert/preview.d.ts +16 -0
- package/dist/types/quick-insert/use-menu-list-height.d.ts +6 -0
- package/dist/types/quick-insert/use-menu-popup-sizing.d.ts +11 -0
- package/dist/types/ui/Popup/index.d.ts +11 -0
- package/package.json +6 -6
- package/quick-insert/confluence-attribution-icon/package.json +10 -0
- package/quick-insert/jira-attribution-icon/package.json +10 -0
- package/quick-insert/preview/package.json +10 -0
- package/quick-insert/use-menu-list-height/package.json +10 -0
- 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$
|
|
303
|
+
var _this$focusTrap3;
|
|
233
304
|
this.initFocusTrap.cancel();
|
|
234
|
-
(_this$
|
|
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$
|
|
247
|
-
return (_this$
|
|
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$
|
|
269
|
-
stick = _this$
|
|
270
|
-
target = _this$
|
|
271
|
-
scrollableElement = _this$
|
|
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
|
-
|
|
335
|
-
var
|
|
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
|
|
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$
|
|
376
|
-
target = _this$
|
|
377
|
-
mountTo = _this$
|
|
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
|
|
24
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
69
|
-
|
|
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
|
|
18
|
-
|
|
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.
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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))),
|
|
138
|
-
key:
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
.
|
|
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}
|