@atlaskit/editor-core 238.0.2 → 238.0.4
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 +20 -0
- package/dist/cjs/create-editor/ReactEditorView.js +50 -193
- package/dist/cjs/create-editor/editorStateNotificationPlugin.js +6 -1
- package/dist/cjs/ui/Appearance/FullPage/FullPageContentArea.compiled.css +1 -26
- package/dist/cjs/ui/Appearance/FullPage/FullPageContentArea.js +5 -27
- package/dist/cjs/version-wrapper.js +1 -1
- package/dist/es2019/create-editor/ReactEditorView.js +29 -152
- package/dist/es2019/create-editor/editorStateNotificationPlugin.js +6 -1
- package/dist/es2019/ui/Appearance/FullPage/FullPageContentArea.compiled.css +1 -26
- package/dist/es2019/ui/Appearance/FullPage/FullPageContentArea.js +5 -27
- package/dist/es2019/version-wrapper.js +1 -1
- package/dist/esm/create-editor/ReactEditorView.js +49 -192
- package/dist/esm/create-editor/editorStateNotificationPlugin.js +6 -1
- package/dist/esm/ui/Appearance/FullPage/FullPageContentArea.compiled.css +1 -26
- package/dist/esm/ui/Appearance/FullPage/FullPageContentArea.js +5 -27
- package/dist/esm/version-wrapper.js +1 -1
- package/dist/types/ui/Appearance/FullPage/FullPageContentArea.d.ts +1 -3
- package/package.json +5 -5
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
-
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
2
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
4
|
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
5
|
-
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; }
|
|
6
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
5
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
8
6
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
7
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
8
|
+
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; }
|
|
9
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
10
10
|
import React, { useCallback, useLayoutEffect, useMemo, useRef, useState, useEffect } from 'react';
|
|
11
11
|
import { injectIntl } from 'react-intl';
|
|
12
12
|
// eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead
|
|
@@ -30,7 +30,6 @@ import useConstructor from '@atlaskit/editor-common/useConstructor';
|
|
|
30
30
|
import usePreviousState from '@atlaskit/editor-common/usePreviousState';
|
|
31
31
|
import { analyticsEventKey, getAnalyticsEventSeverity } from '@atlaskit/editor-common/utils/analytics';
|
|
32
32
|
import { isEmptyDocument } from '@atlaskit/editor-common/utils/document';
|
|
33
|
-
import { Node as PMNode } from '@atlaskit/editor-prosemirror/model';
|
|
34
33
|
import { EditorState, Selection, TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
35
34
|
import { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
36
35
|
import { createSSREditorState } from '@atlaskit/editor-ssr-renderer/create-ssr-editor-state';
|
|
@@ -41,7 +40,6 @@ import { addUFOCustomData } from '@atlaskit/react-ufo/add-ufo-custom-data';
|
|
|
41
40
|
import { getInteractionId } from '@atlaskit/react-ufo/get-interaction-id';
|
|
42
41
|
import { abortAll, getActiveInteraction } from '@atlaskit/react-ufo/interaction-metrics';
|
|
43
42
|
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
44
|
-
import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
|
|
45
43
|
import { useProviders } from '../composable-editor/hooks/useProviders';
|
|
46
44
|
import { createFeatureFlagsFromProps } from '../utils/feature-flags-from-props';
|
|
47
45
|
import { getEditorDomSize } from '../utils/getEditorDomSize';
|
|
@@ -66,37 +64,6 @@ import { useFireFullWidthEvent } from './ReactEditorView/useFireFullWidthEvent';
|
|
|
66
64
|
var EDIT_AREA_ID = 'ak-editor-textarea';
|
|
67
65
|
var SSR_TRACE_SEGMENT_NAME = 'reactEditorView';
|
|
68
66
|
var bootStartTime = isPerformanceAPIAvailable() ? performance.now() : undefined;
|
|
69
|
-
// `markdown↔rich` toggles drop different node/mark sets, so the unique
|
|
70
|
-
// name set is enough to detect when a destructive rebuild is needed.
|
|
71
|
-
function sameNames(a, b) {
|
|
72
|
-
var setA = new Set(a);
|
|
73
|
-
var setB = new Set(b);
|
|
74
|
-
if (setA.size !== setB.size) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
var _iterator = _createForOfIteratorHelper(setA),
|
|
78
|
-
_step;
|
|
79
|
-
try {
|
|
80
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
81
|
-
var name = _step.value;
|
|
82
|
-
if (!setB.has(name)) {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
} catch (err) {
|
|
87
|
-
_iterator.e(err);
|
|
88
|
-
} finally {
|
|
89
|
-
_iterator.f();
|
|
90
|
-
}
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
function schemaShapeChanged(current, next) {
|
|
94
|
-
return !sameNames(Object.keys(current.nodes), next.nodes.map(function (n) {
|
|
95
|
-
return n.name;
|
|
96
|
-
})) || !sameNames(Object.keys(current.marks), next.marks.map(function (m) {
|
|
97
|
-
return m.name;
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
67
|
export function ReactEditorView(props) {
|
|
101
68
|
var _pluginInjectionAPI$c, _media, _linking, _document$querySelect, _props$render, _props$render2;
|
|
102
69
|
// Should be always the first statement in the component
|
|
@@ -404,15 +371,8 @@ export function ReactEditorView(props) {
|
|
|
404
371
|
};
|
|
405
372
|
}, [eventDispatcher]);
|
|
406
373
|
|
|
407
|
-
// Bumped after `reconfigureState` so the render prop re-reads the
|
|
408
|
-
// in-place-mutated `config.current` (contentComponents / toolbar
|
|
409
|
-
// components from the rebuilt preset).
|
|
410
|
-
var _useState = useState(0),
|
|
411
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
412
|
-
bumpConfigVersion = _useState2[1];
|
|
413
|
-
|
|
414
374
|
// Preset reference last processed by reconfigureState. Used to skip the
|
|
415
|
-
// destructive
|
|
375
|
+
// destructive plugin filter when reconfigure is
|
|
416
376
|
// called with the same preset.
|
|
417
377
|
var lastProcessedPresetRef = useRef(null);
|
|
418
378
|
var reconfigureState = useCallback(function (props) {
|
|
@@ -431,15 +391,10 @@ export function ReactEditorView(props) {
|
|
|
431
391
|
var previousPluginNames = new Set(pluginInjectionAPI.current.getRegisteredPluginNames());
|
|
432
392
|
var editorPlugins = createPluginsList(props.preset, 'allowBlockType' in props.editorProps ? props.editorProps : {}, pluginInjectionAPI.current);
|
|
433
393
|
|
|
434
|
-
// Capture once, before
|
|
435
|
-
//
|
|
436
|
-
//
|
|
394
|
+
// Capture once, before the downstream block updates the ref — the
|
|
395
|
+
// filter is destructive and only wants to run when the preset has
|
|
396
|
+
// actually changed.
|
|
437
397
|
var presetChanged = lastProcessedPresetRef.current !== props.preset;
|
|
438
|
-
|
|
439
|
-
// Build a candidate config from the *unfiltered* plugin list so we can
|
|
440
|
-
// decide whether the schema rebuild path will run. Both the rebuild
|
|
441
|
-
// decision and the drop-filter decision below depend on this answer,
|
|
442
|
-
// so it has to be computed up-front.
|
|
443
398
|
var buildConfig = function buildConfig(plugins) {
|
|
444
399
|
var _c$pmPlugins;
|
|
445
400
|
var c = processPluginsList(plugins);
|
|
@@ -448,16 +403,6 @@ export function ReactEditorView(props) {
|
|
|
448
403
|
};
|
|
449
404
|
var nextConfig = buildConfig(editorPlugins);
|
|
450
405
|
|
|
451
|
-
// `state.reconfigure` preserves the original schema, so a preset
|
|
452
|
-
// toggle that should change schema (markdown↔rich) needs a fresh
|
|
453
|
-
// `EditorState`. Resets all plugin state including undo history.
|
|
454
|
-
//
|
|
455
|
-
// Compare schema *shape* (node + mark name sets) rather than preset
|
|
456
|
-
// identity: consumers commonly recreate the preset object on every
|
|
457
|
-
// parent re-render, and a destructive rebuild on a no-op identity
|
|
458
|
-
// change tears down all plugin state (e.g. unmounts the AI palette).
|
|
459
|
-
var shouldRebuildSchema = presetChanged && schemaShapeChanged(viewRef.current.state.schema, nextConfig) && expValEqualsNoExposure('cc-markdown-mode', 'isEnabled', true);
|
|
460
|
-
|
|
461
406
|
// `state.reconfigure` keeps the original schema, so switching presets
|
|
462
407
|
// can leave the editor inconsistent in two ways:
|
|
463
408
|
// 1. The new preset may add plugins that reference schema nodes or
|
|
@@ -466,25 +411,14 @@ export function ReactEditorView(props) {
|
|
|
466
411
|
// injection API even when the new preset doesn't re-register
|
|
467
412
|
// them, so listeners still fire against a state that no longer
|
|
468
413
|
// has their pmPlugin.
|
|
469
|
-
//
|
|
470
|
-
// When the schema is being rebuilt below, the new schema is built
|
|
471
|
-
// from the *unfiltered* plugin list — so dropping plugins whose
|
|
472
|
-
// nodes/marks the OLD schema lacks would wrongly remove the very
|
|
473
|
-
// plugins the rebuild is meant to admit. Skip the drop step in that
|
|
474
|
-
// case (purpose 1) but always reconcile the injection API
|
|
475
|
-
// (purpose 2). When NOT rebuilding, run both — even under the
|
|
476
|
-
// `cc-markdown-mode` experiment, otherwise no-op preset identity
|
|
477
|
-
// changes would silently leave a broken plugin/schema mismatch.
|
|
478
414
|
if (presetChanged) {
|
|
479
|
-
var
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
}
|
|
487
|
-
dropped = _result.dropped;
|
|
415
|
+
var _filterPluginsForReco = filterPluginsForReconfigure(editorPlugins, viewRef.current.state.schema, previousPluginNames),
|
|
416
|
+
dropped = _filterPluginsForReco.dropped,
|
|
417
|
+
kept = _filterPluginsForReco.kept;
|
|
418
|
+
if (dropped.length > 0) {
|
|
419
|
+
editorPlugins = kept;
|
|
420
|
+
// Plugin list changed — rebuild candidate config to match.
|
|
421
|
+
nextConfig = buildConfig(editorPlugins);
|
|
488
422
|
}
|
|
489
423
|
var keptPluginNames = new Set(editorPlugins.map(function (p) {
|
|
490
424
|
return p === null || p === void 0 ? void 0 : p.name;
|
|
@@ -502,71 +436,25 @@ export function ReactEditorView(props) {
|
|
|
502
436
|
}
|
|
503
437
|
config.current = nextConfig;
|
|
504
438
|
var state = viewRef.current.state;
|
|
505
|
-
var
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
// Old selection's positions / node types may not map onto the new schema.
|
|
525
|
-
newSelection = Selection.atStart(newDoc);
|
|
526
|
-
}
|
|
527
|
-
var plugins = createPMPlugins({
|
|
528
|
-
schema: newSchema,
|
|
529
|
-
dispatch: dispatch,
|
|
530
|
-
errorReporter: errorReporter,
|
|
531
|
-
editorConfig: config.current,
|
|
532
|
-
eventDispatcher: eventDispatcher,
|
|
533
|
-
providerFactory: props.providerFactory,
|
|
534
|
-
portalProviderAPI: props.portalProviderAPI,
|
|
535
|
-
nodeViewPortalProviderAPI: props.nodeViewPortalProviderAPI,
|
|
536
|
-
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
537
|
-
featureFlags: featureFlags,
|
|
538
|
-
getIntl: function getIntl() {
|
|
539
|
-
return props.intl;
|
|
540
|
-
},
|
|
541
|
-
onEditorStateUpdated: pluginInjectionAPI.current.onEditorViewUpdated
|
|
542
|
-
});
|
|
543
|
-
newState = EditorState.create({
|
|
544
|
-
schema: newSchema,
|
|
545
|
-
doc: newDoc,
|
|
546
|
-
selection: newSelection,
|
|
547
|
-
plugins: plugins
|
|
548
|
-
});
|
|
549
|
-
} else {
|
|
550
|
-
var _plugins = createPMPlugins({
|
|
551
|
-
schema: state.schema,
|
|
552
|
-
dispatch: dispatch,
|
|
553
|
-
errorReporter: errorReporter,
|
|
554
|
-
editorConfig: config.current,
|
|
555
|
-
eventDispatcher: eventDispatcher,
|
|
556
|
-
providerFactory: props.providerFactory,
|
|
557
|
-
portalProviderAPI: props.portalProviderAPI,
|
|
558
|
-
nodeViewPortalProviderAPI: props.nodeViewPortalProviderAPI,
|
|
559
|
-
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
560
|
-
featureFlags: featureFlags,
|
|
561
|
-
getIntl: function getIntl() {
|
|
562
|
-
return props.intl;
|
|
563
|
-
},
|
|
564
|
-
onEditorStateUpdated: pluginInjectionAPI.current.onEditorViewUpdated
|
|
565
|
-
});
|
|
566
|
-
newState = state.reconfigure({
|
|
567
|
-
plugins: _plugins
|
|
568
|
-
});
|
|
569
|
-
}
|
|
439
|
+
var plugins = createPMPlugins({
|
|
440
|
+
schema: state.schema,
|
|
441
|
+
dispatch: dispatch,
|
|
442
|
+
errorReporter: errorReporter,
|
|
443
|
+
editorConfig: config.current,
|
|
444
|
+
eventDispatcher: eventDispatcher,
|
|
445
|
+
providerFactory: props.providerFactory,
|
|
446
|
+
portalProviderAPI: props.portalProviderAPI,
|
|
447
|
+
nodeViewPortalProviderAPI: props.nodeViewPortalProviderAPI,
|
|
448
|
+
dispatchAnalyticsEvent: dispatchAnalyticsEvent,
|
|
449
|
+
featureFlags: featureFlags,
|
|
450
|
+
getIntl: function getIntl() {
|
|
451
|
+
return props.intl;
|
|
452
|
+
},
|
|
453
|
+
onEditorStateUpdated: pluginInjectionAPI.current.onEditorViewUpdated
|
|
454
|
+
});
|
|
455
|
+
var newState = state.reconfigure({
|
|
456
|
+
plugins: plugins
|
|
457
|
+
});
|
|
570
458
|
if (presetChanged) {
|
|
571
459
|
lastProcessedPresetRef.current = props.preset;
|
|
572
460
|
}
|
|
@@ -577,37 +465,6 @@ export function ReactEditorView(props) {
|
|
|
577
465
|
var result = viewRef.current.update(_objectSpread(_objectSpread({}, viewRef.current.props), {}, {
|
|
578
466
|
state: newState
|
|
579
467
|
}));
|
|
580
|
-
|
|
581
|
-
// The new collab-edit plugin instance starts with `isReady=false`.
|
|
582
|
-
// The rebind path in editor-plugin-collab-edit's initialize.ts is
|
|
583
|
-
// gated on `provider.getInitPayload`, which the Confluence NCS
|
|
584
|
-
// provider does not implement, so the placeholder spinner would
|
|
585
|
-
// never clear. Re-seeding here is safe: the prior state must have
|
|
586
|
-
// had `isReady=true` for the user to have triggered the toggle.
|
|
587
|
-
//
|
|
588
|
-
// Must run AFTER `view.update({ state: newState })`: that call resets
|
|
589
|
-
// the view's state to the captured `newState` reference, so a
|
|
590
|
-
// dispatch placed before it would advance `view.state` to a value
|
|
591
|
-
// that `update` then silently overwrites — discarding the meta and
|
|
592
|
-
// leaving `isReady=false`.
|
|
593
|
-
if (shouldRebuildSchema) {
|
|
594
|
-
// `state.collabEditPlugin$` is the property PM derives from the
|
|
595
|
-
// collab plugin's PluginKey; cast through `unknown` to read it.
|
|
596
|
-
var collabState = viewRef.current.state.collabEditPlugin$;
|
|
597
|
-
if (collabState && collabState.isReady !== true) {
|
|
598
|
-
viewRef.current.dispatch(viewRef.current.state.tr.setMeta('collabInitialised', true));
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
// EDITOR-6702: gated until we have a broader gate; reconfigure is a
|
|
603
|
-
// low-level path so use NoExposure.
|
|
604
|
-
if (expValEqualsNoExposure('cc-markdown-mode', 'isEnabled', true)) {
|
|
605
|
-
// Force a render so PluginSlot picks up the new preset's content
|
|
606
|
-
// components against the new state.
|
|
607
|
-
bumpConfigVersion(function (v) {
|
|
608
|
-
return v + 1;
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
468
|
return result;
|
|
612
469
|
}, [blur, dispatchAnalyticsEvent, eventDispatcher, dispatch, errorReporter, featureFlags]);
|
|
613
470
|
var onEditorViewUpdated = useCallback(function (_ref2) {
|
|
@@ -776,10 +633,10 @@ export function ReactEditorView(props) {
|
|
|
776
633
|
});
|
|
777
634
|
return view;
|
|
778
635
|
}, [getDirectEditorProps, dispatchAnalyticsEvent]);
|
|
779
|
-
var
|
|
780
|
-
|
|
781
|
-
editorView =
|
|
782
|
-
setEditorView =
|
|
636
|
+
var _useState = useState(undefined),
|
|
637
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
638
|
+
editorView = _useState2[0],
|
|
639
|
+
setEditorView = _useState2[1];
|
|
783
640
|
|
|
784
641
|
// Detects if the editor is nested inside an extension - ie. it is a Legacy Content Extension (LCE)
|
|
785
642
|
var isNestedEditor = useRef(null);
|
|
@@ -828,19 +685,19 @@ export function ReactEditorView(props) {
|
|
|
828
685
|
return function () {
|
|
829
686
|
if (scrollElement.current) {
|
|
830
687
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
831
|
-
var
|
|
832
|
-
|
|
688
|
+
var _iterator = _createForOfIteratorHelper(possibleListeners.current),
|
|
689
|
+
_step;
|
|
833
690
|
try {
|
|
834
|
-
for (
|
|
691
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
835
692
|
var _scrollElement$curren;
|
|
836
|
-
var possibleListener =
|
|
693
|
+
var possibleListener = _step.value;
|
|
837
694
|
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
838
695
|
(_scrollElement$curren = scrollElement.current) === null || _scrollElement$curren === void 0 || _scrollElement$curren.removeEventListener.apply(_scrollElement$curren, _toConsumableArray(possibleListener));
|
|
839
696
|
}
|
|
840
697
|
} catch (err) {
|
|
841
|
-
|
|
698
|
+
_iterator.e(err);
|
|
842
699
|
} finally {
|
|
843
|
-
|
|
700
|
+
_iterator.f();
|
|
844
701
|
}
|
|
845
702
|
}
|
|
846
703
|
scrollElement.current = null;
|
|
@@ -852,19 +709,19 @@ export function ReactEditorView(props) {
|
|
|
852
709
|
scrollElement.current = document.querySelector('[data-editor-scroll-container]');
|
|
853
710
|
var cleanupListeners = function cleanupListeners() {
|
|
854
711
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
855
|
-
var
|
|
856
|
-
|
|
712
|
+
var _iterator2 = _createForOfIteratorHelper(possibleListeners.current),
|
|
713
|
+
_step2;
|
|
857
714
|
try {
|
|
858
|
-
for (
|
|
715
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
859
716
|
var _scrollElement$curren2;
|
|
860
|
-
var possibleListener =
|
|
717
|
+
var possibleListener = _step2.value;
|
|
861
718
|
// eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
|
|
862
719
|
(_scrollElement$curren2 = scrollElement.current) === null || _scrollElement$curren2 === void 0 || _scrollElement$curren2.removeEventListener.apply(_scrollElement$curren2, _toConsumableArray(possibleListener));
|
|
863
720
|
}
|
|
864
721
|
} catch (err) {
|
|
865
|
-
|
|
722
|
+
_iterator2.e(err);
|
|
866
723
|
} finally {
|
|
867
|
-
|
|
724
|
+
_iterator2.f();
|
|
868
725
|
}
|
|
869
726
|
};
|
|
870
727
|
if (scrollElement.current) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
|
|
2
2
|
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
3
4
|
var key = new PluginKey('editorStateNotificationPlugin');
|
|
4
5
|
export var createEditorStateNotificationPlugin = function createEditorStateNotificationPlugin(onEditorStateUpdated, onEditorViewStateUpdatedCallbacks) {
|
|
5
6
|
var transactions = [];
|
|
@@ -12,7 +13,11 @@ export var createEditorStateNotificationPlugin = function createEditorStateNotif
|
|
|
12
13
|
};
|
|
13
14
|
},
|
|
14
15
|
apply: function apply(tr) {
|
|
15
|
-
|
|
16
|
+
if (!isExperimentEnabled('platform_editor_reduce_memory_leaks')) {
|
|
17
|
+
// Dead accumulator: nothing reads it, so it pins every transaction for the
|
|
18
|
+
// editor's lifetime. Delete it when the experiment ships.
|
|
19
|
+
transactions.push(tr);
|
|
20
|
+
}
|
|
16
21
|
return {
|
|
17
22
|
latestTransaction: tr
|
|
18
23
|
};
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
._v5641fxv{transition:max-width .5s cubic-bezier(.15,1,.3,1)}
|
|
2
|
-
._v5642kub{transition:padding 0ms cubic-bezier(.15,1,.3,1)}.
|
|
3
|
-
._11bl1txw >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{display:flex}
|
|
4
|
-
._12glglyw[data-markdown-mode-hide-prosemirror=true]>.ak-editor-content-area>.ProseMirror{display:none}
|
|
5
|
-
._13jk1txw >.ak-editor-content-area{display:flex}
|
|
6
|
-
._13svglyw .ProseMirror>ol:not([data-node-type=actionList]):not([data-node-type=decisionList]){clear:none}
|
|
7
|
-
._13t61wug >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{flex-basis:auto}
|
|
8
|
-
._1593idpf >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{min-height:0}
|
|
2
|
+
._v5642kub{transition:padding 0ms cubic-bezier(.15,1,.3,1)}._13svglyw .ProseMirror>ol:not([data-node-type=actionList]):not([data-node-type=decisionList]){clear:none}
|
|
9
3
|
._16jlkb7n{flex-grow:1}
|
|
10
4
|
._17q71osq .fabric-editor--full-width-mode .extension-container.inline{max-width:100%}
|
|
11
5
|
._18q6usvi .ProseMirror{box-sizing:border-box}
|
|
@@ -16,26 +10,18 @@
|
|
|
16
10
|
._19bvt9kd{padding-left:72px}
|
|
17
11
|
._19pk1wug{margin-top:auto}
|
|
18
12
|
._19pkidpf{margin-top:0}
|
|
19
|
-
._1a1d1osq >.ak-editor-content-area{height:100%}
|
|
20
13
|
._1b7c1kw7 .fabric-editor--full-width-mode td .extension-container.inline{max-width:inherit}
|
|
21
14
|
._1bsb1osq{width:100%}
|
|
22
15
|
._1e0c1txw{display:flex}
|
|
23
|
-
._1e0cglyw{display:none}
|
|
24
|
-
._1e8kkb7n >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{flex-grow:1}
|
|
25
16
|
._1f38dez1{container-name:editor-area}
|
|
26
17
|
._1gl01ejb .ProseMirror>p:last-child{margin-bottom:var(--ds-space-300,24px)}
|
|
27
18
|
._1k8i1osq .ProseMirror .pm-table-wrapper>table{width:100%}
|
|
28
|
-
._1n5qidpf >.ak-editor-content-area{padding-left:0}
|
|
29
19
|
._1nw4glyw .ProseMirror>h1{clear:none}
|
|
30
20
|
._1qzyglyw .ProseMirror>h3{clear:none}
|
|
31
21
|
._1rnyglyw .ProseMirror>h5{clear:none}
|
|
32
22
|
._1tb2idpf .ProseMirror .pm-table-wrapper>table{margin-left:0}
|
|
33
|
-
._1ul9idpf{min-width:0}
|
|
34
|
-
._1vbxidpf >.ak-editor-content-area{min-height:0}
|
|
35
23
|
._1wpzesu3{align-self:flex-end}
|
|
36
|
-
._1wrrusvi >.ak-editor-content-area{box-sizing:border-box}
|
|
37
24
|
._1wxymslj .fabric-editor--full-width-mode .extension-container{max-width:calc(100% - 4px)}
|
|
38
|
-
._1xouidpf >.ak-editor-content-area{min-width:0}
|
|
39
25
|
._2hwx1wug{margin-right:auto}
|
|
40
26
|
._2hwxidpf{margin-right:0}
|
|
41
27
|
._2lx21bp4{flex-direction:column}
|
|
@@ -43,24 +29,16 @@
|
|
|
43
29
|
._4t3i1ap5{height:calc(100% - 105px)}
|
|
44
30
|
._4t3i1osq{height:100%}
|
|
45
31
|
._4t3ibhu0{height:calc(100% - var(--ak-editor-fullpage-toolbar-height))}
|
|
46
|
-
._4tbp1osq >.ak-editor-content-area{width:100%}
|
|
47
|
-
._71ybidpf >.ak-editor-content-area{padding-right:0}
|
|
48
32
|
._7cca15wb{container-type:inline-size}
|
|
49
33
|
._7uc0glyw .ProseMirror>ul{clear:none}
|
|
50
34
|
._8j6w1lxk.ak-editor-content-area-no-toolbar{height:calc(100% + 1px)}
|
|
51
35
|
._8vye1n1a .ProseMirror .pm-table-wrapper>table{margin-right:-1px}
|
|
52
36
|
._9dtbmslj .fabric-editor--full-width-mode .multiBodiedExtension--container{max-width:calc(100% - 4px)}
|
|
53
|
-
._amwgglyw[data-markdown-mode-hide-scroll-gutter=true]>.ak-editor-content-area>[data-vc=scroll-gutter]{display:none}
|
|
54
|
-
._bfhkhfxm{background-color:var(--ds-surface-sunken,#f8f8f8)}
|
|
55
|
-
._boivkb7n >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{flex-shrink:1}
|
|
56
37
|
._ca0qidpf{padding-top:0}
|
|
57
38
|
._ca0qoahv{padding-top:var(--ds-space-600,3pc)}
|
|
58
|
-
._evz0idpf >.ak-editor-content-area{padding-bottom:0}
|
|
59
|
-
._fh67idpf >.ak-editor-content-area{padding-top:0}
|
|
60
39
|
._i92uagmp .fabric-editor--full-width-mode:not(:has(#chromeless-editor)) .fabric-editor-breakout-mark{transform:none!important}
|
|
61
40
|
._j9k7kb7n .ProseMirror{flex-grow:1}
|
|
62
41
|
._l4a11hrf .ProseMirror>*{clear:both}
|
|
63
|
-
._li931osq >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{width:100%}
|
|
64
42
|
._n3tdidpf{padding-bottom:0}
|
|
65
43
|
._n3tdoahv{padding-bottom:var(--ds-space-600,3pc)}
|
|
66
44
|
._njlp131u{contain:layout style inline-size}
|
|
@@ -69,10 +47,7 @@
|
|
|
69
47
|
._otyr1wug{margin-bottom:auto}
|
|
70
48
|
._otyridpf{margin-bottom:0}
|
|
71
49
|
._p12f5kin{max-width:var(--ak-editor-content-area-max-width)}
|
|
72
|
-
._p12fglyw{max-width:none}
|
|
73
50
|
._pnffaq80 .fabric-editor--full-width-mode:not(:has(#chromeless-editor)) .fabric-editor-breakout-mark{width:100%!important}
|
|
74
|
-
._q0l01bp4 >.ak-editor-content-area{flex-direction:column}
|
|
75
|
-
._qgzyidpf >.ak-editor-content-area>[data-testid=plugins-components-wrapper]{min-width:0}
|
|
76
51
|
._qkfz261p .fabric-editor--full-width-mode:not(:has(#chromeless-editor)) .fabric-editor-breakout-mark{margin-left:unset!important}
|
|
77
52
|
._t2fzglyw .ProseMirror>p{clear:none}
|
|
78
53
|
._tynl4diq .fabric-editor--full-width-mode [data-layout-section]{max-width:calc(100% + 40px)}
|
|
@@ -5,10 +5,8 @@ import React, { useImperativeHandle, useRef } from 'react';
|
|
|
5
5
|
import classnames from 'classnames';
|
|
6
6
|
import { injectIntl } from 'react-intl';
|
|
7
7
|
import { messages } from '@atlaskit/editor-common/messages/full-page';
|
|
8
|
-
import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/useSharedPluginStateWithSelector';
|
|
9
8
|
import { akEditorGutterPaddingDynamic, akEditorDefaultLayoutWidth } from '@atlaskit/editor-shared-styles/constants';
|
|
10
9
|
import { editorExperiment } from '@atlaskit/tmp-editor-statsig/editor-experiment';
|
|
11
|
-
import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
|
|
12
10
|
|
|
13
11
|
// Ignored via go/ees005
|
|
14
12
|
// eslint-disable-next-line import/no-named-as-default
|
|
@@ -41,9 +39,6 @@ var compiledStyles = {
|
|
|
41
39
|
contentAreaWrapper: "_1bsb1osq _7cca15wb _1f38dez1 _njlp131u",
|
|
42
40
|
sidebarArea: "_4t3i1osq _vchhusvi _1wpzesu3 _1hgw1wug _1t1q1if8 _uj9widpf _13hh1y6m",
|
|
43
41
|
editorContentAreaProsemirrorStyle: "_j9k7kb7n _18q6usvi _l4a11hrf _1nw4glyw _yq1qglyw _1qzyglyw _ongaglyw _1rnyglyw _vtulglyw _13svglyw _t2fzglyw _7uc0glyw _1gl01ejb",
|
|
44
|
-
hideEditorContentAreaProsemirrorWithAttributeStyle: "_12glglyw",
|
|
45
|
-
hideEditorContentAreaScrollGutterWithAttributeStyle: "_amwgglyw",
|
|
46
|
-
hideEditorScrollGutterStyle: "_1e0cglyw",
|
|
47
42
|
fullWidthNonChromelessBreakoutBlockTableStyle: "_xpemaq80 _pnffaq80 _zr7faq80 _qkfz261p _i92uagmp",
|
|
48
43
|
editorContentAreaNew: "_19pk1wug _2hwx1wug _otyr1wug _18u01wug _v5641fxv _vwz41tcg _ca0qoahv _n3tdoahv _4t3i1ap5 _1bsb1osq _2lx21bp4 _16jlkb7n _p12f5kin _1uizkqmb",
|
|
49
44
|
tableFullPageEditorStylesNew: "_1tb2idpf _8vye1n1a _1k8i1osq",
|
|
@@ -53,9 +48,7 @@ var compiledStyles = {
|
|
|
53
48
|
editorContentGutterStyles: "_ca0qidpf _u5f31ex1 _n3tdidpf _19bv1ex1 _vchhusvi",
|
|
54
49
|
editorContentReducedGutterStyles: "_1d7gidpf _n2nw1tcg _d329idpf _105p1tcg",
|
|
55
50
|
contentAreaNew: "_19pkidpf _2hwxidpf _otyridpf _18u0idpf _ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _v5642kub _1e0c1txw _2lx2vrvc _4t3ibhu0 _vchhusvi _8j6w1lxk",
|
|
56
|
-
contentAreaHeightNoToolbar: "_4t3i1osq"
|
|
57
|
-
markdownModeContainerBackgroundStyle: "_bfhkhfxm _101j15vq",
|
|
58
|
-
markdownModeContentAreaStyle: "_19pkidpf _2hwxidpf _otyridpf _18u0idpf _vchhusvi _4t3i1osq _p12fglyw _1ul9idpf _n3tdidpf _ca0qidpf _1bsb1osq _fh67idpf _71ybidpf _evz0idpf _1n5qidpf _1wrrusvi _13jk1txw _q0l01bp4 _1a1d1osq _1vbxidpf _1xouidpf _4tbp1osq _1e8kkb7n _boivkb7n _13t61wug _11bl1txw _1593idpf _qgzyidpf _li931osq"
|
|
51
|
+
contentAreaHeightNoToolbar: "_4t3i1osq"
|
|
59
52
|
};
|
|
60
53
|
export var CONTENT_AREA_TEST_ID = 'ak-editor-fp-content-area';
|
|
61
54
|
var EDITOR_CONTAINER = 'ak-editor-container';
|
|
@@ -85,17 +78,6 @@ var Content = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
85
78
|
}
|
|
86
79
|
};
|
|
87
80
|
}, []);
|
|
88
|
-
var markdownPluginCurrentView = useSharedPluginStateWithSelector(props.editorAPI, ['markdownMode'], function (states) {
|
|
89
|
-
var _states$markdownModeS;
|
|
90
|
-
return (_states$markdownModeS = states.markdownModeState) === null || _states$markdownModeS === void 0 ? void 0 : _states$markdownModeS.view;
|
|
91
|
-
});
|
|
92
|
-
var markdownPluginCurrentIsMarkdownMode = useSharedPluginStateWithSelector(props.editorAPI, ['markdownMode'], function (states) {
|
|
93
|
-
var _states$markdownModeS2;
|
|
94
|
-
return (_states$markdownModeS2 = states.markdownModeState) === null || _states$markdownModeS2 === void 0 ? void 0 : _states$markdownModeS2.isMarkdownMode;
|
|
95
|
-
});
|
|
96
|
-
var isMarkdownModeExperimentEnabled = expValEqualsNoExposure('cc-markdown-mode', 'isEnabled', true);
|
|
97
|
-
var shouldHideProseMirrorForMarkdownMode = isMarkdownModeExperimentEnabled && markdownPluginCurrentView !== 'preview' && markdownPluginCurrentIsMarkdownMode;
|
|
98
|
-
var shouldHideScrollGutterForMarkdownMode = isMarkdownModeExperimentEnabled && markdownPluginCurrentIsMarkdownMode;
|
|
99
81
|
var content = /*#__PURE__*/React.createElement(EditorContentContainer
|
|
100
82
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
|
|
101
83
|
, {
|
|
@@ -111,14 +93,12 @@ var Content = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
111
93
|
editorView: props.editorView,
|
|
112
94
|
editorDisabled: props.disabled
|
|
113
95
|
}, /*#__PURE__*/React.createElement("div", {
|
|
114
|
-
"data-markdown-mode-hide-prosemirror": shouldHideProseMirrorForMarkdownMode ? 'true' : undefined,
|
|
115
|
-
"data-markdown-mode-hide-scroll-gutter": shouldHideScrollGutterForMarkdownMode ? 'true' : undefined,
|
|
116
96
|
style: {
|
|
117
97
|
'--ak-editor-content-area-max-width': "".concat(contentAreaMaxWidth, "px")
|
|
118
98
|
}
|
|
119
99
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
|
|
120
100
|
,
|
|
121
|
-
className: ax([compiledStyles.editorContentAreaNew, compiledStyles.editorContentAreaProsemirrorStyle,
|
|
101
|
+
className: ax([compiledStyles.editorContentAreaNew, compiledStyles.editorContentAreaProsemirrorStyle, compiledStyles.tableFullPageEditorStylesNew, compiledStyles.fullWidthNonChromelessBreakoutBlockTableStyle,
|
|
122
102
|
// for breakout resizing, there's no need to restrict the width of codeblocks as they're always wrapped in a breakout mark
|
|
123
103
|
compiledStyles.editorContentAreaContainerStyleExcludeCodeBlockNew, compiledStyles.editorContentAreaContainerNestedDndStyle, "ak-editor-content-area-region"]),
|
|
124
104
|
"data-editor-editable-content": true,
|
|
@@ -157,15 +137,13 @@ var Content = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
157
137
|
paddingBottom: "".concat((_allowScrollGutter$gu = allowScrollGutter.gutterSize) !== null && _allowScrollGutter$gu !== void 0 ? _allowScrollGutter$gu : '120', "px")
|
|
158
138
|
},
|
|
159
139
|
"data-vc": "scroll-gutter",
|
|
160
|
-
"data-editor-scroll-gutter": "true"
|
|
161
|
-
className: ax([shouldHideScrollGutterForMarkdownMode && compiledStyles.hideEditorScrollGutterStyle])
|
|
140
|
+
"data-editor-scroll-gutter": "true"
|
|
162
141
|
}) : /*#__PURE__*/React.createElement("div", {
|
|
163
142
|
id: "editor-scroll-gutter",
|
|
164
143
|
style: {
|
|
165
144
|
paddingBottom: "".concat((_allowScrollGutter$gu2 = allowScrollGutter.gutterSize) !== null && _allowScrollGutter$gu2 !== void 0 ? _allowScrollGutter$gu2 : '120', "px")
|
|
166
145
|
},
|
|
167
|
-
"data-vc": "scroll-gutter"
|
|
168
|
-
className: ax([shouldHideScrollGutterForMarkdownMode && compiledStyles.hideEditorScrollGutterStyle])
|
|
146
|
+
"data-vc": "scroll-gutter"
|
|
169
147
|
}))))));
|
|
170
148
|
return /*#__PURE__*/React.createElement("div", {
|
|
171
149
|
"data-testid": CONTENT_AREA_TEST_ID,
|
|
@@ -174,7 +152,7 @@ var Content = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
174
152
|
}, /*#__PURE__*/React.createElement("div", {
|
|
175
153
|
"data-testid": EDITOR_CONTAINER,
|
|
176
154
|
"data-editor-container": 'true',
|
|
177
|
-
className: ax([compiledStyles.contentAreaWrapper
|
|
155
|
+
className: ax([compiledStyles.contentAreaWrapper])
|
|
178
156
|
}, props.UNSAFE_containLayout ? /*#__PURE__*/React.createElement("div", {
|
|
179
157
|
"data-testid": "editor-contain-size-and-layout-wrapper",
|
|
180
158
|
className: ax([containLayoutStyles.wrapper])
|
|
@@ -19,13 +19,11 @@ import type { ViewMode } from '@atlaskit/editor-plugins/editor-viewmode';
|
|
|
19
19
|
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
20
20
|
import type EditorActions from '../../../actions';
|
|
21
21
|
import type { ContentComponents, ReactComponents } from '../../../types/editor-props';
|
|
22
|
-
import type { MarkdownModePlugin } from '../../../types/markdown-mode';
|
|
23
22
|
import type { ScrollContainerRefs } from './types';
|
|
24
23
|
type EditorAPI = PublicPluginAPI<[
|
|
25
24
|
OptionalPlugin<ContextPanelPlugin>,
|
|
26
25
|
BasePlugin,
|
|
27
|
-
OptionalPlugin<BlockMenuPlugin
|
|
28
|
-
OptionalPlugin<MarkdownModePlugin>
|
|
26
|
+
OptionalPlugin<BlockMenuPlugin>
|
|
29
27
|
]>;
|
|
30
28
|
interface FullPageEditorContentAreaProps {
|
|
31
29
|
appearance: EditorAppearance | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-core",
|
|
3
|
-
"version": "238.0.
|
|
3
|
+
"version": "238.0.4",
|
|
4
4
|
"description": "A package contains Atlassian editor core functionality",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@atlaskit/react-compiler-gating": "^0.2.0",
|
|
78
78
|
"@atlaskit/react-ufo": "^8.1.0",
|
|
79
79
|
"@atlaskit/task-decision": "^21.12.0",
|
|
80
|
-
"@atlaskit/tmp-editor-statsig": "^
|
|
80
|
+
"@atlaskit/tmp-editor-statsig": "^242.0.0",
|
|
81
81
|
"@atlaskit/tokens": "^20.6.0",
|
|
82
82
|
"@atlaskit/tooltip": "^24.4.0",
|
|
83
83
|
"@atlaskit/width-detector": "^7.2.0",
|
|
@@ -158,12 +158,12 @@
|
|
|
158
158
|
"@atlaskit/media-integration-test-helpers": "workspace:^",
|
|
159
159
|
"@atlaskit/media-picker": "^73.2.0",
|
|
160
160
|
"@atlaskit/media-test-helpers": "^43.0.0",
|
|
161
|
-
"@atlaskit/media-ui": "^31.
|
|
161
|
+
"@atlaskit/media-ui": "^31.4.0",
|
|
162
162
|
"@atlaskit/modal-dialog": "^17.1.0",
|
|
163
163
|
"@atlaskit/navigation-system": "^11.3.0",
|
|
164
164
|
"@atlaskit/popper": "^9.4.0",
|
|
165
165
|
"@atlaskit/portal": "^7.0.0",
|
|
166
|
-
"@atlaskit/profilecard": "^27.
|
|
166
|
+
"@atlaskit/profilecard": "^27.2.0",
|
|
167
167
|
"@atlaskit/radio": "^10.2.0",
|
|
168
168
|
"@atlaskit/renderer": "^151.0.0",
|
|
169
169
|
"@atlaskit/section-message": "^10.2.0",
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
"@atlassian/search-provider": "^29.0.0",
|
|
185
185
|
"@atlassian/structured-docs-types": "workspace:^",
|
|
186
186
|
"@atlassian/testing-library": "^0.12.0",
|
|
187
|
-
"@atlassian/user-profile-card": "^1.
|
|
187
|
+
"@atlassian/user-profile-card": "^1.46.0",
|
|
188
188
|
"@emotion/jest": "^11.8.0",
|
|
189
189
|
"@testing-library/react": "^16.3.0",
|
|
190
190
|
"@types/diff": "^5.0.2",
|