@atlaskit/top-layer 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/README.md +151 -0
- package/animations/package.json +17 -0
- package/arrow/package.json +17 -0
- package/create-close-event/package.json +17 -0
- package/dialog/package.json +17 -0
- package/dialog-scroll-lock/package.json +17 -0
- package/dist/cjs/animations/presets.js +199 -0
- package/dist/cjs/animations/types.js +5 -0
- package/dist/cjs/arrow/index.js +130 -0
- package/dist/cjs/arrow/types.js +5 -0
- package/dist/cjs/dialog/create-close-event.js +39 -0
- package/dist/cjs/dialog/dialog-content.compiled.css +14 -0
- package/dist/cjs/dialog/dialog-content.js +144 -0
- package/dist/cjs/dialog/index.js +19 -0
- package/dist/cjs/dialog/types.js +5 -0
- package/dist/cjs/dialog-scroll-lock/index.js +46 -0
- package/dist/cjs/entry-points/animations.js +36 -0
- package/dist/cjs/entry-points/arrow.js +12 -0
- package/dist/cjs/entry-points/create-close-event.js +19 -0
- package/dist/cjs/entry-points/dialog-scroll-lock.js +12 -0
- package/dist/cjs/entry-points/dialog.js +12 -0
- package/dist/cjs/entry-points/focus.js +24 -0
- package/dist/cjs/entry-points/placement-map.js +18 -0
- package/dist/cjs/entry-points/popover.js +12 -0
- package/dist/cjs/entry-points/popup-surface.js +12 -0
- package/dist/cjs/entry-points/popup.js +12 -0
- package/dist/cjs/entry-points/use-anchor-position.js +12 -0
- package/dist/cjs/entry-points/use-arrow-navigation.js +18 -0
- package/dist/cjs/entry-points/use-simple-light-dismiss.js +12 -0
- package/dist/cjs/focus/focus.js +115 -0
- package/dist/cjs/focus/index.js +24 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/internal/anchor-positioning-fallback.js +154 -0
- package/dist/cjs/internal/combine.js +29 -0
- package/dist/cjs/internal/ensure-preset-styles.js +34 -0
- package/dist/cjs/internal/reduced-motion.js +27 -0
- package/dist/cjs/internal/resolve-placement.js +24 -0
- package/dist/cjs/internal/role-types.js +66 -0
- package/dist/cjs/internal/set-style.js +42 -0
- package/dist/cjs/internal/slot.js +65 -0
- package/dist/cjs/internal/use-anchor-positioning.js +336 -0
- package/dist/cjs/internal/use-animated-visibility.js +169 -0
- package/dist/cjs/internal/use-animation-preset.js +24 -0
- package/dist/cjs/internal/use-focus-wrap.js +94 -0
- package/dist/cjs/internal/use-initial-focus.js +112 -0
- package/dist/cjs/internal/use-preset-styles.js +27 -0
- package/dist/cjs/placement-map/index.js +147 -0
- package/dist/cjs/popover/create-close-event.js +44 -0
- package/dist/cjs/popover/index.js +19 -0
- package/dist/cjs/popover/popover.compiled.css +13 -0
- package/dist/cjs/popover/popover.js +251 -0
- package/dist/cjs/popover/types.js +5 -0
- package/dist/cjs/popup/index.js +37 -0
- package/dist/cjs/popup/popup-content.js +201 -0
- package/dist/cjs/popup/popup-context.js +42 -0
- package/dist/cjs/popup/popup-surface.compiled.css +5 -0
- package/dist/cjs/popup/popup-surface.js +30 -0
- package/dist/cjs/popup/popup-trigger-function.js +74 -0
- package/dist/cjs/popup/popup-trigger.js +82 -0
- package/dist/cjs/popup/popup.js +70 -0
- package/dist/cjs/popup/types.js +5 -0
- package/dist/cjs/use-arrow-navigation/index.js +18 -0
- package/dist/cjs/use-arrow-navigation/use-arrow-navigation.js +245 -0
- package/dist/cjs/use-simple-light-dismiss/index.js +84 -0
- package/dist/es2019/animations/presets.js +375 -0
- package/dist/es2019/animations/types.js +1 -0
- package/dist/es2019/arrow/index.js +249 -0
- package/dist/es2019/arrow/types.js +1 -0
- package/dist/es2019/dialog/create-close-event.js +34 -0
- package/dist/es2019/dialog/dialog-content.compiled.css +14 -0
- package/dist/es2019/dialog/dialog-content.js +138 -0
- package/dist/es2019/dialog/index.js +2 -0
- package/dist/es2019/dialog/types.js +1 -0
- package/dist/es2019/dialog-scroll-lock/index.js +41 -0
- package/dist/es2019/entry-points/animations.js +1 -0
- package/dist/es2019/entry-points/arrow.js +1 -0
- package/dist/es2019/entry-points/create-close-event.js +2 -0
- package/dist/es2019/entry-points/dialog-scroll-lock.js +1 -0
- package/dist/es2019/entry-points/dialog.js +1 -0
- package/dist/es2019/entry-points/focus.js +1 -0
- package/dist/es2019/entry-points/placement-map.js +1 -0
- package/dist/es2019/entry-points/popover.js +1 -0
- package/dist/es2019/entry-points/popup-surface.js +1 -0
- package/dist/es2019/entry-points/popup.js +1 -0
- package/dist/es2019/entry-points/use-anchor-position.js +1 -0
- package/dist/es2019/entry-points/use-arrow-navigation.js +1 -0
- package/dist/es2019/entry-points/use-simple-light-dismiss.js +1 -0
- package/dist/es2019/focus/focus.js +107 -0
- package/dist/es2019/focus/index.js +1 -0
- package/dist/es2019/index.js +7 -0
- package/dist/es2019/internal/anchor-positioning-fallback.js +153 -0
- package/dist/es2019/internal/combine.js +18 -0
- package/dist/es2019/internal/ensure-preset-styles.js +29 -0
- package/dist/es2019/internal/reduced-motion.js +21 -0
- package/dist/es2019/internal/resolve-placement.js +19 -0
- package/dist/es2019/internal/role-types.js +61 -0
- package/dist/es2019/internal/set-style.js +39 -0
- package/dist/es2019/internal/slot.js +57 -0
- package/dist/es2019/internal/use-anchor-positioning.js +330 -0
- package/dist/es2019/internal/use-animated-visibility.js +159 -0
- package/dist/es2019/internal/use-animation-preset.js +18 -0
- package/dist/es2019/internal/use-focus-wrap.js +90 -0
- package/dist/es2019/internal/use-initial-focus.js +109 -0
- package/dist/es2019/internal/use-preset-styles.js +22 -0
- package/dist/es2019/placement-map/index.js +142 -0
- package/dist/es2019/popover/create-close-event.js +39 -0
- package/dist/es2019/popover/index.js +2 -0
- package/dist/es2019/popover/popover.compiled.css +13 -0
- package/dist/es2019/popover/popover.js +240 -0
- package/dist/es2019/popover/types.js +1 -0
- package/dist/es2019/popup/index.js +33 -0
- package/dist/es2019/popup/popup-content.js +192 -0
- package/dist/es2019/popup/popup-context.js +34 -0
- package/dist/es2019/popup/popup-surface.compiled.css +5 -0
- package/dist/es2019/popup/popup-surface.js +24 -0
- package/dist/es2019/popup/popup-trigger-function.js +69 -0
- package/dist/es2019/popup/popup-trigger.js +76 -0
- package/dist/es2019/popup/popup.js +56 -0
- package/dist/es2019/popup/types.js +1 -0
- package/dist/es2019/use-arrow-navigation/index.js +1 -0
- package/dist/es2019/use-arrow-navigation/use-arrow-navigation.js +238 -0
- package/dist/es2019/use-simple-light-dismiss/index.js +79 -0
- package/dist/esm/animations/presets.js +190 -0
- package/dist/esm/animations/types.js +1 -0
- package/dist/esm/arrow/index.js +123 -0
- package/dist/esm/arrow/types.js +1 -0
- package/dist/esm/dialog/create-close-event.js +33 -0
- package/dist/esm/dialog/dialog-content.compiled.css +14 -0
- package/dist/esm/dialog/dialog-content.js +135 -0
- package/dist/esm/dialog/index.js +2 -0
- package/dist/esm/dialog/types.js +1 -0
- package/dist/esm/dialog-scroll-lock/index.js +41 -0
- package/dist/esm/entry-points/animations.js +1 -0
- package/dist/esm/entry-points/arrow.js +1 -0
- package/dist/esm/entry-points/create-close-event.js +2 -0
- package/dist/esm/entry-points/dialog-scroll-lock.js +1 -0
- package/dist/esm/entry-points/dialog.js +1 -0
- package/dist/esm/entry-points/focus.js +1 -0
- package/dist/esm/entry-points/placement-map.js +1 -0
- package/dist/esm/entry-points/popover.js +1 -0
- package/dist/esm/entry-points/popup-surface.js +1 -0
- package/dist/esm/entry-points/popup.js +1 -0
- package/dist/esm/entry-points/use-anchor-position.js +1 -0
- package/dist/esm/entry-points/use-arrow-navigation.js +1 -0
- package/dist/esm/entry-points/use-simple-light-dismiss.js +1 -0
- package/dist/esm/focus/focus.js +107 -0
- package/dist/esm/focus/index.js +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/internal/anchor-positioning-fallback.js +147 -0
- package/dist/esm/internal/combine.js +23 -0
- package/dist/esm/internal/ensure-preset-styles.js +28 -0
- package/dist/esm/internal/reduced-motion.js +21 -0
- package/dist/esm/internal/resolve-placement.js +18 -0
- package/dist/esm/internal/role-types.js +60 -0
- package/dist/esm/internal/set-style.js +36 -0
- package/dist/esm/internal/slot.js +59 -0
- package/dist/esm/internal/use-anchor-positioning.js +323 -0
- package/dist/esm/internal/use-animated-visibility.js +162 -0
- package/dist/esm/internal/use-animation-preset.js +18 -0
- package/dist/esm/internal/use-focus-wrap.js +89 -0
- package/dist/esm/internal/use-initial-focus.js +107 -0
- package/dist/esm/internal/use-preset-styles.js +21 -0
- package/dist/esm/placement-map/index.js +141 -0
- package/dist/esm/popover/create-close-event.js +38 -0
- package/dist/esm/popover/index.js +2 -0
- package/dist/esm/popover/popover.compiled.css +13 -0
- package/dist/esm/popover/popover.js +242 -0
- package/dist/esm/popover/types.js +1 -0
- package/dist/esm/popup/index.js +33 -0
- package/dist/esm/popup/popup-content.js +192 -0
- package/dist/esm/popup/popup-context.js +34 -0
- package/dist/esm/popup/popup-surface.compiled.css +5 -0
- package/dist/esm/popup/popup-surface.js +23 -0
- package/dist/esm/popup/popup-trigger-function.js +69 -0
- package/dist/esm/popup/popup-trigger.js +74 -0
- package/dist/esm/popup/popup.js +61 -0
- package/dist/esm/popup/types.js +1 -0
- package/dist/esm/use-arrow-navigation/index.js +1 -0
- package/dist/esm/use-arrow-navigation/use-arrow-navigation.js +238 -0
- package/dist/esm/use-simple-light-dismiss/index.js +78 -0
- package/dist/types/animations/presets.d.ts +94 -0
- package/dist/types/animations/types.d.ts +42 -0
- package/dist/types/arrow/index.d.ts +24 -0
- package/dist/types/arrow/types.d.ts +29 -0
- package/dist/types/dialog/create-close-event.d.ts +24 -0
- package/dist/types/dialog/dialog-content.d.ts +20 -0
- package/dist/types/dialog/index.d.ts +3 -0
- package/dist/types/dialog/types.d.ts +92 -0
- package/dist/types/dialog-scroll-lock/index.d.ts +24 -0
- package/dist/types/entry-points/animations.d.ts +2 -0
- package/dist/types/entry-points/arrow.d.ts +2 -0
- package/dist/types/entry-points/create-close-event.d.ts +4 -0
- package/dist/types/entry-points/dialog-scroll-lock.d.ts +1 -0
- package/dist/types/entry-points/dialog.d.ts +2 -0
- package/dist/types/entry-points/focus.d.ts +2 -0
- package/dist/types/entry-points/placement-map.d.ts +2 -0
- package/dist/types/entry-points/popover.d.ts +2 -0
- package/dist/types/entry-points/popup-surface.d.ts +2 -0
- package/dist/types/entry-points/popup.d.ts +2 -0
- package/dist/types/entry-points/use-anchor-position.d.ts +1 -0
- package/dist/types/entry-points/use-arrow-navigation.d.ts +2 -0
- package/dist/types/entry-points/use-simple-light-dismiss.d.ts +2 -0
- package/dist/types/focus/focus.d.ts +42 -0
- package/dist/types/focus/index.d.ts +2 -0
- package/dist/types/index.d.ts +0 -0
- package/dist/types/internal/anchor-positioning-fallback.d.ts +24 -0
- package/dist/types/internal/combine.d.ts +14 -0
- package/dist/types/internal/ensure-preset-styles.d.ts +6 -0
- package/dist/types/internal/reduced-motion.d.ts +14 -0
- package/dist/types/internal/resolve-placement.d.ts +16 -0
- package/dist/types/internal/role-types.d.ts +62 -0
- package/dist/types/internal/set-style.d.ts +28 -0
- package/dist/types/internal/slot.d.ts +29 -0
- package/dist/types/internal/use-anchor-positioning.d.ts +95 -0
- package/dist/types/internal/use-animated-visibility.d.ts +74 -0
- package/dist/types/internal/use-animation-preset.d.ts +11 -0
- package/dist/types/internal/use-focus-wrap.d.ts +20 -0
- package/dist/types/internal/use-initial-focus.d.ts +21 -0
- package/dist/types/internal/use-preset-styles.d.ts +15 -0
- package/dist/types/placement-map/index.d.ts +55 -0
- package/dist/types/popover/create-close-event.d.ts +26 -0
- package/dist/types/popover/index.d.ts +3 -0
- package/dist/types/popover/popover.d.ts +22 -0
- package/dist/types/popover/types.d.ts +153 -0
- package/dist/types/popup/index.d.ts +34 -0
- package/dist/types/popup/popup-content.d.ts +14 -0
- package/dist/types/popup/popup-context.d.ts +96 -0
- package/dist/types/popup/popup-surface.d.ts +16 -0
- package/dist/types/popup/popup-trigger-function.d.ts +108 -0
- package/dist/types/popup/popup-trigger.d.ts +23 -0
- package/dist/types/popup/popup.d.ts +14 -0
- package/dist/types/popup/types.d.ts +289 -0
- package/dist/types/use-arrow-navigation/index.d.ts +2 -0
- package/dist/types/use-arrow-navigation/use-arrow-navigation.d.ts +136 -0
- package/dist/types/use-simple-light-dismiss/index.d.ts +45 -0
- package/dist/types-ts4.5/animations/presets.d.ts +94 -0
- package/dist/types-ts4.5/animations/types.d.ts +42 -0
- package/dist/types-ts4.5/arrow/index.d.ts +24 -0
- package/dist/types-ts4.5/arrow/types.d.ts +29 -0
- package/dist/types-ts4.5/dialog/create-close-event.d.ts +24 -0
- package/dist/types-ts4.5/dialog/dialog-content.d.ts +20 -0
- package/dist/types-ts4.5/dialog/index.d.ts +3 -0
- package/dist/types-ts4.5/dialog/types.d.ts +92 -0
- package/dist/types-ts4.5/dialog-scroll-lock/index.d.ts +24 -0
- package/dist/types-ts4.5/entry-points/animations.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/arrow.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/create-close-event.d.ts +4 -0
- package/dist/types-ts4.5/entry-points/dialog-scroll-lock.d.ts +1 -0
- package/dist/types-ts4.5/entry-points/dialog.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/focus.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/placement-map.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/popover.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/popup-surface.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/popup.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/use-anchor-position.d.ts +1 -0
- package/dist/types-ts4.5/entry-points/use-arrow-navigation.d.ts +2 -0
- package/dist/types-ts4.5/entry-points/use-simple-light-dismiss.d.ts +2 -0
- package/dist/types-ts4.5/focus/focus.d.ts +42 -0
- package/dist/types-ts4.5/focus/index.d.ts +2 -0
- package/dist/types-ts4.5/index.d.ts +0 -0
- package/dist/types-ts4.5/internal/anchor-positioning-fallback.d.ts +24 -0
- package/dist/types-ts4.5/internal/combine.d.ts +14 -0
- package/dist/types-ts4.5/internal/ensure-preset-styles.d.ts +6 -0
- package/dist/types-ts4.5/internal/reduced-motion.d.ts +14 -0
- package/dist/types-ts4.5/internal/resolve-placement.d.ts +16 -0
- package/dist/types-ts4.5/internal/role-types.d.ts +62 -0
- package/dist/types-ts4.5/internal/set-style.d.ts +28 -0
- package/dist/types-ts4.5/internal/slot.d.ts +29 -0
- package/dist/types-ts4.5/internal/use-anchor-positioning.d.ts +95 -0
- package/dist/types-ts4.5/internal/use-animated-visibility.d.ts +74 -0
- package/dist/types-ts4.5/internal/use-animation-preset.d.ts +11 -0
- package/dist/types-ts4.5/internal/use-focus-wrap.d.ts +20 -0
- package/dist/types-ts4.5/internal/use-initial-focus.d.ts +21 -0
- package/dist/types-ts4.5/internal/use-preset-styles.d.ts +15 -0
- package/dist/types-ts4.5/placement-map/index.d.ts +55 -0
- package/dist/types-ts4.5/popover/create-close-event.d.ts +26 -0
- package/dist/types-ts4.5/popover/index.d.ts +3 -0
- package/dist/types-ts4.5/popover/popover.d.ts +22 -0
- package/dist/types-ts4.5/popover/types.d.ts +153 -0
- package/dist/types-ts4.5/popup/index.d.ts +34 -0
- package/dist/types-ts4.5/popup/popup-content.d.ts +14 -0
- package/dist/types-ts4.5/popup/popup-context.d.ts +96 -0
- package/dist/types-ts4.5/popup/popup-surface.d.ts +16 -0
- package/dist/types-ts4.5/popup/popup-trigger-function.d.ts +108 -0
- package/dist/types-ts4.5/popup/popup-trigger.d.ts +23 -0
- package/dist/types-ts4.5/popup/popup.d.ts +14 -0
- package/dist/types-ts4.5/popup/types.d.ts +289 -0
- package/dist/types-ts4.5/use-arrow-navigation/index.d.ts +2 -0
- package/dist/types-ts4.5/use-arrow-navigation/use-arrow-navigation.d.ts +136 -0
- package/dist/types-ts4.5/use-simple-light-dismiss/index.d.ts +45 -0
- package/focus/package.json +17 -0
- package/package.json +95 -0
- package/placement-map/package.json +17 -0
- package/popover/package.json +17 -0
- package/popup/package.json +17 -0
- package/popup-surface/package.json +17 -0
- package/use-anchor-position/package.json +17 -0
- package/use-arrow-navigation/package.json +17 -0
- package/use-simple-light-dismiss/package.json +17 -0
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,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,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
|
+
}
|