@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,44 @@
1
+ # @atlaskit/top-layer
2
+
3
+ ## 0.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`f0bc04c9aec75`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f0bc04c9aec75) -
8
+ Creation of `@atlaskit/top-layer` — low-level layering primitives built on native browser APIs.
9
+
10
+ Provides three core building blocks for layered UI:
11
+ - **`Popover`** — Wraps the native Popover API (`popover="auto"`). Manages visibility, animation,
12
+ focus wrapping, and initial focus.
13
+ - **`Dialog`** — Wraps the native `<dialog>` element. Manages `showModal()`/`close()`, animation,
14
+ focus trapping, Escape handling, and backdrop click detection.
15
+ - **`Popup`** — Compound component (`Popup` + `Popup.Trigger` + `Popup.Content` + `Popup.Surface`)
16
+ composing Popover with CSS Anchor Positioning, trigger wiring, and automatic ARIA attributes.
17
+
18
+ Key design decisions:
19
+ - Browser-native first: Popover API and `<dialog>` instead of portals, z-index, and custom
20
+ layering
21
+ - CSS-first positioning: CSS Anchor Positioning with a JS fallback for older browsers
22
+ - CSS-first animation: `@starting-style` for entry, `transition-behavior: allow-discrete` for exit
23
+ - Accessibility by construction: TypeScript discriminated unions enforce WCAG 4.1.2 at compile
24
+ time
25
+ - Entry-point friendly for Volt: each primitive available via its own entry point
26
+
27
+ ### Patch Changes
28
+
29
+ - [`f0bc04c9aec75`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f0bc04c9aec75) -
30
+ Fix JS fallback positioning in Firefox: defer position calculation to requestAnimationFrame in the
31
+ toggle event handler, since Firefox fires the toggle event synchronously during showPopover()
32
+ before layout runs, causing offsetWidth/offsetHeight to be 0. Also remove the unnecessary initial
33
+ update() call that ran while the popover was still hidden. Fix VR tests to actually open the popup
34
+ before taking snapshots (they were previously only capturing the closed trigger button). Add
35
+ additional JS fallback VR tests for align-end and inline-end alignment variants.
36
+ - [`f0bc04c9aec75`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/f0bc04c9aec75) -
37
+ Defer useAnchorPosition cleanup via queueMicrotask to prevent one-frame position jump during exit
38
+ animations
39
+
40
+ ## 0.0.1
41
+
42
+ ### Patch Changes
43
+
44
+ - Initial release of `@atlaskit/top-layer`.
package/README.md ADDED
@@ -0,0 +1,151 @@
1
+ # @atlaskit/top-layer
2
+
3
+ Low-level top-layer primitives using the native
4
+ [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API) (`popover="auto"`) and
5
+ [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) element.
6
+
7
+ ## Popup
8
+
9
+ Compound component for rendering content in the browser's top layer with CSS Anchor Positioning.
10
+ Placement is owned by this compound: root provides it via context, Content applies it (CSS Anchor
11
+ Positioning or JS fallback).
12
+
13
+ ```tsx
14
+ <Popup placement="block-end" onClose={handleClose}>
15
+ <Popup.Trigger>
16
+ <button>Open</button>
17
+ </Popup.Trigger>
18
+ <Popup.Content role="dialog" label="My popup">
19
+ Content here
20
+ </Popup.Content>
21
+ </Popup>
22
+ ```
23
+
24
+ For default overlay styling (background, shadow, border-radius), see `PopupSurface` in the package examples (not currently a public API; we may expose it in a future release).
25
+
26
+ ## Popover
27
+
28
+ Low-level primitive: a `<div>` with the `popover` attribute and show/hide lifecycle only. No
29
+ placement, no trigger wiring — use it when you need top-layer rendering with **fixed or
30
+ custom positioning** (e.g. Flag uses `Popover mode="manual"`). For anchor-positioned content
31
+ next to a trigger, use **Popup** instead.
32
+
33
+ ## Dialog
34
+
35
+ Compound component for modal dialogs using the native `<dialog>` element with `.showModal()`.
36
+
37
+ ```tsx
38
+ {
39
+ isOpen && (
40
+ <Dialog onClose={handleClose} width="medium">
41
+ <Dialog.Content>
42
+ <Dialog.Surface>
43
+ <Dialog.Header>
44
+ <Dialog.Title>Heading</Dialog.Title>
45
+ <Dialog.CloseButton />
46
+ </Dialog.Header>
47
+ <Dialog.Body>Content</Dialog.Body>
48
+ <Dialog.Footer>Actions</Dialog.Footer>
49
+ </Dialog.Surface>
50
+ </Dialog.Content>
51
+ </Dialog>
52
+ );
53
+ }
54
+ ```
55
+
56
+ ## Animations
57
+
58
+ Both Popup (and the low-level Popover) and Dialog support CSS-based entry/exit animations via the
59
+ `animate` prop. Animations
60
+ use [`@starting-style`](https://developer.mozilla.org/en-US/docs/Web/CSS/@starting-style) for entry
61
+ and [`allow-discrete`](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior) on
62
+ `display`/`overlay` for exit — no JavaScript animation coordination required.
63
+
64
+ Presets are available from `@atlaskit/top-layer/animations`:
65
+
66
+ ```tsx
67
+ import {
68
+ // Popover presets
69
+ slideAndFade,
70
+ fade,
71
+ scaleAndFade,
72
+ // Dialog presets
73
+ dialogSlideUpAndFade,
74
+ dialogFade,
75
+ } from '@atlaskit/top-layer/animations';
76
+ ```
77
+
78
+ ### Popup animation
79
+
80
+ Pass a preset to `Popup.Content` (or to `Popover` when using the low-level primitive without
81
+ placement):
82
+
83
+ ```tsx
84
+ import { slideAndFade } from '@atlaskit/top-layer/animations';
85
+
86
+ const animation = slideAndFade();
87
+
88
+ <Popup.Content animate={animation} role="dialog" label="My popup">
89
+ Content
90
+ </Popup.Content>;
91
+ ```
92
+
93
+ For overlay styling (background, shadow, border-radius), see the `PopupSurface` usage in the package examples.
94
+
95
+ Available popover presets:
96
+
97
+ - `slideAndFade({ distance? })` — directional slide + opacity (default for tooltip)
98
+ - `fade` — simple opacity transition
99
+ - `scaleAndFade` — scale from 0.95 + opacity (suitable for menus/dropdowns)
100
+
101
+ ### Dialog animation
102
+
103
+ Pass a preset to `Dialog.Content`:
104
+
105
+ ```tsx
106
+ import { dialogSlideUpAndFade } from '@atlaskit/top-layer/animations';
107
+
108
+ const animation = dialogSlideUpAndFade();
109
+
110
+ <Dialog.Content animate={animation}>
111
+ <Dialog.Surface>...</Dialog.Surface>
112
+ </Dialog.Content>;
113
+ ```
114
+
115
+ Available dialog presets:
116
+
117
+ - `dialogSlideUpAndFade({ distance? })` — slide up + opacity with backdrop fade (matches legacy
118
+ modal entrance)
119
+ - `dialogFade` — simple opacity + backdrop fade
120
+
121
+ ### Progressive enhancement
122
+
123
+ Browsers without `@starting-style` support will show/hide elements instantly — no broken state. The
124
+ `prefers-reduced-motion: reduce` media query sets all transition durations to `0s`.
125
+
126
+ ## Accessibility
127
+
128
+ Browser tests in `__tests__/playwright/` verify the following WCAG 2.2 success criteria. See
129
+ [`notes/goals/accessibility-criteria.md`](notes/goals/accessibility-criteria.md) and
130
+ [`notes/audits/accessibility-audit-report.md`](notes/audits/accessibility-audit-report.md) for
131
+ details.
132
+
133
+ | A11y criterion | Browser test |
134
+ | ------------------------------------- | ------------ |
135
+ | 1.3.1 Info and Relationships | ✓ |
136
+ | 1.3.2 Meaningful Sequence | ✓ |
137
+ | 2.1.1 Keyboard | ✓ |
138
+ | 2.1.2 No Keyboard Trap | ✓ |
139
+ | 2.4.3 Focus Order | ✓ |
140
+ | 2.4.7 Focus Visible | ✓ |
141
+ | 2.4.11 Focus Not Obscured | ✓ |
142
+ | 3.2.1 On Focus | ✓ |
143
+ | 4.1.2 Name, Role, Value | ✓ |
144
+ | 4.1.3 Status Messages | ✓ |
145
+ | Background inertness (modal dialogs) | ✓ |
146
+ | Close reasons (Dialog) | ✓ |
147
+
148
+ ## Documentation
149
+
150
+ See [`notes/`](notes/) for project documentation, architecture decisions, migration records, and
151
+ audit reports. The [`notes/README.md`](notes/README.md) provides a full index.
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@atlaskit/top-layer/animations",
3
+ "main": "../dist/cjs/entry-points/animations.js",
4
+ "module": "../dist/esm/entry-points/animations.js",
5
+ "module:es2019": "../dist/es2019/entry-points/animations.js",
6
+ "sideEffects": [
7
+ "*.compiled.css"
8
+ ],
9
+ "types": "../dist/types/entry-points/animations.d.ts",
10
+ "typesVersions": {
11
+ ">=4.5 <5.9": {
12
+ "*": [
13
+ "../dist/types-ts4.5/entry-points/animations.d.ts"
14
+ ]
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@atlaskit/top-layer/arrow",
3
+ "main": "../dist/cjs/entry-points/arrow.js",
4
+ "module": "../dist/esm/entry-points/arrow.js",
5
+ "module:es2019": "../dist/es2019/entry-points/arrow.js",
6
+ "sideEffects": [
7
+ "*.compiled.css"
8
+ ],
9
+ "types": "../dist/types/entry-points/arrow.d.ts",
10
+ "typesVersions": {
11
+ ">=4.5 <5.9": {
12
+ "*": [
13
+ "../dist/types-ts4.5/entry-points/arrow.d.ts"
14
+ ]
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,17 @@
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
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@atlaskit/top-layer/dialog",
3
+ "main": "../dist/cjs/entry-points/dialog.js",
4
+ "module": "../dist/esm/entry-points/dialog.js",
5
+ "module:es2019": "../dist/es2019/entry-points/dialog.js",
6
+ "sideEffects": [
7
+ "*.compiled.css"
8
+ ],
9
+ "types": "../dist/types/entry-points/dialog.d.ts",
10
+ "typesVersions": {
11
+ ">=4.5 <5.9": {
12
+ "*": [
13
+ "../dist/types-ts4.5/entry-points/dialog.d.ts"
14
+ ]
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@atlaskit/top-layer/dialog-scroll-lock",
3
+ "main": "../dist/cjs/entry-points/dialog-scroll-lock.js",
4
+ "module": "../dist/esm/entry-points/dialog-scroll-lock.js",
5
+ "module:es2019": "../dist/es2019/entry-points/dialog-scroll-lock.js",
6
+ "sideEffects": [
7
+ "*.compiled.css"
8
+ ],
9
+ "types": "../dist/types/entry-points/dialog-scroll-lock.d.ts",
10
+ "typesVersions": {
11
+ ">=4.5 <5.9": {
12
+ "*": [
13
+ "../dist/types-ts4.5/entry-points/dialog-scroll-lock.d.ts"
14
+ ]
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.dialogFade = dialogFade;
7
+ exports.dialogSlideUpAndFade = dialogSlideUpAndFade;
8
+ exports.fade = fade;
9
+ exports.scaleAndFade = scaleAndFade;
10
+ exports.slideAndFade = slideAndFade;
11
+ var _useAnchorPositioning = require("../internal/use-anchor-positioning");
12
+ // ── slideAndFade ──
13
+
14
+ function getSlideAndFadeProperties(_ref) {
15
+ var placement = _ref.placement,
16
+ distance = _ref.distance;
17
+ var pos = "".concat(distance, "px");
18
+ var neg = "-".concat(distance, "px");
19
+ var _getPlacement = (0, _useAnchorPositioning.getPlacement)({
20
+ placement: placement
21
+ }),
22
+ axis = _getPlacement.axis,
23
+ edge = _getPlacement.edge;
24
+ if (axis === 'block' && edge === 'start') {
25
+ return {
26
+ '--ds-popover-tx': '0',
27
+ '--ds-popover-ty': pos
28
+ };
29
+ }
30
+ if (axis === 'block' && edge === 'end') {
31
+ return {
32
+ '--ds-popover-tx': '0',
33
+ '--ds-popover-ty': neg
34
+ };
35
+ }
36
+ if (axis === 'inline' && edge === 'start') {
37
+ return {
38
+ '--ds-popover-tx': pos,
39
+ '--ds-popover-ty': '0'
40
+ };
41
+ }
42
+ if (axis === 'inline' && edge === 'end') {
43
+ return {
44
+ '--ds-popover-tx': neg,
45
+ '--ds-popover-ty': '0'
46
+ };
47
+ }
48
+ return {
49
+ '--ds-popover-tx': '0',
50
+ '--ds-popover-ty': neg
51
+ };
52
+ }
53
+ var SLIDE_AND_FADE_CSS = "\n[data-ds-popover-slide-and-fade] {\n opacity: 0;\n transform: translate3d(var(--ds-popover-tx, 0), var(--ds-popover-ty, 0), 0);\n transition:\n opacity 175ms cubic-bezier(0.15, 1, 0.3, 1),\n transform 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-popover-slide-and-fade]:popover-open {\n opacity: 1;\n transform: none;\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-popover-slide-and-fade]:popover-open {\n opacity: 0;\n transform: translate3d(var(--ds-popover-tx, 0), var(--ds-popover-ty, 0), 0);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-popover-slide-and-fade],\n [data-ds-popover-slide-and-fade]:popover-open {\n transition-duration: 0s;\n }\n}\n";
54
+
55
+ /**
56
+ * Directional slide + opacity animation.
57
+ *
58
+ * The popover slides in from the direction opposite its placement edge
59
+ * (e.g. a `block-end` popover slides down from above).
60
+ *
61
+ * @param options.distance - Slide distance in pixels. Defaults to `4`.
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * import { slideAndFade } from '@atlaskit/top-layer/animations';
66
+ *
67
+ * // Default 4px slide (tooltip)
68
+ * <Popup.Content animate={slideAndFade()} />
69
+ *
70
+ * // Custom 8px slide (popup / dropdown)
71
+ * <Popup.Content animate={slideAndFade({ distance: 8 })} />
72
+ * ```
73
+ */
74
+ function slideAndFade(options) {
75
+ var _options$distance;
76
+ var distance = (_options$distance = options === null || options === void 0 ? void 0 : options.distance) !== null && _options$distance !== void 0 ? _options$distance : 4;
77
+ return {
78
+ name: 'slide-and-fade',
79
+ css: SLIDE_AND_FADE_CSS,
80
+ getProperties: function getProperties(_ref2) {
81
+ var placement = _ref2.placement;
82
+ return getSlideAndFadeProperties({
83
+ placement: placement,
84
+ distance: distance
85
+ });
86
+ },
87
+ exitDurationMs: 175
88
+ };
89
+ }
90
+
91
+ // ── fade ──
92
+
93
+ var FADE_CSS = "\n[data-ds-popover-fade] {\n opacity: 0;\n transition:\n opacity 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-popover-fade]:popover-open {\n opacity: 1;\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-popover-fade]:popover-open {\n opacity: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-popover-fade],\n [data-ds-popover-fade]:popover-open {\n transition-duration: 0s;\n }\n}\n";
94
+
95
+ /**
96
+ * Simple opacity transition, no transform.
97
+ *
98
+ * Suitable for popup dialogs or content that does not need directional motion.
99
+ *
100
+ * @example
101
+ * ```tsx
102
+ * import { fade } from '@atlaskit/top-layer/animations';
103
+ *
104
+ * <Popup.Content animate={fade()} />
105
+ * ```
106
+ */
107
+ function fade() {
108
+ return {
109
+ name: 'fade',
110
+ css: FADE_CSS,
111
+ exitDurationMs: 175
112
+ };
113
+ }
114
+
115
+ // ── scaleAndFade ──
116
+
117
+ var SCALE_AND_FADE_CSS = "\n[data-ds-popover-scale-and-fade] {\n opacity: 0;\n transform: scale(0.95);\n transition:\n opacity 175ms cubic-bezier(0.15, 1, 0.3, 1),\n transform 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-popover-scale-and-fade]:popover-open {\n opacity: 1;\n transform: none;\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-popover-scale-and-fade]:popover-open {\n opacity: 0;\n transform: scale(0.95);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-popover-scale-and-fade],\n [data-ds-popover-scale-and-fade]:popover-open {\n transition-duration: 0s;\n }\n}\n";
118
+
119
+ /**
120
+ * Scale from 0.95 + opacity transition.
121
+ *
122
+ * Suitable for menus, dropdowns, and select options.
123
+ *
124
+ * @example
125
+ * ```tsx
126
+ * import { scaleAndFade } from '@atlaskit/top-layer/animations';
127
+ *
128
+ * <Popup.Content animate={scaleAndFade()} />
129
+ * ```
130
+ */
131
+ function scaleAndFade() {
132
+ return {
133
+ name: 'scale-and-fade',
134
+ css: SCALE_AND_FADE_CSS,
135
+ exitDurationMs: 175
136
+ };
137
+ }
138
+
139
+ // ══════════════════════════════════════════════════════════════════════════════
140
+ // Dialog presets
141
+ // ══════════════════════════════════════════════════════════════════════════════
142
+
143
+ // ── dialogSlideUpAndFade ──
144
+
145
+ var DIALOG_SLIDE_UP_AND_FADE_CSS = "\n[data-ds-dialog-slide-up-and-fade] {\n opacity: 0;\n transform: translateY(calc(-1 * var(--ds-dialog-ty, 12px)));\n transition:\n opacity 175ms cubic-bezier(0.15, 1, 0.3, 1),\n transform 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-dialog-slide-up-and-fade][open] {\n opacity: 1;\n transform: none;\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-dialog-slide-up-and-fade][open] {\n opacity: 0;\n transform: translateY(var(--ds-dialog-ty, 12px));\n }\n}\n\n[data-ds-dialog-slide-up-and-fade]::backdrop {\n background-color: transparent;\n transition:\n background-color 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-dialog-slide-up-and-fade][open]::backdrop {\n background-color: var(--ds-blanket, #050C1F75);\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-dialog-slide-up-and-fade][open]::backdrop {\n background-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-dialog-slide-up-and-fade],\n [data-ds-dialog-slide-up-and-fade][open],\n [data-ds-dialog-slide-up-and-fade]::backdrop,\n [data-ds-dialog-slide-up-and-fade][open]::backdrop {\n transition-duration: 0s;\n }\n}\n";
146
+
147
+ /**
148
+ * Slide up + opacity animation for dialogs.
149
+ *
150
+ * Entry slides up from below; exit slides up and out (asymmetric).
151
+ * Includes backdrop fade animation.
152
+ *
153
+ * @param options.distance - Slide distance in pixels. Defaults to `12`.
154
+ *
155
+ * @example
156
+ * ```tsx
157
+ * import { dialogSlideUpAndFade } from '@atlaskit/top-layer/animations';
158
+ *
159
+ * const animation = dialogSlideUpAndFade();
160
+ * <Dialog animate={animation} isOpen={isOpen} onClose={handleClose} label="...">
161
+ * ...
162
+ * </Dialog>
163
+ * ```
164
+ */
165
+ function dialogSlideUpAndFade(options) {
166
+ var _options$distance2;
167
+ var distance = (_options$distance2 = options === null || options === void 0 ? void 0 : options.distance) !== null && _options$distance2 !== void 0 ? _options$distance2 : 12;
168
+ return {
169
+ name: distance === 12 ? 'dialog-slide-up-and-fade' : "dialog-slide-up-and-fade-".concat(distance),
170
+ css: distance === 12 ? DIALOG_SLIDE_UP_AND_FADE_CSS : DIALOG_SLIDE_UP_AND_FADE_CSS.replace(/12px/g, "".concat(distance, "px")),
171
+ exitDurationMs: 175
172
+ };
173
+ }
174
+
175
+ // ── dialogFade ──
176
+
177
+ var DIALOG_FADE_CSS = "\n[data-ds-dialog-fade] {\n opacity: 0;\n transition:\n opacity 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-dialog-fade][open] {\n opacity: 1;\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-dialog-fade][open] {\n opacity: 0;\n }\n}\n\n[data-ds-dialog-fade]::backdrop {\n background-color: transparent;\n transition:\n background-color 175ms cubic-bezier(0.15, 1, 0.3, 1),\n overlay 175ms allow-discrete,\n display 175ms allow-discrete;\n}\n\n[data-ds-dialog-fade][open]::backdrop {\n background-color: var(--ds-blanket, #050C1F75);\n transition-duration: 350ms;\n}\n\n@starting-style {\n [data-ds-dialog-fade][open]::backdrop {\n background-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-ds-dialog-fade],\n [data-ds-dialog-fade][open],\n [data-ds-dialog-fade]::backdrop,\n [data-ds-dialog-fade][open]::backdrop {\n transition-duration: 0s;\n }\n}\n";
178
+
179
+ /**
180
+ * Simple opacity transition for dialogs, no transform.
181
+ *
182
+ * Includes backdrop fade animation.
183
+ *
184
+ * @example
185
+ * ```tsx
186
+ * import { dialogFade } from '@atlaskit/top-layer/animations';
187
+ *
188
+ * <Dialog animate={dialogFade()} isOpen={isOpen} onClose={handleClose} label="...">
189
+ * ...
190
+ * </Dialog>
191
+ * ```
192
+ */
193
+ function dialogFade() {
194
+ return {
195
+ name: 'dialog-fade',
196
+ css: DIALOG_FADE_CSS,
197
+ exitDurationMs: 175
198
+ };
199
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.arrow = void 0;
8
+ var _once = _interopRequireDefault(require("@atlaskit/ds-lib/once"));
9
+ var _useAnchorPositioning = require("../internal/use-anchor-positioning");
10
+ /**
11
+ * CSS for popover arrows using the `clip-path: inset() margin-box` technique.
12
+ *
13
+ * How it works:
14
+ * 1. Four arrow shapes exist simultaneously as `::before` (top/bottom) and
15
+ * `::after` (left/right) hexagonal pseudo-elements.
16
+ * 2. `clip-path: inset(1px) margin-box` clips the popover to its margin-box.
17
+ * 3. Margin on the anchor-facing side pushes the popover away, creating space
18
+ * where one arrow "escapes" the clip boundary and becomes visible.
19
+ * 4. `@position-try` rules change both `position-area` and `margin` when
20
+ * flipping, ensuring the correct arrow is always shown.
21
+ *
22
+ * Constraints:
23
+ * - `box-shadow` must be `none` (interferes with `clip-path: inset() margin-box`)
24
+ * - `::before` and `::after` are consumed — consumers cannot use them
25
+ * - Arrow pseudo-elements use `background: inherit` from the popover element
26
+ *
27
+ * @see https://goulet.dev/posts/tooltip-with-popover-and-anchor-positioning/
28
+ */
29
+ var ARROW_CSS = "\n[data-ds-popover-arrow] {\n clip-path: inset(var(--ds-arrow-offset, 1px)) margin-box;\n box-shadow: none;\n}\n\n/* Top and Bottom arrows (vertical hexagon) */\n[data-ds-popover-arrow]::before {\n content: \"\";\n position: absolute;\n z-index: -1;\n background: inherit;\n left: 50%;\n transform: translateX(-50%);\n width: calc(var(--ds-arrow-size, 8px) * 2);\n height: calc(100% + var(--ds-arrow-size, 8px) * 2);\n top: calc(var(--ds-arrow-size, 8px) * -1);\n clip-path: polygon(\n 0 var(--ds-arrow-size, 8px),\n 50% 0,\n 100% var(--ds-arrow-size, 8px),\n 100% calc(100% - var(--ds-arrow-size, 8px)),\n 50% 100%,\n 0 calc(100% - var(--ds-arrow-size, 8px))\n );\n}\n\n/* Left and Right arrows (horizontal hexagon) */\n[data-ds-popover-arrow]::after {\n content: \"\";\n position: absolute;\n z-index: -1;\n background: inherit;\n top: 50%;\n transform: translateY(-50%);\n height: calc(var(--ds-arrow-size, 8px) * 2);\n width: calc(100% + var(--ds-arrow-size, 8px) * 2);\n left: calc(var(--ds-arrow-size, 8px) * -1);\n clip-path: polygon(\n var(--ds-arrow-size, 8px) 0,\n calc(100% - var(--ds-arrow-size, 8px)) 0,\n 100% 50%,\n calc(100% - var(--ds-arrow-size, 8px)) 100%,\n var(--ds-arrow-size, 8px) 100%,\n 0 50%\n );\n}\n\n/* \u2500\u2500 @position-try rules \u2500\u2500\n * One rule per possible position-area value.\n * Each sets the position-area and the correct margin direction\n * so the arrow on the anchor-facing side is revealed.\n *\n * Margin direction per edge:\n * block-start (above anchor) \u2192 margin-block-end (bottom, facing anchor)\n * block-end (below anchor) \u2192 margin-block-start (top, facing anchor)\n * inline-start (left of anchor) \u2192 margin-inline-end (right, facing anchor)\n * inline-end (right of anchor) \u2192 margin-inline-start (left, facing anchor)\n */\n\n/* Single-axis centered */\n@position-try --ds-arrow-block-start {\n position-area: block-start;\n margin: 0;\n margin-block-end: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-block-end {\n position-area: block-end;\n margin: 0;\n margin-block-start: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-inline-start {\n position-area: inline-start;\n margin: 0;\n margin-inline-end: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-inline-end {\n position-area: inline-end;\n margin: 0;\n margin-inline-start: var(--ds-arrow-size, 8px);\n}\n\n/* Block edge + inline span */\n@position-try --ds-arrow-block-start-span-inline-start {\n position-area: block-start span-inline-start;\n margin: 0;\n margin-block-end: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-block-start-span-inline-end {\n position-area: block-start span-inline-end;\n margin: 0;\n margin-block-end: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-block-end-span-inline-start {\n position-area: block-end span-inline-start;\n margin: 0;\n margin-block-start: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-block-end-span-inline-end {\n position-area: block-end span-inline-end;\n margin: 0;\n margin-block-start: var(--ds-arrow-size, 8px);\n}\n\n/* Inline edge + block span */\n@position-try --ds-arrow-inline-start-span-block-start {\n position-area: inline-start span-block-start;\n margin: 0;\n margin-inline-end: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-inline-start-span-block-end {\n position-area: inline-start span-block-end;\n margin: 0;\n margin-inline-end: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-inline-end-span-block-start {\n position-area: inline-end span-block-start;\n margin: 0;\n margin-inline-start: var(--ds-arrow-size, 8px);\n}\n@position-try --ds-arrow-inline-end-span-block-end {\n position-area: inline-end span-block-end;\n margin: 0;\n margin-inline-start: var(--ds-arrow-size, 8px);\n}\n";
30
+
31
+ // ── Placement utilities ──
32
+
33
+ /**
34
+ * Converts a `position-area` value to a CSS rule name by replacing spaces with hyphens
35
+ * and prepending `--ds-arrow-`.
36
+ *
37
+ * @example positionAreaToRuleName('block-end span-inline-start') → '--ds-arrow-block-end-span-inline-start'
38
+ */
39
+ function positionAreaToRuleName(_ref) {
40
+ var positionArea = _ref.positionArea;
41
+ return "--ds-arrow-".concat(positionArea.replace(/ /g, '-'));
42
+ }
43
+
44
+ /**
45
+ * Returns `position-try-fallbacks` using named `@position-try` rules
46
+ * that change both `position-area` and `margin` when flipping.
47
+ *
48
+ * This is required for the arrow technique because built-in keywords
49
+ * (`flip-block`, `flip-inline`) only flip `position-area` — they do
50
+ * not update the margin direction needed to reveal the correct arrow.
51
+ */
52
+ function getTryFallbacks(_ref2) {
53
+ var placement = _ref2.placement;
54
+ var _getPlacement = (0, _useAnchorPositioning.getPlacement)({
55
+ placement: placement
56
+ }),
57
+ axis = _getPlacement.axis,
58
+ edge = _getPlacement.edge,
59
+ align = _getPlacement.align;
60
+ if (align === 'center') {
61
+ // Single-axis: only flip the edge
62
+ var _flippedEdge = edge === 'start' ? 'end' : 'start';
63
+ return positionAreaToRuleName({
64
+ positionArea: (0, _useAnchorPositioning.placementToPositionArea)({
65
+ placement: {
66
+ axis: axis,
67
+ edge: _flippedEdge
68
+ }
69
+ })
70
+ });
71
+ }
72
+
73
+ // Compound placement: try flipping edge, alignment, and both
74
+ var flippedEdge = edge === 'start' ? 'end' : 'start';
75
+ var flippedAlign = align === 'start' ? 'end' : 'start';
76
+ return [positionAreaToRuleName({
77
+ positionArea: (0, _useAnchorPositioning.placementToPositionArea)({
78
+ placement: {
79
+ axis: axis,
80
+ edge: flippedEdge,
81
+ align: align
82
+ }
83
+ })
84
+ }), positionAreaToRuleName({
85
+ positionArea: (0, _useAnchorPositioning.placementToPositionArea)({
86
+ placement: {
87
+ axis: axis,
88
+ edge: edge,
89
+ align: flippedAlign
90
+ }
91
+ })
92
+ }), positionAreaToRuleName({
93
+ positionArea: (0, _useAnchorPositioning.placementToPositionArea)({
94
+ placement: {
95
+ axis: axis,
96
+ edge: flippedEdge,
97
+ align: flippedAlign
98
+ }
99
+ })
100
+ })].join(', ');
101
+ }
102
+
103
+ /**
104
+ * Creates an arrow preset for popover content.
105
+ *
106
+ * The returned object is passed to `PopoverContent`'s `arrow` prop.
107
+ * It carries the CSS string and fallback logic so that consumers who
108
+ * don't use arrows pay no bundle cost.
109
+ *
110
+ * The arrows inherit their background from the popover element.
111
+ * When `arrow` is active, `PopoverContent` does not reset `background`
112
+ * to `transparent`, allowing the UA default (`canvas`) or a consumer-set
113
+ * background to show through.
114
+ *
115
+ * @example
116
+ * ```tsx
117
+ * import { arrow } from '@atlaskit/top-layer/arrow';
118
+ *
119
+ * const myArrow = arrow();
120
+ *
121
+ * <Popup.Content arrow={myArrow} />
122
+ * ```
123
+ */
124
+ var arrow = exports.arrow = (0, _once.default)(function () {
125
+ return {
126
+ name: 'arrow',
127
+ css: ARROW_CSS,
128
+ getTryFallbacks: getTryFallbacks
129
+ };
130
+ });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createCloseEvent = createCloseEvent;
7
+ /**
8
+ * Creates a synthetic DOM event from a `TDialogCloseReason`.
9
+ *
10
+ * Useful when bridging the Dialog primitive's `onClose({ reason })` callback
11
+ * to a legacy API that expects a `KeyboardEvent` or `MouseEvent` — for example,
12
+ * `@atlaskit/modal-dialog`'s `onClose(event, analyticsEvent)` contract.
13
+ *
14
+ * - `'escape'` → `KeyboardEvent('keydown', { key: 'Escape' })`
15
+ * - `'overlay-click'` → `MouseEvent('click')`
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * import { createCloseEvent } from '@atlaskit/top-layer/create-close-event';
20
+ * import { type TDialogCloseReason } from '@atlaskit/top-layer/dialog';
21
+ *
22
+ * function onDialogClose({ reason }: { reason: TDialogCloseReason }) {
23
+ * legacyOnClose(createCloseEvent({ reason }));
24
+ * }
25
+ * ```
26
+ */
27
+ function createCloseEvent(_ref) {
28
+ var reason = _ref.reason;
29
+ if (reason === 'escape') {
30
+ return new KeyboardEvent('keydown', {
31
+ key: 'Escape',
32
+ bubbles: true
33
+ });
34
+ }
35
+ return new MouseEvent('click', {
36
+ bubbles: true,
37
+ cancelable: true
38
+ });
39
+ }