@atlaskit/modal-dialog 14.18.3 → 15.0.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.
@@ -1,32 +1,65 @@
1
1
  /* modal-wrapper.tsx generated by @compiled/babel-plugin v0.39.1 */
2
2
  import _extends from "@babel/runtime/helpers/extends";
3
+ import _typeof from "@babel/runtime/helpers/typeof";
3
4
  import "./modal-wrapper.compiled.css";
4
5
  import * as React from 'react';
5
6
  import { ax, ix } from "@compiled/react/runtime";
6
- import { useCallback } from 'react';
7
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
7
8
  import FocusLock from 'react-focus-lock';
8
9
  import ScrollLock, { TouchScrollable } from 'react-scrolllock';
9
10
  import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next';
10
11
  import Blanket from '@atlaskit/blanket';
11
12
  import noop from '@atlaskit/ds-lib/noop';
13
+ import useAutoFocus from '@atlaskit/ds-lib/use-auto-focus';
14
+ import { useId } from '@atlaskit/ds-lib/use-id';
12
15
  import { Layering } from '@atlaskit/layering';
13
16
  import { useNotifyOpenLayerObserver } from '@atlaskit/layering/experimental/open-layer-observer';
14
17
  import { Motion } from '@atlaskit/motion';
18
+ import { useExitingPersistence } from '@atlaskit/motion/exiting-persistence';
15
19
  import FadeIn from '@atlaskit/motion/fade-in';
16
20
  import { fg } from '@atlaskit/platform-feature-flags';
17
21
  import Portal from '@atlaskit/portal';
22
+ import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine';
18
23
  import { layers } from '@atlaskit/theme/constants';
24
+ import { dialogSlideUpAndFade } from '@atlaskit/top-layer/animations';
25
+ import { createCloseEvent } from '@atlaskit/top-layer/create-close-event';
26
+ import { Dialog } from '@atlaskit/top-layer/dialog';
27
+ import { DialogScrollLock } from '@atlaskit/top-layer/dialog-scroll-lock';
28
+ import { ModalContext, ScrollContext } from '../context';
19
29
  import useModalStack from '../hooks/use-modal-stack';
20
30
  import usePreventProgrammaticScroll from '../hooks/use-prevent-programmatic-scroll';
21
- import ModalDialog from './modal-dialog';
31
+ import { disableDraggingToCrossOriginIFramesForElement } from '../pragmatic-drag-and-drop/disable-dragging-to-cross-origin-iframes/element';
32
+ import { disableDraggingToCrossOriginIFramesForExternal } from '../pragmatic-drag-and-drop/disable-dragging-to-cross-origin-iframes/external';
33
+ import { disableDraggingToCrossOriginIFramesForTextSelection } from '../pragmatic-drag-and-drop/disable-dragging-to-cross-origin-iframes/text-selection';
34
+ import ModalDialog, { dialogHeight, dialogWidth as getDialogWidth } from './modal-dialog';
35
+ var modalAnimation = dialogSlideUpAndFade();
22
36
  var fillScreenStyles = null;
