@zag-js/popper 0.1.5 → 0.1.8

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.
@@ -5,5 +5,4 @@ export declare type AutoUpdateOptions = {
5
5
  ancestorResize?: boolean;
6
6
  referenceResize?: boolean;
7
7
  };
8
- export declare function autoUpdate(reference: ReferenceElement, floating: HTMLElement, update: () => void, options?: boolean | AutoUpdateOptions): (v: void) => void;
9
- //# sourceMappingURL=auto-update.d.ts.map
8
+ export declare function autoUpdate(reference: ReferenceElement, floating: HTMLElement, update: () => void, options?: boolean | AutoUpdateOptions): () => void;
@@ -1,4 +1,4 @@
1
- import type { VirtualElement } from "@floating-ui/dom";
2
- import { PositioningOptions } from "./types";
3
- export declare function getPlacement(reference: HTMLElement | VirtualElement | null, floating: HTMLElement | null, options?: PositioningOptions): (v: void) => void;
4
- //# sourceMappingURL=get-placement.d.ts.map
1
+ import type { Placement, VirtualElement } from "@floating-ui/dom";
2
+ import type { BasePlacement, PositioningOptions } from "./types";
3
+ export declare function getPlacement(reference: HTMLElement | VirtualElement | null, floating: HTMLElement | null, opts?: PositioningOptions): () => void;
4
+ export declare function getBasePlacement(placement: Placement): BasePlacement;
@@ -1,4 +1,4 @@
1
- import { Placement } from "@floating-ui/dom";
1
+ import type { Placement } from "@floating-ui/dom";
2
2
  declare type Options = {
3
3
  measured: boolean;
4
4
  strategy?: "absolute" | "fixed";
@@ -33,4 +33,3 @@ export declare function getPlacementStyles(options: Options): {
33
33
  };
34
34
  };
35
35
  export {};
36
- //# sourceMappingURL=get-styles.d.ts.map
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export { getPlacement } from "./get-placement";
1
+ export { getPlacement, getBasePlacement } from "./get-placement";
2
2
  export { getPlacementStyles } from "./get-styles";
3
3
  export type { Placement, PositioningOptions } from "./types";
4
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
+ "use strict";
1
2
  var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
2
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
3
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
4
7
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
@@ -16,6 +19,7 @@ var __spreadValues = (a, b) => {
16
19
  }
17
20
  return a;
18
21
  };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
