@atlaskit/editor-common 95.5.0 → 95.6.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 (44) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/element-browser/components/ElementList/ElementList.js +14 -14
  3. package/dist/cjs/extensibility/Extension/Extension/index.js +8 -3
  4. package/dist/cjs/extensibility/Extension/Extension/styles.js +4 -0
  5. package/dist/cjs/extensibility/Extension/Lozenge/EditToggle.js +41 -14
  6. package/dist/cjs/extensibility/Extension/Lozenge/ExtensionLabel.js +16 -7
  7. package/dist/cjs/extensibility/Extension/Lozenge/LozengeComponent.js +8 -3
  8. package/dist/cjs/extensibility/Extension/Lozenge/index.js +6 -2
  9. package/dist/cjs/extensibility/ExtensionComponent.js +93 -32
  10. package/dist/cjs/monitoring/error.js +1 -1
  11. package/dist/cjs/ui/DropList/index.js +1 -1
  12. package/dist/es2019/element-browser/components/ElementList/ElementList.js +14 -14
  13. package/dist/es2019/extensibility/Extension/Extension/index.js +8 -3
  14. package/dist/es2019/extensibility/Extension/Extension/styles.js +4 -0
  15. package/dist/es2019/extensibility/Extension/Lozenge/EditToggle.js +35 -7
  16. package/dist/es2019/extensibility/Extension/Lozenge/ExtensionLabel.js +15 -6
  17. package/dist/es2019/extensibility/Extension/Lozenge/LozengeComponent.js +8 -3
  18. package/dist/es2019/extensibility/Extension/Lozenge/index.js +6 -2
  19. package/dist/es2019/extensibility/ExtensionComponent.js +68 -9
  20. package/dist/es2019/monitoring/error.js +1 -1
  21. package/dist/es2019/ui/DropList/index.js +1 -1
  22. package/dist/esm/element-browser/components/ElementList/ElementList.js +14 -14
  23. package/dist/esm/extensibility/Extension/Extension/index.js +8 -3
  24. package/dist/esm/extensibility/Extension/Extension/styles.js +4 -0
  25. package/dist/esm/extensibility/Extension/Lozenge/EditToggle.js +35 -7
  26. package/dist/esm/extensibility/Extension/Lozenge/ExtensionLabel.js +15 -6
  27. package/dist/esm/extensibility/Extension/Lozenge/LozengeComponent.js +8 -3
  28. package/dist/esm/extensibility/Extension/Lozenge/index.js +6 -2
  29. package/dist/esm/extensibility/ExtensionComponent.js +91 -32
  30. package/dist/esm/monitoring/error.js +1 -1
  31. package/dist/esm/ui/DropList/index.js +1 -1
  32. package/dist/types/extensibility/Extension/Extension/index.d.ts +2 -0
  33. package/dist/types/extensibility/Extension/Lozenge/EditToggle.d.ts +3 -1
  34. package/dist/types/extensibility/Extension/Lozenge/ExtensionLabel.d.ts +3 -1
  35. package/dist/types/extensibility/Extension/Lozenge/LozengeComponent.d.ts +3 -1
  36. package/dist/types/extensibility/Extension/Lozenge/index.d.ts +2 -0
  37. package/dist/types/extensibility/ExtensionComponent.d.ts +5 -1
  38. package/dist/types-ts4.5/extensibility/Extension/Extension/index.d.ts +2 -0
  39. package/dist/types-ts4.5/extensibility/Extension/Lozenge/EditToggle.d.ts +3 -1
  40. package/dist/types-ts4.5/extensibility/Extension/Lozenge/ExtensionLabel.d.ts +3 -1
  41. package/dist/types-ts4.5/extensibility/Extension/Lozenge/LozengeComponent.d.ts +3 -1
  42. package/dist/types-ts4.5/extensibility/Extension/Lozenge/index.d.ts +2 -0
  43. package/dist/types-ts4.5/extensibility/ExtensionComponent.d.ts +5 -1
  44. package/package.json +7 -7
@@ -32,7 +32,9 @@ function ExtensionWithPluginState(props) {
32
32
  isNodeHovered,
33
33
  isNodeNested,
34
34
  setIsNodeHovered,
35
- showLivePagesBodiedMacrosRendererView
35
+ showLivePagesBodiedMacrosRendererView,
36
+ showBodiedExtensionRendererView,
37
+ setShowBodiedExtensionRendererView
36
38
  } = props;
37
39
  const {
38
40
  showMacroInteractionDesignUpdates,
@@ -79,7 +81,8 @@ function ExtensionWithPluginState(props) {
79
81
  'with-bodied-padding-styles': hasBody && showMacroInteractionDesignUpdates
80
82
  });