37
+
38
+ // Visual styles for modal content inside native <dialog>.
39
+ // Uses cssMap (not css) to avoid triggering no-nested-styles lint rule.
40
+
41
+ var LOCAL_CURRENT_SURFACE_CSS_VAR = '--ds-elevation-surface-current';
42
+ var topLayerStyles = {
43
+ content: "_1e0c1txw _4t3i1osq _2lx21bp4 _bfhk1bhr _syazi7uo _1q1l1bhr _lcxv1wug _1mq81kw7 _m01u1kw7 _1dg11kw7 _mizu1v1w _1ah3dkaa _ra3xnqa1 _128mdkaa _zg7p130s",
44
+ borderRadius: "_epkxfajl",
45
+ borderRadiusT26: "_epkxpb1k"
46
+ };
47
+
48
+ // Scroll-mode styles for the content div.
49
+ // Height overrides use ID-scoped <style> (see dialogPositionStyles) because
50
+ // Compiled atomic classes have specificity (0,1,0) (increaseSpecificity is disabled).
51
+ // The doubled-ID selector (#id#id > div) at (2,0,1) reliably wins.
52
+ // Only non-height properties needing the && boost remain here.
53
+
54
+ var topLayerBodyScrollStyles = null;
55
+ var topLayerViewportScrollStyles = null;
23
56
  var allowlistElements = function allowlistElements(element, callback) {
24
- // Allow focus to reach elements outside the modal:
25
- // if AUI dialog is allowListed and visible
26
- if (document.querySelector('.aui-blanket:not([hidden])')) {
57
+ // Allow focus outside modal when AUI dialog is visible
58
+ // eslint-disable-next-line @atlaskit/platform/no-direct-document-usage -- legacy FocusLock allowlist
59
+ if (Boolean(document.querySelector('.aui-blanket:not([hidden])'))) {
27
60
  return false;
28
61
  }
29
- // allows to pass a callback function to allow elements be ignored by focus lock
62
+ // Optional callback to let consumers exclude elements from focus lock
30
63
  if (typeof callback === 'function') {
31
64
  return callback(element);
32
65
  }
@@ -44,8 +77,7 @@ var allowlistElements = function allowlistElements(element, callback) {
44
77
  * - [Usage](https://atlassian.design/components/modal-dialog/usage)
45
78
  */
46
79
  var InternalModalWrapper = function InternalModalWrapper(props) {
47
- var _props$autoFocus = props.autoFocus,
48
- autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus,
80
+ var autoFocus = props.autoFocus,
49
81
  focusLockAllowlist = props.focusLockAllowlist,
50
82
  _props$shouldCloseOnE = props.shouldCloseOnEscapePress,
51
83
  shouldCloseOnEscapePress = _props$shouldCloseOnE === void 0 ? true : _props$shouldCloseOnE,
@@ -76,10 +108,8 @@ var InternalModalWrapper = function InternalModalWrapper(props) {
76
108
  var stackIndex = stackIndexOverride || calculatedStackIndex;
77
109
  var isForeground = stackIndex === 0;
78
110
 
79
- // When a user supplies a ref to focus we skip auto focus via react-focus-lock
80
- // When flag is true and a ref is not supplied, autofocus is true. See https://product-fabric.atlassian.net/browse/DSP-24307
81
- // When we remove boolean `autoFocus`, we won't have to worry about this
82
- var autoFocusLock = typeof autoFocus === 'boolean';
111
+ // If no ref is provided, autofocus on first element
112
+ var autoFocusLock = !(_typeof(autoFocus) === 'object');
83
113
  var onCloseHandler = usePlatformLeafEventHandler({
84
114
  fn: providedOnClose || noop,
85
115
  action: 'closed',
@@ -93,20 +123,216 @@ var InternalModalWrapper = function InternalModalWrapper(props) {
93
123
  }
94
124
  }, [shouldCloseOnOverlayClick, onCloseHandler]);
95
125
 
96
- // This ensures to prevent additional re-renders while nothing is passed to focusLockAllowlist explicitly.
126
+ // Stable callback to avoid re-renders when focusLockAllowlist is not provided.
97
127
  var allowListCallback = useCallback(function (element) {
98
128
  return allowlistElements(element, focusLockAllowlist);
99
129
  }, [focusLockAllowlist]);
100
- usePreventProgrammaticScroll();
130
+
131
+ // Called outside the feature-flag branch to keep hook order stable.
132
+ // Legacy path: FadeIn calls onFinish. Top-layer path: called directly.
133
+ var _useExitingPersistenc = useExitingPersistence(),
134
+ isExiting = _useExitingPersistenc.isExiting,
135
+ onExitFinish = _useExitingPersistenc.onFinish;
136
+
137
+ // Prevent background scroll (top-layer path uses DialogScrollLock instead).
138
+ // Safe conditional hook: feature flags are resolved once at startup.
139
+ if (!fg('platform-dst-top-layer')) {
140
+ // eslint-disable-next-line react-hooks/rules-of-hooks
141
+ usePreventProgrammaticScroll();
142
+ }
101
143
  useNotifyOpenLayerObserver({
102
144
  type: 'modal',
103
- // Modal dialog is conditionally rendered when visible, so when this runs it is always open.
145
+ // Always open — modal is conditionally rendered when visible.
104
146
  isOpen: true,
105
- // Passing a no-op for now, as there isn't a real use case for closing the modal dialog programmatically
106
- // by the OpenLayerObserver. The only current use case is closing layers when resizing the nav layout,
107
- // which cannot happen while a modal dialog is open.
147
+ // No-op: no current use case for programmatic close via OpenLayerObserver.
108
148
  onClose: noop
109
149
  });
150
+
151
+ /**
152
+ * Top-layer path (platform-dst-top-layer).
153
+ *
154
+ * Replaces Portal, FocusLock, ScrollLock, Blanket, Positioner, and z-index
155
+ * management with native <dialog> via @atlaskit/top-layer/dialog.
156
+ *
157
+ * Key decisions:
158
+ * - Animation: CSS transitions via @starting-style / allow-discrete.
159
+ * - Close gating: onDialogClose only forwards allowed reasons
160
+ * (see notes/guides/dialog-close-flow.md).
161
+ * - onClose event param: undefined - consumers should use close reason.
162
+ * - Focus restoration: native <dialog> behavior replaces react-focus-lock's
163
+ * returnFocus (see accessibility-criteria.md).
164
+ */
165
+ if (fg('platform-dst-top-layer')) {
166
+ // Native <dialog> always restores focus on close - no opt-out via shouldReturnFocus.
167
+ var defaultTestId = testId || 'modal-dialog';
168
+
169
+ // eslint-disable-next-line react-hooks/rules-of-hooks
170
+ var id = useId();
171
+ var titleId = "modal-dialog-title-".concat(id);
172
+
173
+ // Content container ref - used for onOpenComplete/onCloseComplete callbacks.
174
+ // eslint-disable-next-line react-hooks/rules-of-hooks
175
+ var contentRef = useRef(null);
176
+
177
+ // Cache last content element for onCloseComplete after children unmount
178
+ // (with reduced motion, contentRef clears before onExitFinish fires).
179
+ // eslint-disable-next-line react-hooks/rules-of-hooks
180
+ var lastContentElRef = useRef(null);
181
+ if (contentRef.current) {
182
+ lastContentElRef.current = contentRef.current;
183
+ }
184
+
185
+ // Native <dialog> ref - needed for ExitingPersistence to call dialog.close().
186
+ // eslint-disable-next-line react-hooks/rules-of-hooks
187
+ var dialogRef = useRef(null);
188
+
189
+ // eslint-disable-next-line react-hooks/rules-of-hooks
190
+ var modalDialogContext = useMemo(function () {
191
+ return {
192
+ testId: defaultTestId,
193
+ titleId: titleId,
194
+ onClose: onCloseHandler,
195
+ hasProvidedOnClose: Boolean(providedOnClose),
196
+ isFullScreen: isFullScreen !== null && isFullScreen !== void 0 ? isFullScreen : false
197
+ };
198
+ }, [defaultTestId, titleId, onCloseHandler, providedOnClose, isFullScreen]);
199
+
200
+ // Only forward close when the reason is allowed by props.
201
+ // Passes a synthetic event to satisfy the KeyboardOrMouseEvent contract.
202
+ // eslint-disable-next-line react-hooks/rules-of-hooks
203
+ var onDialogClose = useCallback(function (_ref) {
204
+ var reason = _ref.reason;
205
+ if (reason === 'escape' && shouldCloseOnEscapePress) {
206
+ onCloseHandler(createCloseEvent({
207
+ reason: reason
208
+ }));
209
+ }
210
+ if (reason === 'overlay-click' && shouldCloseOnOverlayClick) {
211
+ onCloseHandler(createCloseEvent({
212
+ reason: reason
213
+ }));
214
+ }
215
+ }, [onCloseHandler, shouldCloseOnEscapePress, shouldCloseOnOverlayClick]);
216
+
217
+ // ExitingPersistence: isExiting → isOpen={false} → Dialog exit animation →
218
+ // onExitFinish → onCloseComplete + unmount.
219
+ // eslint-disable-next-line react-hooks/rules-of-hooks
220
+ var handleDialogExitFinish = useCallback(function () {
221
+ var _contentRef$current;
222
+ var el = (_contentRef$current = contentRef.current) !== null && _contentRef$current !== void 0 ? _contentRef$current : lastContentElRef.current;
223
+ if (onCloseComplete && el) {
224
+ onCloseComplete(el);
225
+ }
226
+ lastContentElRef.current = null;
227
+ onExitFinish === null || onExitFinish === void 0 || onExitFinish();
228
+ }, [onExitFinish, onCloseComplete]);
229
+
230
+ // Fire onOpenComplete after mount.
231
+ // eslint-disable-next-line react-hooks/rules-of-hooks
232
+ useEffect(function () {
233
+ if (onOpenComplete && contentRef.current) {
234
+ onOpenComplete(contentRef.current, true);
235
+ }
236
+ // eslint-disable-next-line react-hooks/exhaustive-deps
237
+ }, []);
238
+
239
+ // Honor `shouldReturnFocus={ref}` on unmount.
240
+ // Native <dialog>.close() restores focus to the trigger that opened it,
241
+ // but the consumer asked for focus to go to a specific element instead.
242
+ // Run this in an unmount cleanup so it fires after dialog.close()
243
+ // (which fires in the Dialog's effect cleanup).
244
+ // eslint-disable-next-line react-hooks/rules-of-hooks
245
+ var shouldReturnFocusRef = useRef(shouldReturnFocus);
246
+ shouldReturnFocusRef.current = shouldReturnFocus;
247
+ // eslint-disable-next-line react-hooks/rules-of-hooks
248
+ useEffect(function () {
249
+ return function () {
250
+ var target = shouldReturnFocusRef.current;
251
+ if (_typeof(target) === 'object' && target.current) {
252
+ target.current.focus();
253
+ }
254
+ };
255
+ }, []);
256
+
257
+ // Focus a ref-targeted element after mount (when autoFocus is a ref).
258
+ // When true, native <dialog>.showModal() handles focus automatically.
259
+ // eslint-disable-next-line react-hooks/rules-of-hooks
260
+ useAutoFocus(_typeof(autoFocus) === 'object' ? autoFocus : undefined, _typeof(autoFocus) === 'object');
261
+
262
+ // Chrome cross-origin iframe DnD workaround (crbug.com/362301053)
263
+ // eslint-disable-next-line react-hooks/rules-of-hooks
264
+ useEffect(function () {
265
+ return combine(disableDraggingToCrossOriginIFramesForElement(), disableDraggingToCrossOriginIFramesForTextSelection(), disableDraggingToCrossOriginIFramesForExternal());
266
+ }, []);
267
+
268
+ // Responsive layout via ID-scoped <style> (same pattern as Dialog's hideBackdrop).
269
+ // ID selector beats Compiled atomic classes without !important and supports @media.
270
+ var namedWidth = getDialogWidth(width !== null && width !== void 0 ? width : 'medium');
271
+ var dialogId = "modal-dialog-".concat(id);
272
+ var escapedDialogId = CSS.escape(dialogId);
273
+
274
+ // Percentage widths need special handling in the top layer.
275
+ // In legacy, the percentage resolved against the Positioner's max-width
276
+ // (100vw - 120px). In the top layer, the <dialog>'s containing block is the
277
+ // viewport (100vw), so a raw percentage would produce a wider modal.
278
+ // Transform e.g. '42%' → 'calc(42 * (100vw - 120px) / 100)' to match legacy.
279
+ var resolvedWidth = namedWidth.endsWith('%') ? "calc(".concat(parseFloat(namedWidth), " * (100vw - 120px) / 100)") : namedWidth;
280
+ var dialogStyle = isFullScreen ? {
281
+ width: '100vw',
282
+ height: '100vh',
283
+ margin: '0'
284
+ } : {
285
+ width: "min(".concat(resolvedWidth, ", 100vw)")
286
+ };
287
+
288
+ // Shift stacked background modals down by space.100 (8px) per level.
289
+ if (stackIndex > 0) {
290
+ dialogStyle['transform'] = "translateY(calc(".concat(stackIndex, "px * ", "var(--ds-space-100, 8px)", "))");
291
+ }
292
+
293
+ // Mobile: viewport fill. Desktop (≥ 30rem): gutter margins, auto height.
294
+ // Content-div height set via #id > div to beat Compiled's atomic specificity.
295
+ var desktopMargin = shouldScrollInViewport ? '60px auto' : '60px auto auto';
296
+ var resolvedHeight = dialogHeight(height);
297
+ // Body-scroll: specified height or auto. Viewport-scroll: uses min-height.
298
+ var desktopContentHeight = shouldScrollInViewport ? 'auto' : resolvedHeight;
299
+ var desktopContentMinHeight = shouldScrollInViewport ? resolvedHeight : 'auto';
300
+ // Viewport-scroll: the legacy Positioner was a fixed 100vh container that
301
+ // scrolled internally, so the modal section could fill (100vh - 60px top gutter).
302
+ // In the top layer the <dialog> sizes to content with height:auto, so we need
303
+ // an explicit min-height to ensure the dialog stretches to the same visible area.
304
+ var desktopDialogMinHeight = shouldScrollInViewport ? 'min-height:calc(100vh - 60px);' : '';
305
+ // Doubled-ID selector (#id#id > div) at specificity (2,0,1) beats
306
+ // Compiled atomic classes at (0,1,0) (increaseSpecificity is disabled).
307
+ var dialogPositionStyles = isFullScreen ? ''
308
+ // Mobile: edge-to-edge. Desktop (≥ 30rem): 60px gutters, max-width.
309
+ : "#".concat(escapedDialogId, "#").concat(escapedDialogId, "{margin:0;height:100vh}#").concat(escapedDialogId, "#").concat(escapedDialogId, ">div{height:100%}@media(min-width:30rem){#").concat(escapedDialogId, "#").concat(escapedDialogId, "{margin:").concat(desktopMargin, ";height:auto;").concat(desktopDialogMinHeight, "max-width:calc(100vw - 120px)}#").concat(escapedDialogId, "#").concat(escapedDialogId, ">div{height:").concat(desktopContentHeight, ";min-height:").concat(desktopContentMinHeight, "}}");
310
+ return /*#__PURE__*/React.createElement(Dialog, {
311
+ ref: dialogRef,
312
+ id: dialogId,
313
+ onClose: onDialogClose,
314
+ onExitFinish: handleDialogExitFinish,
315
+ animate: isFullScreen ? false : modalAnimation,
316
+ isOpen: !isExiting,
317
+ shouldHideBackdrop: stackIndex > 0 || Boolean(isBlanketHidden),
318
+ label: label,
319
+ labelledBy: label ? undefined : titleId,
320
+ testId: defaultTestId
321
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
322
+ ,
323
+ style: dialogStyle
324
+ }, /*#__PURE__*/React.createElement(DialogScrollLock, null), dialogPositionStyles &&
325
+ /*#__PURE__*/
326
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-global-styles
327
+ React.createElement("style", null, dialogPositionStyles), /*#__PURE__*/React.createElement("div", {
328
+ ref: contentRef,
329
+ className: ax([topLayerStyles.content, !isFullScreen && topLayerStyles.borderRadius, !isFullScreen && fg('platform-dst-shape-theme-default') && topLayerStyles.borderRadiusT26, !isFullScreen && !shouldScrollInViewport && "_bolhzwhf", !isFullScreen && shouldScrollInViewport && "_1tke1kxc _c71lglyw"])
330
+ }, /*#__PURE__*/React.createElement(ModalContext.Provider, {
331
+ value: modalDialogContext
332
+ }, /*#__PURE__*/React.createElement(ScrollContext.Provider, {
333
+ value: shouldScrollInViewport
334
+ }, children))));
335
+ }
110
336
  var modalDialogWithBlanket = /*#__PURE__*/React.createElement(Blanket, {
111
337
  isTinted: !isBlanketHidden,
112
338
  onBlanketClicked: onBlanketClicked,
@@ -2,6 +2,9 @@
2
2
  * @jsxRuntime classic
3
3
  * @jsx jsx
4
4
  */
5
+ import type { ModalDialogProps } from '../../types';
5
6
  import type { InternalModalDialogProps } from '../types';
7
+ export declare const dialogWidth: (input?: ModalDialogProps["width"]) => string;
8
+ export declare const dialogHeight: (input?: ModalDialogProps["height"]) => string;
6
9
  declare const ModalDialog: (props: InternalModalDialogProps) => JSX.Element;
7
10
  export default ModalDialog;
@@ -19,10 +19,8 @@ export interface ModalDialogProps {
19
19
  * accessibility regressions. Pass an element `ref` to focus on a specific element.
20
20
  *
21
21
  * Default value is `true`.
22
- *
23
- * @deprecated {@link https://hello.jira.atlassian.cloud/browse/ENGHEALTH-28588 Learn more about why `false` should not be used and will be removed.}
24
22
  */
25
- autoFocus?: boolean | RefObject<HTMLElement | null | undefined>;
23
+ autoFocus?: RefObject<HTMLElement | null | undefined>;
26
24
  /**
27
25
  * Contents of the modal dialog.
28
26
  */
@@ -2,6 +2,9 @@
2
2
  * @jsxRuntime classic
3
3
  * @jsx jsx
4
4
  */
5
+ import type { ModalDialogProps } from '../../types';
5
6
  import type { InternalModalDialogProps } from '../types';
7
+ export declare const dialogWidth: (input?: ModalDialogProps["width"]) => string;
8
+ export declare const dialogHeight: (input?: ModalDialogProps["height"]) => string;
6
9
  declare const ModalDialog: (props: InternalModalDialogProps) => JSX.Element;
7
10
  export default ModalDialog;
@@ -19,10 +19,8 @@ export interface ModalDialogProps {
19
19
  * accessibility regressions. Pass an element `ref` to focus on a specific element.
20
20
  *
21
21
  * Default value is `true`.
22
- *
23
- * @deprecated {@link https://hello.jira.atlassian.cloud/browse/ENGHEALTH-28588 Learn more about why `false` should not be used and will be removed.}
24
22
  */
25
- autoFocus?: boolean | RefObject<HTMLElement | null | undefined>;
23
+ autoFocus?: RefObject<HTMLElement | null | undefined>;
26
24
  /**
27
25
  * Contents of the modal dialog.
28
26
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/modal-dialog",
3
- "version": "14.18.3",
3
+ "version": "15.0.1",
4
4
  "description": "A modal dialog displays content that requires user interaction, in a layer above the page.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -39,7 +39,7 @@
39
39
  "@atlaskit/button": "^23.11.0",
40
40
  "@atlaskit/css": "^0.19.0",
41
41
  "@atlaskit/ds-lib": "^7.0.0",
42
- "@atlaskit/icon": "^34.3.0",
42
+ "@atlaskit/icon": "^34.5.0",
43
43
  "@atlaskit/layering": "^3.7.0",
44
44
  "@atlaskit/motion": "^6.2.0",
45
45
  "@atlaskit/platform-feature-flags": "^1.1.0",
@@ -48,6 +48,7 @@
48
48
  "@atlaskit/primitives": "^19.0.0",
49
49
  "@atlaskit/theme": "^23.2.0",
50
50
  "@atlaskit/tokens": "^13.0.0",
51
+ "@atlaskit/top-layer": "^0.6.0",
51
52
  "@babel/runtime": "^7.0.0",
52
53
  "@compiled/react": "^0.20.0",
53
54
  "bind-event-listener": "^3.0.0",
@@ -63,7 +64,7 @@
63
64
  "@af/integration-testing": "workspace:^",
64
65
  "@af/visual-regression": "workspace:^",
65
66
  "@atlaskit/avatar": "^25.14.0",
66
- "@atlaskit/avatar-group": "^12.7.0",
67
+ "@atlaskit/avatar-group": "^12.8.0",
67
68
  "@atlaskit/banner": "^14.1.0",
68
69
  "@atlaskit/breadcrumbs": "^16.1.0",
69
70
  "@atlaskit/checkbox": "^17.3.0",
@@ -75,14 +76,14 @@
75
76
  "@atlaskit/form": "^15.5.0",
76
77
  "@atlaskit/heading": "^5.4.0",
77
78
  "@atlaskit/link": "^3.4.0",
78
- "@atlaskit/popup": "^4.17.0",
79
+ "@atlaskit/popup": "^4.18.0",
79
80
  "@atlaskit/radio": "^8.6.0",
80
81
  "@atlaskit/section-message": "^8.12.0",
81
- "@atlaskit/select": "^21.10.0",
82
- "@atlaskit/spotlight": "^0.13.0",
82
+ "@atlaskit/select": "^21.11.0",
83
+ "@atlaskit/spotlight": "^0.14.0",
83
84
  "@atlaskit/textfield": "^8.3.0",
84
- "@atlaskit/tooltip": "^22.0.0",
85
- "@atlassian/feature-flags-test-utils": "^1.0.0",
85
+ "@atlaskit/tooltip": "^22.1.0",
86
+ "@atlassian/feature-flags-test-utils": "^1.1.0",
86
87
  "@atlassian/react-compiler-gating": "workspace:^",
87
88
  "@atlassian/ssr-tests": "workspace:^",
88
89
  "@atlassian/structured-docs-types": "workspace:^",
@@ -140,6 +141,9 @@
140
141
  },
141
142
  "platform-dst-motion-uplift-modal": {
142
143
  "type": "boolean"
144
+ },
145
+ "platform-dst-top-layer": {
146
+ "type": "boolean"
143
147
  }
144
148
  },
145
149
  "homepage": "https://atlassian.design/components/modal-dialog/"