@atlaskit/react-ufo 3.13.13 → 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 (40) hide show
  1. package/CHANGELOG.md +11 -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 +24 -23
  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 +66 -14
  19. package/dist/cjs/vc/vc-observer-new/metric-calculator/fy25_03/index.js +1 -1
  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 +2 -1
  25. package/dist/es2019/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +30 -1
  26. package/dist/es2019/vc/vc-observer-new/metric-calculator/fy25_03/index.js +1 -1
  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 +24 -23
  31. package/dist/esm/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.js +67 -15
  32. package/dist/esm/vc/vc-observer-new/metric-calculator/fy25_03/index.js +1 -1
  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 -0
  37. package/dist/types-ts4.5/common/vc/types.d.ts +1 -0
  38. package/dist/types-ts4.5/vc/vc-observer/getVCRevisionsData.d.ts +3 -2
  39. package/dist/types-ts4.5/vc/vc-observer-new/metric-calculator/abstract-base-vc-calculator.d.ts +4 -0
  40. package/package.json +4 -4
@@ -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
@@ -330,7 +330,8 @@ export class VCObserver {
330
330
  VCBox: vcNext.VCBox
331
331
  },
332
332
  isEventAborted,
333
- experienceKey
333
+ experienceKey,
334
+ ratios
334
335
  });
335
336
  const speedIndex = {
336
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);
@@ -135,11 +160,15 @@ export default class AbstractVCCalculatorBase {
135
160
  }
136
161
  const useDebugInfo = fg('platform_ufo_ttvc_v3_devtool');
137
162
  const vcDetails = useDebugInfo ? await this.calculateWithDebugInfo(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason) : await this.calculateBasic(filteredEntries, startTime, stopTime);
138
- return {
163
+ const result = {
139
164
  revision: this.revisionNo,
140
165
  clean: true,
141
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,
142
167
  vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined
143
168
  };
169
+ if (fg('platform_ufo_rev_ratios')) {
170
+ result.ratios = this.calculateRatios(filteredEntries);
171
+ }
172
+ return result;
144
173
  }
145
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;
@@ -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
  });
@@ -2,6 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
3
3
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
4
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ import { fg } from '@atlaskit/platform-feature-flags';
5
6
  import { isVCRevisionEnabled } from '../../config';
6
7
  import { getPageVisibilityState } from '../../hidden-timing';
7
8
  var VCParts = ['25', '50', '75', '80', '85', '90', '95', '98', '99'];
@@ -43,26 +44,35 @@ export function getVCRevisionsData(_ref) {
43
44
  isEventAborted = _ref.isEventAborted,
44
45
  calculatedVC = _ref.calculatedVC,
45
46
  calculatedVCNext = _ref.calculatedVCNext,
46
- experienceKey = _ref.experienceKey;
47
+ experienceKey = _ref.experienceKey,
48
+ ratios = _ref.ratios;
47
49
  var pageVisibilityUpToTTAI = getPageVisibilityState(interaction.start, interaction.end);
48
50
  var isVisiblePageVisibleUpToTTAI = pageVisibilityUpToTTAI === 'visible';
49
51
  var shouldHaveVCmetric = isVCClean && !isEventAborted && isVisiblePageVisibleUpToTTAI;
50
52
  var availableVCRevisionPayloads = [];
51
53
  if (isVCRevisionEnabled('fy25.01', experienceKey)) {
52
- availableVCRevisionPayloads.push({
54
+ var revision = {
53
55
  revision: 'fy25.01',
54
56
  clean: isVCClean,
55
57
  'metric:vc90': shouldHaveVCmetric ? calculatedVC.VC['90'] : null,
56
58
  vcDetails: createVCDetails(calculatedVC, shouldHaveVCmetric)
57
- });
59
+ };
60
+ if (shouldHaveVCmetric && fg('platform_ufo_rev_ratios')) {
61
+ revision.ratios = ratios;
62
+ }
63
+ availableVCRevisionPayloads.push(revision);
58
64
  }
59
65
  if (isVCRevisionEnabled('fy25.02', experienceKey)) {
60
- availableVCRevisionPayloads.push({
66
+ var _revision = {
61
67
  revision: 'fy25.02',
62
68
  clean: isVCClean,
63
69
  'metric:vc90': shouldHaveVCmetric ? calculatedVCNext.VC['90'] : null,
64
70
  vcDetails: createVCDetails(calculatedVCNext, shouldHaveVCmetric)
65
- });
71
+ };
72
+ if (shouldHaveVCmetric && fg('platform_ufo_rev_ratios')) {
73
+ _revision.ratios = ratios;
74
+ }
75
+ availableVCRevisionPayloads.push(_revision);
66
76
  }
67
77
  return _defineProperty({}, "".concat(fullPrefix, "vc:rev"), availableVCRevisionPayloads);
68
78
  }