81
83
  const contentClassNames = classnames('extension-content', 'block', {
82
- 'remove-border': showMacroInteractionDesignUpdates
84
+ 'remove-border': showMacroInteractionDesignUpdates,
85
+ 'hide-content': showBodiedExtensionRendererView
83
86
  });
84
87
  let customContainerStyles = {
85
88
  width: '100%'
@@ -118,7 +121,9 @@ function ExtensionWithPluginState(props) {
118
121
  customContainerStyles: customContainerStyles,
119
122
  setIsNodeHovered: setIsNodeHovered,
120
123
  isBodiedMacro: hasBody,
121
- showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView
124
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
125
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView,
126
+ setShowBodiedExtensionRendererView: setShowBodiedExtensionRendererView
122
127
  }), jsx("div", {
123
128
  ref: handleRef,
124
129
  "data-layout": node.attrs.layout
@@ -55,6 +55,10 @@ export const content = css({
55
55
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
56
56
  '&.remove-border': {
57
57
  border: 'none'
58
+ },
59
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
60
+ '&.hide-content': {
61
+ display: 'none'
58
62
  }
59
63
  });
60
64
 
@@ -3,10 +3,13 @@
3
3
  * @jsx jsx
4
4
  */
5
5
 
6
+ import { useCallback } from 'react';
7
+
6
8
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
7
9
  import { css, jsx } from '@emotion/react';
8
10
  import { defineMessages, useIntl } from 'react-intl-next';
9
11
  import CheckMarkIcon from '@atlaskit/icon/core/check-mark';
12
+ import EditIcon from '@atlaskit/icon/core/edit';
10
13
  import { Flex, xcss } from '@atlaskit/primitives';
11
14
  const buttonContainerStyles = css({
12
15
  opacity: 0,
@@ -28,7 +31,10 @@ const buttonStyles = css({
28
31
  borderRadius: "var(--ds-border-radius, 4px)",
29
32
  paddingLeft: "var(--ds-space-150, 12px)",
30
33
  paddingRight: "var(--ds-space-150, 12px)",
31
- font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)"
34
+ font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
35
+ '&:hover': {
36
+ backgroundColor: "var(--ds-background-neutral-subtle-hovered, #091E420F)"
37
+ }
32
38
  });
33
39
  const showButtonContainerStyle = css({
34
40
  opacity: 1
@@ -41,15 +47,33 @@ const i18n = defineMessages({
41
47
  id: 'editor-common-extensibility-extension-lozenge-editToggle.done.editing',
42
48
  defaultMessage: 'Done editing',
43
49
  description: 'Text in button when on click switches back to view mode of a macro'
50
+ },
51
+ makeEdits: {
52
+ id: 'editor-common-extensibility-extension-lozenge-editToggle.make.edits',
53
+ defaultMessage: 'Make edits',
54
+ description: 'Text in button when on click switches back to edit mode of a macro'
44
55
  }
45
56
  });
46
57
  // Used to toggle between edit and renderer mode for bodied macros in live pages
47
58
  export const EditToggle = ({
48
59
  isNodeHovered,
49
60
  customContainerStyles,
50
- setIsNodeHovered
61
+ setIsNodeHovered,
62
+ showBodiedExtensionRendererView,
63
+ setShowBodiedExtensionRendererView
51
64
  }) => {
52
65
  const intl = useIntl();
66
+ const text = showBodiedExtensionRendererView ? intl.formatMessage(i18n.makeEdits) : intl.formatMessage(i18n.doneEditing);
67
+ const icon = showBodiedExtensionRendererView ? jsx(EditIcon, {
68
+ testId: "edit-icon",
69
+ label: ""
70
+ }) : jsx(CheckMarkIcon, {
71
+ testId: "check-mark-icon",
72
+ label: ""
73
+ });
74
+ const handleClick = useCallback(() => {
75
+ setShowBodiedExtensionRendererView === null || setShowBodiedExtensionRendererView === void 0 ? void 0 : setShowBodiedExtensionRendererView(!showBodiedExtensionRendererView);
76
+ }, [showBodiedExtensionRendererView, setShowBodiedExtensionRendererView]);
53
77
  return jsx("div", {
54
78
  "data-testid": "extension-edit-toggle-container"
55
79
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
@@ -64,12 +88,16 @@ export const EditToggle = ({
64
88
  onMouseOver: () => setIsNodeHovered === null || setIsNodeHovered === void 0 ? void 0 : setIsNodeHovered(true),
65
89
  onMouseLeave: () => setIsNodeHovered === null || setIsNodeHovered === void 0 ? void 0 : setIsNodeHovered(false)
66
90
  }, jsx("span", {
67
- css: buttonStyles,
68
- className: "extension-edit-toggle"
91
+ "data-testid": "edit-toggle"
92
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
93
+ ,
94
+ css: buttonStyles
95
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
96
+ ,
97
+ className: "extension-edit-toggle",
98
+ onClick: handleClick
69
99
  }, jsx(Flex, {
70
100
  as: "span",
71
101
  xcss: iconStyles
72
- }, jsx(CheckMarkIcon, {
73
- label: ""
74
- })), intl.formatMessage(i18n.doneEditing)));
102
+ }, icon), text));
75
103
  };
@@ -115,6 +115,15 @@ const i18n = defineMessages({
115
115
  description: 'Text in tooltip that tells user they can configure the specific macro.'
116
116
  }
117
117
  });
118
+ export const getShouldShowBodiedMacroLabel = (isBodiedMacro, isNodeHovered, showLivePagesBodiedMacrosRendererView, showBodiedExtensionRendererView) => {
119
+ if (!isBodiedMacro) {
120
+ return isNodeHovered;
121
+ } // Bodied macros show the label by default
122
+ if (!showLivePagesBodiedMacrosRendererView) {
123
+ return true;
124
+ } // Keep showing labels as usual for default experience for bodied macros
125
+ return !!(isNodeHovered && !showBodiedExtensionRendererView); // For the new live pages bodied macro experience, we only show the label on hover in the "edit" view
126
+ };
118
127
  export const ExtensionLabel = ({
119
128
  text,
120
129
  extensionName,
@@ -124,24 +133,24 @@ export const ExtensionLabel = ({
124
133
  setIsNodeHovered,
125
134
  isBodiedMacro,
126
135
  showMacroButtonUpdates,
127
- showLivePagesBodiedMacrosRendererView
136
+ showLivePagesBodiedMacrosRendererView,
137
+ showBodiedExtensionRendererView
128
138
  }) => {
129
139
  const isInlineExtension = extensionName === 'inlineExtension';
130
140
  const showDefaultBodiedStyles = isBodiedMacro && !isNodeHovered;
141
+ const shouldShowBodiedMacroLabel = getShouldShowBodiedMacroLabel(isBodiedMacro, isNodeHovered, showLivePagesBodiedMacrosRendererView, showBodiedExtensionRendererView);
131
142
  const containerClassNames = classnames({
132
143
  bodied: isBodiedMacro
133
144
  });
134
-
135
- // For the new live pages bodied macro experience, we don't want to hide the label by default
136
- const showBodiedMacroLabel = isBodiedMacro ? !showLivePagesBodiedMacrosRendererView : false;
137
145
  const sharedLabelClassNames = classnames('extension-label', {
138
146
  nested: isNodeNested,
139
147
  inline: isInlineExtension,
140
148
  bodied: isBodiedMacro,
141
149
  'bodied-border': showDefaultBodiedStyles,
142
150
  'bodied-background': showDefaultBodiedStyles,
143
- 'show-label': isNodeHovered || showBodiedMacroLabel,
144
- 'with-bodied-macro-live-page-styles': isBodiedMacro && showLivePagesBodiedMacrosRendererView
151
+ 'show-label': shouldShowBodiedMacroLabel,
152
+ 'with-bodied-macro-live-page-styles': isBodiedMacro && showLivePagesBodiedMacrosRendererView,
153
+ 'always-hide-label': isBodiedMacro && showBodiedExtensionRendererView // Need this separate class since we don't ever want to show the label during view mode
145
154
  });
146
155
  const newButtonLabelClassNames = classnames({
147
156
  // For new button design, non-bodied macros should have a flush label. Inline macros don't need this since they never had the margin-left applied.
@@ -26,7 +26,9 @@ export const LozengeComponent = ({
26
26
  isNodeNested,
27
27
  setIsNodeHovered,
28
28
  isBodiedMacro,
29
- showLivePagesBodiedMacrosRendererView
29
+ showLivePagesBodiedMacrosRendererView,
30
+ showBodiedExtensionRendererView,
31
+ setShowBodiedExtensionRendererView
30
32
  }) => {
31
33
  const capitalizedTitle = capitalizeFirstLetter(title);
32
34
  if (showMacroInteractionDesignUpdates) {
@@ -39,11 +41,14 @@ export const LozengeComponent = ({
39
41
  setIsNodeHovered: setIsNodeHovered,
40
42
  isBodiedMacro: isBodiedMacro,
41
43
  showMacroButtonUpdates: showMacroButtonUpdates,
42
- showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView
44
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
45
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView
43
46
  }), showLivePagesBodiedMacrosRendererView && isBodiedMacro && jsx(EditToggle, {
44
47
  isNodeHovered: isNodeHovered,
45
48
  setIsNodeHovered: setIsNodeHovered,
46
- customContainerStyles: customContainerStyles
49
+ customContainerStyles: customContainerStyles,
50
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView,
51
+ setShowBodiedExtensionRendererView: setShowBodiedExtensionRendererView
47
52
  }));
48
53
  }
49
54
  const isBlockExtension = extensionName === 'extension';
@@ -39,7 +39,9 @@ export default class ExtensionLozenge extends Component {
39
39
  customContainerStyles,
40
40
  setIsNodeHovered,
41
41
  isBodiedMacro,
42
- showLivePagesBodiedMacrosRendererView
42
+ showLivePagesBodiedMacrosRendererView,
43
+ showBodiedExtensionRendererView,
44
+ setShowBodiedExtensionRendererView
43
45
  } = this.props;
44
46
  const {
45
47
  parameters,
@@ -64,7 +66,9 @@ export default class ExtensionLozenge extends Component {
64
66
  customContainerStyles: customContainerStyles,
65
67
  setIsNodeHovered: setIsNodeHovered,
66
68
  isBodiedMacro: isBodiedMacro,
67
- showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView
69
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
70
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView,
71
+ setShowBodiedExtensionRendererView: setShowBodiedExtensionRendererView
68
72
  });
69
73
  });
70
74
  }
@@ -15,6 +15,19 @@ import MultiBodiedExtension from './MultiBodiedExtension';
15
15
 
16
16
  /* temporary type until FG cleaned up */
17
17
 
18
+ const isEmptyBodiedMacro = node => {
19
+ var _node$content, _firstGrandChildNode$;
20
+ if (node.type.name !== 'bodiedExtension') {
21
+ return false;
22
+ }
23
+ const firstChildNode = node === null || node === void 0 ? void 0 : (_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.firstChild;
24
+ const firstGrandChildNode = firstChildNode === null || firstChildNode === void 0 ? void 0 : firstChildNode.firstChild;
25
+
26
+ // If firstChildNode?.childCount > 1 means there is content along with the placeholder.
27
+ const isEmptyWithPlacholder = (firstGrandChildNode === null || firstGrandChildNode === void 0 ? void 0 : (_firstGrandChildNode$ = firstGrandChildNode.type) === null || _firstGrandChildNode$ === void 0 ? void 0 : _firstGrandChildNode$.name) === 'placeholder' && (firstChildNode === null || firstChildNode === void 0 ? void 0 : firstChildNode.childCount) === 1;
28
+ const isEmptyWithNoContent = !firstGrandChildNode && node.childCount === 1;
29
+ return isEmptyWithPlacholder || isEmptyWithNoContent;
30
+ };
18
31
  export class ExtensionComponentOld extends Component {
19
32
  constructor(...args) {
20
33
  super(...args);
@@ -29,6 +42,11 @@ export class ExtensionComponentOld extends Component {
29
42
  isNodeHovered: isHovered
30
43
  });
31
44
  });
45
+ _defineProperty(this, "setShowBodiedExtensionRendererView", showRendererView => {
46
+ this.setState({
47
+ showBodiedExtensionRendererView: showRendererView
48
+ });
49
+ });
32
50
  _defineProperty(this, "setStateFromPromise", (stateKey, promise) => {
33
51
  promise && promise.then(p => {
34
52
  if (!this.mounted) {
@@ -78,6 +96,9 @@ export class ExtensionComponentOld extends Component {
78
96
  extensionHandlers,
79
97
  editorView
80
98
  } = this.props;
99
+ const {
100
+ showBodiedExtensionRendererView
101
+ } = this.state; // State will only be true if the gate is on and meets requirements
81
102
  const {
82
103
  extensionType,
83
104
  extensionKey,
@@ -85,16 +106,23 @@ export class ExtensionComponentOld extends Component {
85
106
  text
86
107
  } = pmNode.attrs;
87
108
  const isBodiedExtension = pmNode.type.name === 'bodiedExtension';
88
- if (isBodiedExtension) {
109
+ if (isBodiedExtension && !showBodiedExtensionRendererView) {
89
110
  return;
90
111
  }
91
112
  const fragmentLocalId = pmNode === null || pmNode === void 0 ? void 0 : (_pmNode$marks = pmNode.marks) === null || _pmNode$marks === void 0 ? void 0 : (_pmNode$marks$find = _pmNode$marks.find(m => m.type.name === 'fragment')) === null || _pmNode$marks$find === void 0 ? void 0 : (_pmNode$marks$find$at = _pmNode$marks$find.attrs) === null || _pmNode$marks$find$at === void 0 ? void 0 : _pmNode$marks$find$at.localId;
113
+ const nodeContent = [];
114
+ if (isBodiedExtension) {
115
+ var _pmNode$content;
116
+ pmNode === null || pmNode === void 0 ? void 0 : (_pmNode$content = pmNode.content) === null || _pmNode$content === void 0 ? void 0 : _pmNode$content.forEach(childNode => {
117
+ nodeContent.push(childNode);
118
+ });
119
+ }
92
120
  const node = {
93
121
  type: pmNode.type.name,
94
122
  extensionType,
95
123
  extensionKey,
96
124
  parameters,
97
- content: text,
125
+ content: isBodiedExtension ? nodeContent.length ? nodeContent : text : text,
98
126
  localId: pmNode.attrs.localId,
99
127
  fragmentLocalId
100
128
  };
@@ -126,6 +154,16 @@ export class ExtensionComponentOld extends Component {
126
154
  }
127
155
  UNSAFE_componentWillMount() {
128
156
  this.mounted = true;
157
+ const {
158
+ node,
159
+ showLivePagesBodiedMacrosRendererView
160
+ } = this.props;
161
+ // We only care about this empty state on first page load or insertion to determine the view
162
+ if (showLivePagesBodiedMacrosRendererView && !isEmptyBodiedMacro(node)) {
163
+ this.setState({
164
+ showBodiedExtensionRendererView: true
165
+ });
166
+ }
129
167
  }
130
168
  componentDidMount() {
131
169
  const {
@@ -206,7 +244,9 @@ export class ExtensionComponentOld extends Component {
206
244
  isNodeHovered: this.state.isNodeHovered,
207
245
  isNodeNested: isNodeNested,
208
246
  setIsNodeHovered: this.setIsNodeHovered,
209
- showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView
247
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
248
+ showBodiedExtensionRendererView: this.state.showBodiedExtensionRendererView,
249
+ setShowBodiedExtensionRendererView: this.setShowBodiedExtensionRendererView
210
250
  }, extensionHandlerResult);
211
251
  case 'inlineExtension':
212
252
  return /*#__PURE__*/React.createElement(InlineExtension, {
@@ -242,9 +282,12 @@ export class ExtensionComponentOld extends Component {
242
282
  export const ExtensionComponentNew = props => {
243
283
  const {
244
284
  extensionProvider: extensionProviderResolver,
285
+ showLivePagesBodiedMacrosRendererView,
286
+ node,
245
287
  ...restProps
246
288
  } = props;
247
289
  const [extensionProvider, setExtensionProvider] = useState(undefined);
290
+ const [showBodiedExtensionRendererView, setShowBodiedExtensionRendererView] = useState(!!(showLivePagesBodiedMacrosRendererView && !isEmptyBodiedMacro(node)));
248
291
  const mountedRef = useRef(true);
249
292
  useLayoutEffect(() => {
250
293
  mountedRef.current = true;
@@ -260,7 +303,11 @@ export const ExtensionComponentNew = props => {
260
303
  });
261
304
  }, [extensionProviderResolver]);
262
305
  return /*#__PURE__*/React.createElement(ExtensionComponentInner, _extends({}, restProps, {
263
- extensionProvider: extensionProvider
306
+ extensionProvider: extensionProvider,
307
+ node: node,
308
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
309
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView,
310
+ setShowBodiedExtensionRendererView: setShowBodiedExtensionRendererView
264
311
  }));
265
312
  };
266
313
  class ExtensionComponentInner extends Component {
@@ -313,7 +360,8 @@ class ExtensionComponentInner extends Component {
313
360
  var _pmNode$marks2, _pmNode$marks2$find, _pmNode$marks2$find$a;
314
361
  const {
315
362
  extensionHandlers,
316
- editorView
363
+ editorView,
364
+ showBodiedExtensionRendererView
317
365
  } = this.props;
318
366
  const {
319
367
  extensionType,
@@ -322,16 +370,23 @@ class ExtensionComponentInner extends Component {
322
370
  text
323
371
  } = pmNode.attrs;
324
372
  const isBodiedExtension = pmNode.type.name === 'bodiedExtension';
325
- if (isBodiedExtension) {
373
+ if (isBodiedExtension && !showBodiedExtensionRendererView) {
326
374
  return;
327
375
  }
328
376
  const fragmentLocalId = pmNode === null || pmNode === void 0 ? void 0 : (_pmNode$marks2 = pmNode.marks) === null || _pmNode$marks2 === void 0 ? void 0 : (_pmNode$marks2$find = _pmNode$marks2.find(m => m.type.name === 'fragment')) === null || _pmNode$marks2$find === void 0 ? void 0 : (_pmNode$marks2$find$a = _pmNode$marks2$find.attrs) === null || _pmNode$marks2$find$a === void 0 ? void 0 : _pmNode$marks2$find$a.localId;
377
+ const nodeContent = [];
378
+ if (isBodiedExtension) {
379
+ var _pmNode$content2;
380
+ pmNode === null || pmNode === void 0 ? void 0 : (_pmNode$content2 = pmNode.content) === null || _pmNode$content2 === void 0 ? void 0 : _pmNode$content2.forEach(childNode => {
381
+ nodeContent.push(childNode);
382
+ });
383
+ }
329
384
  const node = {
330
385
  type: pmNode.type.name,
331
386
  extensionType,
332
387
  extensionKey,
333
388
  parameters,
334
- content: text,
389
+ content: isBodiedExtension ? nodeContent.length ? nodeContent : text : text,
335
390
  localId: pmNode.attrs.localId,
336
391
  fragmentLocalId
337
392
  };
@@ -377,7 +432,9 @@ class ExtensionComponentInner extends Component {
377
432
  eventDispatcher,
378
433
  macroInteractionDesignFeatureFlags,
379
434
  extensionProvider,
380
- showLivePagesBodiedMacrosRendererView
435
+ showLivePagesBodiedMacrosRendererView,
436
+ showBodiedExtensionRendererView,
437
+ setShowBodiedExtensionRendererView
381
438
  } = this.props;
382
439
  const {
383
440
  selection
@@ -422,7 +479,9 @@ class ExtensionComponentInner extends Component {
422
479
  isNodeHovered: this.state.isNodeHovered,
423
480
  isNodeNested: isNodeNested,
424
481
  setIsNodeHovered: this.setIsNodeHovered,
425
- showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView
482
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
483
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView,
484
+ setShowBodiedExtensionRendererView: setShowBodiedExtensionRendererView
426
485
  }, extensionHandlerResult);
427
486
  case 'inlineExtension':
428
487
  return /*#__PURE__*/React.createElement(InlineExtension, {
@@ -1,7 +1,7 @@
1
1
  import { isFedRamp } from './environment';
2
2
  const SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
3
3
  const packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
4
- const packageVersion = "95.5.0";
4
+ const packageVersion = "95.6.1";
5
5
  const sanitiseSentryEvents = (data, _hint) => {
6
6
  // Remove URL as it has UGC
7
7
  // TODO: Sanitise the URL instead of just removing it
@@ -13,7 +13,7 @@ import withAnalyticsContext from '@atlaskit/analytics-next/withAnalyticsContext'
13
13
  import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
14
14
  import Layer from '../Layer';
15
15
  const packageName = "@atlaskit/editor-common";
16
- const packageVersion = "95.5.0";
16
+ const packageVersion = "95.6.1";
17
17
  const halfFocusRing = 1;
18
18
  const dropOffset = '0, 8';
19
19
  class DropList extends Component {
@@ -95,13 +95,13 @@ function ElementListOld(_ref) {
95
95
  }
96
96
  });
97
97
  }, [createAnalyticsEvent]);
98
-
99
- // eslint-disable-next-line react-hooks/exhaustive-deps
100
- var cache = new CellMeasurerCache({
101
- fixedWidth: true,
102
- defaultHeight: 75,
103
- minHeight: 75
104
- });
98
+ var cache = useMemo(function () {
99
+ return new CellMeasurerCache({
100
+ fixedWidth: true,
101
+ defaultHeight: 75,
102
+ minHeight: 75
103
+ });
104
+ }, []);
105
105
  var columnWidth = (containerWidth - ELEMENT_ITEM_PADDING * 2) / columnCount;
106
106
  var rowCount = Math.ceil(items.length / columnCount);
107
107
  var rowHeight = function rowHeight(_ref2) {
@@ -254,13 +254,13 @@ function ElementListNew(_ref5) {
254
254
  }
255
255
  });
256
256
  }, [createAnalyticsEvent]);
257
-
258
- // eslint-disable-next-line react-hooks/exhaustive-deps
259
- var listCache = cache !== null && cache !== void 0 ? cache : new CellMeasurerCache({
260
- fixedWidth: true,
261
- defaultHeight: ELEMENT_ITEM_HEIGHT,
262
- minHeight: ELEMENT_ITEM_HEIGHT
263
- });
257
+ var listCache = useMemo(function () {
258
+ return cache !== null && cache !== void 0 ? cache : new CellMeasurerCache({
259
+ fixedWidth: true,
260
+ defaultHeight: ELEMENT_ITEM_HEIGHT,
261
+ minHeight: ELEMENT_ITEM_HEIGHT
262
+ });
263
+ }, [cache]);
264
264
  useEffect(function () {
265
265
  // need to recalculate values if we have the same items, but they're reordered
266
266
  listCache.clearAll();
@@ -37,7 +37,9 @@ function ExtensionWithPluginState(props) {
37
37
  isNodeHovered = props.isNodeHovered,
38
38
  isNodeNested = props.isNodeNested,
39
39
  setIsNodeHovered = props.setIsNodeHovered,
40
- showLivePagesBodiedMacrosRendererView = props.showLivePagesBodiedMacrosRendererView;
40
+ showLivePagesBodiedMacrosRendererView = props.showLivePagesBodiedMacrosRendererView,
41
+ showBodiedExtensionRendererView = props.showBodiedExtensionRendererView,
42
+ setShowBodiedExtensionRendererView = props.setShowBodiedExtensionRendererView;
41
43
  var _ref = macroInteractionDesignFeatureFlags || {},
42
44
  showMacroInteractionDesignUpdates = _ref.showMacroInteractionDesignUpdates,
43
45
  showMacroButtonUpdates = _ref.showMacroButtonUpdates;
@@ -79,7 +81,8 @@ function ExtensionWithPluginState(props) {
79
81
  'with-bodied-padding-styles': hasBody && showMacroInteractionDesignUpdates
80
82
  });
81
83
  var contentClassNames = classnames('extension-content', 'block', {
82
- 'remove-border': showMacroInteractionDesignUpdates
84
+ 'remove-border': showMacroInteractionDesignUpdates,
85
+ 'hide-content': showBodiedExtensionRendererView
83
86
  });
84
87
  var customContainerStyles = {
85
88
  width: '100%'
@@ -112,7 +115,9 @@ function ExtensionWithPluginState(props) {
112
115
  customContainerStyles: customContainerStyles,
113
116
  setIsNodeHovered: setIsNodeHovered,
114
117
  isBodiedMacro: hasBody,
115
- showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView
118
+ showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
119
+ showBodiedExtensionRendererView: showBodiedExtensionRendererView,
120
+ setShowBodiedExtensionRendererView: setShowBodiedExtensionRendererView
116
121
  }), jsx("div", {
117
122
  ref: handleRef,
118
123
  "data-layout": node.attrs.layout
@@ -55,6 +55,10 @@ export var content = css({
55
55
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
56
56
  '&.remove-border': {
57
57
  border: 'none'
58
+ },
59
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-nested-selectors -- Ignored via go/DSP-18766
60
+ '&.hide-content': {
61
+ display: 'none'
58
62
  }
59
63
  });
60
64
 
@@ -3,10 +3,13 @@
3
3
  * @jsx jsx
4
4
  */
5
5
 
6
+ import { useCallback } from 'react';
7
+
6
8
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
7
9
  import { css, jsx } from '@emotion/react';
8
10
  import { defineMessages, useIntl } from 'react-intl-next';
9
11
  import CheckMarkIcon from '@atlaskit/icon/core/check-mark';
12
+ import EditIcon from '@atlaskit/icon/core/edit';
10
13
  import { Flex, xcss } from '@atlaskit/primitives';
11
14
  var buttonContainerStyles = css({
12
15
  opacity: 0,
@@ -28,7 +31,10 @@ var buttonStyles = css({
28
31
  borderRadius: "var(--ds-border-radius, 4px)",
29
32
  paddingLeft: "var(--ds-space-150, 12px)",
30
33
  paddingRight: "var(--ds-space-150, 12px)",
31
- font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)"
34
+ font: "var(--ds-font-body, normal 400 14px/20px ui-sans-serif, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Ubuntu, system-ui, \"Helvetica Neue\", sans-serif)",
35
+ '&:hover': {
36
+ backgroundColor: "var(--ds-background-neutral-subtle-hovered, #091E420F)"
37
+ }
32
38
  });
33
39
  var showButtonContainerStyle = css({
34
40
  opacity: 1
@@ -41,14 +47,32 @@ var i18n = defineMessages({
41
47
  id: 'editor-common-extensibility-extension-lozenge-editToggle.done.editing',
42
48
  defaultMessage: 'Done editing',
43
49
  description: 'Text in button when on click switches back to view mode of a macro'
50
+ },
51
+ makeEdits: {
52
+ id: 'editor-common-extensibility-extension-lozenge-editToggle.make.edits',
53
+ defaultMessage: 'Make edits',
54
+ description: 'Text in button when on click switches back to edit mode of a macro'
44
55
  }
45
56
  });
46
57
  // Used to toggle between edit and renderer mode for bodied macros in live pages
47
58
  export var EditToggle = function EditToggle(_ref) {
48
59
  var isNodeHovered = _ref.isNodeHovered,
49
60
  customContainerStyles = _ref.customContainerStyles,
50
- setIsNodeHovered = _ref.setIsNodeHovered;
61
+ setIsNodeHovered = _ref.setIsNodeHovered,
62
+ showBodiedExtensionRendererView = _ref.showBodiedExtensionRendererView,
63
+ setShowBodiedExtensionRendererView = _ref.setShowBodiedExtensionRendererView;
51
64
  var intl = useIntl();
65
+ var text = showBodiedExtensionRendererView ? intl.formatMessage(i18n.makeEdits) : intl.formatMessage(i18n.doneEditing);
66
+ var icon = showBodiedExtensionRendererView ? jsx(EditIcon, {
67
+ testId: "edit-icon",
68
+ label: ""
69
+ }) : jsx(CheckMarkIcon, {
70
+ testId: "check-mark-icon",
71
+ label: ""
72
+ });
73
+ var handleClick = useCallback(function () {
74
+ setShowBodiedExtensionRendererView === null || setShowBodiedExtensionRendererView === void 0 || setShowBodiedExtensionRendererView(!showBodiedExtensionRendererView);
75
+ }, [showBodiedExtensionRendererView, setShowBodiedExtensionRendererView]);
52
76
  return jsx("div", {
53
77
  "data-testid": "extension-edit-toggle-container"
54
78
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
@@ -67,12 +91,16 @@ export var EditToggle = function EditToggle(_ref) {
67
91
  return setIsNodeHovered === null || setIsNodeHovered === void 0 ? void 0 : setIsNodeHovered(false);
68
92
  }
69
93
  }, jsx("span", {
70
- css: buttonStyles,
71
- className: "extension-edit-toggle"
94
+ "data-testid": "edit-toggle"
95
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
96
+ ,
97
+ css: buttonStyles
98
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
99
+ ,
100
+ className: "extension-edit-toggle",
101
+ onClick: handleClick
72
102
  }, jsx(Flex, {
73
103
  as: "span",
74
104
  xcss: iconStyles
75
- }, jsx(CheckMarkIcon, {
76
- label: ""
77
- })), intl.formatMessage(i18n.doneEditing)));
105
+ }, icon), text));
78
106
  };
@@ -115,6 +115,15 @@ var i18n = defineMessages({
115
115
  description: 'Text in tooltip that tells user they can configure the specific macro.'
116
116
  }
117
117
  });
118
+ export var getShouldShowBodiedMacroLabel = function getShouldShowBodiedMacroLabel(isBodiedMacro, isNodeHovered, showLivePagesBodiedMacrosRendererView, showBodiedExtensionRendererView) {
119
+ if (!isBodiedMacro) {
120
+ return isNodeHovered;
121
+ } // Bodied macros show the label by default
122
+ if (!showLivePagesBodiedMacrosRendererView) {
123
+ return true;
124
+ } // Keep showing labels as usual for default experience for bodied macros
125
+ return !!(isNodeHovered && !showBodiedExtensionRendererView); // For the new live pages bodied macro experience, we only show the label on hover in the "edit" view
126
+ };
118
127
  export var ExtensionLabel = function ExtensionLabel(_ref) {
119
128
  var text = _ref.text,
120
129
  extensionName = _ref.extensionName,
@@ -124,23 +133,23 @@ export var ExtensionLabel = function ExtensionLabel(_ref) {
124
133
  setIsNodeHovered = _ref.setIsNodeHovered,
125
134
  isBodiedMacro = _ref.isBodiedMacro,
126
135
  showMacroButtonUpdates = _ref.showMacroButtonUpdates,
127
- showLivePagesBodiedMacrosRendererView = _ref.showLivePagesBodiedMacrosRendererView;
136
+ showLivePagesBodiedMacrosRendererView = _ref.showLivePagesBodiedMacrosRendererView,
137
+ showBodiedExtensionRendererView = _ref.showBodiedExtensionRendererView;
128
138
  var isInlineExtension = extensionName === 'inlineExtension';
129
139
  var showDefaultBodiedStyles = isBodiedMacro && !isNodeHovered;
140
+ var shouldShowBodiedMacroLabel = getShouldShowBodiedMacroLabel(isBodiedMacro, isNodeHovered, showLivePagesBodiedMacrosRendererView, showBodiedExtensionRendererView);
130
141
  var containerClassNames = classnames({
131
142
  bodied: isBodiedMacro
132
143
  });
133
-
134
- // For the new live pages bodied macro experience, we don't want to hide the label by default
135
- var showBodiedMacroLabel = isBodiedMacro ? !showLivePagesBodiedMacrosRendererView : false;
136
144
  var sharedLabelClassNames = classnames('extension-label', {
137
145
  nested: isNodeNested,
138
146
  inline: isInlineExtension,
139
147
  bodied: isBodiedMacro,
140
148
  'bodied-border': showDefaultBodiedStyles,
141
149
  'bodied-background': showDefaultBodiedStyles,
142
- 'show-label': isNodeHovered || showBodiedMacroLabel,
143
- 'with-bodied-macro-live-page-styles': isBodiedMacro && showLivePagesBodiedMacrosRendererView
150
+ 'show-label': shouldShowBodiedMacroLabel,
151
+ 'with-bodied-macro-live-page-styles': isBodiedMacro && showLivePagesBodiedMacrosRendererView,
152
+ 'always-hide-label': isBodiedMacro && showBodiedExtensionRendererView // Need this separate class since we don't ever want to show the label during view mode
144
153
  });
145
154
  var newButtonLabelClassNames = classnames({
146
155
  // For new button design, non-bodied macros should have a flush label. Inline macros don't need this since they never had the margin-left applied.