@atlaskit/top-layer 0.1.0
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.
- package/CHANGELOG.md +44 -0
- package/README.md +151 -0
- package/animations/package.json +17 -0
- package/arrow/package.json +17 -0
- package/create-close-event/package.json +17 -0
- package/dialog/package.json +17 -0
- package/dialog-scroll-lock/package.json +17 -0
- package/dist/cjs/animations/presets.js +199 -0
- package/dist/cjs/animations/types.js +5 -0
- package/dist/cjs/arrow/index.js +130 -0
- package/dist/cjs/arrow/types.js +5 -0
- package/dist/cjs/dialog/create-close-event.js +39 -0
- package/dist/cjs/dialog/dialog-content.compiled.css +14 -0
- package/dist/cjs/dialog/dialog-content.js +144 -0
- package/dist/cjs/dialog/index.js +19 -0
- package/dist/cjs/dialog/types.js +5 -0
- package/dist/cjs/dialog-scroll-lock/index.js +46 -0
- package/dist/cjs/entry-points/animations.js +36 -0
- package/dist/cjs/entry-points/arrow.js +12 -0
- package/dist/cjs/entry-points/create-close-event.js +19 -0
- package/dist/cjs/entry-points/dialog-scroll-lock.js +12 -0
- package/dist/cjs/entry-points/dialog.js +12 -0
- package/dist/cjs/entry-points/focus.js +24 -0
- package/dist/cjs/entry-points/placement-map.js +18 -0
- package/dist/cjs/entry-points/popover.js +12 -0
- package/dist/cjs/entry-points/popup-surface.js +12 -0
- package/dist/cjs/entry-points/popup.js +12 -0
- package/dist/cjs/entry-points/use-anchor-position.js +12 -0
- package/dist/cjs/entry-points/use-arrow-navigation.js +18 -0
- package/dist/cjs/entry-points/use-simple-light-dismiss.js +12 -0
- package/dist/cjs/focus/focus.js +115 -0
- package/dist/cjs/focus/index.js +24 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/internal/anchor-positioning-fallback.js +154 -0
- package/dist/cjs/internal/combine.js +29 -0
- package/dist/cjs/internal/ensure-preset-styles.js +34 -0
- package/dist/cjs/internal/reduced-motion.js +27 -0
- package/dist/cjs/internal/resolve-placement.js +24 -0
- package/dist/cjs/internal/role-types.js +66 -0
- package/dist/cjs/internal/set-style.js +42 -0
- package/dist/cjs/internal/slot.js +65 -0
- package/dist/cjs/internal/use-anchor-positioning.js +336 -0
- package/dist/cjs/internal/use-animated-visibility.js +169 -0
- package/dist/cjs/internal/use-animation-preset.js +24 -0
- package/dist/cjs/internal/use-focus-wrap.js +94 -0
- package/dist/cjs/internal/use-initial-focus.js +112 -0
- package/dist/cjs/internal/use-preset-styles.js +27 -0
- package/dist/cjs/placement-map/index.js +147 -0
- package/dist/cjs/popover/create-close-event.js +44 -0
- package/dist/cjs/popover/index.js +19 -0
- package/dist/cjs/popover/popover.compiled.css +13 -0
- package/dist/cjs/popover/popover.js +251 -0
- package/dist/cjs/popover/types.js +5 -0
- package/dist/cjs/popup/index.js +37 -0
- package/dist/cjs/popup/popup-content.js +201 -0
- package/dist/cjs/popup/popup-context.js +42 -0
- package/dist/cjs/popup/popup-surface.compiled.css +5 -0
- package/dist/cjs/popup/popup-surface.js +30 -0
- package/dist/cjs/popup/popup-trigger-function.js +74 -0
- package/dist/cjs/popup/popup-trigger.js +82 -0
- package/dist/cjs/popup/popup.js +70 -0
- package/dist/cjs/popup/types.js +5 -0
- package/dist/cjs/use-arrow-navigation/index.js +18 -0
- package/dist/cjs/use-arrow-navigation/use-arrow-navigation.js +245 -0
- package/dist/cjs/use-simple-light-dismiss/index.js +84 -0
- package/dist/es2019/animations/presets.js +375 -0
- package/dist/es2019/animations/types.js +1 -0
- package/dist/es2019/arrow/index.js +249 -0
- package/dist/es2019/arrow/types.js +1 -0
- package/dist/es2019/dialog/create-close-event.js +34 -0
- package/dist/es2019/dialog/dialog-content.compiled.css +14 -0
- package/dist/es2019/dialog/dialog-content.js +138 -0
- package/dist/es2019/dialog/index.js +2 -0
- package/dist/es2019/dialog/types.js +1 -0
- package/dist/es2019/dialog-scroll-lock/index.js +41 -0
- package/dist/es2019/entry-points/animations.js +1 -0
- package/dist/es2019/entry-points/arrow.js +1 -0
- package/dist/es2019/entry-points/create-close-event.js +2 -0
- package/dist/es2019/entry-points/dialog-scroll-lock.js +1 -0
- package/dist/es2019/entry-points/dialog.js +1 -0
- package/dist/es2019/entry-points/focus.js +1 -0
- package/dist/es2019/entry-points/placement-map.js +1 -0
- package/dist/es2019/entry-points/popover.js +1 -0
- package/dist/es2019/entry-points/popup-surface.js +1 -0
- package/dist/es2019/entry-points/popup.js +1 -0
- package/dist/es2019/entry-points/use-anchor-position.js +1 -0
- package/dist/es2019/entry-points/use-arrow-navigation.js +1 -0
- package/dist/es2019/entry-points/use-simple-light-dismiss.js +1 -0
- package/dist/es2019/focus/focus.js +107 -0
- package/dist/es2019/focus/index.js +1 -0
- package/dist/es2019/index.js +7 -0
- package/dist/es2019/internal/anchor-positioning-fallback.js +153 -0
- package/dist/es2019/internal/combine.js +18 -0
- package/dist/es2019/internal/ensure-preset-styles.js +29 -0
- package/dist/es2019/internal/reduced-motion.js +21 -0
- package/dist/es2019/internal/resolve-placement.js +19 -0
- package/dist/es2019/internal/role-types.js +61 -0
- package/dist/es2019/internal/set-style.js +39 -0
- package/dist/es2019/internal/slot.js +57 -0
- package/dist/es2019/internal/use-anchor-positioning.js +330 -0
- package/dist/es2019/internal/use-animated-visibility.js +159 -0
- package/dist/es2019/internal/use-animation-preset.js +18 -0
- package/dist/es2019/internal/use-focus-wrap.js +90 -0
- package/dist/es2019/internal/use-initial-focus.js +109 -0
- package/dist/es2019/internal/use-preset-styles.js +22 -0
- package/dist/es2019/placement-map/index.js +142 -0
- package/dist/es2019/popover/create-close-event.js +39 -0
- package/dist/es2019/popover/index.js +2 -0
- package/dist/es2019/popover/popover.compiled.css +13 -0
- package/dist/es2019/popover/popover.js +240 -0
- package/dist/es2019/popover/types.js +1 -0
- package/dist/es2019/popup/index.js +33 -0
- package/dist/es2019/popup/popup-content.js +192 -0
- package/dist/es2019/popup/popup-context.js +34 -0
- package/dist/es2019/popup/popup-surface.compiled.css +5 -0
- package/dist/es2019/popup/popup-surface.js +24 -0
- package/dist/es2019/popup/popup-trigger-function.js +69 -0
- package/dist/es2019/popup/popup-trigger.js +76 -0
- package/dist/es2019/popup/popup.js +56 -0
- package/dist/es2019/popup/types.js +1 -0
- package/dist/es2019/use-arrow-navigation/index.js +1 -0
- package/dist/es2019/use-arrow-navigation/use-arrow-navigation.js +238 -0
- package/dist/es2019/use-simple-light-dismiss/index.js +79 -0
- package/dist/esm/animations/presets.js +190 -0
- package/dist/esm/animations/types.js +1 -0
- package/dist/esm/arrow/index.js +123 -0
- package/dist/esm/arrow/types.js +1 -0
- package/dist/esm/dialog/create-close-event.js +33 -0
- package/dist/esm/dialog/dialog-content.compiled.css +14 -0
- package/dist/esm/dialog/dialog-content.js +135 -0
- package/dist/esm/dialog/index.js +2 -0
- package/dist/esm/dialog/types.js +1 -0
- package/dist/esm/dialog-scroll-lock/index.js +41 -0
- package/dist/esm/entry-points/animations.js +1 -0
- package/dist/esm/entry-points/arrow.js +1 -0
- package/dist/esm/entry-points/create-close-event.js +2 -0
- package/dist/esm/entry-points/dialog-scroll-lock.js +1 -0
- package/dist/esm/entry-points/dialog.js +1 -0
- package/dist/esm/entry-points/focus.js +1 -0
- package/dist/esm/entry-points/placement-map.js +1 -0
- package/dist/esm/entry-points/popover.js +1 -0
- package/dist/esm/entry-points/popup-surface.js +1 -0
- package/dist/esm/entry-points/popup.js +1 -0
- package/dist/esm/entry-points/use-anchor-position.js +1 -0
- package/dist/esm/entry-points/use-arrow-navigation.js +1 -0
- package/dist/esm/entry-points/use-simple-light-dismiss.js +1 -0
- package/dist/esm/focus/focus.js +107 -0
- package/dist/esm/focus/index.js +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/internal/anchor-positioning-fallback.js +147 -0
- package/dist/esm/internal/combine.js +23 -0
- package/dist/esm/internal/ensure-preset-styles.js +28 -0
- package/dist/esm/internal/reduced-motion.js +21 -0
- package/dist/esm/internal/resolve-placement.js +18 -0
- package/dist/esm/internal/role-types.js +60 -0
- package/dist/esm/internal/set-style.js +36 -0
- package/dist/esm/internal/slot.js +59 -0
- package/dist/esm/internal/use-anchor-positioning.js +323 -0
- package/dist/esm/internal/use-animated-visibility.js +162 -0
- package/dist/esm/internal/use-animation-preset.js +18 -0
- package/dist/esm/internal/use-focus-wrap.js +89 -0
- package/dist/esm/internal/use-initial-focus.js +107 -0
- package/dist/esm/internal/use-preset-styles.js +21 -0
- package/dist/esm/placement-map/index.js +141 -0
- package/dist/esm/popover/create-close-event.js +38 -0
- package/dist/esm/popover/index.js +2 -0
- package/dist/esm/popover/popover.compiled.css +13 -0
- package/dist/esm/popover/popover.js +242 -0
- package/dist/esm/popover/types.js +1 -0
- package/dist/esm/popup/index.js +33 -0
- package/dist/esm/popup/popup-content.js +192 -0
- package/dist/esm/popup/popup-context.js +34 -0
- package/dist/esm/popup/popup-surface.compiled.css +5 -0
- package/dist/esm/popup/popup-surface.js +23 -0
- package/dist/esm/popup/popup-trigger-function.js +69 -0
- package/dist/esm/popup/popup-trigger.js +74 -0
- package/dist/esm/popup/popup.js +61 -0
- package/dist/esm/popup/types.js +1 -0
- package/dist/esm/use-arrow-navigation/index.js +1 -0
- package/dist/esm/use-arrow-navigation/use-arrow-navigation.js +238 -0
- package/dist/esm/use-simple-light-dismiss/index.js +78 -0
- package/dist/types/animations/presets.d.ts +94 -0
- package/dist/types/animations/types.d.ts +42 -0
- package/dist/types/arrow/index.d.ts +24 -0
- package/dist/types/arrow/types.d.ts +29 -0
- package/dist/types/dialog/create-close-event.d.ts +24 -0
- package/dist/types/dialog/dialog-content.d.ts +20 -0
- package/dist/types/dialog/index.d.ts +3 -0
- package/dist/types/dialog/types.d.ts +92 -0
- package/dist/types/dialog-scroll-lock/index.d.ts +24 -0
- package/dist/types/entry-points/animations.d.ts +2 -0
- package/dist/types/entry-points/arrow.d.ts +2 -0
- package/dist/types/entry-points/create-close-event.d.ts +4 -0
- package/dist/types/entry-points/dialog-scroll-lock.d.ts +1 -0
- package/dist/types/entry-points/dialog.d.ts +2 -0
- package/dist/types/entry-points/focus.d.ts +2 -0
- package/dist/types/entry-points/placement-map.d.ts +2 -0
- package/dist/types/entry-points/popover.d.ts +2 -0
- package/dist/types/entry-points/popup-surface.d.ts +2 -0
- package/dist/types/entry-points/popup.d.ts +2 -0
- package/dist/types/entry-points/use-anchor-position.d.ts +1 -0
- package/dist/types/entry-points/use-arrow-navigation.d.ts +2 -0
- package/dist/types/entry-points/use-simple-light-dismiss.d.ts +2 -0
- package/dist/types/focus/focus.d.ts +42 -0
- package/dist/types/focus/index.d.ts +2 -0
- package/dist/types/index.d.ts +0 -0
- package/dist/types/internal/anchor-positioning-fallback.d.ts +24 -0
- package/dist/types/internal/combine.d.ts +14 -0
- package/dist/types/internal/ensure-preset-styles.d.ts +6 -0
- package/dist/types/internal/reduced-motion.d.ts +14 -0
- package/dist/types/internal/resolve-placement.d.ts +16 -0
- package/dist/types/internal/role-types.d.ts +62 -0
- package/dist/types/internal/set-style.d.ts +28 -0
- package/dist/types/internal/slot.d.ts +29 -0
- package/dist/types/internal/use-anchor-positioning.d.ts +95 -0
- package/dist/types/internal/use-animated-visibility.d.ts +74 -0
- package/dist/types/internal/use-animation-preset.d.ts +11 -0
- package/dist/types/internal/use-focus-wrap.d.ts +20 -0
- package/dist/types/internal/use-initial-focus.d.ts +21 -0
- package/dist/types/internal/use-preset-styles.d.ts +15 -0
- package/dist/types/placement-map/index.d.ts +55 -0
- package/dist/types/popover/create-close-event.d.ts +26 -0
- package/dist/types/popover/index.d.ts +3 -0
- package/dist/types/popover/popover.d.ts +22 -0
- package/dist/types/popover/types.d.ts +153 -0
- package/dist/types/popup/index.d.ts +34 -0
- package/dist/types/popup/popup-content.d.ts +14 -0
- package/dist/types/popup/popup-context.d.ts +96 -0
- package/dist/types/popup/popup-surface.d.ts +16 -0
- package/dist/types/popup/popup-trigger-function.d.ts +108 -0
- package/dist/types/popup/popup-trigger.d.ts +23 -0
- package/dist/types/popup/popup.d.ts +14 -0
- package/dist/types/popup/types.d.ts +289 -0
- package/dist/types/use-arrow-navigation/index.d.ts +2 -0
- package/dist/types/use-arrow-navigation/use-arrow-navigation.d.ts +136 -0
- package/dist/types/use-simple-light-dismiss/index.d.ts +45 -0
- package/dist/types-ts4.5/animations/presets.d.ts +94 -0
- package/dist/types-ts4.5/animations/types.d.ts +42 -0
- package/dist/types-ts4.5/arrow/index.d.ts +24 -0
- package/dist/types-ts4.5/arrow/types.d.ts +29 -0
- package/dist/types-ts4.5/dialog/create-close-event.d.ts +24 -0
- package/dist/types-ts4.5/dialog/dialog-content.d.ts +20 -0
- package/dist/types-ts4.5/dialog/index.d.ts +3 -0
- package/dist/types-ts4.5/dialog/types.d.ts +92 -0
- package/dist/types-ts4.5/dialog-scroll-lock/index.d.ts +24 -0
- package/dist/types-ts4.5/entry-points/animations.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/arrow.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/create-close-event.d.ts +4 -0
- package/dist/types-ts4.5/entry-points/dialog-scroll-lock.d.ts +1 -0
- package/dist/types-ts4.5/entry-points/dialog.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/focus.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/placement-map.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/popover.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/popup-surface.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/popup.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/use-anchor-position.d.ts +1 -0
- package/dist/types-ts4.5/entry-points/use-arrow-navigation.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/use-simple-light-dismiss.d.ts +2 -0
- package/dist/types-ts4.5/focus/focus.d.ts +42 -0
- package/dist/types-ts4.5/focus/index.d.ts +2 -0
- package/dist/types-ts4.5/index.d.ts +0 -0
- package/dist/types-ts4.5/internal/anchor-positioning-fallback.d.ts +24 -0
- package/dist/types-ts4.5/internal/combine.d.ts +14 -0
- package/dist/types-ts4.5/internal/ensure-preset-styles.d.ts +6 -0
- package/dist/types-ts4.5/internal/reduced-motion.d.ts +14 -0
- package/dist/types-ts4.5/internal/resolve-placement.d.ts +16 -0
- package/dist/types-ts4.5/internal/role-types.d.ts +62 -0
- package/dist/types-ts4.5/internal/set-style.d.ts +28 -0
- package/dist/types-ts4.5/internal/slot.d.ts +29 -0
- package/dist/types-ts4.5/internal/use-anchor-positioning.d.ts +95 -0
- package/dist/types-ts4.5/internal/use-animated-visibility.d.ts +74 -0
- package/dist/types-ts4.5/internal/use-animation-preset.d.ts +11 -0
- package/dist/types-ts4.5/internal/use-focus-wrap.d.ts +20 -0
- package/dist/types-ts4.5/internal/use-initial-focus.d.ts +21 -0
- package/dist/types-ts4.5/internal/use-preset-styles.d.ts +15 -0
- package/dist/types-ts4.5/placement-map/index.d.ts +55 -0
- package/dist/types-ts4.5/popover/create-close-event.d.ts +26 -0
- package/dist/types-ts4.5/popover/index.d.ts +3 -0
- package/dist/types-ts4.5/popover/popover.d.ts +22 -0
- package/dist/types-ts4.5/popover/types.d.ts +153 -0
- package/dist/types-ts4.5/popup/index.d.ts +34 -0
- package/dist/types-ts4.5/popup/popup-content.d.ts +14 -0
- package/dist/types-ts4.5/popup/popup-context.d.ts +96 -0
- package/dist/types-ts4.5/popup/popup-surface.d.ts +16 -0
- package/dist/types-ts4.5/popup/popup-trigger-function.d.ts +108 -0
- package/dist/types-ts4.5/popup/popup-trigger.d.ts +23 -0
- package/dist/types-ts4.5/popup/popup.d.ts +14 -0
- package/dist/types-ts4.5/popup/types.d.ts +289 -0
- package/dist/types-ts4.5/use-arrow-navigation/index.d.ts +2 -0
- package/dist/types-ts4.5/use-arrow-navigation/use-arrow-navigation.d.ts +136 -0
- package/dist/types-ts4.5/use-simple-light-dismiss/index.d.ts +45 -0
- package/focus/package.json +17 -0
- package/package.json +95 -0
- package/placement-map/package.json +17 -0
- package/popover/package.json +17 -0
- package/popup/package.json +17 -0
- package/popup-surface/package.json +17 -0
- package/use-anchor-position/package.json +17 -0
- package/use-arrow-navigation/package.json +17 -0
- package/use-simple-light-dismiss/package.json +17 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
|
|
2
|
+
._19itglyw{border:none}._18u01wug{margin-left:auto}
|
|
3
|
+
._19pk1wug{margin-top:auto}
|
|
4
|
+
._1ltk1i5c::-ms-backdrop{background-color:var(--ds-blanket,#050c1f75)}
|
|
5
|
+
._1ltk1i5c::backdrop{background-color:var(--ds-blanket,#050c1f75)}
|
|
6
|
+
._1q51ze3t{padding-block-start:var(--ds-space-0,0)}
|
|
7
|
+
._2hwx1wug{margin-right:auto}
|
|
8
|
+
._85i5ze3t{padding-block-end:var(--ds-space-0,0)}
|
|
9
|
+
._bfhk1j28{background-color:transparent}
|
|
10
|
+
._bozgze3t{padding-inline-start:var(--ds-space-0,0)}
|
|
11
|
+
._c71lglyw{max-height:none}
|
|
12
|
+
._otyr1wug{margin-bottom:auto}
|
|
13
|
+
._p12fglyw{max-width:none}
|
|
14
|
+
._y4tize3t{padding-inline-end:var(--ds-space-0,0)}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/* dialog-content.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import "./dialog-content.compiled.css";
|
|
5
|
+
import { ax, ix } from "@compiled/react/runtime";
|
|
6
|
+
import React, { forwardRef, useCallback, useEffect, useId, useLayoutEffect, useRef } from 'react';
|
|
7
|
+
import { bind } from 'bind-event-listener';
|
|
8
|
+
import mergeRefs from '@atlaskit/ds-lib/merge-refs';
|
|
9
|
+
import { useAnimatedVisibility } from '../internal/use-animated-visibility';
|
|
10
|
+
import { useFocusWrap } from '../internal/use-focus-wrap';
|
|
11
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values -- dialog reset requires values not in cssMap's type union
|
|
12
|
+
var styles = {
|
|
13
|
+
dialog: "_19itglyw _19pk1wug _2hwx1wug _otyr1wug _18u01wug _1q51ze3t _y4tize3t _85i5ze3t _bozgze3t _p12fglyw _c71lglyw _bfhk1j28 _1ltk1i5c"
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Low-level `<dialog>` primitive. No visual opinions — no width, height,
|
|
18
|
+
* background, border-radius, or layout. Consumers provide their own styling.
|
|
19
|
+
*
|
|
20
|
+
* Visibility is controlled declaratively via `isOpen`:
|
|
21
|
+
* - `isOpen={true}` calls `.showModal()` (entry animation via `@starting-style`)
|
|
22
|
+
* - `isOpen={false}` calls `.close()` (exit animation via `allow-discrete`)
|
|
23
|
+
*
|
|
24
|
+
* Handles native `cancel` event (Escape) and backdrop click detection.
|
|
25
|
+
*
|
|
26
|
+
* Close flow: we never call `dialog.close()` from event handlers. We always call
|
|
27
|
+
* `onClose`; the consumer decides whether to set `isOpen={false}`.
|
|
28
|
+
*/
|
|
29
|
+
export var Dialog = /*#__PURE__*/forwardRef(function Dialog(_ref, ref) {
|
|
30
|
+
var children = _ref.children,
|
|
31
|
+
isOpen = _ref.isOpen,
|
|
32
|
+
onClose = _ref.onClose,
|
|
33
|
+
onExitFinish = _ref.onExitFinish,
|
|
34
|
+
animate = _ref.animate,
|
|
35
|
+
style = _ref.style,
|
|
36
|
+
testId = _ref.testId,
|
|
37
|
+
providedId = _ref.id,
|
|
38
|
+
label = _ref.label,
|
|
39
|
+
labelledBy = _ref.labelledBy,
|
|
40
|
+
shouldHideBackdrop = _ref.shouldHideBackdrop;
|
|
41
|
+
var generatedId = useId();
|
|
42
|
+
var dialogId = providedId !== null && providedId !== void 0 ? providedId : generatedId;
|
|
43
|
+
var ownRef = useRef(null);
|
|
44
|
+
var combinedRef = mergeRefs([ownRef, ref]);
|
|
45
|
+
|
|
46
|
+
// ── Animation lifecycle ──
|
|
47
|
+
var _useAnimatedVisibilit = useAnimatedVisibility({
|
|
48
|
+
isOpen: isOpen,
|
|
49
|
+
animate: animate,
|
|
50
|
+
elementRef: ownRef,
|
|
51
|
+
onExitFinish: onExitFinish
|
|
52
|
+
}),
|
|
53
|
+
showChildren = _useAnimatedVisibilit.showChildren,
|
|
54
|
+
preset = _useAnimatedVisibilit.preset;
|
|
55
|
+
|
|
56
|
+
// ── Focus wrap ──
|
|
57
|
+
// Native <dialog>.showModal() traps focus but wraps through <body> at
|
|
58
|
+
// the boundary (A → B → C → body → A). This hook intercepts Tab to
|
|
59
|
+
// wrap directly (A → B → C → A), matching the WAI-ARIA APG pattern.
|
|
60
|
+
useFocusWrap({
|
|
61
|
+
elementRef: ownRef,
|
|
62
|
+
role: 'dialog'
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Show/hide the dialog in response to isOpen changes.
|
|
66
|
+
useLayoutEffect(function () {
|
|
67
|
+
var dialog = ownRef.current;
|
|
68
|
+
if (!dialog) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (isOpen) {
|
|
72
|
+
if (!dialog.open) {
|
|
73
|
+
dialog.showModal();
|
|
74
|
+
}
|
|
75
|
+
return function () {
|
|
76
|
+
if (dialog.open) {
|
|
77
|
+
dialog.close();
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (dialog.open) {
|
|
82
|
+
dialog.close();
|
|
83
|
+
}
|
|
84
|
+
}, [isOpen]);
|
|
85
|
+
|
|
86
|
+
// ── Handle native Escape (cancel event) ──
|
|
87
|
+
var handleCancel = useCallback(function (event) {
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
onClose({
|
|
90
|
+
reason: 'escape'
|
|
91
|
+
});
|
|
92
|
+
}, [onClose]);
|
|
93
|
+
|
|
94
|
+
// ── Handle backdrop click ──
|
|
95
|
+
// Attached via bind-event-listener rather than a React prop so we avoid
|
|
96
|
+
// a11y lint suppressions on the <dialog> element.
|
|
97
|
+
// Keyboard dismiss is already handled natively (Escape → onCancel above).
|
|
98
|
+
useEffect(function () {
|
|
99
|
+
var dialog = ownRef.current;
|
|
100
|
+
if (!dialog) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
return bind(dialog, {
|
|
104
|
+
type: 'click',
|
|
105
|
+
listener: function listener(event) {
|
|
106
|
+
if (event.target === event.currentTarget) {
|
|
107
|
+
onClose({
|
|
108
|
+
reason: 'overlay-click'
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}, [onClose]);
|
|
114
|
+
|
|
115
|
+
// Atomic CSS (Compiled) deduplicates ::backdrop { background-color }
|
|
116
|
+
// into a single class, making it impossible to toggle between two values
|
|
117
|
+
// via cssMap entries. An ID-scoped <style> has higher specificity than
|
|
118
|
+
// any atomic class, so the override always wins.
|
|
119
|
+
var escapedId = CSS.escape(dialogId);
|
|
120
|
+
return /*#__PURE__*/React.createElement("dialog", _extends({
|
|
121
|
+
ref: combinedRef,
|
|
122
|
+
id: dialogId,
|
|
123
|
+
"aria-label": label,
|
|
124
|
+
"aria-labelledby": label ? undefined : labelledBy,
|
|
125
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop
|
|
126
|
+
style: style,
|
|
127
|
+
onCancel: handleCancel,
|
|
128
|
+
"data-testid": testId
|
|
129
|
+
}, preset ? _defineProperty({}, "data-ds-".concat(preset.name), '') : undefined, {
|
|
130
|
+
className: ax([styles.dialog])
|
|
131
|
+
}), shouldHideBackdrop &&
|
|
132
|
+
/*#__PURE__*/
|
|
133
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-global-styles
|
|
134
|
+
React.createElement("style", null, "#".concat(escapedId, "::backdrop{background-color:transparent}")), showChildren ? children : null);
|
|
135
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useLayoutEffect } from 'react';
|
|
2
|
+
import { getDocument } from '@atlaskit/browser-apis';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* __DialogScrollLock__
|
|
6
|
+
*
|
|
7
|
+
* Prevents background page scrolling while mounted. Designed to be rendered
|
|
8
|
+
* inside a `Dialog` so that the scroll lock is automatically removed when the
|
|
9
|
+
* dialog closes (unmounts its children).
|
|
10
|
+
*
|
|
11
|
+
* Native `<dialog>.showModal()` makes background content _inert_ (not
|
|
12
|
+
* focusable/clickable), but does **not** prevent scroll events from reaching
|
|
13
|
+
* the document body. This component fills that gap by setting
|
|
14
|
+
* `overflow: hidden` on `document.body`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* import { Dialog } from '@atlaskit/top-layer/dialog';
|
|
19
|
+
* import { DialogScrollLock } from '@atlaskit/top-layer/dialog-scroll-lock';
|
|
20
|
+
*
|
|
21
|
+
* <Dialog isOpen={isOpen} onClose={onClose}>
|
|
22
|
+
* <DialogScrollLock />
|
|
23
|
+
* {children}
|
|
24
|
+
* </Dialog>
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function DialogScrollLock() {
|
|
28
|
+
useLayoutEffect(function () {
|
|
29
|
+
var _getDocument;
|
|
30
|
+
var body = (_getDocument = getDocument()) === null || _getDocument === void 0 ? void 0 : _getDocument.body;
|
|
31
|
+
if (!body) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
var previousOverflow = body.style.overflow;
|
|
35
|
+
body.style.overflow = 'hidden';
|
|
36
|
+
return function () {
|
|
37
|
+
body.style.overflow = previousOverflow;
|
|
38
|
+
};
|
|
39
|
+
}, []);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { slideAndFade, fade, scaleAndFade, dialogSlideUpAndFade, dialogFade } from '../animations/presets';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { arrow } from '../arrow';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DialogScrollLock } from '../dialog-scroll-lock';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Dialog } from '../dialog';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getFirstFocusable, getLastFocusable, getNextFocusable } from '../focus';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fromLegacyPlacement, placementMapping } from '../placement-map';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Popover } from '../popover';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { PopupSurface } from '../popup/popup-surface';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Popup } from '../popup';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useAnchorPosition } from '../internal/use-anchor-positioning';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useArrowNavigation, isAtCurrentMenuLevel } from '../use-arrow-navigation';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useSimpleLightDismiss } from '../use-simple-light-dismiss';
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Focusable element selectors and navigation helpers.
|
|
3
|
+
*
|
|
4
|
+
* Uses CSS selectors to discover focusable elements within a container,
|
|
5
|
+
* avoiding the need for a manual registration system. Disabled elements
|
|
6
|
+
* (both HTML `disabled` attribute and `aria-disabled="true"`) and elements
|
|
7
|
+
* with `tabindex="-1"` are excluded automatically.
|
|
8
|
+
*
|
|
9
|
+
* All public functions accept an optional `filter` callback to further
|
|
10
|
+
* restrict which focusable elements are included.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
var selectors = function () {
|
|
14
|
+
// Common exclusion filter applied to every selector.
|
|
15
|
+
var not = ':not([tabindex="-1"]):not([aria-disabled="true"]):not([aria-hidden="true"])';
|
|
16
|
+
var notDisabled = ":not([disabled])".concat(not);
|
|
17
|
+
var focusable = ["a[href]".concat(not), "area[href]".concat(not), "input".concat(notDisabled, ":not([type=\"hidden\"])"), "select".concat(notDisabled), "textarea".concat(notDisabled), "button".concat(notDisabled), "iframe".concat(not), "audio[controls]".concat(not), "video[controls]".concat(not), "[contenteditable]:not([contenteditable=\"false\"])".concat(not), "[tabindex]".concat(notDisabled).concat(not)];
|
|
18
|
+
return {
|
|
19
|
+
focusable: focusable.join(','),
|
|
20
|
+
focused: focusable.join(':focus,') + ':focus'
|
|
21
|
+
};
|
|
22
|
+
}();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* An optional callback to restrict which focusable elements are included.
|
|
26
|
+
* Return `true` to include the element, `false` to skip it.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Returns all focusable HTMLElements within the container, optionally filtered.
|
|
31
|
+
*
|
|
32
|
+
* Note: this searches the full subtree and does not stop at nested
|
|
33
|
+
* popover/dialog boundaries. In practice this is fine because nested
|
|
34
|
+
* popovers are not rendered until they are opened, so their content
|
|
35
|
+
* is not in the DOM when the parent's initial focus runs. If that
|
|
36
|
+
* assumption changes, this would need to be scoped to the current layer.
|
|
37
|
+
*/
|
|
38
|
+
function getFocusables(_ref) {
|
|
39
|
+
var container = _ref.container,
|
|
40
|
+
filter = _ref.filter;
|
|
41
|
+
return Array.from(container.querySelectorAll(selectors.focusable)).filter(function (el) {
|
|
42
|
+
return el instanceof HTMLElement;
|
|
43
|
+
}).filter(function (el) {
|
|
44
|
+
return !filter || filter(el, container);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Returns the first focusable element within the container.
|
|
50
|
+
*/
|
|
51
|
+
export function getFirstFocusable(_ref2) {
|
|
52
|
+
var container = _ref2.container,
|
|
53
|
+
filter = _ref2.filter;
|
|
54
|
+
var items = getFocusables({
|
|
55
|
+
container: container,
|
|
56
|
+
filter: filter
|
|
57
|
+
});
|
|
58
|
+
return items.length > 0 ? items[0] : null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Returns the last focusable element within the container.
|
|
63
|
+
*/
|
|
64
|
+
export function getLastFocusable(_ref3) {
|
|
65
|
+
var container = _ref3.container,
|
|
66
|
+
filter = _ref3.filter;
|
|
67
|
+
var items = getFocusables({
|
|
68
|
+
container: container,
|
|
69
|
+
filter: filter
|
|
70
|
+
});
|
|
71
|
+
return items.length > 0 ? items[items.length - 1] : null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns the next focusable element in the given direction relative to the
|
|
76
|
+
* currently focused element within the container. Wraps around at both ends.
|
|
77
|
+
*
|
|
78
|
+
* Returns `null` if there is no focused element within the container or if
|
|
79
|
+
* the focused element is not in the list of focusable elements.
|
|
80
|
+
*/
|
|
81
|
+
export function getNextFocusable(_ref4) {
|
|
82
|
+
var _all$nextIndex;
|
|
83
|
+
var container = _ref4.container,
|
|
84
|
+
direction = _ref4.direction,
|
|
85
|
+
filter = _ref4.filter;
|
|
86
|
+
var all = getFocusables({
|
|
87
|
+
container: container,
|
|
88
|
+
filter: filter
|
|
89
|
+
});
|
|
90
|
+
var current = container.querySelector(selectors.focused);
|
|
91
|
+
if (!(current instanceof HTMLElement)) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
var index = all.indexOf(current);
|
|
95
|
+
if (index === -1) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
var nextIndex = function () {
|
|
99
|
+
if (direction === 'forwards') {
|
|
100
|
+
return (index + 1) % all.length;
|
|
101
|
+
}
|
|
102
|
+
var proposed = index - 1;
|
|
103
|
+
// if going into negative numbers, loop back to the last item
|
|
104
|
+
return proposed < 0 ? all.length - 1 : proposed;
|
|
105
|
+
}();
|
|
106
|
+
return (_all$nextIndex = all[nextIndex]) !== null && _all$nextIndex !== void 0 ? _all$nextIndex : null;
|
|
107
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { getFirstFocusable, getLastFocusable, getNextFocusable } from './focus';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// This file exists for module resolution purposes.
|
|
2
|
+
// Not exporting anything from the root entry point.
|
|
3
|
+
// Please use individual entry points for minimum bundle size:
|
|
4
|
+
//
|
|
5
|
+
// import { Popup } from '@atlaskit/top-layer/popup';
|
|
6
|
+
// import { Dialog } from '@atlaskit/top-layer/dialog';
|
|
7
|
+
// import { Popover } from '@atlaskit/top-layer/popover';
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
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; }
|
|
3
|
+
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) { _defineProperty(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; }
|
|
4
|
+
/**
|
|
5
|
+
* Computes the base {top, left} position based on the primary edge,
|
|
6
|
+
* flipping to the opposite side when there is not enough space.
|
|
7
|
+
*/
|
|
8
|
+
function computeEdgePosition(_ref) {
|
|
9
|
+
var axis = _ref.axis,
|
|
10
|
+
edge = _ref.edge,
|
|
11
|
+
triggerRect = _ref.triggerRect,
|
|
12
|
+
popoverWidth = _ref.popoverWidth,
|
|
13
|
+
popoverHeight = _ref.popoverHeight,
|
|
14
|
+
viewport = _ref.viewport,
|
|
15
|
+
offset = _ref.offset;
|
|
16
|
+
if (axis === 'block' && edge === 'end') {
|
|
17
|
+
// Below trigger
|
|
18
|
+
var spaceBelow = viewport.height - triggerRect.bottom;
|
|
19
|
+
var spaceAbove = triggerRect.top;
|
|
20
|
+
return {
|
|
21
|
+
top: spaceBelow >= popoverHeight + offset || spaceBelow >= spaceAbove ? triggerRect.bottom + offset : triggerRect.top - popoverHeight - offset,
|
|
22
|
+
left: triggerRect.left + triggerRect.width / 2 - popoverWidth / 2
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (axis === 'block' && edge === 'start') {
|
|
26
|
+
// Above trigger
|
|
27
|
+
var _spaceAbove = triggerRect.top;
|
|
28
|
+
var _spaceBelow = viewport.height - triggerRect.bottom;
|
|
29
|
+
return {
|
|
30
|
+
top: _spaceAbove >= popoverHeight + offset || _spaceAbove >= _spaceBelow ? triggerRect.top - popoverHeight - offset : triggerRect.bottom + offset,
|
|
31
|
+
left: triggerRect.left + triggerRect.width / 2 - popoverWidth / 2
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (axis === 'inline' && edge === 'end') {
|
|
35
|
+
// Right of trigger
|
|
36
|
+
var spaceRight = viewport.width - triggerRect.right;
|
|
37
|
+
var spaceLeft = triggerRect.left;
|
|
38
|
+
return {
|
|
39
|
+
top: triggerRect.top + triggerRect.height / 2 - popoverHeight / 2,
|
|
40
|
+
left: spaceRight >= popoverWidth + offset || spaceRight >= spaceLeft ? triggerRect.right + offset : triggerRect.left - popoverWidth - offset
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (axis === 'inline' && edge === 'start') {
|
|
44
|
+
// Left of trigger
|
|
45
|
+
var _spaceLeft = triggerRect.left;
|
|
46
|
+
var _spaceRight = viewport.width - triggerRect.right;
|
|
47
|
+
return {
|
|
48
|
+
top: triggerRect.top + triggerRect.height / 2 - popoverHeight / 2,
|
|
49
|
+
left: _spaceLeft >= popoverWidth + offset || _spaceLeft >= _spaceRight ? triggerRect.left - popoverWidth - offset : triggerRect.right + offset
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Unreachable for valid placements; defaults to below trigger
|
|
54
|
+
return {
|
|
55
|
+
top: triggerRect.bottom + offset,
|
|
56
|
+
left: triggerRect.left + triggerRect.width / 2 - popoverWidth / 2
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Adjusts the base (centered) position for non-center alignments.
|
|
62
|
+
*
|
|
63
|
+
* `align: 'start'` → popover start edge at trigger start edge
|
|
64
|
+
* `align: 'end'` → popover end edge at trigger end edge
|
|
65
|
+
*/
|
|
66
|
+
function applyAlignment(_ref2) {
|
|
67
|
+
var position = _ref2.position,
|
|
68
|
+
axis = _ref2.axis,
|
|
69
|
+
align = _ref2.align,
|
|
70
|
+
triggerRect = _ref2.triggerRect,
|
|
71
|
+
popoverWidth = _ref2.popoverWidth,
|
|
72
|
+
popoverHeight = _ref2.popoverHeight;
|
|
73
|
+
if (align === 'center') {
|
|
74
|
+
return position;
|
|
75
|
+
}
|
|
76
|
+
if (axis === 'block') {
|
|
77
|
+
// Block-axis placement → cross-axis is inline (left/right)
|
|
78
|
+
if (align === 'start') {
|
|
79
|
+
return _objectSpread(_objectSpread({}, position), {}, {
|
|
80
|
+
left: triggerRect.left
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// align === 'end'
|
|
84
|
+
return _objectSpread(_objectSpread({}, position), {}, {
|
|
85
|
+
left: triggerRect.right - popoverWidth
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Inline-axis placement → cross-axis is block (top/bottom)
|
|
90
|
+
if (align === 'start') {
|
|
91
|
+
return _objectSpread(_objectSpread({}, position), {}, {
|
|
92
|
+
top: triggerRect.top
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// align === 'end'
|
|
96
|
+
return _objectSpread(_objectSpread({}, position), {}, {
|
|
97
|
+
top: triggerRect.bottom - popoverHeight
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* JS fallback: compute popover position from trigger rect and viewport.
|
|
103
|
+
*
|
|
104
|
+
* Placement algorithm (from the document):
|
|
105
|
+
* - "block" placement: show above/below, picking the side with more space if flipping needed
|
|
106
|
+
* - "inline" placement: show left/right, picking the side with more space if flipping needed
|
|
107
|
+
* - "auto" placement: show on the edge with the most available space
|
|
108
|
+
*
|
|
109
|
+
* Re-runs on scroll (capture on window) and resize events.
|
|
110
|
+
*/
|
|
111
|
+
export function computeFallbackPosition(_ref3) {
|
|
112
|
+
var triggerRect = _ref3.triggerRect,
|
|
113
|
+
popoverEl = _ref3.popoverEl,
|
|
114
|
+
placement = _ref3.placement,
|
|
115
|
+
viewport = _ref3.viewport,
|
|
116
|
+
offset = _ref3.offset;
|
|
117
|
+
var axis = placement.axis,
|
|
118
|
+
edge = placement.edge,
|
|
119
|
+
align = placement.align;
|
|
120
|
+
|
|
121
|
+
// Measure popover dimensions (it might not have layout yet if just shown)
|
|
122
|
+
var popoverWidth = popoverEl.offsetWidth;
|
|
123
|
+
var popoverHeight = popoverEl.offsetHeight;
|
|
124
|
+
var basePosition = computeEdgePosition({
|
|
125
|
+
axis: axis,
|
|
126
|
+
edge: edge,
|
|
127
|
+
triggerRect: triggerRect,
|
|
128
|
+
popoverWidth: popoverWidth,
|
|
129
|
+
popoverHeight: popoverHeight,
|
|
130
|
+
viewport: viewport,
|
|
131
|
+
offset: offset
|
|
132
|
+
});
|
|
133
|
+
var alignedPosition = applyAlignment({
|
|
134
|
+
position: basePosition,
|
|
135
|
+
axis: axis,
|
|
136
|
+
align: align,
|
|
137
|
+
triggerRect: triggerRect,
|
|
138
|
+
popoverWidth: popoverWidth,
|
|
139
|
+
popoverHeight: popoverHeight
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Clamp to viewport so the popover is never offscreen
|
|
143
|
+
return {
|
|
144
|
+
top: Math.max(0, Math.min(alignedPosition.top, viewport.height - popoverHeight)),
|
|
145
|
+
left: Math.max(0, Math.min(alignedPosition.left, viewport.width - popoverWidth))
|
|
146
|
+
};
|
|
147
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Combine multiple cleanup functions into a single cleanup function.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* useEffect(() => {
|
|
7
|
+
* return combine(
|
|
8
|
+
* bind(window, { type: 'resize', listener: onResize }),
|
|
9
|
+
* bind(window, { type: 'scroll', listener: onScroll, options: { capture: true } }),
|
|
10
|
+
* );
|
|
11
|
+
* }, []);
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export function combine() {
|
|
15
|
+
for (var _len = arguments.length, cleanupFns = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
16
|
+
cleanupFns[_key] = arguments[_key];
|
|
17
|
+
}
|
|
18
|
+
return function cleanup() {
|
|
19
|
+
cleanupFns.forEach(function (fn) {
|
|
20
|
+
return fn === null || fn === void 0 ? void 0 : fn();
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-preset CSS injection.
|
|
3
|
+
*
|
|
4
|
+
* Each preset's CSS is injected at most once into `<head>`.
|
|
5
|
+
* Shared by both PopoverContent and DialogContent.
|
|
6
|
+
*
|
|
7
|
+
* Note: injected `<style>` elements and the tracking Set are append-only —
|
|
8
|
+
* they are never removed. This is intentional: the number of distinct
|
|
9
|
+
* presets is bounded (handful of animation + arrow presets), so the
|
|
10
|
+
* memory footprint is negligible. Removing styles would risk breaking
|
|
11
|
+
* other instances of the same preset that are still mounted.
|
|
12
|
+
*
|
|
13
|
+
* Decision (2026-03-17 audit): Accepted as a non-issue. The bounded
|
|
14
|
+
* preset count (~5 presets) makes cleanup unnecessary. We plan to move
|
|
15
|
+
* to a Compiled-based solution which will handle style injection and
|
|
16
|
+
* deduplication natively.
|
|
17
|
+
*/
|
|
18
|
+
var injectedPresets = new Set();
|
|
19
|
+
export function ensurePresetStyles(_ref) {
|
|
20
|
+
var preset = _ref.preset;
|
|
21
|
+
if (injectedPresets.has(preset.name) || typeof document === 'undefined') {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
injectedPresets.add(preset.name);
|
|
25
|
+
var style = document.createElement('style');
|
|
26
|
+
style.textContent = preset.css;
|
|
27
|
+
document.head.appendChild(style);
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import once from '@atlaskit/ds-lib/once';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns `true` when the user prefers reduced motion.
|
|
5
|
+
*
|
|
6
|
+
* Safe for SSR (returns `false` when `window` is unavailable).
|
|
7
|
+
*
|
|
8
|
+
* The result is cached after the first call via `once`. This avoids
|
|
9
|
+
* calling `matchMedia` on every render. The trade-off is that if a user
|
|
10
|
+
* toggles the OS reduced-motion setting mid-session, the change won't
|
|
11
|
+
* take effect until the next page load. This is acceptable because
|
|
12
|
+
* toggling this system-level preference mid-session is extremely rare,
|
|
13
|
+
* and a page refresh is a reasonable expectation for system accessibility
|
|
14
|
+
* settings to take effect.
|
|
15
|
+
*/
|
|
16
|
+
export var prefersReducedMotion = once(function () {
|
|
17
|
+
if (typeof window === 'undefined' || !('matchMedia' in window)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
21
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fully-resolved placement (internal). All fields are required.
|
|
3
|
+
* Use getPlacement({ placement: partial }) to obtain from partial input.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a partial placement to its fully-specified form.
|
|
8
|
+
* Defaults: `axis: 'block'`, `edge: 'end'`, `align: 'center'`.
|
|
9
|
+
*/
|
|
10
|
+
export function getPlacement(_ref) {
|
|
11
|
+
var _placement$axis, _placement$edge, _placement$align;
|
|
12
|
+
var placement = _ref.placement;
|
|
13
|
+
return {
|
|
14
|
+
axis: (_placement$axis = placement.axis) !== null && _placement$axis !== void 0 ? _placement$axis : 'block',
|
|
15
|
+
edge: (_placement$edge = placement.edge) !== null && _placement$edge !== void 0 ? _placement$edge : 'end',
|
|
16
|
+
align: (_placement$align = placement.align) !== null && _placement$align !== void 0 ? _placement$align : 'center'
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid values for the `aria-haspopup` attribute.
|
|
3
|
+
* Derived from the HTML spec — maps popover roles to what the trigger announces.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Roles that require an accessible name (`label` or `labelledBy`) per WCAG 4.1.2.
|
|
8
|
+
* Without a name, assistive technology cannot identify these landmarks.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Roles where the accessible name is derived from content or provided externally
|
|
13
|
+
* (e.g. a combobox labels its listbox, tooltip content IS the accessible name).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// ── Shared ARIA role discrimination types ──
|
|
17
|
+
//
|
|
18
|
+
// These encode the WCAG 4.1.2 constraint: roles like `dialog`, `alertdialog`,
|
|
19
|
+
// and `menu` MUST have an accessible name (either `label` or `labelledBy`).
|
|
20
|
+
// TypeScript enforces this at compile time via discriminated unions.
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* ARIA role props where a role is always required.
|
|
24
|
+
*
|
|
25
|
+
* Used by `TPopupContentProps` — popup content must always declare
|
|
26
|
+
* its role so assistive technology can identify the layer.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* ARIA role props where a role is optional.
|
|
31
|
+
*
|
|
32
|
+
* Used by `TPopoverProps` — the low-level primitive allows omitting
|
|
33
|
+
* the role for cases where it is set externally or not needed.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Maps a popover content role to the correct `aria-haspopup` value
|
|
38
|
+
* for its trigger element.
|
|
39
|
+
*/
|
|
40
|
+
export function roleToAriaHasPopup(_ref) {
|
|
41
|
+
var role = _ref.role;
|
|
42
|
+
if (role === 'menu') {
|
|
43
|
+
return 'menu';
|
|
44
|
+
}
|
|
45
|
+
if (role === 'listbox') {
|
|
46
|
+
return 'listbox';
|
|
47
|
+
}
|
|
48
|
+
if (role === 'tree') {
|
|
49
|
+
return 'tree';
|
|
50
|
+
}
|
|
51
|
+
if (role === 'grid') {
|
|
52
|
+
return 'grid';
|
|
53
|
+
}
|
|
54
|
+
// Default: return 'dialog' for all unmapped roles (tooltip, alertdialog,
|
|
55
|
+
// note, status, alert, log, etc). This is a kinder API — rather than
|
|
56
|
+
// throwing on unknown roles, we fall back to the most common popup type.
|
|
57
|
+
// New roles that need specific aria-haspopup values should be added
|
|
58
|
+
// as explicit cases above.
|
|
59
|
+
return 'dialog';
|
|
60
|
+
}
|