Skip to content

Commit 352c638

Browse files
committed
feat(layer-stack): expose
1 parent 9431767 commit 352c638

File tree

13 files changed

+84
-7
lines changed

13 files changed

+84
-7
lines changed

.changeset/forty-kiwis-jam.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
"@zag-js/dismissable": minor
3+
"@zag-js/dialog": patch
4+
"@zag-js/popover": patch
5+
"@zag-js/menu": patch
6+
"@zag-js/select": patch
7+
"@zag-js/combobox": patch
8+
"@zag-js/date-picker": patch
9+
"@zag-js/color-picker": patch
10+
"@zag-js/hover-card": patch
11+
---
12+
13+
Add support for layer types in dismissable layer stack. Layers can now be categorized as `dialog`, `popover`, `menu`, or
14+
`listbox`. This enables:
15+
16+
- `data-nested` attribute on nested layers of the same type
17+
- `data-has-nested` attribute on parent layers with nested children of the same type
18+
- `--nested-layer-count` CSS variable indicating the number of nested layers of the same type

packages/machines/color-picker/src/color-picker.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ export const machine = createMachine<ColorPickerSchema>({
408408

409409
const getContentEl = () => dom.getContentEl(scope)
410410
return trackDismissableElement(getContentEl, {
411+
type: "popover",
411412
exclude: dom.getTriggerEl(scope),
412413
defer: true,
413414
onInteractOutside(event) {

packages/machines/combobox/src/combobox.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,7 @@ export const machine = createMachine({
705705
if (prop("disableLayer")) return
706706
const contentEl = () => dom.getContentEl(scope)
707707
return trackDismissableElement(contentEl, {
708+
type: "listbox",
708709
defer: true,
709710
exclude: () => [dom.getInputEl(scope), dom.getTriggerEl(scope), dom.getClearTriggerEl(scope)],
710711
onFocusOutside: prop("onFocusOutside"),

packages/machines/date-picker/src/date-picker.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,7 @@ export const machine = createMachine<DatePickerSchema>({
703703

704704
const getContentEl = () => dom.getContentEl(scope)
705705
return trackDismissableElement(getContentEl, {
706+
type: "popover",
706707
defer: true,
707708
exclude: [...dom.getInputEls(scope), dom.getTriggerEl(scope), dom.getClearTriggerEl(scope)],
708709
onInteractOutside(event) {

packages/machines/dialog/src/dialog.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ export const machine = createMachine<DialogSchema>({
113113
trackDismissableElement({ scope, send, prop }) {
114114
const getContentEl = () => dom.getContentEl(scope)
115115
return trackDismissableElement(getContentEl, {
116+
type: "dialog",
116117
defer: true,
117118
pointerBlocking: prop("modal"),
118119
exclude: [dom.getTriggerEl(scope)],

packages/machines/hover-card/src/hover-card.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ export const machine = createMachine<HoverCardSchema>({
241241
trackDismissableElement({ send, scope, prop }) {
242242
const getContentEl = () => dom.getContentEl(scope)
243243
return trackDismissableElement(getContentEl, {
244+
type: "popover",
244245
defer: true,
245246
exclude: [dom.getTriggerEl(scope)],
246247
onDismiss() {

packages/machines/menu/src/menu.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ export const machine = createMachine<MenuSchema>({
562562
const getContentEl = () => dom.getContentEl(scope)
563563
let restoreFocus = true
564564
return trackDismissableElement(getContentEl, {
565+
type: "menu",
565566
defer: true,
566567
exclude: [dom.getTriggerEl(scope)],
567568
onInteractOutside: prop("onInteractOutside"),

packages/machines/popover/src/popover.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ export const machine = createMachine<PopoverSchema>({
145145
const getContentEl = () => dom.getContentEl(scope)
146146
let restoreFocus = true
147147
return trackDismissableElement(getContentEl, {
148+
type: "popover",
148149
pointerBlocking: prop("modal"),
149150
exclude: dom.getTriggerEl(scope),
150151
defer: true,

packages/machines/select/src/select.machine.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ export const machine = createMachine<SelectSchema>({
425425
const contentEl = () => dom.getContentEl(scope)
426426
let restoreFocus = true
427427
return trackDismissableElement(contentEl, {
428+
type: "listbox",
428429
defer: true,
429430
exclude: [dom.getTriggerEl(scope), dom.getClearTriggerEl(scope)],
430431
onFocusOutside: prop("onFocusOutside"),

packages/utilities/dismissable/src/dismissable-layer.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from "@zag-js/interact-outside"
88
import { isFunction, warn, type MaybeFunction } from "@zag-js/utils"
99
import { trackEscapeKeydown } from "./escape-keydown"
10-
import { layerStack, type Layer, type LayerDismissEvent } from "./layer-stack"
10+
import { layerStack, type Layer, type LayerDismissEvent, type LayerType } from "./layer-stack"
1111
import { assignPointerEventToLayers, clearPointerEvent, disablePointerEventsOutside } from "./pointer-event-outside"
1212

1313
type MaybeElement = HTMLElement | null
@@ -59,6 +59,10 @@ export interface DismissableElementOptions extends DismissableElementHandlers, P
5959
* Whether to warn when the node is `null` or `undefined`
6060
*/
6161
warnOnMissingNode?: boolean | undefined
62+
/**
63+
* The type of layer being tracked
64+
*/
65+
type?: LayerType | undefined
6266
}
6367

6468
function trackDismissableElementImpl(node: MaybeElement, options: DismissableElementOptions) {
@@ -73,9 +77,9 @@ function trackDismissableElementImpl(node: MaybeElement, options: DismissableEle
7377
return
7478
}
7579

76-
const { onDismiss, onRequestDismiss, pointerBlocking, exclude: excludeContainers, debug } = options
80+
const { onDismiss, onRequestDismiss, pointerBlocking, exclude: excludeContainers, debug, type = "dialog" } = options
7781

78-
const layer: Layer = { dismiss: onDismiss, node, pointerBlocking, requestDismiss: onRequestDismiss }
82+
const layer: Layer = { dismiss: onDismiss, node, type, pointerBlocking, requestDismiss: onRequestDismiss }
7983

8084
layerStack.add(layer)
8185
assignPointerEventToLayers()

0 commit comments

Comments
 (0)