19
23
  var __export = (target, all) => {
20
24
  for (var name in all)
21
25
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -33,6 +37,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
33
37
  // src/index.ts
34
38
  var src_exports = {};
35
39
  __export(src_exports, {
40
+ getBasePlacement: () => getBasePlacement,
36
41
  getPlacement: () => getPlacement,
37
42
  getPlacementStyles: () => getPlacementStyles
38
43
  });
@@ -42,119 +47,32 @@ module.exports = __toCommonJS(src_exports);
42
47
  var import_dom2 = require("@floating-ui/dom");
43
48
 
44
49
  // ../core/dist/index.mjs
45
- var isDom = () => typeof window !== "undefined";
46
- var isBoolean = (v) => v === true || v === false;
47
- var isTouchDevice = isDom() && !!navigator.maxTouchPoints;
48
- var noop = () => {
50
+ var callAll = (...fns) => (...a) => {
51
+ fns.forEach(function(fn) {
52
+ fn == null ? void 0 : fn(...a);
53
+ });
49
54
  };
50
- var pipe = (...fns) => (v) => fns.reduce((a, b) => b(a), v);
55
+ var isBoolean = (v) => v === true || v === false;
51
56
 
52
57
  // src/auto-update.ts
53
58
  var import_dom = require("@floating-ui/dom");
54
59
 
55
60
  // ../dom/dist/index.mjs
56
- var isDom2 = () => typeof window !== "undefined";
57
- var hasProp = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
58
- var isTouchDevice2 = isDom2() && !!navigator.maxTouchPoints;
59
61
  var runIfFn = (v, ...a) => {
60
62
  const res = typeof v === "function" ? v(...a) : v;
61
63
  return res != null ? res : void 0;
62
64
  };
63
- var noop2 = () => {
64
- };
65
- function getListenerElements() {
66
- ;
67
- globalThis.__listenerElements__ = globalThis.__listenerElements__ || /* @__PURE__ */ new Map();
68
- return globalThis.__listenerElements__;
69
- }
70
- function getListenerCache() {
71
- ;
72
- globalThis.__listenerCache__ = globalThis.__listenerCache__ || /* @__PURE__ */ new Map();
73
- return globalThis.__listenerCache__;
74
- }
75
- function addGlobalEventListener(node, type, handler, options) {
76
- var _a;
77
- if (!node)
78
- return noop2;
79
- const hash = JSON.stringify({ type, options });
80
- const listenerElements = getListenerElements();
81
- const listenerCache = getListenerCache();
82
- const group = listenerElements.get(node);
83
- if (!listenerElements.has(node)) {
84
- const group2 = /* @__PURE__ */ new Map([[hash, /* @__PURE__ */ new Set([handler])]]);
85
- listenerElements.set(node, group2);
86
- } else if (group == null ? void 0 : group.has(hash)) {
87
- (_a = group == null ? void 0 : group.get(hash)) == null ? void 0 : _a.add(handler);
88
- } else {
89
- group == null ? void 0 : group.set(hash, /* @__PURE__ */ new Set([handler]));
90
- }
91
- function attach(node2) {
92
- var _a2, _b;
93
- function listener(event) {
94
- var _a3;
95
- const group2 = listenerElements.get(node2);
96
- (_a3 = group2 == null ? void 0 : group2.get(hash)) == null ? void 0 : _a3.forEach((fn) => fn(event));
97
- }
98
- if (!(listenerCache == null ? void 0 : listenerCache.has(node2))) {
99
- listenerCache.set(node2, /* @__PURE__ */ new Map([[hash, listener]]));
100
- node2.addEventListener(type, listener, options);
101
- return;
102
- }
103
- if (!((_a2 = listenerCache == null ? void 0 : listenerCache.get(node2)) == null ? void 0 : _a2.has(hash))) {
104
- (_b = listenerCache.get(node2)) == null ? void 0 : _b.set(hash, listener);
105
- node2.addEventListener(type, listener, options);
106
- }
107
- }
108
- attach(node);
109
- return function remove() {
110
- var _a2, _b, _c, _d;
111
- if (!listenerElements.has(node))
112
- return;
113
- const group2 = listenerElements.get(node);
114
- (_a2 = group2 == null ? void 0 : group2.get(hash)) == null ? void 0 : _a2.delete(handler);
115
- if (((_b = group2 == null ? void 0 : group2.get(hash)) == null ? void 0 : _b.size) === 0) {
116
- const listener = (_c = listenerCache.get(node)) == null ? void 0 : _c.get(hash);
117
- node.removeEventListener(type, listener, options);
118
- group2 == null ? void 0 : group2.delete(hash);
119
- (_d = listenerCache.get(node)) == null ? void 0 : _d.delete(hash);
120
- if ((group2 == null ? void 0 : group2.size) === 0) {
121
- listenerElements.delete(node);
122
- listenerCache.delete(node);
123
- }
124
- }
125
- };
126
- }
127
- var isRef = (v) => hasProp(v, "current");
128
- function addDomEvent(target, event, listener, options) {
129
- const node = isRef(target) ? target.current : runIfFn(target);
130
- return addGlobalEventListener(node, event, listener, options);
131
- }
65
+ var hasProp = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
132
66
  function isHTMLElement(v) {
133
67
  return typeof v === "object" && (v == null ? void 0 : v.nodeType) === Node.ELEMENT_NODE && typeof (v == null ? void 0 : v.nodeName) === "string";
134
68
  }
135
- function itemById(v, id) {
136
- return v.find((node) => node.id === id);
137
- }
138
- function indexOfId(v, id) {
139
- const item = itemById(v, id);
140
- return item ? v.indexOf(item) : -1;
141
- }
142
- var getValueText = (item) => {
143
- var _a, _b;
144
- return (_b = (_a = item.dataset.valuetext) != null ? _a : item.textContent) != null ? _b : "";
145
- };
146
- var match = (valueText, query2) => valueText.toLowerCase().startsWith(query2.toLowerCase());
147
- var wrap = (v, idx) => {
148
- return v.map((_, index) => v[(Math.max(idx, 0) + index) % v.length]);
149
- };
150
- function findByText(v, text, currentId) {
151
- const index = currentId ? indexOfId(v, currentId) : -1;
152
- let items = currentId ? wrap(v, index) : v;
153
- const isSingleKey = text.length === 1;
154
- if (isSingleKey) {
155
- items = items.filter((item) => item.id !== currentId);
156
- }
157
- return items.find((item) => match(getValueText(item), text));
69
+ var isRef = (v) => hasProp(v, "current");
70
+ function addDomEvent(target, eventName, handler, options) {
71
+ const node = isRef(target) ? target.current : runIfFn(target);
72
+ node == null ? void 0 : node.addEventListener(eventName, handler, options);
73
+ return () => {
74
+ node == null ? void 0 : node.removeEventListener(eventName, handler, options);
75
+ };
158
76
  }
159
77
  function getObservedElements() {
160
78
  ;
@@ -208,34 +126,6 @@ function runLoop() {
208
126
  function isEqual(rect1, rect2) {
209
127
  return rect1.width === rect2.width && rect1.height === rect2.height && rect1.top === rect2.top && rect1.right === rect2.right && rect1.bottom === rect2.bottom && rect1.left === rect2.left;
210
128
  }
211
- function findByTypeahead(_items, options) {
212
- const { state: state2, activeId, key, timeout = 350 } = options;
213
- const search = state2.keysSoFar + key;
214
- const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
215
- const query2 = isRepeated ? search[0] : search;
216
- let items = _items.slice();
217
- const next = findByText(items, query2, activeId);
218
- function cleanup() {
219
- clearTimeout(state2.timer);
220
- state2.timer = -1;
221
- }
222
- function update(value) {
223
- state2.keysSoFar = value;
224
- cleanup();
225
- if (value !== "") {
226
- state2.timer = +setTimeout(() => {
227
- update("");
228
- cleanup();
229
- }, timeout);
230
- }
231
- }
232
- update(search);
233
- return next;
234
- }
235
- findByTypeahead.defaultOptions = {
236
- keysSoFar: "",
237
- timer: -1
238
- };
239
129
 
240
130
  // src/auto-update.ts
241
131
  function resolveOptions(option) {
@@ -259,13 +149,13 @@ function autoUpdate(reference, floating, update, options = false) {
259
149
  if (referenceResize && isHTMLElement(reference)) {
260
150
  cleanups.push(observeElementRect(reference, update));
261
151
  }
262
- cleanups.push(pipe(...ancestors.map((el) => addDomEvent(el, "resize", update))));
152
+ cleanups.push(callAll(...ancestors.map((el) => addDomEvent(el, "resize", update))));
263
153
  return () => cleanups.forEach((fn) => fn());
264
154
  }
265
155
  function addScrollListeners() {
266
- return pipe(...ancestors.map((el) => addDomEvent(el, "scroll", update, { passive: true })));
156
+ return callAll(...ancestors.map((el) => addDomEvent(el, "scroll", update, { passive: true })));
267
157
  }
268
- return pipe(addResizeListeners(), addScrollListeners());
158
+ return callAll(addResizeListeners(), addScrollListeners());
269
159
  }
270
160
 
271
161
  // src/middleware.ts
@@ -306,20 +196,16 @@ var transformOrigin = {
306
196
  var shiftArrow = (opts) => ({
307
197
  name: "shiftArrow",
308
198
  fn({ placement, middlewareData }) {
309
- var _a;
310
199
  const { element: arrow2 } = opts;
311
- const { x, y } = (_a = middlewareData.arrow) != null ? _a : { x: 0, y: 0 };
312
- const dir = {
313
- top: "bottom",
314
- right: "left",
315
- bottom: "top",
316
- left: "right"
317
- }[placement.split("-")[0]];
318
- Object.assign(arrow2.style, {
319
- top: `${y}px`,
320
- left: `${x}px`,
321
- [dir]: cssVars.arrowOffset.reference
322
- });
200
+ if (middlewareData.arrow) {
201
+ const { x, y } = middlewareData.arrow;
202
+ const dir = placement.split("-")[0];
203
+ Object.assign(arrow2.style, {
204
+ left: x != null ? `${x}px` : "",
205
+ top: y != null ? `${y}px` : "",
206
+ [dir]: `calc(100% + ${cssVars.arrowOffset.reference})`
207
+ });
208
+ }
323
209
  return {};
324
210
  }
325
211
  });
@@ -334,11 +220,10 @@ var defaultOptions = {
334
220
  sameWidth: false,
335
221
  overflowPadding: 8
336
222
  };
337
- function getPlacement(reference, floating, options = {}) {
338
- var _a;
339
- if (reference == null || floating == null)
340
- return noop;
341
- options = Object.assign({}, defaultOptions, options);
223
+ function getPlacement(reference, floating, opts = {}) {
224
+ if (!floating || !reference)
225
+ return;
226
+ const options = Object.assign({}, defaultOptions, opts);
342
227
  const arrowEl = floating.querySelector("[data-part=arrow]");
343
228
  const middleware = [];
344
229
  if (options.flip) {
@@ -363,35 +248,37 @@ function getPlacement(reference, floating, options = {}) {
363
248
  middleware.push((0, import_dom2.arrow)({ element: arrowEl, padding: 8 }), shiftArrow({ element: arrowEl }));
364
249
  }
365
250
  middleware.push(transformOrigin);
366
- if (options.sameWidth || options.fitViewport) {
367
- middleware.push((0, import_dom2.size)({
368
- padding: options.overflowPadding,
369
- apply(data) {
370
- const { reference: reference2, height, width } = data;
371
- if (options.sameWidth) {
372
- Object.assign(floating.style, {
373
- width: `${reference2.width}px`,
374
- minWidth: "unset"
375
- });
376
- }
377
- if (options.fitViewport) {
378
- Object.assign(floating.style, {
379
- maxWidth: `${width}px`,
380
- maxHeight: `${height}px`
381
- });
382
- }
251
+ middleware.push((0, import_dom2.size)({
252
+ padding: options.overflowPadding,
253
+ apply({ rects, availableHeight, availableWidth }) {
254
+ const referenceWidth = Math.round(rects.reference.width);
255
+ floating.style.setProperty("--reference-width", `${referenceWidth}px`);
256
+ floating.style.setProperty("--available-width", `${availableWidth}px`);
257
+ floating.style.setProperty("--available-height", `${availableHeight}px`);
258
+ if (options.sameWidth) {
259
+ Object.assign(floating.style, {
260
+ width: `${referenceWidth}px`,
261
+ minWidth: "unset"
262
+ });
383
263
  }
384
- }));
385
- }
386
- function compute() {
387
- if (reference == null || floating == null)
264
+ if (options.fitViewport) {
265
+ Object.assign(floating.style, {
266
+ maxWidth: `${availableWidth}px`,
267
+ maxHeight: `${availableHeight}px`
268
+ });
269
+ }
270
+ }
271
+ }));
272
+ function compute(config = {}) {
273
+ if (!reference || !floating)
388
274
  return;
389
275
  const { placement, strategy } = options;
390
- (0, import_dom2.computePosition)(reference, floating, {
276
+ (0, import_dom2.computePosition)(reference, floating, __spreadValues({
391
277
  placement,
392
278
  middleware,
393
279
  strategy
394
- }).then((data) => {
280
+ }, config)).then((data) => {
281
+ var _a;
395
282
  const x = Math.round(data.x);
396
283
  const y = Math.round(data.y);
397
284
  Object.assign(floating.style, {
@@ -400,14 +287,14 @@ function getPlacement(reference, floating, options = {}) {
400
287
  left: "0",
401
288
  transform: `translate3d(${x}px, ${y}px, 0)`
402
289
  });
403
- return data;
404
- }).then((data) => {
405
- var _a2;
406
- (_a2 = options.onComplete) == null ? void 0 : _a2.call(options, data);
290
+ (_a = options.onComplete) == null ? void 0 : _a.call(options, __spreadProps(__spreadValues({}, data), { compute }));
407
291
  });
408
292
  }
409
293
  compute();
410
- return pipe(autoUpdate(reference, floating, compute, options.listeners), (_a = options.onCleanup) != null ? _a : noop);
294
+ return callAll(options.listeners ? autoUpdate(reference, floating, compute, options.listeners) : void 0, options.onCleanup);
295
+ }
296
+ function getBasePlacement(placement) {
297
+ return placement.split("-")[0];
411
298
  }
412
299
 
413
300
  // src/get-styles.ts
@@ -452,4 +339,3 @@ function getPlacementStyles(options) {
452
339
  }, !measured && UNMEASURED_FLOATING_STYLE)
453
340
  };
454
341
  }
455
- //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
1
  var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
2
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
4
6
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
@@ -14,124 +16,38 @@ var __spreadValues = (a, b) => {
14
16
  }
15
17
  return a;
16
18
  };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
17
20
 
18
21
  // src/get-placement.ts
19
22
  import { arrow, computePosition, flip, offset, shift, size } from "@floating-ui/dom";
20
23
 
21
24
  // ../core/dist/index.mjs
22
- var isDom = () => typeof window !== "undefined";
23
- var isBoolean = (v) => v === true || v === false;
24
- var isTouchDevice = isDom() && !!navigator.maxTouchPoints;
25
- var noop = () => {
25
+ var callAll = (...fns) => (...a) => {
26
+ fns.forEach(function(fn) {
27
+ fn == null ? void 0 : fn(...a);
28
+ });
26
29
  };
27
- var pipe = (...fns) => (v) => fns.reduce((a, b) => b(a), v);
30
+ var isBoolean = (v) => v === true || v === false;
28
31
 
29
32
  // src/auto-update.ts
30
33
  import { getOverflowAncestors } from "@floating-ui/dom";
31
34
 
32
35
  // ../dom/dist/index.mjs
33
- var isDom2 = () => typeof window !== "undefined";
34
- var hasProp = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
35
- var isTouchDevice2 = isDom2() && !!navigator.maxTouchPoints;
36
36
  var runIfFn = (v, ...a) => {
37
37
  const res = typeof v === "function" ? v(...a) : v;
38
38
  return res != null ? res : void 0;
39
39
  };
40
- var noop2 = () => {
41
- };
42
- function getListenerElements() {
43
- ;
44
- globalThis.__listenerElements__ = globalThis.__listenerElements__ || /* @__PURE__ */ new Map();
45
- return globalThis.__listenerElements__;
46
- }
47
- function getListenerCache() {
48
- ;
49
- globalThis.__listenerCache__ = globalThis.__listenerCache__ || /* @__PURE__ */ new Map();
50
- return globalThis.__listenerCache__;
51
- }
52
- function addGlobalEventListener(node, type, handler, options) {
53
- var _a;
54
- if (!node)
55
- return noop2;
56
- const hash = JSON.stringify({ type, options });
57
- const listenerElements = getListenerElements();
58
- const listenerCache = getListenerCache();
59
- const group = listenerElements.get(node);
60
- if (!listenerElements.has(node)) {
61
- const group2 = /* @__PURE__ */ new Map([[hash, /* @__PURE__ */ new Set([handler])]]);
62
- listenerElements.set(node, group2);
63
- } else if (group == null ? void 0 : group.has(hash)) {
64
- (_a = group == null ? void 0 : group.get(hash)) == null ? void 0 : _a.add(handler);
65
- } else {
66
- group == null ? void 0 : group.set(hash, /* @__PURE__ */ new Set([handler]));
67
- }
68
- function attach(node2) {
69
- var _a2, _b;
70
- function listener(event) {
71
- var _a3;
72
- const group2 = listenerElements.get(node2);
73
- (_a3 = group2 == null ? void 0 : group2.get(hash)) == null ? void 0 : _a3.forEach((fn) => fn(event));
74
- }
75
- if (!(listenerCache == null ? void 0 : listenerCache.has(node2))) {
76
- listenerCache.set(node2, /* @__PURE__ */ new Map([[hash, listener]]));
77
- node2.addEventListener(type, listener, options);
78
- return;
79
- }
80
- if (!((_a2 = listenerCache == null ? void 0 : listenerCache.get(node2)) == null ? void 0 : _a2.has(hash))) {
81
- (_b = listenerCache.get(node2)) == null ? void 0 : _b.set(hash, listener);
82
- node2.addEventListener(type, listener, options);
83
- }
84
- }
85
- attach(node);
86
- return function remove() {
87
- var _a2, _b, _c, _d;
88
- if (!listenerElements.has(node))
89
- return;
90
- const group2 = listenerElements.get(node);
91
- (_a2 = group2 == null ? void 0 : group2.get(hash)) == null ? void 0 : _a2.delete(handler);
92
- if (((_b = group2 == null ? void 0 : group2.get(hash)) == null ? void 0 : _b.size) === 0) {
93
- const listener = (_c = listenerCache.get(node)) == null ? void 0 : _c.get(hash);
94
- node.removeEventListener(type, listener, options);
95
- group2 == null ? void 0 : group2.delete(hash);
96
- (_d = listenerCache.get(node)) == null ? void 0 : _d.delete(hash);
97
- if ((group2 == null ? void 0 : group2.size) === 0) {
98
- listenerElements.delete(node);
99
- listenerCache.delete(node);
100
- }
101
- }
102
- };
103
- }
104
- var isRef = (v) => hasProp(v, "current");
105
- function addDomEvent(target, event, listener, options) {
106
- const node = isRef(target) ? target.current : runIfFn(target);
107
- return addGlobalEventListener(node, event, listener, options);
108
- }
40
+ var hasProp = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
109
41
  function isHTMLElement(v) {
110
42
  return typeof v === "object" && (v == null ? void 0 : v.nodeType) === Node.ELEMENT_NODE && typeof (v == null ? void 0 : v.nodeName) === "string";
111
43
  }
112
- function itemById(v, id) {
113
- return v.find((node) => node.id === id);
114
- }
115
- function indexOfId(v, id) {
116
- const item = itemById(v, id);
117
- return item ? v.indexOf(item) : -1;
118
- }
119
- var getValueText = (item) => {
120
- var _a, _b;
121
- return (_b = (_a = item.dataset.valuetext) != null ? _a : item.textContent) != null ? _b : "";
122
- };
123
- var match = (valueText, query2) => valueText.toLowerCase().startsWith(query2.toLowerCase());
124
- var wrap = (v, idx) => {
125
- return v.map((_, index) => v[(Math.max(idx, 0) + index) % v.length]);
126
- };
127
- function findByText(v, text, currentId) {
128
- const index = currentId ? indexOfId(v, currentId) : -1;
129
- let items = currentId ? wrap(v, index) : v;
130
- const isSingleKey = text.length === 1;
131
- if (isSingleKey) {
132
- items = items.filter((item) => item.id !== currentId);
133
- }
134
- return items.find((item) => match(getValueText(item), text));
44
+ var isRef = (v) => hasProp(v, "current");
45
+ function addDomEvent(target, eventName, handler, options) {
46
+ const node = isRef(target) ? target.current : runIfFn(target);
47
+ node == null ? void 0 : node.addEventListener(eventName, handler, options);
48
+ return () => {
49
+ node == null ? void 0 : node.removeEventListener(eventName, handler, options);
50
+ };
135
51
  }
136
52
  function getObservedElements() {
137
53
  ;
@@ -185,34 +101,6 @@ function runLoop() {
185
101
  function isEqual(rect1, rect2) {
186
102
  return rect1.width === rect2.width && rect1.height === rect2.height && rect1.top === rect2.top && rect1.right === rect2.right && rect1.bottom === rect2.bottom && rect1.left === rect2.left;
187
103
  }
188
- function findByTypeahead(_items, options) {
189
- const { state: state2, activeId, key, timeout = 350 } = options;
190
- const search = state2.keysSoFar + key;
191
- const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
192
- const query2 = isRepeated ? search[0] : search;
193
- let items = _items.slice();
194
- const next = findByText(items, query2, activeId);
195
- function cleanup() {
196
- clearTimeout(state2.timer);
197
- state2.timer = -1;
198
- }
199
- function update(value) {
200
- state2.keysSoFar = value;
201
- cleanup();
202
- if (value !== "") {
203
- state2.timer = +setTimeout(() => {
204
- update("");
205
- cleanup();
206
- }, timeout);
207
- }
208
- }
209
- update(search);
210
- return next;
211
- }
212
- findByTypeahead.defaultOptions = {
213
- keysSoFar: "",
214
- timer: -1
215
- };
216
104
 
217
105
  // src/auto-update.ts
218
106
  function resolveOptions(option) {
@@ -236,13 +124,13 @@ function autoUpdate(reference, floating, update, options = false) {
236
124
  if (referenceResize && isHTMLElement(reference)) {
237
125
  cleanups.push(observeElementRect(reference, update));
238
126
  }
239
- cleanups.push(pipe(...ancestors.map((el) => addDomEvent(el, "resize", update))));
127
+ cleanups.push(callAll(...ancestors.map((el) => addDomEvent(el, "resize", update))));
240
128
  return () => cleanups.forEach((fn) => fn());
241
129
  }
242
130
  function addScrollListeners() {
243
- return pipe(...ancestors.map((el) => addDomEvent(el, "scroll", update, { passive: true })));
131
+ return callAll(...ancestors.map((el) => addDomEvent(el, "scroll", update, { passive: true })));
244
132
  }
245
- return pipe(addResizeListeners(), addScrollListeners());
133
+ return callAll(addResizeListeners(), addScrollListeners());
246
134
  }
247
135
 
248
136
  // src/middleware.ts
@@ -283,20 +171,16 @@ var transformOrigin = {
283
171
  var shiftArrow = (opts) => ({
284
172
  name: "shiftArrow",
285
173
  fn({ placement, middlewareData }) {
286
- var _a;
287
174
  const { element: arrow2 } = opts;
288
- const { x, y } = (_a = middlewareData.arrow) != null ? _a : { x: 0, y: 0 };
289
- const dir = {
290
- top: "bottom",
291
- right: "left",
292
- bottom: "top",
293
- left: "right"
294
- }[placement.split("-")[0]];
295
- Object.assign(arrow2.style, {
296
- top: `${y}px`,
297
- left: `${x}px`,
298
- [dir]: cssVars.arrowOffset.reference
299
- });
175
+ if (middlewareData.arrow) {
176
+ const { x, y } = middlewareData.arrow;
177
+ const dir = placement.split("-")[0];
178
+ Object.assign(arrow2.style, {
179
+ left: x != null ? `${x}px` : "",
180
+ top: y != null ? `${y}px` : "",
181
+ [dir]: `calc(100% + ${cssVars.arrowOffset.reference})`
182
+ });
183
+ }
300
184
  return {};
301
185
  }
302
186
  });
@@ -311,11 +195,10 @@ var defaultOptions = {
311
195
  sameWidth: false,
312
196
  overflowPadding: 8
313
197
  };
314
- function getPlacement(reference, floating, options = {}) {
315
- var _a;
316
- if (reference == null || floating == null)
317
- return noop;
318
- options = Object.assign({}, defaultOptions, options);
198
+ function getPlacement(reference, floating, opts = {}) {
199
+ if (!floating || !reference)
200
+ return;
201
+ const options = Object.assign({}, defaultOptions, opts);
319
202
  const arrowEl = floating.querySelector("[data-part=arrow]");
320
203
  const middleware = [];
321
204
  if (options.flip) {
@@ -340,35 +223,37 @@ function getPlacement(reference, floating, options = {}) {
340
223
  middleware.push(arrow({ element: arrowEl, padding: 8 }), shiftArrow({ element: arrowEl }));
341
224
  }
342
225
  middleware.push(transformOrigin);
343
- if (options.sameWidth || options.fitViewport) {
344
- middleware.push(size({
345
- padding: options.overflowPadding,
346
- apply(data) {
347
- const { reference: reference2, height, width } = data;
348
- if (options.sameWidth) {
349
- Object.assign(floating.style, {
350
- width: `${reference2.width}px`,
351
- minWidth: "unset"
352
- });
353
- }
354
- if (options.fitViewport) {
355
- Object.assign(floating.style, {
356
- maxWidth: `${width}px`,
357
- maxHeight: `${height}px`
358
- });
359
- }
226
+ middleware.push(size({
227
+ padding: options.overflowPadding,
228
+ apply({ rects, availableHeight, availableWidth }) {
229
+ const referenceWidth = Math.round(rects.reference.width);
230
+ floating.style.setProperty("--reference-width", `${referenceWidth}px`);
231
+ floating.style.setProperty("--available-width", `${availableWidth}px`);
232
+ floating.style.setProperty("--available-height", `${availableHeight}px`);
233
+ if (options.sameWidth) {
234
+ Object.assign(floating.style, {
235
+ width: `${referenceWidth}px`,
236
+ minWidth: "unset"
237
+ });
360
238
  }
361
- }));
362
- }
363
- function compute() {
364
- if (reference == null || floating == null)
239
+ if (options.fitViewport) {
240
+ Object.assign(floating.style, {
241
+ maxWidth: `${availableWidth}px`,
242
+ maxHeight: `${availableHeight}px`
243
+ });
244
+ }
245
+ }
246
+ }));
247
+ function compute(config = {}) {
248
+ if (!reference || !floating)
365
249
  return;
366
250
  const { placement, strategy } = options;
367
- computePosition(reference, floating, {
251
+ computePosition(reference, floating, __spreadValues({
368
252
  placement,
369
253
  middleware,
370
254
  strategy
371
- }).then((data) => {
255
+ }, config)).then((data) => {
256
+ var _a;
372
257
  const x = Math.round(data.x);
373
258
  const y = Math.round(data.y);
374
259
  Object.assign(floating.style, {
@@ -377,14 +262,14 @@ function getPlacement(reference, floating, options = {}) {
377
262
  left: "0",
378
263
  transform: `translate3d(${x}px, ${y}px, 0)`
379
264
  });
380
- return data;
381
- }).then((data) => {
382
- var _a2;
383
- (_a2 = options.onComplete) == null ? void 0 : _a2.call(options, data);
265
+ (_a = options.onComplete) == null ? void 0 : _a.call(options, __spreadProps(__spreadValues({}, data), { compute }));
384
266
  });
385
267
  }
386
268
  compute();
387
- return pipe(autoUpdate(reference, floating, compute, options.listeners), (_a = options.onCleanup) != null ? _a : noop);
269
+ return callAll(options.listeners ? autoUpdate(reference, floating, compute, options.listeners) : void 0, options.onCleanup);
270
+ }
271
+ function getBasePlacement(placement) {
272
+ return placement.split("-")[0];
388
273
  }
389
274
 
390
275
  // src/get-styles.ts
@@ -430,7 +315,7 @@ function getPlacementStyles(options) {
430
315
  };
431
316
  }
432
317
  export {
318
+ getBasePlacement,
433
319
  getPlacement,
434
320
  getPlacementStyles
435
321
  };
436
- //# sourceMappingURL=index.mjs.map
@@ -1,4 +1,4 @@
1
- import { Middleware } from "@floating-ui/dom";
1
+ import type { Middleware } from "@floating-ui/dom";
2
2
  export declare const cssVars: {
3
3
  arrowSize: {
4
4
  variable: string;
@@ -27,4 +27,3 @@ declare type ArrowOptions = {
27
27
  };
28
28
  export declare const shiftArrow: (opts: ArrowOptions) => Middleware;
29
29
  export {};
30
- //# sourceMappingURL=middleware.d.ts.map
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { Boundary, Placement, ComputePositionReturn } from "@floating-ui/dom";
2
- import { AutoUpdateOptions } from "./auto-update";
1
+ import type { Boundary, Placement, ComputePositionReturn, ComputePositionConfig } from "@floating-ui/dom";
2
+ import type { AutoUpdateOptions } from "./auto-update";
3
3
  export type { Placement };
4
4
  export declare type PositioningOptions = {
5
5
  /**
@@ -53,10 +53,12 @@ export declare type PositioningOptions = {
53
53
  /**
54
54
  * Function called when the placement is computed
55
55
  */
56
- onComplete?(data: ComputePositionReturn): void;
56
+ onComplete?(data: ComputePositionReturn & {
57
+ compute: (config?: Omit<ComputePositionConfig, "platform">) => void;
58
+ }): void;
57
59
  /**
58
60
  * Function called on cleanup of all listeners
59
61
  */
60
62
  onCleanup?: VoidFunction;
61
63
  };
62
- //# sourceMappingURL=types.d.ts.map
64
+ export declare type BasePlacement = "top" | "right" | "bottom" | "left";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/popper",
3
- "version": "0.1.5",
3
+ "version": "0.1.8",
4
4
  "description": "Dynamic positioning logic for ui machines",
5
5
  "keywords": [
6
6
  "js",
@@ -25,8 +25,8 @@
25
25
  "url": "https://github.com/chakra-ui/zag/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@floating-ui/dom": "^0.4.2",
29
- "@zag-js/dom-utils": "0.1.4",
28
+ "@floating-ui/dom": "0.5.4",
29
+ "@zag-js/dom-utils": "0.1.7",
30
30
  "@zag-js/utils": "0.1.2"
31
31
  },
32
32
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../src/auto-update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAKnE,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,oBAAY,iBAAiB,GAAG;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAaD,wBAAgB,UAAU,CACxB,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,IAAI,EAClB,OAAO,GAAE,OAAO,GAAG,iBAAyB,qBAyB7C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-placement.d.ts","sourceRoot":"","sources":["../src/get-placement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAKtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAY5C,wBAAgB,YAAY,CAC1B,SAAS,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI,EAC9C,QAAQ,EAAE,WAAW,GAAG,IAAI,EAC5B,OAAO,GAAE,kBAAuB,qBA8GjC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-styles.d.ts","sourceRoot":"","sources":["../src/get-styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,aAAK,OAAO,GAAG;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAC/B,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,CAAA;AAkBD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BlD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA"}
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/index.ts", "../src/get-placement.ts", "../../core/src/array.ts", "../../core/src/guard.ts", "../../core/src/platform.ts", "../../core/src/events.ts", "../../core/src/functions.ts", "../../core/src/warning.ts", "../src/auto-update.ts", "../../dom/src/attrs.ts", "../../dom/src/computed-style.ts", "../../dom/src/next-tick.ts", "../../dom/src/auto-resize.ts", "../../core/src/array.ts", "../../core/src/guard.ts", "../../core/src/platform.ts", "../../core/src/events.ts", "../../core/src/functions.ts", "../../core/src/warning.ts", "../../dom/src/global-listener.ts", "../../dom/src/listener.ts", "../../dom/src/body-pointer-event.ts", "../../dom/src/constants.ts", "../../dom/src/query.ts", "../../dom/src/event.ts", "../../dom/src/fire-event.ts", "../../dom/src/focus-event.ts", "../../dom/src/focusable.ts", "../../dom/src/mutation-observer.ts", "../../dom/src/form.ts", "../../dom/src/input-event.ts", "../../dom/src/keyboard-event.ts", "../../dom/src/visually-hidden.ts", "../../dom/src/live-region.ts", "../../dom/src/nodelist.ts", "../../dom/src/text-selection.ts", "../../dom/src/pointer-event.ts", "../../dom/src/pointerlock.ts", "../../dom/src/rect-observer.ts", "../../dom/src/scrollable.ts", "../../dom/src/typeahead.ts", "../../dom/src/visibility-event.ts", "../../dom/src/visual-viewport.ts", "../../dom/src/wait.ts", "../src/middleware.ts", "../src/get-styles.ts"],
4
- "sourcesContent": ["export { getPlacement } from \"./get-placement\"\nexport { getPlacementStyles } from \"./get-styles\"\nexport type { Placement, PositioningOptions } from \"./types\"\n", "import type { VirtualElement } from \"@floating-ui/dom\"\nimport { arrow, computePosition, flip, Middleware, offset, shift, size } from \"@floating-ui/dom\"\nimport { noop, pipe } from \"@zag-js/utils\"\nimport { autoUpdate } from \"./auto-update\"\nimport { shiftArrow, transformOrigin } from \"./middleware\"\nimport { PositioningOptions } from \"./types\"\n\nconst defaultOptions: PositioningOptions = {\n strategy: \"absolute\",\n placement: \"bottom\",\n listeners: true,\n gutter: 8,\n flip: true,\n sameWidth: false,\n overflowPadding: 8,\n}\n\nexport function getPlacement(\n reference: HTMLElement | VirtualElement | null,\n floating: HTMLElement | null,\n options: PositioningOptions = {},\n) {\n if (reference == null || floating == null) return noop\n\n options = Object.assign({}, defaultOptions, options)\n\n /* -----------------------------------------------------------------------------\n * The middleware stack\n * -----------------------------------------------------------------------------*/\n\n const arrowEl = floating.querySelector<HTMLElement>(\"[data-part=arrow]\")\n const middleware: Middleware[] = []\n\n if (options.flip) {\n middleware.push(\n flip({\n boundary: options.boundary,\n padding: options.overflowPadding,\n }),\n )\n }\n\n if (options.gutter || options.offset) {\n const arrowOffset = arrowEl ? arrowEl.offsetHeight / 2 : 0\n const data = options.gutter ? { mainAxis: options.gutter } : options.offset\n if (data?.mainAxis != null) data.mainAxis += arrowOffset\n middleware.push(offset(data))\n }\n\n middleware.push(\n shift({\n boundary: options.boundary,\n crossAxis: options.overlap,\n padding: options.overflowPadding,\n }),\n )\n\n if (arrowEl) {\n // prettier-ignore\n middleware.push(\n arrow({ element: arrowEl, padding: 8 }),\n shiftArrow({ element: arrowEl }),\n )\n }\n\n middleware.push(transformOrigin)\n\n if (options.sameWidth || options.fitViewport) {\n middleware.push(\n size({\n padding: options.overflowPadding,\n apply(data) {\n const { reference, height, width } = data\n\n if (options.sameWidth) {\n Object.assign(floating.style, {\n width: `${reference.width}px`,\n minWidth: \"unset\",\n })\n }\n\n if (options.fitViewport) {\n Object.assign(floating.style, {\n maxWidth: `${width}px`,\n maxHeight: `${height}px`,\n })\n }\n },\n }),\n )\n }\n\n /* -----------------------------------------------------------------------------\n * The actual positioning function\n * -----------------------------------------------------------------------------*/\n\n function compute() {\n if (reference == null || floating == null) return\n const { placement, strategy } = options\n\n computePosition(reference, floating, {\n placement,\n middleware,\n strategy,\n })\n .then((data) => {\n const x = Math.round(data.x)\n const y = Math.round(data.y)\n\n Object.assign(floating.style, {\n position: data.strategy,\n top: \"0\",\n left: \"0\",\n transform: `translate3d(${x}px, ${y}px, 0)`,\n })\n\n return data\n })\n .then((data) => {\n options.onComplete?.(data)\n })\n }\n\n compute()\n\n // prettier-ignore\n return pipe(\n autoUpdate(reference, floating, compute, options.listeners),\n options.onCleanup ?? noop\n )\n}\n", "export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n", "export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => typeof window !== \"undefined\"\n\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n", "import { isDom } from \"./guard\"\n\nexport function getPlatform() {\n const agent = (navigator as any).userAgentData\n return agent?.platform ?? navigator.platform\n}\n\nconst pt = (v: RegExp) => isDom() && v.test(getPlatform())\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\nconst vn = (v: RegExp) => isDom() && v.test(navigator.vendor)\n\nexport const isTouchDevice = isDom() && !!navigator.maxTouchPoints\nexport const isMac = () => pt(/^Mac/) && !isTouchDevice\nexport const isIPhone = () => pt(/^iPhone/)\nexport const isSafari = () => isApple() && vn(/apple/i)\nexport const isFirefox = () => ua(/firefox\\//i)\nexport const isApple = () => pt(/mac|iphone|ipad|ipod/i)\nexport const isIos = () => isApple() && !isMac()\n", "import { hasProp, isDom, isObject } from \"./guard\"\nimport { isMac } from \"./platform\"\n\nexport const supportsPointerEvent = () => isDom() && window.onpointerdown === null\nexport const supportsTouchEvent = () => isDom() && window.ontouchstart === null\nexport const supportsMouseEvent = () => isDom() && window.onmousedown === null\n\nexport const isMouseEvent = (v: any): v is MouseEvent => isObject(v) && hasProp(v, \"button\")\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && hasProp(v, \"touches\")\nexport const isLeftClick = (v: { button: number }) => v.button === 0\nexport const isRightClick = (v: { button: number }) => v.button === 2\nexport const isModifiedEvent = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\n\nexport const isCtrlKey = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\">) =>\n isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey\n", "export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const pipe =\n <T>(...fns: Array<(a: T) => T>) =>\n (v: T) =>\n fns.reduce((a, b) => b(a), v)\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function merge<T, U>(origin: T, patch: U): T & U {\n if (!(typeof patch === \"object\")) return patch as any\n const result = !(typeof origin === \"object\") ? {} : Object.assign({}, origin)\n for (const key of Object.keys(patch)) {\n const value = patch[key]\n const src = result[key]\n if (value === null) delete result[key]\n else if (Array.isArray(value) || Array.isArray(src)) result[key] = (src || []).concat(value || [])\n else result[key] = merge(src, value)\n }\n return result as any\n}\n", "export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n", "import type { Placement, ReferenceElement } from \"@floating-ui/dom\"\nimport { getOverflowAncestors } from \"@floating-ui/dom\"\nimport { addDomEvent, isHTMLElement, observeElementRect } from \"@zag-js/dom-utils\"\nimport { isBoolean, pipe } from \"@zag-js/utils\"\n\nexport type { Placement }\n\nexport type AutoUpdateOptions = {\n ancestorScroll?: boolean\n ancestorResize?: boolean\n referenceResize?: boolean\n}\n\ntype Ancestors = ReturnType<typeof getOverflowAncestors>\n\nfunction resolveOptions(option: boolean | AutoUpdateOptions) {\n const bool = isBoolean(option)\n return {\n ancestorResize: bool ? option : option.ancestorResize ?? true,\n ancestorScroll: bool ? option : option.ancestorScroll ?? true,\n referenceResize: bool ? option : option.referenceResize ?? true,\n }\n}\n\nexport function autoUpdate(\n reference: ReferenceElement,\n floating: HTMLElement,\n update: () => void,\n options: boolean | AutoUpdateOptions = false,\n) {\n const { ancestorScroll, ancestorResize, referenceResize } = resolveOptions(options)\n\n const useAncestors = ancestorScroll || ancestorResize\n const ancestors: Ancestors = []\n\n if (useAncestors && isHTMLElement(reference)) {\n ancestors.push(...getOverflowAncestors(reference))\n }\n\n function addResizeListeners() {\n let cleanups: VoidFunction[] = [observeElementRect(floating, update)]\n if (referenceResize && isHTMLElement(reference)) {\n cleanups.push(observeElementRect(reference, update))\n }\n cleanups.push(pipe(...ancestors.map((el: any) => addDomEvent(el, \"resize\", update))))\n return () => cleanups.forEach((fn) => fn())\n }\n\n function addScrollListeners() {\n return pipe(...ancestors.map((el: any) => addDomEvent(el, \"scroll\", update, { passive: true })))\n }\n\n return pipe(addResizeListeners(), addScrollListeners())\n}\n", "type Booleanish = boolean | \"true\" | \"false\"\n\nexport const dataAttr = (guard: boolean | undefined) => {\n return (guard ? \"\" : undefined) as Booleanish\n}\n\nexport const ariaAttr = (guard: boolean | undefined) => {\n return guard ? \"true\" : undefined\n}\n\nexport const matchAttr = (el: Element) => {\n return {\n get: (key: string) => el.getAttribute(key),\n set: (key: string, value: string) => el.setAttribute(key, value),\n is: (key: string, value: string) => {\n return el.getAttribute(key) === value\n },\n }\n}\n", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nfunction getStyleCache(): WeakMap<HTMLElement, Styles> {\n ;(globalThis as any).__styleCache__ = (globalThis as any).__styleCache__ || new WeakMap()\n return (globalThis as any).__styleCache__\n}\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n const cache = getStyleCache()\n let style: Styles | undefined = cache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n cache.set(el, style)\n }\n return style\n}\n\nexport function copyVisualStyles(fromEl: HTMLElement | null, toEl: HTMLElement) {\n if (!fromEl) return\n const el = getComputedStyle(fromEl)\n // prettier-ignore\n const cssText = 'box-sizing:' + el.boxSizing +\n ';border-left:' + el.borderLeftWidth + ' solid red' +\n ';border-right:' + el.borderRightWidth + ' solid red' +\n ';font-family:' + el.fontFamily +\n ';font-feature-settings:' + el.fontFeatureSettings +\n ';font-kerning:' + el.fontKerning +\n ';font-size:' + el.fontSize +\n ';font-stretch:' + el.fontStretch +\n ';font-style:' + el.fontStyle +\n ';font-variant:' + el.fontVariant +\n ';font-variant-caps:' + el.fontVariantCaps +\n ';font-variant-ligatures:' + el.fontVariantLigatures +\n ';font-variant-numeric:' + el.fontVariantNumeric +\n ';font-weight:' + el.fontWeight +\n ';letter-spacing:' + el.letterSpacing +\n ';margin-left:' + el.marginLeft +\n ';margin-right:' + el.marginRight +\n ';padding-left:' + el.paddingLeft +\n ';padding-right:' + el.paddingRight +\n ';text-indent:' + el.textIndent +\n ';text-transform:' + el.textTransform\n\n toEl.style.cssText += cssText\n}\n", "export function nextTick(fn: VoidFunction) {\n const set = new Set<VoidFunction>()\n function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n set.add(() => globalThis.cancelAnimationFrame(id))\n }\n raf(() => raf(fn))\n return function cleanup() {\n set.forEach(function (fn) {\n fn()\n })\n }\n}\n\nexport function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n return function cleanup() {\n globalThis.cancelAnimationFrame(id)\n }\n}\n\nexport function queueMicrotask(fn: VoidFunction) {\n if (typeof globalThis.queueMicrotask === \"function\") {\n globalThis.queueMicrotask(fn)\n } else {\n Promise.resolve().then(fn)\n }\n}\n", "import { copyVisualStyles } from \"./computed-style\"\nimport { raf } from \"./next-tick\"\n\nfunction createGhostElement(doc: Document) {\n var el = doc.createElement(\"div\")\n el.id = \"ghost\"\n el.style.cssText =\n \"display:inline-block;height:0;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:nowrap;\"\n doc.body.appendChild(el)\n return el\n}\n\nexport function autoResizeInput(input: HTMLInputElement | null) {\n if (!input) return\n const doc = input.ownerDocument ?? document\n const ghost = createGhostElement(doc)\n\n copyVisualStyles(input, ghost)\n\n function resize() {\n raf(() => {\n ghost.innerHTML = input!.value\n const rect = getComputedStyle(ghost)\n input?.style.setProperty(\"width\", rect.width)\n })\n }\n\n resize()\n\n input?.addEventListener(\"input\", resize)\n input?.addEventListener(\"change\", resize)\n\n return () => {\n doc.body.removeChild(ghost)\n input?.removeEventListener(\"input\", resize)\n input?.removeEventListener(\"change\", resize)\n }\n}\n", "export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n", "export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => typeof window !== \"undefined\"\n\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n", "import { isDom } from \"./guard\"\n\nexport function getPlatform() {\n const agent = (navigator as any).userAgentData\n return agent?.platform ?? navigator.platform\n}\n\nconst pt = (v: RegExp) => isDom() && v.test(getPlatform())\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\nconst vn = (v: RegExp) => isDom() && v.test(navigator.vendor)\n\nexport const isTouchDevice = isDom() && !!navigator.maxTouchPoints\nexport const isMac = () => pt(/^Mac/) && !isTouchDevice\nexport const isIPhone = () => pt(/^iPhone/)\nexport const isSafari = () => isApple() && vn(/apple/i)\nexport const isFirefox = () => ua(/firefox\\//i)\nexport const isApple = () => pt(/mac|iphone|ipad|ipod/i)\nexport const isIos = () => isApple() && !isMac()\n", "import { hasProp, isDom, isObject } from \"./guard\"\nimport { isMac } from \"./platform\"\n\nexport const supportsPointerEvent = () => isDom() && window.onpointerdown === null\nexport const supportsTouchEvent = () => isDom() && window.ontouchstart === null\nexport const supportsMouseEvent = () => isDom() && window.onmousedown === null\n\nexport const isMouseEvent = (v: any): v is MouseEvent => isObject(v) && hasProp(v, \"button\")\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && hasProp(v, \"touches\")\nexport const isLeftClick = (v: { button: number }) => v.button === 0\nexport const isRightClick = (v: { button: number }) => v.button === 2\nexport const isModifiedEvent = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\n\nexport const isCtrlKey = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\">) =>\n isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey\n", "export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const pipe =\n <T>(...fns: Array<(a: T) => T>) =>\n (v: T) =>\n fns.reduce((a, b) => b(a), v)\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function merge<T, U>(origin: T, patch: U): T & U {\n if (!(typeof patch === \"object\")) return patch as any\n const result = !(typeof origin === \"object\") ? {} : Object.assign({}, origin)\n for (const key of Object.keys(patch)) {\n const value = patch[key]\n const src = result[key]\n if (value === null) delete result[key]\n else if (Array.isArray(value) || Array.isArray(src)) result[key] = (src || []).concat(value || [])\n else result[key] = merge(src, value)\n }\n return result as any\n}\n", "export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n", "import { noop } from \"@zag-js/utils\"\n\ntype El = HTMLElement | Document | VisualViewport | Window\ntype Handler = (event: Event) => void\ntype Group = Map<string, Set<Handler>>\ntype Option = boolean | AddEventListenerOptions\n\nfunction getListenerElements(): Map<El, Group> {\n ;(globalThis as any).__listenerElements__ = (globalThis as any).__listenerElements__ || new Map()\n return (globalThis as any).__listenerElements__\n}\n\nfunction getListenerCache(): Map<El, Map<string, Handler>> {\n ;(globalThis as any).__listenerCache__ = (globalThis as any).__listenerCache__ || new Map()\n return (globalThis as any).__listenerCache__\n}\n\n/**\n * The global event bus for managing event listeners attached to DOM elements.\n *\n * It's goal is to ensure that only one listener is attached to a DOM element for a given event,\n * regardless of the number of times `addEventListener` is called.\n */\n\nexport function addGlobalEventListener(node: El | null, type: string, handler: Handler, options?: Option) {\n if (!node) return noop\n\n // unique identifier for the event listener\n const hash = JSON.stringify({ type, options })\n\n // Subscribe pattern\n const listenerElements = getListenerElements()\n const listenerCache = getListenerCache()\n\n const group = listenerElements.get(node)\n\n if (!listenerElements.has(node)) {\n // create group of listeners per hash\n const group: Group = new Map([[hash, new Set([handler])]])\n listenerElements.set(node, group)\n } else if (group?.has(hash)) {\n group?.get(hash)?.add(handler)\n } else {\n group?.set(hash, new Set([handler]))\n }\n\n // add the event listener to the node or register it in the cache\n function attach(node: El) {\n // Publish pattern\n function listener(event: Event) {\n const group = listenerElements.get(node)\n group?.get(hash)?.forEach((fn) => fn(event))\n }\n\n if (!listenerCache?.has(node)) {\n listenerCache.set(node, new Map([[hash, listener]]))\n node.addEventListener(type, listener, options)\n return\n }\n\n if (!listenerCache?.get(node)?.has(hash)) {\n listenerCache.get(node)?.set(hash, listener)\n node.addEventListener(type, listener, options)\n }\n }\n\n attach(node)\n\n return function remove() {\n if (!listenerElements.has(node)) return\n\n const group = listenerElements.get(node)\n group?.get(hash)?.delete(handler)\n\n if (group?.get(hash)?.size === 0) {\n const listener = listenerCache.get(node)?.get(hash)!\n node.removeEventListener(type, listener, options)\n group?.delete(hash)\n listenerCache.get(node)?.delete(hash)\n\n if (group?.size === 0) {\n listenerElements.delete(node)\n listenerCache.delete(node)\n }\n }\n }\n}\n", "import {\n supportsMouseEvent,\n supportsPointerEvent,\n supportsTouchEvent,\n runIfFn,\n hasProp,\n isTouchEvent,\n} from \"@zag-js/utils\"\nimport { addGlobalEventListener } from \"./global-listener\"\nimport {\n AnyPointerEvent,\n DOMEventTarget,\n EventMap,\n PointerEventInfo,\n PointerNameMap,\n RefTarget,\n} from \"./listener.types\"\n\nconst isRef = (v: any): v is RefTarget => hasProp(v, \"current\")\n\nconst fallback = { pageX: 0, pageY: 0, clientX: 0, clientY: 0 }\n\nexport function extractInfo<T extends AnyPointerEvent = AnyPointerEvent>(event: T, type: \"page\" | \"client\" = \"page\") {\n const point = isTouchEvent(event) ? event.touches[0] || event.changedTouches[0] || fallback : event\n return {\n point: {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n },\n }\n}\n\nexport function addDomEvent<K extends keyof EventMap>(\n target: DOMEventTarget,\n event: K,\n listener: (event: EventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n) {\n const node = isRef(target) ? target.current : runIfFn(target)\n return addGlobalEventListener(node as HTMLElement | null, event, listener as any, options)\n}\n\nexport function addPointerEvent<K extends keyof EventMap>(\n target: DOMEventTarget,\n event: K,\n listener: (event: EventMap[K], info: PointerEventInfo) => void,\n options?: boolean | AddEventListenerOptions,\n) {\n const type = getEventName(event) ?? event\n return addDomEvent(target, type, wrapHandler(listener, event === \"pointerdown\"), options)\n}\n\nfunction wrapHandler<E extends EventMap[keyof EventMap]>(\n fn: (event: E, info: PointerEventInfo) => void,\n filter = false,\n) {\n const listener: EventListener = (event: any) => {\n fn(event, extractInfo(event))\n }\n return filter ? filterPrimaryPointer(listener) : listener\n}\n\nfunction filterPrimaryPointer(fn: EventListener): EventListener {\n return (event: Event) => {\n const win = ((event as UIEvent).view ?? window) as typeof window\n const isMouseEvent = event instanceof win.MouseEvent\n const isPrimary = !isMouseEvent || (isMouseEvent && (event as MouseEvent).button === 0)\n if (isPrimary) fn(event)\n }\n}\n\nexport function extractClientInfo(event: AnyPointerEvent) {\n return extractInfo(event, \"client\")\n}\n\nconst mouseEventNames: PointerNameMap = {\n pointerdown: \"mousedown\",\n pointermove: \"mousemove\",\n pointerup: \"mouseup\",\n pointercancel: \"mousecancel\",\n pointerover: \"mouseover\",\n pointerout: \"mouseout\",\n pointerenter: \"mouseenter\",\n pointerleave: \"mouseleave\",\n}\n\nconst touchEventNames: PointerNameMap = {\n pointerdown: \"touchstart\",\n pointermove: \"touchmove\",\n pointerup: \"touchend\",\n pointercancel: \"touchcancel\",\n}\n\nexport function getEventName(evt: keyof EventMap): keyof EventMap {\n if (supportsPointerEvent()) return evt\n if (supportsTouchEvent()) return touchEventNames[evt]\n if (supportsMouseEvent()) return mouseEventNames[evt]\n return evt\n}\n", "import { isLeftClick, pipe } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\nimport { nextTick } from \"./next-tick\"\n\nlet changeCount = 0\nlet originalBodyPointerEvents: string\n\ntype PointerEventOptions = {\n disabled: boolean\n document?: Document\n}\n\nexport function preventBodyPointerEvents(el: HTMLElement | null, opts: Partial<PointerEventOptions> = {}) {\n const { disabled = false, document: docProp } = opts\n const doc: Document = docProp || document\n\n let isTouchOrPenPressed = false\n let isLeftClickPressed = false\n\n function listen() {\n const onPointerDown = (event: PointerEvent) => {\n const isMouse = event.pointerType === \"mouse\"\n isTouchOrPenPressed = !isMouse\n isLeftClickPressed = isMouse && isLeftClick(event)\n }\n\n const onPointerUp = () => {\n isTouchOrPenPressed = false\n isLeftClickPressed = false\n }\n\n // prettier-ignore\n return pipe(\n addDomEvent(doc, \"pointerdown\", onPointerDown),\n addDomEvent(doc,\"pointerup\", onPointerUp)\n )\n }\n\n function reset() {\n changeCount--\n if (changeCount === 0) {\n doc.body.style.pointerEvents = originalBodyPointerEvents\n }\n if (el) {\n el.style.pointerEvents = \"\"\n }\n }\n\n function apply() {\n if (disabled) return\n\n if (changeCount === 0) {\n originalBodyPointerEvents = doc.body.style.pointerEvents\n }\n\n doc.body.style.pointerEvents = \"none\"\n if (el) {\n el.style.pointerEvents = \"auto\"\n }\n\n changeCount++\n\n return function () {\n if (isTouchOrPenPressed) {\n addDomEvent(doc, \"click\", reset, { once: true })\n } else if (isLeftClickPressed) {\n addDomEvent(doc, \"pointerup\", reset, { once: true })\n } else {\n reset()\n }\n }\n }\n\n const cleanups: Array<VoidFunction | undefined> = []\n cleanups.push(apply())\n nextTick(() => {\n cleanups.push(listen())\n })\n\n return function () {\n cleanups.forEach((cleanup) => cleanup?.())\n }\n}\n", "export const MAX_Z_INDEX = 2147483647\n", "export function getOwnerDocument(el: HTMLElement | Window) {\n if (isWindow(el)) return el.document\n return el?.ownerDocument ?? document\n}\n\nexport function getOwnerWindow(el: HTMLElement) {\n return el?.ownerDocument.defaultView ?? window\n}\n\nexport function getDocumentElement(el: HTMLElement | Window): HTMLElement {\n return getOwnerDocument(el).documentElement\n}\n\nexport function getNodeName(node: HTMLElement | Window): string {\n return isWindow(node) ? \"\" : node ? node.localName || \"\" : \"\"\n}\n\nexport function getEventWindow(event: UIEvent) {\n if (event.view) return event.view\n let target = event.currentTarget\n if (target != null) return getOwnerWindow(target as HTMLElement)\n return window\n}\n\nexport function getParent(el: HTMLElement): HTMLElement {\n const doc = getOwnerDocument(el)\n if (getNodeName(el) === \"html\") return el\n return el.assignedSlot || el.parentElement || doc.documentElement\n}\n\ntype Node = HTMLElement | EventTarget | null\n\nexport function contains(parent: Node | undefined, child: Node) {\n if (!parent) return false\n return parent === child || (isHTMLElement(parent) && isHTMLElement(child) && parent.contains(child))\n}\n\nexport function isHTMLElement(v: any): v is HTMLElement {\n return typeof v === \"object\" && v?.nodeType === Node.ELEMENT_NODE && typeof v?.nodeName === \"string\"\n}\n\nexport function isWindow(value: any): value is Window {\n return value?.toString() === \"[object Window]\"\n}\n\nexport const isDisabled = (el: HTMLElement | null): boolean => {\n return el?.getAttribute(\"disabled\") != null || !!el?.getAttribute(\"aria-disabled\") === true\n}\n\nexport function isElementEditable(el: HTMLElement | null) {\n if (el == null) return false\n const selectors = [\n \"input:not([readonly])\",\n \"textarea:not([readonly])\",\n \"[contenteditable]\",\n \"select:not([readonly])\",\n ].join(\", \")\n return el.matches(selectors) || el.isContentEditable\n}\n", "import { contains } from \"./query\"\n\nexport function isKeyboardClick(e: Pick<MouseEvent, \"detail\" | \"clientX\" | \"clientY\">) {\n return e.detail === 0 || (e.clientX === 0 && e.clientY === 0)\n}\n\nexport function isPrintableKey(e: Pick<KeyboardEvent, \"key\" | \"ctrlKey\" | \"metaKey\">): boolean {\n return e.key.length === 1 && !e.ctrlKey && !e.metaKey\n}\n\ntype NativeEvent<E> = React.ChangeEvent<any> extends E\n ? InputEvent\n : E extends React.SyntheticEvent<any, infer T>\n ? T\n : never\n\nexport function getNativeEvent<E>(e: E): NativeEvent<E> {\n return (e as any).nativeEvent ?? e\n}\n\nexport function queueBeforeEvent(el: Element, type: string, fn: VoidFunction) {\n const raf = requestAnimationFrame(() => {\n el.removeEventListener(type, invoke, true)\n fn()\n })\n\n const invoke = () => {\n cancelAnimationFrame(raf)\n fn()\n }\n\n el.addEventListener(type, invoke, { once: true, capture: true })\n\n return raf\n}\n\nexport function isPortalEvent(event: Pick<Event, \"currentTarget\" | \"target\">): boolean {\n return !contains(event.currentTarget, event.target)\n}\n\nexport function isSelfTarget(event: Pick<Event, \"target\" | \"currentTarget\">): boolean {\n return event.target === event.currentTarget\n}\n", "export function fireEvent(el: Element, type: string, init?: EventInit) {\n const event = new Event(type, init)\n return el.dispatchEvent(event)\n}\n\nexport function fireCustomEvent(el: Element, type: string, init?: CustomEventInit) {\n const event = new CustomEvent(type, init)\n return el.dispatchEvent(event)\n}\n\nexport function fireBlurEvent(el: Element, init?: FocusEventInit) {\n const event = new FocusEvent(\"blur\", init)\n const allowed = el.dispatchEvent(event)\n const bubbleInit = { ...init, bubbles: true }\n el.dispatchEvent(new FocusEvent(\"focusout\", bubbleInit))\n return allowed\n}\n\nexport function fireKeyboardEvent(el: Element, type: string, init?: KeyboardEventInit) {\n const event = new KeyboardEvent(type, init)\n return el.dispatchEvent(event)\n}\n\nexport function fireClickEvent(el: Element, init?: PointerEventInit) {\n const event = typeof PointerEvent !== \"undefined\" ? new PointerEvent(\"click\", init) : new MouseEvent(\"click\", init)\n return el.dispatchEvent(event)\n}\n", "/**\n * Determine if the blur event within an element is valid\n */\nexport function validateBlur(event: Event, opts: Options) {\n const exclude = Array.isArray(opts.exclude) ? opts.exclude : [opts.exclude]\n const relatedTarget = (event.relatedTarget ?? opts.fallback) as HTMLElement\n return exclude.every((el) => !el?.contains(relatedTarget))\n}\n\ntype MaybeArray<T> = T | T[]\n\ntype Options = {\n exclude: MaybeArray<HTMLElement | null>\n fallback?: HTMLElement | null\n}\n\ntype Event = Pick<FocusEvent, \"relatedTarget\">\n", "import { getComputedStyle } from \"./computed-style\"\nimport { isDisabled, isHTMLElement } from \"./query\"\n\nexport const focusableSelector = /*#__PURE__*/ [\n \"input:not([disabled]):not([type=hidden])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"embed\",\n \"iframe\",\n \"object\",\n \"a[href]\",\n \"area[href]\",\n \"[tabindex]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"*[tabindex]:not([aria-disabled])\",\n \"[contenteditable]:not([contenteditable=false])\",\n \"details > summary:first-of-type\",\n].join(\",\")\n\nexport function isHidden(el: HTMLElement | null, until?: HTMLElement) {\n const style = getComputedStyle(el)\n if (!el || style.getPropertyValue(\"visibility\") === \"hidden\") return true\n while (el) {\n if (until != null && el === until) return false\n if (style.getPropertyValue(\"display\") === \"none\") return true\n el = el.parentElement\n }\n return false\n}\n\n/**\n * Returns the focusable elements within the element\n */\nexport const getFocusables = (el: HTMLElement | Document | null, includeContainer: boolean | \"if-empty\" = false) => {\n if (!el) return []\n let els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const shouldAddContainer = includeContainer == true || (includeContainer == \"if-empty\" && els.length === 0)\n\n if (shouldAddContainer && isHTMLElement(el)) {\n els.unshift(el)\n }\n\n return els.filter((el) => isFocusable(el) && !isHidden(el))\n}\n\n/**\n * Whether this element is focusable\n */\nexport const isFocusable = (el: HTMLElement | null) => {\n if (!isHTMLElement(el) || isHidden(el) || isDisabled(el)) return false\n return el?.matches(focusableSelector)\n}\n\n/**\n * Returns the tabbable elements within the element\n */\nexport const getTabbables = (el: HTMLElement | Document | null, includeContainer: boolean | \"if-empty\" = false) => {\n if (!el) return []\n return getFocusables(el, includeContainer).filter(isTabbable)\n}\n\n/**\n * Whether this element is tabbable\n */\nexport const isTabbable = (el: HTMLElement | null) => {\n return isFocusable(el) && !isDisabled(el) && !isHidden(el)\n}\n", "import { noop } from \"@zag-js/utils\"\n\ntype Callback = (v: MutationRecord) => void\n\nexport function observeAttributes(node: Element | null, attributes: string | string[], fn: Callback) {\n if (!node) return noop\n const attrs = Array.isArray(attributes) ? attributes : [attributes]\n const win = node.ownerDocument.defaultView || window\n const obs = new win.MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type === \"attributes\" && change.attributeName && attrs.includes(change.attributeName)) {\n fn(change)\n }\n }\n })\n\n obs.observe(node, { attributes: true, attributeFilter: attrs })\n\n return () => obs.disconnect()\n}\n\nexport function observeChildren(node: Element | null, fn: Callback) {\n if (!node) return noop\n const win = node.ownerDocument.defaultView || window\n const obs = new win.MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type === \"childList\") {\n fn(change)\n }\n }\n })\n\n obs.observe(node, { childList: true, subtree: true })\n\n return () => obs.disconnect()\n}\n", "import { observeAttributes } from \"./mutation-observer\"\n\nexport function getClosestForm(el: HTMLElement) {\n if (isFormElement(el)) return el.form\n else return el.closest(\"form\")\n}\n\nfunction isFormElement(el: HTMLElement): el is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement {\n return el.matches(\"textarea, input, select, button\")\n}\n\nexport function trackFormReset(el: HTMLElement | null | undefined, callback: () => void) {\n if (!el) return\n const form = getClosestForm(el)\n form?.addEventListener(\"reset\", callback, { passive: true })\n return () => {\n form?.removeEventListener(\"reset\", callback)\n }\n}\n\nexport function trackFieldsetDisabled(el: HTMLElement | null | undefined, callback: (disabled: boolean) => void) {\n const fieldset = el?.closest(\"fieldset\")\n if (!fieldset) return\n callback(fieldset.disabled)\n return observeAttributes(fieldset, [\"disabled\"], () => callback(fieldset.disabled))\n}\n\nexport function isNativeDisabled(el: HTMLElement) {\n return el.matches(\":disabled\")\n}\n", "import { getOwnerWindow } from \"./query\"\n\ntype DescriptorOptions = {\n type: \"input\" | \"textarea\"\n property: \"value\" | \"checked\"\n}\n\nfunction getDescriptor(el: HTMLElement, options: DescriptorOptions) {\n const { type, property } = options\n const win = getOwnerWindow(el)\n const _type = type === \"input\" ? \"HTMLInputElement\" : \"HTMLTextAreaElement\"\n const proto = win[_type].prototype\n return Object.getOwnPropertyDescriptor(proto, property) ?? {}\n}\n\nexport function dispatchInputValueEvent(el: HTMLElement, value: string | number) {\n const win = getOwnerWindow(el)\n if (!(el instanceof win.HTMLInputElement)) return\n const desc = getDescriptor(el, { type: \"input\", property: \"value\" })\n desc.set?.call(el, value)\n const event = new win.Event(\"input\", { bubbles: true })\n el.dispatchEvent(event)\n}\n\nexport function dispatchInputCheckedEvent(el: HTMLElement, checked: boolean) {\n const win = getOwnerWindow(el)\n if (!(el instanceof win.HTMLInputElement)) return\n const desc = getDescriptor(el, { type: \"input\", property: \"checked\" })\n desc.set?.call(el, checked)\n const event = new win.Event(\"click\", { bubbles: true })\n el.dispatchEvent(event)\n}\n\nexport function trackInputPropertyMutation(\n el: HTMLInputElement | null,\n options: DescriptorOptions & { fn?: (value: string) => void },\n) {\n const { fn, property, type } = options\n\n if (!fn || !el) return\n\n const { get, set } = getDescriptor(el, { property, type })\n\n let run = true\n\n Object.defineProperty(el, property, {\n get() {\n return get?.call(this)\n },\n set(value: string) {\n if (run) fn(value)\n return set?.call(this, value)\n },\n })\n\n return () => {\n run = false\n }\n}\n", "import type { KeyboardEvent } from \"react\"\n\ntype EventKey =\n | \"ArrowDown\"\n | \"ArrowUp\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Space\"\n | \"Enter\"\n | \"Comma\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"Home\"\n | \"End\"\n | \"Tab\"\n | \"PageUp\"\n | \"PageDown\"\n | (string & {})\n\nexport type EventKeyMap = Partial<Record<EventKey, (event: React.KeyboardEvent) => void>>\n\nconst rtlKeyMap = {\n ArrowLeft: \"ArrowRight\",\n ArrowRight: \"ArrowLeft\",\n Home: \"End\",\n End: \"Home\",\n}\n\nconst sameKeyMap = {\n Up: \"ArrowUp\",\n Down: \"ArrowDown\",\n Esc: \"Escape\",\n \" \": \"Space\",\n \",\": \"Comma\",\n Left: \"ArrowLeft\",\n Right: \"ArrowRight\",\n}\n\ntype EventKeyOptions = {\n dir?: \"ltr\" | \"rtl\"\n orientation?: \"horizontal\" | \"vertical\"\n}\n\n/**\n * Determine the event key based on text direction.\n */\nexport function getEventKey(event: KeyboardEvent, options: EventKeyOptions = {}) {\n const { dir = \"ltr\", orientation = \"horizontal\" } = options\n\n let { key } = event\n key = sameKeyMap[key] ?? key // normalize key\n\n const isRtl = dir === \"rtl\" && orientation === \"horizontal\"\n\n if (isRtl && key in rtlKeyMap) {\n key = rtlKeyMap[key]\n }\n\n return key\n}\n\nconst PAGE_KEYS = new Set([\"PageUp\", \"PageDown\"])\nconst ARROW_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"])\n\n/**\n * Determine the step factor for keyboard events\n */\nexport function getEventStep(event: KeyboardEvent) {\n if (event.ctrlKey || event.metaKey) {\n return 0.1\n } else {\n const isPageKey = PAGE_KEYS.has(event.key)\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.has(event.key))\n return isSkipKey ? 10 : 1\n }\n}\n", "export const visuallyHiddenStyle = {\n border: \"0\",\n clip: \"rect(0 0 0 0)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0\",\n position: \"absolute\",\n width: \"1px\",\n whiteSpace: \"nowrap\",\n wordWrap: \"normal\",\n} as const\n\nexport function setVisuallyHidden(el: HTMLElement) {\n Object.assign(el.style, visuallyHiddenStyle)\n}\n", "import { setVisuallyHidden } from \"./visually-hidden\"\n\nexport type LiveRegionOptions = {\n level: \"polite\" | \"assertive\"\n document?: Document\n root?: HTMLElement | null\n delay?: number\n}\n\nexport type LiveRegion = ReturnType<typeof createLiveRegion>\n\nconst LIVE_REGION_ID = \"__live-region__\"\n\nexport function createLiveRegion(opts: Partial<LiveRegionOptions> = {}) {\n const { level = \"polite\", document: doc = document, root, delay: _delay = 0 } = opts\n\n const win = doc.defaultView ?? window\n const parent = root ?? doc.body\n\n function announce(message: string, delay?: number) {\n const oldRegion = doc.getElementById(LIVE_REGION_ID)\n\n // remove old region\n oldRegion?.remove()\n\n // Did an override level get set?\n delay = delay ?? _delay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = LIVE_REGION_ID\n region.dataset.liveAnnouncer = \"true\"\n\n // Determine redundant role\n const role = level !== \"assertive\" ? \"status\" : \"alert\"\n\n // add role and attributes\n region.setAttribute(\"aria-live\", level)\n region.setAttribute(\"role\", role)\n\n // hide live region\n setVisuallyHidden(region)\n\n parent.appendChild(region)\n\n // populate region to trigger it\n win.setTimeout(() => {\n region.textContent = message\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(LIVE_REGION_ID)\n oldRegion?.remove()\n }\n\n return {\n announce,\n destroy,\n toJSON() {\n return LIVE_REGION_ID\n },\n }\n}\n", "type Root = Document | Element | null | undefined\n\nexport function queryAll<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return Array.from(root?.querySelectorAll<T>(selector) ?? [])\n}\n\nexport function query<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return root?.querySelector<T>(selector)\n}\n\nexport function itemById<T extends HTMLElement>(v: T[], id: string) {\n return v.find((node) => node.id === id)\n}\n\nexport function indexOfId<T extends HTMLElement>(v: T[], id: string) {\n const item = itemById(v, id)\n return item ? v.indexOf(item) : -1\n}\n\nexport function nextById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n idx = loop ? (idx + 1) % v.length : Math.min(idx + 1, v.length - 1)\n return v[idx]\n}\n\nexport function prevById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n if (idx === -1) return loop ? v[v.length - 1] : null\n idx = loop ? (idx - 1 + v.length) % v.length : Math.max(0, idx - 1)\n return v[idx]\n}\n\nconst getValueText = <T extends HTMLElement>(item: T) => item.dataset.valuetext ?? item.textContent ?? \"\"\n\nconst match = (valueText: string, query: string) => valueText.toLowerCase().startsWith(query.toLowerCase())\n\nconst wrap = <T>(v: T[], idx: number) => {\n return v.map((_, index) => v[(Math.max(idx, 0) + index) % v.length])\n}\n\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const index = currentId ? indexOfId(v, currentId) : -1\n let items = currentId ? wrap(v, index) : v\n\n const isSingleKey = text.length === 1\n\n if (isSingleKey) {\n items = items.filter((item) => item.id !== currentId)\n }\n\n return items.find((item) => match(getValueText(item), text))\n}\n\nexport function sortByTreeOrder<T extends HTMLElement>(v: T[]) {\n return v.sort((a, b) => (a.compareDocumentPosition(b) & 2 ? 1 : -1))\n}\n", "// Credits: https://github.com/adobe/react-spectrum/blob/e81cfec20056338c7987c513826dc45df32f3db4/packages/%40react-aria/interactions/src/textSelection.ts\nimport { isIos } from \"@zag-js/utils\"\nimport { nextTick } from \"./next-tick\"\n\ntype State = \"default\" | \"disabled\" | \"restoring\"\n\nlet state: State = \"default\"\nlet savedUserSelect = \"\"\nlet modifiedElementMap = new WeakMap<HTMLElement, string>()\n\nexport function disableTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state === \"default\") {\n savedUserSelect = _document.documentElement.style.webkitUserSelect\n _document.documentElement.style.webkitUserSelect = \"none\"\n }\n\n state = \"disabled\"\n } else if (target) {\n modifiedElementMap.set(target, target.style.userSelect)\n target.style.userSelect = \"none\"\n }\n\n return () => restoreTextSelection({ target, doc: _document })\n}\n\nexport function restoreTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state !== \"disabled\") return\n state = \"restoring\"\n\n setTimeout(() => {\n nextTick(() => {\n if (state === \"restoring\") {\n if (_document.documentElement.style.webkitUserSelect === \"none\") {\n _document.documentElement.style.webkitUserSelect = savedUserSelect || \"\"\n }\n\n savedUserSelect = \"\"\n state = \"default\"\n }\n })\n }, 300)\n } else {\n if (target && modifiedElementMap.has(target)) {\n let targetOldUserSelect = modifiedElementMap.get(target)\n\n if (target.style.userSelect === \"none\") {\n target.style.userSelect = targetOldUserSelect ?? \"\"\n }\n\n if (target.getAttribute(\"style\") === \"\") {\n target.removeAttribute(\"style\")\n }\n modifiedElementMap.delete(target)\n }\n }\n}\n", "import { isLeftClick, isMouseEvent, pipe } from \"@zag-js/utils\"\nimport { addDomEvent, addPointerEvent } from \"./listener\"\nimport type { AnyPointerEvent, EventListenerWithPointInfo as Listener, PointerEventInfo } from \"./listener.types\"\nimport { disableTextSelection } from \"./text-selection\"\n\nexport function trackPointerDown(doc: Document, onPointerDown: (el: HTMLElement) => void) {\n const win = doc.defaultView ?? window\n const fn = (event: PointerEvent) => {\n if (event.target instanceof win.HTMLElement) {\n onPointerDown(event.target)\n }\n }\n return addDomEvent(doc, \"pointerdown\", fn)\n}\n\ntype TrackPointerMoveOptions = {\n ctx: { doc?: Document; threshold?: number }\n onPointerUp: VoidFunction\n onPointerMove: (info: PointerEventInfo, event: AnyPointerEvent) => void\n}\n\nexport function trackPointerMove(opts: TrackPointerMoveOptions) {\n const { onPointerMove, onPointerUp, ctx } = opts\n const { doc = document, threshold = 5 } = ctx\n\n const handlePointerMove: Listener = (event, info) => {\n const { point: p } = info\n const distance = Math.sqrt(p.x ** 2 + p.y ** 2)\n if (distance < threshold) return\n\n // Because Safari doesn't trigger mouseup events when it's above a `<select>`\n if (isMouseEvent(event) && isLeftClick(event)) {\n onPointerUp()\n return\n }\n\n onPointerMove(info, event)\n }\n\n return pipe(\n addPointerEvent(doc, \"pointermove\", handlePointerMove, false),\n addPointerEvent(doc, \"pointerup\", onPointerUp, false),\n addPointerEvent(doc, \"pointercancel\", onPointerUp, false),\n addPointerEvent(doc, \"contextmenu\", onPointerUp, false),\n disableTextSelection({ doc }),\n )\n}\n", "import { pipe } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\ntype PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n return addDomEvent(doc, \"pointerlockchange\", fn, false)\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n const supported = \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc\n const locked = !!doc.pointerLockElement\n\n function onPointerChange() {\n if (locked) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n if (locked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock()\n }\n\n if (!supported) return\n\n body.requestPointerLock()\n\n const cleanup = pipe(\n addPointerlockChangeListener(doc, onPointerChange),\n addPointerlockErrorListener(doc, onPointerError),\n )\n\n return function dispose() {\n if (!supported) return\n cleanup()\n exit()\n }\n}\n", "// Credit goes to the radix-ui team for this utility:\n// https://github.com/radix-ui/primitives/blob/main/packages/core/rect/src/observeElementRect.ts\n\ntype Fn = (rect: DOMRect) => void\ntype ObservedData = { rect: DOMRect; callbacks: Fn[] }\nexport type Measurable = { getBoundingClientRect(): DOMRect }\n\nfunction getObservedElements(): Map<Measurable, ObservedData> {\n ;(globalThis as any).__rectObserverMap__ = (globalThis as any).__rectObserverMap__ || new Map()\n return (globalThis as any).__rectObserverMap__\n}\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\n const observedElements = getObservedElements()\n\n const data = observedElements.get(el)\n\n if (!data) {\n observedElements.set(el, { rect: {} as DOMRect, callbacks: [fn] })\n\n if (observedElements.size === 1) {\n rafId = requestAnimationFrame(runLoop)\n }\n } else {\n data.callbacks.push(fn)\n fn(el.getBoundingClientRect())\n }\n\n return function unobserve() {\n const data = observedElements.get(el)\n if (!data) return\n\n const index = data.callbacks.indexOf(fn)\n if (index > -1) {\n data.callbacks.splice(index, 1)\n }\n\n if (data.callbacks.length === 0) {\n observedElements.delete(el)\n\n if (observedElements.size === 0) {\n cancelAnimationFrame(rafId)\n }\n }\n }\n}\n\nlet rafId: number\n\nfunction runLoop() {\n const observedElements = getObservedElements()\n\n const changedRectsData: Array<ObservedData> = []\n\n observedElements.forEach((data, element) => {\n const newRect = element.getBoundingClientRect()\n\n if (!isEqual(data.rect, newRect)) {\n data.rect = newRect\n changedRectsData.push(data)\n }\n })\n\n changedRectsData.forEach((data) => {\n data.callbacks.forEach((callback) => callback(data.rect))\n })\n\n rafId = requestAnimationFrame(runLoop)\n}\n\nfunction isEqual(rect1: DOMRect, rect2: DOMRect) {\n return (\n rect1.width === rect2.width &&\n rect1.height === rect2.height &&\n rect1.top === rect2.top &&\n rect1.right === rect2.right &&\n rect1.bottom === rect2.bottom &&\n rect1.left === rect2.left\n )\n}\n", "import { getComputedStyle } from \"./computed-style\"\nimport { getNodeName, getOwnerDocument, getOwnerWindow, getParent, isHTMLElement, isWindow } from \"./query\"\n\nexport function isScrollParent(el: HTMLElement): boolean {\n const { overflow, overflowX, overflowY } = getComputedStyle(el)\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)\n}\n\nexport function getScrollParent(el: HTMLElement): HTMLElement {\n if ([\"html\", \"body\", \"#document\"].includes(getNodeName(el))) {\n return getOwnerDocument(el).body\n }\n\n if (isHTMLElement(el) && isScrollParent(el)) {\n return el\n }\n\n return getScrollParent(getParent(el))\n}\n\ntype Target = Array<VisualViewport | Window | HTMLElement>\n\nexport function getScrollParents(el: HTMLElement, list: Target = []): Target {\n const scrollParent = getScrollParent(el)\n const isBody = scrollParent === getOwnerDocument(el).body\n const win = getOwnerWindow(scrollParent)\n\n const target = isBody\n ? ([win] as Target).concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : [])\n : scrollParent\n\n const parents = list.concat(target)\n if (isBody) return parents\n\n return parents.concat(getScrollParents(getParent(<HTMLElement>target)))\n}\n\nexport function getScrollOffset(el: HTMLElement) {\n if (isWindow(el)) {\n return { scrollLeft: el.scrollX, scrollTop: el.scrollY }\n }\n\n return { scrollLeft: el.scrollLeft, scrollTop: el.scrollTop }\n}\n", "import { findByText } from \"./nodelist\"\n\nexport type TypeaheadState = {\n keysSoFar: string\n timer: number\n}\n\nexport type TypeaheadOptions = {\n state: TypeaheadState\n activeId: string | null\n key: string\n timeout?: number\n}\n\nexport function findByTypeahead<T extends HTMLElement>(_items: T[], options: TypeaheadOptions) {\n const { state, activeId, key, timeout = 350 } = options\n\n const search = state.keysSoFar + key\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0])\n\n const query = isRepeated ? search[0] : search\n\n let items = _items.slice()\n\n const next = findByText(items, query, activeId)\n\n function cleanup() {\n clearTimeout(state.timer)\n state.timer = -1\n }\n\n function update(value: string) {\n state.keysSoFar = value\n cleanup()\n\n if (value !== \"\") {\n state.timer = +setTimeout(() => {\n update(\"\")\n cleanup()\n }, timeout)\n }\n }\n\n update(search)\n\n return next\n}\n\nfindByTypeahead.defaultOptions = {\n keysSoFar: \"\",\n timer: -1,\n}\n", "import { cast } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\nexport function trackDocumentVisibility(_doc: Document, callback: (hidden: boolean) => void) {\n const doc = cast(_doc) as Document & { msHidden?: boolean; webkitHidden?: boolean }\n return addDomEvent(doc, \"visibilitychange\", () => {\n const hidden = doc.hidden || doc.msHidden || doc.webkitHidden\n callback(!!hidden)\n })\n}\n", "import { addDomEvent } from \"./listener\"\n\ntype ViewportSize = {\n width: number\n height: number\n}\n\ntype Options = {\n document?: Document\n resolve?(data: ViewportSize): void\n}\n\nexport function trackVisualViewport(options: Options) {\n const { document: doc, resolve } = options\n const win = doc?.defaultView || window\n resolve?.(getViewportSize(win))\n const onResize = () => resolve?.(getViewportSize(win))\n return addDomEvent(win.visualViewport ?? win, \"resize\", onResize)\n}\n\nfunction getViewportSize(win: Window): ViewportSize {\n return {\n width: win.visualViewport?.width || win.innerWidth,\n height: win.visualViewport?.height || win.innerHeight,\n }\n}\n", "export function waitFor<T>(predicate: () => T): Promise<T> {\n let value = predicate()\n if (!!value) return Promise.resolve(value)\n return new Promise((resolve) => {\n const id = globalThis.setInterval(function () {\n let value = predicate()\n if (value) {\n globalThis.clearInterval(id)\n resolve(value)\n }\n }, 0)\n })\n}\n\nexport function waitForEvent(el: HTMLElement, eventName: string) {\n return new Promise<void>((resolve) => {\n function done(event: Event) {\n if (event.target === el) {\n el.removeEventListener(eventName, done)\n resolve()\n }\n }\n\n el.addEventListener(eventName, done)\n })\n}\n", "import { Coords, Middleware } from \"@floating-ui/dom\"\n\n/* -----------------------------------------------------------------------------\n * Shared middleware utils\n * -----------------------------------------------------------------------------*/\n\nconst toVar = (value: string) => ({ variable: value, reference: `var(${value})` })\n\nexport const cssVars = {\n arrowSize: toVar(\"--arrow-size\"),\n arrowSizeHalf: toVar(\"--arrow-size-half\"),\n arrowBg: toVar(\"--arrow-background\"),\n transformOrigin: toVar(\"--transform-origin\"),\n arrowOffset: toVar(\"--arrow-offset\"),\n}\n\n/* -----------------------------------------------------------------------------\n * Transform Origin Middleware\n * -----------------------------------------------------------------------------*/\n\nconst getTransformOrigin = (arrow?: Partial<Coords>) => ({\n top: \"bottom center\",\n \"top-start\": arrow ? `${arrow.x}px bottom` : \"left bottom\",\n \"top-end\": arrow ? `${arrow.x}px bottom` : \"right bottom\",\n bottom: \"top center\",\n \"bottom-start\": arrow ? `${arrow.x}px top` : \"top left\",\n \"bottom-end\": arrow ? `${arrow.x}px top` : \"top right\",\n left: \"right center\",\n \"left-start\": arrow ? `right ${arrow.y}px` : \"right top\",\n \"left-end\": arrow ? `right ${arrow.y}px` : \"right bottom\",\n right: \"left center\",\n \"right-start\": arrow ? `left ${arrow.y}px` : \"left top\",\n \"right-end\": arrow ? `left ${arrow.y}px` : \"left bottom\",\n})\n\nexport const transformOrigin: Middleware = {\n name: \"transformOrigin\",\n fn({ placement, elements, middlewareData }) {\n const { arrow } = middlewareData\n const transformOrigin = getTransformOrigin(arrow)[placement]\n\n const { floating } = elements\n floating.style.setProperty(cssVars.transformOrigin.variable, transformOrigin)\n\n return {\n data: { transformOrigin },\n }\n },\n}\n\n/* -----------------------------------------------------------------------------\n * Arrow Middleware\n * -----------------------------------------------------------------------------*/\n\ntype ArrowOptions = { element: HTMLElement }\n\nexport const shiftArrow = (opts: ArrowOptions): Middleware => ({\n name: \"shiftArrow\",\n fn({ placement, middlewareData }) {\n const { element: arrow } = opts\n const { x, y } = middlewareData.arrow ?? { x: 0, y: 0 }\n\n const dir = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n }[placement.split(\"-\")[0]]!\n\n Object.assign(arrow.style, {\n top: `${y}px`,\n left: `${x}px`,\n [dir]: cssVars.arrowOffset.reference,\n })\n\n return {}\n },\n})\n", "import { Placement } from \"@floating-ui/dom\"\nimport { cssVars } from \"./middleware\"\n\ntype Options = {\n measured: boolean\n strategy?: \"absolute\" | \"fixed\"\n placement?: Placement\n}\n\nconst UNMEASURED_FLOATING_STYLE = {\n position: \"fixed\",\n top: 0,\n left: 0,\n opacity: 0,\n transform: \"translate3d(0, -200%, 0)\",\n pointerEvents: \"none\",\n} as const\n\nconst ARROW_FLOATING_STYLE = {\n bottom: \"rotate(45deg)\",\n left: \"rotate(135deg)\",\n top: \"rotate(225deg)\",\n right: \"rotate(315deg)\",\n} as const\n\nexport function getPlacementStyles(options: Options) {\n const { measured, strategy = \"absolute\", placement = \"bottom\" } = options\n\n return {\n arrow: {\n position: \"absolute\",\n width: cssVars.arrowSize.reference,\n height: cssVars.arrowSize.reference,\n [cssVars.arrowSizeHalf.variable]: `calc(${cssVars.arrowSize.reference} / 2)`,\n [cssVars.arrowOffset.variable]: `calc(${cssVars.arrowSizeHalf.reference} * -1)`,\n opacity: !measured ? 0 : undefined,\n } as const,\n\n innerArrow: {\n transform: ARROW_FLOATING_STYLE[placement.split(\"-\")[0]],\n background: cssVars.arrowBg.reference,\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n zIndex: \"inherit\",\n } as const,\n\n floating: {\n position: strategy,\n minWidth: \"max-content\",\n ...(!measured && UNMEASURED_FLOATING_STYLE),\n } as const,\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/get-placement.ts", "../../core/src/array.ts", "../../core/src/guard.ts", "../../core/src/platform.ts", "../../core/src/events.ts", "../../core/src/functions.ts", "../../core/src/warning.ts", "../src/auto-update.ts", "../../dom/src/attrs.ts", "../../dom/src/computed-style.ts", "../../dom/src/next-tick.ts", "../../dom/src/auto-resize.ts", "../../core/src/array.ts", "../../core/src/guard.ts", "../../core/src/platform.ts", "../../core/src/events.ts", "../../core/src/functions.ts", "../../core/src/warning.ts", "../../dom/src/global-listener.ts", "../../dom/src/listener.ts", "../../dom/src/body-pointer-event.ts", "../../dom/src/constants.ts", "../../dom/src/query.ts", "../../dom/src/event.ts", "../../dom/src/fire-event.ts", "../../dom/src/focus-event.ts", "../../dom/src/focusable.ts", "../../dom/src/mutation-observer.ts", "../../dom/src/form.ts", "../../dom/src/input-event.ts", "../../dom/src/keyboard-event.ts", "../../dom/src/visually-hidden.ts", "../../dom/src/live-region.ts", "../../dom/src/nodelist.ts", "../../dom/src/text-selection.ts", "../../dom/src/pointer-event.ts", "../../dom/src/pointerlock.ts", "../../dom/src/rect-observer.ts", "../../dom/src/scrollable.ts", "../../dom/src/typeahead.ts", "../../dom/src/visibility-event.ts", "../../dom/src/visual-viewport.ts", "../../dom/src/wait.ts", "../src/middleware.ts", "../src/get-styles.ts"],
4
- "sourcesContent": ["import type { VirtualElement } from \"@floating-ui/dom\"\nimport { arrow, computePosition, flip, Middleware, offset, shift, size } from \"@floating-ui/dom\"\nimport { noop, pipe } from \"@zag-js/utils\"\nimport { autoUpdate } from \"./auto-update\"\nimport { shiftArrow, transformOrigin } from \"./middleware\"\nimport { PositioningOptions } from \"./types\"\n\nconst defaultOptions: PositioningOptions = {\n strategy: \"absolute\",\n placement: \"bottom\",\n listeners: true,\n gutter: 8,\n flip: true,\n sameWidth: false,\n overflowPadding: 8,\n}\n\nexport function getPlacement(\n reference: HTMLElement | VirtualElement | null,\n floating: HTMLElement | null,\n options: PositioningOptions = {},\n) {\n if (reference == null || floating == null) return noop\n\n options = Object.assign({}, defaultOptions, options)\n\n /* -----------------------------------------------------------------------------\n * The middleware stack\n * -----------------------------------------------------------------------------*/\n\n const arrowEl = floating.querySelector<HTMLElement>(\"[data-part=arrow]\")\n const middleware: Middleware[] = []\n\n if (options.flip) {\n middleware.push(\n flip({\n boundary: options.boundary,\n padding: options.overflowPadding,\n }),\n )\n }\n\n if (options.gutter || options.offset) {\n const arrowOffset = arrowEl ? arrowEl.offsetHeight / 2 : 0\n const data = options.gutter ? { mainAxis: options.gutter } : options.offset\n if (data?.mainAxis != null) data.mainAxis += arrowOffset\n middleware.push(offset(data))\n }\n\n middleware.push(\n shift({\n boundary: options.boundary,\n crossAxis: options.overlap,\n padding: options.overflowPadding,\n }),\n )\n\n if (arrowEl) {\n // prettier-ignore\n middleware.push(\n arrow({ element: arrowEl, padding: 8 }),\n shiftArrow({ element: arrowEl }),\n )\n }\n\n middleware.push(transformOrigin)\n\n if (options.sameWidth || options.fitViewport) {\n middleware.push(\n size({\n padding: options.overflowPadding,\n apply(data) {\n const { reference, height, width } = data\n\n if (options.sameWidth) {\n Object.assign(floating.style, {\n width: `${reference.width}px`,\n minWidth: \"unset\",\n })\n }\n\n if (options.fitViewport) {\n Object.assign(floating.style, {\n maxWidth: `${width}px`,\n maxHeight: `${height}px`,\n })\n }\n },\n }),\n )\n }\n\n /* -----------------------------------------------------------------------------\n * The actual positioning function\n * -----------------------------------------------------------------------------*/\n\n function compute() {\n if (reference == null || floating == null) return\n const { placement, strategy } = options\n\n computePosition(reference, floating, {\n placement,\n middleware,\n strategy,\n })\n .then((data) => {\n const x = Math.round(data.x)\n const y = Math.round(data.y)\n\n Object.assign(floating.style, {\n position: data.strategy,\n top: \"0\",\n left: \"0\",\n transform: `translate3d(${x}px, ${y}px, 0)`,\n })\n\n return data\n })\n .then((data) => {\n options.onComplete?.(data)\n })\n }\n\n compute()\n\n // prettier-ignore\n return pipe(\n autoUpdate(reference, floating, compute, options.listeners),\n options.onCleanup ?? noop\n )\n}\n", "export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n", "export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => typeof window !== \"undefined\"\n\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n", "import { isDom } from \"./guard\"\n\nexport function getPlatform() {\n const agent = (navigator as any).userAgentData\n return agent?.platform ?? navigator.platform\n}\n\nconst pt = (v: RegExp) => isDom() && v.test(getPlatform())\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\nconst vn = (v: RegExp) => isDom() && v.test(navigator.vendor)\n\nexport const isTouchDevice = isDom() && !!navigator.maxTouchPoints\nexport const isMac = () => pt(/^Mac/) && !isTouchDevice\nexport const isIPhone = () => pt(/^iPhone/)\nexport const isSafari = () => isApple() && vn(/apple/i)\nexport const isFirefox = () => ua(/firefox\\//i)\nexport const isApple = () => pt(/mac|iphone|ipad|ipod/i)\nexport const isIos = () => isApple() && !isMac()\n", "import { hasProp, isDom, isObject } from \"./guard\"\nimport { isMac } from \"./platform\"\n\nexport const supportsPointerEvent = () => isDom() && window.onpointerdown === null\nexport const supportsTouchEvent = () => isDom() && window.ontouchstart === null\nexport const supportsMouseEvent = () => isDom() && window.onmousedown === null\n\nexport const isMouseEvent = (v: any): v is MouseEvent => isObject(v) && hasProp(v, \"button\")\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && hasProp(v, \"touches\")\nexport const isLeftClick = (v: { button: number }) => v.button === 0\nexport const isRightClick = (v: { button: number }) => v.button === 2\nexport const isModifiedEvent = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\n\nexport const isCtrlKey = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\">) =>\n isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey\n", "export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const pipe =\n <T>(...fns: Array<(a: T) => T>) =>\n (v: T) =>\n fns.reduce((a, b) => b(a), v)\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function merge<T, U>(origin: T, patch: U): T & U {\n if (!(typeof patch === \"object\")) return patch as any\n const result = !(typeof origin === \"object\") ? {} : Object.assign({}, origin)\n for (const key of Object.keys(patch)) {\n const value = patch[key]\n const src = result[key]\n if (value === null) delete result[key]\n else if (Array.isArray(value) || Array.isArray(src)) result[key] = (src || []).concat(value || [])\n else result[key] = merge(src, value)\n }\n return result as any\n}\n", "export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n", "import type { Placement, ReferenceElement } from \"@floating-ui/dom\"\nimport { getOverflowAncestors } from \"@floating-ui/dom\"\nimport { addDomEvent, isHTMLElement, observeElementRect } from \"@zag-js/dom-utils\"\nimport { isBoolean, pipe } from \"@zag-js/utils\"\n\nexport type { Placement }\n\nexport type AutoUpdateOptions = {\n ancestorScroll?: boolean\n ancestorResize?: boolean\n referenceResize?: boolean\n}\n\ntype Ancestors = ReturnType<typeof getOverflowAncestors>\n\nfunction resolveOptions(option: boolean | AutoUpdateOptions) {\n const bool = isBoolean(option)\n return {\n ancestorResize: bool ? option : option.ancestorResize ?? true,\n ancestorScroll: bool ? option : option.ancestorScroll ?? true,\n referenceResize: bool ? option : option.referenceResize ?? true,\n }\n}\n\nexport function autoUpdate(\n reference: ReferenceElement,\n floating: HTMLElement,\n update: () => void,\n options: boolean | AutoUpdateOptions = false,\n) {\n const { ancestorScroll, ancestorResize, referenceResize } = resolveOptions(options)\n\n const useAncestors = ancestorScroll || ancestorResize\n const ancestors: Ancestors = []\n\n if (useAncestors && isHTMLElement(reference)) {\n ancestors.push(...getOverflowAncestors(reference))\n }\n\n function addResizeListeners() {\n let cleanups: VoidFunction[] = [observeElementRect(floating, update)]\n if (referenceResize && isHTMLElement(reference)) {\n cleanups.push(observeElementRect(reference, update))\n }\n cleanups.push(pipe(...ancestors.map((el: any) => addDomEvent(el, \"resize\", update))))\n return () => cleanups.forEach((fn) => fn())\n }\n\n function addScrollListeners() {\n return pipe(...ancestors.map((el: any) => addDomEvent(el, \"scroll\", update, { passive: true })))\n }\n\n return pipe(addResizeListeners(), addScrollListeners())\n}\n", "type Booleanish = boolean | \"true\" | \"false\"\n\nexport const dataAttr = (guard: boolean | undefined) => {\n return (guard ? \"\" : undefined) as Booleanish\n}\n\nexport const ariaAttr = (guard: boolean | undefined) => {\n return guard ? \"true\" : undefined\n}\n\nexport const matchAttr = (el: Element) => {\n return {\n get: (key: string) => el.getAttribute(key),\n set: (key: string, value: string) => el.setAttribute(key, value),\n is: (key: string, value: string) => {\n return el.getAttribute(key) === value\n },\n }\n}\n", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nfunction getStyleCache(): WeakMap<HTMLElement, Styles> {\n ;(globalThis as any).__styleCache__ = (globalThis as any).__styleCache__ || new WeakMap()\n return (globalThis as any).__styleCache__\n}\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n const cache = getStyleCache()\n let style: Styles | undefined = cache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n cache.set(el, style)\n }\n return style\n}\n\nexport function copyVisualStyles(fromEl: HTMLElement | null, toEl: HTMLElement) {\n if (!fromEl) return\n const el = getComputedStyle(fromEl)\n // prettier-ignore\n const cssText = 'box-sizing:' + el.boxSizing +\n ';border-left:' + el.borderLeftWidth + ' solid red' +\n ';border-right:' + el.borderRightWidth + ' solid red' +\n ';font-family:' + el.fontFamily +\n ';font-feature-settings:' + el.fontFeatureSettings +\n ';font-kerning:' + el.fontKerning +\n ';font-size:' + el.fontSize +\n ';font-stretch:' + el.fontStretch +\n ';font-style:' + el.fontStyle +\n ';font-variant:' + el.fontVariant +\n ';font-variant-caps:' + el.fontVariantCaps +\n ';font-variant-ligatures:' + el.fontVariantLigatures +\n ';font-variant-numeric:' + el.fontVariantNumeric +\n ';font-weight:' + el.fontWeight +\n ';letter-spacing:' + el.letterSpacing +\n ';margin-left:' + el.marginLeft +\n ';margin-right:' + el.marginRight +\n ';padding-left:' + el.paddingLeft +\n ';padding-right:' + el.paddingRight +\n ';text-indent:' + el.textIndent +\n ';text-transform:' + el.textTransform\n\n toEl.style.cssText += cssText\n}\n", "export function nextTick(fn: VoidFunction) {\n const set = new Set<VoidFunction>()\n function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n set.add(() => globalThis.cancelAnimationFrame(id))\n }\n raf(() => raf(fn))\n return function cleanup() {\n set.forEach(function (fn) {\n fn()\n })\n }\n}\n\nexport function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n return function cleanup() {\n globalThis.cancelAnimationFrame(id)\n }\n}\n\nexport function queueMicrotask(fn: VoidFunction) {\n if (typeof globalThis.queueMicrotask === \"function\") {\n globalThis.queueMicrotask(fn)\n } else {\n Promise.resolve().then(fn)\n }\n}\n", "import { copyVisualStyles } from \"./computed-style\"\nimport { raf } from \"./next-tick\"\n\nfunction createGhostElement(doc: Document) {\n var el = doc.createElement(\"div\")\n el.id = \"ghost\"\n el.style.cssText =\n \"display:inline-block;height:0;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:nowrap;\"\n doc.body.appendChild(el)\n return el\n}\n\nexport function autoResizeInput(input: HTMLInputElement | null) {\n if (!input) return\n const doc = input.ownerDocument ?? document\n const ghost = createGhostElement(doc)\n\n copyVisualStyles(input, ghost)\n\n function resize() {\n raf(() => {\n ghost.innerHTML = input!.value\n const rect = getComputedStyle(ghost)\n input?.style.setProperty(\"width\", rect.width)\n })\n }\n\n resize()\n\n input?.addEventListener(\"input\", resize)\n input?.addEventListener(\"change\", resize)\n\n return () => {\n doc.body.removeChild(ghost)\n input?.removeEventListener(\"input\", resize)\n input?.removeEventListener(\"change\", resize)\n }\n}\n", "export function toArray<T>(v: T | T[] | undefined | null): T[] {\n if (!v) return []\n return Array.isArray(v) ? v : [v]\n}\n\nexport const fromLength = (length: number) => Array.from(Array(length).keys())\n\nexport const first = <T>(v: T[]): T | undefined => v[0]\n\nexport const last = <T>(v: T[]): T | undefined => v[v.length - 1]\n\nexport const isEmpty = <T>(v: T[]): boolean => v.length === 0\n\nexport const has = <T>(v: T[], t: any): boolean => v.indexOf(t) !== -1\n\nexport const add = <T>(v: T[], ...items: T[]): T[] => v.concat(items)\n\nexport const remove = <T>(v: T[], item: T): T[] => removeAt(v, v.indexOf(item))\n\nexport const removeAt = <T>(v: T[], i: number): T[] => {\n if (i > -1) v.splice(i, 1)\n return v\n}\n\nexport function clear<T>(v: T[]): T[] {\n while (v.length > 0) v.pop()\n return v\n}\n\nexport type IndexOptions = {\n step?: number\n loop?: boolean\n}\n\nexport function nextIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n const next = idx + step\n const len = v.length\n const last = len - 1\n if (idx === -1) return step > 0 ? 0 : last\n if (next < 0) return loop ? last : 0\n if (next >= len) return loop ? 0 : idx > len ? len : idx\n return next\n}\n\nexport function next<T>(v: T[], idx: number, opts: IndexOptions = {}): T | undefined {\n return v[nextIndex(v, idx, opts)]\n}\n\nexport function prevIndex<T>(v: T[], idx: number, opts: IndexOptions = {}): number {\n const { step = 1, loop = true } = opts\n return nextIndex(v, idx, { step: -step, loop })\n}\n\nexport function prev<T>(v: T[], index: number, opts: IndexOptions = {}): T | undefined {\n return v[prevIndex(v, index, opts)]\n}\n\nexport const chunk = <T>(v: T[], size: number): T[][] => {\n const res: T[][] = []\n return v.reduce((rows, value, index) => {\n if (index % size === 0) rows.push([value])\n else last(rows)?.push(value)\n return rows\n }, res)\n}\n", "export const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => typeof window !== \"undefined\"\n\nexport const isArray = (v: any): v is any[] => Array.isArray(v)\nexport const isBoolean = (v: any): v is boolean => v === true || v === false\nexport const isObject = (v: any): v is Record<string, any> => !(v == null || typeof v !== \"object\" || isArray(v))\nexport const isNumber = (v: any): v is number => typeof v === \"number\" && !Number.isNaN(v)\nexport const isString = (v: any): v is string => typeof v === \"string\"\nexport const isFunction = (v: any): v is Function => typeof v === \"function\"\n\nexport const hasProp = <T extends string>(obj: any, prop: T): obj is Record<T, any> =>\n Object.prototype.hasOwnProperty.call(obj, prop)\n", "import { isDom } from \"./guard\"\n\nexport function getPlatform() {\n const agent = (navigator as any).userAgentData\n return agent?.platform ?? navigator.platform\n}\n\nconst pt = (v: RegExp) => isDom() && v.test(getPlatform())\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\nconst vn = (v: RegExp) => isDom() && v.test(navigator.vendor)\n\nexport const isTouchDevice = isDom() && !!navigator.maxTouchPoints\nexport const isMac = () => pt(/^Mac/) && !isTouchDevice\nexport const isIPhone = () => pt(/^iPhone/)\nexport const isSafari = () => isApple() && vn(/apple/i)\nexport const isFirefox = () => ua(/firefox\\//i)\nexport const isApple = () => pt(/mac|iphone|ipad|ipod/i)\nexport const isIos = () => isApple() && !isMac()\n", "import { hasProp, isDom, isObject } from \"./guard\"\nimport { isMac } from \"./platform\"\n\nexport const supportsPointerEvent = () => isDom() && window.onpointerdown === null\nexport const supportsTouchEvent = () => isDom() && window.ontouchstart === null\nexport const supportsMouseEvent = () => isDom() && window.onmousedown === null\n\nexport const isMouseEvent = (v: any): v is MouseEvent => isObject(v) && hasProp(v, \"button\")\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && hasProp(v, \"touches\")\nexport const isLeftClick = (v: { button: number }) => v.button === 0\nexport const isRightClick = (v: { button: number }) => v.button === 2\nexport const isModifiedEvent = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\n\nexport const isCtrlKey = (v: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\">) =>\n isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey\n", "export const runIfFn = <T>(\n v: T | undefined,\n ...a: T extends (...a: any[]) => void ? Parameters<T> : never\n): T extends (...a: any[]) => void ? NonNullable<ReturnType<T>> : NonNullable<T> => {\n const res = typeof v === \"function\" ? v(...a) : v\n return res ?? undefined\n}\n\nexport const cast = <T>(v: unknown): T => v as T\n\nexport const noop = () => {}\n\nexport const pipe =\n <T>(...fns: Array<(a: T) => T>) =>\n (v: T) =>\n fns.reduce((a, b) => b(a), v)\n\nexport const callAll =\n <T extends (...a: any[]) => void>(...fns: (T | undefined)[]) =>\n (...a: Parameters<T>) => {\n fns.forEach(function (fn) {\n fn?.(...a)\n })\n }\n\nexport const uuid = /*#__PURE__*/ (() => {\n let id = 0\n return () => {\n id++\n return id.toString(36)\n }\n})()\n\nexport function merge<T, U>(origin: T, patch: U): T & U {\n if (!(typeof patch === \"object\")) return patch as any\n const result = !(typeof origin === \"object\") ? {} : Object.assign({}, origin)\n for (const key of Object.keys(patch)) {\n const value = patch[key]\n const src = result[key]\n if (value === null) delete result[key]\n else if (Array.isArray(value) || Array.isArray(src)) result[key] = (src || []).concat(value || [])\n else result[key] = merge(src, value)\n }\n return result as any\n}\n", "export function warn(m: string): void\nexport function warn(c: boolean, m: string): void\nexport function warn(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n console.warn(m)\n }\n}\n\nexport function invariant(m: string): void\nexport function invariant(c: boolean, m: string): void\nexport function invariant(...a: any[]): void {\n const m = a.length === 1 ? a[0] : a[1]\n const c = a.length === 2 ? a[0] : true\n if (c && process.env.NODE_ENV !== \"production\") {\n throw new Error(m)\n }\n}\n", "import { noop } from \"@zag-js/utils\"\n\ntype El = HTMLElement | Document | VisualViewport | Window\ntype Handler = (event: Event) => void\ntype Group = Map<string, Set<Handler>>\ntype Option = boolean | AddEventListenerOptions\n\nfunction getListenerElements(): Map<El, Group> {\n ;(globalThis as any).__listenerElements__ = (globalThis as any).__listenerElements__ || new Map()\n return (globalThis as any).__listenerElements__\n}\n\nfunction getListenerCache(): Map<El, Map<string, Handler>> {\n ;(globalThis as any).__listenerCache__ = (globalThis as any).__listenerCache__ || new Map()\n return (globalThis as any).__listenerCache__\n}\n\n/**\n * The global event bus for managing event listeners attached to DOM elements.\n *\n * It's goal is to ensure that only one listener is attached to a DOM element for a given event,\n * regardless of the number of times `addEventListener` is called.\n */\n\nexport function addGlobalEventListener(node: El | null, type: string, handler: Handler, options?: Option) {\n if (!node) return noop\n\n // unique identifier for the event listener\n const hash = JSON.stringify({ type, options })\n\n // Subscribe pattern\n const listenerElements = getListenerElements()\n const listenerCache = getListenerCache()\n\n const group = listenerElements.get(node)\n\n if (!listenerElements.has(node)) {\n // create group of listeners per hash\n const group: Group = new Map([[hash, new Set([handler])]])\n listenerElements.set(node, group)\n } else if (group?.has(hash)) {\n group?.get(hash)?.add(handler)\n } else {\n group?.set(hash, new Set([handler]))\n }\n\n // add the event listener to the node or register it in the cache\n function attach(node: El) {\n // Publish pattern\n function listener(event: Event) {\n const group = listenerElements.get(node)\n group?.get(hash)?.forEach((fn) => fn(event))\n }\n\n if (!listenerCache?.has(node)) {\n listenerCache.set(node, new Map([[hash, listener]]))\n node.addEventListener(type, listener, options)\n return\n }\n\n if (!listenerCache?.get(node)?.has(hash)) {\n listenerCache.get(node)?.set(hash, listener)\n node.addEventListener(type, listener, options)\n }\n }\n\n attach(node)\n\n return function remove() {\n if (!listenerElements.has(node)) return\n\n const group = listenerElements.get(node)\n group?.get(hash)?.delete(handler)\n\n if (group?.get(hash)?.size === 0) {\n const listener = listenerCache.get(node)?.get(hash)!\n node.removeEventListener(type, listener, options)\n group?.delete(hash)\n listenerCache.get(node)?.delete(hash)\n\n if (group?.size === 0) {\n listenerElements.delete(node)\n listenerCache.delete(node)\n }\n }\n }\n}\n", "import {\n supportsMouseEvent,\n supportsPointerEvent,\n supportsTouchEvent,\n runIfFn,\n hasProp,\n isTouchEvent,\n} from \"@zag-js/utils\"\nimport { addGlobalEventListener } from \"./global-listener\"\nimport {\n AnyPointerEvent,\n DOMEventTarget,\n EventMap,\n PointerEventInfo,\n PointerNameMap,\n RefTarget,\n} from \"./listener.types\"\n\nconst isRef = (v: any): v is RefTarget => hasProp(v, \"current\")\n\nconst fallback = { pageX: 0, pageY: 0, clientX: 0, clientY: 0 }\n\nexport function extractInfo<T extends AnyPointerEvent = AnyPointerEvent>(event: T, type: \"page\" | \"client\" = \"page\") {\n const point = isTouchEvent(event) ? event.touches[0] || event.changedTouches[0] || fallback : event\n return {\n point: {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n },\n }\n}\n\nexport function addDomEvent<K extends keyof EventMap>(\n target: DOMEventTarget,\n event: K,\n listener: (event: EventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n) {\n const node = isRef(target) ? target.current : runIfFn(target)\n return addGlobalEventListener(node as HTMLElement | null, event, listener as any, options)\n}\n\nexport function addPointerEvent<K extends keyof EventMap>(\n target: DOMEventTarget,\n event: K,\n listener: (event: EventMap[K], info: PointerEventInfo) => void,\n options?: boolean | AddEventListenerOptions,\n) {\n const type = getEventName(event) ?? event\n return addDomEvent(target, type, wrapHandler(listener, event === \"pointerdown\"), options)\n}\n\nfunction wrapHandler<E extends EventMap[keyof EventMap]>(\n fn: (event: E, info: PointerEventInfo) => void,\n filter = false,\n) {\n const listener: EventListener = (event: any) => {\n fn(event, extractInfo(event))\n }\n return filter ? filterPrimaryPointer(listener) : listener\n}\n\nfunction filterPrimaryPointer(fn: EventListener): EventListener {\n return (event: Event) => {\n const win = ((event as UIEvent).view ?? window) as typeof window\n const isMouseEvent = event instanceof win.MouseEvent\n const isPrimary = !isMouseEvent || (isMouseEvent && (event as MouseEvent).button === 0)\n if (isPrimary) fn(event)\n }\n}\n\nexport function extractClientInfo(event: AnyPointerEvent) {\n return extractInfo(event, \"client\")\n}\n\nconst mouseEventNames: PointerNameMap = {\n pointerdown: \"mousedown\",\n pointermove: \"mousemove\",\n pointerup: \"mouseup\",\n pointercancel: \"mousecancel\",\n pointerover: \"mouseover\",\n pointerout: \"mouseout\",\n pointerenter: \"mouseenter\",\n pointerleave: \"mouseleave\",\n}\n\nconst touchEventNames: PointerNameMap = {\n pointerdown: \"touchstart\",\n pointermove: \"touchmove\",\n pointerup: \"touchend\",\n pointercancel: \"touchcancel\",\n}\n\nexport function getEventName(evt: keyof EventMap): keyof EventMap {\n if (supportsPointerEvent()) return evt\n if (supportsTouchEvent()) return touchEventNames[evt]\n if (supportsMouseEvent()) return mouseEventNames[evt]\n return evt\n}\n", "import { isLeftClick, pipe } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\nimport { nextTick } from \"./next-tick\"\n\nlet changeCount = 0\nlet originalBodyPointerEvents: string\n\ntype PointerEventOptions = {\n disabled: boolean\n document?: Document\n}\n\nexport function preventBodyPointerEvents(el: HTMLElement | null, opts: Partial<PointerEventOptions> = {}) {\n const { disabled = false, document: docProp } = opts\n const doc: Document = docProp || document\n\n let isTouchOrPenPressed = false\n let isLeftClickPressed = false\n\n function listen() {\n const onPointerDown = (event: PointerEvent) => {\n const isMouse = event.pointerType === \"mouse\"\n isTouchOrPenPressed = !isMouse\n isLeftClickPressed = isMouse && isLeftClick(event)\n }\n\n const onPointerUp = () => {\n isTouchOrPenPressed = false\n isLeftClickPressed = false\n }\n\n // prettier-ignore\n return pipe(\n addDomEvent(doc, \"pointerdown\", onPointerDown),\n addDomEvent(doc,\"pointerup\", onPointerUp)\n )\n }\n\n function reset() {\n changeCount--\n if (changeCount === 0) {\n doc.body.style.pointerEvents = originalBodyPointerEvents\n }\n if (el) {\n el.style.pointerEvents = \"\"\n }\n }\n\n function apply() {\n if (disabled) return\n\n if (changeCount === 0) {\n originalBodyPointerEvents = doc.body.style.pointerEvents\n }\n\n doc.body.style.pointerEvents = \"none\"\n if (el) {\n el.style.pointerEvents = \"auto\"\n }\n\n changeCount++\n\n return function () {\n if (isTouchOrPenPressed) {\n addDomEvent(doc, \"click\", reset, { once: true })\n } else if (isLeftClickPressed) {\n addDomEvent(doc, \"pointerup\", reset, { once: true })\n } else {\n reset()\n }\n }\n }\n\n const cleanups: Array<VoidFunction | undefined> = []\n cleanups.push(apply())\n nextTick(() => {\n cleanups.push(listen())\n })\n\n return function () {\n cleanups.forEach((cleanup) => cleanup?.())\n }\n}\n", "export const MAX_Z_INDEX = 2147483647\n", "export function getOwnerDocument(el: HTMLElement | Window) {\n if (isWindow(el)) return el.document\n return el?.ownerDocument ?? document\n}\n\nexport function getOwnerWindow(el: HTMLElement) {\n return el?.ownerDocument.defaultView ?? window\n}\n\nexport function getDocumentElement(el: HTMLElement | Window): HTMLElement {\n return getOwnerDocument(el).documentElement\n}\n\nexport function getNodeName(node: HTMLElement | Window): string {\n return isWindow(node) ? \"\" : node ? node.localName || \"\" : \"\"\n}\n\nexport function getEventWindow(event: UIEvent) {\n if (event.view) return event.view\n let target = event.currentTarget\n if (target != null) return getOwnerWindow(target as HTMLElement)\n return window\n}\n\nexport function getParent(el: HTMLElement): HTMLElement {\n const doc = getOwnerDocument(el)\n if (getNodeName(el) === \"html\") return el\n return el.assignedSlot || el.parentElement || doc.documentElement\n}\n\ntype Node = HTMLElement | EventTarget | null\n\nexport function contains(parent: Node | undefined, child: Node) {\n if (!parent) return false\n return parent === child || (isHTMLElement(parent) && isHTMLElement(child) && parent.contains(child))\n}\n\nexport function isHTMLElement(v: any): v is HTMLElement {\n return typeof v === \"object\" && v?.nodeType === Node.ELEMENT_NODE && typeof v?.nodeName === \"string\"\n}\n\nexport function isWindow(value: any): value is Window {\n return value?.toString() === \"[object Window]\"\n}\n\nexport const isDisabled = (el: HTMLElement | null): boolean => {\n return el?.getAttribute(\"disabled\") != null || !!el?.getAttribute(\"aria-disabled\") === true\n}\n\nexport function isElementEditable(el: HTMLElement | null) {\n if (el == null) return false\n const selectors = [\n \"input:not([readonly])\",\n \"textarea:not([readonly])\",\n \"[contenteditable]\",\n \"select:not([readonly])\",\n ].join(\", \")\n return el.matches(selectors) || el.isContentEditable\n}\n", "import { contains } from \"./query\"\n\nexport function isKeyboardClick(e: Pick<MouseEvent, \"detail\" | \"clientX\" | \"clientY\">) {\n return e.detail === 0 || (e.clientX === 0 && e.clientY === 0)\n}\n\nexport function isPrintableKey(e: Pick<KeyboardEvent, \"key\" | \"ctrlKey\" | \"metaKey\">): boolean {\n return e.key.length === 1 && !e.ctrlKey && !e.metaKey\n}\n\ntype NativeEvent<E> = React.ChangeEvent<any> extends E\n ? InputEvent\n : E extends React.SyntheticEvent<any, infer T>\n ? T\n : never\n\nexport function getNativeEvent<E>(e: E): NativeEvent<E> {\n return (e as any).nativeEvent ?? e\n}\n\nexport function queueBeforeEvent(el: Element, type: string, fn: VoidFunction) {\n const raf = requestAnimationFrame(() => {\n el.removeEventListener(type, invoke, true)\n fn()\n })\n\n const invoke = () => {\n cancelAnimationFrame(raf)\n fn()\n }\n\n el.addEventListener(type, invoke, { once: true, capture: true })\n\n return raf\n}\n\nexport function isPortalEvent(event: Pick<Event, \"currentTarget\" | \"target\">): boolean {\n return !contains(event.currentTarget, event.target)\n}\n\nexport function isSelfTarget(event: Pick<Event, \"target\" | \"currentTarget\">): boolean {\n return event.target === event.currentTarget\n}\n", "export function fireEvent(el: Element, type: string, init?: EventInit) {\n const event = new Event(type, init)\n return el.dispatchEvent(event)\n}\n\nexport function fireCustomEvent(el: Element, type: string, init?: CustomEventInit) {\n const event = new CustomEvent(type, init)\n return el.dispatchEvent(event)\n}\n\nexport function fireBlurEvent(el: Element, init?: FocusEventInit) {\n const event = new FocusEvent(\"blur\", init)\n const allowed = el.dispatchEvent(event)\n const bubbleInit = { ...init, bubbles: true }\n el.dispatchEvent(new FocusEvent(\"focusout\", bubbleInit))\n return allowed\n}\n\nexport function fireKeyboardEvent(el: Element, type: string, init?: KeyboardEventInit) {\n const event = new KeyboardEvent(type, init)\n return el.dispatchEvent(event)\n}\n\nexport function fireClickEvent(el: Element, init?: PointerEventInit) {\n const event = typeof PointerEvent !== \"undefined\" ? new PointerEvent(\"click\", init) : new MouseEvent(\"click\", init)\n return el.dispatchEvent(event)\n}\n", "/**\n * Determine if the blur event within an element is valid\n */\nexport function validateBlur(event: Event, opts: Options) {\n const exclude = Array.isArray(opts.exclude) ? opts.exclude : [opts.exclude]\n const relatedTarget = (event.relatedTarget ?? opts.fallback) as HTMLElement\n return exclude.every((el) => !el?.contains(relatedTarget))\n}\n\ntype MaybeArray<T> = T | T[]\n\ntype Options = {\n exclude: MaybeArray<HTMLElement | null>\n fallback?: HTMLElement | null\n}\n\ntype Event = Pick<FocusEvent, \"relatedTarget\">\n", "import { getComputedStyle } from \"./computed-style\"\nimport { isDisabled, isHTMLElement } from \"./query\"\n\nexport const focusableSelector = /*#__PURE__*/ [\n \"input:not([disabled]):not([type=hidden])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"embed\",\n \"iframe\",\n \"object\",\n \"a[href]\",\n \"area[href]\",\n \"[tabindex]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"*[tabindex]:not([aria-disabled])\",\n \"[contenteditable]:not([contenteditable=false])\",\n \"details > summary:first-of-type\",\n].join(\",\")\n\nexport function isHidden(el: HTMLElement | null, until?: HTMLElement) {\n const style = getComputedStyle(el)\n if (!el || style.getPropertyValue(\"visibility\") === \"hidden\") return true\n while (el) {\n if (until != null && el === until) return false\n if (style.getPropertyValue(\"display\") === \"none\") return true\n el = el.parentElement\n }\n return false\n}\n\n/**\n * Returns the focusable elements within the element\n */\nexport const getFocusables = (el: HTMLElement | Document | null, includeContainer: boolean | \"if-empty\" = false) => {\n if (!el) return []\n let els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const shouldAddContainer = includeContainer == true || (includeContainer == \"if-empty\" && els.length === 0)\n\n if (shouldAddContainer && isHTMLElement(el)) {\n els.unshift(el)\n }\n\n return els.filter((el) => isFocusable(el) && !isHidden(el))\n}\n\n/**\n * Whether this element is focusable\n */\nexport const isFocusable = (el: HTMLElement | null) => {\n if (!isHTMLElement(el) || isHidden(el) || isDisabled(el)) return false\n return el?.matches(focusableSelector)\n}\n\n/**\n * Returns the tabbable elements within the element\n */\nexport const getTabbables = (el: HTMLElement | Document | null, includeContainer: boolean | \"if-empty\" = false) => {\n if (!el) return []\n return getFocusables(el, includeContainer).filter(isTabbable)\n}\n\n/**\n * Whether this element is tabbable\n */\nexport const isTabbable = (el: HTMLElement | null) => {\n return isFocusable(el) && !isDisabled(el) && !isHidden(el)\n}\n", "import { noop } from \"@zag-js/utils\"\n\ntype Callback = (v: MutationRecord) => void\n\nexport function observeAttributes(node: Element | null, attributes: string | string[], fn: Callback) {\n if (!node) return noop\n const attrs = Array.isArray(attributes) ? attributes : [attributes]\n const win = node.ownerDocument.defaultView || window\n const obs = new win.MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type === \"attributes\" && change.attributeName && attrs.includes(change.attributeName)) {\n fn(change)\n }\n }\n })\n\n obs.observe(node, { attributes: true, attributeFilter: attrs })\n\n return () => obs.disconnect()\n}\n\nexport function observeChildren(node: Element | null, fn: Callback) {\n if (!node) return noop\n const win = node.ownerDocument.defaultView || window\n const obs = new win.MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type === \"childList\") {\n fn(change)\n }\n }\n })\n\n obs.observe(node, { childList: true, subtree: true })\n\n return () => obs.disconnect()\n}\n", "import { observeAttributes } from \"./mutation-observer\"\n\nexport function getClosestForm(el: HTMLElement) {\n if (isFormElement(el)) return el.form\n else return el.closest(\"form\")\n}\n\nfunction isFormElement(el: HTMLElement): el is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement {\n return el.matches(\"textarea, input, select, button\")\n}\n\nexport function trackFormReset(el: HTMLElement | null | undefined, callback: () => void) {\n if (!el) return\n const form = getClosestForm(el)\n form?.addEventListener(\"reset\", callback, { passive: true })\n return () => {\n form?.removeEventListener(\"reset\", callback)\n }\n}\n\nexport function trackFieldsetDisabled(el: HTMLElement | null | undefined, callback: (disabled: boolean) => void) {\n const fieldset = el?.closest(\"fieldset\")\n if (!fieldset) return\n callback(fieldset.disabled)\n return observeAttributes(fieldset, [\"disabled\"], () => callback(fieldset.disabled))\n}\n\nexport function isNativeDisabled(el: HTMLElement) {\n return el.matches(\":disabled\")\n}\n", "import { getOwnerWindow } from \"./query\"\n\ntype DescriptorOptions = {\n type: \"input\" | \"textarea\"\n property: \"value\" | \"checked\"\n}\n\nfunction getDescriptor(el: HTMLElement, options: DescriptorOptions) {\n const { type, property } = options\n const win = getOwnerWindow(el)\n const _type = type === \"input\" ? \"HTMLInputElement\" : \"HTMLTextAreaElement\"\n const proto = win[_type].prototype\n return Object.getOwnPropertyDescriptor(proto, property) ?? {}\n}\n\nexport function dispatchInputValueEvent(el: HTMLElement, value: string | number) {\n const win = getOwnerWindow(el)\n if (!(el instanceof win.HTMLInputElement)) return\n const desc = getDescriptor(el, { type: \"input\", property: \"value\" })\n desc.set?.call(el, value)\n const event = new win.Event(\"input\", { bubbles: true })\n el.dispatchEvent(event)\n}\n\nexport function dispatchInputCheckedEvent(el: HTMLElement, checked: boolean) {\n const win = getOwnerWindow(el)\n if (!(el instanceof win.HTMLInputElement)) return\n const desc = getDescriptor(el, { type: \"input\", property: \"checked\" })\n desc.set?.call(el, checked)\n const event = new win.Event(\"click\", { bubbles: true })\n el.dispatchEvent(event)\n}\n\nexport function trackInputPropertyMutation(\n el: HTMLInputElement | null,\n options: DescriptorOptions & { fn?: (value: string) => void },\n) {\n const { fn, property, type } = options\n\n if (!fn || !el) return\n\n const { get, set } = getDescriptor(el, { property, type })\n\n let run = true\n\n Object.defineProperty(el, property, {\n get() {\n return get?.call(this)\n },\n set(value: string) {\n if (run) fn(value)\n return set?.call(this, value)\n },\n })\n\n return () => {\n run = false\n }\n}\n", "import type { KeyboardEvent } from \"react\"\n\ntype EventKey =\n | \"ArrowDown\"\n | \"ArrowUp\"\n | \"ArrowLeft\"\n | \"ArrowRight\"\n | \"Space\"\n | \"Enter\"\n | \"Comma\"\n | \"Escape\"\n | \"Backspace\"\n | \"Delete\"\n | \"Home\"\n | \"End\"\n | \"Tab\"\n | \"PageUp\"\n | \"PageDown\"\n | (string & {})\n\nexport type EventKeyMap = Partial<Record<EventKey, (event: React.KeyboardEvent) => void>>\n\nconst rtlKeyMap = {\n ArrowLeft: \"ArrowRight\",\n ArrowRight: \"ArrowLeft\",\n Home: \"End\",\n End: \"Home\",\n}\n\nconst sameKeyMap = {\n Up: \"ArrowUp\",\n Down: \"ArrowDown\",\n Esc: \"Escape\",\n \" \": \"Space\",\n \",\": \"Comma\",\n Left: \"ArrowLeft\",\n Right: \"ArrowRight\",\n}\n\ntype EventKeyOptions = {\n dir?: \"ltr\" | \"rtl\"\n orientation?: \"horizontal\" | \"vertical\"\n}\n\n/**\n * Determine the event key based on text direction.\n */\nexport function getEventKey(event: KeyboardEvent, options: EventKeyOptions = {}) {\n const { dir = \"ltr\", orientation = \"horizontal\" } = options\n\n let { key } = event\n key = sameKeyMap[key] ?? key // normalize key\n\n const isRtl = dir === \"rtl\" && orientation === \"horizontal\"\n\n if (isRtl && key in rtlKeyMap) {\n key = rtlKeyMap[key]\n }\n\n return key\n}\n\nconst PAGE_KEYS = new Set([\"PageUp\", \"PageDown\"])\nconst ARROW_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"])\n\n/**\n * Determine the step factor for keyboard events\n */\nexport function getEventStep(event: KeyboardEvent) {\n if (event.ctrlKey || event.metaKey) {\n return 0.1\n } else {\n const isPageKey = PAGE_KEYS.has(event.key)\n const isSkipKey = isPageKey || (event.shiftKey && ARROW_KEYS.has(event.key))\n return isSkipKey ? 10 : 1\n }\n}\n", "export const visuallyHiddenStyle = {\n border: \"0\",\n clip: \"rect(0 0 0 0)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0\",\n position: \"absolute\",\n width: \"1px\",\n whiteSpace: \"nowrap\",\n wordWrap: \"normal\",\n} as const\n\nexport function setVisuallyHidden(el: HTMLElement) {\n Object.assign(el.style, visuallyHiddenStyle)\n}\n", "import { setVisuallyHidden } from \"./visually-hidden\"\n\nexport type LiveRegionOptions = {\n level: \"polite\" | \"assertive\"\n document?: Document\n root?: HTMLElement | null\n delay?: number\n}\n\nexport type LiveRegion = ReturnType<typeof createLiveRegion>\n\nconst LIVE_REGION_ID = \"__live-region__\"\n\nexport function createLiveRegion(opts: Partial<LiveRegionOptions> = {}) {\n const { level = \"polite\", document: doc = document, root, delay: _delay = 0 } = opts\n\n const win = doc.defaultView ?? window\n const parent = root ?? doc.body\n\n function announce(message: string, delay?: number) {\n const oldRegion = doc.getElementById(LIVE_REGION_ID)\n\n // remove old region\n oldRegion?.remove()\n\n // Did an override level get set?\n delay = delay ?? _delay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = LIVE_REGION_ID\n region.dataset.liveAnnouncer = \"true\"\n\n // Determine redundant role\n const role = level !== \"assertive\" ? \"status\" : \"alert\"\n\n // add role and attributes\n region.setAttribute(\"aria-live\", level)\n region.setAttribute(\"role\", role)\n\n // hide live region\n setVisuallyHidden(region)\n\n parent.appendChild(region)\n\n // populate region to trigger it\n win.setTimeout(() => {\n region.textContent = message\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(LIVE_REGION_ID)\n oldRegion?.remove()\n }\n\n return {\n announce,\n destroy,\n toJSON() {\n return LIVE_REGION_ID\n },\n }\n}\n", "type Root = Document | Element | null | undefined\n\nexport function queryAll<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return Array.from(root?.querySelectorAll<T>(selector) ?? [])\n}\n\nexport function query<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return root?.querySelector<T>(selector)\n}\n\nexport function itemById<T extends HTMLElement>(v: T[], id: string) {\n return v.find((node) => node.id === id)\n}\n\nexport function indexOfId<T extends HTMLElement>(v: T[], id: string) {\n const item = itemById(v, id)\n return item ? v.indexOf(item) : -1\n}\n\nexport function nextById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n idx = loop ? (idx + 1) % v.length : Math.min(idx + 1, v.length - 1)\n return v[idx]\n}\n\nexport function prevById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n if (idx === -1) return loop ? v[v.length - 1] : null\n idx = loop ? (idx - 1 + v.length) % v.length : Math.max(0, idx - 1)\n return v[idx]\n}\n\nconst getValueText = <T extends HTMLElement>(item: T) => item.dataset.valuetext ?? item.textContent ?? \"\"\n\nconst match = (valueText: string, query: string) => valueText.toLowerCase().startsWith(query.toLowerCase())\n\nconst wrap = <T>(v: T[], idx: number) => {\n return v.map((_, index) => v[(Math.max(idx, 0) + index) % v.length])\n}\n\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const index = currentId ? indexOfId(v, currentId) : -1\n let items = currentId ? wrap(v, index) : v\n\n const isSingleKey = text.length === 1\n\n if (isSingleKey) {\n items = items.filter((item) => item.id !== currentId)\n }\n\n return items.find((item) => match(getValueText(item), text))\n}\n\nexport function sortByTreeOrder<T extends HTMLElement>(v: T[]) {\n return v.sort((a, b) => (a.compareDocumentPosition(b) & 2 ? 1 : -1))\n}\n", "// Credits: https://github.com/adobe/react-spectrum/blob/e81cfec20056338c7987c513826dc45df32f3db4/packages/%40react-aria/interactions/src/textSelection.ts\nimport { isIos } from \"@zag-js/utils\"\nimport { nextTick } from \"./next-tick\"\n\ntype State = \"default\" | \"disabled\" | \"restoring\"\n\nlet state: State = \"default\"\nlet savedUserSelect = \"\"\nlet modifiedElementMap = new WeakMap<HTMLElement, string>()\n\nexport function disableTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state === \"default\") {\n savedUserSelect = _document.documentElement.style.webkitUserSelect\n _document.documentElement.style.webkitUserSelect = \"none\"\n }\n\n state = \"disabled\"\n } else if (target) {\n modifiedElementMap.set(target, target.style.userSelect)\n target.style.userSelect = \"none\"\n }\n\n return () => restoreTextSelection({ target, doc: _document })\n}\n\nexport function restoreTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state !== \"disabled\") return\n state = \"restoring\"\n\n setTimeout(() => {\n nextTick(() => {\n if (state === \"restoring\") {\n if (_document.documentElement.style.webkitUserSelect === \"none\") {\n _document.documentElement.style.webkitUserSelect = savedUserSelect || \"\"\n }\n\n savedUserSelect = \"\"\n state = \"default\"\n }\n })\n }, 300)\n } else {\n if (target && modifiedElementMap.has(target)) {\n let targetOldUserSelect = modifiedElementMap.get(target)\n\n if (target.style.userSelect === \"none\") {\n target.style.userSelect = targetOldUserSelect ?? \"\"\n }\n\n if (target.getAttribute(\"style\") === \"\") {\n target.removeAttribute(\"style\")\n }\n modifiedElementMap.delete(target)\n }\n }\n}\n", "import { isLeftClick, isMouseEvent, pipe } from \"@zag-js/utils\"\nimport { addDomEvent, addPointerEvent } from \"./listener\"\nimport type { AnyPointerEvent, EventListenerWithPointInfo as Listener, PointerEventInfo } from \"./listener.types\"\nimport { disableTextSelection } from \"./text-selection\"\n\nexport function trackPointerDown(doc: Document, onPointerDown: (el: HTMLElement) => void) {\n const win = doc.defaultView ?? window\n const fn = (event: PointerEvent) => {\n if (event.target instanceof win.HTMLElement) {\n onPointerDown(event.target)\n }\n }\n return addDomEvent(doc, \"pointerdown\", fn)\n}\n\ntype TrackPointerMoveOptions = {\n ctx: { doc?: Document; threshold?: number }\n onPointerUp: VoidFunction\n onPointerMove: (info: PointerEventInfo, event: AnyPointerEvent) => void\n}\n\nexport function trackPointerMove(opts: TrackPointerMoveOptions) {\n const { onPointerMove, onPointerUp, ctx } = opts\n const { doc = document, threshold = 5 } = ctx\n\n const handlePointerMove: Listener = (event, info) => {\n const { point: p } = info\n const distance = Math.sqrt(p.x ** 2 + p.y ** 2)\n if (distance < threshold) return\n\n // Because Safari doesn't trigger mouseup events when it's above a `<select>`\n if (isMouseEvent(event) && isLeftClick(event)) {\n onPointerUp()\n return\n }\n\n onPointerMove(info, event)\n }\n\n return pipe(\n addPointerEvent(doc, \"pointermove\", handlePointerMove, false),\n addPointerEvent(doc, \"pointerup\", onPointerUp, false),\n addPointerEvent(doc, \"pointercancel\", onPointerUp, false),\n addPointerEvent(doc, \"contextmenu\", onPointerUp, false),\n disableTextSelection({ doc }),\n )\n}\n", "import { pipe } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\ntype PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n return addDomEvent(doc, \"pointerlockchange\", fn, false)\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n const supported = \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc\n const locked = !!doc.pointerLockElement\n\n function onPointerChange() {\n if (locked) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n if (locked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock()\n }\n\n if (!supported) return\n\n body.requestPointerLock()\n\n const cleanup = pipe(\n addPointerlockChangeListener(doc, onPointerChange),\n addPointerlockErrorListener(doc, onPointerError),\n )\n\n return function dispose() {\n if (!supported) return\n cleanup()\n exit()\n }\n}\n", "// Credit goes to the radix-ui team for this utility:\n// https://github.com/radix-ui/primitives/blob/main/packages/core/rect/src/observeElementRect.ts\n\ntype Fn = (rect: DOMRect) => void\ntype ObservedData = { rect: DOMRect; callbacks: Fn[] }\nexport type Measurable = { getBoundingClientRect(): DOMRect }\n\nfunction getObservedElements(): Map<Measurable, ObservedData> {\n ;(globalThis as any).__rectObserverMap__ = (globalThis as any).__rectObserverMap__ || new Map()\n return (globalThis as any).__rectObserverMap__\n}\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\n const observedElements = getObservedElements()\n\n const data = observedElements.get(el)\n\n if (!data) {\n observedElements.set(el, { rect: {} as DOMRect, callbacks: [fn] })\n\n if (observedElements.size === 1) {\n rafId = requestAnimationFrame(runLoop)\n }\n } else {\n data.callbacks.push(fn)\n fn(el.getBoundingClientRect())\n }\n\n return function unobserve() {\n const data = observedElements.get(el)\n if (!data) return\n\n const index = data.callbacks.indexOf(fn)\n if (index > -1) {\n data.callbacks.splice(index, 1)\n }\n\n if (data.callbacks.length === 0) {\n observedElements.delete(el)\n\n if (observedElements.size === 0) {\n cancelAnimationFrame(rafId)\n }\n }\n }\n}\n\nlet rafId: number\n\nfunction runLoop() {\n const observedElements = getObservedElements()\n\n const changedRectsData: Array<ObservedData> = []\n\n observedElements.forEach((data, element) => {\n const newRect = element.getBoundingClientRect()\n\n if (!isEqual(data.rect, newRect)) {\n data.rect = newRect\n changedRectsData.push(data)\n }\n })\n\n changedRectsData.forEach((data) => {\n data.callbacks.forEach((callback) => callback(data.rect))\n })\n\n rafId = requestAnimationFrame(runLoop)\n}\n\nfunction isEqual(rect1: DOMRect, rect2: DOMRect) {\n return (\n rect1.width === rect2.width &&\n rect1.height === rect2.height &&\n rect1.top === rect2.top &&\n rect1.right === rect2.right &&\n rect1.bottom === rect2.bottom &&\n rect1.left === rect2.left\n )\n}\n", "import { getComputedStyle } from \"./computed-style\"\nimport { getNodeName, getOwnerDocument, getOwnerWindow, getParent, isHTMLElement, isWindow } from \"./query\"\n\nexport function isScrollParent(el: HTMLElement): boolean {\n const { overflow, overflowX, overflowY } = getComputedStyle(el)\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)\n}\n\nexport function getScrollParent(el: HTMLElement): HTMLElement {\n if ([\"html\", \"body\", \"#document\"].includes(getNodeName(el))) {\n return getOwnerDocument(el).body\n }\n\n if (isHTMLElement(el) && isScrollParent(el)) {\n return el\n }\n\n return getScrollParent(getParent(el))\n}\n\ntype Target = Array<VisualViewport | Window | HTMLElement>\n\nexport function getScrollParents(el: HTMLElement, list: Target = []): Target {\n const scrollParent = getScrollParent(el)\n const isBody = scrollParent === getOwnerDocument(el).body\n const win = getOwnerWindow(scrollParent)\n\n const target = isBody\n ? ([win] as Target).concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : [])\n : scrollParent\n\n const parents = list.concat(target)\n if (isBody) return parents\n\n return parents.concat(getScrollParents(getParent(<HTMLElement>target)))\n}\n\nexport function getScrollOffset(el: HTMLElement) {\n if (isWindow(el)) {\n return { scrollLeft: el.scrollX, scrollTop: el.scrollY }\n }\n\n return { scrollLeft: el.scrollLeft, scrollTop: el.scrollTop }\n}\n", "import { findByText } from \"./nodelist\"\n\nexport type TypeaheadState = {\n keysSoFar: string\n timer: number\n}\n\nexport type TypeaheadOptions = {\n state: TypeaheadState\n activeId: string | null\n key: string\n timeout?: number\n}\n\nexport function findByTypeahead<T extends HTMLElement>(_items: T[], options: TypeaheadOptions) {\n const { state, activeId, key, timeout = 350 } = options\n\n const search = state.keysSoFar + key\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0])\n\n const query = isRepeated ? search[0] : search\n\n let items = _items.slice()\n\n const next = findByText(items, query, activeId)\n\n function cleanup() {\n clearTimeout(state.timer)\n state.timer = -1\n }\n\n function update(value: string) {\n state.keysSoFar = value\n cleanup()\n\n if (value !== \"\") {\n state.timer = +setTimeout(() => {\n update(\"\")\n cleanup()\n }, timeout)\n }\n }\n\n update(search)\n\n return next\n}\n\nfindByTypeahead.defaultOptions = {\n keysSoFar: \"\",\n timer: -1,\n}\n", "import { cast } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\nexport function trackDocumentVisibility(_doc: Document, callback: (hidden: boolean) => void) {\n const doc = cast(_doc) as Document & { msHidden?: boolean; webkitHidden?: boolean }\n return addDomEvent(doc, \"visibilitychange\", () => {\n const hidden = doc.hidden || doc.msHidden || doc.webkitHidden\n callback(!!hidden)\n })\n}\n", "import { addDomEvent } from \"./listener\"\n\ntype ViewportSize = {\n width: number\n height: number\n}\n\ntype Options = {\n document?: Document\n resolve?(data: ViewportSize): void\n}\n\nexport function trackVisualViewport(options: Options) {\n const { document: doc, resolve } = options\n const win = doc?.defaultView || window\n resolve?.(getViewportSize(win))\n const onResize = () => resolve?.(getViewportSize(win))\n return addDomEvent(win.visualViewport ?? win, \"resize\", onResize)\n}\n\nfunction getViewportSize(win: Window): ViewportSize {\n return {\n width: win.visualViewport?.width || win.innerWidth,\n height: win.visualViewport?.height || win.innerHeight,\n }\n}\n", "export function waitFor<T>(predicate: () => T): Promise<T> {\n let value = predicate()\n if (!!value) return Promise.resolve(value)\n return new Promise((resolve) => {\n const id = globalThis.setInterval(function () {\n let value = predicate()\n if (value) {\n globalThis.clearInterval(id)\n resolve(value)\n }\n }, 0)\n })\n}\n\nexport function waitForEvent(el: HTMLElement, eventName: string) {\n return new Promise<void>((resolve) => {\n function done(event: Event) {\n if (event.target === el) {\n el.removeEventListener(eventName, done)\n resolve()\n }\n }\n\n el.addEventListener(eventName, done)\n })\n}\n", "import { Coords, Middleware } from \"@floating-ui/dom\"\n\n/* -----------------------------------------------------------------------------\n * Shared middleware utils\n * -----------------------------------------------------------------------------*/\n\nconst toVar = (value: string) => ({ variable: value, reference: `var(${value})` })\n\nexport const cssVars = {\n arrowSize: toVar(\"--arrow-size\"),\n arrowSizeHalf: toVar(\"--arrow-size-half\"),\n arrowBg: toVar(\"--arrow-background\"),\n transformOrigin: toVar(\"--transform-origin\"),\n arrowOffset: toVar(\"--arrow-offset\"),\n}\n\n/* -----------------------------------------------------------------------------\n * Transform Origin Middleware\n * -----------------------------------------------------------------------------*/\n\nconst getTransformOrigin = (arrow?: Partial<Coords>) => ({\n top: \"bottom center\",\n \"top-start\": arrow ? `${arrow.x}px bottom` : \"left bottom\",\n \"top-end\": arrow ? `${arrow.x}px bottom` : \"right bottom\",\n bottom: \"top center\",\n \"bottom-start\": arrow ? `${arrow.x}px top` : \"top left\",\n \"bottom-end\": arrow ? `${arrow.x}px top` : \"top right\",\n left: \"right center\",\n \"left-start\": arrow ? `right ${arrow.y}px` : \"right top\",\n \"left-end\": arrow ? `right ${arrow.y}px` : \"right bottom\",\n right: \"left center\",\n \"right-start\": arrow ? `left ${arrow.y}px` : \"left top\",\n \"right-end\": arrow ? `left ${arrow.y}px` : \"left bottom\",\n})\n\nexport const transformOrigin: Middleware = {\n name: \"transformOrigin\",\n fn({ placement, elements, middlewareData }) {\n const { arrow } = middlewareData\n const transformOrigin = getTransformOrigin(arrow)[placement]\n\n const { floating } = elements\n floating.style.setProperty(cssVars.transformOrigin.variable, transformOrigin)\n\n return {\n data: { transformOrigin },\n }\n },\n}\n\n/* -----------------------------------------------------------------------------\n * Arrow Middleware\n * -----------------------------------------------------------------------------*/\n\ntype ArrowOptions = { element: HTMLElement }\n\nexport const shiftArrow = (opts: ArrowOptions): Middleware => ({\n name: \"shiftArrow\",\n fn({ placement, middlewareData }) {\n const { element: arrow } = opts\n const { x, y } = middlewareData.arrow ?? { x: 0, y: 0 }\n\n const dir = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n }[placement.split(\"-\")[0]]!\n\n Object.assign(arrow.style, {\n top: `${y}px`,\n left: `${x}px`,\n [dir]: cssVars.arrowOffset.reference,\n })\n\n return {}\n },\n})\n", "import { Placement } from \"@floating-ui/dom\"\nimport { cssVars } from \"./middleware\"\n\ntype Options = {\n measured: boolean\n strategy?: \"absolute\" | \"fixed\"\n placement?: Placement\n}\n\nconst UNMEASURED_FLOATING_STYLE = {\n position: \"fixed\",\n top: 0,\n left: 0,\n opacity: 0,\n transform: \"translate3d(0, -200%, 0)\",\n pointerEvents: \"none\",\n} as const\n\nconst ARROW_FLOATING_STYLE = {\n bottom: \"rotate(45deg)\",\n left: \"rotate(135deg)\",\n top: \"rotate(225deg)\",\n right: \"rotate(315deg)\",\n} as const\n\nexport function getPlacementStyles(options: Options) {\n const { measured, strategy = \"absolute\", placement = \"bottom\" } = options\n\n return {\n arrow: {\n position: \"absolute\",\n width: cssVars.arrowSize.reference,\n height: cssVars.arrowSize.reference,\n [cssVars.arrowSizeHalf.variable]: `calc(${cssVars.arrowSize.reference} / 2)`,\n [cssVars.arrowOffset.variable]: `calc(${cssVars.arrowSizeHalf.reference} * -1)`,\n opacity: !measured ? 0 : undefined,\n } as const,\n\n innerArrow: {\n transform: ARROW_FLOATING_STYLE[placement.split(\"-\")[0]],\n background: cssVars.arrowBg.reference,\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n zIndex: \"inherit\",\n } as const,\n\n floating: {\n position: strategy,\n minWidth: \"max-content\",\n ...(!measured && UNMEASURED_FLOATING_STYLE),\n } as const,\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAQrD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;CAMnB,CAAA;AAqBD,eAAO,MAAM,eAAe,EAAE,UAa7B,CAAA;AAMD,aAAK,YAAY,GAAG;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,CAAA;AAE5C,eAAO,MAAM,UAAU,SAAU,YAAY,KAAG,UAqB9C,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAEjD,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,oBAAY,kBAAkB,GAAG;IAC/B;;OAEG;IACH,QAAQ,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB;;OAEG;IACH,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAA;IACvC;;OAEG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAA;IAC9C;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,CAAA;CACzB,CAAA"}