@atlaskit/editor-plugin-synced-block 10.7.2 → 10.8.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 +38 -0
- package/dist/cjs/nodeviews/bodiedSyncedBlock.js +33 -0
- package/dist/cjs/nodeviews/isEmptySourceSyncBlock.js +23 -0
- package/dist/cjs/pm-plugins/main.js +44 -24
- package/dist/cjs/syncedBlockPlugin.js +9 -3
- package/dist/cjs/types/index.js +1 -0
- package/dist/cjs/ui/DeleteConfirmationModal.js +1 -1
- package/dist/cjs/ui/Flag.compiled.css +1 -0
- package/dist/cjs/ui/Flag.js +64 -7
- package/dist/cjs/ui/SourceSyncBlockPlaceholder.js +5 -2
- package/dist/cjs/ui/SyncBlockLabel.js +9 -2
- package/dist/cjs/ui/SyncedLocationDropdown.compiled.css +7 -0
- package/dist/cjs/ui/SyncedLocationDropdown.js +26 -3
- package/dist/cjs/ui/assets/SyncedLocationsEmptyStateIllustration.js +216 -0
- package/dist/cjs/ui/quick-insert.js +1 -1
- package/dist/es2019/nodeviews/bodiedSyncedBlock.js +27 -0
- package/dist/es2019/nodeviews/isEmptySourceSyncBlock.js +17 -0
- package/dist/es2019/pm-plugins/main.js +29 -10
- package/dist/es2019/syncedBlockPlugin.js +9 -3
- package/dist/es2019/types/index.js +1 -0
- package/dist/es2019/ui/DeleteConfirmationModal.js +1 -1
- package/dist/es2019/ui/Flag.compiled.css +1 -0
- package/dist/es2019/ui/Flag.js +60 -5
- package/dist/es2019/ui/SourceSyncBlockPlaceholder.js +15 -6
- package/dist/es2019/ui/SyncBlockLabel.js +9 -2
- package/dist/es2019/ui/SyncedLocationDropdown.compiled.css +7 -0
- package/dist/es2019/ui/SyncedLocationDropdown.js +26 -3
- package/dist/es2019/ui/assets/SyncedLocationsEmptyStateIllustration.js +208 -0
- package/dist/es2019/ui/quick-insert.js +1 -1
- package/dist/esm/nodeviews/bodiedSyncedBlock.js +33 -0
- package/dist/esm/nodeviews/isEmptySourceSyncBlock.js +17 -0
- package/dist/esm/pm-plugins/main.js +44 -24
- package/dist/esm/syncedBlockPlugin.js +9 -3
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/ui/DeleteConfirmationModal.js +1 -1
- package/dist/esm/ui/Flag.compiled.css +1 -0
- package/dist/esm/ui/Flag.js +64 -7
- package/dist/esm/ui/SourceSyncBlockPlaceholder.js +5 -2
- package/dist/esm/ui/SyncBlockLabel.js +9 -2
- package/dist/esm/ui/SyncedLocationDropdown.compiled.css +7 -0
- package/dist/esm/ui/SyncedLocationDropdown.js +26 -3
- package/dist/esm/ui/assets/SyncedLocationsEmptyStateIllustration.js +210 -0
- package/dist/esm/ui/quick-insert.js +1 -1
- package/dist/types/nodeviews/bodiedSyncedBlock.d.ts +5 -0
- package/dist/types/nodeviews/isEmptySourceSyncBlock.d.ts +12 -0
- package/dist/types/syncedBlockPluginType.d.ts +10 -0
- package/dist/types/types/index.d.ts +6 -1
- package/dist/types/ui/Flag.d.ts +8 -2
- package/dist/types/ui/assets/SyncedLocationsEmptyStateIllustration.d.ts +2 -0
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-synced-block
|
|
2
2
|
|
|
3
|
+
## 10.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`ff72ee885c82b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ff72ee885c82b) -
|
|
8
|
+
[ux] Prompt users with a feedback flag after undoing or deleting a synced block, and open the
|
|
9
|
+
product feedback collector only when they choose Give feedback. Keep the prompt UI and scoped
|
|
10
|
+
action alignment in the synced block plugin while preserving Flag's built-in action buttons.
|
|
11
|
+
|
|
12
|
+
Products check and persist the prompt allowance around the shared flag lifecycle:
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
{
|
|
16
|
+
shouldShowFeedbackPrompt: () => !feedbackStorage.has('prompt-shown'),
|
|
17
|
+
onFeedbackPromptShown: () => feedbackStorage.set('prompt-shown', true),
|
|
18
|
+
onGiveFeedback: (context) => openFeedbackCollector(context),
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Patch Changes
|
|
23
|
+
|
|
24
|
+
- [`17014b0e91a7f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/17014b0e91a7f) -
|
|
25
|
+
Update the synced locations activation empty state
|
|
26
|
+
- [`b4e3664f1eb3c`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/b4e3664f1eb3c) -
|
|
27
|
+
Keep the source sync block placeholder within narrow containers
|
|
28
|
+
- [`04f47b1369740`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/04f47b1369740) -
|
|
29
|
+
Clarify source synced block labels and show more of referenced titles
|
|
30
|
+
- Updated dependencies
|
|
31
|
+
|
|
32
|
+
## 10.7.3
|
|
33
|
+
|
|
34
|
+
### Patch Changes
|
|
35
|
+
|
|
36
|
+
- [`472c37e82078b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/472c37e82078b) -
|
|
37
|
+
[ux] Fixed the source synced block placeholder disappearing after placing the cursor inside an
|
|
38
|
+
empty block and then clicking away from the editor.
|
|
39
|
+
- Updated dependencies
|
|
40
|
+
|
|
3
41
|
## 10.7.2
|
|
4
42
|
|
|
5
43
|
### Patch Changes
|
|
@@ -9,6 +9,7 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
|
|
|
9
9
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
10
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
11
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
+
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
12
13
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
13
14
|
var _react = _interopRequireDefault(require("react"));
|
|
14
15
|
var _analytics = require("@atlaskit/editor-common/analytics");
|
|
@@ -21,8 +22,10 @@ var _model = require("@atlaskit/editor-prosemirror/model");
|
|
|
21
22
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
22
23
|
var _BodiedSyncBlockWrapper = require("../ui/BodiedSyncBlockWrapper");
|
|
23
24
|
var _SyncBlockLabel = require("../ui/SyncBlockLabel");
|
|
25
|
+
var _isEmptySourceSyncBlock = require("./isEmptySourceSyncBlock");
|
|
24
26
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
25
27
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
28
|
+
function _superPropGet(t, o, e, r) { var p = (0, _get2.default)((0, _getPrototypeOf2.default)(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
|
|
26
29
|
var toDOMOld = function toDOMOld() {
|
|
27
30
|
return ['div', {
|
|
28
31
|
class: _syncBlock.BodiedSyncBlockSharedCssClassName.content,
|
|
@@ -91,8 +94,26 @@ var BodiedSyncBlockOld = /*#__PURE__*/function (_ReactNodeView) {
|
|
|
91
94
|
// eslint-disable-next-line @atlaskit/platform/no-direct-document-usage -- NodeView DOM must be created against active runtime document
|
|
92
95
|
var domRef = document.createElement('div');
|
|
93
96
|
domRef.classList.add(_syncBlock.BodiedSyncBlockSharedCssClassName.prefix);
|
|
97
|
+
domRef.classList.toggle(_syncBlock.BodiedSyncBlockSharedCssClassName.empty, (0, _isEmptySourceSyncBlock.isEmptySourceSyncBlock)(this.node));
|
|
94
98
|
return domRef;
|
|
95
99
|
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Keeps the empty marker class in sync so the source placeholder can be shown purely from
|
|
103
|
+
* document state. See `isEmptySourceSyncBlock` for why the DOM is not used to decide this.
|
|
104
|
+
*/
|
|
105
|
+
}, {
|
|
106
|
+
key: "update",
|
|
107
|
+
value: function update(node, decorations) {
|
|
108
|
+
var updated = _superPropGet(BodiedSyncBlockOld, "update", this, 3)([node, decorations]);
|
|
109
|
+
if (updated) {
|
|
110
|
+
// `ReactNodeView`'s `dom` getter throws rather than returning nullish once the view is
|
|
111
|
+
// destroyed, so optional chaining here would be misleading. `super.update()` only
|
|
112
|
+
// returns true while the view is still mounted, so the ref is guaranteed.
|
|
113
|
+
this.dom.classList.toggle(_syncBlock.BodiedSyncBlockSharedCssClassName.empty, (0, _isEmptySourceSyncBlock.isEmptySourceSyncBlock)(this.node));
|
|
114
|
+
}
|
|
115
|
+
return updated;
|
|
116
|
+
}
|
|
96
117
|
}, {
|
|
97
118
|
key: "render",
|
|
98
119
|
value: function render(_props, forwardRef) {
|
|
@@ -222,6 +243,7 @@ var BodiedSyncBlock = exports.BodiedSyncBlock = /*#__PURE__*/function () {
|
|
|
222
243
|
}));
|
|
223
244
|
}, labelContainer, this.labelKey);
|
|
224
245
|
this.updateContentEditable({});
|
|
246
|
+
this.updateEmptyClass();
|
|
225
247
|
this.handleConnectivityModeChange();
|
|
226
248
|
this.handleViewModeChange();
|
|
227
249
|
|
|
@@ -269,6 +291,16 @@ var BodiedSyncBlock = exports.BodiedSyncBlock = /*#__PURE__*/function () {
|
|
|
269
291
|
});
|
|
270
292
|
}
|
|
271
293
|
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Marks the block as empty so the source placeholder can be shown purely from document state.
|
|
297
|
+
* See `isEmptySourceSyncBlock` for why the DOM is not used to decide this.
|
|
298
|
+
*/
|
|
299
|
+
}, {
|
|
300
|
+
key: "updateEmptyClass",
|
|
301
|
+
value: function updateEmptyClass() {
|
|
302
|
+
this.dom.classList.toggle(_syncBlock.BodiedSyncBlockSharedCssClassName.empty, (0, _isEmptySourceSyncBlock.isEmptySourceSyncBlock)(this.node));
|
|
303
|
+
}
|
|
272
304
|
}, {
|
|
273
305
|
key: "update",
|
|
274
306
|
value: function update(node) {
|
|
@@ -279,6 +311,7 @@ var BodiedSyncBlock = exports.BodiedSyncBlock = /*#__PURE__*/function () {
|
|
|
279
311
|
// Cache updates are handled in appendTransaction where we can
|
|
280
312
|
// filter out non-user changes (remote collab, table auto-scale, etc.)
|
|
281
313
|
this.node = node;
|
|
314
|
+
this.updateEmptyClass();
|
|
282
315
|
return true;
|
|
283
316
|
}
|
|
284
317
|
}, {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isEmptySourceSyncBlock = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* A source synced block counts as "empty" when it holds exactly one paragraph and that paragraph
|
|
9
|
+
* has no content. This is the only state in which the source placeholder should be shown.
|
|
10
|
+
*
|
|
11
|
+
* Emptiness is deliberately derived from the ProseMirror node rather than the rendered DOM.
|
|
12
|
+
* ProseMirror and other plugins inject non-content children into the paragraph element — the
|
|
13
|
+
* selection marker's cursor widget (`.ProseMirror-widget`), ProseMirror's `.ProseMirror-separator`
|
|
14
|
+
* hack node, and the `.ProseMirror-trailingBreak` — so DOM shape is not a reliable signal of
|
|
15
|
+
* whether the user has typed anything. See EDITOR-8327.
|
|
16
|
+
*/
|
|
17
|
+
var isEmptySourceSyncBlock = exports.isEmptySourceSyncBlock = function isEmptySourceSyncBlock(node) {
|
|
18
|
+
if (node.childCount !== 1) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
var firstChild = node.firstChild;
|
|
22
|
+
return (firstChild === null || firstChild === void 0 ? void 0 : firstChild.type.name) === 'paragraph' && firstChild.content.size === 0;
|
|
23
|
+
};
|
|
@@ -471,7 +471,7 @@ var buildStatusDecorations = function buildStatusDecorations(doc, syncBlockStore
|
|
|
471
471
|
* is explicitly scoped to a single plugin instance.
|
|
472
472
|
*/
|
|
473
473
|
var SyncedBlockPluginContext = /*#__PURE__*/function () {
|
|
474
|
-
function SyncedBlockPluginContext(onGiveFeedback) {
|
|
474
|
+
function SyncedBlockPluginContext(onGiveFeedback, shouldShowFeedbackPrompt, api) {
|
|
475
475
|
(0, _classCallCheck2.default)(this, SyncedBlockPluginContext);
|
|
476
476
|
(0, _defineProperty2.default)(this, "confirmationTransactionRef", {
|
|
477
477
|
current: undefined
|
|
@@ -480,9 +480,12 @@ var SyncedBlockPluginContext = /*#__PURE__*/function () {
|
|
|
480
480
|
(0, _defineProperty2.default)(this, "cutRemovalGeneration", 0);
|
|
481
481
|
(0, _defineProperty2.default)(this, "_isCopyEvent", false);
|
|
482
482
|
(0, _defineProperty2.default)(this, "_isCutEvent", false);
|
|
483
|
+
(0, _defineProperty2.default)(this, "feedbackPromptConsumed", false);
|
|
483
484
|
(0, _defineProperty2.default)(this, "unpublishedFlagShown", new Set());
|
|
484
485
|
(0, _defineProperty2.default)(this, "extensionFlagShown", new Set());
|
|
485
486
|
this.onGiveFeedback = onGiveFeedback;
|
|
487
|
+
this.shouldShowFeedbackPrompt = shouldShowFeedbackPrompt;
|
|
488
|
+
this.api = api;
|
|
486
489
|
}
|
|
487
490
|
return (0, _createClass2.default)(SyncedBlockPluginContext, [{
|
|
488
491
|
key: "isCopyEvent",
|
|
@@ -580,7 +583,7 @@ var SyncedBlockPluginContext = /*#__PURE__*/function () {
|
|
|
580
583
|
return;
|
|
581
584
|
}
|
|
582
585
|
if (context.blockType === 'reference') {
|
|
583
|
-
this.
|
|
586
|
+
this.requestFeedbackPrompt(context);
|
|
584
587
|
}
|
|
585
588
|
}
|
|
586
589
|
}, {
|
|
@@ -590,37 +593,54 @@ var SyncedBlockPluginContext = /*#__PURE__*/function () {
|
|
|
590
593
|
if (((_this$pendingSourceFe4 = this.pendingSourceFeedback) === null || _this$pendingSourceFe4 === void 0 ? void 0 : _this$pendingSourceFe4.sourceAttempt) === sourceAttempt && (_this$pendingSourceFe5 = this.pendingSourceFeedback) !== null && _this$pendingSourceFe5 !== void 0 && _this$pendingSourceFe5.deletionSucceeded && this.pendingSourceFeedback.transactionApplied) {
|
|
591
594
|
var context = this.pendingSourceFeedback.context;
|
|
592
595
|
this.pendingSourceFeedback = undefined;
|
|
593
|
-
this.
|
|
596
|
+
this.requestFeedbackPrompt(context);
|
|
594
597
|
}
|
|
595
598
|
}
|
|
596
599
|
}, {
|
|
597
|
-
key: "
|
|
598
|
-
value: function
|
|
600
|
+
key: "requestFeedbackPrompt",
|
|
601
|
+
value: function requestFeedbackPrompt(context) {
|
|
599
602
|
var _this2 = this;
|
|
603
|
+
if (this.feedbackPromptConsumed) {
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
this.feedbackPromptConsumed = true;
|
|
600
607
|
(0, _utils3.deferDispatch)(function () {
|
|
601
608
|
try {
|
|
602
|
-
var _this2$
|
|
603
|
-
var
|
|
604
|
-
void Promise.resolve(
|
|
609
|
+
var _this2$shouldShowFeed, _this2$shouldShowFeed2;
|
|
610
|
+
var shouldShow = (_this2$shouldShowFeed = (_this2$shouldShowFeed2 = _this2.shouldShowFeedbackPrompt) === null || _this2$shouldShowFeed2 === void 0 ? void 0 : _this2$shouldShowFeed2.call(_this2)) !== null && _this2$shouldShowFeed !== void 0 ? _this2$shouldShowFeed : true;
|
|
611
|
+
void Promise.resolve(shouldShow).then(function (isEligible) {
|
|
612
|
+
var _this2$api;
|
|
613
|
+
if (!isEligible) {
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
(_this2$api = _this2.api) === null || _this2$api === void 0 || _this2$api.core.actions.execute(function (_ref7) {
|
|
617
|
+
var tr = _ref7.tr;
|
|
618
|
+
return tr.setMeta(syncedBlockPluginKey, {
|
|
619
|
+
activeFlag: {
|
|
620
|
+
id: _types.FLAG_ID.SYNC_BLOCK_FEEDBACK_PROMPT,
|
|
621
|
+
feedbackContext: context
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
});
|
|
625
|
+
}).catch(function () {});
|
|
605
626
|
} catch (_unused) {
|
|
606
|
-
//
|
|
607
|
-
// never affect the already-applied editor transaction.
|
|
627
|
+
// Persisted feedback eligibility is optional product UI.
|
|
608
628
|
}
|
|
609
629
|
});
|
|
610
630
|
}
|
|
611
631
|
}]);
|
|
612
632
|
}();
|
|
613
633
|
var createPlugin = exports.createPlugin = function createPlugin(options, pmPluginFactoryParams, syncBlockStore, api) {
|
|
614
|
-
var
|
|
615
|
-
|
|
616
|
-
useLongPressSelection =
|
|
634
|
+
var _ref8 = options || {},
|
|
635
|
+
_ref8$useLongPressSel = _ref8.useLongPressSelection,
|
|
636
|
+
useLongPressSelection = _ref8$useLongPressSel === void 0 ? false : _ref8$useLongPressSel;
|
|
617
637
|
|
|
618
638
|
// Cache the experiment value once at plugin creation time.
|
|
619
639
|
// This fires the exposure event exactly once (correct per Exposure Events 101)
|
|
620
640
|
// and avoids ~10 redundant Statsig SDK evaluations per keystroke in hot paths
|
|
621
641
|
// (apply, filterTransaction, appendTransaction, decorations).
|
|
622
642
|
var isPerfExperimentOn = (0, _expValEquals.expValEquals)('editor_synced_block_perf', 'isEnabled', true);
|
|
623
|
-
var ctx = new SyncedBlockPluginContext(options === null || options === void 0 ? void 0 : options.onGiveFeedback);
|
|
643
|
+
var ctx = new SyncedBlockPluginContext(options === null || options === void 0 ? void 0 : options.onGiveFeedback, options === null || options === void 0 ? void 0 : options.shouldShowFeedbackPrompt, api);
|
|
624
644
|
var confirmationTransactionRef = ctx.confirmationTransactionRef;
|
|
625
645
|
var unpublishedFlagShown = ctx.unpublishedFlagShown;
|
|
626
646
|
var extensionFlagShown = ctx.extensionFlagShown;
|
|
@@ -630,8 +650,8 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
|
|
|
630
650
|
// Classic pages with sync blocks.
|
|
631
651
|
syncBlockStore.sourceManager.registerFlushCompletionCallback(function () {
|
|
632
652
|
(0, _utils3.deferDispatch)(function () {
|
|
633
|
-
api === null || api === void 0 || api.core.actions.execute(function (
|
|
634
|
-
var tr =
|
|
653
|
+
api === null || api === void 0 || api.core.actions.execute(function (_ref9) {
|
|
654
|
+
var tr = _ref9.tr;
|
|
635
655
|
return tr;
|
|
636
656
|
});
|
|
637
657
|
});
|
|
@@ -659,8 +679,8 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
|
|
|
659
679
|
// case the Confluence default is used.
|
|
660
680
|
var sourceProduct = (0, _utils2.getSourceProductFromResourceIdSafe)(resourceId);
|
|
661
681
|
(0, _utils3.deferDispatch)(function () {
|
|
662
|
-
api === null || api === void 0 || api.core.actions.execute(function (
|
|
663
|
-
var tr =
|
|
682
|
+
api === null || api === void 0 || api.core.actions.execute(function (_ref0) {
|
|
683
|
+
var tr = _ref0.tr;
|
|
664
684
|
return tr.setMeta(syncedBlockPluginKey, {
|
|
665
685
|
activeFlag: {
|
|
666
686
|
id: _types.FLAG_ID.UNPUBLISHED_SYNC_BLOCK_PASTED,
|
|
@@ -1003,8 +1023,8 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
|
|
|
1003
1023
|
return node;
|
|
1004
1024
|
});
|
|
1005
1025
|
},
|
|
1006
|
-
transformCopied: function transformCopied(slice,
|
|
1007
|
-
var state =
|
|
1026
|
+
transformCopied: function transformCopied(slice, _ref1) {
|
|
1027
|
+
var state = _ref1.state;
|
|
1008
1028
|
var pluginState = syncedBlockPluginKey.getState(state);
|
|
1009
1029
|
var syncBlockStore = pluginState === null || pluginState === void 0 ? void 0 : pluginState.syncBlockStore;
|
|
1010
1030
|
var schema = state.schema;
|
|
@@ -1276,8 +1296,8 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
|
|
|
1276
1296
|
if (!(step instanceof _transform.ReplaceStep || step instanceof _transform.ReplaceAroundStep) || !('slice' in step)) {
|
|
1277
1297
|
return false;
|
|
1278
1298
|
}
|
|
1279
|
-
var
|
|
1280
|
-
slice =
|
|
1299
|
+
var _ref10 = step,
|
|
1300
|
+
slice = _ref10.slice;
|
|
1281
1301
|
var found = false;
|
|
1282
1302
|
slice.content.descendants(function (node) {
|
|
1283
1303
|
if (syncBlockStore.sourceManager.isSourceBlock(node) && node.attrs.resourceId) {
|
|
@@ -1317,8 +1337,8 @@ var createPlugin = exports.createPlugin = function createPlugin(options, pmPlugi
|
|
|
1317
1337
|
tr.setMeta('addToHistory', false);
|
|
1318
1338
|
(0, _utils3.deferDispatch)(function () {
|
|
1319
1339
|
var _api$core;
|
|
1320
|
-
api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (
|
|
1321
|
-
var tr =
|
|
1340
|
+
api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (_ref11) {
|
|
1341
|
+
var tr = _ref11.tr;
|
|
1322
1342
|
return tr.setMeta(syncedBlockPluginKey, {
|
|
1323
1343
|
activeFlag: {
|
|
1324
1344
|
id: _types.FLAG_ID.DUPLICATE_SOURCE_SYNC_BLOCK
|
|
@@ -34,7 +34,9 @@ var _toolbarComponents = require("./ui/toolbar-components");
|
|
|
34
34
|
*/
|
|
35
35
|
var LazySyncedBlockUI = function LazySyncedBlockUI(_ref) {
|
|
36
36
|
var syncBlockStoreManager = _ref.syncBlockStore,
|
|
37
|
-
api = _ref.api
|
|
37
|
+
api = _ref.api,
|
|
38
|
+
onFeedbackPromptShown = _ref.onFeedbackPromptShown,
|
|
39
|
+
onGiveFeedback = _ref.onGiveFeedback;
|
|
38
40
|
var hasSyncBlocks = (0, _hooks.useSharedPluginStateWithSelector)(api, ['syncedBlock'], function (states) {
|
|
39
41
|
var _states$syncedBlockSt;
|
|
40
42
|
return (_states$syncedBlockSt = states.syncedBlockState) === null || _states$syncedBlockSt === void 0 ? void 0 : _states$syncedBlockSt.hasSyncedBlocks;
|
|
@@ -53,7 +55,9 @@ var LazySyncedBlockUI = function LazySyncedBlockUI(_ref) {
|
|
|
53
55
|
syncBlockStoreManager: syncBlockStoreManager,
|
|
54
56
|
api: api
|
|
55
57
|
}), /*#__PURE__*/_react.default.createElement(_Flag.Flag, {
|
|
56
|
-
api: api
|
|
58
|
+
api: api,
|
|
59
|
+
onFeedbackPromptShown: onFeedbackPromptShown,
|
|
60
|
+
onGiveFeedback: onGiveFeedback
|
|
57
61
|
}));
|
|
58
62
|
};
|
|
59
63
|
var syncedBlockPlugin = exports.syncedBlockPlugin = function syncedBlockPlugin(_ref2) {
|
|
@@ -160,7 +164,9 @@ var syncedBlockPlugin = exports.syncedBlockPlugin = function syncedBlockPlugin(_
|
|
|
160
164
|
refs.wrapperElement = wrapperElement || undefined;
|
|
161
165
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _expValEquals.expValEquals)('platform_editor_sync_block_activation', 'isEnabled', true) && /*#__PURE__*/_react.default.createElement(_SourceSyncBlockPlaceholder.SourceSyncBlockPlaceholder, null), /*#__PURE__*/_react.default.createElement(LazySyncedBlockUI, {
|
|
162
166
|
syncBlockStore: syncBlockStore,
|
|
163
|
-
api: api
|
|
167
|
+
api: api,
|
|
168
|
+
onFeedbackPromptShown: config === null || config === void 0 ? void 0 : config.onFeedbackPromptShown,
|
|
169
|
+
onGiveFeedback: config === null || config === void 0 ? void 0 : config.onGiveFeedback
|
|
164
170
|
}));
|
|
165
171
|
},
|
|
166
172
|
getSharedState: function getSharedState(editorState) {
|
package/dist/cjs/types/index.js
CHANGED
|
@@ -15,6 +15,7 @@ var FLAG_ID = exports.FLAG_ID = /*#__PURE__*/function (FLAG_ID) {
|
|
|
15
15
|
FLAG_ID["INLINE_EXTENSION_IN_SYNC_BLOCK"] = "inline-extension-in-sync-block";
|
|
16
16
|
FLAG_ID["EXTENSION_IN_SYNC_BLOCK"] = "extension-in-sync-block";
|
|
17
17
|
FLAG_ID["DUPLICATE_SOURCE_SYNC_BLOCK"] = "duplicate-source-sync-block";
|
|
18
|
+
FLAG_ID["SYNC_BLOCK_FEEDBACK_PROMPT"] = "synced-block-feedback-prompt";
|
|
18
19
|
return FLAG_ID;
|
|
19
20
|
}({});
|
|
20
21
|
var SYNCED_BLOCK_BUTTON_TEST_ID = exports.SYNCED_BLOCK_BUTTON_TEST_ID = {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._btc7grf3 [data-testid=synced-block-feedback-prompt-actions] button{padding-inline-start:0!important}
|
package/dist/cjs/ui/Flag.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* Flag.tsx generated by @compiled/babel-plugin v2.0.0 */
|
|
1
2
|
"use strict";
|
|
2
3
|
|
|
3
4
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
@@ -6,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
7
|
value: true
|
|
7
8
|
});
|
|
8
9
|
exports.getSyncBlockCopiedDescription = exports.Flag = void 0;
|
|
10
|
+
require("./Flag.compiled.css");
|
|
11
|
+
var _runtime = require("@compiled/react/runtime");
|
|
9
12
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
13
|
var _react = _interopRequireDefault(require("react"));
|
|
11
14
|
var _reactIntl = require("react-intl");
|
|
@@ -14,15 +17,18 @@ var _messages = require("@atlaskit/editor-common/messages");
|
|
|
14
17
|
var _syncBlock = require("@atlaskit/editor-common/sync-block");
|
|
15
18
|
var _editorPluginConnectivity = require("@atlaskit/editor-plugin-connectivity");
|
|
16
19
|
var _flag = _interopRequireWildcard(require("@atlaskit/flag"));
|
|
20
|
+
var _megaphone = _interopRequireDefault(require("@atlaskit/icon/core/megaphone"));
|
|
17
21
|
var _statusSuccess = _interopRequireDefault(require("@atlaskit/icon/core/status-success"));
|
|
18
22
|
var _statusWarning = _interopRequireDefault(require("@atlaskit/icon/core/status-warning"));
|
|
19
23
|
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
20
24
|
var _main = require("../pm-plugins/main");
|
|
21
25
|
var _types = require("../types");
|
|
26
|
+
var _flagMap;
|
|
22
27
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
23
28
|
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; }
|
|
24
29
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
25
|
-
var
|
|
30
|
+
var feedbackFlagStyles = null;
|
|
31
|
+
var flagMap = (_flagMap = {}, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)(_flagMap, _types.FLAG_ID.CANNOT_DELETE_WHEN_OFFLINE, {
|
|
26
32
|
title: _messages.syncBlockMessages.failToDeleteTitle,
|
|
27
33
|
description: _messages.syncBlockMessages.failToDeleteWhenOfflineDescription,
|
|
28
34
|
type: 'error'
|
|
@@ -61,7 +67,11 @@ var flagMap = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _d
|
|
|
61
67
|
title: _messages.syncBlockMessages.duplicateSourceSyncBlockTitle,
|
|
62
68
|
description: _messages.syncBlockMessages.duplicateSourceSyncBlockDescription,
|
|
63
69
|
type: 'error'
|
|
64
|
-
})
|
|
70
|
+
}), (0, _defineProperty2.default)(_flagMap, _types.FLAG_ID.SYNC_BLOCK_FEEDBACK_PROMPT, {
|
|
71
|
+
title: _messages.syncBlockMessages.feedbackFlagTitle,
|
|
72
|
+
description: _messages.syncBlockMessages.feedbackFlagDescription,
|
|
73
|
+
type: 'feedback'
|
|
74
|
+
}));
|
|
65
75
|
var getSyncBlockCopiedDescription = exports.getSyncBlockCopiedDescription = function getSyncBlockCopiedDescription(activeFlag, isSyncBlockActivationEnabled) {
|
|
66
76
|
if (!activeFlag || activeFlag.id !== _types.FLAG_ID.SYNC_BLOCK_COPIED || activeFlag.sourceProduct !== 'confluence-page' || !isSyncBlockActivationEnabled) {
|
|
67
77
|
return undefined;
|
|
@@ -69,7 +79,9 @@ var getSyncBlockCopiedDescription = exports.getSyncBlockCopiedDescription = func
|
|
|
69
79
|
return activeFlag.isLivePage || !activeFlag.isSourceContentUnpublished ? _messages.syncBlockMessages.syncBlockCopiedLivePageDescription : _messages.syncBlockMessages.syncBlockCopiedUnpublishedDescription;
|
|
70
80
|
};
|
|
71
81
|
var Flag = exports.Flag = function Flag(_ref) {
|
|
72
|
-
var api = _ref.api
|
|
82
|
+
var api = _ref.api,
|
|
83
|
+
onFeedbackPromptShown = _ref.onFeedbackPromptShown,
|
|
84
|
+
onGiveFeedback = _ref.onGiveFeedback;
|
|
73
85
|
var _useSharedPluginState = (0, _hooks.useSharedPluginStateWithSelector)(api, ['syncedBlock', 'connectivity'], function (states) {
|
|
74
86
|
var _states$syncedBlockSt, _states$connectivityS;
|
|
75
87
|
return {
|
|
@@ -81,6 +93,18 @@ var Flag = exports.Flag = function Flag(_ref) {
|
|
|
81
93
|
mode = _useSharedPluginState.mode;
|
|
82
94
|
var _useIntl = (0, _reactIntl.useIntl)(),
|
|
83
95
|
formatMessage = _useIntl.formatMessage;
|
|
96
|
+
var isFeedbackPromptVisible = activeFlag && activeFlag.id === _types.FLAG_ID.SYNC_BLOCK_FEEDBACK_PROMPT;
|
|
97
|
+
_react.default.useEffect(function () {
|
|
98
|
+
if (!isFeedbackPromptVisible || !onFeedbackPromptShown) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
var promptShownResult = onFeedbackPromptShown();
|
|
103
|
+
void Promise.resolve(promptShownResult).catch(function () {});
|
|
104
|
+
} catch (_unused) {
|
|
105
|
+
// Prompt persistence is optional product UI.
|
|
106
|
+
}
|
|
107
|
+
}, [isFeedbackPromptVisible, onFeedbackPromptShown]);
|
|
84
108
|
if (!activeFlag) {
|
|
85
109
|
return;
|
|
86
110
|
}
|
|
@@ -110,7 +134,7 @@ var Flag = exports.Flag = function Flag(_ref) {
|
|
|
110
134
|
});
|
|
111
135
|
return;
|
|
112
136
|
}
|
|
113
|
-
var
|
|
137
|
+
var dismissFlag = function dismissFlag(shouldFocusEditor) {
|
|
114
138
|
api === null || api === void 0 || api.core.actions.execute(function (_ref3) {
|
|
115
139
|
var tr = _ref3.tr;
|
|
116
140
|
onDismissedCallback === null || onDismissedCallback === void 0 || onDismissedCallback(tr);
|
|
@@ -120,7 +144,12 @@ var Flag = exports.Flag = function Flag(_ref) {
|
|
|
120
144
|
}));
|
|
121
145
|
return tr;
|
|
122
146
|
});
|
|
123
|
-
|
|
147
|
+
if (shouldFocusEditor) {
|
|
148
|
+
api === null || api === void 0 || api.core.actions.focus();
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
var onDismissed = function onDismissed() {
|
|
152
|
+
return dismissFlag(true);
|
|
124
153
|
};
|
|
125
154
|
var typeToActions = function typeToActions() {
|
|
126
155
|
if (type === 'error') {
|
|
@@ -137,11 +166,28 @@ var Flag = exports.Flag = function Flag(_ref) {
|
|
|
137
166
|
target: '_blank',
|
|
138
167
|
rel: 'noopener noreferrer'
|
|
139
168
|
}];
|
|
169
|
+
} else if (type === 'feedback' && activeFlag.id === _types.FLAG_ID.SYNC_BLOCK_FEEDBACK_PROMPT && activeFlag.feedbackContext) {
|
|
170
|
+
var feedbackContext = activeFlag.feedbackContext;
|
|
171
|
+
return [{
|
|
172
|
+
content: formatMessage(_messages.syncBlockMessages.feedbackFlagGiveFeedback),
|
|
173
|
+
onClick: function onClick() {
|
|
174
|
+
dismissFlag(false);
|
|
175
|
+
try {
|
|
176
|
+
var feedbackResult = onGiveFeedback === null || onGiveFeedback === void 0 ? void 0 : onGiveFeedback(feedbackContext);
|
|
177
|
+
void Promise.resolve(feedbackResult).catch(function () {});
|
|
178
|
+
} catch (_unused2) {
|
|
179
|
+
// Feedback collectors are optional product UI.
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}, {
|
|
183
|
+
content: formatMessage(_messages.syncBlockMessages.feedbackFlagNoThanks),
|
|
184
|
+
onClick: onDismissed
|
|
185
|
+
}];
|
|
140
186
|
}
|
|
141
187
|
return undefined;
|
|
142
188
|
};
|
|
143
189
|
var FlagComponent = type === 'info' ? _flag.AutoDismissFlag : _flag.default;
|
|
144
|
-
|
|
190
|
+
var flag = /*#__PURE__*/_react.default.createElement(FlagComponent, {
|
|
145
191
|
onDismissed: onDismissed,
|
|
146
192
|
title: formatMessage(title),
|
|
147
193
|
description: description ? formatMessage(description) : undefined,
|
|
@@ -149,7 +195,11 @@ var Flag = exports.Flag = function Flag(_ref) {
|
|
|
149
195
|
testId: activeFlag.id,
|
|
150
196
|
icon: typeToIcon(type),
|
|
151
197
|
actions: typeToActions()
|
|
152
|
-
})
|
|
198
|
+
});
|
|
199
|
+
return /*#__PURE__*/_react.default.createElement(_flag.FlagGroup, null, type === 'feedback' ? /*#__PURE__*/_react.default.createElement("div", {
|
|
200
|
+
id: activeFlag.id,
|
|
201
|
+
className: (0, _runtime.ax)(["_btc7grf3"])
|
|
202
|
+
}, flag) : flag);
|
|
153
203
|
};
|
|
154
204
|
var typeToIcon = function typeToIcon(type) {
|
|
155
205
|
if (type === 'error') {
|
|
@@ -158,6 +208,13 @@ var typeToIcon = function typeToIcon(type) {
|
|
|
158
208
|
color: "var(--ds-icon-warning, #E06C00)"
|
|
159
209
|
});
|
|
160
210
|
}
|
|
211
|
+
if (type === 'feedback') {
|
|
212
|
+
return /*#__PURE__*/_react.default.createElement(_megaphone.default, {
|
|
213
|
+
label: "",
|
|
214
|
+
spacing: "spacious",
|
|
215
|
+
color: "var(--ds-icon, #292A2E)"
|
|
216
|
+
});
|
|
217
|
+
}
|
|
161
218
|
return /*#__PURE__*/_react.default.createElement(_statusSuccess.default, {
|
|
162
219
|
label: "",
|
|
163
220
|
color: "var(--ds-icon-success, #6A9A23)"
|
|
@@ -21,7 +21,7 @@ var _syncBlock = require("@atlaskit/editor-common/sync-block");
|
|
|
21
21
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-global-styles, @atlaskit/ui-styling-standard/use-compiled, @typescript-eslint/consistent-type-imports
|
|
22
22
|
|
|
23
23
|
var getSourceSyncBlockPlaceholderStyles = function getSourceSyncBlockPlaceholderStyles(placeholderText) {
|
|
24
|
-
return (0, _react2.css)((0, _defineProperty2.default)({}, ".ProseMirror .".concat(_syncBlock.BodiedSyncBlockSharedCssClassName.prefix, " .").concat(_syncBlock.BodiedSyncBlockSharedCssClassName.content, "[contenteditable=\"true\"] > p:only-child
|
|
24
|
+
return (0, _react2.css)((0, _defineProperty2.default)({}, ".ProseMirror .".concat(_syncBlock.BodiedSyncBlockSharedCssClassName.prefix, ".").concat(_syncBlock.BodiedSyncBlockSharedCssClassName.empty, " .").concat(_syncBlock.BodiedSyncBlockSharedCssClassName.content, "[contenteditable=\"true\"] > p:only-child"), {
|
|
25
25
|
position: 'relative',
|
|
26
26
|
'&::before': {
|
|
27
27
|
// JSON.stringify produces a quoted and escaped CSS string.
|
|
@@ -33,8 +33,11 @@ var getSourceSyncBlockPlaceholderStyles = function getSourceSyncBlockPlaceholder
|
|
|
33
33
|
font: 'inherit',
|
|
34
34
|
insetInlineStart: 0,
|
|
35
35
|
width: '100%',
|
|
36
|
+
overflow: 'hidden',
|
|
36
37
|
pointerEvents: 'none',
|
|
37
|
-
|
|
38
|
+
textOverflow: 'ellipsis',
|
|
39
|
+
userSelect: 'none',
|
|
40
|
+
whiteSpace: 'nowrap'
|
|
38
41
|
}
|
|
39
42
|
}));
|
|
40
43
|
};
|
|
@@ -14,6 +14,7 @@ var _syncBlock = require("@atlaskit/editor-common/sync-block");
|
|
|
14
14
|
var _blockSynced = _interopRequireDefault(require("@atlaskit/icon-lab/core/block-synced"));
|
|
15
15
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
16
16
|
var _compiled = require("@atlaskit/primitives/compiled");
|
|
17
|
+
var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
|
|
17
18
|
var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
|
|
18
19
|
var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden/visually-hidden"));
|
|
19
20
|
var _time = require("./utils/time");
|
|
@@ -80,7 +81,13 @@ var SyncBlockLabelComponent = function SyncBlockLabelComponent(_ref) {
|
|
|
80
81
|
color: "color.text.subtle"
|
|
81
82
|
}, formatMessage(_messages.syncBlockMessages.unsyncedBlockLabel));
|
|
82
83
|
}
|
|
83
|
-
if (isSource
|
|
84
|
+
if (isSource) {
|
|
85
|
+
return /*#__PURE__*/_react.default.createElement(_compiled.Text, {
|
|
86
|
+
size: "small",
|
|
87
|
+
color: "color.text.subtle"
|
|
88
|
+
}, formatMessage((0, _expValEquals.expValEquals)('platform_editor_sync_block_activation', 'isEnabled', true) ? _messages.syncBlockMessages.sourceSyncedBlockLabel : _messages.syncBlockMessages.syncedBlockLabel));
|
|
89
|
+
}
|
|
90
|
+
if (!title) {
|
|
84
91
|
return /*#__PURE__*/_react.default.createElement(_compiled.Text, {
|
|
85
92
|
size: "small",
|
|
86
93
|
color: "color.text.subtle"
|
|
@@ -119,6 +126,6 @@ var SyncBlockLabelComponent = function SyncBlockLabelComponent(_ref) {
|
|
|
119
126
|
onShow: updateTooltipContent
|
|
120
127
|
}, label, /*#__PURE__*/_react.default.createElement(_visuallyHidden.default, {
|
|
121
128
|
id: ariaDescribedById
|
|
122
|
-
}, tooltipContent));
|
|
129
|
+
}, (0, _expValEquals.expValEquals)('platform_editor_sync_block_activation', 'isEnabled', true) ? tooltipMessage : tooltipContent));
|
|
123
130
|
};
|
|
124
131
|
var SyncBlockLabel = exports.SyncBlockLabel = /*#__PURE__*/_react.default.memo(SyncBlockLabelComponent);
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
._2rkol0p1{border-radius:var(--ds-radius-tile,25%)}
|
|
2
2
|
._y44vfmxe{animation:kgnpaw5 .7s ease-in-out}
|
|
3
|
+
._195g1wug{margin-inline:auto}
|
|
3
4
|
._1mour5cr{margin-block:var(--ds-space-negative-050,-4px)}
|
|
4
5
|
._1rjcv77o{padding-block:var(--ds-space-025,2px)}
|
|
6
|
+
._1rjcze3t{padding-block:var(--ds-space-0,0)}
|
|
5
7
|
._ku9g126e [data-ds--menu--heading-item]{margin-block:var(--ds-space-050,4px)!important}._18bk1rpy [data-ds--menu--heading-item]{color:var(--ds-text-subtlest,#6b6e76)}
|
|
6
8
|
._18m915vq{overflow-y:hidden}
|
|
7
9
|
._18m91wug{overflow-y:auto}
|
|
8
10
|
._1bah1h6o{justify-content:center}
|
|
11
|
+
._1bsb12aa{width:290px}
|
|
9
12
|
._1bsb19n7{width:106px}
|
|
13
|
+
._1bsb1kdj{width:25pc}
|
|
10
14
|
._1bsb1osq{width:100%}
|
|
11
15
|
._1bsbgktf{width:20px}
|
|
12
16
|
._1bsbo8uj{width:235px}
|
|
@@ -26,8 +30,11 @@
|
|
|
26
30
|
._ajmmnqa1{text-decoration-style:solid}
|
|
27
31
|
._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
|
|
28
32
|
._c71lko4j{max-height:19pc}
|
|
33
|
+
._ca0q1ejb{padding-top:var(--ds-space-300,24px)}
|
|
34
|
+
._n3td1ejb{padding-bottom:var(--ds-space-300,24px)}
|
|
29
35
|
._o5721q9c{white-space:nowrap}
|
|
30
36
|
._syaz1rpy{color:var(--ds-text-subtlest,#6b6e76)}
|
|
31
37
|
._syazazsu{color:var(--ds-text-subtle,#505258)}
|
|
38
|
+
._vchhusvi{box-sizing:border-box}
|
|
32
39
|
._y3gn1h6o{text-align:center}
|
|
33
40
|
@keyframes kgnpaw5{0%{opacity:0}to{opacity:1}}
|