@atlaskit/editor-common 111.35.0 → 111.35.1

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 (28) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/extensibility/ExtensionComponent.js +6 -5
  3. package/dist/cjs/extensions/UnknownMacroPlaceholder.compiled.css +28 -0
  4. package/dist/cjs/extensions/UnknownMacroPlaceholder.js +70 -0
  5. package/dist/cjs/extensions/extension-handlers.js +16 -0
  6. package/dist/cjs/extensions/messages.js +10 -0
  7. package/dist/cjs/styles/shared/table.js +1 -1
  8. package/dist/es2019/extensibility/ExtensionComponent.js +6 -5
  9. package/dist/es2019/extensions/UnknownMacroPlaceholder.compiled.css +28 -0
  10. package/dist/es2019/extensions/UnknownMacroPlaceholder.js +46 -0
  11. package/dist/es2019/extensions/extension-handlers.js +16 -0
  12. package/dist/es2019/extensions/messages.js +10 -0
  13. package/dist/es2019/styles/shared/table.js +1 -1
  14. package/dist/esm/extensibility/ExtensionComponent.js +6 -5
  15. package/dist/esm/extensions/UnknownMacroPlaceholder.compiled.css +28 -0
  16. package/dist/esm/extensions/UnknownMacroPlaceholder.js +61 -0
  17. package/dist/esm/extensions/extension-handlers.js +16 -0
  18. package/dist/esm/extensions/messages.js +10 -0
  19. package/dist/esm/styles/shared/table.js +1 -1
  20. package/dist/types/experiences/ExperienceCheckDomMutation.d.ts +2 -2
  21. package/dist/types/extensions/UnknownMacroPlaceholder.d.ts +7 -0
  22. package/dist/types/extensions/extension-handlers.d.ts +1 -0
  23. package/dist/types/extensions/messages.d.ts +10 -0
  24. package/dist/types-ts4.5/experiences/ExperienceCheckDomMutation.d.ts +2 -2
  25. package/dist/types-ts4.5/extensions/UnknownMacroPlaceholder.d.ts +7 -0
  26. package/dist/types-ts4.5/extensions/extension-handlers.d.ts +1 -0
  27. package/dist/types-ts4.5/extensions/messages.d.ts +10 -0
  28. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-common
2
2
 
3
+ ## 111.35.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`db3c50fa8f5c3`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/db3c50fa8f5c3) -
8
+ [ux] Display unknown macro body content when an extension fails to load in the editor, showing the
9
+ macro title, parameters, and body content instead of a generic error message.
10
+
3
11
  ## 111.35.0
4
12
 
5
13
  ### Minor Changes
@@ -20,6 +20,7 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
20
20
  var _react = _interopRequireWildcard(require("react"));
21
21
  var _memoizeOne = _interopRequireDefault(require("memoize-one"));
22
22
  var _state = require("@atlaskit/editor-prosemirror/state");
23
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
23
24
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
24
25
  var _extensions = require("../extensions");
25
26
  var _utils = require("../utils");
@@ -196,12 +197,12 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
196
197
  references: _this.props.references,
197
198
  actions: actions
198
199
  });
199
- } else {
200
- return /*#__PURE__*/_react.default.createElement(NodeRenderer, {
201
- node: node,
202
- references: _this.props.references
203
- });
204
200
  }
201
+ return /*#__PURE__*/_react.default.createElement(NodeRenderer, {
202
+ node: node,
203
+ references: _this.props.references,
204
+ showUnknownMacroPlaceholder: (0, _platformFeatureFlags.fg)('tinymce_display_unknown_macro_body_content')
205
+ });
205
206
  }
206
207
  }
207
208
  return result;
@@ -0,0 +1,28 @@
1
+ ._11c81a4x{font:var(--ds-font-body-small,9pt)}
2
+ ._11c8fhey{font:var(--ds-font-body,normal 400 14px/20px "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
+ ._19it7tl1{border:var(--_98ihdp)}
4
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}
5
+ ._2rko14xi{border-radius:var(--ds-radius-small,4px) var(--ds-radius-small,4px) 0 0}
6
+ ._n7zl7tl1{border-bottom:var(--_98ihdp)}
7
+ ._154i1n1a{top:-1px}
8
+ ._18m915vq{overflow-y:hidden}
9
+ ._18u0idpf{margin-left:0}
10
+ ._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
11
+ ._19bvutpp{padding-left:var(--ds-space-150,9pt)}
12
+ ._19pkidpf{margin-top:0}
13
+ ._1nmz1hna{word-break:break-word}
14
+ ._1reo15vq{overflow-x:hidden}
15
+ ._2hwxidpf{margin-right:0}
16
+ ._6z24egat{tab-size:4}
17
+ ._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
18
+ ._bfhkrnwa{background-color:var(--ds-surface-raised,#fffdf6)}
19
+ ._bfhkvuon{background-color:var(--ds-surface,#fff)}
20
+ ._ca0qu2gc{padding-top:var(--ds-space-100,8px)}
21
+ ._ca0qutpp{padding-top:var(--ds-space-150,9pt)}
22
+ ._kqswh2mm{position:relative}
23
+ ._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
24
+ ._n3tdutpp{padding-bottom:var(--ds-space-150,9pt)}
25
+ ._o5721jtm{white-space:pre-wrap}
26
+ ._otyridpf{margin-bottom:0}
27
+ ._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
28
+ ._u5f3utpp{padding-right:var(--ds-space-150,9pt)}
@@ -0,0 +1,70 @@
1
+ /* UnknownMacroPlaceholder.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ "use strict";
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.UnknownMacroPlaceholder = UnknownMacroPlaceholder;
10
+ require("./UnknownMacroPlaceholder.compiled.css");
11
+ var React = _interopRequireWildcard(require("react"));
12
+ var _runtime = require("@compiled/react/runtime");
13
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
14
+ var _reactIntlNext = require("react-intl-next");
15
+ var _messages = require("./messages");
16
+ 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); }
17
+ // Unknown macro placeholder styling aligned with Legacy Content Macro (LCM) for consistent look
18
+ var neutralBorder = "var(--ds-background-neutral, #0515240F)";
19
+ var unknownMacroContainerStyles = null;
20
+
21
+ // Match LCM header exactly: lcmHeaderStyles from LegacyContentHeader/index.tsx
22
+ var unknownMacroHeaderStyles = null;
23
+
24
+ // Match LCM content area: white surface, text color inherits
25
+ var unknownMacroBodyStyles = null;
26
+ var unknownMacroPreStyles = null;
27
+ function UnknownMacroPlaceholder(_ref) {
28
+ var _extensionNode$parame, _extensionNode$parame2, _extensionNode$parame3, _extensionNode$parame4;
29
+ var extensionNode = _ref.extensionNode;
30
+ var intl = (0, _reactIntlNext.useIntl)();
31
+ var macroTitle = ((_extensionNode$parame = extensionNode.parameters) === null || _extensionNode$parame === void 0 || (_extensionNode$parame = _extensionNode$parame.macroMetadata) === null || _extensionNode$parame === void 0 ? void 0 : _extensionNode$parame.title) || extensionNode.extensionKey;
32
+ var bodyContent = (_extensionNode$parame2 = extensionNode.parameters) === null || _extensionNode$parame2 === void 0 || (_extensionNode$parame2 = _extensionNode$parame2.macroParams) === null || _extensionNode$parame2 === void 0 || (_extensionNode$parame2 = _extensionNode$parame2.__bodyContent) === null || _extensionNode$parame2 === void 0 ? void 0 : _extensionNode$parame2.value;
33
+ var macroParams = (_extensionNode$parame3 = (_extensionNode$parame4 = extensionNode.parameters) === null || _extensionNode$parame4 === void 0 ? void 0 : _extensionNode$parame4.macroParams) !== null && _extensionNode$parame3 !== void 0 ? _extensionNode$parame3 : {};
34
+ var formatParam = function formatParam(key, param) {
35
+ var _param$value;
36
+ var value = String((_param$value = param === null || param === void 0 ? void 0 : param.value) !== null && _param$value !== void 0 ? _param$value : '').trim();
37
+ return "".concat(key, " = ").concat(value);
38
+ };
39
+ var visibleParams = Object.entries(macroParams).filter(function (_ref2) {
40
+ var _ref3 = (0, _slicedToArray2.default)(_ref2, 1),
41
+ key = _ref3[0];
42
+ return !key.startsWith('_');
43
+ }).map(function (_ref4) {
44
+ var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
45
+ key = _ref5[0],
46
+ param = _ref5[1];
47
+ return formatParam(key, param);
48
+ }).join(' | ');
49
+ var headerText = visibleParams ? "".concat(intl.formatMessage(_messages.messages.unknownMacroHeader, {
50
+ macroTitle: macroTitle
51
+ }), " | ").concat(visibleParams) : intl.formatMessage(_messages.messages.unknownMacroHeader, {
52
+ macroTitle: macroTitle
53
+ });
54
+ return /*#__PURE__*/React.createElement("section", {
55
+ "aria-label": intl.formatMessage(_messages.messages.unknownMacroPlaceholderAriaLabel),
56
+ className: (0, _runtime.ax)(["_19it7tl1 _2rko12b0 _1reo15vq _18m915vq _bfhkrnwa"]),
57
+ style: {
58
+ "--_98ihdp": (0, _runtime.ix)("1px solid ".concat(neutralBorder))
59
+ }
60
+ }, /*#__PURE__*/React.createElement("div", {
61
+ className: (0, _runtime.ax)(["_2rko14xi _11c81a4x _n7zl7tl1 _bfhki8nm _ca0qu2gc _u5f3pxbi _n3td1b66 _19bvpxbi _kqswh2mm _154i1n1a"]),
62
+ style: {
63
+ "--_98ihdp": (0, _runtime.ix)("1px solid ".concat(neutralBorder))
64
+ }
65
+ }, headerText), /*#__PURE__*/React.createElement("div", {
66
+ className: (0, _runtime.ax)(["_19pkidpf _2hwxidpf _otyridpf _18u0idpf _bfhkvuon _ca0qutpp _u5f3utpp _n3tdutpp _19bvutpp"])
67
+ }, /*#__PURE__*/React.createElement("pre", {
68
+ className: (0, _runtime.ax)(["_19pkidpf _2hwxidpf _otyridpf _18u0idpf _11c8fhey _o5721jtm _1nmz1hna _6z24egat"])
69
+ }, bodyContent)));
70
+ }
@@ -15,8 +15,10 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
15
15
  var _react = _interopRequireDefault(require("react"));
16
16
  var _reactIntlNext = require("react-intl-next");
17
17
  var _reactLoadable = _interopRequireDefault(require("react-loadable"));
18
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
18
19
  var _manifestHelpers = require("./manifest-helpers");
19
20
  var _messages = require("./messages");
21
+ var _UnknownMacroPlaceholder = require("./UnknownMacroPlaceholder");
20
22
  function getNodeFromManifest(
21
23
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
24
  manifest, extKey, nodeKey, extensionType, extensionKey) {
@@ -111,11 +113,21 @@ function _getExtensionModuleNodePrivateProps() {
111
113
  }));
112
114
  return _getExtensionModuleNodePrivateProps.apply(this, arguments);
113
115
  }
116
+ function isUnknownConfluenceMacroWithBody(extensionNode) {
117
+ var _extensionNode$parame;
118
+ return extensionNode !== null && extensionNode.type === 'extension' && extensionNode.extensionType === 'com.atlassian.confluence.macro.core' && !!((_extensionNode$parame = extensionNode.parameters) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.macroParams) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.__bodyContent) !== null && _extensionNode$parame !== void 0 && _extensionNode$parame.value);
119
+ }
114
120
  function ExtensionLoading(props) {
115
121
  var intl = (0, _reactIntlNext.useIntl)();
122
+ var extensionNode = props.node;
116
123
  if (props.error || props.timedOut) {
117
124
  // eslint-disable-next-line no-console
118
125
  console.error('Error rendering extension', props.error);
126
+ if (props.error && props.showUnknownMacroPlaceholder && extensionNode && isUnknownConfluenceMacroWithBody(extensionNode) && (0, _platformFeatureFlags.fg)('tinymce_display_unknown_macro_body_content')) {
127
+ return /*#__PURE__*/_react.default.createElement(_UnknownMacroPlaceholder.UnknownMacroPlaceholder, {
128
+ extensionNode: extensionNode
129
+ });
130
+ }
119
131
  return /*#__PURE__*/_react.default.createElement("div", null, intl.formatMessage(_messages.messages.extensionLoadingError));
120
132
  } else {
121
133
  return null;
@@ -139,6 +151,10 @@ function getNodeRenderer(extensionProvider, extensionType, extensionKey) {
139
151
  (0, _manifestHelpers.resolveImportSync)(preloaded) : (0, _manifestHelpers.resolveImport)(maybePromise.render());
140
152
  }
141
153
  },
154
+ // react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
155
+ // but its TypeScript types only expect LoadingComponentProps. We cast here because
156
+ // ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
157
+ // react-loadable will pass through but doesn't know about in its type definitions.
142
158
  loading: ExtensionLoading
143
159
  });
144
160
  }
@@ -50,6 +50,16 @@ var messages = exports.messages = (0, _reactIntlNext.defineMessages)({
50
50
  id: 'fabric.editor.extension.loading-error',
51
51
  defaultMessage: 'Error loading the extension!',
52
52
  description: 'Error message displayed when an extension fails to load in the editor. Indicates a problem occurred during the extension initialization or rendering process.'
53
+ },
54
+ unknownMacroPlaceholderAriaLabel: {
55
+ id: 'fabric.editor.extension.unknownMacroPlaceholderAriaLabel',
56
+ defaultMessage: 'Unknown macro placeholder',
57
+ description: 'Accessible label for the unknown macro fallback block shown when a Confluence macro cannot be resolved.'
58
+ },
59
+ unknownMacroHeader: {
60
+ id: 'fabric.editor.extension.unknownMacroHeader',
61
+ defaultMessage: "Unknown macro: ''{macroTitle}''",
62
+ description: 'Header text for an unresolved Confluence macro placeholder.'
53
63
  }
54
64
  });
55
65
  var configPanelMessages = exports.configPanelMessages = (0, _reactIntlNext.defineMessages)({
@@ -64,7 +64,7 @@ var firstNodeWithNotMarginTop = function firstNodeWithNotMarginTop() {
64
64
  var tableSharedStyle = exports.tableSharedStyle = function tableSharedStyle() {
65
65
  var browser = (0, _expValEquals.expValEquals)('platform_editor_hydratable_ui', 'isEnabled', true) ? (0, _browser.getBrowserInfo)() : _browser.browser;
66
66
  // eslint-disable-next-line @atlaskit/design-system/no-css-tagged-template-expression -- Appears safe to auto-fix, but leaving it up to the team to remediate as the readability only gets worse with autofixing
67
- return (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n\t\t", "\n\t\t.", " {\n\t\t\tposition: relative;\n\t\t\tmargin: 0 auto ", ";\n\t\t\tbox-sizing: border-box;\n\n\t\t\t/**\n * Fix block top alignment inside table cells.\n */\n\t\t\t.decisionItemView-content-wrap:first-of-type > div {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t\t.", ",\n\t\t\t\t.", " {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 1px;\n\t\t\t\theight: calc(100% - ", ");\n\t\t\t\tbackground: ", ";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: ", ";\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tright: 0;\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t\t.", "[data-with-numbered-table='true'] {\n\t\t\t\tleft: ", "px;\n\t\t\t}\n\t\t}\n\t\t.", "[data-number-column='true'] {\n\t\t\tpadding-left: ", "px;\n\t\t\tclear: both;\n\t\t}\n\n\t\t.", " {\n\t\t\twill-change: width, margin-left;\n\t\t}\n\n\t\t.", " table {\n\t\t\twill-change: width;\n\t\t}\n\n\t\t.", " > table {\n\t\t\tmargin: ", " 0 0 0;\n\t\t}\n\n\t\t.", " > table,\n\t\t.", " > table {\n\t\t\tmargin: ", " ", " 0 0;\n\t\t}\n\n\t\t/* support panel nested in table */\n\t\t", "\n\t\t\t\n\t\t/* avoid applying styles to nested tables (possible via extensions) */\n\t.", " > table,\n\t.", " > table,\n\t.", " > table {\n\t\t\tborder-collapse: collapse;\n\t\t\tborder: ", "px solid\n\t\t\t\t", ";\n\t\t\tborder-left-color: transparent;\n\t\t\tborder-right-color: transparent;\n\t\t\ttable-layout: fixed;\n\t\t\tfont-size: 1em;\n\t\t\twidth: 100%;\n\n\t\t\t&[data-autosize='true'] {\n\t\t\t\ttable-layout: auto;\n\t\t\t}\n\n\t\t\t& {\n\t\t\t\t* {\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t}\n\t\t\t\thr {\n\t\t\t\t\tbox-sizing: content-box;\n\t\t\t\t}\n\n\t\t\t\ttbody {\n\t\t\t\t\tborder-bottom: none;\n\t\t\t\t}\n\t\t\t\tth td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\t> tbody > tr > th,\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tmin-width: ", "px;\n\t\t\t\t\tfont-weight: ", ";\n\t\t\t\t\tvertical-align: top;\n\t\t\t\t\tborder: 1px solid ", ";\n\t\t\t\t\tborder-right-width: 0;\n\t\t\t\t\tborder-bottom-width: 0;\n\n\t\t\t\t\tpadding: ", ";\n\t\t\t\t\t/* https://stackoverflow.com/questions/7517127/borders-not-shown-in-firefox-with-border-collapse-on-table-position-relative-o */\n\t\t\t\t\t", "\n\n\t\t\t\t\t", "\n\n\t\t\t\tth p:not(:first-of-type),\n\t\t\t\ttd p:not(:first-of-type) {\n\t\t\t\t\t\tmargin-top: ", ";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Ensures nested tables are compatible with parent table background color - uses specificity to ensure tables nested by extensions are not affected */\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\tth {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\ttext-align: left;\n\n\t\t\t\t\t/* only apply this styling to codeblocks in default background headercells */\n\t\t\t\t\t/* TODO this needs to be overhauled as it relies on unsafe selectors */\n\t\t\t\t\t", " {\n\t\t\t\t\t\t.", ":not(.danger) {\n\t\t\t\t\t\t\tbackground-color: ", ";\n\n\t\t\t\t\t\t\t:not(.", ") {\n\t\t\t\t\t\t\t\tbox-shadow: 0px 0px 0px 1px ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-image: ", ";\n\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/* this is only relevant to the element taken care of by renderer */\n\t\t\t\t\t\t\t> [data-ds--code--code-block] {\n\t\t\t\t\t\t\t\tbackground-image: ", "!important;\n\n\t\t\t\t\t\t\t\tbackground-color: ", "!important;\n\n\t\t\t\t\t\t\t\t/* selector lives inside @atlaskit/code */\n\t\t\t\t\t\t\t\t--ds--code--line-number-bg-color: ", ";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"])), (0, _tableCell.tableCellBackgroundStyleOverride)(), TableSharedCssClassName.TABLE_CONTAINER, "var(--ds-space-200, 16px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, "var(--ds-space-300, 24px)", "var(--ds-background-accent-gray-subtler, ".concat(_editorSharedStyles.akEditorTableBorder, ")"), "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, _editorSharedStyles.akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_CONTAINER, _editorSharedStyles.akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, "var(--ds-space-300, 24px)", "var(--ds-space-100, 8px)", (0, _platformFeatureFlags.fg)('platform_editor_bordered_panel_nested_in_table') ? ".".concat(TableSharedCssClassName.TABLE_NODE_WRAPPER, " .ak-editor-panel {\n\t\t\tborder: ", "var(--ds-border-width, 1px)", " solid ", "var(--ds-border, #d9dbea)", ";\n\t\t}") : '', TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, tableCellBorderWidth, "var(--ds-background-accent-gray-subtler, ".concat(_editorSharedStyles.akEditorTableBorder, ")"), "var(--ds-background-neutral-subtle, white)", tableCellMinWidth, "var(--ds-font-weight-regular, 400)", "var(--ds-background-accent-gray-subtler, ".concat(_editorSharedStyles.akEditorTableBorder, ")"), "var(--ds-space-100, 8px)", browser.gecko || browser.ie || browser.mac && browser.chrome ? 'background-clip: padding-box;' : '', firstNodeWithNotMarginTop(), "var(--ds-space-150, 12px)", "var(--ds-surface, #FFFFFF)", "var(--ds-background-accent-gray-subtlest, ".concat(_editorSharedStyles.akEditorTableToolbar, ")"), (0, _expValEquals.expValEquals)('platform_editor_native_anchor_with_dnd', 'isEnabled', true) ? '&:not(.danger)' : '&:not([style]):not(.danger)', _codeBlock.CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER, "var(--ds-surface-raised, rgb(235, 237, 240))", _editorSharedStyles.akEditorSelectedNodeClassName, "var(--ds-border, transparent)", _codeBlock.CodeBlockSharedCssClassName.CODEBLOCK_CONTENT_WRAPPER, (0, _editorSharedStyles.overflowShadow)({
67
+ return (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n\t\t", "\n\t\t.", " {\n\t\t\tposition: relative;\n\t\t\tmargin: 0 auto ", ";\n\t\t\tbox-sizing: border-box;\n\n\t\t\t/**\n * Fix block top alignment inside table cells.\n */\n\t\t\t.decisionItemView-content-wrap:first-of-type > div {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t\t.", ",\n\t\t\t\t.", " {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 1px;\n\t\t\t\theight: calc(100% - ", ");\n\t\t\t\tbackground: ", ";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: ", ";\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tright: 0;\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t\t.", "[data-with-numbered-table='true'] {\n\t\t\t\tleft: ", "px;\n\t\t\t}\n\t\t}\n\t\t.", "[data-number-column='true'] {\n\t\t\tpadding-left: ", "px;\n\t\t\tclear: both;\n\t\t}\n\n\t\t.", " {\n\t\t\twill-change: width, margin-left;\n\t\t}\n\n\t\t.", " table {\n\t\t\twill-change: width;\n\t\t}\n\n\t\t.", " > table {\n\t\t\tmargin: ", " 0 0 0;\n\t\t}\n\n\t\t.", " > table,\n\t\t.", " > table {\n\t\t\tmargin: ", " ", " 0 0;\n\t\t}\n\n\t\t/* support panel nested in table */\n\t\t", "\n\n\t\t/* avoid applying styles to nested tables (possible via extensions) */\n\t.", " > table,\n\t.", " > table,\n\t.", " > table {\n\t\t\tborder-collapse: collapse;\n\t\t\tborder: ", "px solid\n\t\t\t\t", ";\n\t\t\tborder-left-color: transparent;\n\t\t\tborder-right-color: transparent;\n\t\t\ttable-layout: fixed;\n\t\t\tfont-size: 1em;\n\t\t\twidth: 100%;\n\n\t\t\t&[data-autosize='true'] {\n\t\t\t\ttable-layout: auto;\n\t\t\t}\n\n\t\t\t& {\n\t\t\t\t* {\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t}\n\t\t\t\thr {\n\t\t\t\t\tbox-sizing: content-box;\n\t\t\t\t}\n\n\t\t\t\ttbody {\n\t\t\t\t\tborder-bottom: none;\n\t\t\t\t}\n\t\t\t\tth td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\t> tbody > tr > th,\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tmin-width: ", "px;\n\t\t\t\t\tfont-weight: ", ";\n\t\t\t\t\tvertical-align: top;\n\t\t\t\t\tborder: 1px solid ", ";\n\t\t\t\t\tborder-right-width: 0;\n\t\t\t\t\tborder-bottom-width: 0;\n\n\t\t\t\t\tpadding: ", ";\n\t\t\t\t\t/* https://stackoverflow.com/questions/7517127/borders-not-shown-in-firefox-with-border-collapse-on-table-position-relative-o */\n\t\t\t\t\t", "\n\n\t\t\t\t\t", "\n\n\t\t\t\tth p:not(:first-of-type),\n\t\t\t\ttd p:not(:first-of-type) {\n\t\t\t\t\t\tmargin-top: ", ";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Ensures nested tables are compatible with parent table background color - uses specificity to ensure tables nested by extensions are not affected */\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\tth {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\ttext-align: left;\n\n\t\t\t\t\t/* only apply this styling to codeblocks in default background headercells */\n\t\t\t\t\t/* TODO this needs to be overhauled as it relies on unsafe selectors */\n\t\t\t\t\t", " {\n\t\t\t\t\t\t.", ":not(.danger) {\n\t\t\t\t\t\t\tbackground-color: ", ";\n\n\t\t\t\t\t\t\t:not(.", ") {\n\t\t\t\t\t\t\t\tbox-shadow: 0px 0px 0px 1px ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-image: ", ";\n\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/* this is only relevant to the element taken care of by renderer */\n\t\t\t\t\t\t\t> [data-ds--code--code-block] {\n\t\t\t\t\t\t\t\tbackground-image: ", "!important;\n\n\t\t\t\t\t\t\t\tbackground-color: ", "!important;\n\n\t\t\t\t\t\t\t\t/* selector lives inside @atlaskit/code */\n\t\t\t\t\t\t\t\t--ds--code--line-number-bg-color: ", ";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"])), (0, _tableCell.tableCellBackgroundStyleOverride)(), TableSharedCssClassName.TABLE_CONTAINER, "var(--ds-space-200, 16px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, "var(--ds-space-300, 24px)", "var(--ds-background-accent-gray-subtler, ".concat(_editorSharedStyles.akEditorTableBorder, ")"), "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, _editorSharedStyles.akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_CONTAINER, _editorSharedStyles.akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, "var(--ds-space-300, 24px)", "var(--ds-space-100, 8px)", (0, _platformFeatureFlags.fg)('platform_editor_bordered_panel_nested_in_table') ? ".".concat(TableSharedCssClassName.TABLE_NODE_WRAPPER, " .ak-editor-panel {\n\t\t\tborder: ", "var(--ds-border-width, 1px)", " solid ", "var(--ds-border, #d9dbea)", ";\n\t\t}") : '', TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, tableCellBorderWidth, "var(--ds-background-accent-gray-subtler, ".concat(_editorSharedStyles.akEditorTableBorder, ")"), "var(--ds-background-neutral-subtle, white)", tableCellMinWidth, "var(--ds-font-weight-regular, 400)", "var(--ds-background-accent-gray-subtler, ".concat(_editorSharedStyles.akEditorTableBorder, ")"), "var(--ds-space-100, 8px)", browser.gecko || browser.ie || browser.mac && browser.chrome ? 'background-clip: padding-box;' : '', firstNodeWithNotMarginTop(), "var(--ds-space-150, 12px)", "var(--ds-surface, #FFFFFF)", "var(--ds-background-accent-gray-subtlest, ".concat(_editorSharedStyles.akEditorTableToolbar, ")"), (0, _expValEquals.expValEquals)('platform_editor_native_anchor_with_dnd', 'isEnabled', true) ? '&:not(.danger)' : '&:not([style]):not(.danger)', _codeBlock.CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER, "var(--ds-surface-raised, rgb(235, 237, 240))", _editorSharedStyles.akEditorSelectedNodeClassName, "var(--ds-border, transparent)", _codeBlock.CodeBlockSharedCssClassName.CODEBLOCK_CONTENT_WRAPPER, (0, _editorSharedStyles.overflowShadow)({
68
68
  leftCoverWidth: "var(--ds-space-300, 24px)"
69
69
  }), "var(--ds-background-neutral, rgb(235, 237, 240))", _codeBlock.CodeBlockSharedCssClassName.CODEBLOCK_LINE_NUMBER_GUTTER, "var(--ds-background-neutral, rgb(226, 229, 233))", (0, _editorSharedStyles.overflowShadow)({
70
70
  leftCoverWidth: "var(--ds-space-300, 24px)"
@@ -4,6 +4,7 @@ import _extends from "@babel/runtime/helpers/extends";
4
4
  import React, { Component, useEffect, useLayoutEffect, useRef, useState } from 'react';
5
5
  import memoizeOne from 'memoize-one';
6
6
  import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
7
+ import { fg } from '@atlaskit/platform-feature-flags';
7
8
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
8
9
  import { getExtensionModuleNodePrivateProps, getNodeRenderer } from '../extensions';
9
10
  import { getExtensionRenderer, nodeToJSON, toJSON } from '../utils';
@@ -152,12 +153,12 @@ class ExtensionComponentInner extends Component {
152
153
  references: this.props.references,
153
154
  actions: actions
154
155
  });
155
- } else {
156
- return /*#__PURE__*/React.createElement(NodeRenderer, {
157
- node: node,
158
- references: this.props.references
159
- });
160
156
  }
157
+ return /*#__PURE__*/React.createElement(NodeRenderer, {
158
+ node: node,
159
+ references: this.props.references,
160
+ showUnknownMacroPlaceholder: fg('tinymce_display_unknown_macro_body_content')
161
+ });
161
162
  }
162
163
  }
163
164
  return result;
@@ -0,0 +1,28 @@
1
+ ._11c81a4x{font:var(--ds-font-body-small,9pt)}
2
+ ._11c8fhey{font:var(--ds-font-body,normal 400 14px/20px "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
+ ._19it1tra{border:1px solid var(--ds-background-neutral,#0515240f)}
4
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}
5
+ ._2rko14xi{border-radius:var(--ds-radius-small,4px) var(--ds-radius-small,4px) 0 0}
6
+ ._n7zl1tra{border-bottom:1px solid var(--ds-background-neutral,#0515240f)}
7
+ ._154i1n1a{top:-1px}
8
+ ._18m915vq{overflow-y:hidden}
9
+ ._18u0idpf{margin-left:0}
10
+ ._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
11
+ ._19bvutpp{padding-left:var(--ds-space-150,9pt)}
12
+ ._19pkidpf{margin-top:0}
13
+ ._1nmz1hna{word-break:break-word}
14
+ ._1reo15vq{overflow-x:hidden}
15
+ ._2hwxidpf{margin-right:0}
16
+ ._6z24egat{tab-size:4}
17
+ ._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
18
+ ._bfhkrnwa{background-color:var(--ds-surface-raised,#fffdf6)}
19
+ ._bfhkvuon{background-color:var(--ds-surface,#fff)}
20
+ ._ca0qu2gc{padding-top:var(--ds-space-100,8px)}
21
+ ._ca0qutpp{padding-top:var(--ds-space-150,9pt)}
22
+ ._kqswh2mm{position:relative}
23
+ ._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
24
+ ._n3tdutpp{padding-bottom:var(--ds-space-150,9pt)}
25
+ ._o5721jtm{white-space:pre-wrap}
26
+ ._otyridpf{margin-bottom:0}
27
+ ._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
28
+ ._u5f3utpp{padding-right:var(--ds-space-150,9pt)}
@@ -0,0 +1,46 @@
1
+ /* UnknownMacroPlaceholder.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import "./UnknownMacroPlaceholder.compiled.css";
3
+ import * as React from 'react';
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ import { useIntl } from 'react-intl-next';
6
+ import { messages } from './messages';
7
+ // Unknown macro placeholder styling aligned with Legacy Content Macro (LCM) for consistent look
8
+ const neutralBorder = "var(--ds-background-neutral, #0515240F)";
9
+ const unknownMacroContainerStyles = null;
10
+
11
+ // Match LCM header exactly: lcmHeaderStyles from LegacyContentHeader/index.tsx
12
+ const unknownMacroHeaderStyles = null;
13
+
14
+ // Match LCM content area: white surface, text color inherits
15
+ const unknownMacroBodyStyles = null;
16
+ const unknownMacroPreStyles = null;
17
+ export function UnknownMacroPlaceholder({
18
+ extensionNode
19
+ }) {
20
+ var _extensionNode$parame, _extensionNode$parame2, _extensionNode$parame3, _extensionNode$parame4, _extensionNode$parame5, _extensionNode$parame6, _extensionNode$parame7;
21
+ const intl = useIntl();
22
+ const macroTitle = ((_extensionNode$parame = extensionNode.parameters) === null || _extensionNode$parame === void 0 ? void 0 : (_extensionNode$parame2 = _extensionNode$parame.macroMetadata) === null || _extensionNode$parame2 === void 0 ? void 0 : _extensionNode$parame2.title) || extensionNode.extensionKey;
23
+ const bodyContent = (_extensionNode$parame3 = extensionNode.parameters) === null || _extensionNode$parame3 === void 0 ? void 0 : (_extensionNode$parame4 = _extensionNode$parame3.macroParams) === null || _extensionNode$parame4 === void 0 ? void 0 : (_extensionNode$parame5 = _extensionNode$parame4.__bodyContent) === null || _extensionNode$parame5 === void 0 ? void 0 : _extensionNode$parame5.value;
24
+ const macroParams = (_extensionNode$parame6 = (_extensionNode$parame7 = extensionNode.parameters) === null || _extensionNode$parame7 === void 0 ? void 0 : _extensionNode$parame7.macroParams) !== null && _extensionNode$parame6 !== void 0 ? _extensionNode$parame6 : {};
25
+ const formatParam = (key, param) => {
26
+ var _param$value;
27
+ const value = String((_param$value = param === null || param === void 0 ? void 0 : param.value) !== null && _param$value !== void 0 ? _param$value : '').trim();
28
+ return `${key} = ${value}`;
29
+ };
30
+ const visibleParams = Object.entries(macroParams).filter(([key]) => !key.startsWith('_')).map(([key, param]) => formatParam(key, param)).join(' | ');
31
+ const headerText = visibleParams ? `${intl.formatMessage(messages.unknownMacroHeader, {
32
+ macroTitle
33
+ })} | ${visibleParams}` : intl.formatMessage(messages.unknownMacroHeader, {
34
+ macroTitle
35
+ });
36
+ return /*#__PURE__*/React.createElement("section", {
37
+ "aria-label": intl.formatMessage(messages.unknownMacroPlaceholderAriaLabel),
38
+ className: ax(["_19it1tra _2rko12b0 _1reo15vq _18m915vq _bfhkrnwa"])
39
+ }, /*#__PURE__*/React.createElement("div", {
40
+ className: ax(["_2rko14xi _11c81a4x _n7zl1tra _bfhki8nm _ca0qu2gc _u5f3pxbi _n3td1b66 _19bvpxbi _kqswh2mm _154i1n1a"])
41
+ }, headerText), /*#__PURE__*/React.createElement("div", {
42
+ className: ax(["_19pkidpf _2hwxidpf _otyridpf _18u0idpf _bfhkvuon _ca0qutpp _u5f3utpp _n3tdutpp _19bvutpp"])
43
+ }, /*#__PURE__*/React.createElement("pre", {
44
+ className: ax(["_19pkidpf _2hwxidpf _otyridpf _18u0idpf _11c8fhey _o5721jtm _1nmz1hna _6z24egat"])
45
+ }, bodyContent)));
46
+ }
@@ -1,8 +1,10 @@
1
1
  import React from 'react';
2
2
  import { useIntl } from 'react-intl-next';
3
3
  import Loadable from 'react-loadable';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
4
5
  import { getExtensionKeyAndNodeKey, resolveImport, resolveImportSync } from './manifest-helpers';
5
6
  import { messages } from './messages';
7
+ import { UnknownMacroPlaceholder } from './UnknownMacroPlaceholder';
6
8
  function getNodeFromManifest(
7
9
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
10
  manifest, extKey, nodeKey, extensionType, extensionKey) {
@@ -52,11 +54,21 @@ export async function getExtensionModuleNodePrivateProps(extensionProvider, exte
52
54
  return acc;
53
55
  }, {});
54
56
  }
57
+ function isUnknownConfluenceMacroWithBody(extensionNode) {
58
+ var _extensionNode$parame, _extensionNode$parame2, _extensionNode$parame3;
59
+ return extensionNode !== null && extensionNode.type === 'extension' && extensionNode.extensionType === 'com.atlassian.confluence.macro.core' && !!((_extensionNode$parame = extensionNode.parameters) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame2 = _extensionNode$parame.macroParams) !== null && _extensionNode$parame2 !== void 0 && (_extensionNode$parame3 = _extensionNode$parame2.__bodyContent) !== null && _extensionNode$parame3 !== void 0 && _extensionNode$parame3.value);
60
+ }
55
61
  function ExtensionLoading(props) {
56
62
  const intl = useIntl();
63
+ const extensionNode = props.node;
57
64
  if (props.error || props.timedOut) {
58
65
  // eslint-disable-next-line no-console
59
66
  console.error('Error rendering extension', props.error);
67
+ if (props.error && props.showUnknownMacroPlaceholder && extensionNode && isUnknownConfluenceMacroWithBody(extensionNode) && fg('tinymce_display_unknown_macro_body_content')) {
68
+ return /*#__PURE__*/React.createElement(UnknownMacroPlaceholder, {
69
+ extensionNode: extensionNode
70
+ });
71
+ }
60
72
  return /*#__PURE__*/React.createElement("div", null, intl.formatMessage(messages.extensionLoadingError));
61
73
  } else {
62
74
  return null;
@@ -78,6 +90,10 @@ export function getNodeRenderer(extensionProvider, extensionType, extensionKey)
78
90
  resolveImportSync(preloaded) : resolveImport(maybePromise.render());
79
91
  }
80
92
  },
93
+ // react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
94
+ // but its TypeScript types only expect LoadingComponentProps. We cast here because
95
+ // ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
96
+ // react-loadable will pass through but doesn't know about in its type definitions.
81
97
  loading: ExtensionLoading
82
98
  });
83
99
  }
@@ -44,6 +44,16 @@ export const messages = defineMessages({
44
44
  id: 'fabric.editor.extension.loading-error',
45
45
  defaultMessage: 'Error loading the extension!',
46
46
  description: 'Error message displayed when an extension fails to load in the editor. Indicates a problem occurred during the extension initialization or rendering process.'
47
+ },
48
+ unknownMacroPlaceholderAriaLabel: {
49
+ id: 'fabric.editor.extension.unknownMacroPlaceholderAriaLabel',
50
+ defaultMessage: 'Unknown macro placeholder',
51
+ description: 'Accessible label for the unknown macro fallback block shown when a Confluence macro cannot be resolved.'
52
+ },
53
+ unknownMacroHeader: {
54
+ id: 'fabric.editor.extension.unknownMacroHeader',
55
+ defaultMessage: "Unknown macro: ''{macroTitle}''",
56
+ description: 'Header text for an unresolved Confluence macro placeholder.'
47
57
  }
48
58
  });
49
59
  export const configPanelMessages = defineMessages({
@@ -133,7 +133,7 @@ const tableSharedStyle = () => {
133
133
  ${fg('platform_editor_bordered_panel_nested_in_table') ? `.${TableSharedCssClassName.TABLE_NODE_WRAPPER} .ak-editor-panel {
134
134
  border: ${"var(--ds-border-width, 1px)"} solid ${"var(--ds-border, #d9dbea)"};
135
135
  }` : ''}
136
-
136
+
137
137
  /* avoid applying styles to nested tables (possible via extensions) */
138
138
  .${TableSharedCssClassName.TABLE_CONTAINER} > table,
139
139
  .${TableSharedCssClassName.TABLE_NODE_WRAPPER} > table,
@@ -16,6 +16,7 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
16
16
  import React, { Component, useEffect, useLayoutEffect, useRef, useState } from 'react';
17
17
  import memoizeOne from 'memoize-one';
18
18
  import { NodeSelection } from '@atlaskit/editor-prosemirror/state';
19
+ import { fg } from '@atlaskit/platform-feature-flags';
19
20
  import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
20
21
  import { getExtensionModuleNodePrivateProps, getNodeRenderer } from '../extensions';
21
22
  import { getExtensionRenderer, nodeToJSON, toJSON } from '../utils';
@@ -187,12 +188,12 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
187
188
  references: _this.props.references,
188
189
  actions: actions
189
190
  });
190
- } else {
191
- return /*#__PURE__*/React.createElement(NodeRenderer, {
192
- node: node,
193
- references: _this.props.references
194
- });
195
191
  }
192
+ return /*#__PURE__*/React.createElement(NodeRenderer, {
193
+ node: node,
194
+ references: _this.props.references,
195
+ showUnknownMacroPlaceholder: fg('tinymce_display_unknown_macro_body_content')
196
+ });
196
197
  }
197
198
  }
198
199
  return result;
@@ -0,0 +1,28 @@
1
+ ._11c81a4x{font:var(--ds-font-body-small,9pt)}
2
+ ._11c8fhey{font:var(--ds-font-body,normal 400 14px/20px "Atlassian Sans",ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Ubuntu,"Helvetica Neue",sans-serif)}
3
+ ._19it7tl1{border:var(--_98ihdp)}
4
+ ._2rko12b0{border-radius:var(--ds-radius-small,4px)}
5
+ ._2rko14xi{border-radius:var(--ds-radius-small,4px) var(--ds-radius-small,4px) 0 0}
6
+ ._n7zl7tl1{border-bottom:var(--_98ihdp)}
7
+ ._154i1n1a{top:-1px}
8
+ ._18m915vq{overflow-y:hidden}
9
+ ._18u0idpf{margin-left:0}
10
+ ._19bvpxbi{padding-left:var(--ds-space-200,1pc)}
11
+ ._19bvutpp{padding-left:var(--ds-space-150,9pt)}
12
+ ._19pkidpf{margin-top:0}
13
+ ._1nmz1hna{word-break:break-word}
14
+ ._1reo15vq{overflow-x:hidden}
15
+ ._2hwxidpf{margin-right:0}
16
+ ._6z24egat{tab-size:4}
17
+ ._bfhki8nm{background-color:var(--ds-background-neutral,#0515240f)}
18
+ ._bfhkrnwa{background-color:var(--ds-surface-raised,#fffdf6)}
19
+ ._bfhkvuon{background-color:var(--ds-surface,#fff)}
20
+ ._ca0qu2gc{padding-top:var(--ds-space-100,8px)}
21
+ ._ca0qutpp{padding-top:var(--ds-space-150,9pt)}
22
+ ._kqswh2mm{position:relative}
23
+ ._n3td1b66{padding-bottom:var(--ds-space-050,4px)}
24
+ ._n3tdutpp{padding-bottom:var(--ds-space-150,9pt)}
25
+ ._o5721jtm{white-space:pre-wrap}
26
+ ._otyridpf{margin-bottom:0}
27
+ ._u5f3pxbi{padding-right:var(--ds-space-200,1pc)}
28
+ ._u5f3utpp{padding-right:var(--ds-space-150,9pt)}
@@ -0,0 +1,61 @@
1
+ /* UnknownMacroPlaceholder.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import "./UnknownMacroPlaceholder.compiled.css";
4
+ import * as React from 'react';
5
+ import { ax, ix } from "@compiled/react/runtime";
6
+ import { useIntl } from 'react-intl-next';
7
+ import { messages } from './messages';
8
+ // Unknown macro placeholder styling aligned with Legacy Content Macro (LCM) for consistent look
9
+ var neutralBorder = "var(--ds-background-neutral, #0515240F)";
10
+ var unknownMacroContainerStyles = null;
11
+
12
+ // Match LCM header exactly: lcmHeaderStyles from LegacyContentHeader/index.tsx
13
+ var unknownMacroHeaderStyles = null;
14
+
15
+ // Match LCM content area: white surface, text color inherits
16
+ var unknownMacroBodyStyles = null;
17
+ var unknownMacroPreStyles = null;
18
+ export function UnknownMacroPlaceholder(_ref) {
19
+ var _extensionNode$parame, _extensionNode$parame2, _extensionNode$parame3, _extensionNode$parame4;
20
+ var extensionNode = _ref.extensionNode;
21
+ var intl = useIntl();
22
+ var macroTitle = ((_extensionNode$parame = extensionNode.parameters) === null || _extensionNode$parame === void 0 || (_extensionNode$parame = _extensionNode$parame.macroMetadata) === null || _extensionNode$parame === void 0 ? void 0 : _extensionNode$parame.title) || extensionNode.extensionKey;
23
+ var bodyContent = (_extensionNode$parame2 = extensionNode.parameters) === null || _extensionNode$parame2 === void 0 || (_extensionNode$parame2 = _extensionNode$parame2.macroParams) === null || _extensionNode$parame2 === void 0 || (_extensionNode$parame2 = _extensionNode$parame2.__bodyContent) === null || _extensionNode$parame2 === void 0 ? void 0 : _extensionNode$parame2.value;
24
+ var macroParams = (_extensionNode$parame3 = (_extensionNode$parame4 = extensionNode.parameters) === null || _extensionNode$parame4 === void 0 ? void 0 : _extensionNode$parame4.macroParams) !== null && _extensionNode$parame3 !== void 0 ? _extensionNode$parame3 : {};
25
+ var formatParam = function formatParam(key, param) {
26
+ var _param$value;
27
+ var value = String((_param$value = param === null || param === void 0 ? void 0 : param.value) !== null && _param$value !== void 0 ? _param$value : '').trim();
28
+ return "".concat(key, " = ").concat(value);
29
+ };
30
+ var visibleParams = Object.entries(macroParams).filter(function (_ref2) {
31
+ var _ref3 = _slicedToArray(_ref2, 1),
32
+ key = _ref3[0];
33
+ return !key.startsWith('_');
34
+ }).map(function (_ref4) {
35
+ var _ref5 = _slicedToArray(_ref4, 2),
36
+ key = _ref5[0],
37
+ param = _ref5[1];
38
+ return formatParam(key, param);
39
+ }).join(' | ');
40
+ var headerText = visibleParams ? "".concat(intl.formatMessage(messages.unknownMacroHeader, {
41
+ macroTitle: macroTitle
42
+ }), " | ").concat(visibleParams) : intl.formatMessage(messages.unknownMacroHeader, {
43
+ macroTitle: macroTitle
44
+ });
45
+ return /*#__PURE__*/React.createElement("section", {
46
+ "aria-label": intl.formatMessage(messages.unknownMacroPlaceholderAriaLabel),
47
+ className: ax(["_19it7tl1 _2rko12b0 _1reo15vq _18m915vq _bfhkrnwa"]),
48
+ style: {
49
+ "--_98ihdp": ix("1px solid ".concat(neutralBorder))
50
+ }
51
+ }, /*#__PURE__*/React.createElement("div", {
52
+ className: ax(["_2rko14xi _11c81a4x _n7zl7tl1 _bfhki8nm _ca0qu2gc _u5f3pxbi _n3td1b66 _19bvpxbi _kqswh2mm _154i1n1a"]),
53
+ style: {
54
+ "--_98ihdp": ix("1px solid ".concat(neutralBorder))
55
+ }
56
+ }, headerText), /*#__PURE__*/React.createElement("div", {
57
+ className: ax(["_19pkidpf _2hwxidpf _otyridpf _18u0idpf _bfhkvuon _ca0qutpp _u5f3utpp _n3tdutpp _19bvutpp"])
58
+ }, /*#__PURE__*/React.createElement("pre", {
59
+ className: ax(["_19pkidpf _2hwxidpf _otyridpf _18u0idpf _11c8fhey _o5721jtm _1nmz1hna _6z24egat"])
60
+ }, bodyContent)));
61
+ }
@@ -4,8 +4,10 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  import React from 'react';
5
5
  import { useIntl } from 'react-intl-next';
6
6
  import Loadable from 'react-loadable';
7
+ import { fg } from '@atlaskit/platform-feature-flags';
7
8
  import { getExtensionKeyAndNodeKey, resolveImport, resolveImportSync } from './manifest-helpers';
8
9
  import { messages } from './messages';
10
+ import { UnknownMacroPlaceholder } from './UnknownMacroPlaceholder';
9
11
  function getNodeFromManifest(
10
12
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
13
  manifest, extKey, nodeKey, extensionType, extensionKey) {
@@ -100,11 +102,21 @@ function _getExtensionModuleNodePrivateProps() {
100
102
  }));
101
103
  return _getExtensionModuleNodePrivateProps.apply(this, arguments);
102
104
  }
105
+ function isUnknownConfluenceMacroWithBody(extensionNode) {
106
+ var _extensionNode$parame;
107
+ return extensionNode !== null && extensionNode.type === 'extension' && extensionNode.extensionType === 'com.atlassian.confluence.macro.core' && !!((_extensionNode$parame = extensionNode.parameters) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.macroParams) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.__bodyContent) !== null && _extensionNode$parame !== void 0 && _extensionNode$parame.value);
108
+ }
103
109
  function ExtensionLoading(props) {
104
110
  var intl = useIntl();
111
+ var extensionNode = props.node;
105
112
  if (props.error || props.timedOut) {
106
113
  // eslint-disable-next-line no-console
107
114
  console.error('Error rendering extension', props.error);
115
+ if (props.error && props.showUnknownMacroPlaceholder && extensionNode && isUnknownConfluenceMacroWithBody(extensionNode) && fg('tinymce_display_unknown_macro_body_content')) {
116
+ return /*#__PURE__*/React.createElement(UnknownMacroPlaceholder, {
117
+ extensionNode: extensionNode
118
+ });
119
+ }
108
120
  return /*#__PURE__*/React.createElement("div", null, intl.formatMessage(messages.extensionLoadingError));
109
121
  } else {
110
122
  return null;
@@ -128,6 +140,10 @@ export function getNodeRenderer(extensionProvider, extensionType, extensionKey)
128
140
  resolveImportSync(preloaded) : resolveImport(maybePromise.render());
129
141
  }
130
142
  },
143
+ // react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
144
+ // but its TypeScript types only expect LoadingComponentProps. We cast here because
145
+ // ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
146
+ // react-loadable will pass through but doesn't know about in its type definitions.
131
147
  loading: ExtensionLoading
132
148
  });
133
149
  }
@@ -44,6 +44,16 @@ export var messages = defineMessages({
44
44
  id: 'fabric.editor.extension.loading-error',
45
45
  defaultMessage: 'Error loading the extension!',
46
46
  description: 'Error message displayed when an extension fails to load in the editor. Indicates a problem occurred during the extension initialization or rendering process.'
47
+ },
48
+ unknownMacroPlaceholderAriaLabel: {
49
+ id: 'fabric.editor.extension.unknownMacroPlaceholderAriaLabel',
50
+ defaultMessage: 'Unknown macro placeholder',
51
+ description: 'Accessible label for the unknown macro fallback block shown when a Confluence macro cannot be resolved.'
52
+ },
53
+ unknownMacroHeader: {
54
+ id: 'fabric.editor.extension.unknownMacroHeader',
55
+ defaultMessage: "Unknown macro: ''{macroTitle}''",
56
+ description: 'Header text for an unresolved Confluence macro placeholder.'
47
57
  }
48
58
  });
49
59
  export var configPanelMessages = defineMessages({
@@ -58,7 +58,7 @@ var firstNodeWithNotMarginTop = function firstNodeWithNotMarginTop() {
58
58
  var tableSharedStyle = function tableSharedStyle() {
59
59
  var browser = expValEquals('platform_editor_hydratable_ui', 'isEnabled', true) ? getBrowserInfo() : browserLegacy;
60
60
  // eslint-disable-next-line @atlaskit/design-system/no-css-tagged-template-expression -- Appears safe to auto-fix, but leaving it up to the team to remediate as the readability only gets worse with autofixing
61
- return css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n\t\t", "\n\t\t.", " {\n\t\t\tposition: relative;\n\t\t\tmargin: 0 auto ", ";\n\t\t\tbox-sizing: border-box;\n\n\t\t\t/**\n * Fix block top alignment inside table cells.\n */\n\t\t\t.decisionItemView-content-wrap:first-of-type > div {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t\t.", ",\n\t\t\t\t.", " {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 1px;\n\t\t\t\theight: calc(100% - ", ");\n\t\t\t\tbackground: ", ";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: ", ";\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tright: 0;\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t\t.", "[data-with-numbered-table='true'] {\n\t\t\t\tleft: ", "px;\n\t\t\t}\n\t\t}\n\t\t.", "[data-number-column='true'] {\n\t\t\tpadding-left: ", "px;\n\t\t\tclear: both;\n\t\t}\n\n\t\t.", " {\n\t\t\twill-change: width, margin-left;\n\t\t}\n\n\t\t.", " table {\n\t\t\twill-change: width;\n\t\t}\n\n\t\t.", " > table {\n\t\t\tmargin: ", " 0 0 0;\n\t\t}\n\n\t\t.", " > table,\n\t\t.", " > table {\n\t\t\tmargin: ", " ", " 0 0;\n\t\t}\n\n\t\t/* support panel nested in table */\n\t\t", "\n\t\t\t\n\t\t/* avoid applying styles to nested tables (possible via extensions) */\n\t.", " > table,\n\t.", " > table,\n\t.", " > table {\n\t\t\tborder-collapse: collapse;\n\t\t\tborder: ", "px solid\n\t\t\t\t", ";\n\t\t\tborder-left-color: transparent;\n\t\t\tborder-right-color: transparent;\n\t\t\ttable-layout: fixed;\n\t\t\tfont-size: 1em;\n\t\t\twidth: 100%;\n\n\t\t\t&[data-autosize='true'] {\n\t\t\t\ttable-layout: auto;\n\t\t\t}\n\n\t\t\t& {\n\t\t\t\t* {\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t}\n\t\t\t\thr {\n\t\t\t\t\tbox-sizing: content-box;\n\t\t\t\t}\n\n\t\t\t\ttbody {\n\t\t\t\t\tborder-bottom: none;\n\t\t\t\t}\n\t\t\t\tth td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\t> tbody > tr > th,\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tmin-width: ", "px;\n\t\t\t\t\tfont-weight: ", ";\n\t\t\t\t\tvertical-align: top;\n\t\t\t\t\tborder: 1px solid ", ";\n\t\t\t\t\tborder-right-width: 0;\n\t\t\t\t\tborder-bottom-width: 0;\n\n\t\t\t\t\tpadding: ", ";\n\t\t\t\t\t/* https://stackoverflow.com/questions/7517127/borders-not-shown-in-firefox-with-border-collapse-on-table-position-relative-o */\n\t\t\t\t\t", "\n\n\t\t\t\t\t", "\n\n\t\t\t\tth p:not(:first-of-type),\n\t\t\t\ttd p:not(:first-of-type) {\n\t\t\t\t\t\tmargin-top: ", ";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Ensures nested tables are compatible with parent table background color - uses specificity to ensure tables nested by extensions are not affected */\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\tth {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\ttext-align: left;\n\n\t\t\t\t\t/* only apply this styling to codeblocks in default background headercells */\n\t\t\t\t\t/* TODO this needs to be overhauled as it relies on unsafe selectors */\n\t\t\t\t\t", " {\n\t\t\t\t\t\t.", ":not(.danger) {\n\t\t\t\t\t\t\tbackground-color: ", ";\n\n\t\t\t\t\t\t\t:not(.", ") {\n\t\t\t\t\t\t\t\tbox-shadow: 0px 0px 0px 1px ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-image: ", ";\n\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/* this is only relevant to the element taken care of by renderer */\n\t\t\t\t\t\t\t> [data-ds--code--code-block] {\n\t\t\t\t\t\t\t\tbackground-image: ", "!important;\n\n\t\t\t\t\t\t\t\tbackground-color: ", "!important;\n\n\t\t\t\t\t\t\t\t/* selector lives inside @atlaskit/code */\n\t\t\t\t\t\t\t\t--ds--code--line-number-bg-color: ", ";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"])), tableCellBackgroundStyleOverride(), TableSharedCssClassName.TABLE_CONTAINER, "var(--ds-space-200, 16px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, "var(--ds-space-300, 24px)", "var(--ds-background-accent-gray-subtler, ".concat(akEditorTableBorder, ")"), "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_CONTAINER, akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, "var(--ds-space-300, 24px)", "var(--ds-space-100, 8px)", fg('platform_editor_bordered_panel_nested_in_table') ? ".".concat(TableSharedCssClassName.TABLE_NODE_WRAPPER, " .ak-editor-panel {\n\t\t\tborder: ", "var(--ds-border-width, 1px)", " solid ", "var(--ds-border, #d9dbea)", ";\n\t\t}") : '', TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, tableCellBorderWidth, "var(--ds-background-accent-gray-subtler, ".concat(akEditorTableBorder, ")"), "var(--ds-background-neutral-subtle, white)", tableCellMinWidth, "var(--ds-font-weight-regular, 400)", "var(--ds-background-accent-gray-subtler, ".concat(akEditorTableBorder, ")"), "var(--ds-space-100, 8px)", browser.gecko || browser.ie || browser.mac && browser.chrome ? 'background-clip: padding-box;' : '', firstNodeWithNotMarginTop(), "var(--ds-space-150, 12px)", "var(--ds-surface, #FFFFFF)", "var(--ds-background-accent-gray-subtlest, ".concat(akEditorTableToolbar, ")"), expValEquals('platform_editor_native_anchor_with_dnd', 'isEnabled', true) ? '&:not(.danger)' : '&:not([style]):not(.danger)', CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER, "var(--ds-surface-raised, rgb(235, 237, 240))", akEditorSelectedNodeClassName, "var(--ds-border, transparent)", CodeBlockSharedCssClassName.CODEBLOCK_CONTENT_WRAPPER, overflowShadow({
61
+ return css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n\t\t", "\n\t\t.", " {\n\t\t\tposition: relative;\n\t\t\tmargin: 0 auto ", ";\n\t\t\tbox-sizing: border-box;\n\n\t\t\t/**\n * Fix block top alignment inside table cells.\n */\n\t\t\t.decisionItemView-content-wrap:first-of-type > div {\n\t\t\t\tmargin-top: 0;\n\t\t\t}\n\t\t\t.", ",\n\t\t\t\t.", " {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 1px;\n\t\t\t\theight: calc(100% - ", ");\n\t\t\t\tbackground: ", ";\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: ", ";\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tright: 0;\n\t\t\t}\n\t\t\t.", " {\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t\t.", "[data-with-numbered-table='true'] {\n\t\t\t\tleft: ", "px;\n\t\t\t}\n\t\t}\n\t\t.", "[data-number-column='true'] {\n\t\t\tpadding-left: ", "px;\n\t\t\tclear: both;\n\t\t}\n\n\t\t.", " {\n\t\t\twill-change: width, margin-left;\n\t\t}\n\n\t\t.", " table {\n\t\t\twill-change: width;\n\t\t}\n\n\t\t.", " > table {\n\t\t\tmargin: ", " 0 0 0;\n\t\t}\n\n\t\t.", " > table,\n\t\t.", " > table {\n\t\t\tmargin: ", " ", " 0 0;\n\t\t}\n\n\t\t/* support panel nested in table */\n\t\t", "\n\n\t\t/* avoid applying styles to nested tables (possible via extensions) */\n\t.", " > table,\n\t.", " > table,\n\t.", " > table {\n\t\t\tborder-collapse: collapse;\n\t\t\tborder: ", "px solid\n\t\t\t\t", ";\n\t\t\tborder-left-color: transparent;\n\t\t\tborder-right-color: transparent;\n\t\t\ttable-layout: fixed;\n\t\t\tfont-size: 1em;\n\t\t\twidth: 100%;\n\n\t\t\t&[data-autosize='true'] {\n\t\t\t\ttable-layout: auto;\n\t\t\t}\n\n\t\t\t& {\n\t\t\t\t* {\n\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t}\n\t\t\t\thr {\n\t\t\t\t\tbox-sizing: content-box;\n\t\t\t\t}\n\n\t\t\t\ttbody {\n\t\t\t\t\tborder-bottom: none;\n\t\t\t\t}\n\t\t\t\tth td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\t> tbody > tr > th,\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tmin-width: ", "px;\n\t\t\t\t\tfont-weight: ", ";\n\t\t\t\t\tvertical-align: top;\n\t\t\t\t\tborder: 1px solid ", ";\n\t\t\t\t\tborder-right-width: 0;\n\t\t\t\t\tborder-bottom-width: 0;\n\n\t\t\t\t\tpadding: ", ";\n\t\t\t\t\t/* https://stackoverflow.com/questions/7517127/borders-not-shown-in-firefox-with-border-collapse-on-table-position-relative-o */\n\t\t\t\t\t", "\n\n\t\t\t\t\t", "\n\n\t\t\t\tth p:not(:first-of-type),\n\t\t\t\ttd p:not(:first-of-type) {\n\t\t\t\t\t\tmargin-top: ", ";\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Ensures nested tables are compatible with parent table background color - uses specificity to ensure tables nested by extensions are not affected */\n\t\t\t\t> tbody > tr > td {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t}\n\n\t\t\t\tth {\n\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\ttext-align: left;\n\n\t\t\t\t\t/* only apply this styling to codeblocks in default background headercells */\n\t\t\t\t\t/* TODO this needs to be overhauled as it relies on unsafe selectors */\n\t\t\t\t\t", " {\n\t\t\t\t\t\t.", ":not(.danger) {\n\t\t\t\t\t\t\tbackground-color: ", ";\n\n\t\t\t\t\t\t\t:not(.", ") {\n\t\t\t\t\t\t\t\tbox-shadow: 0px 0px 0px 1px ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-image: ", ";\n\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t.", " {\n\t\t\t\t\t\t\t\tbackground-color: ", ";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/* this is only relevant to the element taken care of by renderer */\n\t\t\t\t\t\t\t> [data-ds--code--code-block] {\n\t\t\t\t\t\t\t\tbackground-image: ", "!important;\n\n\t\t\t\t\t\t\t\tbackground-color: ", "!important;\n\n\t\t\t\t\t\t\t\t/* selector lives inside @atlaskit/code */\n\t\t\t\t\t\t\t\t--ds--code--line-number-bg-color: ", ";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t"])), tableCellBackgroundStyleOverride(), TableSharedCssClassName.TABLE_CONTAINER, "var(--ds-space-200, 16px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, "var(--ds-space-300, 24px)", "var(--ds-background-accent-gray-subtler, ".concat(akEditorTableBorder, ")"), "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_RIGHT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, TableSharedCssClassName.TABLE_LEFT_BORDER, akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_CONTAINER, akEditorTableNumberColumnWidth - 1, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_RESIZER_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, "var(--ds-space-300, 24px)", TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, "var(--ds-space-300, 24px)", "var(--ds-space-100, 8px)", fg('platform_editor_bordered_panel_nested_in_table') ? ".".concat(TableSharedCssClassName.TABLE_NODE_WRAPPER, " .ak-editor-panel {\n\t\t\tborder: ", "var(--ds-border-width, 1px)", " solid ", "var(--ds-border, #d9dbea)", ";\n\t\t}") : '', TableSharedCssClassName.TABLE_CONTAINER, TableSharedCssClassName.TABLE_NODE_WRAPPER, TableSharedCssClassName.TABLE_STICKY_WRAPPER, tableCellBorderWidth, "var(--ds-background-accent-gray-subtler, ".concat(akEditorTableBorder, ")"), "var(--ds-background-neutral-subtle, white)", tableCellMinWidth, "var(--ds-font-weight-regular, 400)", "var(--ds-background-accent-gray-subtler, ".concat(akEditorTableBorder, ")"), "var(--ds-space-100, 8px)", browser.gecko || browser.ie || browser.mac && browser.chrome ? 'background-clip: padding-box;' : '', firstNodeWithNotMarginTop(), "var(--ds-space-150, 12px)", "var(--ds-surface, #FFFFFF)", "var(--ds-background-accent-gray-subtlest, ".concat(akEditorTableToolbar, ")"), expValEquals('platform_editor_native_anchor_with_dnd', 'isEnabled', true) ? '&:not(.danger)' : '&:not([style]):not(.danger)', CodeBlockSharedCssClassName.CODEBLOCK_CONTAINER, "var(--ds-surface-raised, rgb(235, 237, 240))", akEditorSelectedNodeClassName, "var(--ds-border, transparent)", CodeBlockSharedCssClassName.CODEBLOCK_CONTENT_WRAPPER, overflowShadow({
62
62
  leftCoverWidth: "var(--ds-space-300, 24px)"
63
63
  }), "var(--ds-background-neutral, rgb(235, 237, 240))", CodeBlockSharedCssClassName.CODEBLOCK_LINE_NUMBER_GUTTER, "var(--ds-background-neutral, rgb(226, 229, 233))", overflowShadow({
64
64
  leftCoverWidth: "var(--ds-space-300, 24px)"
@@ -44,8 +44,8 @@ export type ExperienceCheckDomMutationConfig = {
44
44
  * !!IMPORTANT!!
45
45
  * Return null if the target element cannot be found.
46
46
  * This will immediately fail the experience with experienceFailureReason 'domMutationTargetNotFound'.
47
- */
48
- observeConfig: () => (ExperienceCheckDomMutationObserveConfig | ExperienceCheckDomMutationObserveConfig[] | null);
47
+ */
48
+ observeConfig: () => ExperienceCheckDomMutationObserveConfig | ExperienceCheckDomMutationObserveConfig[] | null;
49
49
  /**
50
50
  * Callback invoked when DOM mutations are detected
51
51
  *
@@ -0,0 +1,7 @@
1
+ import type { ExtensionParams } from './types/extension-handler';
2
+ import type { Parameters } from './types/extension-parameters';
3
+ interface UnknownMacroPlaceholderProps {
4
+ extensionNode: ExtensionParams<Parameters>;
5
+ }
6
+ export declare function UnknownMacroPlaceholder({ extensionNode }: UnknownMacroPlaceholderProps): JSX.Element;
7
+ export {};
@@ -17,4 +17,5 @@ export declare function getNodeRenderer<T extends Parameters>(extensionProvider:
17
17
  actions?: MultiBodiedExtensionActions;
18
18
  node: ExtensionParams<T>;
19
19
  references?: ReferenceEntity[];
20
+ showUnknownMacroPlaceholder?: boolean;
20
21
  }> & Loadable.LoadableComponent;
@@ -44,6 +44,16 @@ export declare const messages: {
44
44
  defaultMessage: string;
45
45
  description: string;
46
46
  };
47
+ unknownMacroPlaceholderAriaLabel: {
48
+ id: string;
49
+ defaultMessage: string;
50
+ description: string;
51
+ };
52
+ unknownMacroHeader: {
53
+ id: string;
54
+ defaultMessage: string;
55
+ description: string;
56
+ };
47
57
  };
48
58
  export declare const configPanelMessages: {
49
59
  configFailedToLoad: {
@@ -44,8 +44,8 @@ export type ExperienceCheckDomMutationConfig = {
44
44
  * !!IMPORTANT!!
45
45
  * Return null if the target element cannot be found.
46
46
  * This will immediately fail the experience with experienceFailureReason 'domMutationTargetNotFound'.
47
- */
48
- observeConfig: () => (ExperienceCheckDomMutationObserveConfig | ExperienceCheckDomMutationObserveConfig[] | null);
47
+ */
48
+ observeConfig: () => ExperienceCheckDomMutationObserveConfig | ExperienceCheckDomMutationObserveConfig[] | null;
49
49
  /**
50
50
  * Callback invoked when DOM mutations are detected
51
51
  *
@@ -0,0 +1,7 @@
1
+ import type { ExtensionParams } from './types/extension-handler';
2
+ import type { Parameters } from './types/extension-parameters';
3
+ interface UnknownMacroPlaceholderProps {
4
+ extensionNode: ExtensionParams<Parameters>;
5
+ }
6
+ export declare function UnknownMacroPlaceholder({ extensionNode }: UnknownMacroPlaceholderProps): JSX.Element;
7
+ export {};
@@ -17,4 +17,5 @@ export declare function getNodeRenderer<T extends Parameters>(extensionProvider:
17
17
  actions?: MultiBodiedExtensionActions;
18
18
  node: ExtensionParams<T>;
19
19
  references?: ReferenceEntity[];
20
+ showUnknownMacroPlaceholder?: boolean;
20
21
  }> & Loadable.LoadableComponent;
@@ -44,6 +44,16 @@ export declare const messages: {
44
44
  defaultMessage: string;
45
45
  description: string;
46
46
  };
47
+ unknownMacroPlaceholderAriaLabel: {
48
+ id: string;
49
+ defaultMessage: string;
50
+ description: string;
51
+ };
52
+ unknownMacroHeader: {
53
+ id: string;
54
+ defaultMessage: string;
55
+ description: string;
56
+ };
47
57
  };
48
58
  export declare const configPanelMessages: {
49
59
  configFailedToLoad: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-common",
3
- "version": "111.35.0",
3
+ "version": "111.35.1",
4
4
  "description": "A package that contains common classes and components for editor and renderer",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -42,7 +42,7 @@
42
42
  "@atlaskit/codemod-utils": "^4.2.0",
43
43
  "@atlaskit/css": "^0.19.0",
44
44
  "@atlaskit/custom-steps": "^0.16.0",
45
- "@atlaskit/dropdown-menu": "^16.5.0",
45
+ "@atlaskit/dropdown-menu": "^16.6.0",
46
46
  "@atlaskit/editor-json-transformer": "^8.31.0",
47
47
  "@atlaskit/editor-palette": "^2.1.0",
48
48
  "@atlaskit/editor-prosemirror": "^7.3.0",
@@ -54,7 +54,7 @@
54
54
  "@atlaskit/icon": "^32.0.0",
55
55
  "@atlaskit/icon-object": "^7.4.0",
56
56
  "@atlaskit/link": "^3.3.0",
57
- "@atlaskit/link-datasource": "^4.33.0",
57
+ "@atlaskit/link-datasource": "^4.34.0",
58
58
  "@atlaskit/link-picker": "^4.2.0",
59
59
  "@atlaskit/media-card": "^79.15.0",
60
60
  "@atlaskit/media-client": "^36.0.0",
@@ -276,6 +276,9 @@
276
276
  },
277
277
  "jim-lower-ranking-in-jira-macro-search": {
278
278
  "type": "boolean"
279
+ },
280
+ "tinymce_display_unknown_macro_body_content": {
281
+ "type": "boolean"
279
282
  }
280
283
  }
281
284
  }