@atlaskit/top-layer 0.12.2 → 0.14.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 (245) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +61 -34
  3. package/dist/cjs/animations/presets.js +4 -4
  4. package/dist/cjs/entry-points/focus.js +6 -4
  5. package/dist/cjs/entry-points/get-aria-for-trigger.js +12 -0
  6. package/dist/cjs/entry-points/popover-surface.js +12 -0
  7. package/dist/cjs/entry-points/use-anchor-position-at-point.js +12 -0
  8. package/dist/cjs/entry-points/use-popover-id.js +21 -0
  9. package/dist/cjs/focus/get-first-focusable.js +19 -0
  10. package/dist/cjs/focus/get-focusables.js +30 -0
  11. package/dist/cjs/focus/get-last-focusable.js +19 -0
  12. package/dist/cjs/focus/get-next-focusable.js +43 -0
  13. package/dist/cjs/focus/is-in-same-layer.js +23 -0
  14. package/dist/cjs/focus/is-nested-layer-focused.js +32 -0
  15. package/dist/cjs/focus/selectors.js +19 -0
  16. package/dist/cjs/focus/types.js +1 -0
  17. package/dist/cjs/internal/get-aria-for-trigger.js +88 -0
  18. package/dist/cjs/internal/role-to-aria-has-popup.js +37 -0
  19. package/dist/cjs/internal/role-types.js +2 -35
  20. package/dist/cjs/internal/should-focus-into-popover.js +19 -0
  21. package/dist/cjs/internal/slot.js +1 -1
  22. package/dist/cjs/internal/use-anchor-position-at-point.js +127 -0
  23. package/dist/cjs/internal/use-anchor-position.js +36 -16
  24. package/dist/cjs/internal/use-focus-wrap.js +8 -5
  25. package/dist/cjs/internal/use-initial-focus.js +4 -4
  26. package/dist/cjs/placement-map/index.js +2 -2
  27. package/dist/cjs/placement-map/legacy-placements.js +2 -101
  28. package/dist/cjs/placement-map/placement-mapping.js +103 -0
  29. package/dist/cjs/popover/popover.js +79 -80
  30. package/dist/cjs/popover-surface/index.js +12 -0
  31. package/dist/cjs/{popup/popup-surface.js → popover-surface/popover-surface.js} +9 -12
  32. package/dist/cjs/testing/polyfill.js +9 -6
  33. package/dist/cjs/use-arrow-navigation/use-arrow-navigation.js +7 -5
  34. package/dist/es2019/animations/presets.js +4 -4
  35. package/dist/es2019/entry-points/focus.js +3 -1
  36. package/dist/es2019/entry-points/get-aria-for-trigger.js +1 -0
  37. package/dist/es2019/entry-points/popover-surface.js +1 -0
  38. package/dist/es2019/entry-points/use-anchor-position-at-point.js +1 -0
  39. package/dist/es2019/entry-points/use-popover-id.js +15 -0
  40. package/dist/es2019/focus/get-first-focusable.js +14 -0
  41. package/dist/es2019/focus/get-focusables.js +19 -0
  42. package/dist/es2019/focus/get-last-focusable.js +14 -0
  43. package/dist/es2019/focus/get-next-focusable.js +38 -0
  44. package/dist/es2019/focus/is-in-same-layer.js +18 -0
  45. package/dist/es2019/focus/is-nested-layer-focused.js +28 -0
  46. package/dist/es2019/focus/selectors.js +11 -0
  47. package/dist/es2019/focus/types.js +0 -0
  48. package/dist/es2019/internal/get-aria-for-trigger.js +84 -0
  49. package/dist/es2019/internal/role-to-aria-has-popup.js +32 -0
  50. package/dist/es2019/internal/role-types.js +0 -33
  51. package/dist/es2019/internal/should-focus-into-popover.js +14 -0
  52. package/dist/es2019/internal/slot.js +1 -1
  53. package/dist/es2019/internal/use-anchor-position-at-point.js +122 -0
  54. package/dist/es2019/internal/use-anchor-position.js +21 -14
  55. package/dist/es2019/internal/use-focus-wrap.js +4 -1
  56. package/dist/es2019/internal/use-initial-focus.js +1 -1
  57. package/dist/es2019/placement-map/index.js +1 -1
  58. package/dist/es2019/placement-map/legacy-placements.js +1 -100
  59. package/dist/es2019/placement-map/placement-mapping.js +97 -0
  60. package/dist/es2019/popover/popover.js +79 -80
  61. package/dist/es2019/popover-surface/index.js +1 -0
  62. package/dist/es2019/popover-surface/popover-surface.js +27 -0
  63. package/dist/es2019/testing/polyfill.js +9 -6
  64. package/dist/es2019/use-arrow-navigation/use-arrow-navigation.js +3 -1
  65. package/dist/esm/animations/presets.js +4 -4
  66. package/dist/esm/entry-points/focus.js +3 -1
  67. package/dist/esm/entry-points/get-aria-for-trigger.js +1 -0
  68. package/dist/esm/entry-points/popover-surface.js +1 -0
  69. package/dist/esm/entry-points/use-anchor-position-at-point.js +1 -0
  70. package/dist/esm/entry-points/use-popover-id.js +15 -0
  71. package/dist/esm/focus/get-first-focusable.js +13 -0
  72. package/dist/esm/focus/get-focusables.js +24 -0
  73. package/dist/esm/focus/get-last-focusable.js +13 -0
  74. package/dist/esm/focus/get-next-focusable.js +37 -0
  75. package/dist/esm/focus/is-in-same-layer.js +17 -0
  76. package/dist/esm/focus/is-nested-layer-focused.js +27 -0
  77. package/dist/esm/focus/selectors.js +13 -0
  78. package/dist/esm/focus/types.js +0 -0
  79. package/dist/esm/internal/get-aria-for-trigger.js +83 -0
  80. package/dist/esm/internal/role-to-aria-has-popup.js +31 -0
  81. package/dist/esm/internal/role-types.js +2 -34
  82. package/dist/esm/internal/should-focus-into-popover.js +13 -0
  83. package/dist/esm/internal/slot.js +1 -1
  84. package/dist/esm/internal/use-anchor-position-at-point.js +122 -0
  85. package/dist/esm/internal/use-anchor-position.js +36 -16
  86. package/dist/esm/internal/use-focus-wrap.js +4 -1
  87. package/dist/esm/internal/use-initial-focus.js +1 -1
  88. package/dist/esm/placement-map/index.js +1 -1
  89. package/dist/esm/placement-map/legacy-placements.js +1 -100
  90. package/dist/esm/placement-map/placement-mapping.js +97 -0
  91. package/dist/esm/popover/popover.js +79 -80
  92. package/dist/esm/popover-surface/index.js +1 -0
  93. package/dist/esm/popover-surface/popover-surface.js +26 -0
  94. package/dist/esm/testing/polyfill.js +9 -6
  95. package/dist/esm/use-arrow-navigation/use-arrow-navigation.js +3 -1
  96. package/dist/types/animations/presets.d.ts +4 -4
  97. package/dist/types/animations/types.d.ts +1 -1
  98. package/dist/types/dialog/types.d.ts +0 -8
  99. package/dist/types/entry-points/focus.d.ts +4 -2
  100. package/dist/types/entry-points/get-aria-for-trigger.d.ts +1 -0
  101. package/dist/types/entry-points/popover-surface.d.ts +2 -0
  102. package/dist/types/entry-points/popover.d.ts +1 -1
  103. package/dist/types/entry-points/use-anchor-position-at-point.d.ts +1 -0
  104. package/dist/types/entry-points/use-popover-id.d.ts +11 -0
  105. package/dist/types/focus/get-first-focusable.d.ts +8 -0
  106. package/dist/types/focus/get-focusables.d.ts +13 -0
  107. package/dist/types/focus/get-last-focusable.d.ts +8 -0
  108. package/dist/types/focus/get-next-focusable.d.ts +13 -0
  109. package/dist/types/focus/is-in-same-layer.d.ts +8 -0
  110. package/dist/types/focus/is-nested-layer-focused.d.ts +8 -0
  111. package/dist/types/focus/selectors.d.ts +4 -0
  112. package/dist/types/focus/types.d.ts +5 -0
  113. package/dist/types/internal/get-aria-for-trigger.d.ts +86 -0
  114. package/dist/types/internal/role-to-aria-has-popup.d.ts +13 -0
  115. package/dist/types/internal/role-types.d.ts +0 -12
  116. package/dist/types/internal/should-focus-into-popover.d.ts +8 -0
  117. package/dist/types/internal/slot.d.ts +2 -2
  118. package/dist/types/internal/use-anchor-position-at-point.d.ts +62 -0
  119. package/dist/types/internal/use-anchor-position.d.ts +6 -1
  120. package/dist/types/placement-map/index.d.ts +1 -1
  121. package/dist/types/placement-map/legacy-placements.d.ts +0 -12
  122. package/dist/types/placement-map/placement-mapping.d.ts +13 -0
  123. package/dist/types/popover/index.d.ts +1 -1
  124. package/dist/types/popover/popover.d.ts +6 -13
  125. package/dist/types/popover/types.d.ts +6 -5
  126. package/dist/types/popover-surface/index.d.ts +2 -0
  127. package/dist/types/popover-surface/popover-surface.d.ts +21 -0
  128. package/dist/types/use-arrow-navigation/use-arrow-navigation.d.ts +1 -1
  129. package/dist/types-ts4.5/animations/presets.d.ts +4 -4
  130. package/dist/types-ts4.5/animations/types.d.ts +1 -1
  131. package/dist/types-ts4.5/dialog/types.d.ts +0 -8
  132. package/dist/types-ts4.5/entry-points/focus.d.ts +4 -2
  133. package/dist/types-ts4.5/entry-points/get-aria-for-trigger.d.ts +1 -0
  134. package/dist/types-ts4.5/entry-points/popover-surface.d.ts +2 -0
  135. package/dist/types-ts4.5/entry-points/popover.d.ts +1 -1
  136. package/dist/types-ts4.5/entry-points/use-anchor-position-at-point.d.ts +1 -0
  137. package/dist/types-ts4.5/entry-points/use-popover-id.d.ts +11 -0
  138. package/dist/types-ts4.5/focus/get-first-focusable.d.ts +8 -0
  139. package/dist/types-ts4.5/focus/get-focusables.d.ts +13 -0
  140. package/dist/types-ts4.5/focus/get-last-focusable.d.ts +8 -0
  141. package/dist/types-ts4.5/focus/get-next-focusable.d.ts +13 -0
  142. package/dist/types-ts4.5/focus/is-in-same-layer.d.ts +8 -0
  143. package/dist/types-ts4.5/focus/is-nested-layer-focused.d.ts +8 -0
  144. package/dist/types-ts4.5/focus/selectors.d.ts +4 -0
  145. package/dist/types-ts4.5/focus/types.d.ts +5 -0
  146. package/dist/types-ts4.5/internal/get-aria-for-trigger.d.ts +86 -0
  147. package/dist/types-ts4.5/internal/role-to-aria-has-popup.d.ts +13 -0
  148. package/dist/types-ts4.5/internal/role-types.d.ts +0 -12
  149. package/dist/types-ts4.5/internal/should-focus-into-popover.d.ts +8 -0
  150. package/dist/types-ts4.5/internal/slot.d.ts +2 -2
  151. package/dist/types-ts4.5/internal/use-anchor-position-at-point.d.ts +62 -0
  152. package/dist/types-ts4.5/internal/use-anchor-position.d.ts +6 -1
  153. package/dist/types-ts4.5/placement-map/index.d.ts +1 -1
  154. package/dist/types-ts4.5/placement-map/legacy-placements.d.ts +0 -12
  155. package/dist/types-ts4.5/placement-map/placement-mapping.d.ts +13 -0
  156. package/dist/types-ts4.5/popover/index.d.ts +1 -1
  157. package/dist/types-ts4.5/popover/popover.d.ts +6 -13
  158. package/dist/types-ts4.5/popover/types.d.ts +6 -5
  159. package/dist/types-ts4.5/popover-surface/index.d.ts +2 -0
  160. package/dist/types-ts4.5/popover-surface/popover-surface.d.ts +21 -0
  161. package/dist/types-ts4.5/use-arrow-navigation/use-arrow-navigation.d.ts +1 -1
  162. package/get-aria-for-trigger/package.json +17 -0
  163. package/package.json +3 -3
  164. package/popover-surface/package.json +17 -0
  165. package/use-anchor-position-at-point/package.json +17 -0
  166. package/use-popover-id/package.json +17 -0
  167. package/dist/cjs/entry-points/popup-surface.js +0 -12
  168. package/dist/cjs/entry-points/popup.js +0 -12
  169. package/dist/cjs/focus/focus.js +0 -169
  170. package/dist/cjs/focus/index.js +0 -24
  171. package/dist/cjs/popup/index.js +0 -37
  172. package/dist/cjs/popup/popup-content.js +0 -214
  173. package/dist/cjs/popup/popup-context.js +0 -25
  174. package/dist/cjs/popup/popup-provider.js +0 -15
  175. package/dist/cjs/popup/popup-trigger-function.js +0 -80
  176. package/dist/cjs/popup/popup-trigger.js +0 -66
  177. package/dist/cjs/popup/popup.js +0 -81
  178. package/dist/cjs/popup/types.js +0 -5
  179. package/dist/cjs/popup/use-maybe-popup-context.js +0 -17
  180. package/dist/cjs/popup/use-popup-context.js +0 -20
  181. package/dist/es2019/entry-points/popup-surface.js +0 -1
  182. package/dist/es2019/entry-points/popup.js +0 -1
  183. package/dist/es2019/focus/focus.js +0 -158
  184. package/dist/es2019/focus/index.js +0 -1
  185. package/dist/es2019/popup/index.js +0 -33
  186. package/dist/es2019/popup/popup-content.js +0 -206
  187. package/dist/es2019/popup/popup-context.js +0 -20
  188. package/dist/es2019/popup/popup-provider.js +0 -10
  189. package/dist/es2019/popup/popup-surface.js +0 -30
  190. package/dist/es2019/popup/popup-trigger-function.js +0 -75
  191. package/dist/es2019/popup/popup-trigger.js +0 -61
  192. package/dist/es2019/popup/popup.js +0 -67
  193. package/dist/es2019/popup/types.js +0 -1
  194. package/dist/es2019/popup/use-maybe-popup-context.js +0 -12
  195. package/dist/es2019/popup/use-popup-context.js +0 -15
  196. package/dist/esm/entry-points/popup-surface.js +0 -1
  197. package/dist/esm/entry-points/popup.js +0 -1
  198. package/dist/esm/focus/focus.js +0 -160
  199. package/dist/esm/focus/index.js +0 -1
  200. package/dist/esm/popup/index.js +0 -33
  201. package/dist/esm/popup/popup-content.js +0 -206
  202. package/dist/esm/popup/popup-context.js +0 -20
  203. package/dist/esm/popup/popup-provider.js +0 -10
  204. package/dist/esm/popup/popup-surface.js +0 -29
  205. package/dist/esm/popup/popup-trigger-function.js +0 -75
  206. package/dist/esm/popup/popup-trigger.js +0 -59
  207. package/dist/esm/popup/popup.js +0 -72
  208. package/dist/esm/popup/types.js +0 -1
  209. package/dist/esm/popup/use-maybe-popup-context.js +0 -12
  210. package/dist/esm/popup/use-popup-context.js +0 -15
  211. package/dist/types/entry-points/popup-surface.d.ts +0 -2
  212. package/dist/types/entry-points/popup.d.ts +0 -2
  213. package/dist/types/focus/focus.d.ts +0 -50
  214. package/dist/types/focus/index.d.ts +0 -2
  215. package/dist/types/popup/index.d.ts +0 -34
  216. package/dist/types/popup/popup-content.d.ts +0 -14
  217. package/dist/types/popup/popup-context.d.ts +0 -96
  218. package/dist/types/popup/popup-provider.d.ts +0 -10
  219. package/dist/types/popup/popup-surface.d.ts +0 -22
  220. package/dist/types/popup/popup-trigger-function.d.ts +0 -112
  221. package/dist/types/popup/popup-trigger.d.ts +0 -14
  222. package/dist/types/popup/popup.d.ts +0 -14
  223. package/dist/types/popup/types.d.ts +0 -321
  224. package/dist/types/popup/use-maybe-popup-context.d.ts +0 -8
  225. package/dist/types/popup/use-popup-context.d.ts +0 -7
  226. package/dist/types-ts4.5/entry-points/popup-surface.d.ts +0 -2
  227. package/dist/types-ts4.5/entry-points/popup.d.ts +0 -2
  228. package/dist/types-ts4.5/focus/focus.d.ts +0 -50
  229. package/dist/types-ts4.5/focus/index.d.ts +0 -2
  230. package/dist/types-ts4.5/popup/index.d.ts +0 -34
  231. package/dist/types-ts4.5/popup/popup-content.d.ts +0 -14
  232. package/dist/types-ts4.5/popup/popup-context.d.ts +0 -96
  233. package/dist/types-ts4.5/popup/popup-provider.d.ts +0 -10
  234. package/dist/types-ts4.5/popup/popup-surface.d.ts +0 -22
  235. package/dist/types-ts4.5/popup/popup-trigger-function.d.ts +0 -112
  236. package/dist/types-ts4.5/popup/popup-trigger.d.ts +0 -14
  237. package/dist/types-ts4.5/popup/popup.d.ts +0 -14
  238. package/dist/types-ts4.5/popup/types.d.ts +0 -321
  239. package/dist/types-ts4.5/popup/use-maybe-popup-context.d.ts +0 -8
  240. package/dist/types-ts4.5/popup/use-popup-context.d.ts +0 -7
  241. package/popup/package.json +0 -17
  242. package/popup-surface/package.json +0 -17
  243. /package/dist/cjs/{popup/popup-surface.compiled.css → popover-surface/popover-surface.compiled.css} +0 -0
  244. /package/dist/es2019/{popup/popup-surface.compiled.css → popover-surface/popover-surface.compiled.css} +0 -0
  245. /package/dist/esm/{popup/popup-surface.compiled.css → popover-surface/popover-surface.compiled.css} +0 -0
