@zag-js/popover 0.34.0 → 0.36.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/dist/index.d.mts CHANGED
@@ -71,6 +71,10 @@ interface PublicContext extends DismissableElementHandlers, CommonProperties, Di
71
71
  * Whether the popover is open
72
72
  */
73
73
  open?: boolean;
74
+ /**
75
+ * Whether the popover is controlled by the user
76
+ */
77
+ "open.controlled"?: boolean;
74
78
  }
75
79
  type UserDefinedContext = RequiredBy<PublicContext, "id">;
76
80
  type ComputedContext = Readonly<{
package/dist/index.d.ts CHANGED
@@ -71,6 +71,10 @@ interface PublicContext extends DismissableElementHandlers, CommonProperties, Di
71
71
  * Whether the popover is open
72
72
  */
73
73
  open?: boolean;
74
+ /**
75
+ * Whether the popover is controlled by the user
76
+ */
77
+ "open.controlled"?: boolean;
74
78
  }
75
79
  type UserDefinedContext = RequiredBy<PublicContext, "id">;
76
80
  type ComputedContext = Readonly<{
package/dist/index.js CHANGED
@@ -98,7 +98,7 @@ function connect(state, send, normalize) {
98
98
  send("CLOSE");
99
99
  },
100
100
  reposition(options = {}) {
101
- send({ type: "SET_POSITIONING", options });
101
+ send({ type: "POSITIONING.SET", options });
102
102
  },
103
103
  arrowProps: normalize.element({
104
104
  id: dom.getArrowId(state.context),
@@ -174,7 +174,7 @@ function connect(state, send, normalize) {
174
174
  type: "button",
175
175
  "aria-label": "close",
176
176
  onClick() {
177
- send("REQUEST_CLOSE");
177
+ send("CLOSE");
178
178
  }
179
179
  })
180
180
  };
@@ -223,14 +223,30 @@ function machine(userContext) {
223
223
  states: {
224
224
  closed: {
225
225
  on: {
226
- TOGGLE: {
226
+ "CONTROLLED.OPEN": {
227
227
  target: "open",
228
- actions: ["invokeOnOpen"]
228
+ actions: ["setInitialFocus"]
229
229
  },
230
- OPEN: {
231
- target: "open",
232
- actions: ["invokeOnOpen"]
233
- }
230
+ TOGGLE: [
231
+ {
232
+ guard: "isOpenControlled",
233
+ actions: ["invokeOnOpen"]
234
+ },
235
+ {
236
+ target: "open",
237
+ actions: ["invokeOnOpen", "setInitialFocus"]
238
+ }
239
+ ],
240
+ OPEN: [
241
+ {
242
+ guard: "isOpenControlled",
243
+ actions: ["invokeOnOpen"]
244
+ },
245
+ {
246
+ target: "open",
247
+ actions: ["invokeOnOpen", "setInitialFocus"]
248
+ }
249
+ ]
234
250
  }
235
251
  },
236
252
  open: {
@@ -242,21 +258,32 @@ function machine(userContext) {
242
258
  "trackDismissableElement",
243
259
  "proxyTabFocus"
244
260
  ],
245
- entry: ["setInitialFocus"],
246
261
  on: {
247
- CLOSE: {
248
- target: "closed",
249
- actions: ["invokeOnClose"]
250
- },
251
- REQUEST_CLOSE: {
262
+ "CONTROLLED.CLOSE": {
252
263
  target: "closed",
253
- actions: ["restoreFocusIfNeeded", "invokeOnClose"]
264
+ actions: ["restoreFocus"]
254
265
  },
255
- TOGGLE: {
256
- target: "closed",
257
- actions: ["invokeOnClose"]
258
- },
259
- SET_POSITIONING: {
266
+ CLOSE: [
267
+ {
268
+ guard: "isOpenControlled",
269
+ actions: ["invokeOnClose"]
270
+ },
271
+ {
272
+ target: "closed",
273
+ actions: ["invokeOnClose", "restoreFocus"]
274
+ }
275
+ ],
276
+ TOGGLE: [
277
+ {
278
+ guard: "isOpenControlled",
279
+ actions: ["invokeOnClose"]
280
+ },
281
+ {
282
+ target: "closed",
283
+ actions: ["invokeOnClose"]
284
+ }
285
+ ],
286
+ "POSITIONING.SET": {
260
287
  actions: "reposition"
261
288
  }
262
289
  }
@@ -264,6 +291,9 @@ function machine(userContext) {
264
291
  }
265
292
  },
266
293
  {
294
+ guards: {
295
+ isOpenControlled: (ctx2) => !!ctx2["open.controlled"]
296
+ },
267
297
  activities: {
268
298
  trackPositioning(ctx2) {
269
299
  ctx2.currentPlacement = ctx2.positioning.placement;
@@ -302,7 +332,7 @@ function machine(userContext) {
302
332
  onPointerDownOutside: ctx2.onPointerDownOutside,
303
333
  onFocusOutside: ctx2.onFocusOutside,
304
334
  onDismiss() {
305
- send({ type: "REQUEST_CLOSE", src: "interact-outside", restoreFocus });
335
+ send({ type: "CLOSE", src: "interact-outside", restoreFocus });
306
336
  }
307
337
  });
308
338
  },
@@ -381,7 +411,7 @@ function machine(userContext) {
381
411
  dom.getInitialFocusEl(ctx2)?.focus({ preventScroll: true });
382
412
  });
383
413
  },
384
- restoreFocusIfNeeded(ctx2, evt) {
414
+ restoreFocus(ctx2, evt) {
385
415
  if (!evt.restoreFocus)
386
416
  return;
387
417
  (0, import_dom_query3.raf)(() => {
@@ -394,8 +424,8 @@ function machine(userContext) {
394
424
  invokeOnClose(ctx2) {
395
425
  ctx2.onOpenChange?.({ open: false });
396
426
  },
397
- toggleVisibility(ctx2, _evt, { send }) {
398
- send({ type: ctx2.open ? "OPEN" : "CLOSE", src: "controlled" });
427
+ toggleVisibility(ctx2, evt, { send }) {
428
+ send({ type: ctx2.open ? "CONTROLLED.OPEN" : "CONTROLLED.CLOSE", previousEvent: evt });
399
429
  }
400
430
  }
401
431
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/popover.anatomy.ts","../src/popover.connect.ts","../src/popover.dom.ts","../src/popover.machine.ts"],"sourcesContent":["export { anatomy } from \"./popover.anatomy\"\nexport { connect } from \"./popover.connect\"\nexport { machine } from \"./popover.machine\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n ElementIds,\n OpenChangeDetails,\n Placement,\n PositioningOptions,\n} from \"./popover.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"popover\").parts(\n \"arrow\",\n \"arrowTip\",\n \"anchor\",\n \"trigger\",\n \"indicator\",\n \"positioner\",\n \"content\",\n \"title\",\n \"description\",\n \"closeTrigger\",\n)\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./popover.anatomy\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineApi, Send, State } from \"./popover.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const isOpen = state.matches(\"open\")\n\n const currentPlacement = state.context.currentPlacement\n const portalled = state.context.currentPortalled\n const rendered = state.context.renderedElements\n\n const popperStyles = getPlacementStyles({\n ...state.context.positioning,\n placement: currentPlacement,\n })\n\n return {\n portalled,\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\n },\n reposition(options = {}) {\n send({ type: \"SET_POSITIONING\", options })\n },\n\n arrowProps: normalize.element({\n id: dom.getArrowId(state.context),\n ...parts.arrow.attrs,\n dir: state.context.dir,\n style: popperStyles.arrow,\n }),\n\n arrowTipProps: normalize.element({\n ...parts.arrowTip.attrs,\n dir: state.context.dir,\n style: popperStyles.arrowTip,\n }),\n\n anchorProps: normalize.element({\n ...parts.anchor.attrs,\n dir: state.context.dir,\n id: dom.getAnchorId(state.context),\n }),\n\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n dir: state.context.dir,\n type: \"button\",\n \"data-placement\": currentPlacement,\n id: dom.getTriggerId(state.context),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"aria-controls\": dom.getContentId(state.context),\n onClick() {\n send(\"TOGGLE\")\n },\n onBlur(event) {\n send({ type: \"TRIGGER_BLUR\", target: event.relatedTarget })\n },\n }),\n\n indicatorProps: normalize.element({\n ...parts.indicator.attrs,\n dir: state.context.dir,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n }),\n\n positionerProps: normalize.element({\n id: dom.getPositionerId(state.context),\n ...parts.positioner.attrs,\n dir: state.context.dir,\n style: popperStyles.floating,\n }),\n\n contentProps: normalize.element({\n ...parts.content.attrs,\n dir: state.context.dir,\n id: dom.getContentId(state.context),\n tabIndex: -1,\n role: \"dialog\",\n hidden: !isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"data-expanded\": dataAttr(isOpen),\n \"aria-labelledby\": rendered.title ? dom.getTitleId(state.context) : undefined,\n \"aria-describedby\": rendered.description ? dom.getDescriptionId(state.context) : undefined,\n \"data-placement\": currentPlacement,\n }),\n\n titleProps: normalize.element({\n ...parts.title.attrs,\n id: dom.getTitleId(state.context),\n dir: state.context.dir,\n }),\n\n descriptionProps: normalize.element({\n ...parts.description.attrs,\n id: dom.getDescriptionId(state.context),\n dir: state.context.dir,\n }),\n\n closeTriggerProps: normalize.button({\n ...parts.closeTrigger.attrs,\n dir: state.context.dir,\n id: dom.getCloseTriggerId(state.context),\n type: \"button\",\n \"aria-label\": \"close\",\n onClick() {\n send(\"REQUEST_CLOSE\")\n },\n }),\n }\n}\n","import { createScope } from \"@zag-js/dom-query\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { runIfFn } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./popover.types\"\n\nexport const dom = createScope({\n getActiveEl: (ctx: Ctx) => dom.getDoc(ctx).activeElement,\n\n getAnchorId: (ctx: Ctx) => ctx.ids?.anchor ?? `popover:${ctx.id}:anchor`,\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `popover:${ctx.id}:trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `popover:${ctx.id}:content`,\n getPositionerId: (ctx: Ctx) => ctx.ids?.positioner ?? `popover:${ctx.id}:popper`,\n getArrowId: (ctx: Ctx) => ctx.ids?.arrow ?? `popover:${ctx.id}:arrow`,\n getTitleId: (ctx: Ctx) => ctx.ids?.title ?? `popover:${ctx.id}:title`,\n getDescriptionId: (ctx: Ctx) => ctx.ids?.description ?? `popover:${ctx.id}:desc`,\n getCloseTriggerId: (ctx: Ctx) => ctx.ids?.closeTrigger ?? `popover:${ctx.id}:close`,\n\n getAnchorEl: (ctx: Ctx) => dom.getById(ctx, dom.getAnchorId(ctx)),\n getTriggerEl: (ctx: Ctx) => dom.getById(ctx, dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getById(ctx, dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getById(ctx, dom.getPositionerId(ctx)),\n getTitleEl: (ctx: Ctx) => dom.getById(ctx, dom.getTitleId(ctx)),\n getDescriptionEl: (ctx: Ctx) => dom.getById(ctx, dom.getDescriptionId(ctx)),\n\n getFocusableEls: (ctx: Ctx) => getFocusables(dom.getContentEl(ctx)),\n getFirstFocusableEl: (ctx: Ctx) => dom.getFocusableEls(ctx)[0],\n\n getInitialFocusEl: (ctx: Ctx) => {\n let el: HTMLElement | null = runIfFn(ctx.initialFocusEl)\n if (!el && ctx.autoFocus) el = dom.getFirstFocusableEl(ctx)\n if (!el) el = dom.getContentEl(ctx)\n return el\n },\n})\n","import { ariaHidden } from \"@zag-js/aria-hidden\"\nimport { createMachine } from \"@zag-js/core\"\nimport { trackDismissableElement } from \"@zag-js/dismissable\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { preventBodyScroll } from \"@zag-js/remove-scroll\"\nimport { proxyTabFocus } from \"@zag-js/tabbable\"\nimport { compact, runIfFn } from \"@zag-js/utils\"\nimport { createFocusTrap, type FocusTrap } from \"focus-trap\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./popover.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"popover\",\n initial: ctx.open ? \"open\" : \"closed\",\n context: {\n closeOnInteractOutside: true,\n closeOnEsc: true,\n autoFocus: true,\n modal: false,\n portalled: true,\n positioning: {\n placement: \"bottom\",\n ...ctx.positioning,\n },\n currentPlacement: undefined,\n ...ctx,\n renderedElements: {\n title: true,\n description: true,\n },\n },\n\n computed: {\n currentPortalled: (ctx) => !!ctx.modal || !!ctx.portalled,\n },\n\n watch: {\n open: [\"toggleVisibility\"],\n },\n\n entry: [\"checkRenderedElements\"],\n\n states: {\n closed: {\n on: {\n TOGGLE: {\n target: \"open\",\n actions: [\"invokeOnOpen\"],\n },\n OPEN: {\n target: \"open\",\n actions: [\"invokeOnOpen\"],\n },\n },\n },\n\n open: {\n activities: [\n \"trapFocus\",\n \"preventScroll\",\n \"hideContentBelow\",\n \"trackPositioning\",\n \"trackDismissableElement\",\n \"proxyTabFocus\",\n ],\n entry: [\"setInitialFocus\"],\n on: {\n CLOSE: {\n target: \"closed\",\n actions: [\"invokeOnClose\"],\n },\n REQUEST_CLOSE: {\n target: \"closed\",\n actions: [\"restoreFocusIfNeeded\", \"invokeOnClose\"],\n },\n TOGGLE: {\n target: \"closed\",\n actions: [\"invokeOnClose\"],\n },\n SET_POSITIONING: {\n actions: \"reposition\",\n },\n },\n },\n },\n },\n {\n activities: {\n trackPositioning(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n return getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n defer: true,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n trackDismissableElement(ctx, _evt, { send }) {\n const getContentEl = () => dom.getContentEl(ctx)\n let restoreFocus = true\n return trackDismissableElement(getContentEl, {\n pointerBlocking: ctx.modal,\n exclude: dom.getTriggerEl(ctx),\n defer: true,\n onEscapeKeyDown(event) {\n ctx.onEscapeKeyDown?.(event)\n if (ctx.closeOnEsc) return\n event.preventDefault()\n },\n onInteractOutside(event) {\n ctx.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n restoreFocus = !(event.detail.focusable || event.detail.contextmenu)\n if (!ctx.closeOnInteractOutside) {\n event.preventDefault()\n }\n },\n onPointerDownOutside: ctx.onPointerDownOutside,\n onFocusOutside: ctx.onFocusOutside,\n onDismiss() {\n send({ type: \"REQUEST_CLOSE\", src: \"interact-outside\", restoreFocus })\n },\n })\n },\n proxyTabFocus(ctx) {\n if (ctx.modal || !ctx.portalled) return\n const getContentEl = () => dom.getContentEl(ctx)\n return proxyTabFocus(getContentEl, {\n triggerElement: dom.getTriggerEl(ctx),\n defer: true,\n onFocus(el) {\n el.focus({ preventScroll: true })\n },\n })\n },\n hideContentBelow(ctx) {\n if (!ctx.modal) return\n const getElements = () => [dom.getContentEl(ctx), dom.getTriggerEl(ctx)]\n return ariaHidden(getElements, { defer: true })\n },\n preventScroll(ctx) {\n if (!ctx.modal) return\n return preventBodyScroll(dom.getDoc(ctx))\n },\n trapFocus(ctx) {\n if (!ctx.modal) return\n let trap: FocusTrap | undefined\n nextTick(() => {\n const el = dom.getContentEl(ctx)\n if (!el) return\n trap = createFocusTrap(el, {\n escapeDeactivates: false,\n allowOutsideClick: true,\n preventScroll: true,\n returnFocusOnDeactivate: true,\n document: dom.getDoc(ctx),\n fallbackFocus: el,\n initialFocus: runIfFn(ctx.initialFocusEl),\n })\n try {\n trap.activate()\n } catch {}\n })\n return () => trap?.deactivate()\n },\n },\n actions: {\n reposition(ctx, evt) {\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n ...evt.options,\n defer: true,\n listeners: false,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n checkRenderedElements(ctx) {\n raf(() => {\n Object.assign(ctx.renderedElements, {\n title: !!dom.getTitleEl(ctx),\n description: !!dom.getDescriptionEl(ctx),\n })\n })\n },\n setInitialFocus(ctx) {\n raf(() => {\n dom.getInitialFocusEl(ctx)?.focus({ preventScroll: true })\n })\n },\n restoreFocusIfNeeded(ctx, evt) {\n if (!evt.restoreFocus) return\n raf(() => {\n dom.getTriggerEl(ctx)?.focus({ preventScroll: true })\n })\n },\n invokeOnOpen(ctx) {\n ctx.onOpenChange?.({ open: true })\n },\n invokeOnClose(ctx) {\n ctx.onOpenChange?.({ open: false })\n },\n toggleVisibility(ctx, _evt, { send }) {\n send({ type: ctx.open ? \"OPEN\" : \"CLOSE\", src: \"controlled\" })\n },\n },\n },\n )\n}\n"],"mappings":"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","names":["import_dom_query","import_dom_query","import_popper","import_tabbable","import_utils","ctx"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/popover.anatomy.ts","../src/popover.connect.ts","../src/popover.dom.ts","../src/popover.machine.ts"],"sourcesContent":["export { anatomy } from \"./popover.anatomy\"\nexport { connect } from \"./popover.connect\"\nexport { machine } from \"./popover.machine\"\nexport type {\n MachineApi as Api,\n UserDefinedContext as Context,\n ElementIds,\n OpenChangeDetails,\n Placement,\n PositioningOptions,\n} from \"./popover.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"popover\").parts(\n \"arrow\",\n \"arrowTip\",\n \"anchor\",\n \"trigger\",\n \"indicator\",\n \"positioner\",\n \"content\",\n \"title\",\n \"description\",\n \"closeTrigger\",\n)\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./popover.anatomy\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineApi, Send, State } from \"./popover.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const isOpen = state.matches(\"open\")\n\n const currentPlacement = state.context.currentPlacement\n const portalled = state.context.currentPortalled\n const rendered = state.context.renderedElements\n\n const popperStyles = getPlacementStyles({\n ...state.context.positioning,\n placement: currentPlacement,\n })\n\n return {\n portalled,\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\n },\n reposition(options = {}) {\n send({ type: \"POSITIONING.SET\", options })\n },\n\n arrowProps: normalize.element({\n id: dom.getArrowId(state.context),\n ...parts.arrow.attrs,\n dir: state.context.dir,\n style: popperStyles.arrow,\n }),\n\n arrowTipProps: normalize.element({\n ...parts.arrowTip.attrs,\n dir: state.context.dir,\n style: popperStyles.arrowTip,\n }),\n\n anchorProps: normalize.element({\n ...parts.anchor.attrs,\n dir: state.context.dir,\n id: dom.getAnchorId(state.context),\n }),\n\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n dir: state.context.dir,\n type: \"button\",\n \"data-placement\": currentPlacement,\n id: dom.getTriggerId(state.context),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"aria-controls\": dom.getContentId(state.context),\n onClick() {\n send(\"TOGGLE\")\n },\n onBlur(event) {\n send({ type: \"TRIGGER_BLUR\", target: event.relatedTarget })\n },\n }),\n\n indicatorProps: normalize.element({\n ...parts.indicator.attrs,\n dir: state.context.dir,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n }),\n\n positionerProps: normalize.element({\n id: dom.getPositionerId(state.context),\n ...parts.positioner.attrs,\n dir: state.context.dir,\n style: popperStyles.floating,\n }),\n\n contentProps: normalize.element({\n ...parts.content.attrs,\n dir: state.context.dir,\n id: dom.getContentId(state.context),\n tabIndex: -1,\n role: \"dialog\",\n hidden: !isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"data-expanded\": dataAttr(isOpen),\n \"aria-labelledby\": rendered.title ? dom.getTitleId(state.context) : undefined,\n \"aria-describedby\": rendered.description ? dom.getDescriptionId(state.context) : undefined,\n \"data-placement\": currentPlacement,\n }),\n\n titleProps: normalize.element({\n ...parts.title.attrs,\n id: dom.getTitleId(state.context),\n dir: state.context.dir,\n }),\n\n descriptionProps: normalize.element({\n ...parts.description.attrs,\n id: dom.getDescriptionId(state.context),\n dir: state.context.dir,\n }),\n\n closeTriggerProps: normalize.button({\n ...parts.closeTrigger.attrs,\n dir: state.context.dir,\n id: dom.getCloseTriggerId(state.context),\n type: \"button\",\n \"aria-label\": \"close\",\n onClick() {\n send(\"CLOSE\")\n },\n }),\n }\n}\n","import { createScope } from \"@zag-js/dom-query\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { runIfFn } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./popover.types\"\n\nexport const dom = createScope({\n getActiveEl: (ctx: Ctx) => dom.getDoc(ctx).activeElement,\n\n getAnchorId: (ctx: Ctx) => ctx.ids?.anchor ?? `popover:${ctx.id}:anchor`,\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `popover:${ctx.id}:trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `popover:${ctx.id}:content`,\n getPositionerId: (ctx: Ctx) => ctx.ids?.positioner ?? `popover:${ctx.id}:popper`,\n getArrowId: (ctx: Ctx) => ctx.ids?.arrow ?? `popover:${ctx.id}:arrow`,\n getTitleId: (ctx: Ctx) => ctx.ids?.title ?? `popover:${ctx.id}:title`,\n getDescriptionId: (ctx: Ctx) => ctx.ids?.description ?? `popover:${ctx.id}:desc`,\n getCloseTriggerId: (ctx: Ctx) => ctx.ids?.closeTrigger ?? `popover:${ctx.id}:close`,\n\n getAnchorEl: (ctx: Ctx) => dom.getById(ctx, dom.getAnchorId(ctx)),\n getTriggerEl: (ctx: Ctx) => dom.getById(ctx, dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getById(ctx, dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getById(ctx, dom.getPositionerId(ctx)),\n getTitleEl: (ctx: Ctx) => dom.getById(ctx, dom.getTitleId(ctx)),\n getDescriptionEl: (ctx: Ctx) => dom.getById(ctx, dom.getDescriptionId(ctx)),\n\n getFocusableEls: (ctx: Ctx) => getFocusables(dom.getContentEl(ctx)),\n getFirstFocusableEl: (ctx: Ctx) => dom.getFocusableEls(ctx)[0],\n\n getInitialFocusEl: (ctx: Ctx) => {\n let el: HTMLElement | null = runIfFn(ctx.initialFocusEl)\n if (!el && ctx.autoFocus) el = dom.getFirstFocusableEl(ctx)\n if (!el) el = dom.getContentEl(ctx)\n return el\n },\n})\n","import { ariaHidden } from \"@zag-js/aria-hidden\"\nimport { createMachine } from \"@zag-js/core\"\nimport { trackDismissableElement } from \"@zag-js/dismissable\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { preventBodyScroll } from \"@zag-js/remove-scroll\"\nimport { proxyTabFocus } from \"@zag-js/tabbable\"\nimport { compact, runIfFn } from \"@zag-js/utils\"\nimport { createFocusTrap, type FocusTrap } from \"focus-trap\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./popover.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"popover\",\n initial: ctx.open ? \"open\" : \"closed\",\n context: {\n closeOnInteractOutside: true,\n closeOnEsc: true,\n autoFocus: true,\n modal: false,\n portalled: true,\n positioning: {\n placement: \"bottom\",\n ...ctx.positioning,\n },\n currentPlacement: undefined,\n ...ctx,\n renderedElements: {\n title: true,\n description: true,\n },\n },\n\n computed: {\n currentPortalled: (ctx) => !!ctx.modal || !!ctx.portalled,\n },\n\n watch: {\n open: [\"toggleVisibility\"],\n },\n\n entry: [\"checkRenderedElements\"],\n\n states: {\n closed: {\n on: {\n \"CONTROLLED.OPEN\": {\n target: \"open\",\n actions: [\"setInitialFocus\"],\n },\n TOGGLE: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnOpen\"],\n },\n {\n target: \"open\",\n actions: [\"invokeOnOpen\", \"setInitialFocus\"],\n },\n ],\n OPEN: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnOpen\"],\n },\n {\n target: \"open\",\n actions: [\"invokeOnOpen\", \"setInitialFocus\"],\n },\n ],\n },\n },\n\n open: {\n activities: [\n \"trapFocus\",\n \"preventScroll\",\n \"hideContentBelow\",\n \"trackPositioning\",\n \"trackDismissableElement\",\n \"proxyTabFocus\",\n ],\n on: {\n \"CONTROLLED.CLOSE\": {\n target: \"closed\",\n actions: [\"restoreFocus\"],\n },\n CLOSE: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnClose\"],\n },\n {\n target: \"closed\",\n actions: [\"invokeOnClose\", \"restoreFocus\"],\n },\n ],\n TOGGLE: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnClose\"],\n },\n {\n target: \"closed\",\n actions: [\"invokeOnClose\"],\n },\n ],\n \"POSITIONING.SET\": {\n actions: \"reposition\",\n },\n },\n },\n },\n },\n {\n guards: {\n isOpenControlled: (ctx) => !!ctx[\"open.controlled\"],\n },\n activities: {\n trackPositioning(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n return getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n defer: true,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n trackDismissableElement(ctx, _evt, { send }) {\n const getContentEl = () => dom.getContentEl(ctx)\n let restoreFocus = true\n return trackDismissableElement(getContentEl, {\n pointerBlocking: ctx.modal,\n exclude: dom.getTriggerEl(ctx),\n defer: true,\n onEscapeKeyDown(event) {\n ctx.onEscapeKeyDown?.(event)\n if (ctx.closeOnEsc) return\n event.preventDefault()\n },\n onInteractOutside(event) {\n ctx.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n restoreFocus = !(event.detail.focusable || event.detail.contextmenu)\n if (!ctx.closeOnInteractOutside) {\n event.preventDefault()\n }\n },\n onPointerDownOutside: ctx.onPointerDownOutside,\n onFocusOutside: ctx.onFocusOutside,\n onDismiss() {\n send({ type: \"CLOSE\", src: \"interact-outside\", restoreFocus })\n },\n })\n },\n proxyTabFocus(ctx) {\n if (ctx.modal || !ctx.portalled) return\n const getContentEl = () => dom.getContentEl(ctx)\n return proxyTabFocus(getContentEl, {\n triggerElement: dom.getTriggerEl(ctx),\n defer: true,\n onFocus(el) {\n el.focus({ preventScroll: true })\n },\n })\n },\n hideContentBelow(ctx) {\n if (!ctx.modal) return\n const getElements = () => [dom.getContentEl(ctx), dom.getTriggerEl(ctx)]\n return ariaHidden(getElements, { defer: true })\n },\n preventScroll(ctx) {\n if (!ctx.modal) return\n return preventBodyScroll(dom.getDoc(ctx))\n },\n trapFocus(ctx) {\n if (!ctx.modal) return\n let trap: FocusTrap | undefined\n nextTick(() => {\n const el = dom.getContentEl(ctx)\n if (!el) return\n trap = createFocusTrap(el, {\n escapeDeactivates: false,\n allowOutsideClick: true,\n preventScroll: true,\n returnFocusOnDeactivate: true,\n document: dom.getDoc(ctx),\n fallbackFocus: el,\n initialFocus: runIfFn(ctx.initialFocusEl),\n })\n try {\n trap.activate()\n } catch {}\n })\n return () => trap?.deactivate()\n },\n },\n actions: {\n reposition(ctx, evt) {\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n ...evt.options,\n defer: true,\n listeners: false,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n checkRenderedElements(ctx) {\n raf(() => {\n Object.assign(ctx.renderedElements, {\n title: !!dom.getTitleEl(ctx),\n description: !!dom.getDescriptionEl(ctx),\n })\n })\n },\n setInitialFocus(ctx) {\n raf(() => {\n dom.getInitialFocusEl(ctx)?.focus({ preventScroll: true })\n })\n },\n restoreFocus(ctx, evt) {\n if (!evt.restoreFocus) return\n raf(() => {\n dom.getTriggerEl(ctx)?.focus({ preventScroll: true })\n })\n },\n invokeOnOpen(ctx) {\n ctx.onOpenChange?.({ open: true })\n },\n invokeOnClose(ctx) {\n ctx.onOpenChange?.({ open: false })\n },\n toggleVisibility(ctx, evt, { send }) {\n send({ type: ctx.open ? \"CONTROLLED.OPEN\" : \"CONTROLLED.CLOSE\", previousEvent: evt })\n },\n },\n },\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAA8B;AAEvB,IAAM,cAAU,8BAAc,SAAS,EAAE;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,QAAQ,QAAQ,MAAM;;;ACfnC,IAAAA,oBAAyB;AACzB,oBAAmC;;;ACDnC,uBAA4B;AAC5B,sBAA8B;AAC9B,mBAAwB;AAGjB,IAAM,UAAM,8BAAY;AAAA,EAC7B,aAAa,CAAC,QAAa,IAAI,OAAO,GAAG,EAAE;AAAA,EAE3C,aAAa,CAAC,QAAa,IAAI,KAAK,UAAU,WAAW,IAAI,EAAE;AAAA,EAC/D,cAAc,CAAC,QAAa,IAAI,KAAK,WAAW,WAAW,IAAI,EAAE;AAAA,EACjE,cAAc,CAAC,QAAa,IAAI,KAAK,WAAW,WAAW,IAAI,EAAE;AAAA,EACjE,iBAAiB,CAAC,QAAa,IAAI,KAAK,cAAc,WAAW,IAAI,EAAE;AAAA,EACvE,YAAY,CAAC,QAAa,IAAI,KAAK,SAAS,WAAW,IAAI,EAAE;AAAA,EAC7D,YAAY,CAAC,QAAa,IAAI,KAAK,SAAS,WAAW,IAAI,EAAE;AAAA,EAC7D,kBAAkB,CAAC,QAAa,IAAI,KAAK,eAAe,WAAW,IAAI,EAAE;AAAA,EACzE,mBAAmB,CAAC,QAAa,IAAI,KAAK,gBAAgB,WAAW,IAAI,EAAE;AAAA,EAE3E,aAAa,CAAC,QAAa,IAAI,QAAQ,KAAK,IAAI,YAAY,GAAG,CAAC;AAAA,EAChE,cAAc,CAAC,QAAa,IAAI,QAAQ,KAAK,IAAI,aAAa,GAAG,CAAC;AAAA,EAClE,cAAc,CAAC,QAAa,IAAI,QAAQ,KAAK,IAAI,aAAa,GAAG,CAAC;AAAA,EAClE,iBAAiB,CAAC,QAAa,IAAI,QAAQ,KAAK,IAAI,gBAAgB,GAAG,CAAC;AAAA,EACxE,YAAY,CAAC,QAAa,IAAI,QAAQ,KAAK,IAAI,WAAW,GAAG,CAAC;AAAA,EAC9D,kBAAkB,CAAC,QAAa,IAAI,QAAQ,KAAK,IAAI,iBAAiB,GAAG,CAAC;AAAA,EAE1E,iBAAiB,CAAC,YAAa,+BAAc,IAAI,aAAa,GAAG,CAAC;AAAA,EAClE,qBAAqB,CAAC,QAAa,IAAI,gBAAgB,GAAG,EAAE,CAAC;AAAA,EAE7D,mBAAmB,CAAC,QAAa;AAC/B,QAAI,SAAyB,sBAAQ,IAAI,cAAc;AACvD,QAAI,CAAC,MAAM,IAAI;AAAW,WAAK,IAAI,oBAAoB,GAAG;AAC1D,QAAI,CAAC;AAAI,WAAK,IAAI,aAAa,GAAG;AAClC,WAAO;AAAA,EACT;AACF,CAAC;;;AD1BM,SAAS,QAA6B,OAAc,MAAY,WAA6C;AAClH,QAAM,SAAS,MAAM,QAAQ,MAAM;AAEnC,QAAM,mBAAmB,MAAM,QAAQ;AACvC,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,WAAW,MAAM,QAAQ;AAE/B,QAAM,mBAAe,kCAAmB;AAAA,IACtC,GAAG,MAAM,QAAQ;AAAA,IACjB,WAAW;AAAA,EACb,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAAA,IACA,QAAQ;AACN,WAAK,OAAO;AAAA,IACd;AAAA,IACA,WAAW,UAAU,CAAC,GAAG;AACvB,WAAK,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAAA,IAC3C;AAAA,IAEA,YAAY,UAAU,QAAQ;AAAA,MAC5B,IAAI,IAAI,WAAW,MAAM,OAAO;AAAA,MAChC,GAAG,MAAM,MAAM;AAAA,MACf,KAAK,MAAM,QAAQ;AAAA,MACnB,OAAO,aAAa;AAAA,IACtB,CAAC;AAAA,IAED,eAAe,UAAU,QAAQ;AAAA,MAC/B,GAAG,MAAM,SAAS;AAAA,MAClB,KAAK,MAAM,QAAQ;AAAA,MACnB,OAAO,aAAa;AAAA,IACtB,CAAC;AAAA,IAED,aAAa,UAAU,QAAQ;AAAA,MAC7B,GAAG,MAAM,OAAO;AAAA,MAChB,KAAK,MAAM,QAAQ;AAAA,MACnB,IAAI,IAAI,YAAY,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,IAED,cAAc,UAAU,OAAO;AAAA,MAC7B,GAAG,MAAM,QAAQ;AAAA,MACjB,KAAK,MAAM,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,kBAAkB;AAAA,MAClB,IAAI,IAAI,aAAa,MAAM,OAAO;AAAA,MAClC,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,cAAc,SAAS,SAAS;AAAA,MAChC,iBAAiB,IAAI,aAAa,MAAM,OAAO;AAAA,MAC/C,UAAU;AACR,aAAK,QAAQ;AAAA,MACf;AAAA,MACA,OAAO,OAAO;AACZ,aAAK,EAAE,MAAM,gBAAgB,QAAQ,MAAM,cAAc,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,IAED,gBAAgB,UAAU,QAAQ;AAAA,MAChC,GAAG,MAAM,UAAU;AAAA,MACnB,KAAK,MAAM,QAAQ;AAAA,MACnB,cAAc,SAAS,SAAS;AAAA,IAClC,CAAC;AAAA,IAED,iBAAiB,UAAU,QAAQ;AAAA,MACjC,IAAI,IAAI,gBAAgB,MAAM,OAAO;AAAA,MACrC,GAAG,MAAM,WAAW;AAAA,MACpB,KAAK,MAAM,QAAQ;AAAA,MACnB,OAAO,aAAa;AAAA,IACtB,CAAC;AAAA,IAED,cAAc,UAAU,QAAQ;AAAA,MAC9B,GAAG,MAAM,QAAQ;AAAA,MACjB,KAAK,MAAM,QAAQ;AAAA,MACnB,IAAI,IAAI,aAAa,MAAM,OAAO;AAAA,MAClC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,cAAc,SAAS,SAAS;AAAA,MAChC,qBAAiB,4BAAS,MAAM;AAAA,MAChC,mBAAmB,SAAS,QAAQ,IAAI,WAAW,MAAM,OAAO,IAAI;AAAA,MACpE,oBAAoB,SAAS,cAAc,IAAI,iBAAiB,MAAM,OAAO,IAAI;AAAA,MACjF,kBAAkB;AAAA,IACpB,CAAC;AAAA,IAED,YAAY,UAAU,QAAQ;AAAA,MAC5B,GAAG,MAAM,MAAM;AAAA,MACf,IAAI,IAAI,WAAW,MAAM,OAAO;AAAA,MAChC,KAAK,MAAM,QAAQ;AAAA,IACrB,CAAC;AAAA,IAED,kBAAkB,UAAU,QAAQ;AAAA,MAClC,GAAG,MAAM,YAAY;AAAA,MACrB,IAAI,IAAI,iBAAiB,MAAM,OAAO;AAAA,MACtC,KAAK,MAAM,QAAQ;AAAA,IACrB,CAAC;AAAA,IAED,mBAAmB,UAAU,OAAO;AAAA,MAClC,GAAG,MAAM,aAAa;AAAA,MACtB,KAAK,MAAM,QAAQ;AAAA,MACnB,IAAI,IAAI,kBAAkB,MAAM,OAAO;AAAA,MACvC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AACR,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AEvHA,yBAA2B;AAC3B,kBAA8B;AAC9B,yBAAwC;AACxC,IAAAC,oBAA8B;AAC9B,IAAAC,iBAA6B;AAC7B,2BAAkC;AAClC,IAAAC,mBAA8B;AAC9B,IAAAC,gBAAiC;AACjC,wBAAgD;AAIzC,SAAS,QAAQ,aAAiC;AACvD,QAAM,UAAM,uBAAQ,WAAW;AAC/B,aAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,SAAS,IAAI,OAAO,SAAS;AAAA,MAC7B,SAAS;AAAA,QACP,wBAAwB;AAAA,QACxB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,QACX,aAAa;AAAA,UACX,WAAW;AAAA,UACX,GAAG,IAAI;AAAA,QACT;AAAA,QACA,kBAAkB;AAAA,QAClB,GAAG;AAAA,QACH,kBAAkB;AAAA,UAChB,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MAEA,UAAU;AAAA,QACR,kBAAkB,CAACC,SAAQ,CAAC,CAACA,KAAI,SAAS,CAAC,CAACA,KAAI;AAAA,MAClD;AAAA,MAEA,OAAO;AAAA,QACL,MAAM,CAAC,kBAAkB;AAAA,MAC3B;AAAA,MAEA,OAAO,CAAC,uBAAuB;AAAA,MAE/B,QAAQ;AAAA,QACN,QAAQ;AAAA,UACN,IAAI;AAAA,YACF,mBAAmB;AAAA,cACjB,QAAQ;AAAA,cACR,SAAS,CAAC,iBAAiB;AAAA,YAC7B;AAAA,YACA,QAAQ;AAAA,cACN;AAAA,gBACE,OAAO;AAAA,gBACP,SAAS,CAAC,cAAc;AAAA,cAC1B;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,CAAC,gBAAgB,iBAAiB;AAAA,cAC7C;AAAA,YACF;AAAA,YACA,MAAM;AAAA,cACJ;AAAA,gBACE,OAAO;AAAA,gBACP,SAAS,CAAC,cAAc;AAAA,cAC1B;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,CAAC,gBAAgB,iBAAiB;AAAA,cAC7C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QAEA,MAAM;AAAA,UACJ,YAAY;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,IAAI;AAAA,YACF,oBAAoB;AAAA,cAClB,QAAQ;AAAA,cACR,SAAS,CAAC,cAAc;AAAA,YAC1B;AAAA,YACA,OAAO;AAAA,cACL;AAAA,gBACE,OAAO;AAAA,gBACP,SAAS,CAAC,eAAe;AAAA,cAC3B;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,CAAC,iBAAiB,cAAc;AAAA,cAC3C;AAAA,YACF;AAAA,YACA,QAAQ;AAAA,cACN;AAAA,gBACE,OAAO;AAAA,gBACP,SAAS,CAAC,eAAe;AAAA,cAC3B;AAAA,cACA;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS,CAAC,eAAe;AAAA,cAC3B;AAAA,YACF;AAAA,YACA,mBAAmB;AAAA,cACjB,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,QACN,kBAAkB,CAACA,SAAQ,CAAC,CAACA,KAAI,iBAAiB;AAAA,MACpD;AAAA,MACA,YAAY;AAAA,QACV,iBAAiBA,MAAK;AACpB,UAAAA,KAAI,mBAAmBA,KAAI,YAAY;AACvC,gBAAM,WAAW,IAAI,YAAYA,IAAG,KAAK,IAAI,aAAaA,IAAG;AAC7D,gBAAM,kBAAkB,MAAM,IAAI,gBAAgBA,IAAG;AACrD,qBAAO,6BAAa,UAAU,iBAAiB;AAAA,YAC7C,GAAGA,KAAI;AAAA,YACP,OAAO;AAAA,YACP,WAAW,MAAM;AACf,cAAAA,KAAI,mBAAmB,KAAK;AAAA,YAC9B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,wBAAwBA,MAAK,MAAM,EAAE,KAAK,GAAG;AAC3C,gBAAM,eAAe,MAAM,IAAI,aAAaA,IAAG;AAC/C,cAAI,eAAe;AACnB,qBAAO,4CAAwB,cAAc;AAAA,YAC3C,iBAAiBA,KAAI;AAAA,YACrB,SAAS,IAAI,aAAaA,IAAG;AAAA,YAC7B,OAAO;AAAA,YACP,gBAAgB,OAAO;AACrB,cAAAA,KAAI,kBAAkB,KAAK;AAC3B,kBAAIA,KAAI;AAAY;AACpB,oBAAM,eAAe;AAAA,YACvB;AAAA,YACA,kBAAkB,OAAO;AACvB,cAAAA,KAAI,oBAAoB,KAAK;AAC7B,kBAAI,MAAM;AAAkB;AAC5B,6BAAe,EAAE,MAAM,OAAO,aAAa,MAAM,OAAO;AACxD,kBAAI,CAACA,KAAI,wBAAwB;AAC/B,sBAAM,eAAe;AAAA,cACvB;AAAA,YACF;AAAA,YACA,sBAAsBA,KAAI;AAAA,YAC1B,gBAAgBA,KAAI;AAAA,YACpB,YAAY;AACV,mBAAK,EAAE,MAAM,SAAS,KAAK,oBAAoB,aAAa,CAAC;AAAA,YAC/D;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,cAAcA,MAAK;AACjB,cAAIA,KAAI,SAAS,CAACA,KAAI;AAAW;AACjC,gBAAM,eAAe,MAAM,IAAI,aAAaA,IAAG;AAC/C,qBAAO,gCAAc,cAAc;AAAA,YACjC,gBAAgB,IAAI,aAAaA,IAAG;AAAA,YACpC,OAAO;AAAA,YACP,QAAQ,IAAI;AACV,iBAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,YAClC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,iBAAiBA,MAAK;AACpB,cAAI,CAACA,KAAI;AAAO;AAChB,gBAAM,cAAc,MAAM,CAAC,IAAI,aAAaA,IAAG,GAAG,IAAI,aAAaA,IAAG,CAAC;AACvE,qBAAO,+BAAW,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,QAChD;AAAA,QACA,cAAcA,MAAK;AACjB,cAAI,CAACA,KAAI;AAAO;AAChB,qBAAO,wCAAkB,IAAI,OAAOA,IAAG,CAAC;AAAA,QAC1C;AAAA,QACA,UAAUA,MAAK;AACb,cAAI,CAACA,KAAI;AAAO;AAChB,cAAI;AACJ,0CAAS,MAAM;AACb,kBAAM,KAAK,IAAI,aAAaA,IAAG;AAC/B,gBAAI,CAAC;AAAI;AACT,uBAAO,mCAAgB,IAAI;AAAA,cACzB,mBAAmB;AAAA,cACnB,mBAAmB;AAAA,cACnB,eAAe;AAAA,cACf,yBAAyB;AAAA,cACzB,UAAU,IAAI,OAAOA,IAAG;AAAA,cACxB,eAAe;AAAA,cACf,kBAAc,uBAAQA,KAAI,cAAc;AAAA,YAC1C,CAAC;AACD,gBAAI;AACF,mBAAK,SAAS;AAAA,YAChB,QAAQ;AAAA,YAAC;AAAA,UACX,CAAC;AACD,iBAAO,MAAM,MAAM,WAAW;AAAA,QAChC;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,WAAWA,MAAK,KAAK;AACnB,gBAAM,WAAW,IAAI,YAAYA,IAAG,KAAK,IAAI,aAAaA,IAAG;AAC7D,gBAAM,kBAAkB,MAAM,IAAI,gBAAgBA,IAAG;AACrD,2CAAa,UAAU,iBAAiB;AAAA,YACtC,GAAGA,KAAI;AAAA,YACP,GAAG,IAAI;AAAA,YACP,OAAO;AAAA,YACP,WAAW;AAAA,YACX,WAAW,MAAM;AACf,cAAAA,KAAI,mBAAmB,KAAK;AAAA,YAC9B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,sBAAsBA,MAAK;AACzB,qCAAI,MAAM;AACR,mBAAO,OAAOA,KAAI,kBAAkB;AAAA,cAClC,OAAO,CAAC,CAAC,IAAI,WAAWA,IAAG;AAAA,cAC3B,aAAa,CAAC,CAAC,IAAI,iBAAiBA,IAAG;AAAA,YACzC,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,QACA,gBAAgBA,MAAK;AACnB,qCAAI,MAAM;AACR,gBAAI,kBAAkBA,IAAG,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,UAC3D,CAAC;AAAA,QACH;AAAA,QACA,aAAaA,MAAK,KAAK;AACrB,cAAI,CAAC,IAAI;AAAc;AACvB,qCAAI,MAAM;AACR,gBAAI,aAAaA,IAAG,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,UACtD,CAAC;AAAA,QACH;AAAA,QACA,aAAaA,MAAK;AAChB,UAAAA,KAAI,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,QACnC;AAAA,QACA,cAAcA,MAAK;AACjB,UAAAA,KAAI,eAAe,EAAE,MAAM,MAAM,CAAC;AAAA,QACpC;AAAA,QACA,iBAAiBA,MAAK,KAAK,EAAE,KAAK,GAAG;AACnC,eAAK,EAAE,MAAMA,KAAI,OAAO,oBAAoB,oBAAoB,eAAe,IAAI,CAAC;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["import_dom_query","import_dom_query","import_popper","import_tabbable","import_utils","ctx"]}
package/dist/index.mjs CHANGED
@@ -70,7 +70,7 @@ function connect(state, send, normalize) {
70
70
  send("CLOSE");
71
71
  },
72
72
  reposition(options = {}) {
73
- send({ type: "SET_POSITIONING", options });
73
+ send({ type: "POSITIONING.SET", options });
74
74
  },
75
75
  arrowProps: normalize.element({
76
76
  id: dom.getArrowId(state.context),
@@ -146,7 +146,7 @@ function connect(state, send, normalize) {
146
146
  type: "button",
147
147
  "aria-label": "close",
148
148
  onClick() {
149
- send("REQUEST_CLOSE");
149
+ send("CLOSE");
150
150
  }
151
151
  })
152
152
  };
@@ -195,14 +195,30 @@ function machine(userContext) {
195
195
  states: {
196
196
  closed: {
197
197
  on: {
198
- TOGGLE: {
198
+ "CONTROLLED.OPEN": {
199
199
  target: "open",
200
- actions: ["invokeOnOpen"]
200
+ actions: ["setInitialFocus"]
201
201
  },
202
- OPEN: {
203
- target: "open",
204
- actions: ["invokeOnOpen"]
205
- }
202
+ TOGGLE: [
203
+ {
204
+ guard: "isOpenControlled",
205
+ actions: ["invokeOnOpen"]
206
+ },
207
+ {
208
+ target: "open",
209
+ actions: ["invokeOnOpen", "setInitialFocus"]
210
+ }
211
+ ],
212
+ OPEN: [
213
+ {
214
+ guard: "isOpenControlled",
215
+ actions: ["invokeOnOpen"]
216
+ },
217
+ {
218
+ target: "open",
219
+ actions: ["invokeOnOpen", "setInitialFocus"]
220
+ }
221
+ ]
206
222
  }
207
223
  },
208
224
  open: {
@@ -214,21 +230,32 @@ function machine(userContext) {
214
230
  "trackDismissableElement",
215
231
  "proxyTabFocus"
216
232
  ],
217
- entry: ["setInitialFocus"],
218
233
  on: {
219
- CLOSE: {
220
- target: "closed",
221
- actions: ["invokeOnClose"]
222
- },
223
- REQUEST_CLOSE: {
234
+ "CONTROLLED.CLOSE": {
224
235
  target: "closed",
225
- actions: ["restoreFocusIfNeeded", "invokeOnClose"]
236
+ actions: ["restoreFocus"]
226
237
  },
227
- TOGGLE: {
228
- target: "closed",
229
- actions: ["invokeOnClose"]
230
- },
231
- SET_POSITIONING: {
238
+ CLOSE: [
239
+ {
240
+ guard: "isOpenControlled",
241
+ actions: ["invokeOnClose"]
242
+ },
243
+ {
244
+ target: "closed",
245
+ actions: ["invokeOnClose", "restoreFocus"]
246
+ }
247
+ ],
248
+ TOGGLE: [
249
+ {
250
+ guard: "isOpenControlled",
251
+ actions: ["invokeOnClose"]
252
+ },
253
+ {
254
+ target: "closed",
255
+ actions: ["invokeOnClose"]
256
+ }
257
+ ],
258
+ "POSITIONING.SET": {
232
259
  actions: "reposition"
233
260
  }
234
261
  }
@@ -236,6 +263,9 @@ function machine(userContext) {
236
263
  }
237
264
  },
238
265
  {
266
+ guards: {
267
+ isOpenControlled: (ctx2) => !!ctx2["open.controlled"]
268
+ },
239
269
  activities: {
240
270
  trackPositioning(ctx2) {
241
271
  ctx2.currentPlacement = ctx2.positioning.placement;
@@ -274,7 +304,7 @@ function machine(userContext) {
274
304
  onPointerDownOutside: ctx2.onPointerDownOutside,
275
305
  onFocusOutside: ctx2.onFocusOutside,
276
306
  onDismiss() {
277
- send({ type: "REQUEST_CLOSE", src: "interact-outside", restoreFocus });
307
+ send({ type: "CLOSE", src: "interact-outside", restoreFocus });
278
308
  }
279
309
  });
280
310
  },
@@ -353,7 +383,7 @@ function machine(userContext) {
353
383
  dom.getInitialFocusEl(ctx2)?.focus({ preventScroll: true });
354
384
  });
355
385
  },
356
- restoreFocusIfNeeded(ctx2, evt) {
386
+ restoreFocus(ctx2, evt) {
357
387
  if (!evt.restoreFocus)
358
388
  return;
359
389
  raf(() => {
@@ -366,8 +396,8 @@ function machine(userContext) {
366
396
  invokeOnClose(ctx2) {
367
397
  ctx2.onOpenChange?.({ open: false });
368
398
  },
369
- toggleVisibility(ctx2, _evt, { send }) {
370
- send({ type: ctx2.open ? "OPEN" : "CLOSE", src: "controlled" });
399
+ toggleVisibility(ctx2, evt, { send }) {
400
+ send({ type: ctx2.open ? "CONTROLLED.OPEN" : "CONTROLLED.CLOSE", previousEvent: evt });
371
401
  }
372
402
  }
373
403
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/popover.anatomy.ts","../src/popover.connect.ts","../src/popover.dom.ts","../src/popover.machine.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"popover\").parts(\n \"arrow\",\n \"arrowTip\",\n \"anchor\",\n \"trigger\",\n \"indicator\",\n \"positioner\",\n \"content\",\n \"title\",\n \"description\",\n \"closeTrigger\",\n)\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./popover.anatomy\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineApi, Send, State } from \"./popover.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const isOpen = state.matches(\"open\")\n\n const currentPlacement = state.context.currentPlacement\n const portalled = state.context.currentPortalled\n const rendered = state.context.renderedElements\n\n const popperStyles = getPlacementStyles({\n ...state.context.positioning,\n placement: currentPlacement,\n })\n\n return {\n portalled,\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\n },\n reposition(options = {}) {\n send({ type: \"SET_POSITIONING\", options })\n },\n\n arrowProps: normalize.element({\n id: dom.getArrowId(state.context),\n ...parts.arrow.attrs,\n dir: state.context.dir,\n style: popperStyles.arrow,\n }),\n\n arrowTipProps: normalize.element({\n ...parts.arrowTip.attrs,\n dir: state.context.dir,\n style: popperStyles.arrowTip,\n }),\n\n anchorProps: normalize.element({\n ...parts.anchor.attrs,\n dir: state.context.dir,\n id: dom.getAnchorId(state.context),\n }),\n\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n dir: state.context.dir,\n type: \"button\",\n \"data-placement\": currentPlacement,\n id: dom.getTriggerId(state.context),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"aria-controls\": dom.getContentId(state.context),\n onClick() {\n send(\"TOGGLE\")\n },\n onBlur(event) {\n send({ type: \"TRIGGER_BLUR\", target: event.relatedTarget })\n },\n }),\n\n indicatorProps: normalize.element({\n ...parts.indicator.attrs,\n dir: state.context.dir,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n }),\n\n positionerProps: normalize.element({\n id: dom.getPositionerId(state.context),\n ...parts.positioner.attrs,\n dir: state.context.dir,\n style: popperStyles.floating,\n }),\n\n contentProps: normalize.element({\n ...parts.content.attrs,\n dir: state.context.dir,\n id: dom.getContentId(state.context),\n tabIndex: -1,\n role: \"dialog\",\n hidden: !isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"data-expanded\": dataAttr(isOpen),\n \"aria-labelledby\": rendered.title ? dom.getTitleId(state.context) : undefined,\n \"aria-describedby\": rendered.description ? dom.getDescriptionId(state.context) : undefined,\n \"data-placement\": currentPlacement,\n }),\n\n titleProps: normalize.element({\n ...parts.title.attrs,\n id: dom.getTitleId(state.context),\n dir: state.context.dir,\n }),\n\n descriptionProps: normalize.element({\n ...parts.description.attrs,\n id: dom.getDescriptionId(state.context),\n dir: state.context.dir,\n }),\n\n closeTriggerProps: normalize.button({\n ...parts.closeTrigger.attrs,\n dir: state.context.dir,\n id: dom.getCloseTriggerId(state.context),\n type: \"button\",\n \"aria-label\": \"close\",\n onClick() {\n send(\"REQUEST_CLOSE\")\n },\n }),\n }\n}\n","import { createScope } from \"@zag-js/dom-query\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { runIfFn } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./popover.types\"\n\nexport const dom = createScope({\n getActiveEl: (ctx: Ctx) => dom.getDoc(ctx).activeElement,\n\n getAnchorId: (ctx: Ctx) => ctx.ids?.anchor ?? `popover:${ctx.id}:anchor`,\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `popover:${ctx.id}:trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `popover:${ctx.id}:content`,\n getPositionerId: (ctx: Ctx) => ctx.ids?.positioner ?? `popover:${ctx.id}:popper`,\n getArrowId: (ctx: Ctx) => ctx.ids?.arrow ?? `popover:${ctx.id}:arrow`,\n getTitleId: (ctx: Ctx) => ctx.ids?.title ?? `popover:${ctx.id}:title`,\n getDescriptionId: (ctx: Ctx) => ctx.ids?.description ?? `popover:${ctx.id}:desc`,\n getCloseTriggerId: (ctx: Ctx) => ctx.ids?.closeTrigger ?? `popover:${ctx.id}:close`,\n\n getAnchorEl: (ctx: Ctx) => dom.getById(ctx, dom.getAnchorId(ctx)),\n getTriggerEl: (ctx: Ctx) => dom.getById(ctx, dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getById(ctx, dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getById(ctx, dom.getPositionerId(ctx)),\n getTitleEl: (ctx: Ctx) => dom.getById(ctx, dom.getTitleId(ctx)),\n getDescriptionEl: (ctx: Ctx) => dom.getById(ctx, dom.getDescriptionId(ctx)),\n\n getFocusableEls: (ctx: Ctx) => getFocusables(dom.getContentEl(ctx)),\n getFirstFocusableEl: (ctx: Ctx) => dom.getFocusableEls(ctx)[0],\n\n getInitialFocusEl: (ctx: Ctx) => {\n let el: HTMLElement | null = runIfFn(ctx.initialFocusEl)\n if (!el && ctx.autoFocus) el = dom.getFirstFocusableEl(ctx)\n if (!el) el = dom.getContentEl(ctx)\n return el\n },\n})\n","import { ariaHidden } from \"@zag-js/aria-hidden\"\nimport { createMachine } from \"@zag-js/core\"\nimport { trackDismissableElement } from \"@zag-js/dismissable\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { preventBodyScroll } from \"@zag-js/remove-scroll\"\nimport { proxyTabFocus } from \"@zag-js/tabbable\"\nimport { compact, runIfFn } from \"@zag-js/utils\"\nimport { createFocusTrap, type FocusTrap } from \"focus-trap\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./popover.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"popover\",\n initial: ctx.open ? \"open\" : \"closed\",\n context: {\n closeOnInteractOutside: true,\n closeOnEsc: true,\n autoFocus: true,\n modal: false,\n portalled: true,\n positioning: {\n placement: \"bottom\",\n ...ctx.positioning,\n },\n currentPlacement: undefined,\n ...ctx,\n renderedElements: {\n title: true,\n description: true,\n },\n },\n\n computed: {\n currentPortalled: (ctx) => !!ctx.modal || !!ctx.portalled,\n },\n\n watch: {\n open: [\"toggleVisibility\"],\n },\n\n entry: [\"checkRenderedElements\"],\n\n states: {\n closed: {\n on: {\n TOGGLE: {\n target: \"open\",\n actions: [\"invokeOnOpen\"],\n },\n OPEN: {\n target: \"open\",\n actions: [\"invokeOnOpen\"],\n },\n },\n },\n\n open: {\n activities: [\n \"trapFocus\",\n \"preventScroll\",\n \"hideContentBelow\",\n \"trackPositioning\",\n \"trackDismissableElement\",\n \"proxyTabFocus\",\n ],\n entry: [\"setInitialFocus\"],\n on: {\n CLOSE: {\n target: \"closed\",\n actions: [\"invokeOnClose\"],\n },\n REQUEST_CLOSE: {\n target: \"closed\",\n actions: [\"restoreFocusIfNeeded\", \"invokeOnClose\"],\n },\n TOGGLE: {\n target: \"closed\",\n actions: [\"invokeOnClose\"],\n },\n SET_POSITIONING: {\n actions: \"reposition\",\n },\n },\n },\n },\n },\n {\n activities: {\n trackPositioning(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n return getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n defer: true,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n trackDismissableElement(ctx, _evt, { send }) {\n const getContentEl = () => dom.getContentEl(ctx)\n let restoreFocus = true\n return trackDismissableElement(getContentEl, {\n pointerBlocking: ctx.modal,\n exclude: dom.getTriggerEl(ctx),\n defer: true,\n onEscapeKeyDown(event) {\n ctx.onEscapeKeyDown?.(event)\n if (ctx.closeOnEsc) return\n event.preventDefault()\n },\n onInteractOutside(event) {\n ctx.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n restoreFocus = !(event.detail.focusable || event.detail.contextmenu)\n if (!ctx.closeOnInteractOutside) {\n event.preventDefault()\n }\n },\n onPointerDownOutside: ctx.onPointerDownOutside,\n onFocusOutside: ctx.onFocusOutside,\n onDismiss() {\n send({ type: \"REQUEST_CLOSE\", src: \"interact-outside\", restoreFocus })\n },\n })\n },\n proxyTabFocus(ctx) {\n if (ctx.modal || !ctx.portalled) return\n const getContentEl = () => dom.getContentEl(ctx)\n return proxyTabFocus(getContentEl, {\n triggerElement: dom.getTriggerEl(ctx),\n defer: true,\n onFocus(el) {\n el.focus({ preventScroll: true })\n },\n })\n },\n hideContentBelow(ctx) {\n if (!ctx.modal) return\n const getElements = () => [dom.getContentEl(ctx), dom.getTriggerEl(ctx)]\n return ariaHidden(getElements, { defer: true })\n },\n preventScroll(ctx) {\n if (!ctx.modal) return\n return preventBodyScroll(dom.getDoc(ctx))\n },\n trapFocus(ctx) {\n if (!ctx.modal) return\n let trap: FocusTrap | undefined\n nextTick(() => {\n const el = dom.getContentEl(ctx)\n if (!el) return\n trap = createFocusTrap(el, {\n escapeDeactivates: false,\n allowOutsideClick: true,\n preventScroll: true,\n returnFocusOnDeactivate: true,\n document: dom.getDoc(ctx),\n fallbackFocus: el,\n initialFocus: runIfFn(ctx.initialFocusEl),\n })\n try {\n trap.activate()\n } catch {}\n })\n return () => trap?.deactivate()\n },\n },\n actions: {\n reposition(ctx, evt) {\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n ...evt.options,\n defer: true,\n listeners: false,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n checkRenderedElements(ctx) {\n raf(() => {\n Object.assign(ctx.renderedElements, {\n title: !!dom.getTitleEl(ctx),\n description: !!dom.getDescriptionEl(ctx),\n })\n })\n },\n setInitialFocus(ctx) {\n raf(() => {\n dom.getInitialFocusEl(ctx)?.focus({ preventScroll: true })\n })\n },\n restoreFocusIfNeeded(ctx, evt) {\n if (!evt.restoreFocus) return\n raf(() => {\n dom.getTriggerEl(ctx)?.focus({ preventScroll: true })\n })\n },\n invokeOnOpen(ctx) {\n ctx.onOpenChange?.({ open: true })\n },\n invokeOnClose(ctx) {\n ctx.onOpenChange?.({ open: false })\n },\n toggleVisibility(ctx, _evt, { send }) {\n send({ type: ctx.open ? \"OPEN\" : \"CLOSE\", src: \"controlled\" })\n },\n },\n },\n )\n}\n"],"mappings":"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","names":["runIfFn","ctx","runIfFn"]}
1
+ {"version":3,"sources":["../src/popover.anatomy.ts","../src/popover.connect.ts","../src/popover.dom.ts","../src/popover.machine.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"popover\").parts(\n \"arrow\",\n \"arrowTip\",\n \"anchor\",\n \"trigger\",\n \"indicator\",\n \"positioner\",\n \"content\",\n \"title\",\n \"description\",\n \"closeTrigger\",\n)\n\nexport const parts = anatomy.build()\n","import { dataAttr } from \"@zag-js/dom-query\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./popover.anatomy\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineApi, Send, State } from \"./popover.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const isOpen = state.matches(\"open\")\n\n const currentPlacement = state.context.currentPlacement\n const portalled = state.context.currentPortalled\n const rendered = state.context.renderedElements\n\n const popperStyles = getPlacementStyles({\n ...state.context.positioning,\n placement: currentPlacement,\n })\n\n return {\n portalled,\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\n },\n reposition(options = {}) {\n send({ type: \"POSITIONING.SET\", options })\n },\n\n arrowProps: normalize.element({\n id: dom.getArrowId(state.context),\n ...parts.arrow.attrs,\n dir: state.context.dir,\n style: popperStyles.arrow,\n }),\n\n arrowTipProps: normalize.element({\n ...parts.arrowTip.attrs,\n dir: state.context.dir,\n style: popperStyles.arrowTip,\n }),\n\n anchorProps: normalize.element({\n ...parts.anchor.attrs,\n dir: state.context.dir,\n id: dom.getAnchorId(state.context),\n }),\n\n triggerProps: normalize.button({\n ...parts.trigger.attrs,\n dir: state.context.dir,\n type: \"button\",\n \"data-placement\": currentPlacement,\n id: dom.getTriggerId(state.context),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"aria-controls\": dom.getContentId(state.context),\n onClick() {\n send(\"TOGGLE\")\n },\n onBlur(event) {\n send({ type: \"TRIGGER_BLUR\", target: event.relatedTarget })\n },\n }),\n\n indicatorProps: normalize.element({\n ...parts.indicator.attrs,\n dir: state.context.dir,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n }),\n\n positionerProps: normalize.element({\n id: dom.getPositionerId(state.context),\n ...parts.positioner.attrs,\n dir: state.context.dir,\n style: popperStyles.floating,\n }),\n\n contentProps: normalize.element({\n ...parts.content.attrs,\n dir: state.context.dir,\n id: dom.getContentId(state.context),\n tabIndex: -1,\n role: \"dialog\",\n hidden: !isOpen,\n \"data-state\": isOpen ? \"open\" : \"closed\",\n \"data-expanded\": dataAttr(isOpen),\n \"aria-labelledby\": rendered.title ? dom.getTitleId(state.context) : undefined,\n \"aria-describedby\": rendered.description ? dom.getDescriptionId(state.context) : undefined,\n \"data-placement\": currentPlacement,\n }),\n\n titleProps: normalize.element({\n ...parts.title.attrs,\n id: dom.getTitleId(state.context),\n dir: state.context.dir,\n }),\n\n descriptionProps: normalize.element({\n ...parts.description.attrs,\n id: dom.getDescriptionId(state.context),\n dir: state.context.dir,\n }),\n\n closeTriggerProps: normalize.button({\n ...parts.closeTrigger.attrs,\n dir: state.context.dir,\n id: dom.getCloseTriggerId(state.context),\n type: \"button\",\n \"aria-label\": \"close\",\n onClick() {\n send(\"CLOSE\")\n },\n }),\n }\n}\n","import { createScope } from \"@zag-js/dom-query\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { runIfFn } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./popover.types\"\n\nexport const dom = createScope({\n getActiveEl: (ctx: Ctx) => dom.getDoc(ctx).activeElement,\n\n getAnchorId: (ctx: Ctx) => ctx.ids?.anchor ?? `popover:${ctx.id}:anchor`,\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `popover:${ctx.id}:trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `popover:${ctx.id}:content`,\n getPositionerId: (ctx: Ctx) => ctx.ids?.positioner ?? `popover:${ctx.id}:popper`,\n getArrowId: (ctx: Ctx) => ctx.ids?.arrow ?? `popover:${ctx.id}:arrow`,\n getTitleId: (ctx: Ctx) => ctx.ids?.title ?? `popover:${ctx.id}:title`,\n getDescriptionId: (ctx: Ctx) => ctx.ids?.description ?? `popover:${ctx.id}:desc`,\n getCloseTriggerId: (ctx: Ctx) => ctx.ids?.closeTrigger ?? `popover:${ctx.id}:close`,\n\n getAnchorEl: (ctx: Ctx) => dom.getById(ctx, dom.getAnchorId(ctx)),\n getTriggerEl: (ctx: Ctx) => dom.getById(ctx, dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getById(ctx, dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getById(ctx, dom.getPositionerId(ctx)),\n getTitleEl: (ctx: Ctx) => dom.getById(ctx, dom.getTitleId(ctx)),\n getDescriptionEl: (ctx: Ctx) => dom.getById(ctx, dom.getDescriptionId(ctx)),\n\n getFocusableEls: (ctx: Ctx) => getFocusables(dom.getContentEl(ctx)),\n getFirstFocusableEl: (ctx: Ctx) => dom.getFocusableEls(ctx)[0],\n\n getInitialFocusEl: (ctx: Ctx) => {\n let el: HTMLElement | null = runIfFn(ctx.initialFocusEl)\n if (!el && ctx.autoFocus) el = dom.getFirstFocusableEl(ctx)\n if (!el) el = dom.getContentEl(ctx)\n return el\n },\n})\n","import { ariaHidden } from \"@zag-js/aria-hidden\"\nimport { createMachine } from \"@zag-js/core\"\nimport { trackDismissableElement } from \"@zag-js/dismissable\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { preventBodyScroll } from \"@zag-js/remove-scroll\"\nimport { proxyTabFocus } from \"@zag-js/tabbable\"\nimport { compact, runIfFn } from \"@zag-js/utils\"\nimport { createFocusTrap, type FocusTrap } from \"focus-trap\"\nimport { dom } from \"./popover.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./popover.types\"\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n id: \"popover\",\n initial: ctx.open ? \"open\" : \"closed\",\n context: {\n closeOnInteractOutside: true,\n closeOnEsc: true,\n autoFocus: true,\n modal: false,\n portalled: true,\n positioning: {\n placement: \"bottom\",\n ...ctx.positioning,\n },\n currentPlacement: undefined,\n ...ctx,\n renderedElements: {\n title: true,\n description: true,\n },\n },\n\n computed: {\n currentPortalled: (ctx) => !!ctx.modal || !!ctx.portalled,\n },\n\n watch: {\n open: [\"toggleVisibility\"],\n },\n\n entry: [\"checkRenderedElements\"],\n\n states: {\n closed: {\n on: {\n \"CONTROLLED.OPEN\": {\n target: \"open\",\n actions: [\"setInitialFocus\"],\n },\n TOGGLE: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnOpen\"],\n },\n {\n target: \"open\",\n actions: [\"invokeOnOpen\", \"setInitialFocus\"],\n },\n ],\n OPEN: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnOpen\"],\n },\n {\n target: \"open\",\n actions: [\"invokeOnOpen\", \"setInitialFocus\"],\n },\n ],\n },\n },\n\n open: {\n activities: [\n \"trapFocus\",\n \"preventScroll\",\n \"hideContentBelow\",\n \"trackPositioning\",\n \"trackDismissableElement\",\n \"proxyTabFocus\",\n ],\n on: {\n \"CONTROLLED.CLOSE\": {\n target: \"closed\",\n actions: [\"restoreFocus\"],\n },\n CLOSE: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnClose\"],\n },\n {\n target: \"closed\",\n actions: [\"invokeOnClose\", \"restoreFocus\"],\n },\n ],\n TOGGLE: [\n {\n guard: \"isOpenControlled\",\n actions: [\"invokeOnClose\"],\n },\n {\n target: \"closed\",\n actions: [\"invokeOnClose\"],\n },\n ],\n \"POSITIONING.SET\": {\n actions: \"reposition\",\n },\n },\n },\n },\n },\n {\n guards: {\n isOpenControlled: (ctx) => !!ctx[\"open.controlled\"],\n },\n activities: {\n trackPositioning(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n return getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n defer: true,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n trackDismissableElement(ctx, _evt, { send }) {\n const getContentEl = () => dom.getContentEl(ctx)\n let restoreFocus = true\n return trackDismissableElement(getContentEl, {\n pointerBlocking: ctx.modal,\n exclude: dom.getTriggerEl(ctx),\n defer: true,\n onEscapeKeyDown(event) {\n ctx.onEscapeKeyDown?.(event)\n if (ctx.closeOnEsc) return\n event.preventDefault()\n },\n onInteractOutside(event) {\n ctx.onInteractOutside?.(event)\n if (event.defaultPrevented) return\n restoreFocus = !(event.detail.focusable || event.detail.contextmenu)\n if (!ctx.closeOnInteractOutside) {\n event.preventDefault()\n }\n },\n onPointerDownOutside: ctx.onPointerDownOutside,\n onFocusOutside: ctx.onFocusOutside,\n onDismiss() {\n send({ type: \"CLOSE\", src: \"interact-outside\", restoreFocus })\n },\n })\n },\n proxyTabFocus(ctx) {\n if (ctx.modal || !ctx.portalled) return\n const getContentEl = () => dom.getContentEl(ctx)\n return proxyTabFocus(getContentEl, {\n triggerElement: dom.getTriggerEl(ctx),\n defer: true,\n onFocus(el) {\n el.focus({ preventScroll: true })\n },\n })\n },\n hideContentBelow(ctx) {\n if (!ctx.modal) return\n const getElements = () => [dom.getContentEl(ctx), dom.getTriggerEl(ctx)]\n return ariaHidden(getElements, { defer: true })\n },\n preventScroll(ctx) {\n if (!ctx.modal) return\n return preventBodyScroll(dom.getDoc(ctx))\n },\n trapFocus(ctx) {\n if (!ctx.modal) return\n let trap: FocusTrap | undefined\n nextTick(() => {\n const el = dom.getContentEl(ctx)\n if (!el) return\n trap = createFocusTrap(el, {\n escapeDeactivates: false,\n allowOutsideClick: true,\n preventScroll: true,\n returnFocusOnDeactivate: true,\n document: dom.getDoc(ctx),\n fallbackFocus: el,\n initialFocus: runIfFn(ctx.initialFocusEl),\n })\n try {\n trap.activate()\n } catch {}\n })\n return () => trap?.deactivate()\n },\n },\n actions: {\n reposition(ctx, evt) {\n const anchorEl = dom.getAnchorEl(ctx) ?? dom.getTriggerEl(ctx)\n const getPositionerEl = () => dom.getPositionerEl(ctx)\n getPlacement(anchorEl, getPositionerEl, {\n ...ctx.positioning,\n ...evt.options,\n defer: true,\n listeners: false,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n },\n })\n },\n checkRenderedElements(ctx) {\n raf(() => {\n Object.assign(ctx.renderedElements, {\n title: !!dom.getTitleEl(ctx),\n description: !!dom.getDescriptionEl(ctx),\n })\n })\n },\n setInitialFocus(ctx) {\n raf(() => {\n dom.getInitialFocusEl(ctx)?.focus({ preventScroll: true })\n })\n },\n restoreFocus(ctx, evt) {\n if (!evt.restoreFocus) return\n raf(() => {\n dom.getTriggerEl(ctx)?.focus({ preventScroll: true })\n })\n },\n invokeOnOpen(ctx) {\n ctx.onOpenChange?.({ open: true })\n },\n invokeOnClose(ctx) {\n ctx.onOpenChange?.({ open: false })\n },\n toggleVisibility(ctx, evt, { send }) {\n send({ type: ctx.open ? \"CONTROLLED.OPEN\" : \"CONTROLLED.CLOSE\", previousEvent: evt })\n },\n },\n },\n )\n}\n"],"mappings":"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","names":["runIfFn","ctx","runIfFn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/popover",
3
- "version": "0.34.0",
3
+ "version": "0.36.0",
4
4
  "description": "Core logic for the popover widget implemented as a state machine",
5
5
  "keywords": [
6
6
  "js",
@@ -28,16 +28,16 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "focus-trap": "7.5.4",
31
- "@zag-js/anatomy": "0.34.0",
32
- "@zag-js/aria-hidden": "0.34.0",
33
- "@zag-js/core": "0.34.0",
34
- "@zag-js/dom-query": "0.34.0",
35
- "@zag-js/utils": "0.34.0",
36
- "@zag-js/dismissable": "0.34.0",
37
- "@zag-js/tabbable": "0.34.0",
38
- "@zag-js/popper": "0.34.0",
39
- "@zag-js/remove-scroll": "0.34.0",
40
- "@zag-js/types": "0.34.0"
31
+ "@zag-js/anatomy": "0.36.0",
32
+ "@zag-js/aria-hidden": "0.36.0",
33
+ "@zag-js/core": "0.36.0",
34
+ "@zag-js/dom-query": "0.36.0",
35
+ "@zag-js/dismissable": "0.36.0",
36
+ "@zag-js/utils": "0.36.0",
37
+ "@zag-js/tabbable": "0.36.0",
38
+ "@zag-js/popper": "0.36.0",
39
+ "@zag-js/remove-scroll": "0.36.0",
40
+ "@zag-js/types": "0.36.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "clean-package": "2.2.0"
@@ -27,7 +27,7 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
27
27
  send("CLOSE")
28
28
  },
29
29
  reposition(options = {}) {
30
- send({ type: "SET_POSITIONING", options })
30
+ send({ type: "POSITIONING.SET", options })
31
31
  },
32
32
 
33
33
  arrowProps: normalize.element({
@@ -113,7 +113,7 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
113
113
  type: "button",
114
114
  "aria-label": "close",
115
115
  onClick() {
116
- send("REQUEST_CLOSE")
116
+ send("CLOSE")
117
117
  },
118
118
  }),
119
119
  }
@@ -47,14 +47,30 @@ export function machine(userContext: UserDefinedContext) {
47
47
  states: {
48
48
  closed: {
49
49
  on: {
50
- TOGGLE: {
50
+ "CONTROLLED.OPEN": {
51
51
  target: "open",
52
- actions: ["invokeOnOpen"],
53
- },
54
- OPEN: {
55
- target: "open",
56
- actions: ["invokeOnOpen"],
52
+ actions: ["setInitialFocus"],
57
53
  },
54
+ TOGGLE: [
55
+ {
56
+ guard: "isOpenControlled",
57
+ actions: ["invokeOnOpen"],
58
+ },
59
+ {
60
+ target: "open",
61
+ actions: ["invokeOnOpen", "setInitialFocus"],
62
+ },
63
+ ],
64
+ OPEN: [
65
+ {
66
+ guard: "isOpenControlled",
67
+ actions: ["invokeOnOpen"],
68
+ },
69
+ {
70
+ target: "open",
71
+ actions: ["invokeOnOpen", "setInitialFocus"],
72
+ },
73
+ ],
58
74
  },
59
75
  },
60
76
 
@@ -67,21 +83,32 @@ export function machine(userContext: UserDefinedContext) {
67
83
  "trackDismissableElement",
68
84
  "proxyTabFocus",
69
85
  ],
70
- entry: ["setInitialFocus"],
71
86
  on: {
72
- CLOSE: {
73
- target: "closed",
74
- actions: ["invokeOnClose"],
75
- },
76
- REQUEST_CLOSE: {
87
+ "CONTROLLED.CLOSE": {
77
88
  target: "closed",
78
- actions: ["restoreFocusIfNeeded", "invokeOnClose"],
89
+ actions: ["restoreFocus"],
79
90
  },
80
- TOGGLE: {
81
- target: "closed",
82
- actions: ["invokeOnClose"],
83
- },
84
- SET_POSITIONING: {
91
+ CLOSE: [
92
+ {
93
+ guard: "isOpenControlled",
94
+ actions: ["invokeOnClose"],
95
+ },
96
+ {
97
+ target: "closed",
98
+ actions: ["invokeOnClose", "restoreFocus"],
99
+ },
100
+ ],
101
+ TOGGLE: [
102
+ {
103
+ guard: "isOpenControlled",
104
+ actions: ["invokeOnClose"],
105
+ },
106
+ {
107
+ target: "closed",
108
+ actions: ["invokeOnClose"],
109
+ },
110
+ ],
111
+ "POSITIONING.SET": {
85
112
  actions: "reposition",
86
113
  },
87
114
  },
@@ -89,6 +116,9 @@ export function machine(userContext: UserDefinedContext) {
89
116
  },
90
117
  },
91
118
  {
119
+ guards: {
120
+ isOpenControlled: (ctx) => !!ctx["open.controlled"],
121
+ },
92
122
  activities: {
93
123
  trackPositioning(ctx) {
94
124
  ctx.currentPlacement = ctx.positioning.placement
@@ -125,7 +155,7 @@ export function machine(userContext: UserDefinedContext) {
125
155
  onPointerDownOutside: ctx.onPointerDownOutside,
126
156
  onFocusOutside: ctx.onFocusOutside,
127
157
  onDismiss() {
128
- send({ type: "REQUEST_CLOSE", src: "interact-outside", restoreFocus })
158
+ send({ type: "CLOSE", src: "interact-outside", restoreFocus })
129
159
  },
130
160
  })
131
161
  },
@@ -198,7 +228,7 @@ export function machine(userContext: UserDefinedContext) {
198
228
  dom.getInitialFocusEl(ctx)?.focus({ preventScroll: true })
199
229
  })
200
230
  },
201
- restoreFocusIfNeeded(ctx, evt) {
231
+ restoreFocus(ctx, evt) {
202
232
  if (!evt.restoreFocus) return
203
233
  raf(() => {
204
234
  dom.getTriggerEl(ctx)?.focus({ preventScroll: true })
@@ -210,8 +240,8 @@ export function machine(userContext: UserDefinedContext) {
210
240
  invokeOnClose(ctx) {
211
241
  ctx.onOpenChange?.({ open: false })
212
242
  },
213
- toggleVisibility(ctx, _evt, { send }) {
214
- send({ type: ctx.open ? "OPEN" : "CLOSE", src: "controlled" })
243
+ toggleVisibility(ctx, evt, { send }) {
244
+ send({ type: ctx.open ? "CONTROLLED.OPEN" : "CONTROLLED.CLOSE", previousEvent: evt })
215
245
  },
216
246
  },
217
247
  },
@@ -76,6 +76,10 @@ interface PublicContext extends DismissableElementHandlers, CommonProperties, Di
76
76
  * Whether the popover is open
77
77
  */
78
78
  open?: boolean
79
+ /**
80
+ * Whether the popover is controlled by the user
81
+ */
82
+ "open.controlled"?: boolean
79
83
  }
80
84
 
81
85
  export type UserDefinedContext = RequiredBy<PublicContext, "id">