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