@zag-js/tooltip 0.0.0-dev-20220412212252 → 0.0.0-dev-20220413091534

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../../../utilities/dom/src/attrs.ts", "../../../utilities/dom/src/computed-style.ts", "../../../utilities/dom/src/next-tick.ts", "../../../utilities/dom/src/auto-resize.ts", "../../../utilities/core/src/array.ts", "../../../utilities/core/src/functions.ts", "../../../utilities/core/src/guard.ts", "../../../utilities/core/src/warning.ts", "../../../utilities/dom/src/event-bus.ts", "../../../utilities/dom/src/listener.ts", "../../../utilities/dom/src/body-pointer-event.ts", "../../../../node_modules/compute-scroll-into-view/src/index.ts", "../../../utilities/dom/node_modules/scroll-into-view-if-needed/es/index.js", "../../../utilities/dom/src/query.ts", "../../../utilities/dom/src/scrollable.ts", "../../../utilities/dom/src/body-scroll-lock.ts", "../../../utilities/dom/src/constants.ts", "../../../utilities/dom/src/dispatch-event.ts", "../../../utilities/dom/src/focus-event.ts", "../../../utilities/dom/src/focusable.ts", "../../../utilities/dom/src/form.ts", "../../../utilities/dom/src/keyboard-event.ts", "../../../utilities/dom/src/visually-hidden.ts", "../../../utilities/dom/src/live-region.ts", "../../../utilities/dom/src/mutation-observer.ts", "../../../utilities/dom/src/nodelist.ts", "../../../utilities/dom/src/text-selection.ts", "../../../utilities/dom/src/pointer-event.ts", "../../../utilities/dom/src/pointerlock.ts", "../../../utilities/dom/src/rect-observer.ts", "../../../utilities/dom/src/visibility-event.ts", "../../../utilities/dom/src/wait.ts", "../../../../node_modules/@floating-ui/core/dist/floating-ui.core.esm.js", "../../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.esm.js", "../../../utilities/dom/src/attrs.ts", "../../../utilities/dom/src/computed-style.ts", "../../../utilities/dom/src/next-tick.ts", "../../../utilities/dom/src/auto-resize.ts", "../../../utilities/core/src/array.ts", "../../../utilities/core/src/functions.ts", "../../../utilities/core/src/guard.ts", "../../../utilities/core/src/warning.ts", "../../../utilities/dom/src/event-bus.ts", "../../../utilities/dom/src/listener.ts", "../../../utilities/dom/src/body-pointer-event.ts", "../../../../node_modules/compute-scroll-into-view/src/index.ts", "../../../utilities/dom/node_modules/scroll-into-view-if-needed/es/index.js", "../../../utilities/dom/src/query.ts", "../../../utilities/dom/src/scrollable.ts", "../../../utilities/dom/src/body-scroll-lock.ts", "../../../utilities/dom/src/constants.ts", "../../../utilities/dom/src/dispatch-event.ts", "../../../utilities/dom/src/focus-event.ts", "../../../utilities/dom/src/focusable.ts", "../../../utilities/dom/src/form.ts", "../../../utilities/dom/src/keyboard-event.ts", "../../../utilities/dom/src/visually-hidden.ts", "../../../utilities/dom/src/live-region.ts", "../../../utilities/dom/src/mutation-observer.ts", "../../../utilities/dom/src/nodelist.ts", "../../../utilities/dom/src/text-selection.ts", "../../../utilities/dom/src/pointer-event.ts", "../../../utilities/dom/src/pointerlock.ts", "../../../utilities/dom/src/rect-observer.ts", "../../../utilities/dom/src/visibility-event.ts", "../../../utilities/dom/src/wait.ts", "../../../utilities/core/src/array.ts", "../../../utilities/core/src/functions.ts", "../../../utilities/core/src/guard.ts", "../../../utilities/core/src/warning.ts", "../../../utilities/popper/src/auto-update.ts", "../../../utilities/popper/src/middleware.ts", "../../../utilities/popper/src/get-placement.ts", "../../../utilities/popper/src/get-styles.ts", "../../../types/src/prop-types.ts", "../../../types/src/controls.ts", "../src/tooltip.dom.ts", "../../../../node_modules/proxy-compare/src/index.ts", "../../../../node_modules/valtio/esm/vanilla.mjs", "../../../utilities/core/src/array.ts", "../../../utilities/core/src/functions.ts", "../../../utilities/core/src/guard.ts", "../../../utilities/core/src/warning.ts", "../../../core/src/action-utils.ts", "../../../core/src/guard-utils.ts", "../../../../node_modules/klona/json/index.mjs", "../../../../node_modules/valtio/esm/utils.mjs", "../../../core/src/create-proxy.ts", "../../../core/src/delay-utils.ts", "../../../core/src/utils.ts", "../../../core/src/transition-utils.ts", "../../../core/src/machine.ts", "../../../core/src/merge-props.ts", "../src/tooltip.store.ts", "../src/tooltip.connect.ts", "../../../utilities/core/src/array.ts", "../../../utilities/core/src/functions.ts", "../../../utilities/core/src/guard.ts", "../../../utilities/core/src/warning.ts", "../src/tooltip.machine.ts"],
4
- "sourcesContent": ["export { connect } from \"./tooltip.connect\"\nexport { machine } from \"./tooltip.machine\"\nexport type { MachineContext, MachineState } from \"./tooltip.types\"\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", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nconst styleCache: WeakMap<HTMLElement, Styles> = new WeakMap()\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n let style: Styles | undefined = styleCache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n styleCache.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 forceReflow() {\n return document.body.offsetHeight\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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\nconst listenerElements: Map<El, Group> = new Map()\nconst listenerCache: Map<El, Map<string, Handler>> = new Map()\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 globalEventBus(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\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 { globalEventBus } from \"./event-bus\"\nimport {\n AnyPointerEvent,\n DOMEventTarget,\n EventMap,\n PointerEventInfo,\n PointerNameMap,\n RefTarget,\n} from \"./listener.types\"\n\nconst t = (v: any) => Object.prototype.toString.call(v).slice(8, -1)\nconst isRef = (v: any): v is RefTarget => t(v) === \"Object\" && \"current\" in v\nconst runIfFn = (fn: any): HTMLElement | null => (t(fn) === \"Function\" ? fn() : fn)\nconst isTouchEvent = (v: Event): v is TouchEvent => t(v) === \"Object\" && !!(v as TouchEvent).touches\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 globalEventBus(node, 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 supportsPointerEvent = () => typeof window !== \"undefined\" && window.onpointerdown === null\nconst supportsTouchEvent = () => typeof window !== \"undefined\" && window.ontouchstart === null\nconst supportsMouseEvent = () => typeof window !== \"undefined\" && window.onmousedown === null\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", "// Compute what scrolling needs to be done on required scrolling boxes for target to be in view\n\n// The type names here are named after the spec to make it easier to find more information around what they mean:\n// To reduce churn and reduce things that need be maintained things from the official TS DOM library is used here\n// https://drafts.csswg.org/cssom-view/\n\n// For a definition on what is \"block flow direction\" exactly, check this: https://drafts.csswg.org/css-writing-modes-4/#block-flow-direction\n\n// add support for visualViewport object currently implemented in chrome\ninterface visualViewport {\n height: number\n width: number\n}\n\ntype ScrollLogicalPosition = 'start' | 'center' | 'end' | 'nearest'\n// This new option is tracked in this PR, which is the most likely candidate at the time: https://github.com/w3c/csswg-drafts/pull/1805\ntype ScrollMode = 'always' | 'if-needed'\n// New option that skips auto-scrolling all nodes with overflow: hidden set\n// See FF implementation: https://hg.mozilla.org/integration/fx-team/rev/c48c3ec05012#l7.18\ntype SkipOverflowHiddenElements = boolean\n\ninterface Options {\n block?: ScrollLogicalPosition\n inline?: ScrollLogicalPosition\n scrollMode?: ScrollMode\n boundary?: CustomScrollBoundary\n skipOverflowHiddenElements?: SkipOverflowHiddenElements\n}\n\n// Custom behavior, not in any spec\ntype CustomScrollBoundaryCallback = (parent: Element) => boolean\ntype CustomScrollBoundary = Element | CustomScrollBoundaryCallback | null\ninterface CustomScrollAction {\n el: Element\n top: number\n left: number\n}\n\n// @TODO better shadowdom test, 11 = document fragment\nfunction isElement(el: any): el is Element {\n return typeof el === 'object' && el != null && el.nodeType === 1\n}\n\nfunction canOverflow(\n overflow: string | null,\n skipOverflowHiddenElements?: boolean\n) {\n if (skipOverflowHiddenElements && overflow === 'hidden') {\n return false\n }\n\n return overflow !== 'visible' && overflow !== 'clip'\n}\n\nfunction getFrameElement(el: Element) {\n if (!el.ownerDocument || !el.ownerDocument.defaultView) {\n return null\n }\n\n try {\n return el.ownerDocument.defaultView.frameElement\n } catch (e) {\n return null\n }\n}\n\nfunction isHiddenByFrame(el: Element): boolean {\n const frame = getFrameElement(el)\n if (!frame) {\n return false\n }\n\n return (\n frame.clientHeight < el.scrollHeight || frame.clientWidth < el.scrollWidth\n )\n}\n\nfunction isScrollable(el: Element, skipOverflowHiddenElements?: boolean) {\n if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n const style = getComputedStyle(el, null)\n return (\n canOverflow(style.overflowY, skipOverflowHiddenElements) ||\n canOverflow(style.overflowX, skipOverflowHiddenElements) ||\n isHiddenByFrame(el)\n )\n }\n\n return false\n}\n/**\n * Find out which edge to align against when logical scroll position is \"nearest\"\n * Interesting fact: \"nearest\" works similarily to \"if-needed\", if the element is fully visible it will not scroll it\n *\n * Legends:\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250F \u2501 \u2501 \u2501 \u2513\n * \u2502 target \u2502 frame\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2517 \u2501 \u2501 \u2501 \u251B\n */\nfunction alignNearest(\n scrollingEdgeStart: number,\n scrollingEdgeEnd: number,\n scrollingSize: number,\n scrollingBorderStart: number,\n scrollingBorderEnd: number,\n elementEdgeStart: number,\n elementEdgeEnd: number,\n elementSize: number\n) {\n /**\n * If element edge A and element edge B are both outside scrolling box edge A and scrolling box edge B\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502\n * \u2503 \u2502 \u2502 \u2503 do nothing\n * \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C and element edge D are both outside scrolling box edge C and scrolling box edge D\n *\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502\u2503 \u2503\u2502 do nothing\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart < scrollingEdgeStart &&\n elementEdgeEnd > scrollingEdgeEnd) ||\n (elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd)\n ) {\n return 0\n }\n\n /**\n * If element edge A is outside scrolling box edge A and element height is less than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2514\u2500\u2500\u2518 \u2502 \u2502\n * from \u2503 \u2503 to \u2503 \u2514\u2500\u2500\u2518 \u2503\n *\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501 \u2501\u2501 \u2501\u251B\n *\n * If element edge B is outside scrolling box edge B and element height is greater than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2502 \u2502\n * from \u2503 \u250C\u2500\u2500\u2510 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2502 \u2502 \u2514\u2500\u2500\u2518\n * \u2502 \u2502\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C is outside scrolling box edge C and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2503 \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize) ||\n (elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize)\n ) {\n return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart\n }\n\n /**\n * If element edge B is outside scrolling box edge B and element height is less than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501 \u2501\u2501 \u2501\u2513\n *\n * from \u2503 \u2503 to \u2503 \u250C\u2500\u2500\u2510 \u2503\n * \u250C\u2500\u2500\u2510 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge A is outside scrolling box edge A and element height is greater than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u2502 \u2502\n * \u2502 \u2502 \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502 \u2502 \u2502\n * from \u2503 \u2514\u2500\u2500\u2518 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n *\n * If element edge C is outside scrolling box edge C and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2502 \u2503 \u2503\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n */\n if (\n (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize) ||\n (elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize)\n ) {\n return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd\n }\n\n return 0\n}\n\nexport default (target: Element, options: Options): CustomScrollAction[] => {\n //TODO: remove this hack when microbundle will support typescript >= 4.0\n const windowWithViewport = (window as unknown) as Window & {\n visualViewport: visualViewport\n }\n\n const {\n scrollMode,\n block,\n inline,\n boundary,\n skipOverflowHiddenElements,\n } = options\n // Allow using a callback to check the boundary\n // The default behavior is to check if the current target matches the boundary element or not\n // If undefined it'll check that target is never undefined (can happen as we recurse up the tree)\n const checkBoundary =\n typeof boundary === 'function' ? boundary : (node: any) => node !== boundary\n\n if (!isElement(target)) {\n throw new TypeError('Invalid target')\n }\n\n // Used to handle the top most element that can be scrolled\n const scrollingElement = document.scrollingElement || document.documentElement\n\n // Collect all the scrolling boxes, as defined in the spec: https://drafts.csswg.org/cssom-view/#scrolling-box\n const frames: Element[] = []\n let cursor: Element | null = target\n while (isElement(cursor) && checkBoundary(cursor)) {\n // Move cursor to parent\n cursor = cursor.parentElement\n\n // Stop when we reach the viewport\n if (cursor === scrollingElement) {\n frames.push(cursor)\n break\n }\n\n // Skip document.body if it's not the scrollingElement and documentElement isn't independently scrollable\n if (\n cursor != null &&\n cursor === document.body &&\n isScrollable(cursor) &&\n !isScrollable(document.documentElement)\n ) {\n continue\n }\n\n // Now we check if the element is scrollable, this code only runs if the loop haven't already hit the viewport or a custom boundary\n if (cursor != null && isScrollable(cursor, skipOverflowHiddenElements)) {\n frames.push(cursor)\n }\n }\n\n // Support pinch-zooming properly, making sure elements scroll into the visual viewport\n // Browsers that don't support visualViewport will report the layout viewport dimensions on document.documentElement.clientWidth/Height\n // and viewport dimensions on window.innerWidth/Height\n // https://www.quirksmode.org/mobile/viewports2.html\n // https://bokand.github.io/viewport/index.html\n const viewportWidth = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.width\n : innerWidth\n const viewportHeight = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.height\n : innerHeight\n\n // Newer browsers supports scroll[X|Y], page[X|Y]Offset is\n const viewportX = window.scrollX || pageXOffset\n const viewportY = window.scrollY || pageYOffset\n\n const {\n height: targetHeight,\n width: targetWidth,\n top: targetTop,\n right: targetRight,\n bottom: targetBottom,\n left: targetLeft,\n } = target.getBoundingClientRect()\n\n // These values mutate as we loop through and generate scroll coordinates\n let targetBlock: number =\n block === 'start' || block === 'nearest'\n ? targetTop\n : block === 'end'\n ? targetBottom\n : targetTop + targetHeight / 2 // block === 'center\n let targetInline: number =\n inline === 'center'\n ? targetLeft + targetWidth / 2\n : inline === 'end'\n ? targetRight\n : targetLeft // inline === 'start || inline === 'nearest\n\n // Collect new scroll positions\n const computations: CustomScrollAction[] = []\n // In chrome there's no longer a difference between caching the `frames.length` to a var or not, so we don't in this case (size > speed anyways)\n for (let index = 0; index < frames.length; index++) {\n const frame = frames[index]\n\n // @TODO add a shouldScroll hook here that allows userland code to take control\n\n const {\n height,\n width,\n top,\n right,\n bottom,\n left,\n } = frame.getBoundingClientRect()\n\n // If the element is already visible we can end it here\n // @TODO targetBlock and targetInline should be taken into account to be compliant with https://github.com/w3c/csswg-drafts/pull/1805/files#diff-3c17f0e43c20f8ecf89419d49e7ef5e0R1333\n if (\n scrollMode === 'if-needed' &&\n targetTop >= 0 &&\n targetLeft >= 0 &&\n targetBottom <= viewportHeight &&\n targetRight <= viewportWidth &&\n targetTop >= top &&\n targetBottom <= bottom &&\n targetLeft >= left &&\n targetRight <= right\n ) {\n // Break the loop and return the computations for things that are not fully visible\n return computations\n }\n\n const frameStyle = getComputedStyle(frame)\n const borderLeft = parseInt(frameStyle.borderLeftWidth as string, 10)\n const borderTop = parseInt(frameStyle.borderTopWidth as string, 10)\n const borderRight = parseInt(frameStyle.borderRightWidth as string, 10)\n const borderBottom = parseInt(frameStyle.borderBottomWidth as string, 10)\n\n let blockScroll: number = 0\n let inlineScroll: number = 0\n\n // The property existance checks for offfset[Width|Height] is because only HTMLElement objects have them, but any Element might pass by here\n // @TODO find out if the \"as HTMLElement\" overrides can be dropped\n const scrollbarWidth =\n 'offsetWidth' in frame\n ? (frame as HTMLElement).offsetWidth -\n (frame as HTMLElement).clientWidth -\n borderLeft -\n borderRight\n : 0\n const scrollbarHeight =\n 'offsetHeight' in frame\n ? (frame as HTMLElement).offsetHeight -\n (frame as HTMLElement).clientHeight -\n borderTop -\n borderBottom\n : 0\n\n if (scrollingElement === frame) {\n // Handle viewport logic (document.documentElement or document.body)\n\n if (block === 'start') {\n blockScroll = targetBlock\n } else if (block === 'end') {\n blockScroll = targetBlock - viewportHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n viewportY,\n viewportY + viewportHeight,\n viewportHeight,\n borderTop,\n borderBottom,\n viewportY + targetBlock,\n viewportY + targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - viewportHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline\n } else if (inline === 'center') {\n inlineScroll = targetInline - viewportWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - viewportWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n viewportX,\n viewportX + viewportWidth,\n viewportWidth,\n borderLeft,\n borderRight,\n viewportX + targetInline,\n viewportX + targetInline + targetWidth,\n targetWidth\n )\n }\n\n // Apply scroll position offsets and ensure they are within bounds\n // @TODO add more test cases to cover this 100%\n blockScroll = Math.max(0, blockScroll + viewportY)\n inlineScroll = Math.max(0, inlineScroll + viewportX)\n } else {\n // Handle each scrolling frame that might exist between the target and the viewport\n\n if (block === 'start') {\n blockScroll = targetBlock - top - borderTop\n } else if (block === 'end') {\n blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n top,\n bottom,\n height,\n borderTop,\n borderBottom + scrollbarHeight,\n targetBlock,\n targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline - left - borderLeft\n } else if (inline === 'center') {\n inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - right + borderRight + scrollbarWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n left,\n right,\n width,\n borderLeft,\n borderRight + scrollbarWidth,\n targetInline,\n targetInline + targetWidth,\n targetWidth\n )\n }\n\n const { scrollLeft, scrollTop } = frame\n // Ensure scroll coordinates are not out of bounds while applying scroll offsets\n blockScroll = Math.max(\n 0,\n Math.min(\n scrollTop + blockScroll,\n frame.scrollHeight - height + scrollbarHeight\n )\n )\n inlineScroll = Math.max(\n 0,\n Math.min(\n scrollLeft + inlineScroll,\n frame.scrollWidth - width + scrollbarWidth\n )\n )\n\n // Cache the offset so that parent frames can scroll this into view correctly\n targetBlock += scrollTop - blockScroll\n targetInline += scrollLeft - inlineScroll\n }\n\n computations.push({ el: frame, top: blockScroll, left: inlineScroll })\n }\n\n return computations\n}\n", "import compute from 'compute-scroll-into-view';\n\nfunction isOptionsObject(options) {\n return options === Object(options) && Object.keys(options).length !== 0;\n}\n\nfunction defaultBehavior(actions, behavior) {\n if (behavior === void 0) {\n behavior = 'auto';\n }\n\n var canSmoothScroll = ('scrollBehavior' in document.body.style);\n actions.forEach(function (_ref) {\n var el = _ref.el,\n top = _ref.top,\n left = _ref.left;\n\n if (el.scroll && canSmoothScroll) {\n el.scroll({\n top: top,\n left: left,\n behavior: behavior\n });\n } else {\n el.scrollTop = top;\n el.scrollLeft = left;\n }\n });\n}\n\nfunction getOptions(options) {\n if (options === false) {\n return {\n block: 'end',\n inline: 'nearest'\n };\n }\n\n if (isOptionsObject(options)) {\n return options;\n }\n\n return {\n block: 'start',\n inline: 'nearest'\n };\n}\n\nfunction scrollIntoView(target, options) {\n var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);\n\n if (isOptionsObject(options) && typeof options.behavior === 'function') {\n return options.behavior(isTargetAttached ? compute(target, options) : []);\n }\n\n if (!isTargetAttached) {\n return;\n }\n\n var computeOptions = getOptions(options);\n return defaultBehavior(compute(target, computeOptions), computeOptions.behavior);\n}\n\nexport default scrollIntoView;", "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 getNativeEvent<E>(\n event: E,\n): React.ChangeEvent<any> extends E ? InputEvent : E extends React.SyntheticEvent<any, infer T> ? T : never {\n return (event as any).nativeEvent ?? event\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 { isDom, isIos, noop, pipe } from \"@zag-js/utils\"\nimport scrollIntoView from \"scroll-into-view-if-needed\"\nimport { addDomEvent } from \"./listener\"\nimport { getScrollParent } from \"./scrollable\"\n\ninterface PreventScrollOptions {\n disabled?: boolean\n allowPinchZoom?: boolean\n document?: Document\n}\n\n// HTML input types that do not cause the software keyboard to appear.\nconst nonTextInputTypes = new Set([\"checkbox\", \"radio\", \"range\", \"color\", \"file\", \"image\", \"button\", \"submit\", \"reset\"])\n\nexport function preventBodyScroll(opts?: PreventScrollOptions) {\n const { document: docProp, disabled = false, allowPinchZoom } = opts ?? {}\n\n const doc = docProp ?? document\n const win = doc?.defaultView ?? window\n\n const viewport = isDom() ? win.visualViewport : null\n const docEl = doc.documentElement\n\n function preventScrollStandard() {\n const fn = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n )\n return () => fn?.()\n }\n\n function preventScrollMobileSafari() {\n let scrollable: HTMLElement | undefined\n let lastY = 0\n\n let onTouchStart = (e: TouchEvent) => {\n scrollable = getScrollParent(e.target as HTMLElement)\n\n if (scrollable === docEl && scrollable === doc.body) {\n return\n }\n lastY = e.changedTouches[0].pageY\n }\n\n let onTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && allowPinchZoom) return\n\n if (!scrollable || scrollable === docEl || scrollable === doc.body) {\n e.preventDefault()\n return\n }\n\n let y = e.changedTouches[0].pageY\n let scrollTop = scrollable.scrollTop\n let bottom = scrollable.scrollHeight - scrollable.clientHeight\n\n if ((scrollTop <= 0 && y > lastY) || (scrollTop >= bottom && y < lastY)) {\n e.preventDefault()\n }\n\n lastY = y\n }\n\n let onTouchEnd = (e: TouchEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n e.preventDefault()\n target.style.transform = \"translateY(-2000px)\"\n target.focus()\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n })\n }\n }\n\n let onFocus = (e: FocusEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n target.style.transform = \"translateY(-2000px)\"\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n if (!viewport) return\n\n if (viewport.height < win.innerHeight) {\n win.requestAnimationFrame(function () {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n })\n } else {\n const onResize = () => {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n }\n addDomEvent(viewport, \"resize\", onResize, { once: true })\n }\n })\n }\n }\n\n let onWindowScroll = () => {\n win.scrollTo(0, 0)\n }\n\n let scrollX = win.scrollX\n let scrollY = win.scrollY\n let restoreStyles = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n setStyle(doc.body, \"marginTop\", `-${scrollY}px`),\n )\n\n win.scrollTo(0, 0)\n\n let removeEvents = pipe(\n addDomEvent(doc, \"touchstart\", onTouchStart, { passive: false, capture: true }),\n addDomEvent(doc, \"touchmove\", onTouchMove, { passive: false, capture: true }),\n addDomEvent(doc, \"touchend\", onTouchEnd, { passive: false, capture: true }),\n addDomEvent(doc, \"focus\", onFocus, true),\n addDomEvent(win, \"scroll\", onWindowScroll),\n )\n\n return () => {\n restoreStyles()\n removeEvents()\n win.scrollTo(scrollX, scrollY)\n }\n }\n\n if (disabled) return noop\n return isIos() ? preventScrollMobileSafari() : preventScrollStandard()\n}\n\nfunction setStyle(el: HTMLElement, key: string, value: string) {\n let cur = el.style[key]\n el.style[key] = value\n return () => {\n el.style[key] = cur\n }\n}\n\n// Backup lib: https://github.com/hanai/html-body-scroll-lock\n", "export const MAX_Z_INDEX = 2147483647\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 function () {\n run = false\n }\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 = false) => {\n if (!el) return []\n let els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n if (includeContainer && isHTMLElement(el)) {\n els.unshift(el)\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, includeContainer = false) => {\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", "export function getClosestFormElement(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 [\"textarea\", \"input\", \"select\", \"button\"].includes(el.localName)\n}\n\nexport function trackFormReset(el: HTMLElement | null | undefined, callback: () => void) {\n if (!el) return\n const form = getClosestFormElement(el)\n form?.addEventListener(\"reset\", callback, { passive: true })\n return () => {\n form?.removeEventListener(\"reset\", callback)\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 doc?: Document\n root?: HTMLElement | null\n delay?: number\n}\n\nexport type LiveRegion = ReturnType<typeof createLiveRegion>\n\nexport function createLiveRegion(opts: Partial<LiveRegionOptions> = {}) {\n const { level = \"polite\", doc: ownerDocument, root, delay: rootDelay = 0 } = opts\n\n const doc = ownerDocument ?? document\n const win = doc.defaultView ?? window\n\n const parent = root ?? doc.body\n\n function announce(msg: string, delay?: number) {\n const oldRegion = doc.getElementById(\"__live-region__\")\n\n // remove old region\n if (!!oldRegion) {\n parent.removeChild(oldRegion)\n }\n\n // Did an override level get set?\n delay = delay ?? rootDelay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = \"__live-region__\"\n\n // Determine redundant role\n var 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 = msg\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(\"__live-region__\")\n if (oldRegion) {\n parent.removeChild(oldRegion)\n }\n }\n\n return { announce, destroy }\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, subtree = false) {\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 })\n\n return () => obs.disconnect()\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\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const filtered = v.filter((item) => {\n const str = item.dataset.valuetext ?? item.textContent\n return !!str?.toLowerCase().startsWith(text.toLowerCase())\n })\n return currentId ? nextById(filtered, currentId) : null\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", "type PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n doc.addEventListener(\"webkitpointerlockchange\", fn, false)\n doc.addEventListener(\"mozpointerlockchange\", fn, false)\n doc.addEventListener(\"pointerlockchange\", fn, false)\n return function cleaup() {\n doc.removeEventListener(\"mozpointerlockchange\", fn, false)\n doc.removeEventListener(\"pointerlockchange\", fn, false)\n }\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"webkitpointerlockerror\", fn, false)\n doc.addEventListener(\"mozpointerlockerror\", fn, false)\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"webkitpointerlockerror\", fn, false)\n doc.removeEventListener(\"mozpointerlockerror\", fn, false)\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nfunction getPointerlockFunc(el: HTMLElement) {\n return el.requestPointerLock || (el as any).mozRequestPointerLock || (el as any).webkitRequestPointerLock\n}\n\nfunction getRemovePointerlockFunc(doc: Document) {\n return doc.exitPointerLock || (doc as any).mozExitPointerLock || (doc as any).webkitExitPointerLock\n}\n\nexport function getPointerlockElement(doc: Document) {\n return doc.pointerLockElement || (doc as any).mozPointerLockElement || (doc as any).webkitPointerLockElement\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n function isSupported() {\n return \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc || \"webkitPointerLockElement\" in doc\n }\n\n function hasLockElement() {\n return !!doc.pointerLockElement\n }\n\n function onPointerChange() {\n if (hasLockElement()) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n const isLocked = hasLockElement()\n if (isLocked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock = getRemovePointerlockFunc(doc)\n doc.exitPointerLock()\n }\n\n const cleanups: Set<Function> = new Set()\n\n function addEventListeners() {\n cleanups.add(addPointerlockChangeListener(doc, onPointerChange))\n cleanups.add(addPointerlockErrorListener(doc, onPointerError))\n }\n\n function dispose() {\n if (!isSupported()) return\n cleanups.forEach((fn) => fn())\n cleanups.clear()\n exit()\n }\n\n function setup() {\n if (!isSupported()) return\n body.requestPointerLock = getPointerlockFunc(body)\n body.requestPointerLock()\n addEventListeners()\n }\n\n setup()\n return dispose\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\nconst observedElements: Map<Measurable, ObservedData> = new Map()\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\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 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 { 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", "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", "function getSide(placement) {\n return placement.split('-')[0];\n}\n\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'x' : 'y';\n}\n\nfunction getLengthFromAxis(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n const commonAlign = reference[length] / 2 - floating[length] / 2;\n const side = getSide(placement);\n const isVertical = mainAxis === 'x';\n let coords;\n\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n\n switch (getAlignment(placement)) {\n case 'start':\n coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n\n case 'end':\n coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain positioning strategy.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\n\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n\n if (process.env.NODE_ENV !== \"production\") {\n if (platform == null) {\n console.error(['Floating UI: `platform` property was not passed to config. If you', 'want to use Floating UI on the web, install @floating-ui/dom', 'instead of the /core package. Otherwise, you can create your own', '`platform`: https://floating-ui.com/docs/platform'].join(' '));\n }\n\n if (middleware.filter(_ref => {\n let {\n name\n } = _ref;\n return name === 'autoPlacement' || name === 'flip';\n }).length > 1) {\n throw new Error(['Floating UI: duplicate `flip` and/or `autoPlacement`', 'middleware detected. This will lead to an infinite loop. Ensure only', 'one of either has been passed to the `middleware` array.'].join(' '));\n }\n }\n\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let _debug_loop_count_ = 0;\n\n for (let i = 0; i < middleware.length; i++) {\n if (process.env.NODE_ENV !== \"production\") {\n _debug_loop_count_++;\n\n if (_debug_loop_count_ > 100) {\n throw new Error(['Floating UI: The middleware lifecycle appears to be', 'running in an infinite loop. This is usually caused by a `reset`', 'continually being returned without a break condition.'].join(' '));\n }\n }\n\n const {\n name,\n fn\n } = middleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = { ...middlewareData,\n [name]: { ...middlewareData[name],\n ...data\n }\n };\n\n if (reset) {\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n\n i = -1;\n continue;\n }\n }\n\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\n\nfunction getSideObjectFromPadding(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\n\nfunction rectToClientRect(rect) {\n return { ...rect,\n top: rect.y,\n left: rect.x,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(middlewareArguments, options) {\n var _await$platform$isEle;\n\n if (options === void 0) {\n options = {};\n }\n\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = middlewareArguments;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = options;\n const paddingObject = getSideObjectFromPadding(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: elementContext === 'floating' ? { ...rects.floating,\n x,\n y\n } : rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects[elementContext]); // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n return {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n}\n\nconst min = Math.min;\nconst max = Math.max;\n\nfunction within(min$1, value, max$1) {\n return max(min$1, min(value, max$1));\n}\n\n/**\n * Positions an inner element of the floating element such that it is centered\n * to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n\n async fn(middlewareArguments) {\n // Since `element` is required, we don't Partial<> the type\n const {\n element,\n padding = 0\n } = options != null ? options : {};\n const {\n x,\n y,\n placement,\n rects,\n platform\n } = middlewareArguments;\n\n if (element == null) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn('Floating UI: No `element` was passed to the `arrow` middleware.');\n }\n\n return {};\n }\n\n const paddingObject = getSideObjectFromPadding(padding);\n const coords = {\n x,\n y\n };\n const axis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const minProp = axis === 'y' ? 'top' : 'left';\n const maxProp = axis === 'y' ? 'bottom' : 'right';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n const clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n const centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside of the floating element's bounds\n\n const min = paddingObject[minProp];\n const max = clientSize - arrowDimensions[length] - paddingObject[maxProp];\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = within(min, center, max);\n return {\n data: {\n [axis]: offset,\n centerOffset: center - offset\n }\n };\n }\n\n});\n\nconst hash$1 = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, matched => hash$1[matched]);\n}\n\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n\n const alignment = getAlignment(placement);\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n let mainAlignmentSide = mainAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n\n return {\n main: mainAlignmentSide,\n cross: getOppositePlacement(mainAlignmentSide)\n };\n}\n\nconst hash = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, matched => hash[matched]);\n}\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst allPlacements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-start\", side + \"-end\"), []);\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n\n return true;\n });\n}\n\n/**\n * Automatically chooses the `placement` which has the most space available.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'autoPlacement',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$autoP, _middlewareData$autoP2, _middlewareData$autoP3, _middlewareData$autoP4, _placementsSortedByLe;\n\n const {\n x,\n y,\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = middlewareArguments;\n const {\n alignment = null,\n allowedPlacements = allPlacements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = options;\n const placements = getPlacementList(alignment, autoAlignment, allowedPlacements);\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const currentIndex = (_middlewareData$autoP = (_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.index) != null ? _middlewareData$autoP : 0;\n const currentPlacement = placements[currentIndex];\n\n if (currentPlacement == null) {\n return {};\n }\n\n const {\n main,\n cross\n } = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))); // Make `computeCoords` start from the right place\n\n if (placement !== currentPlacement) {\n return {\n x,\n y,\n reset: {\n placement: placements[0]\n }\n };\n }\n\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[main], overflow[cross]];\n const allOverflows = [...((_middlewareData$autoP3 = (_middlewareData$autoP4 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP4.overflows) != null ? _middlewareData$autoP3 : []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements[currentIndex + 1]; // There are more placements to check\n\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n const placementsSortedByLeastOverflow = allOverflows.slice().sort((a, b) => a.overflows[0] - b.overflows[0]);\n const placementThatFitsOnAllSides = (_placementsSortedByLe = placementsSortedByLeastOverflow.find(_ref => {\n let {\n overflows\n } = _ref;\n return overflows.every(overflow => overflow <= 0);\n })) == null ? void 0 : _placementsSortedByLe.placement;\n const resetPlacement = placementThatFitsOnAllSides != null ? placementThatFitsOnAllSides : placementsSortedByLeastOverflow[0].placement;\n\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\n\n/**\n * Changes the placement of the floating element to one that will fit if the\n * initially specified `placement` does not.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'flip',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$flip;\n\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n flipAlignment = true,\n ...detectOverflowOptions\n } = options;\n const side = getSide(placement);\n const isBasePlacement = side === initialPlacement;\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n\n if (checkCrossAxis) {\n const {\n main,\n cross\n } = getAlignmentSides(placement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n overflows.push(overflow[main], overflow[cross]);\n }\n\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }]; // One or more sides is overflowing\n\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip$, _middlewareData$flip2;\n\n const nextIndex = ((_middlewareData$flip$ = (_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) != null ? _middlewareData$flip$ : 0) + 1;\n const nextPlacement = placements[nextIndex];\n\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n let resetPlacement = 'bottom';\n\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$slice$;\n\n const placement = (_overflowsData$slice$ = overflowsData.slice().sort((a, b) => a.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0) - b.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0))[0]) == null ? void 0 : _overflowsData$slice$.placement;\n\n if (placement) {\n resetPlacement = placement;\n }\n\n break;\n }\n\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n\n return {};\n }\n\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (_temp) {\n let {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = _temp === void 0 ? {} : _temp;\n return {\n name: 'hide',\n\n async fn(middlewareArguments) {\n const {\n rects\n } = middlewareArguments;\n\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n case 'escaped':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n default:\n {\n return {};\n }\n }\n }\n\n };\n};\n\nfunction convertValueToCoords(placement, rects, value, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getMainAxisFromPlacement(placement) === 'x';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = typeof value === 'function' ? value({ ...rects,\n placement\n }) : value;\n const isNumber = typeof rawValue === 'number'; // eslint-disable-next-line prefer-const\n\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = isNumber ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n/**\n * Displaces the floating element from its reference element.\n * @see https://floating-ui.com/docs/offset\n */\n\nconst offset = function (value) {\n if (value === void 0) {\n value = 0;\n }\n\n return {\n name: 'offset',\n options: value,\n\n async fn(middlewareArguments) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements\n } = middlewareArguments;\n const diffCoords = convertValueToCoords(placement, rects, value, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: diffCoords\n };\n }\n\n };\n};\n\nfunction getCrossAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\n/**\n * Shifts the floating element in order to keep it in view when it will overflow\n * a clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'shift',\n options,\n\n async fn(middlewareArguments) {\n const {\n x,\n y,\n placement\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = options;\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const mainAxis = getMainAxisFromPlacement(getSide(placement));\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = within(min, mainAxisCoord, max);\n }\n\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = within(min, crossAxisCoord, max);\n }\n\n const limitedCoords = limiter.fn({ ...middlewareArguments,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return { ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n\n };\n};\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n options,\n\n fn(middlewareArguments) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = middlewareArguments;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = options;\n const coords = {\n x,\n y\n };\n const mainAxis = getMainAxisFromPlacement(placement);\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = typeof offset === 'function' ? offset({ ...rects,\n placement\n }) : offset;\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2, _middlewareData$offse3, _middlewareData$offse4;\n\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? (_middlewareData$offse = (_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) != null ? _middlewareData$offse : 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : (_middlewareData$offse3 = (_middlewareData$offse4 = middlewareData.offset) == null ? void 0 : _middlewareData$offse4[crossAxis]) != null ? _middlewareData$offse3 : 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n\n };\n};\n\n/**\n * Provides data to change the size of the floating element. For instance,\n * prevent it from overflowing its clipping boundary or match the width of the\n * reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'size',\n options,\n\n async fn(middlewareArguments) {\n const {\n placement,\n rects,\n platform,\n elements\n } = middlewareArguments;\n const {\n apply,\n ...detectOverflowOptions\n } = options;\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n let heightSide;\n let widthSide;\n\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n const dimensions = {\n height: rects.floating.height - (['left', 'right'].includes(placement) ? 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)) : overflow[heightSide]),\n width: rects.floating.width - (['top', 'bottom'].includes(placement) ? 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)) : overflow[widthSide])\n };\n const prevDimensions = await platform.getDimensions(elements.floating);\n apply == null ? void 0 : apply({ ...dimensions,\n ...rects\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n\n if (prevDimensions.width !== nextDimensions.width || prevDimensions.height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'inline',\n options,\n\n async fn(middlewareArguments) {\n var _await$platform$getCl;\n\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = middlewareArguments; // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n\n const {\n padding = 2,\n x,\n y\n } = options;\n const fallback = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects.reference);\n const clientRects = (_await$platform$getCl = await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) != null ? _await$platform$getCl : [];\n const paddingObject = getSideObjectFromPadding(padding);\n\n function getBoundingClientRect() {\n // There are two rects and they are disjoined\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n var _clientRects$find;\n\n // Find the first rect in which the point is fully inside\n return (_clientRects$find = clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom)) != null ? _clientRects$find : fallback;\n } // There are 2 or more connected rects\n\n\n if (clientRects.length >= 2) {\n if (getMainAxisFromPlacement(placement) === 'x') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n return fallback;\n }\n\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, rectToClientRect, shift, size };\n", "import { rectToClientRect, computePosition as computePosition$1 } from '@floating-ui/core';\nexport { arrow, autoPlacement, detectOverflow, flip, hide, inline, limitShift, offset, shift, size } from '@floating-ui/core';\n\nfunction isWindow(value) {\n return value && value.document && value.location && value.alert && value.setInterval;\n}\nfunction getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (!isWindow(node)) {\n const ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}\n\nfunction getComputedStyle$1(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction getNodeName(node) {\n return isWindow(node) ? '' : node ? (node.nodeName || '').toLowerCase() : '';\n}\n\nfunction isHTMLElement(value) {\n return value instanceof getWindow(value).HTMLElement;\n}\nfunction isElement(value) {\n return value instanceof getWindow(value).Element;\n}\nfunction isNode(value) {\n return value instanceof getWindow(value).Node;\n}\nfunction isShadowRoot(node) {\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\nfunction isOverflowElement(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle$1(element);\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n // TODO: Try and use feature detection here instead\n const isFirefox = navigator.userAgent.toLowerCase().includes('firefox');\n const css = getComputedStyle$1(element); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n return css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].includes(css.willChange) || isFirefox && css.willChange === 'filter' || isFirefox && (css.filter ? css.filter !== 'none' : false);\n}\nfunction isLayoutViewport() {\n // Not Safari\n return !/^((?!chrome|android).)*safari/i.test(navigator.userAgent); // Feature detection for this fails in various ways\n // \u2022 Always-visible scrollbar or not\n // \u2022 Width of <html>, etc.\n // const vV = win.visualViewport;\n // return vV ? Math.abs(win.innerWidth / vV.scale - vV.width) < 0.5 : true;\n}\n\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n const clientRect = element.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n const win = isElement(element) ? getWindow(element) : window;\n const addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n const x = (clientRect.left + (addVisualOffsets ? win.visualViewport.offsetLeft : 0)) / scaleX;\n const y = (clientRect.top + (addVisualOffsets ? win.visualViewport.offsetTop : 0)) / scaleY;\n const width = clientRect.width / scaleX;\n const height = clientRect.height / scaleY;\n return {\n width,\n height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x,\n y\n };\n}\n\nfunction getDocumentElement(node) {\n return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement;\n}\n\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n\n return {\n scrollLeft: element.pageXOffset,\n scrollTop: element.pageYOffset\n };\n}\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\nfunction isScaled(element) {\n const rect = getBoundingClientRect(element);\n return round(rect.width) !== element.offsetWidth || round(rect.height) !== element.offsetHeight;\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const rect = getBoundingClientRect(element, isOffsetParentAnElement && isScaled(offsetParent), strategy === 'fixed');\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // @ts-ignore\n node.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n node.parentNode || ( // DOM Element detected\n isShadowRoot(node) ? node.host : null) || // ShadowRoot detected\n getDocumentElement(node) // fallback\n\n );\n}\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n}\n\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && !['html', 'body'].includes(getNodeName(currentNode))) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n const window = getWindow(element);\n let offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n\nfunction getDimensions(element) {\n if (isHTMLElement(element)) {\n return {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n }\n\n const rect = getBoundingClientRect(element);\n return {\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n\n if (offsetParent === documentElement) {\n return rect;\n }\n\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } // This doesn't appear to be need to be negated.\n // else if (documentElement) {\n // offsets.x = getWindowScrollBarX(documentElement);\n // }\n\n }\n\n return { ...rect,\n x: rect.x - scroll.scrollLeft + offsets.x,\n y: rect.y - scroll.scrollTop + offsets.y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var _element$ownerDocumen;\n\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n const width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n const height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n\n if (getComputedStyle$1(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n\n if (['html', 'body', '#document'].includes(getNodeName(parentNode))) {\n // @ts-ignore assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode);\n}\n\nfunction getOverflowAncestors(node, list) {\n var _node$ownerDocument;\n\n if (list === void 0) {\n list = [];\n }\n\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body);\n const win = getWindow(scrollableAncestor);\n const target = isBody ? [win].concat(win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []) : scrollableAncestor;\n const updatedList = list.concat(target);\n return isBody ? updatedList : // @ts-ignore: isBody tells us target will be an HTMLElement here\n updatedList.concat(getOverflowAncestors(getParentNode(target)));\n}\n\nfunction contains(parent, child) {\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n\n do {\n // use `===` replace node.isSameNode()\n if (next && parent === next) {\n return true;\n } // @ts-ignore: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n }\n\n return false;\n}\n\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, false, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n return {\n top,\n left,\n x: left,\n y: top,\n right: left + element.clientWidth,\n bottom: top + element.clientHeight,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getClientRectFromClippingAncestor(element, clippingParent, strategy) {\n if (clippingParent === 'viewport') {\n return rectToClientRect(getViewportRect(element, strategy));\n }\n\n if (isElement(clippingParent)) {\n return getInnerBoundingClientRect(clippingParent, strategy);\n }\n\n return rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping ancestor\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingAncestors(element) {\n const clippingAncestors = getOverflowAncestors(element);\n const canEscapeClipping = ['absolute', 'fixed'].includes(getComputedStyle$1(element).position);\n const clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // @ts-ignore isElement check ensures we return Array<Element>\n\n\n return clippingAncestors.filter(clippingAncestors => isElement(clippingAncestors) && contains(clippingAncestors, clipperElement) && getNodeName(clippingAncestors) !== 'body');\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors\n\n\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const mainClippingAncestors = boundary === 'clippingAncestors' ? getClippingAncestors(element) : [].concat(boundary);\n const clippingAncestors = [...mainClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nconst platform = {\n getClippingRect,\n convertOffsetParentRelativeRectToViewportRelativeRect,\n isElement,\n getDimensions,\n getOffsetParent,\n getDocumentElement,\n getElementRects: _ref => {\n let {\n reference,\n floating,\n strategy\n } = _ref;\n return {\n reference: getRectRelativeToOffsetParent(reference, getOffsetParent(floating), strategy),\n floating: { ...getDimensions(floating),\n x: 0,\n y: 0\n }\n };\n },\n getClientRects: element => Array.from(element.getClientRects()),\n isRTL: element => getComputedStyle$1(element).direction === 'rtl'\n};\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n\n const {\n ancestorScroll: _ancestorScroll = true,\n ancestorResize: _ancestorResize = true,\n elementResize: _elementResize = true,\n animationFrame = false\n } = options;\n let cleanedUp = false;\n const ancestorScroll = _ancestorScroll && !animationFrame;\n const ancestorResize = _ancestorResize && !animationFrame;\n const elementResize = _elementResize && !animationFrame;\n const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n let observer = null;\n\n if (elementResize) {\n observer = new ResizeObserver(update);\n isElement(reference) && observer.observe(reference);\n observer.observe(floating);\n }\n\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n\n if (animationFrame) {\n frameLoop();\n }\n\n function frameLoop() {\n if (cleanedUp) {\n return;\n }\n\n const nextRefRect = getBoundingClientRect(reference);\n\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n\n return () => {\n var _observer;\n\n cleanedUp = true;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n (_observer = observer) == null ? void 0 : _observer.disconnect();\n observer = null;\n\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain CSS positioning\n * strategy.\n */\n\nconst computePosition = (reference, floating, options) => computePosition$1(reference, floating, {\n platform,\n ...options\n});\n\nexport { autoUpdate, computePosition, getOverflowAncestors };\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", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nconst styleCache: WeakMap<HTMLElement, Styles> = new WeakMap()\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n let style: Styles | undefined = styleCache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n styleCache.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 forceReflow() {\n return document.body.offsetHeight\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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\nconst listenerElements: Map<El, Group> = new Map()\nconst listenerCache: Map<El, Map<string, Handler>> = new Map()\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 globalEventBus(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\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 { globalEventBus } from \"./event-bus\"\nimport {\n AnyPointerEvent,\n DOMEventTarget,\n EventMap,\n PointerEventInfo,\n PointerNameMap,\n RefTarget,\n} from \"./listener.types\"\n\nconst t = (v: any) => Object.prototype.toString.call(v).slice(8, -1)\nconst isRef = (v: any): v is RefTarget => t(v) === \"Object\" && \"current\" in v\nconst runIfFn = (fn: any): HTMLElement | null => (t(fn) === \"Function\" ? fn() : fn)\nconst isTouchEvent = (v: Event): v is TouchEvent => t(v) === \"Object\" && !!(v as TouchEvent).touches\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 globalEventBus(node, 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 supportsPointerEvent = () => typeof window !== \"undefined\" && window.onpointerdown === null\nconst supportsTouchEvent = () => typeof window !== \"undefined\" && window.ontouchstart === null\nconst supportsMouseEvent = () => typeof window !== \"undefined\" && window.onmousedown === null\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", "// Compute what scrolling needs to be done on required scrolling boxes for target to be in view\n\n// The type names here are named after the spec to make it easier to find more information around what they mean:\n// To reduce churn and reduce things that need be maintained things from the official TS DOM library is used here\n// https://drafts.csswg.org/cssom-view/\n\n// For a definition on what is \"block flow direction\" exactly, check this: https://drafts.csswg.org/css-writing-modes-4/#block-flow-direction\n\n// add support for visualViewport object currently implemented in chrome\ninterface visualViewport {\n height: number\n width: number\n}\n\ntype ScrollLogicalPosition = 'start' | 'center' | 'end' | 'nearest'\n// This new option is tracked in this PR, which is the most likely candidate at the time: https://github.com/w3c/csswg-drafts/pull/1805\ntype ScrollMode = 'always' | 'if-needed'\n// New option that skips auto-scrolling all nodes with overflow: hidden set\n// See FF implementation: https://hg.mozilla.org/integration/fx-team/rev/c48c3ec05012#l7.18\ntype SkipOverflowHiddenElements = boolean\n\ninterface Options {\n block?: ScrollLogicalPosition\n inline?: ScrollLogicalPosition\n scrollMode?: ScrollMode\n boundary?: CustomScrollBoundary\n skipOverflowHiddenElements?: SkipOverflowHiddenElements\n}\n\n// Custom behavior, not in any spec\ntype CustomScrollBoundaryCallback = (parent: Element) => boolean\ntype CustomScrollBoundary = Element | CustomScrollBoundaryCallback | null\ninterface CustomScrollAction {\n el: Element\n top: number\n left: number\n}\n\n// @TODO better shadowdom test, 11 = document fragment\nfunction isElement(el: any): el is Element {\n return typeof el === 'object' && el != null && el.nodeType === 1\n}\n\nfunction canOverflow(\n overflow: string | null,\n skipOverflowHiddenElements?: boolean\n) {\n if (skipOverflowHiddenElements && overflow === 'hidden') {\n return false\n }\n\n return overflow !== 'visible' && overflow !== 'clip'\n}\n\nfunction getFrameElement(el: Element) {\n if (!el.ownerDocument || !el.ownerDocument.defaultView) {\n return null\n }\n\n try {\n return el.ownerDocument.defaultView.frameElement\n } catch (e) {\n return null\n }\n}\n\nfunction isHiddenByFrame(el: Element): boolean {\n const frame = getFrameElement(el)\n if (!frame) {\n return false\n }\n\n return (\n frame.clientHeight < el.scrollHeight || frame.clientWidth < el.scrollWidth\n )\n}\n\nfunction isScrollable(el: Element, skipOverflowHiddenElements?: boolean) {\n if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n const style = getComputedStyle(el, null)\n return (\n canOverflow(style.overflowY, skipOverflowHiddenElements) ||\n canOverflow(style.overflowX, skipOverflowHiddenElements) ||\n isHiddenByFrame(el)\n )\n }\n\n return false\n}\n/**\n * Find out which edge to align against when logical scroll position is \"nearest\"\n * Interesting fact: \"nearest\" works similarily to \"if-needed\", if the element is fully visible it will not scroll it\n *\n * Legends:\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250F \u2501 \u2501 \u2501 \u2513\n * \u2502 target \u2502 frame\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2517 \u2501 \u2501 \u2501 \u251B\n */\nfunction alignNearest(\n scrollingEdgeStart: number,\n scrollingEdgeEnd: number,\n scrollingSize: number,\n scrollingBorderStart: number,\n scrollingBorderEnd: number,\n elementEdgeStart: number,\n elementEdgeEnd: number,\n elementSize: number\n) {\n /**\n * If element edge A and element edge B are both outside scrolling box edge A and scrolling box edge B\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502\n * \u2503 \u2502 \u2502 \u2503 do nothing\n * \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C and element edge D are both outside scrolling box edge C and scrolling box edge D\n *\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502\u2503 \u2503\u2502 do nothing\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart < scrollingEdgeStart &&\n elementEdgeEnd > scrollingEdgeEnd) ||\n (elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd)\n ) {\n return 0\n }\n\n /**\n * If element edge A is outside scrolling box edge A and element height is less than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2514\u2500\u2500\u2518 \u2502 \u2502\n * from \u2503 \u2503 to \u2503 \u2514\u2500\u2500\u2518 \u2503\n *\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501 \u2501\u2501 \u2501\u251B\n *\n * If element edge B is outside scrolling box edge B and element height is greater than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2502 \u2502\n * from \u2503 \u250C\u2500\u2500\u2510 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2502 \u2502 \u2514\u2500\u2500\u2518\n * \u2502 \u2502\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C is outside scrolling box edge C and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2503 \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize) ||\n (elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize)\n ) {\n return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart\n }\n\n /**\n * If element edge B is outside scrolling box edge B and element height is less than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501 \u2501\u2501 \u2501\u2513\n *\n * from \u2503 \u2503 to \u2503 \u250C\u2500\u2500\u2510 \u2503\n * \u250C\u2500\u2500\u2510 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge A is outside scrolling box edge A and element height is greater than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u2502 \u2502\n * \u2502 \u2502 \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502 \u2502 \u2502\n * from \u2503 \u2514\u2500\u2500\u2518 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n *\n * If element edge C is outside scrolling box edge C and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2502 \u2503 \u2503\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n */\n if (\n (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize) ||\n (elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize)\n ) {\n return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd\n }\n\n return 0\n}\n\nexport default (target: Element, options: Options): CustomScrollAction[] => {\n //TODO: remove this hack when microbundle will support typescript >= 4.0\n const windowWithViewport = (window as unknown) as Window & {\n visualViewport: visualViewport\n }\n\n const {\n scrollMode,\n block,\n inline,\n boundary,\n skipOverflowHiddenElements,\n } = options\n // Allow using a callback to check the boundary\n // The default behavior is to check if the current target matches the boundary element or not\n // If undefined it'll check that target is never undefined (can happen as we recurse up the tree)\n const checkBoundary =\n typeof boundary === 'function' ? boundary : (node: any) => node !== boundary\n\n if (!isElement(target)) {\n throw new TypeError('Invalid target')\n }\n\n // Used to handle the top most element that can be scrolled\n const scrollingElement = document.scrollingElement || document.documentElement\n\n // Collect all the scrolling boxes, as defined in the spec: https://drafts.csswg.org/cssom-view/#scrolling-box\n const frames: Element[] = []\n let cursor: Element | null = target\n while (isElement(cursor) && checkBoundary(cursor)) {\n // Move cursor to parent\n cursor = cursor.parentElement\n\n // Stop when we reach the viewport\n if (cursor === scrollingElement) {\n frames.push(cursor)\n break\n }\n\n // Skip document.body if it's not the scrollingElement and documentElement isn't independently scrollable\n if (\n cursor != null &&\n cursor === document.body &&\n isScrollable(cursor) &&\n !isScrollable(document.documentElement)\n ) {\n continue\n }\n\n // Now we check if the element is scrollable, this code only runs if the loop haven't already hit the viewport or a custom boundary\n if (cursor != null && isScrollable(cursor, skipOverflowHiddenElements)) {\n frames.push(cursor)\n }\n }\n\n // Support pinch-zooming properly, making sure elements scroll into the visual viewport\n // Browsers that don't support visualViewport will report the layout viewport dimensions on document.documentElement.clientWidth/Height\n // and viewport dimensions on window.innerWidth/Height\n // https://www.quirksmode.org/mobile/viewports2.html\n // https://bokand.github.io/viewport/index.html\n const viewportWidth = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.width\n : innerWidth\n const viewportHeight = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.height\n : innerHeight\n\n // Newer browsers supports scroll[X|Y], page[X|Y]Offset is\n const viewportX = window.scrollX || pageXOffset\n const viewportY = window.scrollY || pageYOffset\n\n const {\n height: targetHeight,\n width: targetWidth,\n top: targetTop,\n right: targetRight,\n bottom: targetBottom,\n left: targetLeft,\n } = target.getBoundingClientRect()\n\n // These values mutate as we loop through and generate scroll coordinates\n let targetBlock: number =\n block === 'start' || block === 'nearest'\n ? targetTop\n : block === 'end'\n ? targetBottom\n : targetTop + targetHeight / 2 // block === 'center\n let targetInline: number =\n inline === 'center'\n ? targetLeft + targetWidth / 2\n : inline === 'end'\n ? targetRight\n : targetLeft // inline === 'start || inline === 'nearest\n\n // Collect new scroll positions\n const computations: CustomScrollAction[] = []\n // In chrome there's no longer a difference between caching the `frames.length` to a var or not, so we don't in this case (size > speed anyways)\n for (let index = 0; index < frames.length; index++) {\n const frame = frames[index]\n\n // @TODO add a shouldScroll hook here that allows userland code to take control\n\n const {\n height,\n width,\n top,\n right,\n bottom,\n left,\n } = frame.getBoundingClientRect()\n\n // If the element is already visible we can end it here\n // @TODO targetBlock and targetInline should be taken into account to be compliant with https://github.com/w3c/csswg-drafts/pull/1805/files#diff-3c17f0e43c20f8ecf89419d49e7ef5e0R1333\n if (\n scrollMode === 'if-needed' &&\n targetTop >= 0 &&\n targetLeft >= 0 &&\n targetBottom <= viewportHeight &&\n targetRight <= viewportWidth &&\n targetTop >= top &&\n targetBottom <= bottom &&\n targetLeft >= left &&\n targetRight <= right\n ) {\n // Break the loop and return the computations for things that are not fully visible\n return computations\n }\n\n const frameStyle = getComputedStyle(frame)\n const borderLeft = parseInt(frameStyle.borderLeftWidth as string, 10)\n const borderTop = parseInt(frameStyle.borderTopWidth as string, 10)\n const borderRight = parseInt(frameStyle.borderRightWidth as string, 10)\n const borderBottom = parseInt(frameStyle.borderBottomWidth as string, 10)\n\n let blockScroll: number = 0\n let inlineScroll: number = 0\n\n // The property existance checks for offfset[Width|Height] is because only HTMLElement objects have them, but any Element might pass by here\n // @TODO find out if the \"as HTMLElement\" overrides can be dropped\n const scrollbarWidth =\n 'offsetWidth' in frame\n ? (frame as HTMLElement).offsetWidth -\n (frame as HTMLElement).clientWidth -\n borderLeft -\n borderRight\n : 0\n const scrollbarHeight =\n 'offsetHeight' in frame\n ? (frame as HTMLElement).offsetHeight -\n (frame as HTMLElement).clientHeight -\n borderTop -\n borderBottom\n : 0\n\n if (scrollingElement === frame) {\n // Handle viewport logic (document.documentElement or document.body)\n\n if (block === 'start') {\n blockScroll = targetBlock\n } else if (block === 'end') {\n blockScroll = targetBlock - viewportHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n viewportY,\n viewportY + viewportHeight,\n viewportHeight,\n borderTop,\n borderBottom,\n viewportY + targetBlock,\n viewportY + targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - viewportHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline\n } else if (inline === 'center') {\n inlineScroll = targetInline - viewportWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - viewportWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n viewportX,\n viewportX + viewportWidth,\n viewportWidth,\n borderLeft,\n borderRight,\n viewportX + targetInline,\n viewportX + targetInline + targetWidth,\n targetWidth\n )\n }\n\n // Apply scroll position offsets and ensure they are within bounds\n // @TODO add more test cases to cover this 100%\n blockScroll = Math.max(0, blockScroll + viewportY)\n inlineScroll = Math.max(0, inlineScroll + viewportX)\n } else {\n // Handle each scrolling frame that might exist between the target and the viewport\n\n if (block === 'start') {\n blockScroll = targetBlock - top - borderTop\n } else if (block === 'end') {\n blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n top,\n bottom,\n height,\n borderTop,\n borderBottom + scrollbarHeight,\n targetBlock,\n targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline - left - borderLeft\n } else if (inline === 'center') {\n inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - right + borderRight + scrollbarWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n left,\n right,\n width,\n borderLeft,\n borderRight + scrollbarWidth,\n targetInline,\n targetInline + targetWidth,\n targetWidth\n )\n }\n\n const { scrollLeft, scrollTop } = frame\n // Ensure scroll coordinates are not out of bounds while applying scroll offsets\n blockScroll = Math.max(\n 0,\n Math.min(\n scrollTop + blockScroll,\n frame.scrollHeight - height + scrollbarHeight\n )\n )\n inlineScroll = Math.max(\n 0,\n Math.min(\n scrollLeft + inlineScroll,\n frame.scrollWidth - width + scrollbarWidth\n )\n )\n\n // Cache the offset so that parent frames can scroll this into view correctly\n targetBlock += scrollTop - blockScroll\n targetInline += scrollLeft - inlineScroll\n }\n\n computations.push({ el: frame, top: blockScroll, left: inlineScroll })\n }\n\n return computations\n}\n", "import compute from 'compute-scroll-into-view';\n\nfunction isOptionsObject(options) {\n return options === Object(options) && Object.keys(options).length !== 0;\n}\n\nfunction defaultBehavior(actions, behavior) {\n if (behavior === void 0) {\n behavior = 'auto';\n }\n\n var canSmoothScroll = ('scrollBehavior' in document.body.style);\n actions.forEach(function (_ref) {\n var el = _ref.el,\n top = _ref.top,\n left = _ref.left;\n\n if (el.scroll && canSmoothScroll) {\n el.scroll({\n top: top,\n left: left,\n behavior: behavior\n });\n } else {\n el.scrollTop = top;\n el.scrollLeft = left;\n }\n });\n}\n\nfunction getOptions(options) {\n if (options === false) {\n return {\n block: 'end',\n inline: 'nearest'\n };\n }\n\n if (isOptionsObject(options)) {\n return options;\n }\n\n return {\n block: 'start',\n inline: 'nearest'\n };\n}\n\nfunction scrollIntoView(target, options) {\n var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);\n\n if (isOptionsObject(options) && typeof options.behavior === 'function') {\n return options.behavior(isTargetAttached ? compute(target, options) : []);\n }\n\n if (!isTargetAttached) {\n return;\n }\n\n var computeOptions = getOptions(options);\n return defaultBehavior(compute(target, computeOptions), computeOptions.behavior);\n}\n\nexport default scrollIntoView;", "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 getNativeEvent<E>(\n event: E,\n): React.ChangeEvent<any> extends E ? InputEvent : E extends React.SyntheticEvent<any, infer T> ? T : never {\n return (event as any).nativeEvent ?? event\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 { isDom, isIos, noop, pipe } from \"@zag-js/utils\"\nimport scrollIntoView from \"scroll-into-view-if-needed\"\nimport { addDomEvent } from \"./listener\"\nimport { getScrollParent } from \"./scrollable\"\n\ninterface PreventScrollOptions {\n disabled?: boolean\n allowPinchZoom?: boolean\n document?: Document\n}\n\n// HTML input types that do not cause the software keyboard to appear.\nconst nonTextInputTypes = new Set([\"checkbox\", \"radio\", \"range\", \"color\", \"file\", \"image\", \"button\", \"submit\", \"reset\"])\n\nexport function preventBodyScroll(opts?: PreventScrollOptions) {\n const { document: docProp, disabled = false, allowPinchZoom } = opts ?? {}\n\n const doc = docProp ?? document\n const win = doc?.defaultView ?? window\n\n const viewport = isDom() ? win.visualViewport : null\n const docEl = doc.documentElement\n\n function preventScrollStandard() {\n const fn = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n )\n return () => fn?.()\n }\n\n function preventScrollMobileSafari() {\n let scrollable: HTMLElement | undefined\n let lastY = 0\n\n let onTouchStart = (e: TouchEvent) => {\n scrollable = getScrollParent(e.target as HTMLElement)\n\n if (scrollable === docEl && scrollable === doc.body) {\n return\n }\n lastY = e.changedTouches[0].pageY\n }\n\n let onTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && allowPinchZoom) return\n\n if (!scrollable || scrollable === docEl || scrollable === doc.body) {\n e.preventDefault()\n return\n }\n\n let y = e.changedTouches[0].pageY\n let scrollTop = scrollable.scrollTop\n let bottom = scrollable.scrollHeight - scrollable.clientHeight\n\n if ((scrollTop <= 0 && y > lastY) || (scrollTop >= bottom && y < lastY)) {\n e.preventDefault()\n }\n\n lastY = y\n }\n\n let onTouchEnd = (e: TouchEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n e.preventDefault()\n target.style.transform = \"translateY(-2000px)\"\n target.focus()\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n })\n }\n }\n\n let onFocus = (e: FocusEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n target.style.transform = \"translateY(-2000px)\"\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n if (!viewport) return\n\n if (viewport.height < win.innerHeight) {\n win.requestAnimationFrame(function () {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n })\n } else {\n const onResize = () => {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n }\n addDomEvent(viewport, \"resize\", onResize, { once: true })\n }\n })\n }\n }\n\n let onWindowScroll = () => {\n win.scrollTo(0, 0)\n }\n\n let scrollX = win.scrollX\n let scrollY = win.scrollY\n let restoreStyles = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n setStyle(doc.body, \"marginTop\", `-${scrollY}px`),\n )\n\n win.scrollTo(0, 0)\n\n let removeEvents = pipe(\n addDomEvent(doc, \"touchstart\", onTouchStart, { passive: false, capture: true }),\n addDomEvent(doc, \"touchmove\", onTouchMove, { passive: false, capture: true }),\n addDomEvent(doc, \"touchend\", onTouchEnd, { passive: false, capture: true }),\n addDomEvent(doc, \"focus\", onFocus, true),\n addDomEvent(win, \"scroll\", onWindowScroll),\n )\n\n return () => {\n restoreStyles()\n removeEvents()\n win.scrollTo(scrollX, scrollY)\n }\n }\n\n if (disabled) return noop\n return isIos() ? preventScrollMobileSafari() : preventScrollStandard()\n}\n\nfunction setStyle(el: HTMLElement, key: string, value: string) {\n let cur = el.style[key]\n el.style[key] = value\n return () => {\n el.style[key] = cur\n }\n}\n\n// Backup lib: https://github.com/hanai/html-body-scroll-lock\n", "export const MAX_Z_INDEX = 2147483647\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 function () {\n run = false\n }\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 = false) => {\n if (!el) return []\n let els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n if (includeContainer && isHTMLElement(el)) {\n els.unshift(el)\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, includeContainer = false) => {\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", "export function getClosestFormElement(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 [\"textarea\", \"input\", \"select\", \"button\"].includes(el.localName)\n}\n\nexport function trackFormReset(el: HTMLElement | null | undefined, callback: () => void) {\n if (!el) return\n const form = getClosestFormElement(el)\n form?.addEventListener(\"reset\", callback, { passive: true })\n return () => {\n form?.removeEventListener(\"reset\", callback)\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 doc?: Document\n root?: HTMLElement | null\n delay?: number\n}\n\nexport type LiveRegion = ReturnType<typeof createLiveRegion>\n\nexport function createLiveRegion(opts: Partial<LiveRegionOptions> = {}) {\n const { level = \"polite\", doc: ownerDocument, root, delay: rootDelay = 0 } = opts\n\n const doc = ownerDocument ?? document\n const win = doc.defaultView ?? window\n\n const parent = root ?? doc.body\n\n function announce(msg: string, delay?: number) {\n const oldRegion = doc.getElementById(\"__live-region__\")\n\n // remove old region\n if (!!oldRegion) {\n parent.removeChild(oldRegion)\n }\n\n // Did an override level get set?\n delay = delay ?? rootDelay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = \"__live-region__\"\n\n // Determine redundant role\n var 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 = msg\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(\"__live-region__\")\n if (oldRegion) {\n parent.removeChild(oldRegion)\n }\n }\n\n return { announce, destroy }\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, subtree = false) {\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 })\n\n return () => obs.disconnect()\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\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const filtered = v.filter((item) => {\n const str = item.dataset.valuetext ?? item.textContent\n return !!str?.toLowerCase().startsWith(text.toLowerCase())\n })\n return currentId ? nextById(filtered, currentId) : null\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", "type PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n doc.addEventListener(\"webkitpointerlockchange\", fn, false)\n doc.addEventListener(\"mozpointerlockchange\", fn, false)\n doc.addEventListener(\"pointerlockchange\", fn, false)\n return function cleaup() {\n doc.removeEventListener(\"mozpointerlockchange\", fn, false)\n doc.removeEventListener(\"pointerlockchange\", fn, false)\n }\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"webkitpointerlockerror\", fn, false)\n doc.addEventListener(\"mozpointerlockerror\", fn, false)\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"webkitpointerlockerror\", fn, false)\n doc.removeEventListener(\"mozpointerlockerror\", fn, false)\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nfunction getPointerlockFunc(el: HTMLElement) {\n return el.requestPointerLock || (el as any).mozRequestPointerLock || (el as any).webkitRequestPointerLock\n}\n\nfunction getRemovePointerlockFunc(doc: Document) {\n return doc.exitPointerLock || (doc as any).mozExitPointerLock || (doc as any).webkitExitPointerLock\n}\n\nexport function getPointerlockElement(doc: Document) {\n return doc.pointerLockElement || (doc as any).mozPointerLockElement || (doc as any).webkitPointerLockElement\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n function isSupported() {\n return \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc || \"webkitPointerLockElement\" in doc\n }\n\n function hasLockElement() {\n return !!doc.pointerLockElement\n }\n\n function onPointerChange() {\n if (hasLockElement()) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n const isLocked = hasLockElement()\n if (isLocked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock = getRemovePointerlockFunc(doc)\n doc.exitPointerLock()\n }\n\n const cleanups: Set<Function> = new Set()\n\n function addEventListeners() {\n cleanups.add(addPointerlockChangeListener(doc, onPointerChange))\n cleanups.add(addPointerlockErrorListener(doc, onPointerError))\n }\n\n function dispose() {\n if (!isSupported()) return\n cleanups.forEach((fn) => fn())\n cleanups.clear()\n exit()\n }\n\n function setup() {\n if (!isSupported()) return\n body.requestPointerLock = getPointerlockFunc(body)\n body.requestPointerLock()\n addEventListeners()\n }\n\n setup()\n return dispose\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\nconst observedElements: Map<Measurable, ObservedData> = new Map()\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\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 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 { 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", "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", "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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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 = { ancestorScroll?: boolean; ancestorResize?: boolean; referenceResize?: boolean }\ntype Ancestors = ReturnType<typeof getOverflowAncestors>\n\nfunction resolveOptions(option: boolean | AutoUpdateOptions) {\n if (isBoolean(option)) return { ancestorResize: option, ancestorScroll: option, referenceResize: option }\n return Object.assign({ ancestorResize: true, ancestorScroll: true, referenceResize: true }, option)\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", "import { Middleware, Placement } 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 arrowShadowColor: toVar(\"--arrow-shadow-color\"),\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 boxShadow: toVar(\"--arrow-box-shadow\"),\n}\n\n/* -----------------------------------------------------------------------------\n * Transform Origin Middleware\n * -----------------------------------------------------------------------------*/\n\nconst transforms = {\n top: \"bottom center\",\n \"top-start\": \"bottom left\",\n \"top-end\": \"bottom right\",\n bottom: \"top center\",\n \"bottom-start\": \"top left\",\n \"bottom-end\": \"top right\",\n left: \"right center\",\n \"left-start\": \"right top\",\n \"left-end\": \"right bottom\",\n right: \"left center\",\n \"right-start\": \"left top\",\n \"right-end\": \"left bottom\",\n}\n\nexport const transformOrigin: Middleware = {\n name: \"transformOrigin\",\n fn({ placement, elements }) {\n const { floating } = elements\n floating.style.setProperty(cssVars.transformOrigin.variable, transforms[placement])\n return {\n data: { transformOrigin: transforms[placement] },\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 staticSide = {\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 [staticSide]: cssVars.arrowOffset.reference,\n [cssVars.boxShadow.variable]: getBoxShadow(placement)!,\n })\n\n return {}\n },\n})\n\nexport function getBoxShadow(placement: Placement) {\n if (placement.includes(\"top\")) return `1px 1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n if (placement.includes(\"bottom\")) return `-1px -1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n if (placement.includes(\"right\")) return `-1px 1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n if (placement.includes(\"left\")) return `1px -1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n}\n", "import type { VirtualElement } from \"@floating-ui/dom\"\nimport { arrow, computePosition, flip, Middleware, offset, shift, size } from \"@floating-ui/dom\"\nimport { getOwnerDocument } from \"@zag-js/dom-utils\"\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}\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 middleware: Middleware[] = [transformOrigin]\n\n if (options.flip) {\n middleware.push(flip({ boundary: options.boundary, padding: 8 }))\n }\n\n if (options.gutter || options.offset) {\n const data = options.gutter ? { mainAxis: options.gutter } : options.offset\n middleware.push(offset(data))\n }\n\n middleware.push(shift({ boundary: options.boundary }))\n\n const doc = getOwnerDocument(floating)\n const arrowEl = doc.querySelector<HTMLElement>(\"[data-part=arrow]\")\n if (arrowEl) {\n middleware.push(arrow({ element: arrowEl, padding: 8 }), shiftArrow({ element: arrowEl }))\n }\n\n if (options.sameWidth) {\n middleware.push(\n size({\n apply(data) {\n const { width } = data.reference\n Object.assign(floating.style, { width: `${width}px`, minWidth: \"unset\" })\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, { placement, middleware, strategy })\n .then((data) => {\n const { x, y, strategy } = data\n Object.assign(floating.style, { left: `${x}px`, top: `${y}px`, position: strategy })\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", "import { cssVars } from \"./middleware\"\n\ntype Options = {\n measured: boolean\n strategy?: \"absolute\" | \"fixed\"\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\nexport function getPlacementStyles(options: Options) {\n const { measured, strategy = \"absolute\" } = 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: \"rotate(45deg)\",\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", "import type * as React from \"react\"\n\ntype Dict<T = any> = Record<string, T>\n\ntype Booleanish = boolean | \"true\" | \"false\"\n\ntype Omit<T, K extends keyof T> = { [P in Exclude<keyof T, K>]?: T[P] }\n\ntype WithStyle<T extends { style?: any }> = Omit<T, \"style\"> & {\n style?: T[\"style\"] & {\n [prop: string]: string | number | undefined\n }\n}\n\ntype DataAttr = {\n \"data-uid\"?: string\n \"data-name\"?: string\n \"data-ownedby\"?: string\n \"data-selected\"?: Booleanish\n \"data-expanded\"?: Booleanish\n \"data-highlighted\"?: Booleanish\n \"data-readonly\"?: Booleanish\n \"data-invalid\"?: Booleanish\n \"data-hover\"?: Booleanish\n \"data-active\"?: Booleanish\n \"data-focus\"?: Booleanish\n \"data-disabled\"?: Booleanish\n \"data-type\"?: string\n \"data-value\"?: string | number\n \"data-valuetext\"?: string\n \"data-open\"?: Booleanish\n \"data-placement\"?: string\n \"data-orientation\"?: \"horizontal\" | \"vertical\"\n \"data-label\"?: string\n \"data-checked\"?: Booleanish\n \"data-pressed\"?: Booleanish\n \"data-state\"?: string | null\n \"data-half\"?: Booleanish\n \"data-count\"?: number\n \"data-controls\"?: string\n \"data-part\"?: string\n \"data-index\"?: number\n \"data-complete\"?: Booleanish\n \"data-empty\"?: Booleanish\n \"data-placeholder-shown\"?: Booleanish\n}\n\ntype JSXElementAttributes = DataAttr & React.HTMLAttributes<HTMLElement>\ntype JSXButtonAttributes = DataAttr & React.ButtonHTMLAttributes<HTMLButtonElement>\ntype JSXInputAttributes = DataAttr & React.InputHTMLAttributes<HTMLInputElement>\ntype JSXLabelAttributes = DataAttr & React.LabelHTMLAttributes<HTMLLabelElement>\ntype JSXOutputAttributes = DataAttr & React.OutputHTMLAttributes<HTMLOutputElement>\n\nexport type PropTypes = Record<\"button\" | \"label\" | \"input\" | \"output\" | \"element\", Dict>\n\nexport type ReactPropTypes = {\n button: JSXButtonAttributes\n label: JSXLabelAttributes\n input: JSXInputAttributes\n output: JSXOutputAttributes\n element: JSXElementAttributes\n}\n\nexport type NormalizeProps = {\n button<T extends PropTypes>(props: WithStyle<JSXButtonAttributes>): T[\"button\"]\n label<T extends PropTypes>(props: WithStyle<JSXLabelAttributes>): T[\"label\"]\n input<T extends PropTypes>(props: WithStyle<JSXInputAttributes>): T[\"input\"]\n output<T extends PropTypes>(props: WithStyle<JSXOutputAttributes>): T[\"output\"]\n element<T extends PropTypes>(props: WithStyle<JSXElementAttributes>): T[\"element\"]\n}\n\nexport function createNormalizer(fn: (props: Dict) => Dict): NormalizeProps {\n return { button: fn, label: fn, input: fn, output: fn, element: fn }\n}\n\nexport const normalizeProp = createNormalizer((v) => v)\n", "export type ControlProp =\n | { type: \"boolean\"; label?: string; defaultValue: boolean }\n | { type: \"string\"; label?: string; defaultValue: string; placeholder?: string }\n | { type: \"select\"; options: readonly string[]; defaultValue: string; label?: string }\n | { type: \"multiselect\"; options: readonly string[]; defaultValue: string[]; label?: string }\n | { type: \"number\"; label?: string; defaultValue: number; min?: number; max?: number }\n\nexport type ControlRecord = Record<string, ControlProp>\n\nexport type ControlValue<T extends ControlRecord> = {\n [K in keyof T]: T[K] extends { type: \"boolean\" }\n ? boolean\n : T[K] extends { type: \"string\" }\n ? string\n : T[K] extends { type: \"select\" }\n ? T[K][\"options\"][number]\n : T[K] extends { type: \"multiselect\" }\n ? T[K][\"options\"][number][]\n : T[K] extends { type: \"number\" }\n ? number\n : never\n}\n\nexport function defineControls<T extends ControlRecord>(config: T) {\n return config\n}\n", "import { getScrollParent } from \"@zag-js/dom-utils\"\nimport { MachineContext as Ctx } from \"./tooltip.types\"\n\nexport const dom = {\n getDoc: (ctx: Ctx) => ctx.doc || document,\n getWin: (ctx: Ctx) => ctx.doc?.defaultView || window,\n\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `tooltip-${ctx.id}--trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `tooltip-${ctx.id}--content`,\n getArrowId: (ctx: Ctx) => `tooltip-${ctx.id}--arrow`,\n getPositionerId: (ctx: Ctx) => `tooltip-${ctx.id}--popper`,\n portalId: \"tooltip-portal\",\n\n getTriggerEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getPositionerId(ctx)),\n getArrowEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getArrowId(ctx)),\n getScrollParent: (ctx: Ctx) => getScrollParent(dom.getTriggerEl(ctx)!),\n getPortalEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.portalId),\n\n createPortalEl: (ctx: Ctx) => {\n const portal = dom.getDoc(ctx).createElement(\"tooltip-portal\")\n portal.id = dom.portalId\n return portal\n },\n}\n", "// symbols\nconst OWN_KEYS_SYMBOL = Symbol();\nconst TRACK_MEMO_SYMBOL = Symbol();\nconst GET_ORIGINAL_SYMBOL = Symbol();\n\n// properties\nconst AFFECTED_PROPERTY = 'a';\nconst FROZEN_PROPERTY = 'f';\nconst PROXY_PROPERTY = 'p';\nconst PROXY_CACHE_PROPERTY = 'c';\nconst NEXT_OBJECT_PROPERTY = 'n';\nconst CHANGED_PROPERTY = 'g';\n\n// get object prototype\nconst getProto = Object.getPrototypeOf;\n\nconst objectsToTrack = new WeakMap<object, boolean>();\n\n// check if obj is a plain object or an array\nconst isObjectToTrack = <T>(obj: T): obj is T extends object ? T : never => (\n obj && (objectsToTrack.has(obj as unknown as object)\n ? objectsToTrack.get(obj as unknown as object) as boolean\n : (getProto(obj) === Object.prototype || getProto(obj) === Array.prototype)\n )\n);\n\n// check if it is object\nconst isObject = (x: unknown): x is object => (\n typeof x === 'object' && x !== null\n);\n\n// check if frozen\nconst isFrozen = (obj: object) => (\n Object.isFrozen(obj) || (\n // Object.isFrozen() doesn't detect non-writable properties\n // See: https://github.com/dai-shi/proxy-compare/pull/8\n Object.values(Object.getOwnPropertyDescriptors(obj)).some(\n (descriptor) => !descriptor.writable,\n )\n )\n);\n\n// copy frozen object\nconst unfreeze = (obj: object) => {\n if (Array.isArray(obj)) {\n // Arrays need a special way to copy\n return Array.from(obj);\n }\n // For non-array objects, we create a new object keeping the prototype\n // with changing all configurable options (otherwise, proxies will complain)\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n Object.values(descriptors).forEach((desc) => { desc.configurable = true; });\n return Object.create(getProto(obj), descriptors);\n};\n\ntype Affected = WeakMap<object, Set<string | symbol>>;\ntype ProxyCache<T extends object> = WeakMap<object, ProxyHandler<T>>;\ntype ProxyHandler<T extends object> = {\n [FROZEN_PROPERTY]: boolean;\n [PROXY_PROPERTY]?: T;\n [PROXY_CACHE_PROPERTY]?: ProxyCache<object>;\n [AFFECTED_PROPERTY]?: Affected;\n get(target: T, key: string | symbol): unknown;\n has(target: T, key: string | symbol): boolean;\n getOwnPropertyDescriptor(target: T, key: string | symbol): PropertyDescriptor | undefined;\n ownKeys(target: T): (string | symbol)[];\n set?(target: T, key: string | symbol, value: unknown): boolean;\n deleteProperty?(target: T, key: string | symbol): boolean;\n};\n\nconst createProxyHandler = <T extends object>(origObj: T, frozen: boolean) => {\n let trackObject = false; // for trackMemo\n const recordUsage = (h: ProxyHandler<T>, key: string | symbol, skipWithOwnKeys?: boolean) => {\n if (!trackObject) {\n let used = (h[AFFECTED_PROPERTY] as Affected).get(origObj);\n if (!used) {\n used = new Set();\n (h[AFFECTED_PROPERTY] as Affected).set(origObj, used);\n }\n if (!skipWithOwnKeys || !used.has(OWN_KEYS_SYMBOL)) {\n used.add(key);\n }\n }\n };\n const recordObjectAsUsed = (h: ProxyHandler<T>) => {\n trackObject = true;\n (h[AFFECTED_PROPERTY] as Affected).delete(origObj);\n };\n const handler: ProxyHandler<T> = {\n [FROZEN_PROPERTY]: frozen,\n get(target, key) {\n if (key === GET_ORIGINAL_SYMBOL) {\n return origObj;\n }\n recordUsage(this, key);\n return createProxy(\n (target as any)[key],\n (this[AFFECTED_PROPERTY] as Affected),\n this[PROXY_CACHE_PROPERTY],\n );\n },\n has(target, key) {\n if (key === TRACK_MEMO_SYMBOL) {\n recordObjectAsUsed(this);\n return true;\n }\n // LIMITATION: We simply record the same as `get`.\n // This means { a: {} } and { a: {} } is detected as changed,\n // if `'a' in obj` is handled.\n recordUsage(this, key);\n return key in target;\n },\n getOwnPropertyDescriptor(target, key) {\n // LIMITATION: We simply record the same as `get`.\n // This means { a: {} } and { a: {} } is detected as changed,\n // if `obj.getOwnPropertyDescriptor('a'))` is handled.\n recordUsage(this, key, true);\n return Object.getOwnPropertyDescriptor(target, key);\n },\n ownKeys(target) {\n recordUsage(this, OWN_KEYS_SYMBOL);\n return Reflect.ownKeys(target);\n },\n };\n if (frozen) {\n handler.set = handler.deleteProperty = () => false;\n }\n return handler;\n};\n\n/**\n * Create a proxy.\n *\n * This function will create a proxy at top level and proxy nested objects as you access them,\n * in order to keep track of which properties were accessed via get/has proxy handlers:\n *\n * NOTE: Printing of WeakMap is hard to inspect and not very readable\n * for this purpose you can use the `affectedToPathList` helper.\n *\n * @param {object} obj - Object that will be wrapped on the proxy.\n * @param {WeakMap<object, unknown>} affected -\n * WeakMap that will hold the tracking of which properties in the proxied object were accessed.\n * @param {WeakMap<object, unknown>} [proxyCache] -\n * WeakMap that will help keep referential identity for proxies.\n * @returns {Proxy<object>} - Object wrapped in a proxy.\n *\n * @example\n * import { createProxy } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n * const proxy = createProxy(original, affected);\n *\n * proxy.a // Will mark as used and track its value.\n * // This will update the affected WeakMap with original as key\n * // and a Set with \"a\"\n *\n * proxy.d // Will mark \"d\" as accessed to track and proxy itself ({ e: \"3\" }).\n * // This will update the affected WeakMap with original as key\n * // and a Set with \"d\"\n */\nexport const createProxy = <T>(\n obj: T,\n affected: WeakMap<object, unknown>,\n proxyCache?: WeakMap<object, unknown>,\n): T => {\n if (!isObjectToTrack(obj)) return obj;\n const origObj = (\n obj as { [GET_ORIGINAL_SYMBOL]?: typeof obj }\n )[GET_ORIGINAL_SYMBOL]; // unwrap proxy\n const target = origObj || obj;\n const frozen = isFrozen(target);\n let proxyHandler: ProxyHandler<typeof target> | undefined = (\n proxyCache && (proxyCache as ProxyCache<typeof target>).get(target)\n );\n if (!proxyHandler || proxyHandler[FROZEN_PROPERTY] !== frozen) {\n proxyHandler = createProxyHandler<T extends object ? T : never>(target, frozen);\n proxyHandler[PROXY_PROPERTY] = new Proxy(\n frozen ? unfreeze(target) : target,\n proxyHandler,\n ) as typeof target;\n if (proxyCache) {\n proxyCache.set(target, proxyHandler);\n }\n }\n proxyHandler[AFFECTED_PROPERTY] = affected as Affected;\n proxyHandler[PROXY_CACHE_PROPERTY] = proxyCache as ProxyCache<object> | undefined;\n return proxyHandler[PROXY_PROPERTY] as typeof target;\n};\n\nconst isOwnKeysChanged = (origObj: object, nextObj: object) => {\n const origKeys = Reflect.ownKeys(origObj);\n const nextKeys = Reflect.ownKeys(nextObj);\n return origKeys.length !== nextKeys.length\n || origKeys.some((k, i) => k !== nextKeys[i]);\n};\n\ntype ChangedCache = WeakMap<object, {\n [NEXT_OBJECT_PROPERTY]: object;\n [CHANGED_PROPERTY]: boolean;\n}>;\n\n/**\n * Compare changes on objects.\n *\n * This will compare the affected properties on tracked objects inside the proxy\n * to check if there were any changes made to it,\n * by default if no property was accessed on the proxy it will attempt to do a\n * reference equality check for the objects provided (Object.is(a, b)). If you access a property\n * on the proxy, then isChanged will only compare the affected properties.\n *\n * @param {object} origObj - The original object to compare.\n * @param {object} nextObj - Object to compare with the original one.\n * @param {WeakMap<object, unknown>} affected -\n * WeakMap that holds the tracking of which properties in the proxied object were accessed.\n * @param {WeakMap<object, unknown>} [cache] -\n * WeakMap that holds a cache of the comparisons for better performance with repetitive comparisons,\n * and to avoid infinite loop with circular structures.\n * @returns {boolean} - Boolean indicating if the affected property on the object has changed.\n *\n * @example\n * import { createProxy, isChanged } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n *\n * proxy.a\n *\n * isChanged(original, { a: \"1\" }, affected) // false\n *\n * proxy.a = \"2\"\n *\n * isChanged(original, { a: \"1\" }, affected) // true\n */\n\nexport const isChanged = (\n origObj: unknown,\n nextObj: unknown,\n affected: WeakMap<object, unknown>,\n cache?: WeakMap<object, unknown>,\n): boolean => {\n if (Object.is(origObj, nextObj)) {\n return false;\n }\n if (!isObject(origObj) || !isObject(nextObj)) return true;\n const used = (affected as Affected).get(origObj);\n if (!used) return true;\n if (cache) {\n const hit = (cache as ChangedCache).get(origObj);\n if (hit && hit[NEXT_OBJECT_PROPERTY] === nextObj) {\n return hit[CHANGED_PROPERTY];\n }\n // for object with cycles\n (cache as ChangedCache).set(origObj, {\n [NEXT_OBJECT_PROPERTY]: nextObj,\n [CHANGED_PROPERTY]: false,\n });\n }\n let changed: boolean | null = null;\n // eslint-disable-next-line no-restricted-syntax\n for (const key of used) {\n const c = key === OWN_KEYS_SYMBOL ? isOwnKeysChanged(origObj, nextObj)\n : isChanged(\n (origObj as any)[key],\n (nextObj as any)[key],\n affected,\n cache,\n );\n if (c === true || c === false) changed = c;\n if (changed) break;\n }\n if (changed === null) changed = true;\n if (cache) {\n cache.set(origObj, {\n [NEXT_OBJECT_PROPERTY]: nextObj,\n [CHANGED_PROPERTY]: changed,\n });\n }\n return changed;\n};\n\n// explicitly track object with memo\nexport const trackMemo = (obj: unknown) => {\n if (isObjectToTrack(obj)) {\n return TRACK_MEMO_SYMBOL in obj;\n }\n return false;\n};\n\n/**\n * Unwrap proxy to get the original object.\n *\n * Used to retrieve the original object used to create the proxy instance with `createProxy`.\n *\n * @param {Proxy<object>} obj - The proxy wrapper of the originial object.\n * @returns {object | null} - Return either the unwrapped object if exists.\n *\n * @example\n * import { createProxy, getUntracked } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n * const originalFromProxy = getUntracked(proxy)\n *\n * Obejct.is(original, originalFromProxy) // true\n * isChanged(original, originalFromProxy, affected) // false\n */\nexport const getUntracked = <T>(obj: T): T | null => {\n if (isObjectToTrack(obj)) {\n return (obj as { [GET_ORIGINAL_SYMBOL]?: T })[GET_ORIGINAL_SYMBOL] || null;\n }\n return null;\n};\n\n/**\n * Mark object to be tracked.\n *\n * This function marks an object that will be passed into `createProxy`\n * as marked to track or not. By default only Array and Object are marked to track,\n * so this is useful for example to mark a class instance to track or to mark a object\n * to be untracked when creating your proxy.\n *\n * @param {object} obj - Object to mark as tracked or not.\n * @param {mark} boolean - Boolean indicating whether you want to track this object or not.\n * @returns {undefined} - No return.\n *\n * @example\n * import { createProxy, markToTrack, isChanged } from 'proxy-compare';\n *\n * const nested = { e: \"3\" }\n *\n * markToTrack(nested, false)\n *\n * const original = { a: \"1\", c: \"2\", d: nested };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n *\n * proxy.d.e\n *\n * isChanged(original, { d: { e: \"3\" } }, affected) // true\n */\nexport const markToTrack = (obj: object, mark = true) => {\n objectsToTrack.set(obj, mark);\n};\n\n// convert affected to path list\nexport const affectedToPathList = (\n obj: unknown,\n affected: WeakMap<object, unknown>,\n) => {\n const list: (string | symbol)[][] = [];\n const seen = new WeakSet();\n const walk = (x: unknown, path?: (string | symbol)[]) => {\n if (seen.has(x as object)) {\n // for object with cycles\n return;\n }\n if (isObject(x)) {\n seen.add(x);\n }\n const used = (affected as Affected).get(x as object);\n if (used) {\n used.forEach((key) => {\n walk((x as any)[key], path ? [...path, key] : [key]);\n });\n } else if (path) {\n list.push(path);\n }\n };\n walk(obj);\n return list;\n};\n", "import { getUntracked, markToTrack } from 'proxy-compare';\n\nconst VERSION = Symbol();\nconst LISTENERS = Symbol();\nconst SNAPSHOT = Symbol();\nconst HANDLER = Symbol();\nconst PROMISE_RESULT = Symbol();\nconst PROMISE_ERROR = Symbol();\nconst refSet = /* @__PURE__ */ new WeakSet();\nfunction ref(o) {\n refSet.add(o);\n return o;\n}\nconst isObject = (x) => typeof x === \"object\" && x !== null;\nconst canProxy = (x) => isObject(x) && !refSet.has(x) && (Array.isArray(x) || !(Symbol.iterator in x)) && !(x instanceof WeakMap) && !(x instanceof WeakSet) && !(x instanceof Error) && !(x instanceof Number) && !(x instanceof Date) && !(x instanceof String) && !(x instanceof RegExp) && !(x instanceof ArrayBuffer);\nconst proxyCache = /* @__PURE__ */ new WeakMap();\nlet globalVersion = 1;\nconst snapshotCache = /* @__PURE__ */ new WeakMap();\nfunction proxy(initialObject = {}) {\n if (!isObject(initialObject)) {\n throw new Error(\"object required\");\n }\n const found = proxyCache.get(initialObject);\n if (found) {\n return found;\n }\n let version = globalVersion;\n const listeners = /* @__PURE__ */ new Set();\n const notifyUpdate = (op, nextVersion = ++globalVersion) => {\n if (version !== nextVersion) {\n version = nextVersion;\n listeners.forEach((listener) => listener(op, nextVersion));\n }\n };\n const propListeners = /* @__PURE__ */ new Map();\n const getPropListener = (prop) => {\n let propListener = propListeners.get(prop);\n if (!propListener) {\n propListener = (op, nextVersion) => {\n const newOp = [...op];\n newOp[1] = [prop, ...newOp[1]];\n notifyUpdate(newOp, nextVersion);\n };\n propListeners.set(prop, propListener);\n }\n return propListener;\n };\n const popPropListener = (prop) => {\n const propListener = propListeners.get(prop);\n propListeners.delete(prop);\n return propListener;\n };\n const createSnapshot = (target, receiver) => {\n const cache = snapshotCache.get(receiver);\n if ((cache == null ? void 0 : cache[0]) === version) {\n return cache[1];\n }\n const snapshot2 = Array.isArray(target) ? [] : Object.create(Object.getPrototypeOf(target));\n markToTrack(snapshot2, true);\n snapshotCache.set(receiver, [version, snapshot2]);\n Reflect.ownKeys(target).forEach((key) => {\n const value = Reflect.get(target, key, receiver);\n if (refSet.has(value)) {\n markToTrack(value, false);\n snapshot2[key] = value;\n } else if (value instanceof Promise) {\n if (PROMISE_RESULT in value) {\n snapshot2[key] = value[PROMISE_RESULT];\n } else {\n const errorOrPromise = value[PROMISE_ERROR] || value;\n Object.defineProperty(snapshot2, key, {\n get() {\n if (PROMISE_RESULT in value) {\n return value[PROMISE_RESULT];\n }\n throw errorOrPromise;\n }\n });\n }\n } else if (value == null ? void 0 : value[LISTENERS]) {\n snapshot2[key] = value[SNAPSHOT];\n } else {\n snapshot2[key] = value;\n }\n });\n Object.freeze(snapshot2);\n return snapshot2;\n };\n const baseObject = Array.isArray(initialObject) ? [] : Object.create(Object.getPrototypeOf(initialObject));\n const handler = {\n get(target, prop, receiver) {\n if (prop === VERSION) {\n return version;\n }\n if (prop === LISTENERS) {\n return listeners;\n }\n if (prop === SNAPSHOT) {\n return createSnapshot(target, receiver);\n }\n if (prop === HANDLER) {\n return handler;\n }\n return Reflect.get(target, prop, receiver);\n },\n deleteProperty(target, prop) {\n const prevValue = Reflect.get(target, prop);\n const childListeners = prevValue == null ? void 0 : prevValue[LISTENERS];\n if (childListeners) {\n childListeners.delete(popPropListener(prop));\n }\n const deleted = Reflect.deleteProperty(target, prop);\n if (deleted) {\n notifyUpdate([\"delete\", [prop], prevValue]);\n }\n return deleted;\n },\n is: Object.is,\n canProxy,\n set(target, prop, value, receiver) {\n var _a;\n const prevValue = Reflect.get(target, prop, receiver);\n if (this.is(prevValue, value)) {\n return true;\n }\n const childListeners = prevValue == null ? void 0 : prevValue[LISTENERS];\n if (childListeners) {\n childListeners.delete(popPropListener(prop));\n }\n if (isObject(value)) {\n value = getUntracked(value) || value;\n }\n let nextValue;\n if ((_a = Object.getOwnPropertyDescriptor(target, prop)) == null ? void 0 : _a.set) {\n nextValue = value;\n } else if (value instanceof Promise) {\n nextValue = value.then((v) => {\n nextValue[PROMISE_RESULT] = v;\n notifyUpdate([\"resolve\", [prop], v]);\n return v;\n }).catch((e) => {\n nextValue[PROMISE_ERROR] = e;\n notifyUpdate([\"reject\", [prop], e]);\n });\n } else if (value == null ? void 0 : value[LISTENERS]) {\n nextValue = value;\n nextValue[LISTENERS].add(getPropListener(prop));\n } else if (this.canProxy(value)) {\n nextValue = proxy(value);\n nextValue[LISTENERS].add(getPropListener(prop));\n } else {\n nextValue = value;\n }\n Reflect.set(target, prop, nextValue, receiver);\n notifyUpdate([\"set\", [prop], value, prevValue]);\n return true;\n }\n };\n const proxyObject = new Proxy(baseObject, handler);\n proxyCache.set(initialObject, proxyObject);\n Reflect.ownKeys(initialObject).forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(initialObject, key);\n if (desc.get || desc.set) {\n Object.defineProperty(baseObject, key, desc);\n } else {\n proxyObject[key] = initialObject[key];\n }\n });\n return proxyObject;\n}\nfunction getVersion(proxyObject) {\n return isObject(proxyObject) ? proxyObject[VERSION] : void 0;\n}\nfunction subscribe(proxyObject, callback, notifyInSync) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(proxyObject == null ? void 0 : proxyObject[LISTENERS])) {\n console.warn(\"Please use proxy object\");\n }\n let promise;\n const ops = [];\n const listener = (op) => {\n ops.push(op);\n if (notifyInSync) {\n callback(ops.splice(0));\n return;\n }\n if (!promise) {\n promise = Promise.resolve().then(() => {\n promise = void 0;\n callback(ops.splice(0));\n });\n }\n };\n proxyObject[LISTENERS].add(listener);\n return () => {\n proxyObject[LISTENERS].delete(listener);\n };\n}\nfunction snapshot(proxyObject) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(proxyObject == null ? void 0 : proxyObject[SNAPSHOT])) {\n console.warn(\"Please use proxy object\");\n }\n return proxyObject[SNAPSHOT];\n}\nfunction getHandler(proxyObject) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(proxyObject == null ? void 0 : proxyObject[HANDLER])) {\n console.warn(\"Please use proxy object\");\n }\n return proxyObject[HANDLER];\n}\n\nexport { getHandler, getVersion, proxy, ref, snapshot, subscribe };\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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 { isObject, isString } from \"@zag-js/utils\"\nimport { Dict, StateMachine as S } from \"./types\"\n\nexport function choose<TContext, TState extends S.StateSchema, TEvent extends S.EventObject = S.AnyEventObject>(\n actions: Array<{ guard?: S.Guard<TContext, TEvent>; actions: S.PureActions<TContext, TState, TEvent> }>,\n): S.ChooseHelper<TContext, TState, TEvent> {\n return {\n predicate: (guardMap: Dict) => (ctx: TContext, event: TEvent) =>\n actions.find((def) => {\n def.guard = def.guard || (() => true)\n if (isString(def.guard)) {\n return !!guardMap[def.guard]?.(ctx, event)\n }\n\n if (isGuardHelper(def.guard)) {\n return def.guard.predicate(guardMap ?? {})(ctx, event)\n }\n\n return def.guard(ctx, event)\n })?.actions,\n }\n}\n\nfunction isGuardHelper(value: any): value is { predicate: Function } {\n return isObject(value) && value.predicate != null\n}\n\nexport function determineActionsFn<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n values: S.Actions<TContext, TState, TEvent> | undefined,\n guardMap: S.GuardMap<TContext, TEvent> | undefined,\n) {\n return (context: TContext, event: TEvent) => {\n if (isGuardHelper(values)) return values.predicate(guardMap ?? {})(context, event)\n return values\n }\n}\n", "import { isFunction, isObject, isString } from \"@zag-js/utils\"\nimport { Dict, StateMachine as S } from \"./types\"\n\nfunction or<TContext, TEvent extends S.EventObject>(\n ...conditions: Array<string | S.GuardHelper<TContext, TEvent> | S.GuardExpression<TContext, TEvent>>\n): S.GuardHelper<TContext, TEvent> {\n return {\n predicate: (guards: Dict) => (ctx: TContext, event: TEvent) =>\n conditions\n .map((condition) => {\n if (isString(condition)) {\n return !!guards[condition]?.(ctx, event)\n }\n if (isFunction(condition)) {\n return condition(ctx, event)\n }\n return condition.predicate(guards)(ctx, event)\n })\n .some(Boolean),\n }\n}\n\nfunction and<TContext, TEvent extends S.EventObject>(\n ...conditions: Array<string | S.GuardHelper<TContext, TEvent> | S.GuardExpression<TContext, TEvent>>\n): S.GuardHelper<TContext, TEvent> {\n return {\n predicate: (guards: Dict) => (ctx: TContext, event: TEvent) =>\n conditions\n .map((condition) => {\n if (isString(condition)) {\n return !!guards[condition]?.(ctx, event)\n }\n if (isFunction(condition)) {\n return condition(ctx, event)\n }\n return condition.predicate(guards)(ctx, event)\n })\n .every(Boolean),\n }\n}\n\nfunction not<TContext, TEvent extends S.EventObject>(\n condition: string | S.GuardHelper<TContext, TEvent> | S.GuardExpression<TContext, TEvent>,\n): S.GuardHelper<TContext, TEvent> {\n return {\n predicate: (guardMap: Dict) => (ctx: TContext, event: TEvent) => {\n if (isString(condition)) {\n return !guardMap[condition]?.(ctx, event)\n }\n if (isFunction(condition)) {\n return !condition(ctx, event)\n }\n return !condition.predicate(guardMap)(ctx, event)\n },\n }\n}\n\nexport const guards = { or, and, not }\n\nexport function isGuardHelper(value: unknown): value is { predicate: Function } {\n return isObject(value) && value.predicate != null\n}\n\nexport const TruthyGuard = () => true\n\n/**\n * Guards or conditions can be specified as:\n * - a string (reference to `options.guards`)\n * - a function that returns a number (in ms)\n */\nexport function determineGuardFn<TContext, TEvent extends S.EventObject>(\n guard: S.Guard<TContext, TEvent> | undefined,\n guardMap: S.GuardMap<TContext, TEvent> | undefined,\n) {\n guard = guard ?? TruthyGuard\n return (context: TContext, event: TEvent) => {\n if (isString(guard)) {\n const value = guardMap?.[guard]\n return isFunction(value) ? value(context, event) : value\n }\n\n if (isGuardHelper(guard)) {\n return guard.predicate(guardMap ?? {})(context, event)\n }\n\n return guard?.(context, event)\n }\n}\n", "export function klona(val) {\n\tvar k, out, tmp;\n\n\tif (Array.isArray(val)) {\n\t\tout = Array(k=val.length);\n\t\twhile (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\treturn out;\n\t}\n\n\tif (Object.prototype.toString.call(val) === '[object Object]') {\n\t\tout = {}; // null\n\t\tfor (k in val) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tvalue: klona(val[k]),\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tout[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn val;\n}\n", "import { subscribe, snapshot, proxy, getVersion, ref } from 'valtio/vanilla';\nimport { createProxy, isChanged } from 'proxy-compare';\n\nfunction subscribeKey(proxyObject, key, callback, notifyInSync) {\n return subscribe(proxyObject, (ops) => {\n if (ops.some((op) => op[1][0] === key)) {\n callback(proxyObject[key]);\n }\n }, notifyInSync);\n}\n\nlet currentCleanups;\nfunction watch(callback, options) {\n let alive = true;\n const cleanups = /* @__PURE__ */ new Set();\n const subscriptions = /* @__PURE__ */ new Map();\n const cleanup = () => {\n if (alive) {\n alive = false;\n cleanups.forEach((clean) => clean());\n cleanups.clear();\n subscriptions.forEach((unsubscribe) => unsubscribe());\n subscriptions.clear();\n }\n };\n const revalidate = () => {\n if (!alive) {\n return;\n }\n cleanups.forEach((clean) => clean());\n cleanups.clear();\n const proxiesToSubscribe = /* @__PURE__ */ new Set();\n const parent = currentCleanups;\n currentCleanups = cleanups;\n try {\n const cleanupReturn = callback((proxyObject) => {\n proxiesToSubscribe.add(proxyObject);\n return proxyObject;\n });\n if (cleanupReturn) {\n cleanups.add(cleanupReturn);\n }\n } finally {\n currentCleanups = parent;\n }\n subscriptions.forEach((unsubscribe, proxyObject) => {\n if (proxiesToSubscribe.has(proxyObject)) {\n proxiesToSubscribe.delete(proxyObject);\n } else {\n subscriptions.delete(proxyObject);\n unsubscribe();\n }\n });\n proxiesToSubscribe.forEach((proxyObject) => {\n const unsubscribe = subscribe(proxyObject, revalidate, options == null ? void 0 : options.sync);\n subscriptions.set(proxyObject, unsubscribe);\n });\n };\n if (currentCleanups) {\n currentCleanups.add(cleanup);\n }\n revalidate();\n return cleanup;\n}\n\nconst DEVTOOLS = Symbol();\nfunction devtools(proxyObject, options) {\n if (typeof options === \"string\") {\n console.warn(\"[Deprecated] Please use option object instead of name string\");\n options = { name: options };\n }\n const { enabled, name = \"\" } = options || {};\n let extension;\n try {\n extension = (enabled != null ? enabled : (import.meta.env && import.meta.env.MODE) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch {\n }\n if (!extension) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && enabled) {\n console.warn(\"[Warning] Please install/enable Redux devtools extension\");\n }\n return;\n }\n let isTimeTraveling = false;\n const devtools2 = extension.connect({ name });\n const unsub1 = subscribe(proxyObject, (ops) => {\n const action = ops.filter(([_, path]) => path[0] !== DEVTOOLS).map(([op, path]) => `${op}:${path.map(String).join(\".\")}`).join(\", \");\n if (!action) {\n return;\n }\n if (isTimeTraveling) {\n isTimeTraveling = false;\n } else {\n const snapWithoutDevtools = Object.assign({}, snapshot(proxyObject));\n delete snapWithoutDevtools[DEVTOOLS];\n devtools2.send({\n type: action,\n updatedAt: new Date().toLocaleString()\n }, snapWithoutDevtools);\n }\n });\n const unsub2 = devtools2.subscribe((message) => {\n var _a, _b, _c, _d, _e, _f;\n if (message.type === \"ACTION\" && message.payload) {\n try {\n Object.assign(proxyObject, JSON.parse(message.payload));\n } catch (e) {\n console.error(\"please dispatch a serializable value that JSON.parse() and proxy() support\\n\", e);\n }\n }\n if (message.type === \"DISPATCH\" && message.state) {\n if (((_a = message.payload) == null ? void 0 : _a.type) === \"JUMP_TO_ACTION\" || ((_b = message.payload) == null ? void 0 : _b.type) === \"JUMP_TO_STATE\") {\n isTimeTraveling = true;\n const state = JSON.parse(message.state);\n Object.assign(proxyObject, state);\n }\n proxyObject[DEVTOOLS] = message;\n } else if (message.type === \"DISPATCH\" && ((_c = message.payload) == null ? void 0 : _c.type) === \"COMMIT\") {\n devtools2.init(snapshot(proxyObject));\n } else if (message.type === \"DISPATCH\" && ((_d = message.payload) == null ? void 0 : _d.type) === \"IMPORT_STATE\") {\n const actions = (_e = message.payload.nextLiftedState) == null ? void 0 : _e.actionsById;\n const computedStates = ((_f = message.payload.nextLiftedState) == null ? void 0 : _f.computedStates) || [];\n isTimeTraveling = true;\n computedStates.forEach(({ state }, index) => {\n const action = actions[index] || \"No action found\";\n Object.assign(proxyObject, state);\n if (index === 0) {\n devtools2.init(snapshot(proxyObject));\n } else {\n devtools2.send(action, snapshot(proxyObject));\n }\n });\n }\n });\n devtools2.init(snapshot(proxyObject));\n return () => {\n unsub1();\n unsub2 == null ? void 0 : unsub2();\n };\n}\n\nconst sourceObjectMap = /* @__PURE__ */ new WeakMap();\nconst derivedObjectMap = /* @__PURE__ */ new WeakMap();\nconst markPending = (sourceObject, callback) => {\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry) {\n sourceObjectEntry[0].forEach((subscription) => {\n const { d: derivedObject } = subscription;\n if (sourceObject !== derivedObject) {\n markPending(derivedObject);\n }\n });\n ++sourceObjectEntry[2];\n if (callback) {\n sourceObjectEntry[3].add(callback);\n }\n }\n};\nconst checkPending = (sourceObject, callback) => {\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry == null ? void 0 : sourceObjectEntry[2]) {\n sourceObjectEntry[3].add(callback);\n return true;\n }\n return false;\n};\nconst unmarkPending = (sourceObject) => {\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry) {\n --sourceObjectEntry[2];\n if (!sourceObjectEntry[2]) {\n sourceObjectEntry[3].forEach((callback) => callback());\n sourceObjectEntry[3].clear();\n }\n sourceObjectEntry[0].forEach((subscription) => {\n const { d: derivedObject } = subscription;\n if (sourceObject !== derivedObject) {\n unmarkPending(derivedObject);\n }\n });\n }\n};\nconst addSubscription = (subscription) => {\n const { s: sourceObject, d: derivedObject } = subscription;\n let derivedObjectEntry = derivedObjectMap.get(derivedObject);\n if (!derivedObjectEntry) {\n derivedObjectEntry = [/* @__PURE__ */ new Set()];\n derivedObjectMap.set(subscription.d, derivedObjectEntry);\n }\n derivedObjectEntry[0].add(subscription);\n let sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (!sourceObjectEntry) {\n const subscriptions = /* @__PURE__ */ new Set();\n const unsubscribe = subscribe(sourceObject, (ops) => {\n subscriptions.forEach((subscription2) => {\n const {\n d: derivedObject2,\n c: callback,\n n: notifyInSync,\n i: ignoreKeys\n } = subscription2;\n if (sourceObject === derivedObject2 && ops.every((op) => op[1].length === 1 && ignoreKeys.includes(op[1][0]))) {\n return;\n }\n if (subscription2.p) {\n return;\n }\n markPending(sourceObject, callback);\n if (notifyInSync) {\n unmarkPending(sourceObject);\n } else {\n subscription2.p = Promise.resolve().then(() => {\n delete subscription2.p;\n unmarkPending(sourceObject);\n });\n }\n });\n }, true);\n sourceObjectEntry = [subscriptions, unsubscribe, 0, /* @__PURE__ */ new Set()];\n sourceObjectMap.set(sourceObject, sourceObjectEntry);\n }\n sourceObjectEntry[0].add(subscription);\n};\nconst removeSubscription = (subscription) => {\n const { s: sourceObject, d: derivedObject } = subscription;\n const derivedObjectEntry = derivedObjectMap.get(derivedObject);\n derivedObjectEntry == null ? void 0 : derivedObjectEntry[0].delete(subscription);\n if ((derivedObjectEntry == null ? void 0 : derivedObjectEntry[0].size) === 0) {\n derivedObjectMap.delete(derivedObject);\n }\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry) {\n const [subscriptions, unsubscribe] = sourceObjectEntry;\n subscriptions.delete(subscription);\n if (!subscriptions.size) {\n unsubscribe();\n sourceObjectMap.delete(sourceObject);\n }\n }\n};\nconst listSubscriptions = (derivedObject) => {\n const derivedObjectEntry = derivedObjectMap.get(derivedObject);\n if (derivedObjectEntry) {\n return Array.from(derivedObjectEntry[0]);\n }\n return [];\n};\nconst unstable_deriveSubscriptions = {\n add: addSubscription,\n remove: removeSubscription,\n list: listSubscriptions\n};\nfunction derive(derivedFns, options) {\n const proxyObject = (options == null ? void 0 : options.proxy) || proxy({});\n const notifyInSync = !!(options == null ? void 0 : options.sync);\n const derivedKeys = Object.keys(derivedFns);\n derivedKeys.forEach((key) => {\n if (Object.getOwnPropertyDescriptor(proxyObject, key)) {\n throw new Error(\"object property already defined\");\n }\n const fn = derivedFns[key];\n let lastDependencies = null;\n const evaluate = () => {\n if (lastDependencies) {\n if (Array.from(lastDependencies).map(([p]) => checkPending(p, evaluate)).some((isPending) => isPending)) {\n return;\n }\n if (Array.from(lastDependencies).every(([p, entry]) => getVersion(p) === entry.v)) {\n return;\n }\n }\n const dependencies = /* @__PURE__ */ new Map();\n const get = (p) => {\n dependencies.set(p, { v: getVersion(p) });\n return p;\n };\n const value = fn(get);\n const subscribeToDependencies = () => {\n dependencies.forEach((entry, p) => {\n var _a;\n const lastSubscription = (_a = lastDependencies == null ? void 0 : lastDependencies.get(p)) == null ? void 0 : _a.s;\n if (lastSubscription) {\n entry.s = lastSubscription;\n } else {\n const subscription = {\n s: p,\n d: proxyObject,\n k: key,\n c: evaluate,\n n: notifyInSync,\n i: derivedKeys\n };\n addSubscription(subscription);\n entry.s = subscription;\n }\n });\n lastDependencies == null ? void 0 : lastDependencies.forEach((entry, p) => {\n if (!dependencies.has(p) && entry.s) {\n removeSubscription(entry.s);\n }\n });\n lastDependencies = dependencies;\n };\n if (value instanceof Promise) {\n value.finally(subscribeToDependencies);\n } else {\n subscribeToDependencies();\n }\n proxyObject[key] = value;\n };\n evaluate();\n });\n return proxyObject;\n}\nfunction underive(proxyObject, options) {\n const keysToDelete = (options == null ? void 0 : options.delete) ? /* @__PURE__ */ new Set() : null;\n listSubscriptions(proxyObject).forEach((subscription) => {\n const { k: key } = subscription;\n if (!(options == null ? void 0 : options.keys) || options.keys.includes(key)) {\n removeSubscription(subscription);\n if (keysToDelete) {\n keysToDelete.add(key);\n }\n }\n });\n if (keysToDelete) {\n keysToDelete.forEach((key) => {\n delete proxyObject[key];\n });\n }\n}\n\nfunction addComputed_DEPRECATED(proxyObject, computedFns_FAKE, targetObject = proxyObject) {\n console.warn(\"addComputed is deprecated. Please consider using `derive` or `proxyWithComputed` instead. Falling back to emulation with derive.\");\n const derivedFns = {};\n Object.keys(computedFns_FAKE).forEach((key) => {\n derivedFns[key] = (get) => computedFns_FAKE[key](get(proxyObject));\n });\n return derive(derivedFns, { proxy: targetObject });\n}\n\nfunction proxyWithComputed(initialObject, computedFns) {\n Object.keys(computedFns).forEach((key) => {\n if (Object.getOwnPropertyDescriptor(initialObject, key)) {\n throw new Error(\"object property already defined\");\n }\n const computedFn = computedFns[key];\n const { get, set } = typeof computedFn === \"function\" ? { get: computedFn } : computedFn;\n let computedValue;\n let prevSnapshot;\n let affected = /* @__PURE__ */ new WeakMap();\n const desc = {};\n desc.get = () => {\n const nextSnapshot = snapshot(proxyObject);\n if (!prevSnapshot || isChanged(prevSnapshot, nextSnapshot, affected)) {\n affected = /* @__PURE__ */ new WeakMap();\n computedValue = get(createProxy(nextSnapshot, affected));\n prevSnapshot = nextSnapshot;\n }\n return computedValue;\n };\n if (set) {\n desc.set = (newValue) => set(proxyObject, newValue);\n }\n Object.defineProperty(initialObject, key, desc);\n });\n const proxyObject = proxy(initialObject);\n return proxyObject;\n}\n\nfunction proxyWithHistory(initialValue, skipSubscribe = false) {\n const proxyObject = proxy({\n value: initialValue,\n history: ref({\n wip: initialValue,\n snapshots: [],\n index: -1\n }),\n canUndo: () => proxyObject.history.index > 0,\n undo: () => {\n if (proxyObject.canUndo()) {\n proxyObject.value = proxyObject.history.wip = proxyObject.history.snapshots[--proxyObject.history.index];\n proxyObject.history.snapshots[proxyObject.history.index] = snapshot(proxyObject).value;\n }\n },\n canRedo: () => proxyObject.history.index < proxyObject.history.snapshots.length - 1,\n redo: () => {\n if (proxyObject.canRedo()) {\n proxyObject.value = proxyObject.history.wip = proxyObject.history.snapshots[++proxyObject.history.index];\n proxyObject.history.snapshots[proxyObject.history.index] = snapshot(proxyObject).value;\n }\n },\n saveHistory: () => {\n proxyObject.history.snapshots.splice(proxyObject.history.index + 1);\n proxyObject.history.snapshots.push(snapshot(proxyObject).value);\n ++proxyObject.history.index;\n },\n subscribe: () => subscribe(proxyObject, (ops) => {\n if (ops.every((op) => op[1][0] === \"value\" && (op[0] !== \"set\" || op[2] !== proxyObject.history.wip))) {\n proxyObject.saveHistory();\n }\n })\n });\n proxyObject.saveHistory();\n if (!skipSubscribe) {\n proxyObject.subscribe();\n }\n return proxyObject;\n}\n\nfunction proxySet(initialValues) {\n const set = proxy({\n data: Array.from(new Set(initialValues)),\n has(value) {\n return this.data.indexOf(value) !== -1;\n },\n add(value) {\n let hasProxy = false;\n if (typeof value === \"object\" && value !== null) {\n hasProxy = this.data.indexOf(proxy(value)) !== -1;\n }\n if (this.data.indexOf(value) === -1 && !hasProxy) {\n this.data.push(value);\n }\n return this;\n },\n delete(value) {\n const index = this.data.indexOf(value);\n if (index === -1) {\n return false;\n }\n this.data.splice(index, 1);\n return true;\n },\n clear() {\n this.data.splice(0);\n },\n get size() {\n return this.data.length;\n },\n forEach(cb) {\n this.data.forEach((value) => {\n cb(value, value, this);\n });\n },\n get [Symbol.toStringTag]() {\n return \"Set\";\n },\n toJSON() {\n return {};\n },\n [Symbol.iterator]() {\n return this.data[Symbol.iterator]();\n },\n values() {\n return this.data.values();\n },\n keys() {\n return this.data.values();\n },\n entries() {\n return new Set(this.data).entries();\n }\n });\n Object.defineProperties(set, {\n data: {\n enumerable: false\n },\n size: {\n enumerable: false\n },\n toJSON: {\n enumerable: false\n }\n });\n Object.seal(set);\n return set;\n}\n\nfunction proxyMap(entries) {\n const map = proxy({\n data: Array.from(entries || []),\n has(key) {\n return this.data.some((p) => p[0] === key);\n },\n set(key, value) {\n const record = this.data.find((p) => p[0] === key);\n if (record) {\n record[1] = value;\n } else {\n this.data.push([key, value]);\n }\n return this;\n },\n get(key) {\n var _a;\n return (_a = this.data.find((p) => p[0] === key)) == null ? void 0 : _a[1];\n },\n delete(key) {\n const index = this.data.findIndex((p) => p[0] === key);\n if (index === -1) {\n return false;\n }\n this.data.splice(index, 1);\n return true;\n },\n clear() {\n this.data.splice(0);\n },\n get size() {\n return this.data.length;\n },\n toJSON() {\n return {};\n },\n forEach(cb) {\n this.data.forEach((p) => {\n cb(p[1], p[0], this);\n });\n },\n keys() {\n return this.data.map((p) => p[0]).values();\n },\n values() {\n return this.data.map((p) => p[1]).values();\n },\n entries() {\n return new Map(this.data).entries();\n },\n get [Symbol.toStringTag]() {\n return \"Map\";\n },\n [Symbol.iterator]() {\n return this.entries();\n }\n });\n Object.defineProperties(map, {\n data: {\n enumerable: false\n },\n size: {\n enumerable: false\n },\n toJSON: {\n enumerable: false\n }\n });\n Object.seal(map);\n return map;\n}\n\nexport { addComputed_DEPRECATED as addComputed, derive, devtools, proxyMap, proxySet, proxyWithComputed, proxyWithHistory, subscribeKey, underive, unstable_deriveSubscriptions, watch };\n", "import { proxy } from \"valtio/vanilla\"\nimport { cast } from \"@zag-js/utils\"\nimport { ActionTypes, Dict, StateMachine as S } from \"./types\"\n\nexport function createProxy<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n config: S.MachineConfig<TContext, TState, TEvent>,\n) {\n const state = proxy({\n value: \"\",\n previousValue: \"\",\n event: cast<Dict>({}),\n context: config.context ?? cast<TContext>({}),\n done: false,\n tags: [] as Array<TState[\"tags\"]>,\n hasTag(tag: TState[\"tags\"]): boolean {\n return this.tags.includes(tag)\n },\n matches(...value: string[]): boolean {\n return value.includes(this.value)\n },\n can(event: string): boolean {\n return cast<any>(this).nextEvents.includes(event)\n },\n get nextEvents() {\n const stateEvents = (config.states as Dict)?.[this.value]?.[\"on\"] ?? {}\n const globalEvents = config?.on ?? {}\n return Object.keys({ ...stateEvents, ...globalEvents })\n },\n get changed() {\n if (this.event.value === ActionTypes.Init || !this.previousValue) return false\n return this.value !== this.previousValue\n },\n })\n return cast<S.State<TContext, TState, TEvent>>(state)\n}\n", "import { isFunction, isNumber, isString } from \"@zag-js/utils\"\nimport { StateMachine as S } from \"./types\"\n\n/**\n * Delay can be specified as:\n * - a string (reference to `options.delays`)\n * - a number (in ms)\n * - a function that returns a number (in ms)\n *\n * Let's resolve this to a number\n */\nexport function determineDelayFn<TContext, TEvent extends S.EventObject>(\n delay: S.Delay<TContext, TEvent> | undefined,\n delaysMap: S.DelayMap<TContext, TEvent> | undefined,\n) {\n return (context: TContext, event: TEvent) => {\n if (isNumber(delay)) return delay\n\n if (isFunction(delay)) {\n return delay(context, event)\n }\n\n if (isString(delay)) {\n const value = Number.parseFloat(delay)\n\n if (!Number.isNaN(value)) {\n return value\n }\n\n if (delaysMap) {\n const valueOrFn = delaysMap?.[delay]\n if (valueOrFn == null) {\n const msg = `[machine] Cannot determine delay for ${delay}. It doesn't exist in options.delays`\n throw new Error(msg)\n }\n return isFunction(valueOrFn) ? valueOrFn(context, event) : valueOrFn\n }\n }\n }\n}\n", "import { isArray, isString } from \"@zag-js/utils\"\nimport type { StateMachine as S } from \"./types\"\n\nexport function toEvent<T extends S.EventObject>(event: S.Event<T>): T {\n const obj = isString(event) ? { type: event } : event\n return obj as T\n}\n\nexport function toArray<T>(value: T | T[] | undefined): T[] {\n if (!value) return []\n return isArray(value) ? value : [value]\n}\n", "import { cast, isArray, isObject, isString } from \"@zag-js/utils\"\nimport { determineGuardFn } from \"./guard-utils\"\nimport type { StateMachine as S } from \"./types\"\nimport { toArray } from \"./utils\"\n\n/**\n * A transition is an object that describes the next state, or/and actions\n * that should run when an event is sent.\n *\n * Transitions can be specified as:\n * - A single string: \"spinning\"\n * - An object with `target`, `actions`, or `guard`: { target: \"spinning\", actions: [...], guard: isValid }\n * - An array of possible transitions. In this case, we'll pick the first matching transition\n * depending on the `guard` specified\n */\n\nexport function toTarget<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n target: S.Transition<TContext, TState, TEvent>,\n): S.TransitionDefinition<TContext, TState, TEvent> {\n return isString(target) ? { target } : target\n}\n\nexport function determineTransitionFn<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n transitions?: S.Transitions<TContext, TState, TEvent>,\n guardMap?: S.GuardMap<TContext, TEvent>,\n) {\n return (context: TContext, event: TEvent) => {\n return toArray(transitions)\n .map(toTarget)\n .find((transition) => {\n // get condition function\n const determineGuard = determineGuardFn(transition.guard, guardMap)\n const guard = determineGuard(context, event)\n return guard ?? transition.target ?? transition.actions\n })\n }\n}\n\nexport function toTransition<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n transition: S.Transitions<TContext, TState, TEvent> | undefined,\n current?: TState[\"value\"] | null,\n) {\n const _transition = isString(transition) ? toTarget(transition) : transition\n\n const fn = (t: S.TransitionDefinition<TContext, TState, TEvent>) => {\n const isTargetless = t.actions && !t.target\n if (isTargetless && current) t.target = current\n return t\n }\n\n if (isArray(_transition)) {\n return _transition.map(fn)\n }\n\n if (isObject(_transition)) {\n return fn(cast(_transition))\n }\n}\n", "import { cast, clear, invariant, isArray, isObject, isString, noop, runIfFn, uuid, warn } from \"@zag-js/utils\"\nimport { klona } from \"klona/json\"\nimport { derive, subscribeKey, underive } from \"valtio/utils\"\nimport { ref, snapshot, subscribe } from \"valtio/vanilla\"\nimport { determineActionsFn } from \"./action-utils\"\nimport { createProxy } from \"./create-proxy\"\nimport { determineDelayFn } from \"./delay-utils\"\nimport { determineGuardFn } from \"./guard-utils\"\nimport { determineTransitionFn, toTransition } from \"./transition-utils\"\nimport { ActionTypes, Dict, MachineStatus, MachineType, StateMachine as S, VoidFunction, Writable } from \"./types\"\nimport { toArray, toEvent } from \"./utils\"\n\nexport class Machine<\n TContext extends Dict,\n TState extends S.StateSchema,\n TEvent extends S.EventObject = S.AnyEventObject,\n> {\n public status: MachineStatus = MachineStatus.NotStarted\n public readonly state: S.State<TContext, TState, TEvent>\n public initialState: S.StateInfo<TContext, TState, TEvent> | undefined\n\n public id: string\n\n public type: MachineType = MachineType.Machine\n\n // Cleanup function map (per state)\n private activityEvents = new Map<string, Set<VoidFunction>>()\n private delayedEvents = new Map<string, VoidFunction[]>()\n\n // state update listeners the user can opt-in for\n private stateListeners = new Set<S.StateListener<TContext, TState, TEvent>>()\n private eventListeners = new Set<S.EventListener<TEvent>>()\n private doneListeners = new Set<S.StateListener<TContext, TState, TEvent>>()\n private contextWatchers = new Set<VoidFunction>()\n\n // Cleanup functions (for `subscribe`)\n private removeStateListener: VoidFunction = noop\n private removeEventListener: VoidFunction = noop\n\n // For Parent <==> Spawned Actor relationship\n private parent?: AnyMachine\n private children = new Map<string, AnyMachine>()\n\n // A map of guard, action, delay implementations\n private guardMap: S.GuardMap<TContext, TEvent>\n private actionMap: S.ActionMap<TContext, TState, TEvent>\n private delayMap: S.DelayMap<TContext, TEvent>\n private activityMap: S.ActivityMap<TContext, TState, TEvent>\n private sync: boolean\n public options?: S.MachineOptions<TContext, TState, TEvent>\n\n // Let's get started!\n constructor(\n public config: S.MachineConfig<TContext, TState, TEvent>,\n options?: S.MachineOptions<TContext, TState, TEvent>,\n ) {\n // deep clone the config\n this.options = klona(options)\n this.id = config.id ?? `machine-${uuid()}`\n\n // maps\n this.guardMap = this.options?.guards ?? {}\n this.actionMap = this.options?.actions ?? {}\n this.delayMap = this.options?.delays ?? {}\n this.activityMap = this.options?.activities ?? {}\n this.sync = this.options?.sync ?? false\n\n // create mutatable state\n this.state = createProxy(klona(config))\n this.setupComputed()\n\n // created actions\n const event = toEvent<TEvent>(ActionTypes.Created)\n this.executeActions(config?.created, event)\n }\n\n // immutable state value\n private get stateSnapshot(): S.State<TContext, TState, TEvent> {\n return cast(snapshot(this.state))\n }\n\n // immutable context value\n private get contextSnapshot(): TContext {\n return this.stateSnapshot.context\n }\n\n // Starts the interpreted machine.\n public start = (init?: S.StateInit<TContext, TState>) => {\n // Don't start if it's already running\n if (this.status === MachineStatus.Running) {\n return this\n }\n\n this.status = MachineStatus.Running\n const event = toEvent<TEvent>(ActionTypes.Init)\n\n if (init) {\n const resolved = isObject(init) ? init : { context: this.config.context!, value: init }\n this.setState(resolved.value)\n this.setContext(resolved.context as Partial<TContext>)\n }\n\n // start transition definition\n const transition = {\n target: !!init ? undefined : this.config.initial,\n }\n\n const info = this.getNextStateInfo(transition, event)\n info.target = cast(info.target || transition.target)\n this.initialState = info\n this.performStateChangeEffects(info.target, info, event)\n\n this.removeStateListener = subscribe(\n this.state,\n () => {\n this.stateListeners.forEach((listener) => {\n listener(this.stateSnapshot)\n })\n },\n this.sync,\n )\n\n // For some reason `subscribe(this.state.event)` doesn't work, so we use `subscribeKey`\n this.removeEventListener = subscribeKey(this.state, \"event\", (value) => {\n if (this.config.onEvent) {\n this.executeActions(this.config.onEvent, value)\n }\n for (const listener of this.eventListeners) {\n listener(value)\n }\n })\n\n this.setupContextWatchers()\n this.executeActivities(toEvent<TEvent>(ActionTypes.Start), toArray(this.config.activities), ActionTypes.Start)\n this.executeActions(this.config.entry, toEvent<TEvent>(ActionTypes.Start))\n\n return this\n }\n\n private setupContextWatchers = () => {\n for (const [key, fn] of Object.entries(this.config.watch ?? {})) {\n this.contextWatchers.add(\n subscribeKey(this.state.context, key, () => {\n this.executeActions(fn, this.state.event as TEvent)\n }),\n )\n }\n }\n\n private setupComputed = () => {\n // convert computed properties to valtio getters format\n const computed = cast<S.TComputedContext<TContext>>(this.config.computed ?? {})\n const deriveFns = Object.fromEntries(\n Object.entries(computed).map(([key, fn]: any) => [key, (get: any) => fn(get(this.state.context))]),\n )\n\n // attach computed properties to the state's context\n derive(deriveFns, { proxy: this.state.context })\n }\n\n private detachComputed = () => {\n underive(this.state.context, { delete: true })\n }\n\n // Stops the interpreted machine\n stop = () => {\n // No need to call if already stopped\n if (this.status === MachineStatus.Stopped) return\n\n this.setState(null)\n this.setEvent(ActionTypes.Stop)\n\n if (this.config.context) {\n this.setContext(this.config.context as Partial<TContext>)\n }\n\n // cleanups\n this.stopStateListeners()\n this.stopChildren()\n this.stopActivities()\n this.stopDelayedEvents()\n this.stopContextWatchers()\n this.stopEventListeners()\n\n // cleanup `derive` subscriptions that was attached to the context\n this.detachComputed()\n\n this.status = MachineStatus.Stopped\n this.executeActions(this.config.exit, toEvent<TEvent>(ActionTypes.Stop))\n return this\n }\n\n private stopEventListeners = () => {\n this.eventListeners.clear()\n this.removeEventListener()\n }\n\n private stopStateListeners = () => {\n this.removeStateListener()\n this.stateListeners.clear()\n }\n\n private stopContextWatchers = () => {\n this.contextWatchers.forEach((fn) => fn())\n this.contextWatchers.clear()\n }\n\n private stopDelayedEvents = () => {\n this.delayedEvents.forEach((state) => {\n state.forEach((stop) => stop())\n })\n this.delayedEvents.clear()\n }\n\n // Cleanup running activities (e.g `setInterval`, invoked callbacks, promises)\n private stopActivities = (state?: TState[\"value\"]) => {\n // stop activities for a state\n if (state) {\n this.activityEvents.get(state)?.forEach((stop) => stop())\n this.activityEvents.get(state)?.clear()\n this.activityEvents.delete(state)\n } else {\n // stop every running activity\n this.activityEvents.forEach((state) => {\n state.forEach((stop) => stop())\n state.clear()\n })\n this.activityEvents.clear()\n }\n }\n\n /**\n * Function to send event to spawned child machine or actor\n */\n sendChild = (evt: S.Event<S.AnyEventObject>, to: string | ((ctx: TContext) => string)) => {\n const event = toEvent(evt)\n const id = runIfFn(to, this.contextSnapshot)\n const child = this.children.get(id)\n if (!child) {\n invariant(`[machine/send-child] Cannot send '${event.type}' event to unknown child`)\n }\n child!.send(event)\n }\n\n /**\n * Function to stop a running child machine or actor\n */\n stopChild = (id: string) => {\n if (!this.children.has(id)) {\n invariant(\"[machine/stop-child] Cannot stop unknown child\")\n }\n this.children.get(id)!.stop()\n this.children.delete(id)\n }\n\n removeChild = (id: string) => {\n this.children.delete(id)\n }\n\n // Stop and delete spawned actors\n private stopChildren = () => {\n this.children.forEach((child) => child.stop())\n this.children.clear()\n }\n\n setParent = (parent: any) => {\n this.parent = parent\n }\n\n public spawn = <TContext extends Dict, TState extends S.StateSchema, TEvent extends S.EventObject = S.AnyEventObject>(\n src: MachineSrc<TContext, TState, TEvent>,\n id?: string,\n ) => {\n const actor = runIfFn(src)\n if (id) actor.id = id\n actor.type = MachineType.Actor\n actor.setParent(this)\n this.children.set(actor.id, cast(actor))\n\n actor\n .onDone(() => {\n this.removeChild(actor.id)\n })\n .start()\n\n return cast<typeof actor>(ref(actor))\n }\n\n private addActivityCleanup = (state: TState[\"value\"] | null, cleanup: VoidFunction) => {\n if (!state) return\n if (!this.activityEvents.has(state)) {\n this.activityEvents.set(state, new Set([cleanup]))\n } else {\n this.activityEvents.get(state)?.add(cleanup)\n }\n }\n\n private setState = (target: TState[\"value\"] | null) => {\n this.state.previousValue = this.state.value\n this.state.value = target\n\n const stateNode = this.getStateNode(target)\n\n if (target == null) {\n // remove all tags\n clear(this.state.tags)\n } else {\n this.state.tags = toArray(stateNode?.tags)\n }\n }\n\n /**\n * To used within side effects for React or Vue to update context\n */\n setContext = (context: Partial<Writable<TContext>>) => {\n for (const key in context) {\n this.state.context[<keyof TContext>key] = context[key]!\n }\n }\n\n withContext = (context: Partial<Writable<TContext>>) => {\n this.detachComputed()\n const newContext = { ...this.config.context, ...context } as TContext\n return new Machine({ ...this.config, context: newContext }, this.options)\n }\n\n withOptions = (options: Partial<S.MachineOptions<TContext, TState, TEvent>>) => {\n this.detachComputed()\n return new Machine(this.config, { ...this.options, ...options })\n }\n\n setActions = (actions: Partial<S.MachineOptions<TContext, TState, TEvent>>[\"actions\"]) => {\n this.actionMap = { ...this.actionMap, ...actions }\n }\n\n clone = () => {\n this.detachComputed()\n return new Machine(this.config, this.options)\n }\n\n private getStateNode = (state: TState[\"value\"] | null) => {\n if (!state) return\n return this.config.states?.[state]\n }\n\n private getNextStateInfo = (\n transitions: S.Transitions<TContext, TState, TEvent>,\n event: TEvent,\n ): S.StateInfo<TContext, TState, TEvent> => {\n const transition = this.determineTransition(transitions, event)\n const target = transition?.target ?? this.state.value\n const stateNode = this.getStateNode(target)\n\n return {\n transition,\n stateNode,\n target: target!,\n }\n }\n\n private getActionFromDelayedTransition = (transition: S.DelayedTransition<TContext, TState, TEvent>) => {\n // get the computed delay\n const event = toEvent<TEvent>(ActionTypes.After)\n\n const determineDelay = determineDelayFn(transition.delay, this.delayMap)\n const delay = determineDelay(this.contextSnapshot, event)\n\n let id: ReturnType<typeof globalThis.setTimeout>\n\n return {\n entry: () => {\n id = globalThis.setTimeout(() => {\n const current = this.state.value!\n const next = this.getNextStateInfo(transition, event)\n this.performStateChangeEffects(current, next, event)\n }, delay)\n },\n exit: () => {\n globalThis.clearTimeout(id)\n },\n }\n }\n\n /**\n * All `after` events leverage `setTimeout` and `clearTimeout`,\n * we invoke the `clearTimeout` on exit and `setTimeout` on entry.\n *\n * To achieve this, we split the `after` defintion into `entry` and `exit`\n * functions and append them to the state's `entry` and `exit` actions\n */\n private getDelayedEventActions = (state: TState[\"value\"]) => {\n const stateNode = this.getStateNode(state)\n const event = toEvent<TEvent>(ActionTypes.After)\n\n if (!stateNode || !stateNode.after) return\n\n const entries: VoidFunction[] = []\n const exits: VoidFunction[] = []\n\n if (isArray(stateNode.after)) {\n //\n const transition = this.determineTransition(stateNode.after, event)\n if (!transition) return\n\n const actions = this.getActionFromDelayedTransition(transition)\n entries.push(actions.entry)\n exits.push(actions.exit)\n //\n } else if (isObject(stateNode.after)) {\n //\n for (const delay in stateNode.after) {\n const transition = stateNode.after[delay]\n let resolvedTransition: S.DelayedTransition<TContext, TState, TEvent> = {}\n\n if (isArray(transition)) {\n //\n const picked = this.determineTransition(transition, event)\n if (picked) resolvedTransition = picked\n //\n } else if (isString(transition)) {\n resolvedTransition = { target: transition, delay }\n } else {\n resolvedTransition = { ...transition, delay }\n }\n\n const actions = this.getActionFromDelayedTransition(resolvedTransition)\n\n entries.push(actions.entry)\n exits.push(actions.exit)\n }\n }\n\n return { entries, exits }\n }\n\n /**\n * A reference to the instance methods of the machine.\n * Useful when spawning child machines and managing the communication between them.\n */\n private get self(): S.Self<TContext, TState, TEvent> {\n const _self = this\n return {\n id: this.id,\n send: this.send.bind(this),\n sendParent: this.sendParent.bind(this),\n sendChild: this.sendChild.bind(this),\n stop: this.stop.bind(this),\n stopChild: this.stopChild.bind(this),\n spawn: this.spawn.bind(this) as any,\n get state() {\n return _self.stateSnapshot\n },\n }\n }\n\n private get meta(): S.Meta<TContext, TState, TEvent> {\n return {\n state: this.stateSnapshot,\n guards: this.guardMap,\n send: this.send.bind(this),\n listen: this.onEvent.bind(this),\n self: this.self,\n getState: () => this.stateSnapshot,\n }\n }\n\n /**\n * Function to executes defined actions. It can accept actions as string\n * (referencing `options.actions`) or actual functions.\n */\n private executeActions = (actions: S.Actions<TContext, TState, TEvent> | undefined, event: TEvent) => {\n const _actions = determineActionsFn(actions, this.guardMap)(this.contextSnapshot, event)\n for (const action of toArray(_actions)) {\n const fn = isString(action) ? this.actionMap?.[action] : action\n warn(isString(action) && !fn, `[machine/exec-action] No implementation found for action: \\`${action}\\``)\n fn?.(this.state.context, event, this.meta)\n }\n }\n\n /**\n * Function to execute running activities and registers\n * their cleanup function internally (to be called later on when we exit the state)\n */\n private executeActivities = (\n event: TEvent,\n activities: Array<S.Activity<TContext, TState, TEvent>>,\n state?: TState[\"value\"],\n ) => {\n for (const activity of activities) {\n const fn = isString(activity) ? this.activityMap?.[activity] : activity\n\n if (!fn) {\n warn(`[machine/exec-activity] No implementation found for activity: \\`${activity}\\``)\n continue\n }\n\n const cleanup = fn(this.state.context, event, this.meta)\n if (cleanup) {\n this.addActivityCleanup(state ?? this.state.value, cleanup)\n }\n }\n }\n\n /**\n * Normalizes the `every` definition to transition. `every` can be:\n * - An array of possible actions to run (we need to pick the first match based on guard)\n * - An object of intervals and actions\n */\n private createEveryActivities = (\n every: S.StateNode<TContext, TState, TEvent>[\"every\"] | undefined,\n callbackfn: (activity: S.Activity<TContext, TState, TEvent>) => void,\n ) => {\n if (!every) return\n const event = toEvent<TEvent>(ActionTypes.Every)\n\n // every: [{ interval: 2000, actions: [...], guard: \"isValid\" }, { interval: 1000, actions: [...] }]\n if (isArray(every)) {\n // picked = { interval: string | number | <ref>, actions: [...], guard: ... }\n const picked = toArray(every).find((t) => {\n //\n const determineDelay = determineDelayFn(t.delay, this.delayMap)\n t.delay = determineDelay(this.contextSnapshot, event)\n\n const determineGuard = determineGuardFn(t.guard, this.guardMap)\n const guard = determineGuard(this.contextSnapshot, event)\n\n return guard ?? t.delay\n })\n\n if (!picked) return\n\n const determineDelay = determineDelayFn(picked.delay, this.delayMap)\n const delay = determineDelay(this.contextSnapshot, event)\n\n const activity = () => {\n const id = globalThis.setInterval(() => {\n this.executeActions(picked.actions, event)\n }, delay)\n return () => {\n globalThis.clearInterval(id)\n }\n }\n callbackfn(activity)\n //\n } else {\n // every = { 1000: [fn, fn] }\n for (const interval in every) {\n const actions = every?.[interval]\n\n // interval could be a `ref` not the actual interval value, let's determine the actual value\n const determineDelay = determineDelayFn(interval, this.delayMap)\n const delay = determineDelay(this.contextSnapshot, event)\n\n // create the activity to run for each `every` reaction\n const activity = () => {\n const id = globalThis.setInterval(() => {\n this.executeActions(actions, event)\n }, delay)\n return () => {\n globalThis.clearInterval(id)\n }\n }\n callbackfn(activity)\n }\n }\n }\n\n private setEvent = (event: TEvent | TEvent[\"type\"]) => {\n this.state.event = ref(toEvent(event))\n }\n\n private performExitEffects = (current: TState[\"value\"] | undefined, event: TEvent) => {\n const currentState = this.state.value!\n const stateNode = current ? this.getStateNode(current) : undefined\n\n // cleanup activities for current state\n this.stopActivities(currentState)\n\n // get explicit exit and implicit \"after.exit\" actions for current state\n const _exit = determineActionsFn(stateNode?.exit, this.guardMap)(this.contextSnapshot, event)\n const exitActions = toArray(_exit)\n\n const afterExitActions = this.delayedEvents.get(currentState)\n if (afterExitActions) {\n exitActions.push(...afterExitActions)\n }\n\n // call all exit actions for current state\n this.executeActions(exitActions, event)\n\n // remove all registered listeners\n this.eventListeners.clear()\n }\n\n private performEntryEffects = (next: TState[\"value\"], event: TEvent) => {\n const stateNode = this.getStateNode(next)\n\n // execute activities for next state\n const activities = toArray(stateNode?.activities)\n\n // if `every` is defined, create an activity and append to activities\n this.createEveryActivities(stateNode?.every, (activity) => {\n activities.unshift(activity)\n })\n\n if (activities.length > 0) {\n this.executeActivities(event, activities)\n }\n\n // get all entry actions\n const _entry = determineActionsFn(stateNode?.entry, this.guardMap)(this.contextSnapshot, event)\n const entryActions = toArray(_entry)\n const afterActions = this.getDelayedEventActions(next)\n\n if (stateNode?.after && afterActions) {\n this.delayedEvents.set(next, afterActions?.exits)\n entryActions.push(...afterActions.entries)\n }\n\n // execute entry actions for next state\n this.executeActions(entryActions, event)\n\n if (stateNode?.type === \"final\") {\n this.state.done = true\n this.doneListeners.forEach((listener) => {\n listener(this.stateSnapshot)\n })\n this.stop()\n }\n }\n\n private performTransitionEffects = (\n transition: S.Transitions<TContext, TState, TEvent> | undefined,\n event: TEvent,\n ) => {\n // execute transition actions\n const t = this.determineTransition(transition, event)\n this.executeActions(t?.actions, event)\n }\n\n /**\n * Performs all the requires side-effects or reactions when\n * we move from state A => state B.\n *\n * The Effect order:\n * Exit actions (current state) => Transition actions => Go to state => Entry actions (next state)\n */\n private performStateChangeEffects = (\n current: TState[\"value\"] | undefined,\n next: S.StateInfo<TContext, TState, TEvent>,\n event: TEvent,\n ) => {\n // update event\n this.setEvent(event)\n\n // determine next target\n next.target = next.target ?? this.state.value ?? undefined\n const ok = next.target && next.target !== this.state.value\n\n if (ok) {\n this.performExitEffects(current, event)\n }\n\n // execute transition actions\n this.performTransitionEffects(next?.transition, event)\n\n // go to next state\n this.setState(next.target)\n\n if (ok) {\n this.performEntryEffects(next.target, event)\n }\n }\n\n private determineTransition = (transition: S.Transitions<TContext, TState, TEvent> | undefined, event: TEvent) => {\n const fn = determineTransitionFn(transition, this.guardMap)\n return fn?.(this.contextSnapshot, event)\n }\n\n /**\n * Function to send event to parent machine from spawned child\n */\n sendParent = (evt: S.Event<S.AnyEventObject>) => {\n if (!this.parent) {\n invariant(\"[machine/send-parent] Cannot send event to an unknown parent\")\n }\n const event = toEvent<S.AnyEventObject>(evt)\n this.parent?.send(event)\n }\n\n /**\n * Function to send an event to current machine\n */\n send = (evt: S.Event<TEvent>) => {\n const event = toEvent<TEvent>(evt)\n this.transition(this.state.value, event)\n }\n\n transition = (state: TState[\"value\"] | S.StateInfo<TContext, TState, TEvent> | null, evt: S.Event<TEvent>) => {\n const stateNode = isString(state) ? this.getStateNode(state) : state?.stateNode\n\n const event = toEvent(evt)\n\n if (!stateNode && !this.config.on) {\n const msg =\n this.status === MachineStatus.Stopped\n ? \"[machine/transition] Cannot transition a stopped machine\"\n : \"[machine/transition] State does not have a definition\"\n warn(msg)\n return\n }\n\n const transitionConfig: S.Transitions<TContext, TState, TEvent> =\n stateNode?.on?.[event.type] ?? this.config.on?.[event.type]\n\n const transition = toTransition(transitionConfig, this.state.value)\n\n if (!transition) return\n\n const info = this.getNextStateInfo(transition, event)\n this.performStateChangeEffects(this.state.value!, info, event)\n\n return info.stateNode\n }\n\n subscribe = (listener: S.StateListener<TContext, TState, TEvent>) => {\n this.stateListeners.add(listener)\n\n if (this.status === MachineStatus.Running) {\n listener(this.stateSnapshot)\n }\n\n return () => {\n this.stateListeners.delete(listener)\n }\n }\n\n public onDone = (listener: S.StateListener<TContext, TState, TEvent>) => {\n this.doneListeners.add(listener)\n return this\n }\n\n public onTransition = (listener: S.StateListener<TContext, TState, TEvent>) => {\n this.stateListeners.add(listener)\n if (this.status === MachineStatus.Running) {\n listener(this.stateSnapshot)\n }\n return this\n }\n\n public onEvent = (listener: S.EventListener<TEvent>) => {\n listener(this.state.event)\n this.eventListeners.add(listener)\n return this\n }\n}\n\nexport type MachineSrc<\n TContext extends Dict,\n TState extends S.StateSchema,\n TEvent extends S.EventObject = S.AnyEventObject,\n> = Machine<TContext, TState, TEvent> | (() => Machine<TContext, TState, TEvent>)\n\nexport type AnyMachine = Machine<Dict, S.StateSchema, S.AnyEventObject>\n\nexport const createMachine = <\n TContext extends Dict,\n TState extends S.StateSchema = S.StateSchema,\n TEvent extends S.EventObject = S.AnyEventObject,\n>(\n config: S.MachineConfig<TContext, TState, TEvent>,\n options?: S.MachineOptions<TContext, TState, TEvent>,\n) => new Machine(config, options)\n", "import { callAll } from \"@zag-js/utils\"\n\ninterface Props {\n [key: string]: any\n}\n\nconst clsx = (...args: (string | undefined)[]) =>\n args\n .map((str) => str?.trim())\n .filter(Boolean)\n .join(\" \")\n\ntype TupleTypes<T extends any[]> = T[number]\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never\n\nexport function mergeProps<T extends Props[]>(...args: T): UnionToIntersection<TupleTypes<T>> {\n let result: Props = {}\n\n for (let props of args) {\n for (let key in result) {\n if (/^on[A-Z]/.test(key) && typeof result[key] === \"function\" && typeof props[key] === \"function\") {\n result[key] = callAll(result[key], props[key])\n continue\n }\n\n if (key === \"className\" || key === \"class\") {\n result[key] = clsx(result[key], props[key])\n continue\n }\n\n if (key === \"style\") {\n result[key] = Object.assign({}, result[key] ?? {}, props[key] ?? {})\n continue\n }\n\n result[key] = props[key] !== undefined ? props[key] : result[key]\n }\n\n // Add props from b that are not in a\n for (let key in props) {\n if (result[key] === undefined) {\n result[key] = props[key]\n }\n }\n }\n\n return result as UnionToIntersection<TupleTypes<T>>\n}\n", "import { proxy } from \"@zag-js/core\"\n\ntype Id = string | null\n\ntype Store = {\n id: Id\n prevId: Id\n setId: (val: Id) => void\n}\n\nexport const store = proxy<Store>({\n id: null,\n prevId: null,\n setId(val) {\n this.prevId = this.id\n this.id = val\n },\n})\n", "import { StateMachine as S } from \"@zag-js/core\"\nimport { dataAttr, visuallyHiddenStyle } from \"@zag-js/dom-utils\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport { normalizeProp, PropTypes, ReactPropTypes } from \"@zag-js/types\"\nimport { dom } from \"./tooltip.dom\"\nimport { store } from \"./tooltip.store\"\nimport { MachineContext, MachineState } from \"./tooltip.types\"\n\nexport function connect<T extends PropTypes = ReactPropTypes>(\n state: S.State<MachineContext, MachineState>,\n send: (event: S.Event<S.AnyEventObject>) => void,\n normalize = normalizeProp,\n) {\n const id = state.context.id\n const hasAriaLabel = state.context.hasAriaLabel\n\n const isOpen = state.hasTag(\"open\")\n\n const triggerId = dom.getTriggerId(state.context)\n const contentId = dom.getContentId(state.context)\n\n const popperStyles = getPlacementStyles({\n measured: !!state.context.isPlacementComplete,\n })\n\n return {\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\n },\n getAnimationState() {\n return {\n enter: store.prevId === null && id === store.id,\n exit: store.id === null,\n }\n },\n\n triggerProps: normalize.button<T>({\n \"data-part\": \"trigger\",\n id: triggerId,\n \"data-expanded\": dataAttr(isOpen),\n \"aria-describedby\": isOpen ? contentId : undefined,\n onClick() {\n send(\"CLICK\")\n },\n onFocus() {\n send(\"FOCUS\")\n },\n onBlur() {\n if (id === store.id) {\n send(\"BLUR\")\n }\n },\n onPointerDown() {\n if (id === store.id) {\n send(\"POINTER_DOWN\")\n }\n },\n onPointerMove() {\n send(\"POINTER_ENTER\")\n },\n onPointerLeave() {\n send(\"POINTER_LEAVE\")\n },\n onPointerCancel() {\n send(\"POINTER_LEAVE\")\n },\n }),\n\n arrowProps: normalize.element<T>({\n id: dom.getArrowId(state.context),\n \"data-part\": \"arrow\",\n style: popperStyles.arrow,\n }),\n\n innerArrowProps: normalize.element<T>({\n \"data-part\": \"arrow-inner\",\n style: popperStyles.innerArrow,\n }),\n\n positionerProps: normalize.element<T>({\n id: dom.getPositionerId(state.context),\n \"data-part\": \"positioner\",\n style: popperStyles.floating,\n }),\n\n contentProps: normalize.element<T>({\n \"data-part\": \"content\",\n role: hasAriaLabel ? undefined : \"tooltip\",\n id: hasAriaLabel ? undefined : contentId,\n \"data-placement\": state.context.currentPlacement,\n onPointerEnter() {\n send(\"TOOLTIP_POINTER_ENTER\")\n },\n onPointerLeave() {\n send(\"TOOLTIP_POINTER_LEAVE\")\n },\n style: {\n pointerEvents: state.context.interactive ? \"auto\" : \"none\",\n },\n }),\n\n labelProps: normalize.element<T>({\n \"data-part\": \"label\",\n id: contentId,\n role: \"tooltip\",\n style: visuallyHiddenStyle,\n children: state.context[\"aria-label\"],\n }),\n\n createPortal() {\n const doc = dom.getDoc(state.context)\n const exist = dom.getPortalEl(state.context)\n if (exist) return exist\n const portal = dom.createPortalEl(state.context)\n doc.body.appendChild(portal)\n return portal\n },\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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 { createMachine, ref, subscribe } from \"@zag-js/core\"\nimport {\n addDomEvent,\n addPointerEvent,\n addPointerlockChangeListener,\n getScrollParents,\n isHTMLElement,\n raf,\n} from \"@zag-js/dom-utils\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { isSafari, noop } from \"@zag-js/utils\"\nimport { dom } from \"./tooltip.dom\"\nimport { store } from \"./tooltip.store\"\nimport { MachineContext, MachineState } from \"./tooltip.types\"\n\nexport const machine = createMachine<MachineContext, MachineState>(\n {\n id: \"tooltip\",\n initial: \"unknown\",\n\n context: {\n id: \"\",\n openDelay: 1000,\n closeDelay: 500,\n closeOnPointerDown: true,\n closeOnEsc: true,\n interactive: true,\n positioning: { placement: \"bottom\" },\n currentPlacement: undefined,\n },\n\n computed: {\n hasAriaLabel: (ctx) => !!ctx[\"aria-label\"],\n },\n\n on: {\n OPEN: \"open\",\n CLOSE: \"closed\",\n },\n\n states: {\n unknown: {\n on: {\n SETUP: {\n target: \"closed\",\n actions: \"setupDocument\",\n },\n },\n },\n\n closed: {\n tags: [\"closed\"],\n entry: [\"clearGlobalId\", \"invokeOnClose\"],\n on: {\n FOCUS: \"open\",\n POINTER_ENTER: [\n {\n guard: \"noVisibleTooltip\",\n target: \"opening\",\n },\n { target: \"open\" },\n ],\n },\n },\n\n opening: {\n tags: [\"closed\"],\n activities: [\"trackScroll\", \"trackPointerlockChange\"],\n after: {\n OPEN_DELAY: \"open\",\n },\n on: {\n POINTER_LEAVE: \"closed\",\n BLUR: \"closed\",\n SCROLL: \"closed\",\n POINTER_LOCK_CHANGE: \"closed\",\n POINTER_DOWN: {\n guard: \"closeOnPointerDown\",\n target: \"closed\",\n },\n },\n },\n\n open: {\n tags: [\"open\"],\n activities: [\n \"trackEscapeKey\",\n \"trackDisabledTriggerOnSafari\",\n \"trackScroll\",\n \"trackPointerlockChange\",\n \"computePlacement\",\n ],\n entry: [\"setGlobalId\", \"invokeOnOpen\"],\n on: {\n POINTER_LEAVE: [\n {\n guard: \"isVisible\",\n target: \"closing\",\n },\n { target: \"closed\" },\n ],\n BLUR: \"closed\",\n ESCAPE: \"closed\",\n SCROLL: \"closed\",\n POINTER_LOCK_CHANGE: \"closed\",\n TOOLTIP_POINTER_LEAVE: {\n guard: \"isInteractive\",\n target: \"closing\",\n },\n POINTER_DOWN: {\n guard: \"closeOnPointerDown\",\n target: \"closed\",\n },\n CLICK: \"closed\",\n },\n },\n\n closing: {\n tags: [\"open\"],\n activities: [\"trackStore\", \"computePlacement\"],\n after: {\n CLOSE_DELAY: \"closed\",\n },\n on: {\n FORCE_CLOSE: \"closed\",\n POINTER_ENTER: \"open\",\n TOOLTIP_POINTER_ENTER: {\n guard: \"isInteractive\",\n target: \"open\",\n },\n },\n },\n },\n },\n {\n activities: {\n computePlacement(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n let cleanup: VoidFunction | undefined\n raf(() => {\n cleanup = getPlacement(dom.getTriggerEl(ctx), dom.getPositionerEl(ctx), {\n ...ctx.positioning,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n ctx.isPlacementComplete = true\n },\n onCleanup() {\n ctx.currentPlacement = undefined\n ctx.isPlacementComplete = false\n },\n })\n })\n return cleanup\n },\n trackPointerlockChange(ctx, _evt, { send }) {\n return addPointerlockChangeListener(dom.getDoc(ctx), () => {\n send(\"POINTER_LOCK_CHANGE\")\n })\n },\n trackScroll(ctx, _evt, { send }) {\n const trigger = dom.getTriggerEl(ctx)\n if (!trigger) return\n const cleanups = getScrollParents(trigger).map((el) => {\n const opts = { passive: true, capture: true } as const\n return addDomEvent(el, \"scroll\", () => send(\"SCROLL\"), opts)\n })\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n },\n trackStore(ctx, _evt, { send }) {\n return subscribe(store, () => {\n if (store.id !== ctx.id) {\n send(\"FORCE_CLOSE\")\n }\n })\n },\n trackDisabledTriggerOnSafari(ctx, _evt, { send }) {\n if (!isSafari()) return noop\n const doc = dom.getDoc(ctx)\n return addPointerEvent(doc, \"pointermove\", (event) => {\n const selector = \"[data-part=trigger][data-expanded]\"\n if (isHTMLElement(event.target) && event.target.closest(selector)) return\n send(\"POINTER_LEAVE\")\n })\n },\n trackEscapeKey(ctx, _evt, { send }) {\n if (!ctx.closeOnEsc) return\n const doc = dom.getDoc(ctx)\n return addDomEvent(doc, \"keydown\", (event) => {\n if (event.key === \"Escape\") {\n send(\"ESCAPE\")\n }\n })\n },\n },\n actions: {\n setupDocument(ctx, evt) {\n ctx.id = evt.id\n if (evt.doc) ctx.doc = ref(evt.doc)\n },\n setGlobalId(ctx) {\n store.setId(ctx.id)\n },\n clearGlobalId(ctx) {\n if (ctx.id === store.id) {\n store.setId(null)\n }\n },\n invokeOnOpen(ctx, evt) {\n const omit = [\"TOOLTIP_POINTER_ENTER\", \"POINTER_ENTER\"]\n if (!omit.includes(evt.type)) {\n ctx.onOpen?.()\n }\n },\n invokeOnClose(ctx, evt) {\n const omit = [\"SETUP\"]\n if (!omit.includes(evt.type)) {\n ctx.onClose?.()\n }\n },\n },\n guards: {\n closeOnPointerDown: (ctx) => ctx.closeOnPointerDown,\n noVisibleTooltip: () => store.id === null,\n isVisible: (ctx) => ctx.id === store.id,\n isInteractive: (ctx) => ctx.interactive,\n },\n delays: {\n OPEN_DELAY: (ctx) => ctx.openDelay,\n CLOSE_DELAY: (ctx) => ctx.closeDelay,\n },\n },\n)\n"],
4
+ "sourcesContent": ["export { connect } from \"./tooltip.connect\"\nexport { machine } from \"./tooltip.machine\"\nexport type { MachineContext, MachineState } from \"./tooltip.types\"\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", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nconst styleCache: WeakMap<HTMLElement, Styles> = new WeakMap()\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n let style: Styles | undefined = styleCache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n styleCache.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 forceReflow() {\n return document.body.offsetHeight\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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\nconst listenerElements: Map<El, Group> = new Map()\nconst listenerCache: Map<El, Map<string, Handler>> = new Map()\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 globalEventBus(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\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 { globalEventBus } from \"./event-bus\"\nimport {\n AnyPointerEvent,\n DOMEventTarget,\n EventMap,\n PointerEventInfo,\n PointerNameMap,\n RefTarget,\n} from \"./listener.types\"\n\nconst t = (v: any) => Object.prototype.toString.call(v).slice(8, -1)\nconst isRef = (v: any): v is RefTarget => t(v) === \"Object\" && \"current\" in v\nconst runIfFn = (fn: any): HTMLElement | null => (t(fn) === \"Function\" ? fn() : fn)\nconst isTouchEvent = (v: Event): v is TouchEvent => t(v) === \"Object\" && !!(v as TouchEvent).touches\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 globalEventBus(node, 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 supportsPointerEvent = () => typeof window !== \"undefined\" && window.onpointerdown === null\nconst supportsTouchEvent = () => typeof window !== \"undefined\" && window.ontouchstart === null\nconst supportsMouseEvent = () => typeof window !== \"undefined\" && window.onmousedown === null\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", "// Compute what scrolling needs to be done on required scrolling boxes for target to be in view\n\n// The type names here are named after the spec to make it easier to find more information around what they mean:\n// To reduce churn and reduce things that need be maintained things from the official TS DOM library is used here\n// https://drafts.csswg.org/cssom-view/\n\n// For a definition on what is \"block flow direction\" exactly, check this: https://drafts.csswg.org/css-writing-modes-4/#block-flow-direction\n\n// add support for visualViewport object currently implemented in chrome\ninterface visualViewport {\n height: number\n width: number\n}\n\ntype ScrollLogicalPosition = 'start' | 'center' | 'end' | 'nearest'\n// This new option is tracked in this PR, which is the most likely candidate at the time: https://github.com/w3c/csswg-drafts/pull/1805\ntype ScrollMode = 'always' | 'if-needed'\n// New option that skips auto-scrolling all nodes with overflow: hidden set\n// See FF implementation: https://hg.mozilla.org/integration/fx-team/rev/c48c3ec05012#l7.18\ntype SkipOverflowHiddenElements = boolean\n\ninterface Options {\n block?: ScrollLogicalPosition\n inline?: ScrollLogicalPosition\n scrollMode?: ScrollMode\n boundary?: CustomScrollBoundary\n skipOverflowHiddenElements?: SkipOverflowHiddenElements\n}\n\n// Custom behavior, not in any spec\ntype CustomScrollBoundaryCallback = (parent: Element) => boolean\ntype CustomScrollBoundary = Element | CustomScrollBoundaryCallback | null\ninterface CustomScrollAction {\n el: Element\n top: number\n left: number\n}\n\n// @TODO better shadowdom test, 11 = document fragment\nfunction isElement(el: any): el is Element {\n return typeof el === 'object' && el != null && el.nodeType === 1\n}\n\nfunction canOverflow(\n overflow: string | null,\n skipOverflowHiddenElements?: boolean\n) {\n if (skipOverflowHiddenElements && overflow === 'hidden') {\n return false\n }\n\n return overflow !== 'visible' && overflow !== 'clip'\n}\n\nfunction getFrameElement(el: Element) {\n if (!el.ownerDocument || !el.ownerDocument.defaultView) {\n return null\n }\n\n try {\n return el.ownerDocument.defaultView.frameElement\n } catch (e) {\n return null\n }\n}\n\nfunction isHiddenByFrame(el: Element): boolean {\n const frame = getFrameElement(el)\n if (!frame) {\n return false\n }\n\n return (\n frame.clientHeight < el.scrollHeight || frame.clientWidth < el.scrollWidth\n )\n}\n\nfunction isScrollable(el: Element, skipOverflowHiddenElements?: boolean) {\n if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n const style = getComputedStyle(el, null)\n return (\n canOverflow(style.overflowY, skipOverflowHiddenElements) ||\n canOverflow(style.overflowX, skipOverflowHiddenElements) ||\n isHiddenByFrame(el)\n )\n }\n\n return false\n}\n/**\n * Find out which edge to align against when logical scroll position is \"nearest\"\n * Interesting fact: \"nearest\" works similarily to \"if-needed\", if the element is fully visible it will not scroll it\n *\n * Legends:\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250F \u2501 \u2501 \u2501 \u2513\n * \u2502 target \u2502 frame\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2517 \u2501 \u2501 \u2501 \u251B\n */\nfunction alignNearest(\n scrollingEdgeStart: number,\n scrollingEdgeEnd: number,\n scrollingSize: number,\n scrollingBorderStart: number,\n scrollingBorderEnd: number,\n elementEdgeStart: number,\n elementEdgeEnd: number,\n elementSize: number\n) {\n /**\n * If element edge A and element edge B are both outside scrolling box edge A and scrolling box edge B\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502\n * \u2503 \u2502 \u2502 \u2503 do nothing\n * \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C and element edge D are both outside scrolling box edge C and scrolling box edge D\n *\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502\u2503 \u2503\u2502 do nothing\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart < scrollingEdgeStart &&\n elementEdgeEnd > scrollingEdgeEnd) ||\n (elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd)\n ) {\n return 0\n }\n\n /**\n * If element edge A is outside scrolling box edge A and element height is less than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2514\u2500\u2500\u2518 \u2502 \u2502\n * from \u2503 \u2503 to \u2503 \u2514\u2500\u2500\u2518 \u2503\n *\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501 \u2501\u2501 \u2501\u251B\n *\n * If element edge B is outside scrolling box edge B and element height is greater than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2502 \u2502\n * from \u2503 \u250C\u2500\u2500\u2510 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2502 \u2502 \u2514\u2500\u2500\u2518\n * \u2502 \u2502\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C is outside scrolling box edge C and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2503 \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize) ||\n (elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize)\n ) {\n return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart\n }\n\n /**\n * If element edge B is outside scrolling box edge B and element height is less than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501 \u2501\u2501 \u2501\u2513\n *\n * from \u2503 \u2503 to \u2503 \u250C\u2500\u2500\u2510 \u2503\n * \u250C\u2500\u2500\u2510 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge A is outside scrolling box edge A and element height is greater than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u2502 \u2502\n * \u2502 \u2502 \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502 \u2502 \u2502\n * from \u2503 \u2514\u2500\u2500\u2518 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n *\n * If element edge C is outside scrolling box edge C and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2502 \u2503 \u2503\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n */\n if (\n (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize) ||\n (elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize)\n ) {\n return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd\n }\n\n return 0\n}\n\nexport default (target: Element, options: Options): CustomScrollAction[] => {\n //TODO: remove this hack when microbundle will support typescript >= 4.0\n const windowWithViewport = (window as unknown) as Window & {\n visualViewport: visualViewport\n }\n\n const {\n scrollMode,\n block,\n inline,\n boundary,\n skipOverflowHiddenElements,\n } = options\n // Allow using a callback to check the boundary\n // The default behavior is to check if the current target matches the boundary element or not\n // If undefined it'll check that target is never undefined (can happen as we recurse up the tree)\n const checkBoundary =\n typeof boundary === 'function' ? boundary : (node: any) => node !== boundary\n\n if (!isElement(target)) {\n throw new TypeError('Invalid target')\n }\n\n // Used to handle the top most element that can be scrolled\n const scrollingElement = document.scrollingElement || document.documentElement\n\n // Collect all the scrolling boxes, as defined in the spec: https://drafts.csswg.org/cssom-view/#scrolling-box\n const frames: Element[] = []\n let cursor: Element | null = target\n while (isElement(cursor) && checkBoundary(cursor)) {\n // Move cursor to parent\n cursor = cursor.parentElement\n\n // Stop when we reach the viewport\n if (cursor === scrollingElement) {\n frames.push(cursor)\n break\n }\n\n // Skip document.body if it's not the scrollingElement and documentElement isn't independently scrollable\n if (\n cursor != null &&\n cursor === document.body &&\n isScrollable(cursor) &&\n !isScrollable(document.documentElement)\n ) {\n continue\n }\n\n // Now we check if the element is scrollable, this code only runs if the loop haven't already hit the viewport or a custom boundary\n if (cursor != null && isScrollable(cursor, skipOverflowHiddenElements)) {\n frames.push(cursor)\n }\n }\n\n // Support pinch-zooming properly, making sure elements scroll into the visual viewport\n // Browsers that don't support visualViewport will report the layout viewport dimensions on document.documentElement.clientWidth/Height\n // and viewport dimensions on window.innerWidth/Height\n // https://www.quirksmode.org/mobile/viewports2.html\n // https://bokand.github.io/viewport/index.html\n const viewportWidth = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.width\n : innerWidth\n const viewportHeight = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.height\n : innerHeight\n\n // Newer browsers supports scroll[X|Y], page[X|Y]Offset is\n const viewportX = window.scrollX || pageXOffset\n const viewportY = window.scrollY || pageYOffset\n\n const {\n height: targetHeight,\n width: targetWidth,\n top: targetTop,\n right: targetRight,\n bottom: targetBottom,\n left: targetLeft,\n } = target.getBoundingClientRect()\n\n // These values mutate as we loop through and generate scroll coordinates\n let targetBlock: number =\n block === 'start' || block === 'nearest'\n ? targetTop\n : block === 'end'\n ? targetBottom\n : targetTop + targetHeight / 2 // block === 'center\n let targetInline: number =\n inline === 'center'\n ? targetLeft + targetWidth / 2\n : inline === 'end'\n ? targetRight\n : targetLeft // inline === 'start || inline === 'nearest\n\n // Collect new scroll positions\n const computations: CustomScrollAction[] = []\n // In chrome there's no longer a difference between caching the `frames.length` to a var or not, so we don't in this case (size > speed anyways)\n for (let index = 0; index < frames.length; index++) {\n const frame = frames[index]\n\n // @TODO add a shouldScroll hook here that allows userland code to take control\n\n const {\n height,\n width,\n top,\n right,\n bottom,\n left,\n } = frame.getBoundingClientRect()\n\n // If the element is already visible we can end it here\n // @TODO targetBlock and targetInline should be taken into account to be compliant with https://github.com/w3c/csswg-drafts/pull/1805/files#diff-3c17f0e43c20f8ecf89419d49e7ef5e0R1333\n if (\n scrollMode === 'if-needed' &&\n targetTop >= 0 &&\n targetLeft >= 0 &&\n targetBottom <= viewportHeight &&\n targetRight <= viewportWidth &&\n targetTop >= top &&\n targetBottom <= bottom &&\n targetLeft >= left &&\n targetRight <= right\n ) {\n // Break the loop and return the computations for things that are not fully visible\n return computations\n }\n\n const frameStyle = getComputedStyle(frame)\n const borderLeft = parseInt(frameStyle.borderLeftWidth as string, 10)\n const borderTop = parseInt(frameStyle.borderTopWidth as string, 10)\n const borderRight = parseInt(frameStyle.borderRightWidth as string, 10)\n const borderBottom = parseInt(frameStyle.borderBottomWidth as string, 10)\n\n let blockScroll: number = 0\n let inlineScroll: number = 0\n\n // The property existance checks for offfset[Width|Height] is because only HTMLElement objects have them, but any Element might pass by here\n // @TODO find out if the \"as HTMLElement\" overrides can be dropped\n const scrollbarWidth =\n 'offsetWidth' in frame\n ? (frame as HTMLElement).offsetWidth -\n (frame as HTMLElement).clientWidth -\n borderLeft -\n borderRight\n : 0\n const scrollbarHeight =\n 'offsetHeight' in frame\n ? (frame as HTMLElement).offsetHeight -\n (frame as HTMLElement).clientHeight -\n borderTop -\n borderBottom\n : 0\n\n if (scrollingElement === frame) {\n // Handle viewport logic (document.documentElement or document.body)\n\n if (block === 'start') {\n blockScroll = targetBlock\n } else if (block === 'end') {\n blockScroll = targetBlock - viewportHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n viewportY,\n viewportY + viewportHeight,\n viewportHeight,\n borderTop,\n borderBottom,\n viewportY + targetBlock,\n viewportY + targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - viewportHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline\n } else if (inline === 'center') {\n inlineScroll = targetInline - viewportWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - viewportWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n viewportX,\n viewportX + viewportWidth,\n viewportWidth,\n borderLeft,\n borderRight,\n viewportX + targetInline,\n viewportX + targetInline + targetWidth,\n targetWidth\n )\n }\n\n // Apply scroll position offsets and ensure they are within bounds\n // @TODO add more test cases to cover this 100%\n blockScroll = Math.max(0, blockScroll + viewportY)\n inlineScroll = Math.max(0, inlineScroll + viewportX)\n } else {\n // Handle each scrolling frame that might exist between the target and the viewport\n\n if (block === 'start') {\n blockScroll = targetBlock - top - borderTop\n } else if (block === 'end') {\n blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n top,\n bottom,\n height,\n borderTop,\n borderBottom + scrollbarHeight,\n targetBlock,\n targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline - left - borderLeft\n } else if (inline === 'center') {\n inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - right + borderRight + scrollbarWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n left,\n right,\n width,\n borderLeft,\n borderRight + scrollbarWidth,\n targetInline,\n targetInline + targetWidth,\n targetWidth\n )\n }\n\n const { scrollLeft, scrollTop } = frame\n // Ensure scroll coordinates are not out of bounds while applying scroll offsets\n blockScroll = Math.max(\n 0,\n Math.min(\n scrollTop + blockScroll,\n frame.scrollHeight - height + scrollbarHeight\n )\n )\n inlineScroll = Math.max(\n 0,\n Math.min(\n scrollLeft + inlineScroll,\n frame.scrollWidth - width + scrollbarWidth\n )\n )\n\n // Cache the offset so that parent frames can scroll this into view correctly\n targetBlock += scrollTop - blockScroll\n targetInline += scrollLeft - inlineScroll\n }\n\n computations.push({ el: frame, top: blockScroll, left: inlineScroll })\n }\n\n return computations\n}\n", "import compute from 'compute-scroll-into-view';\n\nfunction isOptionsObject(options) {\n return options === Object(options) && Object.keys(options).length !== 0;\n}\n\nfunction defaultBehavior(actions, behavior) {\n if (behavior === void 0) {\n behavior = 'auto';\n }\n\n var canSmoothScroll = ('scrollBehavior' in document.body.style);\n actions.forEach(function (_ref) {\n var el = _ref.el,\n top = _ref.top,\n left = _ref.left;\n\n if (el.scroll && canSmoothScroll) {\n el.scroll({\n top: top,\n left: left,\n behavior: behavior\n });\n } else {\n el.scrollTop = top;\n el.scrollLeft = left;\n }\n });\n}\n\nfunction getOptions(options) {\n if (options === false) {\n return {\n block: 'end',\n inline: 'nearest'\n };\n }\n\n if (isOptionsObject(options)) {\n return options;\n }\n\n return {\n block: 'start',\n inline: 'nearest'\n };\n}\n\nfunction scrollIntoView(target, options) {\n var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);\n\n if (isOptionsObject(options) && typeof options.behavior === 'function') {\n return options.behavior(isTargetAttached ? compute(target, options) : []);\n }\n\n if (!isTargetAttached) {\n return;\n }\n\n var computeOptions = getOptions(options);\n return defaultBehavior(compute(target, computeOptions), computeOptions.behavior);\n}\n\nexport default scrollIntoView;", "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 getNativeEvent<E>(\n event: E,\n): React.ChangeEvent<any> extends E ? InputEvent : E extends React.SyntheticEvent<any, infer T> ? T : never {\n return (event as any).nativeEvent ?? event\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 { isDom, isIos, noop, pipe } from \"@zag-js/utils\"\nimport scrollIntoView from \"scroll-into-view-if-needed\"\nimport { addDomEvent } from \"./listener\"\nimport { getScrollParent } from \"./scrollable\"\n\ninterface PreventScrollOptions {\n disabled?: boolean\n allowPinchZoom?: boolean\n document?: Document\n}\n\n// HTML input types that do not cause the software keyboard to appear.\nconst nonTextInputTypes = new Set([\"checkbox\", \"radio\", \"range\", \"color\", \"file\", \"image\", \"button\", \"submit\", \"reset\"])\n\nexport function preventBodyScroll(opts?: PreventScrollOptions) {\n const { document: docProp, disabled = false, allowPinchZoom } = opts ?? {}\n\n const doc = docProp ?? document\n const win = doc?.defaultView ?? window\n\n const viewport = isDom() ? win.visualViewport : null\n const docEl = doc.documentElement\n\n function preventScrollStandard() {\n const fn = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n )\n return () => fn?.()\n }\n\n function preventScrollMobileSafari() {\n let scrollable: HTMLElement | undefined\n let lastY = 0\n\n let onTouchStart = (e: TouchEvent) => {\n scrollable = getScrollParent(e.target as HTMLElement)\n\n if (scrollable === docEl && scrollable === doc.body) {\n return\n }\n lastY = e.changedTouches[0].pageY\n }\n\n let onTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && allowPinchZoom) return\n\n if (!scrollable || scrollable === docEl || scrollable === doc.body) {\n e.preventDefault()\n return\n }\n\n let y = e.changedTouches[0].pageY\n let scrollTop = scrollable.scrollTop\n let bottom = scrollable.scrollHeight - scrollable.clientHeight\n\n if ((scrollTop <= 0 && y > lastY) || (scrollTop >= bottom && y < lastY)) {\n e.preventDefault()\n }\n\n lastY = y\n }\n\n let onTouchEnd = (e: TouchEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n e.preventDefault()\n target.style.transform = \"translateY(-2000px)\"\n target.focus()\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n })\n }\n }\n\n let onFocus = (e: FocusEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n target.style.transform = \"translateY(-2000px)\"\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n if (!viewport) return\n\n if (viewport.height < win.innerHeight) {\n win.requestAnimationFrame(function () {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n })\n } else {\n const onResize = () => {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n }\n addDomEvent(viewport, \"resize\", onResize, { once: true })\n }\n })\n }\n }\n\n let onWindowScroll = () => {\n win.scrollTo(0, 0)\n }\n\n let scrollX = win.scrollX\n let scrollY = win.scrollY\n let restoreStyles = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n setStyle(doc.body, \"marginTop\", `-${scrollY}px`),\n )\n\n win.scrollTo(0, 0)\n\n let removeEvents = pipe(\n addDomEvent(doc, \"touchstart\", onTouchStart, { passive: false, capture: true }),\n addDomEvent(doc, \"touchmove\", onTouchMove, { passive: false, capture: true }),\n addDomEvent(doc, \"touchend\", onTouchEnd, { passive: false, capture: true }),\n addDomEvent(doc, \"focus\", onFocus, true),\n addDomEvent(win, \"scroll\", onWindowScroll),\n )\n\n return () => {\n restoreStyles()\n removeEvents()\n win.scrollTo(scrollX, scrollY)\n }\n }\n\n if (disabled) return noop\n return isIos() ? preventScrollMobileSafari() : preventScrollStandard()\n}\n\nfunction setStyle(el: HTMLElement, key: string, value: string) {\n let cur = el.style[key]\n el.style[key] = value\n return () => {\n el.style[key] = cur\n }\n}\n\n// Backup lib: https://github.com/hanai/html-body-scroll-lock\n", "export const MAX_Z_INDEX = 2147483647\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 function () {\n run = false\n }\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 = false) => {\n if (!el) return []\n let els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n if (includeContainer && isHTMLElement(el)) {\n els.unshift(el)\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, includeContainer = false) => {\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", "export function getClosestFormElement(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 [\"textarea\", \"input\", \"select\", \"button\"].includes(el.localName)\n}\n\nexport function trackFormReset(el: HTMLElement | null | undefined, callback: () => void) {\n if (!el) return\n const form = getClosestFormElement(el)\n form?.addEventListener(\"reset\", callback, { passive: true })\n return () => {\n form?.removeEventListener(\"reset\", callback)\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 doc?: Document\n root?: HTMLElement | null\n delay?: number\n}\n\nexport type LiveRegion = ReturnType<typeof createLiveRegion>\n\nexport function createLiveRegion(opts: Partial<LiveRegionOptions> = {}) {\n const { level = \"polite\", doc: ownerDocument, root, delay: rootDelay = 0 } = opts\n\n const doc = ownerDocument ?? document\n const win = doc.defaultView ?? window\n\n const parent = root ?? doc.body\n\n function announce(msg: string, delay?: number) {\n const oldRegion = doc.getElementById(\"__live-region__\")\n\n // remove old region\n if (!!oldRegion) {\n parent.removeChild(oldRegion)\n }\n\n // Did an override level get set?\n delay = delay ?? rootDelay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = \"__live-region__\"\n\n // Determine redundant role\n var 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 = msg\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(\"__live-region__\")\n if (oldRegion) {\n parent.removeChild(oldRegion)\n }\n }\n\n return { announce, destroy }\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, subtree = false) {\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 })\n\n return () => obs.disconnect()\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\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const filtered = v.filter((item) => {\n const str = item.dataset.valuetext ?? item.textContent\n return !!str?.toLowerCase().startsWith(text.toLowerCase())\n })\n return currentId ? nextById(filtered, currentId) : null\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", "type PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n doc.addEventListener(\"webkitpointerlockchange\", fn, false)\n doc.addEventListener(\"mozpointerlockchange\", fn, false)\n doc.addEventListener(\"pointerlockchange\", fn, false)\n return function cleaup() {\n doc.removeEventListener(\"mozpointerlockchange\", fn, false)\n doc.removeEventListener(\"pointerlockchange\", fn, false)\n }\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"webkitpointerlockerror\", fn, false)\n doc.addEventListener(\"mozpointerlockerror\", fn, false)\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"webkitpointerlockerror\", fn, false)\n doc.removeEventListener(\"mozpointerlockerror\", fn, false)\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nfunction getPointerlockFunc(el: HTMLElement) {\n return el.requestPointerLock || (el as any).mozRequestPointerLock || (el as any).webkitRequestPointerLock\n}\n\nfunction getRemovePointerlockFunc(doc: Document) {\n return doc.exitPointerLock || (doc as any).mozExitPointerLock || (doc as any).webkitExitPointerLock\n}\n\nexport function getPointerlockElement(doc: Document) {\n return doc.pointerLockElement || (doc as any).mozPointerLockElement || (doc as any).webkitPointerLockElement\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n function isSupported() {\n return \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc || \"webkitPointerLockElement\" in doc\n }\n\n function hasLockElement() {\n return !!doc.pointerLockElement\n }\n\n function onPointerChange() {\n if (hasLockElement()) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n const isLocked = hasLockElement()\n if (isLocked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock = getRemovePointerlockFunc(doc)\n doc.exitPointerLock()\n }\n\n const cleanups: Set<Function> = new Set()\n\n function addEventListeners() {\n cleanups.add(addPointerlockChangeListener(doc, onPointerChange))\n cleanups.add(addPointerlockErrorListener(doc, onPointerError))\n }\n\n function dispose() {\n if (!isSupported()) return\n cleanups.forEach((fn) => fn())\n cleanups.clear()\n exit()\n }\n\n function setup() {\n if (!isSupported() || !hasLockElement()) return\n body.requestPointerLock = getPointerlockFunc(body)\n body.requestPointerLock()\n addEventListeners()\n }\n\n setup()\n return dispose\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\nconst observedElements: Map<Measurable, ObservedData> = new Map()\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\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 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 { 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", "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", "function getSide(placement) {\n return placement.split('-')[0];\n}\n\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'x' : 'y';\n}\n\nfunction getLengthFromAxis(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n const commonAlign = reference[length] / 2 - floating[length] / 2;\n const side = getSide(placement);\n const isVertical = mainAxis === 'x';\n let coords;\n\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n\n switch (getAlignment(placement)) {\n case 'start':\n coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n\n case 'end':\n coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain positioning strategy.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\n\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n\n if (process.env.NODE_ENV !== \"production\") {\n if (platform == null) {\n console.error(['Floating UI: `platform` property was not passed to config. If you', 'want to use Floating UI on the web, install @floating-ui/dom', 'instead of the /core package. Otherwise, you can create your own', '`platform`: https://floating-ui.com/docs/platform'].join(' '));\n }\n\n if (middleware.filter(_ref => {\n let {\n name\n } = _ref;\n return name === 'autoPlacement' || name === 'flip';\n }).length > 1) {\n throw new Error(['Floating UI: duplicate `flip` and/or `autoPlacement`', 'middleware detected. This will lead to an infinite loop. Ensure only', 'one of either has been passed to the `middleware` array.'].join(' '));\n }\n }\n\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let _debug_loop_count_ = 0;\n\n for (let i = 0; i < middleware.length; i++) {\n if (process.env.NODE_ENV !== \"production\") {\n _debug_loop_count_++;\n\n if (_debug_loop_count_ > 100) {\n throw new Error(['Floating UI: The middleware lifecycle appears to be', 'running in an infinite loop. This is usually caused by a `reset`', 'continually being returned without a break condition.'].join(' '));\n }\n }\n\n const {\n name,\n fn\n } = middleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = { ...middlewareData,\n [name]: { ...middlewareData[name],\n ...data\n }\n };\n\n if (reset) {\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n\n i = -1;\n continue;\n }\n }\n\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\n\nfunction getSideObjectFromPadding(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\n\nfunction rectToClientRect(rect) {\n return { ...rect,\n top: rect.y,\n left: rect.x,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(middlewareArguments, options) {\n var _await$platform$isEle;\n\n if (options === void 0) {\n options = {};\n }\n\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = middlewareArguments;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = options;\n const paddingObject = getSideObjectFromPadding(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: elementContext === 'floating' ? { ...rects.floating,\n x,\n y\n } : rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects[elementContext]); // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n return {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n}\n\nconst min = Math.min;\nconst max = Math.max;\n\nfunction within(min$1, value, max$1) {\n return max(min$1, min(value, max$1));\n}\n\n/**\n * Positions an inner element of the floating element such that it is centered\n * to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n\n async fn(middlewareArguments) {\n // Since `element` is required, we don't Partial<> the type\n const {\n element,\n padding = 0\n } = options != null ? options : {};\n const {\n x,\n y,\n placement,\n rects,\n platform\n } = middlewareArguments;\n\n if (element == null) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn('Floating UI: No `element` was passed to the `arrow` middleware.');\n }\n\n return {};\n }\n\n const paddingObject = getSideObjectFromPadding(padding);\n const coords = {\n x,\n y\n };\n const axis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const minProp = axis === 'y' ? 'top' : 'left';\n const maxProp = axis === 'y' ? 'bottom' : 'right';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n const clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n const centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside of the floating element's bounds\n\n const min = paddingObject[minProp];\n const max = clientSize - arrowDimensions[length] - paddingObject[maxProp];\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = within(min, center, max);\n return {\n data: {\n [axis]: offset,\n centerOffset: center - offset\n }\n };\n }\n\n});\n\nconst hash$1 = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, matched => hash$1[matched]);\n}\n\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n\n const alignment = getAlignment(placement);\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n let mainAlignmentSide = mainAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n\n return {\n main: mainAlignmentSide,\n cross: getOppositePlacement(mainAlignmentSide)\n };\n}\n\nconst hash = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, matched => hash[matched]);\n}\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst allPlacements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-start\", side + \"-end\"), []);\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n\n return true;\n });\n}\n\n/**\n * Automatically chooses the `placement` which has the most space available.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'autoPlacement',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$autoP, _middlewareData$autoP2, _middlewareData$autoP3, _middlewareData$autoP4, _placementsSortedByLe;\n\n const {\n x,\n y,\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = middlewareArguments;\n const {\n alignment = null,\n allowedPlacements = allPlacements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = options;\n const placements = getPlacementList(alignment, autoAlignment, allowedPlacements);\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const currentIndex = (_middlewareData$autoP = (_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.index) != null ? _middlewareData$autoP : 0;\n const currentPlacement = placements[currentIndex];\n\n if (currentPlacement == null) {\n return {};\n }\n\n const {\n main,\n cross\n } = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))); // Make `computeCoords` start from the right place\n\n if (placement !== currentPlacement) {\n return {\n x,\n y,\n reset: {\n placement: placements[0]\n }\n };\n }\n\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[main], overflow[cross]];\n const allOverflows = [...((_middlewareData$autoP3 = (_middlewareData$autoP4 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP4.overflows) != null ? _middlewareData$autoP3 : []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements[currentIndex + 1]; // There are more placements to check\n\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n const placementsSortedByLeastOverflow = allOverflows.slice().sort((a, b) => a.overflows[0] - b.overflows[0]);\n const placementThatFitsOnAllSides = (_placementsSortedByLe = placementsSortedByLeastOverflow.find(_ref => {\n let {\n overflows\n } = _ref;\n return overflows.every(overflow => overflow <= 0);\n })) == null ? void 0 : _placementsSortedByLe.placement;\n const resetPlacement = placementThatFitsOnAllSides != null ? placementThatFitsOnAllSides : placementsSortedByLeastOverflow[0].placement;\n\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\n\n/**\n * Changes the placement of the floating element to one that will fit if the\n * initially specified `placement` does not.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'flip',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$flip;\n\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n flipAlignment = true,\n ...detectOverflowOptions\n } = options;\n const side = getSide(placement);\n const isBasePlacement = side === initialPlacement;\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n\n if (checkCrossAxis) {\n const {\n main,\n cross\n } = getAlignmentSides(placement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n overflows.push(overflow[main], overflow[cross]);\n }\n\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }]; // One or more sides is overflowing\n\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip$, _middlewareData$flip2;\n\n const nextIndex = ((_middlewareData$flip$ = (_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) != null ? _middlewareData$flip$ : 0) + 1;\n const nextPlacement = placements[nextIndex];\n\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n let resetPlacement = 'bottom';\n\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$slice$;\n\n const placement = (_overflowsData$slice$ = overflowsData.slice().sort((a, b) => a.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0) - b.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0))[0]) == null ? void 0 : _overflowsData$slice$.placement;\n\n if (placement) {\n resetPlacement = placement;\n }\n\n break;\n }\n\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n\n return {};\n }\n\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (_temp) {\n let {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = _temp === void 0 ? {} : _temp;\n return {\n name: 'hide',\n\n async fn(middlewareArguments) {\n const {\n rects\n } = middlewareArguments;\n\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n case 'escaped':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n default:\n {\n return {};\n }\n }\n }\n\n };\n};\n\nfunction convertValueToCoords(placement, rects, value, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getMainAxisFromPlacement(placement) === 'x';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = typeof value === 'function' ? value({ ...rects,\n placement\n }) : value;\n const isNumber = typeof rawValue === 'number'; // eslint-disable-next-line prefer-const\n\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = isNumber ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n/**\n * Displaces the floating element from its reference element.\n * @see https://floating-ui.com/docs/offset\n */\n\nconst offset = function (value) {\n if (value === void 0) {\n value = 0;\n }\n\n return {\n name: 'offset',\n options: value,\n\n async fn(middlewareArguments) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements\n } = middlewareArguments;\n const diffCoords = convertValueToCoords(placement, rects, value, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: diffCoords\n };\n }\n\n };\n};\n\nfunction getCrossAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\n/**\n * Shifts the floating element in order to keep it in view when it will overflow\n * a clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'shift',\n options,\n\n async fn(middlewareArguments) {\n const {\n x,\n y,\n placement\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = options;\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const mainAxis = getMainAxisFromPlacement(getSide(placement));\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = within(min, mainAxisCoord, max);\n }\n\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = within(min, crossAxisCoord, max);\n }\n\n const limitedCoords = limiter.fn({ ...middlewareArguments,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return { ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n\n };\n};\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n options,\n\n fn(middlewareArguments) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = middlewareArguments;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = options;\n const coords = {\n x,\n y\n };\n const mainAxis = getMainAxisFromPlacement(placement);\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = typeof offset === 'function' ? offset({ ...rects,\n placement\n }) : offset;\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2, _middlewareData$offse3, _middlewareData$offse4;\n\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? (_middlewareData$offse = (_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) != null ? _middlewareData$offse : 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : (_middlewareData$offse3 = (_middlewareData$offse4 = middlewareData.offset) == null ? void 0 : _middlewareData$offse4[crossAxis]) != null ? _middlewareData$offse3 : 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n\n };\n};\n\n/**\n * Provides data to change the size of the floating element. For instance,\n * prevent it from overflowing its clipping boundary or match the width of the\n * reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'size',\n options,\n\n async fn(middlewareArguments) {\n const {\n placement,\n rects,\n platform,\n elements\n } = middlewareArguments;\n const {\n apply,\n ...detectOverflowOptions\n } = options;\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n let heightSide;\n let widthSide;\n\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n const dimensions = {\n height: rects.floating.height - (['left', 'right'].includes(placement) ? 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)) : overflow[heightSide]),\n width: rects.floating.width - (['top', 'bottom'].includes(placement) ? 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)) : overflow[widthSide])\n };\n const prevDimensions = await platform.getDimensions(elements.floating);\n apply == null ? void 0 : apply({ ...dimensions,\n ...rects\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n\n if (prevDimensions.width !== nextDimensions.width || prevDimensions.height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'inline',\n options,\n\n async fn(middlewareArguments) {\n var _await$platform$getCl;\n\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = middlewareArguments; // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n\n const {\n padding = 2,\n x,\n y\n } = options;\n const fallback = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects.reference);\n const clientRects = (_await$platform$getCl = await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) != null ? _await$platform$getCl : [];\n const paddingObject = getSideObjectFromPadding(padding);\n\n function getBoundingClientRect() {\n // There are two rects and they are disjoined\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n var _clientRects$find;\n\n // Find the first rect in which the point is fully inside\n return (_clientRects$find = clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom)) != null ? _clientRects$find : fallback;\n } // There are 2 or more connected rects\n\n\n if (clientRects.length >= 2) {\n if (getMainAxisFromPlacement(placement) === 'x') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n return fallback;\n }\n\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, rectToClientRect, shift, size };\n", "import { rectToClientRect, computePosition as computePosition$1 } from '@floating-ui/core';\nexport { arrow, autoPlacement, detectOverflow, flip, hide, inline, limitShift, offset, shift, size } from '@floating-ui/core';\n\nfunction isWindow(value) {\n return value && value.document && value.location && value.alert && value.setInterval;\n}\nfunction getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (!isWindow(node)) {\n const ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}\n\nfunction getComputedStyle$1(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction getNodeName(node) {\n return isWindow(node) ? '' : node ? (node.nodeName || '').toLowerCase() : '';\n}\n\nfunction isHTMLElement(value) {\n return value instanceof getWindow(value).HTMLElement;\n}\nfunction isElement(value) {\n return value instanceof getWindow(value).Element;\n}\nfunction isNode(value) {\n return value instanceof getWindow(value).Node;\n}\nfunction isShadowRoot(node) {\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\nfunction isOverflowElement(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle$1(element);\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n // TODO: Try and use feature detection here instead\n const isFirefox = navigator.userAgent.toLowerCase().includes('firefox');\n const css = getComputedStyle$1(element); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n return css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].includes(css.willChange) || isFirefox && css.willChange === 'filter' || isFirefox && (css.filter ? css.filter !== 'none' : false);\n}\nfunction isLayoutViewport() {\n // Not Safari\n return !/^((?!chrome|android).)*safari/i.test(navigator.userAgent); // Feature detection for this fails in various ways\n // \u2022 Always-visible scrollbar or not\n // \u2022 Width of <html>, etc.\n // const vV = win.visualViewport;\n // return vV ? Math.abs(win.innerWidth / vV.scale - vV.width) < 0.5 : true;\n}\n\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n const clientRect = element.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n const win = isElement(element) ? getWindow(element) : window;\n const addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n const x = (clientRect.left + (addVisualOffsets ? win.visualViewport.offsetLeft : 0)) / scaleX;\n const y = (clientRect.top + (addVisualOffsets ? win.visualViewport.offsetTop : 0)) / scaleY;\n const width = clientRect.width / scaleX;\n const height = clientRect.height / scaleY;\n return {\n width,\n height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x,\n y\n };\n}\n\nfunction getDocumentElement(node) {\n return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement;\n}\n\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n\n return {\n scrollLeft: element.pageXOffset,\n scrollTop: element.pageYOffset\n };\n}\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\nfunction isScaled(element) {\n const rect = getBoundingClientRect(element);\n return round(rect.width) !== element.offsetWidth || round(rect.height) !== element.offsetHeight;\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const rect = getBoundingClientRect(element, isOffsetParentAnElement && isScaled(offsetParent), strategy === 'fixed');\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // @ts-ignore\n node.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n node.parentNode || ( // DOM Element detected\n isShadowRoot(node) ? node.host : null) || // ShadowRoot detected\n getDocumentElement(node) // fallback\n\n );\n}\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n}\n\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && !['html', 'body'].includes(getNodeName(currentNode))) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n const window = getWindow(element);\n let offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n\nfunction getDimensions(element) {\n if (isHTMLElement(element)) {\n return {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n }\n\n const rect = getBoundingClientRect(element);\n return {\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n\n if (offsetParent === documentElement) {\n return rect;\n }\n\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } // This doesn't appear to be need to be negated.\n // else if (documentElement) {\n // offsets.x = getWindowScrollBarX(documentElement);\n // }\n\n }\n\n return { ...rect,\n x: rect.x - scroll.scrollLeft + offsets.x,\n y: rect.y - scroll.scrollTop + offsets.y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var _element$ownerDocumen;\n\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n const width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n const height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n\n if (getComputedStyle$1(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n\n if (['html', 'body', '#document'].includes(getNodeName(parentNode))) {\n // @ts-ignore assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode);\n}\n\nfunction getOverflowAncestors(node, list) {\n var _node$ownerDocument;\n\n if (list === void 0) {\n list = [];\n }\n\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body);\n const win = getWindow(scrollableAncestor);\n const target = isBody ? [win].concat(win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []) : scrollableAncestor;\n const updatedList = list.concat(target);\n return isBody ? updatedList : // @ts-ignore: isBody tells us target will be an HTMLElement here\n updatedList.concat(getOverflowAncestors(getParentNode(target)));\n}\n\nfunction contains(parent, child) {\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n\n do {\n // use `===` replace node.isSameNode()\n if (next && parent === next) {\n return true;\n } // @ts-ignore: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n }\n\n return false;\n}\n\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, false, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n return {\n top,\n left,\n x: left,\n y: top,\n right: left + element.clientWidth,\n bottom: top + element.clientHeight,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getClientRectFromClippingAncestor(element, clippingParent, strategy) {\n if (clippingParent === 'viewport') {\n return rectToClientRect(getViewportRect(element, strategy));\n }\n\n if (isElement(clippingParent)) {\n return getInnerBoundingClientRect(clippingParent, strategy);\n }\n\n return rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping ancestor\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingAncestors(element) {\n const clippingAncestors = getOverflowAncestors(element);\n const canEscapeClipping = ['absolute', 'fixed'].includes(getComputedStyle$1(element).position);\n const clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // @ts-ignore isElement check ensures we return Array<Element>\n\n\n return clippingAncestors.filter(clippingAncestors => isElement(clippingAncestors) && contains(clippingAncestors, clipperElement) && getNodeName(clippingAncestors) !== 'body');\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors\n\n\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const mainClippingAncestors = boundary === 'clippingAncestors' ? getClippingAncestors(element) : [].concat(boundary);\n const clippingAncestors = [...mainClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nconst platform = {\n getClippingRect,\n convertOffsetParentRelativeRectToViewportRelativeRect,\n isElement,\n getDimensions,\n getOffsetParent,\n getDocumentElement,\n getElementRects: _ref => {\n let {\n reference,\n floating,\n strategy\n } = _ref;\n return {\n reference: getRectRelativeToOffsetParent(reference, getOffsetParent(floating), strategy),\n floating: { ...getDimensions(floating),\n x: 0,\n y: 0\n }\n };\n },\n getClientRects: element => Array.from(element.getClientRects()),\n isRTL: element => getComputedStyle$1(element).direction === 'rtl'\n};\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n\n const {\n ancestorScroll: _ancestorScroll = true,\n ancestorResize: _ancestorResize = true,\n elementResize: _elementResize = true,\n animationFrame = false\n } = options;\n let cleanedUp = false;\n const ancestorScroll = _ancestorScroll && !animationFrame;\n const ancestorResize = _ancestorResize && !animationFrame;\n const elementResize = _elementResize && !animationFrame;\n const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n let observer = null;\n\n if (elementResize) {\n observer = new ResizeObserver(update);\n isElement(reference) && observer.observe(reference);\n observer.observe(floating);\n }\n\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n\n if (animationFrame) {\n frameLoop();\n }\n\n function frameLoop() {\n if (cleanedUp) {\n return;\n }\n\n const nextRefRect = getBoundingClientRect(reference);\n\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n\n return () => {\n var _observer;\n\n cleanedUp = true;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n (_observer = observer) == null ? void 0 : _observer.disconnect();\n observer = null;\n\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain CSS positioning\n * strategy.\n */\n\nconst computePosition = (reference, floating, options) => computePosition$1(reference, floating, {\n platform,\n ...options\n});\n\nexport { autoUpdate, computePosition, getOverflowAncestors };\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", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nconst styleCache: WeakMap<HTMLElement, Styles> = new WeakMap()\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n let style: Styles | undefined = styleCache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n styleCache.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 forceReflow() {\n return document.body.offsetHeight\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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\nconst listenerElements: Map<El, Group> = new Map()\nconst listenerCache: Map<El, Map<string, Handler>> = new Map()\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 globalEventBus(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\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 { globalEventBus } from \"./event-bus\"\nimport {\n AnyPointerEvent,\n DOMEventTarget,\n EventMap,\n PointerEventInfo,\n PointerNameMap,\n RefTarget,\n} from \"./listener.types\"\n\nconst t = (v: any) => Object.prototype.toString.call(v).slice(8, -1)\nconst isRef = (v: any): v is RefTarget => t(v) === \"Object\" && \"current\" in v\nconst runIfFn = (fn: any): HTMLElement | null => (t(fn) === \"Function\" ? fn() : fn)\nconst isTouchEvent = (v: Event): v is TouchEvent => t(v) === \"Object\" && !!(v as TouchEvent).touches\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 globalEventBus(node, 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 supportsPointerEvent = () => typeof window !== \"undefined\" && window.onpointerdown === null\nconst supportsTouchEvent = () => typeof window !== \"undefined\" && window.ontouchstart === null\nconst supportsMouseEvent = () => typeof window !== \"undefined\" && window.onmousedown === null\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", "// Compute what scrolling needs to be done on required scrolling boxes for target to be in view\n\n// The type names here are named after the spec to make it easier to find more information around what they mean:\n// To reduce churn and reduce things that need be maintained things from the official TS DOM library is used here\n// https://drafts.csswg.org/cssom-view/\n\n// For a definition on what is \"block flow direction\" exactly, check this: https://drafts.csswg.org/css-writing-modes-4/#block-flow-direction\n\n// add support for visualViewport object currently implemented in chrome\ninterface visualViewport {\n height: number\n width: number\n}\n\ntype ScrollLogicalPosition = 'start' | 'center' | 'end' | 'nearest'\n// This new option is tracked in this PR, which is the most likely candidate at the time: https://github.com/w3c/csswg-drafts/pull/1805\ntype ScrollMode = 'always' | 'if-needed'\n// New option that skips auto-scrolling all nodes with overflow: hidden set\n// See FF implementation: https://hg.mozilla.org/integration/fx-team/rev/c48c3ec05012#l7.18\ntype SkipOverflowHiddenElements = boolean\n\ninterface Options {\n block?: ScrollLogicalPosition\n inline?: ScrollLogicalPosition\n scrollMode?: ScrollMode\n boundary?: CustomScrollBoundary\n skipOverflowHiddenElements?: SkipOverflowHiddenElements\n}\n\n// Custom behavior, not in any spec\ntype CustomScrollBoundaryCallback = (parent: Element) => boolean\ntype CustomScrollBoundary = Element | CustomScrollBoundaryCallback | null\ninterface CustomScrollAction {\n el: Element\n top: number\n left: number\n}\n\n// @TODO better shadowdom test, 11 = document fragment\nfunction isElement(el: any): el is Element {\n return typeof el === 'object' && el != null && el.nodeType === 1\n}\n\nfunction canOverflow(\n overflow: string | null,\n skipOverflowHiddenElements?: boolean\n) {\n if (skipOverflowHiddenElements && overflow === 'hidden') {\n return false\n }\n\n return overflow !== 'visible' && overflow !== 'clip'\n}\n\nfunction getFrameElement(el: Element) {\n if (!el.ownerDocument || !el.ownerDocument.defaultView) {\n return null\n }\n\n try {\n return el.ownerDocument.defaultView.frameElement\n } catch (e) {\n return null\n }\n}\n\nfunction isHiddenByFrame(el: Element): boolean {\n const frame = getFrameElement(el)\n if (!frame) {\n return false\n }\n\n return (\n frame.clientHeight < el.scrollHeight || frame.clientWidth < el.scrollWidth\n )\n}\n\nfunction isScrollable(el: Element, skipOverflowHiddenElements?: boolean) {\n if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n const style = getComputedStyle(el, null)\n return (\n canOverflow(style.overflowY, skipOverflowHiddenElements) ||\n canOverflow(style.overflowX, skipOverflowHiddenElements) ||\n isHiddenByFrame(el)\n )\n }\n\n return false\n}\n/**\n * Find out which edge to align against when logical scroll position is \"nearest\"\n * Interesting fact: \"nearest\" works similarily to \"if-needed\", if the element is fully visible it will not scroll it\n *\n * Legends:\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250F \u2501 \u2501 \u2501 \u2513\n * \u2502 target \u2502 frame\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2517 \u2501 \u2501 \u2501 \u251B\n */\nfunction alignNearest(\n scrollingEdgeStart: number,\n scrollingEdgeEnd: number,\n scrollingSize: number,\n scrollingBorderStart: number,\n scrollingBorderEnd: number,\n elementEdgeStart: number,\n elementEdgeEnd: number,\n elementSize: number\n) {\n /**\n * If element edge A and element edge B are both outside scrolling box edge A and scrolling box edge B\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502\n * \u2503 \u2502 \u2502 \u2503 do nothing\n * \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C and element edge D are both outside scrolling box edge C and scrolling box edge D\n *\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502\u2503 \u2503\u2502 do nothing\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart < scrollingEdgeStart &&\n elementEdgeEnd > scrollingEdgeEnd) ||\n (elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd)\n ) {\n return 0\n }\n\n /**\n * If element edge A is outside scrolling box edge A and element height is less than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2514\u2500\u2500\u2518 \u2502 \u2502\n * from \u2503 \u2503 to \u2503 \u2514\u2500\u2500\u2518 \u2503\n *\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501 \u2501\u2501 \u2501\u251B\n *\n * If element edge B is outside scrolling box edge B and element height is greater than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501\u250C\u2501\u2501\u2510\u2501\u2513\n * \u2502 \u2502\n * from \u2503 \u250C\u2500\u2500\u2510 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B\n * \u2502 \u2502 \u2514\u2500\u2500\u2518\n * \u2502 \u2502\n * \u2514\u2500\u2500\u2518\n *\n * If element edge C is outside scrolling box edge C and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2503 \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n */\n if (\n (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize) ||\n (elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize)\n ) {\n return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart\n }\n\n /**\n * If element edge B is outside scrolling box edge B and element height is less than scrolling box height\n *\n * \u250F\u2501 \u2501\u2501 \u2501\u2513 \u250F\u2501 \u2501\u2501 \u2501\u2513\n *\n * from \u2503 \u2503 to \u2503 \u250C\u2500\u2500\u2510 \u2503\n * \u250C\u2500\u2500\u2510 \u2502 \u2502\n * \u2517\u2501\u2502\u2501\u2501\u2502\u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n * \u2514\u2500\u2500\u2518\n *\n * If element edge A is outside scrolling box edge A and element height is greater than scrolling box height\n *\n * \u250C\u2500\u2500\u2510\n * \u2502 \u2502\n * \u2502 \u2502 \u250C\u2500\u2500\u2510\n * \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513 \u250F\u2501\u2502\u2501\u2501\u2502\u2501\u2513\n * \u2502 \u2502 \u2502 \u2502\n * from \u2503 \u2514\u2500\u2500\u2518 \u2503 to \u2503 \u2502 \u2502 \u2503\n * \u2502 \u2502\n * \u2517\u2501 \u2501\u2501 \u2501\u251B \u2517\u2501\u2514\u2501\u2501\u2518\u2501\u251B\n *\n * If element edge C is outside scrolling box edge C and element width is greater than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \u2503 \u2502 \u2503 \u2502 \u2503 \u2503\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n * If element edge D is outside scrolling box edge D and element width is less than scrolling box width\n *\n * from to\n * \u250F \u2501 \u2501 \u2501 \u2501 \u2513 \u250F \u2501 \u2501 \u2501 \u2501 \u2513\n * \u250C\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2510\n * \u2503 \u2502 \u2503 \u2502 \u2503 \u2502 \u2503\n * \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\n * \u2517 \u2501 \u2501 \u2501 \u2501 \u251B \u2517 \u2501 \u2501 \u2501 \u2501 \u251B\n *\n */\n if (\n (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize) ||\n (elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize)\n ) {\n return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd\n }\n\n return 0\n}\n\nexport default (target: Element, options: Options): CustomScrollAction[] => {\n //TODO: remove this hack when microbundle will support typescript >= 4.0\n const windowWithViewport = (window as unknown) as Window & {\n visualViewport: visualViewport\n }\n\n const {\n scrollMode,\n block,\n inline,\n boundary,\n skipOverflowHiddenElements,\n } = options\n // Allow using a callback to check the boundary\n // The default behavior is to check if the current target matches the boundary element or not\n // If undefined it'll check that target is never undefined (can happen as we recurse up the tree)\n const checkBoundary =\n typeof boundary === 'function' ? boundary : (node: any) => node !== boundary\n\n if (!isElement(target)) {\n throw new TypeError('Invalid target')\n }\n\n // Used to handle the top most element that can be scrolled\n const scrollingElement = document.scrollingElement || document.documentElement\n\n // Collect all the scrolling boxes, as defined in the spec: https://drafts.csswg.org/cssom-view/#scrolling-box\n const frames: Element[] = []\n let cursor: Element | null = target\n while (isElement(cursor) && checkBoundary(cursor)) {\n // Move cursor to parent\n cursor = cursor.parentElement\n\n // Stop when we reach the viewport\n if (cursor === scrollingElement) {\n frames.push(cursor)\n break\n }\n\n // Skip document.body if it's not the scrollingElement and documentElement isn't independently scrollable\n if (\n cursor != null &&\n cursor === document.body &&\n isScrollable(cursor) &&\n !isScrollable(document.documentElement)\n ) {\n continue\n }\n\n // Now we check if the element is scrollable, this code only runs if the loop haven't already hit the viewport or a custom boundary\n if (cursor != null && isScrollable(cursor, skipOverflowHiddenElements)) {\n frames.push(cursor)\n }\n }\n\n // Support pinch-zooming properly, making sure elements scroll into the visual viewport\n // Browsers that don't support visualViewport will report the layout viewport dimensions on document.documentElement.clientWidth/Height\n // and viewport dimensions on window.innerWidth/Height\n // https://www.quirksmode.org/mobile/viewports2.html\n // https://bokand.github.io/viewport/index.html\n const viewportWidth = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.width\n : innerWidth\n const viewportHeight = windowWithViewport.visualViewport\n ? windowWithViewport.visualViewport.height\n : innerHeight\n\n // Newer browsers supports scroll[X|Y], page[X|Y]Offset is\n const viewportX = window.scrollX || pageXOffset\n const viewportY = window.scrollY || pageYOffset\n\n const {\n height: targetHeight,\n width: targetWidth,\n top: targetTop,\n right: targetRight,\n bottom: targetBottom,\n left: targetLeft,\n } = target.getBoundingClientRect()\n\n // These values mutate as we loop through and generate scroll coordinates\n let targetBlock: number =\n block === 'start' || block === 'nearest'\n ? targetTop\n : block === 'end'\n ? targetBottom\n : targetTop + targetHeight / 2 // block === 'center\n let targetInline: number =\n inline === 'center'\n ? targetLeft + targetWidth / 2\n : inline === 'end'\n ? targetRight\n : targetLeft // inline === 'start || inline === 'nearest\n\n // Collect new scroll positions\n const computations: CustomScrollAction[] = []\n // In chrome there's no longer a difference between caching the `frames.length` to a var or not, so we don't in this case (size > speed anyways)\n for (let index = 0; index < frames.length; index++) {\n const frame = frames[index]\n\n // @TODO add a shouldScroll hook here that allows userland code to take control\n\n const {\n height,\n width,\n top,\n right,\n bottom,\n left,\n } = frame.getBoundingClientRect()\n\n // If the element is already visible we can end it here\n // @TODO targetBlock and targetInline should be taken into account to be compliant with https://github.com/w3c/csswg-drafts/pull/1805/files#diff-3c17f0e43c20f8ecf89419d49e7ef5e0R1333\n if (\n scrollMode === 'if-needed' &&\n targetTop >= 0 &&\n targetLeft >= 0 &&\n targetBottom <= viewportHeight &&\n targetRight <= viewportWidth &&\n targetTop >= top &&\n targetBottom <= bottom &&\n targetLeft >= left &&\n targetRight <= right\n ) {\n // Break the loop and return the computations for things that are not fully visible\n return computations\n }\n\n const frameStyle = getComputedStyle(frame)\n const borderLeft = parseInt(frameStyle.borderLeftWidth as string, 10)\n const borderTop = parseInt(frameStyle.borderTopWidth as string, 10)\n const borderRight = parseInt(frameStyle.borderRightWidth as string, 10)\n const borderBottom = parseInt(frameStyle.borderBottomWidth as string, 10)\n\n let blockScroll: number = 0\n let inlineScroll: number = 0\n\n // The property existance checks for offfset[Width|Height] is because only HTMLElement objects have them, but any Element might pass by here\n // @TODO find out if the \"as HTMLElement\" overrides can be dropped\n const scrollbarWidth =\n 'offsetWidth' in frame\n ? (frame as HTMLElement).offsetWidth -\n (frame as HTMLElement).clientWidth -\n borderLeft -\n borderRight\n : 0\n const scrollbarHeight =\n 'offsetHeight' in frame\n ? (frame as HTMLElement).offsetHeight -\n (frame as HTMLElement).clientHeight -\n borderTop -\n borderBottom\n : 0\n\n if (scrollingElement === frame) {\n // Handle viewport logic (document.documentElement or document.body)\n\n if (block === 'start') {\n blockScroll = targetBlock\n } else if (block === 'end') {\n blockScroll = targetBlock - viewportHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n viewportY,\n viewportY + viewportHeight,\n viewportHeight,\n borderTop,\n borderBottom,\n viewportY + targetBlock,\n viewportY + targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - viewportHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline\n } else if (inline === 'center') {\n inlineScroll = targetInline - viewportWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - viewportWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n viewportX,\n viewportX + viewportWidth,\n viewportWidth,\n borderLeft,\n borderRight,\n viewportX + targetInline,\n viewportX + targetInline + targetWidth,\n targetWidth\n )\n }\n\n // Apply scroll position offsets and ensure they are within bounds\n // @TODO add more test cases to cover this 100%\n blockScroll = Math.max(0, blockScroll + viewportY)\n inlineScroll = Math.max(0, inlineScroll + viewportX)\n } else {\n // Handle each scrolling frame that might exist between the target and the viewport\n\n if (block === 'start') {\n blockScroll = targetBlock - top - borderTop\n } else if (block === 'end') {\n blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight\n } else if (block === 'nearest') {\n blockScroll = alignNearest(\n top,\n bottom,\n height,\n borderTop,\n borderBottom + scrollbarHeight,\n targetBlock,\n targetBlock + targetHeight,\n targetHeight\n )\n } else {\n // block === 'center' is the default\n blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2\n }\n\n if (inline === 'start') {\n inlineScroll = targetInline - left - borderLeft\n } else if (inline === 'center') {\n inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2\n } else if (inline === 'end') {\n inlineScroll = targetInline - right + borderRight + scrollbarWidth\n } else {\n // inline === 'nearest' is the default\n inlineScroll = alignNearest(\n left,\n right,\n width,\n borderLeft,\n borderRight + scrollbarWidth,\n targetInline,\n targetInline + targetWidth,\n targetWidth\n )\n }\n\n const { scrollLeft, scrollTop } = frame\n // Ensure scroll coordinates are not out of bounds while applying scroll offsets\n blockScroll = Math.max(\n 0,\n Math.min(\n scrollTop + blockScroll,\n frame.scrollHeight - height + scrollbarHeight\n )\n )\n inlineScroll = Math.max(\n 0,\n Math.min(\n scrollLeft + inlineScroll,\n frame.scrollWidth - width + scrollbarWidth\n )\n )\n\n // Cache the offset so that parent frames can scroll this into view correctly\n targetBlock += scrollTop - blockScroll\n targetInline += scrollLeft - inlineScroll\n }\n\n computations.push({ el: frame, top: blockScroll, left: inlineScroll })\n }\n\n return computations\n}\n", "import compute from 'compute-scroll-into-view';\n\nfunction isOptionsObject(options) {\n return options === Object(options) && Object.keys(options).length !== 0;\n}\n\nfunction defaultBehavior(actions, behavior) {\n if (behavior === void 0) {\n behavior = 'auto';\n }\n\n var canSmoothScroll = ('scrollBehavior' in document.body.style);\n actions.forEach(function (_ref) {\n var el = _ref.el,\n top = _ref.top,\n left = _ref.left;\n\n if (el.scroll && canSmoothScroll) {\n el.scroll({\n top: top,\n left: left,\n behavior: behavior\n });\n } else {\n el.scrollTop = top;\n el.scrollLeft = left;\n }\n });\n}\n\nfunction getOptions(options) {\n if (options === false) {\n return {\n block: 'end',\n inline: 'nearest'\n };\n }\n\n if (isOptionsObject(options)) {\n return options;\n }\n\n return {\n block: 'start',\n inline: 'nearest'\n };\n}\n\nfunction scrollIntoView(target, options) {\n var isTargetAttached = target.isConnected || target.ownerDocument.documentElement.contains(target);\n\n if (isOptionsObject(options) && typeof options.behavior === 'function') {\n return options.behavior(isTargetAttached ? compute(target, options) : []);\n }\n\n if (!isTargetAttached) {\n return;\n }\n\n var computeOptions = getOptions(options);\n return defaultBehavior(compute(target, computeOptions), computeOptions.behavior);\n}\n\nexport default scrollIntoView;", "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 getNativeEvent<E>(\n event: E,\n): React.ChangeEvent<any> extends E ? InputEvent : E extends React.SyntheticEvent<any, infer T> ? T : never {\n return (event as any).nativeEvent ?? event\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 { isDom, isIos, noop, pipe } from \"@zag-js/utils\"\nimport scrollIntoView from \"scroll-into-view-if-needed\"\nimport { addDomEvent } from \"./listener\"\nimport { getScrollParent } from \"./scrollable\"\n\ninterface PreventScrollOptions {\n disabled?: boolean\n allowPinchZoom?: boolean\n document?: Document\n}\n\n// HTML input types that do not cause the software keyboard to appear.\nconst nonTextInputTypes = new Set([\"checkbox\", \"radio\", \"range\", \"color\", \"file\", \"image\", \"button\", \"submit\", \"reset\"])\n\nexport function preventBodyScroll(opts?: PreventScrollOptions) {\n const { document: docProp, disabled = false, allowPinchZoom } = opts ?? {}\n\n const doc = docProp ?? document\n const win = doc?.defaultView ?? window\n\n const viewport = isDom() ? win.visualViewport : null\n const docEl = doc.documentElement\n\n function preventScrollStandard() {\n const fn = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n )\n return () => fn?.()\n }\n\n function preventScrollMobileSafari() {\n let scrollable: HTMLElement | undefined\n let lastY = 0\n\n let onTouchStart = (e: TouchEvent) => {\n scrollable = getScrollParent(e.target as HTMLElement)\n\n if (scrollable === docEl && scrollable === doc.body) {\n return\n }\n lastY = e.changedTouches[0].pageY\n }\n\n let onTouchMove = (e: TouchEvent) => {\n if (e.touches.length === 2 && allowPinchZoom) return\n\n if (!scrollable || scrollable === docEl || scrollable === doc.body) {\n e.preventDefault()\n return\n }\n\n let y = e.changedTouches[0].pageY\n let scrollTop = scrollable.scrollTop\n let bottom = scrollable.scrollHeight - scrollable.clientHeight\n\n if ((scrollTop <= 0 && y > lastY) || (scrollTop >= bottom && y < lastY)) {\n e.preventDefault()\n }\n\n lastY = y\n }\n\n let onTouchEnd = (e: TouchEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n e.preventDefault()\n target.style.transform = \"translateY(-2000px)\"\n target.focus()\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n })\n }\n }\n\n let onFocus = (e: FocusEvent) => {\n let target = e.target as HTMLElement\n if (target instanceof win.HTMLInputElement && !nonTextInputTypes.has(target.type)) {\n target.style.transform = \"translateY(-2000px)\"\n win.requestAnimationFrame(() => {\n target.style.transform = \"\"\n if (!viewport) return\n\n if (viewport.height < win.innerHeight) {\n win.requestAnimationFrame(function () {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n })\n } else {\n const onResize = () => {\n scrollIntoView(target, { scrollMode: \"if-needed\" })\n }\n addDomEvent(viewport, \"resize\", onResize, { once: true })\n }\n })\n }\n }\n\n let onWindowScroll = () => {\n win.scrollTo(0, 0)\n }\n\n let scrollX = win.scrollX\n let scrollY = win.scrollY\n let restoreStyles = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n setStyle(doc.body, \"marginTop\", `-${scrollY}px`),\n )\n\n win.scrollTo(0, 0)\n\n let removeEvents = pipe(\n addDomEvent(doc, \"touchstart\", onTouchStart, { passive: false, capture: true }),\n addDomEvent(doc, \"touchmove\", onTouchMove, { passive: false, capture: true }),\n addDomEvent(doc, \"touchend\", onTouchEnd, { passive: false, capture: true }),\n addDomEvent(doc, \"focus\", onFocus, true),\n addDomEvent(win, \"scroll\", onWindowScroll),\n )\n\n return () => {\n restoreStyles()\n removeEvents()\n win.scrollTo(scrollX, scrollY)\n }\n }\n\n if (disabled) return noop\n return isIos() ? preventScrollMobileSafari() : preventScrollStandard()\n}\n\nfunction setStyle(el: HTMLElement, key: string, value: string) {\n let cur = el.style[key]\n el.style[key] = value\n return () => {\n el.style[key] = cur\n }\n}\n\n// Backup lib: https://github.com/hanai/html-body-scroll-lock\n", "export const MAX_Z_INDEX = 2147483647\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 function () {\n run = false\n }\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 = false) => {\n if (!el) return []\n let els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n if (includeContainer && isHTMLElement(el)) {\n els.unshift(el)\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, includeContainer = false) => {\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", "export function getClosestFormElement(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 [\"textarea\", \"input\", \"select\", \"button\"].includes(el.localName)\n}\n\nexport function trackFormReset(el: HTMLElement | null | undefined, callback: () => void) {\n if (!el) return\n const form = getClosestFormElement(el)\n form?.addEventListener(\"reset\", callback, { passive: true })\n return () => {\n form?.removeEventListener(\"reset\", callback)\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 doc?: Document\n root?: HTMLElement | null\n delay?: number\n}\n\nexport type LiveRegion = ReturnType<typeof createLiveRegion>\n\nexport function createLiveRegion(opts: Partial<LiveRegionOptions> = {}) {\n const { level = \"polite\", doc: ownerDocument, root, delay: rootDelay = 0 } = opts\n\n const doc = ownerDocument ?? document\n const win = doc.defaultView ?? window\n\n const parent = root ?? doc.body\n\n function announce(msg: string, delay?: number) {\n const oldRegion = doc.getElementById(\"__live-region__\")\n\n // remove old region\n if (!!oldRegion) {\n parent.removeChild(oldRegion)\n }\n\n // Did an override level get set?\n delay = delay ?? rootDelay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = \"__live-region__\"\n\n // Determine redundant role\n var 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 = msg\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(\"__live-region__\")\n if (oldRegion) {\n parent.removeChild(oldRegion)\n }\n }\n\n return { announce, destroy }\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, subtree = false) {\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 })\n\n return () => obs.disconnect()\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\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const filtered = v.filter((item) => {\n const str = item.dataset.valuetext ?? item.textContent\n return !!str?.toLowerCase().startsWith(text.toLowerCase())\n })\n return currentId ? nextById(filtered, currentId) : null\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", "type PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n doc.addEventListener(\"webkitpointerlockchange\", fn, false)\n doc.addEventListener(\"mozpointerlockchange\", fn, false)\n doc.addEventListener(\"pointerlockchange\", fn, false)\n return function cleaup() {\n doc.removeEventListener(\"mozpointerlockchange\", fn, false)\n doc.removeEventListener(\"pointerlockchange\", fn, false)\n }\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"webkitpointerlockerror\", fn, false)\n doc.addEventListener(\"mozpointerlockerror\", fn, false)\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"webkitpointerlockerror\", fn, false)\n doc.removeEventListener(\"mozpointerlockerror\", fn, false)\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nfunction getPointerlockFunc(el: HTMLElement) {\n return el.requestPointerLock || (el as any).mozRequestPointerLock || (el as any).webkitRequestPointerLock\n}\n\nfunction getRemovePointerlockFunc(doc: Document) {\n return doc.exitPointerLock || (doc as any).mozExitPointerLock || (doc as any).webkitExitPointerLock\n}\n\nexport function getPointerlockElement(doc: Document) {\n return doc.pointerLockElement || (doc as any).mozPointerLockElement || (doc as any).webkitPointerLockElement\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n function isSupported() {\n return \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc || \"webkitPointerLockElement\" in doc\n }\n\n function hasLockElement() {\n return !!doc.pointerLockElement\n }\n\n function onPointerChange() {\n if (hasLockElement()) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n const isLocked = hasLockElement()\n if (isLocked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock = getRemovePointerlockFunc(doc)\n doc.exitPointerLock()\n }\n\n const cleanups: Set<Function> = new Set()\n\n function addEventListeners() {\n cleanups.add(addPointerlockChangeListener(doc, onPointerChange))\n cleanups.add(addPointerlockErrorListener(doc, onPointerError))\n }\n\n function dispose() {\n if (!isSupported()) return\n cleanups.forEach((fn) => fn())\n cleanups.clear()\n exit()\n }\n\n function setup() {\n if (!isSupported() || !hasLockElement()) return\n body.requestPointerLock = getPointerlockFunc(body)\n body.requestPointerLock()\n addEventListeners()\n }\n\n setup()\n return dispose\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\nconst observedElements: Map<Measurable, ObservedData> = new Map()\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\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 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 { 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", "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", "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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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 = { ancestorScroll?: boolean; ancestorResize?: boolean; referenceResize?: boolean }\ntype Ancestors = ReturnType<typeof getOverflowAncestors>\n\nfunction resolveOptions(option: boolean | AutoUpdateOptions) {\n if (isBoolean(option)) return { ancestorResize: option, ancestorScroll: option, referenceResize: option }\n return Object.assign({ ancestorResize: true, ancestorScroll: true, referenceResize: true }, option)\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", "import { Middleware, Placement } 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 arrowShadowColor: toVar(\"--arrow-shadow-color\"),\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 boxShadow: toVar(\"--arrow-box-shadow\"),\n}\n\n/* -----------------------------------------------------------------------------\n * Transform Origin Middleware\n * -----------------------------------------------------------------------------*/\n\nconst transforms = {\n top: \"bottom center\",\n \"top-start\": \"bottom left\",\n \"top-end\": \"bottom right\",\n bottom: \"top center\",\n \"bottom-start\": \"top left\",\n \"bottom-end\": \"top right\",\n left: \"right center\",\n \"left-start\": \"right top\",\n \"left-end\": \"right bottom\",\n right: \"left center\",\n \"right-start\": \"left top\",\n \"right-end\": \"left bottom\",\n}\n\nexport const transformOrigin: Middleware = {\n name: \"transformOrigin\",\n fn({ placement, elements }) {\n const { floating } = elements\n floating.style.setProperty(cssVars.transformOrigin.variable, transforms[placement])\n return {\n data: { transformOrigin: transforms[placement] },\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 staticSide = {\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 [staticSide]: cssVars.arrowOffset.reference,\n [cssVars.boxShadow.variable]: getBoxShadow(placement)!,\n })\n\n return {}\n },\n})\n\nexport function getBoxShadow(placement: Placement) {\n if (placement.includes(\"top\")) return `1px 1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n if (placement.includes(\"bottom\")) return `-1px -1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n if (placement.includes(\"right\")) return `-1px 1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n if (placement.includes(\"left\")) return `1px -1px 1px 0 ${cssVars.arrowShadowColor.reference}`\n}\n", "import type { VirtualElement } from \"@floating-ui/dom\"\nimport { arrow, computePosition, flip, Middleware, offset, shift, size } from \"@floating-ui/dom\"\nimport { getOwnerDocument } from \"@zag-js/dom-utils\"\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}\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 middleware: Middleware[] = [transformOrigin]\n\n if (options.flip) {\n middleware.push(flip({ boundary: options.boundary, padding: 8 }))\n }\n\n if (options.gutter || options.offset) {\n const data = options.gutter ? { mainAxis: options.gutter } : options.offset\n middleware.push(offset(data))\n }\n\n middleware.push(shift({ boundary: options.boundary }))\n\n const doc = getOwnerDocument(floating)\n const arrowEl = doc.querySelector<HTMLElement>(\"[data-part=arrow]\")\n if (arrowEl) {\n middleware.push(arrow({ element: arrowEl, padding: 8 }), shiftArrow({ element: arrowEl }))\n }\n\n if (options.sameWidth) {\n middleware.push(\n size({\n apply(data) {\n const { width } = data.reference\n Object.assign(floating.style, { width: `${width}px`, minWidth: \"unset\" })\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, { placement, middleware, strategy })\n .then((data) => {\n const { x, y, strategy } = data\n Object.assign(floating.style, { left: `${x}px`, top: `${y}px`, position: strategy })\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", "import { cssVars } from \"./middleware\"\n\ntype Options = {\n measured: boolean\n strategy?: \"absolute\" | \"fixed\"\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\nexport function getPlacementStyles(options: Options) {\n const { measured, strategy = \"absolute\" } = 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: \"rotate(45deg)\",\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", "import type * as React from \"react\"\n\ntype Dict<T = any> = Record<string, T>\n\ntype Booleanish = boolean | \"true\" | \"false\"\n\ntype Omit<T, K extends keyof T> = { [P in Exclude<keyof T, K>]?: T[P] }\n\ntype WithStyle<T extends { style?: any }> = Omit<T, \"style\"> & {\n style?: T[\"style\"] & {\n [prop: string]: string | number | undefined\n }\n}\n\ntype DataAttr = {\n \"data-uid\"?: string\n \"data-name\"?: string\n \"data-ownedby\"?: string\n \"data-selected\"?: Booleanish\n \"data-expanded\"?: Booleanish\n \"data-highlighted\"?: Booleanish\n \"data-readonly\"?: Booleanish\n \"data-invalid\"?: Booleanish\n \"data-hover\"?: Booleanish\n \"data-active\"?: Booleanish\n \"data-focus\"?: Booleanish\n \"data-disabled\"?: Booleanish\n \"data-type\"?: string\n \"data-value\"?: string | number\n \"data-valuetext\"?: string\n \"data-open\"?: Booleanish\n \"data-placement\"?: string\n \"data-orientation\"?: \"horizontal\" | \"vertical\"\n \"data-label\"?: string\n \"data-checked\"?: Booleanish\n \"data-pressed\"?: Booleanish\n \"data-state\"?: string | null\n \"data-half\"?: Booleanish\n \"data-count\"?: number\n \"data-controls\"?: string\n \"data-part\"?: string\n \"data-index\"?: number\n \"data-complete\"?: Booleanish\n \"data-empty\"?: Booleanish\n \"data-placeholder-shown\"?: Booleanish\n}\n\ntype JSXElementAttributes = DataAttr & React.HTMLAttributes<HTMLElement>\ntype JSXButtonAttributes = DataAttr & React.ButtonHTMLAttributes<HTMLButtonElement>\ntype JSXInputAttributes = DataAttr & React.InputHTMLAttributes<HTMLInputElement>\ntype JSXLabelAttributes = DataAttr & React.LabelHTMLAttributes<HTMLLabelElement>\ntype JSXOutputAttributes = DataAttr & React.OutputHTMLAttributes<HTMLOutputElement>\n\nexport type PropTypes = Record<\"button\" | \"label\" | \"input\" | \"output\" | \"element\", Dict>\n\nexport type ReactPropTypes = {\n button: JSXButtonAttributes\n label: JSXLabelAttributes\n input: JSXInputAttributes\n output: JSXOutputAttributes\n element: JSXElementAttributes\n}\n\nexport type NormalizeProps = {\n button<T extends PropTypes>(props: WithStyle<JSXButtonAttributes>): T[\"button\"]\n label<T extends PropTypes>(props: WithStyle<JSXLabelAttributes>): T[\"label\"]\n input<T extends PropTypes>(props: WithStyle<JSXInputAttributes>): T[\"input\"]\n output<T extends PropTypes>(props: WithStyle<JSXOutputAttributes>): T[\"output\"]\n element<T extends PropTypes>(props: WithStyle<JSXElementAttributes>): T[\"element\"]\n}\n\nexport function createNormalizer(fn: (props: Dict) => Dict): NormalizeProps {\n return { button: fn, label: fn, input: fn, output: fn, element: fn }\n}\n\nexport const normalizeProp = createNormalizer((v) => v)\n", "export type ControlProp =\n | { type: \"boolean\"; label?: string; defaultValue: boolean }\n | { type: \"string\"; label?: string; defaultValue: string; placeholder?: string }\n | { type: \"select\"; options: readonly string[]; defaultValue: string; label?: string }\n | { type: \"multiselect\"; options: readonly string[]; defaultValue: string[]; label?: string }\n | { type: \"number\"; label?: string; defaultValue: number; min?: number; max?: number }\n\nexport type ControlRecord = Record<string, ControlProp>\n\nexport type ControlValue<T extends ControlRecord> = {\n [K in keyof T]: T[K] extends { type: \"boolean\" }\n ? boolean\n : T[K] extends { type: \"string\" }\n ? string\n : T[K] extends { type: \"select\" }\n ? T[K][\"options\"][number]\n : T[K] extends { type: \"multiselect\" }\n ? T[K][\"options\"][number][]\n : T[K] extends { type: \"number\" }\n ? number\n : never\n}\n\nexport function defineControls<T extends ControlRecord>(config: T) {\n return config\n}\n", "import { getScrollParent } from \"@zag-js/dom-utils\"\nimport { MachineContext as Ctx } from \"./tooltip.types\"\n\nexport const dom = {\n getDoc: (ctx: Ctx) => ctx.doc || document,\n getWin: (ctx: Ctx) => ctx.doc?.defaultView || window,\n\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `tooltip-${ctx.id}--trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `tooltip-${ctx.id}--content`,\n getArrowId: (ctx: Ctx) => `tooltip-${ctx.id}--arrow`,\n getPositionerId: (ctx: Ctx) => `tooltip-${ctx.id}--popper`,\n portalId: \"tooltip-portal\",\n\n getTriggerEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getPositionerId(ctx)),\n getArrowEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getArrowId(ctx)),\n getScrollParent: (ctx: Ctx) => getScrollParent(dom.getTriggerEl(ctx)!),\n getPortalEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.portalId),\n\n createPortalEl: (ctx: Ctx) => {\n const portal = dom.getDoc(ctx).createElement(\"tooltip-portal\")\n portal.id = dom.portalId\n return portal\n },\n}\n", "// symbols\nconst OWN_KEYS_SYMBOL = Symbol();\nconst TRACK_MEMO_SYMBOL = Symbol();\nconst GET_ORIGINAL_SYMBOL = Symbol();\n\n// properties\nconst AFFECTED_PROPERTY = 'a';\nconst FROZEN_PROPERTY = 'f';\nconst PROXY_PROPERTY = 'p';\nconst PROXY_CACHE_PROPERTY = 'c';\nconst NEXT_OBJECT_PROPERTY = 'n';\nconst CHANGED_PROPERTY = 'g';\n\n// get object prototype\nconst getProto = Object.getPrototypeOf;\n\nconst objectsToTrack = new WeakMap<object, boolean>();\n\n// check if obj is a plain object or an array\nconst isObjectToTrack = <T>(obj: T): obj is T extends object ? T : never => (\n obj && (objectsToTrack.has(obj as unknown as object)\n ? objectsToTrack.get(obj as unknown as object) as boolean\n : (getProto(obj) === Object.prototype || getProto(obj) === Array.prototype)\n )\n);\n\n// check if it is object\nconst isObject = (x: unknown): x is object => (\n typeof x === 'object' && x !== null\n);\n\n// check if frozen\nconst isFrozen = (obj: object) => (\n Object.isFrozen(obj) || (\n // Object.isFrozen() doesn't detect non-writable properties\n // See: https://github.com/dai-shi/proxy-compare/pull/8\n Object.values(Object.getOwnPropertyDescriptors(obj)).some(\n (descriptor) => !descriptor.writable,\n )\n )\n);\n\n// copy frozen object\nconst unfreeze = (obj: object) => {\n if (Array.isArray(obj)) {\n // Arrays need a special way to copy\n return Array.from(obj);\n }\n // For non-array objects, we create a new object keeping the prototype\n // with changing all configurable options (otherwise, proxies will complain)\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n Object.values(descriptors).forEach((desc) => { desc.configurable = true; });\n return Object.create(getProto(obj), descriptors);\n};\n\ntype Affected = WeakMap<object, Set<string | symbol>>;\ntype ProxyCache<T extends object> = WeakMap<object, ProxyHandler<T>>;\ntype ProxyHandler<T extends object> = {\n [FROZEN_PROPERTY]: boolean;\n [PROXY_PROPERTY]?: T;\n [PROXY_CACHE_PROPERTY]?: ProxyCache<object>;\n [AFFECTED_PROPERTY]?: Affected;\n get(target: T, key: string | symbol): unknown;\n has(target: T, key: string | symbol): boolean;\n getOwnPropertyDescriptor(target: T, key: string | symbol): PropertyDescriptor | undefined;\n ownKeys(target: T): (string | symbol)[];\n set?(target: T, key: string | symbol, value: unknown): boolean;\n deleteProperty?(target: T, key: string | symbol): boolean;\n};\n\nconst createProxyHandler = <T extends object>(origObj: T, frozen: boolean) => {\n let trackObject = false; // for trackMemo\n const recordUsage = (h: ProxyHandler<T>, key: string | symbol, skipWithOwnKeys?: boolean) => {\n if (!trackObject) {\n let used = (h[AFFECTED_PROPERTY] as Affected).get(origObj);\n if (!used) {\n used = new Set();\n (h[AFFECTED_PROPERTY] as Affected).set(origObj, used);\n }\n if (!skipWithOwnKeys || !used.has(OWN_KEYS_SYMBOL)) {\n used.add(key);\n }\n }\n };\n const recordObjectAsUsed = (h: ProxyHandler<T>) => {\n trackObject = true;\n (h[AFFECTED_PROPERTY] as Affected).delete(origObj);\n };\n const handler: ProxyHandler<T> = {\n [FROZEN_PROPERTY]: frozen,\n get(target, key) {\n if (key === GET_ORIGINAL_SYMBOL) {\n return origObj;\n }\n recordUsage(this, key);\n return createProxy(\n (target as any)[key],\n (this[AFFECTED_PROPERTY] as Affected),\n this[PROXY_CACHE_PROPERTY],\n );\n },\n has(target, key) {\n if (key === TRACK_MEMO_SYMBOL) {\n recordObjectAsUsed(this);\n return true;\n }\n // LIMITATION: We simply record the same as `get`.\n // This means { a: {} } and { a: {} } is detected as changed,\n // if `'a' in obj` is handled.\n recordUsage(this, key);\n return key in target;\n },\n getOwnPropertyDescriptor(target, key) {\n // LIMITATION: We simply record the same as `get`.\n // This means { a: {} } and { a: {} } is detected as changed,\n // if `obj.getOwnPropertyDescriptor('a'))` is handled.\n recordUsage(this, key, true);\n return Object.getOwnPropertyDescriptor(target, key);\n },\n ownKeys(target) {\n recordUsage(this, OWN_KEYS_SYMBOL);\n return Reflect.ownKeys(target);\n },\n };\n if (frozen) {\n handler.set = handler.deleteProperty = () => false;\n }\n return handler;\n};\n\n/**\n * Create a proxy.\n *\n * This function will create a proxy at top level and proxy nested objects as you access them,\n * in order to keep track of which properties were accessed via get/has proxy handlers:\n *\n * NOTE: Printing of WeakMap is hard to inspect and not very readable\n * for this purpose you can use the `affectedToPathList` helper.\n *\n * @param {object} obj - Object that will be wrapped on the proxy.\n * @param {WeakMap<object, unknown>} affected -\n * WeakMap that will hold the tracking of which properties in the proxied object were accessed.\n * @param {WeakMap<object, unknown>} [proxyCache] -\n * WeakMap that will help keep referential identity for proxies.\n * @returns {Proxy<object>} - Object wrapped in a proxy.\n *\n * @example\n * import { createProxy } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n * const proxy = createProxy(original, affected);\n *\n * proxy.a // Will mark as used and track its value.\n * // This will update the affected WeakMap with original as key\n * // and a Set with \"a\"\n *\n * proxy.d // Will mark \"d\" as accessed to track and proxy itself ({ e: \"3\" }).\n * // This will update the affected WeakMap with original as key\n * // and a Set with \"d\"\n */\nexport const createProxy = <T>(\n obj: T,\n affected: WeakMap<object, unknown>,\n proxyCache?: WeakMap<object, unknown>,\n): T => {\n if (!isObjectToTrack(obj)) return obj;\n const origObj = (\n obj as { [GET_ORIGINAL_SYMBOL]?: typeof obj }\n )[GET_ORIGINAL_SYMBOL]; // unwrap proxy\n const target = origObj || obj;\n const frozen = isFrozen(target);\n let proxyHandler: ProxyHandler<typeof target> | undefined = (\n proxyCache && (proxyCache as ProxyCache<typeof target>).get(target)\n );\n if (!proxyHandler || proxyHandler[FROZEN_PROPERTY] !== frozen) {\n proxyHandler = createProxyHandler<T extends object ? T : never>(target, frozen);\n proxyHandler[PROXY_PROPERTY] = new Proxy(\n frozen ? unfreeze(target) : target,\n proxyHandler,\n ) as typeof target;\n if (proxyCache) {\n proxyCache.set(target, proxyHandler);\n }\n }\n proxyHandler[AFFECTED_PROPERTY] = affected as Affected;\n proxyHandler[PROXY_CACHE_PROPERTY] = proxyCache as ProxyCache<object> | undefined;\n return proxyHandler[PROXY_PROPERTY] as typeof target;\n};\n\nconst isOwnKeysChanged = (origObj: object, nextObj: object) => {\n const origKeys = Reflect.ownKeys(origObj);\n const nextKeys = Reflect.ownKeys(nextObj);\n return origKeys.length !== nextKeys.length\n || origKeys.some((k, i) => k !== nextKeys[i]);\n};\n\ntype ChangedCache = WeakMap<object, {\n [NEXT_OBJECT_PROPERTY]: object;\n [CHANGED_PROPERTY]: boolean;\n}>;\n\n/**\n * Compare changes on objects.\n *\n * This will compare the affected properties on tracked objects inside the proxy\n * to check if there were any changes made to it,\n * by default if no property was accessed on the proxy it will attempt to do a\n * reference equality check for the objects provided (Object.is(a, b)). If you access a property\n * on the proxy, then isChanged will only compare the affected properties.\n *\n * @param {object} origObj - The original object to compare.\n * @param {object} nextObj - Object to compare with the original one.\n * @param {WeakMap<object, unknown>} affected -\n * WeakMap that holds the tracking of which properties in the proxied object were accessed.\n * @param {WeakMap<object, unknown>} [cache] -\n * WeakMap that holds a cache of the comparisons for better performance with repetitive comparisons,\n * and to avoid infinite loop with circular structures.\n * @returns {boolean} - Boolean indicating if the affected property on the object has changed.\n *\n * @example\n * import { createProxy, isChanged } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n *\n * proxy.a\n *\n * isChanged(original, { a: \"1\" }, affected) // false\n *\n * proxy.a = \"2\"\n *\n * isChanged(original, { a: \"1\" }, affected) // true\n */\n\nexport const isChanged = (\n origObj: unknown,\n nextObj: unknown,\n affected: WeakMap<object, unknown>,\n cache?: WeakMap<object, unknown>,\n): boolean => {\n if (Object.is(origObj, nextObj)) {\n return false;\n }\n if (!isObject(origObj) || !isObject(nextObj)) return true;\n const used = (affected as Affected).get(origObj);\n if (!used) return true;\n if (cache) {\n const hit = (cache as ChangedCache).get(origObj);\n if (hit && hit[NEXT_OBJECT_PROPERTY] === nextObj) {\n return hit[CHANGED_PROPERTY];\n }\n // for object with cycles\n (cache as ChangedCache).set(origObj, {\n [NEXT_OBJECT_PROPERTY]: nextObj,\n [CHANGED_PROPERTY]: false,\n });\n }\n let changed: boolean | null = null;\n // eslint-disable-next-line no-restricted-syntax\n for (const key of used) {\n const c = key === OWN_KEYS_SYMBOL ? isOwnKeysChanged(origObj, nextObj)\n : isChanged(\n (origObj as any)[key],\n (nextObj as any)[key],\n affected,\n cache,\n );\n if (c === true || c === false) changed = c;\n if (changed) break;\n }\n if (changed === null) changed = true;\n if (cache) {\n cache.set(origObj, {\n [NEXT_OBJECT_PROPERTY]: nextObj,\n [CHANGED_PROPERTY]: changed,\n });\n }\n return changed;\n};\n\n// explicitly track object with memo\nexport const trackMemo = (obj: unknown) => {\n if (isObjectToTrack(obj)) {\n return TRACK_MEMO_SYMBOL in obj;\n }\n return false;\n};\n\n/**\n * Unwrap proxy to get the original object.\n *\n * Used to retrieve the original object used to create the proxy instance with `createProxy`.\n *\n * @param {Proxy<object>} obj - The proxy wrapper of the originial object.\n * @returns {object | null} - Return either the unwrapped object if exists.\n *\n * @example\n * import { createProxy, getUntracked } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n * const originalFromProxy = getUntracked(proxy)\n *\n * Obejct.is(original, originalFromProxy) // true\n * isChanged(original, originalFromProxy, affected) // false\n */\nexport const getUntracked = <T>(obj: T): T | null => {\n if (isObjectToTrack(obj)) {\n return (obj as { [GET_ORIGINAL_SYMBOL]?: T })[GET_ORIGINAL_SYMBOL] || null;\n }\n return null;\n};\n\n/**\n * Mark object to be tracked.\n *\n * This function marks an object that will be passed into `createProxy`\n * as marked to track or not. By default only Array and Object are marked to track,\n * so this is useful for example to mark a class instance to track or to mark a object\n * to be untracked when creating your proxy.\n *\n * @param {object} obj - Object to mark as tracked or not.\n * @param {mark} boolean - Boolean indicating whether you want to track this object or not.\n * @returns {undefined} - No return.\n *\n * @example\n * import { createProxy, markToTrack, isChanged } from 'proxy-compare';\n *\n * const nested = { e: \"3\" }\n *\n * markToTrack(nested, false)\n *\n * const original = { a: \"1\", c: \"2\", d: nested };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n *\n * proxy.d.e\n *\n * isChanged(original, { d: { e: \"3\" } }, affected) // true\n */\nexport const markToTrack = (obj: object, mark = true) => {\n objectsToTrack.set(obj, mark);\n};\n\n// convert affected to path list\nexport const affectedToPathList = (\n obj: unknown,\n affected: WeakMap<object, unknown>,\n) => {\n const list: (string | symbol)[][] = [];\n const seen = new WeakSet();\n const walk = (x: unknown, path?: (string | symbol)[]) => {\n if (seen.has(x as object)) {\n // for object with cycles\n return;\n }\n if (isObject(x)) {\n seen.add(x);\n }\n const used = (affected as Affected).get(x as object);\n if (used) {\n used.forEach((key) => {\n walk((x as any)[key], path ? [...path, key] : [key]);\n });\n } else if (path) {\n list.push(path);\n }\n };\n walk(obj);\n return list;\n};\n", "import { getUntracked, markToTrack } from 'proxy-compare';\n\nconst VERSION = Symbol();\nconst LISTENERS = Symbol();\nconst SNAPSHOT = Symbol();\nconst HANDLER = Symbol();\nconst PROMISE_RESULT = Symbol();\nconst PROMISE_ERROR = Symbol();\nconst refSet = /* @__PURE__ */ new WeakSet();\nfunction ref(o) {\n refSet.add(o);\n return o;\n}\nconst isObject = (x) => typeof x === \"object\" && x !== null;\nconst canProxy = (x) => isObject(x) && !refSet.has(x) && (Array.isArray(x) || !(Symbol.iterator in x)) && !(x instanceof WeakMap) && !(x instanceof WeakSet) && !(x instanceof Error) && !(x instanceof Number) && !(x instanceof Date) && !(x instanceof String) && !(x instanceof RegExp) && !(x instanceof ArrayBuffer);\nconst proxyCache = /* @__PURE__ */ new WeakMap();\nlet globalVersion = 1;\nconst snapshotCache = /* @__PURE__ */ new WeakMap();\nfunction proxy(initialObject = {}) {\n if (!isObject(initialObject)) {\n throw new Error(\"object required\");\n }\n const found = proxyCache.get(initialObject);\n if (found) {\n return found;\n }\n let version = globalVersion;\n const listeners = /* @__PURE__ */ new Set();\n const notifyUpdate = (op, nextVersion = ++globalVersion) => {\n if (version !== nextVersion) {\n version = nextVersion;\n listeners.forEach((listener) => listener(op, nextVersion));\n }\n };\n const propListeners = /* @__PURE__ */ new Map();\n const getPropListener = (prop) => {\n let propListener = propListeners.get(prop);\n if (!propListener) {\n propListener = (op, nextVersion) => {\n const newOp = [...op];\n newOp[1] = [prop, ...newOp[1]];\n notifyUpdate(newOp, nextVersion);\n };\n propListeners.set(prop, propListener);\n }\n return propListener;\n };\n const popPropListener = (prop) => {\n const propListener = propListeners.get(prop);\n propListeners.delete(prop);\n return propListener;\n };\n const createSnapshot = (target, receiver) => {\n const cache = snapshotCache.get(receiver);\n if ((cache == null ? void 0 : cache[0]) === version) {\n return cache[1];\n }\n const snapshot2 = Array.isArray(target) ? [] : Object.create(Object.getPrototypeOf(target));\n markToTrack(snapshot2, true);\n snapshotCache.set(receiver, [version, snapshot2]);\n Reflect.ownKeys(target).forEach((key) => {\n const value = Reflect.get(target, key, receiver);\n if (refSet.has(value)) {\n markToTrack(value, false);\n snapshot2[key] = value;\n } else if (value instanceof Promise) {\n if (PROMISE_RESULT in value) {\n snapshot2[key] = value[PROMISE_RESULT];\n } else {\n const errorOrPromise = value[PROMISE_ERROR] || value;\n Object.defineProperty(snapshot2, key, {\n get() {\n if (PROMISE_RESULT in value) {\n return value[PROMISE_RESULT];\n }\n throw errorOrPromise;\n }\n });\n }\n } else if (value == null ? void 0 : value[LISTENERS]) {\n snapshot2[key] = value[SNAPSHOT];\n } else {\n snapshot2[key] = value;\n }\n });\n Object.freeze(snapshot2);\n return snapshot2;\n };\n const baseObject = Array.isArray(initialObject) ? [] : Object.create(Object.getPrototypeOf(initialObject));\n const handler = {\n get(target, prop, receiver) {\n if (prop === VERSION) {\n return version;\n }\n if (prop === LISTENERS) {\n return listeners;\n }\n if (prop === SNAPSHOT) {\n return createSnapshot(target, receiver);\n }\n if (prop === HANDLER) {\n return handler;\n }\n return Reflect.get(target, prop, receiver);\n },\n deleteProperty(target, prop) {\n const prevValue = Reflect.get(target, prop);\n const childListeners = prevValue == null ? void 0 : prevValue[LISTENERS];\n if (childListeners) {\n childListeners.delete(popPropListener(prop));\n }\n const deleted = Reflect.deleteProperty(target, prop);\n if (deleted) {\n notifyUpdate([\"delete\", [prop], prevValue]);\n }\n return deleted;\n },\n is: Object.is,\n canProxy,\n set(target, prop, value, receiver) {\n var _a;\n const prevValue = Reflect.get(target, prop, receiver);\n if (this.is(prevValue, value)) {\n return true;\n }\n const childListeners = prevValue == null ? void 0 : prevValue[LISTENERS];\n if (childListeners) {\n childListeners.delete(popPropListener(prop));\n }\n if (isObject(value)) {\n value = getUntracked(value) || value;\n }\n let nextValue;\n if ((_a = Object.getOwnPropertyDescriptor(target, prop)) == null ? void 0 : _a.set) {\n nextValue = value;\n } else if (value instanceof Promise) {\n nextValue = value.then((v) => {\n nextValue[PROMISE_RESULT] = v;\n notifyUpdate([\"resolve\", [prop], v]);\n return v;\n }).catch((e) => {\n nextValue[PROMISE_ERROR] = e;\n notifyUpdate([\"reject\", [prop], e]);\n });\n } else if (value == null ? void 0 : value[LISTENERS]) {\n nextValue = value;\n nextValue[LISTENERS].add(getPropListener(prop));\n } else if (this.canProxy(value)) {\n nextValue = proxy(value);\n nextValue[LISTENERS].add(getPropListener(prop));\n } else {\n nextValue = value;\n }\n Reflect.set(target, prop, nextValue, receiver);\n notifyUpdate([\"set\", [prop], value, prevValue]);\n return true;\n }\n };\n const proxyObject = new Proxy(baseObject, handler);\n proxyCache.set(initialObject, proxyObject);\n Reflect.ownKeys(initialObject).forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(initialObject, key);\n if (desc.get || desc.set) {\n Object.defineProperty(baseObject, key, desc);\n } else {\n proxyObject[key] = initialObject[key];\n }\n });\n return proxyObject;\n}\nfunction getVersion(proxyObject) {\n return isObject(proxyObject) ? proxyObject[VERSION] : void 0;\n}\nfunction subscribe(proxyObject, callback, notifyInSync) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(proxyObject == null ? void 0 : proxyObject[LISTENERS])) {\n console.warn(\"Please use proxy object\");\n }\n let promise;\n const ops = [];\n const listener = (op) => {\n ops.push(op);\n if (notifyInSync) {\n callback(ops.splice(0));\n return;\n }\n if (!promise) {\n promise = Promise.resolve().then(() => {\n promise = void 0;\n callback(ops.splice(0));\n });\n }\n };\n proxyObject[LISTENERS].add(listener);\n return () => {\n proxyObject[LISTENERS].delete(listener);\n };\n}\nfunction snapshot(proxyObject) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(proxyObject == null ? void 0 : proxyObject[SNAPSHOT])) {\n console.warn(\"Please use proxy object\");\n }\n return proxyObject[SNAPSHOT];\n}\nfunction getHandler(proxyObject) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(proxyObject == null ? void 0 : proxyObject[HANDLER])) {\n console.warn(\"Please use proxy object\");\n }\n return proxyObject[HANDLER];\n}\n\nexport { getHandler, getVersion, proxy, ref, snapshot, subscribe };\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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 { isObject, isString } from \"@zag-js/utils\"\nimport { Dict, StateMachine as S } from \"./types\"\n\nexport function choose<TContext, TState extends S.StateSchema, TEvent extends S.EventObject = S.AnyEventObject>(\n actions: Array<{ guard?: S.Guard<TContext, TEvent>; actions: S.PureActions<TContext, TState, TEvent> }>,\n): S.ChooseHelper<TContext, TState, TEvent> {\n return {\n predicate: (guardMap: Dict) => (ctx: TContext, event: TEvent) =>\n actions.find((def) => {\n def.guard = def.guard || (() => true)\n if (isString(def.guard)) {\n return !!guardMap[def.guard]?.(ctx, event)\n }\n\n if (isGuardHelper(def.guard)) {\n return def.guard.predicate(guardMap ?? {})(ctx, event)\n }\n\n return def.guard(ctx, event)\n })?.actions,\n }\n}\n\nfunction isGuardHelper(value: any): value is { predicate: Function } {\n return isObject(value) && value.predicate != null\n}\n\nexport function determineActionsFn<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n values: S.Actions<TContext, TState, TEvent> | undefined,\n guardMap: S.GuardMap<TContext, TEvent> | undefined,\n) {\n return (context: TContext, event: TEvent) => {\n if (isGuardHelper(values)) return values.predicate(guardMap ?? {})(context, event)\n return values\n }\n}\n", "import { isFunction, isObject, isString } from \"@zag-js/utils\"\nimport { Dict, StateMachine as S } from \"./types\"\n\nfunction or<TContext, TEvent extends S.EventObject>(\n ...conditions: Array<string | S.GuardHelper<TContext, TEvent> | S.GuardExpression<TContext, TEvent>>\n): S.GuardHelper<TContext, TEvent> {\n return {\n predicate: (guards: Dict) => (ctx: TContext, event: TEvent) =>\n conditions\n .map((condition) => {\n if (isString(condition)) {\n return !!guards[condition]?.(ctx, event)\n }\n if (isFunction(condition)) {\n return condition(ctx, event)\n }\n return condition.predicate(guards)(ctx, event)\n })\n .some(Boolean),\n }\n}\n\nfunction and<TContext, TEvent extends S.EventObject>(\n ...conditions: Array<string | S.GuardHelper<TContext, TEvent> | S.GuardExpression<TContext, TEvent>>\n): S.GuardHelper<TContext, TEvent> {\n return {\n predicate: (guards: Dict) => (ctx: TContext, event: TEvent) =>\n conditions\n .map((condition) => {\n if (isString(condition)) {\n return !!guards[condition]?.(ctx, event)\n }\n if (isFunction(condition)) {\n return condition(ctx, event)\n }\n return condition.predicate(guards)(ctx, event)\n })\n .every(Boolean),\n }\n}\n\nfunction not<TContext, TEvent extends S.EventObject>(\n condition: string | S.GuardHelper<TContext, TEvent> | S.GuardExpression<TContext, TEvent>,\n): S.GuardHelper<TContext, TEvent> {\n return {\n predicate: (guardMap: Dict) => (ctx: TContext, event: TEvent) => {\n if (isString(condition)) {\n return !guardMap[condition]?.(ctx, event)\n }\n if (isFunction(condition)) {\n return !condition(ctx, event)\n }\n return !condition.predicate(guardMap)(ctx, event)\n },\n }\n}\n\nexport const guards = { or, and, not }\n\nexport function isGuardHelper(value: unknown): value is { predicate: Function } {\n return isObject(value) && value.predicate != null\n}\n\nexport const TruthyGuard = () => true\n\n/**\n * Guards or conditions can be specified as:\n * - a string (reference to `options.guards`)\n * - a function that returns a number (in ms)\n */\nexport function determineGuardFn<TContext, TEvent extends S.EventObject>(\n guard: S.Guard<TContext, TEvent> | undefined,\n guardMap: S.GuardMap<TContext, TEvent> | undefined,\n) {\n guard = guard ?? TruthyGuard\n return (context: TContext, event: TEvent) => {\n if (isString(guard)) {\n const value = guardMap?.[guard]\n return isFunction(value) ? value(context, event) : value\n }\n\n if (isGuardHelper(guard)) {\n return guard.predicate(guardMap ?? {})(context, event)\n }\n\n return guard?.(context, event)\n }\n}\n", "export function klona(val) {\n\tvar k, out, tmp;\n\n\tif (Array.isArray(val)) {\n\t\tout = Array(k=val.length);\n\t\twhile (k--) out[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\treturn out;\n\t}\n\n\tif (Object.prototype.toString.call(val) === '[object Object]') {\n\t\tout = {}; // null\n\t\tfor (k in val) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(out, k, {\n\t\t\t\t\tvalue: klona(val[k]),\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tout[k] = (tmp=val[k]) && typeof tmp === 'object' ? klona(tmp) : tmp;\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\treturn val;\n}\n", "import { subscribe, snapshot, proxy, getVersion, ref } from 'valtio/vanilla';\nimport { createProxy, isChanged } from 'proxy-compare';\n\nfunction subscribeKey(proxyObject, key, callback, notifyInSync) {\n return subscribe(proxyObject, (ops) => {\n if (ops.some((op) => op[1][0] === key)) {\n callback(proxyObject[key]);\n }\n }, notifyInSync);\n}\n\nlet currentCleanups;\nfunction watch(callback, options) {\n let alive = true;\n const cleanups = /* @__PURE__ */ new Set();\n const subscriptions = /* @__PURE__ */ new Map();\n const cleanup = () => {\n if (alive) {\n alive = false;\n cleanups.forEach((clean) => clean());\n cleanups.clear();\n subscriptions.forEach((unsubscribe) => unsubscribe());\n subscriptions.clear();\n }\n };\n const revalidate = () => {\n if (!alive) {\n return;\n }\n cleanups.forEach((clean) => clean());\n cleanups.clear();\n const proxiesToSubscribe = /* @__PURE__ */ new Set();\n const parent = currentCleanups;\n currentCleanups = cleanups;\n try {\n const cleanupReturn = callback((proxyObject) => {\n proxiesToSubscribe.add(proxyObject);\n return proxyObject;\n });\n if (cleanupReturn) {\n cleanups.add(cleanupReturn);\n }\n } finally {\n currentCleanups = parent;\n }\n subscriptions.forEach((unsubscribe, proxyObject) => {\n if (proxiesToSubscribe.has(proxyObject)) {\n proxiesToSubscribe.delete(proxyObject);\n } else {\n subscriptions.delete(proxyObject);\n unsubscribe();\n }\n });\n proxiesToSubscribe.forEach((proxyObject) => {\n const unsubscribe = subscribe(proxyObject, revalidate, options == null ? void 0 : options.sync);\n subscriptions.set(proxyObject, unsubscribe);\n });\n };\n if (currentCleanups) {\n currentCleanups.add(cleanup);\n }\n revalidate();\n return cleanup;\n}\n\nconst DEVTOOLS = Symbol();\nfunction devtools(proxyObject, options) {\n if (typeof options === \"string\") {\n console.warn(\"[Deprecated] Please use option object instead of name string\");\n options = { name: options };\n }\n const { enabled, name = \"\" } = options || {};\n let extension;\n try {\n extension = (enabled != null ? enabled : (import.meta.env && import.meta.env.MODE) !== \"production\") && window.__REDUX_DEVTOOLS_EXTENSION__;\n } catch {\n }\n if (!extension) {\n if ((import.meta.env && import.meta.env.MODE) !== \"production\" && enabled) {\n console.warn(\"[Warning] Please install/enable Redux devtools extension\");\n }\n return;\n }\n let isTimeTraveling = false;\n const devtools2 = extension.connect({ name });\n const unsub1 = subscribe(proxyObject, (ops) => {\n const action = ops.filter(([_, path]) => path[0] !== DEVTOOLS).map(([op, path]) => `${op}:${path.map(String).join(\".\")}`).join(\", \");\n if (!action) {\n return;\n }\n if (isTimeTraveling) {\n isTimeTraveling = false;\n } else {\n const snapWithoutDevtools = Object.assign({}, snapshot(proxyObject));\n delete snapWithoutDevtools[DEVTOOLS];\n devtools2.send({\n type: action,\n updatedAt: new Date().toLocaleString()\n }, snapWithoutDevtools);\n }\n });\n const unsub2 = devtools2.subscribe((message) => {\n var _a, _b, _c, _d, _e, _f;\n if (message.type === \"ACTION\" && message.payload) {\n try {\n Object.assign(proxyObject, JSON.parse(message.payload));\n } catch (e) {\n console.error(\"please dispatch a serializable value that JSON.parse() and proxy() support\\n\", e);\n }\n }\n if (message.type === \"DISPATCH\" && message.state) {\n if (((_a = message.payload) == null ? void 0 : _a.type) === \"JUMP_TO_ACTION\" || ((_b = message.payload) == null ? void 0 : _b.type) === \"JUMP_TO_STATE\") {\n isTimeTraveling = true;\n const state = JSON.parse(message.state);\n Object.assign(proxyObject, state);\n }\n proxyObject[DEVTOOLS] = message;\n } else if (message.type === \"DISPATCH\" && ((_c = message.payload) == null ? void 0 : _c.type) === \"COMMIT\") {\n devtools2.init(snapshot(proxyObject));\n } else if (message.type === \"DISPATCH\" && ((_d = message.payload) == null ? void 0 : _d.type) === \"IMPORT_STATE\") {\n const actions = (_e = message.payload.nextLiftedState) == null ? void 0 : _e.actionsById;\n const computedStates = ((_f = message.payload.nextLiftedState) == null ? void 0 : _f.computedStates) || [];\n isTimeTraveling = true;\n computedStates.forEach(({ state }, index) => {\n const action = actions[index] || \"No action found\";\n Object.assign(proxyObject, state);\n if (index === 0) {\n devtools2.init(snapshot(proxyObject));\n } else {\n devtools2.send(action, snapshot(proxyObject));\n }\n });\n }\n });\n devtools2.init(snapshot(proxyObject));\n return () => {\n unsub1();\n unsub2 == null ? void 0 : unsub2();\n };\n}\n\nconst sourceObjectMap = /* @__PURE__ */ new WeakMap();\nconst derivedObjectMap = /* @__PURE__ */ new WeakMap();\nconst markPending = (sourceObject, callback) => {\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry) {\n sourceObjectEntry[0].forEach((subscription) => {\n const { d: derivedObject } = subscription;\n if (sourceObject !== derivedObject) {\n markPending(derivedObject);\n }\n });\n ++sourceObjectEntry[2];\n if (callback) {\n sourceObjectEntry[3].add(callback);\n }\n }\n};\nconst checkPending = (sourceObject, callback) => {\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry == null ? void 0 : sourceObjectEntry[2]) {\n sourceObjectEntry[3].add(callback);\n return true;\n }\n return false;\n};\nconst unmarkPending = (sourceObject) => {\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry) {\n --sourceObjectEntry[2];\n if (!sourceObjectEntry[2]) {\n sourceObjectEntry[3].forEach((callback) => callback());\n sourceObjectEntry[3].clear();\n }\n sourceObjectEntry[0].forEach((subscription) => {\n const { d: derivedObject } = subscription;\n if (sourceObject !== derivedObject) {\n unmarkPending(derivedObject);\n }\n });\n }\n};\nconst addSubscription = (subscription) => {\n const { s: sourceObject, d: derivedObject } = subscription;\n let derivedObjectEntry = derivedObjectMap.get(derivedObject);\n if (!derivedObjectEntry) {\n derivedObjectEntry = [/* @__PURE__ */ new Set()];\n derivedObjectMap.set(subscription.d, derivedObjectEntry);\n }\n derivedObjectEntry[0].add(subscription);\n let sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (!sourceObjectEntry) {\n const subscriptions = /* @__PURE__ */ new Set();\n const unsubscribe = subscribe(sourceObject, (ops) => {\n subscriptions.forEach((subscription2) => {\n const {\n d: derivedObject2,\n c: callback,\n n: notifyInSync,\n i: ignoreKeys\n } = subscription2;\n if (sourceObject === derivedObject2 && ops.every((op) => op[1].length === 1 && ignoreKeys.includes(op[1][0]))) {\n return;\n }\n if (subscription2.p) {\n return;\n }\n markPending(sourceObject, callback);\n if (notifyInSync) {\n unmarkPending(sourceObject);\n } else {\n subscription2.p = Promise.resolve().then(() => {\n delete subscription2.p;\n unmarkPending(sourceObject);\n });\n }\n });\n }, true);\n sourceObjectEntry = [subscriptions, unsubscribe, 0, /* @__PURE__ */ new Set()];\n sourceObjectMap.set(sourceObject, sourceObjectEntry);\n }\n sourceObjectEntry[0].add(subscription);\n};\nconst removeSubscription = (subscription) => {\n const { s: sourceObject, d: derivedObject } = subscription;\n const derivedObjectEntry = derivedObjectMap.get(derivedObject);\n derivedObjectEntry == null ? void 0 : derivedObjectEntry[0].delete(subscription);\n if ((derivedObjectEntry == null ? void 0 : derivedObjectEntry[0].size) === 0) {\n derivedObjectMap.delete(derivedObject);\n }\n const sourceObjectEntry = sourceObjectMap.get(sourceObject);\n if (sourceObjectEntry) {\n const [subscriptions, unsubscribe] = sourceObjectEntry;\n subscriptions.delete(subscription);\n if (!subscriptions.size) {\n unsubscribe();\n sourceObjectMap.delete(sourceObject);\n }\n }\n};\nconst listSubscriptions = (derivedObject) => {\n const derivedObjectEntry = derivedObjectMap.get(derivedObject);\n if (derivedObjectEntry) {\n return Array.from(derivedObjectEntry[0]);\n }\n return [];\n};\nconst unstable_deriveSubscriptions = {\n add: addSubscription,\n remove: removeSubscription,\n list: listSubscriptions\n};\nfunction derive(derivedFns, options) {\n const proxyObject = (options == null ? void 0 : options.proxy) || proxy({});\n const notifyInSync = !!(options == null ? void 0 : options.sync);\n const derivedKeys = Object.keys(derivedFns);\n derivedKeys.forEach((key) => {\n if (Object.getOwnPropertyDescriptor(proxyObject, key)) {\n throw new Error(\"object property already defined\");\n }\n const fn = derivedFns[key];\n let lastDependencies = null;\n const evaluate = () => {\n if (lastDependencies) {\n if (Array.from(lastDependencies).map(([p]) => checkPending(p, evaluate)).some((isPending) => isPending)) {\n return;\n }\n if (Array.from(lastDependencies).every(([p, entry]) => getVersion(p) === entry.v)) {\n return;\n }\n }\n const dependencies = /* @__PURE__ */ new Map();\n const get = (p) => {\n dependencies.set(p, { v: getVersion(p) });\n return p;\n };\n const value = fn(get);\n const subscribeToDependencies = () => {\n dependencies.forEach((entry, p) => {\n var _a;\n const lastSubscription = (_a = lastDependencies == null ? void 0 : lastDependencies.get(p)) == null ? void 0 : _a.s;\n if (lastSubscription) {\n entry.s = lastSubscription;\n } else {\n const subscription = {\n s: p,\n d: proxyObject,\n k: key,\n c: evaluate,\n n: notifyInSync,\n i: derivedKeys\n };\n addSubscription(subscription);\n entry.s = subscription;\n }\n });\n lastDependencies == null ? void 0 : lastDependencies.forEach((entry, p) => {\n if (!dependencies.has(p) && entry.s) {\n removeSubscription(entry.s);\n }\n });\n lastDependencies = dependencies;\n };\n if (value instanceof Promise) {\n value.finally(subscribeToDependencies);\n } else {\n subscribeToDependencies();\n }\n proxyObject[key] = value;\n };\n evaluate();\n });\n return proxyObject;\n}\nfunction underive(proxyObject, options) {\n const keysToDelete = (options == null ? void 0 : options.delete) ? /* @__PURE__ */ new Set() : null;\n listSubscriptions(proxyObject).forEach((subscription) => {\n const { k: key } = subscription;\n if (!(options == null ? void 0 : options.keys) || options.keys.includes(key)) {\n removeSubscription(subscription);\n if (keysToDelete) {\n keysToDelete.add(key);\n }\n }\n });\n if (keysToDelete) {\n keysToDelete.forEach((key) => {\n delete proxyObject[key];\n });\n }\n}\n\nfunction addComputed_DEPRECATED(proxyObject, computedFns_FAKE, targetObject = proxyObject) {\n console.warn(\"addComputed is deprecated. Please consider using `derive` or `proxyWithComputed` instead. Falling back to emulation with derive.\");\n const derivedFns = {};\n Object.keys(computedFns_FAKE).forEach((key) => {\n derivedFns[key] = (get) => computedFns_FAKE[key](get(proxyObject));\n });\n return derive(derivedFns, { proxy: targetObject });\n}\n\nfunction proxyWithComputed(initialObject, computedFns) {\n Object.keys(computedFns).forEach((key) => {\n if (Object.getOwnPropertyDescriptor(initialObject, key)) {\n throw new Error(\"object property already defined\");\n }\n const computedFn = computedFns[key];\n const { get, set } = typeof computedFn === \"function\" ? { get: computedFn } : computedFn;\n let computedValue;\n let prevSnapshot;\n let affected = /* @__PURE__ */ new WeakMap();\n const desc = {};\n desc.get = () => {\n const nextSnapshot = snapshot(proxyObject);\n if (!prevSnapshot || isChanged(prevSnapshot, nextSnapshot, affected)) {\n affected = /* @__PURE__ */ new WeakMap();\n computedValue = get(createProxy(nextSnapshot, affected));\n prevSnapshot = nextSnapshot;\n }\n return computedValue;\n };\n if (set) {\n desc.set = (newValue) => set(proxyObject, newValue);\n }\n Object.defineProperty(initialObject, key, desc);\n });\n const proxyObject = proxy(initialObject);\n return proxyObject;\n}\n\nfunction proxyWithHistory(initialValue, skipSubscribe = false) {\n const proxyObject = proxy({\n value: initialValue,\n history: ref({\n wip: initialValue,\n snapshots: [],\n index: -1\n }),\n canUndo: () => proxyObject.history.index > 0,\n undo: () => {\n if (proxyObject.canUndo()) {\n proxyObject.value = proxyObject.history.wip = proxyObject.history.snapshots[--proxyObject.history.index];\n proxyObject.history.snapshots[proxyObject.history.index] = snapshot(proxyObject).value;\n }\n },\n canRedo: () => proxyObject.history.index < proxyObject.history.snapshots.length - 1,\n redo: () => {\n if (proxyObject.canRedo()) {\n proxyObject.value = proxyObject.history.wip = proxyObject.history.snapshots[++proxyObject.history.index];\n proxyObject.history.snapshots[proxyObject.history.index] = snapshot(proxyObject).value;\n }\n },\n saveHistory: () => {\n proxyObject.history.snapshots.splice(proxyObject.history.index + 1);\n proxyObject.history.snapshots.push(snapshot(proxyObject).value);\n ++proxyObject.history.index;\n },\n subscribe: () => subscribe(proxyObject, (ops) => {\n if (ops.every((op) => op[1][0] === \"value\" && (op[0] !== \"set\" || op[2] !== proxyObject.history.wip))) {\n proxyObject.saveHistory();\n }\n })\n });\n proxyObject.saveHistory();\n if (!skipSubscribe) {\n proxyObject.subscribe();\n }\n return proxyObject;\n}\n\nfunction proxySet(initialValues) {\n const set = proxy({\n data: Array.from(new Set(initialValues)),\n has(value) {\n return this.data.indexOf(value) !== -1;\n },\n add(value) {\n let hasProxy = false;\n if (typeof value === \"object\" && value !== null) {\n hasProxy = this.data.indexOf(proxy(value)) !== -1;\n }\n if (this.data.indexOf(value) === -1 && !hasProxy) {\n this.data.push(value);\n }\n return this;\n },\n delete(value) {\n const index = this.data.indexOf(value);\n if (index === -1) {\n return false;\n }\n this.data.splice(index, 1);\n return true;\n },\n clear() {\n this.data.splice(0);\n },\n get size() {\n return this.data.length;\n },\n forEach(cb) {\n this.data.forEach((value) => {\n cb(value, value, this);\n });\n },\n get [Symbol.toStringTag]() {\n return \"Set\";\n },\n toJSON() {\n return {};\n },\n [Symbol.iterator]() {\n return this.data[Symbol.iterator]();\n },\n values() {\n return this.data.values();\n },\n keys() {\n return this.data.values();\n },\n entries() {\n return new Set(this.data).entries();\n }\n });\n Object.defineProperties(set, {\n data: {\n enumerable: false\n },\n size: {\n enumerable: false\n },\n toJSON: {\n enumerable: false\n }\n });\n Object.seal(set);\n return set;\n}\n\nfunction proxyMap(entries) {\n const map = proxy({\n data: Array.from(entries || []),\n has(key) {\n return this.data.some((p) => p[0] === key);\n },\n set(key, value) {\n const record = this.data.find((p) => p[0] === key);\n if (record) {\n record[1] = value;\n } else {\n this.data.push([key, value]);\n }\n return this;\n },\n get(key) {\n var _a;\n return (_a = this.data.find((p) => p[0] === key)) == null ? void 0 : _a[1];\n },\n delete(key) {\n const index = this.data.findIndex((p) => p[0] === key);\n if (index === -1) {\n return false;\n }\n this.data.splice(index, 1);\n return true;\n },\n clear() {\n this.data.splice(0);\n },\n get size() {\n return this.data.length;\n },\n toJSON() {\n return {};\n },\n forEach(cb) {\n this.data.forEach((p) => {\n cb(p[1], p[0], this);\n });\n },\n keys() {\n return this.data.map((p) => p[0]).values();\n },\n values() {\n return this.data.map((p) => p[1]).values();\n },\n entries() {\n return new Map(this.data).entries();\n },\n get [Symbol.toStringTag]() {\n return \"Map\";\n },\n [Symbol.iterator]() {\n return this.entries();\n }\n });\n Object.defineProperties(map, {\n data: {\n enumerable: false\n },\n size: {\n enumerable: false\n },\n toJSON: {\n enumerable: false\n }\n });\n Object.seal(map);\n return map;\n}\n\nexport { addComputed_DEPRECATED as addComputed, derive, devtools, proxyMap, proxySet, proxyWithComputed, proxyWithHistory, subscribeKey, underive, unstable_deriveSubscriptions, watch };\n", "import { proxy } from \"valtio/vanilla\"\nimport { cast } from \"@zag-js/utils\"\nimport { ActionTypes, Dict, StateMachine as S } from \"./types\"\n\nexport function createProxy<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n config: S.MachineConfig<TContext, TState, TEvent>,\n) {\n const state = proxy({\n value: \"\",\n previousValue: \"\",\n event: cast<Dict>({}),\n context: config.context ?? cast<TContext>({}),\n done: false,\n tags: [] as Array<TState[\"tags\"]>,\n hasTag(tag: TState[\"tags\"]): boolean {\n return this.tags.includes(tag)\n },\n matches(...value: string[]): boolean {\n return value.includes(this.value)\n },\n can(event: string): boolean {\n return cast<any>(this).nextEvents.includes(event)\n },\n get nextEvents() {\n const stateEvents = (config.states as Dict)?.[this.value]?.[\"on\"] ?? {}\n const globalEvents = config?.on ?? {}\n return Object.keys({ ...stateEvents, ...globalEvents })\n },\n get changed() {\n if (this.event.value === ActionTypes.Init || !this.previousValue) return false\n return this.value !== this.previousValue\n },\n })\n return cast<S.State<TContext, TState, TEvent>>(state)\n}\n", "import { isFunction, isNumber, isString } from \"@zag-js/utils\"\nimport { StateMachine as S } from \"./types\"\n\n/**\n * Delay can be specified as:\n * - a string (reference to `options.delays`)\n * - a number (in ms)\n * - a function that returns a number (in ms)\n *\n * Let's resolve this to a number\n */\nexport function determineDelayFn<TContext, TEvent extends S.EventObject>(\n delay: S.Delay<TContext, TEvent> | undefined,\n delaysMap: S.DelayMap<TContext, TEvent> | undefined,\n) {\n return (context: TContext, event: TEvent) => {\n if (isNumber(delay)) return delay\n\n if (isFunction(delay)) {\n return delay(context, event)\n }\n\n if (isString(delay)) {\n const value = Number.parseFloat(delay)\n\n if (!Number.isNaN(value)) {\n return value\n }\n\n if (delaysMap) {\n const valueOrFn = delaysMap?.[delay]\n if (valueOrFn == null) {\n const msg = `[machine] Cannot determine delay for ${delay}. It doesn't exist in options.delays`\n throw new Error(msg)\n }\n return isFunction(valueOrFn) ? valueOrFn(context, event) : valueOrFn\n }\n }\n }\n}\n", "import { isArray, isString } from \"@zag-js/utils\"\nimport type { StateMachine as S } from \"./types\"\n\nexport function toEvent<T extends S.EventObject>(event: S.Event<T>): T {\n const obj = isString(event) ? { type: event } : event\n return obj as T\n}\n\nexport function toArray<T>(value: T | T[] | undefined): T[] {\n if (!value) return []\n return isArray(value) ? value : [value]\n}\n", "import { cast, isArray, isObject, isString } from \"@zag-js/utils\"\nimport { determineGuardFn } from \"./guard-utils\"\nimport type { StateMachine as S } from \"./types\"\nimport { toArray } from \"./utils\"\n\n/**\n * A transition is an object that describes the next state, or/and actions\n * that should run when an event is sent.\n *\n * Transitions can be specified as:\n * - A single string: \"spinning\"\n * - An object with `target`, `actions`, or `guard`: { target: \"spinning\", actions: [...], guard: isValid }\n * - An array of possible transitions. In this case, we'll pick the first matching transition\n * depending on the `guard` specified\n */\n\nexport function toTarget<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n target: S.Transition<TContext, TState, TEvent>,\n): S.TransitionDefinition<TContext, TState, TEvent> {\n return isString(target) ? { target } : target\n}\n\nexport function determineTransitionFn<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n transitions?: S.Transitions<TContext, TState, TEvent>,\n guardMap?: S.GuardMap<TContext, TEvent>,\n) {\n return (context: TContext, event: TEvent) => {\n return toArray(transitions)\n .map(toTarget)\n .find((transition) => {\n // get condition function\n const determineGuard = determineGuardFn(transition.guard, guardMap)\n const guard = determineGuard(context, event)\n return guard ?? transition.target ?? transition.actions\n })\n }\n}\n\nexport function toTransition<TContext, TState extends S.StateSchema, TEvent extends S.EventObject>(\n transition: S.Transitions<TContext, TState, TEvent> | undefined,\n current?: TState[\"value\"] | null,\n) {\n const _transition = isString(transition) ? toTarget(transition) : transition\n\n const fn = (t: S.TransitionDefinition<TContext, TState, TEvent>) => {\n const isTargetless = t.actions && !t.target\n if (isTargetless && current) t.target = current\n return t\n }\n\n if (isArray(_transition)) {\n return _transition.map(fn)\n }\n\n if (isObject(_transition)) {\n return fn(cast(_transition))\n }\n}\n", "import { cast, clear, invariant, isArray, isObject, isString, noop, runIfFn, uuid, warn } from \"@zag-js/utils\"\nimport { klona } from \"klona/json\"\nimport { derive, subscribeKey, underive } from \"valtio/utils\"\nimport { ref, snapshot, subscribe } from \"valtio/vanilla\"\nimport { determineActionsFn } from \"./action-utils\"\nimport { createProxy } from \"./create-proxy\"\nimport { determineDelayFn } from \"./delay-utils\"\nimport { determineGuardFn } from \"./guard-utils\"\nimport { determineTransitionFn, toTransition } from \"./transition-utils\"\nimport { ActionTypes, Dict, MachineStatus, MachineType, StateMachine as S, VoidFunction, Writable } from \"./types\"\nimport { toArray, toEvent } from \"./utils\"\n\nexport class Machine<\n TContext extends Dict,\n TState extends S.StateSchema,\n TEvent extends S.EventObject = S.AnyEventObject,\n> {\n public status: MachineStatus = MachineStatus.NotStarted\n public readonly state: S.State<TContext, TState, TEvent>\n public initialState: S.StateInfo<TContext, TState, TEvent> | undefined\n\n public id: string\n\n public type: MachineType = MachineType.Machine\n\n // Cleanup function map (per state)\n private activityEvents = new Map<string, Set<VoidFunction>>()\n private delayedEvents = new Map<string, VoidFunction[]>()\n\n // state update listeners the user can opt-in for\n private stateListeners = new Set<S.StateListener<TContext, TState, TEvent>>()\n private eventListeners = new Set<S.EventListener<TEvent>>()\n private doneListeners = new Set<S.StateListener<TContext, TState, TEvent>>()\n private contextWatchers = new Set<VoidFunction>()\n\n // Cleanup functions (for `subscribe`)\n private removeStateListener: VoidFunction = noop\n private removeEventListener: VoidFunction = noop\n\n // For Parent <==> Spawned Actor relationship\n private parent?: AnyMachine\n private children = new Map<string, AnyMachine>()\n\n // A map of guard, action, delay implementations\n private guardMap: S.GuardMap<TContext, TEvent>\n private actionMap: S.ActionMap<TContext, TState, TEvent>\n private delayMap: S.DelayMap<TContext, TEvent>\n private activityMap: S.ActivityMap<TContext, TState, TEvent>\n private sync: boolean\n public options?: S.MachineOptions<TContext, TState, TEvent>\n\n // Let's get started!\n constructor(\n public config: S.MachineConfig<TContext, TState, TEvent>,\n options?: S.MachineOptions<TContext, TState, TEvent>,\n ) {\n // deep clone the config\n this.options = klona(options)\n this.id = config.id ?? `machine-${uuid()}`\n\n // maps\n this.guardMap = this.options?.guards ?? {}\n this.actionMap = this.options?.actions ?? {}\n this.delayMap = this.options?.delays ?? {}\n this.activityMap = this.options?.activities ?? {}\n this.sync = this.options?.sync ?? false\n\n // create mutatable state\n this.state = createProxy(klona(config))\n this.setupComputed()\n\n // created actions\n const event = toEvent<TEvent>(ActionTypes.Created)\n this.executeActions(config?.created, event)\n }\n\n // immutable state value\n private get stateSnapshot(): S.State<TContext, TState, TEvent> {\n return cast(snapshot(this.state))\n }\n\n // immutable context value\n private get contextSnapshot(): TContext {\n return this.stateSnapshot.context\n }\n\n // Starts the interpreted machine.\n public start = (init?: S.StateInit<TContext, TState>) => {\n // Don't start if it's already running\n if (this.status === MachineStatus.Running) {\n return this\n }\n\n this.status = MachineStatus.Running\n const event = toEvent<TEvent>(ActionTypes.Init)\n\n if (init) {\n const resolved = isObject(init) ? init : { context: this.config.context!, value: init }\n this.setState(resolved.value)\n this.setContext(resolved.context as Partial<TContext>)\n }\n\n // start transition definition\n const transition = {\n target: !!init ? undefined : this.config.initial,\n }\n\n const info = this.getNextStateInfo(transition, event)\n info.target = cast(info.target || transition.target)\n this.initialState = info\n this.performStateChangeEffects(info.target, info, event)\n\n this.removeStateListener = subscribe(\n this.state,\n () => {\n this.stateListeners.forEach((listener) => {\n listener(this.stateSnapshot)\n })\n },\n this.sync,\n )\n\n // For some reason `subscribe(this.state.event)` doesn't work, so we use `subscribeKey`\n this.removeEventListener = subscribeKey(this.state, \"event\", (value) => {\n if (this.config.onEvent) {\n this.executeActions(this.config.onEvent, value)\n }\n for (const listener of this.eventListeners) {\n listener(value)\n }\n })\n\n this.setupContextWatchers()\n this.executeActivities(toEvent<TEvent>(ActionTypes.Start), toArray(this.config.activities), ActionTypes.Start)\n this.executeActions(this.config.entry, toEvent<TEvent>(ActionTypes.Start))\n\n return this\n }\n\n private setupContextWatchers = () => {\n for (const [key, fn] of Object.entries(this.config.watch ?? {})) {\n this.contextWatchers.add(\n subscribeKey(this.state.context, key, () => {\n this.executeActions(fn, this.state.event as TEvent)\n }),\n )\n }\n }\n\n private setupComputed = () => {\n // convert computed properties to valtio getters format\n const computed = cast<S.TComputedContext<TContext>>(this.config.computed ?? {})\n const deriveFns = Object.fromEntries(\n Object.entries(computed).map(([key, fn]: any) => [key, (get: any) => fn(get(this.state.context))]),\n )\n\n // attach computed properties to the state's context\n derive(deriveFns, { proxy: this.state.context })\n }\n\n private detachComputed = () => {\n underive(this.state.context, { delete: true })\n }\n\n // Stops the interpreted machine\n stop = () => {\n // No need to call if already stopped\n if (this.status === MachineStatus.Stopped) return\n\n this.setState(null)\n this.setEvent(ActionTypes.Stop)\n\n if (this.config.context) {\n this.setContext(this.config.context as Partial<TContext>)\n }\n\n // cleanups\n this.stopStateListeners()\n this.stopChildren()\n this.stopActivities()\n this.stopDelayedEvents()\n this.stopContextWatchers()\n this.stopEventListeners()\n\n // cleanup `derive` subscriptions that was attached to the context\n this.detachComputed()\n\n this.status = MachineStatus.Stopped\n this.executeActions(this.config.exit, toEvent<TEvent>(ActionTypes.Stop))\n return this\n }\n\n private stopEventListeners = () => {\n this.eventListeners.clear()\n this.removeEventListener()\n }\n\n private stopStateListeners = () => {\n this.removeStateListener()\n this.stateListeners.clear()\n }\n\n private stopContextWatchers = () => {\n this.contextWatchers.forEach((fn) => fn())\n this.contextWatchers.clear()\n }\n\n private stopDelayedEvents = () => {\n this.delayedEvents.forEach((state) => {\n state.forEach((stop) => stop())\n })\n this.delayedEvents.clear()\n }\n\n // Cleanup running activities (e.g `setInterval`, invoked callbacks, promises)\n private stopActivities = (state?: TState[\"value\"]) => {\n // stop activities for a state\n if (state) {\n this.activityEvents.get(state)?.forEach((stop) => stop())\n this.activityEvents.get(state)?.clear()\n this.activityEvents.delete(state)\n } else {\n // stop every running activity\n this.activityEvents.forEach((state) => {\n state.forEach((stop) => stop())\n state.clear()\n })\n this.activityEvents.clear()\n }\n }\n\n /**\n * Function to send event to spawned child machine or actor\n */\n sendChild = (evt: S.Event<S.AnyEventObject>, to: string | ((ctx: TContext) => string)) => {\n const event = toEvent(evt)\n const id = runIfFn(to, this.contextSnapshot)\n const child = this.children.get(id)\n if (!child) {\n invariant(`[machine/send-child] Cannot send '${event.type}' event to unknown child`)\n }\n child!.send(event)\n }\n\n /**\n * Function to stop a running child machine or actor\n */\n stopChild = (id: string) => {\n if (!this.children.has(id)) {\n invariant(\"[machine/stop-child] Cannot stop unknown child\")\n }\n this.children.get(id)!.stop()\n this.children.delete(id)\n }\n\n removeChild = (id: string) => {\n this.children.delete(id)\n }\n\n // Stop and delete spawned actors\n private stopChildren = () => {\n this.children.forEach((child) => child.stop())\n this.children.clear()\n }\n\n setParent = (parent: any) => {\n this.parent = parent\n }\n\n public spawn = <TContext extends Dict, TState extends S.StateSchema, TEvent extends S.EventObject = S.AnyEventObject>(\n src: MachineSrc<TContext, TState, TEvent>,\n id?: string,\n ) => {\n const actor = runIfFn(src)\n if (id) actor.id = id\n actor.type = MachineType.Actor\n actor.setParent(this)\n this.children.set(actor.id, cast(actor))\n\n actor\n .onDone(() => {\n this.removeChild(actor.id)\n })\n .start()\n\n return cast<typeof actor>(ref(actor))\n }\n\n private addActivityCleanup = (state: TState[\"value\"] | null, cleanup: VoidFunction) => {\n if (!state) return\n if (!this.activityEvents.has(state)) {\n this.activityEvents.set(state, new Set([cleanup]))\n } else {\n this.activityEvents.get(state)?.add(cleanup)\n }\n }\n\n private setState = (target: TState[\"value\"] | null) => {\n this.state.previousValue = this.state.value\n this.state.value = target\n\n const stateNode = this.getStateNode(target)\n\n if (target == null) {\n // remove all tags\n clear(this.state.tags)\n } else {\n this.state.tags = toArray(stateNode?.tags)\n }\n }\n\n /**\n * To used within side effects for React or Vue to update context\n */\n setContext = (context: Partial<Writable<TContext>>) => {\n for (const key in context) {\n this.state.context[<keyof TContext>key] = context[key]!\n }\n }\n\n withContext = (context: Partial<Writable<TContext>>) => {\n this.detachComputed()\n const newContext = { ...this.config.context, ...context } as TContext\n return new Machine({ ...this.config, context: newContext }, this.options)\n }\n\n withOptions = (options: Partial<S.MachineOptions<TContext, TState, TEvent>>) => {\n this.detachComputed()\n return new Machine(this.config, { ...this.options, ...options })\n }\n\n setActions = (actions: Partial<S.MachineOptions<TContext, TState, TEvent>>[\"actions\"]) => {\n this.actionMap = { ...this.actionMap, ...actions }\n }\n\n clone = () => {\n this.detachComputed()\n return new Machine(this.config, this.options)\n }\n\n private getStateNode = (state: TState[\"value\"] | null) => {\n if (!state) return\n return this.config.states?.[state]\n }\n\n private getNextStateInfo = (\n transitions: S.Transitions<TContext, TState, TEvent>,\n event: TEvent,\n ): S.StateInfo<TContext, TState, TEvent> => {\n const transition = this.determineTransition(transitions, event)\n const target = transition?.target ?? this.state.value\n const stateNode = this.getStateNode(target)\n\n return {\n transition,\n stateNode,\n target: target!,\n }\n }\n\n private getActionFromDelayedTransition = (transition: S.DelayedTransition<TContext, TState, TEvent>) => {\n // get the computed delay\n const event = toEvent<TEvent>(ActionTypes.After)\n\n const determineDelay = determineDelayFn(transition.delay, this.delayMap)\n const delay = determineDelay(this.contextSnapshot, event)\n\n let id: ReturnType<typeof globalThis.setTimeout>\n\n return {\n entry: () => {\n id = globalThis.setTimeout(() => {\n const current = this.state.value!\n const next = this.getNextStateInfo(transition, event)\n this.performStateChangeEffects(current, next, event)\n }, delay)\n },\n exit: () => {\n globalThis.clearTimeout(id)\n },\n }\n }\n\n /**\n * All `after` events leverage `setTimeout` and `clearTimeout`,\n * we invoke the `clearTimeout` on exit and `setTimeout` on entry.\n *\n * To achieve this, we split the `after` defintion into `entry` and `exit`\n * functions and append them to the state's `entry` and `exit` actions\n */\n private getDelayedEventActions = (state: TState[\"value\"]) => {\n const stateNode = this.getStateNode(state)\n const event = toEvent<TEvent>(ActionTypes.After)\n\n if (!stateNode || !stateNode.after) return\n\n const entries: VoidFunction[] = []\n const exits: VoidFunction[] = []\n\n if (isArray(stateNode.after)) {\n //\n const transition = this.determineTransition(stateNode.after, event)\n if (!transition) return\n\n const actions = this.getActionFromDelayedTransition(transition)\n entries.push(actions.entry)\n exits.push(actions.exit)\n //\n } else if (isObject(stateNode.after)) {\n //\n for (const delay in stateNode.after) {\n const transition = stateNode.after[delay]\n let resolvedTransition: S.DelayedTransition<TContext, TState, TEvent> = {}\n\n if (isArray(transition)) {\n //\n const picked = this.determineTransition(transition, event)\n if (picked) resolvedTransition = picked\n //\n } else if (isString(transition)) {\n resolvedTransition = { target: transition, delay }\n } else {\n resolvedTransition = { ...transition, delay }\n }\n\n const actions = this.getActionFromDelayedTransition(resolvedTransition)\n\n entries.push(actions.entry)\n exits.push(actions.exit)\n }\n }\n\n return { entries, exits }\n }\n\n /**\n * A reference to the instance methods of the machine.\n * Useful when spawning child machines and managing the communication between them.\n */\n private get self(): S.Self<TContext, TState, TEvent> {\n const _self = this\n return {\n id: this.id,\n send: this.send.bind(this),\n sendParent: this.sendParent.bind(this),\n sendChild: this.sendChild.bind(this),\n stop: this.stop.bind(this),\n stopChild: this.stopChild.bind(this),\n spawn: this.spawn.bind(this) as any,\n get state() {\n return _self.stateSnapshot\n },\n }\n }\n\n private get meta(): S.Meta<TContext, TState, TEvent> {\n return {\n state: this.stateSnapshot,\n guards: this.guardMap,\n send: this.send.bind(this),\n listen: this.onEvent.bind(this),\n self: this.self,\n getState: () => this.stateSnapshot,\n }\n }\n\n /**\n * Function to executes defined actions. It can accept actions as string\n * (referencing `options.actions`) or actual functions.\n */\n private executeActions = (actions: S.Actions<TContext, TState, TEvent> | undefined, event: TEvent) => {\n const _actions = determineActionsFn(actions, this.guardMap)(this.contextSnapshot, event)\n for (const action of toArray(_actions)) {\n const fn = isString(action) ? this.actionMap?.[action] : action\n warn(isString(action) && !fn, `[machine/exec-action] No implementation found for action: \\`${action}\\``)\n fn?.(this.state.context, event, this.meta)\n }\n }\n\n /**\n * Function to execute running activities and registers\n * their cleanup function internally (to be called later on when we exit the state)\n */\n private executeActivities = (\n event: TEvent,\n activities: Array<S.Activity<TContext, TState, TEvent>>,\n state?: TState[\"value\"],\n ) => {\n for (const activity of activities) {\n const fn = isString(activity) ? this.activityMap?.[activity] : activity\n\n if (!fn) {\n warn(`[machine/exec-activity] No implementation found for activity: \\`${activity}\\``)\n continue\n }\n\n const cleanup = fn(this.state.context, event, this.meta)\n if (cleanup) {\n this.addActivityCleanup(state ?? this.state.value, cleanup)\n }\n }\n }\n\n /**\n * Normalizes the `every` definition to transition. `every` can be:\n * - An array of possible actions to run (we need to pick the first match based on guard)\n * - An object of intervals and actions\n */\n private createEveryActivities = (\n every: S.StateNode<TContext, TState, TEvent>[\"every\"] | undefined,\n callbackfn: (activity: S.Activity<TContext, TState, TEvent>) => void,\n ) => {\n if (!every) return\n const event = toEvent<TEvent>(ActionTypes.Every)\n\n // every: [{ interval: 2000, actions: [...], guard: \"isValid\" }, { interval: 1000, actions: [...] }]\n if (isArray(every)) {\n // picked = { interval: string | number | <ref>, actions: [...], guard: ... }\n const picked = toArray(every).find((t) => {\n //\n const determineDelay = determineDelayFn(t.delay, this.delayMap)\n t.delay = determineDelay(this.contextSnapshot, event)\n\n const determineGuard = determineGuardFn(t.guard, this.guardMap)\n const guard = determineGuard(this.contextSnapshot, event)\n\n return guard ?? t.delay\n })\n\n if (!picked) return\n\n const determineDelay = determineDelayFn(picked.delay, this.delayMap)\n const delay = determineDelay(this.contextSnapshot, event)\n\n const activity = () => {\n const id = globalThis.setInterval(() => {\n this.executeActions(picked.actions, event)\n }, delay)\n return () => {\n globalThis.clearInterval(id)\n }\n }\n callbackfn(activity)\n //\n } else {\n // every = { 1000: [fn, fn] }\n for (const interval in every) {\n const actions = every?.[interval]\n\n // interval could be a `ref` not the actual interval value, let's determine the actual value\n const determineDelay = determineDelayFn(interval, this.delayMap)\n const delay = determineDelay(this.contextSnapshot, event)\n\n // create the activity to run for each `every` reaction\n const activity = () => {\n const id = globalThis.setInterval(() => {\n this.executeActions(actions, event)\n }, delay)\n return () => {\n globalThis.clearInterval(id)\n }\n }\n callbackfn(activity)\n }\n }\n }\n\n private setEvent = (event: TEvent | TEvent[\"type\"]) => {\n this.state.event = ref(toEvent(event))\n }\n\n private performExitEffects = (current: TState[\"value\"] | undefined, event: TEvent) => {\n const currentState = this.state.value!\n const stateNode = current ? this.getStateNode(current) : undefined\n\n // cleanup activities for current state\n this.stopActivities(currentState)\n\n // get explicit exit and implicit \"after.exit\" actions for current state\n const _exit = determineActionsFn(stateNode?.exit, this.guardMap)(this.contextSnapshot, event)\n const exitActions = toArray(_exit)\n\n const afterExitActions = this.delayedEvents.get(currentState)\n if (afterExitActions) {\n exitActions.push(...afterExitActions)\n }\n\n // call all exit actions for current state\n this.executeActions(exitActions, event)\n\n // remove all registered listeners\n this.eventListeners.clear()\n }\n\n private performEntryEffects = (next: TState[\"value\"], event: TEvent) => {\n const stateNode = this.getStateNode(next)\n\n // execute activities for next state\n const activities = toArray(stateNode?.activities)\n\n // if `every` is defined, create an activity and append to activities\n this.createEveryActivities(stateNode?.every, (activity) => {\n activities.unshift(activity)\n })\n\n if (activities.length > 0) {\n this.executeActivities(event, activities)\n }\n\n // get all entry actions\n const _entry = determineActionsFn(stateNode?.entry, this.guardMap)(this.contextSnapshot, event)\n const entryActions = toArray(_entry)\n const afterActions = this.getDelayedEventActions(next)\n\n if (stateNode?.after && afterActions) {\n this.delayedEvents.set(next, afterActions?.exits)\n entryActions.push(...afterActions.entries)\n }\n\n // execute entry actions for next state\n this.executeActions(entryActions, event)\n\n if (stateNode?.type === \"final\") {\n this.state.done = true\n this.doneListeners.forEach((listener) => {\n listener(this.stateSnapshot)\n })\n this.stop()\n }\n }\n\n private performTransitionEffects = (\n transition: S.Transitions<TContext, TState, TEvent> | undefined,\n event: TEvent,\n ) => {\n // execute transition actions\n const t = this.determineTransition(transition, event)\n this.executeActions(t?.actions, event)\n }\n\n /**\n * Performs all the requires side-effects or reactions when\n * we move from state A => state B.\n *\n * The Effect order:\n * Exit actions (current state) => Transition actions => Go to state => Entry actions (next state)\n */\n private performStateChangeEffects = (\n current: TState[\"value\"] | undefined,\n next: S.StateInfo<TContext, TState, TEvent>,\n event: TEvent,\n ) => {\n // update event\n this.setEvent(event)\n\n // determine next target\n next.target = next.target ?? this.state.value ?? undefined\n const ok = next.target && next.target !== this.state.value\n\n if (ok) {\n this.performExitEffects(current, event)\n }\n\n // execute transition actions\n this.performTransitionEffects(next?.transition, event)\n\n // go to next state\n this.setState(next.target)\n\n if (ok) {\n this.performEntryEffects(next.target, event)\n }\n }\n\n private determineTransition = (transition: S.Transitions<TContext, TState, TEvent> | undefined, event: TEvent) => {\n const fn = determineTransitionFn(transition, this.guardMap)\n return fn?.(this.contextSnapshot, event)\n }\n\n /**\n * Function to send event to parent machine from spawned child\n */\n sendParent = (evt: S.Event<S.AnyEventObject>) => {\n if (!this.parent) {\n invariant(\"[machine/send-parent] Cannot send event to an unknown parent\")\n }\n const event = toEvent<S.AnyEventObject>(evt)\n this.parent?.send(event)\n }\n\n /**\n * Function to send an event to current machine\n */\n send = (evt: S.Event<TEvent>) => {\n const event = toEvent<TEvent>(evt)\n this.transition(this.state.value, event)\n }\n\n transition = (state: TState[\"value\"] | S.StateInfo<TContext, TState, TEvent> | null, evt: S.Event<TEvent>) => {\n const stateNode = isString(state) ? this.getStateNode(state) : state?.stateNode\n\n const event = toEvent(evt)\n\n if (!stateNode && !this.config.on) {\n const msg =\n this.status === MachineStatus.Stopped\n ? \"[machine/transition] Cannot transition a stopped machine\"\n : \"[machine/transition] State does not have a definition\"\n warn(msg)\n return\n }\n\n const transitionConfig: S.Transitions<TContext, TState, TEvent> =\n stateNode?.on?.[event.type] ?? this.config.on?.[event.type]\n\n const transition = toTransition(transitionConfig, this.state.value)\n\n if (!transition) return\n\n const info = this.getNextStateInfo(transition, event)\n this.performStateChangeEffects(this.state.value!, info, event)\n\n return info.stateNode\n }\n\n subscribe = (listener: S.StateListener<TContext, TState, TEvent>) => {\n this.stateListeners.add(listener)\n\n if (this.status === MachineStatus.Running) {\n listener(this.stateSnapshot)\n }\n\n return () => {\n this.stateListeners.delete(listener)\n }\n }\n\n public onDone = (listener: S.StateListener<TContext, TState, TEvent>) => {\n this.doneListeners.add(listener)\n return this\n }\n\n public onTransition = (listener: S.StateListener<TContext, TState, TEvent>) => {\n this.stateListeners.add(listener)\n if (this.status === MachineStatus.Running) {\n listener(this.stateSnapshot)\n }\n return this\n }\n\n public onEvent = (listener: S.EventListener<TEvent>) => {\n listener(this.state.event)\n this.eventListeners.add(listener)\n return this\n }\n}\n\nexport type MachineSrc<\n TContext extends Dict,\n TState extends S.StateSchema,\n TEvent extends S.EventObject = S.AnyEventObject,\n> = Machine<TContext, TState, TEvent> | (() => Machine<TContext, TState, TEvent>)\n\nexport type AnyMachine = Machine<Dict, S.StateSchema, S.AnyEventObject>\n\nexport const createMachine = <\n TContext extends Dict,\n TState extends S.StateSchema = S.StateSchema,\n TEvent extends S.EventObject = S.AnyEventObject,\n>(\n config: S.MachineConfig<TContext, TState, TEvent>,\n options?: S.MachineOptions<TContext, TState, TEvent>,\n) => new Machine(config, options)\n", "import { callAll } from \"@zag-js/utils\"\n\ninterface Props {\n [key: string]: any\n}\n\nconst clsx = (...args: (string | undefined)[]) =>\n args\n .map((str) => str?.trim())\n .filter(Boolean)\n .join(\" \")\n\ntype TupleTypes<T extends any[]> = T[number]\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never\n\nexport function mergeProps<T extends Props[]>(...args: T): UnionToIntersection<TupleTypes<T>> {\n let result: Props = {}\n\n for (let props of args) {\n for (let key in result) {\n if (/^on[A-Z]/.test(key) && typeof result[key] === \"function\" && typeof props[key] === \"function\") {\n result[key] = callAll(result[key], props[key])\n continue\n }\n\n if (key === \"className\" || key === \"class\") {\n result[key] = clsx(result[key], props[key])\n continue\n }\n\n if (key === \"style\") {\n result[key] = Object.assign({}, result[key] ?? {}, props[key] ?? {})\n continue\n }\n\n result[key] = props[key] !== undefined ? props[key] : result[key]\n }\n\n // Add props from b that are not in a\n for (let key in props) {\n if (result[key] === undefined) {\n result[key] = props[key]\n }\n }\n }\n\n return result as UnionToIntersection<TupleTypes<T>>\n}\n", "import { proxy } from \"@zag-js/core\"\n\ntype Id = string | null\n\ntype Store = {\n id: Id\n prevId: Id\n setId: (val: Id) => void\n}\n\nexport const store = proxy<Store>({\n id: null,\n prevId: null,\n setId(val) {\n this.prevId = this.id\n this.id = val\n },\n})\n", "import { StateMachine as S } from \"@zag-js/core\"\nimport { dataAttr, visuallyHiddenStyle } from \"@zag-js/dom-utils\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport { normalizeProp, PropTypes, ReactPropTypes } from \"@zag-js/types\"\nimport { dom } from \"./tooltip.dom\"\nimport { store } from \"./tooltip.store\"\nimport { MachineContext, MachineState } from \"./tooltip.types\"\n\nexport function connect<T extends PropTypes = ReactPropTypes>(\n state: S.State<MachineContext, MachineState>,\n send: (event: S.Event<S.AnyEventObject>) => void,\n normalize = normalizeProp,\n) {\n const id = state.context.id\n const hasAriaLabel = state.context.hasAriaLabel\n\n const isOpen = state.hasTag(\"open\")\n\n const triggerId = dom.getTriggerId(state.context)\n const contentId = dom.getContentId(state.context)\n\n const popperStyles = getPlacementStyles({\n measured: !!state.context.isPlacementComplete,\n })\n\n return {\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\n },\n getAnimationState() {\n return {\n enter: store.prevId === null && id === store.id,\n exit: store.id === null,\n }\n },\n\n triggerProps: normalize.button<T>({\n \"data-part\": \"trigger\",\n id: triggerId,\n \"data-expanded\": dataAttr(isOpen),\n \"aria-describedby\": isOpen ? contentId : undefined,\n onClick() {\n send(\"CLICK\")\n },\n onFocus() {\n send(\"FOCUS\")\n },\n onBlur() {\n if (id === store.id) {\n send(\"BLUR\")\n }\n },\n onPointerDown() {\n if (id === store.id) {\n send(\"POINTER_DOWN\")\n }\n },\n onPointerMove() {\n send(\"POINTER_ENTER\")\n },\n onPointerLeave() {\n send(\"POINTER_LEAVE\")\n },\n onPointerCancel() {\n send(\"POINTER_LEAVE\")\n },\n }),\n\n arrowProps: normalize.element<T>({\n id: dom.getArrowId(state.context),\n \"data-part\": \"arrow\",\n style: popperStyles.arrow,\n }),\n\n innerArrowProps: normalize.element<T>({\n \"data-part\": \"arrow-inner\",\n style: popperStyles.innerArrow,\n }),\n\n positionerProps: normalize.element<T>({\n id: dom.getPositionerId(state.context),\n \"data-part\": \"positioner\",\n style: popperStyles.floating,\n }),\n\n contentProps: normalize.element<T>({\n \"data-part\": \"content\",\n role: hasAriaLabel ? undefined : \"tooltip\",\n id: hasAriaLabel ? undefined : contentId,\n \"data-placement\": state.context.currentPlacement,\n onPointerEnter() {\n send(\"TOOLTIP_POINTER_ENTER\")\n },\n onPointerLeave() {\n send(\"TOOLTIP_POINTER_LEAVE\")\n },\n style: {\n pointerEvents: state.context.interactive ? \"auto\" : \"none\",\n },\n }),\n\n labelProps: normalize.element<T>({\n \"data-part\": \"label\",\n id: contentId,\n role: \"tooltip\",\n style: visuallyHiddenStyle,\n children: state.context[\"aria-label\"],\n }),\n\n createPortal() {\n const doc = dom.getDoc(state.context)\n const exist = dom.getPortalEl(state.context)\n if (exist) return exist\n const portal = dom.createPortalEl(state.context)\n doc.body.appendChild(portal)\n return portal\n },\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 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", "const platform = (v: RegExp) => isDom() && v.test(navigator.platform)\nconst ua = (v: RegExp) => isDom() && v.test(navigator.userAgent)\n\nexport const isDev = () => process.env.NODE_ENV !== \"production\"\nexport const isDom = () => !!(typeof window !== \"undefined\")\nexport const isMac = () => platform(/^Mac/)\nexport const isIPhone = () => platform(/^iPhone/)\nexport const isIPad = () => platform(/^iPad/) || (isMac() && navigator.maxTouchPoints > 1)\nexport const isIos = () => isIPhone() || isIPad()\nexport const isSafari = () => ua(/^((?!chrome|android).)*safari/i)\nexport const isFirefox = () => ua(/^Firefox/)\nexport const isWebkit = () => ua(/^WebKit/) && !ua(/Chrome/)\nexport const isApple = () => isMac() || isIos()\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 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) && \"button\" in v\nexport const isTouchEvent = (v: any): v is TouchEvent => isObject(v) && \"touches\" in v\nexport const isLeftClick = (v: MouseEvent | PointerEvent) => v.button === 0\nexport const isRightClick = (v: MouseEvent | PointerEvent) => v.button === 2\nexport const isModifiedEvent = (v: MouseEvent | PointerEvent | KeyboardEvent) =>\n v.ctrlKey || v.altKey || v.metaKey || v.shiftKey\nexport const isCtrlKey = (v: KeyboardEvent) => (isMac() ? v.metaKey && !v.ctrlKey : v.ctrlKey && !v.metaKey)\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 { createMachine, ref, subscribe } from \"@zag-js/core\"\nimport {\n addDomEvent,\n addPointerEvent,\n addPointerlockChangeListener,\n getScrollParents,\n isHTMLElement,\n raf,\n} from \"@zag-js/dom-utils\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { isSafari, noop } from \"@zag-js/utils\"\nimport { dom } from \"./tooltip.dom\"\nimport { store } from \"./tooltip.store\"\nimport { MachineContext, MachineState } from \"./tooltip.types\"\n\nexport const machine = createMachine<MachineContext, MachineState>(\n {\n id: \"tooltip\",\n initial: \"unknown\",\n\n context: {\n id: \"\",\n openDelay: 1000,\n closeDelay: 500,\n closeOnPointerDown: true,\n closeOnEsc: true,\n interactive: true,\n positioning: { placement: \"bottom\" },\n currentPlacement: undefined,\n },\n\n computed: {\n hasAriaLabel: (ctx) => !!ctx[\"aria-label\"],\n },\n\n on: {\n OPEN: \"open\",\n CLOSE: \"closed\",\n },\n\n states: {\n unknown: {\n on: {\n SETUP: {\n target: \"closed\",\n actions: \"setupDocument\",\n },\n },\n },\n\n closed: {\n tags: [\"closed\"],\n entry: [\"clearGlobalId\", \"invokeOnClose\"],\n on: {\n FOCUS: \"open\",\n POINTER_ENTER: [\n {\n guard: \"noVisibleTooltip\",\n target: \"opening\",\n },\n { target: \"open\" },\n ],\n },\n },\n\n opening: {\n tags: [\"closed\"],\n activities: [\"trackScroll\", \"trackPointerlockChange\"],\n after: {\n OPEN_DELAY: \"open\",\n },\n on: {\n POINTER_LEAVE: \"closed\",\n BLUR: \"closed\",\n SCROLL: \"closed\",\n POINTER_LOCK_CHANGE: \"closed\",\n POINTER_DOWN: {\n guard: \"closeOnPointerDown\",\n target: \"closed\",\n },\n },\n },\n\n open: {\n tags: [\"open\"],\n activities: [\n \"trackEscapeKey\",\n \"trackDisabledTriggerOnSafari\",\n \"trackScroll\",\n \"trackPointerlockChange\",\n \"computePlacement\",\n ],\n entry: [\"setGlobalId\", \"invokeOnOpen\"],\n on: {\n POINTER_LEAVE: [\n {\n guard: \"isVisible\",\n target: \"closing\",\n },\n { target: \"closed\" },\n ],\n BLUR: \"closed\",\n ESCAPE: \"closed\",\n SCROLL: \"closed\",\n POINTER_LOCK_CHANGE: \"closed\",\n TOOLTIP_POINTER_LEAVE: {\n guard: \"isInteractive\",\n target: \"closing\",\n },\n POINTER_DOWN: {\n guard: \"closeOnPointerDown\",\n target: \"closed\",\n },\n CLICK: \"closed\",\n },\n },\n\n closing: {\n tags: [\"open\"],\n activities: [\"trackStore\", \"computePlacement\"],\n after: {\n CLOSE_DELAY: \"closed\",\n },\n on: {\n FORCE_CLOSE: \"closed\",\n POINTER_ENTER: \"open\",\n TOOLTIP_POINTER_ENTER: {\n guard: \"isInteractive\",\n target: \"open\",\n },\n },\n },\n },\n },\n {\n activities: {\n computePlacement(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n let cleanup: VoidFunction | undefined\n raf(() => {\n cleanup = getPlacement(dom.getTriggerEl(ctx), dom.getPositionerEl(ctx), {\n ...ctx.positioning,\n onComplete(data) {\n ctx.currentPlacement = data.placement\n ctx.isPlacementComplete = true\n },\n onCleanup() {\n ctx.currentPlacement = undefined\n ctx.isPlacementComplete = false\n },\n })\n })\n return cleanup\n },\n trackPointerlockChange(ctx, _evt, { send }) {\n return addPointerlockChangeListener(dom.getDoc(ctx), () => {\n send(\"POINTER_LOCK_CHANGE\")\n })\n },\n trackScroll(ctx, _evt, { send }) {\n const trigger = dom.getTriggerEl(ctx)\n if (!trigger) return\n const cleanups = getScrollParents(trigger).map((el) => {\n const opts = { passive: true, capture: true } as const\n return addDomEvent(el, \"scroll\", () => send(\"SCROLL\"), opts)\n })\n return () => {\n cleanups.forEach((fn) => fn?.())\n }\n },\n trackStore(ctx, _evt, { send }) {\n return subscribe(store, () => {\n if (store.id !== ctx.id) {\n send(\"FORCE_CLOSE\")\n }\n })\n },\n trackDisabledTriggerOnSafari(ctx, _evt, { send }) {\n if (!isSafari()) return noop\n const doc = dom.getDoc(ctx)\n return addPointerEvent(doc, \"pointermove\", (event) => {\n const selector = \"[data-part=trigger][data-expanded]\"\n if (isHTMLElement(event.target) && event.target.closest(selector)) return\n send(\"POINTER_LEAVE\")\n })\n },\n trackEscapeKey(ctx, _evt, { send }) {\n if (!ctx.closeOnEsc) return\n const doc = dom.getDoc(ctx)\n return addDomEvent(doc, \"keydown\", (event) => {\n if (event.key === \"Escape\") {\n send(\"ESCAPE\")\n }\n })\n },\n },\n actions: {\n setupDocument(ctx, evt) {\n ctx.id = evt.id\n if (evt.doc) ctx.doc = ref(evt.doc)\n },\n setGlobalId(ctx) {\n store.setId(ctx.id)\n },\n clearGlobalId(ctx) {\n if (ctx.id === store.id) {\n store.setId(null)\n }\n },\n invokeOnOpen(ctx, evt) {\n const omit = [\"TOOLTIP_POINTER_ENTER\", \"POINTER_ENTER\"]\n if (!omit.includes(evt.type)) {\n ctx.onOpen?.()\n }\n },\n invokeOnClose(ctx, evt) {\n const omit = [\"SETUP\"]\n if (!omit.includes(evt.type)) {\n ctx.onClose?.()\n }\n },\n },\n guards: {\n closeOnPointerDown: (ctx) => ctx.closeOnPointerDown,\n noVisibleTooltip: () => store.id === null,\n isVisible: (ctx) => ctx.id === store.id,\n isInteractive: (ctx) => ctx.interactive,\n },\n delays: {\n OPEN_DELAY: (ctx) => ctx.openDelay,\n CLOSE_DELAY: (ctx) => ctx.closeDelay,\n },\n },\n)\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }