@atlaskit/top-layer 0.13.0 → 0.15.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.
Files changed (179) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +61 -34
  3. package/dist/cjs/animations/presets.js +4 -4
  4. package/dist/cjs/dialog/create-close-event.js +1 -2
  5. package/dist/cjs/entry-points/dialog.js +6 -0
  6. package/dist/cjs/entry-points/get-aria-for-trigger.js +12 -0
  7. package/dist/cjs/entry-points/popover-surface.js +12 -0
  8. package/dist/cjs/entry-points/popover.js +6 -0
  9. package/dist/cjs/entry-points/use-popover-id.js +21 -0
  10. package/dist/cjs/internal/get-aria-for-trigger.js +88 -0
  11. package/dist/cjs/internal/role-types.js +64 -1
  12. package/dist/cjs/internal/slot.js +1 -1
  13. package/dist/cjs/internal/use-anchor-position.js +30 -14
  14. package/dist/cjs/popover/create-close-event.js +1 -2
  15. package/dist/cjs/popover/popover.js +79 -80
  16. package/dist/cjs/popover-surface/index.js +12 -0
  17. package/dist/cjs/{popup/popup-surface.js → popover-surface/popover-surface.js} +9 -12
  18. package/dist/cjs/testing/polyfill.js +9 -6
  19. package/dist/es2019/animations/presets.js +4 -4
  20. package/dist/es2019/dialog/create-close-event.js +1 -2
  21. package/dist/es2019/entry-points/dialog.js +1 -1
  22. package/dist/es2019/entry-points/get-aria-for-trigger.js +1 -0
  23. package/dist/es2019/entry-points/popover-surface.js +1 -0
  24. package/dist/es2019/entry-points/popover.js +1 -1
  25. package/dist/es2019/entry-points/use-popover-id.js +15 -0
  26. package/dist/es2019/internal/get-aria-for-trigger.js +84 -0
  27. package/dist/es2019/internal/role-types.js +59 -0
  28. package/dist/es2019/internal/slot.js +1 -1
  29. package/dist/es2019/internal/use-anchor-position.js +16 -12
  30. package/dist/es2019/popover/create-close-event.js +1 -2
  31. package/dist/es2019/popover/popover.js +79 -80
  32. package/dist/es2019/popover-surface/index.js +1 -0
  33. package/dist/es2019/popover-surface/popover-surface.js +27 -0
  34. package/dist/es2019/testing/polyfill.js +9 -6
  35. package/dist/esm/animations/presets.js +4 -4
  36. package/dist/esm/dialog/create-close-event.js +1 -2
  37. package/dist/esm/entry-points/dialog.js +1 -1
  38. package/dist/esm/entry-points/get-aria-for-trigger.js +1 -0
  39. package/dist/esm/entry-points/popover-surface.js +1 -0
  40. package/dist/esm/entry-points/popover.js +1 -1
  41. package/dist/esm/entry-points/use-popover-id.js +15 -0
  42. package/dist/esm/internal/get-aria-for-trigger.js +83 -0
  43. package/dist/esm/internal/role-types.js +58 -0
  44. package/dist/esm/internal/slot.js +1 -1
  45. package/dist/esm/internal/use-anchor-position.js +30 -14
  46. package/dist/esm/popover/create-close-event.js +1 -2
  47. package/dist/esm/popover/popover.js +79 -80
  48. package/dist/esm/popover-surface/index.js +1 -0
  49. package/dist/esm/popover-surface/popover-surface.js +26 -0
  50. package/dist/esm/testing/polyfill.js +9 -6
  51. package/dist/types/animations/presets.d.ts +4 -4
  52. package/dist/types/animations/types.d.ts +1 -9
  53. package/dist/types/dialog/create-close-event.d.ts +1 -2
  54. package/dist/types/dialog/types.d.ts +0 -8
  55. package/dist/types/entry-points/animations.d.ts +1 -1
  56. package/dist/types/entry-points/dialog.d.ts +1 -1
  57. package/dist/types/entry-points/get-aria-for-trigger.d.ts +1 -0
  58. package/dist/types/entry-points/popover-surface.d.ts +2 -0
  59. package/dist/types/entry-points/popover.d.ts +2 -2
  60. package/dist/types/entry-points/use-popover-id.d.ts +11 -0
  61. package/dist/types/internal/get-aria-for-trigger.d.ts +86 -0
  62. package/dist/types/internal/role-types.d.ts +7 -0
  63. package/dist/types/internal/slot.d.ts +2 -2
  64. package/dist/types/popover/create-close-event.d.ts +1 -2
  65. package/dist/types/popover/index.d.ts +1 -1
  66. package/dist/types/popover/popover.d.ts +6 -13
  67. package/dist/types/popover/types.d.ts +6 -5
  68. package/dist/types/popover-surface/index.d.ts +2 -0
  69. package/dist/types/popover-surface/popover-surface.d.ts +21 -0
  70. package/dist/types-ts4.5/animations/presets.d.ts +4 -4
  71. package/dist/types-ts4.5/animations/types.d.ts +1 -9
  72. package/dist/types-ts4.5/dialog/create-close-event.d.ts +1 -2
  73. package/dist/types-ts4.5/dialog/types.d.ts +0 -8
  74. package/dist/types-ts4.5/entry-points/animations.d.ts +1 -1
  75. package/dist/types-ts4.5/entry-points/dialog.d.ts +1 -1
  76. package/dist/types-ts4.5/entry-points/get-aria-for-trigger.d.ts +1 -0
  77. package/dist/types-ts4.5/entry-points/popover-surface.d.ts +2 -0
  78. package/dist/types-ts4.5/entry-points/popover.d.ts +2 -2
  79. package/dist/types-ts4.5/entry-points/use-popover-id.d.ts +11 -0
  80. package/dist/types-ts4.5/internal/get-aria-for-trigger.d.ts +86 -0
  81. package/dist/types-ts4.5/internal/role-types.d.ts +7 -0
  82. package/dist/types-ts4.5/internal/slot.d.ts +2 -2
  83. package/dist/types-ts4.5/popover/create-close-event.d.ts +1 -2
  84. package/dist/types-ts4.5/popover/index.d.ts +1 -1
  85. package/dist/types-ts4.5/popover/popover.d.ts +6 -13
  86. package/dist/types-ts4.5/popover/types.d.ts +6 -5
  87. package/dist/types-ts4.5/popover-surface/index.d.ts +2 -0
  88. package/dist/types-ts4.5/popover-surface/popover-surface.d.ts +21 -0
  89. package/get-aria-for-trigger/package.json +17 -0
  90. package/package.json +3 -3
  91. package/popover-surface/package.json +17 -0
  92. package/use-popover-id/package.json +17 -0
  93. package/create-close-event/package.json +0 -17
  94. package/dialog/create-close-event/package.json +0 -17
  95. package/dist/cjs/entry-points/create-close-event.js +0 -19
  96. package/dist/cjs/entry-points/dialog/create-close-event.js +0 -12
  97. package/dist/cjs/entry-points/popover/create-close-event.js +0 -12
  98. package/dist/cjs/entry-points/popup-surface.js +0 -12
  99. package/dist/cjs/entry-points/popup.js +0 -12
  100. package/dist/cjs/popup/index.js +0 -37
  101. package/dist/cjs/popup/popup-content.js +0 -215
  102. package/dist/cjs/popup/popup-context.js +0 -25
  103. package/dist/cjs/popup/popup-provider.js +0 -15
  104. package/dist/cjs/popup/popup-trigger-function.js +0 -80
  105. package/dist/cjs/popup/popup-trigger.js +0 -66
  106. package/dist/cjs/popup/popup.js +0 -81
  107. package/dist/cjs/popup/types.js +0 -5
  108. package/dist/cjs/popup/use-maybe-popup-context.js +0 -17
  109. package/dist/cjs/popup/use-popup-context.js +0 -20
  110. package/dist/es2019/entry-points/create-close-event.js +0 -9
  111. package/dist/es2019/entry-points/dialog/create-close-event.js +0 -1
  112. package/dist/es2019/entry-points/popover/create-close-event.js +0 -1
  113. package/dist/es2019/entry-points/popup-surface.js +0 -1
  114. package/dist/es2019/entry-points/popup.js +0 -1
  115. package/dist/es2019/popup/index.js +0 -33
  116. package/dist/es2019/popup/popup-content.js +0 -207
  117. package/dist/es2019/popup/popup-context.js +0 -20
  118. package/dist/es2019/popup/popup-provider.js +0 -10
  119. package/dist/es2019/popup/popup-surface.js +0 -30
  120. package/dist/es2019/popup/popup-trigger-function.js +0 -75
  121. package/dist/es2019/popup/popup-trigger.js +0 -61
  122. package/dist/es2019/popup/popup.js +0 -67
  123. package/dist/es2019/popup/types.js +0 -1
  124. package/dist/es2019/popup/use-maybe-popup-context.js +0 -12
  125. package/dist/es2019/popup/use-popup-context.js +0 -15
  126. package/dist/esm/entry-points/create-close-event.js +0 -9
  127. package/dist/esm/entry-points/dialog/create-close-event.js +0 -1
  128. package/dist/esm/entry-points/popover/create-close-event.js +0 -1
  129. package/dist/esm/entry-points/popup-surface.js +0 -1
  130. package/dist/esm/entry-points/popup.js +0 -1
  131. package/dist/esm/popup/index.js +0 -33
  132. package/dist/esm/popup/popup-content.js +0 -207
  133. package/dist/esm/popup/popup-context.js +0 -20
  134. package/dist/esm/popup/popup-provider.js +0 -10
  135. package/dist/esm/popup/popup-surface.js +0 -29
  136. package/dist/esm/popup/popup-trigger-function.js +0 -75
  137. package/dist/esm/popup/popup-trigger.js +0 -59
  138. package/dist/esm/popup/popup.js +0 -72
  139. package/dist/esm/popup/types.js +0 -1
  140. package/dist/esm/popup/use-maybe-popup-context.js +0 -12
  141. package/dist/esm/popup/use-popup-context.js +0 -15
  142. package/dist/types/entry-points/create-close-event.d.ts +0 -11
  143. package/dist/types/entry-points/dialog/create-close-event.d.ts +0 -2
  144. package/dist/types/entry-points/popover/create-close-event.d.ts +0 -2
  145. package/dist/types/entry-points/popup-surface.d.ts +0 -2
  146. package/dist/types/entry-points/popup.d.ts +0 -2
  147. package/dist/types/popup/index.d.ts +0 -34
  148. package/dist/types/popup/popup-content.d.ts +0 -14
  149. package/dist/types/popup/popup-context.d.ts +0 -96
  150. package/dist/types/popup/popup-provider.d.ts +0 -10
  151. package/dist/types/popup/popup-surface.d.ts +0 -22
  152. package/dist/types/popup/popup-trigger-function.d.ts +0 -112
  153. package/dist/types/popup/popup-trigger.d.ts +0 -14
  154. package/dist/types/popup/popup.d.ts +0 -14
  155. package/dist/types/popup/types.d.ts +0 -321
  156. package/dist/types/popup/use-maybe-popup-context.d.ts +0 -8
  157. package/dist/types/popup/use-popup-context.d.ts +0 -7
  158. package/dist/types-ts4.5/entry-points/create-close-event.d.ts +0 -11
  159. package/dist/types-ts4.5/entry-points/dialog/create-close-event.d.ts +0 -2
  160. package/dist/types-ts4.5/entry-points/popover/create-close-event.d.ts +0 -2
  161. package/dist/types-ts4.5/entry-points/popup-surface.d.ts +0 -2
  162. package/dist/types-ts4.5/entry-points/popup.d.ts +0 -2
  163. package/dist/types-ts4.5/popup/index.d.ts +0 -34
  164. package/dist/types-ts4.5/popup/popup-content.d.ts +0 -14
  165. package/dist/types-ts4.5/popup/popup-context.d.ts +0 -96
  166. package/dist/types-ts4.5/popup/popup-provider.d.ts +0 -10
  167. package/dist/types-ts4.5/popup/popup-surface.d.ts +0 -22
  168. package/dist/types-ts4.5/popup/popup-trigger-function.d.ts +0 -112
  169. package/dist/types-ts4.5/popup/popup-trigger.d.ts +0 -14
  170. package/dist/types-ts4.5/popup/popup.d.ts +0 -14
  171. package/dist/types-ts4.5/popup/types.d.ts +0 -321
  172. package/dist/types-ts4.5/popup/use-maybe-popup-context.d.ts +0 -8
  173. package/dist/types-ts4.5/popup/use-popup-context.d.ts +0 -7
  174. package/popover/create-close-event/package.json +0 -17
  175. package/popup/package.json +0 -17
  176. package/popup-surface/package.json +0 -17
  177. /package/dist/cjs/{popup/popup-surface.compiled.css → popover-surface/popover-surface.compiled.css} +0 -0
  178. /package/dist/es2019/{popup/popup-surface.compiled.css → popover-surface/popover-surface.compiled.css} +0 -0
  179. /package/dist/esm/{popup/popup-surface.compiled.css → popover-surface/popover-surface.compiled.css} +0 -0
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@atlaskit/top-layer/use-popover-id",
3
+ "main": "../dist/cjs/entry-points/use-popover-id.js",
4
+ "module": "../dist/esm/entry-points/use-popover-id.js",
5
+ "module:es2019": "../dist/es2019/entry-points/use-popover-id.js",
6
+ "sideEffects": [
7
+ "*.compiled.css"
8
+ ],
9
+ "types": "../dist/types/entry-points/use-popover-id.d.ts",
10
+ "typesVersions": {
11
+ ">=4.5 <5.9": {
12
+ "*": [
13
+ "../dist/types-ts4.5/entry-points/use-popover-id.d.ts"
14
+ ]
15
+ }
16
+ }
17
+ }
@@ -1,17 +0,0 @@
1
- {
2
- "name": "@atlaskit/top-layer/create-close-event",
3
- "main": "../dist/cjs/entry-points/create-close-event.js",
4
- "module": "../dist/esm/entry-points/create-close-event.js",
5
- "module:es2019": "../dist/es2019/entry-points/create-close-event.js",
6
- "sideEffects": [
7
- "*.compiled.css"
8
- ],
9
- "types": "../dist/types/entry-points/create-close-event.d.ts",
10
- "typesVersions": {
11
- ">=4.5 <5.9": {
12
- "*": [
13
- "../dist/types-ts4.5/entry-points/create-close-event.d.ts"
14
- ]
15
- }
16
- }
17
- }
@@ -1,17 +0,0 @@
1
- {
2
- "name": "@atlaskit/top-layer/dialog/create-close-event",
3
- "main": "../../dist/cjs/entry-points/dialog/create-close-event.js",
4
- "module": "../../dist/esm/entry-points/dialog/create-close-event.js",
5
- "module:es2019": "../../dist/es2019/entry-points/dialog/create-close-event.js",
6
- "sideEffects": [
7
- "*.compiled.css"
8
- ],
9
- "types": "../../dist/types/entry-points/dialog/create-close-event.d.ts",
10
- "typesVersions": {
11
- ">=4.5 <5.9": {
12
- "*": [
13
- "../../dist/types-ts4.5/entry-points/dialog/create-close-event.d.ts"
14
- ]
15
- }
16
- }
17
- }
@@ -1,19 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "createCloseEvent", {
7
- enumerable: true,
8
- get: function get() {
9
- return _dialog.createCloseEvent;
10
- }
11
- });
12
- Object.defineProperty(exports, "createPopoverCloseEvent", {
13
- enumerable: true,
14
- get: function get() {
15
- return _createCloseEvent.createPopoverCloseEvent;
16
- }
17
- });
18
- var _dialog = require("../dialog");
19
- var _createCloseEvent = require("../popover/create-close-event");
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "createCloseEvent", {
7
- enumerable: true,
8
- get: function get() {
9
- return _createCloseEvent.createCloseEvent;
10
- }
11
- });
12
- var _createCloseEvent = require("../../dialog/create-close-event");
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "createPopoverCloseEvent", {
7
- enumerable: true,
8
- get: function get() {
9
- return _createCloseEvent.createPopoverCloseEvent;
10
- }
11
- });
12
- var _createCloseEvent = require("../../popover/create-close-event");
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "PopupSurface", {
7
- enumerable: true,
8
- get: function get() {
9
- return _popupSurface.PopupSurface;
10
- }
11
- });
12
- var _popupSurface = require("../popup/popup-surface");
@@ -1,12 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "Popup", {
7
- enumerable: true,
8
- get: function get() {
9
- return _popup.Popup;
10
- }
11
- });
12
- var _popup = require("../popup");
@@ -1,37 +0,0 @@
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
- });
@@ -1,215 +0,0 @@
1
- /* popup-content.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.PopupContent = void 0;
10
- var _runtime = require("@compiled/react/runtime");
11
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
- var _react = _interopRequireWildcard(require("react"));
13
- var _mergeRefs = _interopRequireDefault(require("@atlaskit/ds-lib/merge-refs"));
14
- var _reducedMotion = require("../internal/reduced-motion");
15
- var _roleToAriaHasPopup = require("../internal/role-to-aria-has-popup");
16
- var _shouldFocusIntoPopover = require("../internal/should-focus-into-popover");
17
- var _useAnchorPosition = require("../internal/use-anchor-position");
18
- var _useWidthFromAnchor = require("../internal/use-width-from-anchor");
19
- var _popover = require("../popover/popover");
20
- var _useMaybePopupContext = require("./use-maybe-popup-context");
21
- 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); }
22
- /**
23
- * Thin context wrapper that composes `Popover` + `useAnchorPosition`.
24
- *
25
- * Used inside the `<Popup>` compound - reads triggerRef, placement, isOpen,
26
- * and onClose from context. For standalone usage (tooltip, spotlight, flag),
27
- * use `Popover` + `useAnchorPosition` directly.
28
- */
29
- var PopupContent = exports.PopupContent = /*#__PURE__*/(0, _react.forwardRef)(function PopupContent(_ref, ref) {
30
- var _ref2, _ctx$popoverRef;
31
- var children = _ref.children,
32
- role = _ref.role,
33
- label = _ref.label,
34
- labelledBy = _ref.labelledBy,
35
- animate = _ref.animate,
36
- mode = _ref.mode,
37
- _ref$widthFromAnchor = _ref.widthFromAnchor,
38
- widthFromAnchor = _ref$widthFromAnchor === void 0 ? 'none' : _ref$widthFromAnchor,
39
- xcss = _ref.xcss,
40
- isOpenProp = _ref.isOpen,
41
- triggerRefProp = _ref.triggerRef,
42
- placementProp = _ref.placement,
43
- onCloseProp = _ref.onClose,
44
- testIdProp = _ref.testId,
45
- forceFallbackPositioningProp = _ref.forceFallbackPositioning,
46
- idProp = _ref.id,
47
- onEnterFinish = _ref.onEnterFinish,
48
- onExitFinish = _ref.onExitFinish;
49
- // When inside <Popup>, context provides defaults. Props always win.
50
- var ctx = (0, _useMaybePopupContext.useMaybePopupContext)();
51
- var triggerRef = triggerRefProp !== null && triggerRefProp !== void 0 ? triggerRefProp : ctx === null || ctx === void 0 ? void 0 : ctx.triggerRef;
52
- var placement = (_ref2 = placementProp !== null && placementProp !== void 0 ? placementProp : ctx === null || ctx === void 0 ? void 0 : ctx.placement) !== null && _ref2 !== void 0 ? _ref2 : {};
53
- var onClose = onCloseProp !== null && onCloseProp !== void 0 ? onCloseProp : ctx === null || ctx === void 0 ? void 0 : ctx.onClose;
54
- var testId = testIdProp !== null && testIdProp !== void 0 ? testIdProp : ctx === null || ctx === void 0 ? void 0 : ctx.testId;
55
- var forceFallbackPositioning = forceFallbackPositioningProp !== null && forceFallbackPositioningProp !== void 0 ? forceFallbackPositioningProp : ctx === null || ctx === void 0 ? void 0 : ctx.forceFallbackPositioning;
56
-
57
- // isOpen: prop wins, otherwise derive from context popupState.
58
- // 'animating-open' counts as open so <Popover> stays visible during entry animation.
59
- var isOpen = isOpenProp !== null && isOpenProp !== void 0 ? isOpenProp : ctx !== null ? ctx.popupState === 'open' || ctx.popupState === 'animating-open' : false;
60
- var setPopupState = ctx === null || ctx === void 0 ? void 0 : ctx.setPopupState;
61
- var consumerOnOpenChange = ctx === null || ctx === void 0 ? void 0 : ctx.onOpenChange;
62
-
63
- // ── TPopupState ──
64
- //
65
- // popupState is driven by handleOpenChange (below), which fires on every browser
66
- // toggle event (showPopover / hidePopover / light-dismiss).
67
- //
68
- // Exception — initial mount with isOpen=true (prop-controlled usage):
69
- // handleOpenChange only fires from the Popover's toggle event listener, which
70
- // is registered in a useEffect. On the first render, useEffect hasn't run yet,
71
- // so handleOpenChange never fires. We sync popupState here instead.
72
- //
73
- // Transitions when animations are active:
74
- // closed → animating-open → open (enter)
75
- // open → animating-closed → closed (exit, via onExitFinish)
76
- //
77
- // Without animation: closed ↔ open directly.
78
- var willAnimate = Boolean(animate) && !(0, _reducedMotion.prefersReducedMotion)();
79
- var hasMountedRef = (0, _react.useRef)(false);
80
- (0, _react.useLayoutEffect)(function () {
81
- if (hasMountedRef.current) {
82
- return;
83
- }
84
- hasMountedRef.current = true;
85
- if (isOpen) {
86
- setPopupState === null || setPopupState === void 0 || setPopupState(willAnimate ? 'animating-open' : 'open');
87
- }
88
- }, [isOpen, setPopupState, willAnimate]);
89
- var handleEnterFinish = (0, _react.useCallback)(function () {
90
- setPopupState === null || setPopupState === void 0 || setPopupState('open');
91
- onEnterFinish === null || onEnterFinish === void 0 || onEnterFinish();
92
- }, [setPopupState, onEnterFinish]);
93
- var handleExitFinish = (0, _react.useCallback)(function () {
94
- setPopupState === null || setPopupState === void 0 || setPopupState('closed');
95
- onExitFinish === null || onExitFinish === void 0 || onExitFinish();
96
- }, [setPopupState, onExitFinish]);
97
-
98
- // Note: onOpenChange composition is handled by handleOpenChange below,
99
- // which also adds nested-popover focus restoration.
100
-
101
- // Sync aria-haspopup on the trigger with the content's role
102
- var setAriaHasPopup = ctx === null || ctx === void 0 ? void 0 : ctx.setAriaHasPopup;
103
- (0, _react.useLayoutEffect)(function () {
104
- setAriaHasPopup === null || setAriaHasPopup === void 0 || setAriaHasPopup((0, _roleToAriaHasPopup.roleToAriaHasPopup)({
105
- role: role
106
- }));
107
- }, [role, setAriaHasPopup]);
108
-
109
- // Focus restoration
110
- // The native Popover API handles focus restoration automatically for
111
- // popover="auto" and popover="hint":
112
- // - Escape → restores focus to the previously focused element (the trigger)
113
- // - Click-outside → does NOT restore (correct: the user clicked deliberately)
114
- // - hidePopover() → restores focus to the previously focused element
115
- //
116
- // However, for **nested** popover="auto" popovers, the browser only captures
117
- // `previouslyFocusedElement` for the outermost popover in the auto stack.
118
- // Inner popovers have `shouldRestoreFocus=false` per the spec, so the browser
119
- // does not restore focus when they close.
120
- //
121
- // To handle this, we listen for the close transition via `onOpenChange` and
122
- // restore focus to the trigger if the browser did not. This runs after the
123
- // browser's native restoration (which happens synchronously during hidePopover),
124
- // so it only takes effect when the browser skipped restoration (nested case).
125
- //
126
- // See: notes/architecture/focus-restoration.md
127
- var handleOpenChange = (0, _react.useCallback)(function (args) {
128
- // Sync compound state
129
- if (args.isOpen) {
130
- setPopupState === null || setPopupState === void 0 || setPopupState(willAnimate ? 'animating-open' : 'open');
131
- } else {
132
- setPopupState === null || setPopupState === void 0 || setPopupState(willAnimate ? 'animating-closed' : 'closed');
133
- }
134
- consumerOnOpenChange === null || consumerOnOpenChange === void 0 || consumerOnOpenChange(args);
135
-
136
- // Nested popover focus restoration fallback
137
- // The browser only captures `previouslyFocusedElement` for the
138
- // outermost popover="auto" in the stack. Inner (nested) popovers
139
- // have shouldRestoreFocus=false, so the browser will not restore
140
- // focus when they close.
141
- //
142
- // We detect this case by checking if focus is still inside the
143
- // closing popover element. If it is, the browser did not restore,
144
- // and we need to move focus to the trigger ourselves.
145
- //
146
- // This does NOT fire for:
147
- // - Outermost popovers (browser already restored to trigger)
148
- // - Click-outside (focus is on the clicked element, not in popover)
149
- if (!args.isOpen) {
150
- var trigger = triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current;
151
- var focusStillInPopover = trigger && args.element.contains(document.activeElement);
152
- // Single source of truth for "this role moves focus on open
153
- // and therefore needs to be restored on close" - see
154
- // `shouldFocusIntoPopover` in `internal/role-types.tsx`.
155
- if (focusStillInPopover && (0, _shouldFocusIntoPopover.shouldFocusIntoPopover)({
156
- role: role
157
- })) {
158
- trigger.focus({
159
- preventScroll: true
160
- });
161
- }
162
- }
163
- }, [consumerOnOpenChange, triggerRef, role, setPopupState, willAnimate]);
164
-
165
- // Anchor positioning
166
- // Compose useAnchorPosition with Popover. The hook positions the popover
167
- // relative to the trigger element via CSS Anchor Positioning (with JS fallback).
168
- // Use ctx.popoverRef when inside the compound (so the trigger can also
169
- // reach the same DOM element for togglePopover). Otherwise use a local ref.
170
- var localRef = (0, _react.useRef)(null);
171
- var popoverRef = (_ctx$popoverRef = ctx === null || ctx === void 0 ? void 0 : ctx.popoverRef) !== null && _ctx$popoverRef !== void 0 ? _ctx$popoverRef : localRef;
172
- (0, _useAnchorPosition.useAnchorPosition)({
173
- anchorRef: triggerRef !== null && triggerRef !== void 0 ? triggerRef : {
174
- current: null
175
- },
176
- popoverRef: popoverRef,
177
- placement: placement,
178
- forceFallbackPositioning: forceFallbackPositioning
179
- });
180
- (0, _useWidthFromAnchor.useWidthFromAnchor)({
181
- mode: widthFromAnchor,
182
- popoverRef: popoverRef,
183
- anchorRef: triggerRef
184
- });
185
-
186
- // Merge: the popoverRef (shared with trigger + positioning) and the forwarded ref.
187
- var combinedRef = (0, _mergeRefs.default)([popoverRef, ref]);
188
-
189
- // TPopupContentProps already validates the discriminated union (role + label,
190
- // mode + onClose) at its API boundary. Popover accepts TPopoverForwardedProps
191
- // internally so individual prop forwarding does not need to re-prove the union.
192
- var popoverProps = {
193
- isOpen: isOpen,
194
- animate: animate,
195
- placement: placement,
196
- mode: mode,
197
- role: role,
198
- label: label,
199
- labelledBy: labelledBy,
200
- onClose: onClose !== null && onClose !== void 0 ? onClose : undefined,
201
- onOpenChange: handleOpenChange,
202
- onEnterFinish: handleEnterFinish,
203
- onExitFinish: handleExitFinish,
204
- testId: testId,
205
- children: children,
206
- // Standalone consumers can pass an explicit `id` - used by their own
207
- // trigger to wire `aria-controls`. Inside the `<Popup>` compound, the
208
- // id flows from context (`ctx.popoverId`).
209
- id: idProp !== null && idProp !== void 0 ? idProp : ctx === null || ctx === void 0 ? void 0 : ctx.popoverId,
210
- xcss: xcss
211
- };
212
- return /*#__PURE__*/_react.default.createElement(_popover.Popover, (0, _extends2.default)({
213
- ref: combinedRef
214
- }, popoverProps));
215
- });
@@ -1,25 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.PopupContext = void 0;
7
- var _react = require("react");
8
- /**
9
- * Represents the lifecycle state of the popup.
10
- *
11
- * - `'closed'`: fully closed, not visible, no animation playing.
12
- * - `'animating-open'`: entry animation is playing (popup is opening but not yet settled).
13
- * - `'open'`: fully open, browser popover is showing, entry animation complete.
14
- * - `'animating-closed'`: exit animation is playing (popup is closing but still visible).
15
- *
16
- * Used to derive `aria-expanded` on the trigger:
17
- * - `aria-expanded` is `true` in `'animating-open'`, `'open'`, and `'animating-closed'`.
18
- *
19
- * This avoids screen readers announcing the popup as closed while it is
20
- * still visually present on screen during animations, and prevents consumers
21
- * that conditionally show/hide trigger UI based on `aria-expanded` from hiding
22
- * the trigger (and thus the popup anchor) mid-animation.
23
- */
24
-
25
- var PopupContext = exports.PopupContext = /*#__PURE__*/(0, _react.createContext)(null);
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.PopupProvider = void 0;
7
- var _popupContext = require("./popup-context");
8
- /**
9
- * __Popup provider__
10
- *
11
- * Provides shared popup state (placement, popoverId, triggerRef,
12
- * isOpen, onClose) to compound child components such as `Popup.Trigger` and
13
- * `Popup.Content`.
14
- */
15
- var PopupProvider = exports.PopupProvider = _popupContext.PopupContext.Provider;
@@ -1,80 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.PopupTriggerFunction = PopupTriggerFunction;
7
- var _react = require("react");
8
- var _usePopupContext2 = require("./use-popup-context");
9
- /**
10
- * Props passed to the `TriggerFunction` render-prop child.
11
- */
12
-
13
- /**
14
- * Render-prop alternative to `Popup.Trigger`.
15
- *
16
- * Use when you need full control over the trigger element. For example,
17
- * to compose your own trigger with custom event handlers, wrap a third-party
18
- * component, or build a trigger from multiple elements.
19
- *
20
- * `Popup.Trigger` uses `cloneElement` internally, which limits composability.
21
- * `Popup.TriggerFunction` hands you the raw props and lets you wire them up.
22
- *
23
- * **Note:** This sub-component uses a render-prop pattern and is not
24
- * compatible with React Server Components (RSC). It must be used inside
25
- * a client component boundary (`'use client'`).
26
- *
27
- * @example
28
- * ```tsx
29
- * <Popup placement={{ edge: 'end' }} onClose={handleClose}>
30
- * <Popup.TriggerFunction>
31
- * {({ ref, toggle, ariaAttributes }) => (
32
- * <button ref={ref} onClick={toggle} {...ariaAttributes}>
33
- * Open
34
- * </button>
35
- * )}
36
- * </Popup.TriggerFunction>
37
- * <Popup.Content role="dialog" label="My popup">
38
- * Content
39
- * </Popup.Content>
40
- * </Popup>
41
- * ```
42
- */
43
- function PopupTriggerFunction(_ref) {
44
- var children = _ref.children;
45
- var _usePopupContext = (0, _usePopupContext2.usePopupContext)(),
46
- triggerRef = _usePopupContext.triggerRef,
47
- popoverRef = _usePopupContext.popoverRef,
48
- popoverId = _usePopupContext.popoverId,
49
- popupState = _usePopupContext.popupState,
50
- ariaHasPopup = _usePopupContext.ariaHasPopup;
51
- var ref = (0, _react.useCallback)(function (node) {
52
- triggerRef.current = node;
53
- }, [triggerRef]);
54
- var toggle = (0, _react.useCallback)(function () {
55
- var popoverEl = popoverRef.current;
56
- if (popoverEl) {
57
- // Defensive: element may be disconnected or in an unexpected state.
58
- try {
59
- popoverEl.togglePopover();
60
- } catch (_unused) {}
61
- }
62
- }, [popoverRef]);
63
- var ariaAttributes = (0, _react.useMemo)(function () {
64
- return {
65
- // aria-expanded stays true throughout entry and exit animations so screen readers
66
- // don't announce the popup as closed while it's still visible, and consumers
67
- // relying on aria-expanded to show/hide trigger UI don't lose the anchor mid-animation.
68
- 'aria-expanded': popupState === 'open' || popupState === 'animating-open' || popupState === 'animating-closed',
69
- 'aria-controls': popoverId,
70
- 'aria-haspopup': ariaHasPopup
71
- };
72
- }, [popupState, popoverId, ariaHasPopup]);
73
- return children({
74
- ref: ref,
75
- isOpen: popupState === 'open' || popupState === 'animating-open',
76
- popoverId: popoverId,
77
- toggle: toggle,
78
- ariaAttributes: ariaAttributes
79
- });
80
- }
@@ -1,66 +0,0 @@
1
- "use strict";
2
-
3
- var _typeof = require("@babel/runtime/helpers/typeof");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.PopupTrigger = PopupTrigger;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _slot = require("../internal/slot");
10
- var _usePopupContext2 = require("./use-popup-context");
11
- 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); }
12
- /**
13
- * Wraps a single trigger element via `cloneElement`. Attaches aria
14
- * attributes, the toggle handler, and the anchor-name. `aria-haspopup`
15
- * is derived from `Popup.Content`'s role via context.
16
- *
17
- * Child constraints: must be a single ref-forwarding element. The child's
18
- * `onClick` is composed (runs after); other event handlers are NOT.
19
- * Children using Compiled's `css` prop swallow injected props - use
20
- * `Popup.TriggerFunction` for these cases or any time you need handler
21
- * composition.
22
- */
23
- function PopupTrigger(_ref) {
24
- var children = _ref.children;
25
- var _usePopupContext = (0, _usePopupContext2.usePopupContext)(),
26
- triggerRef = _usePopupContext.triggerRef,
27
- popoverRef = _usePopupContext.popoverRef,
28
- popoverId = _usePopupContext.popoverId,
29
- popupState = _usePopupContext.popupState,
30
- ariaHasPopup = _usePopupContext.ariaHasPopup;
31
- var childOnClick = /*#__PURE__*/(0, _react.isValidElement)(children) ? children.props.onClick : undefined;
32
-
33
- // Use a ref to track the latest isOpen value so the click handler
34
- // does not need isOpen in its dependency array (which would recreate
35
- // the handler on every open/close, breaking cloneElement identity).
36
- var isOpenRef = _react.default.useRef(popupState === 'open' || popupState === 'animating-open');
37
- isOpenRef.current = popupState === 'open' || popupState === 'animating-open';
38
- var handleClick = (0, _react.useCallback)(function (event) {
39
- var popoverEl = popoverRef.current;
40
- if (popoverEl) {
41
- // `popover="auto"` light-dismiss can close the popover BEFORE
42
- // our click handler runs, so trust React's isOpen rather than
43
- // DOM state. If React still thinks it is closed, open it; if
44
- // it was open, the browser already closed it.
45
- if (!isOpenRef.current) {
46
- try {
47
- popoverEl.showPopover();
48
- } catch (_unused) {
49
- // Element may be disconnected; ignore.
50
- }
51
- }
52
- }
53
- childOnClick === null || childOnClick === void 0 || childOnClick(event);
54
- }, [popoverRef, childOnClick]);
55
- return /*#__PURE__*/_react.default.createElement(_slot.Slot, {
56
- ref: triggerRef,
57
- onClick: handleClick
58
- // aria-expanded stays true throughout entry and exit animations so screen readers
59
- // don't announce the popup as closed while it's still visible, and consumers
60
- // relying on aria-expanded to show/hide trigger UI don't lose the anchor mid-animation.
61
- ,
62
- "aria-expanded": popupState === 'open' || popupState === 'animating-open' || popupState === 'animating-closed',
63
- "aria-controls": popoverId,
64
- "aria-haspopup": ariaHasPopup
65
- }, children);
66
- }
@@ -1,81 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.PopupRoot = PopupRoot;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var _popupProvider = require("./popup-provider");
12
- 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); }
13
- /**
14
- * Popup compound: trigger + popover content.
15
- *
16
- * Use when a button opens anchored content (dropdown, menu, dialog).
17
- * The browser manages visibility via `togglePopover()`; the consumer
18
- * never manages `isOpen`. For custom trigger lifecycles (hover, timers,
19
- * external state), use `Popover` directly instead.
20
- *
21
- * Provides context (triggerRef, placement, isOpen, onClose, mode) that
22
- * `Popup.Content` reads and forwards to the underlying `Popover`.
23
- */
24
- function PopupRoot(props) {
25
- var _props$placement, _props$mode;
26
- var children = props.children,
27
- testId = props.testId,
28
- forceFallbackPositioning = props.forceFallbackPositioning,
29
- onOpenChange = props.onOpenChange;
30
- // `{}` resolves to "below the trigger, centered, with `space.100` gap"
31
- // inside `useAnchorPosition`, which is the common case.
32
- var placement = (_props$placement = props.placement) !== null && _props$placement !== void 0 ? _props$placement : {};
33
- var mode = (_props$mode = props.mode) !== null && _props$mode !== void 0 ? _props$mode : 'auto';
34
-
35
- // `TPopupProps` discriminates on `mode`: `manual` types `onClose` as
36
- // `never`, so for manual consumers `props.onClose` is always `undefined`
37
- // here. No runtime guard needed; the type contract carries the rule.
38
- var onClose = props.onClose;
39
- var id = (0, _react.useId)();
40
- // `useId()` returns IDs containing colons (`:r1:`), which are invalid
41
- // in CSS selectors and `popover` target attributes. `replaceAll` is
42
- // not in our browser matrix.
43
- var sanitizedId = id.replace(/:/g, '');
44
- var popoverId = "popover-".concat(sanitizedId);
45
- var triggerRef = (0, _react.useRef)(null);
46
- var popoverRef = (0, _react.useRef)(null);
47
- var _useState = (0, _react.useState)('closed'),
48
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
49
- popupState = _useState2[0],
50
- setPopupState = _useState2[1];
51
- // Initial seed before `Popup.Content`'s layout effect resolves the
52
- // real role on first paint.
53
- var _useState3 = (0, _react.useState)('dialog'),
54
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
55
- ariaHasPopup = _useState4[0],
56
- setAriaHasPopup = _useState4[1];
57
- var handleClose = (0, _react.useCallback)(function (args) {
58
- onClose === null || onClose === void 0 || onClose(args);
59
- }, [onClose]);
60
- var contextValue = {
61
- popoverId: popoverId,
62
- placement: placement,
63
- // `null` when the consumer did not supply a handler (manual mode, or
64
- // auto/hint without a light-dismiss handler). `Popup.Content` reads
65
- // this to decide whether to forward an `onClose` to `Popover`.
66
- onClose: onClose ? handleClose : null,
67
- triggerRef: triggerRef,
68
- popoverRef: popoverRef,
69
- popupState: popupState,
70
- setPopupState: setPopupState,
71
- onOpenChange: onOpenChange,
72
- mode: mode,
73
- ariaHasPopup: ariaHasPopup,
74
- setAriaHasPopup: setAriaHasPopup,
75
- testId: testId,
76
- forceFallbackPositioning: forceFallbackPositioning
77
- };
78
- return /*#__PURE__*/_react.default.createElement(_popupProvider.PopupProvider, {
79
- value: contextValue
80
- }, children);
81
- }
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });