@atlaskit/editor-plugin-show-diff 10.5.0 → 10.5.2

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 (27) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/pm-plugins/calculateDiff/calculateDiffDecorations.js +30 -3
  3. package/dist/cjs/pm-plugins/decorations/colorSchemes/standard.js +14 -1
  4. package/dist/cjs/pm-plugins/decorations/colorSchemes/traditional.js +15 -2
  5. package/dist/cjs/pm-plugins/decorations/createAnchorDecorationWidgets.js +52 -18
  6. package/dist/cjs/pm-plugins/decorations/createBlockChangedDecoration.js +6 -1
  7. package/dist/cjs/pm-plugins/decorations/createInlineChangedDecoration.js +23 -4
  8. package/dist/cjs/pm-plugins/decorations/utils/getAttrChangeRanges.js +64 -4
  9. package/dist/es2019/pm-plugins/calculateDiff/calculateDiffDecorations.js +30 -3
  10. package/dist/es2019/pm-plugins/decorations/colorSchemes/standard.js +13 -0
  11. package/dist/es2019/pm-plugins/decorations/colorSchemes/traditional.js +14 -1
  12. package/dist/es2019/pm-plugins/decorations/createAnchorDecorationWidgets.js +60 -28
  13. package/dist/es2019/pm-plugins/decorations/createBlockChangedDecoration.js +8 -3
  14. package/dist/es2019/pm-plugins/decorations/createInlineChangedDecoration.js +16 -1
  15. package/dist/es2019/pm-plugins/decorations/utils/getAttrChangeRanges.js +53 -4
  16. package/dist/esm/pm-plugins/calculateDiff/calculateDiffDecorations.js +30 -3
  17. package/dist/esm/pm-plugins/decorations/colorSchemes/standard.js +13 -0
  18. package/dist/esm/pm-plugins/decorations/colorSchemes/traditional.js +14 -1
  19. package/dist/esm/pm-plugins/decorations/createAnchorDecorationWidgets.js +51 -18
  20. package/dist/esm/pm-plugins/decorations/createBlockChangedDecoration.js +8 -3
  21. package/dist/esm/pm-plugins/decorations/createInlineChangedDecoration.js +23 -4
  22. package/dist/esm/pm-plugins/decorations/utils/getAttrChangeRanges.js +63 -4
  23. package/dist/types/pm-plugins/decorations/colorSchemes/standard.d.ts +1 -0
  24. package/dist/types/pm-plugins/decorations/colorSchemes/traditional.d.ts +2 -1
  25. package/dist/types/pm-plugins/decorations/createInlineChangedDecoration.d.ts +4 -1
  26. package/dist/types/pm-plugins/decorations/utils/getAttrChangeRanges.d.ts +11 -1
  27. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/editor-plugin-show-diff
2
2
 
