@atlaskit/editor-common 114.28.0 → 114.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/extensibility/ExtensionNodeWrapper.js +7 -3
  3. package/dist/cjs/extensibility/ExtensionSSRReactContextsProvider.js +24 -0
  4. package/dist/cjs/extensibility/extensionNodeView.js +4 -2
  5. package/dist/cjs/messages/layout.js +5 -0
  6. package/dist/cjs/monitoring/error.js +1 -1
  7. package/dist/cjs/portal/common.js +33 -8
  8. package/dist/cjs/react-node-view/getInlineNodeViewProducer.js +11 -42
  9. package/dist/cjs/ui/DropList/index.js +1 -1
  10. package/dist/cjs/utils/date.js +1 -2
  11. package/dist/es2019/extensibility/ExtensionNodeWrapper.js +7 -3
  12. package/dist/es2019/extensibility/ExtensionSSRReactContextsProvider.js +18 -0
  13. package/dist/es2019/extensibility/extensionNodeView.js +4 -2
  14. package/dist/es2019/messages/layout.js +5 -0
  15. package/dist/es2019/monitoring/error.js +1 -1
  16. package/dist/es2019/portal/common.js +31 -8
  17. package/dist/es2019/react-node-view/getInlineNodeViewProducer.js +11 -42
  18. package/dist/es2019/ui/DropList/index.js +1 -1
  19. package/dist/es2019/utils/date.js +1 -2
  20. package/dist/esm/extensibility/ExtensionNodeWrapper.js +7 -3
  21. package/dist/esm/extensibility/ExtensionSSRReactContextsProvider.js +17 -0
  22. package/dist/esm/extensibility/extensionNodeView.js +4 -2
  23. package/dist/esm/messages/layout.js +5 -0
  24. package/dist/esm/monitoring/error.js +1 -1
  25. package/dist/esm/portal/common.js +33 -8
  26. package/dist/esm/react-node-view/getInlineNodeViewProducer.js +11 -42
  27. package/dist/esm/ui/DropList/index.js +1 -1
  28. package/dist/esm/utils/date.js +1 -2
  29. package/dist/types/card/index.d.ts +1 -1
  30. package/dist/types/card/types.d.ts +21 -5
  31. package/dist/types/extensibility/ExtensionNodeWrapper.d.ts +3 -1
  32. package/dist/types/extensibility/ExtensionSSRReactContextsProvider.d.ts +8 -0
  33. package/dist/types/extensibility/extensionNodeView.d.ts +4 -1
  34. package/dist/types/messages/layout.d.ts +39 -34
  35. package/dist/types-ts4.5/card/index.d.ts +1 -1
  36. package/dist/types-ts4.5/card/types.d.ts +21 -5
  37. package/dist/types-ts4.5/extensibility/ExtensionNodeWrapper.d.ts +3 -1
  38. package/dist/types-ts4.5/extensibility/ExtensionSSRReactContextsProvider.d.ts +8 -0
  39. package/dist/types-ts4.5/extensibility/extensionNodeView.d.ts +4 -1
  40. package/dist/types-ts4.5/messages/layout.d.ts +39 -34
  41. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @atlaskit/editor-common
2
2
 
3
+ ## 114.30.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`edd5d6d4c23ec`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/edd5d6d4c23ec) -
8
+ Add SSR streaming supporting to Editor starmt cards and extensions
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+
14
+ ## 114.29.0
15
+
16
+ ### Minor Changes
17
+
18
+ - [`14b617e1204ad`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/14b617e1204ad) -
19
+ Cleanup confluence_frontend_fix_date_hydration_error experiment
20
+ - [`a94026f1bcd86`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/a94026f1bcd86) -
21
+ [ux] fix: scope card queue to inserted range when inserting MAUI embed via Add to Doc
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies
26
+
3
27
  ## 114.28.0
4
28
 
5
29
  ### Minor Changes
@@ -10,6 +10,7 @@ var _react2 = require("@emotion/react");
10
10
  var _classnames = _interopRequireDefault(require("classnames"));
11
11
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
12
12
  var _whitespace = require("../whitespace");