@@ -311,7 +311,8 @@ export var VCObserver = /*#__PURE__*/function () {
311
311
  VCBox: vcNext.VCBox
312
312
  },
313
313
  isEventAborted: isEventAborted,
314
- experienceKey: experienceKey
314
+ experienceKey: experienceKey,
315
+ ratios: ratios
315
316
  });
316
317
  speedIndex = _defineProperty(_defineProperty({}, "ufo:speedIndex", isTTVCv1Disabled ? vcNext.VCEntries.speedIndex : VCEntries.speedIndex), "ufo:next:speedIndex", vcNext.VCEntries.speedIndex);
317
318
  SSRRatio = VCObserver.getSSRRatio(VCEntries.rel, ssr);
@@ -420,10 +421,10 @@ export var VCObserver = /*#__PURE__*/function () {
420
421
  _this.detachAbortListeners();
421
422
  var unbinds = attachAbortListeners(window, _this.viewport, _this.abortReasonCallback);
422
423
  if ((_window = window) !== null && _window !== void 0 && _window.__SSR_ABORT_LISTENERS__) {
423
- Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref11) {
424
- var _ref12 = _slicedToArray(_ref11, 2),
425
- key = _ref12[0],
426
- time = _ref12[1];
424
+ Object.entries(window.__SSR_ABORT_LISTENERS__.aborts).forEach(function (_ref1) {
425
+ var _ref10 = _slicedToArray(_ref1, 2),
426
+ key = _ref10[0],
427
+ time = _ref10[1];
427
428
  if (time) {
428
429
  _this.abortReasonCallback(key, time);
429
430
  }
@@ -453,8 +454,8 @@ export var VCObserver = /*#__PURE__*/function () {
453
454
  }
454
455
  return _createClass(VCObserver, [{
455
456
  key: "start",
456
- value: function start(_ref13) {
457
- var startTime = _ref13.startTime;
457
+ value: function start(_ref11) {
458
+ var startTime = _ref11.startTime;
458
459
  this.active = true;
459
460
  if (this.observers.isBrowserSupported()) {
460
461
  this.setViewportSize();
@@ -476,12 +477,12 @@ export var VCObserver = /*#__PURE__*/function () {
476
477
  }, {
477
478
  key: "getIgnoredElements",
478
479
  value: function getIgnoredElements(componentsLog) {
479
- return Object.values(componentsLog).flat().filter(function (_ref14) {
480
- var ignoreReason = _ref14.ignoreReason;
480
+ return Object.values(componentsLog).flat().filter(function (_ref12) {
481
+ var ignoreReason = _ref12.ignoreReason;
481
482
  return Boolean(ignoreReason);
482
- }).map(function (_ref15) {
483
- var targetName = _ref15.targetName,
484
- ignoreReason = _ref15.ignoreReason;
483
+ }).map(function (_ref13) {
484
+ var targetName = _ref13.targetName,
485
+ ignoreReason = _ref13.ignoreReason;
485
486
  return {
486
487
  targetName: targetName,
487
488
  ignoreReason: ignoreReason
@@ -611,13 +612,13 @@ export var VCObserver = /*#__PURE__*/function () {
611
612
  }
612
613
  }, {
613
614
  key: "calculateVC",
614
- value: function calculateVC(_ref16) {
615
- var heatmap = _ref16.heatmap,
616
- _ref16$ssr = _ref16.ssr,
617
- ssr = _ref16$ssr === void 0 ? UNUSED_SECTOR : _ref16$ssr,
618
- componentsLog = _ref16.componentsLog,
619
- viewport = _ref16.viewport,
620
- fixSSRAttribution = _ref16.fixSSRAttribution;
615
+ value: function calculateVC(_ref14) {
616
+ var heatmap = _ref14.heatmap,
617
+ _ref14$ssr = _ref14.ssr,
618
+ ssr = _ref14$ssr === void 0 ? UNUSED_SECTOR : _ref14$ssr,
619
+ componentsLog = _ref14.componentsLog,
620
+ viewport = _ref14.viewport,
621
+ fixSSRAttribution = _ref14.fixSSRAttribution;
621
622
  var lastUpdate = {};
622
623
  var totalPainted = 0;
623
624
  var ssrTime = fixSSRAttribution ? Math.floor(ssr) : ssr;
@@ -684,11 +685,11 @@ export var VCObserver = /*#__PURE__*/function () {
684
685
  });
685
686
  return VCRatio;
686
687
  }, 0);
687
- var VCEntries = entries.reduce(function (acc, _ref17, i) {
688
+ var VCEntries = entries.reduce(function (acc, _ref15, i) {
688
689
  var _acc$abs, _componentsLog$timest, _acc$rel$vc, _acc$rel;
689
- var _ref18 = _slicedToArray(_ref17, 2),
690
- timestamp = _ref18[0],
691
- entryPainted = _ref18[1];
690
+ var _ref16 = _slicedToArray(_ref15, 2),
691
+ timestamp = _ref16[0],
692
+ entryPainted = _ref16[1];
692
693
  var currentlyPainted = entryPainted + (((_acc$abs = acc.abs[i - 1]) === null || _acc$abs === void 0 ? void 0 : _acc$abs[1]) || 0);
693
694
  var currentlyPaintedRatio = Math.round(currentlyPainted / totalPainted * 1000) / 10;
694
695
  var logEntry = _toConsumableArray(new Set((_componentsLog$timest = componentsLog[timestamp]) === null || _componentsLog$timest === void 0 ? void 0 : _componentsLog$timest.filter(function (v) {
@@ -1,10 +1,11 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
3
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
4
  import _createClass from "@babel/runtime/helpers/createClass";
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
6
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
5
7
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
6
8
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7
- import _regeneratorRuntime from "@babel/runtime/regenerator";
8
9
  import { fg } from '@atlaskit/platform-feature-flags';
9
10
  import { calculateTTVCPercentiles, calculateTTVCPercentilesWithDebugInfo } from './percentile-calc';
10
11
  import getViewportHeight from './utils/get-viewport-height';
@@ -21,6 +22,53 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
21
22
  return 'rect' in entry.data;
22
23
  });
23
24
  }
25
+
26
+ /**
27
+ * Calculate ratios for each element based on their viewport coverage.
28
+ */
29
+ }, {
30
+ key: "calculateRatios",
31
+ value: function calculateRatios(filteredEntries) {
32
+ var ratios = {};
33
+ var viewportWidth = getViewportWidth();
34
+ var viewportHeight = getViewportHeight();
35
+ var totalViewportArea = viewportWidth * viewportHeight;
36
+ if (totalViewportArea === 0) {
37
+ return ratios;
38
+ }
39
+ var elementRects = new Map();
40
+ var _iterator = _createForOfIteratorHelper(filteredEntries),
41
+ _step;
42
+ try {
43
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
44
+ var _entry = _step.value;
45
+ if ('rect' in _entry.data) {
46
+ var viewportEntry = _entry.data;
47
+ elementRects.set(viewportEntry.elementName, viewportEntry.rect);
48
+ }
49
+ }
50
+ } catch (err) {
51
+ _iterator.e(err);
52
+ } finally {
53
+ _iterator.f();
54
+ }
55
+ var _iterator2 = _createForOfIteratorHelper(elementRects),
56
+ _step2;
57
+ try {
58
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
59
+ var _step2$value = _slicedToArray(_step2.value, 2),
60
+ elementName = _step2$value[0],
61
+ rect = _step2$value[1];
62
+ var elementArea = rect.width * rect.height;
63
+ ratios[elementName] = elementArea / totalViewportArea;
64
+ }
65
+ } catch (err) {
66
+ _iterator2.e(err);
67
+ } finally {
68
+ _iterator2.f();
69
+ }
70
+ return ratios;
71
+ }
24
72
  }, {
25
73
  key: "calculateBasic",
26
74
  value: function () {
@@ -60,7 +108,7 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
60
108
  key: "calculateWithDebugInfo",
61
109
  value: function () {
62
110
  var _calculateWithDebugInfo = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(filteredEntries, startTime, stopTime, isPostInteraction, isVCClean, interactionId, dirtyReason) {
63
- var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator, _step, _entry, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, _ufo_devtool_onVCRev, _ref;
111
+ var percentiles, viewportEntries, vcLogs, vcDetails, percentileIndex, entryDataBuffer, _iterator3, _step3, _entry2, time, viewportPercentage, entries, elementNames, previousResult, i, percentile, _ufo_devtool_onVCRev, _ref;
64
112
  return _regeneratorRuntime.wrap(function _callee2$(_context2) {
65
113
  while (1) switch (_context2.prev = _context2.next) {
66
114
  case 0:
@@ -85,16 +133,16 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
85
133
  _context2.next = 28;
86
134
  break;
87
135
  }
88
- _iterator = _createForOfIteratorHelper(vcLogs);
136
+ _iterator3 = _createForOfIteratorHelper(vcLogs);
89
137
  _context2.prev = 10;
90
- _iterator.s();
138
+ _iterator3.s();
91
139
  case 12:
92
- if ((_step = _iterator.n()).done) {
140
+ if ((_step3 = _iterator3.n()).done) {
93
141
  _context2.next = 20;
94
142
  break;
95
143
  }
96
- _entry = _step.value;
97
- time = _entry.time, viewportPercentage = _entry.viewportPercentage, entries = _entry.entries; // Only process entries if we haven't reached all percentiles
144
+ _entry2 = _step3.value;
145
+ time = _entry2.time, viewportPercentage = _entry2.viewportPercentage, entries = _entry2.entries; // Only process entries if we haven't reached all percentiles
98
146
  if (!(percentileIndex >= percentiles.length)) {
99
147
  _context2.next = 17;
100
148
  break;
@@ -131,10 +179,10 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
131
179
  case 22:
132
180
  _context2.prev = 22;
133
181
  _context2.t0 = _context2["catch"](10);
134
- _iterator.e(_context2.t0);
182
+ _iterator3.e(_context2.t0);
135
183
  case 25:
136
184
  _context2.prev = 25;
137
- _iterator.f();
185
+ _iterator3.f();
138
186
  return _context2.finish(25);
139
187
  case 28:
140
188
  // Fill in any missing percentiles with the last known values
@@ -174,7 +222,7 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
174
222
  }
175
223
  }, _callee2, this, [[10, 22, 25, 28]]);
176
224
  }));
177
- function calculateWithDebugInfo(_x4, _x5, _x6, _x7, _x8, _x9, _x10) {
225
+ function calculateWithDebugInfo(_x4, _x5, _x6, _x7, _x8, _x9, _x0) {
178
226
  return _calculateWithDebugInfo.apply(this, arguments);
179
227
  }
180
228
  return calculateWithDebugInfo;
@@ -186,7 +234,7 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
186
234
  var _this = this,
187
235
  _vcDetails$90$t,
188
236
  _vcDetails$;
189
- var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, useDebugInfo, vcDetails;
237
+ var startTime, stopTime, orderedEntries, interactionId, isPostInteraction, filteredEntries, isVCClean, dirtyReason, getVCCleanStatusResult, useDebugInfo, vcDetails, result;
190
238
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
191
239
  while (1) switch (_context3.prev = _context3.next) {
192
240
  case 0:
@@ -226,19 +274,23 @@ var AbstractVCCalculatorBase = /*#__PURE__*/function () {
226
274
  _context3.t0 = _context3.sent;
227
275
  case 17:
228
276
  vcDetails = _context3.t0;
229
- return _context3.abrupt("return", {
277
+ result = {
230
278
  revision: this.revisionNo,
231
279
  clean: true,
232
280
  '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,
233
281
  vcDetails: vcDetails !== null && vcDetails !== void 0 ? vcDetails : undefined
234
- });
235
- case 19:
282
+ };
283
+ if (fg('platform_ufo_rev_ratios')) {
284
+ result.ratios = this.calculateRatios(filteredEntries);
285
+ }
286
+ return _context3.abrupt("return", result);
287
+ case 21:
236
288
  case "end":
237
289
  return _context3.stop();
238
290
  }
239
291
  }, _callee3, this);
240
292
  }));
241
- function calculate(_x11) {
293
+ function calculate(_x1) {
242
294
  return _calculate.apply(this, arguments);
243
295
  }
244
296
  return calculate;
@@ -40,7 +40,7 @@ var VCCalculator_FY25_03 = /*#__PURE__*/function (_AbstractVCCalculator) {
40
40
  if (attributeName === 'data-aui-version' && fg('platform_ufo_filter_out_aui_attribute_changes')) {
41
41
  return false;
42
42
  }
43
- 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')) {
43
+ 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)) {
44
44
  return false;
45
45
  }
46
46
  return true;
@@ -204,8 +204,8 @@ export function calculatePercentilesWithDebugInfo(timePixelCounts, elementMap, t
204
204
  var sortedEntries = Array.from(timePixelCounts.entries()).sort(function (_ref7, _ref8) {
205
205
  var _ref9 = _slicedToArray(_ref7, 1),
206
206
  timeA = _ref9[0];
207
- var _ref10 = _slicedToArray(_ref8, 1),
208
- timeB = _ref10[0];
207
+ var _ref0 = _slicedToArray(_ref8, 1),
208
+ timeB = _ref0[0];
209
209
  return Number(timeA) - Number(timeB);
210
210
  });
211
211
  for (var i = 0; i < sortedEntries.length; i++) {
@@ -113,6 +113,7 @@ export type RevisionPayloadEntry = {
113
113
  revision: string;
114
114
  clean: boolean;
115
115
  vcDetails?: RevisionPayloadVCDetails;
116
+ ratios?: VCRatioType;
116
117
  abortReason?: VCAbortReason | null;
117
118
  };
118
119
  export type RevisionPayload = RevisionPayloadEntry[];