@atlaskit/react-ufo 3.13.12 → 3.13.14

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 (42) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/cjs/config/index.js +4 -4
  3. package/dist/cjs/create-payload/index.js +1 -2
  4. package/dist/cjs/create-payload/utils/get-ssr-done-time-value.js +1 -2
  5. package/dist/cjs/interaction-ignore/ufo-interaction-ignore.js +1 -2
  6. package/dist/cjs/interaction-metrics/index.js +10 -10
  7. package/dist/cjs/interaction-metrics-init/index.js +1 -2
  8. package/dist/cjs/label/UFOLabel.js +1 -2
  9. package/dist/cjs/load-hold/UFOLoadHold.js +1 -2
  10. package/dist/cjs/placeholder/Placeholder.js +1 -2
  11. package/dist/cjs/placeholder/loosely-lazy/lazy-suspense.js +1 -2
  12. package/dist/cjs/segment/segment-highlight.js +1 -2
  13. package/dist/cjs/segment/segment.js +1 -2
  14. package/dist/cjs/trace-transition/index.js +1 -2
  15. package/dist/cjs/vc/vc-observer/getVCRevisionsData.js +15 -5
  16. package/dist/cjs/vc/vc-observer/index.js +38 -51
  17. package/dist/cjs/vc/vc-observer/media-wrapper/index.js +1 -2
  18. package/dist/cjs/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +76 -42
  19. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +1 -15
  20. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +2 -2
  21. package/dist/cjs/vc/vc-observer-new/metric-calculator/percentile-calc/index.js +1 -2
  22. package/dist/es2019/interaction-metrics/index.js +10 -10
  23. package/dist/es2019/vc/vc-observer/getVCRevisionsData.js +15 -5
  24. package/dist/es2019/vc/vc-observer/index.js +3 -18
  25. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +40 -22
  26. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +1 -13
  27. package/dist/esm/config/index.js +4 -4
  28. package/dist/esm/interaction-metrics/index.js +10 -10
  29. package/dist/esm/vc/vc-observer/getVCRevisionsData.js +15 -5
  30. package/dist/esm/vc/vc-observer/index.js +38 -51
  31. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +77 -43
  32. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +1 -15
  33. package/dist/esm/vc/vc-observer-new/metric-calculator/percentile-calc/canvas-heatmap/index.js +2 -2
  34. package/dist/types/common/vc/types.d.ts +1 -0
  35. package/dist/types/vc/vc-observer/getVCRevisionsData.d.ts +3 -2
  36. package/dist/types/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
  37. package/dist/types/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +0 -1
  38. package/dist/types-ts4.5/common/vc/types.d.ts +1 -0
  39. package/dist/types-ts4.5/vc/vc-observer/getVCRevisionsData.d.ts +3 -2
  40. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -1
  41. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/fy25_03/index.d.ts +0 -1
  42. package/package.json +4 -7
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
9
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
@@ -28,6 +29,53 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
28
29
  return 'rect' in entry.data;
29
30
  });
30
31
  }