13
+ var _ExtensionSSRReactContextsProvider = require("./ExtensionSSRReactContextsProvider");
13
14
  /**
14
15
  * @jsxRuntime classic
15
16
  * @jsx jsx
@@ -70,18 +71,21 @@ var hoverStyles = (0, _react2.css)({
70
71
  var ExtensionNodeWrapper = exports.ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
71
72
  var children = _ref.children,
72
73
  nodeType = _ref.nodeType,
73
- macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags;
74
+ macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags,
75
+ intl = _ref.intl;
74
76
  var _ref2 = macroInteractionDesignFeatureFlags || {},
75
77
  showMacroInteractionDesignUpdates = _ref2.showMacroInteractionDesignUpdates;
76
78
  var wrapperClassNames = (0, _classnames.default)({
77
79
  'inline-extension': nodeType === 'inlineExtension' && showMacroInteractionDesignUpdates,
78
80
  relative: showMacroInteractionDesignUpdates
79
81
  });
80
- return (0, _react2.jsx)("span", {
82
+ return (0, _react2.jsx)(_ExtensionSSRReactContextsProvider.ExtensionSSRReactContextsProvider, {
83
+ intl: intl
84
+ }, (0, _react2.jsx)("span", {
81
85
  "data-testid": "extension-node-wrapper"
82
86
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
83
87
  ,
84
88
  className: wrapperClassNames,
85
89
  css: [styles, (0, _expValEquals.expValEquals)('cc_editor_ttvc_release_bundle_one', 'extensionHoverRefactor', true) && hoverStyles]
86
- }, children, nodeType === 'inlineExtension' && _whitespace.ZERO_WIDTH_SPACE);
90
+ }, children, nodeType === 'inlineExtension' && _whitespace.ZERO_WIDTH_SPACE));
87
91
  };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ExtensionSSRReactContextsProvider = ExtensionSSRReactContextsProvider;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _reactIntl = require("react-intl");
10
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
11
+ var _isSsr = require("../core-utils/is-ssr");
12
+ function ExtensionSSRReactContextsProvider(_ref) {
13
+ var children = _ref.children,
14
+ intl = _ref.intl;
15
+ if (!(0, _expValEquals.expValEquals)('platform_editor_editor_ssr_streaming', 'isEnabled', true) || !(0, _isSsr.isSSR)()) {
16
+ return children;
17
+ }
18
+ if (!intl) {
19
+ return children;
20
+ }
21
+ return /*#__PURE__*/_react.default.createElement(_reactIntl.RawIntlProvider, {
22
+ value: intl
23
+ }, children);
24
+ }
@@ -293,6 +293,7 @@ var ExtensionNode = exports.ExtensionNode = /*#__PURE__*/function (_ReactNodeVie
293
293
  return null;
294
294
  }
295
295
  return /*#__PURE__*/_react.default.createElement(_ExtensionNodeWrapper.ExtensionNodeWrapper, {
296
+ intl: props.intl,
296
297
  nodeType: this.node.type.name,
297
298
  macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags
298
299
  }, /*#__PURE__*/_react.default.createElement(_Extension.Extension, {
@@ -320,7 +321,7 @@ var ExtensionNode = exports.ExtensionNode = /*#__PURE__*/function (_ReactNodeVie
320
321
  }
321
322
  }]);
322
323
  }(_reactNodeView.default);
323
- function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers) {
324
+ function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers, intl) {
324
325
  return function (node, view, getPos) {
325
326
  return new ExtensionNode(node, view, getPos, portalProviderAPI, eventDispatcher, {
326
327
  providerFactory: providerFactory,
@@ -330,7 +331,8 @@ function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory,
330
331
  macroInteractionDesignFeatureFlags: macroInteractionDesignFeatureFlags,
331
332
  showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
332
333
  showUpdatedLivePages1PBodiedExtensionUI: showUpdatedLivePages1PBodiedExtensionUI,
333
- rendererExtensionHandlers: rendererExtensionHandlers
334
+ rendererExtensionHandlers: rendererExtensionHandlers,
335
+ intl: intl
334
336
  }).init();
335
337
  };
336
338
  }