@@ -0,0 +1,13 @@
1
+ import type { TAriaHasPopupValue, TRoleRequiringAccessibleName, TRoleWithImplicitName } from './role-types';
2
+ /**
3
+ * Maps a popover content role to the correct `aria-haspopup` value
4
+ * for its trigger element.
5
+ *
6
+ * Returns `undefined` for roles that are not popups in the ARIA sense
7
+ * (`tooltip`, `note`, `status`, `alert`, `log`). Triggers for those roles
8
+ * should not announce a popup at all - emitting `aria-haspopup="dialog"`
9
+ * on a tooltip trigger would mislead assistive technology.
10
+ */
11
+ export declare function roleToAriaHasPopup({ role, }: {
12
+ role: TRoleRequiringAccessibleName | TRoleWithImplicitName | undefined;
13
+ }): TAriaHasPopupValue;
@@ -61,18 +61,6 @@ export type TAriaRoleOptional = ({
61
61
  } & TAccessibleNameRequired) | ({
62
62
  role?: TRoleWithImplicitName;
63
63
  } & TAccessibleNameOptional);
64
- /**
65
- * Maps a popover content role to the correct `aria-haspopup` value
66
- * for its trigger element.
67
- *
68
- * Returns `undefined` for roles that are not popups in the ARIA sense
69
- * (`tooltip`, `note`, `status`, `alert`, `log`). Triggers for those roles
70
- * should not announce a popup at all - emitting `aria-haspopup="dialog"`
71
- * on a tooltip trigger would mislead assistive technology.
72
- */
73
- export declare function roleToAriaHasPopup({ role, }: {
74
- role: TRoleRequiringAccessibleName | TRoleWithImplicitName | undefined;
75
- }): TAriaHasPopupValue;
76
64
  /**
77
65
  * Returns `true` when the given popover role moves focus into the popover
78
66
  * on open, and `false` otherwise (including when `role` is `undefined`).
@@ -0,0 +1,8 @@
1
+ import type { TRoleRequiringAccessibleName, TRoleWithImplicitName } from './role-types';
2
+ /**
3
+ * Returns `true` when the given popover role moves focus into the popover
4
+ * on open, and `false` otherwise (including when `role` is `undefined`).
5
+ */
6
+ export declare function shouldFocusIntoPopover({ role, }: {
7
+ role: TRoleRequiringAccessibleName | TRoleWithImplicitName | undefined;
8
+ }): boolean;
@@ -2,7 +2,7 @@ import { type ForwardRefExoticComponent, type ReactNode, type RefAttributes } fr
2
2
  /**
3
3
  * Extra DOM/event props are passed through to the cloned child.
4
4
  */
5
- export type TSlotProps = {
5
+ export type SlotProps = {
6
6
  children: ReactNode;
7
7
  } & Record<string, unknown>;
8
8
  /**
@@ -26,4 +26,4 @@ export type TSlotProps = {
26
26
  * </Slot>
27
27
  * ```
28
28
  */
29
- export declare const Slot: ForwardRefExoticComponent<TSlotProps & RefAttributes<HTMLElement>>;
29
+ export declare const Slot: ForwardRefExoticComponent<SlotProps & RefAttributes<HTMLElement>>;
@@ -0,0 +1,62 @@
1
+ import { type RefObject } from 'react';
2
+ import { type TPlacementOptions } from './resolve-placement';
3
+ /**
4
+ * A point in viewport coordinates (CSS pixels) at which the synthetic
5
+ * anchor should be placed.
6
+ *
7
+ * Axis-named (`x`/`y`) rather than edge-named (`left`/`top`) so the
8
+ * shape is unambiguous in RTL writing modes — there is no ambiguity
9
+ * about whether a coordinate is logical (`inline-start`/`block-start`)
10
+ * or physical (`left`/`top`). Viewport coordinates are always
11
+ * physical, so we name them with the physical axis labels.
12
+ */
13
+ export type TAnchorPoint = {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ /**
18
+ * Positions a popover at a consumer-supplied viewport coordinate using a
19
+ * hidden synthetic anchor.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * function PointPositionedPopover({ popoverRef, placement, mousePos }) {
24
+ * useAnchorPositionAtPoint({
25
+ * popoverRef,
26
+ * placement,
27
+ * isEnabled: Boolean(mousePos),
28
+ * getPoint: () => {
29
+ * if (!mousePos) return null;
30
+ * return { x: mousePos.clientX, y: mousePos.clientY };
31
+ * },
32
+ * });
33
+ * return <Popover ref={popoverRef}>...</Popover>;
34
+ * }
35
+ * ```
36
+ */
37
+ export declare function useAnchorPositionAtPoint({ popoverRef, placement, getPoint, isEnabled, }: {
38
+ /**
39
+ * Element being positioned. Passed to `useAnchorPosition`.
40
+ */
41
+ popoverRef: RefObject<HTMLElement | null>;
42
+ /**
43
+ * Where the popover sits relative to the anchor.
44
+ */
45
+ placement: TPlacementOptions;
46
+ /**
47
+ * Lazy callback returning the viewport coordinate to anchor at.
48
+ * Called once per activation (every `isEnabled: false → true`
49
+ * transition); the result is latched and not re-read.
50
+ *
51
+ * Return `null` to signal "no point yet" — the hook stays in a
52
+ * no-DOM state so another positioning strategy can own the popover.
53
+ *
54
+ * Read from a ref, so it does not need to be memoized.
55
+ */
56
+ getPoint: () => TAnchorPoint | null;
57
+ /**
58
+ * When `false`, the hook is a no-op: no synthetic anchor is created
59
+ * and no positioning is applied. Defaults to `true`.
60
+ */
61
+ isEnabled?: boolean;
62
+ }): void;
@@ -34,7 +34,7 @@ import { type TPlacementOptions } from '../internal/resolve-placement';
34
34
  * comparison is used internally so re-runs are skipped when the resolved
35
35
  * placement shape is unchanged.
36
36
  */
37
- export declare function useAnchorPosition({ anchorRef, popoverRef, placement, forceFallbackPositioning, }: {
37
+ export declare function useAnchorPosition({ anchorRef, popoverRef, placement, forceFallbackPositioning, isEnabled, }: {
38
38
  /**
39
39
  * Element to position relative to.
40
40
  */
@@ -70,4 +70,9 @@ export declare function useAnchorPosition({ anchorRef, popoverRef, placement, fo
70
70
  * behavior in any environment, including production.
71
71
  */
72
72
  forceFallbackPositioning?: boolean;
73
+ /**
74
+ * When `false`, the hook is a no-op and applies no positioning.
75
+ * Defaults to `true`.
76
+ */
77
+ isEnabled?: boolean;
73
78
  }): void;
@@ -1,5 +1,5 @@
1
1
  import { type TPlacementOptions } from '../internal/resolve-placement';
2
- import { type TLegacyPlacement } from './legacy-placements';
2
+ import type { TLegacyPlacement } from './legacy-placements';
3
3
  /**
4
4
  * Maps legacy Popper.js placement values to the new object-based
5
5
  * `Placement` values used by `@atlaskit/top-layer/popover`.
@@ -1,4 +1,3 @@
1
- import { type TPlacementOptions } from '../internal/resolve-placement';
2
1
  /**
3
2
  * Legacy Popper.js placement values (used by `@atlaskit/popper`,
4
3
  * `@atlaskit/popup`, `@atlaskit/tooltip`, etc.). Re-exported from
@@ -8,14 +7,3 @@ import { type TPlacementOptions } from '../internal/resolve-placement';
8
7
  */
9
8
  export declare const LEGACY_PLACEMENTS: readonly ["auto", "auto-start", "auto-end", "top", "top-start", "top-center", "top-end", "bottom", "bottom-start", "bottom-center", "bottom-end", "right", "right-start", "right-end", "left", "left-start", "left-end"];
10
9
  export type TLegacyPlacement = (typeof LEGACY_PLACEMENTS)[number];
11
- /**
12
- * The full mapping record. Internal - use `fromLegacyPlacement` from the
13
- * public entry-point so the offset-tuple translation is applied consistently.
14
- *
15
- * Note: `auto`, `auto-start`, `auto-end` map to `block-end` placements. This
16
- * is a reduction in expressiveness vs Popper.js (which picked the best
17
- * placement at runtime). CSS `position-try-fallbacks` flips at the edge but
18
- * the initial placement is fixed. Migration consumers who relied on Popper's
19
- * dynamic auto-flip should pick an explicit placement instead.
20
- */
21
- export declare const placementMapping: Record<TLegacyPlacement, TPlacementOptions>;
@@ -0,0 +1,13 @@
1
+ import { type TPlacementOptions } from '../internal/resolve-placement';
2
+ import type { TLegacyPlacement } from './legacy-placements';
3
+ /**
4
+ * The full mapping record. Internal - use `fromLegacyPlacement` from the
5
+ * public entry-point so the offset-tuple translation is applied consistently.
6
+ *
7
+ * Note: `auto`, `auto-start`, `auto-end` map to `block-end` placements. This
8
+ * is a reduction in expressiveness vs Popper.js (which picked the best
9
+ * placement at runtime). CSS `position-try-fallbacks` flips at the edge but
10
+ * the initial placement is fixed. Migration consumers who relied on Popper's
11
+ * dynamic auto-flip should pick an explicit placement instead.
12
+ */
13
+ export declare const placementMapping: Record<TLegacyPlacement, TPlacementOptions>;
@@ -1,3 +1,3 @@
1
1
  export { Popover } from './popover';
2
2
  export { createPopoverCloseEvent } from './create-close-event';
3
- export type { TPopoverCloseReason, TPopoverProps } from './types';
3
+ export type { TPopoverCloseReason, TPopoverProps, TPlacementOptions } from './types';
@@ -5,20 +5,13 @@
5
5
  import React from 'react';
6
6
  import { type TPopoverForwardedProps } from './types';
7
7
  /**
8
- * Unopinionated top-layer primitive.
8
+ * Unopinionated top-layer primitive. Manages visibility and animation only;
9
+ * compose with `useAnchorPosition` / `useWidthFromAnchor` for positioning.
9
10
  *
10
- * Manages only visibility (isOpen) and animation (animate). Has no knowledge
11
- * of positioning - compose with `useAnchorPosition` for anchor positioning
12
- * and optionally `useWidthFromAnchor` for setting the width of a popover element
13
- * relative to its anchor trigger.
11
+ * `isOpen={true}` calls `showPopover()` (entry via `@starting-style`);
12
+ * `isOpen={false}` calls `hidePopover()` (exit via `allow-discrete`).
14
13
  *
15
- * Visibility is driven by the `isOpen` prop:
16
- * - `isOpen={true}` → `showPopover()`, entry animation via `@starting-style`
17
- * - `isOpen={false}` → `hidePopover()`, exit animation via `allow-discrete`
18
- *
19
- * For `mode="auto"`, the browser can dismiss the popover via light dismiss
20
- * (Escape, click outside). When that happens, `onClose` is called and the
21
- * consumer must set `isOpen` to `false`. The DOM owns the dismiss; React
22
- * must follow.
14
+ * In `mode="auto"`, the browser can light-dismiss (Escape, click outside).
15
+ * `onClose` fires; the consumer must then set `isOpen` to `false`.
23
16
  */
24
17
  export declare const Popover: React.ForwardRefExoticComponent<TPopoverForwardedProps & React.RefAttributes<HTMLDivElement>>;
@@ -1,8 +1,8 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import { type StrictXCSSProp } from '@atlaskit/css';
3
3
  import { type TAnimationPreset } from '../animations/types';
4
+ import { type TPlacementOptions } from '../internal/resolve-placement';
4
5
  import { type TAriaRoleRequired, type TRoleRequiringAccessibleName, type TRoleWithImplicitName } from '../internal/role-types';
5
- import { type TPlacementOptions } from '../popup/types';
6
6
  /**
7
7
  * The reason a popover was closed.
8
8
  *
@@ -31,6 +31,7 @@ export type TPopoverForwardedProps = TPopoverBaseProps & {
31
31
  label?: string;
32
32
  labelledBy?: string;
33
33
  };
34
+ export type { TPlacementOptions };
34
35
  type TPopoverBaseProps = {
35
36
  children: ReactNode;
36
37
  /**
@@ -51,8 +52,9 @@ type TPopoverBaseProps = {
51
52
  testId?: string;
52
53
  /**
53
54
  * HTML `id` attribute for the popover element. When omitted, a unique ID
54
- * is generated automatically. The `<Popup>` compound passes its context ID
55
- * so that `Popup.Trigger` can reference it via `aria-controls` / `popovertarget`.
55
+ * is generated automatically. Pair the trigger with this ID via `aria-controls`
56
+ * and the popover with `popovertarget`. Use `usePopoverId()` to generate a
57
+ * stable, CSS-safe id.
56
58
  */
57
59
  id?: string;
58
60
  /**
@@ -109,7 +111,7 @@ type TPopoverBaseProps = {
109
111
  * Called after the entry animation completes (or immediately on open when
110
112
  * there is no animation or reduced motion is active).
111
113
  *
112
- * Use this for external lifecycle coordination — e.g. notifying a manager
114
+ * Use this for external lifecycle coordination - e.g. notifying a manager
113
115
  * that the show sequence is finished.
114
116
  */
115
117
  onEnterFinish?: () => void;
@@ -178,4 +180,3 @@ export type TPopoverProps = TPopoverBaseProps & TAriaRoleRequired & ({
178
180
  * Falls back to a one-off measurement of the anchor's width.
179
181
  */
180
182
  export type TWidthFromAnchorMode = 'none' | 'match-anchor' | 'min-anchor';
181
- export {};
@@ -0,0 +1,2 @@
1
+ export { PopoverSurface } from './popover-surface';
2
+ export type { TPopoverSurfaceProps } from './popover-surface';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @jsxRuntime classic
3
+ * @jsx jsx
4
+ */
5
+ import React, { type ReactNode } from 'react';
6
+ export type TPopoverSurfaceProps = {
7
+ children: ReactNode;
8
+ };
9
+ /**
10
+ * Optional styled wrapper for popover content.
11
+ *
12
+ * Adds default visual styling (background, border-radius, box-shadow)
13
+ * using design tokens.
14
+ *
15
+ * Presentational primitive - `children`-only by design. This component
16
+ * intentionally exposes no `style`, `className`, `xcss`, `id`, or `ref`
17
+ * props. If you need any of those, render your own wrapper element inside
18
+ * `Popover` instead. `PopoverSurface` is the no-config "give me the default
19
+ * ADS overlay look" surface, nothing more.
20
+ */
21
+ export declare function PopoverSurface({ children }: TPopoverSurfaceProps): React.ReactElement;
@@ -1,5 +1,5 @@
1
1
  import { type RefObject } from 'react';
2
- import { type TFocusableFilter } from '../focus';
2
+ import { type TFocusableFilter } from '../focus/types';
3
3
  /**
4
4
  * Args for `useArrowNavigation`.
5
5
  *
@@ -18,10 +18,10 @@ type TSlideAndFadeOptions = {
18
18
  * import { slideAndFade } from '@atlaskit/top-layer/animations';
19
19
  *
20
20
  * // Default 4px slide (tooltip)
21
- * <Popup.Content animate={slideAndFade()} />
21
+ * <Popover animate={slideAndFade()} />
22
22
  *
23
23
  * // Custom 8px slide (popup / dropdown)
24
- * <Popup.Content animate={slideAndFade({ distance: 8 })} />
24
+ * <Popover animate={slideAndFade({ distance: 8 })} />
25
25
  * ```
26
26
  */
27
27
  export declare function slideAndFade(options?: TSlideAndFadeOptions): TAnimationPreset;
@@ -34,7 +34,7 @@ export declare function slideAndFade(options?: TSlideAndFadeOptions): TAnimation
34
34
  * ```tsx
35
35
  * import { fade } from '@atlaskit/top-layer/animations';
36
36
  *
37
- * <Popup.Content animate={fade()} />
37
+ * <Popover animate={fade()} />
38
38
  * ```
39
39
  */
40
40
  export declare function fade(): TAnimationPreset;
@@ -47,7 +47,7 @@ export declare function fade(): TAnimationPreset;
47
47
  * ```tsx
48
48
  * import { scaleAndFade } from '@atlaskit/top-layer/animations';
49
49
  *
50
- * <Popup.Content animate={scaleAndFade()} />
50
+ * <Popover animate={scaleAndFade()} />
51
51
  * ```
52
52
  */
53
53
  export declare function scaleAndFade(): TAnimationPreset;
@@ -1,4 +1,4 @@
1
- import type { TPlacementOptions } from '../popup/types';
1
+ import type { TPlacementOptions } from '../internal/resolve-placement';
2
2
  /**
3
3
  * A self-contained animation preset for top-layer elements (popovers and dialogs).
4
4
  *
@@ -49,14 +49,6 @@ type TDialogBaseProps = {
49
49
  * Additional inline styles applied to the `<dialog>` element.
50
50
  *
51
51
  * Use for custom width, height, transform, or other overrides.
52
- *
53
- * Rule deviation: the house rules ban unbounded `style` props on
54
- * components. `Dialog` is a low-level primitive that intentionally has
55
- * no visual opinions of its own; consumers such as `@atlaskit/modal-dialog`
56
- * must be able to set width, height, and transforms on the native
57
- * `<dialog>` element. Removing this prop would be a breaking change
58
- * and is tracked separately. Keep until an xcss-based replacement
59
- * exists on the primitive.
60
52
  */
61
53
  style?: CSSProperties;
62
54
  /**
@@ -1,2 +1,4 @@
1
- export { getFirstFocusable, getLastFocusable, getNextFocusable } from '../focus';
2
- export type { TFocusableFilter } from '../focus';
1
+ export type { TFocusableFilter } from '../focus/types';
2
+ export { getFirstFocusable } from '../focus/get-first-focusable';
3
+ export { getLastFocusable } from '../focus/get-last-focusable';
4
+ export { getNextFocusable } from '../focus/get-next-focusable';
@@ -0,0 +1 @@
1
+ export { getAriaForTrigger } from '../internal/get-aria-for-trigger';
@@ -0,0 +1,2 @@
1
+ export { PopoverSurface } from '../popover-surface';
2
+ export type { TPopoverSurfaceProps } from '../popover-surface';
@@ -1,2 +1,2 @@
1
1
  export { Popover } from '../popover';
2
- export type { TPopoverProps, TPopoverCloseReason } from '../popover';
2
+ export type { TPopoverProps, TPopoverCloseReason, TPlacementOptions } from '../popover';
@@ -0,0 +1 @@
1
+ export { useAnchorPositionAtPoint, type TAnchorPoint, } from '../internal/use-anchor-position-at-point';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Returns a stable HTML `id` used to wire a trigger element to its popover
3
+ * via ARIA (`aria-controls`) and the Popover API (`popovertarget`).
4
+ *
5
+ * The returned value is intended for the `id` attribute on the popover and
6
+ * for the matching `aria-controls` / `popovertarget` references on the
7
+ * trigger. It is NOT a CSS `anchor-name` value: CSS anchor positioning is
8
+ * handled internally by `useAnchorPosition`, which mints and applies its
9
+ * own `anchor-name` on the trigger element.
10
+ */
11
+ export declare function usePopoverId(): string;
@@ -0,0 +1,8 @@
1
+ import type { TFocusableFilter } from './types';
2
+ /**
3
+ * Returns the first focusable element within the container.
4
+ */
5
+ export declare function getFirstFocusable({ container, filter, }: {
6
+ container: HTMLElement;
7
+ filter?: TFocusableFilter;
8
+ }): HTMLElement | null;
@@ -0,0 +1,13 @@
1
+ import type { TFocusableFilter } from './types';
2
+ /**
3
+ * Returns all focusable HTMLElements within the container, optionally filtered.
4
+ *
5
+ * Focusables that belong to a nested top-layer scope (a `[popover]` or
6
+ * `<dialog>` descendant of the container) are excluded - those elements
7
+ * are owned by the inner layer's focus management. The container itself
8
+ * is allowed to be a popover/dialog; only nested ones are filtered.
9
+ */
10
+ export declare function getFocusables({ container, filter, }: {
11
+ container: HTMLElement;
12
+ filter?: TFocusableFilter;
13
+ }): HTMLElement[];
@@ -0,0 +1,8 @@
1
+ import type { TFocusableFilter } from './types';
2
+ /**
3
+ * Returns the last focusable element within the container.
4
+ */
5
+ export declare function getLastFocusable({ container, filter, }: {
6
+ container: HTMLElement;
7
+ filter?: TFocusableFilter;
8
+ }): HTMLElement | null;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Returns the next focusable element in the given direction relative to the
3
+ * currently focused element within the container. Wraps around at both ends.
4
+ *
5
+ * Returns `null` if there is no focused element within the container or if
6
+ * the focused element is not in the list of focusable elements.
7
+ */
8
+ import type { TFocusableFilter } from './types';
9
+ export declare function getNextFocusable({ container, direction, filter, }: {
10
+ container: HTMLElement;
11
+ direction: 'forwards' | 'backwards';
12
+ filter?: TFocusableFilter;
13
+ }): HTMLElement | null;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns true when `element` and `container` resolve to the same nearest
3
+ * top-layer host (or both resolve to `null`, meaning the document layer).
4
+ */
5
+ export declare function isInSameLayer({ element, container, }: {
6
+ element: HTMLElement;
7
+ container: HTMLElement;
8
+ }): boolean;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Returns `true` when `document.activeElement` is inside a nested top-layer
3
+ * descendant of `container` (a `[popover]`, `<dialog>`, `[role="dialog"]` or
4
+ * `[role="alertdialog"]` that is itself a descendant of `container`).
5
+ */
6
+ export declare function isNestedLayerFocused({ container }: {
7
+ container: HTMLElement;
8
+ }): boolean;
@@ -0,0 +1,4 @@
1
+ export declare const selectors: {
2
+ focusable: string;
3
+ focused: string;
4
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * An optional callback to restrict which focusable elements are included.
3
+ * Return `true` to include the element, `false` to skip it.
4
+ */
5
+ export type TFocusableFilter = (element: HTMLElement, container: HTMLElement) => boolean;
@@ -0,0 +1,86 @@
1
+ import { type TAriaHasPopupValue, type TRoleRequiringAccessibleName } from './role-types';
2
+ /**
3
+ * Roles accepted by `getAriaForTrigger`.
4
+ *
5
+ * Excludes tooltip-family roles (`tooltip`, `note`, `status`, `alert`, `log`)
6
+ * because the correct trigger wiring for those is `aria-describedby`, not
7
+ * `aria-haspopup` / `aria-expanded` / `aria-controls`. Use `aria-describedby`
8
+ * manually for tooltip triggers.
9
+ */
10
+ type TAriaForTriggerRole = TRoleRequiringAccessibleName | 'listbox' | 'tree' | 'grid';
11
+ type TGetAriaForTriggerOptions = {
12
+ /**
13
+ * The `role` that will be set on the `<Popover>` element. Used to derive
14
+ * the correct `aria-haspopup` value for the trigger.
15
+ */
16
+ role: TAriaForTriggerRole;
17
+ /**
18
+ * Whether the popover is currently open. Drives `aria-expanded`.
19
+ */
20
+ isOpen: boolean;
21
+ /**
22
+ * The popover identifier - the value returned by `usePopoverId()`,
23
+ * passed as `id` to `<Popover>` and referenced here via `aria-controls`.
24
+ */
25
+ popoverId: string;
26
+ };
27
+ /**
28
+ * Non-undefined subset of `TAriaHasPopupValue`. Every role accepted by
29
+ * `getAriaForTrigger` maps to a concrete `aria-haspopup` string, so the
30
+ * trigger always receives a defined attribute value.
31
+ */
32
+ type TAriaHasPopupForTrigger = Exclude<TAriaHasPopupValue, undefined>;
33
+ type TAriaForTrigger = {
34
+ 'aria-haspopup': TAriaHasPopupForTrigger;
35
+ 'aria-expanded': boolean;
36
+ 'aria-controls': string;
37
+ };
38
+ /**
39
+ * Returns the ARIA attributes to spread onto a click-activated popover trigger.
40
+ *
41
+ * Centralises three attributes that are easy to forget or get wrong individually:
42
+ *
43
+ * - `aria-haspopup` - derived from the popover's role (e.g. `dialog → "dialog"`,
44
+ * `menu → "menu"`, `tooltip → undefined`). React omits the attribute when
45
+ * the value is `undefined`.
46
+ * - `aria-expanded` - reflects the current open state.
47
+ * - `aria-controls` - references the popover element by its id, even
48
+ * while the popover is closed. The relationship is stable; `aria-expanded`
49
+ * carries the current visibility state.
50
+ *
51
+ * **This function is for click/keyboard-activated popovers only.** For
52
+ * hover-driven tooltips, the trigger should use `aria-describedby` instead.
53
+ *
54
+ * @example
55
+ * ```tsx
56
+ * import { getAriaForTrigger } from '@atlaskit/top-layer/get-aria-for-trigger';
57
+ * import { usePopoverId } from '@atlaskit/top-layer/use-popover-id';
58
+ *
59
+ * const popoverId = usePopoverId();
60
+ * const [isOpen, setIsOpen] = useState(false);
61
+ *
62
+ * return (
63
+ * <>
64
+ * <button
65
+ * ref={triggerRef}
66
+ * onClick={() => setIsOpen((previous) => !previous)}
67
+ * {...getAriaForTrigger({ role: 'dialog', isOpen, popoverId })}
68
+ * >
69
+ * Open
70
+ * </button>
71
+ * <Popover
72
+ * id={popoverId}
73
+ * role="dialog"
74
+ * label="My dialog"
75
+ * isOpen={isOpen}
76
+ * triggerRef={triggerRef}
77
+ * onClose={() => setIsOpen(false)}
78
+ * >
79
+ * …
80
+ * </Popover>
81
+ * </>
82
+ * );
83
+ * ```
84
+ */
85
+ export declare function getAriaForTrigger({ role, isOpen, popoverId, }: TGetAriaForTriggerOptions): TAriaForTrigger;
86
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { TAriaHasPopupValue, TRoleRequiringAccessibleName, TRoleWithImplicitName } from './role-types';
2
+ /**
3
+ * Maps a popover content role to the correct `aria-haspopup` value
4
+ * for its trigger element.
5
+ *
6
+ * Returns `undefined` for roles that are not popups in the ARIA sense
7
+ * (`tooltip`, `note`, `status`, `alert`, `log`). Triggers for those roles
8
+ * should not announce a popup at all - emitting `aria-haspopup="dialog"`
9
+ * on a tooltip trigger would mislead assistive technology.
10
+ */
11
+ export declare function roleToAriaHasPopup({ role, }: {
12
+ role: TRoleRequiringAccessibleName | TRoleWithImplicitName | undefined;
13
+ }): TAriaHasPopupValue;
@@ -61,18 +61,6 @@ export type TAriaRoleOptional = ({
61
61
  } & TAccessibleNameRequired) | ({
62
62
  role?: TRoleWithImplicitName;
63
63
  } & TAccessibleNameOptional);
64
- /**
65
- * Maps a popover content role to the correct `aria-haspopup` value
66
- * for its trigger element.
67
- *
68
- * Returns `undefined` for roles that are not popups in the ARIA sense
69
- * (`tooltip`, `note`, `status`, `alert`, `log`). Triggers for those roles
70
- * should not announce a popup at all - emitting `aria-haspopup="dialog"`
71
- * on a tooltip trigger would mislead assistive technology.
72
- */
73
- export declare function roleToAriaHasPopup({ role, }: {
74
- role: TRoleRequiringAccessibleName | TRoleWithImplicitName | undefined;
75
- }): TAriaHasPopupValue;
76
64
  /**
77
65
  * Returns `true` when the given popover role moves focus into the popover
78
66
  * on open, and `false` otherwise (including when `role` is `undefined`).
@@ -0,0 +1,8 @@
1
+ import type { TRoleRequiringAccessibleName, TRoleWithImplicitName } from './role-types';
2
+ /**
3
+ * Returns `true` when the given popover role moves focus into the popover
4
+ * on open, and `false` otherwise (including when `role` is `undefined`).
5
+ */
6
+ export declare function shouldFocusIntoPopover({ role, }: {
7
+ role: TRoleRequiringAccessibleName | TRoleWithImplicitName | undefined;
8
+ }): boolean;
@@ -2,7 +2,7 @@ import { type ForwardRefExoticComponent, type ReactNode, type RefAttributes } fr
2
2
  /**
3
3
  * Extra DOM/event props are passed through to the cloned child.
4
4
  */
5
- export type TSlotProps = {
5
+ export type SlotProps = {
6
6
  children: ReactNode;
7
7
  } & Record<string, unknown>;
8
8
  /**
@@ -26,4 +26,4 @@ export type TSlotProps = {
26
26
  * </Slot>
27
27
  * ```
28
28
  */
29
- export declare const Slot: ForwardRefExoticComponent<TSlotProps & RefAttributes<HTMLElement>>;
29
+ export declare const Slot: ForwardRefExoticComponent<SlotProps & RefAttributes<HTMLElement>>;