32
+
33
+ /**
34
+ * Calculate ratios for each element based on their viewport coverage.
35
+ */
36
+ }, {
37
+ key: "calculateRatios",
38
+ value: function calculateRatios(filteredEntries) {
39
+ var ratios = {};
40
+ var viewportWidth = (0, _getViewportWidth.default)();
41
+ var viewportHeight = (0, _getViewportHeight.default)();
42
+ var totalViewportArea = viewportWidth * viewportHeight;
43
+ if (totalViewportArea === 0) {
44
+ return ratios;
45
+ }
46
+ var elementRects = new Map();
47
+ var _iterator = _createForOfIteratorHelper(filteredEntries),
48
+ _step;
49
+ try {
50
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
51
+ var _entry = _step.value;
52
+ if ('rect' in _entry.data) {
53
+ var viewportEntry = _entry.data;
54
+ elementRects.set(viewportEntry.elementName, viewportEntry.rect);
55
+ }
56
+ }
57
+ } catch (err) {
58
+ _iterator.e(err);
59
+ } finally {
60
+ _iterator.f();
61
+ }
62
+ var _iterator2 = _createForOfIteratorHelper(elementRects),
63
+ _step2;
64
+ try {
65
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
66
+ var _step2$value = (0, _slicedToArray2.default)(_step2.value, 2),
67
+ elementName = _step2$value[0],
68
+ rect = _step2$value[1];
69
+ var elementArea = rect.width * rect.height;
70
+ ratios[elementName] = elementArea / totalViewportArea;
71
+ }
72
+ } catch (err) {
73
+ _iterator2.e(err);
74
+ } finally {
75
+ _iterator2.f();
76
+ }
77
+ return ratios;
78
+ }
31
79
  }, {
32
80
  key: "calculateBasic",
33
81
  value: function () {
@@ -67,7 +115,7 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
67
115
  key: "calculateWithDebugInfo",
68
116
  value: function () {
69
117
  var _calculateWithDebugInfo = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason) {
70
- var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator, _step, _entry, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, _ufo_devtool_onVCRev, _ref;
118
+ var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator3, _step3, _entry2, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, _ufo_devtool_onVCRev, _ref;
71
119
  return _regenerator.default.wrap(function _callee2$(_context2) {
72
120
  while (1) switch (_context2.prev = _context2.next) {
73
121
  case 0:
@@ -92,16 +140,16 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
92
140
  _context2.next = 28;
93
141
  break;
94
142
  }
95
- _iterator = _createForOfIteratorHelper(vcLogs);
143
+ _iterator3 = _createForOfIteratorHelper(vcLogs);
96
144
  _context2.prev = 10;
97
- _iterator.s();
145
+ _iterator3.s();
98
146
  case 12:
99
- if ((_step = _iterator.n()).done) {
147
+ if ((_step3 = _iterator3.n()).done) {
100
148
  _context2.next = 20;
101
149
  break;
102
150
  }
103
- _entry = _step.value;
104
- time = _entry.time, viewportPercentage = _entry.viewportPercentage, entries = _entry.entries; // Only process entries if we haven't reached all percentiles
151
+ _entry2 = _step3.value;
152
+ time = _entry2.time, viewportPercentage = _entry2.viewportPercentage, entries = _entry2.entries; // Only process entries if we haven't reached all percentiles
105
153
  if (!(percentileIndex >= percentiles.length)) {
106
154
  _context2.next = 17;
107
155
  break;
@@ -138,10 +186,10 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
138
186
  case 22:
139
187
  _context2.prev = 22;
140
188
  _context2.t0 = _context2["catch"](10);
141
- _iterator.e(_context2.t0);
189
+ _iterator3.e(_context2.t0);
142
190
  case 25:
143
191
  _context2.prev = 25;
144
- _iterator.f();
192
+ _iterator3.f();
145
193
  return _context2.finish(25);
146
194
  case 28:
147
195
  // Fill in any missing percentiles with the last known values
@@ -181,7 +229,7 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
181
229
  }
182
230
  }, _callee2, this, [[10, 22, 25, 28]]);
183
231
  }));
184
- function calculateWithDebugInfo(_x4, _x5, _x6, _x7, _x8, _x9, _x10) {
232
+ function calculateWithDebugInfo(_x4, _x5, _x6, _x7, _x8, _x9, _x0) {
185
233
  return _calculateWithDebugInfo.apply(this, arguments);
186
234
  }
187
235
  return calculateWithDebugInfo;
@@ -193,7 +241,7 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
193
241
  var _this = this,
194
242
  _vcDetails$90$t,
195
243
  _vcDetails$;
196
- var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, useDebugInfo, vcDetails;
244
+ var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, useDebugInfo, vcDetails, result;
197
245
  return _regenerator.default.wrap(function _callee3$(_context3) {
198
246
  while (1) switch (_context3.prev = _context3.next) {
199
247
  case 0:
@@ -201,15 +249,11 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
201
249
  filteredEntries = orderedEntries.filter(function (entry) {
202
250
  return _this.isEntryIncluded(entry);
203
251
  });
204
- if (!(0, _platformFeatureFlags.fg)('platform_ufo_add_vc_abort_reason_by_revisions')) {
205
- _context3.next = 10;
206
- break;
207
- }
208
252
  getVCCleanStatusResult = this.getVCCleanStatus(filteredEntries);
209
253
  isVCClean = getVCCleanStatusResult.isVCClean;
210
254
  dirtyReason = getVCCleanStatusResult.dirtyReason;
211
255
  if (isVCClean) {
212
- _context3.next = 8;
256
+ _context3.next = 7;
213
257
  break;
214
258
  }
215
259
  return _context3.abrupt("return", {
@@ -218,52 +262,42 @@ var AbstractVCCalculatorBase = exports.default = /*#__PURE__*/function () {
218
262
  clean: false,
219
263
  abortReason: dirtyReason
220
264
  });
221
- case 8:
222
- _context3.next = 13;
223
- break;
224
- case 10:
225
- isVCClean = this.isVCClean(filteredEntries);
226
- if (isVCClean) {
227
- _context3.next = 13;
228
- break;
229
- }
230
- return _context3.abrupt("return", {
231
- revision: this.revisionNo,
232
- 'metric:vc90': null,
233
- clean: false
234
- });
235
- case 13:
265
+ case 7:
236
266
  useDebugInfo = (0, _platformFeatureFlags.fg)('platform_ufo_ttvc_v3_devtool');
237
267
  if (!useDebugInfo) {
238
- _context3.next = 20;
268
+ _context3.next = 14;
239
269
  break;
240
270
  }
241
- _context3.next = 17;
271
+ _context3.next = 11;
242
272
  return this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason);
243
- case 17:
273
+ case 11:
244
274
  _context3.t0 = _context3.sent;
245
- _context3.next = 23;
275
+ _context3.next = 17;
246
276
  break;
247
- case 20:
248
- _context3.next = 22;
277
+ case 14:
278
+ _context3.next = 16;
249
279
  return this.calculateBasic(filteredEntries, startTime, stopTime);
250
- case 22:
280
+ case 16:
251
281
  _context3.t0 = _context3.sent;
252
- case 23:
282
+ case 17:
253
283
  vcDetails = _context3.t0;
254
- return _context3.abrupt("return", {
284
+ result = {
255
285
  revision: this.revisionNo,
256
286
  clean: true,
257
287
  'metric:vc90': (_vcDetails$90$t = vcDetails === null || vcDetails === void 0 || (_vcDetails$ = vcDetails['90']) === null || _vcDetails$ === void 0 ? void 0 : _vcDetails$.t) !== null && _vcDetails$90$t !== void 0 ? _vcDetails$90$t : null,
258
288
  vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined
259
- });
260
- case 25:
289
+ };
290
+ if ((0, _platformFeatureFlags.fg)('platform_ufo_rev_ratios')) {
291
+ result.ratios = this.calculateRatios(filteredEntries);
292
+ }
293
+ return _context3.abrupt("return", result);
294
+ case 21:
261
295
  case "end":
262
296
  return _context3.stop();
263
297
  }
264
298
  }, _callee3, this);
265
299
  }));
266
- function calculate(_x11) {
300
+ function calculate(_x1) {
267
301
  return _calculate.apply(this, arguments);
268
302
  }
269
303
  return calculate;
@@ -47,7 +47,7 @@ var VCCalculator_FY25_03 = exports.default = /*#__PURE__*/function (_AbstractVCC
47
47
  if (attributeName === 'data-aui-version' && (0, _platformFeatureFlags.fg)('platform_ufo_filter_out_aui_attribute_changes')) {
48
48
  return false;
49
49
  }
50
- if ((attributeName === 'data-testid' || attributeName === 'data-vc' || attributeName === 'data-ssr-placeholder' || attributeName === 'data-ssr-placeholder-replace' || attributeName === 'data-vc-nvs' || attributeName === 'data-media-vc-wrapper' || attributeName === 'data-auto-scrollable' || attributeName === 'id' || attributeName === 'tabindex' || NON_VISUAL_ARIA_ATTRIBUTES.includes(attributeName)) && (0, _platformFeatureFlags.fg)('platform_ufo_ignore_non_vis_attributes')) {
50
+ if (attributeName === 'data-testid' || attributeName === 'data-vc' || attributeName === 'data-ssr-placeholder' || attributeName === 'data-ssr-placeholder-replace' || attributeName === 'data-vc-nvs' || attributeName === 'data-media-vc-wrapper' || attributeName === 'data-auto-scrollable' || attributeName === 'id' || attributeName === 'tabindex' || NON_VISUAL_ARIA_ATTRIBUTES.includes(attributeName)) {
51
51
  return false;
52
52
  }
53
53
  return true;
@@ -57,20 +57,6 @@ var VCCalculator_FY25_03 = exports.default = /*#__PURE__*/function (_AbstractVCC
57
57
  }
58
58
  return true;
59
59
  }
60
- }, {
61
- key: "isVCClean",
62
- value: function isVCClean(filteredEntries) {
63
- var hasAbortEvent = filteredEntries.some(function (entry) {
64
- if (entry.data.type === 'window:event') {
65
- var data = entry.data;
66
- if (ABORTING_WINDOW_EVENT.includes(data.eventType)) {
67
- return true;
68
- }
69
- }
70
- return false;
71
- });
72
- return !hasAbortEvent;
73
- }
74
60
  }, {
75
61
  key: "getVCCleanStatus",
76
62
  value: function getVCCleanStatus(filteredEntries) {
@@ -214,8 +214,8 @@ function calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, totalPix
214
214
  var sortedEntries = Array.from(timePixelCounts.entries()).sort(function (_ref7, _ref8) {
215
215
  var _ref9 = (0, _slicedToArray2.default)(_ref7, 1),
216
216
  timeA = _ref9[0];
217
- var _ref10 = (0, _slicedToArray2.default)(_ref8, 1),
218
- timeB = _ref10[0];
217
+ var _ref0 = (0, _slicedToArray2.default)(_ref8, 1),
218
+ timeB = _ref0[0];
219
219
  return Number(timeA) - Number(timeB);
220
220
  });
221
221
  for (var i = 0; i < sortedEntries.length; i++) {
@@ -17,5 +17,4 @@ Object.defineProperty(exports, "calculateTTVCPercentilesWithDebugInfo", {
17
17
  }
18
18
  });
19
19
  var _canvasHeatmap = _interopRequireWildcard(require("./canvas-heatmap"));
20
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
21
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
+ 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); }
@@ -581,11 +581,11 @@ function callCancelCallbacks(interaction) {
581
581
  export function abort(interactionId, abortReason) {
582
582
  const interaction = interactions.get(interactionId);
583
583
  if (interaction != null) {
584
- var _getConfig10, _getConfig10$experime;
584
+ var _getConfig0, _getConfig0$experimen;
585
585
  callCancelCallbacks(interaction);
586
586
  interaction.abortReason = abortReason;
587
587
  finishInteraction(interactionId, interaction);
588
- if ((_getConfig10 = getConfig()) !== null && _getConfig10 !== void 0 && (_getConfig10$experime = _getConfig10.experimentalInteractionMetrics) !== null && _getConfig10$experime !== void 0 && _getConfig10$experime.enabled) {
588
+ if ((_getConfig0 = getConfig()) !== null && _getConfig0 !== void 0 && (_getConfig0$experimen = _getConfig0.experimentalInteractionMetrics) !== null && _getConfig0$experimen !== void 0 && _getConfig0$experimen.enabled) {
589
589
  onExperimentalInteractionComplete(interactionId, interaction);
590
590
  remove(interactionId);
591
591
  }
@@ -594,12 +594,12 @@ export function abort(interactionId, abortReason) {
594
594
  export function abortByNewInteraction(interactionId, interactionName) {
595
595
  const interaction = interactions.get(interactionId);
596
596
  if (interaction != null) {
597
- var _getConfig11, _getConfig11$experime;
597
+ var _getConfig1, _getConfig1$experimen;
598
598
  callCancelCallbacks(interaction);
599
599
  interaction.abortReason = 'new_interaction';
600
600
  interaction.abortedByInteractionName = interactionName;
601
601
  finishInteraction(interactionId, interaction);
602
- if ((_getConfig11 = getConfig()) !== null && _getConfig11 !== void 0 && (_getConfig11$experime = _getConfig11.experimentalInteractionMetrics) !== null && _getConfig11$experime !== void 0 && _getConfig11$experime.enabled) {
602
+ if ((_getConfig1 = getConfig()) !== null && _getConfig1 !== void 0 && (_getConfig1$experimen = _getConfig1.experimentalInteractionMetrics) !== null && _getConfig1$experimen !== void 0 && _getConfig1$experimen.enabled) {
603
603
  onExperimentalInteractionComplete(interactionId, interaction);
604
604
  remove(interactionId);
605
605
  }
@@ -607,7 +607,7 @@ export function abortByNewInteraction(interactionId, interactionName) {
607
607
  }
608
608
  export function abortAll(abortReason, abortedByInteractionName) {
609
609
  interactions.forEach((interaction, interactionId) => {
610
- var _getConfig12, _getConfig12$experime;
610
+ var _getConfig10, _getConfig10$experime;
611
611
  const noMoreHolds = interaction.holdActive.size === 0;
612
612
  if (!noMoreHolds) {
613
613
  callCancelCallbacks(interaction);
@@ -617,7 +617,7 @@ export function abortAll(abortReason, abortedByInteractionName) {
617
617
  }
618
618
  }
619
619
  finishInteraction(interactionId, interaction);
620
- if ((_getConfig12 = getConfig()) !== null && _getConfig12 !== void 0 && (_getConfig12$experime = _getConfig12.experimentalInteractionMetrics) !== null && _getConfig12$experime !== void 0 && _getConfig12$experime.enabled) {
620
+ if ((_getConfig10 = getConfig()) !== null && _getConfig10 !== void 0 && (_getConfig10$experime = _getConfig10.experimentalInteractionMetrics) !== null && _getConfig10$experime !== void 0 && _getConfig10$experime.enabled) {
621
621
  onExperimentalInteractionComplete(interactionId, interaction);
622
622
  remove(interactionId);
623
623
  }
@@ -628,8 +628,8 @@ export function addOnCancelCallback(id, cancelCallback) {
628
628
  interaction === null || interaction === void 0 ? void 0 : interaction.cancelCallbacks.push(cancelCallback);
629
629
  }
630
630
  export function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelStack, routeName, trace = null) {
631
- var _getConfig13, _getConfig13$postInte;
632
- if ((_getConfig13 = getConfig()) !== null && _getConfig13 !== void 0 && (_getConfig13$postInte = _getConfig13.postInteractionLog) !== null && _getConfig13$postInte !== void 0 && _getConfig13$postInte.enabled) {
631
+ var _getConfig11, _getConfig11$postInte;
632
+ if ((_getConfig11 = getConfig()) !== null && _getConfig11 !== void 0 && (_getConfig11$postInte = _getConfig11.postInteractionLog) !== null && _getConfig11$postInte !== void 0 && _getConfig11$postInte.enabled) {
633
633
  postInteractionLog.reset();
634
634
  }
635
635
  let previousTime = startTime;
@@ -717,7 +717,7 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
717
717
  addHoldByID(interactionId, [], ufoName, ufoName, true);
718
718
  }
719
719
  if (type === 'transition') {
720
- var _getConfig14, _getConfig14$experime;
720
+ var _getConfig12, _getConfig12$experime;
721
721
  getVCObserver().start({
722
722
  startTime,
723
723
  experienceKey: ufoName
@@ -725,7 +725,7 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
725
725
  postInteractionLog.startVCObserver({
726
726
  startTime
727
727
  });
728
- if ((_getConfig14 = getConfig()) !== null && _getConfig14 !== void 0 && (_getConfig14$experime = _getConfig14.experimentalInteractionMetrics) !== null && _getConfig14$experime !== void 0 && _getConfig14$experime.enabled) {
728
+ if ((_getConfig12 = getConfig()) !== null && _getConfig12 !== void 0 && (_getConfig12$experime = _getConfig12.experimentalInteractionMetrics) !== null && _getConfig12$experime !== void 0 && _getConfig12$experime.enabled) {
729
729
  experimentalVC.start({
730
730
  startTime
731
731
  });
@@ -1,3 +1,4 @@
1
+ import { fg } from '@atlaskit/platform-feature-flags';
1
2
  import { isVCRevisionEnabled } from '../../config';
2
3
  import { getPageVisibilityState } from '../../hidden-timing';
3
4
  const VCParts = ['25', '50', '75', '80', '85', '90', '95', '98', '99'];
@@ -33,27 +34,36 @@ export function getVCRevisionsData({
33
34
  isEventAborted,
34
35
  calculatedVC,
35
36
  calculatedVCNext,
36
- experienceKey
37
+ experienceKey,
38
+ ratios
37
39
  }) {
38
40
  const pageVisibilityUpToTTAI = getPageVisibilityState(interaction.start, interaction.end);
39
41
  const isVisiblePageVisibleUpToTTAI = pageVisibilityUpToTTAI === 'visible';
40
42
  const shouldHaveVCmetric = isVCClean && !isEventAborted && isVisiblePageVisibleUpToTTAI;
41
43
  const availableVCRevisionPayloads = [];
42
44
  if (isVCRevisionEnabled('fy25.01', experienceKey)) {
43
- availableVCRevisionPayloads.push({
45
+ const revision = {
44
46
  revision: 'fy25.01',
45
47
  clean: isVCClean,
46
48
  'metric:vc90': shouldHaveVCmetric ? calculatedVC.VC['90'] : null,
47
49
  vcDetails: createVCDetails(calculatedVC, shouldHaveVCmetric)
48
- });
50
+ };
51
+ if (shouldHaveVCmetric && fg('platform_ufo_rev_ratios')) {
52
+ revision.ratios = ratios;
53
+ }
54
+ availableVCRevisionPayloads.push(revision);
49
55
  }
50
56
  if (isVCRevisionEnabled('fy25.02', experienceKey)) {
51
- availableVCRevisionPayloads.push({
57
+ const revision = {
52
58
  revision: 'fy25.02',
53
59
  clean: isVCClean,
54
60
  'metric:vc90': shouldHaveVCmetric ? calculatedVCNext.VC['90'] : null,
55
61
  vcDetails: createVCDetails(calculatedVCNext, shouldHaveVCmetric)
56
- });
62
+ };
63
+ if (shouldHaveVCmetric && fg('platform_ufo_rev_ratios')) {
64
+ revision.ratios = ratios;
65
+ }
66
+ availableVCRevisionPayloads.push(revision);
57
67
  }
58
68
  return {
59
69
  [`${fullPrefix}vc:rev`]: availableVCRevisionPayloads
@@ -117,11 +117,7 @@ export class VCObserver {
117
117
  ratios
118
118
  } = rawData;
119
119
  const isTTVCv1Disabled = !isVCRevisionEnabled('fy25.01', experienceKey);
120
-
121
- // NOTE: as part of platform_ufo_add_vc_abort_reason_by_revisions feature,
122
- // we want to report abort by scroll events the same way as other abort reasons
123
- // i.e. not have the concept of `abortReason.blocking` anymore
124
- if (abortReasonInfo !== null && fg('platform_ufo_add_vc_abort_reason_by_revisions')) {
120
+ if (abortReasonInfo !== null) {
125
121
  // exposing data to devtools
126
122
  try {
127
123
  if (devToolsEnabled && !this.isPostInteraction) {
@@ -148,18 +144,6 @@ export class VCObserver {
148
144
  });
149
145
  }
150
146
  return vcAbortedResultWithRevisions;
151
- } else if (abortReasonInfo !== null && abortReason.blocking) {
152
- // exposing data to devtools
153
- try {
154
- if (devToolsEnabled && !this.isPostInteraction) {
155
- window.__vcNotAvailableReason = abortReasonInfo;
156
- }
157
- } catch (e) {}
158
- return {
159
- [`${fullPrefix}vc:state`]: false,
160
- [`${fullPrefix}vc:abort:reason`]: abortReasonInfo,
161
- [`${fullPrefix}vc:abort:timestamp`]: abortReason.timestamp
162
- };
163
147
  }
164
148
  const ttvcV1Result = isTTVCv1Disabled ? {
165
149
  VC: {},
@@ -346,7 +330,8 @@ export class VCObserver {
346
330
  VCBox: vcNext.VCBox
347
331
  },
348
332
  isEventAborted,
349
- experienceKey
333
+ experienceKey,
334
+ ratios
350
335
  });
351
336
  const speedIndex = {
352
337
  [`ufo:speedIndex`]: isTTVCv1Disabled ? vcNext.VCEntries.speedIndex : VCEntries.speedIndex,
@@ -11,6 +11,31 @@ export default class AbstractVCCalculatorBase {
11
11
  return 'rect' in entry.data;
12
12
  });
13
13
  }
14
+
15
+ /**
16
+ * Calculate ratios for each element based on their viewport coverage.
17
+ */
18
+ calculateRatios(filteredEntries) {
19
+ const ratios = {};
20
+ const viewportWidth = getViewportWidth();
21
+ const viewportHeight = getViewportHeight();
22
+ const totalViewportArea = viewportWidth * viewportHeight;
23
+ if (totalViewportArea === 0) {
24
+ return ratios;
25
+ }
26
+ const elementRects = new Map();
27
+ for (const entry of filteredEntries) {
28
+ if ('rect' in entry.data) {
29
+ const viewportEntry = entry.data;
30
+ elementRects.set(viewportEntry.elementName, viewportEntry.rect);
31
+ }
32
+ }
33
+ for (const [elementName, rect] of elementRects) {
34
+ const elementArea = rect.width * rect.height;
35
+ ratios[elementName] = elementArea / totalViewportArea;
36
+ }
37
+ return ratios;
38
+ }
14
39
  async calculateBasic(filteredEntries, startTime, stopTime) {
15
40
  const percentiles = [25, 50, 75, 80, 85, 90, 95, 98, 99];
16
41
  const viewportEntries = this.filterViewportEntries(filteredEntries);
@@ -122,35 +147,28 @@ export default class AbstractVCCalculatorBase {
122
147
  });
123
148
  let isVCClean;
124
149
  let dirtyReason;
125
- if (fg('platform_ufo_add_vc_abort_reason_by_revisions')) {
126
- const getVCCleanStatusResult = this.getVCCleanStatus(filteredEntries);
127
- isVCClean = getVCCleanStatusResult.isVCClean;
128
- dirtyReason = getVCCleanStatusResult.dirtyReason;
129
- if (!isVCClean) {
130
- return {
131
- revision: this.revisionNo,
132
- 'metric:vc90': null,
133
- clean: false,
134
- abortReason: dirtyReason
135
- };
136
- }
137
- } else {
138
- isVCClean = this.isVCClean(filteredEntries);
139
- if (!isVCClean) {
140
- return {
141
- revision: this.revisionNo,
142
- 'metric:vc90': null,
143
- clean: false
144
- };
145
- }
150
+ const getVCCleanStatusResult = this.getVCCleanStatus(filteredEntries);
151
+ isVCClean = getVCCleanStatusResult.isVCClean;
152
+ dirtyReason = getVCCleanStatusResult.dirtyReason;
153
+ if (!isVCClean) {
154
+ return {
155
+ revision: this.revisionNo,
156
+ 'metric:vc90': null,
157
+ clean: false,
158
+ abortReason: dirtyReason
159
+ };
146
160
  }
147
161
  const useDebugInfo = fg('platform_ufo_ttvc_v3_devtool');
148
162
  const vcDetails = useDebugInfo ? await this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason) : await this.calculateBasic(filteredEntries, startTime, stopTime);
149
- return {
163
+ const result = {
150
164
  revision: this.revisionNo,
151
165
  clean: true,
152
166
  'metric:vc90': (_vcDetails$90$t = vcDetails === null || vcDetails === void 0 ? void 0 : (_vcDetails$ = vcDetails['90']) === null || _vcDetails$ === void 0 ? void 0 : _vcDetails$.t) !== null && _vcDetails$90$t !== void 0 ? _vcDetails$90$t : null,
153
167
  vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined
154
168
  };
169
+ if (fg('platform_ufo_rev_ratios')) {
170
+ result.ratios = this.calculateRatios(filteredEntries);
171
+ }
172
+ return result;
155
173
  }
156
174
  }
@@ -29,7 +29,7 @@ export default class VCCalculator_FY25_03 extends AbstractVCCalculatorBase {
29
29
  if (attributeName === 'data-aui-version' && fg('platform_ufo_filter_out_aui_attribute_changes')) {
30
30
  return false;
31
31
  }
32
- if ((attributeName === 'data-testid' || attributeName === 'data-vc' || attributeName === 'data-ssr-placeholder' || attributeName === 'data-ssr-placeholder-replace' || attributeName === 'data-vc-nvs' || attributeName === 'data-media-vc-wrapper' || attributeName === 'data-auto-scrollable' || attributeName === 'id' || attributeName === 'tabindex' || NON_VISUAL_ARIA_ATTRIBUTES.includes(attributeName)) && fg('platform_ufo_ignore_non_vis_attributes')) {
32
+ if (attributeName === 'data-testid' || attributeName === 'data-vc' || attributeName === 'data-ssr-placeholder' || attributeName === 'data-ssr-placeholder-replace' || attributeName === 'data-vc-nvs' || attributeName === 'data-media-vc-wrapper' || attributeName === 'data-auto-scrollable' || attributeName === 'id' || attributeName === 'tabindex' || NON_VISUAL_ARIA_ATTRIBUTES.includes(attributeName)) {
33
33
  return false;
34
34
  }
35
35
  return true;
@@ -39,18 +39,6 @@ export default class VCCalculator_FY25_03 extends AbstractVCCalculatorBase {
39
39
  }
40
40
  return true;
41
41
  }
42
- isVCClean(filteredEntries) {
43
- const hasAbortEvent = filteredEntries.some(entry => {
44
- if (entry.data.type === 'window:event') {
45
- const data = entry.data;
46
- if (ABORTING_WINDOW_EVENT.includes(data.eventType)) {
47
- return true;
48
- }
49
- }
50
- return false;
51
- });
52
- return !hasAbortEvent;
53
- }
54
42
  getVCCleanStatus(filteredEntries) {
55
43
  let dirtyReason = '';
56
44
  const hasAbortEvent = filteredEntries.some(entry => {
@@ -283,8 +283,8 @@ export function getDoNotAbortActivePressInteraction() {
283
283
  if (!config) {
284
284
  return undefined;
285
285
  }
286
- var _config10 = config,
287
- doNotAbortActivePressInteraction = _config10.doNotAbortActivePressInteraction;
286
+ var _config0 = config,
287
+ doNotAbortActivePressInteraction = _config0.doNotAbortActivePressInteraction;
288
288
  return doNotAbortActivePressInteraction;
289
289
  } catch (e) {
290
290
  return undefined;
@@ -297,8 +297,8 @@ export function getDoNotAbortActivePressInteractionOnTransition() {
297
297
  if (!config) {
298
298
  return undefined;
299
299
  }
300
- var _config11 = config,
301
- doNotAbortActivePressInteractionOnTransition = _config11.doNotAbortActivePressInteractionOnTransition;
300
+ var _config1 = config,
301
+ doNotAbortActivePressInteractionOnTransition = _config1.doNotAbortActivePressInteractionOnTransition;
302
302
  return doNotAbortActivePressInteractionOnTransition;
303
303
  } catch (e) {
304
304
  return undefined;
@@ -659,11 +659,11 @@ function callCancelCallbacks(interaction) {
659
659
  export function abort(interactionId, abortReason) {
660
660
  var interaction = interactions.get(interactionId);
661
661
  if (interaction != null) {
662
- var _getConfig10;
662
+ var _getConfig0;
663
663
  callCancelCallbacks(interaction);
664
664
  interaction.abortReason = abortReason;
665
665
  finishInteraction(interactionId, interaction);
666
- if ((_getConfig10 = getConfig()) !== null && _getConfig10 !== void 0 && (_getConfig10 = _getConfig10.experimentalInteractionMetrics) !== null && _getConfig10 !== void 0 && _getConfig10.enabled) {
666
+ if ((_getConfig0 = getConfig()) !== null && _getConfig0 !== void 0 && (_getConfig0 = _getConfig0.experimentalInteractionMetrics) !== null && _getConfig0 !== void 0 && _getConfig0.enabled) {
667
667
  onExperimentalInteractionComplete(interactionId, interaction);
668
668
  remove(interactionId);
669
669
  }
@@ -672,12 +672,12 @@ export function abort(interactionId, abortReason) {
672
672
  export function abortByNewInteraction(interactionId, interactionName) {
673
673
  var interaction = interactions.get(interactionId);
674
674
  if (interaction != null) {
675
- var _getConfig11;
675
+ var _getConfig1;
676
676
  callCancelCallbacks(interaction);
677
677
  interaction.abortReason = 'new_interaction';
678
678
  interaction.abortedByInteractionName = interactionName;
679
679
  finishInteraction(interactionId, interaction);
680
- if ((_getConfig11 = getConfig()) !== null && _getConfig11 !== void 0 && (_getConfig11 = _getConfig11.experimentalInteractionMetrics) !== null && _getConfig11 !== void 0 && _getConfig11.enabled) {
680
+ if ((_getConfig1 = getConfig()) !== null && _getConfig1 !== void 0 && (_getConfig1 = _getConfig1.experimentalInteractionMetrics) !== null && _getConfig1 !== void 0 && _getConfig1.enabled) {
681
681
  onExperimentalInteractionComplete(interactionId, interaction);
682
682
  remove(interactionId);
683
683
  }
@@ -685,7 +685,7 @@ export function abortByNewInteraction(interactionId, interactionName) {
685
685
  }
686
686
  export function abortAll(abortReason, abortedByInteractionName) {
687
687
  interactions.forEach(function (interaction, interactionId) {
688
- var _getConfig12;
688
+ var _getConfig10;
689
689
  var noMoreHolds = interaction.holdActive.size === 0;
690
690
  if (!noMoreHolds) {
691
691
  callCancelCallbacks(interaction);
@@ -695,7 +695,7 @@ export function abortAll(abortReason, abortedByInteractionName) {
695
695
  }
696
696
  }
697
697
  finishInteraction(interactionId, interaction);
698
- if ((_getConfig12 = getConfig()) !== null && _getConfig12 !== void 0 && (_getConfig12 = _getConfig12.experimentalInteractionMetrics) !== null && _getConfig12 !== void 0 && _getConfig12.enabled) {
698
+ if ((_getConfig10 = getConfig()) !== null && _getConfig10 !== void 0 && (_getConfig10 = _getConfig10.experimentalInteractionMetrics) !== null && _getConfig10 !== void 0 && _getConfig10.enabled) {
699
699
  onExperimentalInteractionComplete(interactionId, interaction);
700
700
  remove(interactionId);
701
701
  }
@@ -706,9 +706,9 @@ export function addOnCancelCallback(id, cancelCallback) {
706
706
  interaction === null || interaction === void 0 || interaction.cancelCallbacks.push(cancelCallback);
707
707
  }
708
708
  export function addNewInteraction(interactionId, ufoName, type, startTime, rate, labelStack, routeName) {
709
- var _getConfig13;
709
+ var _getConfig11;
710
710
  var trace = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;
711
- if ((_getConfig13 = getConfig()) !== null && _getConfig13 !== void 0 && (_getConfig13 = _getConfig13.postInteractionLog) !== null && _getConfig13 !== void 0 && _getConfig13.enabled) {
711
+ if ((_getConfig11 = getConfig()) !== null && _getConfig11 !== void 0 && (_getConfig11 = _getConfig11.postInteractionLog) !== null && _getConfig11 !== void 0 && _getConfig11.enabled) {
712
712
  postInteractionLog.reset();
713
713
  }
714
714
  var previousTime = startTime;
@@ -796,7 +796,7 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
796
796
  addHoldByID(interactionId, [], ufoName, ufoName, true);
797
797
  }
798
798
  if (type === 'transition') {
799
- var _getConfig14;
799
+ var _getConfig12;
800
800
  getVCObserver().start({
801
801
  startTime: startTime,
802
802
  experienceKey: ufoName
@@ -804,7 +804,7 @@ export function addNewInteraction(interactionId, ufoName, type, startTime, rate,
804
804
  postInteractionLog.startVCObserver({
805
805
  startTime: startTime
806
806
  });
807
- if ((_getConfig14 = getConfig()) !== null && _getConfig14 !== void 0 && (_getConfig14 = _getConfig14.experimentalInteractionMetrics) !== null && _getConfig14 !== void 0 && _getConfig14.enabled) {
807
+ if ((_getConfig12 = getConfig()) !== null && _getConfig12 !== void 0 && (_getConfig12 = _getConfig12.experimentalInteractionMetrics) !== null && _getConfig12 !== void 0 && _getConfig12.enabled) {
808
808
  experimentalVC.start({
809
809
  startTime: startTime
810
810
  });