@@ -95,5 +95,10 @@ var toolbarMessages = exports.toolbarMessages = (0, _reactIntl.defineMessages)({
95
95
  id: 'fabric.editor.layout.resizeLayout',
96
96
  defaultMessage: 'Resize layout',
97
97
  description: 'The text is shown as a label on a button or handle when the user can resize the layout columns in the editor.'
98
+ },
99
+ distributeColumns: {
100
+ id: 'fabric.editor.layout.distributeColumns',
101
+ defaultMessage: 'Distribute columns',
102
+ description: 'The text is shown as a label for an option that distributes layout columns evenly.'
98
103
  }
99
104
  });
@@ -19,7 +19,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
19
19
  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); }
20
20
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
21
21
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
22
- var packageVersion = "114.27.0";
22
+ var packageVersion = "114.29.0";
23
23
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
24
24
  // Remove URL as it has UGC
25
25
  // Ignored via go/ees007
@@ -11,6 +11,8 @@ exports.getPortalProviderAPI = void 0;
11
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _reactDom = require("react-dom");
14
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
15
+ var _isSsr = require("../core-utils/is-ssr");
14
16
  var _PortalBucket = require("./PortalBucket");
15
17
  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); }
16
18
  function createPortalRendererComponent(portalManager) {
@@ -58,6 +60,16 @@ var PortalRenderWrapperInner = exports.PortalRenderWrapperInner = function Porta
58
60
  var PortalRenderWrapper = /*#__PURE__*/(0, _react.memo)(PortalRenderWrapperInner);
59
61
  PortalRenderWrapper.displayName = 'PortalRenderWrapper';
60
62
 
63
+ // Tree-shakable renderToStaticMarkup that should work only in SSR
64
+ function getRenderToStaticMarkup() {
65
+ if (process.env.REACT_SSR) {
66
+ return require('react-dom/server').renderToStaticMarkup;
67
+ }
68
+ return function () {
69
+ return '';
70
+ };
71
+ }
72
+
61
73
  /**
62
74
  * Creates a portal provider for managing multiple React portals. The provider
63
75
  * facilitates rendering, removing, and destroying portals managed by a given
@@ -81,19 +93,32 @@ var getPortalProviderAPI = exports.getPortalProviderAPI = function getPortalProv
81
93
  return {
82
94
  render: function render(children, container, key, onBeforeReactDomRender) {
83
95
  var immediate = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
84
- if (typeof onBeforeReactDomRender === 'function') {
85
- var portal = /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react.default.createElement(PortalRenderWrapper, {
86
- getChildren: children,
87
- onBeforeRender: onBeforeReactDomRender
88
- }), container, key);
89
- portalsMap.set(key, portalManager.registerPortal(key, portal, immediate));
96
+ if ((0, _isSsr.isSSR)() && (0, _expValEquals.expValEquals)('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
97
+ var html = '';
98
+ try {
99
+ var renderToStaticMarkup = getRenderToStaticMarkup();
100
+ var Children = children;
101
+ html = renderToStaticMarkup( /*#__PURE__*/_react.default.createElement(Children, null));
102
+ } catch (_unused) {}
103
+ container.innerHTML = html;
90
104
  } else {
91
- var _portal = /*#__PURE__*/(0, _reactDom.createPortal)(children(), container, key);
92
- portalsMap.set(key, portalManager.registerPortal(key, _portal, immediate));
105
+ if (typeof onBeforeReactDomRender === 'function') {
106
+ var portal = /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/_react.default.createElement(PortalRenderWrapper, {
107
+ getChildren: children,
108
+ onBeforeRender: onBeforeReactDomRender
109
+ }), container, key);
110
+ portalsMap.set(key, portalManager.registerPortal(key, portal, immediate));
111
+ } else {
112
+ var _portal = /*#__PURE__*/(0, _reactDom.createPortal)(children(), container, key);
113
+ portalsMap.set(key, portalManager.registerPortal(key, _portal, immediate));
114
+ }
93
115
  }
94
116
  },
