@atlaskit/react-ufo 3.14.5 → 3.14.7

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 (46) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/vc/index.js +39 -6
  3. package/dist/cjs/vc/vc-observer/index.js +10 -2
  4. package/dist/cjs/vc/vc-observer/observers/index.js +12 -7
  5. package/dist/cjs/vc/vc-observer/observers/ssr-placeholders/index.js +76 -40
  6. package/dist/cjs/vc/vc-observer-new/index.js +84 -0
  7. package/dist/cjs/vc/vc-observer-new/viewport-observer/index.js +227 -69
  8. package/dist/cjs/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +103 -44
  9. package/dist/cjs/vc/vc-observer-new/viewport-observer/utils/is-in-vc-ignore-if-no-layout-shift-marker.js +17 -0
  10. package/dist/es2019/vc/index.js +37 -5
  11. package/dist/es2019/vc/vc-observer/index.js +8 -2
  12. package/dist/es2019/vc/vc-observer/observers/index.js +11 -5
  13. package/dist/es2019/vc/vc-observer/observers/ssr-placeholders/index.js +57 -26
  14. package/dist/es2019/vc/vc-observer-new/index.js +67 -1
  15. package/dist/es2019/vc/vc-observer-new/viewport-observer/index.js +105 -25
  16. package/dist/es2019/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +44 -8
  17. package/dist/es2019/vc/vc-observer-new/viewport-observer/utils/is-in-vc-ignore-if-no-layout-shift-marker.js +11 -0
  18. package/dist/esm/vc/index.js +39 -6
  19. package/dist/esm/vc/vc-observer/index.js +10 -2
  20. package/dist/esm/vc/vc-observer/observers/index.js +12 -7
  21. package/dist/esm/vc/vc-observer/observers/ssr-placeholders/index.js +76 -40
  22. package/dist/esm/vc/vc-observer-new/index.js +84 -0
  23. package/dist/esm/vc/vc-observer-new/viewport-observer/index.js +227 -69
  24. package/dist/esm/vc/vc-observer-new/viewport-observer/mutation-observer/index.js +103 -44
  25. package/dist/esm/vc/vc-observer-new/viewport-observer/utils/is-in-vc-ignore-if-no-layout-shift-marker.js +11 -0
  26. package/dist/types/vc/index.d.ts +2 -0
  27. package/dist/types/vc/types.d.ts +2 -0
  28. package/dist/types/vc/vc-observer/index.d.ts +1 -0
  29. package/dist/types/vc/vc-observer/observers/index.d.ts +2 -0
  30. package/dist/types/vc/vc-observer/observers/ssr-placeholders/index.d.ts +6 -0
  31. package/dist/types/vc/vc-observer-new/index.d.ts +30 -0
  32. package/dist/types/vc/vc-observer-new/types.d.ts +1 -1
  33. package/dist/types/vc/vc-observer-new/viewport-observer/index.d.ts +5 -1
  34. package/dist/types/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
  35. package/dist/types/vc/vc-observer-new/viewport-observer/utils/is-in-vc-ignore-if-no-layout-shift-marker.d.ts +6 -0
  36. package/dist/types-ts4.5/vc/index.d.ts +2 -0
  37. package/dist/types-ts4.5/vc/types.d.ts +2 -0
  38. package/dist/types-ts4.5/vc/vc-observer/index.d.ts +1 -0
  39. package/dist/types-ts4.5/vc/vc-observer/observers/index.d.ts +2 -0
  40. package/dist/types-ts4.5/vc/vc-observer/observers/ssr-placeholders/index.d.ts +6 -0
  41. package/dist/types-ts4.5/vc/vc-observer-new/index.d.ts +30 -0
  42. package/dist/types-ts4.5/vc/vc-observer-new/types.d.ts +1 -1
  43. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/index.d.ts +5 -1
  44. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/mutation-observer/index.d.ts +2 -0
  45. package/dist/types-ts4.5/vc/vc-observer-new/viewport-observer/utils/is-in-vc-ignore-if-no-layout-shift-marker.d.ts +6 -0
  46. package/package.json +8 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/ufo-interaction-ignore
2
2
 
3
+ ## 3.14.7
4
+
5
+ ### Patch Changes
6
+
7
+ - [#179438](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/179438)
8
+ [`b0d336b1f78b3`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/b0d336b1f78b3) -
9
+ AFO-4081 support ssr-placeholder for ttvc v3
10
+
11
+ ## 3.14.6
12
+
13
+ ### Patch Changes
14
+
15
+ - [#179156](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/179156)
16
+ [`81f5605b925fc`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/81f5605b925fc) -
17
+ AFO-4081 ufo vc ignore if no layout shift marker
18
+
3
19
  ## 3.14.5
4
20
 
5
21
  ### Patch Changes
@@ -9,8 +9,8 @@ exports.getVCObserver = getVCObserver;
9
9
  exports.isEnvironmentSupported = isEnvironmentSupported;
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
12
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
14
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
15
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
16
16
  var _config = require("../config");
@@ -18,22 +18,45 @@ var _noOpVcObserver = require("./no-op-vc-observer");
18
18
  var _vcObserver = require("./vc-observer");
19
19
  var _vcObserverNew = _interopRequireDefault(require("./vc-observer-new"));
20
20
  var _rllPlaceholders = require("./vc-observer/observers/rll-placeholders");
21
+ var _ssrPlaceholders = require("./vc-observer/observers/ssr-placeholders");
21
22
  var _process;
22
23
  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; }
23
24
  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; }
24
25
  var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
25
26
  function VCObserverWrapper() {
27
+ var _opts$ssrEnablePageLa, _opts$disableSizeAndP;
26
28
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
27
29
  (0, _classCallCheck2.default)(this, VCObserverWrapper);
28
30
  this.newVCObserver = null;
29
31
  this.oldVCObserver = null;
32
+
33
+ // Initialize SSR placeholder handler once
34
+ this.ssrPlaceholderHandler = new _ssrPlaceholders.SSRPlaceholderHandlers({
35
+ enablePageLayoutPlaceholder: (_opts$ssrEnablePageLa = opts.ssrEnablePageLayoutPlaceholder) !== null && _opts$ssrEnablePageLa !== void 0 ? _opts$ssrEnablePageLa : false,
36
+ disableSizeAndPositionCheck: (_opts$disableSizeAndP = opts.disableSizeAndPositionCheck) !== null && _opts$disableSizeAndP !== void 0 ? _opts$disableSizeAndP : {
37
+ v: false,
38
+ h: false
39
+ }
40
+ });
30
41
  if ((0, _config.isVCRevisionEnabled)('fy25.03')) {
42
+ var _opts$ssrEnablePageLa2, _opts$disableSizeAndP2;
31
43
  this.newVCObserver = new _vcObserverNew.default({
32
- selectorConfig: opts.selectorConfig
44
+ selectorConfig: opts.selectorConfig,
45
+ isPostInteraction: opts.isPostInteraction,
46
+ SSRConfig: {
47
+ enablePageLayoutPlaceholder: (_opts$ssrEnablePageLa2 = opts.ssrEnablePageLayoutPlaceholder) !== null && _opts$ssrEnablePageLa2 !== void 0 ? _opts$ssrEnablePageLa2 : false,
48
+ disableSizeAndPositionCheck: (_opts$disableSizeAndP2 = opts.disableSizeAndPositionCheck) !== null && _opts$disableSizeAndP2 !== void 0 ? _opts$disableSizeAndP2 : {
49
+ v: false,
50
+ h: false
51
+ }
52
+ },
53
+ ssrPlaceholderHandler: this.ssrPlaceholderHandler
33
54
  });
34
55
  }
35
56
  if ((0, _config.isVCRevisionEnabled)('fy25.01') || (0, _config.isVCRevisionEnabled)('fy25.02')) {
36
- this.oldVCObserver = new _vcObserver.VCObserver(opts);
57
+ this.oldVCObserver = new _vcObserver.VCObserver(_objectSpread(_objectSpread({}, opts), {}, {
58
+ ssrPlaceholderHandler: this.ssrPlaceholderHandler
59
+ }));
37
60
  }
38
61
  }
