@atlaskit/renderer 126.7.1 → 126.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/cjs/react/nodes/inlineCard.js +13 -2
  3. package/dist/cjs/ui/Renderer/index.js +6 -2
  4. package/dist/cjs/ui/hooks/useScrollToBlock.js +250 -0
  5. package/dist/cjs/ui/hooks/useScrollToLocalId.js +14 -0
  6. package/dist/cjs/ui/hooks/useStableScroll.js +95 -0
  7. package/dist/es2019/react/nodes/inlineCard.js +15 -4
  8. package/dist/es2019/ui/Renderer/index.js +6 -2
  9. package/dist/es2019/ui/hooks/useScrollToBlock.js +229 -0
  10. package/dist/es2019/ui/hooks/useScrollToLocalId.js +14 -0
  11. package/dist/es2019/ui/hooks/useStableScroll.js +88 -0
  12. package/dist/esm/react/nodes/inlineCard.js +15 -4
  13. package/dist/esm/ui/Renderer/index.js +6 -2
  14. package/dist/esm/ui/hooks/useScrollToBlock.js +245 -0
  15. package/dist/esm/ui/hooks/useScrollToLocalId.js +14 -0
  16. package/dist/esm/ui/hooks/useStableScroll.js +89 -0
  17. package/dist/types/analytics/events.d.ts +3 -0
  18. package/dist/types/renderer-context.d.ts +2 -1
  19. package/dist/types/ui/Renderer/types.d.ts +1 -0
  20. package/dist/types/ui/hooks/useScrollToBlock.d.ts +23 -0
  21. package/dist/types/ui/hooks/useScrollToLocalId.d.ts +9 -0
  22. package/dist/types/ui/hooks/useStableScroll.d.ts +27 -0
  23. package/dist/types-ts4.5/analytics/events.d.ts +3 -0
  24. package/dist/types-ts4.5/renderer-context.d.ts +2 -1
  25. package/dist/types-ts4.5/ui/Renderer/types.d.ts +1 -0
  26. package/dist/types-ts4.5/ui/hooks/useScrollToBlock.d.ts +23 -0
  27. package/dist/types-ts4.5/ui/hooks/useScrollToLocalId.d.ts +9 -0
  28. package/dist/types-ts4.5/ui/hooks/useStableScroll.d.ts +27 -0
  29. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @atlaskit/renderer
2
2
 
3
+ ## 126.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+
9
+ ## 126.8.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [`41941e55fa9b1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/41941e55fa9b1) -
14
+ [ux] Block link scroll behavior now expands collapsed parent expand/nestedExpand nodes before
15
+ scrolling. New feature gate `platform_editor_expand_on_scroll_to_block` controls this behavior:
16
+ - When enabled: Expands parent expand nodes before scrolling (new behavior with better UX)
17
+ - When disabled: Simple scroll without expand handling (safe fallback to original behavior)
18
+
19
+ This ensures the "Copy link to block" feature works correctly when the target block is inside a
20
+ collapsed expand.
21
+
22
+ ### Patch Changes
23
+
24
+ - [`b296c8dca4192`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/b296c8dca4192) -
25
+ EDITOR-4991 add new value to renderer context to track nested renderer type, used in analytics
26
+ event to track what renderer we are in for synced blocks
27
+ - Updated dependencies
28
+
3
29
  ## 126.7.1
4
30
 
5
31
  ### Patch Changes
@@ -140,6 +140,7 @@ var OverlayWithCardContext = function OverlayWithCardContext(_ref) {
140
140
  }, children);
141
141
  };