95
117
  remove: function remove(key) {
96
118
  var _portalsMap$get;
119
+ if ((0, _isSsr.isSSR)() && (0, _expValEquals.expValEquals)('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
120
+ return;
121
+ }
97
122
  (_portalsMap$get = portalsMap.get(key)) === null || _portalsMap$get === void 0 || _portalsMap$get();
98
123
  portalsMap.delete(key);
99
124
  },
@@ -10,11 +10,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
  var _react = _interopRequireDefault(require("react"));
12
12
  var _react2 = require("@emotion/react");
13
- var _reactDom = require("react-dom");
14
- var _client = require("react-dom/client");
15
13
  var _model = require("@atlaskit/editor-prosemirror/model");
16
14
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
17
- var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
18
15
  var _analytics = require("../analytics");
19
16
  var _isSsr = require("../core-utils/is-ssr");
20
17
  var _ErrorBoundary = require("../ui/ErrorBoundary");
@@ -80,39 +77,13 @@ function createNodeView(_ref) {
80
77
  // to the passed dom element (domRef) which means it is automatically
81
78
  // "cleaned up" when you do a "re render".
82
79
  function renderComponent() {
83
- if ((0, _isSsr.isSSR)() && (0, _expValEquals.expValEquals)('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
84
- var html = '';
85
-
86
- // We don't use direct rendering to the domRef, as this can lead to unexpected behavior,
87
- // when the domRef element might have handlers from ProseMirror that will start executing
88
- // in JSDom. Therefore, we simply attempt to render the element synchronously, get its HTML, and set it to the domRef,
89
- // to keep the domRef as clear as possible.
90
- try {
91
- var PortalComponent = getPortalChildren({
92
- dispatchAnalyticsEvent: dispatchAnalyticsEvent,
93
- currentNode: currentNode,
94
- nodeViewParams: nodeViewParams,
95
- Component: Component,
96
- extraComponentProps: extraComponentProps
97
- });
98
- var rootElement = document.createElement('span');
99
- var ssrRoot = (0, _client.createRoot)(rootElement);
100
- (0, _reactDom.flushSync)(function () {
101
- ssrRoot.render((0, _react2.jsx)(PortalComponent, null));
102
- });
103
- html = rootElement.innerHTML;
104
- ssrRoot.unmount();
105
- } catch (_unused) {}
106
- domRef.innerHTML = html;
107
- } else {
108
- pmPluginFactoryParams.portalProviderAPI.render(getPortalChildren({
109
- dispatchAnalyticsEvent: dispatchAnalyticsEvent,
110
- currentNode: currentNode,
111
- nodeViewParams: nodeViewParams,
112
- Component: Component,
113
- extraComponentProps: extraComponentProps
114
- }), domRef, key);
115
- }
80
+ pmPluginFactoryParams.portalProviderAPI.render(getPortalChildren({
81
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
82
+ currentNode: currentNode,
83
+ nodeViewParams: nodeViewParams,
84
+ Component: Component,
85
+ extraComponentProps: extraComponentProps
86
+ }), domRef, key);
116
87
  }
117
88
  var _getPerformanceOption = (0, _utils.getPerformanceOptions)(nodeViewParams.view),
118
89
  samplingRate = _getPerformanceOption.samplingRate,
@@ -166,12 +137,10 @@ function createNodeView(_ref) {
166
137
  return true;
167
138
  },
168
139
  destroy: function destroy() {
169
- if (!(0, _isSsr.isSSR)() || !(0, _expValEquals.expValEquals)('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
170
- // When prosemirror destroys the node view, we need to clean up
171
- // what we have previously rendered using the editor portal
172
- // provider api.
173
- pmPluginFactoryParams.portalProviderAPI.remove(key);
174
- }
140
+ // When prosemirror destroys the node view, we need to clean up
141
+ // what we have previously rendered using the editor portal
142
+ // provider api.
143
+ pmPluginFactoryParams.portalProviderAPI.remove(key);
175
144
  // @ts-expect-error Expect an error as domRef is expected to be
176
145
  // of HTMLSpanElement type however once the node view has
177
146
  // been destroyed no other consumers should still be using it.
@@ -24,7 +24,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
24
24
  * @jsx jsx
25
25
  */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
26
26
  var packageName = "@atlaskit/editor-common";
27
- var packageVersion = "114.27.0";
27
+ var packageVersion = "114.29.0";
28
28
  var halfFocusRing = 1;
29
29
  var dropOffset = '0, 8';
30
30
  var fadeIn = (0, _react2.keyframes)({
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.todayTimestampInUTC = exports.timestampToUTCDate = exports.timestampToTaskContext = exports.timestampToString = exports.timestampToIsoFormat = exports.isPastDate = void 0;
8
8
  var _differenceInCalendarDays = _interopRequireDefault(require("date-fns/differenceInCalendarDays"));
9
9
  var _isBefore = _interopRequireDefault(require("date-fns/isBefore"));
10
- var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
11
10
  var FORMATS = /*#__PURE__*/function (FORMATS) {
12
11
  FORMATS["ISO_FORMAT"] = "YYYY-MM-DD";
13
12
  FORMATS["LOCALIZED_FORMAT"] = "LOCALIZED_FORMAT";
@@ -26,7 +25,7 @@ var timestampToUTCDate = exports.timestampToUTCDate = function timestampToUTCDat
26
25
  };
27
26
  var todayTimestampInUTC = exports.todayTimestampInUTC = function todayTimestampInUTC(timeZone) {
28
27
  var today = new Date(Date.now());
29
- if (timeZone && (0, _expValEquals.expValEquals)('confluence_frontend_fix_date_hydration_error', 'isEnabled', true)) {
28
+ if (timeZone) {
30
29
  var _parts$find, _parts$find2, _parts$find3;
31
30
  var parts = new Intl.DateTimeFormat('en-US', {
32
31
  timeZone: timeZone,
@@ -10,6 +10,7 @@ import { css, jsx } from '@emotion/react';
10
10
  import classnames from 'classnames';
11
11
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
12
12
  import { ZERO_WIDTH_SPACE } from '../whitespace';
13
+ import { ExtensionSSRReactContextsProvider } from './ExtensionSSRReactContextsProvider';
13
14
  const styles = css({
14
15
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
15
16
  '&.inline-extension': {
@@ -62,7 +63,8 @@ const hoverStyles = css({
62
63
  export const ExtensionNodeWrapper = ({
63
64
  children,
64
65
  nodeType,
65
- macroInteractionDesignFeatureFlags
66
+ macroInteractionDesignFeatureFlags,
67
+ intl
66
68
  }) => {
67
69
  const {
68
70
  showMacroInteractionDesignUpdates
@@ -71,11 +73,13 @@ export const ExtensionNodeWrapper = ({
71
73
  'inline-extension': nodeType === 'inlineExtension' && showMacroInteractionDesignUpdates,
72
74
  relative: showMacroInteractionDesignUpdates
73
75
  });
74
- return jsx("span", {
76
+ return jsx(ExtensionSSRReactContextsProvider, {
77
+ intl: intl
78
+ }, jsx("span", {
75
79
  "data-testid": "extension-node-wrapper"
76
80
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
77
81
  ,
78
82
  className: wrapperClassNames,
79
83
  css: [styles, expValEquals('cc_editor_ttvc_release_bundle_one', 'extensionHoverRefactor', true) && hoverStyles]
80
- }, children, nodeType === 'inlineExtension' && ZERO_WIDTH_SPACE);
84
+ }, children, nodeType === 'inlineExtension' && ZERO_WIDTH_SPACE));
81
85
  };
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { RawIntlProvider } from 'react-intl';
3
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
4
+ import { isSSR } from '../core-utils/is-ssr';
5
+ export function ExtensionSSRReactContextsProvider({
6
+ children,
7
+ intl
8
+ }) {
9
+ if (!expValEquals('platform_editor_editor_ssr_streaming', 'isEnabled', true) || !isSSR()) {
10
+ return children;
11
+ }
12
+ if (!intl) {
13
+ return children;
14
+ }
15
+ return /*#__PURE__*/React.createElement(RawIntlProvider, {
16
+ value: intl
17
+ }, children);
18
+ }
@@ -247,6 +247,7 @@ export class ExtensionNode extends ReactNodeView {
247
247
  return null;
248
248
  }
249
249
  return /*#__PURE__*/React.createElement(ExtensionNodeWrapper, {
250
+ intl: props.intl,
250
251
  nodeType: this.node.type.name,
251
252
  macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags
252
253
  }, /*#__PURE__*/React.createElement(Extension, {
@@ -273,7 +274,7 @@ export class ExtensionNode extends ReactNodeView {
273
274
  }));
274
275
  }
275
276
  }
276
- export default function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers) {
277
+ export default function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers, intl) {
277
278
  return (node, view, getPos) => {
278
279
  return new ExtensionNode(node, view, getPos, portalProviderAPI, eventDispatcher, {
279
280
  providerFactory,
@@ -283,7 +284,8 @@ export default function ExtensionNodeView(portalProviderAPI, eventDispatcher, pr
283
284
  macroInteractionDesignFeatureFlags,
284
285
  showLivePagesBodiedMacrosRendererView,
285
286
  showUpdatedLivePages1PBodiedExtensionUI,
286
- rendererExtensionHandlers
287
+ rendererExtensionHandlers,
288
+ intl
287
289
  }).init();
288
290
  };
289
291
  }
@@ -89,5 +89,10 @@ export const toolbarMessages = defineMessages({
89
89
  id: 'fabric.editor.layout.resizeLayout',
90
90
  defaultMessage: 'Resize layout',
91
91
  description: 'The text is shown as a label on a button or handle when the user can resize the layout columns in the editor.'
92
+ },
93
+ distributeColumns: {
94
+ id: 'fabric.editor.layout.distributeColumns',
95
+ defaultMessage: 'Distribute columns',
96
+ description: 'The text is shown as a label for an option that distributes layout columns evenly.'
92
97
  }
93
98
  });
@@ -4,7 +4,7 @@ import { isFedRamp } from './environment';
4
4
  import { normaliseSentryBreadcrumbs, SERIALIZABLE_ATTRIBUTES } from './normalise-sentry-breadcrumbs';
5
5
  const SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
6
6
  const packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
7
- const packageVersion = "114.27.0";
7
+ const packageVersion = "114.29.0";
8
8
  const sanitiseSentryEvents = (data, _hint) => {
9
9
  // Remove URL as it has UGC
10
10
  // Ignored via go/ees007
@@ -1,5 +1,7 @@
1
1
  import React, { memo, useLayoutEffect, useMemo, useState } from 'react';
2
2
  import { createPortal } from 'react-dom';
3
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
4
+ import { isSSR } from '../core-utils/is-ssr';
3
5
  import { PortalBucket } from './PortalBucket';
4
6
  export function createPortalRendererComponent(portalManager) {
5
7
  return function PortalRenderer() {
@@ -40,6 +42,14 @@ export const PortalRenderWrapperInner = ({
40
42
  const PortalRenderWrapper = /*#__PURE__*/memo(PortalRenderWrapperInner);
41
43
  PortalRenderWrapper.displayName = 'PortalRenderWrapper';
42
44
 
45
+ // Tree-shakable renderToStaticMarkup that should work only in SSR
46
+ function getRenderToStaticMarkup() {
47
+ if (process.env.REACT_SSR) {
48
+ return require('react-dom/server').renderToStaticMarkup;
49
+ }
50
+ return () => '';
51
+ }
52
+
43
53
  /**
44
54
  * Creates a portal provider for managing multiple React portals. The provider
45
55
  * facilitates rendering, removing, and destroying portals managed by a given
@@ -62,19 +72,32 @@ export const getPortalProviderAPI = portalManager => {
62
72
  const portalsMap = new Map();
63
73
  return {
64
74
  render: (children, container, key, onBeforeReactDomRender, immediate = false) => {
65
- if (typeof onBeforeReactDomRender === 'function') {
66
- const portal = /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(PortalRenderWrapper, {
67
- getChildren: children,
68
- onBeforeRender: onBeforeReactDomRender
69
- }), container, key);
70
- portalsMap.set(key, portalManager.registerPortal(key, portal, immediate));
75
+ if (isSSR() && expValEquals('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
76
+ let html = '';
77
+ try {
78
+ const renderToStaticMarkup = getRenderToStaticMarkup();
79
+ const Children = children;
80
+ html = renderToStaticMarkup( /*#__PURE__*/React.createElement(Children, null));
81
+ } catch {}
82
+ container.innerHTML = html;
71
83
  } else {
72
- const portal = /*#__PURE__*/createPortal(children(), container, key);
73
- portalsMap.set(key, portalManager.registerPortal(key, portal, immediate));
84
+ if (typeof onBeforeReactDomRender === 'function') {
85
+ const portal = /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(PortalRenderWrapper, {
86
+ getChildren: children,
87
+ onBeforeRender: onBeforeReactDomRender
88
+ }), container, key);
89
+ portalsMap.set(key, portalManager.registerPortal(key, portal, immediate));
90
+ } else {
91
+ const portal = /*#__PURE__*/createPortal(children(), container, key);
92
+ portalsMap.set(key, portalManager.registerPortal(key, portal, immediate));
93
+ }
74
94
  }
75
95
  },
76
96
  remove: key => {
77
97
  var _portalsMap$get;
98
+ if (isSSR() && expValEquals('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
99
+ return;
100
+ }
78
101
  (_portalsMap$get = portalsMap.get(key)) === null || _portalsMap$get === void 0 ? void 0 : _portalsMap$get();
79
102
  portalsMap.delete(key);
80
103
  },
@@ -7,11 +7,8 @@ import React from 'react';
7
7
 
8
8
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
9
9
  import { jsx } from '@emotion/react';
10
- import { flushSync } from 'react-dom';
11
- import { createRoot } from 'react-dom/client';
12
10
  import { DOMSerializer } from '@atlaskit/editor-prosemirror/model';
13
11
  import { fg } from '@atlaskit/platform-feature-flags';
14
- import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
15
12
  import { ACTION_SUBJECT, ACTION_SUBJECT_ID } from '../analytics';
16
13
  import { isSSR } from '../core-utils/is-ssr';
17
14
  import { ErrorBoundary } from '../ui/ErrorBoundary';
@@ -73,39 +70,13 @@ function createNodeView({
73
70
  // to the passed dom element (domRef) which means it is automatically
74
71
  // "cleaned up" when you do a "re render".
75
72
  function renderComponent() {
76
- if (isSSR() && expValEquals('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
77
- let html = '';
78
-
79
- // We don't use direct rendering to the domRef, as this can lead to unexpected behavior,
80
- // when the domRef element might have handlers from ProseMirror that will start executing
81
- // in JSDom. Therefore, we simply attempt to render the element synchronously, get its HTML, and set it to the domRef,
82
- // to keep the domRef as clear as possible.
83
- try {
84
- const PortalComponent = getPortalChildren({
85
- dispatchAnalyticsEvent,
86
- currentNode,
87
- nodeViewParams,
88
- Component,
89
- extraComponentProps
90
- });
91
- const rootElement = document.createElement('span');
92
- const ssrRoot = createRoot(rootElement);
93
- flushSync(() => {
94
- ssrRoot.render(jsx(PortalComponent, null));
95
- });
96
- html = rootElement.innerHTML;
97
- ssrRoot.unmount();
98
- } catch {}
99
- domRef.innerHTML = html;
100
- } else {
101
- pmPluginFactoryParams.portalProviderAPI.render(getPortalChildren({
102
- dispatchAnalyticsEvent,
103
- currentNode,
104
- nodeViewParams,
105
- Component,
106
- extraComponentProps
107
- }), domRef, key);
108
- }
73
+ pmPluginFactoryParams.portalProviderAPI.render(getPortalChildren({
74
+ dispatchAnalyticsEvent,
75
+ currentNode,
76
+ nodeViewParams,
77
+ Component,
78
+ extraComponentProps
79
+ }), domRef, key);
109
80
  }
110
81
  const {
111
82
  samplingRate,
@@ -162,12 +133,10 @@ function createNodeView({
162
133
  return true;
163
134
  },
164
135
  destroy() {
165
- if (!isSSR() || !expValEquals('platform_editor_editor_ssr_streaming', 'isEnabled', true)) {
166
- // When prosemirror destroys the node view, we need to clean up
167
- // what we have previously rendered using the editor portal
168
- // provider api.
169
- pmPluginFactoryParams.portalProviderAPI.remove(key);
170
- }
136
+ // When prosemirror destroys the node view, we need to clean up
137
+ // what we have previously rendered using the editor portal
138
+ // provider api.
139
+ pmPluginFactoryParams.portalProviderAPI.remove(key);
171
140
  // @ts-expect-error Expect an error as domRef is expected to be
172
141
  // of HTMLSpanElement type however once the node view has
173
142
  // been destroyed no other consumers should still be using it.
@@ -14,7 +14,7 @@ import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
14
14
  import { fg } from '@atlaskit/platform-feature-flags';
15
15
  import Layer from '../Layer';
16
16
  const packageName = "@atlaskit/editor-common";
17
- const packageVersion = "114.27.0";
17
+ const packageVersion = "114.29.0";
18
18
  const halfFocusRing = 1;
19
19
  const dropOffset = '0, 8';
20
20
  const fadeIn = keyframes({
@@ -1,6 +1,5 @@
1
1
  import differenceInCalendarDays from 'date-fns/differenceInCalendarDays';
2
2
  import isBefore from 'date-fns/isBefore';
3
- import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
4
3
  var FORMATS = /*#__PURE__*/function (FORMATS) {
5
4
  FORMATS["ISO_FORMAT"] = "YYYY-MM-DD";
6
5
  FORMATS["LOCALIZED_FORMAT"] = "LOCALIZED_FORMAT";
@@ -19,7 +18,7 @@ export const timestampToUTCDate = timestamp => {
19
18
  };
20
19
  export const todayTimestampInUTC = timeZone => {
21
20
  const today = new Date(Date.now());
22
- if (timeZone && expValEquals('confluence_frontend_fix_date_hydration_error', 'isEnabled', true)) {
21
+ if (timeZone) {
23
22
  var _parts$find, _parts$find2, _parts$find3;
24
23
  const parts = new Intl.DateTimeFormat('en-US', {
25
24
  timeZone,
@@ -10,6 +10,7 @@ import { css, jsx } from '@emotion/react';
10
10
  import classnames from 'classnames';
11
11
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
12
12
  import { ZERO_WIDTH_SPACE } from '../whitespace';
13
+ import { ExtensionSSRReactContextsProvider } from './ExtensionSSRReactContextsProvider';
13
14
  var styles = css({
14
15
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
15
16
  '&.inline-extension': {
@@ -62,18 +63,21 @@ var hoverStyles = css({
62
63
  export var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
63
64
  var children = _ref.children,
64
65
  nodeType = _ref.nodeType,
65
- macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags;
66
+ macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags,
67
+ intl = _ref.intl;
66
68
  var _ref2 = macroInteractionDesignFeatureFlags || {},
67
69
  showMacroInteractionDesignUpdates = _ref2.showMacroInteractionDesignUpdates;
68
70
  var wrapperClassNames = classnames({
69
71
  'inline-extension': nodeType === 'inlineExtension' && showMacroInteractionDesignUpdates,
70
72
  relative: showMacroInteractionDesignUpdates
71
73
  });
72
- return jsx("span", {
74
+ return jsx(ExtensionSSRReactContextsProvider, {
75
+ intl: intl
76
+ }, jsx("span", {
73
77
  "data-testid": "extension-node-wrapper"
74
78
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop
75
79
  ,
76
80
  className: wrapperClassNames,
77
81
  css: [styles, expValEquals('cc_editor_ttvc_release_bundle_one', 'extensionHoverRefactor', true) && hoverStyles]
78
- }, children, nodeType === 'inlineExtension' && ZERO_WIDTH_SPACE);
82
+ }, children, nodeType === 'inlineExtension' && ZERO_WIDTH_SPACE));
79
83
  };
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { RawIntlProvider } from 'react-intl';
3
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
4
+ import { isSSR } from '../core-utils/is-ssr';
5
+ export function ExtensionSSRReactContextsProvider(_ref) {
6
+ var children = _ref.children,
7
+ intl = _ref.intl;
8
+ if (!expValEquals('platform_editor_editor_ssr_streaming', 'isEnabled', true) || !isSSR()) {
9
+ return children;
10
+ }
11
+ if (!intl) {
12
+ return children;
13
+ }
14
+ return /*#__PURE__*/React.createElement(RawIntlProvider, {
15
+ value: intl
16
+ }, children);
17
+ }