39
62
 
@@ -92,6 +115,8 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
92
115
  (_this$newVCObserver2 = this.newVCObserver) === null || _this$newVCObserver2 === void 0 || _this$newVCObserver2.stop();
93
116
  }
94
117
  _rllPlaceholders.RLLPlaceholderHandlers.getInstance().reset();
118
+ // Clear shared SSR placeholder handler
119
+ this.ssrPlaceholderHandler.clear();
95
120
  }
96
121
  }, {
97
122
  key: "getVCRawData",
@@ -165,20 +190,28 @@ var VCObserverWrapper = exports.VCObserverWrapper = /*#__PURE__*/function () {
165
190
  }, {
166
191
  key: "setSSRElement",
167
192
  value: function setSSRElement(element) {
168
- var _this$oldVCObserver5;
193
+ var _this$oldVCObserver5, _this$newVCObserver4;
169
194
  (_this$oldVCObserver5 = this.oldVCObserver) === null || _this$oldVCObserver5 === void 0 || _this$oldVCObserver5.setSSRElement(element);
195
+ (_this$newVCObserver4 = this.newVCObserver) === null || _this$newVCObserver4 === void 0 || _this$newVCObserver4.setReactRootElement(element);
170
196
  }
171
197
  }, {
172
198
  key: "setReactRootRenderStart",
173
199
  value: function setReactRootRenderStart(startTime) {
174
- var _this$oldVCObserver6;
200
+ var _this$oldVCObserver6, _this$newVCObserver5;
175
201
  (_this$oldVCObserver6 = this.oldVCObserver) === null || _this$oldVCObserver6 === void 0 || _this$oldVCObserver6.setReactRootRenderStart(startTime || performance.now());
202
+ (_this$newVCObserver5 = this.newVCObserver) === null || _this$newVCObserver5 === void 0 || _this$newVCObserver5.setReactRootRenderStart(startTime || performance.now());
176
203
  }
177
204
  }, {
178
205
  key: "setReactRootRenderStop",
179
206
  value: function setReactRootRenderStop(stopTime) {
180
- var _this$oldVCObserver7;
207
+ var _this$oldVCObserver7, _this$newVCObserver6;
181
208
  (_this$oldVCObserver7 = this.oldVCObserver) === null || _this$oldVCObserver7 === void 0 || _this$oldVCObserver7.setReactRootRenderStop(stopTime || performance.now());
209
+ (_this$newVCObserver6 = this.newVCObserver) === null || _this$newVCObserver6 === void 0 || _this$newVCObserver6.setReactRootRenderStop(stopTime || performance.now());
210
+ }
211
+ }, {
212
+ key: "collectSSRPlaceholders",
213
+ value: function collectSSRPlaceholders() {
214
+ this.ssrPlaceholderHandler.collectExistingPlaceholders();
182
215
  }
183
216
  }]);
184
217
  }(); // Some products set this variable to indicate it is running in SSR
@@ -455,7 +455,8 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
455
455
  this.devToolsEnabled = options.devToolsEnabled || false;
456
456
  this.oldDomUpdatesEnabled = options.oldDomUpdates || false;
457
457
  var ssrEnablePageLayoutPlaceholder = options.ssrEnablePageLayoutPlaceholder,
