@zag-js/popper 0.10.5 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,106 @@
1
+ import { Placement, Boundary, ComputePositionReturn, VirtualElement } from '@floating-ui/dom';
2
+ export { Placement } from '@floating-ui/dom';
3
+
4
+ type AutoUpdateOptions = {
5
+ ancestorScroll?: boolean;
6
+ ancestorResize?: boolean;
7
+ referenceResize?: boolean;
8
+ };
9
+
10
+ type PositioningOptions = {
11
+ /**
12
+ * The strategy to use for positioning
13
+ */
14
+ strategy?: "absolute" | "fixed";
15
+ /**
16
+ * The initial placement of the floating element
17
+ */
18
+ placement?: Placement;
19
+ /**
20
+ * The offset of the floating element
21
+ */
22
+ offset?: {
23
+ mainAxis?: number;
24
+ crossAxis?: number;
25
+ };
26
+ /**
27
+ * The main axis offset or gap between the reference and floating elements
28
+ */
29
+ gutter?: number;
30
+ /**
31
+ * The virtual padding around the viewport edges to check for overflow
32
+ */
33
+ overflowPadding?: number;
34
+ /**
35
+ * Whether to flip the placement
36
+ */
37
+ flip?: boolean;
38
+ /**
39
+ * Whether the floating element can overlap the reference element
40
+ * @default false
41
+ */
42
+ overlap?: boolean;
43
+ /**
44
+ * Whether to make the floating element same width as the reference element
45
+ */
46
+ sameWidth?: boolean;
47
+ /**
48
+ * Whether the popover should fit the viewport.
49
+ */
50
+ fitViewport?: boolean;
51
+ /**
52
+ * The overflow boundary of the reference element
53
+ */
54
+ boundary?: Boundary | (() => Boundary);
55
+ /**
56
+ * Options to activate auto-update listeners
57
+ */
58
+ listeners?: boolean | AutoUpdateOptions;
59
+ /**
60
+ * Function called when the placement is computed
61
+ */
62
+ onComplete?(data: ComputePositionReturn): void;
63
+ /**
64
+ * Function called on cleanup of all listeners
65
+ */
66
+ onCleanup?: VoidFunction;
67
+ };
68
+ type BasePlacement = "top" | "right" | "bottom" | "left";
69
+
70
+ type MaybeRectElement = HTMLElement | VirtualElement | null;
71
+ type MaybeElement = HTMLElement | null;
72
+ type MaybeFn<T> = T | (() => T);
73
+ declare function getBasePlacement(placement: Placement): BasePlacement;
74
+ declare function getPlacement(referenceOrFn: MaybeFn<MaybeRectElement>, floatingOrFn: MaybeFn<MaybeElement>, opts?: PositioningOptions & {
75
+ defer?: boolean;
76
+ }): () => void;
77
+
78
+ type Options = {
79
+ placement?: Placement;
80
+ };
81
+ declare function getPlacementStyles(options: Options): {
82
+ arrow: {
83
+ readonly [x: string]: string;
84
+ readonly position: "absolute";
85
+ readonly width: string;
86
+ readonly height: string;
87
+ };
88
+ arrowTip: {
89
+ readonly transform: any;
90
+ readonly background: string;
91
+ readonly top: "0";
92
+ readonly left: "0";
93
+ readonly width: "100%";
94
+ readonly height: "100%";
95
+ readonly position: "absolute";
96
+ readonly zIndex: "inherit";
97
+ };
98
+ floating: {
99
+ readonly position: "absolute";
100
+ readonly minWidth: "max-content";
101
+ readonly top: "0px";
102
+ readonly left: "0px";
103
+ };
104
+ };
105
+
106
+ export { PositioningOptions, getBasePlacement, getPlacement, getPlacementStyles };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,106 @@
1
- export { getPlacement, getBasePlacement } from "./get-placement";
2
- export { getPlacementStyles } from "./get-styles";
3
- export type { Placement, PositioningOptions } from "./types";
1
+ import { Placement, Boundary, ComputePositionReturn, VirtualElement } from '@floating-ui/dom';
2
+ export { Placement } from '@floating-ui/dom';
3
+
4
+ type AutoUpdateOptions = {
5
+ ancestorScroll?: boolean;
6
+ ancestorResize?: boolean;
7
+ referenceResize?: boolean;
8
+ };
9
+
10
+ type PositioningOptions = {
11
+ /**
12
+ * The strategy to use for positioning
13
+ */
14
+ strategy?: "absolute" | "fixed";
15
+ /**
16
+ * The initial placement of the floating element
17
+ */
18
+ placement?: Placement;
19
+ /**
20
+ * The offset of the floating element
21
+ */
22
+ offset?: {
23
+ mainAxis?: number;
24
+ crossAxis?: number;
25
+ };
26
+ /**
27
+ * The main axis offset or gap between the reference and floating elements
28
+ */
29
+ gutter?: number;
30
+ /**
31
+ * The virtual padding around the viewport edges to check for overflow
32
+ */
33
+ overflowPadding?: number;
34
+ /**
35
+ * Whether to flip the placement
36
+ */
37
+ flip?: boolean;
38
+ /**
39
+ * Whether the floating element can overlap the reference element
40
+ * @default false
41
+ */
42
+ overlap?: boolean;
43
+ /**
44
+ * Whether to make the floating element same width as the reference element
45
+ */
46
+ sameWidth?: boolean;
47
+ /**
48
+ * Whether the popover should fit the viewport.
49
+ */
50
+ fitViewport?: boolean;
51
+ /**
52
+ * The overflow boundary of the reference element
53
+ */
54
+ boundary?: Boundary | (() => Boundary);
55
+ /**
56
+ * Options to activate auto-update listeners
57
+ */
58
+ listeners?: boolean | AutoUpdateOptions;
59
+ /**
60
+ * Function called when the placement is computed
61
+ */
62
+ onComplete?(data: ComputePositionReturn): void;
63
+ /**
64
+ * Function called on cleanup of all listeners
65
+ */
66
+ onCleanup?: VoidFunction;
67
+ };
68
+ type BasePlacement = "top" | "right" | "bottom" | "left";
69
+
70
+ type MaybeRectElement = HTMLElement | VirtualElement | null;
71
+ type MaybeElement = HTMLElement | null;
72
+ type MaybeFn<T> = T | (() => T);
73
+ declare function getBasePlacement(placement: Placement): BasePlacement;
74
+ declare function getPlacement(referenceOrFn: MaybeFn<MaybeRectElement>, floatingOrFn: MaybeFn<MaybeElement>, opts?: PositioningOptions & {
75
+ defer?: boolean;
76
+ }): () => void;
77
+
78
+ type Options = {
79
+ placement?: Placement;
80
+ };
81
+ declare function getPlacementStyles(options: Options): {
82
+ arrow: {
83
+ readonly [x: string]: string;
84
+ readonly position: "absolute";
85
+ readonly width: string;
86
+ readonly height: string;
87
+ };
88
+ arrowTip: {
89
+ readonly transform: any;
90
+ readonly background: string;
91
+ readonly top: "0";
92
+ readonly left: "0";
93
+ readonly width: "100%";
94
+ readonly height: "100%";
95
+ readonly position: "absolute";
96
+ readonly zIndex: "inherit";
97
+ };
98
+ floating: {
99
+ readonly position: "absolute";
100
+ readonly minWidth: "max-content";
101
+ readonly top: "0px";
102
+ readonly left: "0px";
103
+ };
104
+ };
105
+
106
+ export { PositioningOptions, getBasePlacement, getPlacement, getPlacementStyles };
package/dist/index.js CHANGED
@@ -1,12 +1,282 @@
1
- 'use strict';
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
2
19
 