3
+ ## 10.5.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`75c7e6a9aa4ec`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/75c7e6a9aa4ec) -
8
+ [ux] Improve showing diff for attribute changes for inline nodes.
9
+ - Updated dependencies
10
+
11
+ ## 10.5.1
12
+
13
+ ### Patch Changes
14
+
15
+ - [`ded72f3ee293f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ded72f3ee293f) -
16
+ Fix table diff cell overlays to use rounded corners for delete row diffs when
17
+ platform_editor_table_diff_rounded_corners is enabled
18
+ - [`11b7096b9b80c`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/11b7096b9b80c) -
19
+ CCI-17981: Fix diff indicator misalignment on page resize by observing measured DOM elements for
20
+ size changes
21
+ - Updated dependencies
22
+
3
23
  ## 10.5.0
4
24
 
5
25
  ### Minor Changes
@@ -427,16 +427,43 @@ var calculateDiffDecorationsInner = function calculateDiffDecorationsInner(_ref3
427
427
  isInserted: true
428
428
  })));
429
429
  });
430
- (0, _getAttrChangeRanges.getAttrChangeRanges)(tr.doc, attrSteps).forEach(function (change) {
430
+ (0, _getAttrChangeRanges.getAttrChangeRanges)(tr.doc, attrSteps, originalDoc).forEach(function (change) {
431
431
  if (change.isInline) {
432
- // Inline nodes (e.g. date) need an inline decoration rather than a block decoration
432
+ // Inline nodes (e.g. date, emoji, mention, status) need an inline decoration rather than a block decoration
433
433
  var isActive = activeIndexPos && change.fromB === activeIndexPos.from && change.toB === activeIndexPos.to;
434
+ var isAtomicInlineNodeFlag = (0, _expValEquals.expValEquals)('platform_editor_improve_inline_diffs', 'isEnabled', true);
434
435
  decorations.push.apply(decorations, (0, _toConsumableArray2.default)((0, _createInlineChangedDecoration.createInlineChangedDecoration)({
435
436
  change: change,
436
437
  colorScheme: colorScheme,
437
438
  isActive: isActive,
438
- isInserted: true
439
+ isInserted: true,
440
+ isAtomicInlineNode: isAtomicInlineNodeFlag,
441
+ inlineNodeName: change.inlineNodeName,
442
+ // Suppress the border-bottom underline for atomic inline nodeviews —
443
+ // it doesn't render on custom nodeview DOM elements and is unnecessary noise.
444
+ hideAddedDiffsUnderline: isAtomicInlineNodeFlag,
445
+ diffType: diffType
439
446
  })));
447
+ // If we have the original node position, also render the old node as a "deleted" widget
448
+ // so the user can see what it looked like before the change.
449
+ if (change.fromA !== undefined && change.toA !== undefined && (0, _expValEquals.expValEquals)('platform_editor_improve_inline_diffs', 'isEnabled', true)) {
450
+ decorations.push.apply(decorations, (0, _toConsumableArray2.default)((0, _createNodeChangedDecorationWidget.createNodeChangedDecorationWidget)({
451
+ change: {
452
+ fromA: change.fromA,
453
+ toA: change.toA,
454
+ fromB: change.fromB,
455
+ toB: change.toB,
456
+ deleted: []
457
+ },
458
+ doc: originalDoc,
459
+ nodeViewSerializer: nodeViewSerializer,
460
+ colorScheme: colorScheme,
461
+ newDoc: tr.doc,
462
+ intl: intl,
463
+ activeIndexPos: activeIndexPos,
464
+ isInserted: false
465
+ })));
466
+ }
440
467
  } else {
441
468
  decorations.push.apply(decorations, (0, _toConsumableArray2.default)(calculateNodesForBlockDecoration({
442
469
  doc: tr.doc,
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.standardDecorationMarkerVariable = exports.editingStyleRuleNode = exports.editingStyleQuoteNode = exports.editingStyleNode = exports.editingStyleExtendedNoUnderline = exports.editingStyleExtended = exports.editingStyleCardBlockNode = exports.editingStyleActiveExtendedNoUnderline = exports.editingStyleActiveExtended = exports.editingStyleActive = exports.editingStyle = exports.editingContentStyleInBlockExtendedNoUnderline = exports.editingContentStyleInBlockExtended = exports.editingContentStyleInBlock = exports.deletedStyleQuoteNodeWithLozengeActive = exports.deletedStyleQuoteNodeWithLozenge = exports.deletedStyleQuoteNode = exports.deletedRowStyle = exports.deletedInlineContentStyleExtended = exports.deletedDecorationMarkerVariable = exports.deletedContentStyleUnbounded = exports.deletedContentStyleNew = exports.deletedContentStyleActive = exports.deletedContentStyle = exports.deletedCellOverlayStyle = exports.deletedBlockOutlineRoundedActive = exports.deletedBlockOutlineRounded = exports.deletedBlockOutlineActive = exports.deletedBlockOutline = exports.addedCellOverlayStyle = void 0;
6
+ exports.standardDecorationMarkerVariable = exports.editingStyleRuleNode = exports.editingStyleQuoteNode = exports.editingStyleNode = exports.editingStyleExtendedNoUnderline = exports.editingStyleExtended = exports.editingStyleCardBlockNode = exports.editingStyleActiveExtendedNoUnderline = exports.editingStyleActiveExtended = exports.editingStyleActive = exports.editingStyle = exports.editingContentStyleInBlockExtendedNoUnderline = exports.editingContentStyleInBlockExtended = exports.editingContentStyleInBlock = exports.deletedStyleQuoteNodeWithLozengeActive = exports.deletedStyleQuoteNodeWithLozenge = exports.deletedStyleQuoteNode = exports.deletedRowStyle = exports.deletedInlineContentStyleExtended = exports.deletedDecorationMarkerVariable = exports.deletedContentStyleUnbounded = exports.deletedContentStyleNew = exports.deletedContentStyleActive = exports.deletedContentStyle = exports.deletedCellOverlayStyle = exports.deletedCellOverlayRoundedStyle = exports.deletedBlockOutlineRoundedActive = exports.deletedBlockOutlineRounded = exports.deletedBlockOutlineActive = exports.deletedBlockOutline = exports.addedCellOverlayStyle = void 0;
7
7
  var _lazyNodeView = require("@atlaskit/editor-common/lazy-node-view");
8
8
  // delete on platform_editor_diff_plugin_extended cleanup
9
9
  var editingStyle = exports.editingStyle = (0, _lazyNodeView.convertToInlineCss)({
@@ -186,4 +186,17 @@ var deletedCellOverlayStyle = exports.deletedCellOverlayStyle = (0, _lazyNodeVie
186
186
  zIndex: 1,
187
187
  outline: "1px solid ".concat("var(--ds-border-accent-gray, #7D818A)"),
188
188
  pointerEvents: 'none'
189
+ });
190
+ var deletedCellOverlayRoundedStyle = exports.deletedCellOverlayRoundedStyle = (0, _lazyNodeView.convertToInlineCss)({
191
+ position: 'absolute',
192
+ top: 0,
193
+ left: 0,
194
+ width: '100%',
195
+ height: '100%',
196
+ backgroundColor: "rgba(from ".concat("var(--ds-background-accent-gray-subtlest, #F0F1F2)", " r g b / 0.5)"),
197
+ zIndex: 2,
198
+ outline: "1px solid ".concat("var(--ds-border-accent-gray, #7D818A)"),
199
+ pointerEvents: 'none',
200
+ border: 'inherit',
201
+ borderRadius: 'inherit'
189
202
  });
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.deletedTraditionalStyleQuoteNodeActive = exports.deletedTraditionalStyleQuoteNode = exports.deletedTraditionalRowStyle = exports.deletedTraditionalContentStyleUnboundedActive = exports.deletedTraditionalContentStyleUnbounded = exports.deletedTraditionalCellOverlayStyle = exports.deletedTraditionalBlockOutlineRoundedNew = exports.deletedTraditionalBlockOutlineRoundedActive = exports.deletedTraditionalBlockOutlineRounded = exports.deletedTraditionalBlockOutlineNew = exports.deletedTraditionalBlockOutlineActive = exports.deletedTraditionalBlockOutline = void 0;
7
+ exports.deletedTraditionalStyleQuoteNodeActive = exports.deletedTraditionalStyleQuoteNode = exports.deletedTraditionalRowStyle = exports.deletedTraditionalContentStyleUnboundedActive = exports.deletedTraditionalContentStyleUnbounded = exports.deletedTraditionalCellOverlayStyle = exports.deletedTraditionalCellOverlayRoundedStyle = exports.deletedTraditionalBlockOutlineRoundedNew = exports.deletedTraditionalBlockOutlineRoundedActive = exports.deletedTraditionalBlockOutlineRounded = exports.deletedTraditionalBlockOutlineNew = exports.deletedTraditionalBlockOutlineActive = exports.deletedTraditionalBlockOutline = void 0;
8
8
  exports.getDeletedTraditionalInlineStyle = getDeletedTraditionalInlineStyle;
9
9
  exports.traditionalStyleRuleNodeNew = exports.traditionalStyleRuleNodeActive = exports.traditionalStyleRuleNode = exports.traditionalStyleQuoteNodeNew = exports.traditionalStyleQuoteNodeActive = exports.traditionalStyleQuoteNode = exports.traditionalStyleNodeNew = exports.traditionalStyleNodeActive = exports.traditionalStyleNode = exports.traditionalStyleCardBlockNodeNew = exports.traditionalStyleCardBlockNodeActive = exports.traditionalStyleCardBlockNode = exports.traditionalInsertStyleActive = exports.traditionalInsertStyle = exports.traditionalDeletedDecorationMarkerVariableNew = exports.traditionalDeletedDecorationMarkerVariableActive = exports.traditionalDeletedDecorationMarkerVariable = exports.traditionalDecorationMarkerVariableNew = exports.traditionalDecorationMarkerVariableActive = exports.traditionalDecorationMarkerVariable = exports.traditionalAddedCellOverlayStyleNew = exports.traditionalAddedCellOverlayStyle = void 0;
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
@@ -93,7 +93,7 @@ var deletedTraditionalBlockOutlineRoundedActive = exports.deletedTraditionalBloc
93
93
  borderRadius: "calc(".concat("var(--ds-radius-xsmall, 2px)", " + 1px)")
94
94
  });
95
95
 
96
- /** Scroll-navigation “new” emphasis: 4px ring (see {@link traditionalStyleNodeNew}). */
96
+ /** Scroll-navigation “new” emphasis: 4px ring. */
97
97
  var deletedTraditionalBlockOutlineNew = exports.deletedTraditionalBlockOutlineNew = (0, _lazyNodeView.convertToInlineCss)({
98
98
  boxShadow: "0 0 0 4px ".concat("var(--ds-background-accent-red-subtlest, #FFECEB)"),
99
99
  borderRadius: "var(--ds-radius-small, 4px)"
@@ -214,4 +214,17 @@ var deletedTraditionalCellOverlayStyle = exports.deletedTraditionalCellOverlaySt
214
214
  zIndex: 1,
215
215
  outline: "1px solid ".concat("var(--ds-border-disabled, #0515240F)"),
216
216
  pointerEvents: 'none'
217
+ });
218
+ var deletedTraditionalCellOverlayRoundedStyle = exports.deletedTraditionalCellOverlayRoundedStyle = (0, _lazyNodeView.convertToInlineCss)({
219
+ position: 'absolute',
220
+ top: 0,
221
+ left: 0,
222
+ width: '100%',
223
+ height: '100%',
224
+ backgroundColor: "rgba(from ".concat("var(--ds-background-accent-gray-subtlest, #F0F1F2)", " r g b / 0.5)"),
225
+ zIndex: 2,
226
+ outline: "1px solid ".concat("var(--ds-border-disabled, #0515240F)"),
227
+ pointerEvents: 'none',
228
+ border: 'inherit',
229
+ borderRadius: 'inherit'
217
230
  });
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.createLeftAnchorWidget = exports.createInlineIndicatorAnchorWidgets = exports.createDocMarginAnchorWidget = exports.createBlockIndicatorAnchorWidgets = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
9
  var _utils = require("@atlaskit/editor-prosemirror/utils");
8
10
  var _view = require("@atlaskit/editor-prosemirror/view");
9
11
  var _decorationKeys = require("./decorationKeys");
12
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
14
  /**
11
15
  * Resolves the doc-level block node (table/expand/layout) for `from`, along with
12
16
  * the position right before it (`beforePos`). Falls back to `$from.nodeAfter`
@@ -138,6 +142,7 @@ var createLeftAnchorWidget = exports.createLeftAnchorWidget = function createLef
138
142
  diffId: diffId,
139
143
  anchorType: _decorationKeys.AnchorTypeKey.left
140
144
  });
145
+ var leftResizeObserver;
141
146
  return _view.Decoration.widget(beforePos, function (view, getPos) {
142
147
  // Outer span stays in the flow but takes up no space.
143
148
  var wrapper = document.createElement('div');
@@ -152,13 +157,7 @@ var createLeftAnchorWidget = exports.createLeftAnchorWidget = function createLef
152
157
  anchor.style.setProperty('left', "calc(50% - ".concat((edgeCase === null || edgeCase === void 0 ? void 0 : edgeCase.leftOffset) || 0, "px)"));
153
158
  anchor.style.setProperty('transform', 'translateX(-50%)');
154
159
  wrapper.appendChild(anchor);
155
-
156
- // The block DOM may not be settled synchronously (e.g. after a
157
- // transaction), so defer the measurement like the gap cursor does.
158
- requestAnimationFrame(function () {
159
- // The widget may have been unmounted; bail if its position is gone.
160
- // We still measure the stable block node position, not the widget's
161
- // own position.
160
+ var measureWidth = function measureWidth() {
162
161
  if (getPos() === undefined || edgeCase.measurePos === undefined) {
163
162
  return;
164
163
  }
@@ -167,13 +166,33 @@ var createLeftAnchorWidget = exports.createLeftAnchorWidget = function createLef
167
166
  // The left anchor only needs the container width so the
168
167
  // IndicatorBar can align against the block's horizontal extent.
169
168
  anchor.style.setProperty('width', "".concat(dom.offsetWidth, "px"));
169
+
170
+ // Observe the measured element for size changes (e.g. page
171
+ // resize) so the indicator stays aligned. CCI-17981
172
+ if (!leftResizeObserver) {
173
+ leftResizeObserver = new ResizeObserver(function () {
174
+ if (getPos() !== undefined) {
175
+ anchor.style.setProperty('width', "".concat(dom.offsetWidth, "px"));
176
+ }
177
+ });
178
+ leftResizeObserver.observe(dom);
179
+ }
170
180
  }
171
- });
181
+ };
182
+
183
+ // The block DOM may not be settled synchronously (e.g. after a
184
+ // transaction), so defer the measurement like the gap cursor does.
185
+ requestAnimationFrame(measureWidth);
172
186
  return wrapper;
173
- }, (0, _decorationKeys.buildAnchorDecorationSpec)({
187
+ }, _objectSpread(_objectSpread({}, (0, _decorationKeys.buildAnchorDecorationSpec)({
174
188
  diffId: diffId,
175
189
  anchorType: _decorationKeys.AnchorTypeKey.left,
176
190
  side: -999
191
+ })), {}, {
192
+ destroy: function destroy() {
193
+ var _leftResizeObserver;
194
+ return (_leftResizeObserver = leftResizeObserver) === null || _leftResizeObserver === void 0 ? void 0 : _leftResizeObserver.disconnect();
195
+ }
177
196
  }));
178
197
  };
179
198
 
@@ -234,6 +253,7 @@ var createBlockIndicatorAnchorWidgets = exports.createBlockIndicatorAnchorWidget
234
253
  // Measure the actual cell/row DOM when inside one; otherwise measure the
235
254
  // widget's own position.
236
255
  var measurePos = parentCellOrRow ? parentCellOrRow.pos : from;
256
+ var blockResizeObserver;
237
257
  var blockWidget = _view.Decoration.widget(widgetPos, function (view, getPos) {
238
258
  // Outer span stays in the flow but takes up no space.
239
259
  var wrapper = document.createElement('span');
@@ -245,13 +265,7 @@ var createBlockIndicatorAnchorWidgets = exports.createBlockIndicatorAnchorWidget
245
265
  anchor.style.setProperty('position', 'absolute');
246
266
  anchor.style.setProperty('anchor-name', "--".concat(blockAnchorKey));
247
267
  wrapper.appendChild(anchor);
248
-
249
- // The block DOM may not be settled synchronously (e.g. after a
250
- // transaction), so defer the measurement like the gap cursor does.
251
- requestAnimationFrame(function () {
252
- // The widget may have been unmounted; bail if its position is gone.
253
- // We still measure the stable cell/row node position, not the
254
- // widget's own position.
268
+ var _measureBlock = function measureBlock() {
255
269
  if (getPos() === undefined) {
256
270
  return;
257
271
  }
@@ -270,15 +284,35 @@ var createBlockIndicatorAnchorWidgets = exports.createBlockIndicatorAnchorWidget
270
284
  // The offset already accounts for the cell/row's position, so the
271
285
  // margin-top must not be double-applied.
272
286
  anchor.style.setProperty('margin-top', '0px');
287
+
288
+ // Observe the measured element for size changes (e.g. page
289
+ // resize) so the indicator stays aligned. CCI-17981
290
+ if (!blockResizeObserver) {
291
+ blockResizeObserver = new ResizeObserver(function () {
292
+ if (getPos() !== undefined) {
293
+ _measureBlock();
294
+ }
295
+ });
296
+ blockResizeObserver.observe(dom);
297
+ }
273
298
  }
274
- });
299
+ };
300
+
301
+ // The block DOM may not be settled synchronously (e.g. after a
302
+ // transaction), so defer the measurement like the gap cursor does.
303
+ requestAnimationFrame(_measureBlock);
275
304
  return wrapper;
276
- }, (0, _decorationKeys.buildAnchorDecorationSpec)({
305
+ }, _objectSpread(_objectSpread({}, (0, _decorationKeys.buildAnchorDecorationSpec)({
277
306
  diffId: diffId,
278
307
  // Reuse the `from` anchor type slot; the generated key intentionally
279
308
  // omits the anchor type so the single element backs top/bottom/left.
280
309
  anchorType: _decorationKeys.AnchorTypeKey.from,
281
310
  side: -1
311
+ })), {}, {
312
+ destroy: function destroy() {
313
+ var _blockResizeObserver;
314
+ return (_blockResizeObserver = blockResizeObserver) === null || _blockResizeObserver === void 0 ? void 0 : _blockResizeObserver.disconnect();
315
+ }
282
316
  }));
283
317
  return [blockWidget].concat(maybeLeftAnchor);
284
318
  };
@@ -8,6 +8,7 @@ exports.createBlockChangedDecoration = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _lazyNodeView = require("@atlaskit/editor-common/lazy-node-view");
10
10
  var _view = require("@atlaskit/editor-prosemirror/view");
11
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
11
12
  var _isExtendedEnabled = require("../isExtendedEnabled");
12
13
  var _standard = require("./colorSchemes/standard");
13
14
  var _traditional = require("./colorSchemes/traditional");
@@ -155,7 +156,11 @@ var createBlockChangedDecoration = exports.createBlockChangedDecoration = functi
155
156
  var style;
156
157
  if ((0, _isExtendedEnabled.isExtendedEnabled)(diffType) && ['tableCell', 'tableHeader'].includes(change.name)) {
157
158
  var cellOverlay = document.createElement('div');
158
- var cellOverlayStyle = isInserted ? colorScheme === 'traditional' ? _traditional.traditionalAddedCellOverlayStyle : _standard.addedCellOverlayStyle : colorScheme === 'traditional' ? _traditional.deletedTraditionalCellOverlayStyle : _standard.deletedCellOverlayStyle;
159
+ var isTraditional = colorScheme === 'traditional';
160
+ var isRoundedTable = (0, _expValEquals.expValEquals)('platform_editor_table_diff_rounded_corners', 'isEnabled', true);
161
+ var addedCellStyle = isTraditional ? _traditional.traditionalAddedCellOverlayStyle : _standard.addedCellOverlayStyle;
162
+ var deletedCellStyle = isTraditional ? isRoundedTable ? _traditional.deletedTraditionalCellOverlayRoundedStyle : _traditional.deletedTraditionalCellOverlayStyle : isRoundedTable ? _standard.deletedCellOverlayRoundedStyle : _standard.deletedCellOverlayStyle;
163
+ var cellOverlayStyle = isInserted ? addedCellStyle : deletedCellStyle;
159
164
  cellOverlay.setAttribute('style', cellOverlayStyle);
160
165
  decorations.push(
161
166
  // change.to - 1 to position the overlay inside the end of the cell
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.createInlineChangedDecoration = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _lazyNodeView = require("@atlaskit/editor-common/lazy-node-view");
10
11
  var _view = require("@atlaskit/editor-prosemirror/view");
11
12
  var _isExtendedEnabled = require("../isExtendedEnabled");
@@ -13,9 +14,21 @@ var _standard = require("./colorSchemes/standard");
13
14
  var _traditional = require("./colorSchemes/traditional");
14
15
  var _createAnchorDecorationWidgets = require("./createAnchorDecorationWidgets");
15
16
  var _decorationKeys = require("./decorationKeys");
17
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16
19
  var displayNoneStyle = (0, _lazyNodeView.convertToInlineCss)({
17
20
  display: 'none'
18
21
  });
22
+ var getAtomicInlineNodeClassName = function getAtomicInlineNodeClassName(inlineNodeName, colorScheme) {
23
+ var classNames = ['show-diff-atomic-inline-changed'];
24
+ if (inlineNodeName) {
25
+ classNames.push("show-diff-atomic-inline-changed-".concat(inlineNodeName));
26
+ }
27
+ if (colorScheme === 'traditional') {
28
+ classNames.push('show-diff-atomic-inline-changed-traditional');
29
+ }
30
+ return classNames.join(' ');
31
+ };
19
32
  /**
20
33
  * Inline decoration used for insertions as the content already exists in the document
21
34
  *
@@ -30,6 +43,8 @@ var createInlineChangedDecoration = exports.createInlineChangedDecoration = func
30
43
  isActive = _ref$isActive === void 0 ? false : _ref$isActive,
31
44
  _ref$isInserted = _ref.isInserted,
32
45
  isInserted = _ref$isInserted === void 0 ? true : _ref$isInserted,
46
+ _ref$isAtomicInlineNo = _ref.isAtomicInlineNode,
47
+ isAtomicInlineNode = _ref$isAtomicInlineNo === void 0 ? false : _ref$isAtomicInlineNo,
33
48
  _ref$shouldHideDelete = _ref.shouldHideDeleted,
34
49
  shouldHideDeleted = _ref$shouldHideDelete === void 0 ? false : _ref$shouldHideDelete,
35
50
  _ref$showIndicators = _ref.showIndicators,
@@ -37,7 +52,8 @@ var createInlineChangedDecoration = exports.createInlineChangedDecoration = func
37
52
  doc = _ref.doc,
38
53
  diffType = _ref.diffType,
39
54
  _ref$hideAddedDiffsUn = _ref.hideAddedDiffsUnderline,
40
- hideAddedDiffsUnderline = _ref$hideAddedDiffsUn === void 0 ? false : _ref$hideAddedDiffsUn;
55
+ hideAddedDiffsUnderline = _ref$hideAddedDiffsUn === void 0 ? false : _ref$hideAddedDiffsUn,
56
+ inlineNodeName = _ref.inlineNodeName;
41
57
  var diffId = crypto.randomUUID();
42
58
  if (shouldHideDeleted) {
43
59
  return [_view.Decoration.inline(change.fromB, change.toB, {
@@ -76,10 +92,13 @@ var createInlineChangedDecoration = exports.createInlineChangedDecoration = func
76
92
  style = isActive ? _standard.editingStyleActive : _standard.editingStyle;
77
93
  }
78
94
  }
79
- var decorations = [_view.Decoration.inline(change.fromB, change.toB, {
80
- style: style,
95
+ var decorations = [_view.Decoration.inline(change.fromB, change.toB, _objectSpread(_objectSpread({
96
+ style: style
97
+ }, isAtomicInlineNode && isInserted && {
98
+ class: getAtomicInlineNodeClassName(inlineNodeName, colorScheme)
99
+ }), {}, {
81
100
  'data-testid': 'show-diff-changed-decoration'
82
- }, (0, _decorationKeys.buildDiffDecorationSpec)({
101
+ }), (0, _decorationKeys.buildDiffDecorationSpec)({
83
102
  decorationType: 'inline',
84
103
  diffId: diffId,
85
104
  isActive: isActive
@@ -1,11 +1,16 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.stepIsValidAttrChange = exports.getAttrChangeRanges = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
9
  var _steps = require("@atlaskit/adf-schema/steps");
8
10
  var _transform = require("@atlaskit/editor-prosemirror/transform");
11
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
12
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
14
  var filterUndefined = function filterUndefined(x) {
10
15
  return !!x;
11
16
  };
@@ -19,6 +24,26 @@ var dateAttrs = ['timestamp'];
19
24
  // Attribute that indicates a task item state change
20
25
  var taskItemAttrs = ['state'];
21
26
 
27
+ // Attributes that indicate an emoji change
28
+ var emojiAttrs = ['shortName', 'id', 'text'];
29
+
30
+ // Attributes that indicate a mention change (who is mentioned)
31
+ var mentionAttrs = ['id', 'text'];
32
+
33
+ // Attributes that indicate a status change (label or colour)
34
+ var statusAttrs = ['text', 'color'];
35
+
36
+ // Map of node type name → the attrs that represent a meaningful content change for that node
37
+ var inlineNodeAttrMap = {
38
+ date: dateAttrs,
39
+ emoji: emojiAttrs,
40
+ mention: mentionAttrs,
41
+ status: statusAttrs
42
+ };
43
+ var isInlineAttrChangeNodeName = function isInlineAttrChangeNodeName(nodeName) {
44
+ return nodeName in inlineNodeAttrMap;
45
+ };
46
+
22
47
  // Attributes excluded from extension change detection (not meaningful content changes)
23
48
  var extensionExcludedAttrs = ['localId'];
24
49
 
@@ -33,7 +58,7 @@ var getStepAttrs = function getStepAttrs(step) {
33
58
  }
34
59
  return [];
35
60
  };
36
- var getAttrChangeRanges = exports.getAttrChangeRanges = function getAttrChangeRanges(doc, steps) {
61
+ var getAttrChangeRanges = exports.getAttrChangeRanges = function getAttrChangeRanges(doc, steps, originalDoc) {
37
62
  return steps.map(function (step) {
38
63
  if (!(step instanceof _transform.AttrStep) && !(step instanceof _steps.SetAttrsStep)) {
39
64
  return undefined;
@@ -45,14 +70,39 @@ var getAttrChangeRanges = exports.getAttrChangeRanges = function getAttrChangeRa
45
70
  // date node: timestamp attribute change — highlight the date node itself (inline)
46
71
  if (stepAttrs.some(function (v) {
47
72
  return dateAttrs.includes(v);
48
- }) && (nodeAtPos === null || nodeAtPos === void 0 ? void 0 : nodeAtPos.type.name) === 'date') {
73
+ }) && (nodeAtPos === null || nodeAtPos === void 0 ? void 0 : nodeAtPos.type.name) === 'date' && !(0, _expValEquals.expValEquals)('platform_editor_improve_inline_diffs', 'isEnabled', true)) {
49
74
  return {
50
75
  fromB: step.pos,
51
76
  toB: step.pos + nodeAtPos.nodeSize,
52
- isInline: true
77
+ isInline: true,
78
+ inlineNodeName: 'date'
53
79
  };
54
80
  }
55
81
 
82
+ // The following inline node attr changes are gated behind platform_editor_improve_inline_diffs.
83
+ // The changeset path (createDecorationsForChange) handles the deletion widget via
84
+ // prosemirror-changeset; we only need to add the inline insertion highlight here.
85
+ if ((0, _expValEquals.expValEquals)('platform_editor_improve_inline_diffs', 'isEnabled', true) && nodeAtPos) {
86
+ var nodeName = nodeAtPos.type.name;
87
+ if (isInlineAttrChangeNodeName(nodeName)) {
88
+ var watchedAttrs = inlineNodeAttrMap[nodeName];
89
+ if (stepAttrs.some(function (v) {
90
+ return watchedAttrs.includes(v);
91
+ })) {
92
+ var originalNodeAtPos = originalDoc === null || originalDoc === void 0 ? void 0 : originalDoc.nodeAt(step.pos);
93
+ return _objectSpread({
94
+ fromB: step.pos,
95
+ toB: step.pos + nodeAtPos.nodeSize,
96
+ isInline: true,
97
+ inlineNodeName: nodeName
98
+ }, originalNodeAtPos && {
99
+ fromA: step.pos,
100
+ toA: step.pos + originalNodeAtPos.nodeSize
101
+ });
102
+ }
103
+ }
104
+ }
105
+
56
106
  // taskItem node: state attribute change — highlight the taskItem node
57
107
  if (stepAttrs.some(function (v) {
58
108
  return taskItemAttrs.includes(v);
@@ -86,7 +136,17 @@ var getAttrChangeRanges = exports.getAttrChangeRanges = function getAttrChangeRa
86
136
  };
87
137
  }
88
138
  return undefined;
89
- }).filter(filterUndefined);
139
+ }).filter(filterUndefined)
140
+ // Deduplicate by node position: multiple AttrSteps on the same node
141
+ // (e.g. setNodeAttribute(pos, 'text', ...) + setNodeAttribute(pos, 'color', ...))
142
+ // should produce only one decoration, not one per step.
143
+ // Gated behind the same experiment as the inline node attr changes that introduced
144
+ // the possibility of multiple ranges for the same node position.
145
+ .filter(function (range, i, arr) {
146
+ return !(0, _expValEquals.expValEquals)('platform_editor_improve_inline_diffs', 'isEnabled', true) || arr.findIndex(function (r) {
147
+ return r.fromB === range.fromB;
148
+ }) === i;
149
+ });
90
150
  };
91
151
 
92
152
  /**
@@ -390,16 +390,43 @@ const calculateDiffDecorationsInner = ({
390
390
  isInserted: true
391
391
  }));
392
392
  });
393
- getAttrChangeRanges(tr.doc, attrSteps).forEach(change => {
393
+ getAttrChangeRanges(tr.doc, attrSteps, originalDoc).forEach(change => {
394
394
  if (change.isInline) {
395
- // Inline nodes (e.g. date) need an inline decoration rather than a block decoration
395
+ // Inline nodes (e.g. date, emoji, mention, status) need an inline decoration rather than a block decoration
396
396
  const isActive = activeIndexPos && change.fromB === activeIndexPos.from && change.toB === activeIndexPos.to;
397
+ const isAtomicInlineNodeFlag = expValEquals('platform_editor_improve_inline_diffs', 'isEnabled', true);
397
398
  decorations.push(...createInlineChangedDecoration({
398
399
  change,
399
400
  colorScheme,
400
401
  isActive,
401
- isInserted: true
402
+ isInserted: true,
403
+ isAtomicInlineNode: isAtomicInlineNodeFlag,
404
+ inlineNodeName: change.inlineNodeName,
405
+ // Suppress the border-bottom underline for atomic inline nodeviews —
406
+ // it doesn't render on custom nodeview DOM elements and is unnecessary noise.
407
+ hideAddedDiffsUnderline: isAtomicInlineNodeFlag,
408
+ diffType
402
409
  }));
410
+ // If we have the original node position, also render the old node as a "deleted" widget
411
+ // so the user can see what it looked like before the change.
412
+ if (change.fromA !== undefined && change.toA !== undefined && expValEquals('platform_editor_improve_inline_diffs', 'isEnabled', true)) {
413
+ decorations.push(...createNodeChangedDecorationWidget({
414
+ change: {
415
+ fromA: change.fromA,
416
+ toA: change.toA,
417
+ fromB: change.fromB,
418
+ toB: change.toB,
419
+ deleted: []
420
+ },
421
+ doc: originalDoc,
422
+ nodeViewSerializer,
423
+ colorScheme,
424
+ newDoc: tr.doc,
425
+ intl,
426
+ activeIndexPos,
427
+ isInserted: false
428
+ }));
429
+ }
403
430
  } else {
404
431
  decorations.push(...calculateNodesForBlockDecoration({
405
432
  doc: tr.doc,
@@ -180,4 +180,17 @@ export const deletedCellOverlayStyle = convertToInlineCss({
180
180
  zIndex: 1,
181
181
  outline: `1px solid ${"var(--ds-border-accent-gray, #7D818A)"}`,
182
182
  pointerEvents: 'none'
183
+ });
184
+ export const deletedCellOverlayRoundedStyle = convertToInlineCss({
185
+ position: 'absolute',
186
+ top: 0,
187
+ left: 0,
188
+ width: '100%',
189
+ height: '100%',
190
+ backgroundColor: `rgba(from ${"var(--ds-background-accent-gray-subtlest, #F0F1F2)"} r g b / 0.5)`,
191
+ zIndex: 2,
192
+ outline: `1px solid ${"var(--ds-border-accent-gray, #7D818A)"}`,
193
+ pointerEvents: 'none',
194
+ border: 'inherit',
195
+ borderRadius: 'inherit'
183
196
  });
@@ -82,7 +82,7 @@ export const deletedTraditionalBlockOutlineRoundedActive = convertToInlineCss({
82
82
  borderRadius: `calc(${"var(--ds-radius-xsmall, 2px)"} + 1px)`
83
83
  });
84
84
 
85
- /** Scroll-navigation “new” emphasis: 4px ring (see {@link traditionalStyleNodeNew}). */
85
+ /** Scroll-navigation “new” emphasis: 4px ring. */
86
86
  export const deletedTraditionalBlockOutlineNew = convertToInlineCss({
87
87
  boxShadow: `0 0 0 4px ${"var(--ds-background-accent-red-subtlest, #FFECEB)"}`,
88
88
  borderRadius: "var(--ds-radius-small, 4px)"
@@ -206,4 +206,17 @@ export const deletedTraditionalCellOverlayStyle = convertToInlineCss({
206
206
  zIndex: 1,
207
207
  outline: `1px solid ${"var(--ds-border-disabled, #0515240F)"}`,
208
208
  pointerEvents: 'none'
209
+ });
210
+ export const deletedTraditionalCellOverlayRoundedStyle = convertToInlineCss({
211
+ position: 'absolute',
212
+ top: 0,
213
+ left: 0,
214
+ width: '100%',
215
+ height: '100%',
216
+ backgroundColor: `rgba(from ${"var(--ds-background-accent-gray-subtlest, #F0F1F2)"} r g b / 0.5)`,
217
+ zIndex: 2,
218
+ outline: `1px solid ${"var(--ds-border-disabled, #0515240F)"}`,
219
+ pointerEvents: 'none',
220
+ border: 'inherit',
221
+ borderRadius: 'inherit'
209
222
  });