458
- disableSizeAndPositionCheck = options.disableSizeAndPositionCheck;
458
+ disableSizeAndPositionCheck = options.disableSizeAndPositionCheck,
459
+ ssrPlaceholderHandler = options.ssrPlaceholderHandler;
459
460
  this.observers = new _observers.Observers({
460
461
  selectorConfig: options.selectorConfig || {
461
462
  id: false,
@@ -467,7 +468,8 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
467
468
  SSRConfig: {
468
469
  enablePageLayoutPlaceholder: ssrEnablePageLayoutPlaceholder || false,
469
470
  disableSizeAndPositionCheck: disableSizeAndPositionCheck
470
- }
471
+ },
472
+ ssrPlaceholderHandler: ssrPlaceholderHandler
471
473
  });
472
474
  this.heatmap = !(0, _config.isVCRevisionEnabled)('fy25.01') ? [] : this.getCleanHeatmap();
473
475
  this.heatmapNext = this.getCleanHeatmap();
@@ -527,6 +529,12 @@ var VCObserver = exports.VCObserver = /*#__PURE__*/function () {
527
529
  var stopTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : performance.now();
528
530
  this.observers.setReactRootRenderStop(stopTime);
529
531
  }
532
+ }, {
533
+ key: "collectSSRPlaceholders",
534
+ value: function collectSSRPlaceholders() {
535
+ // This is handled by the shared SSRPlaceholderHandlers in VCObserverWrapper
536
+ // Individual observers don't need to implement this
537
+ }
530
538
  }, {
531
539
  key: "setAbortReason",
532
540
  value: function setAbortReason(abort, timestamp) {
@@ -32,9 +32,7 @@ function isElementVisible(target) {
32
32
  }
33
33
  var Observers = exports.Observers = /*#__PURE__*/function () {
34
34
  function Observers(opts) {
35
- var _this = this,
36
- _opts$SSRConfig,
37
- _opts$SSRConfig2;
35
+ var _this = this;
38
36
  (0, _classCallCheck2.default)(this, Observers);
39
37
  (0, _defineProperty2.default)(this, "observedMutations", new WeakMap());
40
38
  (0, _defineProperty2.default)(this, "elementsInView", new Set());
@@ -74,10 +72,17 @@ var Observers = exports.Observers = /*#__PURE__*/function () {
74
72
  this.selectorConfig = _objectSpread(_objectSpread({}, this.selectorConfig), opts.selectorConfig);
75
73
  this.intersectionObserver = this.getIntersectionObserver();
76
74
  this.mutationObserver = this.getMutationObserver();
77
- this.ssrPlaceholderHandler = new _ssrPlaceholders.SSRPlaceholderHandlers({
78
- enablePageLayoutPlaceholder: (_opts$SSRConfig = opts.SSRConfig) === null || _opts$SSRConfig === void 0 ? void 0 : _opts$SSRConfig.enablePageLayoutPlaceholder,
79
- disableSizeAndPositionCheck: (_opts$SSRConfig2 = opts.SSRConfig) === null || _opts$SSRConfig2 === void 0 ? void 0 : _opts$SSRConfig2.disableSizeAndPositionCheck
80
- });
75
+
76
+ // Use shared SSR placeholder handler if provided, otherwise create new one
77
+ if (opts.ssrPlaceholderHandler) {
78
+ this.ssrPlaceholderHandler = opts.ssrPlaceholderHandler;
79
+ } else {
80
+ var _opts$SSRConfig, _opts$SSRConfig2;
81
+ this.ssrPlaceholderHandler = new _ssrPlaceholders.SSRPlaceholderHandlers({
82
+ enablePageLayoutPlaceholder: (_opts$SSRConfig = opts.SSRConfig) === null || _opts$SSRConfig === void 0 ? void 0 : _opts$SSRConfig.enablePageLayoutPlaceholder,
83
+ disableSizeAndPositionCheck: (_opts$SSRConfig2 = opts.SSRConfig) === null || _opts$SSRConfig2 === void 0 ? void 0 : _opts$SSRConfig2.disableSizeAndPositionCheck
84
+ });
85
+ }
81
86
  }
82
87
  return (0, _createClass2.default)(Observers, [{
83
88
  key: "isBrowserSupported",
@@ -111,32 +111,8 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
111
111
  this.disableSizeAndPositionCheck = disableSizeAndPositionCheck;
112
112
  if (window.document) {
113
113
  try {
114
- var selector = this.enablePageLayoutPlaceholder ? '[data-ssr-placeholder],[data-testid="page-layout.root"]' : '[data-ssr-placeholder]';
115
- var existingElements = document.querySelectorAll(selector);
116
- existingElements.forEach(function (el) {
117
- var placeholderId = el instanceof HTMLElement && _this.getPlaceholderId(el);
118
- if (placeholderId) {
119
- var _window$__SSR_PLACEHO, _this$intersectionObs2;
120
- var width = -1;
121
- var height = -1;
122
- var x = -1;
123
- var y = -1;
124
- var boundingClientRect = (_window$__SSR_PLACEHO = window.__SSR_PLACEHOLDERS_DIMENSIONS__) === null || _window$__SSR_PLACEHO === void 0 ? void 0 : _window$__SSR_PLACEHO[placeholderId];
125
- if (boundingClientRect) {
126
- width = boundingClientRect.width;
127
- height = boundingClientRect.height;
128
- x = boundingClientRect.x;
129
- y = boundingClientRect.y;
130
- }
131
- _this.staticPlaceholders.set(placeholderId, {
132
- width: width,
133
- height: height,
134
- x: x,
135
- y: y
136
- });
137
- (_this$intersectionObs2 = _this.intersectionObserver) === null || _this$intersectionObs2 === void 0 || _this$intersectionObs2.observe(el);
138
- }
139
- });
114
+ // Collect initial placeholders using SSR dimensions
115
+ this.collectPlaceholdersInternal();
140
116
  } catch (e) {} finally {
141
117
  delete window.__SSR_PLACEHOLDERS_DIMENSIONS__;
142
118
  }
@@ -150,6 +126,66 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
150
126
  this.getSizeCallbacks = new Map();
151
127
  this.reactValidateCallbacks = new Map();
152
128
  }
129
+ }, {
130
+ key: "collectPlaceholdersInternal",
131
+ value: function collectPlaceholdersInternal() {
132
+ var _this2 = this;
133
+ var selector = this.enablePageLayoutPlaceholder ? '[data-ssr-placeholder],[data-testid="page-layout.root"]' : '[data-ssr-placeholder]';
134
+ var existingElements = document.querySelectorAll(selector);
135
+ existingElements.forEach(function (el) {
136
+ var placeholderId = el instanceof HTMLElement && _this2.getPlaceholderId(el);
137
+ if (placeholderId && !_this2.staticPlaceholders.has(placeholderId)) {
138
+ var _window$__SSR_PLACEHO, _this2$intersectionOb;
139
+ var width = -1;
140
+ var height = -1;
141
+ var x = -1;
142
+ var y = -1;
143
+
144
+ // Use SSR dimensions from window global if available
145
+ var boundingClientRect = (_window$__SSR_PLACEHO = window.__SSR_PLACEHOLDERS_DIMENSIONS__) === null || _window$__SSR_PLACEHO === void 0 ? void 0 : _window$__SSR_PLACEHO[placeholderId];
146
+ if (boundingClientRect) {
147
+ width = boundingClientRect.width;
148
+ height = boundingClientRect.height;
149
+ x = boundingClientRect.x;
150
+ y = boundingClientRect.y;
151
+ } else {
152
+ // Fallback to current bounding rect if SSR dimensions not available
153
+ var rect = el.getBoundingClientRect();
154
+ width = rect.width;
155
+ height = rect.height;
156
+ x = rect.x;
157
+ y = rect.y;
158
+ }
159
+ _this2.staticPlaceholders.set(placeholderId, {
160
+ width: width,
161
+ height: height,
162
+ x: x,
163
+ y: y
164
+ });
165
+ (_this2$intersectionOb = _this2.intersectionObserver) === null || _this2$intersectionOb === void 0 || _this2$intersectionOb.observe(el);
166
+ }
167
+ });
168
+ }
169
+
170
+ /**
171
+ * Added this method to be utilised for testing purposes.
172
+ * In production it collection placeholder should only happens on constructor
173
+ */
174
+ }, {
175
+ key: "collectExistingPlaceholders",
176
+ value: function collectExistingPlaceholders() {
177
+ if (!window.document) {
178
+ return;
179
+ }
180
+ try {
181
+ // Collect placeholders using SSR dimensions or fallback to live dimensions
182
+ this.collectPlaceholdersInternal();
183
+ } catch (e) {
184
+ // Silently fail if there are any issues
185
+ } finally {
186
+ delete window.__SSR_PLACEHOLDERS_DIMENSIONS__;
187
+ }
188
+ }
153
189
  }, {
154
190
  key: "isPlaceholder",
155
191
  value: function isPlaceholder(element) {
@@ -186,44 +222,44 @@ var SSRPlaceholderHandlers = exports.SSRPlaceholderHandlers = /*#__PURE__*/funct
186
222
  }, {
187
223
  key: "checkIfExistedAndSizeMatching",
188
224
  value: function checkIfExistedAndSizeMatching(el) {
189
- var _this2 = this;
225
+ var _this3 = this;
190
226
  el = this.findNearestPlaceholderContainerIfIgnored(el);
191
227
  var id = this.getPlaceholderId(el);
192
228
  return new Promise(function (resolve) {
193
- if (!_this2.staticPlaceholders.has(id)) {
229
+ if (!_this3.staticPlaceholders.has(id)) {
194
230
  resolve(false);
195
231
  return;
196
232
  } else {
197
- var _this2$intersectionOb;
198
- _this2.callbacks.set(id, resolve);
199
- (_this2$intersectionOb = _this2.intersectionObserver) === null || _this2$intersectionOb === void 0 || _this2$intersectionOb.observe(el);
233
+ var _this3$intersectionOb;
234
+ _this3.callbacks.set(id, resolve);
235
+ (_this3$intersectionOb = _this3.intersectionObserver) === null || _this3$intersectionOb === void 0 || _this3$intersectionOb.observe(el);
200
236
  }
201
237
  });
202
238
  }
203
239
  }, {
204
240
  key: "getSize",
205
241
  value: function getSize(el) {
206
- var _this3 = this;
242
+ var _this4 = this;
207
243
  return new Promise(function (resolve) {
208
- var _this3$intersectionOb;
209
- _this3.getSizeCallbacks.set(_this3.getPlaceholderId(el), resolve);
210
- (_this3$intersectionOb = _this3.intersectionObserver) === null || _this3$intersectionOb === void 0 || _this3$intersectionOb.observe(el);
244
+ var _this4$intersectionOb;
245
+ _this4.getSizeCallbacks.set(_this4.getPlaceholderId(el), resolve);
246
+ (_this4$intersectionOb = _this4.intersectionObserver) === null || _this4$intersectionOb === void 0 || _this4$intersectionOb.observe(el);
211
247
  });
212
248
  }
213
249
  }, {
214
250
  key: "validateReactComponentMatchToPlaceholder",
215
251
  value: function validateReactComponentMatchToPlaceholder(el) {
216
- var _this4 = this;
252
+ var _this5 = this;
217
253
  el = this.findNearestPlaceholderContainerIfIgnored(el);
218
254
  var id = this.getPlaceholderReplacementId(el);
219
255
  return new Promise(function (resolve) {
220
- if (!_this4.staticPlaceholders.has(id)) {
256
+ if (!_this5.staticPlaceholders.has(id)) {
221
257
  resolve(false);
222
258
  return;
223
259
  } else {
224
- var _this4$intersectionOb;
225
- _this4.reactValidateCallbacks.set(id, resolve);
226
- (_this4$intersectionOb = _this4.intersectionObserver) === null || _this4$intersectionOb === void 0 || _this4$intersectionOb.observe(el);
260
+ var _this5$intersectionOb;
261
+ _this5.reactValidateCallbacks.set(id, resolve);
262
+ (_this5$intersectionOb = _this5.intersectionObserver) === null || _this5$intersectionOb === void 0 || _this5$intersectionOb.observe(el);
227
263
  }
228
264
  });
229
265
  }
@@ -13,6 +13,7 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
13
13
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
14
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
15
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
+ var _ssrPlaceholders = require("../vc-observer/observers/ssr-placeholders");
16
17
  var _entriesTimeline = _interopRequireDefault(require("./entries-timeline"));
17
18
  var _getElementName2 = _interopRequireDefault(require("./get-element-name"));
18
19
  var _fy25_ = _interopRequireDefault(require("./metric-calculator/fy25_03"));
@@ -20,6 +21,11 @@ var _getViewportHeight = _interopRequireDefault(require("./metric-calculator/uti
20
21
  var _getViewportWidth = _interopRequireDefault(require("./metric-calculator/utils/get-viewport-width"));
21
22
  var _viewportObserver = _interopRequireDefault(require("./viewport-observer"));
22
23
  var _windowEventObserver = _interopRequireDefault(require("./window-event-observer"));
24
+ var SSRState = {
25
+ normal: 1,
26
+ waitingForFirstRender: 2,
27
+ ignoring: 3
28
+ };
23
29
  var DEFAULT_SELECTOR_CONFIG = {
24
30
  id: false,
25
31
  testId: true,
@@ -35,9 +41,31 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
35
41
  (0, _classCallCheck2.default)(this, VCObserverNew);
36
42
  (0, _defineProperty2.default)(this, "viewportObserver", null);
37
43
  (0, _defineProperty2.default)(this, "windowEventObserver", null);
44
+ // SSR related properties
45
+ (0, _defineProperty2.default)(this, "ssrPlaceholderHandler", null);
46
+ (0, _defineProperty2.default)(this, "ssr", {
47
+ state: SSRState.normal,
48
+ reactRootElement: null,
49
+ renderStart: -1,
50
+ renderStop: -1
51
+ });
38
52
  this.entriesTimeline = new _entriesTimeline.default();
39
53
  this.isPostInteraction = (_config$isPostInterac = config.isPostInteraction) !== null && _config$isPostInterac !== void 0 ? _config$isPostInterac : false;
40
54
  this.selectorConfig = (_config$selectorConfi = config.selectorConfig) !== null && _config$selectorConfi !== void 0 ? _config$selectorConfi : DEFAULT_SELECTOR_CONFIG;
55
+
56
+ // Use shared SSR placeholder handler if provided, otherwise create new one if feature flag is enabled
57
+ if (config.ssrPlaceholderHandler) {
58
+ this.ssrPlaceholderHandler = config.ssrPlaceholderHandler;
59
+ } else {
60
+ var _config$SSRConfig$ena, _config$SSRConfig, _config$SSRConfig$dis, _config$SSRConfig2;
61
+ this.ssrPlaceholderHandler = new _ssrPlaceholders.SSRPlaceholderHandlers({
62
+ enablePageLayoutPlaceholder: (_config$SSRConfig$ena = (_config$SSRConfig = config.SSRConfig) === null || _config$SSRConfig === void 0 ? void 0 : _config$SSRConfig.enablePageLayoutPlaceholder) !== null && _config$SSRConfig$ena !== void 0 ? _config$SSRConfig$ena : false,
63
+ disableSizeAndPositionCheck: (_config$SSRConfig$dis = (_config$SSRConfig2 = config.SSRConfig) === null || _config$SSRConfig2 === void 0 ? void 0 : _config$SSRConfig2.disableSizeAndPositionCheck) !== null && _config$SSRConfig$dis !== void 0 ? _config$SSRConfig$dis : {
64
+ v: false,
65
+ h: false
66
+ }
67
+ });
68
+ }
41
69
  this.viewportObserver = new _viewportObserver.default({
42
70
  onChange: function onChange(onChangeArg) {
43
71
  var time = onChangeArg.time,
@@ -65,6 +93,13 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
65
93
  newValue: mutationData === null || mutationData === void 0 ? void 0 : mutationData.newValue
66
94
  }
67
95
  });
96
+ },
97
+ // Pass SSR context to ViewportObserver
98
+ getSSRState: function getSSRState() {
99
+ return _this.getSSRState();
100
+ },
101
+ getSSRPlaceholderHandler: function getSSRPlaceholderHandler() {
102
+ return _this.getSSRPlaceholderHandler();
68
103
  }
69
104
  });
70
105
  this.windowEventObserver = new _windowEventObserver.default({
@@ -89,6 +124,14 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
89
124
  _this2 = this,
90
125
  _this$windowEventObse;
91
126
  var startTime = _ref2.startTime;
127
+ // Reset SSR state on start (matches old VCObserver behavior)
128
+ this.ssr = {
129
+ state: SSRState.normal,
130
+ reactRootElement: null,
131
+ // Reset to null (matches old VCObserver)
132
+ renderStart: -1,
133
+ renderStop: -1
134
+ };
92
135
  (_this$viewportObserve = this.viewportObserver) === null || _this$viewportObserve === void 0 || _this$viewportObserve.start();
93
136
  if ((_window = window) !== null && _window !== void 0 && _window.__SSR_ABORT_LISTENERS__ && (0, _platformFeatureFlags.fg)('platform_ufo_vc_observer_new_ssr_abort_listener')) {
94
137
  var abortListeners = window.__SSR_ABORT_LISTENERS__;
@@ -119,6 +162,47 @@ var VCObserverNew = exports.default = /*#__PURE__*/function () {
119
162
  var _this$viewportObserve2, _this$windowEventObse2;
120
163
  (_this$viewportObserve2 = this.viewportObserver) === null || _this$viewportObserve2 === void 0 || _this$viewportObserve2.stop();
121
164
  (_this$windowEventObse2 = this.windowEventObserver) === null || _this$windowEventObse2 === void 0 || _this$windowEventObse2.stop();
165
+
166
+ // Clear SSR state on stop (matches old VCObserver behavior)
167
+ this.ssr.reactRootElement = null;
168
+ }
169
+
170
+ // SSR related methods
171
+ }, {
172
+ key: "setReactRootElement",
173
+ value: function setReactRootElement(element) {
174
+ this.ssr.reactRootElement = element;
175
+ }
176
+ }, {
177
+ key: "setReactRootRenderStart",
178
+ value: function setReactRootRenderStart() {
179
+ var startTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : performance.now();
180
+ this.ssr.renderStart = startTime;
181
+ this.ssr.state = SSRState.waitingForFirstRender;
182
+ }
183
+ }, {
184
+ key: "setReactRootRenderStop",
185
+ value: function setReactRootRenderStop() {
186
+ var stopTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : performance.now();
187
+ this.ssr.renderStop = stopTime;
188
+ }
189
+ }, {
190
+ key: "collectSSRPlaceholders",
191
+ value: function collectSSRPlaceholders() {
192
+ // This is handled by the shared SSRPlaceholderHandlers in VCObserverWrapper
193
+ // Individual observers don't need to implement this
194
+ }
195
+
196
+ // Internal methods for ViewportObserver to access SSR state
197
+ }, {
198
+ key: "getSSRState",
199
+ value: function getSSRState() {
200
+ return this.ssr;
201
+ }
202
+ }, {
203
+ key: "getSSRPlaceholderHandler",
204
+ value: function getSSRPlaceholderHandler() {
205
+ return this.ssrPlaceholderHandler;
122
206
  }
123
207
  }, {
124
208
  key: "addSSR",