142
142
  var InlineCard = function InlineCard(props) {
143
+ var _cardContext$value5;
143
144
  var url = props.url,
144
145
  data = props.data,
145
146
  eventHandlers = props.eventHandlers,
@@ -149,6 +150,9 @@ var InlineCard = function InlineCard(props) {
149
150
  onSetLinkTarget = props.onSetLinkTarget;
150
151
  var portal = (0, _PortalContext.usePortal)(props);
151
152
  var cardContext = (0, _linkProvider.useSmartCardContext)();
153
+ var reload = (0, _hooks.useSmartLinkReload)({
154
+ url: url || ''
155
+ });
152
156
  var _useState = (0, _react.useState)(false),
153
157
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
154
158
  isResolvedViewRendered = _useState2[0],
@@ -184,7 +188,14 @@ var InlineCard = function InlineCard(props) {
184
188
  }
185
189
  };
186
190
  var MaybeOverlay = cardContext !== null && cardContext !== void 0 && cardContext.value ? OverlayWithCardContext : HoverLinkOverlayNoop;
187
- if (ssr && url && !(0, _experiments.editorExperiment)('platform_editor_preview_panel_linking_exp', true, {
191
+ var cardState = cardContext === null || cardContext === void 0 || (_cardContext$value5 = cardContext.value) === null || _cardContext$value5 === void 0 || (_cardContext$value5 = _cardContext$value5.store) === null || _cardContext$value5 === void 0 ? void 0 : _cardContext$value5.getState()[url || ''];
192
+ (0, _react.useEffect)(function () {
193
+ // if we render from cache, we want to make sure we reload the data in the background
194
+ if ((0, _expValEquals.expValEquals)('platform_editor_smartlink_local_cache', 'isEnabled', true) && !ssr && url && (cardState === null || cardState === void 0 ? void 0 : cardState.status) === 'resolved') {
195
+ reload();
196
+ }
197
+ });
198
+ if ((ssr || cardState && (0, _expValEquals.expValEquals)('platform_editor_smartlink_local_cache', 'isEnabled', true)) && url && !(0, _experiments.editorExperiment)('platform_editor_preview_panel_linking_exp', true, {
188
199
  exposure: true
189
200
  })) {
190
201
  if (
@@ -215,7 +226,7 @@ var InlineCard = function InlineCard(props) {
215
226
  actionOptions: actionOptions,
216
227
  onClick: onClick
217
228
  }), CompetitorPromptComponent);
218
- } else if (ssr && url && (0, _experiments.editorExperiment)('platform_editor_preview_panel_linking_exp', true, {
229
+ } else if ((ssr || cardState && (0, _expValEquals.expValEquals)('platform_editor_smartlink_local_cache', 'isEnabled', true)) && url && (0, _experiments.editorExperiment)('platform_editor_preview_panel_linking_exp', true, {
219
230
  exposure: true
220
231
  })) {
221
232
  if (
@@ -21,6 +21,7 @@ var _browser = require("@atlaskit/editor-common/browser");
21
21
  var _performanceMeasures = require("@atlaskit/editor-common/performance-measures");
22
22
  var _measureRender = require("@atlaskit/editor-common/performance/measure-render");
23
23
  var _navigation = require("@atlaskit/editor-common/performance/navigation");
24
+ var _useScrollToBlock = require("../hooks/useScrollToBlock");
24
25
  var _utils = require("@atlaskit/editor-common/utils");
25
26
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
26
27
  var _types = require("@atlaskit/analytics-listeners/types");
@@ -70,7 +71,7 @@ var DEGRADED_SEVERITY_THRESHOLD = exports.DEGRADED_SEVERITY_THRESHOLD = 3000;
70
71
  var TABLE_INFO_TIMEOUT = 10000;
71
72
  var RENDER_EVENT_SAMPLE_RATE = 0.2;
72
73
  var packageName = "@atlaskit/renderer";
73
- var packageVersion = "0.0.0-development";
74
+ var packageVersion = "126.8.0";
74
75
  var setAsQueryContainerStyles = (0, _react2.css)({
75
76
  containerName: 'ak-renderer-wrapper',
76
77
  containerType: 'inline-size'
@@ -192,7 +193,8 @@ var RendererFunctionalComponent = exports.RendererFunctionalComponent = function
192
193
  return props.dataProviders || new _providerFactory.ProviderFactory();
193
194
  }, [props.dataProviders]);
194
195
  var _useRendererContext = (0, _rendererContext.useRendererContext)(),
195
- parentContextContentMode = _useRendererContext.contentMode;
196
+ parentContextContentMode = _useRendererContext.contentMode,
197
+ nestedRendererType = _useRendererContext.nestedRendererType;
196
198
  var createRendererContext = (0, _react.useMemo)(function () {
197
199
  return function (featureFlags, isTopLevelRenderer, contentMode) {
198
200
  var normalizedFeatureFlags = (0, _normalizeFeatureFlags.normalizeFeatureFlags)(featureFlags);
@@ -362,6 +364,7 @@ var RendererFunctionalComponent = exports.RendererFunctionalComponent = function
362
364
  distortedDuration: renderedMeasurementDistortedDurationMonitor.distortedDuration,
363
365
  ttfb: (0, _navigation.getResponseEndTime)(),
364
366
  nodes: (0, _countNodes.countNodes)(props.document),
367
+ nestedRendererType: (0, _experiments.editorExperiment)('platform_synced_block', true) && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_1') ? nestedRendererType : undefined,
365
368
  severity: severity
366
369
  },
367
370
  eventType: _analytics.EVENT_TYPE.OPERATIONAL
@@ -437,6 +440,7 @@ var RendererFunctionalComponent = exports.RendererFunctionalComponent = function
437
440
  var rendererContext = (0, _react.useMemo)(function () {
438
441
  return createRendererContext(props.featureFlags, props.isTopLevelRenderer, props.contentMode);
439
442
  }, [props.featureFlags, props.isTopLevelRenderer, createRendererContext, props.contentMode]);
443
+ (0, _useScrollToBlock.useScrollToBlock)(editorRef, props.document);
440
444
  try {
441
445
  var _rendererContext$feat, _props$media;
442
446
  var schema = getSchema(props.schema, props.adfStage);
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useScrollToBlock = void 0;
7
+ var _react = require("react");
8
+ var _browserApis = require("@atlaskit/browser-apis");
9
+ var _blockMenu = require("@atlaskit/editor-common/block-menu");
10
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
11
+ var _useStableScroll2 = require("./useStableScroll");
12
+ 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; } } }; }
13
+ 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; } }
14
+ 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; }
15
+ /**
16
+ * useScrollToBlock - Handler for block link scrolling in the renderer with expand support
17
+ *
18
+ * This hook enables scroll-to-block functionality when blocks may be hidden inside collapsed expands.
19
+ * It searches the ADF document for the target block, identifies any parent expand nodes,
20
+ * expands them if needed, and waits for layout stability before scrolling to the block.
21
+ *
22
+ * This implementation waits for the container to stabilize (no layout shifts) before scrolling,
23
+ * which prevents issues with images loading, dynamic content, or other async operations that
24
+ * cause layout changes.
25
+ *
26
+ * This hook replaces useScrollToLocalId when the platform_editor_expand_on_scroll_to_block experiment is enabled.
27
+ *
28
+ * When platform_editor_expand_on_scroll_to_block experiment is cleaned up:
29
+ * - Remove the experiment check
30
+ * - Delete the deprecated useScrollToLocalId hook
31
+ * - Make this the default scroll-to-block behavior
32
+ *
33
+ * @param containerRef - Optional ref to the renderer container (RendererStyleContainer)
34
+ * @param adfDoc - The ADF document to search for nodes and expand parents
35
+ */
36
+ var useScrollToBlock = exports.useScrollToBlock = function useScrollToBlock(containerRef, adfDoc) {
37
+ var _useStableScroll = (0, _useStableScroll2.useStableScroll)({
38
+ stabilityWaitTime: 750,
39
+ maxStabilityWaitTime: 10000
40
+ }),
41
+ waitForStability = _useStableScroll.waitForStability,
42
+ cleanupStability = _useStableScroll.cleanup;
43
+ (0, _react.useEffect)(function () {
44
+ var _getDocument;
45
+ // Only run in browser environment.
46
+ if (typeof window === 'undefined' || !(containerRef !== null && containerRef !== void 0 && containerRef.current)) {
47
+ return;
48
+ }
49
+ if (!(0, _expValEquals.expValEquals)('platform_editor_expand_on_scroll_to_block', 'isEnabled', true)) {
50
+ return;
51
+ }
52
+
53
+ // Parse hash fragment for block ID (format: #block-{localId}).
54
+ var hash = window.location.hash;
55
+ var defaultPrefixWithHash = "#".concat(_blockMenu.DEFAULT_BLOCK_LINK_HASH_PREFIX);
56
+ var blockId = hash.startsWith(defaultPrefixWithHash) ? hash.slice(defaultPrefixWithHash.length) : null;
57
+ if (!blockId) {
58
+ return;
59
+ }
60
+ var retryCount = 0;
61
+ var maxRetries = 40;
62
+ var retryInterval = 250;
63
+ var intervalId = null;
64
+ var hasScrolled = false;
65
+ var cancelExpandAndScroll = null;
66
+ var scrollToElement = function scrollToElement() {
67
+ // Step 1: Search the ADF document for the node with the given blockId.
68
+ // This works even if the node is hidden inside a collapsed expand.
69
+ if (!adfDoc || !(containerRef !== null && containerRef !== void 0 && containerRef.current)) {
70
+ return false;
71
+ }
72
+ var nodeWithExpandParents = (0, _blockMenu.findNodeWithExpandParents)(adfDoc, blockId);
73
+ if (!nodeWithExpandParents) {
74
+ // Node not found in ADF document.
75
+ return false;
76
+ }
77
+ var expandParentLocalIds = nodeWithExpandParents.expandParentLocalIds;
78
+
79
+ // Step 2: If the node has expand parents, we need to expand them first.
80
+ if (expandParentLocalIds.length > 0) {
81
+ // Find the expand elements in the DOM using their localIds.
82
+ // Note: We need to expand from outermost to innermost.
83
+ var allExpandsFound = true;
84
+ var anyExpandsCollapsed = false;
85
+ var _iterator = _createForOfIteratorHelper(expandParentLocalIds),
86
+ _step;
87
+ try {
88
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
89
+ var expandLocalId = _step.value;
90
+ var expandContainer = containerRef.current.querySelector("[data-local-id=\"".concat(expandLocalId, "\"]"));
91
+ if (!expandContainer) {
92
+ // Expand not found in DOM yet (shouldn't happen but handle it).
93
+ allExpandsFound = false;
94
+ break;
95
+ }
96
+
97
+ // Check if this expand is collapsed.
98
+ if ((0, _blockMenu.isExpandCollapsed)(expandContainer)) {
99
+ anyExpandsCollapsed = true;
100
+ // Expand it.
101
+ (0, _blockMenu.expandElement)(expandContainer);
102
+ // After expanding, we need to retry to handle nested expands.
103
+ // The DOM needs time to update.
104
+ return false; // Will retry after interval.
105
+ }
106
+ }
107
+ } catch (err) {
108
+ _iterator.e(err);
109
+ } finally {
110
+ _iterator.f();
111
+ }
112
+ if (!allExpandsFound) {
113
+ // Retry later when expands are in DOM.
114
+ return false;
115
+ }
116
+
117
+ // All parent expands are now open (or we just expanded one and need to wait).
118
+ if (anyExpandsCollapsed) {
119
+ // Just expanded something, wait for DOM update.
120
+ return false;
121
+ }
122
+ }
123
+
124
+ // Step 3: Now the target element should be visible in the DOM, find it and scroll.
125
+ var element = (0, _blockMenu.getLocalIdSelector)(blockId, containerRef.current);
126
+ if (!element) {
127
+ // Element still not in DOM, retry.
128
+ return false;
129
+ }
130
+
131
+ // Element found and all parent expands are open! Use the utility to scroll.
132
+ // (This will handle any final edge cases and do the actual scrolling).
133
+ // Capture cleanup function to cancel pending timeouts.
134
+ cancelExpandAndScroll = (0, _blockMenu.expandAllParentsThenScroll)(element);
135
+ return true;
136
+ };
137
+ var performScroll = function performScroll() {
138
+ if (hasScrolled) {
139
+ return;
140
+ }
141
+
142
+ // Try to scroll to element.
143
+ if (scrollToElement()) {
144
+ hasScrolled = true;
145
+ cleanup();
146
+ }
147
+ };
148
+ var attemptScroll = function attemptScroll() {
149
+ retryCount++;
150
+
151
+ // Try to find the element first.
152
+ if (!adfDoc || !(containerRef !== null && containerRef !== void 0 && containerRef.current)) {
153
+ return false;
154
+ }
155
+ var nodeWithExpandParents = (0, _blockMenu.findNodeWithExpandParents)(adfDoc, blockId);
156
+ if (!nodeWithExpandParents) {
157
+ return false;
158
+ }
159
+ var expandParentLocalIds = nodeWithExpandParents.expandParentLocalIds;
160
+
161
+ // Check if all expands are expanded and element exists.
162
+ var allReady = true;
163
+ if (expandParentLocalIds.length > 0) {
164
+ var _iterator2 = _createForOfIteratorHelper(expandParentLocalIds),
165
+ _step2;
166
+ try {
167
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
168
+ var expandLocalId = _step2.value;
169
+ var expandContainer = containerRef.current.querySelector("[data-local-id=\"".concat(expandLocalId, "\"]"));
170
+ if (!expandContainer) {
171
+ allReady = false;
172
+ break;
173
+ }
174
+ if ((0, _blockMenu.isExpandCollapsed)(expandContainer)) {
175
+ (0, _blockMenu.expandElement)(expandContainer);
176
+ allReady = false;
177
+ break;
178
+ }
179
+ }
180
+ } catch (err) {
181
+ _iterator2.e(err);
182
+ } finally {
183
+ _iterator2.f();
184
+ }
185
+ }
186
+ var element = (0, _blockMenu.getLocalIdSelector)(blockId, containerRef.current);
187
+ if (!element) {
188
+ allReady = false;
189
+ }
190
+
191
+ // If everything is ready, start monitoring for stability.
192
+ if (allReady) {
193
+ if (intervalId) {
194
+ clearInterval(intervalId);
195
+ intervalId = null;
196
+ }
197
+ waitForStability(containerRef.current, performScroll);
198
+ return true;
199
+ }
200
+
201
+ // Stop retrying if we've exceeded max retries.
202
+ if (retryCount >= maxRetries) {
203
+ cleanup();
204
+ return false;
205
+ }
206
+ return false;
207
+ };
208
+ var cleanup = function cleanup() {
209
+ if (intervalId) {
210
+ clearInterval(intervalId);
211
+ intervalId = null;
212
+ }
213
+ cleanupStability();
214
+ // Cancel any pending expand and scroll operations.
215
+ if (cancelExpandAndScroll) {
216
+ cancelExpandAndScroll();
217
+ cancelExpandAndScroll = null;
218
+ }
219
+ };
220
+
221
+ // Try to scroll immediately.
222
+ if (attemptScroll()) {
223
+ return cleanup;
224
+ }
225
+ if (((_getDocument = (0, _browserApis.getDocument)()) === null || _getDocument === void 0 ? void 0 : _getDocument.readyState) === 'complete') {
226
+ // Document is already ready, try a few more times with delays.
227
+ // This handles cases where elements are added after document ready.
228
+ intervalId = setInterval(function () {
229
+ attemptScroll();
230
+ }, retryInterval);
231
+ } else {
232
+ // Document not ready yet, wait for it and then retry.
233
+ intervalId = setInterval(function () {
234
+ var _getDocument2;
235
+ if (((_getDocument2 = (0, _browserApis.getDocument)()) === null || _getDocument2 === void 0 ? void 0 : _getDocument2.readyState) === 'complete') {
236
+ attemptScroll();
237
+ } else if (retryCount >= maxRetries) {
238
+ cleanup();
239
+ } else {
240
+ retryCount++;
241
+ }
242
+ }, retryInterval);
243
+ }
244
+
245
+ // Cleanup function.
246
+ return cleanup;
247
+ // Intentionally not including adfDoc in the dependency array to avoid unnecessary re-renders.
248
+ // eslint-disable-next-line react-hooks/exhaustive-deps
249
+ }, [containerRef, waitForStability, cleanupStability]);
250
+ };
@@ -7,6 +7,7 @@ exports.useScrollToLocalId = void 0;
7
7
  var _react = require("react");
8
8
  var _browserApis = require("@atlaskit/browser-apis");
9
9
  var _blockMenu = require("@atlaskit/editor-common/block-menu");
10
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
10
11
  // Find editor node dom with localId - similar to confluence useScrollOnUrlChange.ts
11
12
  var getLocalIdSelector = function getLocalIdSelector(localId, container) {
12
13
  // Check if the element with data-local-id exists
@@ -38,6 +39,16 @@ var getLocalIdSelector = function getLocalIdSelector(localId, container) {
38
39
  }
39
40
  return null;
40
41
  };
42
+
43
+ /**
44
+ * useScrollToLocalId - Handler for block link scrolling in the renderer (traditional pages)
45
+ *
46
+ * This hook is deprecated in favor of useScrollToBlock which supports expanding parent nodes.
47
+ * This hook will be removed when the platform_editor_expand_on_scroll_to_block experiment is cleaned up.
48
+ *
49
+ * @param containerRef - Optional ref to the renderer container (RendererStyleContainer).
50
+ * @param shouldScrollToLocalId - Whether scroll-to-block functionality should be enabled
51
+ */
41
52
  var useScrollToLocalId = exports.useScrollToLocalId = function useScrollToLocalId(containerRef, shouldScrollToLocalId) {
42
53
  (0, _react.useEffect)(function () {
43
54
  var _getDocument;
@@ -45,6 +56,9 @@ var useScrollToLocalId = exports.useScrollToLocalId = function useScrollToLocalI
45
56
  if (typeof window === 'undefined' || !(containerRef !== null && containerRef !== void 0 && containerRef.current) || !shouldScrollToLocalId) {
46
57
  return;
47
58
  }
59
+ if ((0, _expValEquals.expValEquals)('platform_editor_expand_on_scroll_to_block', 'isEnabled', true)) {
60
+ return;
61
+ }
48
62
 
49
63
  // Parse hash fragment for block ID (format: #block-{localId})
50
64
  var hash = window.location.hash;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useStableScroll = void 0;
7
+ var _react = require("react");
8
+ /**
9
+ * Hook that provides functionality to wait for layout stability before performing an action.
10
+ * Uses ResizeObserver to detect when a container has stopped resizing (e.g., images finished loading).
11
+ */
12
+ var useStableScroll = exports.useStableScroll = function useStableScroll() {
13
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
14
+ var _options$stabilityWai = options.stabilityWaitTime,
15
+ stabilityWaitTime = _options$stabilityWai === void 0 ? 200 : _options$stabilityWai,
16
+ _options$maxStability = options.maxStabilityWaitTime,
17
+ maxStabilityWaitTime = _options$maxStability === void 0 ? 10000 : _options$maxStability;
18
+ var stabilityTimeoutRef = (0, _react.useRef)(null);
19
+ var resizeObserverRef = (0, _react.useRef)(null);
20
+ var lastStableTimeRef = (0, _react.useRef)(0);
21
+ var onStableCallbackRef = (0, _react.useRef)(null);
22
+ var cleanup = (0, _react.useCallback)(function () {
23
+ if (stabilityTimeoutRef.current) {
24
+ clearTimeout(stabilityTimeoutRef.current);
25
+ stabilityTimeoutRef.current = null;
26
+ }
27
+ if (resizeObserverRef.current) {
28
+ resizeObserverRef.current.disconnect();
29
+ resizeObserverRef.current = null;
30
+ }
31
+ onStableCallbackRef.current = null;
32
+ lastStableTimeRef.current = 0;
33
+ }, []);
34
+ var scheduleStabilityCheck = (0, _react.useCallback)(function () {
35
+ // Clear any existing stability timeout.
36
+ if (stabilityTimeoutRef.current) {
37
+ clearTimeout(stabilityTimeoutRef.current);
38
+ stabilityTimeoutRef.current = null;
39
+ }
40
+
41
+ // Check if we've exceeded the maximum stability wait time.
42
+ var now = Date.now();
43
+ if (lastStableTimeRef.current === 0) {
44
+ lastStableTimeRef.current = now;
45
+ } else if (now - lastStableTimeRef.current > maxStabilityWaitTime) {
46
+ // We've waited too long for stability, call the callback now.
47
+ if (onStableCallbackRef.current) {
48
+ onStableCallbackRef.current();
49
+ cleanup();
50
+ }
51
+ return;
52
+ }
53
+
54
+ // Set a timeout to call the callback after the stability wait time.
55
+ stabilityTimeoutRef.current = setTimeout(function () {
56
+ if (onStableCallbackRef.current) {
57
+ onStableCallbackRef.current();
58
+ cleanup();
59
+ }
60
+ }, stabilityWaitTime);
61
+ }, [stabilityWaitTime, maxStabilityWaitTime, cleanup]);
62
+ var waitForStability = (0, _react.useCallback)(function (container, onStable) {
63
+ // Clean up any existing observer
64
+ cleanup();
65
+
66
+ // Store the callback
67
+ onStableCallbackRef.current = onStable;
68
+
69
+ // Check if ResizeObserver is available
70
+ if (typeof ResizeObserver === 'undefined') {
71
+ // Fallback: just call the callback after the stability wait time
72
+ stabilityTimeoutRef.current = setTimeout(function () {
73
+ if (onStableCallbackRef.current) {
74
+ onStableCallbackRef.current();
75
+ cleanup();
76
+ }
77
+ }, stabilityWaitTime);
78
+ return;
79
+ }
80
+
81
+ // Create a ResizeObserver to monitor the container for size changes.
82
+ resizeObserverRef.current = new ResizeObserver(function () {
83
+ // Container size changed, reset stability timer.
84
+ scheduleStabilityCheck();
85
+ });
86
+ resizeObserverRef.current.observe(container);
87
+
88
+ // Start the initial stability check
89
+ scheduleStabilityCheck();
90
+ }, [stabilityWaitTime, scheduleStabilityCheck, cleanup]);
91
+ return {
92
+ waitForStability: waitForStability,
93
+ cleanup: cleanup
94
+ };
95
+ };
@@ -3,13 +3,13 @@ import _extends from "@babel/runtime/helpers/extends";
3
3
  * @jsxRuntime classic
4
4
  * @jsx jsx
5
5
  */
6
- import { Fragment, useState, useMemo } from 'react';
6
+ import { Fragment, useState, useMemo, useEffect } from 'react';
7
7
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
8
  import { jsx } from '@emotion/react';
9
9
  import { useSmartCardContext } from '@atlaskit/link-provider';
10
10
  import { Card, getObjectAri, getObjectIconUrl, getObjectName } from '@atlaskit/smart-card';
11
11
  import { isWithinPreviewPanelIFrame } from '@atlaskit/linking-common/utils';
12
- import { useSmartLinkActions } from '@atlaskit/smart-card/hooks';
12
+ import { useSmartLinkActions, useSmartLinkReload } from '@atlaskit/smart-card/hooks';
13
13
  import { CardSSR } from '@atlaskit/smart-card/ssr';
14
14
  import { HoverLinkOverlay, UnsupportedInline } from '@atlaskit/editor-common/ui';
15
15
  import { fg } from '@atlaskit/platform-feature-flags';
@@ -123,6 +123,7 @@ const OverlayWithCardContext = ({
123
123
  }, children);
124
124
  };
125
125
  const InlineCard = props => {
126
+ var _cardContext$value5, _cardContext$value5$s;
126
127
  const {
127
128
  url,
128
129
  data,
@@ -134,6 +135,9 @@ const InlineCard = props => {
134
135
  } = props;
135
136
  const portal = usePortal(props);
136
137
  const cardContext = useSmartCardContext();
138
+ const reload = useSmartLinkReload({
139
+ url: url || ''
140
+ });
137
141
  const [isResolvedViewRendered, setIsResolvedViewRendered] = useState(false);
138
142
  const onClick = getCardClickHandler(eventHandlers, url);
139
143
  const cardProps = {
@@ -168,7 +172,14 @@ const InlineCard = props => {
168
172
  }
169
173
  };
170
174
  const MaybeOverlay = cardContext !== null && cardContext !== void 0 && cardContext.value ? OverlayWithCardContext : HoverLinkOverlayNoop;
171
- if (ssr && url && !editorExperiment('platform_editor_preview_panel_linking_exp', true, {
175
+ const cardState = cardContext === null || cardContext === void 0 ? void 0 : (_cardContext$value5 = cardContext.value) === null || _cardContext$value5 === void 0 ? void 0 : (_cardContext$value5$s = _cardContext$value5.store) === null || _cardContext$value5$s === void 0 ? void 0 : _cardContext$value5$s.getState()[url || ''];
176
+ useEffect(() => {
177
+ // if we render from cache, we want to make sure we reload the data in the background
178
+ if (expValEquals('platform_editor_smartlink_local_cache', 'isEnabled', true) && !ssr && url && (cardState === null || cardState === void 0 ? void 0 : cardState.status) === 'resolved') {
179
+ reload();
180
+ }
181
+ });
182
+ if ((ssr || cardState && expValEquals('platform_editor_smartlink_local_cache', 'isEnabled', true)) && url && !editorExperiment('platform_editor_preview_panel_linking_exp', true, {
172
183
  exposure: true
173
184
  })) {
174
185
  if (
@@ -199,7 +210,7 @@ const InlineCard = props => {
199
210
  actionOptions: actionOptions,
200
211
  onClick: onClick
201
212
  }), CompetitorPromptComponent);
202
- } else if (ssr && url && editorExperiment('platform_editor_preview_panel_linking_exp', true, {
213
+ } else if ((ssr || cardState && expValEquals('platform_editor_smartlink_local_cache', 'isEnabled', true)) && url && editorExperiment('platform_editor_preview_panel_linking_exp', true, {
203
214
  exposure: true
204
215
  })) {
205
216
  if (
@@ -15,6 +15,7 @@ import { browser as browserLegacy, getBrowserInfo } from '@atlaskit/editor-commo
15
15
  import { startMeasure, stopMeasure } from '@atlaskit/editor-common/performance-measures';
16
16
  import { getDistortedDurationMonitor } from '@atlaskit/editor-common/performance/measure-render';
17
17
  import { getResponseEndTime } from '@atlaskit/editor-common/performance/navigation';
18
+ import { useScrollToBlock } from '../hooks/useScrollToBlock';
18
19
  import { getAnalyticsAppearance, getAnalyticsEventSeverity, shouldForceTracking } from '@atlaskit/editor-common/utils';
19
20
  import { fg } from '@atlaskit/platform-feature-flags';
20
21
  import { FabricChannel } from '@atlaskit/analytics-listeners/types';
@@ -56,7 +57,7 @@ export const DEGRADED_SEVERITY_THRESHOLD = 3000;
56
57
  const TABLE_INFO_TIMEOUT = 10000;
57
58
  const RENDER_EVENT_SAMPLE_RATE = 0.2;
58
59
  const packageName = "@atlaskit/renderer";
59
- const packageVersion = "0.0.0-development";
60
+ const packageVersion = "126.8.0";
60
61
  const setAsQueryContainerStyles = css({
61
62
  containerName: 'ak-renderer-wrapper',
62
63
  containerType: 'inline-size'
@@ -180,7 +181,8 @@ export const RendererFunctionalComponent = props => {
180
181
  const mouseDownSelection = useRef(undefined);
181
182
  const providerFactory = useMemo(() => props.dataProviders || new ProviderFactory(), [props.dataProviders]);
182
183
  const {
183
- contentMode: parentContextContentMode
184
+ contentMode: parentContextContentMode,
185
+ nestedRendererType
184
186
  } = useRendererContext();
185
187
  const createRendererContext = useMemo(() => (featureFlags, isTopLevelRenderer, contentMode) => {
186
188
  const normalizedFeatureFlags = normalizeFeatureFlags(featureFlags);
@@ -354,6 +356,7 @@ export const RendererFunctionalComponent = props => {
354
356
  distortedDuration: renderedMeasurementDistortedDurationMonitor.distortedDuration,
355
357
  ttfb: getResponseEndTime(),
356
358
  nodes: countNodes(props.document),
359
+ nestedRendererType: editorExperiment('platform_synced_block', true) && fg('platform_synced_block_patch_1') ? nestedRendererType : undefined,
357
360
  severity
358
361
  },
359
362
  eventType: EVENT_TYPE.OPERATIONAL
@@ -428,6 +431,7 @@ export const RendererFunctionalComponent = props => {
428
431
  // eslint-disable-next-line react-hooks/exhaustive-deps
429
432
  }, []);
430
433
  const rendererContext = useMemo(() => createRendererContext(props.featureFlags, props.isTopLevelRenderer, props.contentMode), [props.featureFlags, props.isTopLevelRenderer, createRendererContext, props.contentMode]);
434
+ useScrollToBlock(editorRef, props.document);
431
435
  try {
432
436
  var _rendererContext$feat, _props$media;
433
437
  const schema = getSchema(props.schema, props.adfStage);