3
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ getBasePlacement: () => getBasePlacement,
24
+ getPlacement: () => getPlacement,
25
+ getPlacementStyles: () => getPlacementStyles
26
+ });
27
+ module.exports = __toCommonJS(src_exports);
4
28
 
5
- const getPlacement = require('./get-placement.js');
6
- const getStyles = require('./get-styles.js');
29
+ // src/get-placement.ts
30
+ var import_dom2 = require("@floating-ui/dom");
31
+ var import_dom_query = require("@zag-js/dom-query");
32
+ var import_utils = require("@zag-js/utils");
7
33
 
34
+ // src/auto-update.ts
35
+ var import_dom = require("@floating-ui/dom");
36
+ var import_element_rect = require("@zag-js/element-rect");
37
+ var callAll = (...fns) => () => fns.forEach((fn) => fn());
38
+ var isHTMLElement = (el) => {
39
+ return typeof el === "object" && el !== null && el.nodeType === 1;
40
+ };
41
+ var addDomEvent = (el, type, fn, options) => {
42
+ el.addEventListener(type, fn, options);
43
+ return () => el.removeEventListener(type, fn, options);
44
+ };
45
+ function resolveOptions(option) {
46
+ const bool = typeof option === "boolean";
47
+ return {
48
+ ancestorResize: bool ? option : option.ancestorResize ?? true,
49
+ ancestorScroll: bool ? option : option.ancestorScroll ?? true,
50
+ referenceResize: bool ? option : option.referenceResize ?? true
51
+ };
52
+ }
53
+ function autoUpdate(reference, floating, update, options = false) {
54
+ const { ancestorScroll, ancestorResize, referenceResize } = resolveOptions(options);
55
+ const useAncestors = ancestorScroll || ancestorResize;
56
+ const ancestors = [];
57
+ if (useAncestors && isHTMLElement(reference)) {
58
+ ancestors.push(...(0, import_dom.getOverflowAncestors)(reference));
59
+ }
60
+ function addResizeListeners() {
61
+ let cleanups = [(0, import_element_rect.trackElementRect)(floating, { scope: "size", onChange: update })];
62
+ if (referenceResize && isHTMLElement(reference)) {
63
+ cleanups.push((0, import_element_rect.trackElementRect)(reference, { onChange: update }));
64
+ }
65
+ cleanups.push(callAll(...ancestors.map((el) => addDomEvent(el, "resize", update))));
66
+ return () => cleanups.forEach((fn) => fn());
67
+ }
68
+ function addScrollListeners() {
69
+ return callAll(...ancestors.map((el) => addDomEvent(el, "scroll", update, { passive: true })));
70
+ }
71
+ return callAll(addResizeListeners(), addScrollListeners());
72
+ }
8
73
 
74
+ // src/middleware.ts
75
+ var toVar = (value) => ({ variable: value, reference: `var(${value})` });
76
+ var cssVars = {
77
+ arrowSize: toVar("--arrow-size"),
78
+ arrowSizeHalf: toVar("--arrow-size-half"),
79
+ arrowBg: toVar("--arrow-background"),
80
+ transformOrigin: toVar("--transform-origin"),
81
+ arrowOffset: toVar("--arrow-offset")
82
+ };
83
+ var getTransformOrigin = (arrow2) => ({
84
+ top: "bottom center",
85
+ "top-start": arrow2 ? `${arrow2.x}px bottom` : "left bottom",
86
+ "top-end": arrow2 ? `${arrow2.x}px bottom` : "right bottom",
87
+ bottom: "top center",
88
+ "bottom-start": arrow2 ? `${arrow2.x}px top` : "top left",
89
+ "bottom-end": arrow2 ? `${arrow2.x}px top` : "top right",
90
+ left: "right center",
91
+ "left-start": arrow2 ? `right ${arrow2.y}px` : "right top",
92
+ "left-end": arrow2 ? `right ${arrow2.y}px` : "right bottom",
93
+ right: "left center",
94
+ "right-start": arrow2 ? `left ${arrow2.y}px` : "left top",
95
+ "right-end": arrow2 ? `left ${arrow2.y}px` : "left bottom"
96
+ });
97
+ var transformOrigin = {
98
+ name: "transformOrigin",
99
+ fn({ placement, elements, middlewareData }) {
100
+ const { arrow: arrow2 } = middlewareData;
101
+ const transformOrigin2 = getTransformOrigin(arrow2)[placement];
102
+ const { floating } = elements;
103
+ floating.style.setProperty(cssVars.transformOrigin.variable, transformOrigin2);
104
+ return {
105
+ data: { transformOrigin: transformOrigin2 }
106
+ };
107
+ }
108
+ };
109
+ var shiftArrow = (opts) => ({
110
+ name: "shiftArrow",
111
+ fn({ placement, middlewareData }) {
112
+ const { element: arrow2 } = opts;
113
+ if (middlewareData.arrow) {
114
+ const { x, y } = middlewareData.arrow;
115
+ const dir = placement.split("-")[0];
116
+ Object.assign(arrow2.style, {
117
+ left: x != null ? `${x}px` : "",
118
+ top: y != null ? `${y}px` : "",
119
+ [dir]: `calc(100% + ${cssVars.arrowOffset.reference})`
120
+ });
121
+ }
122
+ return {};
123
+ }
124
+ });
9
125
 
