@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,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useInitialFocus = useInitialFocus;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _focus = require("../focus/focus");
|
|
9
|
+
/**
|
|
10
|
+
* Determines the correct element to receive initial focus within a popover,
|
|
11
|
+
* based on its ARIA role.
|
|
12
|
+
*
|
|
13
|
+
* Focus rules by role (per WAI-ARIA APG):
|
|
14
|
+
* - `dialog` / `alertdialog`: first element with `[autofocus]`, or first focusable element
|
|
15
|
+
* - `menu`: first menu item (`[role="menuitem|menuitemcheckbox|menuitemradio"]`)
|
|
16
|
+
* - `listbox`: first selected option (`[aria-selected="true"]`), or first option (`[role="option"]`)
|
|
17
|
+
* - `tooltip`: no focus movement (tooltips are informational)
|
|
18
|
+
* - no role / other roles: no focus movement
|
|
19
|
+
*
|
|
20
|
+
* Note: React 18's `autoFocus` JSX prop does NOT set the HTML `autofocus`
|
|
21
|
+
* attribute — it only calls `.focus()` imperatively during commit, which
|
|
22
|
+
* has no effect on hidden popover content. Consumers must set the native
|
|
23
|
+
* attribute via a ref callback (e.g. `node.setAttribute('autofocus', '')`).
|
|
24
|
+
* React 19+ reflects the JSX prop as the HTML attribute automatically.
|
|
25
|
+
*/
|
|
26
|
+
function getInitialFocusTarget(_ref) {
|
|
27
|
+
var container = _ref.container;
|
|
28
|
+
var role = container.getAttribute('role');
|
|
29
|
+
if (role === 'dialog' || role === 'alertdialog') {
|
|
30
|
+
// Prefer element with the native HTML autofocus attribute.
|
|
31
|
+
var autofocusEl = container.querySelector('[autofocus]');
|
|
32
|
+
if (autofocusEl) {
|
|
33
|
+
return autofocusEl;
|
|
34
|
+
}
|
|
35
|
+
// Fall back to first focusable element
|
|
36
|
+
return (0, _focus.getFirstFocusable)({
|
|
37
|
+
container: container
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (role === 'menu') {
|
|
41
|
+
// Initial focus placement is the extent of what top-layer provides
|
|
42
|
+
// for menus. All subsequent keyboard navigation (arrow keys, Home/End,
|
|
43
|
+
// type-ahead, Enter/Space, submenu coordination) is the responsibility
|
|
44
|
+
// of the consumer component (e.g. dropdown-menu), because menu keyboard
|
|
45
|
+
// behavior varies by context (orientation, nesting, item type, control
|
|
46
|
+
// pattern). See: notes/outputs/menu-keyboard-decision.md
|
|
47
|
+
return (0, _focus.getFirstFocusable)({
|
|
48
|
+
container: container
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (role === 'listbox') {
|
|
52
|
+
// Prefer selected option, fall back to first focusable
|
|
53
|
+
var selectedOption = container.querySelector('[role="option"][aria-selected="true"]');
|
|
54
|
+
if (selectedOption) {
|
|
55
|
+
return selectedOption;
|
|
56
|
+
}
|
|
57
|
+
return (0, _focus.getFirstFocusable)({
|
|
58
|
+
container: container
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// tooltip, no role, or other roles: no focus movement
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Moves focus into a popover element when it opens, based on its ARIA role.
|
|
68
|
+
*
|
|
69
|
+
* This implements WCAG 2.4.3 (Focus Order) initial focus placement:
|
|
70
|
+
* - `dialog` / `alertdialog` → focus first focusable (or `[autofocus]`)
|
|
71
|
+
* - `menu` → focus first menu item
|
|
72
|
+
* - `listbox` → focus selected or first option
|
|
73
|
+
* - `tooltip` / no role → no focus movement
|
|
74
|
+
*
|
|
75
|
+
* The role is read from the element's `role` attribute (not passed as a prop),
|
|
76
|
+
* following the same pattern as `useFocusWrap`.
|
|
77
|
+
*
|
|
78
|
+
* Always call this hook unconditionally. Focus is only moved when `isOpen`
|
|
79
|
+
* transitions to `true` and the role requires it.
|
|
80
|
+
*/
|
|
81
|
+
function useInitialFocus(_ref2) {
|
|
82
|
+
var elementRef = _ref2.elementRef,
|
|
83
|
+
isOpen = _ref2.isOpen,
|
|
84
|
+
role = _ref2.role;
|
|
85
|
+
(0, _react.useEffect)(function () {
|
|
86
|
+
if (!isOpen) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
var el = elementRef.current;
|
|
90
|
+
if (!el) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Use requestAnimationFrame to ensure the popover is fully rendered
|
|
95
|
+
// and visible in the top layer before attempting to move focus.
|
|
96
|
+
// showPopover() is called in useLayoutEffect (which runs before this
|
|
97
|
+
// useEffect), so by the time the RAF fires after the next paint the
|
|
98
|
+
// element is guaranteed to be in the top layer.
|
|
99
|
+
var rafId = requestAnimationFrame(function () {
|
|
100
|
+
var _getInitialFocusTarge;
|
|
101
|
+
(_getInitialFocusTarge = getInitialFocusTarget({
|
|
102
|
+
container: el
|
|
103
|
+
})) === null || _getInitialFocusTarge === void 0 || _getInitialFocusTarge.focus();
|
|
104
|
+
});
|
|
105
|
+
return function () {
|
|
106
|
+
cancelAnimationFrame(rafId);
|
|
107
|
+
};
|
|
108
|
+
// We intentionally depend on `role` even though `getInitialFocusTarget`
|
|
109
|
+
// reads from the DOM attribute. This ensures the effect re-runs if
|
|
110
|
+
// the role prop changes while the popover is open.
|
|
111
|
+
}, [elementRef, isOpen, role]);
|
|
112
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.usePresetStyles = usePresetStyles;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _ensurePresetStyles = require("./ensure-preset-styles");
|
|
9
|
+
/**
|
|
10
|
+
* Normalizes a preset prop to a value (or null) and ensures its CSS
|
|
11
|
+
* is injected once into `document.head`.
|
|
12
|
+
*
|
|
13
|
+
* Works with any preset that has `{ css, name }` — animation presets
|
|
14
|
+
* (TAnimationPreset) and arrow presets (TArrowPreset) both satisfy this shape.
|
|
15
|
+
*/
|
|
16
|
+
function usePresetStyles(_ref) {
|
|
17
|
+
var preset = _ref.preset;
|
|
18
|
+
var resolved = preset != null && preset !== false ? preset : null;
|
|
19
|
+
(0, _react.useInsertionEffect)(function () {
|
|
20
|
+
if (resolved) {
|
|
21
|
+
(0, _ensurePresetStyles.ensurePresetStyles)({
|
|
22
|
+
preset: resolved
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}, [resolved]);
|
|
26
|
+
return resolved;
|
|
27
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.fromLegacyPlacement = fromLegacyPlacement;
|
|
7
|
+
exports.placementMapping = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Legacy Popper.js placement values (used by `@atlaskit/popper`, `@atlaskit/popup`,
|
|
10
|
+
* `@atlaskit/tooltip`, etc.).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Maps legacy Popper.js placement values to the new object-based
|
|
15
|
+
* `Placement` values used by `@atlaskit/top-layer/popover`.
|
|
16
|
+
*
|
|
17
|
+
* **Mapping logic:**
|
|
18
|
+
*
|
|
19
|
+
* | Legacy (Popper.js) | New (Placement object) |
|
|
20
|
+
* | ------------------- | --------------------------------------------------- |
|
|
21
|
+
* | `top` | `{ axis: 'block', edge: 'start', align: 'center' }` |
|
|
22
|
+
* | `top-start` | `{ axis: 'block', edge: 'start', align: 'start' }` |
|
|
23
|
+
* | `top-end` | `{ axis: 'block', edge: 'start', align: 'end' }` |
|
|
24
|
+
* | `bottom` | `{ axis: 'block', edge: 'end', align: 'center' }` |
|
|
25
|
+
* | `bottom-start` | `{ axis: 'block', edge: 'end', align: 'start' }` |
|
|
26
|
+
* | `bottom-end` | `{ axis: 'block', edge: 'end', align: 'end' }` |
|
|
27
|
+
* | `right` | `{ axis: 'inline', edge: 'end', align: 'center' }` |
|
|
28
|
+
* | `right-start` | `{ axis: 'inline', edge: 'end', align: 'start' }` |
|
|
29
|
+
* | `right-end` | `{ axis: 'inline', edge: 'end', align: 'end' }` |
|
|
30
|
+
* | `left` | `{ axis: 'inline', edge: 'start', align: 'center' }` |
|
|
31
|
+
* | `left-start` | `{ axis: 'inline', edge: 'start', align: 'start' }` |
|
|
32
|
+
* | `left-end` | `{ axis: 'inline', edge: 'start', align: 'end' }` |
|
|
33
|
+
* | `auto` | `{ axis: 'block', edge: 'end', align: 'center' }` |
|
|
34
|
+
* | `auto-start` | `{ axis: 'block', edge: 'end', align: 'start' }` |
|
|
35
|
+
* | `auto-end` | `{ axis: 'block', edge: 'end', align: 'end' }` |
|
|
36
|
+
*
|
|
37
|
+
* The `position-try-fallbacks` CSS property handles flipping automatically.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { fromLegacyPlacement } from '@atlaskit/top-layer/placement-map';
|
|
42
|
+
*
|
|
43
|
+
* // In a migration from @atlaskit/popup:
|
|
44
|
+
* const oldPlacement: TLegacyPlacement = 'bottom-start';
|
|
45
|
+
* const newPlacement: TPlacementOptions = fromLegacyPlacement({ legacy: oldPlacement });
|
|
46
|
+
* // newPlacement === { axis: 'block', edge: 'end', align: 'start' }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
var placementMapping = exports.placementMapping = {
|
|
50
|
+
top: {
|
|
51
|
+
axis: 'block',
|
|
52
|
+
edge: 'start',
|
|
53
|
+
align: 'center'
|
|
54
|
+
},
|
|
55
|
+
'top-start': {
|
|
56
|
+
axis: 'block',
|
|
57
|
+
edge: 'start',
|
|
58
|
+
align: 'start'
|
|
59
|
+
},
|
|
60
|
+
'top-center': {
|
|
61
|
+
axis: 'block',
|
|
62
|
+
edge: 'start',
|
|
63
|
+
align: 'center'
|
|
64
|
+
},
|
|
65
|
+
'top-end': {
|
|
66
|
+
axis: 'block',
|
|
67
|
+
edge: 'start',
|
|
68
|
+
align: 'end'
|
|
69
|
+
},
|
|
70
|
+
bottom: {
|
|
71
|
+
axis: 'block',
|
|
72
|
+
edge: 'end',
|
|
73
|
+
align: 'center'
|
|
74
|
+
},
|
|
75
|
+
'bottom-start': {
|
|
76
|
+
axis: 'block',
|
|
77
|
+
edge: 'end',
|
|
78
|
+
align: 'start'
|
|
79
|
+
},
|
|
80
|
+
'bottom-center': {
|
|
81
|
+
axis: 'block',
|
|
82
|
+
edge: 'end',
|
|
83
|
+
align: 'center'
|
|
84
|
+
},
|
|
85
|
+
'bottom-end': {
|
|
86
|
+
axis: 'block',
|
|
87
|
+
edge: 'end',
|
|
88
|
+
align: 'end'
|
|
89
|
+
},
|
|
90
|
+
right: {
|
|
91
|
+
axis: 'inline',
|
|
92
|
+
edge: 'end',
|
|
93
|
+
align: 'center'
|
|
94
|
+
},
|
|
95
|
+
'right-start': {
|
|
96
|
+
axis: 'inline',
|
|
97
|
+
edge: 'end',
|
|
98
|
+
align: 'start'
|
|
99
|
+
},
|
|
100
|
+
'right-end': {
|
|
101
|
+
axis: 'inline',
|
|
102
|
+
edge: 'end',
|
|
103
|
+
align: 'end'
|
|
104
|
+
},
|
|
105
|
+
left: {
|
|
106
|
+
axis: 'inline',
|
|
107
|
+
edge: 'start',
|
|
108
|
+
align: 'center'
|
|
109
|
+
},
|
|
110
|
+
'left-start': {
|
|
111
|
+
axis: 'inline',
|
|
112
|
+
edge: 'start',
|
|
113
|
+
align: 'start'
|
|
114
|
+
},
|
|
115
|
+
'left-end': {
|
|
116
|
+
axis: 'inline',
|
|
117
|
+
edge: 'start',
|
|
118
|
+
align: 'end'
|
|
119
|
+
},
|
|
120
|
+
auto: {
|
|
121
|
+
axis: 'block',
|
|
122
|
+
edge: 'end',
|
|
123
|
+
align: 'center'
|
|
124
|
+
},
|
|
125
|
+
'auto-start': {
|
|
126
|
+
axis: 'block',
|
|
127
|
+
edge: 'end',
|
|
128
|
+
align: 'start'
|
|
129
|
+
},
|
|
130
|
+
'auto-end': {
|
|
131
|
+
axis: 'block',
|
|
132
|
+
edge: 'end',
|
|
133
|
+
align: 'end'
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Convert a legacy Popper.js placement to the new CSS `position-area`-based Placement.
|
|
139
|
+
*/
|
|
140
|
+
function fromLegacyPlacement(_ref) {
|
|
141
|
+
var legacy = _ref.legacy;
|
|
142
|
+
return placementMapping[legacy];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* The full mapping record, exposed for consumers that need to iterate or introspect.
|
|
147
|
+
*/
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createPopoverCloseEvent = createPopoverCloseEvent;
|
|
7
|
+
/**
|
|
8
|
+
* Creates a synthetic DOM event from a `TPopoverCloseReason`.
|
|
9
|
+
*
|
|
10
|
+
* Useful when bridging the Popover primitive's `onClose({ reason })` callback
|
|
11
|
+
* to a legacy API that expects a native DOM event — for example,
|
|
12
|
+
* `@atlaskit/inline-dialog`'s `onClose(event)` contract.
|
|
13
|
+
*
|
|
14
|
+
* - `'escape'` → `KeyboardEvent('keydown', { key: 'Escape' })`
|
|
15
|
+
* - `'light-dismiss'` → `MouseEvent('click')`
|
|
16
|
+
*
|
|
17
|
+
* For any other reason, a generic `Event('close')` is returned as a fallback.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* import { createPopoverCloseEvent } from '@atlaskit/top-layer/create-close-event';
|
|
22
|
+
* import { type TPopoverCloseReason } from '@atlaskit/top-layer/popover';
|
|
23
|
+
*
|
|
24
|
+
* function onPopoverClose({ reason }: { reason: TPopoverCloseReason }) {
|
|
25
|
+
* legacyOnClose(createPopoverCloseEvent({ reason }));
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function createPopoverCloseEvent(_ref) {
|
|
30
|
+
var reason = _ref.reason;
|
|
31
|
+
if (reason === 'escape') {
|
|
32
|
+
return new KeyboardEvent('keydown', {
|
|
33
|
+
key: 'Escape',
|
|
34
|
+
bubbles: true
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (reason === 'light-dismiss') {
|
|
38
|
+
return new MouseEvent('click', {
|
|
39
|
+
bubbles: true,
|
|
40
|
+
cancelable: true
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return new Event('close');
|
|
44
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "Popover", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _popover.Popover;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "createPopoverCloseEvent", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _createCloseEvent.createPopoverCloseEvent;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var _popover = require("./popover");
|
|
19
|
+
var _createCloseEvent = require("./create-close-event");
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
._19itglyw{border:none}
|
|
3
|
+
._1r041wug{inset:auto}._18m9ewfl{overflow-y:visible}
|
|
4
|
+
._18u0idpf{margin-left:0}
|
|
5
|
+
._19bvidpf{padding-left:0}
|
|
6
|
+
._19pkidpf{margin-top:0}
|
|
7
|
+
._1reoewfl{overflow-x:visible}
|
|
8
|
+
._2hwxidpf{margin-right:0}
|
|
9
|
+
._bfhk1j28{background-color:transparent}
|
|
10
|
+
._ca0qidpf{padding-top:0}
|
|
11
|
+
._n3tdidpf{padding-bottom:0}
|
|
12
|
+
._otyridpf{margin-bottom:0}
|
|
13
|
+
._u5f3idpf{padding-right:0}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/* popover.tsx generated by @compiled/babel-plugin v0.39.1 */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
exports.Popover = void 0;
|
|
10
|
+
require("./popover.compiled.css");
|
|
11
|
+
var _runtime = require("@compiled/react/runtime");
|
|
12
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
15
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
16
|
+
var _bindEventListener = require("bind-event-listener");
|
|
17
|
+
var _mergeRefs = _interopRequireDefault(require("@atlaskit/ds-lib/merge-refs"));
|
|
18
|
+
var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
|
|
19
|
+
var _once = _interopRequireDefault(require("@atlaskit/ds-lib/once"));
|
|
20
|
+
var _useAnimatedVisibility = require("../internal/use-animated-visibility");
|
|
21
|
+
var _useFocusWrap = require("../internal/use-focus-wrap");
|
|
22
|
+
var _useInitialFocus = require("../internal/use-initial-focus");
|
|
23
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
24
|
+
/**
|
|
25
|
+
* Detects whether the browser supports the `popover="hint"` attribute value.
|
|
26
|
+
* Uses DOM reflection: unsupported browsers reflect the invalid value default ("manual").
|
|
27
|
+
* Safe for SSR. Result is cached via `once`.
|
|
28
|
+
*/
|
|
29
|
+
var supportsPopoverHint = (0, _once.default)(function () {
|
|
30
|
+
if (typeof document === 'undefined') {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
// eslint-disable-next-line @atlaskit/platform/no-direct-document-usage -- feature detection
|
|
34
|
+
var el = document.createElement('div');
|
|
35
|
+
el.setAttribute('popover', 'hint');
|
|
36
|
+
return el.popover === 'hint';
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/no-unsafe-values -- popover UA reset requires values not in cssMap's type union
|
|
40
|
+
var styles = {
|
|
41
|
+
root: "_19itglyw _ca0qidpf _u5f3idpf _n3tdidpf _19bvidpf _19pkidpf _2hwxidpf _otyridpf _18u0idpf _1r041wug _1reoewfl _18m9ewfl _bfhk1j28"
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Unopinionated top-layer primitive.
|
|
45
|
+
*
|
|
46
|
+
* Manages only visibility (isOpen) and animation (animate). Has no knowledge
|
|
47
|
+
* of positioning — compose with `useAnchorPosition` for anchor positioning.
|
|
48
|
+
*
|
|
49
|
+
* Visibility is driven by the `isOpen` prop:
|
|
50
|
+
* - `isOpen={true}` → `showPopover()`, entry animation via `@starting-style`
|
|
51
|
+
* - `isOpen={false}` → `hidePopover()`, exit animation via `allow-discrete`
|
|
52
|
+
*
|
|
53
|
+
* For `mode="auto"`, the browser can dismiss the popover via light dismiss
|
|
54
|
+
* (Escape, click outside). When that happens, `onClose` is called and the
|
|
55
|
+
* consumer must set `isOpen` to `false`. The DOM owns the dismiss — React
|
|
56
|
+
* must follow.
|
|
57
|
+
*/
|
|
58
|
+
var Popover = exports.Popover = /*#__PURE__*/(0, _react.forwardRef)(function Popover(_ref, ref) {
|
|
59
|
+
var children = _ref.children,
|
|
60
|
+
_ref$mode = _ref.mode,
|
|
61
|
+
modeProp = _ref$mode === void 0 ? 'auto' : _ref$mode,
|
|
62
|
+
_ref$onClose = _ref.onClose,
|
|
63
|
+
onClose = _ref$onClose === void 0 ? _noop.default : _ref$onClose,
|
|
64
|
+
onOpenChange = _ref.onOpenChange,
|
|
65
|
+
onExitFinish = _ref.onExitFinish,
|
|
66
|
+
animate = _ref.animate,
|
|
67
|
+
placement = _ref.placement,
|
|
68
|
+
testId = _ref.testId,
|
|
69
|
+
isOpen = _ref.isOpen,
|
|
70
|
+
role = _ref.role,
|
|
71
|
+
label = _ref.label,
|
|
72
|
+
labelledBy = _ref.labelledBy,
|
|
73
|
+
idProp = _ref.id;
|
|
74
|
+
var autoId = (0, _react.useId)();
|
|
75
|
+
var ownRef = (0, _react.useRef)(null);
|
|
76
|
+
var combinedRef = (0, _mergeRefs.default)([ownRef, ref].filter(Boolean));
|
|
77
|
+
// Regex is intentional — `replaceAll` is not available in our supported
|
|
78
|
+
// browser matrix. In React 18, `useId()` returns IDs containing colons
|
|
79
|
+
// (e.g. `:r1:`) which are invalid in CSS selectors and `popover` target
|
|
80
|
+
// attributes. React 19.2.0 replaced colons with underscores, making this
|
|
81
|
+
// stripping unnecessary once React 18 support is dropped.
|
|
82
|
+
var popoverId = idProp !== null && idProp !== void 0 ? idProp : "popover-".concat(autoId.replace(/:/g, ''));
|
|
83
|
+
var _useAnimatedVisibilit = (0, _useAnimatedVisibility.useAnimatedVisibility)({
|
|
84
|
+
isOpen: isOpen,
|
|
85
|
+
animate: animate,
|
|
86
|
+
elementRef: ownRef,
|
|
87
|
+
onExitFinish: onExitFinish
|
|
88
|
+
}),
|
|
89
|
+
showChildren = _useAnimatedVisibilit.showChildren,
|
|
90
|
+
preset = _useAnimatedVisibilit.preset;
|
|
91
|
+
|
|
92
|
+
// ── Focus management ──
|
|
93
|
+
// Initial focus: on open, moves focus into the popover (role-dependent).
|
|
94
|
+
// Focus wrap: Tab/Shift+Tab cycle within the popover for dialog roles.
|
|
95
|
+
// Focus restoration: handled natively by the Popover API — the browser
|
|
96
|
+
// tracks `previouslyFocusedElement` on show and restores it on hide.
|
|
97
|
+
// No custom restoration hook is needed. See: notes/architecture/focus-restoration.md
|
|
98
|
+
(0, _useFocusWrap.useFocusWrap)({
|
|
99
|
+
elementRef: ownRef,
|
|
100
|
+
role: role
|
|
101
|
+
});
|
|
102
|
+
(0, _useInitialFocus.useInitialFocus)({
|
|
103
|
+
elementRef: ownRef,
|
|
104
|
+
isOpen: isOpen,
|
|
105
|
+
role: role
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Hint mode fallback: "hint" downgrades to "auto" if unsupported.
|
|
109
|
+
//
|
|
110
|
+
// Decision (2026-03-17 audit): We keep "auto" as the fallback (not "manual")
|
|
111
|
+
// because it provides the closest behavior to "hint" (light dismiss works).
|
|
112
|
+
// However, there is a behavioral difference: "auto" participates in the
|
|
113
|
+
// auto-dismiss stack and WILL close other "auto" popovers when it opens
|
|
114
|
+
// (e.g. a tooltip opening will close an open dropdown). "hint" does not
|
|
115
|
+
// have this side effect. This difference only affects browsers without
|
|
116
|
+
// popover="hint" support, and that set is shrinking rapidly.
|
|
117
|
+
var mode = modeProp === 'hint' && !supportsPopoverHint() ? 'auto' : modeProp;
|
|
118
|
+
|
|
119
|
+
// Distinguishes programmatic hidePopover() from browser-initiated dismiss.
|
|
120
|
+
// When we call hidePopover() ourselves the toggle event fires synchronously —
|
|
121
|
+
// this ref prevents the toggle handler from calling onClose redundantly.
|
|
122
|
+
var programmaticCloseRef = (0, _react.useRef)(false);
|
|
123
|
+
|
|
124
|
+
// Escape key tracking: set in a capture-phase keydown listener (fires before
|
|
125
|
+
// the browser processes light dismiss), read in the toggle handler.
|
|
126
|
+
var closeReasonRef = (0, _react.useRef)('light-dismiss');
|
|
127
|
+
var handleToggle = (0, _react.useCallback)(function (event) {
|
|
128
|
+
var el = ownRef.current;
|
|
129
|
+
if (event.newState === 'open') {
|
|
130
|
+
if (el) {
|
|
131
|
+
onOpenChange === null || onOpenChange === void 0 || onOpenChange({
|
|
132
|
+
isOpen: true,
|
|
133
|
+
element: el
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (event.newState === 'closed') {
|
|
139
|
+
if (el) {
|
|
140
|
+
onOpenChange === null || onOpenChange === void 0 || onOpenChange({
|
|
141
|
+
isOpen: false,
|
|
142
|
+
element: el
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Programmatic close (unmount or isOpen→false). Consumer already knows.
|
|
147
|
+
if (programmaticCloseRef.current) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Browser dismiss (Escape or click-outside). Notify consumer.
|
|
152
|
+
var reason = closeReasonRef.current;
|
|
153
|
+
closeReasonRef.current = 'light-dismiss'; // reset for next dismiss
|
|
154
|
+
onClose({
|
|
155
|
+
reason: reason
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}, [onClose, onOpenChange]);
|
|
159
|
+
(0, _react.useEffect)(function () {
|
|
160
|
+
var el = ownRef.current;
|
|
161
|
+
if (!el) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Capture-phase: tag Escape before the browser processes light dismiss.
|
|
166
|
+
var unbindEscape = (0, _bindEventListener.bind)(el, {
|
|
167
|
+
type: 'keydown',
|
|
168
|
+
listener: function listener(event) {
|
|
169
|
+
if (event.key === 'Escape') {
|
|
170
|
+
closeReasonRef.current = 'escape';
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
options: {
|
|
174
|
+
capture: true
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
var unbindToggle = (0, _bindEventListener.bind)(el, {
|
|
178
|
+
type: 'toggle',
|
|
179
|
+
listener: handleToggle
|
|
180
|
+
});
|
|
181
|
+
return function () {
|
|
182
|
+
unbindEscape();
|
|
183
|
+
unbindToggle();
|
|
184
|
+
};
|
|
185
|
+
}, [handleToggle]);
|
|
186
|
+
|
|
187
|
+
// Placement-dependent animation CSS vars (e.g. slide direction).
|
|
188
|
+
// Separate from show/hide so that preset reference changes
|
|
189
|
+
// (e.g. inline `animate={slideAndFade()}`) don't re-trigger visibility.
|
|
190
|
+
(0, _react.useLayoutEffect)(function () {
|
|
191
|
+
var el = ownRef.current;
|
|
192
|
+
if (!el || !(preset !== null && preset !== void 0 && preset.getProperties) || !placement) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
var props = preset.getProperties({
|
|
196
|
+
placement: placement
|
|
197
|
+
});
|
|
198
|
+
Object.entries(props).forEach(function (_ref2) {
|
|
199
|
+
var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
|
|
200
|
+
key = _ref3[0],
|
|
201
|
+
value = _ref3[1];
|
|
202
|
+
el.style.setProperty(key, String(value));
|
|
203
|
+
});
|
|
204
|
+
}, [preset, placement]);
|
|
205
|
+
|
|
206
|
+
// Show/hide based on isOpen. try/catch because show/hide throw if the
|
|
207
|
+
// element is already in the target state (e.g. browser dismissed via
|
|
208
|
+
// light-dismiss before our effect ran).
|
|
209
|
+
(0, _react.useLayoutEffect)(function () {
|
|
210
|
+
var el = ownRef.current;
|
|
211
|
+
if (!el) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (isOpen) {
|
|
215
|
+
programmaticCloseRef.current = false;
|
|
216
|
+
try {
|
|
217
|
+
el.showPopover();
|
|
218
|
+
} catch (_unused) {
|
|
219
|
+
// Already showing or unsupported — DOM matches intent.
|
|
220
|
+
}
|
|
221
|
+
return function () {
|
|
222
|
+
programmaticCloseRef.current = true;
|
|
223
|
+
try {
|
|
224
|
+
el.hidePopover();
|
|
225
|
+
} catch (_unused2) {
|
|
226
|
+
// Already hidden — DOM matches intent.
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
programmaticCloseRef.current = true;
|
|
231
|
+
try {
|
|
232
|
+
el.hidePopover();
|
|
233
|
+
} catch (_unused3) {
|
|
234
|
+
// Already hidden — DOM matches intent.
|
|
235
|
+
}
|
|
236
|
+
}, [isOpen]);
|
|
237
|
+
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
|
|
238
|
+
ref: combinedRef,
|
|
239
|
+
id: popoverId
|
|
240
|
+
// @ts-expect-error -- popover attribute not yet in React types
|
|
241
|
+
// eslint-disable-next-line react/no-unknown-property -- popover attribute not yet in React types
|
|
242
|
+
,
|
|
243
|
+
popover: mode,
|
|
244
|
+
role: role,
|
|
245
|
+
"aria-label": label,
|
|
246
|
+
"aria-labelledby": labelledBy,
|
|
247
|
+
"data-testid": testId
|
|
248
|
+
}, preset ? (0, _defineProperty2.default)({}, "data-ds-popover-".concat(preset.name), '') : undefined, {
|
|
249
|
+
className: (0, _runtime.ax)([styles.root])
|
|
250
|
+
}), showChildren ? children : null);
|
|
251
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Popup = void 0;
|
|
7
|
+
var _popup = require("./popup");
|
|
8
|
+
var _popupContent = require("./popup-content");
|
|
9
|
+
var _popupSurface = require("./popup-surface");
|
|
10
|
+
var _popupTrigger = require("./popup-trigger");
|
|
11
|
+
var _popupTriggerFunction = require("./popup-trigger-function");
|
|
12
|
+
/**
|
|
13
|
+
* Compound component for rendering content in the browser's top layer
|
|
14
|
+
* using the native Popover API (`popover="auto"`).
|
|
15
|
+
* Placement is owned by this compound: root provides it via context, Content applies it
|
|
16
|
+
* (CSS Anchor Positioning or JS fallback).
|
|
17
|
+
*
|
|
18
|
+
* For default overlay styling (background, shadow, border-radius), see `PopupSurface` in the package examples.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```tsx
|
|
22
|
+
* <Popup placement={{ edge: 'end' }} onClose={handleClose}>
|
|
23
|
+
* <Popup.Trigger>
|
|
24
|
+
* <button>Open</button>
|
|
25
|
+
* </Popup.Trigger>
|
|
26
|
+
* <Popup.Content role="dialog" label="My popup">
|
|
27
|
+
* Content goes here
|
|
28
|
+
* </Popup.Content>
|
|
29
|
+
* </Popup>
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
var Popup = exports.Popup = Object.assign(_popup.PopupRoot, {
|
|
33
|
+
Trigger: _popupTrigger.PopupTrigger,
|
|
34
|
+
TriggerFunction: _popupTriggerFunction.PopupTriggerFunction,
|
|
35
|
+
Content: _popupContent.PopupContent,
|
|
36
|
+
Surface: _popupSurface.PopupSurface
|
|
37
|
+
});
|