@zag-js/popover 0.1.3 → 0.1.4
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 +14 -7
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +14 -7
- package/dist/index.mjs.map +2 -2
- package/dist/popover.connect.d.ts.map +1 -1
- package/dist/popover.dom.d.ts +1 -0
- package/dist/popover.dom.d.ts.map +1 -1
- package/dist/popover.machine.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../node_modules/compute-scroll-into-view/src/index.ts", "../../../utilities/dom/node_modules/scroll-into-view-if-needed/es/index.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", "../../../utilities/dom/src/body-scroll-lock.ts", "../../../utilities/dom/src/query.ts", "../../../utilities/dom/src/scrollable.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/visual-viewport.ts", "../../../utilities/dom/src/wait.ts", "../../../utilities/dom/src/typeahead.ts", "../src/popover.connect.ts", "../../../types/src/prop-types.ts", "../../../types/src/controls.ts", "../../../utilities/core/src/array.ts", "../../../utilities/core/src/functions.ts", "../../../utilities/core/src/guard.ts", "../../../utilities/core/src/warning.ts", "../src/popover.dom.ts", "../src/popover.machine.ts"],
|
|
4
|
-
"sourcesContent": ["// 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;", "type Booleanish = boolean | \"true\" | \"false\"\n\nexport const dataAttr = (guard: boolean | undefined) => {\n return (guard ? \"\" : undefined) as Booleanish\n}\n\nexport const ariaAttr = (guard: boolean | undefined) => {\n return guard ? true : undefined\n}\n\nexport const matchAttr = (el: Element) => {\n return {\n get: (key: string) => el.getAttribute(key),\n set: (key: string, value: string) => el.setAttribute(key, value),\n is: (key: string, value: string) => {\n return el.getAttribute(key) === value\n },\n }\n}\n", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nfunction getStyleCache(): WeakMap<HTMLElement, Styles> {\n ;(globalThis as any).__styleCache__ = (globalThis as any).__styleCache__ || new WeakMap()\n return (globalThis as any).__styleCache__\n}\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n const cache = getStyleCache()\n let style: Styles | undefined = cache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n cache.set(el, style)\n }\n return style\n}\n\nexport function copyVisualStyles(fromEl: HTMLElement | null, toEl: HTMLElement) {\n if (!fromEl) return\n const el = getComputedStyle(fromEl)\n // prettier-ignore\n const cssText = 'box-sizing:' + el.boxSizing +\n ';border-left:' + el.borderLeftWidth + ' solid red' +\n ';border-right:' + el.borderRightWidth + ' solid red' +\n ';font-family:' + el.fontFamily +\n ';font-feature-settings:' + el.fontFeatureSettings +\n ';font-kerning:' + el.fontKerning +\n ';font-size:' + el.fontSize +\n ';font-stretch:' + el.fontStretch +\n ';font-style:' + el.fontStyle +\n ';font-variant:' + el.fontVariant +\n ';font-variant-caps:' + el.fontVariantCaps +\n ';font-variant-ligatures:' + el.fontVariantLigatures +\n ';font-variant-numeric:' + el.fontVariantNumeric +\n ';font-weight:' + el.fontWeight +\n ';letter-spacing:' + el.letterSpacing +\n ';margin-left:' + el.marginLeft +\n ';margin-right:' + el.marginRight +\n ';padding-left:' + el.paddingLeft +\n ';padding-right:' + el.paddingRight +\n ';text-indent:' + el.textIndent +\n ';text-transform:' + el.textTransform\n\n toEl.style.cssText += cssText\n}\n", "export function nextTick(fn: VoidFunction) {\n const set = new Set<VoidFunction>()\n function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n set.add(() => globalThis.cancelAnimationFrame(id))\n }\n raf(() => raf(fn))\n return function cleanup() {\n set.forEach(function (fn) {\n fn()\n })\n }\n}\n\nexport function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n return function cleanup() {\n globalThis.cancelAnimationFrame(id)\n }\n}\n\nexport function 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: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\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\nfunction getListenerElements(): Map<El, Group> {\n ;(globalThis as any).__listenerElements__ = (globalThis as any).__listenerElements__ || new Map()\n return (globalThis as any).__listenerElements__\n}\n\nfunction getListenerCache(): Map<El, Map<string, Handler>> {\n ;(globalThis as any).__listenerCache__ = (globalThis as any).__listenerCache__ || new Map()\n return (globalThis as any).__listenerCache__\n}\n\n/**\n * The global event bus for managing event listeners attached to DOM elements.\n *\n * It's goal is to ensure that only one listener is attached to a DOM element for a given event,\n * regardless of the number of times `addEventListener` is called.\n */\n\nexport function 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 const listenerElements = getListenerElements()\n const listenerCache = getListenerCache()\n\n const group = listenerElements.get(node)\n\n if (!listenerElements.has(node)) {\n // create group of listeners per hash\n const group: Group = new Map([[hash, new Set([handler])]])\n listenerElements.set(node, group)\n } else if (group?.has(hash)) {\n group?.get(hash)?.add(handler)\n } else {\n group?.set(hash, new Set([handler]))\n }\n\n // add the event listener to the node or register it in the cache\n function attach(node: El) {\n // Publish pattern\n function listener(event: Event) {\n const group = listenerElements.get(node)\n group?.get(hash)?.forEach((fn) => fn(event))\n }\n\n if (!listenerCache?.has(node)) {\n listenerCache.set(node, new Map([[hash, listener]]))\n node.addEventListener(type, listener, options)\n return\n }\n\n if (!listenerCache?.get(node)?.has(hash)) {\n listenerCache.get(node)?.set(hash, listener)\n node.addEventListener(type, listener, options)\n }\n }\n\n attach(node)\n\n return function remove() {\n if (!listenerElements.has(node)) return\n\n const group = listenerElements.get(node)\n group?.get(hash)?.delete(handler)\n\n if (group?.get(hash)?.size === 0) {\n const listener = listenerCache.get(node)?.get(hash)!\n node.removeEventListener(type, listener, options)\n group?.delete(hash)\n listenerCache.get(node)?.delete(hash)\n\n if (group?.size === 0) {\n listenerElements.delete(node)\n listenerCache.delete(node)\n }\n }\n }\n}\n", "import { 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", "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 if (docEl.hasAttribute(\"scroll-lock\")) return\n\n const fn = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n () => docEl.setAttribute(\"scroll-lock\", \"true\"),\n )\n\n return pipe(fn, () => docEl.removeAttribute(\"scroll-lock\"))\n }\n\n function preventScrollMobileSafari() {\n if (docEl.hasAttribute(\"scroll-lock\")) return\n\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 () => docEl.setAttribute(\"scroll-lock\", \"true\"),\n )\n\n return () => {\n restoreStyles()\n removeEvents()\n win.scrollTo(scrollX, scrollY)\n docEl.removeAttribute(\"scroll-lock\")\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 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\nexport function isElementEditable(el: HTMLElement | null) {\n if (el == null) return false\n const selectors = [\n \"input:not([readonly])\",\n \"textarea:not([readonly])\",\n \"[contenteditable]\",\n \"select:not([readonly])\",\n ].join(\", \")\n return el.matches(selectors) || el.isContentEditable\n}\n", "import { 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", "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 document?: 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\", document: doc = document, root, delay: _delay = 0 } = opts\n\n const win = doc.defaultView ?? window\n const parent = root ?? doc.body\n\n function announce(message: string, delay?: number) {\n const oldRegion = doc.getElementById(\"__live-region__\")\n\n // remove old region\n oldRegion?.remove()\n\n // Did an override level get set?\n delay = delay ?? _delay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = \"__live-region__\"\n region.dataset.liveAnnouncer = \"true\"\n\n // Determine redundant role\n const role = level !== \"assertive\" ? \"status\" : \"alert\"\n\n // add role and attributes\n region.setAttribute(\"aria-live\", level)\n region.setAttribute(\"role\", role)\n\n // hide live region\n setVisuallyHidden(region)\n\n parent.appendChild(region)\n\n // populate region to trigger it\n win.setTimeout(() => {\n region.textContent = message\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(\"__live-region__\")\n oldRegion?.remove()\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) {\n if (!node) return noop\n const win = node.ownerDocument.defaultView || window\n const obs = new win.MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type === \"childList\") {\n fn(change)\n }\n }\n })\n\n obs.observe(node, { childList: true, subtree: true })\n\n return () => obs.disconnect()\n}\n", "type Root = Document | Element | null | undefined\n\nexport function queryAll<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return Array.from(root?.querySelectorAll<T>(selector) ?? [])\n}\n\nexport function query<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return root?.querySelector<T>(selector)\n}\n\nexport function itemById<T extends HTMLElement>(v: T[], id: string) {\n return v.find((node) => node.id === id)\n}\n\nexport function indexOfId<T extends HTMLElement>(v: T[], id: string) {\n const item = itemById(v, id)\n return item ? v.indexOf(item) : -1\n}\n\nexport function nextById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n idx = loop ? (idx + 1) % v.length : Math.min(idx + 1, v.length - 1)\n return v[idx]\n}\n\nexport function prevById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n if (idx === -1) return loop ? v[v.length - 1] : null\n idx = loop ? (idx - 1 + v.length) % v.length : Math.max(0, idx - 1)\n return v[idx]\n}\n\nconst getValueText = <T extends HTMLElement>(item: T) => item.dataset.valuetext ?? item.textContent ?? \"\"\n\nconst match = (valueText: string, query: string) => valueText.toLowerCase().startsWith(query.toLowerCase())\n\nconst wrap = <T>(v: T[], idx: number) => {\n return v.map((_, index) => v[(Math.max(idx, 0) + index) % v.length])\n}\n\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const index = currentId ? indexOfId(v, currentId) : -1\n let items = currentId ? wrap(v, index) : v\n\n const isSingleKey = text.length === 1\n\n if (isSingleKey) {\n items = items.filter((item) => item.id !== currentId)\n }\n\n return items.find((item) => match(getValueText(item), text))\n}\n\nexport function sortByTreeOrder<T extends HTMLElement>(v: T[]) {\n return v.sort((a, b) => (a.compareDocumentPosition(b) & 2 ? 1 : -1))\n}\n", "// Credits: https://github.com/adobe/react-spectrum/blob/e81cfec20056338c7987c513826dc45df32f3db4/packages/%40react-aria/interactions/src/textSelection.ts\nimport { isIos } from \"@zag-js/utils\"\nimport { nextTick } from \"./next-tick\"\n\ntype State = \"default\" | \"disabled\" | \"restoring\"\n\nlet state: State = \"default\"\nlet savedUserSelect = \"\"\nlet modifiedElementMap = new WeakMap<HTMLElement, string>()\n\nexport function disableTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state === \"default\") {\n savedUserSelect = _document.documentElement.style.webkitUserSelect\n _document.documentElement.style.webkitUserSelect = \"none\"\n }\n\n state = \"disabled\"\n } else if (target) {\n modifiedElementMap.set(target, target.style.userSelect)\n target.style.userSelect = \"none\"\n }\n\n return () => restoreTextSelection({ target, doc: _document })\n}\n\nexport function restoreTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state !== \"disabled\") return\n state = \"restoring\"\n\n setTimeout(() => {\n nextTick(() => {\n if (state === \"restoring\") {\n if (_document.documentElement.style.webkitUserSelect === \"none\") {\n _document.documentElement.style.webkitUserSelect = savedUserSelect || \"\"\n }\n\n savedUserSelect = \"\"\n state = \"default\"\n }\n })\n }, 300)\n } else {\n if (target && modifiedElementMap.has(target)) {\n let targetOldUserSelect = modifiedElementMap.get(target)\n\n if (target.style.userSelect === \"none\") {\n target.style.userSelect = targetOldUserSelect ?? \"\"\n }\n\n if (target.getAttribute(\"style\") === \"\") {\n target.removeAttribute(\"style\")\n }\n modifiedElementMap.delete(target)\n }\n }\n}\n", "import { isLeftClick, isMouseEvent, pipe } from \"@zag-js/utils\"\nimport { addDomEvent, addPointerEvent } from \"./listener\"\nimport type { AnyPointerEvent, EventListenerWithPointInfo as Listener, PointerEventInfo } from \"./listener.types\"\nimport { disableTextSelection } from \"./text-selection\"\n\nexport function trackPointerDown(doc: Document, onPointerDown: (el: HTMLElement) => void) {\n const win = doc.defaultView ?? window\n const fn = (event: PointerEvent) => {\n if (event.target instanceof win.HTMLElement) {\n onPointerDown(event.target)\n }\n }\n return addDomEvent(doc, \"pointerdown\", fn)\n}\n\ntype TrackPointerMoveOptions = {\n ctx: { doc?: Document; threshold?: number }\n onPointerUp: VoidFunction\n onPointerMove: (info: PointerEventInfo, event: AnyPointerEvent) => void\n}\n\nexport function trackPointerMove(opts: TrackPointerMoveOptions) {\n const { onPointerMove, onPointerUp, ctx } = opts\n const { doc = document, threshold = 5 } = ctx\n\n const handlePointerMove: Listener = (event, info) => {\n const { point: p } = info\n const distance = Math.sqrt(p.x ** 2 + p.y ** 2)\n if (distance < threshold) return\n\n // Because Safari doesn't trigger mouseup events when it's above a `<select>`\n if (isMouseEvent(event) && isLeftClick(event)) {\n onPointerUp()\n return\n }\n\n onPointerMove(info, event)\n }\n\n return pipe(\n addPointerEvent(doc, \"pointermove\", handlePointerMove, false),\n addPointerEvent(doc, \"pointerup\", onPointerUp, false),\n addPointerEvent(doc, \"pointercancel\", onPointerUp, false),\n addPointerEvent(doc, \"contextmenu\", onPointerUp, false),\n disableTextSelection({ doc }),\n )\n}\n", "import { pipe } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\ntype PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n return addDomEvent(doc, \"pointerlockchange\", fn, false)\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n const supported = \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc\n const locked = !!doc.pointerLockElement\n\n function onPointerChange() {\n if (locked) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n if (locked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock()\n }\n\n if (!supported) return\n\n body.requestPointerLock()\n\n const cleanup = pipe(\n addPointerlockChangeListener(doc, onPointerChange),\n addPointerlockErrorListener(doc, onPointerError),\n )\n\n return function dispose() {\n if (!supported) return\n cleanup()\n exit()\n }\n}\n", "// Credit goes to the radix-ui team for this utility:\n// https://github.com/radix-ui/primitives/blob/main/packages/core/rect/src/observeElementRect.ts\n\ntype Fn = (rect: DOMRect) => void\ntype ObservedData = { rect: DOMRect; callbacks: Fn[] }\nexport type Measurable = { getBoundingClientRect(): DOMRect }\n\nfunction getObservedElements(): Map<Measurable, ObservedData> {\n ;(globalThis as any).__rectObserverMap__ = (globalThis as any).__rectObserverMap__ || new Map()\n return (globalThis as any).__rectObserverMap__\n}\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\n const observedElements = getObservedElements()\n\n const data = observedElements.get(el)\n\n if (!data) {\n observedElements.set(el, { rect: {} as DOMRect, callbacks: [fn] })\n\n if (observedElements.size === 1) {\n rafId = requestAnimationFrame(runLoop)\n }\n } else {\n data.callbacks.push(fn)\n fn(el.getBoundingClientRect())\n }\n\n return function unobserve() {\n const data = observedElements.get(el)\n if (!data) return\n\n const index = data.callbacks.indexOf(fn)\n if (index > -1) {\n data.callbacks.splice(index, 1)\n }\n\n if (data.callbacks.length === 0) {\n observedElements.delete(el)\n\n if (observedElements.size === 0) {\n cancelAnimationFrame(rafId)\n }\n }\n }\n}\n\nlet rafId: number\n\nfunction runLoop() {\n const observedElements = getObservedElements()\n\n const changedRectsData: Array<ObservedData> = []\n\n observedElements.forEach((data, element) => {\n const newRect = element.getBoundingClientRect()\n\n if (!isEqual(data.rect, newRect)) {\n data.rect = newRect\n changedRectsData.push(data)\n }\n })\n\n changedRectsData.forEach((data) => {\n data.callbacks.forEach((callback) => callback(data.rect))\n })\n\n rafId = requestAnimationFrame(runLoop)\n}\n\nfunction isEqual(rect1: DOMRect, rect2: DOMRect) {\n return (\n rect1.width === rect2.width &&\n rect1.height === rect2.height &&\n rect1.top === rect2.top &&\n rect1.right === rect2.right &&\n rect1.bottom === rect2.bottom &&\n rect1.left === rect2.left\n )\n}\n", "import { cast } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\nexport function trackDocumentVisibility(_doc: Document, callback: (hidden: boolean) => void) {\n const doc = cast(_doc) as Document & { msHidden?: boolean; webkitHidden?: boolean }\n return addDomEvent(doc, \"visibilitychange\", () => {\n const hidden = doc.hidden || doc.msHidden || doc.webkitHidden\n callback(!!hidden)\n })\n}\n", "import { addDomEvent } from \"./listener\"\n\ntype ViewportSize = {\n width: number\n height: number\n}\n\ntype Options = {\n document?: Document\n resolve?(data: ViewportSize): void\n}\n\nexport function trackVisualViewport(options: Options) {\n const { document: doc, resolve } = options\n const win = doc?.defaultView || window\n resolve?.(getViewportSize(win))\n const onResize = () => resolve?.(getViewportSize(win))\n return addDomEvent(win.visualViewport ?? win, \"resize\", onResize)\n}\n\nfunction getViewportSize(win: Window): ViewportSize {\n return {\n width: win.visualViewport?.width || win.innerWidth,\n height: win.visualViewport?.height || win.innerHeight,\n }\n}\n", "export function waitFor<T>(predicate: () => T): Promise<T> {\n let value = predicate()\n if (!!value) return Promise.resolve(value)\n return new Promise((resolve) => {\n const id = globalThis.setInterval(function () {\n let value = predicate()\n if (value) {\n globalThis.clearInterval(id)\n resolve(value)\n }\n }, 0)\n })\n}\n\nexport function waitForEvent(el: HTMLElement, eventName: string) {\n return new Promise<void>((resolve) => {\n function done(event: Event) {\n if (event.target === el) {\n el.removeEventListener(eventName, done)\n resolve()\n }\n }\n\n el.addEventListener(eventName, done)\n })\n}\n", "import { findByText } from \"./nodelist\"\n\nexport type TypeaheadState = {\n keysSoFar: string\n timer: number\n}\n\nexport type TypeaheadOptions = {\n state: TypeaheadState\n activeId: string | null\n key: string\n timeout?: number\n}\n\nexport function findByTypeahead<T extends HTMLElement>(_items: T[], options: TypeaheadOptions) {\n const { state, activeId, key, timeout = 350 } = options\n\n const search = state.keysSoFar + key\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0])\n\n const query = isRepeated ? search[0] : search\n\n let items = _items.slice()\n\n const next = findByText(items, query, activeId)\n\n function cleanup() {\n clearTimeout(state.timer)\n state.timer = -1\n }\n\n function update(value: string) {\n state.keysSoFar = value\n cleanup()\n\n if (value !== \"\") {\n state.timer = +setTimeout(() => {\n update(\"\")\n cleanup()\n }, timeout)\n }\n }\n\n update(search)\n\n return next\n}\n\nfindByTypeahead.defaultOptions = {\n keysSoFar: \"\",\n timer: -1,\n}\n", "import { dataAttr, EventKeyMap, isFocusable, validateBlur } from \"@zag-js/dom-utils\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport { normalizeProp, PropTypes, ReactPropTypes } from \"@zag-js/types\"\nimport { dom } from \"./popover.dom\"\nimport type { Send, State } from \"./popover.types\"\n\nexport function connect<T extends PropTypes = ReactPropTypes>(state: State, send: Send, normalize = normalizeProp) {\n const isOpen = state.matches(\"open\")\n const pointerdownNode = state.context.pointerdownNode\n const popperStyles = getPlacementStyles({\n measured: !!state.context.isPlacementComplete,\n })\n\n return {\n portalled: state.context.currentPortalled,\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\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 anchorProps: normalize.element<T>({\n \"data-part\": \"anchor\",\n id: dom.getAnchorId(state.context),\n }),\n\n triggerProps: normalize.button<T>({\n \"data-part\": \"trigger\",\n type: \"button\",\n \"data-placement\": state.context.currentPlacement,\n id: dom.getTriggerId(state.context),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"data-expanded\": dataAttr(isOpen),\n \"aria-controls\": dom.getContentId(state.context),\n onClick() {\n send(\"TRIGGER_CLICK\")\n },\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 id: dom.getContentId(state.context),\n tabIndex: -1,\n role: \"dialog\",\n hidden: !isOpen,\n \"aria-labelledby\": state.context.isTitleRendered ? dom.getTitleId(state.context) : undefined,\n \"aria-describedby\": state.context.isDescriptionRendered ? dom.getDescriptionId(state.context) : undefined,\n \"data-placement\": state.context.currentPlacement,\n onKeyDown(event) {\n const keyMap: EventKeyMap = {\n Escape(event) {\n send(\"ESCAPE\")\n event.stopPropagation()\n },\n Tab(event) {\n const type = event.shiftKey ? \"SHIFT_TAB\" : \"TAB\"\n send({ type, preventDefault: () => event.preventDefault() })\n },\n }\n\n const exec = keyMap[event.key]\n exec?.(event)\n },\n onBlur(event) {\n const isValidBlur = validateBlur(event, {\n exclude: [dom.getTriggerEl(state.context), dom.getContentEl(state.context)],\n fallback: pointerdownNode,\n })\n\n if (isValidBlur) {\n const el = (event.relatedTarget ?? pointerdownNode) as HTMLElement\n send({ type: \"INTERACT_OUTSIDE\", focusable: isFocusable(el) })\n }\n },\n }),\n\n titleProps: normalize.element<T>({\n \"data-part\": \"title\",\n id: dom.getTitleId(state.context),\n }),\n\n descriptionProps: normalize.element<T>({\n \"data-part\": \"description\",\n id: dom.getDescriptionId(state.context),\n }),\n\n closeButtonProps: normalize.button<T>({\n \"data-part\": \"close-button\",\n id: dom.getCloseButtonId(state.context),\n type: \"button\",\n \"aria-label\": \"close\",\n onClick() {\n send(\"CLOSE\")\n },\n }),\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", "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: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\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 { getFocusables, getTabbables } from \"@zag-js/dom-utils\"\nimport { cast, first, last, runIfFn } from \"@zag-js/utils\"\nimport { MachineContext as Ctx } from \"./popover.types\"\n\nexport const dom = {\n getDoc: (ctx: Ctx) => ctx.doc ?? document,\n getActiveEl: (ctx: Ctx) => dom.getDoc(ctx).activeElement,\n\n getAnchorId: (ctx: Ctx) => ctx.ids?.anchor ?? `popover:${ctx.uid}:anchor`,\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `popover:${ctx.uid}:trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `popover:${ctx.uid}:content`,\n getPositionerId: (ctx: Ctx) => `popover:${ctx.uid}:popper`,\n getArrowId: (ctx: Ctx) => `popover:${ctx.uid}:arrow`,\n getTitleId: (ctx: Ctx) => ctx.ids?.title ?? `popover:${ctx.uid}:title`,\n getDescriptionId: (ctx: Ctx) => ctx.ids?.description ?? `popover:${ctx.uid}:desc`,\n getCloseButtonId: (ctx: Ctx) => ctx.ids?.closeBtn ?? `popover:${ctx.uid}:close-button`,\n\n getAnchorEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getAnchorId(ctx)),\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 getTitleEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getTitleId(ctx)),\n getDescriptionEl: (ctx: Ctx) => dom.getDoc(ctx).getElementById(dom.getDescriptionId(ctx)),\n\n getFocusableEls: (ctx: Ctx) => getFocusables(dom.getContentEl(ctx)),\n getFirstFocusableEl: (ctx: Ctx) => dom.getFocusableEls(ctx)[0],\n\n getDocTabbableEls: (ctx: Ctx) => getTabbables(cast(dom.getDoc(ctx))),\n getTabbableEls: (ctx: Ctx) => {\n const el = dom.getContentEl(ctx)\n return el ? getTabbables(el) : []\n },\n getFirstTabbableEl: (ctx: Ctx) => first(dom.getTabbableEls(ctx)),\n getLastTabbableEl: (ctx: Ctx) => last(dom.getTabbableEls(ctx)),\n getInitialFocusEl: (ctx: Ctx) => runIfFn(ctx.initialFocusEl) ?? dom.getFirstFocusableEl(ctx),\n}\n", "import { choose, createMachine, guards, ref } from \"@zag-js/core\"\nimport {\n contains,\n nextTick,\n preventBodyPointerEvents,\n preventBodyScroll,\n raf,\n trackPointerDown,\n} from \"@zag-js/dom-utils\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { next, runIfFn } from \"@zag-js/utils\"\nimport { ariaHidden } from \"@zag-js/aria-hidden\"\nimport { createFocusTrap, FocusTrap } from \"focus-trap\"\nimport { dom } from \"./popover.dom\"\nimport { MachineContext, MachineState, UserDefinedContext } from \"./popover.types\"\n\nconst { and, or } = guards\n\nexport function machine(ctx: UserDefinedContext = {}) {\n return createMachine<MachineContext, MachineState>(\n {\n id: \"popover\",\n initial: \"unknown\",\n context: {\n isTitleRendered: true,\n isDescriptionRendered: true,\n isAnchorRendered: false,\n uid: \"\",\n closeOnBlur: true,\n closeOnEsc: true,\n autoFocus: true,\n modal: false,\n positioning: {\n placement: \"bottom\",\n ...ctx.positioning,\n },\n currentPlacement: undefined,\n ...ctx,\n },\n\n computed: {\n currentPortalled: (ctx) => !!ctx.modal || !!ctx.portalled,\n },\n\n states: {\n unknown: {\n on: {\n SETUP: {\n target: \"closed\",\n actions: [\"setupDocument\", \"checkRenderedElements\"],\n },\n },\n },\n\n closed: {\n entry: [\"clearPointerDown\", \"invokeOnClose\"],\n on: {\n TRIGGER_CLICK: \"open\",\n OPEN: \"open\",\n },\n },\n\n open: {\n activities: [\n \"trackPointerDown\",\n \"trapFocus\",\n \"preventScroll\",\n \"hideContentBelow\",\n \"disableOutsidePointerEvents\",\n \"computePlacement\",\n ],\n entry: choose([\n {\n guard: \"autoFocus\",\n actions: [\"setInitialFocus\", \"invokeOnOpen\"],\n },\n { actions: [\"focusContent\", \"invokeOnOpen\"] },\n ]),\n on: {\n CLOSE: {\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n TRIGGER_CLICK: {\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n ESCAPE: {\n guard: \"closeOnEsc\",\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n TAB: {\n guard: and(\"isLastTabbableElement\", \"closeOnBlur\", \"portalled\"),\n target: \"closed\",\n actions: \"focusNextTabbableElementAfterTrigger\",\n },\n SHIFT_TAB: {\n guard: and(or(\"isFirstTabbableElement\", \"isContentFocused\"), \"closeOnBlur\", \"portalled\"),\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n INTERACT_OUTSIDE: [\n {\n guard: and(\"closeOnBlur\", \"isRelatedTargetFocusable\"),\n target: \"closed\",\n },\n {\n guard: \"closeOnBlur\",\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n ],\n },\n },\n },\n },\n {\n activities: {\n computePlacement(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n const anchorEl = ctx.isAnchorRendered ? dom.getAnchorEl(ctx) : dom.getTriggerEl(ctx)\n return getPlacement(anchorEl, 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 trackPointerDown(ctx) {\n return trackPointerDown(dom.getDoc(ctx), (el) => {\n ctx.pointerdownNode = ref(el)\n })\n },\n disableOutsidePointerEvents(ctx) {\n const el = dom.getContentEl(ctx)\n return preventBodyPointerEvents(el, {\n document: dom.getDoc(ctx),\n disabled: !ctx.modal,\n })\n },\n hideContentBelow(ctx) {\n if (!ctx.modal) return\n let unhide: VoidFunction | undefined\n nextTick(() => {\n unhide = ariaHidden([dom.getContentEl(ctx), dom.getTriggerEl(ctx)])\n })\n return () => unhide?.()\n },\n preventScroll(ctx) {\n return preventBodyScroll({\n allowPinchZoom: true,\n disabled: !ctx.modal,\n document: dom.getDoc(ctx),\n })\n },\n trapFocus(ctx) {\n if (!ctx.modal) return\n let trap: FocusTrap\n nextTick(() => {\n const el = dom.getContentEl(ctx)\n if (!el) return\n trap = createFocusTrap(el, {\n escapeDeactivates: false,\n allowOutsideClick: true,\n returnFocusOnDeactivate: true,\n document: dom.getDoc(ctx),\n fallbackFocus: el,\n initialFocus: runIfFn(ctx.initialFocusEl),\n })\n try {\n trap.activate()\n } catch {}\n })\n return () => trap?.deactivate()\n },\n },\n guards: {\n closeOnEsc: (ctx) => !!ctx.closeOnEsc,\n autoFocus: (ctx) => !!ctx.autoFocus,\n modal: (ctx) => !!ctx.modal,\n portalled: (ctx) => !!ctx.portalled,\n isRelatedTargetFocusable: (_ctx, evt) => evt.focusable,\n closeOnBlur: (ctx) => !!ctx.closeOnBlur,\n isContentFocused: (ctx) => dom.getContentEl(ctx) === dom.getActiveEl(ctx),\n isFirstTabbableElement: (ctx) => dom.getFirstTabbableEl(ctx) === dom.getActiveEl(ctx),\n isLastTabbableElement: (ctx) => dom.getLastTabbableEl(ctx) === dom.getActiveEl(ctx),\n },\n actions: {\n checkRenderedElements(ctx) {\n raf(() => {\n ctx.isAnchorRendered = !!dom.getAnchorEl(ctx)\n ctx.isTitleRendered = !!dom.getTitleEl(ctx)\n ctx.isDescriptionRendered = !!dom.getDescriptionEl(ctx)\n })\n },\n setupDocument(ctx, evt) {\n if (evt.doc) ctx.doc = ref(evt.doc)\n ctx.uid = evt.id\n },\n clearPointerDown(ctx) {\n ctx.pointerdownNode = null\n },\n focusContent(ctx) {\n raf(() => {\n dom.getContentEl(ctx)?.focus()\n })\n },\n setInitialFocus(ctx) {\n raf(() => {\n dom.getInitialFocusEl(ctx)?.focus()\n })\n },\n focusTrigger(ctx) {\n raf(() => {\n dom.getTriggerEl(ctx)?.focus()\n })\n },\n invokeOnOpen(ctx, evt) {\n if (evt.type !== \"SETUP\") {\n ctx.onOpen?.()\n }\n },\n invokeOnClose(ctx, evt) {\n if (evt.type !== \"SETUP\") {\n ctx.onClose?.()\n }\n },\n focusNextTabbableElementAfterTrigger(ctx, evt) {\n const content = dom.getContentEl(ctx)\n const doc = dom.getDoc(ctx)\n const button = dom.getTriggerEl(ctx)\n if (!content || !button) return\n\n const lastTabbable = dom.getLastTabbableEl(ctx)\n if (lastTabbable !== doc.activeElement) return\n\n let tabbables = dom.getDocTabbableEls(ctx)\n let elementAfterTrigger = next(tabbables, tabbables.indexOf(button), { loop: false })\n\n // content is just after button (in dom order) ???\n if (elementAfterTrigger === content) {\n tabbables = tabbables.filter((el) => !contains(content, el))\n elementAfterTrigger = next(tabbables, tabbables.indexOf(button), { loop: false })\n }\n\n // if there's no next element, let the browser handle it\n if (!elementAfterTrigger || elementAfterTrigger === button) return\n\n // else focus the next element\n evt.preventDefault()\n raf(() => elementAfterTrigger?.focus())\n },\n },\n },\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// 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;", "type Booleanish = boolean | \"true\" | \"false\"\n\nexport const dataAttr = (guard: boolean | undefined) => {\n return (guard ? \"\" : undefined) as Booleanish\n}\n\nexport const ariaAttr = (guard: boolean | undefined) => {\n return guard ? \"true\" : undefined\n}\n\nexport const matchAttr = (el: Element) => {\n return {\n get: (key: string) => el.getAttribute(key),\n set: (key: string, value: string) => el.setAttribute(key, value),\n is: (key: string, value: string) => {\n return el.getAttribute(key) === value\n },\n }\n}\n", "type Key = keyof CSSStyleDeclaration | (string & {})\ntype Styles = Record<Key, any>\ntype El = HTMLElement | null | undefined\n\nfunction getStyleCache(): WeakMap<HTMLElement, Styles> {\n ;(globalThis as any).__styleCache__ = (globalThis as any).__styleCache__ || new WeakMap()\n return (globalThis as any).__styleCache__\n}\n\nexport function getComputedStyle(el: El): Styles {\n if (!el) return {} as Styles\n const cache = getStyleCache()\n let style: Styles | undefined = cache.get(el)\n if (!style) {\n const win = el?.ownerDocument.defaultView ?? window\n style = win.getComputedStyle(el) as Styles\n cache.set(el, style)\n }\n return style\n}\n\nexport function copyVisualStyles(fromEl: HTMLElement | null, toEl: HTMLElement) {\n if (!fromEl) return\n const el = getComputedStyle(fromEl)\n // prettier-ignore\n const cssText = 'box-sizing:' + el.boxSizing +\n ';border-left:' + el.borderLeftWidth + ' solid red' +\n ';border-right:' + el.borderRightWidth + ' solid red' +\n ';font-family:' + el.fontFamily +\n ';font-feature-settings:' + el.fontFeatureSettings +\n ';font-kerning:' + el.fontKerning +\n ';font-size:' + el.fontSize +\n ';font-stretch:' + el.fontStretch +\n ';font-style:' + el.fontStyle +\n ';font-variant:' + el.fontVariant +\n ';font-variant-caps:' + el.fontVariantCaps +\n ';font-variant-ligatures:' + el.fontVariantLigatures +\n ';font-variant-numeric:' + el.fontVariantNumeric +\n ';font-weight:' + el.fontWeight +\n ';letter-spacing:' + el.letterSpacing +\n ';margin-left:' + el.marginLeft +\n ';margin-right:' + el.marginRight +\n ';padding-left:' + el.paddingLeft +\n ';padding-right:' + el.paddingRight +\n ';text-indent:' + el.textIndent +\n ';text-transform:' + el.textTransform\n\n toEl.style.cssText += cssText\n}\n", "export function nextTick(fn: VoidFunction) {\n const set = new Set<VoidFunction>()\n function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n set.add(() => globalThis.cancelAnimationFrame(id))\n }\n raf(() => raf(fn))\n return function cleanup() {\n set.forEach(function (fn) {\n fn()\n })\n }\n}\n\nexport function raf(fn: VoidFunction) {\n const id = globalThis.requestAnimationFrame(fn)\n return function cleanup() {\n globalThis.cancelAnimationFrame(id)\n }\n}\n\nexport function 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: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\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\nfunction getListenerElements(): Map<El, Group> {\n ;(globalThis as any).__listenerElements__ = (globalThis as any).__listenerElements__ || new Map()\n return (globalThis as any).__listenerElements__\n}\n\nfunction getListenerCache(): Map<El, Map<string, Handler>> {\n ;(globalThis as any).__listenerCache__ = (globalThis as any).__listenerCache__ || new Map()\n return (globalThis as any).__listenerCache__\n}\n\n/**\n * The global event bus for managing event listeners attached to DOM elements.\n *\n * It's goal is to ensure that only one listener is attached to a DOM element for a given event,\n * regardless of the number of times `addEventListener` is called.\n */\n\nexport function 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 const listenerElements = getListenerElements()\n const listenerCache = getListenerCache()\n\n const group = listenerElements.get(node)\n\n if (!listenerElements.has(node)) {\n // create group of listeners per hash\n const group: Group = new Map([[hash, new Set([handler])]])\n listenerElements.set(node, group)\n } else if (group?.has(hash)) {\n group?.get(hash)?.add(handler)\n } else {\n group?.set(hash, new Set([handler]))\n }\n\n // add the event listener to the node or register it in the cache\n function attach(node: El) {\n // Publish pattern\n function listener(event: Event) {\n const group = listenerElements.get(node)\n group?.get(hash)?.forEach((fn) => fn(event))\n }\n\n if (!listenerCache?.has(node)) {\n listenerCache.set(node, new Map([[hash, listener]]))\n node.addEventListener(type, listener, options)\n return\n }\n\n if (!listenerCache?.get(node)?.has(hash)) {\n listenerCache.get(node)?.set(hash, listener)\n node.addEventListener(type, listener, options)\n }\n }\n\n attach(node)\n\n return function remove() {\n if (!listenerElements.has(node)) return\n\n const group = listenerElements.get(node)\n group?.get(hash)?.delete(handler)\n\n if (group?.get(hash)?.size === 0) {\n const listener = listenerCache.get(node)?.get(hash)!\n node.removeEventListener(type, listener, options)\n group?.delete(hash)\n listenerCache.get(node)?.delete(hash)\n\n if (group?.size === 0) {\n listenerElements.delete(node)\n listenerCache.delete(node)\n }\n }\n }\n}\n", "import { 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", "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 if (docEl.hasAttribute(\"scroll-lock\")) return\n\n const fn = pipe(\n setStyle(docEl, \"paddingRight\", `${win.innerWidth - docEl.clientWidth}px`),\n setStyle(docEl, \"overflow\", \"hidden\"),\n () => docEl.setAttribute(\"scroll-lock\", \"true\"),\n )\n\n return pipe(fn, () => docEl.removeAttribute(\"scroll-lock\"))\n }\n\n function preventScrollMobileSafari() {\n if (docEl.hasAttribute(\"scroll-lock\")) return\n\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 () => docEl.setAttribute(\"scroll-lock\", \"true\"),\n )\n\n return () => {\n restoreStyles()\n removeEvents()\n win.scrollTo(scrollX, scrollY)\n docEl.removeAttribute(\"scroll-lock\")\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 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\nexport function isElementEditable(el: HTMLElement | null) {\n if (el == null) return false\n const selectors = [\n \"input:not([readonly])\",\n \"textarea:not([readonly])\",\n \"[contenteditable]\",\n \"select:not([readonly])\",\n ].join(\", \")\n return el.matches(selectors) || el.isContentEditable\n}\n", "import { 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", "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 document?: 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\", document: doc = document, root, delay: _delay = 0 } = opts\n\n const win = doc.defaultView ?? window\n const parent = root ?? doc.body\n\n function announce(message: string, delay?: number) {\n const oldRegion = doc.getElementById(\"__live-region__\")\n\n // remove old region\n oldRegion?.remove()\n\n // Did an override level get set?\n delay = delay ?? _delay\n\n // create fresh region\n const region = doc.createElement(\"span\")\n region.id = \"__live-region__\"\n region.dataset.liveAnnouncer = \"true\"\n\n // Determine redundant role\n const role = level !== \"assertive\" ? \"status\" : \"alert\"\n\n // add role and attributes\n region.setAttribute(\"aria-live\", level)\n region.setAttribute(\"role\", role)\n\n // hide live region\n setVisuallyHidden(region)\n\n parent.appendChild(region)\n\n // populate region to trigger it\n win.setTimeout(() => {\n region.textContent = message\n }, delay)\n }\n\n function destroy() {\n const oldRegion = doc.getElementById(\"__live-region__\")\n oldRegion?.remove()\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) {\n if (!node) return noop\n const win = node.ownerDocument.defaultView || window\n const obs = new win.MutationObserver((changes) => {\n for (const change of changes) {\n if (change.type === \"childList\") {\n fn(change)\n }\n }\n })\n\n obs.observe(node, { childList: true, subtree: true })\n\n return () => obs.disconnect()\n}\n", "type Root = Document | Element | null | undefined\n\nexport function queryAll<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return Array.from(root?.querySelectorAll<T>(selector) ?? [])\n}\n\nexport function query<T extends HTMLElement = HTMLElement>(root: Root, selector: string) {\n return root?.querySelector<T>(selector)\n}\n\nexport function itemById<T extends HTMLElement>(v: T[], id: string) {\n return v.find((node) => node.id === id)\n}\n\nexport function indexOfId<T extends HTMLElement>(v: T[], id: string) {\n const item = itemById(v, id)\n return item ? v.indexOf(item) : -1\n}\n\nexport function nextById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n idx = loop ? (idx + 1) % v.length : Math.min(idx + 1, v.length - 1)\n return v[idx]\n}\n\nexport function prevById<T extends HTMLElement>(v: T[], id: string, loop = true) {\n let idx = indexOfId(v, id)\n if (idx === -1) return loop ? v[v.length - 1] : null\n idx = loop ? (idx - 1 + v.length) % v.length : Math.max(0, idx - 1)\n return v[idx]\n}\n\nconst getValueText = <T extends HTMLElement>(item: T) => item.dataset.valuetext ?? item.textContent ?? \"\"\n\nconst match = (valueText: string, query: string) => valueText.toLowerCase().startsWith(query.toLowerCase())\n\nconst wrap = <T>(v: T[], idx: number) => {\n return v.map((_, index) => v[(Math.max(idx, 0) + index) % v.length])\n}\n\nexport function findByText<T extends HTMLElement>(v: T[], text: string, currentId?: string | null) {\n const index = currentId ? indexOfId(v, currentId) : -1\n let items = currentId ? wrap(v, index) : v\n\n const isSingleKey = text.length === 1\n\n if (isSingleKey) {\n items = items.filter((item) => item.id !== currentId)\n }\n\n return items.find((item) => match(getValueText(item), text))\n}\n\nexport function sortByTreeOrder<T extends HTMLElement>(v: T[]) {\n return v.sort((a, b) => (a.compareDocumentPosition(b) & 2 ? 1 : -1))\n}\n", "// Credits: https://github.com/adobe/react-spectrum/blob/e81cfec20056338c7987c513826dc45df32f3db4/packages/%40react-aria/interactions/src/textSelection.ts\nimport { isIos } from \"@zag-js/utils\"\nimport { nextTick } from \"./next-tick\"\n\ntype State = \"default\" | \"disabled\" | \"restoring\"\n\nlet state: State = \"default\"\nlet savedUserSelect = \"\"\nlet modifiedElementMap = new WeakMap<HTMLElement, string>()\n\nexport function disableTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state === \"default\") {\n savedUserSelect = _document.documentElement.style.webkitUserSelect\n _document.documentElement.style.webkitUserSelect = \"none\"\n }\n\n state = \"disabled\"\n } else if (target) {\n modifiedElementMap.set(target, target.style.userSelect)\n target.style.userSelect = \"none\"\n }\n\n return () => restoreTextSelection({ target, doc: _document })\n}\n\nexport function restoreTextSelection({ target, doc }: { target?: HTMLElement; doc?: Document } = {}) {\n const _document = doc ?? document\n\n if (isIos()) {\n if (state !== \"disabled\") return\n state = \"restoring\"\n\n setTimeout(() => {\n nextTick(() => {\n if (state === \"restoring\") {\n if (_document.documentElement.style.webkitUserSelect === \"none\") {\n _document.documentElement.style.webkitUserSelect = savedUserSelect || \"\"\n }\n\n savedUserSelect = \"\"\n state = \"default\"\n }\n })\n }, 300)\n } else {\n if (target && modifiedElementMap.has(target)) {\n let targetOldUserSelect = modifiedElementMap.get(target)\n\n if (target.style.userSelect === \"none\") {\n target.style.userSelect = targetOldUserSelect ?? \"\"\n }\n\n if (target.getAttribute(\"style\") === \"\") {\n target.removeAttribute(\"style\")\n }\n modifiedElementMap.delete(target)\n }\n }\n}\n", "import { isLeftClick, isMouseEvent, pipe } from \"@zag-js/utils\"\nimport { addDomEvent, addPointerEvent } from \"./listener\"\nimport type { AnyPointerEvent, EventListenerWithPointInfo as Listener, PointerEventInfo } from \"./listener.types\"\nimport { disableTextSelection } from \"./text-selection\"\n\nexport function trackPointerDown(doc: Document, onPointerDown: (el: HTMLElement) => void) {\n const win = doc.defaultView ?? window\n const fn = (event: PointerEvent) => {\n if (event.target instanceof win.HTMLElement) {\n onPointerDown(event.target)\n }\n }\n return addDomEvent(doc, \"pointerdown\", fn)\n}\n\ntype TrackPointerMoveOptions = {\n ctx: { doc?: Document; threshold?: number }\n onPointerUp: VoidFunction\n onPointerMove: (info: PointerEventInfo, event: AnyPointerEvent) => void\n}\n\nexport function trackPointerMove(opts: TrackPointerMoveOptions) {\n const { onPointerMove, onPointerUp, ctx } = opts\n const { doc = document, threshold = 5 } = ctx\n\n const handlePointerMove: Listener = (event, info) => {\n const { point: p } = info\n const distance = Math.sqrt(p.x ** 2 + p.y ** 2)\n if (distance < threshold) return\n\n // Because Safari doesn't trigger mouseup events when it's above a `<select>`\n if (isMouseEvent(event) && isLeftClick(event)) {\n onPointerUp()\n return\n }\n\n onPointerMove(info, event)\n }\n\n return pipe(\n addPointerEvent(doc, \"pointermove\", handlePointerMove, false),\n addPointerEvent(doc, \"pointerup\", onPointerUp, false),\n addPointerEvent(doc, \"pointercancel\", onPointerUp, false),\n addPointerEvent(doc, \"contextmenu\", onPointerUp, false),\n disableTextSelection({ doc }),\n )\n}\n", "import { pipe } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\ntype PointerLockHandlers = {\n onPointerLock?: VoidFunction\n onPointerUnlock?: VoidFunction\n}\n\nexport function addPointerlockChangeListener(doc: Document, fn: VoidFunction) {\n return addDomEvent(doc, \"pointerlockchange\", fn, false)\n}\n\nexport function addPointerlockErrorListener(doc: Document, fn: (e: Event) => void) {\n doc.addEventListener(\"pointerlockerror\", fn, false)\n return function cleanup() {\n doc.removeEventListener(\"pointerlockerror\", fn, false)\n }\n}\n\nexport function requestPointerLock(doc: Document, handlers: PointerLockHandlers = {}) {\n const { onPointerLock, onPointerUnlock } = handlers\n const body = doc.body\n\n const supported = \"pointerLockElement\" in doc || \"mozPointerLockElement\" in doc\n const locked = !!doc.pointerLockElement\n\n function onPointerChange() {\n if (locked) onPointerLock?.()\n else onPointerUnlock?.()\n }\n\n function onPointerError(event: Event) {\n if (locked) onPointerUnlock?.()\n console.error(\"PointerLock error occured:\", event)\n exit()\n }\n\n function exit() {\n doc.exitPointerLock()\n }\n\n if (!supported) return\n\n body.requestPointerLock()\n\n const cleanup = pipe(\n addPointerlockChangeListener(doc, onPointerChange),\n addPointerlockErrorListener(doc, onPointerError),\n )\n\n return function dispose() {\n if (!supported) return\n cleanup()\n exit()\n }\n}\n", "// Credit goes to the radix-ui team for this utility:\n// https://github.com/radix-ui/primitives/blob/main/packages/core/rect/src/observeElementRect.ts\n\ntype Fn = (rect: DOMRect) => void\ntype ObservedData = { rect: DOMRect; callbacks: Fn[] }\nexport type Measurable = { getBoundingClientRect(): DOMRect }\n\nfunction getObservedElements(): Map<Measurable, ObservedData> {\n ;(globalThis as any).__rectObserverMap__ = (globalThis as any).__rectObserverMap__ || new Map()\n return (globalThis as any).__rectObserverMap__\n}\n\nexport function observeElementRect(el: Measurable, fn: Fn) {\n const observedElements = getObservedElements()\n\n const data = observedElements.get(el)\n\n if (!data) {\n observedElements.set(el, { rect: {} as DOMRect, callbacks: [fn] })\n\n if (observedElements.size === 1) {\n rafId = requestAnimationFrame(runLoop)\n }\n } else {\n data.callbacks.push(fn)\n fn(el.getBoundingClientRect())\n }\n\n return function unobserve() {\n const data = observedElements.get(el)\n if (!data) return\n\n const index = data.callbacks.indexOf(fn)\n if (index > -1) {\n data.callbacks.splice(index, 1)\n }\n\n if (data.callbacks.length === 0) {\n observedElements.delete(el)\n\n if (observedElements.size === 0) {\n cancelAnimationFrame(rafId)\n }\n }\n }\n}\n\nlet rafId: number\n\nfunction runLoop() {\n const observedElements = getObservedElements()\n\n const changedRectsData: Array<ObservedData> = []\n\n observedElements.forEach((data, element) => {\n const newRect = element.getBoundingClientRect()\n\n if (!isEqual(data.rect, newRect)) {\n data.rect = newRect\n changedRectsData.push(data)\n }\n })\n\n changedRectsData.forEach((data) => {\n data.callbacks.forEach((callback) => callback(data.rect))\n })\n\n rafId = requestAnimationFrame(runLoop)\n}\n\nfunction isEqual(rect1: DOMRect, rect2: DOMRect) {\n return (\n rect1.width === rect2.width &&\n rect1.height === rect2.height &&\n rect1.top === rect2.top &&\n rect1.right === rect2.right &&\n rect1.bottom === rect2.bottom &&\n rect1.left === rect2.left\n )\n}\n", "import { cast } from \"@zag-js/utils\"\nimport { addDomEvent } from \"./listener\"\n\nexport function trackDocumentVisibility(_doc: Document, callback: (hidden: boolean) => void) {\n const doc = cast(_doc) as Document & { msHidden?: boolean; webkitHidden?: boolean }\n return addDomEvent(doc, \"visibilitychange\", () => {\n const hidden = doc.hidden || doc.msHidden || doc.webkitHidden\n callback(!!hidden)\n })\n}\n", "import { addDomEvent } from \"./listener\"\n\ntype ViewportSize = {\n width: number\n height: number\n}\n\ntype Options = {\n document?: Document\n resolve?(data: ViewportSize): void\n}\n\nexport function trackVisualViewport(options: Options) {\n const { document: doc, resolve } = options\n const win = doc?.defaultView || window\n resolve?.(getViewportSize(win))\n const onResize = () => resolve?.(getViewportSize(win))\n return addDomEvent(win.visualViewport ?? win, \"resize\", onResize)\n}\n\nfunction getViewportSize(win: Window): ViewportSize {\n return {\n width: win.visualViewport?.width || win.innerWidth,\n height: win.visualViewport?.height || win.innerHeight,\n }\n}\n", "export function waitFor<T>(predicate: () => T): Promise<T> {\n let value = predicate()\n if (!!value) return Promise.resolve(value)\n return new Promise((resolve) => {\n const id = globalThis.setInterval(function () {\n let value = predicate()\n if (value) {\n globalThis.clearInterval(id)\n resolve(value)\n }\n }, 0)\n })\n}\n\nexport function waitForEvent(el: HTMLElement, eventName: string) {\n return new Promise<void>((resolve) => {\n function done(event: Event) {\n if (event.target === el) {\n el.removeEventListener(eventName, done)\n resolve()\n }\n }\n\n el.addEventListener(eventName, done)\n })\n}\n", "import { findByText } from \"./nodelist\"\n\nexport type TypeaheadState = {\n keysSoFar: string\n timer: number\n}\n\nexport type TypeaheadOptions = {\n state: TypeaheadState\n activeId: string | null\n key: string\n timeout?: number\n}\n\nexport function findByTypeahead<T extends HTMLElement>(_items: T[], options: TypeaheadOptions) {\n const { state, activeId, key, timeout = 350 } = options\n\n const search = state.keysSoFar + key\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0])\n\n const query = isRepeated ? search[0] : search\n\n let items = _items.slice()\n\n const next = findByText(items, query, activeId)\n\n function cleanup() {\n clearTimeout(state.timer)\n state.timer = -1\n }\n\n function update(value: string) {\n state.keysSoFar = value\n cleanup()\n\n if (value !== \"\") {\n state.timer = +setTimeout(() => {\n update(\"\")\n cleanup()\n }, timeout)\n }\n }\n\n update(search)\n\n return next\n}\n\nfindByTypeahead.defaultOptions = {\n keysSoFar: \"\",\n timer: -1,\n}\n", "import { dataAttr, EventKeyMap, isFocusable, validateBlur } from \"@zag-js/dom-utils\"\nimport { getPlacementStyles } from \"@zag-js/popper\"\nimport { normalizeProp, PropTypes, ReactPropTypes } from \"@zag-js/types\"\nimport { dom } from \"./popover.dom\"\nimport type { Send, State } from \"./popover.types\"\n\nexport function connect<T extends PropTypes = ReactPropTypes>(state: State, send: Send, normalize = normalizeProp) {\n const isOpen = state.matches(\"open\")\n const pointerdownNode = state.context.pointerdownNode\n const popperStyles = getPlacementStyles({\n measured: !!state.context.isPlacementComplete,\n placement: state.context.currentPlacement,\n })\n\n return {\n portalled: state.context.currentPortalled,\n isOpen,\n open() {\n send(\"OPEN\")\n },\n close() {\n send(\"CLOSE\")\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 anchorProps: normalize.element<T>({\n \"data-part\": \"anchor\",\n id: dom.getAnchorId(state.context),\n }),\n\n triggerProps: normalize.button<T>({\n \"data-part\": \"trigger\",\n type: \"button\",\n \"data-placement\": state.context.currentPlacement,\n id: dom.getTriggerId(state.context),\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"data-expanded\": dataAttr(isOpen),\n \"aria-controls\": dom.getContentId(state.context),\n onClick() {\n send(\"TRIGGER_CLICK\")\n },\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 id: dom.getContentId(state.context),\n tabIndex: -1,\n role: \"dialog\",\n hidden: !isOpen,\n \"aria-labelledby\": state.context.isTitleRendered ? dom.getTitleId(state.context) : undefined,\n \"aria-describedby\": state.context.isDescriptionRendered ? dom.getDescriptionId(state.context) : undefined,\n \"data-placement\": state.context.currentPlacement,\n onKeyDown(event) {\n const keyMap: EventKeyMap = {\n Escape(event) {\n send(\"ESCAPE\")\n event.stopPropagation()\n },\n Tab(event) {\n const type = event.shiftKey ? \"SHIFT_TAB\" : \"TAB\"\n send({ type, preventDefault: () => event.preventDefault() })\n },\n }\n\n const exec = keyMap[event.key]\n exec?.(event)\n },\n onBlur(event) {\n const isValidBlur = validateBlur(event, {\n exclude: [dom.getTriggerEl(state.context), dom.getContentEl(state.context)],\n fallback: pointerdownNode,\n })\n\n if (isValidBlur) {\n const el = (event.relatedTarget ?? pointerdownNode) as HTMLElement\n send({ type: \"INTERACT_OUTSIDE\", focusable: isFocusable(el) })\n }\n },\n }),\n\n titleProps: normalize.element<T>({\n \"data-part\": \"title\",\n id: dom.getTitleId(state.context),\n }),\n\n descriptionProps: normalize.element<T>({\n \"data-part\": \"description\",\n id: dom.getDescriptionId(state.context),\n }),\n\n closeButtonProps: normalize.button<T>({\n \"data-part\": \"close-button\",\n id: dom.getCloseButtonId(state.context),\n type: \"button\",\n \"aria-label\": \"close\",\n onClick() {\n send(\"CLOSE\")\n },\n }),\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", "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: Pick<KeyboardEvent, \"ctrlKey\" | \"metaKey\" | \"altKey\">) =>\n v.ctrlKey || v.altKey || v.metaKey\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 { getFocusables, getTabbables } from \"@zag-js/dom-utils\"\nimport { cast, first, last, runIfFn } from \"@zag-js/utils\"\nimport { MachineContext as Ctx } from \"./popover.types\"\n\nexport const dom = {\n getDoc: (ctx: Ctx) => ctx.doc ?? document,\n getActiveEl: (ctx: Ctx) => dom.getDoc(ctx).activeElement,\n getRootNode: (ctx: Ctx) => ctx.rootNode ?? dom.getDoc(ctx),\n\n getAnchorId: (ctx: Ctx) => ctx.ids?.anchor ?? `popover:${ctx.uid}:anchor`,\n getTriggerId: (ctx: Ctx) => ctx.ids?.trigger ?? `popover:${ctx.uid}:trigger`,\n getContentId: (ctx: Ctx) => ctx.ids?.content ?? `popover:${ctx.uid}:content`,\n getPositionerId: (ctx: Ctx) => `popover:${ctx.uid}:popper`,\n getArrowId: (ctx: Ctx) => `popover:${ctx.uid}:arrow`,\n getTitleId: (ctx: Ctx) => ctx.ids?.title ?? `popover:${ctx.uid}:title`,\n getDescriptionId: (ctx: Ctx) => ctx.ids?.description ?? `popover:${ctx.uid}:desc`,\n getCloseButtonId: (ctx: Ctx) => ctx.ids?.closeBtn ?? `popover:${ctx.uid}:close-button`,\n\n getAnchorEl: (ctx: Ctx) => dom.getRootNode(ctx).getElementById(dom.getAnchorId(ctx)),\n getTriggerEl: (ctx: Ctx) => dom.getRootNode(ctx).getElementById(dom.getTriggerId(ctx)),\n getContentEl: (ctx: Ctx) => dom.getRootNode(ctx).getElementById(dom.getContentId(ctx)),\n getPositionerEl: (ctx: Ctx) => dom.getRootNode(ctx).getElementById(dom.getPositionerId(ctx)),\n getTitleEl: (ctx: Ctx) => dom.getRootNode(ctx).getElementById(dom.getTitleId(ctx)),\n getDescriptionEl: (ctx: Ctx) => dom.getRootNode(ctx).getElementById(dom.getDescriptionId(ctx)),\n\n getFocusableEls: (ctx: Ctx) => getFocusables(dom.getContentEl(ctx)),\n getFirstFocusableEl: (ctx: Ctx) => dom.getFocusableEls(ctx)[0],\n\n getDocTabbableEls: (ctx: Ctx) => getTabbables(cast(dom.getDoc(ctx))),\n getTabbableEls: (ctx: Ctx) => {\n const el = dom.getContentEl(ctx)\n return el ? getTabbables(el) : []\n },\n getFirstTabbableEl: (ctx: Ctx) => first(dom.getTabbableEls(ctx)),\n getLastTabbableEl: (ctx: Ctx) => last(dom.getTabbableEls(ctx)),\n getInitialFocusEl: (ctx: Ctx) => runIfFn(ctx.initialFocusEl) ?? dom.getFirstFocusableEl(ctx),\n}\n", "import { choose, createMachine, guards, ref } from \"@zag-js/core\"\nimport {\n contains,\n nextTick,\n preventBodyPointerEvents,\n preventBodyScroll,\n raf,\n trackPointerDown,\n} from \"@zag-js/dom-utils\"\nimport { getPlacement } from \"@zag-js/popper\"\nimport { next, runIfFn } from \"@zag-js/utils\"\nimport { ariaHidden } from \"@zag-js/aria-hidden\"\nimport { createFocusTrap, FocusTrap } from \"focus-trap\"\nimport { dom } from \"./popover.dom\"\nimport { MachineContext, MachineState, UserDefinedContext } from \"./popover.types\"\n\nconst { and, or } = guards\n\nexport function machine(ctx: UserDefinedContext = {}) {\n return createMachine<MachineContext, MachineState>(\n {\n id: \"popover\",\n initial: \"unknown\",\n context: {\n isTitleRendered: true,\n isDescriptionRendered: true,\n isAnchorRendered: false,\n uid: \"\",\n closeOnBlur: true,\n closeOnEsc: true,\n autoFocus: true,\n modal: false,\n positioning: {\n placement: \"bottom\",\n ...ctx.positioning,\n },\n currentPlacement: undefined,\n ...ctx,\n },\n\n computed: {\n currentPortalled: (ctx) => !!ctx.modal || !!ctx.portalled,\n },\n\n states: {\n unknown: {\n on: {\n SETUP: {\n target: \"closed\",\n actions: [\"setupDocument\", \"checkRenderedElements\"],\n },\n },\n },\n\n closed: {\n entry: [\"clearPointerDown\", \"invokeOnClose\"],\n on: {\n TRIGGER_CLICK: \"open\",\n OPEN: \"open\",\n },\n },\n\n open: {\n activities: [\n \"trackPointerDown\",\n \"trapFocus\",\n \"preventScroll\",\n \"hideContentBelow\",\n \"disableOutsidePointerEvents\",\n \"computePlacement\",\n ],\n entry: choose([\n {\n guard: \"autoFocus\",\n actions: [\"setInitialFocus\", \"invokeOnOpen\"],\n },\n { actions: [\"focusContent\", \"invokeOnOpen\"] },\n ]),\n on: {\n CLOSE: {\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n TRIGGER_CLICK: {\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n ESCAPE: {\n guard: \"closeOnEsc\",\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n TAB: {\n guard: and(\"isLastTabbableElement\", \"closeOnBlur\", \"portalled\"),\n target: \"closed\",\n actions: \"focusNextTabbableElementAfterTrigger\",\n },\n SHIFT_TAB: {\n guard: and(or(\"isFirstTabbableElement\", \"isContentFocused\"), \"closeOnBlur\", \"portalled\"),\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n INTERACT_OUTSIDE: [\n {\n guard: and(\"closeOnBlur\", \"isRelatedTargetFocusable\"),\n target: \"closed\",\n },\n {\n guard: \"closeOnBlur\",\n target: \"closed\",\n actions: \"focusTrigger\",\n },\n ],\n },\n },\n },\n },\n {\n activities: {\n computePlacement(ctx) {\n ctx.currentPlacement = ctx.positioning.placement\n const anchorEl = ctx.isAnchorRendered ? dom.getAnchorEl(ctx) : dom.getTriggerEl(ctx)\n return getPlacement(anchorEl, 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 trackPointerDown(ctx) {\n return trackPointerDown(dom.getDoc(ctx), (el) => {\n ctx.pointerdownNode = ref(el)\n })\n },\n disableOutsidePointerEvents(ctx) {\n const el = dom.getContentEl(ctx)\n return preventBodyPointerEvents(el, {\n document: dom.getDoc(ctx),\n disabled: !ctx.modal,\n })\n },\n hideContentBelow(ctx) {\n if (!ctx.modal) return\n let unhide: VoidFunction | undefined\n nextTick(() => {\n unhide = ariaHidden([dom.getContentEl(ctx), dom.getTriggerEl(ctx)])\n })\n return () => unhide?.()\n },\n preventScroll(ctx) {\n return preventBodyScroll({\n allowPinchZoom: true,\n disabled: !ctx.modal,\n document: dom.getDoc(ctx),\n })\n },\n trapFocus(ctx) {\n if (!ctx.modal) return\n let trap: FocusTrap\n nextTick(() => {\n const el = dom.getContentEl(ctx)\n if (!el) return\n trap = createFocusTrap(el, {\n escapeDeactivates: false,\n allowOutsideClick: true,\n returnFocusOnDeactivate: true,\n document: dom.getDoc(ctx),\n fallbackFocus: el,\n initialFocus: runIfFn(ctx.initialFocusEl),\n })\n try {\n trap.activate()\n } catch {}\n })\n return () => trap?.deactivate()\n },\n },\n guards: {\n closeOnEsc: (ctx) => !!ctx.closeOnEsc,\n autoFocus: (ctx) => !!ctx.autoFocus,\n modal: (ctx) => !!ctx.modal,\n portalled: (ctx) => !!ctx.portalled,\n isRelatedTargetFocusable: (_ctx, evt) => evt.focusable,\n closeOnBlur: (ctx) => !!ctx.closeOnBlur,\n isContentFocused: (ctx) => dom.getContentEl(ctx) === dom.getActiveEl(ctx),\n isFirstTabbableElement: (ctx) => dom.getFirstTabbableEl(ctx) === dom.getActiveEl(ctx),\n isLastTabbableElement: (ctx) => dom.getLastTabbableEl(ctx) === dom.getActiveEl(ctx),\n },\n actions: {\n checkRenderedElements(ctx) {\n raf(() => {\n ctx.isAnchorRendered = !!dom.getAnchorEl(ctx)\n ctx.isTitleRendered = !!dom.getTitleEl(ctx)\n ctx.isDescriptionRendered = !!dom.getDescriptionEl(ctx)\n })\n },\n setupDocument(ctx, evt) {\n if (evt.doc) ctx.doc = ref(evt.doc)\n if (evt.root) ctx.rootNode = ref(evt.root)\n ctx.uid = evt.id\n },\n clearPointerDown(ctx) {\n ctx.pointerdownNode = null\n },\n focusContent(ctx) {\n raf(() => {\n dom.getContentEl(ctx)?.focus()\n })\n },\n setInitialFocus(ctx) {\n raf(() => {\n dom.getInitialFocusEl(ctx)?.focus()\n })\n },\n focusTrigger(ctx) {\n raf(() => {\n dom.getTriggerEl(ctx)?.focus()\n })\n },\n invokeOnOpen(ctx, evt) {\n if (evt.type !== \"SETUP\") {\n ctx.onOpen?.()\n }\n },\n invokeOnClose(ctx, evt) {\n if (evt.type !== \"SETUP\") {\n ctx.onClose?.()\n }\n },\n focusNextTabbableElementAfterTrigger(ctx, evt) {\n const content = dom.getContentEl(ctx)\n const doc = dom.getDoc(ctx)\n const button = dom.getTriggerEl(ctx)\n if (!content || !button) return\n\n const lastTabbable = dom.getLastTabbableEl(ctx)\n if (lastTabbable !== doc.activeElement) return\n\n let tabbables = dom.getDocTabbableEls(ctx)\n let elementAfterTrigger = next(tabbables, tabbables.indexOf(button), { loop: false })\n\n // content is just after button (in dom order) ???\n if (elementAfterTrigger === content) {\n tabbables = tabbables.filter((el) => !contains(content, el))\n elementAfterTrigger = next(tabbables, tabbables.indexOf(button), { loop: false })\n }\n\n // if there's no next element, let the browser handle it\n if (!elementAfterTrigger || elementAfterTrigger === button) return\n\n // else focus the next element\n evt.preventDefault()\n raf(() => elementAfterTrigger?.focus())\n },\n },\n },\n )\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAuCA,WAAmB,IAAA;AACjB,SAAqB,AAAA,OAAP,MAAO,YAAkB,AAAN,MAAM,QAAwB,AAAhB,GAAG,aAAa;AAAb;AAGpD,WACE,IACA,IAAA;AAEA,SAAA,EAAI,MAA2C,AAAb,OAAa,aAI3B,AAAb,OAAa,aAA0B,AAAb,OAAa;AAAb;AA0BnC,WAAsB,IAAa,IAAA;AACjC,MAAI,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,GAAG,aAAa;AACxE,QAAM,KAAQ,iBAAiB,IAAI,IAAA;AACnC,WACE,EAAY,GAAM,WAAW,EAAA,KAC7B,EAAY,GAAM,WAAW,EAAA,KAhBnC,SAAyB,IAAA;AACvB,UAAM,KAbR,SAAyB,IAAA;AACvB,YAAA,CAAK,GAAG,iBAAA,CAAkB,GAAG,cAAc;AACzC,iBAAA;AAGF,YAAA;AACE,iBAAO,GAAG,cAAc,YAAY;QAAA,SAC7B,IAAP;AACA,iBAAA;QAAA;MAAA,EAK4B,EAAA;AAC9B,aAAA,CAAA,CAAK,MAKH,IAAM,eAAe,GAAG,gBAAgB,GAAM,cAAc,GAAG;IAAA,EAU7C,EAAA;EAAA;AAIpB,SAAA;AAAA;AAWF,WACE,IACA,IACA,IACA,IACA,GACA,GACA,GACA,GAAA;AAqBA,SACG,IAAmB,MAClB,IAAiB,MAClB,IAAmB,MAAsB,IAAiB,KAAA,IA6C1D,KAAoB,MAAsB,KAAe,MACzD,KAAkB,MAAoB,KAAe,KAE/C,IAAmB,KAAqB,KA4C9C,IAAiB,MAAoB,IAAc,MACnD,IAAmB,MAAsB,IAAc,KAEjD,IAAiB,KAAmB,IAAA;AAAA;AAAA,8BAM/B,IAAiB,GAAA;AAE/B,MAAM,IAAsB,QAK1B,IAKE,EALF,YACA,IAIE,EAJF,OACA,IAGE,EAHF,QACA,IAEE,EAFF,UACA,IACE,EADF,4BAKI,IACgB,AAAA,OAAb,KAAa,aAAa,IAAW,SAAC,IAAA;AAAA,WAAc,OAAS;EAAA;AAEtE,MAAA,CAAK,EAAU,EAAA;AACb,UAAA,IAAU,UAAU,gBAAA;AAStB,WALM,IAAmB,SAAS,oBAAoB,SAAS,iBAGzD,IAAoB,CAAA,GACtB,IAAyB,IACtB,EAAU,CAAA,KAAW,EAAc,CAAA,KAAS;AAKjD,QAHA,KAAS,EAAO,mBAGD,GAAkB;AAC/B,QAAO,KAAK,CAAA;AACZ;IAAA;AAKU,IAAV,KAAU,QACV,MAAW,SAAS,QACpB,EAAa,CAAA,KAAA,CACZ,EAAa,SAAS,eAAA,KAMX,AAAV,KAAU,QAAQ,EAAa,GAAQ,CAAA,KACzC,EAAO,KAAK,CAAA;EAAA;AA8ChB,WArCM,IAAgB,EAAmB,iBACrC,EAAmB,eAAe,QAClC,YACE,IAAiB,EAAmB,iBACtC,EAAmB,eAAe,SAClC,aAGE,IAAY,OAAO,WAAW,aAC9B,IAAY,OAAO,WAAW,aAAA,IAShC,GAAO,sBAAA,GAND,IAAA,EAAR,QACO,IAAA,EAAP,OACK,IAAA,EAAL,KACO,IAAA,EAAP,OACQ,IAAA,EAAR,QACM,IAAA,EAAN,MAIE,IACQ,AAAV,MAAU,WAAqB,AAAV,MAAU,YAC3B,IACU,AAAV,MAAU,QACV,IACA,IAAY,IAAe,GAC7B,IACS,AAAX,MAAW,WACP,IAAa,IAAc,IAChB,AAAX,MAAW,QACX,IACA,GAGA,IAAqC,CAAA,GAElC,IAAQ,GAAG,IAAQ,EAAO,QAAQ,KAAS;AAClD,QAAM,IAAQ,EAAO,IAAA,IAWjB,EAAM,sBAAA,GANR,IAAA,EAAA,QACA,IAAA,EAAA,OACA,IAAA,EAAA,KACA,IAAA,EAAA,OACA,IAAA,EAAA,QACA,IAAA,EAAA;AAKF,QACiB,AAAf,MAAe,eACf,KAAa,KACb,KAAc,KACd,KAAgB,KAChB,KAAe,KACf,KAAa,KACb,KAAgB,KAChB,KAAc,KACd,KAAe;AAGf,aAAO;AAGT,QAAM,IAAa,iBAAiB,CAAA,GAC9B,IAAa,SAAS,EAAW,iBAA2B,EAAA,GAC5D,IAAY,SAAS,EAAW,gBAA0B,EAAA,GAC1D,IAAc,SAAS,EAAW,kBAA4B,EAAA,GAC9D,IAAe,SAAS,EAAW,mBAA6B,EAAA,GAElE,IAAsB,GACtB,IAAuB,GAIrB,IACJ,iBAAiB,IACZ,EAAsB,cACtB,EAAsB,cACvB,IACA,IACA,GACA,IACJ,kBAAkB,IACb,EAAsB,eACtB,EAAsB,eACvB,IACA,IACA;AAEN,QAAI,MAAqB;AAIrB,UADY,AAAV,MAAU,UACE,IACK,AAAV,MAAU,QACL,IAAc,IACT,AAAV,MAAU,YACL,EACZ,GACA,IAAY,GACZ,GACA,GACA,GACA,IAAY,GACZ,IAAY,IAAc,GAC1B,CAAA,IAIY,IAAc,IAAiB,GAI7C,IADa,AAAX,MAAW,UACE,IACK,AAAX,MAAW,WACL,IAAe,IAAgB,IAC1B,AAAX,MAAW,QACL,IAAe,IAGf,EACb,GACA,IAAY,GACZ,GACA,GACA,GACA,IAAY,GACZ,IAAY,IAAe,GAC3B,CAAA,GAMJ,IAAc,KAAK,IAAI,GAAG,IAAc,CAAA,GACxC,IAAe,KAAK,IAAI,GAAG,IAAe,CAAA;SACrC;AAIH,UADY,AAAV,MAAU,UACE,IAAc,IAAM,IACf,AAAV,MAAU,QACL,IAAc,IAAS,IAAe,IACjC,AAAV,MAAU,YACL,EACZ,GACA,GACA,GACA,GACA,IAAe,GACf,GACA,IAAc,GACd,CAAA,IAIY,IAAe,KAAM,IAAS,KAAK,IAAkB,GAInE,IADa,AAAX,MAAW,UACE,IAAe,IAAO,IACjB,AAAX,MAAW,WACL,IAAgB,KAAO,IAAQ,KAAK,IAAiB,IAChD,AAAX,MAAW,QACL,IAAe,IAAQ,IAAc,IAGrC,EACb,GACA,GACA,GACA,GACA,IAAc,GACd,GACA,IAAe,GACf,CAAA;AAvCC,UA2CG,IAA0B,EAA1B,YAAY,IAAc,EAAd;AAkBpB,WAAe,IAhBf,KAAc,KAAK,IACjB,GACA,KAAK,IACH,IAAY,GACZ,EAAM,eAAe,IAAS,CAAA,CAAA,IAalC,KAAgB,IAVhB,KAAe,KAAK,IAClB,GACA,KAAK,IACH,IAAa,GACb,EAAM,cAAc,IAAQ,CAAA,CAAA;IAAA;AASlC,MAAa,KAAK,EAAE,IAAI,GAAO,KAAK,GAAa,MAAM,EAAA,CAAA;EAAA;AAGzD,SAAO;AAAA;;;AClfT,yBAAyB,SAAS;AAChC,SAAO,YAAY,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE,WAAW;AACxE;AAEA,yBAAyB,SAAS,UAAU;AAC1C,MAAI,aAAa,QAAQ;AACvB,eAAW;AAAA,EACb;AAEA,MAAI,kBAAmB,oBAAoB,SAAS,KAAK;AACzD,UAAQ,QAAQ,SAAU,MAAM;AAC9B,QAAI,KAAK,KAAK,IACV,MAAM,KAAK,KACX,OAAO,KAAK;AAEhB,QAAI,GAAG,UAAU,iBAAiB;AAChC,SAAG,OAAO;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,SAAG,YAAY;AACf,SAAG,aAAa;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,oBAAoB,SAAS;AAC3B,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,gBAAgB,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,wBAAwB,QAAQ,SAAS;AACvC,MAAI,mBAAmB,OAAO,eAAe,OAAO,cAAc,gBAAgB,SAAS,MAAM;AAEjG,MAAI,gBAAgB,OAAO,KAAK,OAAO,QAAQ,aAAa,YAAY;AACtE,WAAO,QAAQ,SAAS,mBAAmB,qBAAQ,QAAQ,OAAO,IAAI,CAAC,CAAC;AAAA,EAC1E;AAEA,MAAI,CAAC,kBAAkB;AACrB;AAAA,EACF;AAEA,MAAI,iBAAiB,WAAW,OAAO;AACvC,SAAO,gBAAgB,qBAAQ,QAAQ,cAAc,GAAG,eAAe,QAAQ;AACjF;AAEA,IAAO,aAAQ;;;AC7DR,IAAM,WAAW,CAAC,UAA+B;AACtD,SAAQ,QAAQ,KAAK;AACvB;ACAA,yBAAuD;AACrD;AAAE,aAAmB,iBAAkB,WAAmB,kBAAkB,oBAAI,QAAQ;AACxF,SAAQ,WAAmB;AAC7B;AAEO,2BAA0B,IAAgB;AATjD,MAAA;AAUE,MAAI,CAAC;AAAI,WAAO,CAAC;AACjB,QAAM,QAAQ,cAAc;AAC5B,MAAI,QAA4B,MAAM,IAAI,EAAE;AAC5C,MAAI,CAAC,OAAO;AACV,UAAM,MAAM,MAAA,MAAA,OAAA,SAAA,GAAI,cAAc,gBAAlB,OAAA,KAAiC;AAC7C,YAAQ,IAAI,iBAAiB,EAAE;AAC/B,UAAM,IAAI,IAAI,KAAK;EACrB;AACA,SAAO;AACT;ACnBO,kBAAkB,IAAkB;AACzC,QAAM,MAAM,oBAAI,IAAkB;AAClC,gBAAa,KAAkB;AAC7B,UAAM,KAAK,WAAW,sBAAsB,GAAE;AAC9C,QAAI,IAAI,MAAM,WAAW,qBAAqB,EAAE,CAAC;EACnD;AACA,OAAI,MAAM,KAAI,EAAE,CAAC;AACjB,SAAO,mBAAmB;AACxB,QAAI,QAAQ,SAAU,KAAI;AACxB,UAAG;IACL,CAAC;EACH;AACF;AAEO,aAAa,IAAkB;AACpC,QAAM,KAAK,WAAW,sBAAsB,EAAE;AAC9C,SAAO,mBAAmB;AACxB,eAAW,qBAAqB,EAAE;EACpC;AACF;AGTO,IAAM,OAAO,MAAM;AAAC;AAEpB,IAAM,OACX,IAAO,QACP,CAAC,MACC,IAAI,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC;ACfhC,IAAM,WAAW,CAAC,MAAc,MAAM,KAAK,EAAE,KAAK,UAAU,QAAQ;AAI7D,IAAM,QAAQ,MAAM,CAAC,CAAE,QAAO,WAAW;AACzC,IAAM,QAAQ,MAAM,SAAS,MAAM;AACnC,IAAM,WAAW,MAAM,SAAS,SAAS;AACzC,IAAM,SAAS,MAAM,SAAS,OAAO,KAAM,MAAM,KAAK,UAAU,iBAAiB;AACjF,IAAM,QAAQ,MAAM,SAAS,KAAK,OAAO;AAmBzC,IAAM,cAAc,CAAC,MAAiC,EAAE,WAAW;AEpB1E,+BAA+C;AAC7C;AAAE,aAAmB,uBAAwB,WAAmB,wBAAwB,oBAAI,IAAI;AAChG,SAAQ,WAAmB;AAC7B;AAEA,4BAA2D;AACzD;AAAE,aAAmB,oBAAqB,WAAmB,qBAAqB,oBAAI,IAAI;AAC1F,SAAQ,WAAmB;AAC7B;AASO,wBAAwB,MAAiB,MAAc,SAAkB,SAAkB;AAxBlG,MAAA;AAyBE,MAAI,CAAC;AAAM,WAAO;AAGlB,QAAM,OAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAG7C,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,gBAAgB,iBAAiB;AAEvC,QAAM,QAAQ,iBAAiB,IAAI,IAAI;AAEvC,MAAI,CAAC,iBAAiB,IAAI,IAAI,GAAG;AAE/B,UAAM,SAAe,oBAAI,IAAI,CAAC,CAAC,MAAM,oBAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzD,qBAAiB,IAAI,MAAM,MAAK;EAClC,WAAW,SAAA,OAAA,SAAA,MAAO,IAAI,IAAA,GAAO;AAC3B,IAAA,MAAA,SAAA,OAAA,SAAA,MAAO,IAAI,IAAA,MAAX,OAAA,SAAA,GAAkB,IAAI,OAAA;EACxB,OAAO;AACL,aAAA,OAAA,SAAA,MAAO,IAAI,MAAM,oBAAI,IAAI,CAAC,OAAO,CAAC,CAAA;EACpC;AAGA,kBAAgB,OAAU;AA/C5B,QAAA,KAAA;AAiDI,sBAAkB,OAAc;AAjDpC,UAAA;AAkDM,YAAM,SAAQ,iBAAiB,IAAI,KAAI;AACvC,MAAA,OAAA,UAAA,OAAA,SAAA,OAAO,IAAI,IAAA,MAAX,OAAA,SAAA,IAAkB,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAA;IAC5C;AAEA,QAAI,CAAC,kBAAA,OAAA,SAAA,cAAe,IAAI,KAAA,IAAO;AAC7B,oBAAc,IAAI,OAAM,oBAAI,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;AACnD,YAAK,iBAAiB,MAAM,UAAU,OAAO;AAC7C;IACF;AAEA,QAAI,CAAC,QAAA,iBAAA,OAAA,SAAA,cAAe,IAAI,KAAA,MAAnB,OAAA,SAAA,IAA0B,IAAI,IAAA,IAAO;AACxC,MAAA,MAAA,cAAc,IAAI,KAAI,MAAtB,OAAA,SAAA,GAAyB,IAAI,MAAM,QAAA;AACnC,YAAK,iBAAiB,MAAM,UAAU,OAAO;IAC/C;EACF;AAEA,SAAO,IAAI;AAEX,SAAO,kBAAkB;AApE3B,QAAA,KAAA,IAAA,IAAA;AAqEI,QAAI,CAAC,iBAAiB,IAAI,IAAI;AAAG;AAEjC,UAAM,SAAQ,iBAAiB,IAAI,IAAI;AACvC,IAAA,OAAA,UAAA,OAAA,SAAA,OAAO,IAAI,IAAA,MAAX,OAAA,SAAA,IAAkB,OAAO,OAAA;AAEzB,QAAI,OAAA,UAAA,OAAA,SAAA,OAAO,IAAI,IAAA,MAAX,OAAA,SAAA,GAAkB,UAAS,GAAG;AAChC,YAAM,WAAW,MAAA,cAAc,IAAI,IAAI,MAAtB,OAAA,SAAA,GAAyB,IAAI,IAAA;AAC9C,WAAK,oBAAoB,MAAM,UAAU,OAAO;AAChD,gBAAA,OAAA,SAAA,OAAO,OAAO,IAAA;AACd,MAAA,MAAA,cAAc,IAAI,IAAI,MAAtB,OAAA,SAAA,GAAyB,OAAO,IAAA;AAEhC,UAAI,WAAA,OAAA,SAAA,OAAO,UAAS,GAAG;AACrB,yBAAiB,OAAO,IAAI;AAC5B,sBAAc,OAAO,IAAI;MAC3B;IACF;EACF;AACF;AC5EA,IAAM,KAAI,CAAC,MAAW,OAAO,UAAU,SAAS,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE;AACnE,IAAM,QAAQ,CAAC,MAA2B,GAAE,CAAC,MAAM,YAAY,aAAa;AAC5E,IAAM,UAAU,CAAC,OAAiC,GAAE,EAAE,MAAM,aAAa,GAAG,IAAI;AAezE,qBACL,QACA,OACA,UACA,SACA;AACA,QAAM,OAAO,MAAM,MAAM,IAAI,OAAO,UAAU,QAAQ,MAAM;AAC5D,SAAO,eAAe,MAAM,OAAO,UAAiB,OAAO;AAC7D;AC/BA,IAAI,cAAc;AAClB,IAAI;AAOG,kCAAkC,IAAwB,OAAqC,CAAC,GAAG;AACxG,QAAM,EAAE,WAAW,OAAO,UAAU,YAAY;AAChD,QAAM,MAAgB,WAAW;AAEjC,MAAI,sBAAsB;AAC1B,MAAI,qBAAqB;AAEzB,oBAAkB;AAChB,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,YAAM,UAAU,MAAM,gBAAgB;AACtC,4BAAsB,CAAC;AACvB,2BAAqB,WAAW,YAAY,KAAK;IACnD;AAEA,UAAM,cAAc,MAAM;AACxB,4BAAsB;AACtB,2BAAqB;IACvB;AAGA,WAAO,KACH,YAAY,KAAK,eAAe,aAAa,GAC7C,YAAY,KAAI,aAAa,WAAW,CAC1C;EACJ;AAEA,mBAAiB;AACf;AACA,QAAI,gBAAgB,GAAG;AACrB,UAAI,KAAK,MAAM,gBAAgB;IACjC;AACA,QAAI,IAAI;AACN,SAAG,MAAM,gBAAgB;IAC3B;EACF;AAEA,mBAAiB;AACf,QAAI;AAAU;AAEd,QAAI,gBAAgB,GAAG;AACrB,kCAA4B,IAAI,KAAK,MAAM;IAC7C;AAEA,QAAI,KAAK,MAAM,gBAAgB;AAC/B,QAAI,IAAI;AACN,SAAG,MAAM,gBAAgB;IAC3B;AAEA;AAEA,WAAO,WAAY;AACjB,UAAI,qBAAqB;AACvB,oBAAY,KAAK,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;MACjD,WAAW,oBAAoB;AAC7B,oBAAY,KAAK,aAAa,OAAO,EAAE,MAAM,KAAK,CAAC;MACrD,OAAO;AACL,cAAM;MACR;IACF;EACF;AAEA,QAAM,WAA4C,CAAC;AACnD,WAAS,KAAK,MAAM,CAAC;AACrB,WAAS,MAAM;AACb,aAAS,KAAK,OAAO,CAAC;EACxB,CAAC;AAED,SAAO,WAAY;AACjB,aAAS,QAAQ,CAAC,YAAY,WAAA,OAAA,SAAA,QAAA,CAAW;EAC3C;AACF;AElFO,0BAA0B,IAA0B;AAA3D,MAAA;AACE,MAAI,SAAS,EAAE;AAAG,WAAO,GAAG;AAC5B,SAAO,MAAA,MAAA,OAAA,SAAA,GAAI,kBAAJ,OAAA,KAAqB;AAC9B;AAUO,qBAAqB,MAAoC;AAC9D,SAAO,SAAS,IAAI,IAAI,KAAK,OAAO,KAAK,aAAa,KAAK;AAC7D;AASO,mBAAmB,IAA8B;AACtD,QAAM,MAAM,iBAAiB,EAAE;AAC/B,MAAI,YAAY,EAAE,MAAM;AAAQ,WAAO;AACvC,SAAO,GAAG,gBAAgB,GAAG,iBAAiB,IAAI;AACpD;AAIO,kBAAkB,QAA0B,OAAa;AAC9D,MAAI,CAAC;AAAQ,WAAO;AACpB,SAAO,WAAW,SAAU,cAAc,MAAM,KAAK,cAAc,KAAK,KAAK,OAAO,SAAS,KAAK;AACpG;AAEO,uBAAuB,GAA0B;AACtD,SAAO,OAAO,MAAM,YAAY,MAAA,OAAA,SAAA,EAAG,cAAa,KAAK,gBAAgB,OAAO,MAAA,OAAA,SAAA,EAAG,cAAa;AAC9F;AAEO,kBAAkB,OAA6B;AACpD,SAAO,UAAA,OAAA,SAAA,MAAO,SAAA,OAAe;AAC/B;AAEO,IAAM,aAAa,CAAC,OAAoC;AAC7D,SAAO,OAAA,OAAA,SAAA,GAAI,aAAa,UAAA,MAAe,QAAQ,CAAC,CAAC,OAAA,OAAA,SAAA,GAAI,aAAa,eAAA,OAAqB;AACzF;AC5CO,wBAAwB,IAA0B;AACvD,QAAM,EAAE,UAAU,WAAW,cAAc,kBAAiB,EAAE;AAC9D,SAAO,6BAA6B,KAAK,WAAW,YAAY,SAAS;AAC3E;AAEO,yBAAyB,IAA8B;AAC5D,MAAI,CAAC,QAAQ,QAAQ,WAAW,EAAE,SAAS,YAAY,EAAE,CAAC,GAAG;AAC3D,WAAO,iBAAiB,EAAE,EAAE;EAC9B;AAEA,MAAI,cAAc,EAAE,KAAK,eAAe,EAAE,GAAG;AAC3C,WAAO;EACT;AAEA,SAAO,gBAAgB,UAAU,EAAE,CAAC;AACtC;AFNA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,YAAY,SAAS,SAAS,SAAS,QAAQ,SAAS,UAAU,UAAU,OAAO,CAAC;AAEhH,2BAA2B,MAA6B;AAd/D,MAAA;AAeE,QAAM,EAAE,UAAU,SAAS,WAAW,OAAO,mBAAmB,QAAA,OAAA,OAAQ,CAAC;AAEzE,QAAM,MAAM,WAAA,OAAA,UAAW;AACvB,QAAM,MAAM,MAAA,OAAA,OAAA,SAAA,IAAK,gBAAL,OAAA,KAAoB;AAEhC,QAAM,WAAW,MAAM,IAAI,IAAI,iBAAiB;AAChD,QAAM,QAAQ,IAAI;AAElB,mCAAiC;AAC/B,QAAI,MAAM,aAAa,aAAa;AAAG;AAEvC,UAAM,KAAK,KACT,SAAS,OAAO,gBAAgB,GAAG,IAAI,aAAa,MAAM,eAAe,GACzE,SAAS,OAAO,YAAY,QAAQ,GACpC,MAAM,MAAM,aAAa,eAAe,MAAM,CAChD;AAEA,WAAO,KAAK,IAAI,MAAM,MAAM,gBAAgB,aAAa,CAAC;EAC5D;AAEA,uCAAqC;AACnC,QAAI,MAAM,aAAa,aAAa;AAAG;AAEvC,QAAI;AACJ,QAAI,QAAQ;AAEZ,QAAI,eAAe,CAAC,OAAkB;AACpC,mBAAa,gBAAgB,GAAE,MAAqB;AAEpD,UAAI,eAAe,SAAS,eAAe,IAAI,MAAM;AACnD;MACF;AACA,cAAQ,GAAE,eAAe,GAAG;IAC9B;AAEA,QAAI,cAAc,CAAC,OAAkB;AACnC,UAAI,GAAE,QAAQ,WAAW,KAAK;AAAgB;AAE9C,UAAI,CAAC,cAAc,eAAe,SAAS,eAAe,IAAI,MAAM;AAClE,WAAE,eAAe;AACjB;MACF;AAEA,UAAI,IAAI,GAAE,eAAe,GAAG;AAC5B,UAAI,YAAY,WAAW;AAC3B,UAAI,SAAS,WAAW,eAAe,WAAW;AAElD,UAAK,aAAa,KAAK,IAAI,SAAW,aAAa,UAAU,IAAI,OAAQ;AACvE,WAAE,eAAe;MACnB;AAEA,cAAQ;IACV;AAEA,QAAI,aAAa,CAAC,OAAkB;AAClC,UAAI,SAAS,GAAE;AACf,UAAI,kBAAkB,IAAI,oBAAoB,CAAC,kBAAkB,IAAI,OAAO,IAAI,GAAG;AACjF,WAAE,eAAe;AACjB,eAAO,MAAM,YAAY;AACzB,eAAO,MAAM;AACb,YAAI,sBAAsB,MAAM;AAC9B,iBAAO,MAAM,YAAY;QAC3B,CAAC;MACH;IACF;AAEA,QAAI,UAAU,CAAC,OAAkB;AAC/B,UAAI,SAAS,GAAE;AACf,UAAI,kBAAkB,IAAI,oBAAoB,CAAC,kBAAkB,IAAI,OAAO,IAAI,GAAG;AACjF,eAAO,MAAM,YAAY;AACzB,YAAI,sBAAsB,MAAM;AAC9B,iBAAO,MAAM,YAAY;AACzB,cAAI,CAAC;AAAU;AAEf,cAAI,SAAS,SAAS,IAAI,aAAa;AACrC,gBAAI,sBAAsB,WAAY;AACpC,yBAAe,QAAQ,EAAE,YAAY,YAAY,CAAC;YACpD,CAAC;UACH,OAAO;AACL,kBAAM,WAAW,MAAM;AACrB,yBAAe,QAAQ,EAAE,YAAY,YAAY,CAAC;YACpD;AACA,wBAAY,UAAU,UAAU,UAAU,EAAE,MAAM,KAAK,CAAC;UAC1D;QACF,CAAC;MACH;IACF;AAEA,QAAI,iBAAiB,MAAM;AACzB,UAAI,SAAS,GAAG,CAAC;IACnB;AAEA,QAAI,UAAU,IAAI;AAClB,QAAI,UAAU,IAAI;AAClB,QAAI,gBAAgB,KAClB,SAAS,OAAO,gBAAgB,GAAG,IAAI,aAAa,MAAM,eAAe,GACzE,SAAS,OAAO,YAAY,QAAQ,GACpC,SAAS,IAAI,MAAM,aAAa,IAAI,WAAW,CACjD;AAEA,QAAI,SAAS,GAAG,CAAC;AAEjB,QAAI,eAAe,KACjB,YAAY,KAAK,cAAc,cAAc,EAAE,SAAS,OAAO,SAAS,KAAK,CAAC,GAC9E,YAAY,KAAK,aAAa,aAAa,EAAE,SAAS,OAAO,SAAS,KAAK,CAAC,GAC5E,YAAY,KAAK,YAAY,YAAY,EAAE,SAAS,OAAO,SAAS,KAAK,CAAC,GAC1E,YAAY,KAAK,SAAS,SAAS,IAAI,GACvC,YAAY,KAAK,UAAU,cAAc,GACzC,MAAM,MAAM,aAAa,eAAe,MAAM,CAChD;AAEA,WAAO,MAAM;AACX,oBAAc;AACd,mBAAa;AACb,UAAI,SAAS,SAAS,OAAO;AAC7B,YAAM,gBAAgB,aAAa;IACrC;EACF;AAEA,MAAI;AAAU,WAAO;AACrB,SAAO,MAAM,IAAI,0BAA0B,IAAI,sBAAsB;AACvE;AAEA,kBAAkB,IAAiB,KAAa,OAAe;AAC7D,MAAI,MAAM,GAAG,MAAM;AACnB,KAAG,MAAM,OAAO;AAChB,SAAO,MAAM;AACX,OAAG,MAAM,OAAO;EAClB;AACF;AK7IO,sBAAsB,OAAc,MAAe;AAH1D,MAAA;AAIE,QAAM,UAAU,MAAM,QAAQ,KAAK,OAAO,IAAI,KAAK,UAAU,CAAC,KAAK,OAAO;AAC1E,QAAM,gBAAiB,MAAA,MAAM,kBAAN,OAAA,KAAuB,KAAK;AACnD,SAAO,QAAQ,MAAM,CAAC,OAAO,CAAC,OAAA,OAAA,SAAA,GAAI,SAAS,aAAA,EAAc;AAC3D;ACJO,IAAM,oBAAkC;EAC7C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,EAAE,KAAK,GAAG;AAEH,kBAAkB,IAAwB,OAAqB;AACpE,QAAM,QAAQ,kBAAiB,EAAE;AACjC,MAAI,CAAC,MAAM,MAAM,iBAAiB,YAAY,MAAM;AAAU,WAAO;AACrE,SAAO,IAAI;AACT,QAAI,SAAS,QAAQ,OAAO;AAAO,aAAO;AAC1C,QAAI,MAAM,iBAAiB,SAAS,MAAM;AAAQ,aAAO;AACzD,SAAK,GAAG;EACV;AACA,SAAO;AACT;AAKO,IAAM,gBAAgB,CAAC,IAAmC,mBAAmB,UAAU;AAC5F,MAAI,CAAC;AAAI,WAAO,CAAC;AACjB,MAAI,MAAM,MAAM,KAAK,GAAG,iBAA8B,iBAAiB,CAAC;AACxE,MAAI,oBAAoB,cAAc,EAAE,GAAG;AACzC,QAAI,QAAQ,EAAE;EAChB;AACA,SAAO,IAAI,OAAO,CAAC,QAAO,YAAY,GAAE,KAAK,CAAC,SAAS,GAAE,CAAC;AAC5D;AAKO,IAAM,cAAc,CAAC,OAA2B;AACrD,MAAI,CAAC,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE;AAAG,WAAO;AACjE,SAAO,MAAA,OAAA,SAAA,GAAI,QAAQ,iBAAA;AACrB;AAKO,IAAM,eAAe,CAAC,IAA4B,mBAAmB,UAAU;AACpF,SAAO,cAAc,IAAI,gBAAgB,EAAE,OAAO,UAAU;AAC9D;AAKO,IAAM,aAAa,CAAC,OAA2B;AACpD,SAAO,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE;AAC3D;AMtDO,kBAAyC,GAAQ,IAAY;AAClE,SAAO,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACxC;AAEO,mBAA0C,GAAQ,IAAY;AACnE,QAAM,OAAO,SAAS,GAAG,EAAE;AAC3B,SAAO,OAAO,EAAE,QAAQ,IAAI,IAAI;AAClC;AAeA,IAAM,eAAe,CAAwB,SAAS;AAhCtD,MAAA,IAAA;AAgCyD,SAAA,MAAA,MAAA,KAAK,QAAQ,cAAb,OAAA,KAA0B,KAAK,gBAA/B,OAAA,KAA8C;AAAA;AAEvG,IAAM,QAAQ,CAAC,WAAmB,WAAkB,UAAU,YAAY,EAAE,WAAW,OAAM,YAAY,CAAC;AAE1G,IAAM,OAAO,CAAI,GAAQ,QAAgB;AACvC,SAAO,EAAE,IAAI,CAAC,GAAG,UAAU,EAAG,MAAK,IAAI,KAAK,CAAC,IAAI,SAAS,EAAE,OAAO;AACrE;AAEO,oBAA2C,GAAQ,MAAc,WAA2B;AACjG,QAAM,QAAQ,YAAY,UAAU,GAAG,SAAS,IAAI;AACpD,MAAI,QAAQ,YAAY,KAAK,GAAG,KAAK,IAAI;AAEzC,QAAM,cAAc,KAAK,WAAW;AAEpC,MAAI,aAAa;AACf,YAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,SAAS;EACtD;AAEA,SAAO,MAAM,KAAK,CAAC,SAAS,MAAM,aAAa,IAAI,GAAG,IAAI,CAAC;AAC7D;AE9CO,0BAA0B,KAAe,eAA0C;AAL1F,MAAA;AAME,QAAM,MAAM,MAAA,IAAI,gBAAJ,OAAA,KAAmB;AAC/B,QAAM,KAAK,CAAC,UAAwB;AAClC,QAAI,MAAM,kBAAkB,IAAI,aAAa;AAC3C,oBAAc,MAAM,MAAM;IAC5B;EACF;AACA,SAAO,YAAY,KAAK,eAAe,EAAE;AAC3C;AMCO,yBAAgD,QAAa,SAA2B;AAC7F,QAAM,EAAE,OAAA,QAAO,UAAU,KAAK,UAAU,QAAQ;AAEhD,QAAM,SAAS,OAAM,YAAY;AACjC,QAAM,aAAa,OAAO,SAAS,KAAK,MAAM,KAAK,MAAM,EAAE,MAAM,CAAC,SAAS,SAAS,OAAO,EAAE;AAE7F,QAAM,SAAQ,aAAa,OAAO,KAAK;AAEvC,MAAI,QAAQ,OAAO,MAAM;AAEzB,QAAM,QAAO,WAAW,OAAO,QAAO,QAAQ;AAE9C,qBAAmB;AACjB,iBAAa,OAAM,KAAK;AACxB,WAAM,QAAQ;EAChB;AAEA,kBAAgB,OAAe;AAC7B,WAAM,YAAY;AAClB,YAAQ;AAER,QAAI,UAAU,IAAI;AAChB,aAAM,QAAQ,CAAC,WAAW,MAAM;AAC9B,eAAO,EAAE;AACT,gBAAQ;MACV,GAAG,OAAO;IACZ;EACF;AAEA,SAAO,MAAM;AAEb,SAAO;AACT;AAEA,gBAAgB,iBAAiB;EAC/B,WAAW;EACX,OAAO;AACT;;;AClDA;;;ACsEO,0BAA0B,IAA2C;AAC1E,SAAO,EAAE,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,SAAS,GAAG;AACrE;AAEO,IAAM,gBAAgB,iBAAiB,CAAC,MAAM,CAAC;;;AEpE/C,IAAM,QAAQ,CAAI,MAA0B,EAAE;AAE9C,IAAM,OAAO,CAAI,MAA0B,EAAE,EAAE,SAAS;AAyBxD,mBAAsB,GAAQ,KAAa,OAAqB,CAAC,GAAW;AACjF,QAAM,EAAE,OAAO,GAAG,OAAO,SAAS;AAClC,QAAM,QAAO,MAAM;AACnB,QAAM,MAAM,EAAE;AACd,QAAM,QAAO,MAAM;AACnB,MAAI,QAAQ;AAAI,WAAO,OAAO,IAAI,IAAI;AACtC,MAAI,QAAO;AAAG,WAAO,OAAO,QAAO;AACnC,MAAI,SAAQ;AAAK,WAAO,OAAO,IAAI,MAAM,MAAM,MAAM;AACrD,SAAO;AACT;AAEO,cAAiB,GAAQ,KAAa,OAAqB,CAAC,GAAkB;AACnF,SAAO,EAAE,UAAU,GAAG,KAAK,IAAI;AACjC;AC/CO,IAAM,WAAU,CACrB,MACG,MAC+E;AAClF,QAAM,MAAM,OAAO,MAAM,aAAa,EAAE,GAAG,CAAC,IAAI;AAChD,SAAO,OAAA,OAAA,MAAO;AAChB;AAEO,IAAM,OAAO,CAAI,MAAkB;;;AGJnC,IAAM,MAAM;AAAA,EACjB,QAAQ,CAAC,QAAU;AALrB;AAKwB,qBAAI,QAAJ,YAAW;AAAA;AAAA,EACjC,aAAa,CAAC,QAAa,IAAI,OAAO,GAAG,EAAE;AAAA,EAC3C,aAAa,CAAC,QAAU;AAP1B;AAO6B,qBAAI,aAAJ,YAAgB,IAAI,OAAO,GAAG;AAAA;AAAA,EAEzD,aAAa,CAAC,QAAU;AAT1B;AAS6B,2BAAI,QAAJ,mBAAS,WAAT,YAAmB,WAAW,IAAI;AAAA;AAAA,EAC7D,cAAc,CAAC,QAAU;AAV3B;AAU8B,2BAAI,QAAJ,mBAAS,YAAT,YAAoB,WAAW,IAAI;AAAA;AAAA,EAC/D,cAAc,CAAC,QAAU;AAX3B;AAW8B,2BAAI,QAAJ,mBAAS,YAAT,YAAoB,WAAW,IAAI;AAAA;AAAA,EAC/D,iBAAiB,CAAC,QAAa,WAAW,IAAI;AAAA,EAC9C,YAAY,CAAC,QAAa,WAAW,IAAI;AAAA,EACzC,YAAY,CAAC,QAAU;AAdzB;AAc4B,2BAAI,QAAJ,mBAAS,UAAT,YAAkB,WAAW,IAAI;AAAA;AAAA,EAC3D,kBAAkB,CAAC,QAAU;AAf/B;AAekC,2BAAI,QAAJ,mBAAS,gBAAT,YAAwB,WAAW,IAAI;AAAA;AAAA,EACvE,kBAAkB,CAAC,QAAU;AAhB/B;AAgBkC,2BAAI,QAAJ,mBAAS,aAAT,YAAqB,WAAW,IAAI;AAAA;AAAA,EAEpE,aAAa,CAAC,QAAa,IAAI,YAAY,GAAG,EAAE,eAAe,IAAI,YAAY,GAAG,CAAC;AAAA,EACnF,cAAc,CAAC,QAAa,IAAI,YAAY,GAAG,EAAE,eAAe,IAAI,aAAa,GAAG,CAAC;AAAA,EACrF,cAAc,CAAC,QAAa,IAAI,YAAY,GAAG,EAAE,eAAe,IAAI,aAAa,GAAG,CAAC;AAAA,EACrF,iBAAiB,CAAC,QAAa,IAAI,YAAY,GAAG,EAAE,eAAe,IAAI,gBAAgB,GAAG,CAAC;AAAA,EAC3F,YAAY,CAAC,QAAa,IAAI,YAAY,GAAG,EAAE,eAAe,IAAI,WAAW,GAAG,CAAC;AAAA,EACjF,kBAAkB,CAAC,QAAa,IAAI,YAAY,GAAG,EAAE,eAAe,IAAI,iBAAiB,GAAG,CAAC;AAAA,EAE7F,iBAAiB,CAAC,QAAa,cAAc,IAAI,aAAa,GAAG,CAAC;AAAA,EAClE,qBAAqB,CAAC,QAAa,IAAI,gBAAgB,GAAG,EAAE;AAAA,EAE5D,mBAAmB,CAAC,QAAa,aAAa,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,EACnE,gBAAgB,CAAC,QAAa;AAC5B,UAAM,KAAK,IAAI,aAAa,GAAG;AAC/B,WAAO,KAAK,aAAa,EAAE,IAAI,CAAC;AAAA,EAClC;AAAA,EACA,oBAAoB,CAAC,QAAa,MAAM,IAAI,eAAe,GAAG,CAAC;AAAA,EAC/D,mBAAmB,CAAC,QAAa,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,EAC7D,mBAAmB,CAAC,QAAU;AAnChC;AAmCmC,0BAAQ,IAAI,cAAc,MAA1B,YAA+B,IAAI,oBAAoB,GAAG;AAAA;AAC7F;;;AP9BO,iBAAuD,OAAc,MAAY,YAAY,eAAe;AACjH,QAAM,SAAS,MAAM,QAAQ,MAAM;AACnC,QAAM,kBAAkB,MAAM,QAAQ;AACtC,QAAM,eAAe,mBAAmB;AAAA,IACtC,UAAU,CAAC,CAAC,MAAM,QAAQ;AAAA,IAC1B,WAAW,MAAM,QAAQ;AAAA,EAC3B,CAAC;AAED,SAAO;AAAA,IACL,WAAW,MAAM,QAAQ;AAAA,IACzB;AAAA,IACA,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAAA,IACA,QAAQ;AACN,WAAK,OAAO;AAAA,IACd;AAAA,IAEA,YAAY,UAAU,QAAW;AAAA,MAC/B,IAAI,IAAI,WAAW,MAAM,OAAO;AAAA,MAChC,aAAa;AAAA,MACb,OAAO,aAAa;AAAA,IACtB,CAAC;AAAA,IAED,iBAAiB,UAAU,QAAW;AAAA,MACpC,aAAa;AAAA,MACb,OAAO,aAAa;AAAA,IACtB,CAAC;AAAA,IAED,aAAa,UAAU,QAAW;AAAA,MAChC,aAAa;AAAA,MACb,IAAI,IAAI,YAAY,MAAM,OAAO;AAAA,IACnC,CAAC;AAAA,IAED,cAAc,UAAU,OAAU;AAAA,MAChC,aAAa;AAAA,MACb,MAAM;AAAA,MACN,kBAAkB,MAAM,QAAQ;AAAA,MAChC,IAAI,IAAI,aAAa,MAAM,OAAO;AAAA,MAClC,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,iBAAiB,SAAS,MAAM;AAAA,MAChC,iBAAiB,IAAI,aAAa,MAAM,OAAO;AAAA,MAC/C,UAAU;AACR,aAAK,eAAe;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,IAED,iBAAiB,UAAU,QAAW;AAAA,MACpC,IAAI,IAAI,gBAAgB,MAAM,OAAO;AAAA,MACrC,aAAa;AAAA,MACb,OAAO,aAAa;AAAA,IACtB,CAAC;AAAA,IAED,cAAc,UAAU,QAAW;AAAA,MACjC,aAAa;AAAA,MACb,IAAI,IAAI,aAAa,MAAM,OAAO;AAAA,MAClC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,mBAAmB,MAAM,QAAQ,kBAAkB,IAAI,WAAW,MAAM,OAAO,IAAI;AAAA,MACnF,oBAAoB,MAAM,QAAQ,wBAAwB,IAAI,iBAAiB,MAAM,OAAO,IAAI;AAAA,MAChG,kBAAkB,MAAM,QAAQ;AAAA,MAChC,UAAU,OAAO;AACf,cAAM,SAAsB;AAAA,UAC1B,OAAO,QAAO;AACZ,iBAAK,QAAQ;AACb,mBAAM,gBAAgB;AAAA,UACxB;AAAA,UACA,IAAI,QAAO;AACT,kBAAM,OAAO,OAAM,WAAW,cAAc;AAC5C,iBAAK,EAAE,MAAM,gBAAgB,MAAM,OAAM,eAAe,EAAE,CAAC;AAAA,UAC7D;AAAA,QACF;AAEA,cAAM,OAAO,OAAO,MAAM;AAC1B,qCAAO;AAAA,MACT;AAAA,MACA,OAAO,OAAO;AApFpB;AAqFQ,cAAM,cAAc,aAAa,OAAO;AAAA,UACtC,SAAS,CAAC,IAAI,aAAa,MAAM,OAAO,GAAG,IAAI,aAAa,MAAM,OAAO,CAAC;AAAA,UAC1E,UAAU;AAAA,QACZ,CAAC;AAED,YAAI,aAAa;AACf,gBAAM,KAAM,YAAM,kBAAN,YAAuB;AACnC,eAAK,EAAE,MAAM,oBAAoB,WAAW,YAAY,EAAE,EAAE,CAAC;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IAED,YAAY,UAAU,QAAW;AAAA,MAC/B,aAAa;AAAA,MACb,IAAI,IAAI,WAAW,MAAM,OAAO;AAAA,IAClC,CAAC;AAAA,IAED,kBAAkB,UAAU,QAAW;AAAA,MACrC,aAAa;AAAA,MACb,IAAI,IAAI,iBAAiB,MAAM,OAAO;AAAA,IACxC,CAAC;AAAA,IAED,kBAAkB,UAAU,OAAU;AAAA,MACpC,aAAa;AAAA,MACb,IAAI,IAAI,iBAAiB,MAAM,OAAO;AAAA,MACtC,MAAM;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AACR,aAAK,OAAO;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AQrHA;AASA;AAEA;AACA;AAIA,IAAM,EAAE,KAAK,OAAO;AAEb,iBAAiB,MAA0B,CAAC,GAAG;AACpD,SAAO,cACL;AAAA,IACE,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,uBAAuB;AAAA,MACvB,kBAAkB;AAAA,MAClB,KAAK;AAAA,MACL,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,OAAO;AAAA,MACP,aAAa;AAAA,QACX,WAAW;AAAA,SACR,IAAI;AAAA,MAET,kBAAkB;AAAA,OACf;AAAA,IAGL,UAAU;AAAA,MACR,kBAAkB,CAAC,SAAQ,CAAC,CAAC,KAAI,SAAS,CAAC,CAAC,KAAI;AAAA,IAClD;AAAA,IAEA,QAAQ;AAAA,MACN,SAAS;AAAA,QACP,IAAI;AAAA,UACF,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,SAAS,CAAC,iBAAiB,uBAAuB;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ;AAAA,QACN,OAAO,CAAC,oBAAoB,eAAe;AAAA,QAC3C,IAAI;AAAA,UACF,eAAe;AAAA,UACf,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM;AAAA,QACJ,YAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,UACZ;AAAA,YACE,OAAO;AAAA,YACP,SAAS,CAAC,mBAAmB,cAAc;AAAA,UAC7C;AAAA,UACA,EAAE,SAAS,CAAC,gBAAgB,cAAc,EAAE;AAAA,QAC9C,CAAC;AAAA,QACD,IAAI;AAAA,UACF,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,UACA,eAAe;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,UACA,QAAQ;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,UACA,KAAK;AAAA,YACH,OAAO,IAAI,yBAAyB,eAAe,WAAW;AAAA,YAC9D,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,UACA,WAAW;AAAA,YACT,OAAO,IAAI,GAAG,0BAA0B,kBAAkB,GAAG,eAAe,WAAW;AAAA,YACvF,QAAQ;AAAA,YACR,SAAS;AAAA,UACX;AAAA,UACA,kBAAkB;AAAA,YAChB;AAAA,cACE,OAAO,IAAI,eAAe,0BAA0B;AAAA,cACpD,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,YACX;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GACA;AAAA,IACE,YAAY;AAAA,MACV,iBAAiB,MAAK;AACpB,aAAI,mBAAmB,KAAI,YAAY;AACvC,cAAM,WAAW,KAAI,mBAAmB,IAAI,YAAY,IAAG,IAAI,IAAI,aAAa,IAAG;AACnF,eAAO,aAAa,UAAU,IAAI,gBAAgB,IAAG,GAAG,iCACnD,KAAI,cAD+C;AAAA,UAEtD,WAAW,MAAM;AACf,iBAAI,mBAAmB,KAAK;AAC5B,iBAAI,sBAAsB;AAAA,UAC5B;AAAA,UACA,YAAY;AACV,iBAAI,mBAAmB;AACvB,iBAAI,sBAAsB;AAAA,UAC5B;AAAA,QACF,EAAC;AAAA,MACH;AAAA,MACA,iBAAiB,MAAK;AACpB,eAAO,iBAAiB,IAAI,OAAO,IAAG,GAAG,CAAC,OAAO;AAC/C,eAAI,kBAAkB,IAAI,EAAE;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,4BAA4B,MAAK;AAC/B,cAAM,KAAK,IAAI,aAAa,IAAG;AAC/B,eAAO,yBAAyB,IAAI;AAAA,UAClC,UAAU,IAAI,OAAO,IAAG;AAAA,UACxB,UAAU,CAAC,KAAI;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,MACA,iBAAiB,MAAK;AACpB,YAAI,CAAC,KAAI;AAAO;AAChB,YAAI;AACJ,iBAAS,MAAM;AACb,mBAAS,WAAW,CAAC,IAAI,aAAa,IAAG,GAAG,IAAI,aAAa,IAAG,CAAC,CAAC;AAAA,QACpE,CAAC;AACD,eAAO,MAAM;AAAA,MACf;AAAA,MACA,cAAc,MAAK;AACjB,eAAO,kBAAkB;AAAA,UACvB,gBAAgB;AAAA,UAChB,UAAU,CAAC,KAAI;AAAA,UACf,UAAU,IAAI,OAAO,IAAG;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,MACA,UAAU,MAAK;AACb,YAAI,CAAC,KAAI;AAAO;AAChB,YAAI;AACJ,iBAAS,MAAM;AACb,gBAAM,KAAK,IAAI,aAAa,IAAG;AAC/B,cAAI,CAAC;AAAI;AACT,iBAAO,gBAAgB,IAAI;AAAA,YACzB,mBAAmB;AAAA,YACnB,mBAAmB;AAAA,YACnB,yBAAyB;AAAA,YACzB,UAAU,IAAI,OAAO,IAAG;AAAA,YACxB,eAAe;AAAA,YACf,cAAc,SAAQ,KAAI,cAAc;AAAA,UAC1C,CAAC;AACD,cAAI;AACF,iBAAK,SAAS;AAAA,UAChB,SAAQ,IAAN;AAAA,UAAO;AAAA,QACX,CAAC;AACD,eAAO,MAAM,6BAAM;AAAA,MACrB;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,YAAY,CAAC,SAAQ,CAAC,CAAC,KAAI;AAAA,MAC3B,WAAW,CAAC,SAAQ,CAAC,CAAC,KAAI;AAAA,MAC1B,OAAO,CAAC,SAAQ,CAAC,CAAC,KAAI;AAAA,MACtB,WAAW,CAAC,SAAQ,CAAC,CAAC,KAAI;AAAA,MAC1B,0BAA0B,CAAC,MAAM,QAAQ,IAAI;AAAA,MAC7C,aAAa,CAAC,SAAQ,CAAC,CAAC,KAAI;AAAA,MAC5B,kBAAkB,CAAC,SAAQ,IAAI,aAAa,IAAG,MAAM,IAAI,YAAY,IAAG;AAAA,MACxE,wBAAwB,CAAC,SAAQ,IAAI,mBAAmB,IAAG,MAAM,IAAI,YAAY,IAAG;AAAA,MACpF,uBAAuB,CAAC,SAAQ,IAAI,kBAAkB,IAAG,MAAM,IAAI,YAAY,IAAG;AAAA,IACpF;AAAA,IACA,SAAS;AAAA,MACP,sBAAsB,MAAK;AACzB,YAAI,MAAM;AACR,eAAI,mBAAmB,CAAC,CAAC,IAAI,YAAY,IAAG;AAC5C,eAAI,kBAAkB,CAAC,CAAC,IAAI,WAAW,IAAG;AAC1C,eAAI,wBAAwB,CAAC,CAAC,IAAI,iBAAiB,IAAG;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,MACA,cAAc,MAAK,KAAK;AACtB,YAAI,IAAI;AAAK,eAAI,MAAM,IAAI,IAAI,GAAG;AAClC,YAAI,IAAI;AAAM,eAAI,WAAW,IAAI,IAAI,IAAI;AACzC,aAAI,MAAM,IAAI;AAAA,MAChB;AAAA,MACA,iBAAiB,MAAK;AACpB,aAAI,kBAAkB;AAAA,MACxB;AAAA,MACA,aAAa,MAAK;AAChB,YAAI,MAAM;AAlNpB;AAmNY,oBAAI,aAAa,IAAG,MAApB,mBAAuB;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MACA,gBAAgB,MAAK;AACnB,YAAI,MAAM;AAvNpB;AAwNY,oBAAI,kBAAkB,IAAG,MAAzB,mBAA4B;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,aAAa,MAAK;AAChB,YAAI,MAAM;AA5NpB;AA6NY,oBAAI,aAAa,IAAG,MAApB,mBAAuB;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MACA,aAAa,MAAK,KAAK;AAhO/B;AAiOU,YAAI,IAAI,SAAS,SAAS;AACxB,qBAAI,WAAJ;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc,MAAK,KAAK;AArOhC;AAsOU,YAAI,IAAI,SAAS,SAAS;AACxB,qBAAI,YAAJ;AAAA,QACF;AAAA,MACF;AAAA,MACA,qCAAqC,MAAK,KAAK;AAC7C,cAAM,UAAU,IAAI,aAAa,IAAG;AACpC,cAAM,MAAM,IAAI,OAAO,IAAG;AAC1B,cAAM,SAAS,IAAI,aAAa,IAAG;AACnC,YAAI,CAAC,WAAW,CAAC;AAAQ;AAEzB,cAAM,eAAe,IAAI,kBAAkB,IAAG;AAC9C,YAAI,iBAAiB,IAAI;AAAe;AAExC,YAAI,YAAY,IAAI,kBAAkB,IAAG;AACzC,YAAI,sBAAsB,KAAK,WAAW,UAAU,QAAQ,MAAM,GAAG,EAAE,MAAM,MAAM,CAAC;AAGpF,YAAI,wBAAwB,SAAS;AACnC,sBAAY,UAAU,OAAO,CAAC,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;AAC3D,gCAAsB,KAAK,WAAW,UAAU,QAAQ,MAAM,GAAG,EAAE,MAAM,MAAM,CAAC;AAAA,QAClF;AAGA,YAAI,CAAC,uBAAuB,wBAAwB;AAAQ;AAG5D,YAAI,eAAe;AACnB,YAAI,MAAM,2DAAqB,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|