(() => { // node_modules/@oddbird/popover-polyfill/dist/popover.js var ToggleEvent = class extends Event { oldState; newState; constructor(type, { oldState = "", newState = "", ...init } = {}) { super(type, init); this.oldState = String(oldState || ""); this.newState = String(newState || ""); } }; var popoverToggleTaskQueue = /* @__PURE__ */ new WeakMap(); function queuePopoverToggleEventTask(element2, oldState, newState) { popoverToggleTaskQueue.set( element2, setTimeout(() => { if (!popoverToggleTaskQueue.has(element2)) return; element2.dispatchEvent( new ToggleEvent("toggle", { cancelable: false, oldState, newState }) ); }, 0) ); } var ShadowRoot2 = globalThis.ShadowRoot || function() { }; var HTMLDialogElement = globalThis.HTMLDialogElement || function() { }; var topLayerElements = /* @__PURE__ */ new WeakMap(); var autoPopoverList = /* @__PURE__ */ new WeakMap(); var visibilityState = /* @__PURE__ */ new WeakMap(); function getPopoverVisibilityState(popover) { return visibilityState.get(popover) || "hidden"; } var popoverInvoker = /* @__PURE__ */ new WeakMap(); function popoverTargetAttributeActivationBehavior(element2) { const popover = element2.popoverTargetElement; if (!(popover instanceof HTMLElement)) { return; } const visibility = getPopoverVisibilityState(popover); if (element2.popoverTargetAction === "show" && visibility === "showing") { return; } if (element2.popoverTargetAction === "hide" && visibility === "hidden") return; if (visibility === "showing") { hidePopover(popover, true, true); } else if (checkPopoverValidity(popover, false)) { popoverInvoker.set(popover, element2); showPopover(popover); } } function checkPopoverValidity(element2, expectedToBeShowing) { if (element2.popover !== "auto" && element2.popover !== "manual") { return false; } if (!element2.isConnected) return false; if (expectedToBeShowing && getPopoverVisibilityState(element2) !== "showing") { return false; } if (!expectedToBeShowing && getPopoverVisibilityState(element2) !== "hidden") { return false; } if (element2 instanceof HTMLDialogElement && element2.hasAttribute("open")) { return false; } if (document.fullscreenElement === element2) return false; return true; } function getStackPosition(popover) { if (!popover) return 0; return Array.from(autoPopoverList.get(popover.ownerDocument) || []).indexOf( popover ) + 1; } function topMostClickedPopover(target) { const clickedPopover = nearestInclusiveOpenPopover(target); const invokerPopover = nearestInclusiveTargetPopoverForInvoker(target); if (getStackPosition(clickedPopover) > getStackPosition(invokerPopover)) { return clickedPopover; } return invokerPopover; } function topMostAutoPopover(document2) { const documentPopovers = autoPopoverList.get(document2); for (const popover of documentPopovers || []) { if (!popover.isConnected) { documentPopovers.delete(popover); } else { return popover; } } return null; } function getRootNode(node) { if (typeof node.getRootNode === "function") { return node.getRootNode(); } if (node.parentNode) return getRootNode(node.parentNode); return node; } function nearestInclusiveOpenPopover(node) { while (node) { if (node instanceof HTMLElement && node.popover === "auto" && visibilityState.get(node) === "showing") { return node; } node = node instanceof Element && node.assignedSlot || node.parentElement || getRootNode(node); if (node instanceof ShadowRoot2) node = node.host; if (node instanceof Document) return; } } function nearestInclusiveTargetPopoverForInvoker(node) { while (node) { const nodePopover = node.popoverTargetElement; if (nodePopover instanceof HTMLElement) return nodePopover; node = node.parentElement || getRootNode(node); if (node instanceof ShadowRoot2) node = node.host; if (node instanceof Document) return; } } function topMostPopoverAncestor(newPopover) { const popoverPositions = /* @__PURE__ */ new Map(); let i = 0; for (const popover of autoPopoverList.get(newPopover.ownerDocument) || []) { popoverPositions.set(popover, i); i += 1; } popoverPositions.set(newPopover, i); i += 1; let topMostPopoverAncestor22 = null; function checkAncestor(candidate) { const candidateAncestor = nearestInclusiveOpenPopover(candidate); if (candidateAncestor === null) return null; const candidatePosition = popoverPositions.get(candidateAncestor); if (topMostPopoverAncestor22 === null || popoverPositions.get(topMostPopoverAncestor22) < candidatePosition) { topMostPopoverAncestor22 = candidateAncestor; } } checkAncestor(newPopover.parentElement || getRootNode(newPopover)); return topMostPopoverAncestor22; } function isFocusable(focusTarget) { if (focusTarget.hidden || focusTarget instanceof ShadowRoot2) return false; if (focusTarget instanceof HTMLButtonElement || focusTarget instanceof HTMLInputElement || focusTarget instanceof HTMLSelectElement || focusTarget instanceof HTMLTextAreaElement || focusTarget instanceof HTMLOptGroupElement || focusTarget instanceof HTMLOptionElement || focusTarget instanceof HTMLFieldSetElement) { if (focusTarget.disabled) return false; } if (focusTarget instanceof HTMLInputElement && focusTarget.type === "hidden") { return false; } if (focusTarget instanceof HTMLAnchorElement && focusTarget.href === "") { return false; } return typeof focusTarget.tabIndex === "number" && focusTarget.tabIndex !== -1; } function focusDelegate(focusTarget) { if (focusTarget.shadowRoot && focusTarget.shadowRoot.delegatesFocus !== true) { return null; } let whereToLook = focusTarget; if (whereToLook.shadowRoot) { whereToLook = whereToLook.shadowRoot; } let autoFocusDelegate = whereToLook.querySelector("[autofocus]"); if (autoFocusDelegate) { return autoFocusDelegate; } else { const slots = whereToLook.querySelectorAll("slot"); for (const slot of slots) { const assignedElements = slot.assignedElements({ flatten: true }); for (const el of assignedElements) { if (el.hasAttribute("autofocus")) { return el; } else { autoFocusDelegate = el.querySelector("[autofocus]"); if (autoFocusDelegate) { return autoFocusDelegate; } } } } } const walker2 = focusTarget.ownerDocument.createTreeWalker( whereToLook, NodeFilter.SHOW_ELEMENT ); let descendant = walker2.currentNode; while (descendant) { if (isFocusable(descendant)) { return descendant; } descendant = walker2.nextNode(); } } function popoverFocusingSteps(subject) { focusDelegate(subject)?.focus(); } var previouslyFocusedElements = /* @__PURE__ */ new WeakMap(); function showPopover(element2) { if (!checkPopoverValidity(element2, false)) { return; } const document2 = element2.ownerDocument; if (!element2.dispatchEvent( new ToggleEvent("beforetoggle", { cancelable: true, oldState: "closed", newState: "open" }) )) { return; } if (!checkPopoverValidity(element2, false)) { return; } let shouldRestoreFocus = false; if (element2.popover === "auto") { const originalType = element2.getAttribute("popover"); const ancestor = topMostPopoverAncestor(element2) || document2; hideAllPopoversUntil(ancestor, false, true); if (originalType !== element2.getAttribute("popover") || !checkPopoverValidity(element2, false)) { return; } } if (!topMostAutoPopover(document2)) { shouldRestoreFocus = true; } previouslyFocusedElements.delete(element2); const originallyFocusedElement = document2.activeElement; element2.classList.add(":popover-open"); visibilityState.set(element2, "showing"); if (!topLayerElements.has(document2)) { topLayerElements.set(document2, /* @__PURE__ */ new Set()); } topLayerElements.get(document2).add(element2); popoverFocusingSteps(element2); if (element2.popover === "auto") { if (!autoPopoverList.has(document2)) { autoPopoverList.set(document2, /* @__PURE__ */ new Set()); } autoPopoverList.get(document2).add(element2); setInvokerAriaExpanded(popoverInvoker.get(element2), true); } if (shouldRestoreFocus && originallyFocusedElement && element2.popover === "auto") { previouslyFocusedElements.set(element2, originallyFocusedElement); } queuePopoverToggleEventTask(element2, "closed", "open"); } function hidePopover(element2, focusPreviousElement = false, fireEvents = false) { if (!checkPopoverValidity(element2, true)) { return; } const document2 = element2.ownerDocument; if (element2.popover === "auto") { hideAllPopoversUntil(element2, focusPreviousElement, fireEvents); if (!checkPopoverValidity(element2, true)) { return; } } setInvokerAriaExpanded(popoverInvoker.get(element2), false); popoverInvoker.delete(element2); if (fireEvents) { element2.dispatchEvent( new ToggleEvent("beforetoggle", { oldState: "open", newState: "closed" }) ); if (!checkPopoverValidity(element2, true)) { return; } } topLayerElements.get(document2)?.delete(element2); autoPopoverList.get(document2)?.delete(element2); element2.classList.remove(":popover-open"); visibilityState.set(element2, "hidden"); if (fireEvents) { queuePopoverToggleEventTask(element2, "open", "closed"); } const previouslyFocusedElement = previouslyFocusedElements.get(element2); if (previouslyFocusedElement) { previouslyFocusedElements.delete(element2); if (focusPreviousElement) { previouslyFocusedElement.focus(); } } } function closeAllOpenPopovers(document2, focusPreviousElement = false, fireEvents = false) { let popover = topMostAutoPopover(document2); while (popover) { hidePopover(popover, focusPreviousElement, fireEvents); popover = topMostAutoPopover(document2); } } function hideAllPopoversUntil(endpoint, focusPreviousElement, fireEvents) { const document2 = endpoint.ownerDocument || endpoint; if (endpoint instanceof Document) { return closeAllOpenPopovers(document2, focusPreviousElement, fireEvents); } let lastToHide = null; let foundEndpoint = false; for (const popover of autoPopoverList.get(document2) || []) { if (popover === endpoint) { foundEndpoint = true; } else if (foundEndpoint) { lastToHide = popover; break; } } if (!foundEndpoint) { return closeAllOpenPopovers(document2, focusPreviousElement, fireEvents); } while (lastToHide && getPopoverVisibilityState(lastToHide) === "showing" && autoPopoverList.get(document2)?.size) { hidePopover(lastToHide, focusPreviousElement, fireEvents); } } var popoverPointerDownTargets = /* @__PURE__ */ new WeakMap(); function lightDismissOpenPopovers(event) { if (!event.isTrusted) return; const target = event.composedPath()[0]; if (!target) return; const document2 = target.ownerDocument; const topMostPopover = topMostAutoPopover(document2); if (!topMostPopover) return; const ancestor = topMostClickedPopover(target); if (ancestor && event.type === "pointerdown") { popoverPointerDownTargets.set(document2, ancestor); } else if (event.type === "pointerup") { const sameTarget = popoverPointerDownTargets.get(document2) === ancestor; popoverPointerDownTargets.delete(document2); if (sameTarget) { hideAllPopoversUntil(ancestor || document2, false, true); } } } var initialAriaExpandedValue = /* @__PURE__ */ new WeakMap(); function setInvokerAriaExpanded(el, force = false) { if (!el) return; if (!initialAriaExpandedValue.has(el)) { initialAriaExpandedValue.set(el, el.getAttribute("aria-expanded")); } const popover = el.popoverTargetElement; if (popover instanceof HTMLElement && popover.popover === "auto") { el.setAttribute("aria-expanded", String(force)); } else { const initialValue = initialAriaExpandedValue.get(el); if (!initialValue) { el.removeAttribute("aria-expanded"); } else { el.setAttribute("aria-expanded", initialValue); } } } var ShadowRoot22 = globalThis.ShadowRoot || function() { }; function isSupported() { return typeof HTMLElement !== "undefined" && typeof HTMLElement.prototype === "object" && "popover" in HTMLElement.prototype; } function patchSelectorFn(object, name, mapper) { const original = object[name]; Object.defineProperty(object, name, { value(selector) { return original.call(this, mapper(selector)); } }); } var nonEscapedPopoverSelector = /(^|[^\\]):popover-open\b/g; function hasLayerSupport() { return typeof globalThis.CSSLayerBlockRule === "function"; } function getStyles() { const useLayer = hasLayerSupport(); return ` ${useLayer ? "@layer popover-polyfill {" : ""} :where([popover]) { position: fixed; z-index: 2147483647; inset: 0; padding: 0.25em; width: fit-content; height: fit-content; border-width: initial; border-color: initial; border-image: initial; border-style: solid; background-color: canvas; color: canvastext; overflow: auto; margin: auto; } :where([popover]:not(.\\:popover-open)) { display: none; } :where(dialog[popover].\\:popover-open) { display: block; } :where(dialog[popover][open]) { display: revert; } :where([anchor].\\:popover-open) { inset: auto; } :where([anchor]:popover-open) { inset: auto; } @supports not (background-color: canvas) { :where([popover]) { background-color: white; color: black; } } @supports (width: -moz-fit-content) { :where([popover]) { width: -moz-fit-content; height: -moz-fit-content; } } @supports not (inset: 0) { :where([popover]) { top: 0; left: 0; right: 0; bottom: 0; } } ${useLayer ? "}" : ""} `; } var popoverStyleSheet = null; function injectStyles(root) { const styles = getStyles(); if (popoverStyleSheet === null) { try { popoverStyleSheet = new CSSStyleSheet(); popoverStyleSheet.replaceSync(styles); } catch { popoverStyleSheet = false; } } if (popoverStyleSheet === false) { const sheet = document.createElement("style"); sheet.textContent = styles; if (root instanceof Document) { root.head.prepend(sheet); } else { root.prepend(sheet); } } else { root.adoptedStyleSheets = [popoverStyleSheet, ...root.adoptedStyleSheets]; } } function apply() { if (typeof window === "undefined") return; window.ToggleEvent = window.ToggleEvent || ToggleEvent; function rewriteSelector(selector) { if (selector?.includes(":popover-open")) { selector = selector.replace( nonEscapedPopoverSelector, "$1.\\:popover-open" ); } return selector; } patchSelectorFn(Document.prototype, "querySelector", rewriteSelector); patchSelectorFn(Document.prototype, "querySelectorAll", rewriteSelector); patchSelectorFn(Element.prototype, "querySelector", rewriteSelector); patchSelectorFn(Element.prototype, "querySelectorAll", rewriteSelector); patchSelectorFn(Element.prototype, "matches", rewriteSelector); patchSelectorFn(Element.prototype, "closest", rewriteSelector); patchSelectorFn( DocumentFragment.prototype, "querySelectorAll", rewriteSelector ); Object.defineProperties(HTMLElement.prototype, { popover: { enumerable: true, configurable: true, get() { if (!this.hasAttribute("popover")) return null; const value3 = (this.getAttribute("popover") || "").toLowerCase(); if (value3 === "" || value3 == "auto") return "auto"; return "manual"; }, set(value3) { if (value3 === null) { this.removeAttribute("popover"); } else { this.setAttribute("popover", value3); } } }, showPopover: { enumerable: true, configurable: true, value() { showPopover(this); } }, hidePopover: { enumerable: true, configurable: true, value() { hidePopover(this, true, true); } }, togglePopover: { enumerable: true, configurable: true, value(force) { if (visibilityState.get(this) === "showing" && force === void 0 || force === false) { hidePopover(this, true, true); } else if (force === void 0 || force === true) { showPopover(this); } } } }); const originalAttachShadow = Element.prototype.attachShadow; if (originalAttachShadow) { Object.defineProperties(Element.prototype, { attachShadow: { enumerable: true, configurable: true, writable: true, value(options) { const shadowRoot = originalAttachShadow.call(this, options); injectStyles(shadowRoot); return shadowRoot; } } }); } const originalAttachInternals = HTMLElement.prototype.attachInternals; if (originalAttachInternals) { Object.defineProperties(HTMLElement.prototype, { attachInternals: { enumerable: true, configurable: true, writable: true, value() { const internals = originalAttachInternals.call(this); if (internals.shadowRoot) { injectStyles(internals.shadowRoot); } return internals; } } }); } const popoverTargetAssociatedElements = /* @__PURE__ */ new WeakMap(); function applyPopoverInvokerElementMixin(ElementClass) { Object.defineProperties(ElementClass.prototype, { popoverTargetElement: { enumerable: true, configurable: true, set(targetElement) { if (targetElement === null) { this.removeAttribute("popovertarget"); popoverTargetAssociatedElements.delete(this); } else if (!(targetElement instanceof Element)) { throw new TypeError( `popoverTargetElement must be an element or null` ); } else { this.setAttribute("popovertarget", ""); popoverTargetAssociatedElements.set(this, targetElement); } }, get() { if (this.localName !== "button" && this.localName !== "input") { return null; } if (this.localName === "input" && this.type !== "reset" && this.type !== "image" && this.type !== "button") { return null; } if (this.disabled) { return null; } if (this.form && this.type === "submit") { return null; } const targetElement = popoverTargetAssociatedElements.get(this); if (targetElement && targetElement.isConnected) { return targetElement; } else if (targetElement && !targetElement.isConnected) { popoverTargetAssociatedElements.delete(this); return null; } const root = getRootNode(this); const idref = this.getAttribute("popovertarget"); if ((root instanceof Document || root instanceof ShadowRoot22) && idref) { return root.getElementById(idref) || null; } return null; } }, popoverTargetAction: { enumerable: true, configurable: true, get() { const value3 = (this.getAttribute("popovertargetaction") || "").toLowerCase(); if (value3 === "show" || value3 === "hide") return value3; return "toggle"; }, set(value3) { this.setAttribute("popovertargetaction", value3); } } }); } applyPopoverInvokerElementMixin(HTMLButtonElement); applyPopoverInvokerElementMixin(HTMLInputElement); const handleInvokerActivation = (event) => { const composedPath = event.composedPath(); const target = composedPath[0]; if (!(target instanceof Element) || target?.shadowRoot) { return; } const root = getRootNode(target); if (!(root instanceof ShadowRoot22 || root instanceof Document)) { return; } const invoker = composedPath.find( (el) => el.matches?.("[popovertargetaction],[popovertarget]") ); if (invoker) { popoverTargetAttributeActivationBehavior(invoker); event.preventDefault(); return; } }; const onKeydown = (event) => { const key = event.key; const target = event.target; if (!event.defaultPrevented && target && (key === "Escape" || key === "Esc")) { hideAllPopoversUntil(target.ownerDocument, true, true); } }; const addEventListeners = (root) => { root.addEventListener("click", handleInvokerActivation); root.addEventListener("keydown", onKeydown); root.addEventListener("pointerdown", lightDismissOpenPopovers); root.addEventListener("pointerup", lightDismissOpenPopovers); }; addEventListeners(document); injectStyles(document); } if (!isSupported()) apply(); // node_modules/@oddbird/popover-polyfill/dist/popover-fn.js var ToggleEvent2 = class extends Event { oldState; newState; constructor(type, { oldState = "", newState = "", ...init } = {}) { super(type, init); this.oldState = String(oldState || ""); this.newState = String(newState || ""); } }; var popoverToggleTaskQueue2 = /* @__PURE__ */ new WeakMap(); function queuePopoverToggleEventTask2(element2, oldState, newState) { popoverToggleTaskQueue2.set( element2, setTimeout(() => { if (!popoverToggleTaskQueue2.has(element2)) return; element2.dispatchEvent( new ToggleEvent2("toggle", { cancelable: false, oldState, newState }) ); }, 0) ); } var ShadowRoot3 = globalThis.ShadowRoot || function() { }; var HTMLDialogElement2 = globalThis.HTMLDialogElement || function() { }; var topLayerElements2 = /* @__PURE__ */ new WeakMap(); var autoPopoverList2 = /* @__PURE__ */ new WeakMap(); var visibilityState2 = /* @__PURE__ */ new WeakMap(); function getPopoverVisibilityState2(popover) { return visibilityState2.get(popover) || "hidden"; } var popoverInvoker2 = /* @__PURE__ */ new WeakMap(); function popoverTargetAttributeActivationBehavior2(element2) { const popover = element2.popoverTargetElement; if (!(popover instanceof HTMLElement)) { return; } const visibility = getPopoverVisibilityState2(popover); if (element2.popoverTargetAction === "show" && visibility === "showing") { return; } if (element2.popoverTargetAction === "hide" && visibility === "hidden") return; if (visibility === "showing") { hidePopover2(popover, true, true); } else if (checkPopoverValidity2(popover, false)) { popoverInvoker2.set(popover, element2); showPopover2(popover); } } function checkPopoverValidity2(element2, expectedToBeShowing) { if (element2.popover !== "auto" && element2.popover !== "manual") { return false; } if (!element2.isConnected) return false; if (expectedToBeShowing && getPopoverVisibilityState2(element2) !== "showing") { return false; } if (!expectedToBeShowing && getPopoverVisibilityState2(element2) !== "hidden") { return false; } if (element2 instanceof HTMLDialogElement2 && element2.hasAttribute("open")) { return false; } if (document.fullscreenElement === element2) return false; return true; } function getStackPosition2(popover) { if (!popover) return 0; return Array.from(autoPopoverList2.get(popover.ownerDocument) || []).indexOf( popover ) + 1; } function topMostClickedPopover2(target) { const clickedPopover = nearestInclusiveOpenPopover2(target); const invokerPopover = nearestInclusiveTargetPopoverForInvoker2(target); if (getStackPosition2(clickedPopover) > getStackPosition2(invokerPopover)) { return clickedPopover; } return invokerPopover; } function topMostAutoPopover2(document2) { const documentPopovers = autoPopoverList2.get(document2); for (const popover of documentPopovers || []) { if (!popover.isConnected) { documentPopovers.delete(popover); } else { return popover; } } return null; } function getRootNode2(node) { if (typeof node.getRootNode === "function") { return node.getRootNode(); } if (node.parentNode) return getRootNode2(node.parentNode); return node; } function nearestInclusiveOpenPopover2(node) { while (node) { if (node instanceof HTMLElement && node.popover === "auto" && visibilityState2.get(node) === "showing") { return node; } node = node instanceof Element && node.assignedSlot || node.parentElement || getRootNode2(node); if (node instanceof ShadowRoot3) node = node.host; if (node instanceof Document) return; } } function nearestInclusiveTargetPopoverForInvoker2(node) { while (node) { const nodePopover = node.popoverTargetElement; if (nodePopover instanceof HTMLElement) return nodePopover; node = node.parentElement || getRootNode2(node); if (node instanceof ShadowRoot3) node = node.host; if (node instanceof Document) return; } } function topMostPopoverAncestor2(newPopover) { const popoverPositions = /* @__PURE__ */ new Map(); let i = 0; for (const popover of autoPopoverList2.get(newPopover.ownerDocument) || []) { popoverPositions.set(popover, i); i += 1; } popoverPositions.set(newPopover, i); i += 1; let topMostPopoverAncestor22 = null; function checkAncestor(candidate) { const candidateAncestor = nearestInclusiveOpenPopover2(candidate); if (candidateAncestor === null) return null; const candidatePosition = popoverPositions.get(candidateAncestor); if (topMostPopoverAncestor22 === null || popoverPositions.get(topMostPopoverAncestor22) < candidatePosition) { topMostPopoverAncestor22 = candidateAncestor; } } checkAncestor(newPopover.parentElement || getRootNode2(newPopover)); return topMostPopoverAncestor22; } function isFocusable2(focusTarget) { if (focusTarget.hidden || focusTarget instanceof ShadowRoot3) return false; if (focusTarget instanceof HTMLButtonElement || focusTarget instanceof HTMLInputElement || focusTarget instanceof HTMLSelectElement || focusTarget instanceof HTMLTextAreaElement || focusTarget instanceof HTMLOptGroupElement || focusTarget instanceof HTMLOptionElement || focusTarget instanceof HTMLFieldSetElement) { if (focusTarget.disabled) return false; } if (focusTarget instanceof HTMLInputElement && focusTarget.type === "hidden") { return false; } if (focusTarget instanceof HTMLAnchorElement && focusTarget.href === "") { return false; } return typeof focusTarget.tabIndex === "number" && focusTarget.tabIndex !== -1; } function focusDelegate2(focusTarget) { if (focusTarget.shadowRoot && focusTarget.shadowRoot.delegatesFocus !== true) { return null; } let whereToLook = focusTarget; if (whereToLook.shadowRoot) { whereToLook = whereToLook.shadowRoot; } let autoFocusDelegate = whereToLook.querySelector("[autofocus]"); if (autoFocusDelegate) { return autoFocusDelegate; } else { const slots = whereToLook.querySelectorAll("slot"); for (const slot of slots) { const assignedElements = slot.assignedElements({ flatten: true }); for (const el of assignedElements) { if (el.hasAttribute("autofocus")) { return el; } else { autoFocusDelegate = el.querySelector("[autofocus]"); if (autoFocusDelegate) { return autoFocusDelegate; } } } } } const walker2 = focusTarget.ownerDocument.createTreeWalker( whereToLook, NodeFilter.SHOW_ELEMENT ); let descendant = walker2.currentNode; while (descendant) { if (isFocusable2(descendant)) { return descendant; } descendant = walker2.nextNode(); } } function popoverFocusingSteps2(subject) { focusDelegate2(subject)?.focus(); } var previouslyFocusedElements2 = /* @__PURE__ */ new WeakMap(); function showPopover2(element2) { if (!checkPopoverValidity2(element2, false)) { return; } const document2 = element2.ownerDocument; if (!element2.dispatchEvent( new ToggleEvent2("beforetoggle", { cancelable: true, oldState: "closed", newState: "open" }) )) { return; } if (!checkPopoverValidity2(element2, false)) { return; } let shouldRestoreFocus = false; if (element2.popover === "auto") { const originalType = element2.getAttribute("popover"); const ancestor = topMostPopoverAncestor2(element2) || document2; hideAllPopoversUntil2(ancestor, false, true); if (originalType !== element2.getAttribute("popover") || !checkPopoverValidity2(element2, false)) { return; } } if (!topMostAutoPopover2(document2)) { shouldRestoreFocus = true; } previouslyFocusedElements2.delete(element2); const originallyFocusedElement = document2.activeElement; element2.classList.add(":popover-open"); visibilityState2.set(element2, "showing"); if (!topLayerElements2.has(document2)) { topLayerElements2.set(document2, /* @__PURE__ */ new Set()); } topLayerElements2.get(document2).add(element2); popoverFocusingSteps2(element2); if (element2.popover === "auto") { if (!autoPopoverList2.has(document2)) { autoPopoverList2.set(document2, /* @__PURE__ */ new Set()); } autoPopoverList2.get(document2).add(element2); setInvokerAriaExpanded2(popoverInvoker2.get(element2), true); } if (shouldRestoreFocus && originallyFocusedElement && element2.popover === "auto") { previouslyFocusedElements2.set(element2, originallyFocusedElement); } queuePopoverToggleEventTask2(element2, "closed", "open"); } function hidePopover2(element2, focusPreviousElement = false, fireEvents = false) { if (!checkPopoverValidity2(element2, true)) { return; } const document2 = element2.ownerDocument; if (element2.popover === "auto") { hideAllPopoversUntil2(element2, focusPreviousElement, fireEvents); if (!checkPopoverValidity2(element2, true)) { return; } } setInvokerAriaExpanded2(popoverInvoker2.get(element2), false); popoverInvoker2.delete(element2); if (fireEvents) { element2.dispatchEvent( new ToggleEvent2("beforetoggle", { oldState: "open", newState: "closed" }) ); if (!checkPopoverValidity2(element2, true)) { return; } } topLayerElements2.get(document2)?.delete(element2); autoPopoverList2.get(document2)?.delete(element2); element2.classList.remove(":popover-open"); visibilityState2.set(element2, "hidden"); if (fireEvents) { queuePopoverToggleEventTask2(element2, "open", "closed"); } const previouslyFocusedElement = previouslyFocusedElements2.get(element2); if (previouslyFocusedElement) { previouslyFocusedElements2.delete(element2); if (focusPreviousElement) { previouslyFocusedElement.focus(); } } } function closeAllOpenPopovers2(document2, focusPreviousElement = false, fireEvents = false) { let popover = topMostAutoPopover2(document2); while (popover) { hidePopover2(popover, focusPreviousElement, fireEvents); popover = topMostAutoPopover2(document2); } } function hideAllPopoversUntil2(endpoint, focusPreviousElement, fireEvents) { const document2 = endpoint.ownerDocument || endpoint; if (endpoint instanceof Document) { return closeAllOpenPopovers2(document2, focusPreviousElement, fireEvents); } let lastToHide = null; let foundEndpoint = false; for (const popover of autoPopoverList2.get(document2) || []) { if (popover === endpoint) { foundEndpoint = true; } else if (foundEndpoint) { lastToHide = popover; break; } } if (!foundEndpoint) { return closeAllOpenPopovers2(document2, focusPreviousElement, fireEvents); } while (lastToHide && getPopoverVisibilityState2(lastToHide) === "showing" && autoPopoverList2.get(document2)?.size) { hidePopover2(lastToHide, focusPreviousElement, fireEvents); } } var popoverPointerDownTargets2 = /* @__PURE__ */ new WeakMap(); function lightDismissOpenPopovers2(event) { if (!event.isTrusted) return; const target = event.composedPath()[0]; if (!target) return; const document2 = target.ownerDocument; const topMostPopover = topMostAutoPopover2(document2); if (!topMostPopover) return; const ancestor = topMostClickedPopover2(target); if (ancestor && event.type === "pointerdown") { popoverPointerDownTargets2.set(document2, ancestor); } else if (event.type === "pointerup") { const sameTarget = popoverPointerDownTargets2.get(document2) === ancestor; popoverPointerDownTargets2.delete(document2); if (sameTarget) { hideAllPopoversUntil2(ancestor || document2, false, true); } } } var initialAriaExpandedValue2 = /* @__PURE__ */ new WeakMap(); function setInvokerAriaExpanded2(el, force = false) { if (!el) return; if (!initialAriaExpandedValue2.has(el)) { initialAriaExpandedValue2.set(el, el.getAttribute("aria-expanded")); } const popover = el.popoverTargetElement; if (popover instanceof HTMLElement && popover.popover === "auto") { el.setAttribute("aria-expanded", String(force)); } else { const initialValue = initialAriaExpandedValue2.get(el); if (!initialValue) { el.removeAttribute("aria-expanded"); } else { el.setAttribute("aria-expanded", initialValue); } } } var ShadowRoot23 = globalThis.ShadowRoot || function() { }; function isSupported2() { return typeof HTMLElement !== "undefined" && typeof HTMLElement.prototype === "object" && "popover" in HTMLElement.prototype; } function isPolyfilled() { return Boolean( document.body?.showPopover && !/native code/i.test(document.body.showPopover.toString()) ); } function patchSelectorFn2(object, name, mapper) { const original = object[name]; Object.defineProperty(object, name, { value(selector) { return original.call(this, mapper(selector)); } }); } var nonEscapedPopoverSelector2 = /(^|[^\\]):popover-open\b/g; function hasLayerSupport2() { return typeof globalThis.CSSLayerBlockRule === "function"; } function getStyles2() { const useLayer = hasLayerSupport2(); return ` ${useLayer ? "@layer popover-polyfill {" : ""} :where([popover]) { position: fixed; z-index: 2147483647; inset: 0; padding: 0.25em; width: fit-content; height: fit-content; border-width: initial; border-color: initial; border-image: initial; border-style: solid; background-color: canvas; color: canvastext; overflow: auto; margin: auto; } :where([popover]:not(.\\:popover-open)) { display: none; } :where(dialog[popover].\\:popover-open) { display: block; } :where(dialog[popover][open]) { display: revert; } :where([anchor].\\:popover-open) { inset: auto; } :where([anchor]:popover-open) { inset: auto; } @supports not (background-color: canvas) { :where([popover]) { background-color: white; color: black; } } @supports (width: -moz-fit-content) { :where([popover]) { width: -moz-fit-content; height: -moz-fit-content; } } @supports not (inset: 0) { :where([popover]) { top: 0; left: 0; right: 0; bottom: 0; } } ${useLayer ? "}" : ""} `; } var popoverStyleSheet2 = null; function injectStyles2(root) { const styles = getStyles2(); if (popoverStyleSheet2 === null) { try { popoverStyleSheet2 = new CSSStyleSheet(); popoverStyleSheet2.replaceSync(styles); } catch { popoverStyleSheet2 = false; } } if (popoverStyleSheet2 === false) { const sheet = document.createElement("style"); sheet.textContent = styles; if (root instanceof Document) { root.head.prepend(sheet); } else { root.prepend(sheet); } } else { root.adoptedStyleSheets = [popoverStyleSheet2, ...root.adoptedStyleSheets]; } } function apply2() { if (typeof window === "undefined") return; window.ToggleEvent = window.ToggleEvent || ToggleEvent2; function rewriteSelector(selector) { if (selector?.includes(":popover-open")) { selector = selector.replace( nonEscapedPopoverSelector2, "$1.\\:popover-open" ); } return selector; } patchSelectorFn2(Document.prototype, "querySelector", rewriteSelector); patchSelectorFn2(Document.prototype, "querySelectorAll", rewriteSelector); patchSelectorFn2(Element.prototype, "querySelector", rewriteSelector); patchSelectorFn2(Element.prototype, "querySelectorAll", rewriteSelector); patchSelectorFn2(Element.prototype, "matches", rewriteSelector); patchSelectorFn2(Element.prototype, "closest", rewriteSelector); patchSelectorFn2( DocumentFragment.prototype, "querySelectorAll", rewriteSelector ); Object.defineProperties(HTMLElement.prototype, { popover: { enumerable: true, configurable: true, get() { if (!this.hasAttribute("popover")) return null; const value3 = (this.getAttribute("popover") || "").toLowerCase(); if (value3 === "" || value3 == "auto") return "auto"; return "manual"; }, set(value3) { if (value3 === null) { this.removeAttribute("popover"); } else { this.setAttribute("popover", value3); } } }, showPopover: { enumerable: true, configurable: true, value() { showPopover2(this); } }, hidePopover: { enumerable: true, configurable: true, value() { hidePopover2(this, true, true); } }, togglePopover: { enumerable: true, configurable: true, value(force) { if (visibilityState2.get(this) === "showing" && force === void 0 || force === false) { hidePopover2(this, true, true); } else if (force === void 0 || force === true) { showPopover2(this); } } } }); const originalAttachShadow = Element.prototype.attachShadow; if (originalAttachShadow) { Object.defineProperties(Element.prototype, { attachShadow: { enumerable: true, configurable: true, writable: true, value(options) { const shadowRoot = originalAttachShadow.call(this, options); injectStyles2(shadowRoot); return shadowRoot; } } }); } const originalAttachInternals = HTMLElement.prototype.attachInternals; if (originalAttachInternals) { Object.defineProperties(HTMLElement.prototype, { attachInternals: { enumerable: true, configurable: true, writable: true, value() { const internals = originalAttachInternals.call(this); if (internals.shadowRoot) { injectStyles2(internals.shadowRoot); } return internals; } } }); } const popoverTargetAssociatedElements = /* @__PURE__ */ new WeakMap(); function applyPopoverInvokerElementMixin(ElementClass) { Object.defineProperties(ElementClass.prototype, { popoverTargetElement: { enumerable: true, configurable: true, set(targetElement) { if (targetElement === null) { this.removeAttribute("popovertarget"); popoverTargetAssociatedElements.delete(this); } else if (!(targetElement instanceof Element)) { throw new TypeError( `popoverTargetElement must be an element or null` ); } else { this.setAttribute("popovertarget", ""); popoverTargetAssociatedElements.set(this, targetElement); } }, get() { if (this.localName !== "button" && this.localName !== "input") { return null; } if (this.localName === "input" && this.type !== "reset" && this.type !== "image" && this.type !== "button") { return null; } if (this.disabled) { return null; } if (this.form && this.type === "submit") { return null; } const targetElement = popoverTargetAssociatedElements.get(this); if (targetElement && targetElement.isConnected) { return targetElement; } else if (targetElement && !targetElement.isConnected) { popoverTargetAssociatedElements.delete(this); return null; } const root = getRootNode2(this); const idref = this.getAttribute("popovertarget"); if ((root instanceof Document || root instanceof ShadowRoot23) && idref) { return root.getElementById(idref) || null; } return null; } }, popoverTargetAction: { enumerable: true, configurable: true, get() { const value3 = (this.getAttribute("popovertargetaction") || "").toLowerCase(); if (value3 === "show" || value3 === "hide") return value3; return "toggle"; }, set(value3) { this.setAttribute("popovertargetaction", value3); } } }); } applyPopoverInvokerElementMixin(HTMLButtonElement); applyPopoverInvokerElementMixin(HTMLInputElement); const handleInvokerActivation = (event) => { const composedPath = event.composedPath(); const target = composedPath[0]; if (!(target instanceof Element) || target?.shadowRoot) { return; } const root = getRootNode2(target); if (!(root instanceof ShadowRoot23 || root instanceof Document)) { return; } const invoker = composedPath.find( (el) => el.matches?.("[popovertargetaction],[popovertarget]") ); if (invoker) { popoverTargetAttributeActivationBehavior2(invoker); event.preventDefault(); return; } }; const onKeydown = (event) => { const key = event.key; const target = event.target; if (!event.defaultPrevented && target && (key === "Escape" || key === "Esc")) { hideAllPopoversUntil2(target.ownerDocument, true, true); } }; const addEventListeners = (root) => { root.addEventListener("click", handleInvokerActivation); root.addEventListener("keydown", onKeydown); root.addEventListener("pointerdown", lightDismissOpenPopovers2); root.addEventListener("pointerup", lightDismissOpenPopovers2); }; addEventListeners(document); injectStyles2(document); } // js/utils.js function inject(callback) { let styles = callback({ css: (strings, ...values) => `@layer base { ${strings.raw[0] + values.join("")} }` }); if (document.adoptedStyleSheets === void 0) { let styleElement = document.createElement("style"); styleElement.textContent = styles; document.head.appendChild(styleElement); return; } let sheet = new CSSStyleSheet(); sheet.replaceSync(styles); document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]; } function closest(el, condition) { let current = el; while (current) { if (condition(current)) return current; current = current.parentElement; } } function walker(el, callback) { let walker2 = document.createTreeWalker( el, NodeFilter.SHOW_ELEMENT, callback ? { acceptNode: (el2) => { let skipped, rejected; callback(el2, { skip: () => skipped = true, reject: () => rejected = true }); if (skipped) return NodeFilter.FILTER_SKIP; if (rejected) return NodeFilter.FILTER_REJECT; return NodeFilter.FILTER_ACCEPT; } } : {} ); return new Traverse(walker2); } var Traverse = class { constructor(walker2) { this.walker = walker2; } from(el) { this.walker.currentNode = el; return this; } first() { return this.walker.firstChild(); } last() { return this.walker.lastChild(); } next(el) { this.walker.currentNode = el; return this.walker.nextSibling(); } nextOrFirst(el) { let found = this.next(el); if (found) return found; this.walker.currentNode = this.walker.root; return this.first(); } prev(el) { this.walker.currentNode = el; return this.walker.previousSibling(); } prevOrLast(el) { let found = this.prev(el); if (found) return found; this.walker.currentNode = this.walker.root; return this.last(); } closest(el, condition) { let walker2 = this.from(el).walker; while (walker2.currentNode) { if (condition(walker2.currentNode)) return walker2.currentNode; walker2.parentNode(); } } contains(el) { return this.find((i) => i === el); } find(callback) { return this.walk((el, bail) => { callback(el) && bail(el); }); } findOrFirst(callback) { let found = this.find(callback); if (!found) this.walker.currentNode = this.walker.root; return this.first(); } each(callback) { this.walk((el) => callback(el)); } some(callback) { return !!this.find(callback); } every(callback) { let every = true; this.walk((el) => { callback(el) || (every = false); }); return every; } map(callback) { let els = []; this.walk((el) => els.push(callback(el))); return els; } filter(callback) { let els = []; this.walk((el) => callback(el) && els.push(el)); return els; } walk(callback) { let current; let walker2 = this.walker; let bailed; while (walker2.nextNode()) { current = walker2.currentNode; callback(current, (bailValue) => bailed = bailValue); if (bailed !== void 0) { break; } } return bailed; } }; function element(name, type) { customElements.define(`ui-${name}`, type); } function on(target, event, handler, options = {}) { target.addEventListener(event, handler, options); return { off: () => target.removeEventListener(event, handler), pause: (callback) => { target.removeEventListener(event, handler), callback(); target.addEventListener(event, handler); } }; } function isFocusable3(el) { let selectors = [ "a[href]", "area[href]", "input:not([disabled])", "select:not([disabled])", "textarea:not([disabled])", "button:not([disabled])", "iframe", "object", "embed", "[tabindex]", "[contenteditable]" ]; return selectors.some((selector) => el.matches(selector)) && el.tabIndex >= 0; } function throttle(func, limit) { let inThrottle; return function() { let context = this, args = arguments; if (!inThrottle) { func.apply(context, args); inThrottle = true; setTimeout(() => inThrottle = false, limit); } }; } function timeout(callback, delay) { let timerId; let start; let remaining = delay; let active = false; let timeout2 = { pause: () => { if (!active) return; clearTimeout(timerId); remaining -= Date.now() - start; active = false; }, resume: () => { if (active) return; start = Date.now(); timerId = setTimeout(callback, remaining); active = true; }, cancel: () => { clearTimeout(timerId); active = false; remaining = delay; } }; timeout2.resume(); return timeout2; } var using = "pointer"; document.addEventListener("keydown", () => using = "keyboard", { capture: true }); document.addEventListener("pointerdown", (e) => { using = e.pointerType === "mouse" ? "mouse" : "touch"; }, { capture: true }); document.addEventListener("pointermove", (e) => { using = e.pointerType === "mouse" ? "mouse" : "touch"; }, { capture: true }); function isUsingKeyboard() { return using === "keyboard"; } function isUsingTouch() { return using === "touch"; } function search(el, callback) { let runningQuery = ""; let clearRunningQuery = debounce(() => { runningQuery = ""; }, 300); el.addEventListener("keydown", (e) => { if (e.key.length === 1 && /[a-zA-Z]/.test(e.key)) { runningQuery += e.key; callback(runningQuery); e.stopPropagation(); } clearRunningQuery(); }); } function dispenseId(el, prefix) { return "lofi-" + (prefix ? prefix + "-" : "") + Math.random().toString(16).slice(2); } function assignId(el, prefix) { let id = el.hasAttribute("id") ? el.getAttribute("id") : dispenseId(el, prefix); setAttribute2(el, "id", id); if (!el._x_bindings) el._x_bindings = {}; if (!el._x_bindings.id) el._x_bindings.id = id; return id; } function detangle() { let blocked = false; return (callback) => (...args) => { if (blocked) return; blocked = true; callback(...args); blocked = false; }; } function interest(trigger, panel, { gain, lose, focusable, useSafeArea }) { let engaged = false; let focusInHander = (e) => { if (!isUsingKeyboard()) return; if (trigger.contains(e.target) || panel.contains(e.target)) { engaged = true; gain(); } else { engaged = false; lose(); } }; focusable && document.addEventListener("focusin", focusInHander); let removeFocusInHandler = () => { document.removeEventListener("focusin", focusInHander); }; let removeSafeArea = () => { }; let removePointerMoveHandler = () => { }; let disinterest = () => { engaged = false; lose(); removeSafeArea(); removePointerMoveHandler(); }; let clear = () => { engaged = false; removeSafeArea(); removePointerMoveHandler(); }; let pointerEnterHandler = (e) => { if (isUsingTouch()) return; if (engaged) return; engaged = true; gain(); setTimeout(() => { let { safeArea, redraw: redrawSafeArea, remove: remove2 } = useSafeArea ? createSafeArea(trigger, panel, e.clientX, e.clientY) : nullSafeArea(); removeSafeArea = remove2; let pointerStoppedOverSafeAreaTimeout; let pointerMoveHandler = throttle((e2) => { let panelRect = panel.getBoundingClientRect(); let triggerRect = trigger.getBoundingClientRect(); let mouseState; if (safeArea.contains(e2.target) && mouseIsExclusivelyInsideSafeArea(triggerRect, panelRect, e2.clientX, e2.clientY)) mouseState = "safeArea"; else if (panel.contains(e2.target)) mouseState = "panel"; else if (trigger.contains(e2.target)) mouseState = "trigger"; else mouseState = "outside"; if (pointerStoppedOverSafeAreaTimeout) { clearTimeout(pointerStoppedOverSafeAreaTimeout); } switch (mouseState) { case "outside": disinterest(); break; case "trigger": redrawSafeArea(e2.clientX, e2.clientY); break; case "panel": removeSafeArea(); break; case "safeArea": redrawSafeArea(e2.clientX, e2.clientY); pointerStoppedOverSafeAreaTimeout = setTimeout(() => { disinterest(); }, 300); break; default: break; } }, 100); document.addEventListener("pointermove", pointerMoveHandler); removePointerMoveHandler = () => document.removeEventListener("pointermove", pointerMoveHandler); }); }; trigger.addEventListener("pointerenter", pointerEnterHandler); let removePointerEnterHandler = () => { trigger.removeEventListener("pointerenter", pointerEnterHandler); }; let remove = () => { clear(); removePointerEnterHandler(); removeFocusInHandler(); }; return { clear, remove }; } function createSafeArea(trigger, panel, x, y) { let safeArea = document.createElement("div"); let panelRect = panel.getBoundingClientRect(); let triggerRect = trigger.getBoundingClientRect(); safeArea.style.position = "fixed"; setAttribute2(safeArea, "data-safe-area", ""); let draw = (x2, y2) => { if (panelRect.top === 0 && panelRect.bottom === 0) return; let direction; if (panelRect.left < triggerRect.left) direction = "left"; if (panelRect.right > triggerRect.right) direction = "right"; if (panelRect.top < triggerRect.top && panelRect.bottom < y2) direction = "up"; if (panelRect.bottom > triggerRect.bottom && panelRect.top > y2) direction = "down"; if (direction === void 0) direction = "right"; let left, right, width, top, bottom, height, offset3, shape; let padding = 10; switch (direction) { case "left": left = panelRect.right; right = Math.max(panelRect.right, x2) + 5; width = right - left; top = Math.min(triggerRect.top, panelRect.top) - padding; bottom = Math.max(triggerRect.bottom, panelRect.bottom) + padding; height = bottom - top; offset3 = y2 - top; shape = `polygon(0% 0%, 100% ${offset3}px, 0% 100%)`; break; case "right": left = Math.min(panelRect.left, x2) - 5; right = panelRect.left; width = right - left; top = Math.min(triggerRect.top, panelRect.top) - padding; bottom = Math.max(triggerRect.bottom, panelRect.bottom) + padding; height = bottom - top; offset3 = y2 - top; shape = `polygon(0% ${offset3}px, 100% 0%, 100% 100%)`; break; case "up": left = Math.min(x2, panelRect.left) - padding; right = Math.max(x2, panelRect.right) + padding; width = right - left; top = panelRect.bottom; bottom = Math.max(panelRect.bottom, y2) + 5; height = bottom - top; offset3 = x2 - left; shape = `polygon(0% 0%, 100% 0%, ${offset3}px 100%)`; break; case "down": left = Math.min(x2, panelRect.left) - padding; right = Math.max(x2, panelRect.right) + padding; width = right - left; top = Math.min(panelRect.top, y2) - 5; bottom = panelRect.top; height = bottom - top; offset3 = x2 - left; shape = `polygon(${offset3}px 0%, 100% 100%, 0% 100%)`; break; } safeArea.style.left = `${left}px`; safeArea.style.top = `${top}px`; safeArea.style.width = `${width}px`; safeArea.style.height = `${height}px`; safeArea.style.clipPath = shape; }; return { safeArea, redraw: (x2, y2) => { if (!safeArea.isConnected) trigger.appendChild(safeArea); draw(x2, y2); }, remove: () => { safeArea.remove(); } }; } function mouseIsExclusivelyInsideSafeArea(triggerRect, panelRect, x, y) { return !mouseIsOverTrigger(triggerRect, x, y) && !mouseIsOverPanel(panelRect, x, y); } function mouseIsOverTrigger(triggerRect, x, y) { if (triggerRect.left <= x && x <= triggerRect.right && (triggerRect.top <= y && y <= triggerRect.bottom)) return true; return false; } function mouseIsOverPanel(panelRect, x, y) { if (panelRect.left <= x && x <= panelRect.right && (panelRect.top <= y && y <= panelRect.bottom)) return true; return false; } function setAttribute2(el, name, value3) { if (el._durableAttributeObserver === void 0) { el._durableAttributeObserver = attributeObserver(el, [name]); } if (!el._durableAttributeObserver.hasAttribute(name)) { el._durableAttributeObserver.addAttribute(name); } el._durableAttributeObserver.pause(() => { el.setAttribute(name, value3); }); } function removeAndReleaseAttribute(el, name) { removeAttribute(el, name); releaseAttribute(el, name); } function removeAttribute(el, name) { if (el._durableAttributeObserver === void 0) { el._durableAttributeObserver = attributeObserver(el, [name]); } if (!el._durableAttributeObserver.hasAttribute(name)) { el._durableAttributeObserver.addAttribute(name); } el._durableAttributeObserver.pause(() => { el.removeAttribute(name); }); } function releaseAttribute(el, name) { if (!el?._durableAttributeObserver?.hasAttribute(name)) return; el._durableAttributeObserver.releaseAttribute(name); } function attributeObserver(el, initialAttributes) { let processMutations = (mutations) => { mutations.forEach((mutation) => { if (mutation.oldValue === null) { el._durableAttributeObserver.pause(() => removeAttribute(el, mutation.attributeName)); } else { el._durableAttributeObserver.pause(() => setAttribute2(el, mutation.attributeName, mutation.oldValue)); } }); }; let observer = new MutationObserver((mutations) => processMutations(mutations)); observer.observe(el, { attributeFilter: initialAttributes, attributeOldValue: true }); return { attributes: initialAttributes, hasAttribute(name) { return this.attributes.includes(name); }, addAttribute(name) { this.attributes.includes(name) || this.attributes.push(name); observer.observe(el, { attributeFilter: this.attributes, attributeOldValue: true }); }, releaseAttribute(name) { if (!this.hasAttribute(name)) return; observer.observe(el, { attributeFilter: this.attributes, attributeOldValue: true }); }, pause(callback) { processMutations(observer.takeRecords()); observer.disconnect(); callback(); observer.observe(el, { attributeFilter: this.attributes, attributeOldValue: true }); } }; } function nullSafeArea() { return { safeArea: { contains: () => false }, redraw: () => { }, remove: () => { } }; } function debounce(callback, delay) { let timeout2; return (...args) => { clearTimeout(timeout2); timeout2 = setTimeout(() => { callback(...args); }, delay); }; } var lockCount = 0; var pointerEventsLocked = false; inject(({ css }) => css`[data-flux-allow-scroll] { pointer-events: auto; }`); function lockScroll(el = null, allowScroll = false, except = []) { if (allowScroll) return { lock: () => { }, unlock: () => { } }; let applyDocumentLockStyles = (disablePointerEvents = false) => { undoLockStyles(document.documentElement); let lockStyles = { overflow: "hidden", ...disablePointerEvents ? { pointerEvents: "none" } : {} }; if (window.CSS && CSS.supports && CSS.supports("scrollbar-gutter: stable")) { if (document.documentElement.scrollHeight > document.documentElement.clientHeight) { lockStyles.scrollbarGutter = "stable"; } } else { lockStyles.paddingRight = `calc(${window.innerWidth - document.documentElement.clientWidth}px + ${window.getComputedStyle(document.documentElement).paddingRight})`; } setLockStyles(document.documentElement, lockStyles); if (disablePointerEvents) { setAttribute2(el, "data-flux-allow-scroll", ""); except.forEach((el2) => { setAttribute2(el2, "data-flux-allow-scroll", ""); }); pointerEventsLocked = true; } }; let removeDocumentLockStyles = (enablePointerEvents = false) => { undoLockStyles(document.documentElement); if (enablePointerEvents) { removeAndReleaseAttribute(el, "data-flux-allow-scroll"); except.forEach((el2) => { removeAttribute(el2, "data-flux-allow-scroll"); }); pointerEventsLocked = false; } }; return { lock() { lockCount++; if (lockCount > 1 && el !== null && pointerEventsLocked) return; applyDocumentLockStyles(el !== null && !pointerEventsLocked); }, unlock() { lockCount = Math.max(0, lockCount - 1); if (lockCount > 0 && el !== null && !pointerEventsLocked) return; removeDocumentLockStyles(el !== null && pointerEventsLocked); if (lockCount > 0) { applyDocumentLockStyles(false); } } }; } function setLockStyles(element2, styles) { let unlockedStyles = JSON.parse(element2.getAttribute(`data-flux-scroll-unlock`) || "{}"); Object.entries(styles).forEach(([style, value3]) => { if (unlockedStyles[style] === void 0) { unlockedStyles[style] = element2.style[style]; element2.style[style] = value3; } }); element2.setAttribute(`data-flux-scroll-unlock`, JSON.stringify(unlockedStyles)); } function undoLockStyles(element2) { let unlockedStyles = JSON.parse(element2.getAttribute(`data-flux-scroll-unlock`) || "{}"); Object.entries(unlockedStyles).forEach(([style, value3]) => { element2.style[style] = value3; }); element2.removeAttribute(`data-flux-scroll-unlock`); } function setStyle(element2, style, value3) { let currentValue = element2.style[style]; element2.style[style] = value3; return () => { element2.style[style] = currentValue; }; } function initFauxButton(el, isDisabled, action) { let ifKey = (key, callback) => (e) => { if (e.key === key && !isDisabled()) { callback(); e.preventDefault(); e.stopPropagation(); } }; setAttribute2(el, "role", "button"); let syncDisabledAttributes = () => { if (el.hasAttribute("disabled")) { setAttribute2(el, "aria-disabled", "true"); setAttribute2(el, "tabindex", "-1"); } else { removeAttribute(el, "aria-disabled"); setAttribute2(el, "tabindex", "0"); } }; let observer = new MutationObserver(() => syncDisabledAttributes()); observer.observe(el, { attributes: true, attributeFilter: ["disabled"] }); syncDisabledAttributes(); on(el, "click", () => action()); on(el, "keydown", ifKey("Enter", () => action())); on(el, "keydown", ifKey(" ", () => { })); on(el, "keyup", ifKey(" ", () => action())); } function responsiveAttributeValue(el, name, fallback = null) { let getValue = () => { let value3 = el.getAttribute(name); let breakpoints = { sm: 640, md: 768, lg: 1024, xl: 1280, "2xl": 1536 }; for (let [breakpoint, minWidth] of Object.entries(breakpoints).reverse()) { let responsiveValue = el.getAttribute(`${breakpoint}:${name}`); if (responsiveValue && window.innerWidth >= minWidth) { return responsiveValue; } } return value3 || fallback; }; let currentValue = getValue(); let callbacks = []; new ResizeObserver(() => { let newValue = getValue(); let memo = JSON.stringify(currentValue); if (JSON.stringify(newValue) !== memo) { currentValue = newValue; callbacks.forEach((callback) => callback(newValue)); } }).observe(window.document.documentElement); return [currentValue, (callback) => callbacks.push(callback)]; } function getLocale() { return navigator?.language || document.documentElement.lang || "en-US"; } function hydrateTemplate(template, slotsAndAttributes = { slots: {}, attrs: {} }) { let { slots = {}, attrs = {} } = slotsAndAttributes; let clone = template.content.cloneNode(true).firstElementChild; Object.entries(slots).forEach(([key, value3]) => { let slotNodes = key === "default" ? clone.querySelectorAll("slot:not([name])") : clone.querySelectorAll(`slot[name="${key}"]`); slotNodes.forEach((i) => i.replaceWith( typeof value3 === "string" ? document.createTextNode(value3) : value3 )); }); clone.querySelectorAll("slot").forEach((slot) => slot.remove()); Object.entries(attrs).forEach(([key, value3]) => { clone.setAttribute(key, value3); }); clone.setAttribute("data-appended", ""); return clone; } function isRTL() { return document.documentElement.dir === "rtl"; } function isSafari() { return /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && !navigator.userAgent.includes("CriOS") && !navigator.userAgent.includes("FxiOS"); } function isIOS() { return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; } var Observable = class { constructor() { this.subscribers = []; } subscribe(reason, callback) { this.subscribers.push({ reason, callback }); } notify(reason, data) { this.subscribers.forEach(({ reason: subReason, callback }) => { if (reason === subReason) { callback(data); } }); } }; // js/element.js var UIElement = class extends HTMLElement { wasDisconnected = false; constructor() { super(); this.boot?.(); } connectedCallback() { if (this.wasDisconnected) { this.wasDisconnected = false; return; } queueMicrotask(() => { this.mount?.(); }); } disconnectedCallback() { this.wasDisconnected = true; queueMicrotask(() => { if (this.wasDisconnected) { this.unmount?.(); } this.wasDisconnected = false; }); } mixin(func, options = {}) { return new func(this, options); } // @todo: this is redundant now... appendMixin(func, options = {}) { return new func(this, options); } use(func) { let found; this.mixins.forEach((mixin) => { if (mixin instanceof func) found = mixin; }); return found; } uses(func) { let found; this.mixins.forEach((mixin) => { if (mixin instanceof func) found = true; }); return !!found; } on(event, handler) { return on(this, event, handler); } root(name, attributes = {}) { if (name === void 0) return this.__root; let el = document.createElement(name); for (let name2 in attributes) { setAttribute(el, name2, attributes[name2]); } let shadow = this.attachShadow({ mode: "open" }); el.appendChild(document.createElement("slot")); shadow.appendChild(el); this.__root = el; return this.__root; } }; var UIControl = class extends UIElement { // }; // js/mixins/mixin.js var Mixin = class { constructor(el, options = {}) { this.el = el; this.grouped = options.grouped === void 0 ? true : false; this.el.mixins = this.el.mixins ? this.el.mixins : /* @__PURE__ */ new Map(); this.el.mixins.set(this.constructor.name, this); this.el[this.constructor.name] = true; if (!this.el.use) this.el.use = UIElement.prototype.use.bind(this.el); this.opts = options; this.boot?.({ options: (defaults) => { let options2 = defaults; Object.entries(this.opts).forEach(([key, value3]) => { if (value3 !== void 0) { options2[key] = value3; } }); this.opts = options2; } }); queueMicrotask(() => { this.mount?.(); }); } options() { return this.opts; } hasGroup() { return !!this.group(); } group() { if (this.grouped === false) return; return closest(this.el, (i) => i[this.groupedByType.name])?.use(this.groupedByType); } on(event, handler) { return on(this.el, event, handler); } }; var MixinGroup = class extends Mixin { constructor(el, options = {}) { super(el, options); } walker() { return walker(this.el, (el, { skip, reject }) => { if (el[this.constructor.name] && el !== this.el) return reject(); if (!el[this.groupOfType.name]) return skip(); if (!el.mixins.get(this.groupOfType.name).grouped) return skip(); }); } }; // js/mixins/controllable.js var Controllable = class extends Mixin { boot({ options }) { options({ bubbles: false }); this.initialState = this.el.value; this.getterFunc = () => { }; this.setterFunc = (value3) => this.initialState = value3; Object.defineProperty(this.el, "value", { get: () => { return this.getterFunc(); }, set: (value3) => { this.setterFunc(value3); } }); } initial(callback) { callback(this.initialState); } getter(func) { this.getterFunc = func; } setter(func) { this.setterFunc = func; } dispatch() { this.el.dispatchEvent(new Event("input", { bubbles: this.options().bubbles, cancelable: true })); this.el.dispatchEvent(new Event("change", { bubbles: this.options().bubbles, cancelable: true })); } }; // js/mixins/dialogable.js var lastMouseDownEvent = null; document.addEventListener("mousedown", (event) => lastMouseDownEvent = event); var Dialogable = class extends Mixin { boot({ options }) { options({ clickOutside: true, triggers: [] }); this.onChanges = []; this.state = false; this.stopDialogFromFocusingTheFirstElement(); let triggers = this.options().triggers; let observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.attributeName !== "open") return; this.el.hasAttribute("open") ? this.state = true : this.state = false; }); this.onChanges.forEach((i) => i()); }); observer.observe(this.el, { attributeFilter: ["open"] }); if (this.options().clickOutside) { this.el.addEventListener("click", (e) => { if (e.target !== this.el) { lastMouseDownEvent = null; return; } if (lastMouseDownEvent && clickHappenedOutside(this.el, lastMouseDownEvent) && clickHappenedOutside(this.el, e)) { this.cancel(); e.preventDefault(); e.stopPropagation(); } lastMouseDownEvent = null; }); } if (this.el.hasAttribute("open")) { this.state = true; this.hide(); this.show(); } } onChange(callback) { this.onChanges.push(callback); } show() { if (!this.el.isConnected) return; this.el.showModal(); } hide() { this.el.close(); } toggle() { this.state ? this.hide() : this.show(); } cancel() { let event = new Event("cancel", { bubbles: false, cancelable: true }); this.el.dispatchEvent(event); if (!event.defaultPrevented) { this.hide(); } } getState() { return this.state; } setState(value3) { value3 ? this.show() : this.hide(); } // By default, browsers focus the first focusable element inside a dialog when it is opened. This is bad for screen readers because // the focus could potentially be at the end of the dialog skipping all of the content. This also causes issues for iOS devices // as when inputs are focused and the keyboard is shown, hiding half of the dialog content... stopDialogFromFocusingTheFirstElement() { let placeholder = document.createElement("div"); placeholder.setAttribute("data-flux-focus-placeholder", ""); placeholder.setAttribute("data-appended", ""); placeholder.setAttribute("tabindex", "0"); this.el.prepend(placeholder); this.onChange(() => { setAttribute2(placeholder, "style", this.state ? "display: none" : "display: block"); if (this.state && isSafari() && !this.el.hasAttribute("autofocus") && this.el.querySelectorAll("[autofocus]").length === 0) { setTimeout(() => { this.el.setAttribute("tabindex", "-1"); this.el.focus(); this.el.blur(); }); } }); } }; function clickHappenedOutside(el, event) { let rect = el.getBoundingClientRect(); let x = event.clientX; let y = event.clientY; let isInside = x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom; return !isInside; } // js/mixins/closeable.js var Closeable = class extends Mixin { boot() { this.onCloses = []; } onClose(callback) { this.onCloses.push(callback); } close() { this.onCloses.forEach((callback) => callback()); } }; // js/modal.js var UIModal = class extends UIElement { boot() { this.querySelectorAll("[data-appended]").forEach((el) => el.remove()); this._controllable = new Controllable(this, { disabled: this.hasAttribute("disabled") }); let button = this.button(); let dialog = this.dialog(); if (!dialog) return; dialog._dialogable = new Dialogable(dialog, { clickOutside: !this.hasAttribute("disable-click-outside") }); dialog._closeable = new Closeable(dialog); dialog._closeable.onClose(() => dialog._dialogable.hide()); this._controllable.initial((initial) => initial && dialog._dialogable.show()); this._controllable.getter(() => dialog._dialogable.getState()); let detangled = detangle(); this._controllable.setter(detangled((value3) => { dialog._dialogable.setState(value3); })); dialog._dialogable.onChange(detangled(() => { this._controllable.dispatch(); })); let refresh = () => { if (dialog._dialogable.getState()) { setAttribute2(this, "data-open", ""); button?.setAttribute("data-open", ""); setAttribute2(dialog, "data-open", ""); } else { removeAttribute(this, "data-open"); button?.removeAttribute("data-open"); removeAttribute(dialog, "data-open"); } }; dialog._dialogable.onChange(() => refresh()); refresh(); let { lock, unlock } = lockScroll(); dialog._dialogable.onChange(() => { dialog._dialogable.getState() ? lock() : unlock(); }); button && on(button, "click", (e) => { dialog._dialogable.show(); }); } unmount() { if (this.dialog()?._dialogable?.getState()) { let { unlock } = lockScroll(); unlock(); } } button() { let button = this.querySelector("button,ui-button"); let dialog = this.dialog(); if (dialog?.contains(button)) return; return button; } dialog() { return this.querySelector("dialog"); } showModal() { let dialog = this.dialog(); if (!dialog) return; dialog.showModal(); } }; inject(({ css }) => css`dialog, ::backdrop { margin: auto; }`); element("modal", UIModal); // js/mixins/activatable.js var ActivatableGroup = class extends MixinGroup { groupOfType = Activatable; boot({ options }) { options({ wrap: false, filter: false }); this.onChanges = []; } onChange(callback) { this.onChanges.push(callback); } activated(activeEl) { this.onChanges.forEach((i) => i()); } activateFirst() { this.filterAwareWalker().first()?.use(Activatable).activate(); } activateBySearch(query) { let found = this.filterAwareWalker().find((i) => i.textContent.toLowerCase().trim().startsWith(query.toLowerCase())); found?.use(Activatable).activate(); } activateSelectedOrFirst(selectedEl) { let isHidden = (el) => el.matches("ui-option, ui-option-create") ? getComputedStyle(el).display === "none" : false; if (!selectedEl || isHidden(selectedEl)) { this.filterAwareWalker().first()?.use(Activatable).activate(); return; } selectedEl?.use(Activatable).activate(); } activateActiveOrFirst() { let active = this.getActive(); if (!active) { this.filterAwareWalker().first()?.use(Activatable).activate(); return; } active?.use(Activatable).activate(); } activateActiveOrLast() { let active = this.getActive(); if (!active) { this.filterAwareWalker().last()?.use(Activatable).activate(); return; } active?.use(Activatable).activate(); } activatePrev() { let active = this.getActive(); if (!active) { this.filterAwareWalker().last()?.use(Activatable).activate(); return; } let found; if (this.options.wrap) { found = this.filterAwareWalker().prevOrLast(active); } else { found = this.filterAwareWalker().prev(active); } found?.use(Activatable).activate(); } activateNext() { let active = this.getActive(); if (!active) { this.filterAwareWalker().first()?.use(Activatable).activate(); return; } let found; if (this.options.wrap) { found = this.filterAwareWalker().nextOrFirst(active); } else { found = this.filterAwareWalker().next(active); } found?.use(Activatable).activate(); } getActive() { return this.walker().find((i) => i.use(Activatable).isActive()); } clearActive() { this.getActive()?.use(Activatable).deactivate(); } filterAwareWalker() { let isHidden = (el) => el.matches("ui-option, ui-option-create") ? getComputedStyle(el).display === "none" : false; return walker(this.el, (el, { skip, reject }) => { if (el[this.constructor.name] && el !== this.el) return reject(); if (!el[this.groupOfType.name]) return skip(); if (el.hasAttribute("disabled")) return reject(); if (isHidden(el)) return reject(); }); } }; var Activatable = class _Activatable extends Mixin { groupedByType = ActivatableGroup; mount() { this.el.addEventListener("mouseenter", () => { this.activate(); }); this.el.addEventListener("mouseleave", () => { this.deactivate(); }); } activate(force = false) { if (this.group()) { this.group().walker().each((item) => item.use(_Activatable).deactivate(false)); } if (this.el.hasAttribute("disabled") && !force) return; setAttribute2(this.el, "data-active", ""); if (isUsingKeyboard()) { this.el.scrollIntoView({ block: "nearest" }); } this.group() && this.group().activated(this.el); } deactivate(notify = true) { removeAttribute(this.el, "data-active"); notify && this.group() && this.group().activated(this.el); } isActive() { return this.el.hasAttribute("data-active"); } }; // js/mixins/filterable.js var FilterableGroup = class extends MixinGroup { groupOfType = Filterable; boot({ options }) { options({}); this.onChanges = []; this.lastSearch = ""; } onChange(callback) { this.onChanges.push(callback); } filter(search2) { if (search2 === "") { this.walker().each((i) => { i.use(Filterable).unfilter(); }); } else { this.walker().each((i) => { if (this.matches(i, search2)) { i.use(Filterable).unfilter(); } else { i.use(Filterable).filter(); } }); } if (this.lastSearch !== search2) { this.onChanges.forEach((i) => i()); } this.lastSearch = search2; } matches(el, search2) { return this.normalize(el.textContent).includes(this.normalize(search2)); } // This function normalizes the value to remove diacritics (accents) and convert to lowercase // to ensure that the search is case-insensitive and diacritic-insensitive... normalize(value3) { return value3.normalize("NFD").replace(/\p{Diacritic}/gu, "").toLowerCase().trim(); } hasResults() { return this.walker().some((i) => !i.use(Filterable).isFiltered()); } }; var Filterable = class extends Mixin { groupedByType = FilterableGroup; boot({ options }) { options({ mirror: null, keep: false }); this.onChanges = []; } filter() { if (this.options().keep) return; setAttribute2(this.el, "data-hidden", ""); if (this.options().mirror) setAttribute2(this.options().mirror, "data-hidden", ""); } unfilter() { if (this.options().keep) return; removeAttribute(this.el, "data-hidden"); if (this.options().mirror) removeAttribute(this.options().mirror, "data-hidden", ""); } isFiltered() { return this.el.hasAttribute("data-hidden"); } }; // js/mixins/popoverable.js var currentlyOpenPopoversByScope = /* @__PURE__ */ new Map(); var Popoverable = class extends Mixin { boot({ options }) { options({ triggers: [], scope: null }); let scope = this.options().scope || "global"; setAttribute2(this.el, "popover", "manual"); this.triggers = this.options().triggers; this.onChanges = []; this.state = false; on(this.el, "beforetoggle", (e) => { let oldState = this.state; this.state = e.newState === "open"; if (this.state) { closeOtherOpenPopovers(this.el, scope); let controller = new AbortController(); let activeElement = document.activeElement; let triggers = [...this.triggers, activeElement]; setTimeout(() => { closeOnClickOutside(this.el, triggers, controller); closeOnFocusAway(this.el, triggers, controller); closeOnEscape(this.el, triggers, controller); }); this.el.addEventListener("beforetoggle", (e2) => { if (e2.newState === "closed") { controller.abort(); activeElement?.focus(); } }, { signal: controller.signal }); } if (oldState !== this.state) { this.onChanges.forEach((i) => i(this.state, oldState)); } }); on(this.el, "toggle", (e) => { if (e.newState === "open") { if (!currentlyOpenPopoversByScope.has(scope)) { currentlyOpenPopoversByScope.set(scope, /* @__PURE__ */ new Set()); } currentlyOpenPopoversByScope.get(scope).add(this.el); } else if (e.newState === "closed") { if (!currentlyOpenPopoversByScope.has(scope)) return; currentlyOpenPopoversByScope.get(scope).delete(this.el); if (currentlyOpenPopoversByScope.get(scope).size === 0) { currentlyOpenPopoversByScope.delete(scope); } } }); } onChange(callback) { this.onChanges.push(callback); } setState(value3) { value3 ? this.show() : this.hide(); } getState() { return this.state; } toggle() { this.el.isConnected && this.el.togglePopover(); } show() { this.el.isConnected && this.el.showPopover(); } hide() { this.el.isConnected && this.el.hidePopover(); } }; function closeOtherOpenPopovers(el, scope) { if (!currentlyOpenPopoversByScope.has(scope)) return; currentlyOpenPopoversByScope.get(scope).forEach((popoverEl) => { if (el.contains(popoverEl) || popoverEl.contains(el)) return; popoverEl.hidePopover(); }); } function closeOnClickOutside(el, except, controller) { document.addEventListener("click", (e) => { if (el.contains(e.target) || except.includes(e.target)) return; el.hidePopover(); }, { signal: controller.signal }); } function closeOnFocusAway(el, except, controller) { document.addEventListener("focusin", (e) => { if (el.contains(e.target) || except.includes(e.target)) return; controller.abort(); el.hidePopover(); }, { // Without "capture: true", when you focus away from the popover onto an element that triggers a popover // on focus (a tooltip), it will focus back this popover's trigger instead of keeping focus on the tooltip button. // It does this because only one popover can be open at a time, so focusing the tooltip, opens a popover, closing this one, // which will trigger the "focus back" behavior. capture: true, signal: controller.signal }); } function closeOnEscape(el, except, controller) { document.addEventListener("keydown", (e) => { if (e.key !== "Escape") return; el.hidePopover(); }, { signal: controller.signal }); } // js/mixins/disableable.js var Disableable = class extends Mixin { boot({ options }) { options({ disableWithParent: true }); this.onChanges = []; Object.defineProperty(this.el, "disabled", { get: () => { return this.el.hasAttribute("disabled"); }, set: (value3) => { if (value3) { this.el.setAttribute("disabled", ""); } else { this.el.removeAttribute("disabled"); } } }); if (this.el.hasAttribute("disabled")) { this.el.disabled = true; } else if (this.options().disableWithParent && this.el.parentElement?.closest("[disabled]")) { this.el.disabled = true; } let observer = new MutationObserver((mutations) => { this.onChanges.forEach((i) => i(this.el.disabled)); }); observer.observe(this.el, { attributeFilter: ["disabled"] }); } onChange(callback) { this.onChanges.push(callback); } onInitAndChange(callback) { callback(this.el.disabled); this.onChanges.push(callback); } enabled(callback) { return (...args) => { if (this.el.disabled) return; return callback(...args); }; } disabled(callback) { return (...args) => { if (!this.el.disabled) return; return callback(...args); }; } isDisabled() { return this.el.disabled; } }; // node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs var min = Math.min; var max = Math.max; var round = Math.round; var floor = Math.floor; var createCoords = (v) => ({ x: v, y: v }); var oppositeSideMap = { left: "right", right: "left", bottom: "top", top: "bottom" }; var oppositeAlignmentMap = { start: "end", end: "start" }; function clamp(start, value3, end) { return max(start, min(value3, end)); } function evaluate(value3, param) { return typeof value3 === "function" ? value3(param) : value3; } function getSide(placement) { return placement.split("-")[0]; } function getAlignment(placement) { return placement.split("-")[1]; } function getOppositeAxis(axis) { return axis === "x" ? "y" : "x"; } function getAxisLength(axis) { return axis === "y" ? "height" : "width"; } function getSideAxis(placement) { return ["top", "bottom"].includes(getSide(placement)) ? "y" : "x"; } function getAlignmentAxis(placement) { return getOppositeAxis(getSideAxis(placement)); } function getAlignmentSides(placement, rects, rtl) { if (rtl === void 0) { rtl = false; } const alignment = getAlignment(placement); const alignmentAxis = getAlignmentAxis(placement); const length = getAxisLength(alignmentAxis); let mainAlignmentSide = alignmentAxis === "x" ? alignment === (rtl ? "end" : "start") ? "right" : "left" : alignment === "start" ? "bottom" : "top"; if (rects.reference[length] > rects.floating[length]) { mainAlignmentSide = getOppositePlacement(mainAlignmentSide); } return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)]; } function getExpandedPlacements(placement) { const oppositePlacement = getOppositePlacement(placement); return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)]; } function getOppositeAlignmentPlacement(placement) { return placement.replace(/start|end/g, (alignment) => oppositeAlignmentMap[alignment]); } function getSideList(side, isStart, rtl) { const lr = ["left", "right"]; const rl = ["right", "left"]; const tb = ["top", "bottom"]; const bt = ["bottom", "top"]; switch (side) { case "top": case "bottom": if (rtl) return isStart ? rl : lr; return isStart ? lr : rl; case "left": case "right": return isStart ? tb : bt; default: return []; } } function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) { const alignment = getAlignment(placement); let list = getSideList(getSide(placement), direction === "start", rtl); if (alignment) { list = list.map((side) => side + "-" + alignment); if (flipAlignment) { list = list.concat(list.map(getOppositeAlignmentPlacement)); } } return list; } function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, (side) => oppositeSideMap[side]); } function expandPaddingObject(padding) { return { top: 0, right: 0, bottom: 0, left: 0, ...padding }; } function getPaddingObject(padding) { return typeof padding !== "number" ? expandPaddingObject(padding) : { top: padding, right: padding, bottom: padding, left: padding }; } function rectToClientRect(rect) { const { x, y, width, height } = rect; return { width, height, top: y, left: x, right: x + width, bottom: y + height, x, y }; } // node_modules/@floating-ui/core/dist/floating-ui.core.mjs function computeCoordsFromPlacement(_ref, placement, rtl) { let { reference, floating } = _ref; const sideAxis = getSideAxis(placement); const alignmentAxis = getAlignmentAxis(placement); const alignLength = getAxisLength(alignmentAxis); const side = getSide(placement); const isVertical = sideAxis === "y"; const commonX = reference.x + reference.width / 2 - floating.width / 2; const commonY = reference.y + reference.height / 2 - floating.height / 2; const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2; let coords; switch (side) { case "top": coords = { x: commonX, y: reference.y - floating.height }; break; case "bottom": coords = { x: commonX, y: reference.y + reference.height }; break; case "right": coords = { x: reference.x + reference.width, y: commonY }; break; case "left": coords = { x: reference.x - floating.width, y: commonY }; break; default: coords = { x: reference.x, y: reference.y }; } switch (getAlignment(placement)) { case "start": coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1); break; case "end": coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1); break; } return coords; } var computePosition = async (reference, floating, config) => { const { placement = "bottom", strategy = "absolute", middleware = [], platform: platform2 } = config; const validMiddleware = middleware.filter(Boolean); const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(floating)); let rects = await platform2.getElementRects({ reference, floating, strategy }); let { x, y } = computeCoordsFromPlacement(rects, placement, rtl); let statefulPlacement = placement; let middlewareData = {}; let resetCount = 0; for (let i = 0; i < validMiddleware.length; i++) { const { name, fn } = validMiddleware[i]; const { x: nextX, y: nextY, data, reset } = await fn({ x, y, initialPlacement: placement, placement: statefulPlacement, strategy, middlewareData, rects, platform: platform2, elements: { reference, floating } }); x = nextX != null ? nextX : x; y = nextY != null ? nextY : y; middlewareData = { ...middlewareData, [name]: { ...middlewareData[name], ...data } }; if (reset && resetCount <= 50) { resetCount++; if (typeof reset === "object") { if (reset.placement) { statefulPlacement = reset.placement; } if (reset.rects) { rects = reset.rects === true ? await platform2.getElementRects({ reference, floating, strategy }) : reset.rects; } ({ x, y } = computeCoordsFromPlacement(rects, statefulPlacement, rtl)); } i = -1; } } return { x, y, placement: statefulPlacement, strategy, middlewareData }; }; async function detectOverflow(state, options) { var _await$platform$isEle; if (options === void 0) { options = {}; } const { x, y, platform: platform2, rects, elements, strategy } = state; const { boundary = "clippingAncestors", rootBoundary = "viewport", elementContext = "floating", altBoundary = false, padding = 0 } = evaluate(options, state); const paddingObject = getPaddingObject(padding); const altContext = elementContext === "floating" ? "reference" : "floating"; const element2 = elements[altBoundary ? altContext : elementContext]; const clippingClientRect = rectToClientRect(await platform2.getClippingRect({ element: ((_await$platform$isEle = await (platform2.isElement == null ? void 0 : platform2.isElement(element2))) != null ? _await$platform$isEle : true) ? element2 : element2.contextElement || await (platform2.getDocumentElement == null ? void 0 : platform2.getDocumentElement(elements.floating)), boundary, rootBoundary, strategy })); const rect = elementContext === "floating" ? { x, y, width: rects.floating.width, height: rects.floating.height } : rects.reference; const offsetParent = await (platform2.getOffsetParent == null ? void 0 : platform2.getOffsetParent(elements.floating)); const offsetScale = await (platform2.isElement == null ? void 0 : platform2.isElement(offsetParent)) ? await (platform2.getScale == null ? void 0 : platform2.getScale(offsetParent)) || { x: 1, y: 1 } : { x: 1, y: 1 }; const elementClientRect = rectToClientRect(platform2.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform2.convertOffsetParentRelativeRectToViewportRelativeRect({ elements, rect, offsetParent, strategy }) : rect); return { top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y, bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y, left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x, right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x }; } var flip = function(options) { if (options === void 0) { options = {}; } return { name: "flip", options, async fn(state) { var _middlewareData$arrow, _middlewareData$flip; const { placement, middlewareData, rects, initialPlacement, platform: platform2, elements } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = true, fallbackPlacements: specifiedFallbackPlacements, fallbackStrategy = "bestFit", fallbackAxisSideDirection = "none", flipAlignment = true, ...detectOverflowOptions } = evaluate(options, state); if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { return {}; } const side = getSide(placement); const initialSideAxis = getSideAxis(initialPlacement); const isBasePlacement = getSide(initialPlacement) === initialPlacement; const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)); const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement)); const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== "none"; if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) { fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl)); } const placements2 = [initialPlacement, ...fallbackPlacements]; const overflow = await detectOverflow(state, detectOverflowOptions); const overflows = []; let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || []; if (checkMainAxis) { overflows.push(overflow[side]); } if (checkCrossAxis) { const sides2 = getAlignmentSides(placement, rects, rtl); overflows.push(overflow[sides2[0]], overflow[sides2[1]]); } overflowsData = [...overflowsData, { placement, overflows }]; if (!overflows.every((side2) => side2 <= 0)) { var _middlewareData$flip2, _overflowsData$filter; const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1; const nextPlacement = placements2[nextIndex]; if (nextPlacement) { return { data: { index: nextIndex, overflows: overflowsData }, reset: { placement: nextPlacement } }; } let resetPlacement = (_overflowsData$filter = overflowsData.filter((d) => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement; if (!resetPlacement) { switch (fallbackStrategy) { case "bestFit": { var _overflowsData$filter2; const placement2 = (_overflowsData$filter2 = overflowsData.filter((d) => { if (hasFallbackAxisSideDirection) { const currentSideAxis = getSideAxis(d.placement); return currentSideAxis === initialSideAxis || // Create a bias to the `y` side axis due to horizontal // reading directions favoring greater width. currentSideAxis === "y"; } return true; }).map((d) => [d.placement, d.overflows.filter((overflow2) => overflow2 > 0).reduce((acc, overflow2) => acc + overflow2, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0]; if (placement2) { resetPlacement = placement2; } break; } case "initialPlacement": resetPlacement = initialPlacement; break; } } if (placement !== resetPlacement) { return { reset: { placement: resetPlacement } }; } } return {}; } }; }; async function convertValueToCoords(state, options) { const { placement, platform: platform2, elements } = state; const rtl = await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)); const side = getSide(placement); const alignment = getAlignment(placement); const isVertical = getSideAxis(placement) === "y"; const mainAxisMulti = ["left", "top"].includes(side) ? -1 : 1; const crossAxisMulti = rtl && isVertical ? -1 : 1; const rawValue = evaluate(options, state); let { mainAxis, crossAxis, alignmentAxis } = typeof rawValue === "number" ? { mainAxis: rawValue, crossAxis: 0, alignmentAxis: null } : { mainAxis: rawValue.mainAxis || 0, crossAxis: rawValue.crossAxis || 0, alignmentAxis: rawValue.alignmentAxis }; if (alignment && typeof alignmentAxis === "number") { crossAxis = alignment === "end" ? alignmentAxis * -1 : alignmentAxis; } return isVertical ? { x: crossAxis * crossAxisMulti, y: mainAxis * mainAxisMulti } : { x: mainAxis * mainAxisMulti, y: crossAxis * crossAxisMulti }; } var offset = function(options) { if (options === void 0) { options = 0; } return { name: "offset", options, async fn(state) { var _middlewareData$offse, _middlewareData$arrow; const { x, y, placement, middlewareData } = state; const diffCoords = await convertValueToCoords(state, options); if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) { return {}; } return { x: x + diffCoords.x, y: y + diffCoords.y, data: { ...diffCoords, placement } }; } }; }; var shift = function(options) { if (options === void 0) { options = {}; } return { name: "shift", options, async fn(state) { const { x, y, placement } = state; const { mainAxis: checkMainAxis = true, crossAxis: checkCrossAxis = false, limiter = { fn: (_ref) => { let { x: x2, y: y2 } = _ref; return { x: x2, y: y2 }; } }, ...detectOverflowOptions } = evaluate(options, state); const coords = { x, y }; const overflow = await detectOverflow(state, detectOverflowOptions); const crossAxis = getSideAxis(getSide(placement)); const mainAxis = getOppositeAxis(crossAxis); let mainAxisCoord = coords[mainAxis]; let crossAxisCoord = coords[crossAxis]; if (checkMainAxis) { const minSide = mainAxis === "y" ? "top" : "left"; const maxSide = mainAxis === "y" ? "bottom" : "right"; const min2 = mainAxisCoord + overflow[minSide]; const max2 = mainAxisCoord - overflow[maxSide]; mainAxisCoord = clamp(min2, mainAxisCoord, max2); } if (checkCrossAxis) { const minSide = crossAxis === "y" ? "top" : "left"; const maxSide = crossAxis === "y" ? "bottom" : "right"; const min2 = crossAxisCoord + overflow[minSide]; const max2 = crossAxisCoord - overflow[maxSide]; crossAxisCoord = clamp(min2, crossAxisCoord, max2); } const limitedCoords = limiter.fn({ ...state, [mainAxis]: mainAxisCoord, [crossAxis]: crossAxisCoord }); return { ...limitedCoords, data: { x: limitedCoords.x - x, y: limitedCoords.y - y, enabled: { [mainAxis]: checkMainAxis, [crossAxis]: checkCrossAxis } } }; } }; }; var size = function(options) { if (options === void 0) { options = {}; } return { name: "size", options, async fn(state) { var _state$middlewareData, _state$middlewareData2; const { placement, rects, platform: platform2, elements } = state; const { apply: apply3 = () => { }, ...detectOverflowOptions } = evaluate(options, state); const overflow = await detectOverflow(state, detectOverflowOptions); const side = getSide(placement); const alignment = getAlignment(placement); const isYAxis = getSideAxis(placement) === "y"; const { width, height } = rects.floating; let heightSide; let widthSide; if (side === "top" || side === "bottom") { heightSide = side; widthSide = alignment === (await (platform2.isRTL == null ? void 0 : platform2.isRTL(elements.floating)) ? "start" : "end") ? "left" : "right"; } else { widthSide = side; heightSide = alignment === "end" ? "top" : "bottom"; } const maximumClippingHeight = height - overflow.top - overflow.bottom; const maximumClippingWidth = width - overflow.left - overflow.right; const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight); const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth); const noShift = !state.middlewareData.shift; let availableHeight = overflowAvailableHeight; let availableWidth = overflowAvailableWidth; if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) { availableWidth = maximumClippingWidth; } if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) { availableHeight = maximumClippingHeight; } if (noShift && !alignment) { const xMin = max(overflow.left, 0); const xMax = max(overflow.right, 0); const yMin = max(overflow.top, 0); const yMax = max(overflow.bottom, 0); if (isYAxis) { availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)); } else { availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)); } } await apply3({ ...state, availableWidth, availableHeight }); const nextDimensions = await platform2.getDimensions(elements.floating); if (width !== nextDimensions.width || height !== nextDimensions.height) { return { reset: { rects: true } }; } return {}; } }; }; // node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs function hasWindow() { return typeof window !== "undefined"; } function getNodeName(node) { if (isNode(node)) { return (node.nodeName || "").toLowerCase(); } return "#document"; } function getWindow(node) { var _node$ownerDocument; return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; } function getDocumentElement(node) { var _ref; return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; } function isNode(value3) { if (!hasWindow()) { return false; } return value3 instanceof Node || value3 instanceof getWindow(value3).Node; } function isElement(value3) { if (!hasWindow()) { return false; } return value3 instanceof Element || value3 instanceof getWindow(value3).Element; } function isHTMLElement(value3) { if (!hasWindow()) { return false; } return value3 instanceof HTMLElement || value3 instanceof getWindow(value3).HTMLElement; } function isShadowRoot(value3) { if (!hasWindow() || typeof ShadowRoot === "undefined") { return false; } return value3 instanceof ShadowRoot || value3 instanceof getWindow(value3).ShadowRoot; } function isOverflowElement(element2) { const { overflow, overflowX, overflowY, display } = getComputedStyle2(element2); return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !["inline", "contents"].includes(display); } function isTableElement(element2) { return ["table", "td", "th"].includes(getNodeName(element2)); } function isTopLayer(element2) { return [":popover-open", ":modal"].some((selector) => { try { return element2.matches(selector); } catch (e) { return false; } }); } function isContainingBlock(elementOrCss) { const webkit = isWebKit(); const css = isElement(elementOrCss) ? getComputedStyle2(elementOrCss) : elementOrCss; return ["transform", "translate", "scale", "rotate", "perspective"].some((value3) => css[value3] ? css[value3] !== "none" : false) || (css.containerType ? css.containerType !== "normal" : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== "none" : false) || !webkit && (css.filter ? css.filter !== "none" : false) || ["transform", "translate", "scale", "rotate", "perspective", "filter"].some((value3) => (css.willChange || "").includes(value3)) || ["paint", "layout", "strict", "content"].some((value3) => (css.contain || "").includes(value3)); } function getContainingBlock(element2) { let currentNode = getParentNode(element2); while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { if (isContainingBlock(currentNode)) { return currentNode; } else if (isTopLayer(currentNode)) { return null; } currentNode = getParentNode(currentNode); } return null; } function isWebKit() { if (typeof CSS === "undefined" || !CSS.supports) return false; return CSS.supports("-webkit-backdrop-filter", "none"); } function isLastTraversableNode(node) { return ["html", "body", "#document"].includes(getNodeName(node)); } function getComputedStyle2(element2) { return getWindow(element2).getComputedStyle(element2); } function getNodeScroll(element2) { if (isElement(element2)) { return { scrollLeft: element2.scrollLeft, scrollTop: element2.scrollTop }; } return { scrollLeft: element2.scrollX, scrollTop: element2.scrollY }; } function getParentNode(node) { if (getNodeName(node) === "html") { return node; } const result = ( // Step into the shadow DOM of the parent of a slotted node. node.assignedSlot || // DOM Element detected. node.parentNode || // ShadowRoot detected. isShadowRoot(node) && node.host || // Fallback. getDocumentElement(node) ); return isShadowRoot(result) ? result.host : result; } function getNearestOverflowAncestor(node) { const parentNode = getParentNode(node); if (isLastTraversableNode(parentNode)) { return node.ownerDocument ? node.ownerDocument.body : node.body; } if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { return parentNode; } return getNearestOverflowAncestor(parentNode); } function getOverflowAncestors(node, list, traverseIframes) { var _node$ownerDocument2; if (list === void 0) { list = []; } if (traverseIframes === void 0) { traverseIframes = true; } const scrollableAncestor = getNearestOverflowAncestor(node); const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); const win = getWindow(scrollableAncestor); if (isBody) { const frameElement = getFrameElement(win); return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); } return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); } function getFrameElement(win) { return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; } // node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs function getCssDimensions(element2) { const css = getComputedStyle2(element2); let width = parseFloat(css.width) || 0; let height = parseFloat(css.height) || 0; const hasOffset = isHTMLElement(element2); const offsetWidth = hasOffset ? element2.offsetWidth : width; const offsetHeight = hasOffset ? element2.offsetHeight : height; const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; if (shouldFallback) { width = offsetWidth; height = offsetHeight; } return { width, height, $: shouldFallback }; } function unwrapElement(element2) { return !isElement(element2) ? element2.contextElement : element2; } function getScale(element2) { const domElement = unwrapElement(element2); if (!isHTMLElement(domElement)) { return createCoords(1); } const rect = domElement.getBoundingClientRect(); const { width, height, $ } = getCssDimensions(domElement); let x = ($ ? round(rect.width) : rect.width) / width; let y = ($ ? round(rect.height) : rect.height) / height; if (!x || !Number.isFinite(x)) { x = 1; } if (!y || !Number.isFinite(y)) { y = 1; } return { x, y }; } var noOffsets = /* @__PURE__ */ createCoords(0); function getVisualOffsets(element2) { const win = getWindow(element2); if (!isWebKit() || !win.visualViewport) { return noOffsets; } return { x: win.visualViewport.offsetLeft, y: win.visualViewport.offsetTop }; } function shouldAddVisualOffsets(element2, isFixed, floatingOffsetParent) { if (isFixed === void 0) { isFixed = false; } if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element2)) { return false; } return isFixed; } function getBoundingClientRect(element2, includeScale, isFixedStrategy, offsetParent) { if (includeScale === void 0) { includeScale = false; } if (isFixedStrategy === void 0) { isFixedStrategy = false; } const clientRect = element2.getBoundingClientRect(); const domElement = unwrapElement(element2); let scale = createCoords(1); if (includeScale) { if (offsetParent) { if (isElement(offsetParent)) { scale = getScale(offsetParent); } } else { scale = getScale(element2); } } const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); let x = (clientRect.left + visualOffsets.x) / scale.x; let y = (clientRect.top + visualOffsets.y) / scale.y; let width = clientRect.width / scale.x; let height = clientRect.height / scale.y; if (domElement) { const win = getWindow(domElement); const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; let currentWin = win; let currentIFrame = getFrameElement(currentWin); while (currentIFrame && offsetParent && offsetWin !== currentWin) { const iframeScale = getScale(currentIFrame); const iframeRect = currentIFrame.getBoundingClientRect(); const css = getComputedStyle2(currentIFrame); const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; x *= iframeScale.x; y *= iframeScale.y; width *= iframeScale.x; height *= iframeScale.y; x += left; y += top; currentWin = getWindow(currentIFrame); currentIFrame = getFrameElement(currentWin); } } return rectToClientRect({ width, height, x, y }); } function getWindowScrollBarX(element2, rect) { const leftScroll = getNodeScroll(element2).scrollLeft; if (!rect) { return getBoundingClientRect(getDocumentElement(element2)).left + leftScroll; } return rect.left + leftScroll; } function getHTMLOffset(documentElement, scroll, ignoreScrollbarX) { if (ignoreScrollbarX === void 0) { ignoreScrollbarX = false; } const htmlRect = documentElement.getBoundingClientRect(); const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 : ( // RTL
scrollbar. getWindowScrollBarX(documentElement, htmlRect) )); const y = htmlRect.top + scroll.scrollTop; return { x, y }; } function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { let { elements, rect, offsetParent, strategy } = _ref; const isFixed = strategy === "fixed"; const documentElement = getDocumentElement(offsetParent); const topLayer = elements ? isTopLayer(elements.floating) : false; if (offsetParent === documentElement || topLayer && isFixed) { return rect; } let scroll = { scrollLeft: 0, scrollTop: 0 }; let scale = createCoords(1); const offsets = createCoords(0); const isOffsetParentAnElement = isHTMLElement(offsetParent); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isHTMLElement(offsetParent)) { const offsetRect = getBoundingClientRect(offsetParent); scale = getScale(offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0); return { width: rect.width * scale.x, height: rect.height * scale.y, x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x, y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y }; } function getClientRects(element2) { return Array.from(element2.getClientRects()); } function getDocumentRect(element2) { const html = getDocumentElement(element2); const scroll = getNodeScroll(element2); const body = element2.ownerDocument.body; const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); let x = -scroll.scrollLeft + getWindowScrollBarX(element2); const y = -scroll.scrollTop; if (getComputedStyle2(body).direction === "rtl") { x += max(html.clientWidth, body.clientWidth) - width; } return { width, height, x, y }; } function getViewportRect(element2, strategy) { const win = getWindow(element2); const html = getDocumentElement(element2); const visualViewport = win.visualViewport; let width = html.clientWidth; let height = html.clientHeight; let x = 0; let y = 0; if (visualViewport) { width = visualViewport.width; height = visualViewport.height; const visualViewportBased = isWebKit(); if (!visualViewportBased || visualViewportBased && strategy === "fixed") { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } return { width, height, x, y }; } function getInnerBoundingClientRect(element2, strategy) { const clientRect = getBoundingClientRect(element2, true, strategy === "fixed"); const top = clientRect.top + element2.clientTop; const left = clientRect.left + element2.clientLeft; const scale = isHTMLElement(element2) ? getScale(element2) : createCoords(1); const width = element2.clientWidth * scale.x; const height = element2.clientHeight * scale.y; const x = left * scale.x; const y = top * scale.y; return { width, height, x, y }; } function getClientRectFromClippingAncestor(element2, clippingAncestor, strategy) { let rect; if (clippingAncestor === "viewport") { rect = getViewportRect(element2, strategy); } else if (clippingAncestor === "document") { rect = getDocumentRect(getDocumentElement(element2)); } else if (isElement(clippingAncestor)) { rect = getInnerBoundingClientRect(clippingAncestor, strategy); } else { const visualOffsets = getVisualOffsets(element2); rect = { x: clippingAncestor.x - visualOffsets.x, y: clippingAncestor.y - visualOffsets.y, width: clippingAncestor.width, height: clippingAncestor.height }; } return rectToClientRect(rect); } function hasFixedPositionAncestor(element2, stopNode) { const parentNode = getParentNode(element2); if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { return false; } return getComputedStyle2(parentNode).position === "fixed" || hasFixedPositionAncestor(parentNode, stopNode); } function getClippingElementAncestors(element2, cache) { const cachedResult = cache.get(element2); if (cachedResult) { return cachedResult; } let result = getOverflowAncestors(element2, [], false).filter((el) => isElement(el) && getNodeName(el) !== "body"); let currentContainingBlockComputedStyle = null; const elementIsFixed = getComputedStyle2(element2).position === "fixed"; let currentNode = elementIsFixed ? getParentNode(element2) : element2; while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { const computedStyle = getComputedStyle2(currentNode); const currentNodeIsContaining = isContainingBlock(currentNode); if (!currentNodeIsContaining && computedStyle.position === "fixed") { currentContainingBlockComputedStyle = null; } const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === "static" && !!currentContainingBlockComputedStyle && ["absolute", "fixed"].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element2, currentNode); if (shouldDropCurrentNode) { result = result.filter((ancestor) => ancestor !== currentNode); } else { currentContainingBlockComputedStyle = computedStyle; } currentNode = getParentNode(currentNode); } cache.set(element2, result); return result; } function getClippingRect(_ref) { let { element: element2, boundary, rootBoundary, strategy } = _ref; const elementClippingAncestors = boundary === "clippingAncestors" ? isTopLayer(element2) ? [] : getClippingElementAncestors(element2, this._c) : [].concat(boundary); const clippingAncestors = [...elementClippingAncestors, rootBoundary]; const firstClippingAncestor = clippingAncestors[0]; const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { const rect = getClientRectFromClippingAncestor(element2, clippingAncestor, strategy); accRect.top = max(rect.top, accRect.top); accRect.right = min(rect.right, accRect.right); accRect.bottom = min(rect.bottom, accRect.bottom); accRect.left = max(rect.left, accRect.left); return accRect; }, getClientRectFromClippingAncestor(element2, firstClippingAncestor, strategy)); return { width: clippingRect.right - clippingRect.left, height: clippingRect.bottom - clippingRect.top, x: clippingRect.left, y: clippingRect.top }; } function getDimensions(element2) { const { width, height } = getCssDimensions(element2); return { width, height }; } function getRectRelativeToOffsetParent(element2, offsetParent, strategy) { const isOffsetParentAnElement = isHTMLElement(offsetParent); const documentElement = getDocumentElement(offsetParent); const isFixed = strategy === "fixed"; const rect = getBoundingClientRect(element2, true, isFixed, offsetParent); let scroll = { scrollLeft: 0, scrollTop: 0 }; const offsets = createCoords(0); if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== "body" || isOverflowElement(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isOffsetParentAnElement) { const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); offsets.x = offsetRect.x + offsetParent.clientLeft; offsets.y = offsetRect.y + offsetParent.clientTop; } else if (documentElement) { offsets.x = getWindowScrollBarX(documentElement); } } const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0); const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x; const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y; return { x, y, width: rect.width, height: rect.height }; } function isStaticPositioned(element2) { return getComputedStyle2(element2).position === "static"; } function getTrueOffsetParent(element2, polyfill) { if (!isHTMLElement(element2) || getComputedStyle2(element2).position === "fixed") { return null; } if (polyfill) { return polyfill(element2); } let rawOffsetParent = element2.offsetParent; if (getDocumentElement(element2) === rawOffsetParent) { rawOffsetParent = rawOffsetParent.ownerDocument.body; } return rawOffsetParent; } function getOffsetParent(element2, polyfill) { const win = getWindow(element2); if (isTopLayer(element2)) { return win; } if (!isHTMLElement(element2)) { let svgOffsetParent = getParentNode(element2); while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) { if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) { return svgOffsetParent; } svgOffsetParent = getParentNode(svgOffsetParent); } return win; } let offsetParent = getTrueOffsetParent(element2, polyfill); while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) { offsetParent = getTrueOffsetParent(offsetParent, polyfill); } if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) { return win; } return offsetParent || getContainingBlock(element2) || win; } var getElementRects = async function(data) { const getOffsetParentFn = this.getOffsetParent || getOffsetParent; const getDimensionsFn = this.getDimensions; const floatingDimensions = await getDimensionsFn(data.floating); return { reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), floating: { x: 0, y: 0, width: floatingDimensions.width, height: floatingDimensions.height } }; }; function isRTL2(element2) { return getComputedStyle2(element2).direction === "rtl"; } var platform = { convertOffsetParentRelativeRectToViewportRelativeRect, getDocumentElement, getClippingRect, getOffsetParent, getElementRects, getClientRects, getDimensions, getScale, isElement, isRTL: isRTL2 }; function rectsAreEqual(a, b) { return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height; } function observeMove(element2, onMove) { let io = null; let timeoutId; const root = getDocumentElement(element2); function cleanup() { var _io; clearTimeout(timeoutId); (_io = io) == null || _io.disconnect(); io = null; } function refresh(skip, threshold) { if (skip === void 0) { skip = false; } if (threshold === void 0) { threshold = 1; } cleanup(); const elementRectForRootMargin = element2.getBoundingClientRect(); const { left, top, width, height } = elementRectForRootMargin; if (!skip) { onMove(); } if (!width || !height) { return; } const insetTop = floor(top); const insetRight = floor(root.clientWidth - (left + width)); const insetBottom = floor(root.clientHeight - (top + height)); const insetLeft = floor(left); const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; const options = { rootMargin, threshold: max(0, min(1, threshold)) || 1 }; let isFirstUpdate = true; function handleObserve(entries) { const ratio = entries[0].intersectionRatio; if (ratio !== threshold) { if (!isFirstUpdate) { return refresh(); } if (!ratio) { timeoutId = setTimeout(() => { refresh(false, 1e-7); }, 1e3); } else { refresh(false, ratio); } } if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element2.getBoundingClientRect())) { refresh(); } isFirstUpdate = false; } try { io = new IntersectionObserver(handleObserve, { ...options, // Handle