10
- exports.getBasePlacement = getPlacement.getBasePlacement;
11
- exports.getPlacement = getPlacement.getPlacement;
12
- exports.getPlacementStyles = getStyles.getPlacementStyles;
126
+ // src/get-placement.ts
127
+ var defaultOptions = {
128
+ strategy: "absolute",
129
+ placement: "bottom",
130
+ listeners: true,
131
+ gutter: 8,
132
+ flip: true,
133
+ sameWidth: false,
134
+ overflowPadding: 8
135
+ };
136
+ function getPlacementImpl(reference, floating, opts = {}) {
137
+ if (!floating || !reference)
138
+ return;
139
+ const options = Object.assign({}, defaultOptions, opts);
140
+ const arrowEl = floating.querySelector("[data-part=arrow]");
141
+ const middleware = [];
142
+ const boundary = typeof options.boundary === "function" ? options.boundary() : options.boundary;
143
+ if (options.flip) {
144
+ middleware.push(
145
+ (0, import_dom2.flip)({
146
+ boundary,
147
+ padding: options.overflowPadding
148
+ })
149
+ );
150
+ }
151
+ if (options.gutter || options.offset) {
152
+ const arrowOffset = arrowEl ? arrowEl.offsetHeight / 2 : 0;
153
+ const data = options.offset ? options.offset : { mainAxis: options.gutter };
154
+ if (data?.mainAxis != null)
155
+ data.mainAxis += arrowOffset;
156
+ middleware.push((0, import_dom2.offset)(data));
157
+ }
158
+ middleware.push(
159
+ (0, import_dom2.shift)({
160
+ boundary,
161
+ crossAxis: options.overlap,
162
+ padding: options.overflowPadding
163
+ })
164
+ );
165
+ if (arrowEl) {
166
+ middleware.push(
167
+ (0, import_dom2.arrow)({ element: arrowEl, padding: 8 }),
168
+ shiftArrow({ element: arrowEl })
169
+ );
170
+ }
171
+ middleware.push(transformOrigin);
172
+ middleware.push(
173
+ (0, import_dom2.size)({
174
+ padding: options.overflowPadding,
175
+ apply({ rects, availableHeight, availableWidth }) {
176
+ const referenceWidth = Math.round(rects.reference.width);
177
+ floating.style.setProperty("--reference-width", `${referenceWidth}px`);
178
+ floating.style.setProperty("--available-width", `${availableWidth}px`);
179
+ floating.style.setProperty("--available-height", `${availableHeight}px`);
180
+ if (options.sameWidth) {
181
+ Object.assign(floating.style, {
182
+ width: `${referenceWidth}px`,
183
+ minWidth: "unset"
184
+ });
185
+ }
186
+ if (options.fitViewport) {
187
+ Object.assign(floating.style, {
188
+ maxWidth: `${availableWidth}px`,
189
+ maxHeight: `${availableHeight}px`
190
+ });
191
+ }
192
+ }
193
+ })
194
+ );
195
+ function compute(config = {}) {
196
+ if (!reference || !floating)
197
+ return;
198
+ const { placement, strategy, onComplete } = options;
199
+ (0, import_dom2.computePosition)(reference, floating, {
200
+ placement,
201
+ middleware,
202
+ strategy,
203
+ ...config
204
+ }).then((data) => {
205
+ const x = Math.round(data.x);
206
+ const y = Math.round(data.y);
207
+ Object.assign(floating.style, {
208
+ position: data.strategy,
209
+ top: "0px",
210
+ left: "0px",
211
+ transform: `translate3d(${x}px, ${y}px, 0)`
212
+ });
213
+ onComplete?.(data);
214
+ });
215
+ }
216
+ compute();
217
+ return (0, import_utils.callAll)(
218
+ options.listeners ? autoUpdate(reference, floating, compute, options.listeners) : void 0,
219
+ options.onCleanup
220
+ );
221
+ }
222
+ function getBasePlacement(placement) {
223
+ return placement.split("-")[0];
224
+ }
225
+ function getPlacement(referenceOrFn, floatingOrFn, opts = {}) {
226
+ const { defer, ...restOptions } = opts;
227
+ const func = defer ? import_dom_query.raf : (v) => v();
228
+ const cleanups = [];
229
+ cleanups.push(
230
+ func(() => {
231
+ const reference = typeof referenceOrFn === "function" ? referenceOrFn() : referenceOrFn;
232
+ const floating = typeof floatingOrFn === "function" ? floatingOrFn() : floatingOrFn;
233
+ cleanups.push(getPlacementImpl(reference, floating, restOptions));
234
+ })
235
+ );
236
+ return () => {
237
+ cleanups.forEach((fn) => fn?.());
238
+ };
239
+ }
240
+
241
+ // src/get-styles.ts
242
+ var ARROW_FLOATING_STYLE = {
243
+ bottom: "rotate(45deg)",
244
+ left: "rotate(135deg)",
245
+ top: "rotate(225deg)",
246
+ right: "rotate(315deg)"
247
+ };
248
+ function getPlacementStyles(options) {
249
+ const { placement = "bottom" } = options;
250
+ return {
251
+ arrow: {
252
+ position: "absolute",
253
+ width: cssVars.arrowSize.reference,
254
+ height: cssVars.arrowSize.reference,
255
+ [cssVars.arrowSizeHalf.variable]: `calc(${cssVars.arrowSize.reference} / 2)`,
256
+ [cssVars.arrowOffset.variable]: `calc(${cssVars.arrowSizeHalf.reference} * -1)`
257
+ },
258
+ arrowTip: {
259
+ transform: ARROW_FLOATING_STYLE[placement.split("-")[0]],
260
+ background: cssVars.arrowBg.reference,
261
+ top: "0",
262
+ left: "0",
263
+ width: "100%",
264
+ height: "100%",
265
+ position: "absolute",
266
+ zIndex: "inherit"
267
+ },
268
+ floating: {
269
+ position: "absolute",
270
+ minWidth: "max-content",
271
+ top: "0px",
272
+ left: "0px"
273
+ }
274
+ };
275
+ }
276
+ // Annotate the CommonJS export names for ESM import in node:
277
+ 0 && (module.exports = {
278
+ getBasePlacement,
279
+ getPlacement,
280
+ getPlacementStyles
281
+ });
282
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/get-placement.ts","../src/auto-update.ts","../src/middleware.ts","../src/get-styles.ts"],"sourcesContent":["export { getPlacement, getBasePlacement } from \"./get-placement\"\nexport { getPlacementStyles } from \"./get-styles\"\nexport type { Placement, PositioningOptions } from \"./types\"\n","import type { Middleware, Placement, VirtualElement } from \"@floating-ui/dom\"\nimport { ComputePositionConfig, arrow, computePosition, flip, offset, shift, size } from \"@floating-ui/dom\"\nimport { raf } from \"@zag-js/dom-query\"\nimport { callAll } from \"@zag-js/utils\"\nimport { autoUpdate } from \"./auto-update\"\nimport { shiftArrow, transformOrigin } from \"./middleware\"\nimport type { BasePlacement, 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\ntype MaybeRectElement = HTMLElement | VirtualElement | null\ntype MaybeElement = HTMLElement | null\ntype MaybeFn<T> = T | (() => T)\n\nfunction getPlacementImpl(reference: MaybeRectElement, floating: MaybeElement, opts: PositioningOptions = {}) {\n if (!floating || !reference) return\n\n const options = Object.assign({}, defaultOptions, opts)\n\n /* -----------------------------------------------------------------------------\n * The middleware stack\n * -----------------------------------------------------------------------------*/\n\n const arrowEl = floating.querySelector<HTMLElement>(\"[data-part=arrow]\")\n const middleware: Middleware[] = []\n\n const boundary = typeof options.boundary === \"function\" ? options.boundary() : options.boundary\n\n if (options.flip) {\n middleware.push(\n flip({\n 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.offset ? options.offset : { mainAxis: options.gutter }\n if (data?.mainAxis != null) data.mainAxis += arrowOffset\n middleware.push(offset(data))\n }\n\n middleware.push(\n shift({\n 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 middleware.push(\n size({\n padding: options.overflowPadding,\n apply({ rects, availableHeight, availableWidth }) {\n const referenceWidth = Math.round(rects.reference.width)\n\n floating.style.setProperty(\"--reference-width\", `${referenceWidth}px`)\n floating.style.setProperty(\"--available-width\", `${availableWidth}px`)\n floating.style.setProperty(\"--available-height\", `${availableHeight}px`)\n\n if (options.sameWidth) {\n Object.assign(floating.style, {\n width: `${referenceWidth}px`,\n minWidth: \"unset\",\n })\n }\n\n if (options.fitViewport) {\n Object.assign(floating.style, {\n maxWidth: `${availableWidth}px`,\n maxHeight: `${availableHeight}px`,\n })\n }\n },\n }),\n )\n\n /* -----------------------------------------------------------------------------\n * The actual positioning function\n * -----------------------------------------------------------------------------*/\n\n function compute(config: Omit<ComputePositionConfig, \"platform\"> = {}) {\n if (!reference || !floating) return\n const { placement, strategy, onComplete } = options\n\n computePosition(reference, floating, {\n placement,\n middleware,\n strategy,\n ...config,\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: \"0px\",\n left: \"0px\",\n transform: `translate3d(${x}px, ${y}px, 0)`,\n })\n\n onComplete?.(data)\n })\n }\n\n compute()\n\n return callAll(\n options.listeners ? autoUpdate(reference, floating, compute, options.listeners) : undefined,\n options.onCleanup,\n )\n}\n\nexport function getBasePlacement(placement: Placement): BasePlacement {\n return placement.split(\"-\")[0] as BasePlacement\n}\n\nexport function getPlacement(\n referenceOrFn: MaybeFn<MaybeRectElement>,\n floatingOrFn: MaybeFn<MaybeElement>,\n opts: PositioningOptions & { defer?: boolean } = {},\n) {\n const { defer, ...restOptions } = opts\n const func = defer ? raf : (v: any) => v()\n const cleanups: (VoidFunction | undefined)[] = []\n cleanups.push(\n func(() => {\n const reference = typeof referenceOrFn === \"function\" ? referenceOrFn() : referenceOrFn\n const floating = typeof floatingOrFn === \"function\" ? floatingOrFn() : floatingOrFn\n cleanups.push(getPlacementImpl(reference, floating, restOptions))\n }),\n )\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n}\n","import type { Placement, ReferenceElement } from \"@floating-ui/dom\"\nimport { getOverflowAncestors } from \"@floating-ui/dom\"\nimport { trackElementRect } from \"@zag-js/element-rect\"\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\nconst callAll =\n (...fns: VoidFunction[]) =>\n () =>\n fns.forEach((fn) => fn())\n\nconst isHTMLElement = (el: any): el is HTMLElement => {\n return typeof el === \"object\" && el !== null && el.nodeType === 1\n}\n\nconst addDomEvent = (el: HTMLElement, type: string, fn: VoidFunction, options?: boolean | AddEventListenerOptions) => {\n el.addEventListener(type, fn, options)\n return () => el.removeEventListener(type, fn, options)\n}\n\nfunction resolveOptions(option: boolean | AutoUpdateOptions) {\n const bool = typeof option === \"boolean\"\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[] = [trackElementRect(floating, { scope: \"size\", onChange: update })]\n if (referenceResize && isHTMLElement(reference)) {\n cleanups.push(trackElementRect(reference, { onChange: update }))\n }\n cleanups.push(callAll(...ancestors.map((el: any) => addDomEvent(el, \"resize\", update))))\n return () => cleanups.forEach((fn) => fn())\n }\n\n function addScrollListeners() {\n return callAll(...ancestors.map((el: any) => addDomEvent(el, \"scroll\", update, { passive: true })))\n }\n\n return callAll(addResizeListeners(), addScrollListeners())\n}\n","import type { 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\ntype BasePlacement = \"top\" | \"bottom\" | \"left\" | \"right\"\n\nexport const shiftArrow = (opts: ArrowOptions): Middleware => ({\n name: \"shiftArrow\",\n fn({ placement, middlewareData }) {\n const { element: arrow } = opts\n\n if (middlewareData.arrow) {\n const { x, y } = middlewareData.arrow\n\n const dir = placement.split(\"-\")[0] as BasePlacement\n\n Object.assign(arrow.style, {\n left: x != null ? `${x}px` : \"\",\n top: y != null ? `${y}px` : \"\",\n [dir]: `calc(100% + ${cssVars.arrowOffset.reference})`,\n })\n }\n\n return {}\n },\n})\n","import type { Placement } from \"@floating-ui/dom\"\nimport { cssVars } from \"./middleware\"\n\ntype Options = {\n placement?: Placement\n}\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 { 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 } as const,\n\n arrowTip: {\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: \"absolute\",\n minWidth: \"max-content\",\n top: \"0px\",\n left: \"0px\",\n } as const,\n }\n}\n"],"mappings":"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","names":["import_dom","arrow","transformOrigin"]}