@featherk/composables 0.10.6 → 0.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"featherk-composables.es.js","sources":["../src/grid/useGridA11y.ts","../src/grid/useGridActiveFilter.ts","../src/address/useZipTextBox.ts","../src/form/useFieldsetTouchTracker.ts","../src/form/useFieldsetValidationKit.ts","../src/address/usStates.ts","../src/address/_useUSAddressFormData.ts","../src/address/_useUSAddressZip.ts","../src/address/_useUSAddressValidation.ts","../src/address/useUSAddress.ts","../../../node_modules/@vueuse/shared/index.mjs","../../../node_modules/@vueuse/core/index.mjs","../src/menu/usePopupMenu.ts","../src/date/useMaskedDateInput.ts","../src/range/useMaskedDateRangeInput.ts","../src/time/useMaskedTimeInput.ts","../src/trap/usePopupTrap.ts"],"sourcesContent":["/**\n * useGridA11y\n *\n * Composable that augments a Kendo-based grid with accessible keyboard navigation,\n * focus management, and custom behaviors for column header menus (filter/sort).\n */\n\nimport { ref, nextTick, onBeforeUnmount, type Ref } from \"vue\";\nimport type {\n SortDescriptor,\n GridColumnProps,\n GridSortChangeEvent,\n} from \"../types/kendo\";\n\nexport const useGridA11y = (\n gridRef: Ref<any>,\n options?: { focusableMenuSelectors?: string[] },\n) => {\n // Reference to the active filter button for focus management\n const activeFilterButton = ref<HTMLElement | null>(null);\n\n let a11yInitialized = false;\n\n // Mutation observer for dynamic elements\n let mutationsObserver: MutationObserver | null = null;\n\n // Observer to watch row changes within this grid instance so we can reassert tabindex\n let rowObserver: MutationObserver | null = null;\n\n const headerThTeardownCallbacks: Array<() => void> = [];\n\n const intraRowNavigationSelector =\n \".k-table-row[data-grid-row-index] [tabindex]\";\n\n const getGridRootElement = (): HTMLElement | null => {\n const host = gridRef?.value?.$el as HTMLElement | undefined;\n if (!host) return null;\n return host.closest(\".k-grid\") as HTMLElement | null;\n };\n\n const isWithinThisGridScope = (target: HTMLElement): boolean => {\n const gridRoot = getGridRootElement();\n if (!gridRoot) return false;\n\n // Preferred scope: Kendo's grid accessibility region.\n const ariaRoot = target.closest(\".k-grid-aria-root\") as HTMLElement | null;\n if (ariaRoot) {\n return gridRoot.contains(ariaRoot);\n }\n\n // Fallback for markup/theme variance across versions.\n const fallbackScope = target.closest(\n \".k-grid-header, .k-grid-content, .k-grid-content-locked\",\n ) as HTMLElement | null;\n return fallbackScope ? gridRoot.contains(fallbackScope) : false;\n };\n\n const isEnterActivation = (event: KeyboardEvent) => {\n return (\n event.key === \"Enter\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\"\n );\n };\n\n // Helper to get columns from gridRef\n const getColumns = () => {\n return (gridRef?.value as any)?.columns as Array<GridColumnProps>;\n };\n\n /**\n * Key activation handler for a header's column menu / filter button.\n *\n * Purpose:\n * - Enables keyboard users (Space / Enter) to open the Kendo column menu without\n * triggering unintended default behaviors (like sorting) that Kendo may bind\n * to key events on header elements.\n *\n * Behavior:\n * - Intercepts Space / Enter (including legacy \"Spacebar\") keys.\n * - Prevents default and stops propagation to suppress native scrolling or\n * upstream sort handlers.\n * - Records the event target in `activeFilterButton` so focus can be restored\n * after the menu closes (Escape handling in other logic).\n * - Programmatically clicks the target to open the column menu.\n *\n * Accessibility:\n * - Treats the underlying element as a button activation; complements ARIA\n * role=\"button\" applied elsewhere.\n *\n * Idempotency / Safety:\n * - Safe to attach to multiple buttons; only responds to specified keys.\n *\n * @param event KeyboardEvent originating on the column menu trigger.\n * @returns void\n */\n const handleFilterButtonKeyboardListener = (event: KeyboardEvent) => {\n const key = event.key || event.code;\n if ([\" \", \"Spacebar\", \"Space\"].includes(key) || isEnterActivation(event)) {\n // Prevents the unintended default sorting on keyboard event\n event.preventDefault();\n event.stopPropagation();\n\n // Store reference to the filter button when it is activated\n activeFilterButton.value = event.target as HTMLElement;\n\n // Trigger the click event on the filter button\n (event.target as HTMLElement).click();\n }\n };\n\n /**\n * Keyboard interaction handler for an open Kendo Grid column menu (filter / sort menu).\n *\n * Scope:\n * - Attached to each popup (\".k-animation-container\") when it appears.\n * - Handles navigation inside two possible UI states:\n * 1. Column menu list (\".k-columnmenu-item\") items.\n * 2. Filter form container (\".k-filter-menu-container\") with inputs/buttons.\n *\n * Keys:\n * - Escape:\n * * Closes semantic focus context by returning focus to `activeFilterButton`\n * (the header or trigger element that opened the menu) and exits.\n * - ArrowUp / ArrowDown (only when NOT in a filter form container):\n * * Cycles focus among menu items (wraps at ends).\n * - Tab within filter form container:\n * * Traps focus inside the filter form’s focusable elements; Shift+Tab reverses.\n * - Tab when not in a filter form container:\n * * Cycles focus among sibling trigger buttons adjacent to the originating header\n * (previousElementSibling / nextElementSibling of the active trigger).\n *\n * Focus Model:\n * - Relies on `activeFilterButton` (external ref) to restore focus after Escape or\n * to traverse sibling triggers on plain Tab outside a filter form.\n *\n * Guard Clauses:\n * - Returns immediately if no `activeFilterButton` is set (defensive).\n *\n * Assumptions:\n * - Menu markup follows Kendo’s structure with \".k-animation-container\" wrapper.\n * - Filter form presence is detectable via \".k-filter-menu-container\".\n * - Menu action items carry class \".k-columnmenu-item\".\n *\n * Side Effects:\n * - Calls focus() on controlled elements.\n * - Prevents default + stops propagation for handled keys to avoid native browser\n * tab order / scroll interference or Kendo’s default key handling.\n *\n * @param event KeyboardEvent dispatched on the popup container.\n * @returns void\n */\n const handleFilterMenuKeyboardListener = (event: KeyboardEvent) => {\n if (!activeFilterButton.value) return;\n if (event.code === \"Escape\") {\n event.stopPropagation();\n\n if (activeFilterButton.value) {\n activeFilterButton.value.focus();\n }\n return;\n }\n\n const menuItems = Array.from(\n document.querySelectorAll(\n \".k-animation-container .k-popup .k-column-menu .k-columnmenu-item-wrapper .k-columnmenu-item\",\n ),\n ) as HTMLElement[];\n\n const filterContainer = document.querySelector(\n \".k-animation-container .k-popup .k-column-menu .k-filter-menu-container\",\n );\n\n if (filterContainer) {\n if (event.code === \"Tab\") {\n const defaultFocusable = [\n // \".k-filter-menu-container .k-dropdownlist[tabindex='0']\",\n // \".k-filter-menu-container input.k-input-inner:not([tabindex='-1']):not([disabled])\",\n // \".k-filter-menu-container button:not([tabindex='-1']):not([disabled])\",\n // \".k-checkbox\",\n \".k-dropdownlist[tabindex='0']\",\n \"input.k-input-inner:not([tabindex='-1']):not([disabled])\",\n \"button:not([tabindex='-1']):not([disabled])\",\n \".k-checkbox\",\n ];\n const focusableSelectors =\n options?.focusableMenuSelectors ?? defaultFocusable;\n const focusableElements = Array.from(\n filterContainer.querySelectorAll(focusableSelectors.join(\",\")),\n ) as HTMLElement[];\n\n if (focusableElements.length === 0) return;\n\n const focusedIndex = focusableElements.findIndex(\n (el) => el === document.activeElement,\n );\n let targetIndex: number;\n if (focusedIndex === -1) {\n targetIndex = 0;\n } else if (event.shiftKey) {\n targetIndex =\n (focusedIndex - 1 + focusableElements.length) %\n focusableElements.length;\n } else {\n targetIndex = (focusedIndex + 1) % focusableElements.length;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n focusableElements[targetIndex]?.focus();\n }\n } else {\n if (event.code === \"ArrowUp\" || event.code === \"ArrowDown\") {\n event.preventDefault();\n event.stopPropagation();\n\n const focusedIndex = menuItems.findIndex(\n (item) => item === document.activeElement,\n );\n\n let targetIndex = focusedIndex;\n if (event.code === \"ArrowUp\") {\n targetIndex =\n focusedIndex > 0 ? focusedIndex - 1 : menuItems.length - 1;\n } else if (event.code === \"ArrowDown\") {\n targetIndex =\n focusedIndex < menuItems.length - 1 ? focusedIndex + 1 : 0;\n }\n\n menuItems[targetIndex]?.focus();\n return;\n }\n }\n\n if (event.code === \"Tab\") {\n event.preventDefault();\n event.stopPropagation();\n\n const currentTh = activeFilterButton.value?.parentElement;\n const targetTh = event.shiftKey\n ? currentTh?.previousElementSibling\n : currentTh?.nextElementSibling;\n const targetButton = targetTh?.querySelector(\n \"button, [role='button'], .k-link\",\n ) as HTMLElement;\n\n targetButton?.focus();\n }\n };\n\n /**\n * Observes the document body for Kendo Grid column menu (filter/sort menu) lifecycle.\n *\n * Responsibilities:\n * - Creates a MutationObserver watching document.body (childList + subtree) for nodes\n * with class \"k-animation-container\" (the popup wrapper Kendo inserts/ removes).\n * - For each added animation container:\n * * If the active header is NOT sortable (data-feather-k-sortable=\"false\"), removes\n * any menu wrapper whose text content includes \"sort\" (case-insensitive) to hide\n * irrelevant sort options from the popup UI.\n * * Attaches a keydown listener (handleFilterMenuKeyboardListener) to enable:\n * - ArrowUp / ArrowDown navigation through menu items\n * - Tab trapping / cycling in filter form content\n * - Escape to return focus to the triggering header/filter button\n * * Uses a retry loop (nextTick + setTimeout) to auto-focus & auto-activate a lone\n * menu item (common when only \"Filter\" is present) improving keyboard efficiency.\n * - For each removed animation container (and any nested ones), detaches the keydown listener.\n *\n * Behavior Notes:\n * - Sort option pruning only occurs when the triggering column is not sortable. The sortable\n * state is inferred from data attribute: data-feather-k-sortable === \"true\".\n * - Active trigger element is read from activeFilterButton ref.\n * - Focus restoration after Escape is handled inside handleFilterMenuKeyboardListener.\n *\n * Idempotency:\n * - Calling multiple times replaces the prior MutationObserver reference (without an\n * explicit disconnect first). Current usage calls it once during initA11y(). If future\n * calls are needed, consider disconnecting mutationsObserver beforehand to avoid\n * duplicate observers.\n *\n * Cleanup:\n * - Observer and event listeners are disconnected/removed by cleanupFilterButtonAccessibility().\n *\n * Side Effects:\n * - Mutates DOM (removal of unwanted sort menu items).\n * - Registers global (document-level subtree) MutationObserver.\n * - Adds / removes keydown event listeners on popup containers.\n *\n * Preconditions:\n * - document.body is available (browser environment).\n * - activeFilterButton may reference the header/filter button that opened the menu.\n *\n * @returns void\n */\n const setupFilterMenuObserver = () => {\n mutationsObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.classList.contains(\"k-animation-container\")) {\n const column = activeFilterButton.value as HTMLElement;\n if (column) {\n const sortable = column.dataset.featherKSortable === \"true\";\n if (!sortable) {\n nextTick(() => {\n const wrappers = element.querySelectorAll(\n \".k-columnmenu-item-wrapper\",\n );\n wrappers.forEach((wrapper) => {\n const sortMenu = wrapper.textContent\n ?.toLowerCase()\n .includes(\"sort\");\n if (sortMenu) {\n wrapper.remove();\n }\n });\n });\n }\n }\n element.addEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n nextTick(() => {\n const tryFocusMenuItem = () => {\n const menuItems = Array.from(\n element.querySelectorAll(\n \".k-animation-container .k-popup .k-column-menu .k-columnmenu-item-wrapper .k-columnmenu-item\",\n ),\n ) as HTMLElement[];\n\n if (menuItems.length === 1) {\n menuItems[0].focus();\n menuItems[0].click();\n (tryFocusMenuItem as any).attempts = 0; // reset attempts\n } else if (menuItems.length > 1) {\n (tryFocusMenuItem as any).attempts = 0; // reset attempts\n return;\n } else {\n if ((tryFocusMenuItem as any).attempts === undefined)\n (tryFocusMenuItem as any).attempts = 0;\n if ((tryFocusMenuItem as any).attempts++ < 3) {\n setTimeout(tryFocusMenuItem, 200);\n }\n }\n };\n tryFocusMenuItem();\n });\n }\n\n const animationContainers = element.querySelectorAll(\n \".k-animation-container\",\n );\n animationContainers.forEach((container) => {\n (container as HTMLElement).addEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n });\n }\n });\n\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.classList.contains(\"k-animation-container\")) {\n element.removeEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n }\n\n const animationContainers = element.querySelectorAll(\n \".k-animation-container\",\n );\n animationContainers.forEach((container) => {\n (container as HTMLElement).removeEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n });\n }\n });\n });\n });\n\n mutationsObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n };\n\n /**\n * Detects if an element is a form control or inside a form-like component.\n *\n * Purpose:\n * - Allows grid keyboard navigation to skip form controls, letting them handle\n * their own keyboard events naturally (e.g., cursor movement in inputs, spinners).\n *\n * Behavior:\n * - Returns true if the element itself is an input, textarea, select, or button.\n * - Returns true if the element is inside a Kendo form component:\n * * .k-picker-wrap (DatePicker, TimePicker, etc.)\n * * .k-input-inner (MaskedTextBox, TextBox, etc.)\n * * .k-textbox (generic Kendo textbox wrapper)\n * * [role=\"combobox\"] (dropdown, autocomplete, etc.)\n * - Returns false otherwise.\n *\n * @param el HTMLElement to check\n * @returns true if el is a form control that should manage its own keyboard events\n */\n const isFormControl = (el: HTMLElement): boolean => {\n const tagName = el.tagName.toLowerCase();\n\n // Check if element itself is a native form control\n if ([\"input\", \"textarea\", \"select\", \"button\"].includes(tagName)) {\n return true;\n }\n\n // Check if element is inside a Kendo form component wrapper\n if (\n el.closest(\n '.k-picker-wrap, .k-input-inner, .k-textbox, [role=\"combobox\"]',\n )\n ) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Keyboard handler for the Grid root element (bind to @keydown on <Grid>).\n *\n * Responsibilities:\n * - ArrowUp / ArrowDown: Move focus (and tabindex=\"0\") between sibling data rows\n * (.k-table-row[data-grid-row-index]).\n * - ArrowLeft / ArrowRight: When focus is on (or within) a data row, cycle focus\n * among tabbable descendants inside that row (as defined by\n * `intraRowNavigationSelector`). If the row itself has focus and no descendant\n * is focused, ArrowRight focuses the first intra-row tabbable element.\n * - Escape: If focus is currently inside a data row descendant, collapse focus\n * back to the parent row element (ensuring it has tabindex=\"0\").\n * - Enter / Space: Reserved for future enhancements and prevented when part of\n * the core navigation key group to avoid unintended native behaviors.\n *\n * Special Cases:\n * - If the event target is a grid column menu button (identified by both\n * \"k-grid-header-menu\" and \"k-grid-column-menu\" classes), the handler stores\n * it in `activeFilterButton` and returns so menu logic can proceed elsewhere.\n * - If the event target is a form control (input, button, Kendo component, etc.),\n * the handler exits early to allow the form control to manage its own keyboard\n * events naturally.\n *\n * Side Effects:\n * - Mutates tabindex attributes on row elements to maintain exactly one row\n * with tabindex=\"0\" in the vertical navigation path.\n * - Calls focus() on target rows or intra-row elements as navigation occurs.\n *\n * Defensive Checks:\n * - Exits early if the event object, its type, or target is missing.\n * - Exits early if target is a form control (via isFormControl).\n *\n * Assumptions:\n * - `gridRef.value.$el` is the Grid root (or inside it) and queryable.\n * - Data rows use the selector \".k-table-row[data-grid-row-index]\".\n *\n * @param e KeyboardEvent from the Grid's @keydown binding.\n * @returns void\n */\n const handleGridKeyDown = (e: KeyboardEvent) => {\n if (!e.type) return;\n\n if (!e) {\n return;\n }\n const target = e.target as HTMLElement;\n if (!target) return;\n\n const row = target.closest(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement | null;\n\n // Scope keyboard handling to this grid instance's a11y/content region.\n // This prevents toolbar and external controls from being intercepted.\n if (!isWithinThisGridScope(target)) {\n return;\n }\n\n // EXIT EARLY: Don't apply grid navigation to form controls.\n // Exception: allow ArrowLeft/ArrowRight intra-row navigation for focusable\n // controls that live inside a data row.\n const isIntraRowHorizontalNavKey = [\"ArrowLeft\", \"ArrowRight\"].includes(\n e.code,\n );\n if (isFormControl(target) && !(row && isIntraRowHorizontalNavKey)) {\n return;\n }\n\n // If Escape pressed and the active element is inside a data row,\n // move focus to the parent .k-table-row and ensure its tabindex=0.\n if (e.code === \"Escape\") {\n const focusedRow = (\n document.activeElement as HTMLElement | null\n )?.closest(\".k-table-row[data-grid-row-index]\") as HTMLElement | null;\n if (focusedRow) {\n // Justified: We're handling Escape to collapse focus from descendant to row.\n // Prevent default to override native browser behavior (dialog close, etc.)\n e.preventDefault();\n // Justified: Stop propagation to prevent parent containers from seeing this Escape.\n e.stopPropagation();\n try {\n const rows = Array.from(\n gridRef?.value.$el.querySelectorAll(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement[],\n );\n rows.forEach((r) => r.setAttribute(\"tabindex\", \"-1\"));\n } catch {\n // ignore if gridRef not available\n }\n focusedRow.setAttribute(\"tabindex\", \"0\");\n focusedRow.focus();\n return;\n }\n }\n\n // Handle navigation keys (only prevent/stop for keys we actually handle)\n if (\n [\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"Enter\",\n \"NumpadEnter\",\n \"Space\",\n ].includes(e.code)\n ) {\n // Check if target is a grid column menu button\n if (\n target.classList.contains(\"k-grid-header-menu\") &&\n target.classList.contains(\"k-grid-column-menu\")\n ) {\n activeFilterButton.value = target as HTMLElement;\n // Let menu logic proceed elsewhere; don't prevent or stop\n return;\n }\n\n // If event came from within a data row, handle row/intra-row navigation\n if (row) {\n if ([\"ArrowDown\", \"ArrowUp\"].includes(e.code)) {\n // Justified: We're handling ArrowUp/Down for vertical row navigation.\n // Prevent default to override native browser scrolling behavior.\n e.preventDefault();\n // Justified: Stop propagation to prevent parent containers from seeing this.\n e.stopPropagation();\n\n // Find the next/previous element sibling that actually has a tabindex.\n const findSiblingRow = (\n start: Element,\n direction: \"next\" | \"previous\",\n ): HTMLElement | null => {\n let sib =\n direction === \"next\"\n ? start.nextElementSibling\n : start.previousElementSibling;\n while (sib) {\n const el = sib as HTMLElement;\n try {\n if (el.classList.contains(\"k-table-row\")) {\n return el;\n }\n } catch {\n // Defensive: some nodes might throw when accessed; skip them.\n }\n sib =\n direction === \"next\"\n ? sib.nextElementSibling\n : sib.previousElementSibling;\n }\n return null;\n };\n\n const targetRow =\n e.code === \"ArrowDown\"\n ? findSiblingRow(row, \"next\")\n : findSiblingRow(row, \"previous\");\n\n if (targetRow) {\n row.setAttribute(\"tabindex\", \"-1\");\n targetRow.setAttribute(\"tabindex\", \"0\");\n targetRow.focus();\n }\n return;\n }\n if ([\"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n // Justified: We're handling ArrowLeft/Right for intra-row focus navigation.\n // Prevent default to override native text cursor movement only when we handle the event.\n e.preventDefault();\n // Justified: Stop propagation to prevent parent containers from seeing this.\n e.stopPropagation();\n\n const tabbable = row.querySelectorAll(\n intraRowNavigationSelector,\n ) as NodeListOf<HTMLElement>;\n if (tabbable.length === 0) return;\n\n // Find currently focused element within the row\n let currentIndex = Array.from(tabbable).findIndex(\n (el) => el === document.activeElement,\n );\n\n if (currentIndex === -1 && document.activeElement === row) {\n // If no element is focused, focus the first tabbable element\n (tabbable[0] as HTMLElement).focus();\n return;\n }\n\n if (e.code === \"ArrowRight\") {\n currentIndex =\n currentIndex === tabbable.length - 1 ? 0 : currentIndex + 1;\n } else if (e.code === \"ArrowLeft\") {\n currentIndex =\n currentIndex === 0 ? tabbable.length - 1 : currentIndex - 1;\n }\n (tabbable[currentIndex] as HTMLElement).focus();\n\n return;\n }\n }\n\n // Enter, Space: Not currently handled for grid navigation.\n // Don't prevent by default to allow native behavior or other handlers to respond.\n }\n };\n\n /**\n * Applies a FeatherK-specific CSS hook class to the Kendo Grid root element.\n *\n * Behavior:\n * - On the next Vue microtask (nextTick), locates the closest ancestor with the\n * \".k-grid\" class starting from `gridRef.value.$el`.\n * - Adds the \"fk-grid\" class to that element (no-op if already present).\n *\n * Purpose:\n * - Provides a styling hook so external FeatherK stylesheets can target grids\n * that have been enhanced by this composable without relying on brittle\n * selectors or global overrides.\n *\n * Safety / Idempotency:\n * - Safe to call multiple times; subsequent calls simply re-add the same class.\n * - Silently does nothing if `gridRef.value` or its `$el` is not yet available.\n *\n * Side Effects:\n * - Mutates the DOM by adding a CSS class to the grid root element.\n *\n * No cleanup is currently required (class need not be removed on unmount).\n *\n * @returns void\n */\n const setupGridStyling = () => {\n nextTick(() => {\n const gridHost = gridRef.value?.$el as Element | undefined;\n if (!gridHost || typeof gridHost.closest !== \"function\") return;\n\n const gridElement = gridHost.closest(\".k-grid\") as HTMLElement | null;\n if (gridElement) gridElement.classList.add(\"fk-grid\");\n });\n };\n\n /**\n * Sets up row-level (tr) keyboard navigation for the Kendo Grid instance.\n *\n * Behavior:\n * 1. Ensures exactly one data row ('.k-table-row[data-grid-row-index]') has tabindex=\"0\"\n * (the current keyboard focus target) and all others have tabindex=\"-1\".\n * 2. Establishes an internal helper (ensureSingleTabindex) that:\n * - Re-calculates which row should retain tabindex=\"0\" after DOM changes.\n * - Preserves a focused row if its descendants currently contain focus.\n * - Falls back to the first row when no focused row exists.\n * 3. Applies initial tabindex values immediately (first row gets focusable state).\n * 4. Observes the grid <tbody> ('.k-table-tbody') with a MutationObserver so that when\n * Kendo re-renders rows (sorting, filtering, paging, data updates), tabindex\n * constraints are re-applied with minimal work.\n *\n * Rationale:\n * The default Kendo Grid may introduce multiple tabbable descendants, making\n * keyboard traversal verbose. Restricting tab stops to a single row improves\n * accessibility by:\n * - Reducing unnecessary Tab presses.\n * - Enabling arrow-key driven intra-row navigation (handled elsewhere).\n *\n * Assumptions / Dependencies:\n * - gridRef.value.$el points to (or is inside) a rendered Kendo Grid root.\n * - Data rows carry class 'k-table-row' and attribute 'data-grid-row-index'.\n * - Runs in a browser environment (document, MutationObserver available).\n *\n * Error Handling:\n * - Wrapped in try/catch; failures are logged and do not throw upstream.\n *\n * Idempotency:\n * - Safe to call more than once; repeated calls will attach at most one observer\n * per invocation lifecycle (previous observer persists). Caller is expected\n * to avoid redundant calls or add future cleanup if needed.\n *\n * Side Effects:\n * - Mutates DOM attributes (tabindex) of grid row elements.\n * - Creates a MutationObserver stored in the closure (rowObserver) for teardown\n * via cleanupFilterButtonAccessibility().\n *\n * @returns void\n */\n const setupTrNavigation = () => {\n if (rowObserver) {\n // Already set up\n return;\n }\n try {\n /**\n * Ensure exactly one grid row is keyboard-focusable (tabindex=\"0\") and make all others unfocusable (tabindex=\"-1\").\n *\n * This function:\n * - Queries the grid DOM for rows using the selector \".k-table-row[data-grid-row-index]\".\n * - If no rows are found, it returns immediately.\n * - If exactly one row already has tabindex=\"0\", it does nothing.\n * - Otherwise it clears tabindex to \"-1\" on all matched rows, then:\n * - If the currently focused element is inside one of the matched rows, that row is preserved as tabindex=\"0\".\n * - If there is no such focused row, the first matched row is set to tabindex=\"0\".\n *\n * Notes:\n * - The function mutates DOM attributes (tabindex) of the matched row elements.\n * - It expects to run in a browser environment where `document.activeElement` is available and where\n * `gridRef.value.$el` points to the grid root element containing rows matching the selector.\n * - Any runtime errors encountered while querying or updating the DOM are caught and logged via console.error;\n * the function will not throw.\n *\n * @remarks\n * Use this helper to maintain a single tabbable row for keyboard navigation / accessibility purposes within a custom grid component.\n *\n * @returns void\n *\n * @example\n * // Keep one tabbable row in the grid after rendering or when rows change\n * ensureSingleTabindex();\n */\n const ensureSingleTabindex = () => {\n try {\n const rows = Array.from(\n gridRef.value.$el.querySelectorAll(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement[],\n );\n\n if (!rows || rows.length === 0) return;\n\n // Count rows that currently have tabindex=\"0\"\n const zeroTabRows = rows.filter(\n (r) => r.getAttribute(\"tabindex\") === \"0\",\n );\n\n // If exactly one row already has tabindex=0, nothing to do\n if (zeroTabRows.length === 1) return;\n\n // Prefer to preserve the currently focused row if it's inside the rows\n const focusedRow = rows.find(\n (r) =>\n r === document.activeElement ||\n r.contains(document.activeElement),\n );\n\n // Clear all to -1\n rows.forEach((r) => r.setAttribute(\"tabindex\", \"-1\"));\n\n if (focusedRow) {\n focusedRow.setAttribute(\"tabindex\", \"0\");\n return;\n }\n\n // Fallback: set first row to tabindex=0\n rows[0].setAttribute(\"tabindex\", \"0\");\n } catch (err) {\n console.error(\"ensureSingleTabindex error:\", err);\n }\n };\n\n // Initial setup\n const rows = Array.from(\n gridRef.value.$el.querySelectorAll(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement[],\n );\n if (rows.length > 0) {\n rows.forEach((row, index) => {\n row.setAttribute(\"tabindex\", index === 0 ? \"0\" : \"-1\");\n });\n }\n\n // Observe tbody for row changes (Kendo will recreate rows on sort/filter/paging)\n const tbody = gridRef.value.$el.querySelector(\".k-table-tbody\");\n if (tbody) {\n rowObserver = new MutationObserver(() => {\n // Reassert single tabindex after DOM changes. Keep work minimal.\n ensureSingleTabindex();\n });\n rowObserver.observe(tbody, { childList: true, subtree: true });\n }\n } catch (error) {\n console.error(\"Error setting up row navigation:\", error);\n }\n };\n\n /**\n * Initializes accessibility behavior for grid filter buttons.\n *\n * - Queries the DOM for elements matching the selector\n * \".k-grid-header .k-grid-header-menu.k-grid-column-menu\".\n * - For each matched element, sets the ARIA role to \"button\" and attaches a\n * keydown event listener using handleFilterButtonKeyboardListener.\n * - Invokes setupFilterMenuObserver() to observe changes to filter menus.\n * - Invokes setupHeaderThTriggers() to initialize any header-related triggers.\n *\n * @returns void\n */\n const setupFilterButtonAccessibility = () => {\n nextTick(() => {\n const filterSelector =\n \".k-grid-header .k-grid-header-menu.k-grid-column-menu\";\n const filterButtons = document.querySelectorAll(filterSelector);\n if (filterButtons) {\n filterButtons.forEach((el) => {\n el.setAttribute(\"role\", \"button\");\n (el as HTMLElement).addEventListener(\n \"keydown\",\n handleFilterButtonKeyboardListener,\n );\n });\n }\n\n setupFilterMenuObserver();\n\n setupHeaderThTriggers();\n });\n };\n\n /**\n * Cleans up all accessibility (a11y) resources installed by useGridA11y.\n *\n * Includes:\n * - Removes keydown listeners from column menu / filter buttons.\n * - Disconnects the column menu MutationObserver.\n * - Disconnects the row MutationObserver.\n * - Executes and clears header <th> teardown callbacks.\n *\n * Idempotent: safe to call multiple times.\n */\n const cleanupGridA11y = () => {\n const filterSelector =\n \".k-grid-header .k-grid-header-menu.k-grid-column-menu\";\n const filterButtons = document.querySelectorAll(filterSelector);\n if (filterButtons) {\n filterButtons.forEach((el) => {\n (el as HTMLElement).removeEventListener(\n \"keydown\",\n handleFilterButtonKeyboardListener,\n );\n });\n }\n\n if (mutationsObserver) {\n mutationsObserver.disconnect();\n mutationsObserver = null;\n }\n\n if (rowObserver) {\n rowObserver.disconnect();\n rowObserver = null;\n }\n\n headerThTeardownCallbacks.forEach((teardown) => teardown());\n headerThTeardownCallbacks.length = 0;\n };\n\n /**\n * Initializes accessible interaction handlers for header <th> cells in a Kendo-style grid.\n *\n * Finds all header cells under \".k-grid-header .k-table-thead th\" and for each header cell:\n * - Locates the column menu button (\".k-grid-header-menu.k-grid-column-menu\") and sets its tabindex to -1.\n * - Reads column metadata from getColumns() (external dependency) to set data attributes:\n * - data-feather-k-field (column.field)\n * - data-feather-k-filterable (\"false\" if column.filterable === false, otherwise \"true\")\n * - data-feather-k-sortable (\"false\" if column.sortable === false, otherwise \"true\")\n * - Determines whether the header is filterable or sortable using the above data attributes.\n * - Sets appropriate cursor styles (pointer for interactive headers, default otherwise).\n * - Configures ARIA/sniffable roles:\n * - If filterable: tabindex=\"0\", role=\"button\", aria-haspopup=\"menu\"\n * - If not filterable: tabindex=\"0\", role=\"columnheader\", aria-haspopup is removed\n *\n * Adds event handlers for each header cell:\n * - click handler:\n * - If filterable: prevents default/propagation and opens the column menu (via the menu button click). Also records the header element on activeFilterButton (external ref) for focus return.\n * - If not filterable but sortable: synthesizes an \"Enter\" KeyboardEvent and dispatches it on the header to trigger sort behavior and records activeFilterButton.\n * - Clicks originating from a column resizer (closest \".k-column-resizer\") are ignored.\n * - keydown handler (registered in capture phase for the header cell):\n * - On Enter or Space when filterable or sortable:\n * - Sets activeFilterButton to the header and focuses it.\n * - If filterable: prevents default/propagation and opens the column menu.\n * - If sortable: clicks the first \".k-link\" inside the header to trigger sort.\n *\n * Additionally, attaches a capturing keydown handler to the enclosing THEAD element (\".k-grid-header .k-table-thead\"):\n * - Prevents default/immediate propagation for Enter/Space on headers that are neither filterable nor sortable.\n * - This protects non-interactive header cells from activating default keyboard behavior.\n *\n * All event listeners added by this setup are recorded as teardown callbacks into the\n * headerThTeardownCallbacks array (external), so they can be removed later to avoid leaks.\n *\n * Notes / assumptions:\n * - Relies on globals/closures: document, getColumns(), activeFilterButton (ref-like object), and headerThTeardownCallbacks (array).\n * - Intended to enhance accessibility and keyboard interaction for grid headers by mapping Kendo column behaviors\n * to appropriate ARIA roles, keyboard handling, and focus management.\n *\n * @remarks\n * - Does not return a value; side effects are applied directly to DOM and external state.\n * - Uses attribute-based decisions to maintain compatibility with dynamically-updated column metadata.\n *\n * @returns void\n */\n const setupHeaderThTriggers = () => {\n const headerCells = document.querySelectorAll(\n \".k-grid-header .k-table-thead th\",\n );\n\n headerCells.forEach((th, index) => {\n if ((th as HTMLElement).dataset.featherKHeaderBound === \"true\") {\n return;\n }\n\n const btn = th.querySelector(\n \".k-grid-header-menu.k-grid-column-menu\",\n ) as HTMLElement | null;\n if (!btn) return;\n\n const columns = getColumns();\n\n if (columns && columns[index]) {\n const field = columns[index].field ?? \"\";\n th.setAttribute(\"data-feather-k-field\", field);\n th.setAttribute(\n \"data-feather-k-filterable\",\n columns[index].filterable === false ? \"false\" : \"true\",\n );\n th.setAttribute(\n \"data-feather-k-sortable\",\n columns[index].sortable === false ? \"false\" : \"true\",\n );\n }\n\n const filterable =\n (th as HTMLElement).dataset.featherKFilterable !== \"false\";\n const sortable = (th as HTMLElement).dataset.featherKSortable !== \"false\";\n\n btn.setAttribute(\"tabindex\", \"-1\");\n\n if (filterable || sortable) {\n (th as HTMLElement).style.cursor = \"pointer\";\n } else {\n (th as HTMLElement).style.cursor = \"default\";\n }\n if (filterable) {\n th.setAttribute(\"tabindex\", \"0\");\n th.setAttribute(\"role\", \"button\");\n th.setAttribute(\"aria-haspopup\", \"menu\");\n } else {\n th.setAttribute(\"tabindex\", \"0\");\n th.setAttribute(\"role\", \"columnheader\");\n th.removeAttribute(\"aria-haspopup\");\n }\n const openMenu = (e: Event | KeyboardEvent) => {\n if ((e.target as HTMLElement)?.closest(\".k-column-resizer\")) return;\n\n activeFilterButton.value = th as HTMLElement; // focus return target\n btn.click();\n };\n\n const clickHandler = (e: Event) => {\n if (filterable) {\n activeFilterButton.value = th as HTMLElement;\n e.preventDefault();\n e.stopPropagation();\n openMenu(e);\n } else if (sortable) {\n activeFilterButton.value = th as HTMLElement;\n const columnLink = th.querySelector(\".k-link\");\n if (columnLink) {\n (columnLink as HTMLElement).click();\n }\n }\n };\n (th as HTMLElement).addEventListener(\"click\", clickHandler);\n headerThTeardownCallbacks.push(() => {\n (th as HTMLElement).removeEventListener(\"click\", clickHandler);\n });\n\n // Keyboard activation for sortable/filterable header cells.\n //\n // Enter, Numpad Enter, and Space are intentionally handled identically here:\n // - preventDefault + stopPropagation are applied for ALL three keys so\n // none of them leak to native browser or Kendo's own key handlers,\n // which could trigger a duplicate or conflicting sort/scroll action.\n // - For sortable-only headers the sort is triggered by clicking the\n // .k-link element directly (the same path the browser follows on a\n // real mouse click and what Space was already using). This keeps\n // the asc → desc → unsorted cycle consistent regardless of key used.\n //\n // IMPORTANT: Do not restore the old synthetic KeyboardEvent dispatch\n // (th.dispatchEvent(new KeyboardEvent('keydown', { key:'Enter', ... }))).\n // That approach caused Enter/Numpad Enter to re-enter this handler\n // recursively and be silently swallowed by the isSorting guard in\n // ClaimLog.vue, making every press after the first appear to do nothing.\n const keyHandler = (e: KeyboardEvent) => {\n if (\n (isEnterActivation(e) || e.code === \"Space\") &&\n (filterable || sortable)\n ) {\n e.preventDefault();\n e.stopPropagation();\n\n activeFilterButton.value = th as HTMLElement;\n activeFilterButton.value.focus();\n if (filterable) {\n openMenu(e);\n } else if (sortable) {\n const columnLink = th.querySelector(\".k-link\");\n if (columnLink) {\n (columnLink as HTMLElement).click();\n }\n }\n }\n };\n (th as HTMLElement).addEventListener(\"keydown\", keyHandler, true);\n headerThTeardownCallbacks.push(() => {\n (th as HTMLElement).removeEventListener(\"keydown\", keyHandler, true);\n });\n\n (th as HTMLElement).dataset.featherKHeaderBound = \"true\";\n });\n\n const thead = document.querySelector(\".k-grid-header .k-table-thead\");\n if (\n thead &&\n (thead as HTMLElement).dataset.featherKHeaderBound !== \"true\"\n ) {\n const theadKeyboardHandler = (e: KeyboardEvent) => {\n const th = (e.target as HTMLElement).closest(\"th\");\n if (!th) return;\n if (\n (isEnterActivation(e) || e.code === \"Space\") &&\n th.dataset.featherKFilterable === \"false\" &&\n th.dataset.featherKSortable === \"false\"\n ) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n };\n (thead as HTMLElement).addEventListener(\n \"keydown\",\n theadKeyboardHandler,\n true, // NOTE: capture phase\n );\n headerThTeardownCallbacks.push(() => {\n (thead as HTMLElement).removeEventListener(\n \"keydown\",\n theadKeyboardHandler,\n true,\n );\n });\n\n (thead as HTMLElement).dataset.featherKHeaderBound = \"true\";\n }\n };\n\n /**\n * Handles grid sort change events with special-casing for column menu interactions and non-sortable columns.\n *\n * This function inspects the DOM target that triggered the sort change and the grid column metadata to\n * determine whether the default sort handling should proceed or be suppressed. It:\n * - Ignores events coming from the column menu toggle (element with class \"k-link\").\n * - When a column menu item (element with class \"k-columnmenu-item\") is selected for a non-sortable field,\n * prevents modifying the sort descriptors for that field.\n * - Otherwise, if a custom handler is provided, schedules focusing of the active filter button (if present)\n * on the next tick and then invokes the custom handler with the original event.\n *\n * @param event - Optional GridSortChangeEvent. The implementation expects a nested structure where\n * the originating HTMLElement is available at `event.event.event.target`, the field at\n * `event.event.field`, and the current sort descriptors at `event.event.sort`.\n * @param customHandler - Optional callback to be executed when the standard handling path is allowed.\n * The callback will be invoked inside `nextTick` after attempting to focus the\n * active filter button.\n * @returns void\n *\n * @remarks\n * - This function relies on `getColumns()` to obtain column metadata and on an `activeFilterButton` ref\n * to optionally restore focus. It performs early returns when the event target or columns are unavailable,\n * or when the column menu toggle was the source of the event.\n */\n const handleSortChange = function (\n event?: GridSortChangeEvent,\n customHandler?: any,\n ) {\n const target = event?.event?.event.target as HTMLElement;\n const columns = getColumns();\n if (!target || !columns) return;\n\n const menuOpened = target.classList.contains(\"k-grid-header-menu\");\n const menuItemSelected = target.classList.contains(\"k-columnmenu-item\");\n\n const fieldIsSortable =\n columns.find((c) => c.field === event?.event?.field)?.sortable && true;\n\n if (menuOpened) return;\n\n if (menuItemSelected && !fieldIsSortable) {\n const sortDescriptor = event?.event?.sort as SortDescriptor[];\n sortDescriptor?.filter(\n (s: SortDescriptor) => s.field !== event?.event?.field,\n );\n return;\n }\n if (typeof customHandler === \"function\") {\n nextTick(() => {\n if (activeFilterButton.value) activeFilterButton.value.focus();\n customHandler(event);\n // Kendo recreates header <th> nodes after each sort, which discards any\n // previously attached keydown listeners. Re-running setupHeaderThTriggers\n // here (after the sort data has been applied) reattaches those listeners\n // to the new nodes so subsequent Enter/Space presses continue to work.\n nextTick(() => {\n setupHeaderThTriggers();\n });\n });\n }\n };\n\n /**\n * Initialize accessibility (a11y) features for the grid.\n *\n * This function is idempotent — it will perform initialization only once.\n * On the first call it sets the internal `a11yInitialized` flag and runs\n * the following setup routines:\n * - setupGridStyling()\n * - setupTrNavigation()\n * - setupFilterButtonAccessibility()\n *\n * Subsequent calls do nothing.\n *\n * Use this during component setup/mount to ensure grid accessibility helpers\n * are registered exactly once.\n *\n * @returns void\n */\n const initA11y = () => {\n if (a11yInitialized) return;\n try {\n setupGridStyling();\n setupTrNavigation();\n setupFilterButtonAccessibility();\n a11yInitialized = true;\n } catch (err) {\n console.error(\"initA11y failed:\", err);\n // Clean up any partial listeners/observers so a retry can succeed.\n cleanupGridA11y();\n }\n };\n\n onBeforeUnmount(() => {\n cleanupGridA11y();\n });\n return {\n activeFilterButton,\n handleGridKeyDown,\n handleSortChange,\n initA11y,\n };\n};\n","import { type Ref } from \"vue\";\nimport type {\n CompositeFilterDescriptor,\n FilterDescriptor,\n} from \"@progress/kendo-data-query\";\n\n/**\n * Type guard for composite filter groups.\n */\nconst isCompositeFilter = (\n filterItem: unknown,\n): filterItem is CompositeFilterDescriptor => {\n return (\n !!filterItem &&\n typeof filterItem === \"object\" &&\n \"filters\" in filterItem &&\n Array.isArray((filterItem as CompositeFilterDescriptor).filters)\n );\n};\n\n/**\n * Type guard for leaf filter nodes.\n */\nconst isFilterDescriptor = (\n filterItem: unknown,\n): filterItem is FilterDescriptor => {\n return (\n !!filterItem && typeof filterItem === \"object\" && \"field\" in filterItem\n );\n};\n\n/**\n * Recursively checks whether a filter tree contains a filter for a specific field.\n */\nconst hasFieldFilterRecursive = (\n filterItem: unknown,\n field: string,\n): boolean => {\n if (!filterItem || typeof filterItem !== \"object\") {\n return false;\n }\n\n if (!isCompositeFilter(filterItem)) {\n if (!isFilterDescriptor(filterItem)) {\n return false;\n }\n return filterItem.field === field;\n }\n\n return filterItem.filters.some((child) =>\n hasFieldFilterRecursive(child, field),\n );\n};\n\n/**\n * Returns a reactive function that resolves to `\"active\"` when the given\n * field has a filter applied in the current filter tree, or `\"\"` when it\n * does not.\n *\n * Bind the returned function directly to column `headerClassName` inside a\n * `computed` — Vue tracks the `filterRef` dependency automatically; no\n * manual update call is needed.\n *\n * @param filterRef - Reactive grid filter descriptor (the same ref bound to the Grid).\n * @returns `(field: string) => \"active\" | \"\"`\n *\n * @example\n * const activeClass = useGridActiveFilter(filterRef);\n *\n * const columns = computed(() => [\n * { field: \"ProductName\", headerClassName: activeClass(\"ProductName\") },\n * ]);\n */\nexport const useGridActiveFilter = (\n filterRef: Ref<CompositeFilterDescriptor | undefined>,\n): ((field: string) => string) => {\n return (field: string): string => {\n if (!filterRef.value?.filters) return \"\";\n return filterRef.value.filters.some((f) =>\n hasFieldFilterRecursive(f, field),\n )\n ? \"active\"\n : \"\";\n };\n};\n","import { computed, nextTick, ref } from \"vue\";\nimport type { ComputedRef, Ref } from \"vue\";\nimport type { TextBoxChangeEvent } from \"@progress/kendo-vue-inputs\";\n\nconst DEFAULT_ZIP_ERROR_MESSAGE =\n \"Enter a valid ZIP code with exactly 5 or 9 digits.\";\n\nconst formatZipDisplay = (input: string): string => {\n const digits = input.replace(/\\D/g, \"\").slice(0, 9);\n return digits.length > 5\n ? `${digits.slice(0, 5)}-${digits.slice(5)}`\n : digits;\n};\n\n// Translate a formatted caret into the number of ZIP digits before it.\nconst countDigitsBeforeIndex = (value: string, index: number): number => {\n return value.slice(0, Math.max(0, index)).replace(/\\D/g, \"\").length;\n};\n\n// Map a digit index back to the formatted ZIP display position.\nconst digitIndexToDisplayIndex = (digitIndex: number): number => {\n if (digitIndex <= 5) {\n return digitIndex;\n }\n\n return Math.min(digitIndex + 1, 10);\n};\n\nexport type ZipPayload = {\n zip: string;\n};\n\nexport type UseZipTextBoxOptions = {\n /** The `id` of the Kendo `TextBox` input element. Must match the `id` prop\n * passed to `<TextBox>`. Used by `submitAndValidate({ focus: true })` to focus\n * the field when validation fails. */\n id: string;\n initialValue?: string;\n errorMessage?: string;\n required?: boolean;\n};\n\nexport type UseZipTextBoxState = {\n zipDisplay: Ref<string>;\n submitted: Ref<boolean>;\n errorMessage: Ref<string>;\n};\n\nexport type UseZipTextBoxBindings = {\n /** Bind to `:wrapperClass` on `<TextBox>` so Kendo applies `fk-zip-textbox`\n * to its wrapper element on every render — no manual DOM manipulation needed. */\n readonly wrapperClass: string;\n};\n\nexport type UseZipTextBoxDerived = {\n readonly zipRaw: ComputedRef<string>;\n readonly isZipValid: ComputedRef<boolean>;\n readonly showZipError: ComputedRef<boolean>;\n readonly textBoxValid: ComputedRef<boolean>;\n readonly textBoxValidate: ComputedRef<boolean>;\n};\n\nexport type UseZipTextBoxActions = {\n handleZipInput: (...args: unknown[]) => void;\n submitAndValidate: (opts?: { focus?: boolean }) => boolean;\n buildPayload: () => ZipPayload;\n};\n\nexport type UseZipTextBoxApi = {} & UseZipTextBoxState &\n UseZipTextBoxBindings &\n UseZipTextBoxDerived &\n UseZipTextBoxActions;\n\nexport const useZipTextBox = (\n options: UseZipTextBoxOptions,\n): UseZipTextBoxApi => {\n const zipDisplay = ref(formatZipDisplay(options.initialValue ?? \"\"));\n const submitted = ref(false);\n const errorMessage = ref(\n options.errorMessage?.trim() || DEFAULT_ZIP_ERROR_MESSAGE,\n );\n\n const zipRaw = computed(() => zipDisplay.value.replace(/\\D/g, \"\"));\n const isZipValid = computed(() => {\n const length = zipRaw.value.length;\n return length === 5 || length === 9;\n });\n const showZipError = computed(() => submitted.value && !isZipValid.value);\n const textBoxValid = computed(() => !submitted.value || isZipValid.value);\n const textBoxValidate = computed(() => submitted.value);\n\n // Restore the caret after Vue re-renders the formatted ZIP value.\n const restoreCaret = (\n inputElement: HTMLInputElement,\n digitIndex: number,\n ): void => {\n const caretIndex = digitIndexToDisplayIndex(digitIndex);\n\n nextTick(() => {\n if (!inputElement.isConnected) {\n return;\n }\n\n inputElement.setSelectionRange(caretIndex, caretIndex);\n });\n };\n\n const handleZipInput = (...args: unknown[]) => {\n const event = args[0] as TextBoxChangeEvent | undefined;\n const nativeEvent = event?.event as InputEvent | undefined;\n const inputElement = nativeEvent?.target as HTMLInputElement | null;\n const nextValue = event?.value;\n const inputValue = Array.isArray(nextValue)\n ? nextValue.join(\"\")\n : String(nextValue ?? \"\");\n\n // Capture the caret before rewriting the controlled value.\n const digitIndex =\n inputElement?.selectionStart !== undefined &&\n inputElement.selectionStart !== null\n ? countDigitsBeforeIndex(\n inputElement.value,\n inputElement.selectionStart,\n )\n : inputValue.replace(/\\D/g, \"\").length;\n\n zipDisplay.value = formatZipDisplay(inputValue);\n\n // Put the caret back where the user was typing.\n if (inputElement) {\n restoreCaret(inputElement, digitIndex);\n }\n };\n\n const submitAndValidate = (opts?: { focus?: boolean }): boolean => {\n submitted.value = true;\n const valid = isZipValid.value;\n if (!valid && opts?.focus) {\n nextTick(() => {\n const inputEl = document.getElementById(\n options.id,\n ) as HTMLInputElement | null;\n inputEl?.focus();\n });\n }\n return valid;\n };\n\n const buildPayload = (): ZipPayload => {\n return { zip: zipRaw.value };\n };\n\n return {\n // writable state\n zipDisplay,\n submitted,\n errorMessage,\n // bindings\n wrapperClass: \"fk-zip-textbox\",\n // derived state\n zipRaw,\n isZipValid,\n showZipError,\n textBoxValid,\n textBoxValidate,\n // actions\n handleZipInput,\n submitAndValidate,\n buildPayload,\n };\n};\n","import { ref, watchEffect } from \"vue\";\nimport type { Ref } from \"vue\";\n\nexport interface UseFieldsetTouchTrackerOptions {\n /**\n * Function that returns whether the fieldset is valid.\n */\n isValid: () => boolean;\n}\n\nexport interface UseFieldsetTouchTrackerApi {\n touched: Ref<boolean>;\n onFocusout: (event: FocusEvent) => void;\n reset: () => void;\n}\n\nexport function useFieldsetTouchTracker(\n fieldsetRef: Ref<HTMLFieldSetElement | null>,\n options: UseFieldsetTouchTrackerOptions,\n): UseFieldsetTouchTrackerApi {\n const touched = ref(false);\n\n // Keep aria-invalid synchronized with the composed validator function.\n watchEffect(() => {\n fieldsetRef.value?.setAttribute(\"aria-invalid\", String(!options.isValid()));\n });\n\n function onFocusout(event: FocusEvent) {\n const fieldset =\n fieldsetRef.value ?? (event.currentTarget as HTMLElement | null);\n const next = event.relatedTarget as Node | null;\n\n if (!fieldset || !fieldset.contains(next)) {\n touched.value = true;\n }\n }\n\n function reset() {\n touched.value = false;\n }\n\n return { touched, onFocusout, reset };\n}\n","import {\n computed,\n ref,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n type Ref,\n} from \"vue\";\nimport { useFieldsetTouchTracker } from \"./useFieldsetTouchTracker\";\n\nexport interface UseFieldsetValidationKitOptions {\n /**\n * Consumer-owned submit state. The kit reads this value but never mutates it.\n */\n submitted: MaybeRefOrGetter<boolean>;\n /**\n * Returns the real validity of the fieldset when validation is active.\n */\n isValid: () => boolean;\n}\n\n/**\n * API returned by {@link useFieldsetValidationKit}.\n */\nexport interface UseFieldsetValidationKitApi {\n /**\n * Becomes true after the first focus transition that leaves the fieldset.\n */\n touched: Ref<boolean>;\n /**\n * Delayed validation gate. True when either submitted or touched is true.\n */\n fieldsetValidate: ComputedRef<boolean>;\n /**\n * Forwards fieldset focusout events to the internal touch tracker.\n */\n onFocusout: (event: FocusEvent) => void;\n /**\n * Clears touched state and suppresses one immediate post-reset focusout.\n *\n * This avoids re-activating delayed validation from reset-related focus\n * transitions (for example, clicking Reset while an input is focused).\n */\n reset: () => void;\n /**\n * Wraps a field-level validity source with delayed validation behavior.\n */\n createFieldValidity: (\n isValid: MaybeRefOrGetter<boolean>,\n ) => ComputedRef<boolean>;\n /**\n * Builds a named map of delayed field validity refs for ergonomic form setup.\n */\n createFieldValidationsMap: <\n T extends Record<string, MaybeRefOrGetter<boolean>>,\n >(\n isValidMap: T,\n ) => { [K in keyof T]: ComputedRef<boolean> };\n /**\n * Moves focus to the first invalid Kendo control found within the provided form.\n */\n focusFirstInvalidField: (\n formRef: MaybeRefOrGetter<HTMLFormElement | null>,\n ) => void;\n}\n\n/**\n * Orchestrates delayed fieldset validation using submit state and touch state.\n *\n * Intended as the primary form-level API for gated validity UX:\n * - validation displays after submit or first fieldset exit\n * - field-level validity can be composed through helper factories\n * - invalid focus and reset behavior are handled consistently\n *\n * @param fieldsetRef Reference to the fieldset whose focus transitions are tracked.\n * @param options Consumer-provided submit state and base validity function.\n * @returns Validation kit API for wiring fieldset-level and field-level behavior.\n */\nexport function useFieldsetValidationKit(\n fieldsetRef: Ref<HTMLFieldSetElement | null>,\n options: UseFieldsetValidationKitOptions,\n): UseFieldsetValidationKitApi {\n const touched = ref(false);\n // After reset, browser/UI focus can emit an immediate focusout that does not\n // represent a user intentionally leaving the fieldset. Ignore exactly one\n // focusout to prevent delayed validation from re-arming right away.\n const suppressNextTouch = ref(false);\n const fieldsetValidate = computed(\n () => toValue(options.submitted) || touched.value,\n );\n\n // Computes the effective validity of the fieldset, taking into account the\n // delayed validation gate.\n const fieldsetIsValid = computed(() => {\n return !fieldsetValidate.value || options.isValid();\n });\n\n // Initializes the internal touch tracker for the fieldset.\n const tracker = useFieldsetTouchTracker(fieldsetRef, {\n isValid: () => fieldsetIsValid.value,\n });\n\n // Creates a delayed validity ref for a single field based on the fieldset's\n // validation state.\n function createFieldValidity(isValid: MaybeRefOrGetter<boolean>) {\n return computed(() => !fieldsetValidate.value || toValue(isValid));\n }\n\n // Builds a named map of delayed field validity refs from the provided validity map.\n // (e.g. { firstName: () => firstNameValid, lastName: () => lastNameValid })\n // show example map?\n // Example usage:\n // const fieldValidations = createFieldValidationsMap({\n // firstName: () => firstNameValid,\n // lastName: () => lastNameValid,\n // });\n // The returned object will have the same keys as the input map, but each value will\n // be a computed ref that reflects the delayed validation state.\n function createFieldValidationsMap<\n T extends Record<string, MaybeRefOrGetter<boolean>>,\n >(isValidMap: T) {\n return Object.fromEntries(\n Object.entries(isValidMap).map(([key, isValid]) => [\n key,\n createFieldValidity(isValid),\n ]),\n ) as { [K in keyof T]: ComputedRef<boolean> };\n }\n\n // Focuses the first invalid field within the provided FORM.\n // TODO: Leaving this here for now as a convenience, but it does not belong\n // in the core validation kit. This should be its own composable or utility\n // function. I may move this to USAddress component-specific logic.\n function focusFirstInvalidField(\n formRef: MaybeRefOrGetter<HTMLFormElement | null>,\n ) {\n const form = toValue(formRef);\n if (!form) return;\n\n const firstInvalid = form.querySelector(\n '.k-invalid input, .k-invalid[tabindex=\"0\"]',\n ) as HTMLElement | null;\n\n firstInvalid?.focus();\n }\n\n // Forwards fieldset focusout events to the internal touch tracker.\n function onFocusout(event: FocusEvent) {\n if (suppressNextTouch.value) {\n // Consume the first post-reset focusout caused by reset/click focus\n // churn.\n suppressNextTouch.value = false;\n return;\n }\n\n tracker.onFocusout(event);\n\n if (tracker.touched.value) {\n touched.value = true;\n }\n }\n\n // Resets the touched state and suppresses one immediate post-reset focusout.\n function reset() {\n touched.value = false;\n suppressNextTouch.value = true;\n tracker.reset();\n }\n\n return {\n touched,\n fieldsetValidate,\n onFocusout,\n reset,\n createFieldValidity,\n createFieldValidationsMap,\n focusFirstInvalidField,\n };\n}\n","export type UsStateOption = {\n label: string;\n value: string;\n};\n\nexport const US_STATES_BY_ABBREVIATION: UsStateOption[] = [\n { label: \"Alabama\", value: \"AL\" },\n { label: \"Alaska\", value: \"AK\" },\n { label: \"Arizona\", value: \"AZ\" },\n { label: \"Arkansas\", value: \"AR\" },\n { label: \"California\", value: \"CA\" },\n { label: \"Colorado\", value: \"CO\" },\n { label: \"Connecticut\", value: \"CT\" },\n { label: \"Delaware\", value: \"DE\" },\n { label: \"Florida\", value: \"FL\" },\n { label: \"Georgia\", value: \"GA\" },\n { label: \"Hawaii\", value: \"HI\" },\n { label: \"Idaho\", value: \"ID\" },\n { label: \"Illinois\", value: \"IL\" },\n { label: \"Indiana\", value: \"IN\" },\n { label: \"Iowa\", value: \"IA\" },\n { label: \"Kansas\", value: \"KS\" },\n { label: \"Kentucky\", value: \"KY\" },\n { label: \"Louisiana\", value: \"LA\" },\n { label: \"Maine\", value: \"ME\" },\n { label: \"Maryland\", value: \"MD\" },\n { label: \"Massachusetts\", value: \"MA\" },\n { label: \"Michigan\", value: \"MI\" },\n { label: \"Minnesota\", value: \"MN\" },\n { label: \"Mississippi\", value: \"MS\" },\n { label: \"Missouri\", value: \"MO\" },\n { label: \"Montana\", value: \"MT\" },\n { label: \"Nebraska\", value: \"NE\" },\n { label: \"Nevada\", value: \"NV\" },\n { label: \"New Hampshire\", value: \"NH\" },\n { label: \"New Jersey\", value: \"NJ\" },\n { label: \"New Mexico\", value: \"NM\" },\n { label: \"New York\", value: \"NY\" },\n { label: \"North Carolina\", value: \"NC\" },\n { label: \"North Dakota\", value: \"ND\" },\n { label: \"Ohio\", value: \"OH\" },\n { label: \"Oklahoma\", value: \"OK\" },\n { label: \"Oregon\", value: \"OR\" },\n { label: \"Pennsylvania\", value: \"PA\" },\n { label: \"Rhode Island\", value: \"RI\" },\n { label: \"South Carolina\", value: \"SC\" },\n { label: \"South Dakota\", value: \"SD\" },\n { label: \"Tennessee\", value: \"TN\" },\n { label: \"Texas\", value: \"TX\" },\n { label: \"Utah\", value: \"UT\" },\n { label: \"Vermont\", value: \"VT\" },\n { label: \"Virginia\", value: \"VA\" },\n { label: \"Washington\", value: \"WA\" },\n { label: \"West Virginia\", value: \"WV\" },\n { label: \"Wisconsin\", value: \"WI\" },\n { label: \"Wyoming\", value: \"WY\" },\n];\n","import { reactive } from \"vue\";\n\nexport interface USAddressFormData {\n address1: string;\n address2: string;\n city: string;\n state: string | null;\n zip: string;\n}\n\n/**\n * Reads the value from an input event payload.\n * @param payload - The input event payload.\n * @returns The string value of the input.\n */\nfunction readInputValue(payload: unknown): string {\n if (payload && typeof payload === \"object\" && \"value\" in payload) {\n const value = (payload as { value: unknown }).value;\n return typeof value === \"string\" ? value : String(value ?? \"\");\n }\n return \"\";\n}\n\n/**\n * Manages the form data model for a US address.\n *\n * Note: this is internal UI data state, not just the US \"state\" (AL, CA, etc.) field.\n * @returns An object containing form data and field event handlers.\n */\nexport function useUSAddressFormData() {\n const formData = reactive<USAddressFormData>({\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: null,\n zip: \"\",\n });\n\n const onAddress1Input = (...args: unknown[]) => {\n formData.address1 = readInputValue(args[0]);\n };\n\n const onAddress2Input = (...args: unknown[]) => {\n formData.address2 = readInputValue(args[0]);\n };\n\n const onCityInput = (...args: unknown[]) => {\n formData.city = readInputValue(args[0]);\n };\n\n const onStateChange = (event: { value: string | null }) => {\n formData.state = event.value;\n };\n\n const resetFormData = () => {\n formData.address1 = \"\";\n formData.address2 = \"\";\n formData.city = \"\";\n formData.state = null;\n formData.zip = \"\";\n };\n\n return {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n };\n}\n","import { watch } from \"vue\";\nimport { useZipTextBox } from \"./useZipTextBox\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\n/**\n * Manages the ZIP code field for a US address.\n * @param formData - The form data object containing the ZIP code.\n * @returns An object containing ZIP code display, validity, wrapper class, input handler, and reset function.\n */\nexport function useUSAddressZip(\n formData: USAddressFormData,\n zipInputId = \"zip\",\n) {\n const zipField = useZipTextBox({ id: zipInputId });\n const {\n zipDisplay,\n zipRaw,\n isZipValid,\n wrapperClass: zipWrapperClass,\n handleZipInput: onZipInput,\n } = zipField;\n\n watch(zipRaw, (value) => {\n formData.zip = value;\n });\n\n const resetZip = () => {\n zipDisplay.value = \"\";\n formData.zip = \"\";\n };\n\n return {\n zipDisplay,\n isZipValid,\n zipWrapperClass,\n onZipInput,\n resetZip,\n };\n}\n","import { computed, toValue, type MaybeRefOrGetter } from \"vue\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\ninterface UseUSAddressValidationOptions {\n formData: USAddressFormData;\n isZipValid: MaybeRefOrGetter<boolean>;\n}\n\n/**\n * Manages the validation state for a US address.\n * @param options - The options object containing form data and ZIP code validity.\n * @returns An object containing validation state for each field and the overall address.\n */\nexport function useUSAddressValidation(options: UseUSAddressValidationOptions) {\n /**\n * Strict validity values represent the actual rule outcomes for each field,\n * independent of whether validation messages are currently shown in the UI.\n */\n const strictAddress1Valid = computed(\n () => options.formData.address1.trim() !== \"\",\n );\n const strictCityValid = computed(() => options.formData.city.trim() !== \"\");\n const strictStateValid = computed(() => !!options.formData.state);\n const strictZipValid = computed(() => toValue(options.isZipValid));\n\n const strictAddressValid = computed(\n () =>\n strictAddress1Valid.value &&\n strictCityValid.value &&\n strictStateValid.value &&\n strictZipValid.value,\n );\n\n return {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n };\n}\n","import {\n computed,\n nextTick,\n ref,\n toValue,\n watch,\n watchEffect,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport { useFieldsetValidationKit } from \"../form/useFieldsetValidationKit\";\nimport { US_STATES_BY_ABBREVIATION } from \"./usStates\";\nimport { useUSAddressFormData } from \"./_useUSAddressFormData\";\nimport { useUSAddressZip } from \"./_useUSAddressZip\";\nimport { useUSAddressValidation } from \"./_useUSAddressValidation\";\n\ninterface UseUSAddressOptions {\n fieldsetRef: MaybeRefOrGetter<HTMLFieldSetElement | null>;\n addressId: string;\n required?: MaybeRefOrGetter<boolean>;\n}\n\nexport interface USAddressSubmitPayload {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n}\n\n/**\n * Focuses the first invalid input within a container.\n * @param container - The container element to search within.\n */\nfunction focusFirstInvalid(container: HTMLElement | null) {\n if (!container) return;\n const target = container.querySelector<HTMLElement>(\n '.k-invalid input, .k-invalid[tabindex=\"0\"]',\n );\n target?.focus();\n}\n\nfunction focusoutLeavesFieldset(\n fieldsetRef: HTMLFieldSetElement | null,\n event: FocusEvent,\n) {\n const fieldset = fieldsetRef ?? (event.currentTarget as HTMLElement | null);\n const next = event.relatedTarget as Node | null;\n\n return !fieldset || !fieldset.contains(next);\n}\n\n/**\n * Composable for managing a US address form.\n * @param options - The options object containing fieldset reference and address id.\n * @returns An object containing form state, validation state, and handlers.\n */\nexport function useUSAddress(options: UseUSAddressOptions) {\n const fieldsetRef = ref<HTMLFieldSetElement | null>(\n toValue(options.fieldsetRef),\n );\n\n watchEffect(() => {\n fieldsetRef.value = toValue(options.fieldsetRef);\n });\n\n const submitted = ref(false);\n const optionalFeedbackReviewed = ref(false);\n const isRequired = computed(() => toValue(options.required) ?? true);\n const {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n } = useUSAddressFormData();\n\n const zipInputId = `${options.addressId}-zip`;\n\n const { zipDisplay, isZipValid, zipWrapperClass, onZipInput, resetZip } =\n useUSAddressZip(formData, zipInputId);\n\n const {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n } = useUSAddressValidation({\n formData,\n isZipValid,\n });\n\n const validationKit = useFieldsetValidationKit(fieldsetRef, {\n submitted,\n isValid: () => strictAddressValid.value,\n });\n\n const { touched, fieldsetValidate, onFocusout, reset } = validationKit;\n\n const fieldValidations = validationKit.createFieldValidationsMap({\n address1: strictAddress1Valid,\n city: strictCityValid,\n state: strictStateValid,\n zip: strictZipValid,\n address: strictAddressValid,\n });\n\n const {\n address1: rawAddress1Valid,\n city: rawCityValid,\n state: rawStateValid,\n zip: rawZipValid,\n address: rawAddressValid,\n } = fieldValidations;\n\n const addressValidate = computed(() =>\n isRequired.value ? fieldsetValidate.value : false,\n );\n\n const address1Valid = computed(() =>\n isRequired.value ? rawAddress1Valid.value : true,\n );\n\n const cityValid = computed(() =>\n isRequired.value ? rawCityValid.value : true,\n );\n\n const stateValid = computed(() =>\n isRequired.value ? rawStateValid.value : true,\n );\n\n const zipValid = computed(() =>\n isRequired.value ? rawZipValid.value : true,\n );\n\n const addressValid = computed(() =>\n isRequired.value ? rawAddressValid.value : true,\n );\n\n const stateDefaultItem = { value: null, label: \"State\" };\n const stateOptions = US_STATES_BY_ABBREVIATION.map(({ label, value }) => ({\n label,\n value,\n }));\n\n const normalizedPayload = computed<USAddressSubmitPayload>(() => ({\n address1: formData.address1.trim(),\n address2: formData.address2.trim(),\n city: formData.city.trim(),\n state: (formData.state ?? \"\").trim().toUpperCase(),\n zip: formData.zip.replace(/\\D/g, \"\"),\n }));\n\n const isAddressEmpty = computed(() => {\n return (\n formData.address1.trim() === \"\" &&\n formData.address2.trim() === \"\" &&\n formData.city.trim() === \"\" &&\n (formData.state ?? \"\").trim() === \"\" &&\n formData.zip.replace(/\\D/g, \"\") === \"\"\n );\n });\n\n /**\n * Indicates whether any input has been provided in the optional address fields.\n * @returns True if any address field has input, false otherwise.\n */\n const optionalAddressHasAnyInput = computed(() => !isAddressEmpty.value);\n\n /**\n * Indicates whether any required fields are missing in the optional address section.\n * @returns True if any required field is missing, false otherwise.\n */\n const optionalMissingRequiredFields = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n (!strictAddress1Valid.value ||\n !strictCityValid.value ||\n !strictStateValid.value)\n );\n });\n\n /**\n * Indicates whether the optional zip code field is invalid.\n * @returns True if the zip code is invalid, false otherwise.\n */\n const optionalZipInvalid = computed(() => {\n const zipDigits = formData.zip.replace(/\\D/g, \"\");\n\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n });\n\n /**\n * Indicates whether any part of the optional address is invalid.\n * @returns True if any part of the optional address is invalid, false otherwise.\n */\n const optionalPartialInvalid = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n !strictAddressValid.value\n );\n });\n\n /**\n * Indicates whether optional address feedback should be active.\n * @returns True if feedback should be active, false otherwise.\n */\n const optionalFeedbackActive = computed(() => {\n return (\n !isRequired.value &&\n optionalPartialInvalid.value &&\n (optionalFeedbackReviewed.value || submitted.value)\n );\n });\n\n // Resets the optional feedback reviewed state when the normalized payload\n // changes and the address is not required.\n watch(normalizedPayload, () => {\n if (!isRequired.value) {\n optionalFeedbackReviewed.value = false;\n }\n });\n\n watch(isRequired, (required) => {\n if (!required) {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n }\n });\n\n /**\n * Validates address state for parent-owned submit flow.\n * Activates UI error visibility.\n * @returns An object containing the validity status and the normalized payload.\n */\n const validateForSubmit = async () => {\n if (!isRequired.value) {\n if (isAddressEmpty.value || strictAddressValid.value) {\n submitted.value = false;\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n }\n\n submitted.value = true;\n return { isValid: false as const, payload: null };\n }\n\n submitted.value = true;\n\n if (!strictAddressValid.value) {\n await nextTick();\n focusFirstInvalid(fieldsetRef.value);\n return { isValid: false as const, payload: null };\n }\n\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n };\n\n /**\n * Resets the US address form.\n * Deactivates UI error visibility.\n */\n const resetAddress = () => {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n resetFormData();\n resetZip();\n };\n\n const onFieldsetFocusout = (event: FocusEvent) => {\n const leftFieldset = focusoutLeavesFieldset(fieldsetRef.value, event);\n\n onFocusout(event);\n\n if (!isRequired.value && leftFieldset) {\n optionalFeedbackReviewed.value = true;\n }\n };\n\n return {\n formData,\n submitted,\n touched,\n addressValidate,\n address1Valid,\n cityValid,\n stateValid,\n zipValid,\n addressValid,\n optionalFeedbackActive,\n optionalPartialInvalid,\n optionalMissingRequiredFields,\n optionalZipInvalid,\n stateDefaultItem,\n stateOptions,\n zipDisplay,\n zipWrapperClass,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n onZipInput,\n onFieldsetFocusout,\n normalizedPayload,\n validateForSubmit,\n reset: resetAddress,\n };\n}\n","import { shallowRef, watchEffect, readonly, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, hasInjectionContext, inject, provide, ref, isRef, unref, toValue as toValue$1, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, shallowReadonly, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn, options = {}) {\n let v = void 0;\n let track;\n let trigger;\n let dirty = true;\n const update = () => {\n dirty = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\", ...options });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty) {\n v = get(v);\n dirty = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const clear = () => {\n fns.clear();\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger,\n clear\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst injectLocal = /* @__NO_SIDE_EFFECTS__ */ (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null && !hasInjectionContext())\n throw new Error(\"injectLocal must be called in setup\");\n if (instance && localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nfunction provideLocal(key, value) {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n return provide(key, value);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createRef(value, deep) {\n if (deep === true) {\n return ref(value);\n } else {\n return shallowRef(value);\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!scope) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue$1;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue$1(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue$1(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue$1(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue$1(defaultValue);\n trigger();\n }, toValue$1(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n let lastInvoker;\n const filter = (invoke) => {\n const duration = toValue$1(ms);\n const maxDuration = toValue$1(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = void 0;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n lastInvoker = invoke;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = void 0;\n resolve(lastInvoker());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = void 0;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue$1(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter, options = {}) {\n const {\n initialState = \"active\"\n } = options;\n const isActive = toRef(initialState === \"active\");\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction pxValue(px) {\n return px.endsWith(\"rem\") ? Number.parseFloat(px) * 16 : Number.parseFloat(px);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(toValue$1(value));\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return shallowReadonly(debounced);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(toValue$1(value));\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n const [target, key, value] = args;\n target[key] = value;\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n initialState = \"active\",\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(watchPausable(\n right,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n left.value = transformRTL(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n const stop = () => {\n watchers.forEach((w) => w.stop());\n };\n return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n const targetsArray = toArray(targets);\n return watch(\n source,\n (newValue) => targetsArray.forEach((target) => target.value = newValue),\n { flush, deep, immediate }\n );\n}\n\nfunction toRefs(objectRef, options = {}) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n var _a;\n const replaceRef = (_a = toValue$1(options.replaceRef)) != null ? _a : true;\n if (replaceRef) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = { ...objectRef.value, [key]: v };\n Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n objectRef.value = newObject;\n }\n } else {\n objectRef.value[key] = v;\n }\n }\n }));\n }\n return result;\n}\n\nconst toValue = toValue$1;\nconst resolveUnref = toValue$1;\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeMount(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onMounted(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n r,\n (v) => {\n if (condition(v) !== isNot) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => stop == null ? void 0 : stop())\n );\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n [r, value],\n ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v1);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => {\n stop == null ? void 0 : stop();\n return toValue$1(r);\n })\n );\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(toValue$1(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(toValue$1(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n return value === othVal;\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayDifference(...args) {\n var _a, _b;\n const list = args[0];\n const values = args[1];\n let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n const {\n symmetric = false\n } = (_b = args[3]) != null ? _b : {};\n if (typeof compareFn === \"string\") {\n const key = compareFn;\n compareFn = (value, othVal) => value[key] === othVal[key];\n }\n const diff1 = computed(() => toValue$1(list).filter((x) => toValue$1(values).findIndex((y) => compareFn(x, y)) === -1));\n if (symmetric) {\n const diff2 = computed(() => toValue$1(values).filter((x) => toValue$1(list).findIndex((y) => compareFn(x, y)) === -1));\n return computed(() => symmetric ? [...toValue$1(diff1), ...toValue$1(diff2)] : toValue$1(diff1));\n } else {\n return diff1;\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayEvery(list, fn) {\n return computed(() => toValue$1(list).every((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFilter(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).filter(fn));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFind(list, fn) {\n return computed(() => toValue$1(\n toValue$1(list).find((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFindIndex(list, fn) {\n return computed(() => toValue$1(list).findIndex((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n let index = arr.length;\n while (index-- > 0) {\n if (cb(arr[index], index, arr))\n return arr[index];\n }\n return void 0;\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFindLast(list, fn) {\n return computed(() => toValue$1(\n !Array.prototype.findLast ? findLast(toValue$1(list), (element, index, array) => fn(toValue$1(element), index, array)) : toValue$1(list).findLast((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayIncludes(...args) {\n var _a;\n const list = args[0];\n const value = args[1];\n let comparator = args[2];\n let formIndex = 0;\n if (isArrayIncludesOptions(comparator)) {\n formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n comparator = comparator.comparator;\n }\n if (typeof comparator === \"string\") {\n const key = comparator;\n comparator = (element, value2) => element[key] === toValue$1(value2);\n }\n comparator = comparator != null ? comparator : (element, value2) => element === toValue$1(value2);\n return computed(() => toValue$1(list).slice(formIndex).some((element, index, array) => comparator(\n toValue$1(element),\n toValue$1(value),\n index,\n toValue$1(array)\n )));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayJoin(list, separator) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).join(toValue$1(separator)));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayMap(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).map(fn));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(toValue$1(sum), toValue$1(value), index);\n return computed(() => {\n const resolved = toValue$1(list);\n return args.length ? resolved.reduce(reduceCallback, typeof args[0] === \"function\" ? toValue$1(args[0]()) : toValue$1(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArraySome(list, fn) {\n return computed(() => toValue$1(list).some((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n return array.reduce((acc, v) => {\n if (!acc.some((x) => fn(v, x, array)))\n acc.push(v);\n return acc;\n }, []);\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayUnique(list, compareFn) {\n return computed(() => {\n const resolvedList = toValue$1(list).map((element) => toValue$1(element));\n return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n let _initialValue = unref(initialValue);\n const count = shallowRef(initialValue);\n const {\n max = Number.POSITIVE_INFINITY,\n min = Number.NEGATIVE_INFINITY\n } = options;\n const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = _initialValue) => {\n _initialValue = val;\n return set(val);\n };\n return { count: shallowReadonly(count), inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|z{1,4}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const stripTimeZone = (dateString) => {\n var _a2;\n return (_a2 = dateString.split(\" \")[1]) != null ? _a2 : \"\";\n };\n const matches = {\n Yo: () => formatOrdinal(years),\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n Mo: () => formatOrdinal(month + 1),\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"long\" }),\n D: () => String(days),\n Do: () => formatOrdinal(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n Ho: () => formatOrdinal(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n ho: () => formatOrdinal(hours % 12 || 12),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mo: () => formatOrdinal(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n so: () => formatOrdinal(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true),\n z: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"longOffset\" }))\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n var _a2, _b;\n return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n });\n}\nfunction normalizeDate(date) {\n if (date === null)\n return new Date(Number.NaN);\n if (date === void 0)\n return /* @__PURE__ */ new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n}\n// @__NO_SIDE_EFFECTS__\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(toValue$1(date)), toValue$1(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = shallowRef(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n const intervalValue = toValue$1(interval);\n if (intervalValue <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n if (isActive.value)\n timer = setInterval(cb, intervalValue);\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || typeof interval === \"function\") {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive: shallowReadonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = shallowRef(0);\n const update = () => counter.value += 1;\n const reset = () => {\n counter.value = 0;\n };\n const controls = useIntervalFn(\n callback ? () => {\n update();\n callback(counter.value);\n } : update,\n interval,\n { immediate }\n );\n if (exposeControls) {\n return {\n counter: shallowReadonly(counter),\n reset,\n ...controls\n };\n } else {\n return shallowReadonly(counter);\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = shallowRef((_a = options.initialValue) != null ? _a : null);\n watch(\n source,\n () => ms.value = timestamp(),\n options\n );\n return shallowReadonly(ms);\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const isPending = shallowRef(false);\n let timer;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n if (immediateCallback)\n cb();\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = void 0;\n cb(...args);\n }, toValue$1(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending: shallowReadonly(isPending),\n start,\n stop\n };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(\n callback != null ? callback : noop,\n interval,\n options\n );\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return {\n ready,\n ...controls\n };\n } else {\n return ready;\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = toValue$1(value);\n if (typeof method === \"function\")\n resolved = method(resolved);\n else if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && Number.isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useToString(value) {\n return computed(() => `${toValue$1(value)}`);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = shallowRef(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = toValue$1(truthyValue);\n _value.value = _value.value === truthy ? toValue$1(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [...typeof source === \"function\" ? source() : Array.isArray(source) ? source : toValue$1(source)];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = Array.from({ length: oldList.length });\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n const {\n count,\n ...watchOptions\n } = options;\n const current = shallowRef(0);\n const stop = watchWithFilter(\n source,\n (...args) => {\n current.value += 1;\n if (current.value >= toValue$1(count))\n nextTick(() => stop());\n cb(...args);\n },\n watchOptions\n );\n return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n const {\n debounce = 0,\n maxWait = void 0,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: debounceFilter(debounce, { maxWait })\n }\n );\n}\n\nfunction watchDeep(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n deep: true\n }\n );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n const filteredCb = createFilterWrapper(\n eventFilter,\n cb\n );\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n let ignore = false;\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore = true;\n updater();\n ignore = false;\n };\n stop = watch(\n source,\n (...args) => {\n if (!ignore)\n filteredCb(...args);\n },\n watchOptions\n );\n } else {\n const disposables = [];\n let ignoreCounter = 0;\n let syncCounter = 0;\n ignorePrevAsyncUpdates = () => {\n ignoreCounter = syncCounter;\n };\n disposables.push(\n watch(\n source,\n () => {\n syncCounter++;\n },\n { ...watchOptions, flush: \"sync\" }\n )\n );\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter;\n updater();\n ignoreCounter += syncCounter - syncCounterPrev;\n };\n disposables.push(\n watch(\n source,\n (...args) => {\n const ignore = ignoreCounter > 0 && ignoreCounter === syncCounter;\n ignoreCounter = 0;\n syncCounter = 0;\n if (ignore)\n return;\n filteredCb(...args);\n },\n watchOptions\n )\n );\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n immediate: true\n }\n );\n}\n\nfunction watchOnce(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n once: true\n }\n );\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n const {\n throttle = 0,\n trailing = true,\n leading = true,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: throttleFilter(throttle, trailing, leading)\n }\n );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return {\n ...res,\n trigger\n };\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => toValue$1(item));\n return toValue$1(sources);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n const stop = watch(\n source,\n (v, ov, onInvalidate) => {\n if (v) {\n if (options == null ? void 0 : options.once)\n nextTick(() => stop());\n cb(v, ov, onInvalidate);\n }\n },\n {\n ...options,\n once: false\n }\n );\n return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createRef, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, pxValue, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toArray, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { noop, makeDestructurable, camelize, isClient, toArray, watchImmediate, isObject, tryOnScopeDispose, isIOS, notNullish, tryOnMounted, objectOmit, promiseTimeout, until, injectLocal, provideLocal, pxValue, increaseWithUnit, objectEntries, createRef, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, useIntervalFn, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, bypassFilter, createFilterWrapper, toRefs, watchOnce, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, tryOnUnmounted, clamp, syncRef, objectPick, watchWithFilter, identity, isDef, whenever, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, shallowRef, ref, watchEffect, computed, inject, defineComponent, h, TransitionGroup, Fragment, shallowReactive, toValue, unref, getCurrentInstance, onMounted, watch, customRef, onUpdated, readonly, reactive, hasInjectionContext, toRaw, shallowReadonly, nextTick, markRaw, getCurrentScope, isReadonly, onBeforeUpdate } from 'vue';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n var _a;\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n flush = \"pre\",\n evaluating = void 0,\n shallow = true,\n onError = (_a = globalThis.reportError) != null ? _a : noop\n } = options;\n const started = shallowRef(!lazy);\n const current = shallow ? shallowRef(initialState) : ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n }, { flush });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((oldValue) => options(source, oldValue));\n } else {\n return computed({\n get: (oldValue) => options.get(source, oldValue),\n set: options.set\n });\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createReusableTemplate(options = {}) {\n const {\n inheritAttrs = true\n } = options;\n const render = shallowRef();\n const define = /*@__PURE__*/ defineComponent({\n setup(_, { slots }) {\n return () => {\n render.value = slots.default;\n };\n }\n });\n const reuse = /*@__PURE__*/ defineComponent({\n inheritAttrs,\n props: options.props,\n setup(props, { attrs, slots }) {\n return () => {\n var _a;\n if (!render.value && process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n const vnode = (_a = render.value) == null ? void 0 : _a.call(render, {\n ...options.props == null ? keysToCamelKebabCase(attrs) : props,\n $slots: slots\n });\n return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n };\n }\n });\n return makeDestructurable(\n { define, reuse },\n [define, reuse]\n );\n}\nfunction keysToCamelKebabCase(obj) {\n const newObj = {};\n for (const key in obj)\n newObj[camelize(key)] = obj[key];\n return newObj;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createTemplatePromise(options = {}) {\n let index = 0;\n const instances = ref([]);\n function create(...args) {\n const props = shallowReactive({\n key: index++,\n args,\n promise: void 0,\n resolve: () => {\n },\n reject: () => {\n },\n isResolving: false,\n options\n });\n instances.value.push(props);\n props.promise = new Promise((_resolve, _reject) => {\n props.resolve = (v) => {\n props.isResolving = true;\n return _resolve(v);\n };\n props.reject = _reject;\n }).finally(() => {\n props.promise = void 0;\n const index2 = instances.value.indexOf(props);\n if (index2 !== -1)\n instances.value.splice(index2, 1);\n });\n return props.promise;\n }\n function start(...args) {\n if (options.singleton && instances.value.length > 0)\n return instances.value[0].promise;\n return create(...args);\n }\n const component = /*@__PURE__*/ defineComponent((_, { slots }) => {\n const renderList = () => instances.value.map((props) => {\n var _a;\n return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n });\n if (options.transition)\n return () => h(TransitionGroup, options.transition, renderList);\n return renderList;\n });\n component.start = start;\n return component;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createUnrefFn(fn) {\n return function(...args) {\n return fn.apply(this, args.map((i) => toValue(i)));\n };\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nfunction useEventListener(...args) {\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options) => {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n };\n const firstParamTargets = computed(() => {\n const test = toArray(toValue(args[0])).filter((e) => e != null);\n return test.every((e) => typeof e !== \"string\") ? test : void 0;\n });\n const stopWatch = watchImmediate(\n () => {\n var _a, _b;\n return [\n (_b = (_a = firstParamTargets.value) == null ? void 0 : _a.map((e) => unrefElement(e))) != null ? _b : [defaultWindow].filter((e) => e != null),\n toArray(toValue(firstParamTargets.value ? args[1] : args[0])),\n toArray(unref(firstParamTargets.value ? args[2] : args[1])),\n // @ts-expect-error - TypeScript gets the correct types, but somehow still complains\n toValue(firstParamTargets.value ? args[3] : args[2])\n ];\n },\n ([raw_targets, raw_events, raw_listeners, raw_options]) => {\n cleanup();\n if (!(raw_targets == null ? void 0 : raw_targets.length) || !(raw_events == null ? void 0 : raw_events.length) || !(raw_listeners == null ? void 0 : raw_listeners.length))\n return;\n const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;\n cleanups.push(\n ...raw_targets.flatMap(\n (el) => raw_events.flatMap(\n (event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))\n )\n )\n );\n },\n { flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(cleanup);\n return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false, controls = false } = options;\n if (!window) {\n return controls ? { stop: noop, cancel: noop, trigger: noop } : noop;\n }\n if (isIOS && !_iOSWorkaround) {\n _iOSWorkaround = true;\n const listenerOptions = { passive: true };\n Array.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop, listenerOptions));\n window.document.documentElement.addEventListener(\"click\", noop, listenerOptions);\n }\n let shouldListen = true;\n const shouldIgnore = (event) => {\n return toValue(ignore).some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n function hasMultipleRoots(target2) {\n const vm = toValue(target2);\n return vm && vm.$.subTree.shapeFlag === 16;\n }\n function checkMultipleRoots(target2, event) {\n const vm = toValue(target2);\n const children = vm.$.subTree && vm.$.subTree.children;\n if (children == null || !Array.isArray(children))\n return false;\n return children.some((child) => child.el === event.target || event.composedPath().includes(child.el));\n }\n const listener = (event) => {\n const el = unrefElement(target);\n if (event.target == null)\n return;\n if (!(el instanceof Element) && hasMultipleRoots(target) && checkMultipleRoots(target, event))\n return;\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (\"detail\" in event && event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n let isProcessingClick = false;\n const cleanup = [\n useEventListener(window, \"click\", (event) => {\n if (!isProcessingClick) {\n isProcessingClick = true;\n setTimeout(() => {\n isProcessingClick = false;\n }, 0);\n listener(event);\n }\n }, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n setTimeout(() => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement))) {\n handler(event);\n }\n }, 0);\n }, { passive: true })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n if (controls) {\n return {\n stop,\n cancel: () => {\n shouldListen = false;\n },\n trigger: (event) => {\n shouldListen = true;\n listener(event);\n shouldListen = false;\n }\n };\n }\n return stop;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useMounted() {\n const isMounted = shallowRef(false);\n const instance = getCurrentInstance();\n if (instance) {\n onMounted(() => {\n isMounted.value = true;\n }, instance);\n }\n return isMounted;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useSupported(callback) {\n const isMounted = useMounted();\n return computed(() => {\n isMounted.value;\n return Boolean(callback());\n });\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...mutationOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const value = toValue(target);\n const items = toArray(value).map(unrefElement).filter(notNullish);\n return new Set(items);\n });\n const stopWatch = watch(\n targets,\n (newTargets) => {\n cleanup();\n if (isSupported.value && newTargets.size) {\n observer = new MutationObserver(callback);\n newTargets.forEach((el) => observer.observe(el, mutationOptions));\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const takeRecords = () => {\n return observer == null ? void 0 : observer.takeRecords();\n };\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop,\n takeRecords\n };\n}\n\nfunction onElementRemoval(target, callback, options = {}) {\n const {\n window = defaultWindow,\n document = window == null ? void 0 : window.document,\n flush = \"sync\"\n } = options;\n if (!window || !document)\n return noop;\n let stopFn;\n const cleanupAndUpdate = (fn) => {\n stopFn == null ? void 0 : stopFn();\n stopFn = fn;\n };\n const stopWatch = watchEffect(() => {\n const el = unrefElement(target);\n if (el) {\n const { stop } = useMutationObserver(\n document,\n (mutationsList) => {\n const targetRemoved = mutationsList.map((mutation) => [...mutation.removedNodes]).flat().some((node) => node === el || node.contains(el));\n if (targetRemoved) {\n callback(mutationsList);\n }\n },\n {\n window,\n childList: true,\n subtree: true\n }\n );\n cleanupAndUpdate(stop);\n }\n }, { flush });\n const stopHandle = () => {\n stopWatch();\n cleanupAndUpdate();\n };\n tryOnScopeDispose(stopHandle);\n return stopHandle;\n}\n\nfunction createKeyPredicate(keyFilter) {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n}\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const {\n target = defaultWindow,\n eventName = \"keydown\",\n passive = false,\n dedupe = false\n } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (e.repeat && toValue(dedupe))\n return;\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n let posStart;\n let startTimestamp;\n let hasLongPressed = false;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n posStart = void 0;\n startTimestamp = void 0;\n hasLongPressed = false;\n }\n function getDelay(ev) {\n const delay = options == null ? void 0 : options.delay;\n if (typeof delay === \"function\") {\n return delay(ev);\n }\n return delay != null ? delay : DEFAULT_DELAY;\n }\n function onRelease(ev) {\n var _a2, _b2, _c;\n const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];\n clear();\n if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp)\n return;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - _posStart.x;\n const dy = ev.y - _posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);\n }\n function onDown(ev) {\n var _a2, _b2, _c;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n posStart = {\n x: ev.x,\n y: ev.y\n };\n startTimestamp = ev.timeStamp;\n timeout = setTimeout(\n () => {\n hasLongPressed = true;\n handler(ev);\n },\n getDelay(ev)\n );\n }\n function onMove(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - posStart.x;\n const dy = ev.y - posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n clear();\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n const cleanup = [\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction isFocusedElementEditable() {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n}\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n if (!isFocusedElementEditable() && isTypedCharValid(event)) {\n callback(event);\n }\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useActiveElement(options = {}) {\n var _a;\n const {\n window = defaultWindow,\n deep = true,\n triggerOnRemoval = false\n } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const getDeepActiveElement = () => {\n var _a2;\n let element = document == null ? void 0 : document.activeElement;\n if (deep) {\n while (element == null ? void 0 : element.shadowRoot)\n element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n }\n return element;\n };\n const activeElement = shallowRef();\n const trigger = () => {\n activeElement.value = getDeepActiveElement();\n };\n if (window) {\n const listenerOptions = {\n capture: true,\n passive: true\n };\n useEventListener(\n window,\n \"blur\",\n (event) => {\n if (event.relatedTarget !== null)\n return;\n trigger();\n },\n listenerOptions\n );\n useEventListener(\n window,\n \"focus\",\n trigger,\n listenerOptions\n );\n }\n if (triggerOnRemoval) {\n onElementRemoval(activeElement, trigger, { document });\n }\n trigger();\n return activeElement;\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n fpsLimit = void 0,\n window = defaultWindow,\n once = false\n } = options;\n const isActive = shallowRef(false);\n const intervalLimit = computed(() => {\n return fpsLimit ? 1e3 / toValue(fpsLimit) : null;\n });\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n if (!previousFrameTimestamp)\n previousFrameTimestamp = timestamp;\n const delta = timestamp - previousFrameTimestamp;\n if (intervalLimit.value && delta < intervalLimit.value) {\n rafId = window.requestAnimationFrame(loop);\n return;\n }\n previousFrameTimestamp = timestamp;\n fn({ delta, timestamp });\n if (once) {\n isActive.value = false;\n rafId = null;\n return;\n }\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n previousFrameTimestamp = 0;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive: readonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useAnimate(target, keyframes, options) {\n let config;\n let animateOptions;\n if (isObject(options)) {\n config = options;\n animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n } else {\n config = { duration: options };\n animateOptions = options;\n }\n const {\n window = defaultWindow,\n immediate = true,\n commitStyles,\n persist,\n playbackRate: _playbackRate = 1,\n onReady,\n onError = (e) => {\n console.error(e);\n }\n } = config;\n const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n const animate = shallowRef(void 0);\n const store = shallowReactive({\n startTime: null,\n currentTime: null,\n timeline: null,\n playbackRate: _playbackRate,\n pending: false,\n playState: immediate ? \"idle\" : \"paused\",\n replaceState: \"active\"\n });\n const pending = computed(() => store.pending);\n const playState = computed(() => store.playState);\n const replaceState = computed(() => store.replaceState);\n const startTime = computed({\n get() {\n return store.startTime;\n },\n set(value) {\n store.startTime = value;\n if (animate.value)\n animate.value.startTime = value;\n }\n });\n const currentTime = computed({\n get() {\n return store.currentTime;\n },\n set(value) {\n store.currentTime = value;\n if (animate.value) {\n animate.value.currentTime = value;\n syncResume();\n }\n }\n });\n const timeline = computed({\n get() {\n return store.timeline;\n },\n set(value) {\n store.timeline = value;\n if (animate.value)\n animate.value.timeline = value;\n }\n });\n const playbackRate = computed({\n get() {\n return store.playbackRate;\n },\n set(value) {\n store.playbackRate = value;\n if (animate.value)\n animate.value.playbackRate = value;\n }\n });\n const play = () => {\n if (animate.value) {\n try {\n animate.value.play();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n } else {\n update();\n }\n };\n const pause = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.pause();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const reverse = () => {\n var _a;\n if (!animate.value)\n update();\n try {\n (_a = animate.value) == null ? void 0 : _a.reverse();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n };\n const finish = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.finish();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const cancel = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.cancel();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n watch(() => unrefElement(target), (el) => {\n if (el) {\n update(true);\n } else {\n animate.value = void 0;\n }\n });\n watch(() => keyframes, (value) => {\n if (animate.value) {\n update();\n const targetEl = unrefElement(target);\n if (targetEl) {\n animate.value.effect = new KeyframeEffect(\n targetEl,\n toValue(value),\n animateOptions\n );\n }\n }\n }, { deep: true });\n tryOnMounted(() => update(true), false);\n tryOnScopeDispose(cancel);\n function update(init) {\n const el = unrefElement(target);\n if (!isSupported.value || !el)\n return;\n if (!animate.value)\n animate.value = el.animate(toValue(keyframes), animateOptions);\n if (persist)\n animate.value.persist();\n if (_playbackRate !== 1)\n animate.value.playbackRate = _playbackRate;\n if (init && !immediate)\n animate.value.pause();\n else\n syncResume();\n onReady == null ? void 0 : onReady(animate.value);\n }\n const listenerOptions = { passive: true };\n useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause, listenerOptions);\n useEventListener(animate, \"finish\", () => {\n var _a;\n if (commitStyles)\n (_a = animate.value) == null ? void 0 : _a.commitStyles();\n }, listenerOptions);\n const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n if (!animate.value)\n return;\n store.pending = animate.value.pending;\n store.playState = animate.value.playState;\n store.replaceState = animate.value.replaceState;\n store.startTime = animate.value.startTime;\n store.currentTime = animate.value.currentTime;\n store.timeline = animate.value.timeline;\n store.playbackRate = animate.value.playbackRate;\n }, { immediate: false });\n function syncResume() {\n if (isSupported.value)\n resumeRef();\n }\n function syncPause() {\n if (isSupported.value && window)\n window.requestAnimationFrame(pauseRef);\n }\n return {\n isSupported,\n animate,\n // actions\n play,\n pause,\n reverse,\n finish,\n cancel,\n // state\n pending,\n playState,\n replaceState,\n startTime,\n currentTime,\n timeline,\n playbackRate\n };\n}\n\nfunction useAsyncQueue(tasks, options) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop,\n signal\n } = options || {};\n const promiseState = {\n aborted: \"aborted\",\n fulfilled: \"fulfilled\",\n pending: \"pending\",\n rejected: \"rejected\"\n };\n const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = shallowRef(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, new Error(\"aborted\"));\n return;\n }\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n const done = curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n if (activeIndex.value === tasks.length - 1)\n onFinished();\n return currentRes;\n });\n if (!signal)\n return done;\n return Promise.race([done, whenAborted(signal)]);\n }).catch((e) => {\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, e);\n return e;\n }\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\nfunction whenAborted(signal) {\n return new Promise((resolve, reject) => {\n const error = new Error(\"aborted\");\n if (signal.aborted)\n reject(error);\n else\n signal.addEventListener(\"abort\", () => reject(error), { once: true });\n });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n var _a;\n const {\n immediate = true,\n delay = 0,\n onError = (_a = globalThis.reportError) != null ? _a : noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = shallowRef(false);\n const isLoading = shallowRef(false);\n const error = shallowRef(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = toValue(initialState);\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw e;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate) {\n execute(delay);\n }\n const shell = {\n state,\n isReady,\n isLoading,\n error,\n execute,\n executeImmediate: (...args) => execute(0, ...args)\n };\n function waitUntilIsLoaded() {\n return new Promise((resolve, reject) => {\n until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n });\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilIsLoaded().then(onFulfilled, onRejected);\n }\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = shallowRef(\"\");\n const promise = shallowRef();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = toValue(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => {\n base64.value = (options == null ? void 0 : options.dataUrl) === false ? res.replace(/^data:.*?;base64,/, \"\") : res;\n });\n return promise.value;\n }\n if (isRef(target) || typeof target === \"function\")\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useBattery(options = {}) {\n const { navigator = defaultNavigator } = options;\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n const charging = shallowRef(false);\n const chargingTime = shallowRef(0);\n const dischargingTime = shallowRef(0);\n const level = shallowRef(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n useEventListener(battery, events, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef();\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = shallowRef();\n const isConnected = shallowRef(false);\n function reset() {\n isConnected.value = false;\n device.value = void 0;\n server.value = void 0;\n }\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n useEventListener(device, \"gattserverdisconnected\", reset, { passive: true });\n try {\n server.value = await device.value.gatt.connect();\n isConnected.value = server.value.connected;\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected: readonly(isConnected),\n // Device:\n device,\n requestDevice,\n // Server:\n server,\n // Errors:\n error\n };\n}\n\nconst ssrWidthSymbol = Symbol(\"vueuse-ssr-width\");\n// @__NO_SIDE_EFFECTS__\nfunction useSSRWidth() {\n const ssrWidth = hasInjectionContext() ? injectLocal(ssrWidthSymbol, null) : null;\n return typeof ssrWidth === \"number\" ? ssrWidth : void 0;\n}\nfunction provideSSRWidth(width, app) {\n if (app !== void 0) {\n app.provide(ssrWidthSymbol, width);\n } else {\n provideLocal(ssrWidthSymbol, width);\n }\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow, ssrWidth = useSSRWidth() } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n const ssrSupport = shallowRef(typeof ssrWidth === \"number\");\n const mediaQuery = shallowRef();\n const matches = shallowRef(false);\n const handler = (event) => {\n matches.value = event.matches;\n };\n watchEffect(() => {\n if (ssrSupport.value) {\n ssrSupport.value = !isSupported.value;\n const queryStrings = toValue(query).split(\",\");\n matches.value = queryStrings.some((queryString) => {\n const not = queryString.includes(\"not all\");\n const minWidth = queryString.match(/\\(\\s*min-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n const maxWidth = queryString.match(/\\(\\s*max-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n let res = Boolean(minWidth || maxWidth);\n if (minWidth && res) {\n res = ssrWidth >= pxValue(minWidth[1]);\n }\n if (maxWidth && res) {\n res = ssrWidth <= pxValue(maxWidth[1]);\n }\n return not ? !res : res;\n });\n return;\n }\n if (!isSupported.value)\n return;\n mediaQuery.value = window.matchMedia(toValue(query));\n matches.value = mediaQuery.value.matches;\n });\n useEventListener(mediaQuery, \"change\", handler, { passive: true });\n return computed(() => matches.value);\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1264,\n xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 0,\n sm: 600,\n md: 1024,\n lg: 1440,\n xl: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200\n};\nconst breakpointsElement = {\n xs: 0,\n sm: 768,\n md: 992,\n lg: 1200,\n xl: 1920\n};\n\n// @__NO_SIDE_EFFECTS__\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = toValue(breakpoints[toValue(k)]);\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow, strategy = \"min-width\", ssrWidth = useSSRWidth() } = options;\n const ssrSupport = typeof ssrWidth === \"number\";\n const mounted = ssrSupport ? shallowRef(false) : { value: true };\n if (ssrSupport) {\n tryOnMounted(() => mounted.value = !!window);\n }\n function match(query, size) {\n if (!mounted.value && ssrSupport) {\n return query === \"min\" ? ssrWidth >= pxValue(size) : ssrWidth <= pxValue(size);\n }\n if (!window)\n return false;\n return window.matchMedia(`(${query}-width: ${size})`).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n };\n const smallerOrEqual = (k) => {\n return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n function current() {\n const points = Object.keys(breakpoints).map((k) => [k, shortcutMethods[k], pxValue(getValue(k))]).sort((a, b) => a[2] - b[2]);\n return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n }\n return Object.assign(shortcutMethods, {\n greaterOrEqual,\n smallerOrEqual,\n greater(k) {\n return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n },\n smaller(k) {\n return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(\"min\", getValue(k, 0.1));\n },\n isGreaterOrEqual(k) {\n return match(\"min\", getValue(k));\n },\n isSmaller(k) {\n return match(\"max\", getValue(k, -0.1));\n },\n isSmallerOrEqual(k) {\n return match(\"max\", getValue(k));\n },\n isInBetween(a, b) {\n return match(\"min\", getValue(a)) && match(\"max\", getValue(b, -0.1));\n },\n current,\n active() {\n const bps = current();\n return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(strategy === \"min-width\" ? -1 : 0));\n }\n });\n}\n\nfunction useBroadcastChannel(options) {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = shallowRef(false);\n const channel = ref();\n const data = ref();\n const error = shallowRef(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n const listenerOptions = {\n passive: true\n };\n useEventListener(channel, \"message\", (e) => {\n data.value = e.data;\n }, listenerOptions);\n useEventListener(channel, \"messageerror\", (e) => {\n error.value = e;\n }, listenerOptions);\n useEventListener(channel, \"close\", () => {\n isClosed.value = true;\n }, listenerOptions);\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n}\n\nconst WRITABLE_PROPERTIES = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\"\n];\n// @__NO_SIDE_EFFECTS__\nfunction useBrowserLocation(options = {}) {\n const { window = defaultWindow } = options;\n const refs = Object.fromEntries(\n WRITABLE_PROPERTIES.map((key) => [key, ref()])\n );\n for (const [key, ref] of objectEntries(refs)) {\n watch(ref, (value) => {\n if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n return;\n window.location[key] = value;\n });\n }\n const buildState = (trigger) => {\n var _a;\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { origin } = (window == null ? void 0 : window.location) || {};\n for (const key of WRITABLE_PROPERTIES)\n refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n return reactive({\n trigger,\n state: state2,\n length,\n origin,\n ...refs\n });\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), listenerOptions);\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), listenerOptions);\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, options) {\n const { deepRefs = true, ...watchOptions } = options || {};\n const cachedValue = createRef(refValue.value, deepRefs);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n const permissionStatus = shallowRef();\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = shallowRef();\n const update = () => {\n var _a, _b;\n state.value = (_b = (_a = permissionStatus.value) == null ? void 0 : _a.state) != null ? _b : \"prompt\";\n };\n useEventListener(permissionStatus, \"change\", update, { passive: true });\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus.value) {\n try {\n permissionStatus.value = await navigator.permissions.query(desc);\n } catch (e) {\n permissionStatus.value = void 0;\n } finally {\n update();\n }\n }\n if (controls)\n return toRaw(permissionStatus.value);\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const permissionRead = usePermission(\"clipboard-read\");\n const permissionWrite = usePermission(\"clipboard-write\");\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = shallowRef(\"\");\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n async function updateText() {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionRead.value));\n if (!useLegacy) {\n try {\n text.value = await navigator.clipboard.readText();\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy) {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateText, { passive: true });\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionWrite.value));\n if (!useLegacy) {\n try {\n await navigator.clipboard.writeText(value);\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy)\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n function isAllowed(status) {\n return status === \"granted\" || status === \"prompt\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nfunction useClipboardItems(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const content = ref([]);\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n function updateContent() {\n if (isSupported.value) {\n navigator.clipboard.read().then((items) => {\n content.value = items;\n });\n }\n }\n if (isSupported.value && read) {\n useEventListener([\"copy\", \"cut\"], updateContent, { passive: true });\n }\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n await navigator.clipboard.write(value);\n content.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n content: shallowReadonly(content),\n copied: readonly(copied),\n copy,\n read: updateContent\n };\n}\n\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const isModified = shallowRef(false);\n let _lastSync = false;\n const {\n manual,\n clone = cloneFnJSON,\n // watch options\n deep = true,\n immediate = true\n } = options;\n watch(cloned, () => {\n if (_lastSync) {\n _lastSync = false;\n return;\n }\n isModified.value = true;\n }, {\n deep: true,\n flush: \"sync\"\n });\n function sync() {\n _lastSync = true;\n isModified.value = false;\n cloned.value = clone(toValue(source));\n }\n if (!manual && (isRef(source) || typeof source === \"function\")) {\n watch(source, sync, {\n ...options,\n deep,\n immediate\n });\n } else {\n sync();\n }\n return { cloned, isModified, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n if (!(globalKey in _global))\n _global[globalKey] = _global[globalKey] || {};\n return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n initOnMounted\n } = options;\n const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n const keyComputed = computed(() => toValue(key));\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = toValue(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n data,\n (newValue) => write(newValue),\n { flush, deep, eventFilter }\n );\n watch(keyComputed, () => update(), { flush });\n let firstMounted = false;\n const onStorageEvent = (ev) => {\n if (initOnMounted && !firstMounted) {\n return;\n }\n update(ev);\n };\n const onStorageCustomEvent = (ev) => {\n if (initOnMounted && !firstMounted) {\n return;\n }\n updateFromCustomEvent(ev);\n };\n if (window && listenToStorageChanges) {\n if (storage instanceof Storage)\n useEventListener(window, \"storage\", onStorageEvent, { passive: true });\n else\n useEventListener(window, customStorageEventName, onStorageCustomEvent);\n }\n if (initOnMounted) {\n tryOnMounted(() => {\n firstMounted = true;\n update();\n });\n } else {\n update();\n }\n function dispatchWriteEvent(oldValue, newValue) {\n if (window) {\n const payload = {\n key: keyComputed.value,\n oldValue,\n newValue,\n storageArea: storage\n };\n window.dispatchEvent(storage instanceof Storage ? new StorageEvent(\"storage\", payload) : new CustomEvent(customStorageEventName, {\n detail: payload\n }));\n }\n }\n function write(v) {\n try {\n const oldValue = storage.getItem(keyComputed.value);\n if (v == null) {\n dispatchWriteEvent(oldValue, null);\n storage.removeItem(keyComputed.value);\n } else {\n const serialized = serializer.write(v);\n if (oldValue !== serialized) {\n storage.setItem(keyComputed.value, serialized);\n dispatchWriteEvent(oldValue, serialized);\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(keyComputed.value);\n if (rawValue == null) {\n if (writeDefaults && rawInit != null)\n storage.setItem(keyComputed.value, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return { ...rawInit, ...value };\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== keyComputed.value) {\n return;\n }\n pauseWatch();\n try {\n const serializedData = serializer.write(data.value);\n if (event === void 0 || (event == null ? void 0 : event.newValue) !== serializedData) {\n data.value = read(event);\n }\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n function updateFromCustomEvent(event) {\n update(event.detail);\n }\n return data;\n}\n\nconst CSS_DISABLE_TRANS = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto,\n disableTransition = true\n } = options;\n const modes = {\n auto: \"\",\n light: \"light\",\n dark: \"dark\",\n ...options.modes || {}\n };\n const preferredDark = usePreferredDark({ window });\n const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n const updateHTMLAttrs = getSSRHandler(\n \"updateHTMLAttrs\",\n (selector2, attribute2, value) => {\n const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n if (!el)\n return;\n const classesToAdd = /* @__PURE__ */ new Set();\n const classesToRemove = /* @__PURE__ */ new Set();\n let attributeToChange = null;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n classesToAdd.add(v);\n else\n classesToRemove.add(v);\n });\n } else {\n attributeToChange = { key: attribute2, value };\n }\n if (classesToAdd.size === 0 && classesToRemove.size === 0 && attributeToChange === null)\n return;\n let style;\n if (disableTransition) {\n style = window.document.createElement(\"style\");\n style.appendChild(document.createTextNode(CSS_DISABLE_TRANS));\n window.document.head.appendChild(style);\n }\n for (const c of classesToAdd) {\n el.classList.add(c);\n }\n for (const c of classesToRemove) {\n el.classList.remove(c);\n }\n if (attributeToChange) {\n el.setAttribute(attributeToChange.key, attributeToChange.value);\n }\n if (disableTransition) {\n window.getComputedStyle(style).opacity;\n document.head.removeChild(style);\n }\n }\n );\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n const auto = computed({\n get() {\n return emitAuto ? store.value : state.value;\n },\n set(v) {\n store.value = v;\n }\n });\n return Object.assign(auto, { store, system, state });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useConfirmDialog(revealed = shallowRef(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCountdown(initialCountdown, options) {\n var _a, _b;\n const remaining = shallowRef(toValue(initialCountdown));\n const intervalController = useIntervalFn(() => {\n var _a2, _b2;\n const value = remaining.value - 1;\n remaining.value = value < 0 ? 0 : value;\n (_a2 = options == null ? void 0 : options.onTick) == null ? void 0 : _a2.call(options);\n if (remaining.value <= 0) {\n intervalController.pause();\n (_b2 = options == null ? void 0 : options.onComplete) == null ? void 0 : _b2.call(options);\n }\n }, (_a = options == null ? void 0 : options.interval) != null ? _a : 1e3, { immediate: (_b = options == null ? void 0 : options.immediate) != null ? _b : false });\n const reset = (countdown) => {\n var _a2;\n remaining.value = (_a2 = toValue(countdown)) != null ? _a2 : toValue(initialCountdown);\n };\n const stop = () => {\n intervalController.pause();\n reset();\n };\n const resume = () => {\n if (!intervalController.isActive.value) {\n if (remaining.value > 0) {\n intervalController.resume();\n }\n }\n };\n const start = (countdown) => {\n reset(countdown);\n intervalController.resume();\n };\n return {\n remaining,\n reset,\n stop,\n start,\n pause: intervalController.pause,\n resume,\n isActive: intervalController.isActive\n };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n const { window = defaultWindow, initialValue, observe = false } = options;\n const variable = shallowRef(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n function updateCssVar() {\n var _a;\n const key = toValue(prop);\n const el = toValue(elRef);\n if (el && window && key) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n variable.value = value || variable.value || initialValue;\n }\n }\n if (observe) {\n useMutationObserver(elRef, updateCssVar, {\n attributeFilter: [\"style\", \"class\"],\n window\n });\n }\n watch(\n [elRef, () => toValue(prop)],\n (_, old) => {\n if (old[0] && old[1])\n old[0].style.removeProperty(old[1]);\n updateCssVar();\n },\n { immediate: true }\n );\n watch(\n [variable, elRef],\n ([val, el]) => {\n const raw_prop = toValue(prop);\n if ((el == null ? void 0 : el.style) && raw_prop) {\n if (val == null)\n el.style.removeProperty(raw_prop);\n else\n el.style.setProperty(raw_prop, val);\n }\n },\n { immediate: true }\n );\n return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(\n () => null,\n () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n );\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n const state = shallowRef(getInitialValue());\n const listRef = toRef(list);\n const index = computed({\n get() {\n var _a;\n const targetList = listRef.value;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const targetList = listRef.value;\n const length = targetList.length;\n const index2 = (i % length + length) % length;\n const value = targetList[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n function getInitialValue() {\n var _a, _b;\n return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n }\n watch(listRef, () => set(index.value));\n return {\n state,\n index,\n next,\n prev,\n go: set\n };\n}\n\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\"\n } = options;\n const mode = useColorMode({\n ...options,\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n });\n const system = computed(() => mode.system.value);\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n const modeVal = v ? \"dark\" : \"light\";\n if (system.value === modeVal)\n mode.value = \"auto\";\n else\n mode.value = modeVal;\n }\n });\n return isDark;\n}\n\nfunction fnBypass(v) {\n return v;\n}\nfunction fnSetSource(source, value) {\n return source.value = value;\n}\nfunction defaultDump(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter,\n shouldCommit = () => true\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n let lastRawValue = source.value;\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(\n source,\n commit,\n { deep, flush, eventFilter: composedFilter }\n );\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n lastRawValue = value;\n });\n }\n const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n if (!shouldCommit(lastRawValue, source.value))\n return;\n lastRawValue = source.value;\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return {\n ...manualHistory,\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions = false,\n eventFilter = bypassFilter\n } = options;\n const isSupported = useSupported(() => typeof DeviceMotionEvent !== \"undefined\");\n const requirePermissions = useSupported(() => isSupported.value && \"requestPermission\" in DeviceMotionEvent && typeof DeviceMotionEvent.requestPermission === \"function\");\n const permissionGranted = shallowRef(false);\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = shallowRef(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n function init() {\n if (window) {\n const onDeviceMotion = createFilterWrapper(\n eventFilter,\n (event) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n acceleration.value = {\n x: ((_a = event.acceleration) == null ? void 0 : _a.x) || null,\n y: ((_b = event.acceleration) == null ? void 0 : _b.y) || null,\n z: ((_c = event.acceleration) == null ? void 0 : _c.z) || null\n };\n accelerationIncludingGravity.value = {\n x: ((_d = event.accelerationIncludingGravity) == null ? void 0 : _d.x) || null,\n y: ((_e = event.accelerationIncludingGravity) == null ? void 0 : _e.y) || null,\n z: ((_f = event.accelerationIncludingGravity) == null ? void 0 : _f.z) || null\n };\n rotationRate.value = {\n alpha: ((_g = event.rotationRate) == null ? void 0 : _g.alpha) || null,\n beta: ((_h = event.rotationRate) == null ? void 0 : _h.beta) || null,\n gamma: ((_i = event.rotationRate) == null ? void 0 : _i.gamma) || null\n };\n interval.value = event.interval;\n }\n );\n useEventListener(window, \"devicemotion\", onDeviceMotion, { passive: true });\n }\n }\n const ensurePermissions = async () => {\n if (!requirePermissions.value)\n permissionGranted.value = true;\n if (permissionGranted.value)\n return;\n if (requirePermissions.value) {\n const requestPermission = DeviceMotionEvent.requestPermission;\n try {\n const response = await requestPermission();\n if (response === \"granted\") {\n permissionGranted.value = true;\n init();\n }\n } catch (error) {\n console.error(error);\n }\n }\n };\n if (isSupported.value) {\n if (requestPermissions && requirePermissions.value) {\n ensurePermissions().then(() => init());\n } else {\n init();\n }\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval,\n isSupported,\n requirePermissions,\n ensurePermissions,\n permissionGranted\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = shallowRef(false);\n const alpha = shallowRef(null);\n const beta = shallowRef(null);\n const gamma = shallowRef(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n }, { passive: true });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDevicePixelRatio(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const pixelRatio = shallowRef(1);\n const query = useMediaQuery(() => `(resolution: ${pixelRatio.value}dppx)`, options);\n let stop = noop;\n if (window) {\n stop = watchImmediate(query, () => pixelRatio.value = window.devicePixelRatio);\n }\n return {\n pixelRatio: readonly(pixelRatio),\n stop\n };\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = shallowRef(false);\n let stream;\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n if (stream) {\n stream.getTracks().forEach((t) => t.stop());\n stream = null;\n }\n }\n async function ensurePermissions() {\n const deviceName = constraints.video ? \"camera\" : \"microphone\";\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(deviceName, { controls: true });\n await query();\n if (state.value !== \"granted\") {\n let granted = true;\n try {\n const allDevices = await navigator.mediaDevices.enumerateDevices();\n const hasCamera = allDevices.some((device) => device.kind === \"videoinput\");\n const hasMicrophone = allDevices.some((device) => device.kind === \"audioinput\" || device.kind === \"audiooutput\");\n constraints.video = hasCamera ? constraints.video : false;\n constraints.audio = hasMicrophone ? constraints.audio : false;\n stream = await navigator.mediaDevices.getUserMedia(constraints);\n } catch (e) {\n stream = null;\n granted = false;\n }\n update();\n permissionGranted.value = granted;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update, { passive: true });\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n var _a2;\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => useEventListener(t, \"ended\", stop, { passive: true }));\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else\n _stop();\n },\n { immediate: true }\n );\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDocumentVisibility(options = {}) {\n const { document = defaultDocument } = options;\n if (!document)\n return shallowRef(\"visible\");\n const visibility = shallowRef(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n }, { passive: true });\n return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n var _a;\n const {\n pointerTypes,\n preventDefault,\n stopPropagation,\n exact,\n onMove,\n onEnd,\n onStart,\n initialValue,\n axis = \"both\",\n draggingElement = defaultWindow,\n containerElement,\n handle: draggingHandle = target,\n buttons = [0]\n } = options;\n const position = ref(\n (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n );\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (pointerTypes)\n return pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (toValue(preventDefault))\n e.preventDefault();\n if (toValue(stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (!toValue(buttons).includes(e.button))\n return;\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (toValue(exact) && e.target !== toValue(target))\n return;\n const container = toValue(containerElement);\n const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n const targetRect = toValue(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n };\n if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n const container = toValue(containerElement);\n const targetRect = toValue(target).getBoundingClientRect();\n let { x, y } = position.value;\n if (axis === \"x\" || axis === \"both\") {\n x = e.clientX - pressedDelta.value.x;\n if (container)\n x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n }\n if (axis === \"y\" || axis === \"both\") {\n y = e.clientY - pressedDelta.value.y;\n if (container)\n y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n }\n position.value = {\n x,\n y\n };\n onMove == null ? void 0 : onMove(position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n onEnd == null ? void 0 : onEnd(position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n const config = () => {\n var _a2;\n return {\n capture: (_a2 = options.capture) != null ? _a2 : true,\n passive: !toValue(preventDefault)\n };\n };\n useEventListener(draggingHandle, \"pointerdown\", start, config);\n useEventListener(draggingElement, \"pointermove\", move, config);\n useEventListener(draggingElement, \"pointerup\", end, config);\n }\n return {\n ...toRefs(position),\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(\n () => `left:${position.value.x}px;top:${position.value.y}px;`\n )\n };\n}\n\nfunction useDropZone(target, options = {}) {\n var _a, _b;\n const isOverDropZone = shallowRef(false);\n const files = shallowRef(null);\n let counter = 0;\n let isValid = true;\n if (isClient) {\n const _options = typeof options === \"function\" ? { onDrop: options } : options;\n const multiple = (_a = _options.multiple) != null ? _a : true;\n const preventDefaultForUnhandled = (_b = _options.preventDefaultForUnhandled) != null ? _b : false;\n const getFiles = (event) => {\n var _a2, _b2;\n const list = Array.from((_b2 = (_a2 = event.dataTransfer) == null ? void 0 : _a2.files) != null ? _b2 : []);\n return list.length === 0 ? null : multiple ? list : [list[0]];\n };\n const checkDataTypes = (types) => {\n const dataTypes = unref(_options.dataTypes);\n if (typeof dataTypes === \"function\")\n return dataTypes(types);\n if (!(dataTypes == null ? void 0 : dataTypes.length))\n return true;\n if (types.length === 0)\n return false;\n return types.every(\n (type) => dataTypes.some((allowedType) => type.includes(allowedType))\n );\n };\n const checkValidity = (items) => {\n const types = Array.from(items != null ? items : []).map((item) => item.type);\n const dataTypesValid = checkDataTypes(types);\n const multipleFilesValid = multiple || items.length <= 1;\n return dataTypesValid && multipleFilesValid;\n };\n const isSafari = () => /^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent) && !(\"chrome\" in window);\n const handleDragEvent = (event, eventType) => {\n var _a2, _b2, _c, _d, _e, _f;\n const dataTransferItemList = (_a2 = event.dataTransfer) == null ? void 0 : _a2.items;\n isValid = (_b2 = dataTransferItemList && checkValidity(dataTransferItemList)) != null ? _b2 : false;\n if (preventDefaultForUnhandled) {\n event.preventDefault();\n }\n if (!isSafari() && !isValid) {\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"none\";\n }\n return;\n }\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"copy\";\n }\n const currentFiles = getFiles(event);\n switch (eventType) {\n case \"enter\":\n counter += 1;\n isOverDropZone.value = true;\n (_c = _options.onEnter) == null ? void 0 : _c.call(_options, null, event);\n break;\n case \"over\":\n (_d = _options.onOver) == null ? void 0 : _d.call(_options, null, event);\n break;\n case \"leave\":\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n (_e = _options.onLeave) == null ? void 0 : _e.call(_options, null, event);\n break;\n case \"drop\":\n counter = 0;\n isOverDropZone.value = false;\n if (isValid) {\n files.value = currentFiles;\n (_f = _options.onDrop) == null ? void 0 : _f.call(_options, currentFiles, event);\n }\n break;\n }\n };\n useEventListener(target, \"dragenter\", (event) => handleDragEvent(event, \"enter\"));\n useEventListener(target, \"dragover\", (event) => handleDragEvent(event, \"over\"));\n useEventListener(target, \"dragleave\", (event) => handleDragEvent(event, \"leave\"));\n useEventListener(target, \"drop\", (event) => handleDragEvent(event, \"drop\"));\n }\n return {\n files,\n isOverDropZone\n };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...observerOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const _targets = toValue(target);\n return Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)];\n });\n const stopWatch = watch(\n targets,\n (els) => {\n cleanup();\n if (isSupported.value && window) {\n observer = new ResizeObserver(callback);\n for (const _el of els) {\n if (_el)\n observer.observe(_el, observerOptions);\n }\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true,\n updateTiming = \"sync\"\n } = options;\n const height = shallowRef(0);\n const bottom = shallowRef(0);\n const left = shallowRef(0);\n const right = shallowRef(0);\n const top = shallowRef(0);\n const width = shallowRef(0);\n const x = shallowRef(0);\n const y = shallowRef(0);\n function recalculate() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n function update() {\n if (updateTiming === \"sync\")\n recalculate();\n else if (updateTiming === \"next-frame\")\n requestAnimationFrame(() => recalculate());\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n useMutationObserver(target, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useElementByPoint(options) {\n const {\n x,\n y,\n document = defaultDocument,\n multiple,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const isSupported = useSupported(() => {\n if (toValue(multiple))\n return document && \"elementsFromPoint\" in document;\n return document && \"elementFromPoint\" in document;\n });\n const element = shallowRef(null);\n const cb = () => {\n var _a, _b;\n element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n };\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n return {\n isSupported,\n element,\n ...controls\n };\n}\n\nfunction useElementHover(el, options = {}) {\n const {\n delayEnter = 0,\n delayLeave = 0,\n triggerOnRemoval = false,\n window = defaultWindow\n } = options;\n const isHovered = shallowRef(false);\n let timer;\n const toggle = (entering) => {\n const delay = entering ? delayEnter : delayLeave;\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (delay)\n timer = setTimeout(() => isHovered.value = entering, delay);\n else\n isHovered.value = entering;\n };\n if (!window)\n return isHovered;\n useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n if (triggerOnRemoval) {\n onElementRemoval(\n computed(() => unrefElement(el)),\n () => toggle(false)\n );\n }\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { window = defaultWindow, box = \"content-box\" } = options;\n const isSVG = computed(() => {\n var _a, _b;\n return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n });\n const width = shallowRef(initialSize.width);\n const height = shallowRef(initialSize.height);\n const { stop: stop1 } = useResizeObserver(\n target,\n ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (window && isSVG.value) {\n const $elem = unrefElement(target);\n if ($elem) {\n const rect = $elem.getBoundingClientRect();\n width.value = rect.width;\n height.value = rect.height;\n }\n } else {\n if (boxSize) {\n const formatBoxSize = toArray(boxSize);\n width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }\n },\n options\n );\n tryOnMounted(() => {\n const ele = unrefElement(target);\n if (ele) {\n width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n }\n });\n const stop2 = watch(\n () => unrefElement(target),\n (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n }\n );\n function stop() {\n stop1();\n stop2();\n }\n return {\n width,\n height,\n stop\n };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0,\n window = defaultWindow,\n immediate = true\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n const targets = computed(() => {\n const _target = toValue(target);\n return toArray(_target).map(unrefElement).filter(notNullish);\n });\n let cleanup = noop;\n const isActive = shallowRef(immediate);\n const stopWatch = isSupported.value ? watch(\n () => [targets.value, unrefElement(root), isActive.value],\n ([targets2, root2]) => {\n cleanup();\n if (!isActive.value)\n return;\n if (!targets2.length)\n return;\n const observer = new IntersectionObserver(\n callback,\n {\n root: unrefElement(root2),\n rootMargin,\n threshold\n }\n );\n targets2.forEach((el) => el && observer.observe(el));\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n },\n { immediate, flush: \"post\" }\n ) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n isActive.value = false;\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n isActive,\n pause() {\n cleanup();\n isActive.value = false;\n },\n resume() {\n isActive.value = true;\n },\n stop\n };\n}\n\nfunction useElementVisibility(element, options = {}) {\n const {\n window = defaultWindow,\n scrollTarget,\n threshold = 0,\n rootMargin,\n once = false\n } = options;\n const elementIsVisible = shallowRef(false);\n const { stop } = useIntersectionObserver(\n element,\n (intersectionObserverEntries) => {\n let isIntersecting = elementIsVisible.value;\n let latestTime = 0;\n for (const entry of intersectionObserverEntries) {\n if (entry.time >= latestTime) {\n latestTime = entry.time;\n isIntersecting = entry.isIntersecting;\n }\n }\n elementIsVisible.value = isIntersecting;\n if (once) {\n watchOnce(elementIsVisible, () => {\n stop();\n });\n }\n },\n {\n root: scrollTarget,\n window,\n threshold,\n rootMargin: toValue(rootMargin)\n }\n );\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\n// @__NO_SIDE_EFFECTS__\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || /* @__PURE__ */ new Set();\n listeners.add(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n listeners.delete(listener);\n if (!listeners.size)\n reset();\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n const event = shallowRef(null);\n const data = shallowRef(null);\n const status = shallowRef(\"CONNECTING\");\n const eventSource = ref(null);\n const error = shallowRef(null);\n const urlRef = toRef(url);\n const lastEventId = shallowRef(null);\n let explicitlyClosed = false;\n let retried = 0;\n const {\n withCredentials = false,\n immediate = true,\n autoConnect = true,\n autoReconnect,\n serializer = {\n read: (v) => v\n }\n } = options;\n const close = () => {\n if (isClient && eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n explicitlyClosed = true;\n }\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const es = new EventSource(urlRef.value, { withCredentials });\n status.value = \"CONNECTING\";\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n if (es.readyState === 2 && !explicitlyClosed && autoReconnect) {\n es.close();\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions$1(autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n es.onmessage = (e) => {\n var _a;\n event.value = null;\n data.value = (_a = serializer.read(e.data)) != null ? _a : null;\n lastEventId.value = e.lastEventId;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n var _a, _b;\n event.value = event_name;\n data.value = (_a = serializer.read(e.data)) != null ? _a : null;\n lastEventId.value = (_b = e.lastEventId) != null ? _b : null;\n }, { passive: true });\n }\n };\n const open = () => {\n if (!isClient)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n tryOnScopeDispose(close);\n return {\n eventSource,\n event,\n data,\n status,\n error,\n open,\n close,\n lastEventId\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = shallowRef(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = toRef(newIcon);\n const applyIcon = (icon) => {\n const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n if (!elements || elements.length === 0) {\n const link = document == null ? void 0 : document.createElement(\"link\");\n if (link) {\n link.rel = rel;\n link.href = `${baseUrl}${icon}`;\n link.type = `image/${icon.split(\".\").pop()}`;\n document == null ? void 0 : document.head.append(link);\n }\n return;\n }\n elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(\n favicon,\n (i, o) => {\n if (typeof i === \"string\" && i !== o)\n applyIcon(i);\n },\n { immediate: true }\n );\n return favicon;\n}\n\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n return reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries(headers.entries());\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n let callback;\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] != null) {\n callback = callbacks[i];\n break;\n }\n }\n if (callback)\n return { ...ctx, ...await callback(ctx) };\n return ctx;\n };\n } else {\n return async (ctx) => {\n for (const callback of callbacks) {\n if (callback)\n ctx = { ...ctx, ...await callback(ctx) };\n }\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = toValue(config.baseUrl);\n const targetUrl = toValue(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = {\n ...options,\n ...args[0],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n };\n } else {\n fetchOptions = {\n ...fetchOptions,\n ...args[0],\n headers: {\n ...headersToObject(fetchOptions.headers) || {},\n ...headersToObject(args[0].headers) || {}\n }\n };\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = {\n ...options,\n ...args[1],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n };\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a, _b;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = {\n immediate: true,\n refetch: false,\n timeout: 0,\n updateDataOnError: false\n };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = { ...options, ...args[0] };\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = { ...options, ...args[1] };\n }\n const {\n fetch = (_b = (_a = defaultWindow) == null ? void 0 : _a.fetch) != null ? _b : globalThis == null ? void 0 : globalThis.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = shallowRef(false);\n const isFetching = shallowRef(false);\n const aborted = shallowRef(false);\n const statusCode = shallowRef(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData || null);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = (reason) => {\n if (supportsAbort) {\n controller == null ? void 0 : controller.abort(reason);\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = {\n ...fetchOptions,\n signal: controller.signal\n };\n }\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n let executeCounter = 0;\n const execute = async (throwOnFailed = false) => {\n var _a2, _b2;\n abort();\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n executeCounter += 1;\n const currentExecuteCounter = executeCounter;\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n const payload = toValue(config.payload);\n if (payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n const proto = Object.getPrototypeOf(payload);\n if (!config.payloadType && payload && (proto === Object.prototype || Array.isArray(proto)) && !(payload instanceof FormData))\n config.payloadType = \"json\";\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: toValue(url),\n options: {\n ...defaultFetchOptions,\n ...fetchOptions\n },\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return fetch(\n context.url,\n {\n ...defaultFetchOptions,\n ...context.options,\n headers: {\n ...headersToObject(defaultFetchOptions.headers),\n ...headersToObject((_b2 = context.options) == null ? void 0 : _b2.headers)\n }\n }\n ).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse.clone()[config.type]();\n if (!fetchResponse.ok) {\n data.value = initialData || null;\n throw new Error(fetchResponse.statusText);\n }\n if (options.afterFetch) {\n ({ data: responseData } = await options.afterFetch({\n data: responseData,\n response: fetchResponse,\n context,\n execute\n }));\n }\n data.value = responseData;\n responseEvent.trigger(fetchResponse);\n return fetchResponse;\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError) {\n ({ error: errorData, data: responseData } = await options.onFetchError({\n data: responseData,\n error: fetchError,\n response: response.value,\n context,\n execute\n }));\n }\n error.value = errorData;\n if (options.updateDataOnError)\n data.value = responseData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n throw fetchError;\n return null;\n }).finally(() => {\n if (currentExecuteCounter === executeCounter)\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n };\n const refetch = toRef(options.refetch);\n watch(\n [\n refetch,\n toRef(url)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n const shell = {\n isFinished: readonly(isFinished),\n isFetching: readonly(isFetching),\n statusCode,\n response,\n error,\n data,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n // method\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n // type\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(\n [\n refetch,\n toRef(config.payload)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch(reject);\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n if (options.immediate)\n Promise.resolve().then(() => execute());\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\")) {\n return `${start}/${end}`;\n }\n if (start.endsWith(\"/\") && end.startsWith(\"/\")) {\n return `${start.slice(0, -1)}${end}`;\n }\n return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\",\n reset: false,\n directory: false\n};\nfunction prepareInitialFiles(files) {\n if (!files)\n return null;\n if (files instanceof FileList)\n return files;\n const dt = new DataTransfer();\n for (const file of files) {\n dt.items.add(file);\n }\n return dt.files;\n}\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(prepareInitialFiles(options.initialFiles));\n const { on: onChange, trigger: changeTrigger } = createEventHook();\n const { on: onCancel, trigger: cancelTrigger } = createEventHook();\n const inputRef = computed(() => {\n var _a;\n const input = (_a = unrefElement(options.input)) != null ? _a : document ? document.createElement(\"input\") : void 0;\n if (input) {\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n changeTrigger(files.value);\n };\n input.oncancel = () => {\n cancelTrigger();\n };\n }\n return input;\n });\n const reset = () => {\n files.value = null;\n if (inputRef.value && inputRef.value.value) {\n inputRef.value.value = \"\";\n changeTrigger(null);\n }\n };\n const applyOptions = (options2) => {\n const el = inputRef.value;\n if (!el)\n return;\n el.multiple = toValue(options2.multiple);\n el.accept = toValue(options2.accept);\n el.webkitdirectory = toValue(options2.directory);\n if (hasOwn(options2, \"capture\"))\n el.capture = toValue(options2.capture);\n };\n const open = (localOptions) => {\n const el = inputRef.value;\n if (!el)\n return;\n const mergedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n ...localOptions\n };\n applyOptions(mergedOptions);\n if (toValue(mergedOptions.reset))\n reset();\n el.click();\n };\n watchEffect(() => {\n applyOptions(options);\n });\n return {\n files: readonly(files),\n open,\n reset,\n onCancel,\n onChange\n };\n}\n\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = options;\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = shallowRef();\n const data = shallowRef();\n const file = shallowRef();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n fileHandle.value = handle;\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n data.value = void 0;\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n await updateFile();\n const type = toValue(dataType);\n if (type === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n else if (type === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n else if (type === \"Blob\")\n data.value = file.value;\n }\n watch(() => toValue(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false, focusVisible = false, preventScroll = false } = options;\n const innerFocused = shallowRef(false);\n const targetElement = computed(() => unrefElement(target));\n const listenerOptions = { passive: true };\n useEventListener(targetElement, \"focus\", (event) => {\n var _a, _b;\n if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n innerFocused.value = true;\n }, listenerOptions);\n useEventListener(targetElement, \"blur\", () => innerFocused.value = false, listenerOptions);\n const focused = computed({\n get: () => innerFocused.value,\n set(value) {\n var _a, _b;\n if (!value && innerFocused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n else if (value && !innerFocused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll });\n }\n });\n watch(\n targetElement,\n () => {\n focused.value = initialValue;\n },\n { immediate: true, flush: \"post\" }\n );\n return { focused };\n}\n\nconst EVENT_FOCUS_IN = \"focusin\";\nconst EVENT_FOCUS_OUT = \"focusout\";\nconst PSEUDO_CLASS_FOCUS_WITHIN = \":focus-within\";\nfunction useFocusWithin(target, options = {}) {\n const { window = defaultWindow } = options;\n const targetElement = computed(() => unrefElement(target));\n const _focused = shallowRef(false);\n const focused = computed(() => _focused.value);\n const activeElement = useActiveElement(options);\n if (!window || !activeElement.value) {\n return { focused };\n }\n const listenerOptions = { passive: true };\n useEventListener(targetElement, EVENT_FOCUS_IN, () => _focused.value = true, listenerOptions);\n useEventListener(targetElement, EVENT_FOCUS_OUT, () => {\n var _a, _b, _c;\n return _focused.value = (_c = (_b = (_a = targetElement.value) == null ? void 0 : _a.matches) == null ? void 0 : _b.call(_a, PSEUDO_CLASS_FOCUS_WITHIN)) != null ? _c : false;\n }, listenerOptions);\n return { focused };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useFps(options) {\n var _a;\n const fps = shallowRef(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst eventHandlers = [\n \"fullscreenchange\",\n \"webkitfullscreenchange\",\n \"webkitendfullscreen\",\n \"mozfullscreenchange\",\n \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n const {\n document = defaultDocument,\n autoExit = false\n } = options;\n const targetRef = computed(() => {\n var _a;\n return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.documentElement;\n });\n const isFullscreen = shallowRef(false);\n const requestMethod = computed(() => {\n return [\n \"requestFullscreen\",\n \"webkitRequestFullscreen\",\n \"webkitEnterFullscreen\",\n \"webkitEnterFullScreen\",\n \"webkitRequestFullScreen\",\n \"mozRequestFullScreen\",\n \"msRequestFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const exitMethod = computed(() => {\n return [\n \"exitFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitExitFullScreen\",\n \"webkitCancelFullScreen\",\n \"mozCancelFullScreen\",\n \"msExitFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenEnabled = computed(() => {\n return [\n \"fullScreen\",\n \"webkitIsFullScreen\",\n \"webkitDisplayingFullscreen\",\n \"mozFullScreen\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenElementMethod = [\n \"fullscreenElement\",\n \"webkitFullscreenElement\",\n \"mozFullScreenElement\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document);\n const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n const isCurrentElementFullScreen = () => {\n if (fullscreenElementMethod)\n return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n return false;\n };\n const isElementFullScreen = () => {\n if (fullscreenEnabled.value) {\n if (document && document[fullscreenEnabled.value] != null) {\n return document[fullscreenEnabled.value];\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n return Boolean(target2[fullscreenEnabled.value]);\n }\n }\n }\n return false;\n };\n async function exit() {\n if (!isSupported.value || !isFullscreen.value)\n return;\n if (exitMethod.value) {\n if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n await document[exitMethod.value]();\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n await target2[exitMethod.value]();\n }\n }\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value || isFullscreen.value)\n return;\n if (isElementFullScreen())\n await exit();\n const target2 = targetRef.value;\n if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n await target2[requestMethod.value]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n await (isFullscreen.value ? exit() : enter());\n }\n const handlerCallback = () => {\n const isElementFullScreenValue = isElementFullScreen();\n if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n isFullscreen.value = isElementFullScreenValue;\n };\n const listenerOptions = { capture: false, passive: true };\n useEventListener(document, eventHandlers, handlerCallback, listenerOptions);\n useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, listenerOptions);\n tryOnMounted(handlerCallback, false);\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\n// @__NO_SIDE_EFFECTS__\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n index: gamepad.index,\n connected: gamepad.connected,\n mapping: gamepad.mapping,\n timestamp: gamepad.timestamp,\n vibrationActuator: gamepad.vibrationActuator,\n hapticActuators,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n const listenerOptions = { passive: true };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad), listenerOptions);\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad), listenerOptions);\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n onGamepadConnected(gamepad);\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = shallowRef(null);\n const error = shallowRef(null);\n const coords = ref({\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(\n updatePosition,\n (err) => error.value = err,\n {\n enableHighAccuracy,\n maximumAge,\n timeout\n }\n );\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = shallowRef(initialState);\n const lastActive = shallowRef(timestamp());\n let timer;\n const reset = () => {\n idle.value = false;\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n };\n const onEvent = createFilterWrapper(\n eventFilter,\n () => {\n lastActive.value = timestamp();\n reset();\n }\n );\n if (window) {\n const document = window.document;\n const listenerOptions = { passive: true };\n for (const event of events)\n useEventListener(window, event, onEvent, listenerOptions);\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n }, listenerOptions);\n }\n if (!initialState)\n reset();\n }\n return {\n idle,\n lastActive,\n reset\n };\n}\n\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy, width, height, decoding, fetchPriority, ismap, usemap } = options;\n img.src = src;\n if (srcset != null)\n img.srcset = srcset;\n if (sizes != null)\n img.sizes = sizes;\n if (clazz != null)\n img.className = clazz;\n if (loading != null)\n img.loading = loading;\n if (crossorigin != null)\n img.crossOrigin = crossorigin;\n if (referrerPolicy != null)\n img.referrerPolicy = referrerPolicy;\n if (width != null)\n img.width = width;\n if (height != null)\n img.height = height;\n if (decoding != null)\n img.decoding = decoding;\n if (fetchPriority != null)\n img.fetchPriority = fetchPriority;\n if (ismap != null)\n img.isMap = ismap;\n if (usemap != null)\n img.useMap = usemap;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n const state = useAsyncState(\n () => loadImage(toValue(options)),\n void 0,\n {\n resetOnExecute: true,\n ...asyncStateOptions\n }\n );\n watch(\n () => toValue(options),\n () => state.execute(asyncStateOptions.delay),\n { deep: true }\n );\n return state;\n}\n\nfunction resolveElement(el) {\n if (typeof Window !== \"undefined\" && el instanceof Window)\n return el.document.documentElement;\n if (typeof Document !== \"undefined\" && el instanceof Document)\n return el.documentElement;\n return el;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n observe: _observe = {\n mutation: false\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\",\n window = defaultWindow,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const observe = typeof _observe === \"boolean\" ? {\n mutation: _observe\n } : _observe;\n const internalX = shallowRef(0);\n const internalY = shallowRef(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c, _d;\n if (!window)\n return;\n const _element = toValue(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = toValue(_y)) != null ? _a : y.value,\n left: (_b = toValue(_x)) != null ? _b : x.value,\n behavior: toValue(behavior)\n });\n const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;\n if (x != null)\n internalX.value = scrollContainer.scrollLeft;\n if (y != null)\n internalY.value = scrollContainer.scrollTop;\n }\n const isScrolling = shallowRef(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = (e) => {\n if (!isScrolling.value)\n return;\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n };\n const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n const setArrivedState = (target) => {\n var _a;\n if (!window)\n return;\n const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n const { display, flexDirection, direction } = getComputedStyle(el);\n const directionMultipler = direction === \"rtl\" ? -1 : 1;\n const scrollLeft = el.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalX.value;\n const left = Math.abs(scrollLeft * directionMultipler) <= (offset.left || 0);\n const right = Math.abs(scrollLeft * directionMultipler) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"row-reverse\") {\n arrivedState.left = right;\n arrivedState.right = left;\n } else {\n arrivedState.left = left;\n arrivedState.right = right;\n }\n internalX.value = scrollLeft;\n let scrollTop = el.scrollTop;\n if (target === window.document && !scrollTop)\n scrollTop = window.document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n const top = Math.abs(scrollTop) <= (offset.top || 0);\n const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"column-reverse\") {\n arrivedState.top = bottom;\n arrivedState.bottom = top;\n } else {\n arrivedState.top = top;\n arrivedState.bottom = bottom;\n }\n internalY.value = scrollTop;\n };\n const onScrollHandler = (e) => {\n var _a;\n if (!window)\n return;\n const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n setArrivedState(eventTarget);\n isScrolling.value = true;\n onScrollEndDebounced(e);\n onScroll(e);\n };\n useEventListener(\n element,\n \"scroll\",\n throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n eventListenerOptions\n );\n tryOnMounted(() => {\n try {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n } catch (e) {\n onError(e);\n }\n });\n if ((observe == null ? void 0 : observe.mutation) && element != null && element !== window && element !== document) {\n useMutationObserver(\n element,\n () => {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n },\n {\n attributes: true,\n childList: true,\n subtree: true\n }\n );\n }\n useEventListener(\n element,\n \"scrollend\",\n onScrollEnd,\n eventListenerOptions\n );\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions,\n measure() {\n const _element = toValue(element);\n if (window && _element)\n setArrivedState(_element);\n }\n };\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const {\n direction = \"bottom\",\n interval = 100,\n canLoadMore = () => true\n } = options;\n const state = reactive(useScroll(\n element,\n {\n ...options,\n offset: {\n [direction]: (_a = options.distance) != null ? _a : 0,\n ...options.offset\n }\n }\n ));\n const promise = ref();\n const isLoading = computed(() => !!promise.value);\n const observedElement = computed(() => {\n return resolveElement(toValue(element));\n });\n const isElementVisible = useElementVisibility(observedElement);\n function checkAndLoad() {\n state.measure();\n if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n return;\n const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n if (state.arrivedState[direction] || isNarrower) {\n if (!promise.value) {\n promise.value = Promise.all([\n onLoadMore(state),\n new Promise((resolve) => setTimeout(resolve, interval))\n ]).finally(() => {\n promise.value = null;\n nextTick(() => checkAndLoad());\n });\n }\n }\n }\n const stop = watch(\n () => [state.arrivedState[direction], isElementVisible.value],\n checkAndLoad,\n { immediate: true }\n );\n tryOnUnmounted(stop);\n return {\n isLoading,\n reset() {\n nextTick(() => checkAndLoad());\n }\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\n// @__NO_SIDE_EFFECTS__\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = shallowRef(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n }, { passive: true });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = /* @__PURE__ */ new Set();\n const shiftDeps = /* @__PURE__ */ new Set();\n const usedKeys = /* @__PURE__ */ new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"shift\" && !value) {\n const shiftDepsArray = Array.from(shiftDeps);\n const shiftIndex = shiftDepsArray.indexOf(\"shift\");\n shiftDepsArray.forEach((key2, index) => {\n if (index >= shiftIndex) {\n current.delete(key2);\n setRefs(key2, false);\n }\n });\n shiftDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Shift\") && value) {\n [...current, ...values].forEach((key2) => shiftDeps.add(key2));\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive });\n useEventListener(\"focus\", reset, { passive });\n const proxy = new Proxy(\n refs,\n {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.map((key) => toValue(proxy[key])).every(Boolean));\n } else {\n refs[prop] = shallowRef(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? toValue(r) : r;\n }\n }\n );\n return proxy;\n}\n\nfunction usingElRef(source, cb) {\n if (toValue(source))\n cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n target = toRef(target);\n options = {\n ...defaultOptions,\n ...options\n };\n const {\n document = defaultDocument\n } = options;\n const listenerOptions = { passive: true };\n const currentTime = shallowRef(0);\n const duration = shallowRef(0);\n const seeking = shallowRef(false);\n const volume = shallowRef(1);\n const waiting = shallowRef(false);\n const ended = shallowRef(false);\n const playing = shallowRef(false);\n const rate = shallowRef(1);\n const stalled = shallowRef(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = shallowRef(-1);\n const isPictureInPicture = shallowRef(false);\n const muted = shallowRef(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const playbackErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = typeof track === \"number\" ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = typeof track === \"number\" ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = toValue(target);\n if (!el)\n return;\n const src = toValue(options.src);\n let sources = [];\n if (!src)\n return;\n if (typeof src === \"string\")\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.remove();\n });\n sources.forEach(({ src: src2, type, media }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.setAttribute(\"media\", media || \"\");\n useEventListener(source, \"error\", sourceErrorEvent.trigger, listenerOptions);\n el.appendChild(source);\n });\n el.load();\n });\n watch([target, volume], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.volume = volume.value;\n });\n watch([target, muted], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.muted = muted.value;\n });\n watch([target, rate], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.playbackRate = rate.value;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = toValue(options.tracks);\n const el = toValue(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = toValue(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = toValue(target);\n if (!el)\n return;\n if (isPlaying) {\n el.play().catch((e) => {\n playbackErrorEvent.trigger(e);\n throw e;\n });\n } else {\n el.pause();\n }\n });\n useEventListener(\n target,\n \"timeupdate\",\n () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime),\n listenerOptions\n );\n useEventListener(\n target,\n \"durationchange\",\n () => duration.value = toValue(target).duration,\n listenerOptions\n );\n useEventListener(\n target,\n \"progress\",\n () => buffered.value = timeRangeToArray(toValue(target).buffered),\n listenerOptions\n );\n useEventListener(\n target,\n \"seeking\",\n () => seeking.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"seeked\",\n () => seeking.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n [\"waiting\", \"loadstart\"],\n () => {\n waiting.value = true;\n ignorePlayingUpdates(() => playing.value = false);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"loadeddata\",\n () => waiting.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"playing\",\n () => {\n waiting.value = false;\n ended.value = false;\n ignorePlayingUpdates(() => playing.value = true);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"ratechange\",\n () => rate.value = toValue(target).playbackRate,\n listenerOptions\n );\n useEventListener(\n target,\n \"stalled\",\n () => stalled.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"ended\",\n () => ended.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"pause\",\n () => ignorePlayingUpdates(() => playing.value = false),\n listenerOptions\n );\n useEventListener(\n target,\n \"play\",\n () => ignorePlayingUpdates(() => playing.value = true),\n listenerOptions\n );\n useEventListener(\n target,\n \"enterpictureinpicture\",\n () => isPictureInPicture.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"leavepictureinpicture\",\n () => isPictureInPicture.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"volumechange\",\n () => {\n const el = toValue(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n },\n listenerOptions\n );\n const listeners = [];\n const stop = watch([target], () => {\n const el = toValue(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n // Volume\n volume,\n muted,\n // Tracks\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n // Picture in Picture\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n // Events\n onSourceError: sourceErrorEvent.on,\n onPlaybackError: playbackErrorEvent.on\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return shallowReactive(options.cache);\n return shallowReactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n page: (event) => [event.pageX, event.pageY],\n client: (event) => [event.clientX, event.clientY],\n screen: (event) => [event.screenX, event.screenY],\n movement: (event) => event instanceof MouseEvent ? [event.movementX, event.movementY] : null\n};\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n target = window,\n scroll = true,\n eventFilter\n } = options;\n let _prevMouseEvent = null;\n let _prevScrollX = 0;\n let _prevScrollY = 0;\n const x = shallowRef(initialValue.x);\n const y = shallowRef(initialValue.y);\n const sourceType = shallowRef(null);\n const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n const mouseHandler = (event) => {\n const result = extractor(event);\n _prevMouseEvent = event;\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"mouse\";\n }\n if (window) {\n _prevScrollX = window.scrollX;\n _prevScrollY = window.scrollY;\n }\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const result = extractor(event.touches[0]);\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"touch\";\n }\n }\n };\n const scrollHandler = () => {\n if (!_prevMouseEvent || !window)\n return;\n const pos = extractor(_prevMouseEvent);\n if (_prevMouseEvent instanceof MouseEvent && pos) {\n x.value = pos[0] + window.scrollX - _prevScrollX;\n y.value = pos[1] + window.scrollY - _prevScrollY;\n }\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n if (touch && type !== \"movement\") {\n useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n if (resetOnTouchEnds)\n useEventListener(target, \"touchend\", reset, listenerOptions);\n }\n if (scroll && type === \"page\")\n useEventListener(window, \"scroll\", scrollHandlerWrapper, listenerOptions);\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n windowResize = true,\n windowScroll = true,\n handleOutside = true,\n window = defaultWindow\n } = options;\n const type = options.type || \"page\";\n const { x, y, sourceType } = useMouse(options);\n const targetRef = shallowRef(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = shallowRef(0);\n const elementY = shallowRef(0);\n const elementPositionX = shallowRef(0);\n const elementPositionY = shallowRef(0);\n const elementHeight = shallowRef(0);\n const elementWidth = shallowRef(0);\n const isOutside = shallowRef(true);\n function update() {\n if (!window)\n return;\n const el = unrefElement(targetRef);\n if (!el || !(el instanceof Element))\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n }\n const stopFnList = [];\n function stop() {\n stopFnList.forEach((fn) => fn());\n stopFnList.length = 0;\n }\n tryOnMounted(() => {\n update();\n });\n if (window) {\n const {\n stop: stopResizeObserver\n } = useResizeObserver(targetRef, update);\n const {\n stop: stopMutationObserver\n } = useMutationObserver(targetRef, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n const stopWatch = watch(\n [targetRef, x, y],\n update\n );\n stopFnList.push(\n stopResizeObserver,\n stopMutationObserver,\n stopWatch\n );\n useEventListener(\n document,\n \"mouseleave\",\n () => isOutside.value = true,\n { passive: true }\n );\n if (windowScroll) {\n stopFnList.push(\n useEventListener(\"scroll\", update, { capture: true, passive: true })\n );\n }\n if (windowResize) {\n stopFnList.push(\n useEventListener(\"resize\", update, { passive: true })\n );\n }\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n capture = false,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = shallowRef(initialValue);\n const sourceType = shallowRef(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => (event) => {\n var _a;\n pressed.value = true;\n sourceType.value = srcType;\n (_a = options.onPressed) == null ? void 0 : _a.call(options, event);\n };\n const onReleased = (event) => {\n var _a;\n pressed.value = false;\n sourceType.value = null;\n (_a = options.onReleased) == null ? void 0 : _a.call(options, event);\n };\n const target = computed(() => unrefElement(options.target) || window);\n const listenerOptions = { passive: true, capture };\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"mouseleave\", onReleased, listenerOptions);\n useEventListener(window, \"mouseup\", onReleased, listenerOptions);\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"drop\", onReleased, listenerOptions);\n useEventListener(window, \"dragend\", onReleased, listenerOptions);\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), listenerOptions);\n useEventListener(window, \"touchend\", onReleased, listenerOptions);\n useEventListener(window, \"touchcancel\", onReleased, listenerOptions);\n }\n return {\n pressed,\n sourceType\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useNavigatorLanguage(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = shallowRef(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n }, { passive: true });\n return {\n isSupported,\n language\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = shallowRef(true);\n const saveData = shallowRef(false);\n const offlineAt = shallowRef(void 0);\n const onlineAt = shallowRef(void 0);\n const downlink = shallowRef(void 0);\n const downlinkMax = shallowRef(void 0);\n const rtt = shallowRef(void 0);\n const effectiveType = shallowRef(void 0);\n const type = shallowRef(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n const listenerOptions = { passive: true };\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n }, listenerOptions);\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n }, listenerOptions);\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, listenerOptions);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline: readonly(isOnline),\n saveData: readonly(saveData),\n offlineAt: readonly(offlineAt),\n onlineAt: readonly(onlineAt),\n downlink: readonly(downlink),\n downlinkMax: readonly(downlinkMax),\n effectiveType: readonly(effectiveType),\n rtt: readonly(rtt),\n type: readonly(type)\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const now = ref(/* @__PURE__ */ new Date());\n const update = () => now.value = /* @__PURE__ */ new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate }) : useIntervalFn(update, interval, { immediate });\n if (exposeControls) {\n return {\n now,\n ...controls\n };\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = shallowRef();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(\n () => toValue(object),\n (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n },\n { immediate: true }\n );\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useClamp(value, min, max) {\n if (typeof value === \"function\" || isReadonly(value))\n return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, toValue(min), toValue(max));\n },\n set(value2) {\n _value.value = clamp(value2, toValue(min), toValue(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Number.POSITIVE_INFINITY,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n const pageCount = computed(() => Math.max(\n 1,\n Math.ceil(toValue(total) / toValue(currentPageSize))\n ));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page)) {\n syncRef(page, currentPage, {\n direction: isReadonly(page) ? \"ltr\" : \"both\"\n });\n }\n if (isRef(pageSize)) {\n syncRef(pageSize, currentPageSize, {\n direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n });\n }\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = shallowRef(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"mouseout\", handler, listenerOptions);\n useEventListener(window.document, \"mouseleave\", handler, listenerOptions);\n useEventListener(window.document, \"mouseenter\", handler, listenerOptions);\n }\n return isLeft;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useScreenOrientation(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = shallowRef(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n }, { passive: true });\n }\n const lockOrientation = (type) => {\n if (isSupported.value && typeof screenOrientation.lock === \"function\")\n return screenOrientation.lock(type);\n return Promise.reject(new Error(\"Not supported\"));\n };\n const unlockOrientation = () => {\n if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const screenOrientation = reactive(useScreenOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) {\n return \"deviceOrientation\";\n }\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.gamma / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.gamma / 90;\n break;\n case \"portrait-primary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-secondary\":\n value = orientation.beta / 90;\n break;\n default:\n value = -orientation.beta / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.beta / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-primary\":\n value = orientation.gamma / 90;\n break;\n case \"portrait-secondary\":\n value = -orientation.gamma / 90;\n break;\n default:\n value = orientation.gamma / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n const parentElement = shallowRef();\n const update = () => {\n const el = unrefElement(element);\n if (el)\n parentElement.value = el.parentElement;\n };\n tryOnMounted(update);\n watch(() => toValue(element), update);\n return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n const {\n window = defaultWindow,\n immediate = true,\n ...performanceOptions\n } = options;\n const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n let observer;\n const stop = () => {\n observer == null ? void 0 : observer.disconnect();\n };\n const start = () => {\n if (isSupported.value) {\n stop();\n observer = new PerformanceObserver(callback);\n observer.observe(performanceOptions);\n }\n };\n tryOnScopeDispose(stop);\n if (immediate)\n start();\n return {\n isSupported,\n start,\n stop\n };\n}\n\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = shallowRef(false);\n const state = shallowRef(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n }\n return {\n ...toRefs(state),\n isInside\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePointerLock(target, options = {}) {\n const { document = defaultDocument } = options;\n const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n const element = shallowRef();\n const triggerElement = shallowRef();\n let targetElement;\n if (isSupported.value) {\n const listenerOptions = { passive: true };\n useEventListener(document, \"pointerlockchange\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n element.value = document.pointerLockElement;\n if (!element.value)\n targetElement = triggerElement.value = null;\n }\n }, listenerOptions);\n useEventListener(document, \"pointerlockerror\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n const action = document.pointerLockElement ? \"release\" : \"acquire\";\n throw new Error(`Failed to ${action} pointer lock.`);\n }\n }, listenerOptions);\n }\n async function lock(e) {\n var _a;\n if (!isSupported.value)\n throw new Error(\"Pointer Lock API is not supported by your browser.\");\n triggerElement.value = e instanceof Event ? e.currentTarget : null;\n targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n if (!targetElement)\n throw new Error(\"Target element undefined.\");\n targetElement.requestPointerLock();\n return await until(element).toBe(targetElement);\n }\n async function unlock() {\n if (!element.value)\n return false;\n document.exitPointerLock();\n await until(element).toBeNull();\n return true;\n }\n return {\n isSupported,\n element,\n triggerElement,\n lock,\n unlock\n };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = toRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n disableTextSelect = false\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const isPointerDown = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? \"left\" : \"right\";\n } else {\n return distanceY.value > 0 ? \"up\" : \"down\";\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const listenerOptions = { passive: true };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"pointerup\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n }, listenerOptions)\n ];\n tryOnMounted(() => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"pan-y\");\n if (disableTextSelect) {\n (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n }\n });\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return shallowRef([\"en\"]);\n const navigator = window.navigator;\n const value = shallowRef(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n }, { passive: true });\n return value;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredReducedTransparency(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-transparency: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePrevious(value, initialValue) {\n const previous = shallowRef(initialValue);\n watch(\n toRef(value),\n (_, oldValue) => {\n previous.value = oldValue;\n },\n { flush: \"sync\" }\n );\n return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = shallowRef(\"\");\n const right = shallowRef(\"\");\n const bottom = shallowRef(\"\");\n const left = shallowRef(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n tryOnMounted(update);\n useEventListener(\"resize\", useDebounceFn(update), { passive: true });\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {},\n nonce = void 0\n } = options;\n const scriptTag = shallowRef(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = toValue(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n if (nonce) {\n el.nonce = nonce;\n }\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n const listenerOptions = {\n passive: true\n };\n useEventListener(el, \"error\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"abort\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n }, listenerOptions);\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n const isLocked = shallowRef(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow = \"\";\n watch(toRef(element), (el) => {\n const target = resolveElement(toValue(el));\n if (target) {\n const ele = target;\n if (!elInitialOverflow.get(ele))\n elInitialOverflow.set(ele, ele.style.overflow);\n if (ele.style.overflow !== \"hidden\")\n initialOverflow = ele.style.overflow;\n if (ele.style.overflow === \"hidden\")\n return isLocked.value = true;\n if (isLocked.value)\n return ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const el = resolveElement(toValue(element));\n if (!el || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(\n el,\n \"touchmove\",\n (e) => {\n preventDefault(e);\n },\n { passive: false }\n );\n }\n el.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const el = resolveElement(toValue(element));\n if (!el || !isLocked.value)\n return;\n if (isIOS)\n stopTouchMoveListener == null ? void 0 : stopTouchMoveListener();\n el.style.overflow = initialOverflow;\n elInitialOverflow.delete(el);\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = {\n ...toValue(shareOptions),\n ...toValue(overrideOptions)\n };\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...toValue(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(toValue(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n maxAlternatives = 1,\n window = defaultWindow\n } = options;\n const lang = toRef(options.lang || \"en-US\");\n const isListening = shallowRef(false);\n const isFinal = shallowRef(false);\n const result = shallowRef(\"\");\n const error = shallowRef(void 0);\n let recognition;\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const toggle = (value = !isListening.value) => {\n if (value) {\n start();\n } else {\n stop();\n }\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = toValue(lang);\n recognition.maxAlternatives = maxAlternatives;\n recognition.onstart = () => {\n isListening.value = true;\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const currentResult = event.results[event.resultIndex];\n const { transcript } = currentResult[0];\n isFinal.value = currentResult.isFinal;\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = toValue(lang);\n };\n watch(isListening, (newValue, oldValue) => {\n if (newValue === oldValue)\n return;\n if (newValue)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow,\n onBoundary\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = shallowRef(false);\n const status = shallowRef(\"init\");\n const spokenText = toRef(text || \"\");\n const lang = toRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = toValue(lang);\n utterance2.voice = toValue(options.voice) || null;\n utterance2.pitch = toValue(pitch);\n utterance2.rate = toValue(rate);\n utterance2.volume = toValue(volume);\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n utterance2.onboundary = (event) => {\n onBoundary == null ? void 0 : onBoundary(event);\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n if (utterance)\n synth.speak(utterance.value);\n };\n const stop = () => {\n synth.cancel();\n isPlaying.value = false;\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n stop,\n toggle,\n speak\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n onReady\n } = options;\n const rawInit = toValue(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(toValue(initialValue));\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else if (mergeDefaults) {\n const value = await serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n data.value = mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n data.value = { ...rawInit, ...value };\n else data.value = value;\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n const promise = new Promise((resolve) => {\n read().then(() => {\n onReady == null ? void 0 : onReady(data.value);\n resolve(data);\n });\n });\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)), { passive: true });\n if (storage) {\n watchWithFilter(\n data,\n async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n },\n {\n flush,\n deep,\n eventFilter\n }\n );\n }\n Object.assign(data, {\n then: promise.then.bind(promise),\n catch: promise.catch.bind(promise)\n });\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = shallowRef(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = shallowRef(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.id = id;\n if (options.nonce)\n el.nonce = options.nonce;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(\n cssRef,\n (value) => {\n el.textContent = value;\n },\n { immediate: true }\n );\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"left\" : \"right\";\n } else {\n return diffY.value > 0 ? \"up\" : \"down\";\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n const listenerOptions = { passive, capture: !passive };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (listenerOptions.capture && !listenerOptions.passive && Math.abs(diffX.value) > Math.abs(diffY.value))\n e.preventDefault();\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop,\n // TODO: Remove in the next major version\n isPassiveEventSupported: true\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(\n document.querySelector(selector),\n () => dir.value = getValue(),\n { attributes: true }\n );\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\n// @__NO_SIDE_EFFECTS__\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange, { passive: true });\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction tryRequestAnimationFrame(window = defaultWindow, fn) {\n if (window && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(fn);\n } else {\n fn();\n }\n}\nfunction useTextareaAutosize(options = {}) {\n var _a, _b;\n const { window = defaultWindow } = options;\n const textarea = toRef(options == null ? void 0 : options.element);\n const input = toRef((_a = options == null ? void 0 : options.input) != null ? _a : \"\");\n const styleProp = (_b = options == null ? void 0 : options.styleProp) != null ? _b : \"height\";\n const textareaScrollHeight = shallowRef(1);\n const textareaOldWidth = shallowRef(0);\n function triggerResize() {\n var _a2;\n if (!textarea.value)\n return;\n let height = \"\";\n textarea.value.style[styleProp] = \"1px\";\n textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n const _styleTarget = toValue(options == null ? void 0 : options.styleTarget);\n if (_styleTarget)\n _styleTarget.style[styleProp] = `${textareaScrollHeight.value}px`;\n else\n height = `${textareaScrollHeight.value}px`;\n textarea.value.style[styleProp] = height;\n }\n watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n watch(textareaScrollHeight, () => {\n var _a2;\n return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options);\n });\n useResizeObserver(textarea, ([{ contentRect }]) => {\n if (textareaOldWidth.value === contentRect.width)\n return;\n tryRequestAnimationFrame(window, () => {\n textareaOldWidth.value = contentRect.width;\n triggerResize();\n });\n });\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n return date.toISOString().slice(0, 10);\n}\n// @__NO_SIDE_EFFECTS__\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n if (exposeControls) {\n return {\n timeAgo,\n ...controls\n };\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nconst UNITS = [\n { name: \"year\", ms: 31536e6 },\n { name: \"month\", ms: 2592e6 },\n { name: \"week\", ms: 6048e5 },\n { name: \"day\", ms: 864e5 },\n { name: \"hour\", ms: 36e5 },\n { name: \"minute\", ms: 6e4 },\n { name: \"second\", ms: 1e3 }\n];\nfunction useTimeAgoIntl(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const result = computed(\n () => getTimeAgoIntlResult(new Date(toValue(time)), options, toValue(now))\n );\n const parts = computed(() => result.value.parts);\n const timeAgoIntl = computed(\n () => formatTimeAgoIntlParts(parts.value, {\n ...options,\n locale: result.value.resolvedLocale\n })\n );\n return exposeControls ? { timeAgoIntl, parts, ...controls } : timeAgoIntl;\n}\nfunction formatTimeAgoIntl(from, options = {}, now = Date.now()) {\n const { parts, resolvedLocale } = getTimeAgoIntlResult(from, options, now);\n return formatTimeAgoIntlParts(parts, {\n ...options,\n locale: resolvedLocale\n });\n}\nfunction getTimeAgoIntlResult(from, options = {}, now = Date.now()) {\n const {\n locale,\n relativeTimeFormatOptions = { numeric: \"auto\" }\n } = options;\n const rtf = new Intl.RelativeTimeFormat(locale, relativeTimeFormatOptions);\n const { locale: resolvedLocale } = rtf.resolvedOptions();\n const diff = +from - +now;\n const absDiff = Math.abs(diff);\n for (const { name, ms } of UNITS) {\n if (absDiff >= ms) {\n return {\n resolvedLocale,\n parts: rtf.formatToParts(Math.round(diff / ms), name)\n };\n }\n }\n return {\n resolvedLocale,\n parts: rtf.formatToParts(0, \"second\")\n };\n}\nfunction formatTimeAgoIntlParts(parts, options = {}) {\n const {\n insertSpace = true,\n joinParts,\n locale\n } = options;\n if (typeof joinParts === \"function\")\n return joinParts(parts, locale);\n if (!insertSpace)\n return parts.map((part) => part.value).join(\"\");\n return parts.map((part) => part.value.trim()).join(\" \");\n}\n\nfunction useTimeoutPoll(fn, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const { start } = useTimeoutFn(loop, interval, { immediate });\n const isActive = shallowRef(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n if (immediateCallback)\n fn();\n start();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (immediate && isClient)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = shallowRef(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return {\n timestamp: ts,\n ...controls\n };\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b, _c;\n const {\n document = defaultDocument,\n restoreOnUnmount = (t) => t\n } = options;\n const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n const isReadonly = !!(newTitle && typeof newTitle === \"function\");\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n }\n watch(\n title,\n (newValue, oldValue) => {\n if (newValue !== oldValue && document)\n document.title = format(newValue != null ? newValue : \"\");\n },\n { immediate: true }\n );\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver(\n (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n },\n { childList: true }\n );\n }\n tryOnScopeDispose(() => {\n if (restoreOnUnmount) {\n const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n if (restoredTitle != null && document)\n document.title = restoredTitle;\n }\n });\n return title;\n}\n\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n return a + alpha * (b - a);\n}\nfunction toVec(t) {\n return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n var _a, _b;\n const {\n window = defaultWindow\n } = options;\n const fromVal = toValue(from);\n const toVal = toValue(to);\n const v1 = toVec(fromVal);\n const v2 = toVec(toVal);\n const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n const startedAt = Date.now();\n const endAt = Date.now() + duration;\n const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n return new Promise((resolve) => {\n source.value = fromVal;\n const tick = () => {\n var _a2;\n if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n resolve();\n return;\n }\n const now = Date.now();\n const alpha = ease((now - startedAt) / duration);\n const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n if (Array.isArray(source.value))\n source.value = arr.map((n, i) => {\n var _a3, _b2;\n return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n });\n else if (typeof source.value === \"number\")\n source.value = arr[0];\n if (now < endAt) {\n window == null ? void 0 : window.requestAnimationFrame(tick);\n } else {\n source.value = toVal;\n resolve();\n }\n };\n tick();\n });\n}\nfunction useTransition(source, options = {}) {\n let currentId = 0;\n const sourceVal = () => {\n const v = toValue(source);\n return typeof v === \"number\" ? v : v.map(toValue);\n };\n const outputRef = ref(sourceVal());\n watch(sourceVal, async (to) => {\n var _a, _b;\n if (toValue(options.disabled))\n return;\n const id = ++currentId;\n if (options.delay)\n await promiseTimeout(toValue(options.delay));\n if (id !== currentId)\n return;\n const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n (_a = options.onStarted) == null ? void 0 : _a.call(options);\n await executeTransition(outputRef, outputRef.value, toVal, {\n ...options,\n abort: () => {\n var _a2;\n return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n }\n });\n (_b = options.onFinished) == null ? void 0 : _b.call(options);\n }, { deep: true });\n watch(() => toValue(options.disabled), (disabled) => {\n if (disabled) {\n currentId++;\n outputRef.value = sourceVal();\n }\n });\n tryOnScopeDispose(() => {\n currentId++;\n });\n return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n writeMode = \"replace\",\n window = defaultWindow,\n stringify = (params) => params.toString()\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = stringify(params);\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${window.location.search || \"\"}${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${window.location.search || \"\"}${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(\n state,\n () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params, false);\n },\n { deep: true }\n );\n function write(params, shouldUpdate, shouldWriteHistory = true) {\n pause();\n if (shouldUpdate)\n updateState(params);\n if (writeMode === \"replace\") {\n window.history.replaceState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n } else {\n if (shouldWriteHistory) {\n window.history.pushState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n }\n }\n nextTick(() => resume());\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true, false);\n }\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", onChanged, listenerOptions);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, listenerOptions);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const autoSwitch = shallowRef((_b = options.autoSwitch) != null ? _b : true);\n const constraints = ref(options.constraints);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(type) {\n switch (type) {\n case \"video\": {\n if (constraints.value)\n return constraints.value.video || false;\n break;\n }\n case \"audio\": {\n if (constraints.value)\n return constraints.value.audio || false;\n break;\n }\n }\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(\"video\"),\n audio: getDeviceOptions(\"audio\")\n });\n return stream.value;\n }\n function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else _stop();\n },\n { immediate: true }\n );\n watch(\n constraints,\n () => {\n if (autoSwitch.value && stream.value)\n restart();\n },\n { immediate: true }\n );\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n constraints,\n enabled,\n autoSwitch\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue,\n shouldEmit\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));\n let event = eventName;\n if (!key) {\n key = \"modelValue\";\n }\n event = event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n const triggerEmit = (value) => {\n if (shouldEmit) {\n if (shouldEmit(value))\n _emit(event, value);\n } else {\n _emit(event, value);\n }\n };\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n let isUpdating = false;\n watch(\n () => props[key],\n (v) => {\n if (!isUpdating) {\n isUpdating = true;\n proxy.value = cloneFn(v);\n nextTick(() => isUpdating = false);\n }\n }\n );\n watch(\n proxy,\n (v) => {\n if (!isUpdating && (v !== props[key] || deep))\n triggerEmit(v);\n },\n { deep }\n );\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n triggerEmit(value);\n }\n });\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props) {\n ret[key] = useVModel(\n props,\n key,\n emit,\n options\n );\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = toRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(\n vibrate,\n interval,\n {\n immediate: false,\n immediateCallback: false\n }\n );\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = shallowRef(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerSize) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerSize / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n capacity = i;\n if (sum > containerSize)\n break;\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, containerRef, calculateRange) {\n watch([size.width, size.height, () => toValue(list), containerRef], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useWakeLock(options = {}) {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n const requestedType = shallowRef(false);\n const sentinel = shallowRef(null);\n const documentVisibility = useDocumentVisibility({ document });\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = computed(() => !!sentinel.value && documentVisibility.value === \"visible\");\n if (isSupported.value) {\n useEventListener(sentinel, \"release\", () => {\n var _a, _b;\n requestedType.value = (_b = (_a = sentinel.value) == null ? void 0 : _a.type) != null ? _b : false;\n }, { passive: true });\n whenever(\n () => documentVisibility.value === \"visible\" && (document == null ? void 0 : document.visibilityState) === \"visible\" && requestedType.value,\n (type) => {\n requestedType.value = false;\n forceRequest(type);\n }\n );\n }\n async function forceRequest(type) {\n var _a;\n await ((_a = sentinel.value) == null ? void 0 : _a.release());\n sentinel.value = isSupported.value ? await navigator.wakeLock.request(type) : null;\n }\n async function request(type) {\n if (documentVisibility.value === \"visible\")\n await forceRequest(type);\n else\n requestedType.value = type;\n }\n async function release() {\n requestedType.value = false;\n const s = sentinel.value;\n sentinel.value = null;\n await (s == null ? void 0 : s.release());\n }\n return {\n sentinel,\n isSupported,\n isActive,\n request,\n forceRequest,\n release\n };\n}\n\nfunction useWebNotification(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions: _requestForPermissions = true\n } = options;\n const defaultWebNotificationOptions = options;\n const isSupported = useSupported(() => {\n if (!window || !(\"Notification\" in window))\n return false;\n if (Notification.permission === \"granted\")\n return true;\n try {\n const notification2 = new Notification(\"\");\n notification2.onshow = () => {\n notification2.close();\n };\n } catch (e) {\n if (e.name === \"TypeError\")\n return false;\n }\n return true;\n });\n const permissionGranted = shallowRef(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n const notification = ref(null);\n const ensurePermissions = async () => {\n if (!isSupported.value)\n return;\n if (!permissionGranted.value && Notification.permission !== \"denied\") {\n const result = await Notification.requestPermission();\n if (result === \"granted\")\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n };\n const { on: onClick, trigger: clickTrigger } = createEventHook();\n const { on: onShow, trigger: showTrigger } = createEventHook();\n const { on: onError, trigger: errorTrigger } = createEventHook();\n const { on: onClose, trigger: closeTrigger } = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value || !permissionGranted.value)\n return;\n const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n notification.value = new Notification(options2.title || \"\", options2);\n notification.value.onclick = clickTrigger;\n notification.value.onshow = showTrigger;\n notification.value.onerror = errorTrigger;\n notification.value.onclose = closeTrigger;\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n if (_requestForPermissions)\n tryOnMounted(ensurePermissions);\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n ensurePermissions,\n permissionGranted,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoConnect = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = shallowRef(\"CLOSED\");\n const wsRef = ref();\n const urlRef = toRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let retryTimeout;\n let pongTimeoutWait;\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetRetry = () => {\n if (retryTimeout != null) {\n clearTimeout(retryTimeout);\n retryTimeout = void 0;\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const close = (code = 1e3, reason) => {\n resetRetry();\n if (!isClient && !isWorker || !wsRef.value)\n return;\n explicitlyClosed = true;\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n wsRef.value = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n retried = 0;\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect && (wsRef.value == null || ws === wsRef.value)) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n const checkRetires = typeof retries === \"function\" ? retries : () => typeof retries === \"number\" && (retries < 0 || retried < retries);\n if (checkRetires(retried)) {\n retried += 1;\n retryTimeout = setTimeout(_init, delay);\n } else {\n onFailed == null ? void 0 : onFailed();\n }\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE,\n responseMessage = message\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === toValue(responseMessage))\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(\n () => {\n send(toValue(message), false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n explicitlyClosed = false;\n }, pongTimeout);\n },\n interval,\n { immediate: false }\n );\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n if (isClient)\n useEventListener(\"beforeunload\", () => close(), { passive: true });\n tryOnScopeDispose(close);\n }\n const open = () => {\n if (!isClient && !isWorker)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = (...args) => {\n if (!worker.value)\n return;\n worker.value.postMessage(...args);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (typeof arg0 === \"string\")\n worker.value = new Worker(arg0, workerOptions);\n else if (typeof arg0 === \"function\")\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nfunction depsParser(deps, localDeps) {\n if (deps.length === 0 && localDeps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n const depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n const str = fn.toString();\n if (str.trim().startsWith(\"function\")) {\n return str;\n } else {\n const name = fn.name;\n return `const ${name} = ${str}`;\n }\n }).join(\";\");\n const importString = `importScripts(${depsString});`;\n return `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n\nfunction jobRunner(userFunc) {\n return (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n };\n}\n\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n const {\n dependencies = [],\n localDependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = shallowRef(\"PENDING\");\n const promise = ref({});\n const timeoutId = shallowRef();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n e.preventDefault();\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(\n () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n timeout\n );\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n var _a;\n promise.value = {\n resolve,\n reject\n };\n (_a = worker.value) == null ? void 0 : _a.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\n \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n );\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useWindowFocus(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return shallowRef(false);\n const focused = shallowRef(window.document.hasFocus());\n const listenerOptions = { passive: true };\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n }, listenerOptions);\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n }, listenerOptions);\n return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n const { window = defaultWindow, ...rest } = options;\n return useScroll(window, rest);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Number.POSITIVE_INFINITY,\n initialHeight = Number.POSITIVE_INFINITY,\n listenOrientation = true,\n includeScrollbar = true,\n type = \"inner\"\n } = options;\n const width = shallowRef(initialWidth);\n const height = shallowRef(initialHeight);\n const update = () => {\n if (window) {\n if (type === \"outer\") {\n width.value = window.outerWidth;\n height.value = window.outerHeight;\n } else if (type === \"visual\" && window.visualViewport) {\n const { width: visualViewportWidth, height: visualViewportHeight, scale } = window.visualViewport;\n width.value = Math.round(visualViewportWidth * scale);\n height.value = Math.round(visualViewportHeight * scale);\n } else if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n const listenerOptions = { passive: true };\n useEventListener(\"resize\", update, listenerOptions);\n if (window && type === \"visual\" && window.visualViewport) {\n useEventListener(window.visualViewport, \"resize\", update, listenerOptions);\n }\n if (listenOrientation) {\n const matches = useMediaQuery(\"(orientation: portrait)\");\n watch(matches, () => update());\n }\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsElement, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, formatTimeAgoIntl, formatTimeAgoIntlParts, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onElementRemoval, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, provideSSRWidth, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCountdown, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePreferredReducedTransparency, usePrevious, useRafFn, useRefHistory, useResizeObserver, useSSRWidth, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeAgoIntl, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","import {\n nextTick,\n ref,\n watch,\n type ComponentPublicInstance,\n type Ref,\n} from \"vue\";\nimport { onClickOutside } from \"@vueuse/core\";\n\n/** A template ref that may point to an element or a Vue/Kendo component. */\nexport type PopupMenuElementRef = Ref<\n HTMLElement | ComponentPublicInstance | null\n>;\n\n/** Why the popup was closed, including the focus policy for mouse paths. */\nexport type PopupMenuCloseReason =\n | \"keyboard\"\n | \"mouse-selection\"\n | \"outside-click\"\n | \"trigger-click\"\n | null;\nexport type PopupMenuCloseTrigger = Exclude<PopupMenuCloseReason, null>;\n\n/** Minimal event shape emitted by Kendo Menu `@select`. */\nexport type KendoMenuSelectEvent = {\n item?: {\n text?: string;\n };\n event?: {\n type?: string;\n } | null;\n};\n\n/** Options for configuring {@link usePopupMenu}. */\nexport type UsePopupMenuOptions = {\n /** Reactive flag reflecting whether the popup menu is currently open. */\n isOpen: Ref<boolean>;\n /** Ref to the popup menu element or component. Used for outside-click detection. */\n menuRef: PopupMenuElementRef;\n /** Ref to the trigger button element or component. Ignored by outside-click detection. */\n triggerRef: PopupMenuElementRef;\n /** Called to open the popup menu. */\n requestShow: () => void;\n /** Called to close the popup menu. */\n requestHide: () => void;\n /**\n * Optional target to focus after a keyboard-driven close.\n * Supports ordinary elements and Vue/Kendo components exposing `$el`.\n */\n focusTargetRef?: PopupMenuElementRef;\n /**\n * Resolves the focus target when it is virtualized or dynamically rendered.\n * Takes precedence over `focusTargetRef`.\n */\n resolveFocusTarget?: () => HTMLElement | null;\n /**\n * CSS selector used to find the first focusable menu item after open.\n * Defaults to `\".k-menu-item:not(.k-disabled)\"` for Kendo Menu.\n */\n menuItemSelector?: string;\n /**\n * Keeps `aria-expanded` on the trigger in sync with `isOpen`.\n * Applies only to button-like triggers. Defaults to `true`.\n */\n manageAriaExpanded?: boolean;\n};\n\n/** Functions returned by {@link usePopupMenu} for the action menu. */\nexport type UsePopupMenuReturn = {\n /** Opens the menu, or closes it when it is already open. */\n handleActionButtonClick: () => void;\n /**\n * Handles keyboard input on the action button. Enter and Space open or close\n * the menu. Escape closes an open menu or moves focus to the configured target.\n */\n handleActionButtonKeydown: (event: KeyboardEvent) => void;\n /** Closes the menu when Escape is pressed while using the menu. */\n handleActionMenuEscape: (event: KeyboardEvent) => void;\n /**\n * Closes the menu after an item is chosen, then runs the optional action\n * provided by the consuming component.\n */\n handleMenuSelect: (\n event: KendoMenuSelectEvent,\n onAction?: (event: KendoMenuSelectEvent) => void,\n ) => void;\n /**\n * Restores focus after the popup closes. Keyboard actions prefer the\n * configured focus target; mouse menu selections return focus to the trigger.\n */\n handlePopupClose: () => void;\n};\n\nconst resolveElement = (\n target: HTMLElement | ComponentPublicInstance | null | undefined,\n) => {\n if (target instanceof HTMLElement) return target;\n\n const componentElement = target?.$el;\n return componentElement instanceof HTMLElement ? componentElement : null;\n};\n\n/** Kendo often renders triggers as anchors, so accept explicit button semantics too. */\nconst isButtonLike = (element: HTMLElement) =>\n element instanceof HTMLButtonElement ||\n element.getAttribute(\"role\") === \"button\" ||\n element.hasAttribute(\"aria-haspopup\");\n\n/**\n * Composable for accessible Kendo Popup + Menu action-menu interactions.\n *\n * It manages toggling, menu-item focus, selection modality, and contextual\n * focus restoration. The consuming component keeps ownership of menu state\n * and business-specific actions.\n *\n * @param options - Parent-owned popup state, refs, and focus configuration.\n * @returns Template event handlers for the action trigger, Kendo Menu, and Popup.\n */\nexport const usePopupMenu = (\n options: UsePopupMenuOptions,\n): UsePopupMenuReturn => {\n const popupCloseReason = ref<PopupMenuCloseReason>(null);\n const menuItemSelector =\n options.menuItemSelector ?? \".k-menu-item:not(.k-disabled)\";\n\n const resolveTriggerElement = () => resolveElement(options.triggerRef.value);\n\n const resolveConfiguredFocusTarget = () =>\n options.resolveFocusTarget?.() ??\n resolveElement(options.focusTargetRef?.value);\n\n const focusConfiguredTargetOrTrigger = () => {\n const target = resolveConfiguredFocusTarget();\n if (target) {\n target.focus();\n return true;\n }\n\n const trigger = resolveTriggerElement();\n trigger?.focus();\n return !!trigger;\n };\n\n const focusFirstEnabledMenuItem = () => {\n const menuElement = resolveElement(options.menuRef.value);\n const firstEnabledItem = menuElement?.querySelector(menuItemSelector);\n (firstEnabledItem as HTMLElement | null)?.focus();\n };\n\n /** Closes the popup if open, preserving its input modality for restoration. */\n const closePopup = (reason: PopupMenuCloseTrigger) => {\n if (!options.isOpen.value) return;\n popupCloseReason.value = reason;\n options.requestHide();\n };\n\n onClickOutside(options.menuRef, () => closePopup(\"outside-click\"), {\n ignore: [options.triggerRef],\n });\n\n if (options.manageAriaExpanded !== false) {\n watch(\n [options.isOpen, options.triggerRef],\n ([open]) => {\n const trigger = resolveTriggerElement();\n if (!trigger || !isButtonLike(trigger)) return;\n trigger.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n },\n { immediate: true, flush: \"post\" },\n );\n }\n\n /** Toggles the menu and focuses its first enabled item after opening. */\n const handleActionButtonClick = () => {\n if (options.isOpen.value) {\n closePopup(\"trigger-click\");\n return;\n }\n\n options.requestShow();\n nextTick(focusFirstEnabledMenuItem);\n };\n\n /** Handles Enter, Space, and Escape on the trigger button. */\n const handleActionButtonKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleActionButtonClick();\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (options.isOpen.value) {\n closePopup(\"keyboard\");\n return;\n }\n\n focusConfiguredTargetOrTrigger();\n }\n };\n\n /** Escape handler bound inside the menu. */\n const handleActionMenuEscape = (event: KeyboardEvent) => {\n event.preventDefault();\n event.stopPropagation();\n closePopup(\"keyboard\");\n };\n\n /** Closes the menu then delegates its business action to the caller. */\n const handleMenuSelect = (\n event: KendoMenuSelectEvent,\n onAction?: (event: KendoMenuSelectEvent) => void,\n ) => {\n closePopup(\n event.event?.type?.startsWith(\"key\") ? \"keyboard\" : \"mouse-selection\",\n );\n onAction?.(event);\n };\n\n /**\n * Bind to the Kendo Popup `@close` event after the owner updates `isOpen`.\n * Keyboard close first tries the configured focus target, then falls back to\n * the trigger. Mouse menu selection restores the trigger, while outside\n * clicks leave focus under browser control.\n */\n const handlePopupClose = () => {\n nextTick(() => {\n if (popupCloseReason.value === \"keyboard\") {\n focusConfiguredTargetOrTrigger();\n } else if (popupCloseReason.value === \"mouse-selection\") {\n resolveTriggerElement()?.focus();\n }\n\n popupCloseReason.value = null;\n });\n };\n\n return {\n /**\n * Handles Kendo Menu selection: records keyboard or mouse modality,\n * requests popup close, then runs the optional caller-owned action.\n */\n handleMenuSelect,\n /**\n * Toggles the action menu. When opening, focuses the first enabled Kendo\n * Menu item after Vue renders the popup.\n */\n handleActionButtonClick,\n /**\n * Handles trigger keyboard input: Enter and Space toggle the menu; Escape\n * closes an open menu or focuses the configured target when already closed.\n */\n handleActionButtonKeydown,\n /** Closes the open menu through the keyboard path when Escape is pressed inside it. */\n handleActionMenuEscape,\n /**\n * Restores focus after Kendo Popup closes: keyboard closes prefer the\n * configured focus target, mouse selections return to the trigger, and\n * outside clicks do not move focus.\n */\n handlePopupClose,\n };\n};\n","import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\n\nexport type ChangePayload = { value: Date | null; event: any };\n\nexport function useMaskedDateInput(args: {\n id: string;\n onChange: (p: ChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<string | Date | null | undefined>;\n min?: Date | null | undefined;\n max?: Date | null | undefined;\n /** When true, empty/incomplete value is considered invalid after blur */\n required?: boolean;\n /** Optional default date for this field (e.g., today). */\n defaultValue?: Date | null;\n dateFormat?: string;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const placeholder = ref<string>(args.dateFormat ?? \"mm/dd/yyyy\");\n const isRequired = computed(() => !!args.required);\n const MIN_YEAR = 1000;\n const isTouched = ref(false);\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"];\n\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n\n const datePart = (pos: number) => {\n if (pos <= 2) return \"mm\";\n if (pos <= 5) return \"dd\";\n if (digitsOnly.value.length <= 10) return \"yyyy\";\n return \"mm\";\n };\n\n const month = computed(() => {\n const m = raw.value\n ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(m).toString().padStart(2, \"0\");\n });\n const day = computed(() => {\n const d = raw.value\n ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(d).toString().padStart(2, \"0\");\n });\n const year = computed(() => {\n const y = raw.value\n ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(y).toString().padStart(4, \"0\");\n });\n\n const emitParsedIfComplete = (event: any) => {\n if (digitsOnly.value.length === 0) {\n args.onChange({ value: null, event });\n return;\n }\n if (digitsOnly.value.length < 8) {\n args.onChange({ value: null, event });\n return;\n }\n if ((raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8) {\n const [mmStr, ddStr, yyyyStr] = raw.value.split(\"/\");\n const mm = parseInt(mmStr);\n const dd = parseInt(ddStr);\n const yyyy = parseInt(yyyyStr);\n // Prevent auto-correction: only emit if parts are a real calendar date\n if (isValidParts(yyyy, mm, dd)) {\n const d = createDate(yyyy, mm, dd);\n if (inRange(d)) {\n args.onChange({ value: d, event });\n } else {\n args.onChange({ value: null, event });\n }\n } else {\n args.onChange({ value: null, event });\n }\n }\n };\n const inRange = (d: Date) => {\n const min = args.min ?? undefined;\n const max = args.max ?? undefined;\n if (min && d < min) return false;\n if (max && d > max) return false;\n return true;\n };\n\n const parsedRawDate = computed<Date | null>(() => {\n if ((raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8) {\n const [mmStr, ddStr, yyyyStr] = (raw.value ?? \"\").split(\"/\");\n const mm = parseInt(mmStr);\n const dd = parseInt(ddStr);\n const yyyy = parseInt(yyyyStr);\n if (isValidParts(yyyy, mm, dd)) {\n return createDate(yyyy, mm, dd);\n }\n }\n return null;\n });\n\n const isComplete = computed(() => {\n return (raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8;\n });\n\n // Helpers to centralize validity checks and baseline selection\n const createDate = (yy: number, mm: number, dd: number) => {\n const date = new Date(0);\n date.setFullYear(yy, mm - 1, dd);\n date.setHours(0, 0, 0, 0);\n return date;\n };\n\n const daysInMonth = (yy: number, mm: number) => {\n return createDate(yy, mm + 1, 0).getDate();\n };\n\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 &&\n mm <= 12 &&\n yy >= MIN_YEAR &&\n dd >= 1 &&\n dd <= daysInMonth(yy, mm)\n );\n };\n\n const handleChange = (event: any): void => {\n raw.value = event.value as string;\n const src = event.event?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n let m = parseInt(month.value);\n let d = parseInt(day.value);\n let y = parseInt(year.value);\n\n // If input is invalid or incomplete, set to today's date and ignore the step\n const hasEightDigits = digitsOnly.value.length >= 8;\n if (!hasEightDigits || !isValidParts(y, m, d)) {\n const today = args.defaultValue ?? new Date();\n m = today.getMonth() + 1;\n d = today.getDate();\n y = today.getFullYear();\n raw.value = `${String(m).padStart(2, \"0\")}/${String(d).padStart(\n 2,\n \"0\",\n )}/${String(y)}`;\n\n const setDate = createDate(y, m, d);\n args.onChange({ value: inRange(setDate) ? setDate : null, event });\n\n focusAndRestore({ useRAF: true });\n return;\n }\n\n const part = datePart(pos);\n\n if (part === \"mm\") {\n m = direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n } else if (part === \"dd\") {\n const days = new Date(y, m, 0).getDate();\n d =\n direction === \"ArrowUp\" ? (d < days ? d + 1 : 1) : d > 1 ? d - 1 : days;\n } else if (part === \"yyyy\") {\n y = direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1);\n }\n\n raw.value = `${String(m).padStart(2, \"0\")}/${String(d).padStart(\n 2,\n \"0\",\n )}/${String(y)}`;\n\n const [mmStr, ddStr, yyyyStr] = raw.value.split(\"/\");\n const steppedDate = createDate(\n parseInt(yyyyStr),\n parseInt(mmStr),\n parseInt(ddStr),\n );\n if (\n steppedDate.toString() !== \"Invalid Date\" &&\n parseInt(yyyyStr) >= 1000\n ) {\n args.onChange({\n value: inRange(steppedDate) ? steppedDate : null,\n event,\n });\n } else {\n args.onChange({ value: null, event });\n }\n\n focusAndRestore({ useRAF: true });\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.code === \"Space\" || event.key === \" \") {\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt+Down opens the menu; allow Alt combos to pass through\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n // Justified: ArrowUp/Down act as date-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n // Map mouse wheel to stepper behavior (up/down) based on caret segment\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, event.target as HTMLInputElement, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n const src = event.target as HTMLInputElement;\n if (cursorKeys.includes(event.key)) {\n // Do not prevent default for caret navigation\n cursorPos.value = src?.selectionStart ?? 0;\n return;\n }\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const handleBlur = (event: FocusEvent): void => {\n isTouched.value = true;\n\n // If required, no default provided, and value is still undefined/blank,\n // coerce external value from undefined -> \"\" so downstream validation\n // treats this as an incomplete required field.\n if (\n isRequired.value &&\n !args.defaultValue &&\n args.externalValue &&\n args.externalValue.value === undefined &&\n digitsOnly.value.length === 0\n ) {\n (args.externalValue as Ref<any>).value = \"\";\n }\n\n // Also ensure caret position is captured on blur\n const src = event.target as HTMLInputElement | null;\n if (src) {\n cursorPos.value = src.selectionStart ?? 0;\n }\n };\n\n // Centralized focus + caret restore helper to avoid duplicated logic.\n const focusAndRestore = (opts?: {\n /** milliseconds to delay the focus (useful to wait for popups to close) */\n delay?: number;\n /** when true, use requestAnimationFrame to schedule the focus */\n useRAF?: boolean;\n /** explicit caret position override; otherwise uses `cursorPos` or end */\n pos?: number | undefined;\n }) => {\n const run = () => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (!inputEl) return;\n const p = opts?.pos ?? cursorPos.value ?? inputEl.value.length;\n try {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n } catch {\n // ignore if element not focusable or selection not supported\n }\n };\n\n nextTick(() => {\n if (opts?.delay && opts.delay > 0) {\n setTimeout(run, opts.delay);\n return;\n }\n if (opts?.useRAF) {\n requestAnimationFrame(run);\n return;\n }\n run();\n });\n };\n\n // Sync external value into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n if (newVal) {\n const date = new Date(newVal as any);\n if (date.toString() !== \"Invalid Date\") {\n const m = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const d = date.getDate().toString().padStart(2, \"0\");\n const y = date.getFullYear().toString();\n raw.value = `${m}/${d}/${y}`;\n\n // When external value is updated (e.g., user selects a date\n // from the calendar), refocus the input and restore caret.\n // Delay slightly to avoid Kendo calendar focus/DOM operations\n // overriding our focus call.\n focusAndRestore({ delay: 50 });\n return;\n }\n }\n // If external value is null/invalid, keep current raw as-is\n },\n { immediate: true },\n );\n }\n\n const debugLines = computed(() => {\n return [\n [\"Date\", `${month.value} / ${day.value} / ${year.value}`],\n [\"Digits only\", digitsOnly.value],\n [\n \"min\",\n args.min?.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }) ?? null,\n ],\n [\n \"max\",\n args.max?.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }) ?? null,\n ],\n ];\n });\n\n // Range validation based on provided min/max and current external value\n const isValid = computed(() => {\n // Optional field preserves existing forgiving behavior\n if (!isRequired.value) {\n if (!isComplete.value) return true;\n const candidate = parsedRawDate.value;\n if (!candidate) return false; // complete but invalid parts\n return inRange(candidate);\n }\n\n // Required field: do not flag invalid until after blur\n if (!isTouched.value) return true;\n\n const candidate = parsedRawDate.value;\n if (!isComplete.value) return false; // incomplete after blur\n if (!candidate) return false; // complete but invalid parts\n return inRange(candidate);\n });\n\n const reason = computed<string | undefined>(() => {\n // When not required, only report reasons for completed-but-bad values\n if (!isRequired.value) {\n if (!isComplete.value) return undefined;\n const candidate = parsedRawDate.value;\n if (!candidate) return \"invalid-date\";\n if (!inRange(candidate)) return \"out-of-bounds\";\n return \"valid\";\n }\n\n // Required: only validate after blur\n if (!isTouched.value) return undefined;\n\n if (digitsOnly.value.length === 0 || !isComplete.value) {\n return \"incomplete\";\n }\n\n const candidate = parsedRawDate.value;\n if (!candidate) return \"invalid-date\";\n if (!inRange(candidate)) return \"out-of-bounds\";\n return \"valid\";\n });\n\n const validationMessage = computed(() => {\n const r = reason.value;\n if (!r || r === \"valid\") return \"\";\n\n if (r === \"incomplete\") {\n return \"Required\";\n }\n\n if (r === \"invalid-date\") {\n return `Must be in ${placeholder.value} format.`;\n }\n\n const minStr = args.min\n ? args.min.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n : null;\n const maxStr = args.max\n ? args.max.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n : null;\n if (r === \"out-of-bounds\") {\n if (minStr && maxStr) return `Must be between ${minStr} and ${maxStr}.`;\n if (minStr) return `Must be on or after ${minStr}.`;\n if (maxStr) return `Must be on or before ${maxStr}.`;\n }\n\n return \"\";\n });\n\n const initStyling = () => {\n // Adds our `fk-datepicker` class to the parent of the Kendo datepicker\n // This is separated so callers can invoke styling on demand.\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n\n if (!inputEl) {\n console.warn(`ID (#${args.id}) not found for styling.`);\n return;\n }\n const datePicker = inputEl.closest(\".k-datepicker\");\n if (!datePicker) {\n console.warn(`.k-datepicker parent not found for #${args.id} styling.`);\n return;\n }\n\n // Add class to parent to avoid it being wiped away by Kendo's DOM manipulation\n const parent = datePicker.parentElement;\n if (parent) {\n // Idempotent: if we've already added our class, do nothing.\n if (parent.classList.contains(\"fk-datepicker\")) {\n return;\n }\n parent.classList.add(\"fk-datepicker\");\n } else {\n console.warn(\n `Parent of .k-datepicker not found for #${args.id} styling.`,\n );\n }\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n return {\n raw,\n cursorPos,\n debugEnabled,\n debugLines,\n placeholder,\n isValid,\n reason: readonly(reason),\n validationMessage,\n digitsOnly,\n month: readonly(month),\n day: readonly(day),\n year: readonly(year),\n datePart,\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n // Expose so consumers can re-run styling when needed\n initStyling,\n };\n}\n","import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\nimport type { SelectionRange } from \"@progress/kendo-vue-dateinputs\";\n\nexport type RangeChangePayload = { value: SelectionRange | null; event: any };\n\ntype Part = \"mm\" | \"dd\" | \"yyyy\";\n\ntype Side = \"start\" | \"end\";\n\nexport function useMaskedDateRangeInput(args: {\n id: string; // id of the MaskedTextBox input element\n onChange: (p: RangeChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<SelectionRange | null | undefined>;\n externalValid?: Ref<boolean | undefined>;\n manageValid?: boolean; // default true: mirror computed validity into externalValid\n maxSpanDays?: number; // optional maximum allowed span between start and end (in days)\n min?: Date;\n max?: Date;\n allowReverse?: boolean; // default false\n // Popup control hooks\n isOpen?: Ref<boolean>;\n onRequestClose?: () => void;\n closeDelay?: Ref<number> | number;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const calendarChanged = ref<boolean>(false);\n\n const ONE_DAY = 24 * 60 * 60 * 1000;\n const ONE_YEAR = 365 * ONE_DAY;\n const TODAY = new Date();\n const MIN_DATE = new Date(TODAY.getTime() - ONE_YEAR);\n const MAX_DATE = new Date(TODAY.getTime() + ONE_YEAR);\n\n args.min = args.min ?? MIN_DATE;\n args.max = args.max ?? MAX_DATE;\n\n // Define helpers early to avoid \"used before initialization\" issues\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n const daysInMonth = (yy: number, mm: number) => new Date(yy, mm, 0).getDate();\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 && mm <= 12 && yy >= 1000 && dd >= 1 && dd <= daysInMonth(yy, mm)\n );\n };\n // Compare dates by date-only (UTC midnight) to avoid time-of-day issues\n const toUtcMidnightMs = (d: Date) =>\n Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());\n const clampToMinMax = (d: Date | null): Date | null => {\n if (!d) return null;\n // default to 90days ago if min/max not provided\n const min = args.min ?? new Date(Date.now() - 90 * ONE_DAY);\n // default to today\n const max = args.max ?? new Date();\n const dMs = toUtcMidnightMs(d);\n if (dMs < toUtcMidnightMs(min) || dMs > toUtcMidnightMs(max)) return null;\n return d;\n };\n const rangeIsOrdered = (start: Date, end: Date) => {\n return (args.allowReverse ?? false) ? true : start <= end;\n };\n const maskComplete = computed(() => {\n return (raw.value?.length ?? 0) >= 23 && digitsOnly.value.length >= 16;\n });\n\n const parseFromRaw = (\n s: string,\n ): { start: Date | null; end: Date | null } => {\n // Expect MM/DD/YYYY - MM/DD/YYYY\n if ((s ?? \"\").length < 23 || digitsOnly.value.length < 16)\n return { start: null, end: null };\n const left = s.substring(0, 10);\n const right = s.substring(13, 23);\n const [mm1, dd1, yyyy1] = left\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const [mm2, dd2, yyyy2] = right\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const sDate = new Date(yyyy1, mm1 - 1, dd1);\n const eDate = new Date(yyyy2, mm2 - 1, dd2);\n const sOk =\n isValidParts(yyyy1, mm1, dd1) && sDate.toString() !== \"Invalid Date\";\n const eOk =\n isValidParts(yyyy2, mm2, dd2) && eDate.toString() !== \"Invalid Date\";\n return { start: sOk ? sDate : null, end: eOk ? eDate : null };\n };\n\n // validity state shared with consumer when provided\n // Initialize to true to avoid showing validation errors before first blur\n const valid = args.externalValid ?? ref<boolean | undefined>(true);\n // Derived validity and reason\n const parsed = computed(() => parseFromRaw(raw.value));\n const clamped = computed(() => {\n const s = clampToMinMax(parsed.value.start);\n const e = clampToMinMax(parsed.value.end);\n return { start: s, end: e };\n });\n\n // Span in days between clamped start/end; undefined when incomplete or out-of-bounds\n const spanDays = computed<number | undefined>(() => {\n if (!maskComplete.value) return undefined;\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!s || !e) return undefined;\n const diffMs = Math.abs(toUtcMidnightMs(e) - toUtcMidnightMs(s));\n return Math.round(diffMs / 86400000 + 1); // NOTE: FEATHER-1155\n });\n\n // Set on first blur/clear; nothing is flagged before the user leaves the field\n const isTouched = ref(false);\n\n const reasonComputed = computed<string | undefined>(() => {\n if (!isTouched.value) return undefined;\n\n const { start, end } = parsed.value;\n if (!maskComplete.value) return \"incomplete\";\n if (!start || !end) return \"invalid-date\";\n if (!clamped.value.start || !clamped.value.end) return \"out-of-bounds\";\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!rangeIsOrdered(s, e)) return \"reversed-range\";\n if (typeof args.maxSpanDays === \"number\" && spanDays.value !== undefined) {\n if (spanDays.value > args.maxSpanDays) return \"span-exceeds-limit\";\n }\n return \"valid\";\n });\n\n const validComputed = computed<boolean | undefined>(() => {\n const r = reasonComputed.value;\n return r === undefined || r === \"valid\";\n });\n\n // User-facing validation message derived from the same live reason as validComputed\n const validationMessage = computed<string>(() => {\n const { min, max } = args;\n const r = reasonComputed.value;\n\n if (!r) return \"\";\n\n switch (r) {\n case \"incomplete\":\n return \"Required\";\n case \"invalid-date\":\n return \"One or both dates invalid.\";\n case \"reversed-range\":\n return \"End Date must be on or after Start Date.\";\n case \"out-of-bounds\":\n if (min && max) {\n return `Dates must be between ${formatDate(min)} and ${formatDate(max)}.`;\n }\n return \"Dates must be within the allowed range.\";\n case \"span-exceeds-limit\":\n return typeof args.maxSpanDays === \"number\"\n ? `Date range exceeds ${args.maxSpanDays} days.`\n : \"Date range exceeds maximum allowed span.\";\n case \"valid\":\n default:\n return \"\";\n }\n });\n // // Mirror computed validity into external ref when enabled\n // watch(\n // validComputed,\n // (v) => {\n // if (args.manageValid ?? true) {\n // valid.value = v;\n // }\n // },\n // { immediate: true },\n // );\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"]; // tracked to keep caret\n\n const fmt = (n: number, w: number) => String(n).padStart(w, \"0\");\n const formatDate = (d: Date) =>\n `${fmt(d.getMonth() + 1, 2)}/${fmt(d.getDate(), 2)}/${fmt(\n d.getFullYear(),\n 4,\n )}`;\n\n // rangeIsOrdered declared earlier\n\n const datePartForPos = (pos: number): { side: Side; part: Part } => {\n // Mask: 00/00/0000 - 00/00/0000\n // Index map (digits start at 0..9 for start, 13..22 for end)\n if (pos <= 2) return { side: \"start\", part: \"mm\" };\n if (pos <= 5) return { side: \"start\", part: pos <= 3 ? \"dd\" : \"dd\" };\n if (pos <= 11) return { side: \"start\", part: \"yyyy\" };\n if (pos <= 15) return { side: \"end\", part: \"mm\" };\n if (pos <= 18) return { side: \"end\", part: \"dd\" };\n return { side: \"end\", part: \"yyyy\" };\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n\n // Current parsed values\n const { start, end } = parseFromRaw(raw.value);\n\n // If SelectionRange is null/undefined (both sides missing), default to today and ignore the step\n if (!start && !end) {\n const today = new Date();\n const tStr = formatDate(today);\n raw.value = `${tStr} - ${tStr}`;\n args.onChange({ value: { start: today, end: today }, event });\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n return;\n }\n\n // Build baseline from user's parsed input; clamp only when emitting\n const today = new Date();\n\n const which = datePartForPos(pos);\n\n // Baseline dates: prefer parsed values (even if out-of-bounds); otherwise today\n let s = start ? new Date(start) : new Date(today);\n let e = end ? new Date(end) : new Date(today);\n\n const mutate = (d: Date, part: Part) => {\n if (part === \"mm\") {\n const m = d.getMonth() + 1;\n const next =\n direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n d.setMonth(next - 1);\n // Fix day overflow after month change\n const days = daysInMonth(d.getFullYear(), next);\n if (d.getDate() > days) d.setDate(days);\n } else if (part === \"dd\") {\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n const day = d.getDate();\n const next =\n direction === \"ArrowUp\"\n ? day < days\n ? day + 1\n : 1\n : day > 1\n ? day - 1\n : days;\n d.setDate(next);\n } else if (part === \"yyyy\") {\n const y = d.getFullYear();\n d.setFullYear(direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1));\n // Fix Feb 29 overflow, etc.\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n if (d.getDate() > days) d.setDate(days);\n }\n };\n\n if (which.side === \"start\") mutate(s, which.part);\n else mutate(e, which.part);\n\n // Compose new raw string: keep the untouched side as-is from current raw if parseable\n const sText = formatDate(s);\n const eText = formatDate(e);\n raw.value = `${sText} - ${eText}`;\n\n // Emit if valid and ordered and within min/max; else null\n const sClamped = clampToMinMax(s);\n const eClamped = clampToMinMax(e);\n if (sClamped && eClamped && rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n } else {\n args.onChange({ value: null, event });\n }\n\n // Restore caret\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n };\n\n const emitParsedIfComplete = (event: any) => {\n const { start, end } = parseFromRaw(raw.value);\n if (!start || !end) {\n args.onChange({ value: null, event });\n return;\n }\n const sClamped = clampToMinMax(start);\n const eClamped = clampToMinMax(end);\n if (!sClamped || !eClamped) {\n args.onChange({ value: null, event });\n return;\n }\n if (!rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: null, event });\n return;\n }\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n };\n\n const handleChange = (event: any): void => {\n const newValue = (event.value ?? \"\") as string;\n const originalEvent = event.event as Event | undefined;\n\n // No clear event handler from Kendo...\n // Kendo's clear button sets the value to empty and raises change;\n // treat that as an explicit clear action.\n if (!newValue && originalEvent && (originalEvent as any).type === \"click\") {\n handleClear(originalEvent);\n return;\n }\n\n raw.value = newValue;\n const src = originalEvent?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n // Do not coerce user's input; only emit parsed range when complete and valid\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n // Space already opens calendar\n if (event.code === \"Space\" || event.key === \" \") {\n // Do not let Space modify the input; only open the calendar\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt + ArrowDown: open calendar popup without changing the value via stepper\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n // Justified: ArrowUp/Down act as range-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, event.target as HTMLInputElement, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n if (cursorKeys.includes(event.key) || steppers.includes(event.key)) {\n const src = event.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const applyBlurValidation = () => {\n isTouched.value = true;\n\n if (args.manageValid ?? true) {\n valid.value = validComputed.value;\n }\n };\n\n const handleBlur = (_event: FocusEvent): void => {\n applyBlurValidation();\n };\n\n const handleClear = (event?: Event): void => {\n raw.value = \"\";\n cursorPos.value = 0;\n\n // Emit cleared range to consumer\n args.onChange({ value: null, event });\n\n // Run the same validation flow as on blur\n applyBlurValidation();\n\n // Return focus to the masked input so the user can retype\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(0, 0);\n }\n });\n };\n\n // Sync external range into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n const start = newVal?.start ?? null;\n const end = newVal?.end ?? null;\n if (start && end) {\n raw.value = `${formatDate(start)} - ${formatDate(end)}`;\n // If the change originated from calendar and popup is open, request close\n if (\n args.isOpen?.value &&\n calendarChanged.value &&\n args.onRequestClose\n ) {\n const delay =\n typeof args.closeDelay === \"number\"\n ? args.closeDelay\n : (args.closeDelay?.value ?? 0);\n setTimeout(() => {\n args.onRequestClose?.();\n calendarChanged.value = false;\n applyBlurValidation();\n }, delay);\n }\n return;\n }\n // If external is null/invalid, keep current raw as-is to preserve user's typing\n },\n { immediate: true },\n );\n }\n\n const month1 = computed(() =>\n raw.value ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day1 = computed(() =>\n raw.value ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year1 = computed(() =>\n raw.value ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const month2 = computed(() =>\n raw.value ? raw.value.substring(13, 15).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day2 = computed(() =>\n raw.value ? raw.value.substring(16, 18).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year2 = computed(() =>\n raw.value ? raw.value.substring(19, 23).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n\n const debugLines = computed((): Array<{ label: string; value: string }> => {\n const { start, end } = parseFromRaw(raw.value);\n return [\n {\n label: \"Raw\",\n value: raw.value,\n },\n {\n label: \"Min Date\",\n value: `${args.min ? args.min.toDateString() : \"-\"}`,\n },\n {\n label: \"Max Date\",\n value: `${args.max ? args.max.toDateString() : \"-\"}`,\n },\n {\n label: \"Start\",\n value: `${String(month1.value).padStart(2, \"0\")} / ${String(\n day1.value,\n ).padStart(2, \"0\")} / ${String(year1.value).padStart(4, \"0\")}`,\n },\n {\n label: \"End\",\n value: `${String(month2.value).padStart(2, \"0\")} / ${String(\n day2.value,\n ).padStart(2, \"0\")} / ${String(year2.value).padStart(4, \"0\")}`,\n },\n { label: \"Digits only\", value: digitsOnly.value },\n { label: \"Mask complete\", value: `${maskComplete.value}` },\n {\n label: \"Parsed\",\n value: `${start ? start.toDateString() : \"-\"} | ${\n end ? end.toDateString() : \"-\"\n }`,\n },\n {\n label: \"Valid (managed)\",\n value: `${valid.value ?? \"-\"}`,\n },\n { label: \"Span (days)\", value: `${spanDays.value ?? \"-\"}` },\n {\n label: \"Reason\",\n value: `${reasonComputed.value ?? \"-\"}`,\n },\n {\n label: \"Cursor in\",\n value: `${cursorPos.value ?? \"-\"} (${(() => {\n const p = cursorPos.value ?? 0;\n const w = datePartForPos(p);\n return `${w.side}.${w.part}`;\n })()})`,\n },\n ];\n });\n\n const initStyling = () => {\n // Idempotent application of the `fk-daterangepicker` class to the input's parent\n nextTick(() => {\n const rangeInput = document.getElementById(args.id) as HTMLElement | null;\n if (!rangeInput) {\n console.warn(`#${args.id} not found for styling.`);\n return;\n }\n const parentDiv = rangeInput.closest(\"div\");\n if (!parentDiv) {\n console.warn(`Parent div of #${args.id} not found for styling.`);\n return;\n }\n if (parentDiv.classList.contains(\"fk-daterangepicker\")) return;\n parentDiv.classList.add(\"fk-daterangepicker\");\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n // Accessibility fix: ensure only one month grid has tabIndex=0\n const calendarMonthTabIndexFix = () => {\n nextTick(() => {\n try {\n const containers = Array.from(\n document.querySelectorAll(\".k-animation-container\"),\n ) as HTMLElement[];\n if (!containers.length) return;\n\n // Prefer the most recently added visible container that has a calendar\n const candidate = [...containers]\n .reverse()\n .find((c) => c.querySelector(\".k-calendar\"));\n const calendarRoot = candidate?.querySelector(\n \".k-calendar\",\n ) as HTMLElement | null;\n if (!calendarRoot) return;\n\n const months = calendarRoot.querySelectorAll(\n \".k-calendar-table\",\n ) as NodeListOf<HTMLElement>;\n let foundTab0 = false;\n months.forEach((m) => {\n if (m.tabIndex === 0) {\n if (!foundTab0) {\n foundTab0 = true;\n } else {\n m.tabIndex = -1;\n }\n }\n });\n } catch (e) {\n // no-op; defensive\n console.warn(e);\n }\n });\n };\n\n // When popup opens, run the fix after render\n if (args.isOpen) {\n watch(\n args.isOpen,\n (open) => {\n if (open) {\n // Allow popup DOM to mount first\n setTimeout(() => calendarMonthTabIndexFix(), 0);\n }\n },\n { immediate: false },\n );\n }\n\n return {\n raw,\n cursorPos,\n debugEnabled: debugEnabled,\n debugLines: debugLines,\n digitsOnly: digitsOnly,\n valid,\n validComputed: readonly(validComputed),\n reason: readonly(reasonComputed),\n validationMessage: readonly(validationMessage),\n spanDays: readonly(spanDays),\n month1: readonly(month1),\n day1: readonly(day1),\n year1: readonly(year1),\n month2: readonly(month2),\n day2: readonly(day2),\n year2: readonly(year2),\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n handleClear,\n onCalendarChange: () => {\n calendarChanged.value = true;\n },\n initStyling,\n };\n}\n","import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\n\nexport type ChangePayload = { value: Date | null; event: any };\n\ntype PopupAction = \"now\" | \"set\" | null;\ntype AnyArgsHandler = (...args: unknown[]) => void;\n\nexport function useMaskedTimeInput(args: {\n id: string;\n onChange: (p: ChangePayload) => void;\n onShowPicker: (e: KeyboardEvent) => void;\n externalValue?: Ref<string | Date | null | undefined>;\n // Minute stepping granularity for ArrowUp/ArrowDown when focused in minutes.\n // Supported values: 1, 5, 10, 15, 20, 30. If not provided, defaults to 1-minute steps.\n minuteStep?: 1 | 5 | 10 | 15 | 20 | 30;\n // Reactive alternative: pass a Ref to allow dynamic updates at runtime.\n minuteStepRef?: Ref<1 | 5 | 10 | 15 | 20 | 30 | undefined>;\n timeFormat?: string;\n min?: Date | null | undefined;\n max?: Date | null | undefined;\n /** When true, empty/incomplete value is considered invalid after blur */\n required?: boolean;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const placeholder = ref<string>(args.timeFormat ?? \"hh:mm AM\");\n const isRequired = computed(() => !!args.required);\n const isTouched = ref(false);\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"];\n\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n\n // Mask rules to be used by MaskedTextBox\n // Relax numeric constraints: allow any digits, then validate afterwards\n const rules = {\n H: /[0-9]/,\n h: /[0-9]/,\n M: /[0-9]/,\n m: /[0-9]/,\n A: /[AaPp]/,\n a: /[Mm]/,\n } as const;\n\n const partAt = (pos: number) => {\n if (pos <= 2) return \"hh\"; // hours\n if (pos <= 5) return \"mm\"; // minutes\n return \"ampm\"; // AM/PM\n };\n\n const hour = computed(() => {\n const h = raw.value\n ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n const v = parseInt(h);\n return Math.min(Math.max(v, 0), 23); // keep as 0-23 for parsing convenience\n });\n const minute = computed(() => {\n const m = raw.value\n ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n const v = parseInt(m);\n return Math.min(Math.max(v, 0), 59);\n });\n const period = computed(() => {\n const p = (raw.value?.substring(6, 8) || \"AM\").toUpperCase();\n return p.startsWith(\"P\") ? \"PM\" : \"AM\";\n });\n\n const hour24 = computed(() => {\n const h12 = parseInt(raw.value?.substring(0, 2).replace(/\\D/g, \"0\") || \"0\");\n const p = period.value;\n\n // Convert 12-hour to 24-hour format\n if (h12 === 12) {\n return p === \"AM\" ? 0 : 12;\n }\n return p === \"PM\" ? h12 + 12 : h12;\n });\n\n const time24 = computed(() => {\n if (!isComplete.value) return null;\n return `${String(hour24.value).padStart(2, \"0\")}:${String(minute.value).padStart(2, \"0\")}:00`;\n });\n\n const isComplete = computed(() =>\n /^(\\d{2}):(\\d{2})\\s([AP]M)$/i.test(raw.value ?? \"\"),\n );\n\n const toDisplay = (h24: number, m: number, ap: \"AM\" | \"PM\") => {\n // display uses 12-hour formatting in the field\n let h12 = h24 % 12;\n if (h12 === 0) h12 = 12;\n return `${String(h12).padStart(2, \"0\")}:${String(m).padStart(\n 2,\n \"0\",\n )} ${ap}`;\n };\n\n const toDateFromDisplay = (display: string) => {\n const match = display.match(/^(\\d{2}):(\\d{2})\\s([AP]M)$/i);\n if (!match) return null;\n const hh = parseInt(match[1]);\n const mm = parseInt(match[2]);\n const ap = match[3].toUpperCase();\n // Enforce 12-hour bounds and minute bounds; reject invalid formats like 99:99 AM\n if (hh < 1 || hh > 12 || mm < 0 || mm > 59) return null;\n let h24 = hh % 12;\n if (ap === \"PM\") h24 += 12;\n const d = new Date();\n d.setSeconds(0, 0);\n d.setHours(h24);\n d.setMinutes(mm);\n return d;\n };\n\n const emitParsedIfComplete = (event: any) => {\n if (digitsOnly.value.length === 0) {\n args.onChange({ value: null, event });\n return;\n }\n if (!isComplete.value) {\n args.onChange({ value: null, event });\n return;\n }\n const date = toDateFromDisplay(raw.value);\n if (date && inRangeTime(date)) {\n args.onChange({ value: date, event });\n } else {\n args.onChange({ value: null, event });\n }\n };\n const minutesSinceMidnight = (d: Date) => d.getHours() * 60 + d.getMinutes();\n const inRangeTime = (d: Date) => {\n const min = args.min ?? undefined;\n const max = args.max ?? undefined;\n const m = minutesSinceMidnight(d);\n if (min) {\n const minM = minutesSinceMidnight(min);\n if (m < minM) return false;\n }\n if (max) {\n const maxM = minutesSinceMidnight(max);\n if (m > maxM) return false;\n }\n return true;\n };\n\n const syncRawFromDate = (date: Date) => {\n const h24 = date.getHours();\n const ap = h24 >= 12 ? \"PM\" : \"AM\";\n raw.value = toDisplay(h24, date.getMinutes(), ap);\n };\n\n const emitValue = (value: Date | null, event: any) => {\n args.onChange({ value, event });\n };\n\n const focusInputAfterPopupClose = () => {\n // Defer focus long enough for the popup close lifecycle to complete.\n nextTick(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n const end = (inputEl.value ?? \"\").length;\n inputEl.setSelectionRange(end, end);\n }\n });\n });\n });\n };\n\n const inferPopupAction = (event: any): PopupAction => {\n const target = event?.event?.target as HTMLElement | null | undefined;\n if (!target) return null;\n if (target.closest(\".k-time-now\")) return \"now\";\n if (target.closest(\".k-time-accept\")) return \"set\";\n return null;\n };\n\n const emitParsedDate = (date: Date | null, event: any) => {\n if (date && inRangeTime(date)) {\n emitValue(date, event);\n } else {\n emitValue(null, event);\n }\n };\n\n const handleChange: AnyArgsHandler = (...eventArgs) => {\n const event = eventArgs[0] as any;\n if (!event) return;\n\n const action = inferPopupAction(event);\n\n // TimePicker popup path: distinguish NOW vs SET and normalize value handling.\n if (action === \"now\") {\n const now = new Date();\n syncRawFromDate(now);\n emitParsedDate(now, event);\n focusInputAfterPopupClose();\n return;\n }\n\n if (event?.value instanceof Date) {\n const nextValue = new Date(event.value);\n syncRawFromDate(nextValue);\n emitParsedDate(nextValue, event);\n if (action === \"set\") {\n focusInputAfterPopupClose();\n }\n return;\n }\n\n if (event?.value === null) {\n raw.value = \"\";\n emitValue(null, event);\n return;\n }\n\n // Set raw first from event\n raw.value = event.value as string;\n const src = event.event?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n // If caret is in AM/PM segment and user typed A/a or P/p, auto-complete to AM/PM\n try {\n const pos = cursorPos.value ?? 0;\n if (partAt(pos) === \"ampm\" && (raw.value ?? \"\").length >= 8) {\n const first = raw.value.charAt(6);\n if (/[Aa]/.test(first)) {\n raw.value = `${raw.value.slice(0, 6)}AM${raw.value.slice(8)}`;\n // Move caret to end of AM/PM\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(8, 8);\n }\n });\n });\n } else if (/[Pp]/.test(first)) {\n raw.value = `${raw.value.slice(0, 6)}PM${raw.value.slice(8)}`;\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(8, 8);\n }\n });\n });\n }\n }\n } catch {}\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n const part = partAt(pos);\n\n const dispMatch = (raw.value ?? \"\").match(/^(\\d{2}):(\\d{2})\\s([AP]M)$/i);\n if (!dispMatch) {\n // If empty, initialize to current time on first step\n if ((raw.value ?? \"\").length === 0 || digitsOnly.value.length === 0) {\n const now = new Date();\n const h24 = now.getHours();\n const ap = h24 >= 12 ? \"PM\" : \"AM\";\n raw.value = toDisplay(h24, now.getMinutes(), ap);\n const date = toDateFromDisplay(raw.value);\n emitParsedDate(date, event);\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n }\n // For non-empty but invalid formats, do not auto-correct\n return;\n }\n let hh = parseInt(dispMatch[1]);\n let mm = parseInt(dispMatch[2]);\n let ap = dispMatch[3].toUpperCase() as \"AM\" | \"PM\";\n\n if (part === \"hh\") {\n if (direction === \"ArrowUp\") hh = hh < 12 ? hh + 1 : 1;\n else hh = hh > 1 ? hh - 1 : 12;\n } else if (part === \"mm\") {\n const step = args.minuteStepRef?.value ?? args.minuteStep ?? 1;\n if (step === 1) {\n if (direction === \"ArrowUp\") mm = mm < 59 ? mm + 1 : 0;\n else mm = mm > 0 ? mm - 1 : 59;\n } else {\n if (direction === \"ArrowUp\") {\n const rem = mm % step;\n let next = rem === 0 ? mm + step : mm + (step - rem);\n if (next >= 60) next = 0; // wrap to top of hour\n mm = next;\n } else {\n const rem = mm % step;\n let prev = rem === 0 ? mm - step : mm - rem;\n if (prev < 0) prev = 60 - step; // wrap to last step in hour\n mm = prev;\n }\n }\n } else if (part === \"ampm\") {\n ap = ap === \"AM\" ? \"PM\" : \"AM\";\n }\n\n raw.value = `${String(hh).padStart(2, \"0\")}:${String(mm).padStart(\n 2,\n \"0\",\n )} ${ap}`;\n const date = toDateFromDisplay(raw.value);\n emitParsedDate(date, event);\n\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.code === \"Space\" || event.key === \" \") {\n // Open the picker without modifying the input\n // Justified: Space opens the time picker popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowPicker(event);\n return;\n }\n\n // Alt+Down opens the picker; allow other Alt+arrow combinations to pass through\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the time picker popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowPicker(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n // Justified: ArrowUp/Down act as time-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n // Map mouse wheel to stepper behavior (up/down) based on caret segment\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, event.target as HTMLInputElement, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n const src = event.target as HTMLInputElement;\n if (cursorKeys.includes(event.key)) {\n // Do not prevent default for caret navigation\n cursorPos.value = src?.selectionStart ?? 0;\n return;\n }\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const handleBlur = (event: FocusEvent): void => {\n isTouched.value = true;\n\n // If required and value is still undefined/blank, coerce external\n // value from undefined -> \"\" so downstream validation can treat\n // this as an incomplete required field.\n if (\n isRequired.value &&\n args.externalValue &&\n args.externalValue.value === undefined &&\n digitsOnly.value.length === 0\n ) {\n (args.externalValue as Ref<any>).value = \"\";\n }\n\n const src = event.target as HTMLInputElement | null;\n if (src) {\n cursorPos.value = src.selectionStart ?? 0;\n }\n };\n\n // Sync external value into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n if (newVal) {\n const date = new Date(newVal as any);\n if (date.toString() !== \"Invalid Date\") {\n const h24 = date.getHours();\n const ap = h24 >= 12 ? \"PM\" : \"AM\";\n raw.value = toDisplay(h24, date.getMinutes(), ap);\n return;\n }\n }\n // If external value is null/invalid, keep current raw as-is\n },\n { immediate: true },\n );\n }\n\n const debugLines = computed(() => {\n return [\n [\"Time\", raw.value || \"--:-- --\"],\n [\"Hour (12h)\", hour.value],\n [\"Hour (24h)\", hour24.value],\n [\"Minute\", minute.value],\n [\"Period\", period.value],\n [\"Time (24h)\", time24.value ?? \"--:--:--\"],\n [\"Digits only\", digitsOnly.value],\n [\n \"Parsed Date\",\n parsedRawTime.value?.toLocaleDateString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }) ?? null,\n ],\n [\n \"min\",\n args.min?.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }) ?? null,\n ],\n [\n \"max\",\n args.max?.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }) ?? null,\n ],\n [\"valid\", isValid.value],\n [\"reason\", reason.value],\n [\"validationMessage\", validationMessage.value],\n ];\n });\n\n // Validation based on completeness and parse-ability\n const parsedRawTime = computed<Date | null>(\n () => toDateFromDisplay(raw.value) ?? null,\n );\n const isValid = computed(() => {\n // Optional field preserves forgiving behavior\n if (!isRequired.value) {\n if (!isComplete.value) return true;\n const t = parsedRawTime.value;\n if (!t) return false;\n return inRangeTime(t);\n }\n\n // Required field: do not flag invalid until after blur\n if (!isTouched.value) return true;\n\n const t = parsedRawTime.value;\n if (!isComplete.value) return false;\n if (!t) return false;\n return inRangeTime(t);\n });\n\n const reason = computed<string | undefined>(() => {\n // Optional: only report reasons for completed-but-bad values\n if (!isRequired.value) {\n if (!isComplete.value) return undefined;\n const t = parsedRawTime.value;\n if (!t) return \"invalid-time\";\n if (!inRangeTime(t)) return \"out-of-bounds\";\n return \"valid\";\n }\n\n // Required: only validate after blur\n if (!isTouched.value) return undefined;\n\n if (digitsOnly.value.length === 0 || !isComplete.value) {\n return \"incomplete\";\n }\n\n const t = parsedRawTime.value;\n if (!t) return \"invalid-time\";\n if (!inRangeTime(t)) return \"out-of-bounds\";\n return \"valid\";\n });\n\n const validationMessage = computed(() => {\n const r = reason.value;\n if (!r || r === \"valid\") return \"\";\n\n if (r === \"incomplete\") {\n return \"Required\";\n }\n\n if (r === \"invalid-time\") {\n return `Must be in ${placeholder.value} format.`;\n }\n\n const opts: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n const minStr = args.min ? args.min.toLocaleTimeString(\"en-US\", opts) : null;\n const maxStr = args.max ? args.max.toLocaleTimeString(\"en-US\", opts) : null;\n if (r === \"out-of-bounds\") {\n if (minStr && maxStr) return `Must be between ${minStr} and ${maxStr}.`;\n if (minStr) return `Must be ${minStr} or later.`;\n if (maxStr) return `Must be ${maxStr} or earlier.`;\n }\n\n return \"\";\n });\n\n const initStyling = () => {\n // Idempotent application of the `fk-timepicker` class to the time picker's parent\n nextTick(() => {\n const inputEl = document.getElementById(args.id) as HTMLElement | null;\n if (!inputEl) {\n console.warn(`#${args.id} not found for styling.`);\n return;\n }\n const timePicker = inputEl.closest(\".k-timepicker\");\n if (!timePicker) {\n console.warn(\n `.k-timepicker parent of #${args.id} not found for styling.`,\n );\n return;\n }\n const parent = timePicker.parentElement;\n if (!parent) {\n console.warn(\n `Parent of .k-timepicker not found for #${args.id} styling.`,\n );\n return;\n }\n if (parent.classList.contains(\"fk-timepicker\")) return;\n parent.classList.add(\"fk-timepicker\");\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n return {\n raw,\n rules,\n debugEnabled,\n debugLines,\n placeholder,\n isValid,\n reason: readonly(reason),\n validationMessage,\n isComplete,\n inRangeTime,\n cursorPos,\n hour: readonly(hour),\n hour24: readonly(hour24),\n minute: readonly(minute),\n period: readonly(period),\n time24: readonly(time24),\n parsedRawTime: readonly(parsedRawTime),\n handleChange,\n handleKeyDown,\n handleKeyUp,\n handleClick,\n handleWheel,\n handleBlur,\n // Expose so consumers can reapply theming when Kendo updates DOM\n initStyling,\n };\n}\n","import { nextTick, readonly, ref, shallowRef, watch, type Ref } from \"vue\";\nimport { useFocusTrap } from \"@vueuse/integrations/useFocusTrap\";\nimport { onClickOutside } from \"@vueuse/core\";\n\nexport type CloseReason = \"escape\" | \"outside\";\nexport type InitialFocus =\n | string\n | ((root: HTMLElement) => HTMLElement | null | undefined);\n\nexport function usePopupTrap(opts: {\n isOpen: Ref<boolean>;\n onRequestClose?: (reason: CloseReason, ev?: Event) => void;\n popupSelector?: string | string[];\n triggerEl?: Ref<HTMLElement | null>;\n resolvePopupEl?: () => HTMLElement | null;\n initialFocus?: InitialFocus;\n focusTrapOptions?: Parameters<typeof useFocusTrap>[1];\n returnFocusToTrigger?: boolean;\n}) {\n const popupRef = shallowRef<HTMLElement | null>(null);\n\n const defaultSelectors = [\n \".k-animation-container .k-popup\",\n \".k-popup\",\n \".k-timepicker-popup\",\n \".k-menu-popup\",\n ];\n\n const selectors = Array.isArray(opts.popupSelector)\n ? opts.popupSelector\n : [opts.popupSelector ?? defaultSelectors].flat();\n\n const pickInitialFocus = (root: HTMLElement) => {\n if (!root) return null as unknown as HTMLElement;\n if (typeof opts.initialFocus === \"string\") {\n const found = root.querySelector(opts.initialFocus) as HTMLElement | null;\n return found ?? root;\n }\n if (typeof opts.initialFocus === \"function\") {\n return (opts.initialFocus(root) as HTMLElement | null) ?? root;\n }\n const candidate = root.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ) as HTMLElement | null;\n return candidate ?? root;\n };\n\n const { activate, deactivate } = useFocusTrap(popupRef, {\n escapeDeactivates: false,\n clickOutsideDeactivates: false,\n fallbackFocus: () => popupRef.value as HTMLElement,\n initialFocus: () => pickInitialFocus(popupRef.value as HTMLElement),\n ...(opts.focusTrapOptions ?? {}),\n });\n\n let escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n let lastCloseReason = ref<CloseReason | null>(null);\n\n const findPopup = (): HTMLElement | null => {\n if (opts.resolvePopupEl) return opts.resolvePopupEl();\n\n const pickLastVisible = (root: ParentNode, sel: string) => {\n const list = Array.from(root.querySelectorAll(sel)) as HTMLElement[];\n if (!list.length) return null as HTMLElement | null;\n const visible = list.filter(\n (el) => el.offsetParent !== null || el.getClientRects().length > 0,\n );\n return visible[visible.length - 1] ?? list[list.length - 1] ?? null;\n };\n\n const scopeRoot =\n opts.triggerEl?.value?.closest?.(\".k-animation-container\") ??\n document.body;\n\n for (const sel of selectors) {\n const el = pickLastVisible(scopeRoot, sel);\n if (el) return el;\n }\n\n for (const sel of selectors) {\n const el = pickLastVisible(document, sel);\n if (el) return el;\n }\n\n return null;\n };\n\n onClickOutside(popupRef, (e) => {\n lastCloseReason.value = \"outside\";\n if (opts.isOpen.value) {\n opts.onRequestClose?.(\"outside\", e);\n }\n });\n\n watch(\n () => opts.isOpen.value,\n (open) => {\n if (open) {\n // Reset on open so the previous reason remains visible while closed\n lastCloseReason.value = null;\n nextTick(() => {\n const popup = findPopup();\n if (!popup) return;\n popupRef.value = popup;\n setTimeout(() => activate(), 0);\n\n if (!escapeHandler) {\n escapeHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n lastCloseReason.value = \"escape\";\n if (opts.isOpen.value) {\n opts.onRequestClose?.(\"escape\", e);\n }\n }\n };\n // Capture on document to catch Escape even when focus\n // stays on the trigger (e.g., TimeInput masked field).\n document.addEventListener(\"keydown\", escapeHandler, true);\n }\n });\n } else {\n deactivate();\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n popupRef.value = null;\n\n // On outside close, ensure trigger/input is not focused\n if (lastCloseReason.value === \"outside\") {\n nextTick(() => {\n const doBlur = () => {\n const root = opts.triggerEl?.value as HTMLElement | null;\n const input = root?.querySelector(\"input\") as HTMLElement | null;\n const active = document.activeElement as HTMLElement | null;\n // Only blur if focus is still on the trigger/input to avoid interfering\n if (\n active &&\n (active === input || (root && root.contains(active)))\n ) {\n (input ?? root)?.blur?.();\n }\n };\n requestAnimationFrame(() => setTimeout(doBlur, 0));\n });\n }\n\n if (\n opts.returnFocusToTrigger !== false &&\n lastCloseReason.value === \"escape\"\n ) {\n if (opts.triggerEl?.value) {\n // Schedule after Vue updates and after event/click propagation\n nextTick(() => {\n const doFocus = () => {\n const root = opts.triggerEl?.value as HTMLElement | null;\n if (!root) return;\n const input = root.querySelector(\"input\") as HTMLElement | null;\n const target = (input ?? root) as HTMLElement | null;\n target?.focus?.();\n };\n requestAnimationFrame(() => setTimeout(doFocus, 0));\n });\n }\n }\n }\n },\n );\n\n return {\n popupRef,\n activate,\n deactivate,\n lastCloseReason: readonly(lastCloseReason),\n setPopupEl: (el: HTMLElement | null) => (popupRef.value = el),\n };\n}\n"],"names":["useGridA11y","gridRef","options","activeFilterButton","ref","a11yInitialized","mutationsObserver","rowObserver","headerThTeardownCallbacks","intraRowNavigationSelector","getGridRootElement","host","isWithinThisGridScope","target","gridRoot","ariaRoot","fallbackScope","isEnterActivation","event","getColumns","handleFilterButtonKeyboardListener","key","handleFilterMenuKeyboardListener","menuItems","filterContainer","defaultFocusable","focusableSelectors","focusableElements","focusedIndex","el","targetIndex","item","currentTh","setupFilterMenuObserver","mutations","mutation","node","element","column","nextTick","wrapper","tryFocusMenuItem","container","isFormControl","tagName","handleGridKeyDown","e","row","isIntraRowHorizontalNavKey","focusedRow","r","findSiblingRow","start","direction","sib","targetRow","tabbable","currentIndex","setupGridStyling","gridHost","gridElement","setupTrNavigation","ensureSingleTabindex","rows","err","index","tbody","error","setupFilterButtonAccessibility","filterButtons","setupHeaderThTriggers","cleanupGridA11y","teardown","th","btn","columns","field","filterable","sortable","openMenu","clickHandler","columnLink","keyHandler","thead","theadKeyboardHandler","handleSortChange","customHandler","menuOpened","menuItemSelected","fieldIsSortable","c","s","initA11y","onBeforeUnmount","isCompositeFilter","filterItem","isFilterDescriptor","hasFieldFilterRecursive","child","useGridActiveFilter","filterRef","f","DEFAULT_ZIP_ERROR_MESSAGE","formatZipDisplay","input","digits","countDigitsBeforeIndex","value","digitIndexToDisplayIndex","digitIndex","useZipTextBox","zipDisplay","submitted","errorMessage","zipRaw","computed","isZipValid","length","showZipError","textBoxValid","textBoxValidate","restoreCaret","inputElement","caretIndex","args","nextValue","inputValue","opts","valid","useFieldsetTouchTracker","fieldsetRef","touched","watchEffect","onFocusout","fieldset","next","reset","useFieldsetValidationKit","suppressNextTouch","fieldsetValidate","toValue","fieldsetIsValid","tracker","createFieldValidity","isValid","createFieldValidationsMap","isValidMap","focusFirstInvalidField","formRef","form","US_STATES_BY_ABBREVIATION","readInputValue","payload","useUSAddressFormData","formData","reactive","useUSAddressZip","zipInputId","zipField","zipWrapperClass","onZipInput","watch","useUSAddressValidation","strictAddress1Valid","strictCityValid","strictStateValid","strictZipValid","strictAddressValid","focusFirstInvalid","focusoutLeavesFieldset","useUSAddress","optionalFeedbackReviewed","isRequired","onAddress1Input","onAddress2Input","onCityInput","onStateChange","resetFormData","resetZip","validationKit","fieldValidations","rawAddress1Valid","rawCityValid","rawStateValid","rawZipValid","rawAddressValid","addressValidate","address1Valid","cityValid","stateValid","zipValid","addressValid","stateDefaultItem","stateOptions","label","normalizedPayload","isAddressEmpty","optionalAddressHasAnyInput","optionalMissingRequiredFields","optionalZipInvalid","zipDigits","optionalPartialInvalid","optionalFeedbackActive","required","leftFieldset","tryOnScopeDispose","fn","getCurrentScope","onScopeDispose","isClient","toString","isObject","val","noop","isIOS","getIsIOS","_a","_b","toArray","watchImmediate","source","cb","defaultWindow","unrefElement","elRef","plain","useEventListener","cleanups","cleanup","register","listener","firstParamTargets","test","stopWatch","unref","raw_targets","raw_events","raw_listeners","raw_options","optionsClone","stop","_iOSWorkaround","onClickOutside","handler","window","ignore","capture","detectIframe","controls","listenerOptions","shouldListen","shouldIgnore","target2","hasMultipleRoots","vm","checkMultipleRoots","children","isProcessingClick","resolveElement","componentElement","isButtonLike","usePopupMenu","popupCloseReason","menuItemSelector","resolveTriggerElement","resolveConfiguredFocusTarget","focusConfiguredTargetOrTrigger","trigger","focusFirstEnabledMenuItem","closePopup","reason","open","handleActionButtonClick","onAction","useMaskedDateInput","raw","cursorPos","debugEnabled","placeholder","MIN_YEAR","isTouched","steppers","cursorKeys","digitsOnly","datePart","pos","month","m","day","d","year","y","emitParsedIfComplete","mmStr","ddStr","yyyyStr","mm","dd","yyyy","isValidParts","createDate","inRange","min","max","parsedRawDate","isComplete","yy","date","daysInMonth","handleChange","src","handleClick","applyStep","sourceEl","today","setDate","focusAndRestore","part","days","steppedDate","handleKeyDown","handleWheel","handleKeyUp","handleBlur","run","inputEl","p","newVal","debugLines","candidate","validationMessage","minStr","maxStr","initStyling","datePicker","parent","onMounted","readonly","useMaskedDateRangeInput","calendarChanged","ONE_DAY","ONE_YEAR","TODAY","MIN_DATE","MAX_DATE","toUtcMidnightMs","clampToMinMax","dMs","rangeIsOrdered","end","maskComplete","parseFromRaw","left","right","mm1","dd1","yyyy1","x","mm2","dd2","yyyy2","sDate","eDate","sOk","eOk","parsed","clamped","spanDays","diffMs","reasonComputed","validComputed","formatDate","fmt","n","w","datePartForPos","tStr","which","mutate","sText","eText","sClamped","eClamped","newValue","originalEvent","handleClear","applyBlurValidation","_event","delay","month1","day1","year1","month2","day2","year2","rangeInput","parentDiv","calendarMonthTabIndexFix","containers","calendarRoot","months","foundTab0","useMaskedTimeInput","rules","partAt","hour","h","v","minute","period","hour24","h12","time24","toDisplay","h24","ap","toDateFromDisplay","display","match","hh","inRangeTime","minutesSinceMidnight","minM","maxM","syncRawFromDate","emitValue","focusInputAfterPopupClose","inferPopupAction","emitParsedDate","eventArgs","action","now","first","dispMatch","step","rem","prev","parsedRawTime","t","timePicker","usePopupTrap","popupRef","shallowRef","defaultSelectors","selectors","pickInitialFocus","root","activate","deactivate","useFocusTrap","escapeHandler","lastCloseReason","findPopup","pickLastVisible","sel","list","visible","scopeRoot","popup","doBlur","active","doFocus"],"mappings":"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","x_google_ignoreList":[10,11]}
1
+ {"version":3,"file":"featherk-composables.es.js","sources":["../src/grid/useGridA11y.ts","../src/grid/useGridActiveFilter.ts","../src/grid/useGridRowAction.ts","../src/address/useZipTextBox.ts","../src/form/useFieldsetTouchTracker.ts","../src/form/useFieldsetValidationKit.ts","../src/address/usStates.ts","../src/address/_useUSAddressFormData.ts","../src/address/_useUSAddressZip.ts","../src/address/_useUSAddressValidation.ts","../src/address/useUSAddress.ts","../../../node_modules/@vueuse/shared/index.mjs","../../../node_modules/@vueuse/core/index.mjs","../src/menu/usePopupMenu.ts","../src/date/useMaskedDateInput.ts","../src/range/useMaskedDateRangeInput.ts","../src/time/useMaskedTimeInput.ts","../src/trap/usePopupTrap.ts"],"sourcesContent":["/**\n * useGridA11y\n *\n * Composable that augments a Kendo-based grid with accessible keyboard navigation,\n * focus management, and custom behaviors for column header menus (filter/sort).\n */\n\nimport { ref, nextTick, onBeforeUnmount, type Ref } from \"vue\";\nimport type {\n SortDescriptor,\n GridColumnProps,\n GridSortChangeEvent,\n} from \"../types/kendo\";\n\nexport const useGridA11y = (\n gridRef: Ref<any>,\n options?: { focusableMenuSelectors?: string[] },\n) => {\n // Reference to the active filter button for focus management\n const activeFilterButton = ref<HTMLElement | null>(null);\n\n let a11yInitialized = false;\n\n // Mutation observer for dynamic elements\n let mutationsObserver: MutationObserver | null = null;\n\n // Observer to watch row changes within this grid instance so we can reassert tabindex\n let rowObserver: MutationObserver | null = null;\n\n const headerThTeardownCallbacks: Array<() => void> = [];\n\n const intraRowNavigationSelector =\n \".k-table-row[data-grid-row-index] [tabindex]\";\n\n const getGridRootElement = (): HTMLElement | null => {\n const host = gridRef?.value?.$el as HTMLElement | undefined;\n if (!host) return null;\n return host.closest(\".k-grid\") as HTMLElement | null;\n };\n\n const isWithinThisGridScope = (target: HTMLElement): boolean => {\n const gridRoot = getGridRootElement();\n if (!gridRoot) return false;\n\n // Preferred scope: Kendo's grid accessibility region.\n const ariaRoot = target.closest(\".k-grid-aria-root\") as HTMLElement | null;\n if (ariaRoot) {\n return gridRoot.contains(ariaRoot);\n }\n\n // Fallback for markup/theme variance across versions.\n const fallbackScope = target.closest(\n \".k-grid-header, .k-grid-content, .k-grid-content-locked\",\n ) as HTMLElement | null;\n return fallbackScope ? gridRoot.contains(fallbackScope) : false;\n };\n\n const isEnterActivation = (event: KeyboardEvent) => {\n return (\n event.key === \"Enter\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\"\n );\n };\n\n // Helper to get columns from gridRef\n const getColumns = () => {\n return (gridRef?.value as any)?.columns as Array<GridColumnProps>;\n };\n\n /**\n * Key activation handler for a header's column menu / filter button.\n *\n * Purpose:\n * - Enables keyboard users (Space / Enter) to open the Kendo column menu without\n * triggering unintended default behaviors (like sorting) that Kendo may bind\n * to key events on header elements.\n *\n * Behavior:\n * - Intercepts Space / Enter (including legacy \"Spacebar\") keys.\n * - Prevents default and stops propagation to suppress native scrolling or\n * upstream sort handlers.\n * - Records the event target in `activeFilterButton` so focus can be restored\n * after the menu closes (Escape handling in other logic).\n * - Programmatically clicks the target to open the column menu.\n *\n * Accessibility:\n * - Treats the underlying element as a button activation; complements ARIA\n * role=\"button\" applied elsewhere.\n *\n * Idempotency / Safety:\n * - Safe to attach to multiple buttons; only responds to specified keys.\n *\n * @param event KeyboardEvent originating on the column menu trigger.\n * @returns void\n */\n const handleFilterButtonKeyboardListener = (event: KeyboardEvent) => {\n const key = event.key || event.code;\n if ([\" \", \"Spacebar\", \"Space\"].includes(key) || isEnterActivation(event)) {\n // Prevents the unintended default sorting on keyboard event\n event.preventDefault();\n event.stopPropagation();\n\n // Store reference to the filter button when it is activated\n activeFilterButton.value = event.target as HTMLElement;\n\n // Trigger the click event on the filter button\n (event.target as HTMLElement).click();\n }\n };\n\n /**\n * Keyboard interaction handler for an open Kendo Grid column menu (filter / sort menu).\n *\n * Scope:\n * - Attached to each popup (\".k-animation-container\") when it appears.\n * - Handles navigation inside two possible UI states:\n * 1. Column menu list (\".k-columnmenu-item\") items.\n * 2. Filter form container (\".k-filter-menu-container\") with inputs/buttons.\n *\n * Keys:\n * - Escape:\n * * Closes semantic focus context by returning focus to `activeFilterButton`\n * (the header or trigger element that opened the menu) and exits.\n * - ArrowUp / ArrowDown (only when NOT in a filter form container):\n * * Cycles focus among menu items (wraps at ends).\n * - Tab within filter form container:\n * * Traps focus inside the filter form’s focusable elements; Shift+Tab reverses.\n * - Tab when not in a filter form container:\n * * Cycles focus among sibling trigger buttons adjacent to the originating header\n * (previousElementSibling / nextElementSibling of the active trigger).\n *\n * Focus Model:\n * - Relies on `activeFilterButton` (external ref) to restore focus after Escape or\n * to traverse sibling triggers on plain Tab outside a filter form.\n *\n * Guard Clauses:\n * - Returns immediately if no `activeFilterButton` is set (defensive).\n *\n * Assumptions:\n * - Menu markup follows Kendo’s structure with \".k-animation-container\" wrapper.\n * - Filter form presence is detectable via \".k-filter-menu-container\".\n * - Menu action items carry class \".k-columnmenu-item\".\n *\n * Side Effects:\n * - Calls focus() on controlled elements.\n * - Prevents default + stops propagation for handled keys to avoid native browser\n * tab order / scroll interference or Kendo’s default key handling.\n *\n * @param event KeyboardEvent dispatched on the popup container.\n * @returns void\n */\n const handleFilterMenuKeyboardListener = (event: KeyboardEvent) => {\n if (!activeFilterButton.value) return;\n if (event.code === \"Escape\") {\n event.stopPropagation();\n\n if (activeFilterButton.value) {\n activeFilterButton.value.focus();\n }\n return;\n }\n\n const menuItems = Array.from(\n document.querySelectorAll(\n \".k-animation-container .k-popup .k-column-menu .k-columnmenu-item-wrapper .k-columnmenu-item\",\n ),\n ) as HTMLElement[];\n\n const filterContainer = document.querySelector(\n \".k-animation-container .k-popup .k-column-menu .k-filter-menu-container\",\n );\n\n if (filterContainer) {\n if (event.code === \"Tab\") {\n const defaultFocusable = [\n // \".k-filter-menu-container .k-dropdownlist[tabindex='0']\",\n // \".k-filter-menu-container input.k-input-inner:not([tabindex='-1']):not([disabled])\",\n // \".k-filter-menu-container button:not([tabindex='-1']):not([disabled])\",\n // \".k-checkbox\",\n \".k-dropdownlist[tabindex='0']\",\n \"input.k-input-inner:not([tabindex='-1']):not([disabled])\",\n \"button:not([tabindex='-1']):not([disabled])\",\n \".k-checkbox\",\n ];\n const focusableSelectors =\n options?.focusableMenuSelectors ?? defaultFocusable;\n const focusableElements = Array.from(\n filterContainer.querySelectorAll(focusableSelectors.join(\",\")),\n ) as HTMLElement[];\n\n if (focusableElements.length === 0) return;\n\n const focusedIndex = focusableElements.findIndex(\n (el) => el === document.activeElement,\n );\n let targetIndex: number;\n if (focusedIndex === -1) {\n targetIndex = 0;\n } else if (event.shiftKey) {\n targetIndex =\n (focusedIndex - 1 + focusableElements.length) %\n focusableElements.length;\n } else {\n targetIndex = (focusedIndex + 1) % focusableElements.length;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n focusableElements[targetIndex]?.focus();\n }\n } else {\n if (event.code === \"ArrowUp\" || event.code === \"ArrowDown\") {\n event.preventDefault();\n event.stopPropagation();\n\n const focusedIndex = menuItems.findIndex(\n (item) => item === document.activeElement,\n );\n\n let targetIndex = focusedIndex;\n if (event.code === \"ArrowUp\") {\n targetIndex =\n focusedIndex > 0 ? focusedIndex - 1 : menuItems.length - 1;\n } else if (event.code === \"ArrowDown\") {\n targetIndex =\n focusedIndex < menuItems.length - 1 ? focusedIndex + 1 : 0;\n }\n\n menuItems[targetIndex]?.focus();\n return;\n }\n }\n\n if (event.code === \"Tab\") {\n event.preventDefault();\n event.stopPropagation();\n\n const currentTh = activeFilterButton.value?.parentElement;\n const targetTh = event.shiftKey\n ? currentTh?.previousElementSibling\n : currentTh?.nextElementSibling;\n const targetButton = targetTh?.querySelector(\n \"button, [role='button'], .k-link\",\n ) as HTMLElement;\n\n targetButton?.focus();\n }\n };\n\n /**\n * Observes the document body for Kendo Grid column menu (filter/sort menu) lifecycle.\n *\n * Responsibilities:\n * - Creates a MutationObserver watching document.body (childList + subtree) for nodes\n * with class \"k-animation-container\" (the popup wrapper Kendo inserts/ removes).\n * - For each added animation container:\n * * If the active header is NOT sortable (data-feather-k-sortable=\"false\"), removes\n * any menu wrapper whose text content includes \"sort\" (case-insensitive) to hide\n * irrelevant sort options from the popup UI.\n * * Attaches a keydown listener (handleFilterMenuKeyboardListener) to enable:\n * - ArrowUp / ArrowDown navigation through menu items\n * - Tab trapping / cycling in filter form content\n * - Escape to return focus to the triggering header/filter button\n * * Uses a retry loop (nextTick + setTimeout) to auto-focus & auto-activate a lone\n * menu item (common when only \"Filter\" is present) improving keyboard efficiency.\n * - For each removed animation container (and any nested ones), detaches the keydown listener.\n *\n * Behavior Notes:\n * - Sort option pruning only occurs when the triggering column is not sortable. The sortable\n * state is inferred from data attribute: data-feather-k-sortable === \"true\".\n * - Active trigger element is read from activeFilterButton ref.\n * - Focus restoration after Escape is handled inside handleFilterMenuKeyboardListener.\n *\n * Idempotency:\n * - Calling multiple times replaces the prior MutationObserver reference (without an\n * explicit disconnect first). Current usage calls it once during initA11y(). If future\n * calls are needed, consider disconnecting mutationsObserver beforehand to avoid\n * duplicate observers.\n *\n * Cleanup:\n * - Observer and event listeners are disconnected/removed by cleanupFilterButtonAccessibility().\n *\n * Side Effects:\n * - Mutates DOM (removal of unwanted sort menu items).\n * - Registers global (document-level subtree) MutationObserver.\n * - Adds / removes keydown event listeners on popup containers.\n *\n * Preconditions:\n * - document.body is available (browser environment).\n * - activeFilterButton may reference the header/filter button that opened the menu.\n *\n * @returns void\n */\n const setupFilterMenuObserver = () => {\n mutationsObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n if (element.classList.contains(\"k-animation-container\")) {\n const column = activeFilterButton.value as HTMLElement;\n if (column) {\n const sortable = column.dataset.featherKSortable === \"true\";\n if (!sortable) {\n nextTick(() => {\n const wrappers = element.querySelectorAll(\n \".k-columnmenu-item-wrapper\",\n );\n wrappers.forEach((wrapper) => {\n const sortMenu = wrapper.textContent\n ?.toLowerCase()\n .includes(\"sort\");\n if (sortMenu) {\n wrapper.remove();\n }\n });\n });\n }\n }\n element.addEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n nextTick(() => {\n const tryFocusMenuItem = () => {\n const menuItems = Array.from(\n element.querySelectorAll(\n \".k-animation-container .k-popup .k-column-menu .k-columnmenu-item-wrapper .k-columnmenu-item\",\n ),\n ) as HTMLElement[];\n\n if (menuItems.length === 1) {\n menuItems[0].focus();\n menuItems[0].click();\n (tryFocusMenuItem as any).attempts = 0; // reset attempts\n } else if (menuItems.length > 1) {\n (tryFocusMenuItem as any).attempts = 0; // reset attempts\n return;\n } else {\n if ((tryFocusMenuItem as any).attempts === undefined)\n (tryFocusMenuItem as any).attempts = 0;\n if ((tryFocusMenuItem as any).attempts++ < 3) {\n setTimeout(tryFocusMenuItem, 200);\n }\n }\n };\n tryFocusMenuItem();\n });\n }\n\n const animationContainers = element.querySelectorAll(\n \".k-animation-container\",\n );\n animationContainers.forEach((container) => {\n (container as HTMLElement).addEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n });\n }\n });\n\n mutation.removedNodes.forEach((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.classList.contains(\"k-animation-container\")) {\n element.removeEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n }\n\n const animationContainers = element.querySelectorAll(\n \".k-animation-container\",\n );\n animationContainers.forEach((container) => {\n (container as HTMLElement).removeEventListener(\n \"keydown\",\n handleFilterMenuKeyboardListener,\n );\n });\n }\n });\n });\n });\n\n mutationsObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n };\n\n /**\n * Detects if an element is a form control or inside a form-like component.\n *\n * Purpose:\n * - Allows grid keyboard navigation to skip form controls, letting them handle\n * their own keyboard events naturally (e.g., cursor movement in inputs, spinners).\n *\n * Behavior:\n * - Returns true if the element itself is an input, textarea, select, or button.\n * - Returns true if the element is inside a Kendo form component:\n * * .k-picker-wrap (DatePicker, TimePicker, etc.)\n * * .k-input-inner (MaskedTextBox, TextBox, etc.)\n * * .k-textbox (generic Kendo textbox wrapper)\n * * [role=\"combobox\"] (dropdown, autocomplete, etc.)\n * - Returns false otherwise.\n *\n * @param el HTMLElement to check\n * @returns true if el is a form control that should manage its own keyboard events\n */\n const isFormControl = (el: HTMLElement): boolean => {\n const tagName = el.tagName.toLowerCase();\n\n // Check if element itself is a native form control\n if ([\"input\", \"textarea\", \"select\", \"button\"].includes(tagName)) {\n return true;\n }\n\n // Check if element is inside a Kendo form component wrapper\n if (\n el.closest(\n '.k-picker-wrap, .k-input-inner, .k-textbox, [role=\"combobox\"]',\n )\n ) {\n return true;\n }\n\n return false;\n };\n\n /**\n * Keyboard handler for the Grid root element (bind to @keydown on <Grid>).\n *\n * Responsibilities:\n * - ArrowUp / ArrowDown: Move focus (and tabindex=\"0\") between sibling data rows\n * (.k-table-row[data-grid-row-index]).\n * - ArrowLeft / ArrowRight: When focus is on (or within) a data row, cycle focus\n * among tabbable descendants inside that row (as defined by\n * `intraRowNavigationSelector`). If the row itself has focus and no descendant\n * is focused, ArrowRight focuses the first intra-row tabbable element.\n * - Escape: If focus is currently inside a data row descendant, collapse focus\n * back to the parent row element (ensuring it has tabindex=\"0\").\n * - Enter / Space: Reserved for future enhancements and prevented when part of\n * the core navigation key group to avoid unintended native behaviors.\n *\n * Special Cases:\n * - If the event target is a grid column menu button (identified by both\n * \"k-grid-header-menu\" and \"k-grid-column-menu\" classes), the handler stores\n * it in `activeFilterButton` and returns so menu logic can proceed elsewhere.\n * - If the event target is a form control (input, button, Kendo component, etc.),\n * the handler exits early to allow the form control to manage its own keyboard\n * events naturally.\n *\n * Side Effects:\n * - Mutates tabindex attributes on row elements to maintain exactly one row\n * with tabindex=\"0\" in the vertical navigation path.\n * - Calls focus() on target rows or intra-row elements as navigation occurs.\n *\n * Defensive Checks:\n * - Exits early if the event object, its type, or target is missing.\n * - Exits early if target is a form control (via isFormControl).\n *\n * Assumptions:\n * - `gridRef.value.$el` is the Grid root (or inside it) and queryable.\n * - Data rows use the selector \".k-table-row[data-grid-row-index]\".\n *\n * @param e KeyboardEvent from the Grid's @keydown binding.\n * @returns void\n */\n const handleGridKeyDown = (e: KeyboardEvent) => {\n if (!e.type) return;\n\n if (!e) {\n return;\n }\n const target = e.target as HTMLElement;\n if (!target) return;\n\n const row = target.closest(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement | null;\n\n // Scope keyboard handling to this grid instance's a11y/content region.\n // This prevents toolbar and external controls from being intercepted.\n if (!isWithinThisGridScope(target)) {\n return;\n }\n\n // EXIT EARLY: Don't apply grid navigation to form controls.\n // Exception: allow ArrowLeft/ArrowRight intra-row navigation for focusable\n // controls that live inside a data row.\n const isIntraRowHorizontalNavKey = [\"ArrowLeft\", \"ArrowRight\"].includes(\n e.code,\n );\n if (isFormControl(target) && !(row && isIntraRowHorizontalNavKey)) {\n return;\n }\n\n // If Escape pressed and the active element is inside a data row,\n // move focus to the parent .k-table-row and ensure its tabindex=0.\n if (e.code === \"Escape\") {\n const focusedRow = (\n document.activeElement as HTMLElement | null\n )?.closest(\".k-table-row[data-grid-row-index]\") as HTMLElement | null;\n if (focusedRow) {\n // Justified: We're handling Escape to collapse focus from descendant to row.\n // Prevent default to override native browser behavior (dialog close, etc.)\n e.preventDefault();\n // Justified: Stop propagation to prevent parent containers from seeing this Escape.\n e.stopPropagation();\n try {\n const rows = Array.from(\n gridRef?.value.$el.querySelectorAll(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement[],\n );\n rows.forEach((r) => r.setAttribute(\"tabindex\", \"-1\"));\n } catch {\n // ignore if gridRef not available\n }\n focusedRow.setAttribute(\"tabindex\", \"0\");\n focusedRow.focus();\n return;\n }\n }\n\n // Handle navigation keys (only prevent/stop for keys we actually handle)\n if (\n [\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"Enter\",\n \"NumpadEnter\",\n \"Space\",\n ].includes(e.code)\n ) {\n // Check if target is a grid column menu button\n if (\n target.classList.contains(\"k-grid-header-menu\") &&\n target.classList.contains(\"k-grid-column-menu\")\n ) {\n activeFilterButton.value = target as HTMLElement;\n // Let menu logic proceed elsewhere; don't prevent or stop\n return;\n }\n\n // If event came from within a data row, handle row/intra-row navigation\n if (row) {\n if ([\"ArrowDown\", \"ArrowUp\"].includes(e.code)) {\n // Justified: We're handling ArrowUp/Down for vertical row navigation.\n // Prevent default to override native browser scrolling behavior.\n e.preventDefault();\n // Justified: Stop propagation to prevent parent containers from seeing this.\n e.stopPropagation();\n\n // Find the next/previous element sibling that actually has a tabindex.\n const findSiblingRow = (\n start: Element,\n direction: \"next\" | \"previous\",\n ): HTMLElement | null => {\n let sib =\n direction === \"next\"\n ? start.nextElementSibling\n : start.previousElementSibling;\n while (sib) {\n const el = sib as HTMLElement;\n try {\n if (el.classList.contains(\"k-table-row\")) {\n return el;\n }\n } catch {\n // Defensive: some nodes might throw when accessed; skip them.\n }\n sib =\n direction === \"next\"\n ? sib.nextElementSibling\n : sib.previousElementSibling;\n }\n return null;\n };\n\n const targetRow =\n e.code === \"ArrowDown\"\n ? findSiblingRow(row, \"next\")\n : findSiblingRow(row, \"previous\");\n\n if (targetRow) {\n row.setAttribute(\"tabindex\", \"-1\");\n targetRow.setAttribute(\"tabindex\", \"0\");\n targetRow.focus();\n }\n return;\n }\n if ([\"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n // Justified: We're handling ArrowLeft/Right for intra-row focus navigation.\n // Prevent default to override native text cursor movement only when we handle the event.\n e.preventDefault();\n // Justified: Stop propagation to prevent parent containers from seeing this.\n e.stopPropagation();\n\n const tabbable = row.querySelectorAll(\n intraRowNavigationSelector,\n ) as NodeListOf<HTMLElement>;\n if (tabbable.length === 0) return;\n\n // Find currently focused element within the row\n let currentIndex = Array.from(tabbable).findIndex(\n (el) => el === document.activeElement,\n );\n\n if (currentIndex === -1 && document.activeElement === row) {\n // If no element is focused, focus the first tabbable element\n (tabbable[0] as HTMLElement).focus();\n return;\n }\n\n if (e.code === \"ArrowRight\") {\n currentIndex =\n currentIndex === tabbable.length - 1 ? 0 : currentIndex + 1;\n } else if (e.code === \"ArrowLeft\") {\n currentIndex =\n currentIndex === 0 ? tabbable.length - 1 : currentIndex - 1;\n }\n (tabbable[currentIndex] as HTMLElement).focus();\n\n return;\n }\n }\n\n // Enter, Space: Not currently handled for grid navigation.\n // Don't prevent by default to allow native behavior or other handlers to respond.\n }\n };\n\n /**\n * Applies a FeatherK-specific CSS hook class to the Kendo Grid root element.\n *\n * Behavior:\n * - On the next Vue microtask (nextTick), locates the closest ancestor with the\n * \".k-grid\" class starting from `gridRef.value.$el`.\n * - Adds the \"fk-grid\" class to that element (no-op if already present).\n *\n * Purpose:\n * - Provides a styling hook so external FeatherK stylesheets can target grids\n * that have been enhanced by this composable without relying on brittle\n * selectors or global overrides.\n *\n * Safety / Idempotency:\n * - Safe to call multiple times; subsequent calls simply re-add the same class.\n * - Silently does nothing if `gridRef.value` or its `$el` is not yet available.\n *\n * Side Effects:\n * - Mutates the DOM by adding a CSS class to the grid root element.\n *\n * No cleanup is currently required (class need not be removed on unmount).\n *\n * @returns void\n */\n const setupGridStyling = () => {\n nextTick(() => {\n const gridHost = gridRef.value?.$el as Element | undefined;\n if (!gridHost || typeof gridHost.closest !== \"function\") return;\n\n const gridElement = gridHost.closest(\".k-grid\") as HTMLElement | null;\n if (gridElement) gridElement.classList.add(\"fk-grid\");\n });\n };\n\n /**\n * Sets up row-level (tr) keyboard navigation for the Kendo Grid instance.\n *\n * Behavior:\n * 1. Ensures exactly one data row ('.k-table-row[data-grid-row-index]') has tabindex=\"0\"\n * (the current keyboard focus target) and all others have tabindex=\"-1\".\n * 2. Establishes an internal helper (ensureSingleTabindex) that:\n * - Re-calculates which row should retain tabindex=\"0\" after DOM changes.\n * - Preserves a focused row if its descendants currently contain focus.\n * - Falls back to the first row when no focused row exists.\n * 3. Applies initial tabindex values immediately (first row gets focusable state).\n * 4. Observes the grid <tbody> ('.k-table-tbody') with a MutationObserver so that when\n * Kendo re-renders rows (sorting, filtering, paging, data updates), tabindex\n * constraints are re-applied with minimal work.\n *\n * Rationale:\n * The default Kendo Grid may introduce multiple tabbable descendants, making\n * keyboard traversal verbose. Restricting tab stops to a single row improves\n * accessibility by:\n * - Reducing unnecessary Tab presses.\n * - Enabling arrow-key driven intra-row navigation (handled elsewhere).\n *\n * Assumptions / Dependencies:\n * - gridRef.value.$el points to (or is inside) a rendered Kendo Grid root.\n * - Data rows carry class 'k-table-row' and attribute 'data-grid-row-index'.\n * - Runs in a browser environment (document, MutationObserver available).\n *\n * Error Handling:\n * - Wrapped in try/catch; failures are logged and do not throw upstream.\n *\n * Idempotency:\n * - Safe to call more than once; repeated calls will attach at most one observer\n * per invocation lifecycle (previous observer persists). Caller is expected\n * to avoid redundant calls or add future cleanup if needed.\n *\n * Side Effects:\n * - Mutates DOM attributes (tabindex) of grid row elements.\n * - Creates a MutationObserver stored in the closure (rowObserver) for teardown\n * via cleanupFilterButtonAccessibility().\n *\n * @returns void\n */\n const setupTrNavigation = () => {\n if (rowObserver) {\n // Already set up\n return;\n }\n try {\n /**\n * Ensure exactly one grid row is keyboard-focusable (tabindex=\"0\") and make all others unfocusable (tabindex=\"-1\").\n *\n * This function:\n * - Queries the grid DOM for rows using the selector \".k-table-row[data-grid-row-index]\".\n * - If no rows are found, it returns immediately.\n * - If exactly one row already has tabindex=\"0\", it does nothing.\n * - Otherwise it clears tabindex to \"-1\" on all matched rows, then:\n * - If the currently focused element is inside one of the matched rows, that row is preserved as tabindex=\"0\".\n * - If there is no such focused row, the first matched row is set to tabindex=\"0\".\n *\n * Notes:\n * - The function mutates DOM attributes (tabindex) of the matched row elements.\n * - It expects to run in a browser environment where `document.activeElement` is available and where\n * `gridRef.value.$el` points to the grid root element containing rows matching the selector.\n * - Any runtime errors encountered while querying or updating the DOM are caught and logged via console.error;\n * the function will not throw.\n *\n * @remarks\n * Use this helper to maintain a single tabbable row for keyboard navigation / accessibility purposes within a custom grid component.\n *\n * @returns void\n *\n * @example\n * // Keep one tabbable row in the grid after rendering or when rows change\n * ensureSingleTabindex();\n */\n const ensureSingleTabindex = () => {\n try {\n const rows = Array.from(\n gridRef.value.$el.querySelectorAll(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement[],\n );\n\n if (!rows || rows.length === 0) return;\n\n // Count rows that currently have tabindex=\"0\"\n const zeroTabRows = rows.filter(\n (r) => r.getAttribute(\"tabindex\") === \"0\",\n );\n\n // If exactly one row already has tabindex=0, nothing to do\n if (zeroTabRows.length === 1) return;\n\n // Prefer to preserve the currently focused row if it's inside the rows\n const focusedRow = rows.find(\n (r) =>\n r === document.activeElement ||\n r.contains(document.activeElement),\n );\n\n // Clear all to -1\n rows.forEach((r) => r.setAttribute(\"tabindex\", \"-1\"));\n\n if (focusedRow) {\n focusedRow.setAttribute(\"tabindex\", \"0\");\n return;\n }\n\n // Fallback: set first row to tabindex=0\n rows[0].setAttribute(\"tabindex\", \"0\");\n } catch (err) {\n console.error(\"ensureSingleTabindex error:\", err);\n }\n };\n\n // Initial setup\n const rows = Array.from(\n gridRef.value.$el.querySelectorAll(\n \".k-table-row[data-grid-row-index]\",\n ) as HTMLElement[],\n );\n if (rows.length > 0) {\n rows.forEach((row, index) => {\n row.setAttribute(\"tabindex\", index === 0 ? \"0\" : \"-1\");\n });\n }\n\n // Observe tbody for row changes (Kendo will recreate rows on sort/filter/paging)\n const tbody = gridRef.value.$el.querySelector(\".k-table-tbody\");\n if (tbody) {\n rowObserver = new MutationObserver(() => {\n // Reassert single tabindex after DOM changes. Keep work minimal.\n ensureSingleTabindex();\n });\n rowObserver.observe(tbody, { childList: true, subtree: true });\n }\n } catch (error) {\n console.error(\"Error setting up row navigation:\", error);\n }\n };\n\n /**\n * Initializes accessibility behavior for grid filter buttons.\n *\n * - Queries the DOM for elements matching the selector\n * \".k-grid-header .k-grid-header-menu.k-grid-column-menu\".\n * - For each matched element, sets the ARIA role to \"button\" and attaches a\n * keydown event listener using handleFilterButtonKeyboardListener.\n * - Invokes setupFilterMenuObserver() to observe changes to filter menus.\n * - Invokes setupHeaderThTriggers() to initialize any header-related triggers.\n *\n * @returns void\n */\n const setupFilterButtonAccessibility = () => {\n nextTick(() => {\n const filterSelector =\n \".k-grid-header .k-grid-header-menu.k-grid-column-menu\";\n const filterButtons = document.querySelectorAll(filterSelector);\n if (filterButtons) {\n filterButtons.forEach((el) => {\n el.setAttribute(\"role\", \"button\");\n (el as HTMLElement).addEventListener(\n \"keydown\",\n handleFilterButtonKeyboardListener,\n );\n });\n }\n\n setupFilterMenuObserver();\n\n setupHeaderThTriggers();\n });\n };\n\n /**\n * Cleans up all accessibility (a11y) resources installed by useGridA11y.\n *\n * Includes:\n * - Removes keydown listeners from column menu / filter buttons.\n * - Disconnects the column menu MutationObserver.\n * - Disconnects the row MutationObserver.\n * - Executes and clears header <th> teardown callbacks.\n *\n * Idempotent: safe to call multiple times.\n */\n const cleanupGridA11y = () => {\n const filterSelector =\n \".k-grid-header .k-grid-header-menu.k-grid-column-menu\";\n const filterButtons = document.querySelectorAll(filterSelector);\n if (filterButtons) {\n filterButtons.forEach((el) => {\n (el as HTMLElement).removeEventListener(\n \"keydown\",\n handleFilterButtonKeyboardListener,\n );\n });\n }\n\n if (mutationsObserver) {\n mutationsObserver.disconnect();\n mutationsObserver = null;\n }\n\n if (rowObserver) {\n rowObserver.disconnect();\n rowObserver = null;\n }\n\n headerThTeardownCallbacks.forEach((teardown) => teardown());\n headerThTeardownCallbacks.length = 0;\n };\n\n /**\n * Initializes accessible interaction handlers for header <th> cells in a Kendo-style grid.\n *\n * Finds all header cells under \".k-grid-header .k-table-thead th\" and for each header cell:\n * - Locates the column menu button (\".k-grid-header-menu.k-grid-column-menu\") and sets its tabindex to -1.\n * - Reads column metadata from getColumns() (external dependency) to set data attributes:\n * - data-feather-k-field (column.field)\n * - data-feather-k-filterable (\"false\" if column.filterable === false, otherwise \"true\")\n * - data-feather-k-sortable (\"false\" if column.sortable === false, otherwise \"true\")\n * - Determines whether the header is filterable or sortable using the above data attributes.\n * - Sets appropriate cursor styles (pointer for interactive headers, default otherwise).\n * - Configures ARIA/sniffable roles:\n * - If filterable: tabindex=\"0\", role=\"button\", aria-haspopup=\"menu\"\n * - If not filterable: tabindex=\"0\", role=\"columnheader\", aria-haspopup is removed\n *\n * Adds event handlers for each header cell:\n * - click handler:\n * - If filterable: prevents default/propagation and opens the column menu (via the menu button click). Also records the header element on activeFilterButton (external ref) for focus return.\n * - If not filterable but sortable: synthesizes an \"Enter\" KeyboardEvent and dispatches it on the header to trigger sort behavior and records activeFilterButton.\n * - Clicks originating from a column resizer (closest \".k-column-resizer\") are ignored.\n * - keydown handler (registered in capture phase for the header cell):\n * - On Enter or Space when filterable or sortable:\n * - Sets activeFilterButton to the header and focuses it.\n * - If filterable: prevents default/propagation and opens the column menu.\n * - If sortable: clicks the first \".k-link\" inside the header to trigger sort.\n *\n * Additionally, attaches a capturing keydown handler to the enclosing THEAD element (\".k-grid-header .k-table-thead\"):\n * - Prevents default/immediate propagation for Enter/Space on headers that are neither filterable nor sortable.\n * - This protects non-interactive header cells from activating default keyboard behavior.\n *\n * All event listeners added by this setup are recorded as teardown callbacks into the\n * headerThTeardownCallbacks array (external), so they can be removed later to avoid leaks.\n *\n * Notes / assumptions:\n * - Relies on globals/closures: document, getColumns(), activeFilterButton (ref-like object), and headerThTeardownCallbacks (array).\n * - Intended to enhance accessibility and keyboard interaction for grid headers by mapping Kendo column behaviors\n * to appropriate ARIA roles, keyboard handling, and focus management.\n *\n * @remarks\n * - Does not return a value; side effects are applied directly to DOM and external state.\n * - Uses attribute-based decisions to maintain compatibility with dynamically-updated column metadata.\n *\n * @returns void\n */\n const setupHeaderThTriggers = () => {\n const headerCells = document.querySelectorAll(\n \".k-grid-header .k-table-thead th\",\n );\n\n headerCells.forEach((th, index) => {\n if ((th as HTMLElement).dataset.featherKHeaderBound === \"true\") {\n return;\n }\n\n const btn = th.querySelector(\n \".k-grid-header-menu.k-grid-column-menu\",\n ) as HTMLElement | null;\n if (!btn) return;\n\n const columns = getColumns();\n\n if (columns && columns[index]) {\n const field = columns[index].field ?? \"\";\n th.setAttribute(\"data-feather-k-field\", field);\n th.setAttribute(\n \"data-feather-k-filterable\",\n columns[index].filterable === false ? \"false\" : \"true\",\n );\n th.setAttribute(\n \"data-feather-k-sortable\",\n columns[index].sortable === false ? \"false\" : \"true\",\n );\n }\n\n const filterable =\n (th as HTMLElement).dataset.featherKFilterable !== \"false\";\n const sortable = (th as HTMLElement).dataset.featherKSortable !== \"false\";\n\n btn.setAttribute(\"tabindex\", \"-1\");\n\n if (filterable || sortable) {\n (th as HTMLElement).style.cursor = \"pointer\";\n } else {\n (th as HTMLElement).style.cursor = \"default\";\n }\n if (filterable) {\n th.setAttribute(\"tabindex\", \"0\");\n th.setAttribute(\"role\", \"button\");\n th.setAttribute(\"aria-haspopup\", \"menu\");\n } else {\n th.setAttribute(\"tabindex\", \"0\");\n th.setAttribute(\"role\", \"columnheader\");\n th.removeAttribute(\"aria-haspopup\");\n }\n const openMenu = (e: Event | KeyboardEvent) => {\n if ((e.target as HTMLElement)?.closest(\".k-column-resizer\")) return;\n\n activeFilterButton.value = th as HTMLElement; // focus return target\n btn.click();\n };\n\n const clickHandler = (e: Event) => {\n if (filterable) {\n activeFilterButton.value = th as HTMLElement;\n e.preventDefault();\n e.stopPropagation();\n openMenu(e);\n } else if (sortable) {\n activeFilterButton.value = th as HTMLElement;\n const columnLink = th.querySelector(\".k-link\");\n if (columnLink) {\n (columnLink as HTMLElement).click();\n }\n }\n };\n (th as HTMLElement).addEventListener(\"click\", clickHandler);\n headerThTeardownCallbacks.push(() => {\n (th as HTMLElement).removeEventListener(\"click\", clickHandler);\n });\n\n // Keyboard activation for sortable/filterable header cells.\n //\n // Enter, Numpad Enter, and Space are intentionally handled identically here:\n // - preventDefault + stopPropagation are applied for ALL three keys so\n // none of them leak to native browser or Kendo's own key handlers,\n // which could trigger a duplicate or conflicting sort/scroll action.\n // - For sortable-only headers the sort is triggered by clicking the\n // .k-link element directly (the same path the browser follows on a\n // real mouse click and what Space was already using). This keeps\n // the asc → desc → unsorted cycle consistent regardless of key used.\n //\n // IMPORTANT: Do not restore the old synthetic KeyboardEvent dispatch\n // (th.dispatchEvent(new KeyboardEvent('keydown', { key:'Enter', ... }))).\n // That approach caused Enter/Numpad Enter to re-enter this handler\n // recursively and be silently swallowed by the isSorting guard in\n // ClaimLog.vue, making every press after the first appear to do nothing.\n const keyHandler = (e: KeyboardEvent) => {\n if (\n (isEnterActivation(e) || e.code === \"Space\") &&\n (filterable || sortable)\n ) {\n e.preventDefault();\n e.stopPropagation();\n\n activeFilterButton.value = th as HTMLElement;\n activeFilterButton.value.focus();\n if (filterable) {\n openMenu(e);\n } else if (sortable) {\n const columnLink = th.querySelector(\".k-link\");\n if (columnLink) {\n (columnLink as HTMLElement).click();\n }\n }\n }\n };\n (th as HTMLElement).addEventListener(\"keydown\", keyHandler, true);\n headerThTeardownCallbacks.push(() => {\n (th as HTMLElement).removeEventListener(\"keydown\", keyHandler, true);\n });\n\n (th as HTMLElement).dataset.featherKHeaderBound = \"true\";\n });\n\n const thead = document.querySelector(\".k-grid-header .k-table-thead\");\n if (\n thead &&\n (thead as HTMLElement).dataset.featherKHeaderBound !== \"true\"\n ) {\n const theadKeyboardHandler = (e: KeyboardEvent) => {\n const th = (e.target as HTMLElement).closest(\"th\");\n if (!th) return;\n if (\n (isEnterActivation(e) || e.code === \"Space\") &&\n th.dataset.featherKFilterable === \"false\" &&\n th.dataset.featherKSortable === \"false\"\n ) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n };\n (thead as HTMLElement).addEventListener(\n \"keydown\",\n theadKeyboardHandler,\n true, // NOTE: capture phase\n );\n headerThTeardownCallbacks.push(() => {\n (thead as HTMLElement).removeEventListener(\n \"keydown\",\n theadKeyboardHandler,\n true,\n );\n });\n\n (thead as HTMLElement).dataset.featherKHeaderBound = \"true\";\n }\n };\n\n /**\n * Handles grid sort change events with special-casing for column menu interactions and non-sortable columns.\n *\n * This function inspects the DOM target that triggered the sort change and the grid column metadata to\n * determine whether the default sort handling should proceed or be suppressed. It:\n * - Ignores events coming from the column menu toggle (element with class \"k-link\").\n * - When a column menu item (element with class \"k-columnmenu-item\") is selected for a non-sortable field,\n * prevents modifying the sort descriptors for that field.\n * - Otherwise, if a custom handler is provided, schedules focusing of the active filter button (if present)\n * on the next tick and then invokes the custom handler with the original event.\n *\n * @param event - Optional GridSortChangeEvent. The implementation expects a nested structure where\n * the originating HTMLElement is available at `event.event.event.target`, the field at\n * `event.event.field`, and the current sort descriptors at `event.event.sort`.\n * @param customHandler - Optional callback to be executed when the standard handling path is allowed.\n * The callback will be invoked inside `nextTick` after attempting to focus the\n * active filter button.\n * @returns void\n *\n * @remarks\n * - This function relies on `getColumns()` to obtain column metadata and on an `activeFilterButton` ref\n * to optionally restore focus. It performs early returns when the event target or columns are unavailable,\n * or when the column menu toggle was the source of the event.\n */\n const handleSortChange = function (\n event?: GridSortChangeEvent,\n customHandler?: any,\n ) {\n const target = event?.event?.event.target as HTMLElement;\n const columns = getColumns();\n if (!target || !columns) return;\n\n const menuOpened = target.classList.contains(\"k-grid-header-menu\");\n const menuItemSelected = target.classList.contains(\"k-columnmenu-item\");\n\n const fieldIsSortable =\n columns.find((c) => c.field === event?.event?.field)?.sortable && true;\n\n if (menuOpened) return;\n\n if (menuItemSelected && !fieldIsSortable) {\n const sortDescriptor = event?.event?.sort as SortDescriptor[];\n sortDescriptor?.filter(\n (s: SortDescriptor) => s.field !== event?.event?.field,\n );\n return;\n }\n if (typeof customHandler === \"function\") {\n nextTick(() => {\n if (activeFilterButton.value) activeFilterButton.value.focus();\n customHandler(event);\n // Kendo recreates header <th> nodes after each sort, which discards any\n // previously attached keydown listeners. Re-running setupHeaderThTriggers\n // here (after the sort data has been applied) reattaches those listeners\n // to the new nodes so subsequent Enter/Space presses continue to work.\n nextTick(() => {\n setupHeaderThTriggers();\n });\n });\n }\n };\n\n /**\n * Initialize accessibility (a11y) features for the grid.\n *\n * This function is idempotent — it will perform initialization only once.\n * On the first call it sets the internal `a11yInitialized` flag and runs\n * the following setup routines:\n * - setupGridStyling()\n * - setupTrNavigation()\n * - setupFilterButtonAccessibility()\n *\n * Subsequent calls do nothing.\n *\n * Use this during component setup/mount to ensure grid accessibility helpers\n * are registered exactly once.\n *\n * @returns void\n */\n const initA11y = () => {\n if (a11yInitialized) return;\n try {\n setupGridStyling();\n setupTrNavigation();\n setupFilterButtonAccessibility();\n a11yInitialized = true;\n } catch (err) {\n console.error(\"initA11y failed:\", err);\n // Clean up any partial listeners/observers so a retry can succeed.\n cleanupGridA11y();\n }\n };\n\n onBeforeUnmount(() => {\n cleanupGridA11y();\n });\n return {\n activeFilterButton,\n handleGridKeyDown,\n handleSortChange,\n initA11y,\n };\n};\n","import { type Ref } from \"vue\";\nimport type {\n CompositeFilterDescriptor,\n FilterDescriptor,\n} from \"@progress/kendo-data-query\";\n\n/**\n * Type guard for composite filter groups.\n */\nconst isCompositeFilter = (\n filterItem: unknown,\n): filterItem is CompositeFilterDescriptor => {\n return (\n !!filterItem &&\n typeof filterItem === \"object\" &&\n \"filters\" in filterItem &&\n Array.isArray((filterItem as CompositeFilterDescriptor).filters)\n );\n};\n\n/**\n * Type guard for leaf filter nodes.\n */\nconst isFilterDescriptor = (\n filterItem: unknown,\n): filterItem is FilterDescriptor => {\n return (\n !!filterItem && typeof filterItem === \"object\" && \"field\" in filterItem\n );\n};\n\n/**\n * Recursively checks whether a filter tree contains a filter for a specific field.\n */\nconst hasFieldFilterRecursive = (\n filterItem: unknown,\n field: string,\n): boolean => {\n if (!filterItem || typeof filterItem !== \"object\") {\n return false;\n }\n\n if (!isCompositeFilter(filterItem)) {\n if (!isFilterDescriptor(filterItem)) {\n return false;\n }\n return filterItem.field === field;\n }\n\n return filterItem.filters.some((child) =>\n hasFieldFilterRecursive(child, field),\n );\n};\n\n/**\n * Returns a reactive function that resolves to `\"active\"` when the given\n * field has a filter applied in the current filter tree, or `\"\"` when it\n * does not.\n *\n * Bind the returned function directly to column `headerClassName` inside a\n * `computed` — Vue tracks the `filterRef` dependency automatically; no\n * manual update call is needed.\n *\n * @param filterRef - Reactive grid filter descriptor (the same ref bound to the Grid).\n * @returns `(field: string) => \"active\" | \"\"`\n *\n * @example\n * const activeClass = useGridActiveFilter(filterRef);\n *\n * const columns = computed(() => [\n * { field: \"ProductName\", headerClassName: activeClass(\"ProductName\") },\n * ]);\n */\nexport const useGridActiveFilter = (\n filterRef: Ref<CompositeFilterDescriptor | undefined>,\n): ((field: string) => string) => {\n return (field: string): string => {\n if (!filterRef.value?.filters) return \"\";\n return filterRef.value.filters.some((f) =>\n hasFieldFilterRecursive(f, field),\n )\n ? \"active\"\n : \"\";\n };\n};\n","/**\n * useGridRowAction\n *\n * Composable that provides safe, accessible row click and keyboard activation\n * handlers for Kendo UI for Vue Grid instances.\n *\n * Highlights:\n * - Guards against triggers when clicking interactive elements (buttons, links, inputs, checkboxes).\n * - Suppresses activation when the user is highlighting/selecting text inside a cell.\n * - Restricts mouse actions to primary (left) click.\n * - Provides keyboard activation (Enter / Space) for focused grid rows.\n * - Action-agnostic: executes consumer-supplied `onRowAction` callback with `dataItem` and context.\n */\n\nimport type { Ref } from \"vue\";\nimport type { GridRowClickEvent } from \"../types/kendo\";\n\nexport interface RowActionContext<T = any> {\n /**\n * Data item associated with the activated row.\n */\n dataItem: T;\n /**\n * Row index if provided by Kendo event or row DOM attribute.\n */\n rowIndex?: number;\n /**\n * Field name if click originated on a specific column cell.\n */\n field?: string;\n /**\n * Original native browser event.\n */\n event: Event;\n /**\n * Interaction trigger type ('click' | 'keyboard').\n */\n triggerType: \"click\" | \"keyboard\";\n /**\n * Modifier key states during activation.\n */\n ctrlKey: boolean;\n shiftKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n}\n\nexport interface UseGridRowActionOptions<T = any> {\n /**\n * Action callback invoked when a row is clicked or activated via keyboard.\n */\n onRowAction: (dataItem: T, context: RowActionContext<T>) => void;\n /**\n * Optional ref to Kendo Grid component instance or array/ref of data items.\n * Used to resolve the row `dataItem` when row is activated via grid-level `@keydown`.\n */\n gridRef?: Ref<any>;\n dataItems?: Ref<T[]> | T[];\n /**\n * Additional CSS selectors inside row cells that should prevent the row action.\n */\n ignoreSelectors?: string[];\n /**\n * Custom predicate function to check if an event target should be ignored.\n * Return `true` to ignore row action, `false` to proceed.\n */\n shouldIgnoreTarget?: (target: HTMLElement, event: Event) => boolean;\n /**\n * Whether to enable Enter/Space keyboard activation on focused grid rows.\n * Default: true\n */\n enableKeyboardAction?: boolean;\n}\n\nexport interface UseGridRowActionReturn<T = any> {\n /**\n * Grid row click handler to bind to Kendo Grid's `@rowclick` event.\n */\n handleRowClick: (event: GridRowClickEvent<T>) => void;\n /**\n * Grid keyboard handler to bind to Kendo Grid's `@keydown` event.\n * Optionally accepts explicit `dataItem` if bound at the row/slot level.\n */\n handleRowKeyDown: (event: KeyboardEvent, explicitDataItem?: T) => void;\n /**\n * Helper function to test if a given DOM element is an ignored target.\n */\n isIgnoredTarget: (target: HTMLElement, event?: Event) => boolean;\n}\n\nconst DEFAULT_IGNORE_SELECTORS = [\n \"button\",\n \"a\",\n \"input\",\n \"select\",\n \"textarea\",\n '[role=\"button\"]',\n '[role=\"checkbox\"]',\n '[role=\"link\"]',\n '[role=\"menuitem\"]',\n '[role=\"option\"]',\n \".k-checkbox\",\n \".k-button\",\n \".k-dropdown\",\n \".k-picker\",\n \".k-hierarchy-cell\",\n \".k-grid-header-menu\",\n \".k-column-menu\",\n];\n\nexport const useGridRowAction = <T = any>(\n options: UseGridRowActionOptions<T>,\n): UseGridRowActionReturn<T> => {\n const {\n onRowAction,\n gridRef,\n dataItems,\n ignoreSelectors = [],\n shouldIgnoreTarget,\n enableKeyboardAction = true,\n } = options;\n\n const combinedIgnoreSelectors = [\n ...DEFAULT_IGNORE_SELECTORS,\n ...ignoreSelectors,\n ];\n\n /**\n * Tests if an event target element or any of its parent elements match ignored selectors\n * or custom predicate filters.\n */\n const isIgnoredTarget = (target: HTMLElement, event?: Event): boolean => {\n if (!target) return false;\n\n // Check if element or ancestor matches any ignored selector\n const selectorString = combinedIgnoreSelectors.join(\",\");\n if (target.closest && target.closest(selectorString)) {\n return true;\n }\n\n // Check custom predicate if provided\n if (shouldIgnoreTarget && event) {\n return shouldIgnoreTarget(target, event);\n }\n\n return false;\n };\n\n /**\n * Checks if user currently has active text selected inside the target row or container.\n */\n const hasTextSelection = (target?: HTMLElement | null): boolean => {\n if (typeof window === \"undefined\") return false;\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || !selection.toString().trim()) {\n return false;\n }\n if (target && selection.anchorNode && selection.focusNode) {\n const container =\n target.closest(\".k-table-row\") || target.closest(\".k-grid\") || target;\n const anchorParent =\n selection.anchorNode.nodeType === Node.ELEMENT_NODE\n ? (selection.anchorNode as HTMLElement)\n : selection.anchorNode.parentElement;\n const focusParent =\n selection.focusNode.nodeType === Node.ELEMENT_NODE\n ? (selection.focusNode as HTMLElement)\n : selection.focusNode.parentElement;\n const isAnchorInside = !!(\n anchorParent && container.contains(anchorParent)\n );\n const isFocusInside = !!(focusParent && container.contains(focusParent));\n return isAnchorInside || isFocusInside;\n }\n return true;\n };\n\n /**\n * Primary handler for Kendo Grid `@rowclick` event.\n */\n const handleRowClick = (event: GridRowClickEvent<T>): void => {\n const nativeEvent =\n (event as any)?.htmlEvent ||\n (event as any)?.event ||\n (event as any)?.nativeEvent ||\n (event instanceof Event ? event : undefined);\n\n // Only allow primary (left) mouse clicks\n if (\n nativeEvent &&\n nativeEvent.button !== undefined &&\n nativeEvent.button !== 0\n ) {\n return;\n }\n\n // Guard against ignored child element targets\n const target = (nativeEvent?.target ||\n (event as any)?.target) as HTMLElement | null;\n if (\n target &&\n isIgnoredTarget(target, nativeEvent || (event as unknown as Event))\n ) {\n return;\n }\n\n // Guard against active text highlighting / selection within the row/grid\n if (hasTextSelection(target)) {\n return;\n }\n\n const context: RowActionContext<T> = {\n dataItem: event.dataItem,\n rowIndex: event.rowIndex,\n field: event.field,\n event: nativeEvent || (event as unknown as Event),\n triggerType: \"click\",\n ctrlKey: !!nativeEvent?.ctrlKey,\n shiftKey: !!nativeEvent?.shiftKey,\n metaKey: !!nativeEvent?.metaKey,\n altKey: !!nativeEvent?.altKey,\n };\n\n onRowAction(event.dataItem, context);\n };\n\n /**\n * Primary handler for Grid `@keydown` event (Enter / Space on row).\n */\n const handleRowKeyDown = (\n event: KeyboardEvent,\n explicitDataItem?: T,\n ): void => {\n if (!enableKeyboardAction) return;\n\n const key = event.key || event.code;\n const isActivationKey =\n key === \"Enter\" ||\n key === \"NumpadEnter\" ||\n key === \" \" ||\n key === \"Space\" ||\n event.code === \"Enter\" ||\n event.code === \"NumpadEnter\" ||\n event.code === \"Space\";\n\n if (!isActivationKey) return;\n\n const target = event.target as HTMLElement | null;\n if (!target) return;\n\n // Check if event target is inside a data row\n const rowEl = target.closest(\n \".k-table-row[data-grid-row-index], .k-table-row\",\n ) as HTMLElement | null;\n if (!rowEl) return;\n\n // Guard against ignored child element targets\n if (isIgnoredTarget(target, event)) {\n return;\n }\n\n // Prevent default scrolling or unintended form submissions on Space / Enter\n event.preventDefault();\n event.stopPropagation();\n\n // Resolve row index from DOM attribute if available\n const rowIndexAttr = rowEl.getAttribute(\"data-grid-row-index\");\n const rowIndex =\n rowIndexAttr !== null ? parseInt(rowIndexAttr, 10) : undefined;\n\n // Resolve data item: explicitDataItem -> dataItems option -> gridRef option\n let resolvedDataItem: T | undefined = explicitDataItem;\n\n if (resolvedDataItem === undefined) {\n const itemsList =\n (Array.isArray(dataItems) ? dataItems : dataItems?.value) ||\n (gridRef?.value as any)?.props?.dataItems ||\n (gridRef?.value as any)?.dataItems;\n\n if (\n itemsList &&\n rowIndex !== undefined &&\n rowIndex >= 0 &&\n rowIndex < itemsList.length\n ) {\n resolvedDataItem = itemsList[rowIndex];\n }\n }\n\n if (resolvedDataItem === undefined) return;\n\n const context: RowActionContext<T> = {\n dataItem: resolvedDataItem,\n rowIndex,\n event,\n triggerType: \"keyboard\",\n ctrlKey: !!event.ctrlKey,\n shiftKey: !!event.shiftKey,\n metaKey: !!event.metaKey,\n altKey: !!event.altKey,\n };\n\n onRowAction(resolvedDataItem, context);\n };\n\n return {\n handleRowClick,\n handleRowKeyDown,\n isIgnoredTarget,\n };\n};\n","import { computed, nextTick, ref } from \"vue\";\nimport type { ComputedRef, Ref } from \"vue\";\nimport type { TextBoxChangeEvent } from \"@progress/kendo-vue-inputs\";\n\nconst DEFAULT_ZIP_ERROR_MESSAGE =\n \"Enter a valid ZIP code with exactly 5 or 9 digits.\";\n\nconst formatZipDisplay = (input: string): string => {\n const digits = input.replace(/\\D/g, \"\").slice(0, 9);\n return digits.length > 5\n ? `${digits.slice(0, 5)}-${digits.slice(5)}`\n : digits;\n};\n\n// Translate a formatted caret into the number of ZIP digits before it.\nconst countDigitsBeforeIndex = (value: string, index: number): number => {\n return value.slice(0, Math.max(0, index)).replace(/\\D/g, \"\").length;\n};\n\n// Map a digit index back to the formatted ZIP display position.\nconst digitIndexToDisplayIndex = (digitIndex: number): number => {\n if (digitIndex <= 5) {\n return digitIndex;\n }\n\n return Math.min(digitIndex + 1, 10);\n};\n\nexport type ZipPayload = {\n zip: string;\n};\n\nexport type UseZipTextBoxOptions = {\n /** The `id` of the Kendo `TextBox` input element. Must match the `id` prop\n * passed to `<TextBox>`. Used by `submitAndValidate({ focus: true })` to focus\n * the field when validation fails. */\n id: string;\n initialValue?: string;\n errorMessage?: string;\n required?: boolean;\n};\n\nexport type UseZipTextBoxState = {\n zipDisplay: Ref<string>;\n submitted: Ref<boolean>;\n errorMessage: Ref<string>;\n};\n\nexport type UseZipTextBoxBindings = {\n /** Bind to `:wrapperClass` on `<TextBox>` so Kendo applies `fk-zip-textbox`\n * to its wrapper element on every render — no manual DOM manipulation needed. */\n readonly wrapperClass: string;\n};\n\nexport type UseZipTextBoxDerived = {\n readonly zipRaw: ComputedRef<string>;\n readonly isZipValid: ComputedRef<boolean>;\n readonly showZipError: ComputedRef<boolean>;\n readonly textBoxValid: ComputedRef<boolean>;\n readonly textBoxValidate: ComputedRef<boolean>;\n};\n\nexport type UseZipTextBoxActions = {\n handleZipInput: (...args: unknown[]) => void;\n submitAndValidate: (opts?: { focus?: boolean }) => boolean;\n buildPayload: () => ZipPayload;\n};\n\nexport type UseZipTextBoxApi = {} & UseZipTextBoxState &\n UseZipTextBoxBindings &\n UseZipTextBoxDerived &\n UseZipTextBoxActions;\n\nexport const useZipTextBox = (\n options: UseZipTextBoxOptions,\n): UseZipTextBoxApi => {\n const zipDisplay = ref(formatZipDisplay(options.initialValue ?? \"\"));\n const submitted = ref(false);\n const errorMessage = ref(\n options.errorMessage?.trim() || DEFAULT_ZIP_ERROR_MESSAGE,\n );\n\n const zipRaw = computed(() => zipDisplay.value.replace(/\\D/g, \"\"));\n const isZipValid = computed(() => {\n const length = zipRaw.value.length;\n return length === 5 || length === 9;\n });\n const showZipError = computed(() => submitted.value && !isZipValid.value);\n const textBoxValid = computed(() => !submitted.value || isZipValid.value);\n const textBoxValidate = computed(() => submitted.value);\n\n // Restore the caret after Vue re-renders the formatted ZIP value.\n const restoreCaret = (\n inputElement: HTMLInputElement,\n digitIndex: number,\n ): void => {\n const caretIndex = digitIndexToDisplayIndex(digitIndex);\n\n nextTick(() => {\n if (!inputElement.isConnected) {\n return;\n }\n\n inputElement.setSelectionRange(caretIndex, caretIndex);\n });\n };\n\n const handleZipInput = (...args: unknown[]) => {\n const event = args[0] as TextBoxChangeEvent | undefined;\n const nativeEvent = event?.event as InputEvent | undefined;\n const inputElement = nativeEvent?.target as HTMLInputElement | null;\n const nextValue = event?.value;\n const inputValue = Array.isArray(nextValue)\n ? nextValue.join(\"\")\n : String(nextValue ?? \"\");\n\n // Capture the caret before rewriting the controlled value.\n const digitIndex =\n inputElement?.selectionStart !== undefined &&\n inputElement.selectionStart !== null\n ? countDigitsBeforeIndex(\n inputElement.value,\n inputElement.selectionStart,\n )\n : inputValue.replace(/\\D/g, \"\").length;\n\n zipDisplay.value = formatZipDisplay(inputValue);\n\n // Put the caret back where the user was typing.\n if (inputElement) {\n restoreCaret(inputElement, digitIndex);\n }\n };\n\n const submitAndValidate = (opts?: { focus?: boolean }): boolean => {\n submitted.value = true;\n const valid = isZipValid.value;\n if (!valid && opts?.focus) {\n nextTick(() => {\n const inputEl = document.getElementById(\n options.id,\n ) as HTMLInputElement | null;\n inputEl?.focus();\n });\n }\n return valid;\n };\n\n const buildPayload = (): ZipPayload => {\n return { zip: zipRaw.value };\n };\n\n return {\n // writable state\n zipDisplay,\n submitted,\n errorMessage,\n // bindings\n wrapperClass: \"fk-zip-textbox\",\n // derived state\n zipRaw,\n isZipValid,\n showZipError,\n textBoxValid,\n textBoxValidate,\n // actions\n handleZipInput,\n submitAndValidate,\n buildPayload,\n };\n};\n","import { ref, watchEffect } from \"vue\";\nimport type { Ref } from \"vue\";\n\nexport interface UseFieldsetTouchTrackerOptions {\n /**\n * Function that returns whether the fieldset is valid.\n */\n isValid: () => boolean;\n}\n\nexport interface UseFieldsetTouchTrackerApi {\n touched: Ref<boolean>;\n onFocusout: (event: FocusEvent) => void;\n reset: () => void;\n}\n\nexport function useFieldsetTouchTracker(\n fieldsetRef: Ref<HTMLFieldSetElement | null>,\n options: UseFieldsetTouchTrackerOptions,\n): UseFieldsetTouchTrackerApi {\n const touched = ref(false);\n\n // Keep aria-invalid synchronized with the composed validator function.\n watchEffect(() => {\n fieldsetRef.value?.setAttribute(\"aria-invalid\", String(!options.isValid()));\n });\n\n function onFocusout(event: FocusEvent) {\n const fieldset =\n fieldsetRef.value ?? (event.currentTarget as HTMLElement | null);\n const next = event.relatedTarget as Node | null;\n\n if (!fieldset || !fieldset.contains(next)) {\n touched.value = true;\n }\n }\n\n function reset() {\n touched.value = false;\n }\n\n return { touched, onFocusout, reset };\n}\n","import {\n computed,\n ref,\n toValue,\n type ComputedRef,\n type MaybeRefOrGetter,\n type Ref,\n} from \"vue\";\nimport { useFieldsetTouchTracker } from \"./useFieldsetTouchTracker\";\n\nexport interface UseFieldsetValidationKitOptions {\n /**\n * Consumer-owned submit state. The kit reads this value but never mutates it.\n */\n submitted: MaybeRefOrGetter<boolean>;\n /**\n * Returns the real validity of the fieldset when validation is active.\n */\n isValid: () => boolean;\n}\n\n/**\n * API returned by {@link useFieldsetValidationKit}.\n */\nexport interface UseFieldsetValidationKitApi {\n /**\n * Becomes true after the first focus transition that leaves the fieldset.\n */\n touched: Ref<boolean>;\n /**\n * Delayed validation gate. True when either submitted or touched is true.\n */\n fieldsetValidate: ComputedRef<boolean>;\n /**\n * Forwards fieldset focusout events to the internal touch tracker.\n */\n onFocusout: (event: FocusEvent) => void;\n /**\n * Clears touched state and suppresses one immediate post-reset focusout.\n *\n * This avoids re-activating delayed validation from reset-related focus\n * transitions (for example, clicking Reset while an input is focused).\n */\n reset: () => void;\n /**\n * Wraps a field-level validity source with delayed validation behavior.\n */\n createFieldValidity: (\n isValid: MaybeRefOrGetter<boolean>,\n ) => ComputedRef<boolean>;\n /**\n * Builds a named map of delayed field validity refs for ergonomic form setup.\n */\n createFieldValidationsMap: <\n T extends Record<string, MaybeRefOrGetter<boolean>>,\n >(\n isValidMap: T,\n ) => { [K in keyof T]: ComputedRef<boolean> };\n /**\n * Moves focus to the first invalid Kendo control found within the provided form.\n */\n focusFirstInvalidField: (\n formRef: MaybeRefOrGetter<HTMLFormElement | null>,\n ) => void;\n}\n\n/**\n * Orchestrates delayed fieldset validation using submit state and touch state.\n *\n * Intended as the primary form-level API for gated validity UX:\n * - validation displays after submit or first fieldset exit\n * - field-level validity can be composed through helper factories\n * - invalid focus and reset behavior are handled consistently\n *\n * @param fieldsetRef Reference to the fieldset whose focus transitions are tracked.\n * @param options Consumer-provided submit state and base validity function.\n * @returns Validation kit API for wiring fieldset-level and field-level behavior.\n */\nexport function useFieldsetValidationKit(\n fieldsetRef: Ref<HTMLFieldSetElement | null>,\n options: UseFieldsetValidationKitOptions,\n): UseFieldsetValidationKitApi {\n const touched = ref(false);\n // After reset, browser/UI focus can emit an immediate focusout that does not\n // represent a user intentionally leaving the fieldset. Ignore exactly one\n // focusout to prevent delayed validation from re-arming right away.\n const suppressNextTouch = ref(false);\n const fieldsetValidate = computed(\n () => toValue(options.submitted) || touched.value,\n );\n\n // Computes the effective validity of the fieldset, taking into account the\n // delayed validation gate.\n const fieldsetIsValid = computed(() => {\n return !fieldsetValidate.value || options.isValid();\n });\n\n // Initializes the internal touch tracker for the fieldset.\n const tracker = useFieldsetTouchTracker(fieldsetRef, {\n isValid: () => fieldsetIsValid.value,\n });\n\n // Creates a delayed validity ref for a single field based on the fieldset's\n // validation state.\n function createFieldValidity(isValid: MaybeRefOrGetter<boolean>) {\n return computed(() => !fieldsetValidate.value || toValue(isValid));\n }\n\n // Builds a named map of delayed field validity refs from the provided validity map.\n // (e.g. { firstName: () => firstNameValid, lastName: () => lastNameValid })\n // show example map?\n // Example usage:\n // const fieldValidations = createFieldValidationsMap({\n // firstName: () => firstNameValid,\n // lastName: () => lastNameValid,\n // });\n // The returned object will have the same keys as the input map, but each value will\n // be a computed ref that reflects the delayed validation state.\n function createFieldValidationsMap<\n T extends Record<string, MaybeRefOrGetter<boolean>>,\n >(isValidMap: T) {\n return Object.fromEntries(\n Object.entries(isValidMap).map(([key, isValid]) => [\n key,\n createFieldValidity(isValid),\n ]),\n ) as { [K in keyof T]: ComputedRef<boolean> };\n }\n\n // Focuses the first invalid field within the provided FORM.\n // TODO: Leaving this here for now as a convenience, but it does not belong\n // in the core validation kit. This should be its own composable or utility\n // function. I may move this to USAddress component-specific logic.\n function focusFirstInvalidField(\n formRef: MaybeRefOrGetter<HTMLFormElement | null>,\n ) {\n const form = toValue(formRef);\n if (!form) return;\n\n const firstInvalid = form.querySelector(\n '.k-invalid input, .k-invalid[tabindex=\"0\"]',\n ) as HTMLElement | null;\n\n firstInvalid?.focus();\n }\n\n // Forwards fieldset focusout events to the internal touch tracker.\n function onFocusout(event: FocusEvent) {\n if (suppressNextTouch.value) {\n // Consume the first post-reset focusout caused by reset/click focus\n // churn.\n suppressNextTouch.value = false;\n return;\n }\n\n tracker.onFocusout(event);\n\n if (tracker.touched.value) {\n touched.value = true;\n }\n }\n\n // Resets the touched state and suppresses one immediate post-reset focusout.\n function reset() {\n touched.value = false;\n suppressNextTouch.value = true;\n tracker.reset();\n }\n\n return {\n touched,\n fieldsetValidate,\n onFocusout,\n reset,\n createFieldValidity,\n createFieldValidationsMap,\n focusFirstInvalidField,\n };\n}\n","export type UsStateOption = {\n label: string;\n value: string;\n};\n\nexport const US_STATES_BY_ABBREVIATION: UsStateOption[] = [\n { label: \"Alabama\", value: \"AL\" },\n { label: \"Alaska\", value: \"AK\" },\n { label: \"Arizona\", value: \"AZ\" },\n { label: \"Arkansas\", value: \"AR\" },\n { label: \"California\", value: \"CA\" },\n { label: \"Colorado\", value: \"CO\" },\n { label: \"Connecticut\", value: \"CT\" },\n { label: \"Delaware\", value: \"DE\" },\n { label: \"Florida\", value: \"FL\" },\n { label: \"Georgia\", value: \"GA\" },\n { label: \"Hawaii\", value: \"HI\" },\n { label: \"Idaho\", value: \"ID\" },\n { label: \"Illinois\", value: \"IL\" },\n { label: \"Indiana\", value: \"IN\" },\n { label: \"Iowa\", value: \"IA\" },\n { label: \"Kansas\", value: \"KS\" },\n { label: \"Kentucky\", value: \"KY\" },\n { label: \"Louisiana\", value: \"LA\" },\n { label: \"Maine\", value: \"ME\" },\n { label: \"Maryland\", value: \"MD\" },\n { label: \"Massachusetts\", value: \"MA\" },\n { label: \"Michigan\", value: \"MI\" },\n { label: \"Minnesota\", value: \"MN\" },\n { label: \"Mississippi\", value: \"MS\" },\n { label: \"Missouri\", value: \"MO\" },\n { label: \"Montana\", value: \"MT\" },\n { label: \"Nebraska\", value: \"NE\" },\n { label: \"Nevada\", value: \"NV\" },\n { label: \"New Hampshire\", value: \"NH\" },\n { label: \"New Jersey\", value: \"NJ\" },\n { label: \"New Mexico\", value: \"NM\" },\n { label: \"New York\", value: \"NY\" },\n { label: \"North Carolina\", value: \"NC\" },\n { label: \"North Dakota\", value: \"ND\" },\n { label: \"Ohio\", value: \"OH\" },\n { label: \"Oklahoma\", value: \"OK\" },\n { label: \"Oregon\", value: \"OR\" },\n { label: \"Pennsylvania\", value: \"PA\" },\n { label: \"Rhode Island\", value: \"RI\" },\n { label: \"South Carolina\", value: \"SC\" },\n { label: \"South Dakota\", value: \"SD\" },\n { label: \"Tennessee\", value: \"TN\" },\n { label: \"Texas\", value: \"TX\" },\n { label: \"Utah\", value: \"UT\" },\n { label: \"Vermont\", value: \"VT\" },\n { label: \"Virginia\", value: \"VA\" },\n { label: \"Washington\", value: \"WA\" },\n { label: \"West Virginia\", value: \"WV\" },\n { label: \"Wisconsin\", value: \"WI\" },\n { label: \"Wyoming\", value: \"WY\" },\n];\n","import { reactive } from \"vue\";\n\nexport interface USAddressFormData {\n address1: string;\n address2: string;\n city: string;\n state: string | null;\n zip: string;\n}\n\n/**\n * Reads the value from an input event payload.\n * @param payload - The input event payload.\n * @returns The string value of the input.\n */\nfunction readInputValue(payload: unknown): string {\n if (payload && typeof payload === \"object\" && \"value\" in payload) {\n const value = (payload as { value: unknown }).value;\n return typeof value === \"string\" ? value : String(value ?? \"\");\n }\n return \"\";\n}\n\n/**\n * Manages the form data model for a US address.\n *\n * Note: this is internal UI data state, not just the US \"state\" (AL, CA, etc.) field.\n * @returns An object containing form data and field event handlers.\n */\nexport function useUSAddressFormData() {\n const formData = reactive<USAddressFormData>({\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: null,\n zip: \"\",\n });\n\n const onAddress1Input = (...args: unknown[]) => {\n formData.address1 = readInputValue(args[0]);\n };\n\n const onAddress2Input = (...args: unknown[]) => {\n formData.address2 = readInputValue(args[0]);\n };\n\n const onCityInput = (...args: unknown[]) => {\n formData.city = readInputValue(args[0]);\n };\n\n const onStateChange = (event: { value: string | null }) => {\n formData.state = event.value;\n };\n\n const resetFormData = () => {\n formData.address1 = \"\";\n formData.address2 = \"\";\n formData.city = \"\";\n formData.state = null;\n formData.zip = \"\";\n };\n\n return {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n };\n}\n","import { watch } from \"vue\";\nimport { useZipTextBox } from \"./useZipTextBox\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\n/**\n * Manages the ZIP code field for a US address.\n * @param formData - The form data object containing the ZIP code.\n * @returns An object containing ZIP code display, validity, wrapper class, input handler, and reset function.\n */\nexport function useUSAddressZip(\n formData: USAddressFormData,\n zipInputId = \"zip\",\n) {\n const zipField = useZipTextBox({ id: zipInputId });\n const {\n zipDisplay,\n zipRaw,\n isZipValid,\n wrapperClass: zipWrapperClass,\n handleZipInput: onZipInput,\n } = zipField;\n\n watch(zipRaw, (value) => {\n formData.zip = value;\n });\n\n const resetZip = () => {\n zipDisplay.value = \"\";\n formData.zip = \"\";\n };\n\n return {\n zipDisplay,\n isZipValid,\n zipWrapperClass,\n onZipInput,\n resetZip,\n };\n}\n","import { computed, toValue, type MaybeRefOrGetter } from \"vue\";\nimport type { USAddressFormData } from \"./_useUSAddressFormData\";\n\ninterface UseUSAddressValidationOptions {\n formData: USAddressFormData;\n isZipValid: MaybeRefOrGetter<boolean>;\n}\n\n/**\n * Manages the validation state for a US address.\n * @param options - The options object containing form data and ZIP code validity.\n * @returns An object containing validation state for each field and the overall address.\n */\nexport function useUSAddressValidation(options: UseUSAddressValidationOptions) {\n /**\n * Strict validity values represent the actual rule outcomes for each field,\n * independent of whether validation messages are currently shown in the UI.\n */\n const strictAddress1Valid = computed(\n () => options.formData.address1.trim() !== \"\",\n );\n const strictCityValid = computed(() => options.formData.city.trim() !== \"\");\n const strictStateValid = computed(() => !!options.formData.state);\n const strictZipValid = computed(() => toValue(options.isZipValid));\n\n const strictAddressValid = computed(\n () =>\n strictAddress1Valid.value &&\n strictCityValid.value &&\n strictStateValid.value &&\n strictZipValid.value,\n );\n\n return {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n };\n}\n","import {\n computed,\n nextTick,\n ref,\n toValue,\n watch,\n watchEffect,\n type MaybeRefOrGetter,\n} from \"vue\";\nimport { useFieldsetValidationKit } from \"../form/useFieldsetValidationKit\";\nimport { US_STATES_BY_ABBREVIATION } from \"./usStates\";\nimport { useUSAddressFormData } from \"./_useUSAddressFormData\";\nimport { useUSAddressZip } from \"./_useUSAddressZip\";\nimport { useUSAddressValidation } from \"./_useUSAddressValidation\";\n\ninterface UseUSAddressOptions {\n fieldsetRef: MaybeRefOrGetter<HTMLFieldSetElement | null>;\n addressId: string;\n required?: MaybeRefOrGetter<boolean>;\n}\n\nexport interface USAddressSubmitPayload {\n address1: string;\n address2: string;\n city: string;\n state: string;\n zip: string;\n}\n\n/**\n * Focuses the first invalid input within a container.\n * @param container - The container element to search within.\n */\nfunction focusFirstInvalid(container: HTMLElement | null) {\n if (!container) return;\n const target = container.querySelector<HTMLElement>(\n '.k-invalid input, .k-invalid[tabindex=\"0\"]',\n );\n target?.focus();\n}\n\nfunction focusoutLeavesFieldset(\n fieldsetRef: HTMLFieldSetElement | null,\n event: FocusEvent,\n) {\n const fieldset = fieldsetRef ?? (event.currentTarget as HTMLElement | null);\n const next = event.relatedTarget as Node | null;\n\n return !fieldset || !fieldset.contains(next);\n}\n\n/**\n * Composable for managing a US address form.\n * @param options - The options object containing fieldset reference and address id.\n * @returns An object containing form state, validation state, and handlers.\n */\nexport function useUSAddress(options: UseUSAddressOptions) {\n const fieldsetRef = ref<HTMLFieldSetElement | null>(\n toValue(options.fieldsetRef),\n );\n\n watchEffect(() => {\n fieldsetRef.value = toValue(options.fieldsetRef);\n });\n\n const submitted = ref(false);\n const optionalFeedbackReviewed = ref(false);\n const isRequired = computed(() => toValue(options.required) ?? true);\n const {\n formData,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n resetFormData,\n } = useUSAddressFormData();\n\n const zipInputId = `${options.addressId}-zip`;\n\n const { zipDisplay, isZipValid, zipWrapperClass, onZipInput, resetZip } =\n useUSAddressZip(formData, zipInputId);\n\n const {\n strictAddress1Valid,\n strictCityValid,\n strictStateValid,\n strictZipValid,\n strictAddressValid,\n } = useUSAddressValidation({\n formData,\n isZipValid,\n });\n\n const validationKit = useFieldsetValidationKit(fieldsetRef, {\n submitted,\n isValid: () => strictAddressValid.value,\n });\n\n const { touched, fieldsetValidate, onFocusout, reset } = validationKit;\n\n const fieldValidations = validationKit.createFieldValidationsMap({\n address1: strictAddress1Valid,\n city: strictCityValid,\n state: strictStateValid,\n zip: strictZipValid,\n address: strictAddressValid,\n });\n\n const {\n address1: rawAddress1Valid,\n city: rawCityValid,\n state: rawStateValid,\n zip: rawZipValid,\n address: rawAddressValid,\n } = fieldValidations;\n\n const addressValidate = computed(() =>\n isRequired.value ? fieldsetValidate.value : false,\n );\n\n const address1Valid = computed(() =>\n isRequired.value ? rawAddress1Valid.value : true,\n );\n\n const cityValid = computed(() =>\n isRequired.value ? rawCityValid.value : true,\n );\n\n const stateValid = computed(() =>\n isRequired.value ? rawStateValid.value : true,\n );\n\n const zipValid = computed(() =>\n isRequired.value ? rawZipValid.value : true,\n );\n\n const addressValid = computed(() =>\n isRequired.value ? rawAddressValid.value : true,\n );\n\n const stateDefaultItem = { value: null, label: \"State\" };\n const stateOptions = US_STATES_BY_ABBREVIATION.map(({ label, value }) => ({\n label,\n value,\n }));\n\n const normalizedPayload = computed<USAddressSubmitPayload>(() => ({\n address1: formData.address1.trim(),\n address2: formData.address2.trim(),\n city: formData.city.trim(),\n state: (formData.state ?? \"\").trim().toUpperCase(),\n zip: formData.zip.replace(/\\D/g, \"\"),\n }));\n\n const isAddressEmpty = computed(() => {\n return (\n formData.address1.trim() === \"\" &&\n formData.address2.trim() === \"\" &&\n formData.city.trim() === \"\" &&\n (formData.state ?? \"\").trim() === \"\" &&\n formData.zip.replace(/\\D/g, \"\") === \"\"\n );\n });\n\n /**\n * Indicates whether any input has been provided in the optional address fields.\n * @returns True if any address field has input, false otherwise.\n */\n const optionalAddressHasAnyInput = computed(() => !isAddressEmpty.value);\n\n /**\n * Indicates whether any required fields are missing in the optional address section.\n * @returns True if any required field is missing, false otherwise.\n */\n const optionalMissingRequiredFields = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n (!strictAddress1Valid.value ||\n !strictCityValid.value ||\n !strictStateValid.value)\n );\n });\n\n /**\n * Indicates whether the optional zip code field is invalid.\n * @returns True if the zip code is invalid, false otherwise.\n */\n const optionalZipInvalid = computed(() => {\n const zipDigits = formData.zip.replace(/\\D/g, \"\");\n\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n zipDigits.length !== 5 &&\n zipDigits.length !== 9\n );\n });\n\n /**\n * Indicates whether any part of the optional address is invalid.\n * @returns True if any part of the optional address is invalid, false otherwise.\n */\n const optionalPartialInvalid = computed(() => {\n return (\n !isRequired.value &&\n optionalAddressHasAnyInput.value &&\n !strictAddressValid.value\n );\n });\n\n /**\n * Indicates whether optional address feedback should be active.\n * @returns True if feedback should be active, false otherwise.\n */\n const optionalFeedbackActive = computed(() => {\n return (\n !isRequired.value &&\n optionalPartialInvalid.value &&\n (optionalFeedbackReviewed.value || submitted.value)\n );\n });\n\n // Resets the optional feedback reviewed state when the normalized payload\n // changes and the address is not required.\n watch(normalizedPayload, () => {\n if (!isRequired.value) {\n optionalFeedbackReviewed.value = false;\n }\n });\n\n watch(isRequired, (required) => {\n if (!required) {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n }\n });\n\n /**\n * Validates address state for parent-owned submit flow.\n * Activates UI error visibility.\n * @returns An object containing the validity status and the normalized payload.\n */\n const validateForSubmit = async () => {\n if (!isRequired.value) {\n if (isAddressEmpty.value || strictAddressValid.value) {\n submitted.value = false;\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n }\n\n submitted.value = true;\n return { isValid: false as const, payload: null };\n }\n\n submitted.value = true;\n\n if (!strictAddressValid.value) {\n await nextTick();\n focusFirstInvalid(fieldsetRef.value);\n return { isValid: false as const, payload: null };\n }\n\n return {\n isValid: true as const,\n payload: normalizedPayload.value,\n };\n };\n\n /**\n * Resets the US address form.\n * Deactivates UI error visibility.\n */\n const resetAddress = () => {\n submitted.value = false;\n optionalFeedbackReviewed.value = false;\n reset();\n resetFormData();\n resetZip();\n };\n\n const onFieldsetFocusout = (event: FocusEvent) => {\n const leftFieldset = focusoutLeavesFieldset(fieldsetRef.value, event);\n\n onFocusout(event);\n\n if (!isRequired.value && leftFieldset) {\n optionalFeedbackReviewed.value = true;\n }\n };\n\n return {\n formData,\n submitted,\n touched,\n addressValidate,\n address1Valid,\n cityValid,\n stateValid,\n zipValid,\n addressValid,\n optionalFeedbackActive,\n optionalPartialInvalid,\n optionalMissingRequiredFields,\n optionalZipInvalid,\n stateDefaultItem,\n stateOptions,\n zipDisplay,\n zipWrapperClass,\n onAddress1Input,\n onAddress2Input,\n onCityInput,\n onStateChange,\n onZipInput,\n onFieldsetFocusout,\n normalizedPayload,\n validateForSubmit,\n reset: resetAddress,\n };\n}\n","import { shallowRef, watchEffect, readonly, watch, customRef, getCurrentScope, onScopeDispose, effectScope, getCurrentInstance, hasInjectionContext, inject, provide, ref, isRef, unref, toValue as toValue$1, computed, reactive, toRefs as toRefs$1, toRef as toRef$1, shallowReadonly, onBeforeMount, nextTick, onBeforeUnmount, onMounted, onUnmounted, isReactive } from 'vue';\n\nfunction computedEager(fn, options) {\n var _a;\n const result = shallowRef();\n watchEffect(() => {\n result.value = fn();\n }, {\n ...options,\n flush: (_a = options == null ? void 0 : options.flush) != null ? _a : \"sync\"\n });\n return readonly(result);\n}\n\nfunction computedWithControl(source, fn, options = {}) {\n let v = void 0;\n let track;\n let trigger;\n let dirty = true;\n const update = () => {\n dirty = true;\n trigger();\n };\n watch(source, update, { flush: \"sync\", ...options });\n const get = typeof fn === \"function\" ? fn : fn.get;\n const set = typeof fn === \"function\" ? void 0 : fn.set;\n const result = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n if (dirty) {\n v = get(v);\n dirty = false;\n }\n track();\n return v;\n },\n set(v2) {\n set == null ? void 0 : set(v2);\n }\n };\n });\n result.trigger = update;\n return result;\n}\n\nfunction tryOnScopeDispose(fn) {\n if (getCurrentScope()) {\n onScopeDispose(fn);\n return true;\n }\n return false;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createEventHook() {\n const fns = /* @__PURE__ */ new Set();\n const off = (fn) => {\n fns.delete(fn);\n };\n const clear = () => {\n fns.clear();\n };\n const on = (fn) => {\n fns.add(fn);\n const offFn = () => off(fn);\n tryOnScopeDispose(offFn);\n return {\n off: offFn\n };\n };\n const trigger = (...args) => {\n return Promise.all(Array.from(fns).map((fn) => fn(...args)));\n };\n return {\n on,\n off,\n trigger,\n clear\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createGlobalState(stateFactory) {\n let initialized = false;\n let state;\n const scope = effectScope(true);\n return (...args) => {\n if (!initialized) {\n state = scope.run(() => stateFactory(...args));\n initialized = true;\n }\n return state;\n };\n}\n\nconst localProvidedStateMap = /* @__PURE__ */ new WeakMap();\n\nconst injectLocal = /* @__NO_SIDE_EFFECTS__ */ (...args) => {\n var _a;\n const key = args[0];\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null && !hasInjectionContext())\n throw new Error(\"injectLocal must be called in setup\");\n if (instance && localProvidedStateMap.has(instance) && key in localProvidedStateMap.get(instance))\n return localProvidedStateMap.get(instance)[key];\n return inject(...args);\n};\n\nfunction provideLocal(key, value) {\n var _a;\n const instance = (_a = getCurrentInstance()) == null ? void 0 : _a.proxy;\n if (instance == null)\n throw new Error(\"provideLocal must be called in setup\");\n if (!localProvidedStateMap.has(instance))\n localProvidedStateMap.set(instance, /* @__PURE__ */ Object.create(null));\n const localProvidedState = localProvidedStateMap.get(instance);\n localProvidedState[key] = value;\n return provide(key, value);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createInjectionState(composable, options) {\n const key = (options == null ? void 0 : options.injectionKey) || Symbol(composable.name || \"InjectionState\");\n const defaultValue = options == null ? void 0 : options.defaultValue;\n const useProvidingState = (...args) => {\n const state = composable(...args);\n provideLocal(key, state);\n return state;\n };\n const useInjectedState = () => injectLocal(key, defaultValue);\n return [useProvidingState, useInjectedState];\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createRef(value, deep) {\n if (deep === true) {\n return ref(value);\n } else {\n return shallowRef(value);\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createSharedComposable(composable) {\n let subscribers = 0;\n let state;\n let scope;\n const dispose = () => {\n subscribers -= 1;\n if (scope && subscribers <= 0) {\n scope.stop();\n state = void 0;\n scope = void 0;\n }\n };\n return (...args) => {\n subscribers += 1;\n if (!scope) {\n scope = effectScope(true);\n state = scope.run(() => composable(...args));\n }\n tryOnScopeDispose(dispose);\n return state;\n };\n}\n\nfunction extendRef(ref, extend, { enumerable = false, unwrap = true } = {}) {\n for (const [key, value] of Object.entries(extend)) {\n if (key === \"value\")\n continue;\n if (isRef(value) && unwrap) {\n Object.defineProperty(ref, key, {\n get() {\n return value.value;\n },\n set(v) {\n value.value = v;\n },\n enumerable\n });\n } else {\n Object.defineProperty(ref, key, { value, enumerable });\n }\n }\n return ref;\n}\n\nfunction get(obj, key) {\n if (key == null)\n return unref(obj);\n return unref(obj)[key];\n}\n\nfunction isDefined(v) {\n return unref(v) != null;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction makeDestructurable(obj, arr) {\n if (typeof Symbol !== \"undefined\") {\n const clone = { ...obj };\n Object.defineProperty(clone, Symbol.iterator, {\n enumerable: false,\n value() {\n let index = 0;\n return {\n next: () => ({\n value: arr[index++],\n done: index > arr.length\n })\n };\n }\n });\n return clone;\n } else {\n return Object.assign([...arr], obj);\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction reactify(fn, options) {\n const unrefFn = (options == null ? void 0 : options.computedGetter) === false ? unref : toValue$1;\n return function(...args) {\n return computed(() => fn.apply(this, args.map((i) => unrefFn(i))));\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction reactifyObject(obj, optionsOrKeys = {}) {\n let keys = [];\n let options;\n if (Array.isArray(optionsOrKeys)) {\n keys = optionsOrKeys;\n } else {\n options = optionsOrKeys;\n const { includeOwnProperties = true } = optionsOrKeys;\n keys.push(...Object.keys(obj));\n if (includeOwnProperties)\n keys.push(...Object.getOwnPropertyNames(obj));\n }\n return Object.fromEntries(\n keys.map((key) => {\n const value = obj[key];\n return [\n key,\n typeof value === \"function\" ? reactify(value.bind(obj), options) : value\n ];\n })\n );\n}\n\nfunction toReactive(objectRef) {\n if (!isRef(objectRef))\n return reactive(objectRef);\n const proxy = new Proxy({}, {\n get(_, p, receiver) {\n return unref(Reflect.get(objectRef.value, p, receiver));\n },\n set(_, p, value) {\n if (isRef(objectRef.value[p]) && !isRef(value))\n objectRef.value[p].value = value;\n else\n objectRef.value[p] = value;\n return true;\n },\n deleteProperty(_, p) {\n return Reflect.deleteProperty(objectRef.value, p);\n },\n has(_, p) {\n return Reflect.has(objectRef.value, p);\n },\n ownKeys() {\n return Object.keys(objectRef.value);\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true\n };\n }\n });\n return reactive(proxy);\n}\n\nfunction reactiveComputed(fn) {\n return toReactive(computed(fn));\n}\n\nfunction reactiveOmit(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => !predicate(toValue$1(v), k))) : Object.fromEntries(Object.entries(toRefs$1(obj)).filter((e) => !flatKeys.includes(e[0]))));\n}\n\nconst isClient = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst isWorker = typeof WorkerGlobalScope !== \"undefined\" && globalThis instanceof WorkerGlobalScope;\nconst isDef = (val) => typeof val !== \"undefined\";\nconst notNullish = (val) => val != null;\nconst assert = (condition, ...infos) => {\n if (!condition)\n console.warn(...infos);\n};\nconst toString = Object.prototype.toString;\nconst isObject = (val) => toString.call(val) === \"[object Object]\";\nconst now = () => Date.now();\nconst timestamp = () => +Date.now();\nconst clamp = (n, min, max) => Math.min(max, Math.max(min, n));\nconst noop = () => {\n};\nconst rand = (min, max) => {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\nconst hasOwn = (val, key) => Object.prototype.hasOwnProperty.call(val, key);\nconst isIOS = /* @__PURE__ */ getIsIOS();\nfunction getIsIOS() {\n var _a, _b;\n return isClient && ((_a = window == null ? void 0 : window.navigator) == null ? void 0 : _a.userAgent) && (/iP(?:ad|hone|od)/.test(window.navigator.userAgent) || ((_b = window == null ? void 0 : window.navigator) == null ? void 0 : _b.maxTouchPoints) > 2 && /iPad|Macintosh/.test(window == null ? void 0 : window.navigator.userAgent));\n}\n\nfunction toRef(...args) {\n if (args.length !== 1)\n return toRef$1(...args);\n const r = args[0];\n return typeof r === \"function\" ? readonly(customRef(() => ({ get: r, set: noop }))) : ref(r);\n}\nconst resolveRef = toRef;\n\nfunction reactivePick(obj, ...keys) {\n const flatKeys = keys.flat();\n const predicate = flatKeys[0];\n return reactiveComputed(() => typeof predicate === \"function\" ? Object.fromEntries(Object.entries(toRefs$1(obj)).filter(([k, v]) => predicate(toValue$1(v), k))) : Object.fromEntries(flatKeys.map((k) => [k, toRef(obj, k)])));\n}\n\nfunction refAutoReset(defaultValue, afterMs = 1e4) {\n return customRef((track, trigger) => {\n let value = toValue$1(defaultValue);\n let timer;\n const resetAfter = () => setTimeout(() => {\n value = toValue$1(defaultValue);\n trigger();\n }, toValue$1(afterMs));\n tryOnScopeDispose(() => {\n clearTimeout(timer);\n });\n return {\n get() {\n track();\n return value;\n },\n set(newValue) {\n value = newValue;\n trigger();\n clearTimeout(timer);\n timer = resetAfter();\n }\n };\n });\n}\n\nfunction createFilterWrapper(filter, fn) {\n function wrapper(...args) {\n return new Promise((resolve, reject) => {\n Promise.resolve(filter(() => fn.apply(this, args), { fn, thisArg: this, args })).then(resolve).catch(reject);\n });\n }\n return wrapper;\n}\nconst bypassFilter = (invoke) => {\n return invoke();\n};\nfunction debounceFilter(ms, options = {}) {\n let timer;\n let maxTimer;\n let lastRejector = noop;\n const _clearTimeout = (timer2) => {\n clearTimeout(timer2);\n lastRejector();\n lastRejector = noop;\n };\n let lastInvoker;\n const filter = (invoke) => {\n const duration = toValue$1(ms);\n const maxDuration = toValue$1(options.maxWait);\n if (timer)\n _clearTimeout(timer);\n if (duration <= 0 || maxDuration !== void 0 && maxDuration <= 0) {\n if (maxTimer) {\n _clearTimeout(maxTimer);\n maxTimer = void 0;\n }\n return Promise.resolve(invoke());\n }\n return new Promise((resolve, reject) => {\n lastRejector = options.rejectOnCancel ? reject : resolve;\n lastInvoker = invoke;\n if (maxDuration && !maxTimer) {\n maxTimer = setTimeout(() => {\n if (timer)\n _clearTimeout(timer);\n maxTimer = void 0;\n resolve(lastInvoker());\n }, maxDuration);\n }\n timer = setTimeout(() => {\n if (maxTimer)\n _clearTimeout(maxTimer);\n maxTimer = void 0;\n resolve(invoke());\n }, duration);\n });\n };\n return filter;\n}\nfunction throttleFilter(...args) {\n let lastExec = 0;\n let timer;\n let isLeading = true;\n let lastRejector = noop;\n let lastValue;\n let ms;\n let trailing;\n let leading;\n let rejectOnCancel;\n if (!isRef(args[0]) && typeof args[0] === \"object\")\n ({ delay: ms, trailing = true, leading = true, rejectOnCancel = false } = args[0]);\n else\n [ms, trailing = true, leading = true, rejectOnCancel = false] = args;\n const clear = () => {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n lastRejector();\n lastRejector = noop;\n }\n };\n const filter = (_invoke) => {\n const duration = toValue$1(ms);\n const elapsed = Date.now() - lastExec;\n const invoke = () => {\n return lastValue = _invoke();\n };\n clear();\n if (duration <= 0) {\n lastExec = Date.now();\n return invoke();\n }\n if (elapsed > duration && (leading || !isLeading)) {\n lastExec = Date.now();\n invoke();\n } else if (trailing) {\n lastValue = new Promise((resolve, reject) => {\n lastRejector = rejectOnCancel ? reject : resolve;\n timer = setTimeout(() => {\n lastExec = Date.now();\n isLeading = true;\n resolve(invoke());\n clear();\n }, Math.max(0, duration - elapsed));\n });\n }\n if (!leading && !timer)\n timer = setTimeout(() => isLeading = true, duration);\n isLeading = false;\n return lastValue;\n };\n return filter;\n}\nfunction pausableFilter(extendFilter = bypassFilter, options = {}) {\n const {\n initialState = \"active\"\n } = options;\n const isActive = toRef(initialState === \"active\");\n function pause() {\n isActive.value = false;\n }\n function resume() {\n isActive.value = true;\n }\n const eventFilter = (...args) => {\n if (isActive.value)\n extendFilter(...args);\n };\n return { isActive: readonly(isActive), pause, resume, eventFilter };\n}\n\nfunction promiseTimeout(ms, throwOnTimeout = false, reason = \"Timeout\") {\n return new Promise((resolve, reject) => {\n if (throwOnTimeout)\n setTimeout(() => reject(reason), ms);\n else\n setTimeout(resolve, ms);\n });\n}\nfunction identity(arg) {\n return arg;\n}\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction containsProp(obj, ...props) {\n return props.some((k) => k in obj);\n}\nfunction increaseWithUnit(target, delta) {\n var _a;\n if (typeof target === \"number\")\n return target + delta;\n const value = ((_a = target.match(/^-?\\d+\\.?\\d*/)) == null ? void 0 : _a[0]) || \"\";\n const unit = target.slice(value.length);\n const result = Number.parseFloat(value) + delta;\n if (Number.isNaN(result))\n return target;\n return result + unit;\n}\nfunction pxValue(px) {\n return px.endsWith(\"rem\") ? Number.parseFloat(px) * 16 : Number.parseFloat(px);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction toArray(value) {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction cacheStringFunction(fn) {\n const cache = /* @__PURE__ */ Object.create(null);\n return (str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n };\n}\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction((str) => str.replace(hyphenateRE, \"-$1\").toLowerCase());\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction((str) => {\n return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n});\n\nfunction getLifeCycleTarget(target) {\n return target || getCurrentInstance();\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDebounceFn(fn, ms = 200, options = {}) {\n return createFilterWrapper(\n debounceFilter(ms, options),\n fn\n );\n}\n\nfunction refDebounced(value, ms = 200, options = {}) {\n const debounced = ref(toValue$1(value));\n const updater = useDebounceFn(() => {\n debounced.value = value.value;\n }, ms, options);\n watch(value, () => updater());\n return shallowReadonly(debounced);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction refDefault(source, defaultValue) {\n return computed({\n get() {\n var _a;\n return (_a = source.value) != null ? _a : defaultValue;\n },\n set(value) {\n source.value = value;\n }\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useThrottleFn(fn, ms = 200, trailing = false, leading = true, rejectOnCancel = false) {\n return createFilterWrapper(\n throttleFilter(ms, trailing, leading, rejectOnCancel),\n fn\n );\n}\n\nfunction refThrottled(value, delay = 200, trailing = true, leading = true) {\n if (delay <= 0)\n return value;\n const throttled = ref(toValue$1(value));\n const updater = useThrottleFn(() => {\n throttled.value = value.value;\n }, delay, trailing, leading);\n watch(value, () => updater());\n return throttled;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction refWithControl(initial, options = {}) {\n let source = initial;\n let track;\n let trigger;\n const ref = customRef((_track, _trigger) => {\n track = _track;\n trigger = _trigger;\n return {\n get() {\n return get();\n },\n set(v) {\n set(v);\n }\n };\n });\n function get(tracking = true) {\n if (tracking)\n track();\n return source;\n }\n function set(value, triggering = true) {\n var _a, _b;\n if (value === source)\n return;\n const old = source;\n if (((_a = options.onBeforeChange) == null ? void 0 : _a.call(options, value, old)) === false)\n return;\n source = value;\n (_b = options.onChanged) == null ? void 0 : _b.call(options, value, old);\n if (triggering)\n trigger();\n }\n const untrackedGet = () => get(false);\n const silentSet = (v) => set(v, false);\n const peek = () => get(false);\n const lay = (v) => set(v, false);\n return extendRef(\n ref,\n {\n get,\n set,\n untrackedGet,\n silentSet,\n peek,\n lay\n },\n { enumerable: true }\n );\n}\nconst controlledRef = refWithControl;\n\nfunction set(...args) {\n if (args.length === 2) {\n const [ref, value] = args;\n ref.value = value;\n }\n if (args.length === 3) {\n const [target, key, value] = args;\n target[key] = value;\n }\n}\n\nfunction watchWithFilter(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n return watch(\n source,\n createFilterWrapper(\n eventFilter,\n cb\n ),\n watchOptions\n );\n}\n\nfunction watchPausable(source, cb, options = {}) {\n const {\n eventFilter: filter,\n initialState = \"active\",\n ...watchOptions\n } = options;\n const { eventFilter, pause, resume, isActive } = pausableFilter(filter, { initialState });\n const stop = watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter\n }\n );\n return { stop, pause, resume, isActive };\n}\n\nfunction syncRef(left, right, ...[options]) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true,\n direction = \"both\",\n transform = {}\n } = options || {};\n const watchers = [];\n const transformLTR = \"ltr\" in transform && transform.ltr || ((v) => v);\n const transformRTL = \"rtl\" in transform && transform.rtl || ((v) => v);\n if (direction === \"both\" || direction === \"ltr\") {\n watchers.push(watchPausable(\n left,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n right.value = transformLTR(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n if (direction === \"both\" || direction === \"rtl\") {\n watchers.push(watchPausable(\n right,\n (newValue) => {\n watchers.forEach((w) => w.pause());\n left.value = transformRTL(newValue);\n watchers.forEach((w) => w.resume());\n },\n { flush, deep, immediate }\n ));\n }\n const stop = () => {\n watchers.forEach((w) => w.stop());\n };\n return stop;\n}\n\nfunction syncRefs(source, targets, options = {}) {\n const {\n flush = \"sync\",\n deep = false,\n immediate = true\n } = options;\n const targetsArray = toArray(targets);\n return watch(\n source,\n (newValue) => targetsArray.forEach((target) => target.value = newValue),\n { flush, deep, immediate }\n );\n}\n\nfunction toRefs(objectRef, options = {}) {\n if (!isRef(objectRef))\n return toRefs$1(objectRef);\n const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};\n for (const key in objectRef.value) {\n result[key] = customRef(() => ({\n get() {\n return objectRef.value[key];\n },\n set(v) {\n var _a;\n const replaceRef = (_a = toValue$1(options.replaceRef)) != null ? _a : true;\n if (replaceRef) {\n if (Array.isArray(objectRef.value)) {\n const copy = [...objectRef.value];\n copy[key] = v;\n objectRef.value = copy;\n } else {\n const newObject = { ...objectRef.value, [key]: v };\n Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));\n objectRef.value = newObject;\n }\n } else {\n objectRef.value[key] = v;\n }\n }\n }));\n }\n return result;\n}\n\nconst toValue = toValue$1;\nconst resolveUnref = toValue$1;\n\nfunction tryOnBeforeMount(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeMount(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnBeforeUnmount(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onBeforeUnmount(fn, target);\n}\n\nfunction tryOnMounted(fn, sync = true, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onMounted(fn, target);\n else if (sync)\n fn();\n else\n nextTick(fn);\n}\n\nfunction tryOnUnmounted(fn, target) {\n const instance = getLifeCycleTarget(target);\n if (instance)\n onUnmounted(fn, target);\n}\n\nfunction createUntil(r, isNot = false) {\n function toMatch(condition, { flush = \"sync\", deep = false, timeout, throwOnTimeout } = {}) {\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n r,\n (v) => {\n if (condition(v) !== isNot) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => stop == null ? void 0 : stop())\n );\n }\n return Promise.race(promises);\n }\n function toBe(value, options) {\n if (!isRef(value))\n return toMatch((v) => v === value, options);\n const { flush = \"sync\", deep = false, timeout, throwOnTimeout } = options != null ? options : {};\n let stop = null;\n const watcher = new Promise((resolve) => {\n stop = watch(\n [r, value],\n ([v1, v2]) => {\n if (isNot !== (v1 === v2)) {\n if (stop)\n stop();\n else\n nextTick(() => stop == null ? void 0 : stop());\n resolve(v1);\n }\n },\n {\n flush,\n deep,\n immediate: true\n }\n );\n });\n const promises = [watcher];\n if (timeout != null) {\n promises.push(\n promiseTimeout(timeout, throwOnTimeout).then(() => toValue$1(r)).finally(() => {\n stop == null ? void 0 : stop();\n return toValue$1(r);\n })\n );\n }\n return Promise.race(promises);\n }\n function toBeTruthy(options) {\n return toMatch((v) => Boolean(v), options);\n }\n function toBeNull(options) {\n return toBe(null, options);\n }\n function toBeUndefined(options) {\n return toBe(void 0, options);\n }\n function toBeNaN(options) {\n return toMatch(Number.isNaN, options);\n }\n function toContains(value, options) {\n return toMatch((v) => {\n const array = Array.from(v);\n return array.includes(value) || array.includes(toValue$1(value));\n }, options);\n }\n function changed(options) {\n return changedTimes(1, options);\n }\n function changedTimes(n = 1, options) {\n let count = -1;\n return toMatch(() => {\n count += 1;\n return count >= n;\n }, options);\n }\n if (Array.isArray(toValue$1(r))) {\n const instance = {\n toMatch,\n toContains,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n } else {\n const instance = {\n toMatch,\n toBe,\n toBeTruthy,\n toBeNull,\n toBeNaN,\n toBeUndefined,\n changed,\n changedTimes,\n get not() {\n return createUntil(r, !isNot);\n }\n };\n return instance;\n }\n}\nfunction until(r) {\n return createUntil(r);\n}\n\nfunction defaultComparator(value, othVal) {\n return value === othVal;\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayDifference(...args) {\n var _a, _b;\n const list = args[0];\n const values = args[1];\n let compareFn = (_a = args[2]) != null ? _a : defaultComparator;\n const {\n symmetric = false\n } = (_b = args[3]) != null ? _b : {};\n if (typeof compareFn === \"string\") {\n const key = compareFn;\n compareFn = (value, othVal) => value[key] === othVal[key];\n }\n const diff1 = computed(() => toValue$1(list).filter((x) => toValue$1(values).findIndex((y) => compareFn(x, y)) === -1));\n if (symmetric) {\n const diff2 = computed(() => toValue$1(values).filter((x) => toValue$1(list).findIndex((y) => compareFn(x, y)) === -1));\n return computed(() => symmetric ? [...toValue$1(diff1), ...toValue$1(diff2)] : toValue$1(diff1));\n } else {\n return diff1;\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayEvery(list, fn) {\n return computed(() => toValue$1(list).every((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFilter(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).filter(fn));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFind(list, fn) {\n return computed(() => toValue$1(\n toValue$1(list).find((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFindIndex(list, fn) {\n return computed(() => toValue$1(list).findIndex((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction findLast(arr, cb) {\n let index = arr.length;\n while (index-- > 0) {\n if (cb(arr[index], index, arr))\n return arr[index];\n }\n return void 0;\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayFindLast(list, fn) {\n return computed(() => toValue$1(\n !Array.prototype.findLast ? findLast(toValue$1(list), (element, index, array) => fn(toValue$1(element), index, array)) : toValue$1(list).findLast((element, index, array) => fn(toValue$1(element), index, array))\n ));\n}\n\nfunction isArrayIncludesOptions(obj) {\n return isObject(obj) && containsProp(obj, \"formIndex\", \"comparator\");\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayIncludes(...args) {\n var _a;\n const list = args[0];\n const value = args[1];\n let comparator = args[2];\n let formIndex = 0;\n if (isArrayIncludesOptions(comparator)) {\n formIndex = (_a = comparator.fromIndex) != null ? _a : 0;\n comparator = comparator.comparator;\n }\n if (typeof comparator === \"string\") {\n const key = comparator;\n comparator = (element, value2) => element[key] === toValue$1(value2);\n }\n comparator = comparator != null ? comparator : (element, value2) => element === toValue$1(value2);\n return computed(() => toValue$1(list).slice(formIndex).some((element, index, array) => comparator(\n toValue$1(element),\n toValue$1(value),\n index,\n toValue$1(array)\n )));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayJoin(list, separator) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).join(toValue$1(separator)));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayMap(list, fn) {\n return computed(() => toValue$1(list).map((i) => toValue$1(i)).map(fn));\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArrayReduce(list, reducer, ...args) {\n const reduceCallback = (sum, value, index) => reducer(toValue$1(sum), toValue$1(value), index);\n return computed(() => {\n const resolved = toValue$1(list);\n return args.length ? resolved.reduce(reduceCallback, typeof args[0] === \"function\" ? toValue$1(args[0]()) : toValue$1(args[0])) : resolved.reduce(reduceCallback);\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useArraySome(list, fn) {\n return computed(() => toValue$1(list).some((element, index, array) => fn(toValue$1(element), index, array)));\n}\n\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueElementsBy(array, fn) {\n return array.reduce((acc, v) => {\n if (!acc.some((x) => fn(v, x, array)))\n acc.push(v);\n return acc;\n }, []);\n}\n// @__NO_SIDE_EFFECTS__\nfunction useArrayUnique(list, compareFn) {\n return computed(() => {\n const resolvedList = toValue$1(list).map((element) => toValue$1(element));\n return compareFn ? uniqueElementsBy(resolvedList, compareFn) : uniq(resolvedList);\n });\n}\n\nfunction useCounter(initialValue = 0, options = {}) {\n let _initialValue = unref(initialValue);\n const count = shallowRef(initialValue);\n const {\n max = Number.POSITIVE_INFINITY,\n min = Number.NEGATIVE_INFINITY\n } = options;\n const inc = (delta = 1) => count.value = Math.max(Math.min(max, count.value + delta), min);\n const dec = (delta = 1) => count.value = Math.min(Math.max(min, count.value - delta), max);\n const get = () => count.value;\n const set = (val) => count.value = Math.max(min, Math.min(max, val));\n const reset = (val = _initialValue) => {\n _initialValue = val;\n return set(val);\n };\n return { count: shallowReadonly(count), inc, dec, get, set, reset };\n}\n\nconst REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[T\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/i;\nconst REGEX_FORMAT = /[YMDHhms]o|\\[([^\\]]+)\\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|z{1,4}|SSS/g;\nfunction defaultMeridiem(hours, minutes, isLowercase, hasPeriod) {\n let m = hours < 12 ? \"AM\" : \"PM\";\n if (hasPeriod)\n m = m.split(\"\").reduce((acc, curr) => acc += `${curr}.`, \"\");\n return isLowercase ? m.toLowerCase() : m;\n}\nfunction formatOrdinal(num) {\n const suffixes = [\"th\", \"st\", \"nd\", \"rd\"];\n const v = num % 100;\n return num + (suffixes[(v - 20) % 10] || suffixes[v] || suffixes[0]);\n}\nfunction formatDate(date, formatStr, options = {}) {\n var _a;\n const years = date.getFullYear();\n const month = date.getMonth();\n const days = date.getDate();\n const hours = date.getHours();\n const minutes = date.getMinutes();\n const seconds = date.getSeconds();\n const milliseconds = date.getMilliseconds();\n const day = date.getDay();\n const meridiem = (_a = options.customMeridiem) != null ? _a : defaultMeridiem;\n const stripTimeZone = (dateString) => {\n var _a2;\n return (_a2 = dateString.split(\" \")[1]) != null ? _a2 : \"\";\n };\n const matches = {\n Yo: () => formatOrdinal(years),\n YY: () => String(years).slice(-2),\n YYYY: () => years,\n M: () => month + 1,\n Mo: () => formatOrdinal(month + 1),\n MM: () => `${month + 1}`.padStart(2, \"0\"),\n MMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"short\" }),\n MMMM: () => date.toLocaleDateString(toValue$1(options.locales), { month: \"long\" }),\n D: () => String(days),\n Do: () => formatOrdinal(days),\n DD: () => `${days}`.padStart(2, \"0\"),\n H: () => String(hours),\n Ho: () => formatOrdinal(hours),\n HH: () => `${hours}`.padStart(2, \"0\"),\n h: () => `${hours % 12 || 12}`.padStart(1, \"0\"),\n ho: () => formatOrdinal(hours % 12 || 12),\n hh: () => `${hours % 12 || 12}`.padStart(2, \"0\"),\n m: () => String(minutes),\n mo: () => formatOrdinal(minutes),\n mm: () => `${minutes}`.padStart(2, \"0\"),\n s: () => String(seconds),\n so: () => formatOrdinal(seconds),\n ss: () => `${seconds}`.padStart(2, \"0\"),\n SSS: () => `${milliseconds}`.padStart(3, \"0\"),\n d: () => day,\n dd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"narrow\" }),\n ddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"short\" }),\n dddd: () => date.toLocaleDateString(toValue$1(options.locales), { weekday: \"long\" }),\n A: () => meridiem(hours, minutes),\n AA: () => meridiem(hours, minutes, false, true),\n a: () => meridiem(hours, minutes, true),\n aa: () => meridiem(hours, minutes, true, true),\n z: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"shortOffset\" })),\n zzzz: () => stripTimeZone(date.toLocaleDateString(toValue$1(options.locales), { timeZoneName: \"longOffset\" }))\n };\n return formatStr.replace(REGEX_FORMAT, (match, $1) => {\n var _a2, _b;\n return (_b = $1 != null ? $1 : (_a2 = matches[match]) == null ? void 0 : _a2.call(matches)) != null ? _b : match;\n });\n}\nfunction normalizeDate(date) {\n if (date === null)\n return new Date(Number.NaN);\n if (date === void 0)\n return /* @__PURE__ */ new Date();\n if (date instanceof Date)\n return new Date(date);\n if (typeof date === \"string\" && !/Z$/i.test(date)) {\n const d = date.match(REGEX_PARSE);\n if (d) {\n const m = d[2] - 1 || 0;\n const ms = (d[7] || \"0\").substring(0, 3);\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n}\n// @__NO_SIDE_EFFECTS__\nfunction useDateFormat(date, formatStr = \"HH:mm:ss\", options = {}) {\n return computed(() => formatDate(normalizeDate(toValue$1(date)), toValue$1(formatStr), options));\n}\n\nfunction useIntervalFn(cb, interval = 1e3, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n let timer = null;\n const isActive = shallowRef(false);\n function clean() {\n if (timer) {\n clearInterval(timer);\n timer = null;\n }\n }\n function pause() {\n isActive.value = false;\n clean();\n }\n function resume() {\n const intervalValue = toValue$1(interval);\n if (intervalValue <= 0)\n return;\n isActive.value = true;\n if (immediateCallback)\n cb();\n clean();\n if (isActive.value)\n timer = setInterval(cb, intervalValue);\n }\n if (immediate && isClient)\n resume();\n if (isRef(interval) || typeof interval === \"function\") {\n const stopWatch = watch(interval, () => {\n if (isActive.value && isClient)\n resume();\n });\n tryOnScopeDispose(stopWatch);\n }\n tryOnScopeDispose(pause);\n return {\n isActive: shallowReadonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useInterval(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n immediate = true,\n callback\n } = options;\n const counter = shallowRef(0);\n const update = () => counter.value += 1;\n const reset = () => {\n counter.value = 0;\n };\n const controls = useIntervalFn(\n callback ? () => {\n update();\n callback(counter.value);\n } : update,\n interval,\n { immediate }\n );\n if (exposeControls) {\n return {\n counter: shallowReadonly(counter),\n reset,\n ...controls\n };\n } else {\n return shallowReadonly(counter);\n }\n}\n\nfunction useLastChanged(source, options = {}) {\n var _a;\n const ms = shallowRef((_a = options.initialValue) != null ? _a : null);\n watch(\n source,\n () => ms.value = timestamp(),\n options\n );\n return shallowReadonly(ms);\n}\n\nfunction useTimeoutFn(cb, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const isPending = shallowRef(false);\n let timer;\n function clear() {\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n }\n function stop() {\n isPending.value = false;\n clear();\n }\n function start(...args) {\n if (immediateCallback)\n cb();\n clear();\n isPending.value = true;\n timer = setTimeout(() => {\n isPending.value = false;\n timer = void 0;\n cb(...args);\n }, toValue$1(interval));\n }\n if (immediate) {\n isPending.value = true;\n if (isClient)\n start();\n }\n tryOnScopeDispose(stop);\n return {\n isPending: shallowReadonly(isPending),\n start,\n stop\n };\n}\n\nfunction useTimeout(interval = 1e3, options = {}) {\n const {\n controls: exposeControls = false,\n callback\n } = options;\n const controls = useTimeoutFn(\n callback != null ? callback : noop,\n interval,\n options\n );\n const ready = computed(() => !controls.isPending.value);\n if (exposeControls) {\n return {\n ready,\n ...controls\n };\n } else {\n return ready;\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useToNumber(value, options = {}) {\n const {\n method = \"parseFloat\",\n radix,\n nanToZero\n } = options;\n return computed(() => {\n let resolved = toValue$1(value);\n if (typeof method === \"function\")\n resolved = method(resolved);\n else if (typeof resolved === \"string\")\n resolved = Number[method](resolved, radix);\n if (nanToZero && Number.isNaN(resolved))\n resolved = 0;\n return resolved;\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useToString(value) {\n return computed(() => `${toValue$1(value)}`);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useToggle(initialValue = false, options = {}) {\n const {\n truthyValue = true,\n falsyValue = false\n } = options;\n const valueIsRef = isRef(initialValue);\n const _value = shallowRef(initialValue);\n function toggle(value) {\n if (arguments.length) {\n _value.value = value;\n return _value.value;\n } else {\n const truthy = toValue$1(truthyValue);\n _value.value = _value.value === truthy ? toValue$1(falsyValue) : truthy;\n return _value.value;\n }\n }\n if (valueIsRef)\n return toggle;\n else\n return [_value, toggle];\n}\n\nfunction watchArray(source, cb, options) {\n let oldList = (options == null ? void 0 : options.immediate) ? [] : [...typeof source === \"function\" ? source() : Array.isArray(source) ? source : toValue$1(source)];\n return watch(source, (newList, _, onCleanup) => {\n const oldListRemains = Array.from({ length: oldList.length });\n const added = [];\n for (const obj of newList) {\n let found = false;\n for (let i = 0; i < oldList.length; i++) {\n if (!oldListRemains[i] && obj === oldList[i]) {\n oldListRemains[i] = true;\n found = true;\n break;\n }\n }\n if (!found)\n added.push(obj);\n }\n const removed = oldList.filter((_2, i) => !oldListRemains[i]);\n cb(newList, oldList, added, removed, onCleanup);\n oldList = [...newList];\n }, options);\n}\n\nfunction watchAtMost(source, cb, options) {\n const {\n count,\n ...watchOptions\n } = options;\n const current = shallowRef(0);\n const stop = watchWithFilter(\n source,\n (...args) => {\n current.value += 1;\n if (current.value >= toValue$1(count))\n nextTick(() => stop());\n cb(...args);\n },\n watchOptions\n );\n return { count: current, stop };\n}\n\nfunction watchDebounced(source, cb, options = {}) {\n const {\n debounce = 0,\n maxWait = void 0,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: debounceFilter(debounce, { maxWait })\n }\n );\n}\n\nfunction watchDeep(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n deep: true\n }\n );\n}\n\nfunction watchIgnorable(source, cb, options = {}) {\n const {\n eventFilter = bypassFilter,\n ...watchOptions\n } = options;\n const filteredCb = createFilterWrapper(\n eventFilter,\n cb\n );\n let ignoreUpdates;\n let ignorePrevAsyncUpdates;\n let stop;\n if (watchOptions.flush === \"sync\") {\n let ignore = false;\n ignorePrevAsyncUpdates = () => {\n };\n ignoreUpdates = (updater) => {\n ignore = true;\n updater();\n ignore = false;\n };\n stop = watch(\n source,\n (...args) => {\n if (!ignore)\n filteredCb(...args);\n },\n watchOptions\n );\n } else {\n const disposables = [];\n let ignoreCounter = 0;\n let syncCounter = 0;\n ignorePrevAsyncUpdates = () => {\n ignoreCounter = syncCounter;\n };\n disposables.push(\n watch(\n source,\n () => {\n syncCounter++;\n },\n { ...watchOptions, flush: \"sync\" }\n )\n );\n ignoreUpdates = (updater) => {\n const syncCounterPrev = syncCounter;\n updater();\n ignoreCounter += syncCounter - syncCounterPrev;\n };\n disposables.push(\n watch(\n source,\n (...args) => {\n const ignore = ignoreCounter > 0 && ignoreCounter === syncCounter;\n ignoreCounter = 0;\n syncCounter = 0;\n if (ignore)\n return;\n filteredCb(...args);\n },\n watchOptions\n )\n );\n stop = () => {\n disposables.forEach((fn) => fn());\n };\n }\n return { stop, ignoreUpdates, ignorePrevAsyncUpdates };\n}\n\nfunction watchImmediate(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n immediate: true\n }\n );\n}\n\nfunction watchOnce(source, cb, options) {\n return watch(\n source,\n cb,\n {\n ...options,\n once: true\n }\n );\n}\n\nfunction watchThrottled(source, cb, options = {}) {\n const {\n throttle = 0,\n trailing = true,\n leading = true,\n ...watchOptions\n } = options;\n return watchWithFilter(\n source,\n cb,\n {\n ...watchOptions,\n eventFilter: throttleFilter(throttle, trailing, leading)\n }\n );\n}\n\nfunction watchTriggerable(source, cb, options = {}) {\n let cleanupFn;\n function onEffect() {\n if (!cleanupFn)\n return;\n const fn = cleanupFn;\n cleanupFn = void 0;\n fn();\n }\n function onCleanup(callback) {\n cleanupFn = callback;\n }\n const _cb = (value, oldValue) => {\n onEffect();\n return cb(value, oldValue, onCleanup);\n };\n const res = watchIgnorable(source, _cb, options);\n const { ignoreUpdates } = res;\n const trigger = () => {\n let res2;\n ignoreUpdates(() => {\n res2 = _cb(getWatchSources(source), getOldValue(source));\n });\n return res2;\n };\n return {\n ...res,\n trigger\n };\n}\nfunction getWatchSources(sources) {\n if (isReactive(sources))\n return sources;\n if (Array.isArray(sources))\n return sources.map((item) => toValue$1(item));\n return toValue$1(sources);\n}\nfunction getOldValue(source) {\n return Array.isArray(source) ? source.map(() => void 0) : void 0;\n}\n\nfunction whenever(source, cb, options) {\n const stop = watch(\n source,\n (v, ov, onInvalidate) => {\n if (v) {\n if (options == null ? void 0 : options.once)\n nextTick(() => stop());\n cb(v, ov, onInvalidate);\n }\n },\n {\n ...options,\n once: false\n }\n );\n return stop;\n}\n\nexport { assert, refAutoReset as autoResetRef, bypassFilter, camelize, clamp, computedEager, computedWithControl, containsProp, computedWithControl as controlledComputed, controlledRef, createEventHook, createFilterWrapper, createGlobalState, createInjectionState, reactify as createReactiveFn, createRef, createSharedComposable, createSingletonPromise, debounceFilter, refDebounced as debouncedRef, watchDebounced as debouncedWatch, computedEager as eagerComputed, extendRef, formatDate, get, getLifeCycleTarget, hasOwn, hyphenate, identity, watchIgnorable as ignorableWatch, increaseWithUnit, injectLocal, invoke, isClient, isDef, isDefined, isIOS, isObject, isWorker, makeDestructurable, noop, normalizeDate, notNullish, now, objectEntries, objectOmit, objectPick, pausableFilter, watchPausable as pausableWatch, promiseTimeout, provideLocal, pxValue, rand, reactify, reactifyObject, reactiveComputed, reactiveOmit, reactivePick, refAutoReset, refDebounced, refDefault, refThrottled, refWithControl, resolveRef, resolveUnref, set, syncRef, syncRefs, throttleFilter, refThrottled as throttledRef, watchThrottled as throttledWatch, timestamp, toArray, toReactive, toRef, toRefs, toValue, tryOnBeforeMount, tryOnBeforeUnmount, tryOnMounted, tryOnScopeDispose, tryOnUnmounted, until, useArrayDifference, useArrayEvery, useArrayFilter, useArrayFind, useArrayFindIndex, useArrayFindLast, useArrayIncludes, useArrayJoin, useArrayMap, useArrayReduce, useArraySome, useArrayUnique, useCounter, useDateFormat, refDebounced as useDebounce, useDebounceFn, useInterval, useIntervalFn, useLastChanged, refThrottled as useThrottle, useThrottleFn, useTimeout, useTimeoutFn, useToNumber, useToString, useToggle, watchArray, watchAtMost, watchDebounced, watchDeep, watchIgnorable, watchImmediate, watchOnce, watchPausable, watchThrottled, watchTriggerable, watchWithFilter, whenever };\n","import { noop, makeDestructurable, camelize, isClient, toArray, watchImmediate, isObject, tryOnScopeDispose, isIOS, notNullish, tryOnMounted, objectOmit, promiseTimeout, until, injectLocal, provideLocal, pxValue, increaseWithUnit, objectEntries, createRef, createSingletonPromise, useTimeoutFn, pausableWatch, toRef, createEventHook, useIntervalFn, computedWithControl, timestamp, pausableFilter, watchIgnorable, debounceFilter, bypassFilter, createFilterWrapper, toRefs, watchOnce, containsProp, hasOwn, throttleFilter, useDebounceFn, useThrottleFn, tryOnUnmounted, clamp, syncRef, objectPick, watchWithFilter, identity, isDef, whenever, isWorker } from '@vueuse/shared';\nexport * from '@vueuse/shared';\nimport { isRef, shallowRef, ref, watchEffect, computed, inject, defineComponent, h, TransitionGroup, Fragment, shallowReactive, toValue, unref, getCurrentInstance, onMounted, watch, customRef, onUpdated, readonly, reactive, hasInjectionContext, toRaw, shallowReadonly, nextTick, markRaw, getCurrentScope, isReadonly, onBeforeUpdate } from 'vue';\n\nfunction computedAsync(evaluationCallback, initialState, optionsOrRef) {\n var _a;\n let options;\n if (isRef(optionsOrRef)) {\n options = {\n evaluating: optionsOrRef\n };\n } else {\n options = optionsOrRef || {};\n }\n const {\n lazy = false,\n flush = \"pre\",\n evaluating = void 0,\n shallow = true,\n onError = (_a = globalThis.reportError) != null ? _a : noop\n } = options;\n const started = shallowRef(!lazy);\n const current = shallow ? shallowRef(initialState) : ref(initialState);\n let counter = 0;\n watchEffect(async (onInvalidate) => {\n if (!started.value)\n return;\n counter++;\n const counterAtBeginning = counter;\n let hasFinished = false;\n if (evaluating) {\n Promise.resolve().then(() => {\n evaluating.value = true;\n });\n }\n try {\n const result = await evaluationCallback((cancelCallback) => {\n onInvalidate(() => {\n if (evaluating)\n evaluating.value = false;\n if (!hasFinished)\n cancelCallback();\n });\n });\n if (counterAtBeginning === counter)\n current.value = result;\n } catch (e) {\n onError(e);\n } finally {\n if (evaluating && counterAtBeginning === counter)\n evaluating.value = false;\n hasFinished = true;\n }\n }, { flush });\n if (lazy) {\n return computed(() => {\n started.value = true;\n return current.value;\n });\n } else {\n return current;\n }\n}\n\nfunction computedInject(key, options, defaultSource, treatDefaultAsFactory) {\n let source = inject(key);\n if (defaultSource)\n source = inject(key, defaultSource);\n if (treatDefaultAsFactory)\n source = inject(key, defaultSource, treatDefaultAsFactory);\n if (typeof options === \"function\") {\n return computed((oldValue) => options(source, oldValue));\n } else {\n return computed({\n get: (oldValue) => options.get(source, oldValue),\n set: options.set\n });\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createReusableTemplate(options = {}) {\n const {\n inheritAttrs = true\n } = options;\n const render = shallowRef();\n const define = /*@__PURE__*/ defineComponent({\n setup(_, { slots }) {\n return () => {\n render.value = slots.default;\n };\n }\n });\n const reuse = /*@__PURE__*/ defineComponent({\n inheritAttrs,\n props: options.props,\n setup(props, { attrs, slots }) {\n return () => {\n var _a;\n if (!render.value && process.env.NODE_ENV !== \"production\")\n throw new Error(\"[VueUse] Failed to find the definition of reusable template\");\n const vnode = (_a = render.value) == null ? void 0 : _a.call(render, {\n ...options.props == null ? keysToCamelKebabCase(attrs) : props,\n $slots: slots\n });\n return inheritAttrs && (vnode == null ? void 0 : vnode.length) === 1 ? vnode[0] : vnode;\n };\n }\n });\n return makeDestructurable(\n { define, reuse },\n [define, reuse]\n );\n}\nfunction keysToCamelKebabCase(obj) {\n const newObj = {};\n for (const key in obj)\n newObj[camelize(key)] = obj[key];\n return newObj;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createTemplatePromise(options = {}) {\n let index = 0;\n const instances = ref([]);\n function create(...args) {\n const props = shallowReactive({\n key: index++,\n args,\n promise: void 0,\n resolve: () => {\n },\n reject: () => {\n },\n isResolving: false,\n options\n });\n instances.value.push(props);\n props.promise = new Promise((_resolve, _reject) => {\n props.resolve = (v) => {\n props.isResolving = true;\n return _resolve(v);\n };\n props.reject = _reject;\n }).finally(() => {\n props.promise = void 0;\n const index2 = instances.value.indexOf(props);\n if (index2 !== -1)\n instances.value.splice(index2, 1);\n });\n return props.promise;\n }\n function start(...args) {\n if (options.singleton && instances.value.length > 0)\n return instances.value[0].promise;\n return create(...args);\n }\n const component = /*@__PURE__*/ defineComponent((_, { slots }) => {\n const renderList = () => instances.value.map((props) => {\n var _a;\n return h(Fragment, { key: props.key }, (_a = slots.default) == null ? void 0 : _a.call(slots, props));\n });\n if (options.transition)\n return () => h(TransitionGroup, options.transition, renderList);\n return renderList;\n });\n component.start = start;\n return component;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction createUnrefFn(fn) {\n return function(...args) {\n return fn.apply(this, args.map((i) => toValue(i)));\n };\n}\n\nconst defaultWindow = isClient ? window : void 0;\nconst defaultDocument = isClient ? window.document : void 0;\nconst defaultNavigator = isClient ? window.navigator : void 0;\nconst defaultLocation = isClient ? window.location : void 0;\n\nfunction unrefElement(elRef) {\n var _a;\n const plain = toValue(elRef);\n return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;\n}\n\nfunction useEventListener(...args) {\n const cleanups = [];\n const cleanup = () => {\n cleanups.forEach((fn) => fn());\n cleanups.length = 0;\n };\n const register = (el, event, listener, options) => {\n el.addEventListener(event, listener, options);\n return () => el.removeEventListener(event, listener, options);\n };\n const firstParamTargets = computed(() => {\n const test = toArray(toValue(args[0])).filter((e) => e != null);\n return test.every((e) => typeof e !== \"string\") ? test : void 0;\n });\n const stopWatch = watchImmediate(\n () => {\n var _a, _b;\n return [\n (_b = (_a = firstParamTargets.value) == null ? void 0 : _a.map((e) => unrefElement(e))) != null ? _b : [defaultWindow].filter((e) => e != null),\n toArray(toValue(firstParamTargets.value ? args[1] : args[0])),\n toArray(unref(firstParamTargets.value ? args[2] : args[1])),\n // @ts-expect-error - TypeScript gets the correct types, but somehow still complains\n toValue(firstParamTargets.value ? args[3] : args[2])\n ];\n },\n ([raw_targets, raw_events, raw_listeners, raw_options]) => {\n cleanup();\n if (!(raw_targets == null ? void 0 : raw_targets.length) || !(raw_events == null ? void 0 : raw_events.length) || !(raw_listeners == null ? void 0 : raw_listeners.length))\n return;\n const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;\n cleanups.push(\n ...raw_targets.flatMap(\n (el) => raw_events.flatMap(\n (event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))\n )\n )\n );\n },\n { flush: \"post\" }\n );\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(cleanup);\n return stop;\n}\n\nlet _iOSWorkaround = false;\nfunction onClickOutside(target, handler, options = {}) {\n const { window = defaultWindow, ignore = [], capture = true, detectIframe = false, controls = false } = options;\n if (!window) {\n return controls ? { stop: noop, cancel: noop, trigger: noop } : noop;\n }\n if (isIOS && !_iOSWorkaround) {\n _iOSWorkaround = true;\n const listenerOptions = { passive: true };\n Array.from(window.document.body.children).forEach((el) => el.addEventListener(\"click\", noop, listenerOptions));\n window.document.documentElement.addEventListener(\"click\", noop, listenerOptions);\n }\n let shouldListen = true;\n const shouldIgnore = (event) => {\n return toValue(ignore).some((target2) => {\n if (typeof target2 === \"string\") {\n return Array.from(window.document.querySelectorAll(target2)).some((el) => el === event.target || event.composedPath().includes(el));\n } else {\n const el = unrefElement(target2);\n return el && (event.target === el || event.composedPath().includes(el));\n }\n });\n };\n function hasMultipleRoots(target2) {\n const vm = toValue(target2);\n return vm && vm.$.subTree.shapeFlag === 16;\n }\n function checkMultipleRoots(target2, event) {\n const vm = toValue(target2);\n const children = vm.$.subTree && vm.$.subTree.children;\n if (children == null || !Array.isArray(children))\n return false;\n return children.some((child) => child.el === event.target || event.composedPath().includes(child.el));\n }\n const listener = (event) => {\n const el = unrefElement(target);\n if (event.target == null)\n return;\n if (!(el instanceof Element) && hasMultipleRoots(target) && checkMultipleRoots(target, event))\n return;\n if (!el || el === event.target || event.composedPath().includes(el))\n return;\n if (\"detail\" in event && event.detail === 0)\n shouldListen = !shouldIgnore(event);\n if (!shouldListen) {\n shouldListen = true;\n return;\n }\n handler(event);\n };\n let isProcessingClick = false;\n const cleanup = [\n useEventListener(window, \"click\", (event) => {\n if (!isProcessingClick) {\n isProcessingClick = true;\n setTimeout(() => {\n isProcessingClick = false;\n }, 0);\n listener(event);\n }\n }, { passive: true, capture }),\n useEventListener(window, \"pointerdown\", (e) => {\n const el = unrefElement(target);\n shouldListen = !shouldIgnore(e) && !!(el && !e.composedPath().includes(el));\n }, { passive: true }),\n detectIframe && useEventListener(window, \"blur\", (event) => {\n setTimeout(() => {\n var _a;\n const el = unrefElement(target);\n if (((_a = window.document.activeElement) == null ? void 0 : _a.tagName) === \"IFRAME\" && !(el == null ? void 0 : el.contains(window.document.activeElement))) {\n handler(event);\n }\n }, 0);\n }, { passive: true })\n ].filter(Boolean);\n const stop = () => cleanup.forEach((fn) => fn());\n if (controls) {\n return {\n stop,\n cancel: () => {\n shouldListen = false;\n },\n trigger: (event) => {\n shouldListen = true;\n listener(event);\n shouldListen = false;\n }\n };\n }\n return stop;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useMounted() {\n const isMounted = shallowRef(false);\n const instance = getCurrentInstance();\n if (instance) {\n onMounted(() => {\n isMounted.value = true;\n }, instance);\n }\n return isMounted;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useSupported(callback) {\n const isMounted = useMounted();\n return computed(() => {\n isMounted.value;\n return Boolean(callback());\n });\n}\n\nfunction useMutationObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...mutationOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"MutationObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const value = toValue(target);\n const items = toArray(value).map(unrefElement).filter(notNullish);\n return new Set(items);\n });\n const stopWatch = watch(\n targets,\n (newTargets) => {\n cleanup();\n if (isSupported.value && newTargets.size) {\n observer = new MutationObserver(callback);\n newTargets.forEach((el) => observer.observe(el, mutationOptions));\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const takeRecords = () => {\n return observer == null ? void 0 : observer.takeRecords();\n };\n const stop = () => {\n stopWatch();\n cleanup();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop,\n takeRecords\n };\n}\n\nfunction onElementRemoval(target, callback, options = {}) {\n const {\n window = defaultWindow,\n document = window == null ? void 0 : window.document,\n flush = \"sync\"\n } = options;\n if (!window || !document)\n return noop;\n let stopFn;\n const cleanupAndUpdate = (fn) => {\n stopFn == null ? void 0 : stopFn();\n stopFn = fn;\n };\n const stopWatch = watchEffect(() => {\n const el = unrefElement(target);\n if (el) {\n const { stop } = useMutationObserver(\n document,\n (mutationsList) => {\n const targetRemoved = mutationsList.map((mutation) => [...mutation.removedNodes]).flat().some((node) => node === el || node.contains(el));\n if (targetRemoved) {\n callback(mutationsList);\n }\n },\n {\n window,\n childList: true,\n subtree: true\n }\n );\n cleanupAndUpdate(stop);\n }\n }, { flush });\n const stopHandle = () => {\n stopWatch();\n cleanupAndUpdate();\n };\n tryOnScopeDispose(stopHandle);\n return stopHandle;\n}\n\nfunction createKeyPredicate(keyFilter) {\n if (typeof keyFilter === \"function\")\n return keyFilter;\n else if (typeof keyFilter === \"string\")\n return (event) => event.key === keyFilter;\n else if (Array.isArray(keyFilter))\n return (event) => keyFilter.includes(event.key);\n return () => true;\n}\nfunction onKeyStroke(...args) {\n let key;\n let handler;\n let options = {};\n if (args.length === 3) {\n key = args[0];\n handler = args[1];\n options = args[2];\n } else if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n key = true;\n handler = args[0];\n options = args[1];\n } else {\n key = args[0];\n handler = args[1];\n }\n } else {\n key = true;\n handler = args[0];\n }\n const {\n target = defaultWindow,\n eventName = \"keydown\",\n passive = false,\n dedupe = false\n } = options;\n const predicate = createKeyPredicate(key);\n const listener = (e) => {\n if (e.repeat && toValue(dedupe))\n return;\n if (predicate(e))\n handler(e);\n };\n return useEventListener(target, eventName, listener, passive);\n}\nfunction onKeyDown(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keydown\" });\n}\nfunction onKeyPressed(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keypress\" });\n}\nfunction onKeyUp(key, handler, options = {}) {\n return onKeyStroke(key, handler, { ...options, eventName: \"keyup\" });\n}\n\nconst DEFAULT_DELAY = 500;\nconst DEFAULT_THRESHOLD = 10;\nfunction onLongPress(target, handler, options) {\n var _a, _b;\n const elementRef = computed(() => unrefElement(target));\n let timeout;\n let posStart;\n let startTimestamp;\n let hasLongPressed = false;\n function clear() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = void 0;\n }\n posStart = void 0;\n startTimestamp = void 0;\n hasLongPressed = false;\n }\n function getDelay(ev) {\n const delay = options == null ? void 0 : options.delay;\n if (typeof delay === \"function\") {\n return delay(ev);\n }\n return delay != null ? delay : DEFAULT_DELAY;\n }\n function onRelease(ev) {\n var _a2, _b2, _c;\n const [_startTimestamp, _posStart, _hasLongPressed] = [startTimestamp, posStart, hasLongPressed];\n clear();\n if (!(options == null ? void 0 : options.onMouseUp) || !_posStart || !_startTimestamp)\n return;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - _posStart.x;\n const dy = ev.y - _posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n options.onMouseUp(ev.timeStamp - _startTimestamp, distance, _hasLongPressed);\n }\n function onDown(ev) {\n var _a2, _b2, _c;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n clear();\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n posStart = {\n x: ev.x,\n y: ev.y\n };\n startTimestamp = ev.timeStamp;\n timeout = setTimeout(\n () => {\n hasLongPressed = true;\n handler(ev);\n },\n getDelay(ev)\n );\n }\n function onMove(ev) {\n var _a2, _b2, _c, _d;\n if (((_a2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _a2.self) && ev.target !== elementRef.value)\n return;\n if (!posStart || (options == null ? void 0 : options.distanceThreshold) === false)\n return;\n if ((_b2 = options == null ? void 0 : options.modifiers) == null ? void 0 : _b2.prevent)\n ev.preventDefault();\n if ((_c = options == null ? void 0 : options.modifiers) == null ? void 0 : _c.stop)\n ev.stopPropagation();\n const dx = ev.x - posStart.x;\n const dy = ev.y - posStart.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n if (distance >= ((_d = options == null ? void 0 : options.distanceThreshold) != null ? _d : DEFAULT_THRESHOLD))\n clear();\n }\n const listenerOptions = {\n capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,\n once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once\n };\n const cleanup = [\n useEventListener(elementRef, \"pointerdown\", onDown, listenerOptions),\n useEventListener(elementRef, \"pointermove\", onMove, listenerOptions),\n useEventListener(elementRef, [\"pointerup\", \"pointerleave\"], onRelease, listenerOptions)\n ];\n const stop = () => cleanup.forEach((fn) => fn());\n return stop;\n}\n\nfunction isFocusedElementEditable() {\n const { activeElement, body } = document;\n if (!activeElement)\n return false;\n if (activeElement === body)\n return false;\n switch (activeElement.tagName) {\n case \"INPUT\":\n case \"TEXTAREA\":\n return true;\n }\n return activeElement.hasAttribute(\"contenteditable\");\n}\nfunction isTypedCharValid({\n keyCode,\n metaKey,\n ctrlKey,\n altKey\n}) {\n if (metaKey || ctrlKey || altKey)\n return false;\n if (keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 105)\n return true;\n if (keyCode >= 65 && keyCode <= 90)\n return true;\n return false;\n}\nfunction onStartTyping(callback, options = {}) {\n const { document: document2 = defaultDocument } = options;\n const keydown = (event) => {\n if (!isFocusedElementEditable() && isTypedCharValid(event)) {\n callback(event);\n }\n };\n if (document2)\n useEventListener(document2, \"keydown\", keydown, { passive: true });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction templateRef(key, initialValue = null) {\n const instance = getCurrentInstance();\n let _trigger = () => {\n };\n const element = customRef((track, trigger) => {\n _trigger = trigger;\n return {\n get() {\n var _a, _b;\n track();\n return (_b = (_a = instance == null ? void 0 : instance.proxy) == null ? void 0 : _a.$refs[key]) != null ? _b : initialValue;\n },\n set() {\n }\n };\n });\n tryOnMounted(_trigger);\n onUpdated(_trigger);\n return element;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useActiveElement(options = {}) {\n var _a;\n const {\n window = defaultWindow,\n deep = true,\n triggerOnRemoval = false\n } = options;\n const document = (_a = options.document) != null ? _a : window == null ? void 0 : window.document;\n const getDeepActiveElement = () => {\n var _a2;\n let element = document == null ? void 0 : document.activeElement;\n if (deep) {\n while (element == null ? void 0 : element.shadowRoot)\n element = (_a2 = element == null ? void 0 : element.shadowRoot) == null ? void 0 : _a2.activeElement;\n }\n return element;\n };\n const activeElement = shallowRef();\n const trigger = () => {\n activeElement.value = getDeepActiveElement();\n };\n if (window) {\n const listenerOptions = {\n capture: true,\n passive: true\n };\n useEventListener(\n window,\n \"blur\",\n (event) => {\n if (event.relatedTarget !== null)\n return;\n trigger();\n },\n listenerOptions\n );\n useEventListener(\n window,\n \"focus\",\n trigger,\n listenerOptions\n );\n }\n if (triggerOnRemoval) {\n onElementRemoval(activeElement, trigger, { document });\n }\n trigger();\n return activeElement;\n}\n\nfunction useRafFn(fn, options = {}) {\n const {\n immediate = true,\n fpsLimit = void 0,\n window = defaultWindow,\n once = false\n } = options;\n const isActive = shallowRef(false);\n const intervalLimit = computed(() => {\n return fpsLimit ? 1e3 / toValue(fpsLimit) : null;\n });\n let previousFrameTimestamp = 0;\n let rafId = null;\n function loop(timestamp) {\n if (!isActive.value || !window)\n return;\n if (!previousFrameTimestamp)\n previousFrameTimestamp = timestamp;\n const delta = timestamp - previousFrameTimestamp;\n if (intervalLimit.value && delta < intervalLimit.value) {\n rafId = window.requestAnimationFrame(loop);\n return;\n }\n previousFrameTimestamp = timestamp;\n fn({ delta, timestamp });\n if (once) {\n isActive.value = false;\n rafId = null;\n return;\n }\n rafId = window.requestAnimationFrame(loop);\n }\n function resume() {\n if (!isActive.value && window) {\n isActive.value = true;\n previousFrameTimestamp = 0;\n rafId = window.requestAnimationFrame(loop);\n }\n }\n function pause() {\n isActive.value = false;\n if (rafId != null && window) {\n window.cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n if (immediate)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive: readonly(isActive),\n pause,\n resume\n };\n}\n\nfunction useAnimate(target, keyframes, options) {\n let config;\n let animateOptions;\n if (isObject(options)) {\n config = options;\n animateOptions = objectOmit(options, [\"window\", \"immediate\", \"commitStyles\", \"persist\", \"onReady\", \"onError\"]);\n } else {\n config = { duration: options };\n animateOptions = options;\n }\n const {\n window = defaultWindow,\n immediate = true,\n commitStyles,\n persist,\n playbackRate: _playbackRate = 1,\n onReady,\n onError = (e) => {\n console.error(e);\n }\n } = config;\n const isSupported = useSupported(() => window && HTMLElement && \"animate\" in HTMLElement.prototype);\n const animate = shallowRef(void 0);\n const store = shallowReactive({\n startTime: null,\n currentTime: null,\n timeline: null,\n playbackRate: _playbackRate,\n pending: false,\n playState: immediate ? \"idle\" : \"paused\",\n replaceState: \"active\"\n });\n const pending = computed(() => store.pending);\n const playState = computed(() => store.playState);\n const replaceState = computed(() => store.replaceState);\n const startTime = computed({\n get() {\n return store.startTime;\n },\n set(value) {\n store.startTime = value;\n if (animate.value)\n animate.value.startTime = value;\n }\n });\n const currentTime = computed({\n get() {\n return store.currentTime;\n },\n set(value) {\n store.currentTime = value;\n if (animate.value) {\n animate.value.currentTime = value;\n syncResume();\n }\n }\n });\n const timeline = computed({\n get() {\n return store.timeline;\n },\n set(value) {\n store.timeline = value;\n if (animate.value)\n animate.value.timeline = value;\n }\n });\n const playbackRate = computed({\n get() {\n return store.playbackRate;\n },\n set(value) {\n store.playbackRate = value;\n if (animate.value)\n animate.value.playbackRate = value;\n }\n });\n const play = () => {\n if (animate.value) {\n try {\n animate.value.play();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n } else {\n update();\n }\n };\n const pause = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.pause();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const reverse = () => {\n var _a;\n if (!animate.value)\n update();\n try {\n (_a = animate.value) == null ? void 0 : _a.reverse();\n syncResume();\n } catch (e) {\n syncPause();\n onError(e);\n }\n };\n const finish = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.finish();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n const cancel = () => {\n var _a;\n try {\n (_a = animate.value) == null ? void 0 : _a.cancel();\n syncPause();\n } catch (e) {\n onError(e);\n }\n };\n watch(() => unrefElement(target), (el) => {\n if (el) {\n update(true);\n } else {\n animate.value = void 0;\n }\n });\n watch(() => keyframes, (value) => {\n if (animate.value) {\n update();\n const targetEl = unrefElement(target);\n if (targetEl) {\n animate.value.effect = new KeyframeEffect(\n targetEl,\n toValue(value),\n animateOptions\n );\n }\n }\n }, { deep: true });\n tryOnMounted(() => update(true), false);\n tryOnScopeDispose(cancel);\n function update(init) {\n const el = unrefElement(target);\n if (!isSupported.value || !el)\n return;\n if (!animate.value)\n animate.value = el.animate(toValue(keyframes), animateOptions);\n if (persist)\n animate.value.persist();\n if (_playbackRate !== 1)\n animate.value.playbackRate = _playbackRate;\n if (init && !immediate)\n animate.value.pause();\n else\n syncResume();\n onReady == null ? void 0 : onReady(animate.value);\n }\n const listenerOptions = { passive: true };\n useEventListener(animate, [\"cancel\", \"finish\", \"remove\"], syncPause, listenerOptions);\n useEventListener(animate, \"finish\", () => {\n var _a;\n if (commitStyles)\n (_a = animate.value) == null ? void 0 : _a.commitStyles();\n }, listenerOptions);\n const { resume: resumeRef, pause: pauseRef } = useRafFn(() => {\n if (!animate.value)\n return;\n store.pending = animate.value.pending;\n store.playState = animate.value.playState;\n store.replaceState = animate.value.replaceState;\n store.startTime = animate.value.startTime;\n store.currentTime = animate.value.currentTime;\n store.timeline = animate.value.timeline;\n store.playbackRate = animate.value.playbackRate;\n }, { immediate: false });\n function syncResume() {\n if (isSupported.value)\n resumeRef();\n }\n function syncPause() {\n if (isSupported.value && window)\n window.requestAnimationFrame(pauseRef);\n }\n return {\n isSupported,\n animate,\n // actions\n play,\n pause,\n reverse,\n finish,\n cancel,\n // state\n pending,\n playState,\n replaceState,\n startTime,\n currentTime,\n timeline,\n playbackRate\n };\n}\n\nfunction useAsyncQueue(tasks, options) {\n const {\n interrupt = true,\n onError = noop,\n onFinished = noop,\n signal\n } = options || {};\n const promiseState = {\n aborted: \"aborted\",\n fulfilled: \"fulfilled\",\n pending: \"pending\",\n rejected: \"rejected\"\n };\n const initialResult = Array.from(Array.from({ length: tasks.length }), () => ({ state: promiseState.pending, data: null }));\n const result = reactive(initialResult);\n const activeIndex = shallowRef(-1);\n if (!tasks || tasks.length === 0) {\n onFinished();\n return {\n activeIndex,\n result\n };\n }\n function updateResult(state, res) {\n activeIndex.value++;\n result[activeIndex.value].data = res;\n result[activeIndex.value].state = state;\n }\n tasks.reduce((prev, curr) => {\n return prev.then((prevRes) => {\n var _a;\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, new Error(\"aborted\"));\n return;\n }\n if (((_a = result[activeIndex.value]) == null ? void 0 : _a.state) === promiseState.rejected && interrupt) {\n onFinished();\n return;\n }\n const done = curr(prevRes).then((currentRes) => {\n updateResult(promiseState.fulfilled, currentRes);\n if (activeIndex.value === tasks.length - 1)\n onFinished();\n return currentRes;\n });\n if (!signal)\n return done;\n return Promise.race([done, whenAborted(signal)]);\n }).catch((e) => {\n if (signal == null ? void 0 : signal.aborted) {\n updateResult(promiseState.aborted, e);\n return e;\n }\n updateResult(promiseState.rejected, e);\n onError();\n return e;\n });\n }, Promise.resolve());\n return {\n activeIndex,\n result\n };\n}\nfunction whenAborted(signal) {\n return new Promise((resolve, reject) => {\n const error = new Error(\"aborted\");\n if (signal.aborted)\n reject(error);\n else\n signal.addEventListener(\"abort\", () => reject(error), { once: true });\n });\n}\n\nfunction useAsyncState(promise, initialState, options) {\n var _a;\n const {\n immediate = true,\n delay = 0,\n onError = (_a = globalThis.reportError) != null ? _a : noop,\n onSuccess = noop,\n resetOnExecute = true,\n shallow = true,\n throwError\n } = options != null ? options : {};\n const state = shallow ? shallowRef(initialState) : ref(initialState);\n const isReady = shallowRef(false);\n const isLoading = shallowRef(false);\n const error = shallowRef(void 0);\n async function execute(delay2 = 0, ...args) {\n if (resetOnExecute)\n state.value = toValue(initialState);\n error.value = void 0;\n isReady.value = false;\n isLoading.value = true;\n if (delay2 > 0)\n await promiseTimeout(delay2);\n const _promise = typeof promise === \"function\" ? promise(...args) : promise;\n try {\n const data = await _promise;\n state.value = data;\n isReady.value = true;\n onSuccess(data);\n } catch (e) {\n error.value = e;\n onError(e);\n if (throwError)\n throw e;\n } finally {\n isLoading.value = false;\n }\n return state.value;\n }\n if (immediate) {\n execute(delay);\n }\n const shell = {\n state,\n isReady,\n isLoading,\n error,\n execute,\n executeImmediate: (...args) => execute(0, ...args)\n };\n function waitUntilIsLoaded() {\n return new Promise((resolve, reject) => {\n until(isLoading).toBe(false).then(() => resolve(shell)).catch(reject);\n });\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilIsLoaded().then(onFulfilled, onRejected);\n }\n };\n}\n\nconst defaults = {\n array: (v) => JSON.stringify(v),\n object: (v) => JSON.stringify(v),\n set: (v) => JSON.stringify(Array.from(v)),\n map: (v) => JSON.stringify(Object.fromEntries(v)),\n null: () => \"\"\n};\nfunction getDefaultSerialization(target) {\n if (!target)\n return defaults.null;\n if (target instanceof Map)\n return defaults.map;\n else if (target instanceof Set)\n return defaults.set;\n else if (Array.isArray(target))\n return defaults.array;\n else\n return defaults.object;\n}\n\nfunction useBase64(target, options) {\n const base64 = shallowRef(\"\");\n const promise = shallowRef();\n function execute() {\n if (!isClient)\n return;\n promise.value = new Promise((resolve, reject) => {\n try {\n const _target = toValue(target);\n if (_target == null) {\n resolve(\"\");\n } else if (typeof _target === \"string\") {\n resolve(blobToBase64(new Blob([_target], { type: \"text/plain\" })));\n } else if (_target instanceof Blob) {\n resolve(blobToBase64(_target));\n } else if (_target instanceof ArrayBuffer) {\n resolve(window.btoa(String.fromCharCode(...new Uint8Array(_target))));\n } else if (_target instanceof HTMLCanvasElement) {\n resolve(_target.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n } else if (_target instanceof HTMLImageElement) {\n const img = _target.cloneNode(false);\n img.crossOrigin = \"Anonymous\";\n imgLoaded(img).then(() => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n resolve(canvas.toDataURL(options == null ? void 0 : options.type, options == null ? void 0 : options.quality));\n }).catch(reject);\n } else if (typeof _target === \"object\") {\n const _serializeFn = (options == null ? void 0 : options.serializer) || getDefaultSerialization(_target);\n const serialized = _serializeFn(_target);\n return resolve(blobToBase64(new Blob([serialized], { type: \"application/json\" })));\n } else {\n reject(new Error(\"target is unsupported types\"));\n }\n } catch (error) {\n reject(error);\n }\n });\n promise.value.then((res) => {\n base64.value = (options == null ? void 0 : options.dataUrl) === false ? res.replace(/^data:.*?;base64,/, \"\") : res;\n });\n return promise.value;\n }\n if (isRef(target) || typeof target === \"function\")\n watch(target, execute, { immediate: true });\n else\n execute();\n return {\n base64,\n promise,\n execute\n };\n}\nfunction imgLoaded(img) {\n return new Promise((resolve, reject) => {\n if (!img.complete) {\n img.onload = () => {\n resolve();\n };\n img.onerror = reject;\n } else {\n resolve();\n }\n });\n}\nfunction blobToBase64(blob) {\n return new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = (e) => {\n resolve(e.target.result);\n };\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useBattery(options = {}) {\n const { navigator = defaultNavigator } = options;\n const events = [\"chargingchange\", \"chargingtimechange\", \"dischargingtimechange\", \"levelchange\"];\n const isSupported = useSupported(() => navigator && \"getBattery\" in navigator && typeof navigator.getBattery === \"function\");\n const charging = shallowRef(false);\n const chargingTime = shallowRef(0);\n const dischargingTime = shallowRef(0);\n const level = shallowRef(1);\n let battery;\n function updateBatteryInfo() {\n charging.value = this.charging;\n chargingTime.value = this.chargingTime || 0;\n dischargingTime.value = this.dischargingTime || 0;\n level.value = this.level;\n }\n if (isSupported.value) {\n navigator.getBattery().then((_battery) => {\n battery = _battery;\n updateBatteryInfo.call(battery);\n useEventListener(battery, events, updateBatteryInfo, { passive: true });\n });\n }\n return {\n isSupported,\n charging,\n chargingTime,\n dischargingTime,\n level\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useBluetooth(options) {\n let {\n acceptAllDevices = false\n } = options || {};\n const {\n filters = void 0,\n optionalServices = void 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => navigator && \"bluetooth\" in navigator);\n const device = shallowRef();\n const error = shallowRef(null);\n watch(device, () => {\n connectToBluetoothGATTServer();\n });\n async function requestDevice() {\n if (!isSupported.value)\n return;\n error.value = null;\n if (filters && filters.length > 0)\n acceptAllDevices = false;\n try {\n device.value = await (navigator == null ? void 0 : navigator.bluetooth.requestDevice({\n acceptAllDevices,\n filters,\n optionalServices\n }));\n } catch (err) {\n error.value = err;\n }\n }\n const server = shallowRef();\n const isConnected = shallowRef(false);\n function reset() {\n isConnected.value = false;\n device.value = void 0;\n server.value = void 0;\n }\n async function connectToBluetoothGATTServer() {\n error.value = null;\n if (device.value && device.value.gatt) {\n useEventListener(device, \"gattserverdisconnected\", reset, { passive: true });\n try {\n server.value = await device.value.gatt.connect();\n isConnected.value = server.value.connected;\n } catch (err) {\n error.value = err;\n }\n }\n }\n tryOnMounted(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.connect();\n });\n tryOnScopeDispose(() => {\n var _a;\n if (device.value)\n (_a = device.value.gatt) == null ? void 0 : _a.disconnect();\n });\n return {\n isSupported,\n isConnected: readonly(isConnected),\n // Device:\n device,\n requestDevice,\n // Server:\n server,\n // Errors:\n error\n };\n}\n\nconst ssrWidthSymbol = Symbol(\"vueuse-ssr-width\");\n// @__NO_SIDE_EFFECTS__\nfunction useSSRWidth() {\n const ssrWidth = hasInjectionContext() ? injectLocal(ssrWidthSymbol, null) : null;\n return typeof ssrWidth === \"number\" ? ssrWidth : void 0;\n}\nfunction provideSSRWidth(width, app) {\n if (app !== void 0) {\n app.provide(ssrWidthSymbol, width);\n } else {\n provideLocal(ssrWidthSymbol, width);\n }\n}\n\nfunction useMediaQuery(query, options = {}) {\n const { window = defaultWindow, ssrWidth = useSSRWidth() } = options;\n const isSupported = useSupported(() => window && \"matchMedia\" in window && typeof window.matchMedia === \"function\");\n const ssrSupport = shallowRef(typeof ssrWidth === \"number\");\n const mediaQuery = shallowRef();\n const matches = shallowRef(false);\n const handler = (event) => {\n matches.value = event.matches;\n };\n watchEffect(() => {\n if (ssrSupport.value) {\n ssrSupport.value = !isSupported.value;\n const queryStrings = toValue(query).split(\",\");\n matches.value = queryStrings.some((queryString) => {\n const not = queryString.includes(\"not all\");\n const minWidth = queryString.match(/\\(\\s*min-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n const maxWidth = queryString.match(/\\(\\s*max-width:\\s*(-?\\d+(?:\\.\\d*)?[a-z]+\\s*)\\)/);\n let res = Boolean(minWidth || maxWidth);\n if (minWidth && res) {\n res = ssrWidth >= pxValue(minWidth[1]);\n }\n if (maxWidth && res) {\n res = ssrWidth <= pxValue(maxWidth[1]);\n }\n return not ? !res : res;\n });\n return;\n }\n if (!isSupported.value)\n return;\n mediaQuery.value = window.matchMedia(toValue(query));\n matches.value = mediaQuery.value.matches;\n });\n useEventListener(mediaQuery, \"change\", handler, { passive: true });\n return computed(() => matches.value);\n}\n\nconst breakpointsTailwind = {\n \"sm\": 640,\n \"md\": 768,\n \"lg\": 1024,\n \"xl\": 1280,\n \"2xl\": 1536\n};\nconst breakpointsBootstrapV5 = {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1400\n};\nconst breakpointsVuetifyV2 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1264,\n xl: 1904\n};\nconst breakpointsVuetifyV3 = {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n xxl: 2560\n};\nconst breakpointsVuetify = breakpointsVuetifyV2;\nconst breakpointsAntDesign = {\n xs: 480,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n};\nconst breakpointsQuasar = {\n xs: 0,\n sm: 600,\n md: 1024,\n lg: 1440,\n xl: 1920\n};\nconst breakpointsSematic = {\n mobileS: 320,\n mobileM: 375,\n mobileL: 425,\n tablet: 768,\n laptop: 1024,\n laptopL: 1440,\n desktop4K: 2560\n};\nconst breakpointsMasterCss = {\n \"3xs\": 360,\n \"2xs\": 480,\n \"xs\": 600,\n \"sm\": 768,\n \"md\": 1024,\n \"lg\": 1280,\n \"xl\": 1440,\n \"2xl\": 1600,\n \"3xl\": 1920,\n \"4xl\": 2560\n};\nconst breakpointsPrimeFlex = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200\n};\nconst breakpointsElement = {\n xs: 0,\n sm: 768,\n md: 992,\n lg: 1200,\n xl: 1920\n};\n\n// @__NO_SIDE_EFFECTS__\nfunction useBreakpoints(breakpoints, options = {}) {\n function getValue(k, delta) {\n let v = toValue(breakpoints[toValue(k)]);\n if (delta != null)\n v = increaseWithUnit(v, delta);\n if (typeof v === \"number\")\n v = `${v}px`;\n return v;\n }\n const { window = defaultWindow, strategy = \"min-width\", ssrWidth = useSSRWidth() } = options;\n const ssrSupport = typeof ssrWidth === \"number\";\n const mounted = ssrSupport ? shallowRef(false) : { value: true };\n if (ssrSupport) {\n tryOnMounted(() => mounted.value = !!window);\n }\n function match(query, size) {\n if (!mounted.value && ssrSupport) {\n return query === \"min\" ? ssrWidth >= pxValue(size) : ssrWidth <= pxValue(size);\n }\n if (!window)\n return false;\n return window.matchMedia(`(${query}-width: ${size})`).matches;\n }\n const greaterOrEqual = (k) => {\n return useMediaQuery(() => `(min-width: ${getValue(k)})`, options);\n };\n const smallerOrEqual = (k) => {\n return useMediaQuery(() => `(max-width: ${getValue(k)})`, options);\n };\n const shortcutMethods = Object.keys(breakpoints).reduce((shortcuts, k) => {\n Object.defineProperty(shortcuts, k, {\n get: () => strategy === \"min-width\" ? greaterOrEqual(k) : smallerOrEqual(k),\n enumerable: true,\n configurable: true\n });\n return shortcuts;\n }, {});\n function current() {\n const points = Object.keys(breakpoints).map((k) => [k, shortcutMethods[k], pxValue(getValue(k))]).sort((a, b) => a[2] - b[2]);\n return computed(() => points.filter(([, v]) => v.value).map(([k]) => k));\n }\n return Object.assign(shortcutMethods, {\n greaterOrEqual,\n smallerOrEqual,\n greater(k) {\n return useMediaQuery(() => `(min-width: ${getValue(k, 0.1)})`, options);\n },\n smaller(k) {\n return useMediaQuery(() => `(max-width: ${getValue(k, -0.1)})`, options);\n },\n between(a, b) {\n return useMediaQuery(() => `(min-width: ${getValue(a)}) and (max-width: ${getValue(b, -0.1)})`, options);\n },\n isGreater(k) {\n return match(\"min\", getValue(k, 0.1));\n },\n isGreaterOrEqual(k) {\n return match(\"min\", getValue(k));\n },\n isSmaller(k) {\n return match(\"max\", getValue(k, -0.1));\n },\n isSmallerOrEqual(k) {\n return match(\"max\", getValue(k));\n },\n isInBetween(a, b) {\n return match(\"min\", getValue(a)) && match(\"max\", getValue(b, -0.1));\n },\n current,\n active() {\n const bps = current();\n return computed(() => bps.value.length === 0 ? \"\" : bps.value.at(strategy === \"min-width\" ? -1 : 0));\n }\n });\n}\n\nfunction useBroadcastChannel(options) {\n const {\n name,\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"BroadcastChannel\" in window);\n const isClosed = shallowRef(false);\n const channel = ref();\n const data = ref();\n const error = shallowRef(null);\n const post = (data2) => {\n if (channel.value)\n channel.value.postMessage(data2);\n };\n const close = () => {\n if (channel.value)\n channel.value.close();\n isClosed.value = true;\n };\n if (isSupported.value) {\n tryOnMounted(() => {\n error.value = null;\n channel.value = new BroadcastChannel(name);\n const listenerOptions = {\n passive: true\n };\n useEventListener(channel, \"message\", (e) => {\n data.value = e.data;\n }, listenerOptions);\n useEventListener(channel, \"messageerror\", (e) => {\n error.value = e;\n }, listenerOptions);\n useEventListener(channel, \"close\", () => {\n isClosed.value = true;\n }, listenerOptions);\n });\n }\n tryOnScopeDispose(() => {\n close();\n });\n return {\n isSupported,\n channel,\n data,\n post,\n close,\n error,\n isClosed\n };\n}\n\nconst WRITABLE_PROPERTIES = [\n \"hash\",\n \"host\",\n \"hostname\",\n \"href\",\n \"pathname\",\n \"port\",\n \"protocol\",\n \"search\"\n];\n// @__NO_SIDE_EFFECTS__\nfunction useBrowserLocation(options = {}) {\n const { window = defaultWindow } = options;\n const refs = Object.fromEntries(\n WRITABLE_PROPERTIES.map((key) => [key, ref()])\n );\n for (const [key, ref] of objectEntries(refs)) {\n watch(ref, (value) => {\n if (!(window == null ? void 0 : window.location) || window.location[key] === value)\n return;\n window.location[key] = value;\n });\n }\n const buildState = (trigger) => {\n var _a;\n const { state: state2, length } = (window == null ? void 0 : window.history) || {};\n const { origin } = (window == null ? void 0 : window.location) || {};\n for (const key of WRITABLE_PROPERTIES)\n refs[key].value = (_a = window == null ? void 0 : window.location) == null ? void 0 : _a[key];\n return reactive({\n trigger,\n state: state2,\n length,\n origin,\n ...refs\n });\n };\n const state = ref(buildState(\"load\"));\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", () => state.value = buildState(\"popstate\"), listenerOptions);\n useEventListener(window, \"hashchange\", () => state.value = buildState(\"hashchange\"), listenerOptions);\n }\n return state;\n}\n\nfunction useCached(refValue, comparator = (a, b) => a === b, options) {\n const { deepRefs = true, ...watchOptions } = options || {};\n const cachedValue = createRef(refValue.value, deepRefs);\n watch(() => refValue.value, (value) => {\n if (!comparator(value, cachedValue.value))\n cachedValue.value = value;\n }, watchOptions);\n return cachedValue;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePermission(permissionDesc, options = {}) {\n const {\n controls = false,\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"permissions\" in navigator);\n const permissionStatus = shallowRef();\n const desc = typeof permissionDesc === \"string\" ? { name: permissionDesc } : permissionDesc;\n const state = shallowRef();\n const update = () => {\n var _a, _b;\n state.value = (_b = (_a = permissionStatus.value) == null ? void 0 : _a.state) != null ? _b : \"prompt\";\n };\n useEventListener(permissionStatus, \"change\", update, { passive: true });\n const query = createSingletonPromise(async () => {\n if (!isSupported.value)\n return;\n if (!permissionStatus.value) {\n try {\n permissionStatus.value = await navigator.permissions.query(desc);\n } catch (e) {\n permissionStatus.value = void 0;\n } finally {\n update();\n }\n }\n if (controls)\n return toRaw(permissionStatus.value);\n });\n query();\n if (controls) {\n return {\n state,\n isSupported,\n query\n };\n } else {\n return state;\n }\n}\n\nfunction useClipboard(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500,\n legacy = false\n } = options;\n const isClipboardApiSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const permissionRead = usePermission(\"clipboard-read\");\n const permissionWrite = usePermission(\"clipboard-write\");\n const isSupported = computed(() => isClipboardApiSupported.value || legacy);\n const text = shallowRef(\"\");\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n async function updateText() {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionRead.value));\n if (!useLegacy) {\n try {\n text.value = await navigator.clipboard.readText();\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy) {\n text.value = legacyRead();\n }\n }\n if (isSupported.value && read)\n useEventListener([\"copy\", \"cut\"], updateText, { passive: true });\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n let useLegacy = !(isClipboardApiSupported.value && isAllowed(permissionWrite.value));\n if (!useLegacy) {\n try {\n await navigator.clipboard.writeText(value);\n } catch (e) {\n useLegacy = true;\n }\n }\n if (useLegacy)\n legacyCopy(value);\n text.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n function legacyCopy(value) {\n const ta = document.createElement(\"textarea\");\n ta.value = value != null ? value : \"\";\n ta.style.position = \"absolute\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n function legacyRead() {\n var _a, _b, _c;\n return (_c = (_b = (_a = document == null ? void 0 : document.getSelection) == null ? void 0 : _a.call(document)) == null ? void 0 : _b.toString()) != null ? _c : \"\";\n }\n function isAllowed(status) {\n return status === \"granted\" || status === \"prompt\";\n }\n return {\n isSupported,\n text,\n copied,\n copy\n };\n}\n\nfunction useClipboardItems(options = {}) {\n const {\n navigator = defaultNavigator,\n read = false,\n source,\n copiedDuring = 1500\n } = options;\n const isSupported = useSupported(() => navigator && \"clipboard\" in navigator);\n const content = ref([]);\n const copied = shallowRef(false);\n const timeout = useTimeoutFn(() => copied.value = false, copiedDuring, { immediate: false });\n function updateContent() {\n if (isSupported.value) {\n navigator.clipboard.read().then((items) => {\n content.value = items;\n });\n }\n }\n if (isSupported.value && read) {\n useEventListener([\"copy\", \"cut\"], updateContent, { passive: true });\n }\n async function copy(value = toValue(source)) {\n if (isSupported.value && value != null) {\n await navigator.clipboard.write(value);\n content.value = value;\n copied.value = true;\n timeout.start();\n }\n }\n return {\n isSupported,\n content: shallowReadonly(content),\n copied: readonly(copied),\n copy,\n read: updateContent\n };\n}\n\nfunction cloneFnJSON(source) {\n return JSON.parse(JSON.stringify(source));\n}\nfunction useCloned(source, options = {}) {\n const cloned = ref({});\n const isModified = shallowRef(false);\n let _lastSync = false;\n const {\n manual,\n clone = cloneFnJSON,\n // watch options\n deep = true,\n immediate = true\n } = options;\n watch(cloned, () => {\n if (_lastSync) {\n _lastSync = false;\n return;\n }\n isModified.value = true;\n }, {\n deep: true,\n flush: \"sync\"\n });\n function sync() {\n _lastSync = true;\n isModified.value = false;\n cloned.value = clone(toValue(source));\n }\n if (!manual && (isRef(source) || typeof source === \"function\")) {\n watch(source, sync, {\n ...options,\n deep,\n immediate\n });\n } else {\n sync();\n }\n return { cloned, isModified, sync };\n}\n\nconst _global = typeof globalThis !== \"undefined\" ? globalThis : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : {};\nconst globalKey = \"__vueuse_ssr_handlers__\";\nconst handlers = /* @__PURE__ */ getHandlers();\nfunction getHandlers() {\n if (!(globalKey in _global))\n _global[globalKey] = _global[globalKey] || {};\n return _global[globalKey];\n}\nfunction getSSRHandler(key, fallback) {\n return handlers[key] || fallback;\n}\nfunction setSSRHandler(key, fn) {\n handlers[key] = fn;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredDark(options) {\n return useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n}\n\nfunction guessSerializerType(rawInit) {\n return rawInit == null ? \"any\" : rawInit instanceof Set ? \"set\" : rawInit instanceof Map ? \"map\" : rawInit instanceof Date ? \"date\" : typeof rawInit === \"boolean\" ? \"boolean\" : typeof rawInit === \"string\" ? \"string\" : typeof rawInit === \"object\" ? \"object\" : !Number.isNaN(rawInit) ? \"number\" : \"any\";\n}\n\nconst StorageSerializers = {\n boolean: {\n read: (v) => v === \"true\",\n write: (v) => String(v)\n },\n object: {\n read: (v) => JSON.parse(v),\n write: (v) => JSON.stringify(v)\n },\n number: {\n read: (v) => Number.parseFloat(v),\n write: (v) => String(v)\n },\n any: {\n read: (v) => v,\n write: (v) => String(v)\n },\n string: {\n read: (v) => v,\n write: (v) => String(v)\n },\n map: {\n read: (v) => new Map(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v.entries()))\n },\n set: {\n read: (v) => new Set(JSON.parse(v)),\n write: (v) => JSON.stringify(Array.from(v))\n },\n date: {\n read: (v) => new Date(v),\n write: (v) => v.toISOString()\n }\n};\nconst customStorageEventName = \"vueuse-storage\";\nfunction useStorage(key, defaults, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n initOnMounted\n } = options;\n const data = (shallow ? shallowRef : ref)(typeof defaults === \"function\" ? defaults() : defaults);\n const keyComputed = computed(() => toValue(key));\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorage\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n if (!storage)\n return data;\n const rawInit = toValue(defaults);\n const type = guessSerializerType(rawInit);\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n const { pause: pauseWatch, resume: resumeWatch } = pausableWatch(\n data,\n (newValue) => write(newValue),\n { flush, deep, eventFilter }\n );\n watch(keyComputed, () => update(), { flush });\n let firstMounted = false;\n const onStorageEvent = (ev) => {\n if (initOnMounted && !firstMounted) {\n return;\n }\n update(ev);\n };\n const onStorageCustomEvent = (ev) => {\n if (initOnMounted && !firstMounted) {\n return;\n }\n updateFromCustomEvent(ev);\n };\n if (window && listenToStorageChanges) {\n if (storage instanceof Storage)\n useEventListener(window, \"storage\", onStorageEvent, { passive: true });\n else\n useEventListener(window, customStorageEventName, onStorageCustomEvent);\n }\n if (initOnMounted) {\n tryOnMounted(() => {\n firstMounted = true;\n update();\n });\n } else {\n update();\n }\n function dispatchWriteEvent(oldValue, newValue) {\n if (window) {\n const payload = {\n key: keyComputed.value,\n oldValue,\n newValue,\n storageArea: storage\n };\n window.dispatchEvent(storage instanceof Storage ? new StorageEvent(\"storage\", payload) : new CustomEvent(customStorageEventName, {\n detail: payload\n }));\n }\n }\n function write(v) {\n try {\n const oldValue = storage.getItem(keyComputed.value);\n if (v == null) {\n dispatchWriteEvent(oldValue, null);\n storage.removeItem(keyComputed.value);\n } else {\n const serialized = serializer.write(v);\n if (oldValue !== serialized) {\n storage.setItem(keyComputed.value, serialized);\n dispatchWriteEvent(oldValue, serialized);\n }\n }\n } catch (e) {\n onError(e);\n }\n }\n function read(event) {\n const rawValue = event ? event.newValue : storage.getItem(keyComputed.value);\n if (rawValue == null) {\n if (writeDefaults && rawInit != null)\n storage.setItem(keyComputed.value, serializer.write(rawInit));\n return rawInit;\n } else if (!event && mergeDefaults) {\n const value = serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n return mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n return { ...rawInit, ...value };\n return value;\n } else if (typeof rawValue !== \"string\") {\n return rawValue;\n } else {\n return serializer.read(rawValue);\n }\n }\n function update(event) {\n if (event && event.storageArea !== storage)\n return;\n if (event && event.key == null) {\n data.value = rawInit;\n return;\n }\n if (event && event.key !== keyComputed.value) {\n return;\n }\n pauseWatch();\n try {\n const serializedData = serializer.write(data.value);\n if (event === void 0 || (event == null ? void 0 : event.newValue) !== serializedData) {\n data.value = read(event);\n }\n } catch (e) {\n onError(e);\n } finally {\n if (event)\n nextTick(resumeWatch);\n else\n resumeWatch();\n }\n }\n function updateFromCustomEvent(event) {\n update(event.detail);\n }\n return data;\n}\n\nconst CSS_DISABLE_TRANS = \"*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}\";\nfunction useColorMode(options = {}) {\n const {\n selector = \"html\",\n attribute = \"class\",\n initialValue = \"auto\",\n window = defaultWindow,\n storage,\n storageKey = \"vueuse-color-scheme\",\n listenToStorageChanges = true,\n storageRef,\n emitAuto,\n disableTransition = true\n } = options;\n const modes = {\n auto: \"\",\n light: \"light\",\n dark: \"dark\",\n ...options.modes || {}\n };\n const preferredDark = usePreferredDark({ window });\n const system = computed(() => preferredDark.value ? \"dark\" : \"light\");\n const store = storageRef || (storageKey == null ? toRef(initialValue) : useStorage(storageKey, initialValue, storage, { window, listenToStorageChanges }));\n const state = computed(() => store.value === \"auto\" ? system.value : store.value);\n const updateHTMLAttrs = getSSRHandler(\n \"updateHTMLAttrs\",\n (selector2, attribute2, value) => {\n const el = typeof selector2 === \"string\" ? window == null ? void 0 : window.document.querySelector(selector2) : unrefElement(selector2);\n if (!el)\n return;\n const classesToAdd = /* @__PURE__ */ new Set();\n const classesToRemove = /* @__PURE__ */ new Set();\n let attributeToChange = null;\n if (attribute2 === \"class\") {\n const current = value.split(/\\s/g);\n Object.values(modes).flatMap((i) => (i || \"\").split(/\\s/g)).filter(Boolean).forEach((v) => {\n if (current.includes(v))\n classesToAdd.add(v);\n else\n classesToRemove.add(v);\n });\n } else {\n attributeToChange = { key: attribute2, value };\n }\n if (classesToAdd.size === 0 && classesToRemove.size === 0 && attributeToChange === null)\n return;\n let style;\n if (disableTransition) {\n style = window.document.createElement(\"style\");\n style.appendChild(document.createTextNode(CSS_DISABLE_TRANS));\n window.document.head.appendChild(style);\n }\n for (const c of classesToAdd) {\n el.classList.add(c);\n }\n for (const c of classesToRemove) {\n el.classList.remove(c);\n }\n if (attributeToChange) {\n el.setAttribute(attributeToChange.key, attributeToChange.value);\n }\n if (disableTransition) {\n window.getComputedStyle(style).opacity;\n document.head.removeChild(style);\n }\n }\n );\n function defaultOnChanged(mode) {\n var _a;\n updateHTMLAttrs(selector, attribute, (_a = modes[mode]) != null ? _a : mode);\n }\n function onChanged(mode) {\n if (options.onChanged)\n options.onChanged(mode, defaultOnChanged);\n else\n defaultOnChanged(mode);\n }\n watch(state, onChanged, { flush: \"post\", immediate: true });\n tryOnMounted(() => onChanged(state.value));\n const auto = computed({\n get() {\n return emitAuto ? store.value : state.value;\n },\n set(v) {\n store.value = v;\n }\n });\n return Object.assign(auto, { store, system, state });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useConfirmDialog(revealed = shallowRef(false)) {\n const confirmHook = createEventHook();\n const cancelHook = createEventHook();\n const revealHook = createEventHook();\n let _resolve = noop;\n const reveal = (data) => {\n revealHook.trigger(data);\n revealed.value = true;\n return new Promise((resolve) => {\n _resolve = resolve;\n });\n };\n const confirm = (data) => {\n revealed.value = false;\n confirmHook.trigger(data);\n _resolve({ data, isCanceled: false });\n };\n const cancel = (data) => {\n revealed.value = false;\n cancelHook.trigger(data);\n _resolve({ data, isCanceled: true });\n };\n return {\n isRevealed: computed(() => revealed.value),\n reveal,\n confirm,\n cancel,\n onReveal: revealHook.on,\n onConfirm: confirmHook.on,\n onCancel: cancelHook.on\n };\n}\n\nfunction useCountdown(initialCountdown, options) {\n var _a, _b;\n const remaining = shallowRef(toValue(initialCountdown));\n const intervalController = useIntervalFn(() => {\n var _a2, _b2;\n const value = remaining.value - 1;\n remaining.value = value < 0 ? 0 : value;\n (_a2 = options == null ? void 0 : options.onTick) == null ? void 0 : _a2.call(options);\n if (remaining.value <= 0) {\n intervalController.pause();\n (_b2 = options == null ? void 0 : options.onComplete) == null ? void 0 : _b2.call(options);\n }\n }, (_a = options == null ? void 0 : options.interval) != null ? _a : 1e3, { immediate: (_b = options == null ? void 0 : options.immediate) != null ? _b : false });\n const reset = (countdown) => {\n var _a2;\n remaining.value = (_a2 = toValue(countdown)) != null ? _a2 : toValue(initialCountdown);\n };\n const stop = () => {\n intervalController.pause();\n reset();\n };\n const resume = () => {\n if (!intervalController.isActive.value) {\n if (remaining.value > 0) {\n intervalController.resume();\n }\n }\n };\n const start = (countdown) => {\n reset(countdown);\n intervalController.resume();\n };\n return {\n remaining,\n reset,\n stop,\n start,\n pause: intervalController.pause,\n resume,\n isActive: intervalController.isActive\n };\n}\n\nfunction useCssVar(prop, target, options = {}) {\n const { window = defaultWindow, initialValue, observe = false } = options;\n const variable = shallowRef(initialValue);\n const elRef = computed(() => {\n var _a;\n return unrefElement(target) || ((_a = window == null ? void 0 : window.document) == null ? void 0 : _a.documentElement);\n });\n function updateCssVar() {\n var _a;\n const key = toValue(prop);\n const el = toValue(elRef);\n if (el && window && key) {\n const value = (_a = window.getComputedStyle(el).getPropertyValue(key)) == null ? void 0 : _a.trim();\n variable.value = value || variable.value || initialValue;\n }\n }\n if (observe) {\n useMutationObserver(elRef, updateCssVar, {\n attributeFilter: [\"style\", \"class\"],\n window\n });\n }\n watch(\n [elRef, () => toValue(prop)],\n (_, old) => {\n if (old[0] && old[1])\n old[0].style.removeProperty(old[1]);\n updateCssVar();\n },\n { immediate: true }\n );\n watch(\n [variable, elRef],\n ([val, el]) => {\n const raw_prop = toValue(prop);\n if ((el == null ? void 0 : el.style) && raw_prop) {\n if (val == null)\n el.style.removeProperty(raw_prop);\n else\n el.style.setProperty(raw_prop, val);\n }\n },\n { immediate: true }\n );\n return variable;\n}\n\nfunction useCurrentElement(rootComponent) {\n const vm = getCurrentInstance();\n const currentElement = computedWithControl(\n () => null,\n () => rootComponent ? unrefElement(rootComponent) : vm.proxy.$el\n );\n onUpdated(currentElement.trigger);\n onMounted(currentElement.trigger);\n return currentElement;\n}\n\nfunction useCycleList(list, options) {\n const state = shallowRef(getInitialValue());\n const listRef = toRef(list);\n const index = computed({\n get() {\n var _a;\n const targetList = listRef.value;\n let index2 = (options == null ? void 0 : options.getIndexOf) ? options.getIndexOf(state.value, targetList) : targetList.indexOf(state.value);\n if (index2 < 0)\n index2 = (_a = options == null ? void 0 : options.fallbackIndex) != null ? _a : 0;\n return index2;\n },\n set(v) {\n set(v);\n }\n });\n function set(i) {\n const targetList = listRef.value;\n const length = targetList.length;\n const index2 = (i % length + length) % length;\n const value = targetList[index2];\n state.value = value;\n return value;\n }\n function shift(delta = 1) {\n return set(index.value + delta);\n }\n function next(n = 1) {\n return shift(n);\n }\n function prev(n = 1) {\n return shift(-n);\n }\n function getInitialValue() {\n var _a, _b;\n return (_b = toValue((_a = options == null ? void 0 : options.initialValue) != null ? _a : toValue(list)[0])) != null ? _b : void 0;\n }\n watch(listRef, () => set(index.value));\n return {\n state,\n index,\n next,\n prev,\n go: set\n };\n}\n\nfunction useDark(options = {}) {\n const {\n valueDark = \"dark\",\n valueLight = \"\"\n } = options;\n const mode = useColorMode({\n ...options,\n onChanged: (mode2, defaultHandler) => {\n var _a;\n if (options.onChanged)\n (_a = options.onChanged) == null ? void 0 : _a.call(options, mode2 === \"dark\", defaultHandler, mode2);\n else\n defaultHandler(mode2);\n },\n modes: {\n dark: valueDark,\n light: valueLight\n }\n });\n const system = computed(() => mode.system.value);\n const isDark = computed({\n get() {\n return mode.value === \"dark\";\n },\n set(v) {\n const modeVal = v ? \"dark\" : \"light\";\n if (system.value === modeVal)\n mode.value = \"auto\";\n else\n mode.value = modeVal;\n }\n });\n return isDark;\n}\n\nfunction fnBypass(v) {\n return v;\n}\nfunction fnSetSource(source, value) {\n return source.value = value;\n}\nfunction defaultDump(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction defaultParse(clone) {\n return clone ? typeof clone === \"function\" ? clone : cloneFnJSON : fnBypass;\n}\nfunction useManualRefHistory(source, options = {}) {\n const {\n clone = false,\n dump = defaultDump(clone),\n parse = defaultParse(clone),\n setSource = fnSetSource\n } = options;\n function _createHistoryRecord() {\n return markRaw({\n snapshot: dump(source.value),\n timestamp: timestamp()\n });\n }\n const last = ref(_createHistoryRecord());\n const undoStack = ref([]);\n const redoStack = ref([]);\n const _setSource = (record) => {\n setSource(source, parse(record.snapshot));\n last.value = record;\n };\n const commit = () => {\n undoStack.value.unshift(last.value);\n last.value = _createHistoryRecord();\n if (options.capacity && undoStack.value.length > options.capacity)\n undoStack.value.splice(options.capacity, Number.POSITIVE_INFINITY);\n if (redoStack.value.length)\n redoStack.value.splice(0, redoStack.value.length);\n };\n const clear = () => {\n undoStack.value.splice(0, undoStack.value.length);\n redoStack.value.splice(0, redoStack.value.length);\n };\n const undo = () => {\n const state = undoStack.value.shift();\n if (state) {\n redoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const redo = () => {\n const state = redoStack.value.shift();\n if (state) {\n undoStack.value.unshift(last.value);\n _setSource(state);\n }\n };\n const reset = () => {\n _setSource(last.value);\n };\n const history = computed(() => [last.value, ...undoStack.value]);\n const canUndo = computed(() => undoStack.value.length > 0);\n const canRedo = computed(() => redoStack.value.length > 0);\n return {\n source,\n undoStack,\n redoStack,\n last,\n history,\n canUndo,\n canRedo,\n clear,\n commit,\n reset,\n undo,\n redo\n };\n}\n\nfunction useRefHistory(source, options = {}) {\n const {\n deep = false,\n flush = \"pre\",\n eventFilter,\n shouldCommit = () => true\n } = options;\n const {\n eventFilter: composedFilter,\n pause,\n resume: resumeTracking,\n isActive: isTracking\n } = pausableFilter(eventFilter);\n let lastRawValue = source.value;\n const {\n ignoreUpdates,\n ignorePrevAsyncUpdates,\n stop\n } = watchIgnorable(\n source,\n commit,\n { deep, flush, eventFilter: composedFilter }\n );\n function setSource(source2, value) {\n ignorePrevAsyncUpdates();\n ignoreUpdates(() => {\n source2.value = value;\n lastRawValue = value;\n });\n }\n const manualHistory = useManualRefHistory(source, { ...options, clone: options.clone || deep, setSource });\n const { clear, commit: manualCommit } = manualHistory;\n function commit() {\n ignorePrevAsyncUpdates();\n if (!shouldCommit(lastRawValue, source.value))\n return;\n lastRawValue = source.value;\n manualCommit();\n }\n function resume(commitNow) {\n resumeTracking();\n if (commitNow)\n commit();\n }\n function batch(fn) {\n let canceled = false;\n const cancel = () => canceled = true;\n ignoreUpdates(() => {\n fn(cancel);\n });\n if (!canceled)\n commit();\n }\n function dispose() {\n stop();\n clear();\n }\n return {\n ...manualHistory,\n isTracking,\n pause,\n resume,\n commit,\n batch,\n dispose\n };\n}\n\nfunction useDebouncedRefHistory(source, options = {}) {\n const filter = options.debounce ? debounceFilter(options.debounce) : void 0;\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nfunction useDeviceMotion(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions = false,\n eventFilter = bypassFilter\n } = options;\n const isSupported = useSupported(() => typeof DeviceMotionEvent !== \"undefined\");\n const requirePermissions = useSupported(() => isSupported.value && \"requestPermission\" in DeviceMotionEvent && typeof DeviceMotionEvent.requestPermission === \"function\");\n const permissionGranted = shallowRef(false);\n const acceleration = ref({ x: null, y: null, z: null });\n const rotationRate = ref({ alpha: null, beta: null, gamma: null });\n const interval = shallowRef(0);\n const accelerationIncludingGravity = ref({\n x: null,\n y: null,\n z: null\n });\n function init() {\n if (window) {\n const onDeviceMotion = createFilterWrapper(\n eventFilter,\n (event) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n acceleration.value = {\n x: ((_a = event.acceleration) == null ? void 0 : _a.x) || null,\n y: ((_b = event.acceleration) == null ? void 0 : _b.y) || null,\n z: ((_c = event.acceleration) == null ? void 0 : _c.z) || null\n };\n accelerationIncludingGravity.value = {\n x: ((_d = event.accelerationIncludingGravity) == null ? void 0 : _d.x) || null,\n y: ((_e = event.accelerationIncludingGravity) == null ? void 0 : _e.y) || null,\n z: ((_f = event.accelerationIncludingGravity) == null ? void 0 : _f.z) || null\n };\n rotationRate.value = {\n alpha: ((_g = event.rotationRate) == null ? void 0 : _g.alpha) || null,\n beta: ((_h = event.rotationRate) == null ? void 0 : _h.beta) || null,\n gamma: ((_i = event.rotationRate) == null ? void 0 : _i.gamma) || null\n };\n interval.value = event.interval;\n }\n );\n useEventListener(window, \"devicemotion\", onDeviceMotion, { passive: true });\n }\n }\n const ensurePermissions = async () => {\n if (!requirePermissions.value)\n permissionGranted.value = true;\n if (permissionGranted.value)\n return;\n if (requirePermissions.value) {\n const requestPermission = DeviceMotionEvent.requestPermission;\n try {\n const response = await requestPermission();\n if (response === \"granted\") {\n permissionGranted.value = true;\n init();\n }\n } catch (error) {\n console.error(error);\n }\n }\n };\n if (isSupported.value) {\n if (requestPermissions && requirePermissions.value) {\n ensurePermissions().then(() => init());\n } else {\n init();\n }\n }\n return {\n acceleration,\n accelerationIncludingGravity,\n rotationRate,\n interval,\n isSupported,\n requirePermissions,\n ensurePermissions,\n permissionGranted\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDeviceOrientation(options = {}) {\n const { window = defaultWindow } = options;\n const isSupported = useSupported(() => window && \"DeviceOrientationEvent\" in window);\n const isAbsolute = shallowRef(false);\n const alpha = shallowRef(null);\n const beta = shallowRef(null);\n const gamma = shallowRef(null);\n if (window && isSupported.value) {\n useEventListener(window, \"deviceorientation\", (event) => {\n isAbsolute.value = event.absolute;\n alpha.value = event.alpha;\n beta.value = event.beta;\n gamma.value = event.gamma;\n }, { passive: true });\n }\n return {\n isSupported,\n isAbsolute,\n alpha,\n beta,\n gamma\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDevicePixelRatio(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const pixelRatio = shallowRef(1);\n const query = useMediaQuery(() => `(resolution: ${pixelRatio.value}dppx)`, options);\n let stop = noop;\n if (window) {\n stop = watchImmediate(query, () => pixelRatio.value = window.devicePixelRatio);\n }\n return {\n pixelRatio: readonly(pixelRatio),\n stop\n };\n}\n\nfunction useDevicesList(options = {}) {\n const {\n navigator = defaultNavigator,\n requestPermissions = false,\n constraints = { audio: true, video: true },\n onUpdated\n } = options;\n const devices = ref([]);\n const videoInputs = computed(() => devices.value.filter((i) => i.kind === \"videoinput\"));\n const audioInputs = computed(() => devices.value.filter((i) => i.kind === \"audioinput\"));\n const audioOutputs = computed(() => devices.value.filter((i) => i.kind === \"audiooutput\"));\n const isSupported = useSupported(() => navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n const permissionGranted = shallowRef(false);\n let stream;\n async function update() {\n if (!isSupported.value)\n return;\n devices.value = await navigator.mediaDevices.enumerateDevices();\n onUpdated == null ? void 0 : onUpdated(devices.value);\n if (stream) {\n stream.getTracks().forEach((t) => t.stop());\n stream = null;\n }\n }\n async function ensurePermissions() {\n const deviceName = constraints.video ? \"camera\" : \"microphone\";\n if (!isSupported.value)\n return false;\n if (permissionGranted.value)\n return true;\n const { state, query } = usePermission(deviceName, { controls: true });\n await query();\n if (state.value !== \"granted\") {\n let granted = true;\n try {\n const allDevices = await navigator.mediaDevices.enumerateDevices();\n const hasCamera = allDevices.some((device) => device.kind === \"videoinput\");\n const hasMicrophone = allDevices.some((device) => device.kind === \"audioinput\" || device.kind === \"audiooutput\");\n constraints.video = hasCamera ? constraints.video : false;\n constraints.audio = hasMicrophone ? constraints.audio : false;\n stream = await navigator.mediaDevices.getUserMedia(constraints);\n } catch (e) {\n stream = null;\n granted = false;\n }\n update();\n permissionGranted.value = granted;\n } else {\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n }\n if (isSupported.value) {\n if (requestPermissions)\n ensurePermissions();\n useEventListener(navigator.mediaDevices, \"devicechange\", update, { passive: true });\n update();\n }\n return {\n devices,\n ensurePermissions,\n permissionGranted,\n videoInputs,\n audioInputs,\n audioOutputs,\n isSupported\n };\n}\n\nfunction useDisplayMedia(options = {}) {\n var _a;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const video = options.video;\n const audio = options.audio;\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getDisplayMedia;\n });\n const constraint = { audio, video };\n const stream = shallowRef();\n async function _start() {\n var _a2;\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getDisplayMedia(constraint);\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => useEventListener(t, \"ended\", stop, { passive: true }));\n return stream.value;\n }\n async function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else\n _stop();\n },\n { immediate: true }\n );\n return {\n isSupported,\n stream,\n start,\n stop,\n enabled\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useDocumentVisibility(options = {}) {\n const { document = defaultDocument } = options;\n if (!document)\n return shallowRef(\"visible\");\n const visibility = shallowRef(document.visibilityState);\n useEventListener(document, \"visibilitychange\", () => {\n visibility.value = document.visibilityState;\n }, { passive: true });\n return visibility;\n}\n\nfunction useDraggable(target, options = {}) {\n var _a;\n const {\n pointerTypes,\n preventDefault,\n stopPropagation,\n exact,\n onMove,\n onEnd,\n onStart,\n initialValue,\n axis = \"both\",\n draggingElement = defaultWindow,\n containerElement,\n handle: draggingHandle = target,\n buttons = [0]\n } = options;\n const position = ref(\n (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }\n );\n const pressedDelta = ref();\n const filterEvent = (e) => {\n if (pointerTypes)\n return pointerTypes.includes(e.pointerType);\n return true;\n };\n const handleEvent = (e) => {\n if (toValue(preventDefault))\n e.preventDefault();\n if (toValue(stopPropagation))\n e.stopPropagation();\n };\n const start = (e) => {\n var _a2;\n if (!toValue(buttons).includes(e.button))\n return;\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (toValue(exact) && e.target !== toValue(target))\n return;\n const container = toValue(containerElement);\n const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);\n const targetRect = toValue(target).getBoundingClientRect();\n const pos = {\n x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),\n y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)\n };\n if ((onStart == null ? void 0 : onStart(pos, e)) === false)\n return;\n pressedDelta.value = pos;\n handleEvent(e);\n };\n const move = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n const container = toValue(containerElement);\n const targetRect = toValue(target).getBoundingClientRect();\n let { x, y } = position.value;\n if (axis === \"x\" || axis === \"both\") {\n x = e.clientX - pressedDelta.value.x;\n if (container)\n x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);\n }\n if (axis === \"y\" || axis === \"both\") {\n y = e.clientY - pressedDelta.value.y;\n if (container)\n y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);\n }\n position.value = {\n x,\n y\n };\n onMove == null ? void 0 : onMove(position.value, e);\n handleEvent(e);\n };\n const end = (e) => {\n if (toValue(options.disabled) || !filterEvent(e))\n return;\n if (!pressedDelta.value)\n return;\n pressedDelta.value = void 0;\n onEnd == null ? void 0 : onEnd(position.value, e);\n handleEvent(e);\n };\n if (isClient) {\n const config = () => {\n var _a2;\n return {\n capture: (_a2 = options.capture) != null ? _a2 : true,\n passive: !toValue(preventDefault)\n };\n };\n useEventListener(draggingHandle, \"pointerdown\", start, config);\n useEventListener(draggingElement, \"pointermove\", move, config);\n useEventListener(draggingElement, \"pointerup\", end, config);\n }\n return {\n ...toRefs(position),\n position,\n isDragging: computed(() => !!pressedDelta.value),\n style: computed(\n () => `left:${position.value.x}px;top:${position.value.y}px;`\n )\n };\n}\n\nfunction useDropZone(target, options = {}) {\n var _a, _b;\n const isOverDropZone = shallowRef(false);\n const files = shallowRef(null);\n let counter = 0;\n let isValid = true;\n if (isClient) {\n const _options = typeof options === \"function\" ? { onDrop: options } : options;\n const multiple = (_a = _options.multiple) != null ? _a : true;\n const preventDefaultForUnhandled = (_b = _options.preventDefaultForUnhandled) != null ? _b : false;\n const getFiles = (event) => {\n var _a2, _b2;\n const list = Array.from((_b2 = (_a2 = event.dataTransfer) == null ? void 0 : _a2.files) != null ? _b2 : []);\n return list.length === 0 ? null : multiple ? list : [list[0]];\n };\n const checkDataTypes = (types) => {\n const dataTypes = unref(_options.dataTypes);\n if (typeof dataTypes === \"function\")\n return dataTypes(types);\n if (!(dataTypes == null ? void 0 : dataTypes.length))\n return true;\n if (types.length === 0)\n return false;\n return types.every(\n (type) => dataTypes.some((allowedType) => type.includes(allowedType))\n );\n };\n const checkValidity = (items) => {\n const types = Array.from(items != null ? items : []).map((item) => item.type);\n const dataTypesValid = checkDataTypes(types);\n const multipleFilesValid = multiple || items.length <= 1;\n return dataTypesValid && multipleFilesValid;\n };\n const isSafari = () => /^(?:(?!chrome|android).)*safari/i.test(navigator.userAgent) && !(\"chrome\" in window);\n const handleDragEvent = (event, eventType) => {\n var _a2, _b2, _c, _d, _e, _f;\n const dataTransferItemList = (_a2 = event.dataTransfer) == null ? void 0 : _a2.items;\n isValid = (_b2 = dataTransferItemList && checkValidity(dataTransferItemList)) != null ? _b2 : false;\n if (preventDefaultForUnhandled) {\n event.preventDefault();\n }\n if (!isSafari() && !isValid) {\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"none\";\n }\n return;\n }\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = \"copy\";\n }\n const currentFiles = getFiles(event);\n switch (eventType) {\n case \"enter\":\n counter += 1;\n isOverDropZone.value = true;\n (_c = _options.onEnter) == null ? void 0 : _c.call(_options, null, event);\n break;\n case \"over\":\n (_d = _options.onOver) == null ? void 0 : _d.call(_options, null, event);\n break;\n case \"leave\":\n counter -= 1;\n if (counter === 0)\n isOverDropZone.value = false;\n (_e = _options.onLeave) == null ? void 0 : _e.call(_options, null, event);\n break;\n case \"drop\":\n counter = 0;\n isOverDropZone.value = false;\n if (isValid) {\n files.value = currentFiles;\n (_f = _options.onDrop) == null ? void 0 : _f.call(_options, currentFiles, event);\n }\n break;\n }\n };\n useEventListener(target, \"dragenter\", (event) => handleDragEvent(event, \"enter\"));\n useEventListener(target, \"dragover\", (event) => handleDragEvent(event, \"over\"));\n useEventListener(target, \"dragleave\", (event) => handleDragEvent(event, \"leave\"));\n useEventListener(target, \"drop\", (event) => handleDragEvent(event, \"drop\"));\n }\n return {\n files,\n isOverDropZone\n };\n}\n\nfunction useResizeObserver(target, callback, options = {}) {\n const { window = defaultWindow, ...observerOptions } = options;\n let observer;\n const isSupported = useSupported(() => window && \"ResizeObserver\" in window);\n const cleanup = () => {\n if (observer) {\n observer.disconnect();\n observer = void 0;\n }\n };\n const targets = computed(() => {\n const _targets = toValue(target);\n return Array.isArray(_targets) ? _targets.map((el) => unrefElement(el)) : [unrefElement(_targets)];\n });\n const stopWatch = watch(\n targets,\n (els) => {\n cleanup();\n if (isSupported.value && window) {\n observer = new ResizeObserver(callback);\n for (const _el of els) {\n if (_el)\n observer.observe(_el, observerOptions);\n }\n }\n },\n { immediate: true, flush: \"post\" }\n );\n const stop = () => {\n cleanup();\n stopWatch();\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n stop\n };\n}\n\nfunction useElementBounding(target, options = {}) {\n const {\n reset = true,\n windowResize = true,\n windowScroll = true,\n immediate = true,\n updateTiming = \"sync\"\n } = options;\n const height = shallowRef(0);\n const bottom = shallowRef(0);\n const left = shallowRef(0);\n const right = shallowRef(0);\n const top = shallowRef(0);\n const width = shallowRef(0);\n const x = shallowRef(0);\n const y = shallowRef(0);\n function recalculate() {\n const el = unrefElement(target);\n if (!el) {\n if (reset) {\n height.value = 0;\n bottom.value = 0;\n left.value = 0;\n right.value = 0;\n top.value = 0;\n width.value = 0;\n x.value = 0;\n y.value = 0;\n }\n return;\n }\n const rect = el.getBoundingClientRect();\n height.value = rect.height;\n bottom.value = rect.bottom;\n left.value = rect.left;\n right.value = rect.right;\n top.value = rect.top;\n width.value = rect.width;\n x.value = rect.x;\n y.value = rect.y;\n }\n function update() {\n if (updateTiming === \"sync\")\n recalculate();\n else if (updateTiming === \"next-frame\")\n requestAnimationFrame(() => recalculate());\n }\n useResizeObserver(target, update);\n watch(() => unrefElement(target), (ele) => !ele && update());\n useMutationObserver(target, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n if (windowScroll)\n useEventListener(\"scroll\", update, { capture: true, passive: true });\n if (windowResize)\n useEventListener(\"resize\", update, { passive: true });\n tryOnMounted(() => {\n if (immediate)\n update();\n });\n return {\n height,\n bottom,\n left,\n right,\n top,\n width,\n x,\n y,\n update\n };\n}\n\nfunction useElementByPoint(options) {\n const {\n x,\n y,\n document = defaultDocument,\n multiple,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const isSupported = useSupported(() => {\n if (toValue(multiple))\n return document && \"elementsFromPoint\" in document;\n return document && \"elementFromPoint\" in document;\n });\n const element = shallowRef(null);\n const cb = () => {\n var _a, _b;\n element.value = toValue(multiple) ? (_a = document == null ? void 0 : document.elementsFromPoint(toValue(x), toValue(y))) != null ? _a : [] : (_b = document == null ? void 0 : document.elementFromPoint(toValue(x), toValue(y))) != null ? _b : null;\n };\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n return {\n isSupported,\n element,\n ...controls\n };\n}\n\nfunction useElementHover(el, options = {}) {\n const {\n delayEnter = 0,\n delayLeave = 0,\n triggerOnRemoval = false,\n window = defaultWindow\n } = options;\n const isHovered = shallowRef(false);\n let timer;\n const toggle = (entering) => {\n const delay = entering ? delayEnter : delayLeave;\n if (timer) {\n clearTimeout(timer);\n timer = void 0;\n }\n if (delay)\n timer = setTimeout(() => isHovered.value = entering, delay);\n else\n isHovered.value = entering;\n };\n if (!window)\n return isHovered;\n useEventListener(el, \"mouseenter\", () => toggle(true), { passive: true });\n useEventListener(el, \"mouseleave\", () => toggle(false), { passive: true });\n if (triggerOnRemoval) {\n onElementRemoval(\n computed(() => unrefElement(el)),\n () => toggle(false)\n );\n }\n return isHovered;\n}\n\nfunction useElementSize(target, initialSize = { width: 0, height: 0 }, options = {}) {\n const { window = defaultWindow, box = \"content-box\" } = options;\n const isSVG = computed(() => {\n var _a, _b;\n return (_b = (_a = unrefElement(target)) == null ? void 0 : _a.namespaceURI) == null ? void 0 : _b.includes(\"svg\");\n });\n const width = shallowRef(initialSize.width);\n const height = shallowRef(initialSize.height);\n const { stop: stop1 } = useResizeObserver(\n target,\n ([entry]) => {\n const boxSize = box === \"border-box\" ? entry.borderBoxSize : box === \"content-box\" ? entry.contentBoxSize : entry.devicePixelContentBoxSize;\n if (window && isSVG.value) {\n const $elem = unrefElement(target);\n if ($elem) {\n const rect = $elem.getBoundingClientRect();\n width.value = rect.width;\n height.value = rect.height;\n }\n } else {\n if (boxSize) {\n const formatBoxSize = toArray(boxSize);\n width.value = formatBoxSize.reduce((acc, { inlineSize }) => acc + inlineSize, 0);\n height.value = formatBoxSize.reduce((acc, { blockSize }) => acc + blockSize, 0);\n } else {\n width.value = entry.contentRect.width;\n height.value = entry.contentRect.height;\n }\n }\n },\n options\n );\n tryOnMounted(() => {\n const ele = unrefElement(target);\n if (ele) {\n width.value = \"offsetWidth\" in ele ? ele.offsetWidth : initialSize.width;\n height.value = \"offsetHeight\" in ele ? ele.offsetHeight : initialSize.height;\n }\n });\n const stop2 = watch(\n () => unrefElement(target),\n (ele) => {\n width.value = ele ? initialSize.width : 0;\n height.value = ele ? initialSize.height : 0;\n }\n );\n function stop() {\n stop1();\n stop2();\n }\n return {\n width,\n height,\n stop\n };\n}\n\nfunction useIntersectionObserver(target, callback, options = {}) {\n const {\n root,\n rootMargin = \"0px\",\n threshold = 0,\n window = defaultWindow,\n immediate = true\n } = options;\n const isSupported = useSupported(() => window && \"IntersectionObserver\" in window);\n const targets = computed(() => {\n const _target = toValue(target);\n return toArray(_target).map(unrefElement).filter(notNullish);\n });\n let cleanup = noop;\n const isActive = shallowRef(immediate);\n const stopWatch = isSupported.value ? watch(\n () => [targets.value, unrefElement(root), isActive.value],\n ([targets2, root2]) => {\n cleanup();\n if (!isActive.value)\n return;\n if (!targets2.length)\n return;\n const observer = new IntersectionObserver(\n callback,\n {\n root: unrefElement(root2),\n rootMargin,\n threshold\n }\n );\n targets2.forEach((el) => el && observer.observe(el));\n cleanup = () => {\n observer.disconnect();\n cleanup = noop;\n };\n },\n { immediate, flush: \"post\" }\n ) : noop;\n const stop = () => {\n cleanup();\n stopWatch();\n isActive.value = false;\n };\n tryOnScopeDispose(stop);\n return {\n isSupported,\n isActive,\n pause() {\n cleanup();\n isActive.value = false;\n },\n resume() {\n isActive.value = true;\n },\n stop\n };\n}\n\nfunction useElementVisibility(element, options = {}) {\n const {\n window = defaultWindow,\n scrollTarget,\n threshold = 0,\n rootMargin,\n once = false\n } = options;\n const elementIsVisible = shallowRef(false);\n const { stop } = useIntersectionObserver(\n element,\n (intersectionObserverEntries) => {\n let isIntersecting = elementIsVisible.value;\n let latestTime = 0;\n for (const entry of intersectionObserverEntries) {\n if (entry.time >= latestTime) {\n latestTime = entry.time;\n isIntersecting = entry.isIntersecting;\n }\n }\n elementIsVisible.value = isIntersecting;\n if (once) {\n watchOnce(elementIsVisible, () => {\n stop();\n });\n }\n },\n {\n root: scrollTarget,\n window,\n threshold,\n rootMargin: toValue(rootMargin)\n }\n );\n return elementIsVisible;\n}\n\nconst events = /* @__PURE__ */ new Map();\n\n// @__NO_SIDE_EFFECTS__\nfunction useEventBus(key) {\n const scope = getCurrentScope();\n function on(listener) {\n var _a;\n const listeners = events.get(key) || /* @__PURE__ */ new Set();\n listeners.add(listener);\n events.set(key, listeners);\n const _off = () => off(listener);\n (_a = scope == null ? void 0 : scope.cleanups) == null ? void 0 : _a.push(_off);\n return _off;\n }\n function once(listener) {\n function _listener(...args) {\n off(_listener);\n listener(...args);\n }\n return on(_listener);\n }\n function off(listener) {\n const listeners = events.get(key);\n if (!listeners)\n return;\n listeners.delete(listener);\n if (!listeners.size)\n reset();\n }\n function reset() {\n events.delete(key);\n }\n function emit(event, payload) {\n var _a;\n (_a = events.get(key)) == null ? void 0 : _a.forEach((v) => v(event, payload));\n }\n return { on, once, off, emit, reset };\n}\n\nfunction resolveNestedOptions$1(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useEventSource(url, events = [], options = {}) {\n const event = shallowRef(null);\n const data = shallowRef(null);\n const status = shallowRef(\"CONNECTING\");\n const eventSource = ref(null);\n const error = shallowRef(null);\n const urlRef = toRef(url);\n const lastEventId = shallowRef(null);\n let explicitlyClosed = false;\n let retried = 0;\n const {\n withCredentials = false,\n immediate = true,\n autoConnect = true,\n autoReconnect,\n serializer = {\n read: (v) => v\n }\n } = options;\n const close = () => {\n if (isClient && eventSource.value) {\n eventSource.value.close();\n eventSource.value = null;\n status.value = \"CLOSED\";\n explicitlyClosed = true;\n }\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const es = new EventSource(urlRef.value, { withCredentials });\n status.value = \"CONNECTING\";\n eventSource.value = es;\n es.onopen = () => {\n status.value = \"OPEN\";\n error.value = null;\n };\n es.onerror = (e) => {\n status.value = \"CLOSED\";\n error.value = e;\n if (es.readyState === 2 && !explicitlyClosed && autoReconnect) {\n es.close();\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions$1(autoReconnect);\n retried += 1;\n if (typeof retries === \"number\" && (retries < 0 || retried < retries))\n setTimeout(_init, delay);\n else if (typeof retries === \"function\" && retries())\n setTimeout(_init, delay);\n else\n onFailed == null ? void 0 : onFailed();\n }\n };\n es.onmessage = (e) => {\n var _a;\n event.value = null;\n data.value = (_a = serializer.read(e.data)) != null ? _a : null;\n lastEventId.value = e.lastEventId;\n };\n for (const event_name of events) {\n useEventListener(es, event_name, (e) => {\n var _a, _b;\n event.value = event_name;\n data.value = (_a = serializer.read(e.data)) != null ? _a : null;\n lastEventId.value = (_b = e.lastEventId) != null ? _b : null;\n }, { passive: true });\n }\n };\n const open = () => {\n if (!isClient)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n tryOnScopeDispose(close);\n return {\n eventSource,\n event,\n data,\n status,\n error,\n open,\n close,\n lastEventId\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useEyeDropper(options = {}) {\n const { initialValue = \"\" } = options;\n const isSupported = useSupported(() => typeof window !== \"undefined\" && \"EyeDropper\" in window);\n const sRGBHex = shallowRef(initialValue);\n async function open(openOptions) {\n if (!isSupported.value)\n return;\n const eyeDropper = new window.EyeDropper();\n const result = await eyeDropper.open(openOptions);\n sRGBHex.value = result.sRGBHex;\n return result;\n }\n return { isSupported, sRGBHex, open };\n}\n\nfunction useFavicon(newIcon = null, options = {}) {\n const {\n baseUrl = \"\",\n rel = \"icon\",\n document = defaultDocument\n } = options;\n const favicon = toRef(newIcon);\n const applyIcon = (icon) => {\n const elements = document == null ? void 0 : document.head.querySelectorAll(`link[rel*=\"${rel}\"]`);\n if (!elements || elements.length === 0) {\n const link = document == null ? void 0 : document.createElement(\"link\");\n if (link) {\n link.rel = rel;\n link.href = `${baseUrl}${icon}`;\n link.type = `image/${icon.split(\".\").pop()}`;\n document == null ? void 0 : document.head.append(link);\n }\n return;\n }\n elements == null ? void 0 : elements.forEach((el) => el.href = `${baseUrl}${icon}`);\n };\n watch(\n favicon,\n (i, o) => {\n if (typeof i === \"string\" && i !== o)\n applyIcon(i);\n },\n { immediate: true }\n );\n return favicon;\n}\n\nconst payloadMapping = {\n json: \"application/json\",\n text: \"text/plain\"\n};\nfunction isFetchOptions(obj) {\n return obj && containsProp(obj, \"immediate\", \"refetch\", \"initialData\", \"timeout\", \"beforeFetch\", \"afterFetch\", \"onFetchError\", \"fetch\", \"updateDataOnError\");\n}\nconst reAbsolute = /^(?:[a-z][a-z\\d+\\-.]*:)?\\/\\//i;\nfunction isAbsoluteURL(url) {\n return reAbsolute.test(url);\n}\nfunction headersToObject(headers) {\n if (typeof Headers !== \"undefined\" && headers instanceof Headers)\n return Object.fromEntries(headers.entries());\n return headers;\n}\nfunction combineCallbacks(combination, ...callbacks) {\n if (combination === \"overwrite\") {\n return async (ctx) => {\n let callback;\n for (let i = callbacks.length - 1; i >= 0; i--) {\n if (callbacks[i] != null) {\n callback = callbacks[i];\n break;\n }\n }\n if (callback)\n return { ...ctx, ...await callback(ctx) };\n return ctx;\n };\n } else {\n return async (ctx) => {\n for (const callback of callbacks) {\n if (callback)\n ctx = { ...ctx, ...await callback(ctx) };\n }\n return ctx;\n };\n }\n}\nfunction createFetch(config = {}) {\n const _combination = config.combination || \"chain\";\n const _options = config.options || {};\n const _fetchOptions = config.fetchOptions || {};\n function useFactoryFetch(url, ...args) {\n const computedUrl = computed(() => {\n const baseUrl = toValue(config.baseUrl);\n const targetUrl = toValue(url);\n return baseUrl && !isAbsoluteURL(targetUrl) ? joinPaths(baseUrl, targetUrl) : targetUrl;\n });\n let options = _options;\n let fetchOptions = _fetchOptions;\n if (args.length > 0) {\n if (isFetchOptions(args[0])) {\n options = {\n ...options,\n ...args[0],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[0].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[0].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[0].onFetchError)\n };\n } else {\n fetchOptions = {\n ...fetchOptions,\n ...args[0],\n headers: {\n ...headersToObject(fetchOptions.headers) || {},\n ...headersToObject(args[0].headers) || {}\n }\n };\n }\n }\n if (args.length > 1 && isFetchOptions(args[1])) {\n options = {\n ...options,\n ...args[1],\n beforeFetch: combineCallbacks(_combination, _options.beforeFetch, args[1].beforeFetch),\n afterFetch: combineCallbacks(_combination, _options.afterFetch, args[1].afterFetch),\n onFetchError: combineCallbacks(_combination, _options.onFetchError, args[1].onFetchError)\n };\n }\n return useFetch(computedUrl, fetchOptions, options);\n }\n return useFactoryFetch;\n}\nfunction useFetch(url, ...args) {\n var _a, _b;\n const supportsAbort = typeof AbortController === \"function\";\n let fetchOptions = {};\n let options = {\n immediate: true,\n refetch: false,\n timeout: 0,\n updateDataOnError: false\n };\n const config = {\n method: \"GET\",\n type: \"text\",\n payload: void 0\n };\n if (args.length > 0) {\n if (isFetchOptions(args[0]))\n options = { ...options, ...args[0] };\n else\n fetchOptions = args[0];\n }\n if (args.length > 1) {\n if (isFetchOptions(args[1]))\n options = { ...options, ...args[1] };\n }\n const {\n fetch = (_b = (_a = defaultWindow) == null ? void 0 : _a.fetch) != null ? _b : globalThis == null ? void 0 : globalThis.fetch,\n initialData,\n timeout\n } = options;\n const responseEvent = createEventHook();\n const errorEvent = createEventHook();\n const finallyEvent = createEventHook();\n const isFinished = shallowRef(false);\n const isFetching = shallowRef(false);\n const aborted = shallowRef(false);\n const statusCode = shallowRef(null);\n const response = shallowRef(null);\n const error = shallowRef(null);\n const data = shallowRef(initialData || null);\n const canAbort = computed(() => supportsAbort && isFetching.value);\n let controller;\n let timer;\n const abort = (reason) => {\n if (supportsAbort) {\n controller == null ? void 0 : controller.abort(reason);\n controller = new AbortController();\n controller.signal.onabort = () => aborted.value = true;\n fetchOptions = {\n ...fetchOptions,\n signal: controller.signal\n };\n }\n };\n const loading = (isLoading) => {\n isFetching.value = isLoading;\n isFinished.value = !isLoading;\n };\n if (timeout)\n timer = useTimeoutFn(abort, timeout, { immediate: false });\n let executeCounter = 0;\n const execute = async (throwOnFailed = false) => {\n var _a2, _b2;\n abort();\n loading(true);\n error.value = null;\n statusCode.value = null;\n aborted.value = false;\n executeCounter += 1;\n const currentExecuteCounter = executeCounter;\n const defaultFetchOptions = {\n method: config.method,\n headers: {}\n };\n const payload = toValue(config.payload);\n if (payload) {\n const headers = headersToObject(defaultFetchOptions.headers);\n const proto = Object.getPrototypeOf(payload);\n if (!config.payloadType && payload && (proto === Object.prototype || Array.isArray(proto)) && !(payload instanceof FormData))\n config.payloadType = \"json\";\n if (config.payloadType)\n headers[\"Content-Type\"] = (_a2 = payloadMapping[config.payloadType]) != null ? _a2 : config.payloadType;\n defaultFetchOptions.body = config.payloadType === \"json\" ? JSON.stringify(payload) : payload;\n }\n let isCanceled = false;\n const context = {\n url: toValue(url),\n options: {\n ...defaultFetchOptions,\n ...fetchOptions\n },\n cancel: () => {\n isCanceled = true;\n }\n };\n if (options.beforeFetch)\n Object.assign(context, await options.beforeFetch(context));\n if (isCanceled || !fetch) {\n loading(false);\n return Promise.resolve(null);\n }\n let responseData = null;\n if (timer)\n timer.start();\n return fetch(\n context.url,\n {\n ...defaultFetchOptions,\n ...context.options,\n headers: {\n ...headersToObject(defaultFetchOptions.headers),\n ...headersToObject((_b2 = context.options) == null ? void 0 : _b2.headers)\n }\n }\n ).then(async (fetchResponse) => {\n response.value = fetchResponse;\n statusCode.value = fetchResponse.status;\n responseData = await fetchResponse.clone()[config.type]();\n if (!fetchResponse.ok) {\n data.value = initialData || null;\n throw new Error(fetchResponse.statusText);\n }\n if (options.afterFetch) {\n ({ data: responseData } = await options.afterFetch({\n data: responseData,\n response: fetchResponse,\n context,\n execute\n }));\n }\n data.value = responseData;\n responseEvent.trigger(fetchResponse);\n return fetchResponse;\n }).catch(async (fetchError) => {\n let errorData = fetchError.message || fetchError.name;\n if (options.onFetchError) {\n ({ error: errorData, data: responseData } = await options.onFetchError({\n data: responseData,\n error: fetchError,\n response: response.value,\n context,\n execute\n }));\n }\n error.value = errorData;\n if (options.updateDataOnError)\n data.value = responseData;\n errorEvent.trigger(fetchError);\n if (throwOnFailed)\n throw fetchError;\n return null;\n }).finally(() => {\n if (currentExecuteCounter === executeCounter)\n loading(false);\n if (timer)\n timer.stop();\n finallyEvent.trigger(null);\n });\n };\n const refetch = toRef(options.refetch);\n watch(\n [\n refetch,\n toRef(url)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n const shell = {\n isFinished: readonly(isFinished),\n isFetching: readonly(isFetching),\n statusCode,\n response,\n error,\n data,\n canAbort,\n aborted,\n abort,\n execute,\n onFetchResponse: responseEvent.on,\n onFetchError: errorEvent.on,\n onFetchFinally: finallyEvent.on,\n // method\n get: setMethod(\"GET\"),\n put: setMethod(\"PUT\"),\n post: setMethod(\"POST\"),\n delete: setMethod(\"DELETE\"),\n patch: setMethod(\"PATCH\"),\n head: setMethod(\"HEAD\"),\n options: setMethod(\"OPTIONS\"),\n // type\n json: setType(\"json\"),\n text: setType(\"text\"),\n blob: setType(\"blob\"),\n arrayBuffer: setType(\"arrayBuffer\"),\n formData: setType(\"formData\")\n };\n function setMethod(method) {\n return (payload, payloadType) => {\n if (!isFetching.value) {\n config.method = method;\n config.payload = payload;\n config.payloadType = payloadType;\n if (isRef(config.payload)) {\n watch(\n [\n refetch,\n toRef(config.payload)\n ],\n ([refetch2]) => refetch2 && execute(),\n { deep: true }\n );\n }\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n function waitUntilFinished() {\n return new Promise((resolve, reject) => {\n until(isFinished).toBe(true).then(() => resolve(shell)).catch(reject);\n });\n }\n function setType(type) {\n return () => {\n if (!isFetching.value) {\n config.type = type;\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n }\n return void 0;\n };\n }\n if (options.immediate)\n Promise.resolve().then(() => execute());\n return {\n ...shell,\n then(onFulfilled, onRejected) {\n return waitUntilFinished().then(onFulfilled, onRejected);\n }\n };\n}\nfunction joinPaths(start, end) {\n if (!start.endsWith(\"/\") && !end.startsWith(\"/\")) {\n return `${start}/${end}`;\n }\n if (start.endsWith(\"/\") && end.startsWith(\"/\")) {\n return `${start.slice(0, -1)}${end}`;\n }\n return `${start}${end}`;\n}\n\nconst DEFAULT_OPTIONS = {\n multiple: true,\n accept: \"*\",\n reset: false,\n directory: false\n};\nfunction prepareInitialFiles(files) {\n if (!files)\n return null;\n if (files instanceof FileList)\n return files;\n const dt = new DataTransfer();\n for (const file of files) {\n dt.items.add(file);\n }\n return dt.files;\n}\nfunction useFileDialog(options = {}) {\n const {\n document = defaultDocument\n } = options;\n const files = ref(prepareInitialFiles(options.initialFiles));\n const { on: onChange, trigger: changeTrigger } = createEventHook();\n const { on: onCancel, trigger: cancelTrigger } = createEventHook();\n const inputRef = computed(() => {\n var _a;\n const input = (_a = unrefElement(options.input)) != null ? _a : document ? document.createElement(\"input\") : void 0;\n if (input) {\n input.type = \"file\";\n input.onchange = (event) => {\n const result = event.target;\n files.value = result.files;\n changeTrigger(files.value);\n };\n input.oncancel = () => {\n cancelTrigger();\n };\n }\n return input;\n });\n const reset = () => {\n files.value = null;\n if (inputRef.value && inputRef.value.value) {\n inputRef.value.value = \"\";\n changeTrigger(null);\n }\n };\n const applyOptions = (options2) => {\n const el = inputRef.value;\n if (!el)\n return;\n el.multiple = toValue(options2.multiple);\n el.accept = toValue(options2.accept);\n el.webkitdirectory = toValue(options2.directory);\n if (hasOwn(options2, \"capture\"))\n el.capture = toValue(options2.capture);\n };\n const open = (localOptions) => {\n const el = inputRef.value;\n if (!el)\n return;\n const mergedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n ...localOptions\n };\n applyOptions(mergedOptions);\n if (toValue(mergedOptions.reset))\n reset();\n el.click();\n };\n watchEffect(() => {\n applyOptions(options);\n });\n return {\n files: readonly(files),\n open,\n reset,\n onCancel,\n onChange\n };\n}\n\nfunction useFileSystemAccess(options = {}) {\n const {\n window: _window = defaultWindow,\n dataType = \"Text\"\n } = options;\n const window = _window;\n const isSupported = useSupported(() => window && \"showSaveFilePicker\" in window && \"showOpenFilePicker\" in window);\n const fileHandle = shallowRef();\n const data = shallowRef();\n const file = shallowRef();\n const fileName = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.name) != null ? _b : \"\";\n });\n const fileMIME = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.type) != null ? _b : \"\";\n });\n const fileSize = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.size) != null ? _b : 0;\n });\n const fileLastModified = computed(() => {\n var _a, _b;\n return (_b = (_a = file.value) == null ? void 0 : _a.lastModified) != null ? _b : 0;\n });\n async function open(_options = {}) {\n if (!isSupported.value)\n return;\n const [handle] = await window.showOpenFilePicker({ ...toValue(options), ..._options });\n fileHandle.value = handle;\n await updateData();\n }\n async function create(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n data.value = void 0;\n await updateData();\n }\n async function save(_options = {}) {\n if (!isSupported.value)\n return;\n if (!fileHandle.value)\n return saveAs(_options);\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function saveAs(_options = {}) {\n if (!isSupported.value)\n return;\n fileHandle.value = await window.showSaveFilePicker({ ...options, ..._options });\n if (data.value) {\n const writableStream = await fileHandle.value.createWritable();\n await writableStream.write(data.value);\n await writableStream.close();\n }\n await updateFile();\n }\n async function updateFile() {\n var _a;\n file.value = await ((_a = fileHandle.value) == null ? void 0 : _a.getFile());\n }\n async function updateData() {\n var _a, _b;\n await updateFile();\n const type = toValue(dataType);\n if (type === \"Text\")\n data.value = await ((_a = file.value) == null ? void 0 : _a.text());\n else if (type === \"ArrayBuffer\")\n data.value = await ((_b = file.value) == null ? void 0 : _b.arrayBuffer());\n else if (type === \"Blob\")\n data.value = file.value;\n }\n watch(() => toValue(dataType), updateData);\n return {\n isSupported,\n data,\n file,\n fileName,\n fileMIME,\n fileSize,\n fileLastModified,\n open,\n create,\n save,\n saveAs,\n updateData\n };\n}\n\nfunction useFocus(target, options = {}) {\n const { initialValue = false, focusVisible = false, preventScroll = false } = options;\n const innerFocused = shallowRef(false);\n const targetElement = computed(() => unrefElement(target));\n const listenerOptions = { passive: true };\n useEventListener(targetElement, \"focus\", (event) => {\n var _a, _b;\n if (!focusVisible || ((_b = (_a = event.target).matches) == null ? void 0 : _b.call(_a, \":focus-visible\")))\n innerFocused.value = true;\n }, listenerOptions);\n useEventListener(targetElement, \"blur\", () => innerFocused.value = false, listenerOptions);\n const focused = computed({\n get: () => innerFocused.value,\n set(value) {\n var _a, _b;\n if (!value && innerFocused.value)\n (_a = targetElement.value) == null ? void 0 : _a.blur();\n else if (value && !innerFocused.value)\n (_b = targetElement.value) == null ? void 0 : _b.focus({ preventScroll });\n }\n });\n watch(\n targetElement,\n () => {\n focused.value = initialValue;\n },\n { immediate: true, flush: \"post\" }\n );\n return { focused };\n}\n\nconst EVENT_FOCUS_IN = \"focusin\";\nconst EVENT_FOCUS_OUT = \"focusout\";\nconst PSEUDO_CLASS_FOCUS_WITHIN = \":focus-within\";\nfunction useFocusWithin(target, options = {}) {\n const { window = defaultWindow } = options;\n const targetElement = computed(() => unrefElement(target));\n const _focused = shallowRef(false);\n const focused = computed(() => _focused.value);\n const activeElement = useActiveElement(options);\n if (!window || !activeElement.value) {\n return { focused };\n }\n const listenerOptions = { passive: true };\n useEventListener(targetElement, EVENT_FOCUS_IN, () => _focused.value = true, listenerOptions);\n useEventListener(targetElement, EVENT_FOCUS_OUT, () => {\n var _a, _b, _c;\n return _focused.value = (_c = (_b = (_a = targetElement.value) == null ? void 0 : _a.matches) == null ? void 0 : _b.call(_a, PSEUDO_CLASS_FOCUS_WITHIN)) != null ? _c : false;\n }, listenerOptions);\n return { focused };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useFps(options) {\n var _a;\n const fps = shallowRef(0);\n if (typeof performance === \"undefined\")\n return fps;\n const every = (_a = options == null ? void 0 : options.every) != null ? _a : 10;\n let last = performance.now();\n let ticks = 0;\n useRafFn(() => {\n ticks += 1;\n if (ticks >= every) {\n const now = performance.now();\n const diff = now - last;\n fps.value = Math.round(1e3 / (diff / ticks));\n last = now;\n ticks = 0;\n }\n });\n return fps;\n}\n\nconst eventHandlers = [\n \"fullscreenchange\",\n \"webkitfullscreenchange\",\n \"webkitendfullscreen\",\n \"mozfullscreenchange\",\n \"MSFullscreenChange\"\n];\nfunction useFullscreen(target, options = {}) {\n const {\n document = defaultDocument,\n autoExit = false\n } = options;\n const targetRef = computed(() => {\n var _a;\n return (_a = unrefElement(target)) != null ? _a : document == null ? void 0 : document.documentElement;\n });\n const isFullscreen = shallowRef(false);\n const requestMethod = computed(() => {\n return [\n \"requestFullscreen\",\n \"webkitRequestFullscreen\",\n \"webkitEnterFullscreen\",\n \"webkitEnterFullScreen\",\n \"webkitRequestFullScreen\",\n \"mozRequestFullScreen\",\n \"msRequestFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const exitMethod = computed(() => {\n return [\n \"exitFullscreen\",\n \"webkitExitFullscreen\",\n \"webkitExitFullScreen\",\n \"webkitCancelFullScreen\",\n \"mozCancelFullScreen\",\n \"msExitFullscreen\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenEnabled = computed(() => {\n return [\n \"fullScreen\",\n \"webkitIsFullScreen\",\n \"webkitDisplayingFullscreen\",\n \"mozFullScreen\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document || targetRef.value && m in targetRef.value);\n });\n const fullscreenElementMethod = [\n \"fullscreenElement\",\n \"webkitFullscreenElement\",\n \"mozFullScreenElement\",\n \"msFullscreenElement\"\n ].find((m) => document && m in document);\n const isSupported = useSupported(() => targetRef.value && document && requestMethod.value !== void 0 && exitMethod.value !== void 0 && fullscreenEnabled.value !== void 0);\n const isCurrentElementFullScreen = () => {\n if (fullscreenElementMethod)\n return (document == null ? void 0 : document[fullscreenElementMethod]) === targetRef.value;\n return false;\n };\n const isElementFullScreen = () => {\n if (fullscreenEnabled.value) {\n if (document && document[fullscreenEnabled.value] != null) {\n return document[fullscreenEnabled.value];\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[fullscreenEnabled.value]) != null) {\n return Boolean(target2[fullscreenEnabled.value]);\n }\n }\n }\n return false;\n };\n async function exit() {\n if (!isSupported.value || !isFullscreen.value)\n return;\n if (exitMethod.value) {\n if ((document == null ? void 0 : document[exitMethod.value]) != null) {\n await document[exitMethod.value]();\n } else {\n const target2 = targetRef.value;\n if ((target2 == null ? void 0 : target2[exitMethod.value]) != null)\n await target2[exitMethod.value]();\n }\n }\n isFullscreen.value = false;\n }\n async function enter() {\n if (!isSupported.value || isFullscreen.value)\n return;\n if (isElementFullScreen())\n await exit();\n const target2 = targetRef.value;\n if (requestMethod.value && (target2 == null ? void 0 : target2[requestMethod.value]) != null) {\n await target2[requestMethod.value]();\n isFullscreen.value = true;\n }\n }\n async function toggle() {\n await (isFullscreen.value ? exit() : enter());\n }\n const handlerCallback = () => {\n const isElementFullScreenValue = isElementFullScreen();\n if (!isElementFullScreenValue || isElementFullScreenValue && isCurrentElementFullScreen())\n isFullscreen.value = isElementFullScreenValue;\n };\n const listenerOptions = { capture: false, passive: true };\n useEventListener(document, eventHandlers, handlerCallback, listenerOptions);\n useEventListener(() => unrefElement(targetRef), eventHandlers, handlerCallback, listenerOptions);\n tryOnMounted(handlerCallback, false);\n if (autoExit)\n tryOnScopeDispose(exit);\n return {\n isSupported,\n isFullscreen,\n enter,\n exit,\n toggle\n };\n}\n\nfunction mapGamepadToXbox360Controller(gamepad) {\n return computed(() => {\n if (gamepad.value) {\n return {\n buttons: {\n a: gamepad.value.buttons[0],\n b: gamepad.value.buttons[1],\n x: gamepad.value.buttons[2],\n y: gamepad.value.buttons[3]\n },\n bumper: {\n left: gamepad.value.buttons[4],\n right: gamepad.value.buttons[5]\n },\n triggers: {\n left: gamepad.value.buttons[6],\n right: gamepad.value.buttons[7]\n },\n stick: {\n left: {\n horizontal: gamepad.value.axes[0],\n vertical: gamepad.value.axes[1],\n button: gamepad.value.buttons[10]\n },\n right: {\n horizontal: gamepad.value.axes[2],\n vertical: gamepad.value.axes[3],\n button: gamepad.value.buttons[11]\n }\n },\n dpad: {\n up: gamepad.value.buttons[12],\n down: gamepad.value.buttons[13],\n left: gamepad.value.buttons[14],\n right: gamepad.value.buttons[15]\n },\n back: gamepad.value.buttons[8],\n start: gamepad.value.buttons[9]\n };\n }\n return null;\n });\n}\n// @__NO_SIDE_EFFECTS__\nfunction useGamepad(options = {}) {\n const {\n navigator = defaultNavigator\n } = options;\n const isSupported = useSupported(() => navigator && \"getGamepads\" in navigator);\n const gamepads = ref([]);\n const onConnectedHook = createEventHook();\n const onDisconnectedHook = createEventHook();\n const stateFromGamepad = (gamepad) => {\n const hapticActuators = [];\n const vibrationActuator = \"vibrationActuator\" in gamepad ? gamepad.vibrationActuator : null;\n if (vibrationActuator)\n hapticActuators.push(vibrationActuator);\n if (gamepad.hapticActuators)\n hapticActuators.push(...gamepad.hapticActuators);\n return {\n id: gamepad.id,\n index: gamepad.index,\n connected: gamepad.connected,\n mapping: gamepad.mapping,\n timestamp: gamepad.timestamp,\n vibrationActuator: gamepad.vibrationActuator,\n hapticActuators,\n axes: gamepad.axes.map((axes) => axes),\n buttons: gamepad.buttons.map((button) => ({ pressed: button.pressed, touched: button.touched, value: button.value }))\n };\n };\n const updateGamepadState = () => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n gamepads.value[gamepad.index] = stateFromGamepad(gamepad);\n }\n };\n const { isActive, pause, resume } = useRafFn(updateGamepadState);\n const onGamepadConnected = (gamepad) => {\n if (!gamepads.value.some(({ index }) => index === gamepad.index)) {\n gamepads.value.push(stateFromGamepad(gamepad));\n onConnectedHook.trigger(gamepad.index);\n }\n resume();\n };\n const onGamepadDisconnected = (gamepad) => {\n gamepads.value = gamepads.value.filter((x) => x.index !== gamepad.index);\n onDisconnectedHook.trigger(gamepad.index);\n };\n const listenerOptions = { passive: true };\n useEventListener(\"gamepadconnected\", (e) => onGamepadConnected(e.gamepad), listenerOptions);\n useEventListener(\"gamepaddisconnected\", (e) => onGamepadDisconnected(e.gamepad), listenerOptions);\n tryOnMounted(() => {\n const _gamepads = (navigator == null ? void 0 : navigator.getGamepads()) || [];\n for (const gamepad of _gamepads) {\n if (gamepad && gamepads.value[gamepad.index])\n onGamepadConnected(gamepad);\n }\n });\n pause();\n return {\n isSupported,\n onConnected: onConnectedHook.on,\n onDisconnected: onDisconnectedHook.on,\n gamepads,\n pause,\n resume,\n isActive\n };\n}\n\nfunction useGeolocation(options = {}) {\n const {\n enableHighAccuracy = true,\n maximumAge = 3e4,\n timeout = 27e3,\n navigator = defaultNavigator,\n immediate = true\n } = options;\n const isSupported = useSupported(() => navigator && \"geolocation\" in navigator);\n const locatedAt = shallowRef(null);\n const error = shallowRef(null);\n const coords = ref({\n accuracy: 0,\n latitude: Number.POSITIVE_INFINITY,\n longitude: Number.POSITIVE_INFINITY,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null\n });\n function updatePosition(position) {\n locatedAt.value = position.timestamp;\n coords.value = position.coords;\n error.value = null;\n }\n let watcher;\n function resume() {\n if (isSupported.value) {\n watcher = navigator.geolocation.watchPosition(\n updatePosition,\n (err) => error.value = err,\n {\n enableHighAccuracy,\n maximumAge,\n timeout\n }\n );\n }\n }\n if (immediate)\n resume();\n function pause() {\n if (watcher && navigator)\n navigator.geolocation.clearWatch(watcher);\n }\n tryOnScopeDispose(() => {\n pause();\n });\n return {\n isSupported,\n coords,\n locatedAt,\n error,\n resume,\n pause\n };\n}\n\nconst defaultEvents$1 = [\"mousemove\", \"mousedown\", \"resize\", \"keydown\", \"touchstart\", \"wheel\"];\nconst oneMinute = 6e4;\nfunction useIdle(timeout = oneMinute, options = {}) {\n const {\n initialState = false,\n listenForVisibilityChange = true,\n events = defaultEvents$1,\n window = defaultWindow,\n eventFilter = throttleFilter(50)\n } = options;\n const idle = shallowRef(initialState);\n const lastActive = shallowRef(timestamp());\n let timer;\n const reset = () => {\n idle.value = false;\n clearTimeout(timer);\n timer = setTimeout(() => idle.value = true, timeout);\n };\n const onEvent = createFilterWrapper(\n eventFilter,\n () => {\n lastActive.value = timestamp();\n reset();\n }\n );\n if (window) {\n const document = window.document;\n const listenerOptions = { passive: true };\n for (const event of events)\n useEventListener(window, event, onEvent, listenerOptions);\n if (listenForVisibilityChange) {\n useEventListener(document, \"visibilitychange\", () => {\n if (!document.hidden)\n onEvent();\n }, listenerOptions);\n }\n if (!initialState)\n reset();\n }\n return {\n idle,\n lastActive,\n reset\n };\n}\n\nasync function loadImage(options) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const { src, srcset, sizes, class: clazz, loading, crossorigin, referrerPolicy, width, height, decoding, fetchPriority, ismap, usemap } = options;\n img.src = src;\n if (srcset != null)\n img.srcset = srcset;\n if (sizes != null)\n img.sizes = sizes;\n if (clazz != null)\n img.className = clazz;\n if (loading != null)\n img.loading = loading;\n if (crossorigin != null)\n img.crossOrigin = crossorigin;\n if (referrerPolicy != null)\n img.referrerPolicy = referrerPolicy;\n if (width != null)\n img.width = width;\n if (height != null)\n img.height = height;\n if (decoding != null)\n img.decoding = decoding;\n if (fetchPriority != null)\n img.fetchPriority = fetchPriority;\n if (ismap != null)\n img.isMap = ismap;\n if (usemap != null)\n img.useMap = usemap;\n img.onload = () => resolve(img);\n img.onerror = reject;\n });\n}\nfunction useImage(options, asyncStateOptions = {}) {\n const state = useAsyncState(\n () => loadImage(toValue(options)),\n void 0,\n {\n resetOnExecute: true,\n ...asyncStateOptions\n }\n );\n watch(\n () => toValue(options),\n () => state.execute(asyncStateOptions.delay),\n { deep: true }\n );\n return state;\n}\n\nfunction resolveElement(el) {\n if (typeof Window !== \"undefined\" && el instanceof Window)\n return el.document.documentElement;\n if (typeof Document !== \"undefined\" && el instanceof Document)\n return el.documentElement;\n return el;\n}\n\nconst ARRIVED_STATE_THRESHOLD_PIXELS = 1;\nfunction useScroll(element, options = {}) {\n const {\n throttle = 0,\n idle = 200,\n onStop = noop,\n onScroll = noop,\n offset = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n },\n observe: _observe = {\n mutation: false\n },\n eventListenerOptions = {\n capture: false,\n passive: true\n },\n behavior = \"auto\",\n window = defaultWindow,\n onError = (e) => {\n console.error(e);\n }\n } = options;\n const observe = typeof _observe === \"boolean\" ? {\n mutation: _observe\n } : _observe;\n const internalX = shallowRef(0);\n const internalY = shallowRef(0);\n const x = computed({\n get() {\n return internalX.value;\n },\n set(x2) {\n scrollTo(x2, void 0);\n }\n });\n const y = computed({\n get() {\n return internalY.value;\n },\n set(y2) {\n scrollTo(void 0, y2);\n }\n });\n function scrollTo(_x, _y) {\n var _a, _b, _c, _d;\n if (!window)\n return;\n const _element = toValue(element);\n if (!_element)\n return;\n (_c = _element instanceof Document ? window.document.body : _element) == null ? void 0 : _c.scrollTo({\n top: (_a = toValue(_y)) != null ? _a : y.value,\n left: (_b = toValue(_x)) != null ? _b : x.value,\n behavior: toValue(behavior)\n });\n const scrollContainer = ((_d = _element == null ? void 0 : _element.document) == null ? void 0 : _d.documentElement) || (_element == null ? void 0 : _element.documentElement) || _element;\n if (x != null)\n internalX.value = scrollContainer.scrollLeft;\n if (y != null)\n internalY.value = scrollContainer.scrollTop;\n }\n const isScrolling = shallowRef(false);\n const arrivedState = reactive({\n left: true,\n right: false,\n top: true,\n bottom: false\n });\n const directions = reactive({\n left: false,\n right: false,\n top: false,\n bottom: false\n });\n const onScrollEnd = (e) => {\n if (!isScrolling.value)\n return;\n isScrolling.value = false;\n directions.left = false;\n directions.right = false;\n directions.top = false;\n directions.bottom = false;\n onStop(e);\n };\n const onScrollEndDebounced = useDebounceFn(onScrollEnd, throttle + idle);\n const setArrivedState = (target) => {\n var _a;\n if (!window)\n return;\n const el = ((_a = target == null ? void 0 : target.document) == null ? void 0 : _a.documentElement) || (target == null ? void 0 : target.documentElement) || unrefElement(target);\n const { display, flexDirection, direction } = getComputedStyle(el);\n const directionMultipler = direction === \"rtl\" ? -1 : 1;\n const scrollLeft = el.scrollLeft;\n directions.left = scrollLeft < internalX.value;\n directions.right = scrollLeft > internalX.value;\n const left = Math.abs(scrollLeft * directionMultipler) <= (offset.left || 0);\n const right = Math.abs(scrollLeft * directionMultipler) + el.clientWidth >= el.scrollWidth - (offset.right || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"row-reverse\") {\n arrivedState.left = right;\n arrivedState.right = left;\n } else {\n arrivedState.left = left;\n arrivedState.right = right;\n }\n internalX.value = scrollLeft;\n let scrollTop = el.scrollTop;\n if (target === window.document && !scrollTop)\n scrollTop = window.document.body.scrollTop;\n directions.top = scrollTop < internalY.value;\n directions.bottom = scrollTop > internalY.value;\n const top = Math.abs(scrollTop) <= (offset.top || 0);\n const bottom = Math.abs(scrollTop) + el.clientHeight >= el.scrollHeight - (offset.bottom || 0) - ARRIVED_STATE_THRESHOLD_PIXELS;\n if (display === \"flex\" && flexDirection === \"column-reverse\") {\n arrivedState.top = bottom;\n arrivedState.bottom = top;\n } else {\n arrivedState.top = top;\n arrivedState.bottom = bottom;\n }\n internalY.value = scrollTop;\n };\n const onScrollHandler = (e) => {\n var _a;\n if (!window)\n return;\n const eventTarget = (_a = e.target.documentElement) != null ? _a : e.target;\n setArrivedState(eventTarget);\n isScrolling.value = true;\n onScrollEndDebounced(e);\n onScroll(e);\n };\n useEventListener(\n element,\n \"scroll\",\n throttle ? useThrottleFn(onScrollHandler, throttle, true, false) : onScrollHandler,\n eventListenerOptions\n );\n tryOnMounted(() => {\n try {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n } catch (e) {\n onError(e);\n }\n });\n if ((observe == null ? void 0 : observe.mutation) && element != null && element !== window && element !== document) {\n useMutationObserver(\n element,\n () => {\n const _element = toValue(element);\n if (!_element)\n return;\n setArrivedState(_element);\n },\n {\n attributes: true,\n childList: true,\n subtree: true\n }\n );\n }\n useEventListener(\n element,\n \"scrollend\",\n onScrollEnd,\n eventListenerOptions\n );\n return {\n x,\n y,\n isScrolling,\n arrivedState,\n directions,\n measure() {\n const _element = toValue(element);\n if (window && _element)\n setArrivedState(_element);\n }\n };\n}\n\nfunction useInfiniteScroll(element, onLoadMore, options = {}) {\n var _a;\n const {\n direction = \"bottom\",\n interval = 100,\n canLoadMore = () => true\n } = options;\n const state = reactive(useScroll(\n element,\n {\n ...options,\n offset: {\n [direction]: (_a = options.distance) != null ? _a : 0,\n ...options.offset\n }\n }\n ));\n const promise = ref();\n const isLoading = computed(() => !!promise.value);\n const observedElement = computed(() => {\n return resolveElement(toValue(element));\n });\n const isElementVisible = useElementVisibility(observedElement);\n function checkAndLoad() {\n state.measure();\n if (!observedElement.value || !isElementVisible.value || !canLoadMore(observedElement.value))\n return;\n const { scrollHeight, clientHeight, scrollWidth, clientWidth } = observedElement.value;\n const isNarrower = direction === \"bottom\" || direction === \"top\" ? scrollHeight <= clientHeight : scrollWidth <= clientWidth;\n if (state.arrivedState[direction] || isNarrower) {\n if (!promise.value) {\n promise.value = Promise.all([\n onLoadMore(state),\n new Promise((resolve) => setTimeout(resolve, interval))\n ]).finally(() => {\n promise.value = null;\n nextTick(() => checkAndLoad());\n });\n }\n }\n }\n const stop = watch(\n () => [state.arrivedState[direction], isElementVisible.value],\n checkAndLoad,\n { immediate: true }\n );\n tryOnUnmounted(stop);\n return {\n isLoading,\n reset() {\n nextTick(() => checkAndLoad());\n }\n };\n}\n\nconst defaultEvents = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"];\n// @__NO_SIDE_EFFECTS__\nfunction useKeyModifier(modifier, options = {}) {\n const {\n events = defaultEvents,\n document = defaultDocument,\n initial = null\n } = options;\n const state = shallowRef(initial);\n if (document) {\n events.forEach((listenerEvent) => {\n useEventListener(document, listenerEvent, (evt) => {\n if (typeof evt.getModifierState === \"function\")\n state.value = evt.getModifierState(modifier);\n }, { passive: true });\n });\n }\n return state;\n}\n\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.localStorage, options);\n}\n\nconst DefaultMagicKeysAliasMap = {\n ctrl: \"control\",\n command: \"meta\",\n cmd: \"meta\",\n option: \"alt\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\"\n};\n\nfunction useMagicKeys(options = {}) {\n const {\n reactive: useReactive = false,\n target = defaultWindow,\n aliasMap = DefaultMagicKeysAliasMap,\n passive = true,\n onEventFired = noop\n } = options;\n const current = reactive(/* @__PURE__ */ new Set());\n const obj = {\n toJSON() {\n return {};\n },\n current\n };\n const refs = useReactive ? reactive(obj) : obj;\n const metaDeps = /* @__PURE__ */ new Set();\n const shiftDeps = /* @__PURE__ */ new Set();\n const usedKeys = /* @__PURE__ */ new Set();\n function setRefs(key, value) {\n if (key in refs) {\n if (useReactive)\n refs[key] = value;\n else\n refs[key].value = value;\n }\n }\n function reset() {\n current.clear();\n for (const key of usedKeys)\n setRefs(key, false);\n }\n function updateRefs(e, value) {\n var _a, _b;\n const key = (_a = e.key) == null ? void 0 : _a.toLowerCase();\n const code = (_b = e.code) == null ? void 0 : _b.toLowerCase();\n const values = [code, key].filter(Boolean);\n if (key) {\n if (value)\n current.add(key);\n else\n current.delete(key);\n }\n for (const key2 of values) {\n usedKeys.add(key2);\n setRefs(key2, value);\n }\n if (key === \"shift\" && !value) {\n const shiftDepsArray = Array.from(shiftDeps);\n const shiftIndex = shiftDepsArray.indexOf(\"shift\");\n shiftDepsArray.forEach((key2, index) => {\n if (index >= shiftIndex) {\n current.delete(key2);\n setRefs(key2, false);\n }\n });\n shiftDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Shift\") && value) {\n [...current, ...values].forEach((key2) => shiftDeps.add(key2));\n }\n if (key === \"meta\" && !value) {\n metaDeps.forEach((key2) => {\n current.delete(key2);\n setRefs(key2, false);\n });\n metaDeps.clear();\n } else if (typeof e.getModifierState === \"function\" && e.getModifierState(\"Meta\") && value) {\n [...current, ...values].forEach((key2) => metaDeps.add(key2));\n }\n }\n useEventListener(target, \"keydown\", (e) => {\n updateRefs(e, true);\n return onEventFired(e);\n }, { passive });\n useEventListener(target, \"keyup\", (e) => {\n updateRefs(e, false);\n return onEventFired(e);\n }, { passive });\n useEventListener(\"blur\", reset, { passive });\n useEventListener(\"focus\", reset, { passive });\n const proxy = new Proxy(\n refs,\n {\n get(target2, prop, rec) {\n if (typeof prop !== \"string\")\n return Reflect.get(target2, prop, rec);\n prop = prop.toLowerCase();\n if (prop in aliasMap)\n prop = aliasMap[prop];\n if (!(prop in refs)) {\n if (/[+_-]/.test(prop)) {\n const keys = prop.split(/[+_-]/g).map((i) => i.trim());\n refs[prop] = computed(() => keys.map((key) => toValue(proxy[key])).every(Boolean));\n } else {\n refs[prop] = shallowRef(false);\n }\n }\n const r = Reflect.get(target2, prop, rec);\n return useReactive ? toValue(r) : r;\n }\n }\n );\n return proxy;\n}\n\nfunction usingElRef(source, cb) {\n if (toValue(source))\n cb(toValue(source));\n}\nfunction timeRangeToArray(timeRanges) {\n let ranges = [];\n for (let i = 0; i < timeRanges.length; ++i)\n ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];\n return ranges;\n}\nfunction tracksToArray(tracks) {\n return Array.from(tracks).map(({ label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }, id) => ({ id, label, kind, language, mode, activeCues, cues, inBandMetadataTrackDispatchType }));\n}\nconst defaultOptions = {\n src: \"\",\n tracks: []\n};\nfunction useMediaControls(target, options = {}) {\n target = toRef(target);\n options = {\n ...defaultOptions,\n ...options\n };\n const {\n document = defaultDocument\n } = options;\n const listenerOptions = { passive: true };\n const currentTime = shallowRef(0);\n const duration = shallowRef(0);\n const seeking = shallowRef(false);\n const volume = shallowRef(1);\n const waiting = shallowRef(false);\n const ended = shallowRef(false);\n const playing = shallowRef(false);\n const rate = shallowRef(1);\n const stalled = shallowRef(false);\n const buffered = ref([]);\n const tracks = ref([]);\n const selectedTrack = shallowRef(-1);\n const isPictureInPicture = shallowRef(false);\n const muted = shallowRef(false);\n const supportsPictureInPicture = document && \"pictureInPictureEnabled\" in document;\n const sourceErrorEvent = createEventHook();\n const playbackErrorEvent = createEventHook();\n const disableTrack = (track) => {\n usingElRef(target, (el) => {\n if (track) {\n const id = typeof track === \"number\" ? track : track.id;\n el.textTracks[id].mode = \"disabled\";\n } else {\n for (let i = 0; i < el.textTracks.length; ++i)\n el.textTracks[i].mode = \"disabled\";\n }\n selectedTrack.value = -1;\n });\n };\n const enableTrack = (track, disableTracks = true) => {\n usingElRef(target, (el) => {\n const id = typeof track === \"number\" ? track : track.id;\n if (disableTracks)\n disableTrack();\n el.textTracks[id].mode = \"showing\";\n selectedTrack.value = id;\n });\n };\n const togglePictureInPicture = () => {\n return new Promise((resolve, reject) => {\n usingElRef(target, async (el) => {\n if (supportsPictureInPicture) {\n if (!isPictureInPicture.value) {\n el.requestPictureInPicture().then(resolve).catch(reject);\n } else {\n document.exitPictureInPicture().then(resolve).catch(reject);\n }\n }\n });\n });\n };\n watchEffect(() => {\n if (!document)\n return;\n const el = toValue(target);\n if (!el)\n return;\n const src = toValue(options.src);\n let sources = [];\n if (!src)\n return;\n if (typeof src === \"string\")\n sources = [{ src }];\n else if (Array.isArray(src))\n sources = src;\n else if (isObject(src))\n sources = [src];\n el.querySelectorAll(\"source\").forEach((e) => {\n e.remove();\n });\n sources.forEach(({ src: src2, type, media }) => {\n const source = document.createElement(\"source\");\n source.setAttribute(\"src\", src2);\n source.setAttribute(\"type\", type || \"\");\n source.setAttribute(\"media\", media || \"\");\n useEventListener(source, \"error\", sourceErrorEvent.trigger, listenerOptions);\n el.appendChild(source);\n });\n el.load();\n });\n watch([target, volume], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.volume = volume.value;\n });\n watch([target, muted], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.muted = muted.value;\n });\n watch([target, rate], () => {\n const el = toValue(target);\n if (!el)\n return;\n el.playbackRate = rate.value;\n });\n watchEffect(() => {\n if (!document)\n return;\n const textTracks = toValue(options.tracks);\n const el = toValue(target);\n if (!textTracks || !textTracks.length || !el)\n return;\n el.querySelectorAll(\"track\").forEach((e) => e.remove());\n textTracks.forEach(({ default: isDefault, kind, label, src, srcLang }, i) => {\n const track = document.createElement(\"track\");\n track.default = isDefault || false;\n track.kind = kind;\n track.label = label;\n track.src = src;\n track.srclang = srcLang;\n if (track.default)\n selectedTrack.value = i;\n el.appendChild(track);\n });\n });\n const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(currentTime, (time) => {\n const el = toValue(target);\n if (!el)\n return;\n el.currentTime = time;\n });\n const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(playing, (isPlaying) => {\n const el = toValue(target);\n if (!el)\n return;\n if (isPlaying) {\n el.play().catch((e) => {\n playbackErrorEvent.trigger(e);\n throw e;\n });\n } else {\n el.pause();\n }\n });\n useEventListener(\n target,\n \"timeupdate\",\n () => ignoreCurrentTimeUpdates(() => currentTime.value = toValue(target).currentTime),\n listenerOptions\n );\n useEventListener(\n target,\n \"durationchange\",\n () => duration.value = toValue(target).duration,\n listenerOptions\n );\n useEventListener(\n target,\n \"progress\",\n () => buffered.value = timeRangeToArray(toValue(target).buffered),\n listenerOptions\n );\n useEventListener(\n target,\n \"seeking\",\n () => seeking.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"seeked\",\n () => seeking.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n [\"waiting\", \"loadstart\"],\n () => {\n waiting.value = true;\n ignorePlayingUpdates(() => playing.value = false);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"loadeddata\",\n () => waiting.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"playing\",\n () => {\n waiting.value = false;\n ended.value = false;\n ignorePlayingUpdates(() => playing.value = true);\n },\n listenerOptions\n );\n useEventListener(\n target,\n \"ratechange\",\n () => rate.value = toValue(target).playbackRate,\n listenerOptions\n );\n useEventListener(\n target,\n \"stalled\",\n () => stalled.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"ended\",\n () => ended.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"pause\",\n () => ignorePlayingUpdates(() => playing.value = false),\n listenerOptions\n );\n useEventListener(\n target,\n \"play\",\n () => ignorePlayingUpdates(() => playing.value = true),\n listenerOptions\n );\n useEventListener(\n target,\n \"enterpictureinpicture\",\n () => isPictureInPicture.value = true,\n listenerOptions\n );\n useEventListener(\n target,\n \"leavepictureinpicture\",\n () => isPictureInPicture.value = false,\n listenerOptions\n );\n useEventListener(\n target,\n \"volumechange\",\n () => {\n const el = toValue(target);\n if (!el)\n return;\n volume.value = el.volume;\n muted.value = el.muted;\n },\n listenerOptions\n );\n const listeners = [];\n const stop = watch([target], () => {\n const el = toValue(target);\n if (!el)\n return;\n stop();\n listeners[0] = useEventListener(el.textTracks, \"addtrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[1] = useEventListener(el.textTracks, \"removetrack\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n listeners[2] = useEventListener(el.textTracks, \"change\", () => tracks.value = tracksToArray(el.textTracks), listenerOptions);\n });\n tryOnScopeDispose(() => listeners.forEach((listener) => listener()));\n return {\n currentTime,\n duration,\n waiting,\n seeking,\n ended,\n stalled,\n buffered,\n playing,\n rate,\n // Volume\n volume,\n muted,\n // Tracks\n tracks,\n selectedTrack,\n enableTrack,\n disableTrack,\n // Picture in Picture\n supportsPictureInPicture,\n togglePictureInPicture,\n isPictureInPicture,\n // Events\n onSourceError: sourceErrorEvent.on,\n onPlaybackError: playbackErrorEvent.on\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useMemoize(resolver, options) {\n const initCache = () => {\n if (options == null ? void 0 : options.cache)\n return shallowReactive(options.cache);\n return shallowReactive(/* @__PURE__ */ new Map());\n };\n const cache = initCache();\n const generateKey = (...args) => (options == null ? void 0 : options.getKey) ? options.getKey(...args) : JSON.stringify(args);\n const _loadData = (key, ...args) => {\n cache.set(key, resolver(...args));\n return cache.get(key);\n };\n const loadData = (...args) => _loadData(generateKey(...args), ...args);\n const deleteData = (...args) => {\n cache.delete(generateKey(...args));\n };\n const clearData = () => {\n cache.clear();\n };\n const memoized = (...args) => {\n const key = generateKey(...args);\n if (cache.has(key))\n return cache.get(key);\n return _loadData(key, ...args);\n };\n memoized.load = loadData;\n memoized.delete = deleteData;\n memoized.clear = clearData;\n memoized.generateKey = generateKey;\n memoized.cache = cache;\n return memoized;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useMemory(options = {}) {\n const memory = ref();\n const isSupported = useSupported(() => typeof performance !== \"undefined\" && \"memory\" in performance);\n if (isSupported.value) {\n const { interval = 1e3 } = options;\n useIntervalFn(() => {\n memory.value = performance.memory;\n }, interval, { immediate: options.immediate, immediateCallback: options.immediateCallback });\n }\n return { isSupported, memory };\n}\n\nconst UseMouseBuiltinExtractors = {\n page: (event) => [event.pageX, event.pageY],\n client: (event) => [event.clientX, event.clientY],\n screen: (event) => [event.screenX, event.screenY],\n movement: (event) => event instanceof MouseEvent ? [event.movementX, event.movementY] : null\n};\nfunction useMouse(options = {}) {\n const {\n type = \"page\",\n touch = true,\n resetOnTouchEnds = false,\n initialValue = { x: 0, y: 0 },\n window = defaultWindow,\n target = window,\n scroll = true,\n eventFilter\n } = options;\n let _prevMouseEvent = null;\n let _prevScrollX = 0;\n let _prevScrollY = 0;\n const x = shallowRef(initialValue.x);\n const y = shallowRef(initialValue.y);\n const sourceType = shallowRef(null);\n const extractor = typeof type === \"function\" ? type : UseMouseBuiltinExtractors[type];\n const mouseHandler = (event) => {\n const result = extractor(event);\n _prevMouseEvent = event;\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"mouse\";\n }\n if (window) {\n _prevScrollX = window.scrollX;\n _prevScrollY = window.scrollY;\n }\n };\n const touchHandler = (event) => {\n if (event.touches.length > 0) {\n const result = extractor(event.touches[0]);\n if (result) {\n [x.value, y.value] = result;\n sourceType.value = \"touch\";\n }\n }\n };\n const scrollHandler = () => {\n if (!_prevMouseEvent || !window)\n return;\n const pos = extractor(_prevMouseEvent);\n if (_prevMouseEvent instanceof MouseEvent && pos) {\n x.value = pos[0] + window.scrollX - _prevScrollX;\n y.value = pos[1] + window.scrollY - _prevScrollY;\n }\n };\n const reset = () => {\n x.value = initialValue.x;\n y.value = initialValue.y;\n };\n const mouseHandlerWrapper = eventFilter ? (event) => eventFilter(() => mouseHandler(event), {}) : (event) => mouseHandler(event);\n const touchHandlerWrapper = eventFilter ? (event) => eventFilter(() => touchHandler(event), {}) : (event) => touchHandler(event);\n const scrollHandlerWrapper = eventFilter ? () => eventFilter(() => scrollHandler(), {}) : () => scrollHandler();\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"mousemove\", \"dragover\"], mouseHandlerWrapper, listenerOptions);\n if (touch && type !== \"movement\") {\n useEventListener(target, [\"touchstart\", \"touchmove\"], touchHandlerWrapper, listenerOptions);\n if (resetOnTouchEnds)\n useEventListener(target, \"touchend\", reset, listenerOptions);\n }\n if (scroll && type === \"page\")\n useEventListener(window, \"scroll\", scrollHandlerWrapper, listenerOptions);\n }\n return {\n x,\n y,\n sourceType\n };\n}\n\nfunction useMouseInElement(target, options = {}) {\n const {\n windowResize = true,\n windowScroll = true,\n handleOutside = true,\n window = defaultWindow\n } = options;\n const type = options.type || \"page\";\n const { x, y, sourceType } = useMouse(options);\n const targetRef = shallowRef(target != null ? target : window == null ? void 0 : window.document.body);\n const elementX = shallowRef(0);\n const elementY = shallowRef(0);\n const elementPositionX = shallowRef(0);\n const elementPositionY = shallowRef(0);\n const elementHeight = shallowRef(0);\n const elementWidth = shallowRef(0);\n const isOutside = shallowRef(true);\n function update() {\n if (!window)\n return;\n const el = unrefElement(targetRef);\n if (!el || !(el instanceof Element))\n return;\n const {\n left,\n top,\n width,\n height\n } = el.getBoundingClientRect();\n elementPositionX.value = left + (type === \"page\" ? window.pageXOffset : 0);\n elementPositionY.value = top + (type === \"page\" ? window.pageYOffset : 0);\n elementHeight.value = height;\n elementWidth.value = width;\n const elX = x.value - elementPositionX.value;\n const elY = y.value - elementPositionY.value;\n isOutside.value = width === 0 || height === 0 || elX < 0 || elY < 0 || elX > width || elY > height;\n if (handleOutside || !isOutside.value) {\n elementX.value = elX;\n elementY.value = elY;\n }\n }\n const stopFnList = [];\n function stop() {\n stopFnList.forEach((fn) => fn());\n stopFnList.length = 0;\n }\n tryOnMounted(() => {\n update();\n });\n if (window) {\n const {\n stop: stopResizeObserver\n } = useResizeObserver(targetRef, update);\n const {\n stop: stopMutationObserver\n } = useMutationObserver(targetRef, update, {\n attributeFilter: [\"style\", \"class\"]\n });\n const stopWatch = watch(\n [targetRef, x, y],\n update\n );\n stopFnList.push(\n stopResizeObserver,\n stopMutationObserver,\n stopWatch\n );\n useEventListener(\n document,\n \"mouseleave\",\n () => isOutside.value = true,\n { passive: true }\n );\n if (windowScroll) {\n stopFnList.push(\n useEventListener(\"scroll\", update, { capture: true, passive: true })\n );\n }\n if (windowResize) {\n stopFnList.push(\n useEventListener(\"resize\", update, { passive: true })\n );\n }\n }\n return {\n x,\n y,\n sourceType,\n elementX,\n elementY,\n elementPositionX,\n elementPositionY,\n elementHeight,\n elementWidth,\n isOutside,\n stop\n };\n}\n\nfunction useMousePressed(options = {}) {\n const {\n touch = true,\n drag = true,\n capture = false,\n initialValue = false,\n window = defaultWindow\n } = options;\n const pressed = shallowRef(initialValue);\n const sourceType = shallowRef(null);\n if (!window) {\n return {\n pressed,\n sourceType\n };\n }\n const onPressed = (srcType) => (event) => {\n var _a;\n pressed.value = true;\n sourceType.value = srcType;\n (_a = options.onPressed) == null ? void 0 : _a.call(options, event);\n };\n const onReleased = (event) => {\n var _a;\n pressed.value = false;\n sourceType.value = null;\n (_a = options.onReleased) == null ? void 0 : _a.call(options, event);\n };\n const target = computed(() => unrefElement(options.target) || window);\n const listenerOptions = { passive: true, capture };\n useEventListener(target, \"mousedown\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"mouseleave\", onReleased, listenerOptions);\n useEventListener(window, \"mouseup\", onReleased, listenerOptions);\n if (drag) {\n useEventListener(target, \"dragstart\", onPressed(\"mouse\"), listenerOptions);\n useEventListener(window, \"drop\", onReleased, listenerOptions);\n useEventListener(window, \"dragend\", onReleased, listenerOptions);\n }\n if (touch) {\n useEventListener(target, \"touchstart\", onPressed(\"touch\"), listenerOptions);\n useEventListener(window, \"touchend\", onReleased, listenerOptions);\n useEventListener(window, \"touchcancel\", onReleased, listenerOptions);\n }\n return {\n pressed,\n sourceType\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useNavigatorLanguage(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"language\" in navigator);\n const language = shallowRef(navigator == null ? void 0 : navigator.language);\n useEventListener(window, \"languagechange\", () => {\n if (navigator)\n language.value = navigator.language;\n }, { passive: true });\n return {\n isSupported,\n language\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useNetwork(options = {}) {\n const { window = defaultWindow } = options;\n const navigator = window == null ? void 0 : window.navigator;\n const isSupported = useSupported(() => navigator && \"connection\" in navigator);\n const isOnline = shallowRef(true);\n const saveData = shallowRef(false);\n const offlineAt = shallowRef(void 0);\n const onlineAt = shallowRef(void 0);\n const downlink = shallowRef(void 0);\n const downlinkMax = shallowRef(void 0);\n const rtt = shallowRef(void 0);\n const effectiveType = shallowRef(void 0);\n const type = shallowRef(\"unknown\");\n const connection = isSupported.value && navigator.connection;\n function updateNetworkInformation() {\n if (!navigator)\n return;\n isOnline.value = navigator.onLine;\n offlineAt.value = isOnline.value ? void 0 : Date.now();\n onlineAt.value = isOnline.value ? Date.now() : void 0;\n if (connection) {\n downlink.value = connection.downlink;\n downlinkMax.value = connection.downlinkMax;\n effectiveType.value = connection.effectiveType;\n rtt.value = connection.rtt;\n saveData.value = connection.saveData;\n type.value = connection.type;\n }\n }\n const listenerOptions = { passive: true };\n if (window) {\n useEventListener(window, \"offline\", () => {\n isOnline.value = false;\n offlineAt.value = Date.now();\n }, listenerOptions);\n useEventListener(window, \"online\", () => {\n isOnline.value = true;\n onlineAt.value = Date.now();\n }, listenerOptions);\n }\n if (connection)\n useEventListener(connection, \"change\", updateNetworkInformation, listenerOptions);\n updateNetworkInformation();\n return {\n isSupported,\n isOnline: readonly(isOnline),\n saveData: readonly(saveData),\n offlineAt: readonly(offlineAt),\n onlineAt: readonly(onlineAt),\n downlink: readonly(downlink),\n downlinkMax: readonly(downlinkMax),\n effectiveType: readonly(effectiveType),\n rtt: readonly(rtt),\n type: readonly(type)\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useNow(options = {}) {\n const {\n controls: exposeControls = false,\n interval = \"requestAnimationFrame\",\n immediate = true\n } = options;\n const now = ref(/* @__PURE__ */ new Date());\n const update = () => now.value = /* @__PURE__ */ new Date();\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(update, { immediate }) : useIntervalFn(update, interval, { immediate });\n if (exposeControls) {\n return {\n now,\n ...controls\n };\n } else {\n return now;\n }\n}\n\nfunction useObjectUrl(object) {\n const url = shallowRef();\n const release = () => {\n if (url.value)\n URL.revokeObjectURL(url.value);\n url.value = void 0;\n };\n watch(\n () => toValue(object),\n (newObject) => {\n release();\n if (newObject)\n url.value = URL.createObjectURL(newObject);\n },\n { immediate: true }\n );\n tryOnScopeDispose(release);\n return readonly(url);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useClamp(value, min, max) {\n if (typeof value === \"function\" || isReadonly(value))\n return computed(() => clamp(toValue(value), toValue(min), toValue(max)));\n const _value = ref(value);\n return computed({\n get() {\n return _value.value = clamp(_value.value, toValue(min), toValue(max));\n },\n set(value2) {\n _value.value = clamp(value2, toValue(min), toValue(max));\n }\n });\n}\n\nfunction useOffsetPagination(options) {\n const {\n total = Number.POSITIVE_INFINITY,\n pageSize = 10,\n page = 1,\n onPageChange = noop,\n onPageSizeChange = noop,\n onPageCountChange = noop\n } = options;\n const currentPageSize = useClamp(pageSize, 1, Number.POSITIVE_INFINITY);\n const pageCount = computed(() => Math.max(\n 1,\n Math.ceil(toValue(total) / toValue(currentPageSize))\n ));\n const currentPage = useClamp(page, 1, pageCount);\n const isFirstPage = computed(() => currentPage.value === 1);\n const isLastPage = computed(() => currentPage.value === pageCount.value);\n if (isRef(page)) {\n syncRef(page, currentPage, {\n direction: isReadonly(page) ? \"ltr\" : \"both\"\n });\n }\n if (isRef(pageSize)) {\n syncRef(pageSize, currentPageSize, {\n direction: isReadonly(pageSize) ? \"ltr\" : \"both\"\n });\n }\n function prev() {\n currentPage.value--;\n }\n function next() {\n currentPage.value++;\n }\n const returnValue = {\n currentPage,\n currentPageSize,\n pageCount,\n isFirstPage,\n isLastPage,\n prev,\n next\n };\n watch(currentPage, () => {\n onPageChange(reactive(returnValue));\n });\n watch(currentPageSize, () => {\n onPageSizeChange(reactive(returnValue));\n });\n watch(pageCount, () => {\n onPageCountChange(reactive(returnValue));\n });\n return returnValue;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useOnline(options = {}) {\n const { isOnline } = useNetwork(options);\n return isOnline;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePageLeave(options = {}) {\n const { window = defaultWindow } = options;\n const isLeft = shallowRef(false);\n const handler = (event) => {\n if (!window)\n return;\n event = event || window.event;\n const from = event.relatedTarget || event.toElement;\n isLeft.value = !from;\n };\n if (window) {\n const listenerOptions = { passive: true };\n useEventListener(window, \"mouseout\", handler, listenerOptions);\n useEventListener(window.document, \"mouseleave\", handler, listenerOptions);\n useEventListener(window.document, \"mouseenter\", handler, listenerOptions);\n }\n return isLeft;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useScreenOrientation(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const isSupported = useSupported(() => window && \"screen\" in window && \"orientation\" in window.screen);\n const screenOrientation = isSupported.value ? window.screen.orientation : {};\n const orientation = ref(screenOrientation.type);\n const angle = shallowRef(screenOrientation.angle || 0);\n if (isSupported.value) {\n useEventListener(window, \"orientationchange\", () => {\n orientation.value = screenOrientation.type;\n angle.value = screenOrientation.angle;\n }, { passive: true });\n }\n const lockOrientation = (type) => {\n if (isSupported.value && typeof screenOrientation.lock === \"function\")\n return screenOrientation.lock(type);\n return Promise.reject(new Error(\"Not supported\"));\n };\n const unlockOrientation = () => {\n if (isSupported.value && typeof screenOrientation.unlock === \"function\")\n screenOrientation.unlock();\n };\n return {\n isSupported,\n orientation,\n angle,\n lockOrientation,\n unlockOrientation\n };\n}\n\nfunction useParallax(target, options = {}) {\n const {\n deviceOrientationTiltAdjust = (i) => i,\n deviceOrientationRollAdjust = (i) => i,\n mouseTiltAdjust = (i) => i,\n mouseRollAdjust = (i) => i,\n window = defaultWindow\n } = options;\n const orientation = reactive(useDeviceOrientation({ window }));\n const screenOrientation = reactive(useScreenOrientation({ window }));\n const {\n elementX: x,\n elementY: y,\n elementWidth: width,\n elementHeight: height\n } = useMouseInElement(target, { handleOutside: false, window });\n const source = computed(() => {\n if (orientation.isSupported && (orientation.alpha != null && orientation.alpha !== 0 || orientation.gamma != null && orientation.gamma !== 0)) {\n return \"deviceOrientation\";\n }\n return \"mouse\";\n });\n const roll = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.gamma / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.gamma / 90;\n break;\n case \"portrait-primary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-secondary\":\n value = orientation.beta / 90;\n break;\n default:\n value = -orientation.beta / 90;\n }\n return deviceOrientationRollAdjust(value);\n } else {\n const value = -(y.value - height.value / 2) / height.value;\n return mouseRollAdjust(value);\n }\n });\n const tilt = computed(() => {\n if (source.value === \"deviceOrientation\") {\n let value;\n switch (screenOrientation.orientation) {\n case \"landscape-primary\":\n value = orientation.beta / 90;\n break;\n case \"landscape-secondary\":\n value = -orientation.beta / 90;\n break;\n case \"portrait-primary\":\n value = orientation.gamma / 90;\n break;\n case \"portrait-secondary\":\n value = -orientation.gamma / 90;\n break;\n default:\n value = orientation.gamma / 90;\n }\n return deviceOrientationTiltAdjust(value);\n } else {\n const value = (x.value - width.value / 2) / width.value;\n return mouseTiltAdjust(value);\n }\n });\n return { roll, tilt, source };\n}\n\nfunction useParentElement(element = useCurrentElement()) {\n const parentElement = shallowRef();\n const update = () => {\n const el = unrefElement(element);\n if (el)\n parentElement.value = el.parentElement;\n };\n tryOnMounted(update);\n watch(() => toValue(element), update);\n return parentElement;\n}\n\nfunction usePerformanceObserver(options, callback) {\n const {\n window = defaultWindow,\n immediate = true,\n ...performanceOptions\n } = options;\n const isSupported = useSupported(() => window && \"PerformanceObserver\" in window);\n let observer;\n const stop = () => {\n observer == null ? void 0 : observer.disconnect();\n };\n const start = () => {\n if (isSupported.value) {\n stop();\n observer = new PerformanceObserver(callback);\n observer.observe(performanceOptions);\n }\n };\n tryOnScopeDispose(stop);\n if (immediate)\n start();\n return {\n isSupported,\n start,\n stop\n };\n}\n\nconst defaultState = {\n x: 0,\n y: 0,\n pointerId: 0,\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n width: 0,\n height: 0,\n twist: 0,\n pointerType: null\n};\nconst keys = /* @__PURE__ */ Object.keys(defaultState);\nfunction usePointer(options = {}) {\n const {\n target = defaultWindow\n } = options;\n const isInside = shallowRef(false);\n const state = shallowRef(options.initialValue || {});\n Object.assign(state.value, defaultState, state.value);\n const handler = (event) => {\n isInside.value = true;\n if (options.pointerTypes && !options.pointerTypes.includes(event.pointerType))\n return;\n state.value = objectPick(event, keys, false);\n };\n if (target) {\n const listenerOptions = { passive: true };\n useEventListener(target, [\"pointerdown\", \"pointermove\", \"pointerup\"], handler, listenerOptions);\n useEventListener(target, \"pointerleave\", () => isInside.value = false, listenerOptions);\n }\n return {\n ...toRefs(state),\n isInside\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePointerLock(target, options = {}) {\n const { document = defaultDocument } = options;\n const isSupported = useSupported(() => document && \"pointerLockElement\" in document);\n const element = shallowRef();\n const triggerElement = shallowRef();\n let targetElement;\n if (isSupported.value) {\n const listenerOptions = { passive: true };\n useEventListener(document, \"pointerlockchange\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n element.value = document.pointerLockElement;\n if (!element.value)\n targetElement = triggerElement.value = null;\n }\n }, listenerOptions);\n useEventListener(document, \"pointerlockerror\", () => {\n var _a;\n const currentElement = (_a = document.pointerLockElement) != null ? _a : element.value;\n if (targetElement && currentElement === targetElement) {\n const action = document.pointerLockElement ? \"release\" : \"acquire\";\n throw new Error(`Failed to ${action} pointer lock.`);\n }\n }, listenerOptions);\n }\n async function lock(e) {\n var _a;\n if (!isSupported.value)\n throw new Error(\"Pointer Lock API is not supported by your browser.\");\n triggerElement.value = e instanceof Event ? e.currentTarget : null;\n targetElement = e instanceof Event ? (_a = unrefElement(target)) != null ? _a : triggerElement.value : unrefElement(e);\n if (!targetElement)\n throw new Error(\"Target element undefined.\");\n targetElement.requestPointerLock();\n return await until(element).toBe(targetElement);\n }\n async function unlock() {\n if (!element.value)\n return false;\n document.exitPointerLock();\n await until(element).toBeNull();\n return true;\n }\n return {\n isSupported,\n element,\n triggerElement,\n lock,\n unlock\n };\n}\n\nfunction usePointerSwipe(target, options = {}) {\n const targetRef = toRef(target);\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n disableTextSelect = false\n } = options;\n const posStart = reactive({ x: 0, y: 0 });\n const updatePosStart = (x, y) => {\n posStart.x = x;\n posStart.y = y;\n };\n const posEnd = reactive({ x: 0, y: 0 });\n const updatePosEnd = (x, y) => {\n posEnd.x = x;\n posEnd.y = y;\n };\n const distanceX = computed(() => posStart.x - posEnd.x);\n const distanceY = computed(() => posStart.y - posEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(distanceX.value), abs(distanceY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const isPointerDown = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(distanceX.value) > abs(distanceY.value)) {\n return distanceX.value > 0 ? \"left\" : \"right\";\n } else {\n return distanceY.value > 0 ? \"up\" : \"down\";\n }\n });\n const eventIsAllowed = (e) => {\n var _a, _b, _c;\n const isReleasingButton = e.buttons === 0;\n const isPrimaryButton = e.buttons === 1;\n return (_c = (_b = (_a = options.pointerTypes) == null ? void 0 : _a.includes(e.pointerType)) != null ? _b : isReleasingButton || isPrimaryButton) != null ? _c : true;\n };\n const listenerOptions = { passive: true };\n const stops = [\n useEventListener(target, \"pointerdown\", (e) => {\n if (!eventIsAllowed(e))\n return;\n isPointerDown.value = true;\n const eventTarget = e.target;\n eventTarget == null ? void 0 : eventTarget.setPointerCapture(e.pointerId);\n const { clientX: x, clientY: y } = e;\n updatePosStart(x, y);\n updatePosEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"pointermove\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (!isPointerDown.value)\n return;\n const { clientX: x, clientY: y } = e;\n updatePosEnd(x, y);\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, \"pointerup\", (e) => {\n if (!eventIsAllowed(e))\n return;\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isPointerDown.value = false;\n isSwiping.value = false;\n }, listenerOptions)\n ];\n tryOnMounted(() => {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n (_b = (_a = targetRef.value) == null ? void 0 : _a.style) == null ? void 0 : _b.setProperty(\"touch-action\", \"pan-y\");\n if (disableTextSelect) {\n (_d = (_c = targetRef.value) == null ? void 0 : _c.style) == null ? void 0 : _d.setProperty(\"-webkit-user-select\", \"none\");\n (_f = (_e = targetRef.value) == null ? void 0 : _e.style) == null ? void 0 : _f.setProperty(\"-ms-user-select\", \"none\");\n (_h = (_g = targetRef.value) == null ? void 0 : _g.style) == null ? void 0 : _h.setProperty(\"user-select\", \"none\");\n }\n });\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping: readonly(isSwiping),\n direction: readonly(direction),\n posStart: readonly(posStart),\n posEnd: readonly(posEnd),\n distanceX,\n distanceY,\n stop\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredColorScheme(options) {\n const isLight = useMediaQuery(\"(prefers-color-scheme: light)\", options);\n const isDark = useMediaQuery(\"(prefers-color-scheme: dark)\", options);\n return computed(() => {\n if (isDark.value)\n return \"dark\";\n if (isLight.value)\n return \"light\";\n return \"no-preference\";\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredContrast(options) {\n const isMore = useMediaQuery(\"(prefers-contrast: more)\", options);\n const isLess = useMediaQuery(\"(prefers-contrast: less)\", options);\n const isCustom = useMediaQuery(\"(prefers-contrast: custom)\", options);\n return computed(() => {\n if (isMore.value)\n return \"more\";\n if (isLess.value)\n return \"less\";\n if (isCustom.value)\n return \"custom\";\n return \"no-preference\";\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredLanguages(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return shallowRef([\"en\"]);\n const navigator = window.navigator;\n const value = shallowRef(navigator.languages);\n useEventListener(window, \"languagechange\", () => {\n value.value = navigator.languages;\n }, { passive: true });\n return value;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredReducedMotion(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-motion: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction usePreferredReducedTransparency(options) {\n const isReduced = useMediaQuery(\"(prefers-reduced-transparency: reduce)\", options);\n return computed(() => {\n if (isReduced.value)\n return \"reduce\";\n return \"no-preference\";\n });\n}\n\nfunction usePrevious(value, initialValue) {\n const previous = shallowRef(initialValue);\n watch(\n toRef(value),\n (_, oldValue) => {\n previous.value = oldValue;\n },\n { flush: \"sync\" }\n );\n return readonly(previous);\n}\n\nconst topVarName = \"--vueuse-safe-area-top\";\nconst rightVarName = \"--vueuse-safe-area-right\";\nconst bottomVarName = \"--vueuse-safe-area-bottom\";\nconst leftVarName = \"--vueuse-safe-area-left\";\nfunction useScreenSafeArea() {\n const top = shallowRef(\"\");\n const right = shallowRef(\"\");\n const bottom = shallowRef(\"\");\n const left = shallowRef(\"\");\n if (isClient) {\n const topCssVar = useCssVar(topVarName);\n const rightCssVar = useCssVar(rightVarName);\n const bottomCssVar = useCssVar(bottomVarName);\n const leftCssVar = useCssVar(leftVarName);\n topCssVar.value = \"env(safe-area-inset-top, 0px)\";\n rightCssVar.value = \"env(safe-area-inset-right, 0px)\";\n bottomCssVar.value = \"env(safe-area-inset-bottom, 0px)\";\n leftCssVar.value = \"env(safe-area-inset-left, 0px)\";\n tryOnMounted(update);\n useEventListener(\"resize\", useDebounceFn(update), { passive: true });\n }\n function update() {\n top.value = getValue(topVarName);\n right.value = getValue(rightVarName);\n bottom.value = getValue(bottomVarName);\n left.value = getValue(leftVarName);\n }\n return {\n top,\n right,\n bottom,\n left,\n update\n };\n}\nfunction getValue(position) {\n return getComputedStyle(document.documentElement).getPropertyValue(position);\n}\n\nfunction useScriptTag(src, onLoaded = noop, options = {}) {\n const {\n immediate = true,\n manual = false,\n type = \"text/javascript\",\n async = true,\n crossOrigin,\n referrerPolicy,\n noModule,\n defer,\n document = defaultDocument,\n attrs = {},\n nonce = void 0\n } = options;\n const scriptTag = shallowRef(null);\n let _promise = null;\n const loadScript = (waitForScriptLoad) => new Promise((resolve, reject) => {\n const resolveWithElement = (el2) => {\n scriptTag.value = el2;\n resolve(el2);\n return el2;\n };\n if (!document) {\n resolve(false);\n return;\n }\n let shouldAppend = false;\n let el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (!el) {\n el = document.createElement(\"script\");\n el.type = type;\n el.async = async;\n el.src = toValue(src);\n if (defer)\n el.defer = defer;\n if (crossOrigin)\n el.crossOrigin = crossOrigin;\n if (noModule)\n el.noModule = noModule;\n if (referrerPolicy)\n el.referrerPolicy = referrerPolicy;\n if (nonce) {\n el.nonce = nonce;\n }\n Object.entries(attrs).forEach(([name, value]) => el == null ? void 0 : el.setAttribute(name, value));\n shouldAppend = true;\n } else if (el.hasAttribute(\"data-loaded\")) {\n resolveWithElement(el);\n }\n const listenerOptions = {\n passive: true\n };\n useEventListener(el, \"error\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"abort\", (event) => reject(event), listenerOptions);\n useEventListener(el, \"load\", () => {\n el.setAttribute(\"data-loaded\", \"true\");\n onLoaded(el);\n resolveWithElement(el);\n }, listenerOptions);\n if (shouldAppend)\n el = document.head.appendChild(el);\n if (!waitForScriptLoad)\n resolveWithElement(el);\n });\n const load = (waitForScriptLoad = true) => {\n if (!_promise)\n _promise = loadScript(waitForScriptLoad);\n return _promise;\n };\n const unload = () => {\n if (!document)\n return;\n _promise = null;\n if (scriptTag.value)\n scriptTag.value = null;\n const el = document.querySelector(`script[src=\"${toValue(src)}\"]`);\n if (el)\n document.head.removeChild(el);\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnUnmounted(unload);\n return { scriptTag, load, unload };\n}\n\nfunction checkOverflowScroll(ele) {\n const style = window.getComputedStyle(ele);\n if (style.overflowX === \"scroll\" || style.overflowY === \"scroll\" || style.overflowX === \"auto\" && ele.clientWidth < ele.scrollWidth || style.overflowY === \"auto\" && ele.clientHeight < ele.scrollHeight) {\n return true;\n } else {\n const parent = ele.parentNode;\n if (!parent || parent.tagName === \"BODY\")\n return false;\n return checkOverflowScroll(parent);\n }\n}\nfunction preventDefault(rawEvent) {\n const e = rawEvent || window.event;\n const _target = e.target;\n if (checkOverflowScroll(_target))\n return false;\n if (e.touches.length > 1)\n return true;\n if (e.preventDefault)\n e.preventDefault();\n return false;\n}\nconst elInitialOverflow = /* @__PURE__ */ new WeakMap();\nfunction useScrollLock(element, initialState = false) {\n const isLocked = shallowRef(initialState);\n let stopTouchMoveListener = null;\n let initialOverflow = \"\";\n watch(toRef(element), (el) => {\n const target = resolveElement(toValue(el));\n if (target) {\n const ele = target;\n if (!elInitialOverflow.get(ele))\n elInitialOverflow.set(ele, ele.style.overflow);\n if (ele.style.overflow !== \"hidden\")\n initialOverflow = ele.style.overflow;\n if (ele.style.overflow === \"hidden\")\n return isLocked.value = true;\n if (isLocked.value)\n return ele.style.overflow = \"hidden\";\n }\n }, {\n immediate: true\n });\n const lock = () => {\n const el = resolveElement(toValue(element));\n if (!el || isLocked.value)\n return;\n if (isIOS) {\n stopTouchMoveListener = useEventListener(\n el,\n \"touchmove\",\n (e) => {\n preventDefault(e);\n },\n { passive: false }\n );\n }\n el.style.overflow = \"hidden\";\n isLocked.value = true;\n };\n const unlock = () => {\n const el = resolveElement(toValue(element));\n if (!el || !isLocked.value)\n return;\n if (isIOS)\n stopTouchMoveListener == null ? void 0 : stopTouchMoveListener();\n el.style.overflow = initialOverflow;\n elInitialOverflow.delete(el);\n isLocked.value = false;\n };\n tryOnScopeDispose(unlock);\n return computed({\n get() {\n return isLocked.value;\n },\n set(v) {\n if (v)\n lock();\n else unlock();\n }\n });\n}\n\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { window = defaultWindow } = options;\n return useStorage(key, initialValue, window == null ? void 0 : window.sessionStorage, options);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useShare(shareOptions = {}, options = {}) {\n const { navigator = defaultNavigator } = options;\n const _navigator = navigator;\n const isSupported = useSupported(() => _navigator && \"canShare\" in _navigator);\n const share = async (overrideOptions = {}) => {\n if (isSupported.value) {\n const data = {\n ...toValue(shareOptions),\n ...toValue(overrideOptions)\n };\n let granted = true;\n if (data.files && _navigator.canShare)\n granted = _navigator.canShare({ files: data.files });\n if (granted)\n return _navigator.share(data);\n }\n };\n return {\n isSupported,\n share\n };\n}\n\nconst defaultSortFn = (source, compareFn) => source.sort(compareFn);\nconst defaultCompare = (a, b) => a - b;\nfunction useSorted(...args) {\n var _a, _b, _c, _d;\n const [source] = args;\n let compareFn = defaultCompare;\n let options = {};\n if (args.length === 2) {\n if (typeof args[1] === \"object\") {\n options = args[1];\n compareFn = (_a = options.compareFn) != null ? _a : defaultCompare;\n } else {\n compareFn = (_b = args[1]) != null ? _b : defaultCompare;\n }\n } else if (args.length > 2) {\n compareFn = (_c = args[1]) != null ? _c : defaultCompare;\n options = (_d = args[2]) != null ? _d : {};\n }\n const {\n dirty = false,\n sortFn = defaultSortFn\n } = options;\n if (!dirty)\n return computed(() => sortFn([...toValue(source)], compareFn));\n watchEffect(() => {\n const result = sortFn(toValue(source), compareFn);\n if (isRef(source))\n source.value = result;\n else\n source.splice(0, source.length, ...result);\n });\n return source;\n}\n\nfunction useSpeechRecognition(options = {}) {\n const {\n interimResults = true,\n continuous = true,\n maxAlternatives = 1,\n window = defaultWindow\n } = options;\n const lang = toRef(options.lang || \"en-US\");\n const isListening = shallowRef(false);\n const isFinal = shallowRef(false);\n const result = shallowRef(\"\");\n const error = shallowRef(void 0);\n let recognition;\n const start = () => {\n isListening.value = true;\n };\n const stop = () => {\n isListening.value = false;\n };\n const toggle = (value = !isListening.value) => {\n if (value) {\n start();\n } else {\n stop();\n }\n };\n const SpeechRecognition = window && (window.SpeechRecognition || window.webkitSpeechRecognition);\n const isSupported = useSupported(() => SpeechRecognition);\n if (isSupported.value) {\n recognition = new SpeechRecognition();\n recognition.continuous = continuous;\n recognition.interimResults = interimResults;\n recognition.lang = toValue(lang);\n recognition.maxAlternatives = maxAlternatives;\n recognition.onstart = () => {\n isListening.value = true;\n isFinal.value = false;\n };\n watch(lang, (lang2) => {\n if (recognition && !isListening.value)\n recognition.lang = lang2;\n });\n recognition.onresult = (event) => {\n const currentResult = event.results[event.resultIndex];\n const { transcript } = currentResult[0];\n isFinal.value = currentResult.isFinal;\n result.value = transcript;\n error.value = void 0;\n };\n recognition.onerror = (event) => {\n error.value = event;\n };\n recognition.onend = () => {\n isListening.value = false;\n recognition.lang = toValue(lang);\n };\n watch(isListening, (newValue, oldValue) => {\n if (newValue === oldValue)\n return;\n if (newValue)\n recognition.start();\n else\n recognition.stop();\n });\n }\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n isListening,\n isFinal,\n recognition,\n result,\n error,\n toggle,\n start,\n stop\n };\n}\n\nfunction useSpeechSynthesis(text, options = {}) {\n const {\n pitch = 1,\n rate = 1,\n volume = 1,\n window = defaultWindow,\n onBoundary\n } = options;\n const synth = window && window.speechSynthesis;\n const isSupported = useSupported(() => synth);\n const isPlaying = shallowRef(false);\n const status = shallowRef(\"init\");\n const spokenText = toRef(text || \"\");\n const lang = toRef(options.lang || \"en-US\");\n const error = shallowRef(void 0);\n const toggle = (value = !isPlaying.value) => {\n isPlaying.value = value;\n };\n const bindEventsForUtterance = (utterance2) => {\n utterance2.lang = toValue(lang);\n utterance2.voice = toValue(options.voice) || null;\n utterance2.pitch = toValue(pitch);\n utterance2.rate = toValue(rate);\n utterance2.volume = toValue(volume);\n utterance2.onstart = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onpause = () => {\n isPlaying.value = false;\n status.value = \"pause\";\n };\n utterance2.onresume = () => {\n isPlaying.value = true;\n status.value = \"play\";\n };\n utterance2.onend = () => {\n isPlaying.value = false;\n status.value = \"end\";\n };\n utterance2.onerror = (event) => {\n error.value = event;\n };\n utterance2.onboundary = (event) => {\n onBoundary == null ? void 0 : onBoundary(event);\n };\n };\n const utterance = computed(() => {\n isPlaying.value = false;\n status.value = \"init\";\n const newUtterance = new SpeechSynthesisUtterance(spokenText.value);\n bindEventsForUtterance(newUtterance);\n return newUtterance;\n });\n const speak = () => {\n synth.cancel();\n if (utterance)\n synth.speak(utterance.value);\n };\n const stop = () => {\n synth.cancel();\n isPlaying.value = false;\n };\n if (isSupported.value) {\n bindEventsForUtterance(utterance.value);\n watch(lang, (lang2) => {\n if (utterance.value && !isPlaying.value)\n utterance.value.lang = lang2;\n });\n if (options.voice) {\n watch(options.voice, () => {\n synth.cancel();\n });\n }\n watch(isPlaying, () => {\n if (isPlaying.value)\n synth.resume();\n else\n synth.pause();\n });\n }\n tryOnScopeDispose(() => {\n isPlaying.value = false;\n });\n return {\n isSupported,\n isPlaying,\n status,\n utterance,\n error,\n stop,\n toggle,\n speak\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useStepper(steps, initialStep) {\n const stepsRef = ref(steps);\n const stepNames = computed(() => Array.isArray(stepsRef.value) ? stepsRef.value : Object.keys(stepsRef.value));\n const index = ref(stepNames.value.indexOf(initialStep != null ? initialStep : stepNames.value[0]));\n const current = computed(() => at(index.value));\n const isFirst = computed(() => index.value === 0);\n const isLast = computed(() => index.value === stepNames.value.length - 1);\n const next = computed(() => stepNames.value[index.value + 1]);\n const previous = computed(() => stepNames.value[index.value - 1]);\n function at(index2) {\n if (Array.isArray(stepsRef.value))\n return stepsRef.value[index2];\n return stepsRef.value[stepNames.value[index2]];\n }\n function get(step) {\n if (!stepNames.value.includes(step))\n return;\n return at(stepNames.value.indexOf(step));\n }\n function goTo(step) {\n if (stepNames.value.includes(step))\n index.value = stepNames.value.indexOf(step);\n }\n function goToNext() {\n if (isLast.value)\n return;\n index.value++;\n }\n function goToPrevious() {\n if (isFirst.value)\n return;\n index.value--;\n }\n function goBackTo(step) {\n if (isAfter(step))\n goTo(step);\n }\n function isNext(step) {\n return stepNames.value.indexOf(step) === index.value + 1;\n }\n function isPrevious(step) {\n return stepNames.value.indexOf(step) === index.value - 1;\n }\n function isCurrent(step) {\n return stepNames.value.indexOf(step) === index.value;\n }\n function isBefore(step) {\n return index.value < stepNames.value.indexOf(step);\n }\n function isAfter(step) {\n return index.value > stepNames.value.indexOf(step);\n }\n return {\n steps: stepsRef,\n stepNames,\n index,\n current,\n next,\n previous,\n isFirst,\n isLast,\n at,\n get,\n goTo,\n goToNext,\n goToPrevious,\n goBackTo,\n isNext,\n isPrevious,\n isCurrent,\n isBefore,\n isAfter\n };\n}\n\nfunction useStorageAsync(key, initialValue, storage, options = {}) {\n var _a;\n const {\n flush = \"pre\",\n deep = true,\n listenToStorageChanges = true,\n writeDefaults = true,\n mergeDefaults = false,\n shallow,\n window = defaultWindow,\n eventFilter,\n onError = (e) => {\n console.error(e);\n },\n onReady\n } = options;\n const rawInit = toValue(initialValue);\n const type = guessSerializerType(rawInit);\n const data = (shallow ? shallowRef : ref)(toValue(initialValue));\n const serializer = (_a = options.serializer) != null ? _a : StorageSerializers[type];\n if (!storage) {\n try {\n storage = getSSRHandler(\"getDefaultStorageAsync\", () => {\n var _a2;\n return (_a2 = defaultWindow) == null ? void 0 : _a2.localStorage;\n })();\n } catch (e) {\n onError(e);\n }\n }\n async function read(event) {\n if (!storage || event && event.key !== key)\n return;\n try {\n const rawValue = event ? event.newValue : await storage.getItem(key);\n if (rawValue == null) {\n data.value = rawInit;\n if (writeDefaults && rawInit !== null)\n await storage.setItem(key, await serializer.write(rawInit));\n } else if (mergeDefaults) {\n const value = await serializer.read(rawValue);\n if (typeof mergeDefaults === \"function\")\n data.value = mergeDefaults(value, rawInit);\n else if (type === \"object\" && !Array.isArray(value))\n data.value = { ...rawInit, ...value };\n else data.value = value;\n } else {\n data.value = await serializer.read(rawValue);\n }\n } catch (e) {\n onError(e);\n }\n }\n const promise = new Promise((resolve) => {\n read().then(() => {\n onReady == null ? void 0 : onReady(data.value);\n resolve(data);\n });\n });\n if (window && listenToStorageChanges)\n useEventListener(window, \"storage\", (e) => Promise.resolve().then(() => read(e)), { passive: true });\n if (storage) {\n watchWithFilter(\n data,\n async () => {\n try {\n if (data.value == null)\n await storage.removeItem(key);\n else\n await storage.setItem(key, await serializer.write(data.value));\n } catch (e) {\n onError(e);\n }\n },\n {\n flush,\n deep,\n eventFilter\n }\n );\n }\n Object.assign(data, {\n then: promise.then.bind(promise),\n catch: promise.catch.bind(promise)\n });\n return data;\n}\n\nlet _id = 0;\nfunction useStyleTag(css, options = {}) {\n const isLoaded = shallowRef(false);\n const {\n document = defaultDocument,\n immediate = true,\n manual = false,\n id = `vueuse_styletag_${++_id}`\n } = options;\n const cssRef = shallowRef(css);\n let stop = () => {\n };\n const load = () => {\n if (!document)\n return;\n const el = document.getElementById(id) || document.createElement(\"style\");\n if (!el.isConnected) {\n el.id = id;\n if (options.nonce)\n el.nonce = options.nonce;\n if (options.media)\n el.media = options.media;\n document.head.appendChild(el);\n }\n if (isLoaded.value)\n return;\n stop = watch(\n cssRef,\n (value) => {\n el.textContent = value;\n },\n { immediate: true }\n );\n isLoaded.value = true;\n };\n const unload = () => {\n if (!document || !isLoaded.value)\n return;\n stop();\n document.head.removeChild(document.getElementById(id));\n isLoaded.value = false;\n };\n if (immediate && !manual)\n tryOnMounted(load);\n if (!manual)\n tryOnScopeDispose(unload);\n return {\n id,\n css: cssRef,\n unload,\n load,\n isLoaded: readonly(isLoaded)\n };\n}\n\nfunction useSwipe(target, options = {}) {\n const {\n threshold = 50,\n onSwipe,\n onSwipeEnd,\n onSwipeStart,\n passive = true\n } = options;\n const coordsStart = reactive({ x: 0, y: 0 });\n const coordsEnd = reactive({ x: 0, y: 0 });\n const diffX = computed(() => coordsStart.x - coordsEnd.x);\n const diffY = computed(() => coordsStart.y - coordsEnd.y);\n const { max, abs } = Math;\n const isThresholdExceeded = computed(() => max(abs(diffX.value), abs(diffY.value)) >= threshold);\n const isSwiping = shallowRef(false);\n const direction = computed(() => {\n if (!isThresholdExceeded.value)\n return \"none\";\n if (abs(diffX.value) > abs(diffY.value)) {\n return diffX.value > 0 ? \"left\" : \"right\";\n } else {\n return diffY.value > 0 ? \"up\" : \"down\";\n }\n });\n const getTouchEventCoords = (e) => [e.touches[0].clientX, e.touches[0].clientY];\n const updateCoordsStart = (x, y) => {\n coordsStart.x = x;\n coordsStart.y = y;\n };\n const updateCoordsEnd = (x, y) => {\n coordsEnd.x = x;\n coordsEnd.y = y;\n };\n const listenerOptions = { passive, capture: !passive };\n const onTouchEnd = (e) => {\n if (isSwiping.value)\n onSwipeEnd == null ? void 0 : onSwipeEnd(e, direction.value);\n isSwiping.value = false;\n };\n const stops = [\n useEventListener(target, \"touchstart\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsStart(x, y);\n updateCoordsEnd(x, y);\n onSwipeStart == null ? void 0 : onSwipeStart(e);\n }, listenerOptions),\n useEventListener(target, \"touchmove\", (e) => {\n if (e.touches.length !== 1)\n return;\n const [x, y] = getTouchEventCoords(e);\n updateCoordsEnd(x, y);\n if (listenerOptions.capture && !listenerOptions.passive && Math.abs(diffX.value) > Math.abs(diffY.value))\n e.preventDefault();\n if (!isSwiping.value && isThresholdExceeded.value)\n isSwiping.value = true;\n if (isSwiping.value)\n onSwipe == null ? void 0 : onSwipe(e);\n }, listenerOptions),\n useEventListener(target, [\"touchend\", \"touchcancel\"], onTouchEnd, listenerOptions)\n ];\n const stop = () => stops.forEach((s) => s());\n return {\n isSwiping,\n direction,\n coordsStart,\n coordsEnd,\n lengthX: diffX,\n lengthY: diffY,\n stop,\n // TODO: Remove in the next major version\n isPassiveEventSupported: true\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useTemplateRefsList() {\n const refs = ref([]);\n refs.value.set = (el) => {\n if (el)\n refs.value.push(el);\n };\n onBeforeUpdate(() => {\n refs.value.length = 0;\n });\n return refs;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useTextDirection(options = {}) {\n const {\n document = defaultDocument,\n selector = \"html\",\n observe = false,\n initialValue = \"ltr\"\n } = options;\n function getValue() {\n var _a, _b;\n return (_b = (_a = document == null ? void 0 : document.querySelector(selector)) == null ? void 0 : _a.getAttribute(\"dir\")) != null ? _b : initialValue;\n }\n const dir = ref(getValue());\n tryOnMounted(() => dir.value = getValue());\n if (observe && document) {\n useMutationObserver(\n document.querySelector(selector),\n () => dir.value = getValue(),\n { attributes: true }\n );\n }\n return computed({\n get() {\n return dir.value;\n },\n set(v) {\n var _a, _b;\n dir.value = v;\n if (!document)\n return;\n if (dir.value)\n (_a = document.querySelector(selector)) == null ? void 0 : _a.setAttribute(\"dir\", dir.value);\n else\n (_b = document.querySelector(selector)) == null ? void 0 : _b.removeAttribute(\"dir\");\n }\n });\n}\n\nfunction getRangesFromSelection(selection) {\n var _a;\n const rangeCount = (_a = selection.rangeCount) != null ? _a : 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\n// @__NO_SIDE_EFFECTS__\nfunction useTextSelection(options = {}) {\n const {\n window = defaultWindow\n } = options;\n const selection = ref(null);\n const text = computed(() => {\n var _a, _b;\n return (_b = (_a = selection.value) == null ? void 0 : _a.toString()) != null ? _b : \"\";\n });\n const ranges = computed(() => selection.value ? getRangesFromSelection(selection.value) : []);\n const rects = computed(() => ranges.value.map((range) => range.getBoundingClientRect()));\n function onSelectionChange() {\n selection.value = null;\n if (window)\n selection.value = window.getSelection();\n }\n if (window)\n useEventListener(window.document, \"selectionchange\", onSelectionChange, { passive: true });\n return {\n text,\n rects,\n ranges,\n selection\n };\n}\n\nfunction tryRequestAnimationFrame(window = defaultWindow, fn) {\n if (window && typeof window.requestAnimationFrame === \"function\") {\n window.requestAnimationFrame(fn);\n } else {\n fn();\n }\n}\nfunction useTextareaAutosize(options = {}) {\n var _a, _b;\n const { window = defaultWindow } = options;\n const textarea = toRef(options == null ? void 0 : options.element);\n const input = toRef((_a = options == null ? void 0 : options.input) != null ? _a : \"\");\n const styleProp = (_b = options == null ? void 0 : options.styleProp) != null ? _b : \"height\";\n const textareaScrollHeight = shallowRef(1);\n const textareaOldWidth = shallowRef(0);\n function triggerResize() {\n var _a2;\n if (!textarea.value)\n return;\n let height = \"\";\n textarea.value.style[styleProp] = \"1px\";\n textareaScrollHeight.value = (_a2 = textarea.value) == null ? void 0 : _a2.scrollHeight;\n const _styleTarget = toValue(options == null ? void 0 : options.styleTarget);\n if (_styleTarget)\n _styleTarget.style[styleProp] = `${textareaScrollHeight.value}px`;\n else\n height = `${textareaScrollHeight.value}px`;\n textarea.value.style[styleProp] = height;\n }\n watch([input, textarea], () => nextTick(triggerResize), { immediate: true });\n watch(textareaScrollHeight, () => {\n var _a2;\n return (_a2 = options == null ? void 0 : options.onResize) == null ? void 0 : _a2.call(options);\n });\n useResizeObserver(textarea, ([{ contentRect }]) => {\n if (textareaOldWidth.value === contentRect.width)\n return;\n tryRequestAnimationFrame(window, () => {\n textareaOldWidth.value = contentRect.width;\n triggerResize();\n });\n });\n if (options == null ? void 0 : options.watch)\n watch(options.watch, triggerResize, { immediate: true, deep: true });\n return {\n textarea,\n input,\n triggerResize\n };\n}\n\nfunction useThrottledRefHistory(source, options = {}) {\n const { throttle = 200, trailing = true } = options;\n const filter = throttleFilter(throttle, trailing);\n const history = useRefHistory(source, { ...options, eventFilter: filter });\n return {\n ...history\n };\n}\n\nconst DEFAULT_UNITS = [\n { max: 6e4, value: 1e3, name: \"second\" },\n { max: 276e4, value: 6e4, name: \"minute\" },\n { max: 72e6, value: 36e5, name: \"hour\" },\n { max: 5184e5, value: 864e5, name: \"day\" },\n { max: 24192e5, value: 6048e5, name: \"week\" },\n { max: 28512e6, value: 2592e6, name: \"month\" },\n { max: Number.POSITIVE_INFINITY, value: 31536e6, name: \"year\" }\n];\nconst DEFAULT_MESSAGES = {\n justNow: \"just now\",\n past: (n) => n.match(/\\d/) ? `${n} ago` : n,\n future: (n) => n.match(/\\d/) ? `in ${n}` : n,\n month: (n, past) => n === 1 ? past ? \"last month\" : \"next month\" : `${n} month${n > 1 ? \"s\" : \"\"}`,\n year: (n, past) => n === 1 ? past ? \"last year\" : \"next year\" : `${n} year${n > 1 ? \"s\" : \"\"}`,\n day: (n, past) => n === 1 ? past ? \"yesterday\" : \"tomorrow\" : `${n} day${n > 1 ? \"s\" : \"\"}`,\n week: (n, past) => n === 1 ? past ? \"last week\" : \"next week\" : `${n} week${n > 1 ? \"s\" : \"\"}`,\n hour: (n) => `${n} hour${n > 1 ? \"s\" : \"\"}`,\n minute: (n) => `${n} minute${n > 1 ? \"s\" : \"\"}`,\n second: (n) => `${n} second${n > 1 ? \"s\" : \"\"}`,\n invalid: \"\"\n};\nfunction DEFAULT_FORMATTER(date) {\n return date.toISOString().slice(0, 10);\n}\n// @__NO_SIDE_EFFECTS__\nfunction useTimeAgo(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const timeAgo = computed(() => formatTimeAgo(new Date(toValue(time)), options, toValue(now)));\n if (exposeControls) {\n return {\n timeAgo,\n ...controls\n };\n } else {\n return timeAgo;\n }\n}\nfunction formatTimeAgo(from, options = {}, now = Date.now()) {\n var _a;\n const {\n max,\n messages = DEFAULT_MESSAGES,\n fullDateFormatter = DEFAULT_FORMATTER,\n units = DEFAULT_UNITS,\n showSecond = false,\n rounding = \"round\"\n } = options;\n const roundFn = typeof rounding === \"number\" ? (n) => +n.toFixed(rounding) : Math[rounding];\n const diff = +now - +from;\n const absDiff = Math.abs(diff);\n function getValue(diff2, unit) {\n return roundFn(Math.abs(diff2) / unit.value);\n }\n function format(diff2, unit) {\n const val = getValue(diff2, unit);\n const past = diff2 > 0;\n const str = applyFormat(unit.name, val, past);\n return applyFormat(past ? \"past\" : \"future\", str, past);\n }\n function applyFormat(name, val, isPast) {\n const formatter = messages[name];\n if (typeof formatter === \"function\")\n return formatter(val, isPast);\n return formatter.replace(\"{0}\", val.toString());\n }\n if (absDiff < 6e4 && !showSecond)\n return messages.justNow;\n if (typeof max === \"number\" && absDiff > max)\n return fullDateFormatter(new Date(from));\n if (typeof max === \"string\") {\n const unitMax = (_a = units.find((i) => i.name === max)) == null ? void 0 : _a.max;\n if (unitMax && absDiff > unitMax)\n return fullDateFormatter(new Date(from));\n }\n for (const [idx, unit] of units.entries()) {\n const val = getValue(diff, unit);\n if (val <= 0 && units[idx - 1])\n return format(diff, units[idx - 1]);\n if (absDiff < unit.max)\n return format(diff, unit);\n }\n return messages.invalid;\n}\n\nconst UNITS = [\n { name: \"year\", ms: 31536e6 },\n { name: \"month\", ms: 2592e6 },\n { name: \"week\", ms: 6048e5 },\n { name: \"day\", ms: 864e5 },\n { name: \"hour\", ms: 36e5 },\n { name: \"minute\", ms: 6e4 },\n { name: \"second\", ms: 1e3 }\n];\nfunction useTimeAgoIntl(time, options = {}) {\n const {\n controls: exposeControls = false,\n updateInterval = 3e4\n } = options;\n const { now, ...controls } = useNow({ interval: updateInterval, controls: true });\n const result = computed(\n () => getTimeAgoIntlResult(new Date(toValue(time)), options, toValue(now))\n );\n const parts = computed(() => result.value.parts);\n const timeAgoIntl = computed(\n () => formatTimeAgoIntlParts(parts.value, {\n ...options,\n locale: result.value.resolvedLocale\n })\n );\n return exposeControls ? { timeAgoIntl, parts, ...controls } : timeAgoIntl;\n}\nfunction formatTimeAgoIntl(from, options = {}, now = Date.now()) {\n const { parts, resolvedLocale } = getTimeAgoIntlResult(from, options, now);\n return formatTimeAgoIntlParts(parts, {\n ...options,\n locale: resolvedLocale\n });\n}\nfunction getTimeAgoIntlResult(from, options = {}, now = Date.now()) {\n const {\n locale,\n relativeTimeFormatOptions = { numeric: \"auto\" }\n } = options;\n const rtf = new Intl.RelativeTimeFormat(locale, relativeTimeFormatOptions);\n const { locale: resolvedLocale } = rtf.resolvedOptions();\n const diff = +from - +now;\n const absDiff = Math.abs(diff);\n for (const { name, ms } of UNITS) {\n if (absDiff >= ms) {\n return {\n resolvedLocale,\n parts: rtf.formatToParts(Math.round(diff / ms), name)\n };\n }\n }\n return {\n resolvedLocale,\n parts: rtf.formatToParts(0, \"second\")\n };\n}\nfunction formatTimeAgoIntlParts(parts, options = {}) {\n const {\n insertSpace = true,\n joinParts,\n locale\n } = options;\n if (typeof joinParts === \"function\")\n return joinParts(parts, locale);\n if (!insertSpace)\n return parts.map((part) => part.value).join(\"\");\n return parts.map((part) => part.value.trim()).join(\" \");\n}\n\nfunction useTimeoutPoll(fn, interval, options = {}) {\n const {\n immediate = true,\n immediateCallback = false\n } = options;\n const { start } = useTimeoutFn(loop, interval, { immediate });\n const isActive = shallowRef(false);\n async function loop() {\n if (!isActive.value)\n return;\n await fn();\n start();\n }\n function resume() {\n if (!isActive.value) {\n isActive.value = true;\n if (immediateCallback)\n fn();\n start();\n }\n }\n function pause() {\n isActive.value = false;\n }\n if (immediate && isClient)\n resume();\n tryOnScopeDispose(pause);\n return {\n isActive,\n pause,\n resume\n };\n}\n\nfunction useTimestamp(options = {}) {\n const {\n controls: exposeControls = false,\n offset = 0,\n immediate = true,\n interval = \"requestAnimationFrame\",\n callback\n } = options;\n const ts = shallowRef(timestamp() + offset);\n const update = () => ts.value = timestamp() + offset;\n const cb = callback ? () => {\n update();\n callback(ts.value);\n } : update;\n const controls = interval === \"requestAnimationFrame\" ? useRafFn(cb, { immediate }) : useIntervalFn(cb, interval, { immediate });\n if (exposeControls) {\n return {\n timestamp: ts,\n ...controls\n };\n } else {\n return ts;\n }\n}\n\nfunction useTitle(newTitle = null, options = {}) {\n var _a, _b, _c;\n const {\n document = defaultDocument,\n restoreOnUnmount = (t) => t\n } = options;\n const originalTitle = (_a = document == null ? void 0 : document.title) != null ? _a : \"\";\n const title = toRef((_b = newTitle != null ? newTitle : document == null ? void 0 : document.title) != null ? _b : null);\n const isReadonly = !!(newTitle && typeof newTitle === \"function\");\n function format(t) {\n if (!(\"titleTemplate\" in options))\n return t;\n const template = options.titleTemplate || \"%s\";\n return typeof template === \"function\" ? template(t) : toValue(template).replace(/%s/g, t);\n }\n watch(\n title,\n (newValue, oldValue) => {\n if (newValue !== oldValue && document)\n document.title = format(newValue != null ? newValue : \"\");\n },\n { immediate: true }\n );\n if (options.observe && !options.titleTemplate && document && !isReadonly) {\n useMutationObserver(\n (_c = document.head) == null ? void 0 : _c.querySelector(\"title\"),\n () => {\n if (document && document.title !== title.value)\n title.value = format(document.title);\n },\n { childList: true }\n );\n }\n tryOnScopeDispose(() => {\n if (restoreOnUnmount) {\n const restoredTitle = restoreOnUnmount(originalTitle, title.value || \"\");\n if (restoredTitle != null && document)\n document.title = restoredTitle;\n }\n });\n return title;\n}\n\nconst _TransitionPresets = {\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInQuart: [0.5, 0, 0.75, 0],\n easeOutQuart: [0.25, 1, 0.5, 1],\n easeInOutQuart: [0.76, 0, 0.24, 1],\n easeInQuint: [0.64, 0, 0.78, 0],\n easeOutQuint: [0.22, 1, 0.36, 1],\n easeInOutQuint: [0.83, 0, 0.17, 1],\n easeInExpo: [0.7, 0, 0.84, 0],\n easeOutExpo: [0.16, 1, 0.3, 1],\n easeInOutExpo: [0.87, 0, 0.13, 1],\n easeInCirc: [0.55, 0, 1, 0.45],\n easeOutCirc: [0, 0.55, 0.45, 1],\n easeInOutCirc: [0.85, 0, 0.15, 1],\n easeInBack: [0.36, 0, 0.66, -0.56],\n easeOutBack: [0.34, 1.56, 0.64, 1],\n easeInOutBack: [0.68, -0.6, 0.32, 1.6]\n};\nconst TransitionPresets = /* @__PURE__ */ Object.assign({}, { linear: identity }, _TransitionPresets);\nfunction createEasingFunction([p0, p1, p2, p3]) {\n const a = (a1, a2) => 1 - 3 * a2 + 3 * a1;\n const b = (a1, a2) => 3 * a2 - 6 * a1;\n const c = (a1) => 3 * a1;\n const calcBezier = (t, a1, a2) => ((a(a1, a2) * t + b(a1, a2)) * t + c(a1)) * t;\n const getSlope = (t, a1, a2) => 3 * a(a1, a2) * t * t + 2 * b(a1, a2) * t + c(a1);\n const getTforX = (x) => {\n let aGuessT = x;\n for (let i = 0; i < 4; ++i) {\n const currentSlope = getSlope(aGuessT, p0, p2);\n if (currentSlope === 0)\n return aGuessT;\n const currentX = calcBezier(aGuessT, p0, p2) - x;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n };\n return (x) => p0 === p1 && p2 === p3 ? x : calcBezier(getTforX(x), p1, p3);\n}\nfunction lerp(a, b, alpha) {\n return a + alpha * (b - a);\n}\nfunction toVec(t) {\n return (typeof t === \"number\" ? [t] : t) || [];\n}\nfunction executeTransition(source, from, to, options = {}) {\n var _a, _b;\n const {\n window = defaultWindow\n } = options;\n const fromVal = toValue(from);\n const toVal = toValue(to);\n const v1 = toVec(fromVal);\n const v2 = toVec(toVal);\n const duration = (_a = toValue(options.duration)) != null ? _a : 1e3;\n const startedAt = Date.now();\n const endAt = Date.now() + duration;\n const trans = typeof options.transition === \"function\" ? options.transition : (_b = toValue(options.transition)) != null ? _b : identity;\n const ease = typeof trans === \"function\" ? trans : createEasingFunction(trans);\n return new Promise((resolve) => {\n source.value = fromVal;\n const tick = () => {\n var _a2;\n if ((_a2 = options.abort) == null ? void 0 : _a2.call(options)) {\n resolve();\n return;\n }\n const now = Date.now();\n const alpha = ease((now - startedAt) / duration);\n const arr = toVec(source.value).map((n, i) => lerp(v1[i], v2[i], alpha));\n if (Array.isArray(source.value))\n source.value = arr.map((n, i) => {\n var _a3, _b2;\n return lerp((_a3 = v1[i]) != null ? _a3 : 0, (_b2 = v2[i]) != null ? _b2 : 0, alpha);\n });\n else if (typeof source.value === \"number\")\n source.value = arr[0];\n if (now < endAt) {\n window == null ? void 0 : window.requestAnimationFrame(tick);\n } else {\n source.value = toVal;\n resolve();\n }\n };\n tick();\n });\n}\nfunction useTransition(source, options = {}) {\n let currentId = 0;\n const sourceVal = () => {\n const v = toValue(source);\n return typeof v === \"number\" ? v : v.map(toValue);\n };\n const outputRef = ref(sourceVal());\n watch(sourceVal, async (to) => {\n var _a, _b;\n if (toValue(options.disabled))\n return;\n const id = ++currentId;\n if (options.delay)\n await promiseTimeout(toValue(options.delay));\n if (id !== currentId)\n return;\n const toVal = Array.isArray(to) ? to.map(toValue) : toValue(to);\n (_a = options.onStarted) == null ? void 0 : _a.call(options);\n await executeTransition(outputRef, outputRef.value, toVal, {\n ...options,\n abort: () => {\n var _a2;\n return id !== currentId || ((_a2 = options.abort) == null ? void 0 : _a2.call(options));\n }\n });\n (_b = options.onFinished) == null ? void 0 : _b.call(options);\n }, { deep: true });\n watch(() => toValue(options.disabled), (disabled) => {\n if (disabled) {\n currentId++;\n outputRef.value = sourceVal();\n }\n });\n tryOnScopeDispose(() => {\n currentId++;\n });\n return computed(() => toValue(options.disabled) ? sourceVal() : outputRef.value);\n}\n\nfunction useUrlSearchParams(mode = \"history\", options = {}) {\n const {\n initialValue = {},\n removeNullishValues = true,\n removeFalsyValues = false,\n write: enableWrite = true,\n writeMode = \"replace\",\n window = defaultWindow,\n stringify = (params) => params.toString()\n } = options;\n if (!window)\n return reactive(initialValue);\n const state = reactive({});\n function getRawParams() {\n if (mode === \"history\") {\n return window.location.search || \"\";\n } else if (mode === \"hash\") {\n const hash = window.location.hash || \"\";\n const index = hash.indexOf(\"?\");\n return index > 0 ? hash.slice(index) : \"\";\n } else {\n return (window.location.hash || \"\").replace(/^#/, \"\");\n }\n }\n function constructQuery(params) {\n const stringified = stringify(params);\n if (mode === \"history\")\n return `${stringified ? `?${stringified}` : \"\"}${window.location.hash || \"\"}`;\n if (mode === \"hash-params\")\n return `${window.location.search || \"\"}${stringified ? `#${stringified}` : \"\"}`;\n const hash = window.location.hash || \"#\";\n const index = hash.indexOf(\"?\");\n if (index > 0)\n return `${window.location.search || \"\"}${hash.slice(0, index)}${stringified ? `?${stringified}` : \"\"}`;\n return `${window.location.search || \"\"}${hash}${stringified ? `?${stringified}` : \"\"}`;\n }\n function read() {\n return new URLSearchParams(getRawParams());\n }\n function updateState(params) {\n const unusedKeys = new Set(Object.keys(state));\n for (const key of params.keys()) {\n const paramsForKey = params.getAll(key);\n state[key] = paramsForKey.length > 1 ? paramsForKey : params.get(key) || \"\";\n unusedKeys.delete(key);\n }\n Array.from(unusedKeys).forEach((key) => delete state[key]);\n }\n const { pause, resume } = pausableWatch(\n state,\n () => {\n const params = new URLSearchParams(\"\");\n Object.keys(state).forEach((key) => {\n const mapEntry = state[key];\n if (Array.isArray(mapEntry))\n mapEntry.forEach((value) => params.append(key, value));\n else if (removeNullishValues && mapEntry == null)\n params.delete(key);\n else if (removeFalsyValues && !mapEntry)\n params.delete(key);\n else\n params.set(key, mapEntry);\n });\n write(params, false);\n },\n { deep: true }\n );\n function write(params, shouldUpdate, shouldWriteHistory = true) {\n pause();\n if (shouldUpdate)\n updateState(params);\n if (writeMode === \"replace\") {\n window.history.replaceState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n } else {\n if (shouldWriteHistory) {\n window.history.pushState(\n window.history.state,\n window.document.title,\n window.location.pathname + constructQuery(params)\n );\n }\n }\n nextTick(() => resume());\n }\n function onChanged() {\n if (!enableWrite)\n return;\n write(read(), true, false);\n }\n const listenerOptions = { passive: true };\n useEventListener(window, \"popstate\", onChanged, listenerOptions);\n if (mode !== \"history\")\n useEventListener(window, \"hashchange\", onChanged, listenerOptions);\n const initial = read();\n if (initial.keys().next().value)\n updateState(initial);\n else\n Object.assign(state, initialValue);\n return state;\n}\n\nfunction useUserMedia(options = {}) {\n var _a, _b;\n const enabled = shallowRef((_a = options.enabled) != null ? _a : false);\n const autoSwitch = shallowRef((_b = options.autoSwitch) != null ? _b : true);\n const constraints = ref(options.constraints);\n const { navigator = defaultNavigator } = options;\n const isSupported = useSupported(() => {\n var _a2;\n return (_a2 = navigator == null ? void 0 : navigator.mediaDevices) == null ? void 0 : _a2.getUserMedia;\n });\n const stream = shallowRef();\n function getDeviceOptions(type) {\n switch (type) {\n case \"video\": {\n if (constraints.value)\n return constraints.value.video || false;\n break;\n }\n case \"audio\": {\n if (constraints.value)\n return constraints.value.audio || false;\n break;\n }\n }\n }\n async function _start() {\n if (!isSupported.value || stream.value)\n return;\n stream.value = await navigator.mediaDevices.getUserMedia({\n video: getDeviceOptions(\"video\"),\n audio: getDeviceOptions(\"audio\")\n });\n return stream.value;\n }\n function _stop() {\n var _a2;\n (_a2 = stream.value) == null ? void 0 : _a2.getTracks().forEach((t) => t.stop());\n stream.value = void 0;\n }\n function stop() {\n _stop();\n enabled.value = false;\n }\n async function start() {\n await _start();\n if (stream.value)\n enabled.value = true;\n return stream.value;\n }\n async function restart() {\n _stop();\n return await start();\n }\n watch(\n enabled,\n (v) => {\n if (v)\n _start();\n else _stop();\n },\n { immediate: true }\n );\n watch(\n constraints,\n () => {\n if (autoSwitch.value && stream.value)\n restart();\n },\n { immediate: true }\n );\n tryOnScopeDispose(() => {\n stop();\n });\n return {\n isSupported,\n stream,\n start,\n stop,\n restart,\n constraints,\n enabled,\n autoSwitch\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useVModel(props, key, emit, options = {}) {\n var _a, _b, _c;\n const {\n clone = false,\n passive = false,\n eventName,\n deep = false,\n defaultValue,\n shouldEmit\n } = options;\n const vm = getCurrentInstance();\n const _emit = emit || (vm == null ? void 0 : vm.emit) || ((_a = vm == null ? void 0 : vm.$emit) == null ? void 0 : _a.bind(vm)) || ((_c = (_b = vm == null ? void 0 : vm.proxy) == null ? void 0 : _b.$emit) == null ? void 0 : _c.bind(vm == null ? void 0 : vm.proxy));\n let event = eventName;\n if (!key) {\n key = \"modelValue\";\n }\n event = event || `update:${key.toString()}`;\n const cloneFn = (val) => !clone ? val : typeof clone === \"function\" ? clone(val) : cloneFnJSON(val);\n const getValue = () => isDef(props[key]) ? cloneFn(props[key]) : defaultValue;\n const triggerEmit = (value) => {\n if (shouldEmit) {\n if (shouldEmit(value))\n _emit(event, value);\n } else {\n _emit(event, value);\n }\n };\n if (passive) {\n const initialValue = getValue();\n const proxy = ref(initialValue);\n let isUpdating = false;\n watch(\n () => props[key],\n (v) => {\n if (!isUpdating) {\n isUpdating = true;\n proxy.value = cloneFn(v);\n nextTick(() => isUpdating = false);\n }\n }\n );\n watch(\n proxy,\n (v) => {\n if (!isUpdating && (v !== props[key] || deep))\n triggerEmit(v);\n },\n { deep }\n );\n return proxy;\n } else {\n return computed({\n get() {\n return getValue();\n },\n set(value) {\n triggerEmit(value);\n }\n });\n }\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useVModels(props, emit, options = {}) {\n const ret = {};\n for (const key in props) {\n ret[key] = useVModel(\n props,\n key,\n emit,\n options\n );\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useVibrate(options) {\n const {\n pattern = [],\n interval = 0,\n navigator = defaultNavigator\n } = options || {};\n const isSupported = useSupported(() => typeof navigator !== \"undefined\" && \"vibrate\" in navigator);\n const patternRef = toRef(pattern);\n let intervalControls;\n const vibrate = (pattern2 = patternRef.value) => {\n if (isSupported.value)\n navigator.vibrate(pattern2);\n };\n const stop = () => {\n if (isSupported.value)\n navigator.vibrate(0);\n intervalControls == null ? void 0 : intervalControls.pause();\n };\n if (interval > 0) {\n intervalControls = useIntervalFn(\n vibrate,\n interval,\n {\n immediate: false,\n immediateCallback: false\n }\n );\n }\n return {\n isSupported,\n pattern,\n intervalControls,\n vibrate,\n stop\n };\n}\n\nfunction useVirtualList(list, options) {\n const { containerStyle, wrapperProps, scrollTo, calculateRange, currentList, containerRef } = \"itemHeight\" in options ? useVerticalVirtualList(options, list) : useHorizontalVirtualList(options, list);\n return {\n list: currentList,\n scrollTo,\n containerProps: {\n ref: containerRef,\n onScroll: () => {\n calculateRange();\n },\n style: containerStyle\n },\n wrapperProps\n };\n}\nfunction useVirtualListResources(list) {\n const containerRef = shallowRef(null);\n const size = useElementSize(containerRef);\n const currentList = ref([]);\n const source = shallowRef(list);\n const state = ref({ start: 0, end: 10 });\n return { state, source, currentList, size, containerRef };\n}\nfunction createGetViewCapacity(state, source, itemSize) {\n return (containerSize) => {\n if (typeof itemSize === \"number\")\n return Math.ceil(containerSize / itemSize);\n const { start = 0 } = state.value;\n let sum = 0;\n let capacity = 0;\n for (let i = start; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n capacity = i;\n if (sum > containerSize)\n break;\n }\n return capacity - start;\n };\n}\nfunction createGetOffset(source, itemSize) {\n return (scrollDirection) => {\n if (typeof itemSize === \"number\")\n return Math.floor(scrollDirection / itemSize) + 1;\n let sum = 0;\n let offset = 0;\n for (let i = 0; i < source.value.length; i++) {\n const size = itemSize(i);\n sum += size;\n if (sum >= scrollDirection) {\n offset = i;\n break;\n }\n }\n return offset + 1;\n };\n}\nfunction createCalculateRange(type, overscan, getOffset, getViewCapacity, { containerRef, state, currentList, source }) {\n return () => {\n const element = containerRef.value;\n if (element) {\n const offset = getOffset(type === \"vertical\" ? element.scrollTop : element.scrollLeft);\n const viewCapacity = getViewCapacity(type === \"vertical\" ? element.clientHeight : element.clientWidth);\n const from = offset - overscan;\n const to = offset + viewCapacity + overscan;\n state.value = {\n start: from < 0 ? 0 : from,\n end: to > source.value.length ? source.value.length : to\n };\n currentList.value = source.value.slice(state.value.start, state.value.end).map((ele, index) => ({\n data: ele,\n index: index + state.value.start\n }));\n }\n };\n}\nfunction createGetDistance(itemSize, source) {\n return (index) => {\n if (typeof itemSize === \"number\") {\n const size2 = index * itemSize;\n return size2;\n }\n const size = source.value.slice(0, index).reduce((sum, _, i) => sum + itemSize(i), 0);\n return size;\n };\n}\nfunction useWatchForSizes(size, list, containerRef, calculateRange) {\n watch([size.width, size.height, () => toValue(list), containerRef], () => {\n calculateRange();\n });\n}\nfunction createComputedTotalSize(itemSize, source) {\n return computed(() => {\n if (typeof itemSize === \"number\")\n return source.value.length * itemSize;\n return source.value.reduce((sum, _, index) => sum + itemSize(index), 0);\n });\n}\nconst scrollToDictionaryForElementScrollKey = {\n horizontal: \"scrollLeft\",\n vertical: \"scrollTop\"\n};\nfunction createScrollTo(type, calculateRange, getDistance, containerRef) {\n return (index) => {\n if (containerRef.value) {\n containerRef.value[scrollToDictionaryForElementScrollKey[type]] = getDistance(index);\n calculateRange();\n }\n };\n}\nfunction useHorizontalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowX: \"auto\" };\n const { itemWidth, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemWidth);\n const getOffset = createGetOffset(source, itemWidth);\n const calculateRange = createCalculateRange(\"horizontal\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceLeft = createGetDistance(itemWidth, source);\n const offsetLeft = computed(() => getDistanceLeft(state.value.start));\n const totalWidth = createComputedTotalSize(itemWidth, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"horizontal\", calculateRange, getDistanceLeft, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n height: \"100%\",\n width: `${totalWidth.value - offsetLeft.value}px`,\n marginLeft: `${offsetLeft.value}px`,\n display: \"flex\"\n }\n };\n });\n return {\n scrollTo,\n calculateRange,\n wrapperProps,\n containerStyle,\n currentList,\n containerRef\n };\n}\nfunction useVerticalVirtualList(options, list) {\n const resources = useVirtualListResources(list);\n const { state, source, currentList, size, containerRef } = resources;\n const containerStyle = { overflowY: \"auto\" };\n const { itemHeight, overscan = 5 } = options;\n const getViewCapacity = createGetViewCapacity(state, source, itemHeight);\n const getOffset = createGetOffset(source, itemHeight);\n const calculateRange = createCalculateRange(\"vertical\", overscan, getOffset, getViewCapacity, resources);\n const getDistanceTop = createGetDistance(itemHeight, source);\n const offsetTop = computed(() => getDistanceTop(state.value.start));\n const totalHeight = createComputedTotalSize(itemHeight, source);\n useWatchForSizes(size, list, containerRef, calculateRange);\n const scrollTo = createScrollTo(\"vertical\", calculateRange, getDistanceTop, containerRef);\n const wrapperProps = computed(() => {\n return {\n style: {\n width: \"100%\",\n height: `${totalHeight.value - offsetTop.value}px`,\n marginTop: `${offsetTop.value}px`\n }\n };\n });\n return {\n calculateRange,\n scrollTo,\n containerStyle,\n wrapperProps,\n currentList,\n containerRef\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useWakeLock(options = {}) {\n const {\n navigator = defaultNavigator,\n document = defaultDocument\n } = options;\n const requestedType = shallowRef(false);\n const sentinel = shallowRef(null);\n const documentVisibility = useDocumentVisibility({ document });\n const isSupported = useSupported(() => navigator && \"wakeLock\" in navigator);\n const isActive = computed(() => !!sentinel.value && documentVisibility.value === \"visible\");\n if (isSupported.value) {\n useEventListener(sentinel, \"release\", () => {\n var _a, _b;\n requestedType.value = (_b = (_a = sentinel.value) == null ? void 0 : _a.type) != null ? _b : false;\n }, { passive: true });\n whenever(\n () => documentVisibility.value === \"visible\" && (document == null ? void 0 : document.visibilityState) === \"visible\" && requestedType.value,\n (type) => {\n requestedType.value = false;\n forceRequest(type);\n }\n );\n }\n async function forceRequest(type) {\n var _a;\n await ((_a = sentinel.value) == null ? void 0 : _a.release());\n sentinel.value = isSupported.value ? await navigator.wakeLock.request(type) : null;\n }\n async function request(type) {\n if (documentVisibility.value === \"visible\")\n await forceRequest(type);\n else\n requestedType.value = type;\n }\n async function release() {\n requestedType.value = false;\n const s = sentinel.value;\n sentinel.value = null;\n await (s == null ? void 0 : s.release());\n }\n return {\n sentinel,\n isSupported,\n isActive,\n request,\n forceRequest,\n release\n };\n}\n\nfunction useWebNotification(options = {}) {\n const {\n window = defaultWindow,\n requestPermissions: _requestForPermissions = true\n } = options;\n const defaultWebNotificationOptions = options;\n const isSupported = useSupported(() => {\n if (!window || !(\"Notification\" in window))\n return false;\n if (Notification.permission === \"granted\")\n return true;\n try {\n const notification2 = new Notification(\"\");\n notification2.onshow = () => {\n notification2.close();\n };\n } catch (e) {\n if (e.name === \"TypeError\")\n return false;\n }\n return true;\n });\n const permissionGranted = shallowRef(isSupported.value && \"permission\" in Notification && Notification.permission === \"granted\");\n const notification = ref(null);\n const ensurePermissions = async () => {\n if (!isSupported.value)\n return;\n if (!permissionGranted.value && Notification.permission !== \"denied\") {\n const result = await Notification.requestPermission();\n if (result === \"granted\")\n permissionGranted.value = true;\n }\n return permissionGranted.value;\n };\n const { on: onClick, trigger: clickTrigger } = createEventHook();\n const { on: onShow, trigger: showTrigger } = createEventHook();\n const { on: onError, trigger: errorTrigger } = createEventHook();\n const { on: onClose, trigger: closeTrigger } = createEventHook();\n const show = async (overrides) => {\n if (!isSupported.value || !permissionGranted.value)\n return;\n const options2 = Object.assign({}, defaultWebNotificationOptions, overrides);\n notification.value = new Notification(options2.title || \"\", options2);\n notification.value.onclick = clickTrigger;\n notification.value.onshow = showTrigger;\n notification.value.onerror = errorTrigger;\n notification.value.onclose = closeTrigger;\n return notification.value;\n };\n const close = () => {\n if (notification.value)\n notification.value.close();\n notification.value = null;\n };\n if (_requestForPermissions)\n tryOnMounted(ensurePermissions);\n tryOnScopeDispose(close);\n if (isSupported.value && window) {\n const document = window.document;\n useEventListener(document, \"visibilitychange\", (e) => {\n e.preventDefault();\n if (document.visibilityState === \"visible\") {\n close();\n }\n });\n }\n return {\n isSupported,\n notification,\n ensurePermissions,\n permissionGranted,\n show,\n close,\n onClick,\n onShow,\n onError,\n onClose\n };\n}\n\nconst DEFAULT_PING_MESSAGE = \"ping\";\nfunction resolveNestedOptions(options) {\n if (options === true)\n return {};\n return options;\n}\nfunction useWebSocket(url, options = {}) {\n const {\n onConnected,\n onDisconnected,\n onError,\n onMessage,\n immediate = true,\n autoConnect = true,\n autoClose = true,\n protocols = []\n } = options;\n const data = ref(null);\n const status = shallowRef(\"CLOSED\");\n const wsRef = ref();\n const urlRef = toRef(url);\n let heartbeatPause;\n let heartbeatResume;\n let explicitlyClosed = false;\n let retried = 0;\n let bufferedData = [];\n let retryTimeout;\n let pongTimeoutWait;\n const _sendBuffer = () => {\n if (bufferedData.length && wsRef.value && status.value === \"OPEN\") {\n for (const buffer of bufferedData)\n wsRef.value.send(buffer);\n bufferedData = [];\n }\n };\n const resetRetry = () => {\n if (retryTimeout != null) {\n clearTimeout(retryTimeout);\n retryTimeout = void 0;\n }\n };\n const resetHeartbeat = () => {\n clearTimeout(pongTimeoutWait);\n pongTimeoutWait = void 0;\n };\n const close = (code = 1e3, reason) => {\n resetRetry();\n if (!isClient && !isWorker || !wsRef.value)\n return;\n explicitlyClosed = true;\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n wsRef.value.close(code, reason);\n wsRef.value = void 0;\n };\n const send = (data2, useBuffer = true) => {\n if (!wsRef.value || status.value !== \"OPEN\") {\n if (useBuffer)\n bufferedData.push(data2);\n return false;\n }\n _sendBuffer();\n wsRef.value.send(data2);\n return true;\n };\n const _init = () => {\n if (explicitlyClosed || typeof urlRef.value === \"undefined\")\n return;\n const ws = new WebSocket(urlRef.value, protocols);\n wsRef.value = ws;\n status.value = \"CONNECTING\";\n ws.onopen = () => {\n status.value = \"OPEN\";\n retried = 0;\n onConnected == null ? void 0 : onConnected(ws);\n heartbeatResume == null ? void 0 : heartbeatResume();\n _sendBuffer();\n };\n ws.onclose = (ev) => {\n status.value = \"CLOSED\";\n resetHeartbeat();\n heartbeatPause == null ? void 0 : heartbeatPause();\n onDisconnected == null ? void 0 : onDisconnected(ws, ev);\n if (!explicitlyClosed && options.autoReconnect && (wsRef.value == null || ws === wsRef.value)) {\n const {\n retries = -1,\n delay = 1e3,\n onFailed\n } = resolveNestedOptions(options.autoReconnect);\n const checkRetires = typeof retries === \"function\" ? retries : () => typeof retries === \"number\" && (retries < 0 || retried < retries);\n if (checkRetires(retried)) {\n retried += 1;\n retryTimeout = setTimeout(_init, delay);\n } else {\n onFailed == null ? void 0 : onFailed();\n }\n }\n };\n ws.onerror = (e) => {\n onError == null ? void 0 : onError(ws, e);\n };\n ws.onmessage = (e) => {\n if (options.heartbeat) {\n resetHeartbeat();\n const {\n message = DEFAULT_PING_MESSAGE,\n responseMessage = message\n } = resolveNestedOptions(options.heartbeat);\n if (e.data === toValue(responseMessage))\n return;\n }\n data.value = e.data;\n onMessage == null ? void 0 : onMessage(ws, e);\n };\n };\n if (options.heartbeat) {\n const {\n message = DEFAULT_PING_MESSAGE,\n interval = 1e3,\n pongTimeout = 1e3\n } = resolveNestedOptions(options.heartbeat);\n const { pause, resume } = useIntervalFn(\n () => {\n send(toValue(message), false);\n if (pongTimeoutWait != null)\n return;\n pongTimeoutWait = setTimeout(() => {\n close();\n explicitlyClosed = false;\n }, pongTimeout);\n },\n interval,\n { immediate: false }\n );\n heartbeatPause = pause;\n heartbeatResume = resume;\n }\n if (autoClose) {\n if (isClient)\n useEventListener(\"beforeunload\", () => close(), { passive: true });\n tryOnScopeDispose(close);\n }\n const open = () => {\n if (!isClient && !isWorker)\n return;\n close();\n explicitlyClosed = false;\n retried = 0;\n _init();\n };\n if (immediate)\n open();\n if (autoConnect)\n watch(urlRef, open);\n return {\n data,\n status,\n close,\n send,\n open,\n ws: wsRef\n };\n}\n\nfunction useWebWorker(arg0, workerOptions, options) {\n const {\n window = defaultWindow\n } = options != null ? options : {};\n const data = ref(null);\n const worker = shallowRef();\n const post = (...args) => {\n if (!worker.value)\n return;\n worker.value.postMessage(...args);\n };\n const terminate = function terminate2() {\n if (!worker.value)\n return;\n worker.value.terminate();\n };\n if (window) {\n if (typeof arg0 === \"string\")\n worker.value = new Worker(arg0, workerOptions);\n else if (typeof arg0 === \"function\")\n worker.value = arg0();\n else\n worker.value = arg0;\n worker.value.onmessage = (e) => {\n data.value = e.data;\n };\n tryOnScopeDispose(() => {\n if (worker.value)\n worker.value.terminate();\n });\n }\n return {\n data,\n post,\n terminate,\n worker\n };\n}\n\nfunction depsParser(deps, localDeps) {\n if (deps.length === 0 && localDeps.length === 0)\n return \"\";\n const depsString = deps.map((dep) => `'${dep}'`).toString();\n const depsFunctionString = localDeps.filter((dep) => typeof dep === \"function\").map((fn) => {\n const str = fn.toString();\n if (str.trim().startsWith(\"function\")) {\n return str;\n } else {\n const name = fn.name;\n return `const ${name} = ${str}`;\n }\n }).join(\";\");\n const importString = `importScripts(${depsString});`;\n return `${depsString.trim() === \"\" ? \"\" : importString} ${depsFunctionString}`;\n}\n\nfunction jobRunner(userFunc) {\n return (e) => {\n const userFuncArgs = e.data[0];\n return Promise.resolve(userFunc.apply(void 0, userFuncArgs)).then((result) => {\n postMessage([\"SUCCESS\", result]);\n }).catch((error) => {\n postMessage([\"ERROR\", error]);\n });\n };\n}\n\nfunction createWorkerBlobUrl(fn, deps, localDeps) {\n const blobCode = `${depsParser(deps, localDeps)}; onmessage=(${jobRunner})(${fn})`;\n const blob = new Blob([blobCode], { type: \"text/javascript\" });\n const url = URL.createObjectURL(blob);\n return url;\n}\n\nfunction useWebWorkerFn(fn, options = {}) {\n const {\n dependencies = [],\n localDependencies = [],\n timeout,\n window = defaultWindow\n } = options;\n const worker = ref();\n const workerStatus = shallowRef(\"PENDING\");\n const promise = ref({});\n const timeoutId = shallowRef();\n const workerTerminate = (status = \"PENDING\") => {\n if (worker.value && worker.value._url && window) {\n worker.value.terminate();\n URL.revokeObjectURL(worker.value._url);\n promise.value = {};\n worker.value = void 0;\n window.clearTimeout(timeoutId.value);\n workerStatus.value = status;\n }\n };\n workerTerminate();\n tryOnScopeDispose(workerTerminate);\n const generateWorker = () => {\n const blobUrl = createWorkerBlobUrl(fn, dependencies, localDependencies);\n const newWorker = new Worker(blobUrl);\n newWorker._url = blobUrl;\n newWorker.onmessage = (e) => {\n const { resolve = () => {\n }, reject = () => {\n } } = promise.value;\n const [status, result] = e.data;\n switch (status) {\n case \"SUCCESS\":\n resolve(result);\n workerTerminate(status);\n break;\n default:\n reject(result);\n workerTerminate(\"ERROR\");\n break;\n }\n };\n newWorker.onerror = (e) => {\n const { reject = () => {\n } } = promise.value;\n e.preventDefault();\n reject(e);\n workerTerminate(\"ERROR\");\n };\n if (timeout) {\n timeoutId.value = setTimeout(\n () => workerTerminate(\"TIMEOUT_EXPIRED\"),\n timeout\n );\n }\n return newWorker;\n };\n const callWorker = (...fnArgs) => new Promise((resolve, reject) => {\n var _a;\n promise.value = {\n resolve,\n reject\n };\n (_a = worker.value) == null ? void 0 : _a.postMessage([[...fnArgs]]);\n workerStatus.value = \"RUNNING\";\n });\n const workerFn = (...fnArgs) => {\n if (workerStatus.value === \"RUNNING\") {\n console.error(\n \"[useWebWorkerFn] You can only run one instance of the worker at a time.\"\n );\n return Promise.reject();\n }\n worker.value = generateWorker();\n return callWorker(...fnArgs);\n };\n return {\n workerFn,\n workerStatus,\n workerTerminate\n };\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useWindowFocus(options = {}) {\n const { window = defaultWindow } = options;\n if (!window)\n return shallowRef(false);\n const focused = shallowRef(window.document.hasFocus());\n const listenerOptions = { passive: true };\n useEventListener(window, \"blur\", () => {\n focused.value = false;\n }, listenerOptions);\n useEventListener(window, \"focus\", () => {\n focused.value = true;\n }, listenerOptions);\n return focused;\n}\n\nfunction useWindowScroll(options = {}) {\n const { window = defaultWindow, ...rest } = options;\n return useScroll(window, rest);\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction useWindowSize(options = {}) {\n const {\n window = defaultWindow,\n initialWidth = Number.POSITIVE_INFINITY,\n initialHeight = Number.POSITIVE_INFINITY,\n listenOrientation = true,\n includeScrollbar = true,\n type = \"inner\"\n } = options;\n const width = shallowRef(initialWidth);\n const height = shallowRef(initialHeight);\n const update = () => {\n if (window) {\n if (type === \"outer\") {\n width.value = window.outerWidth;\n height.value = window.outerHeight;\n } else if (type === \"visual\" && window.visualViewport) {\n const { width: visualViewportWidth, height: visualViewportHeight, scale } = window.visualViewport;\n width.value = Math.round(visualViewportWidth * scale);\n height.value = Math.round(visualViewportHeight * scale);\n } else if (includeScrollbar) {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n } else {\n width.value = window.document.documentElement.clientWidth;\n height.value = window.document.documentElement.clientHeight;\n }\n }\n };\n update();\n tryOnMounted(update);\n const listenerOptions = { passive: true };\n useEventListener(\"resize\", update, listenerOptions);\n if (window && type === \"visual\" && window.visualViewport) {\n useEventListener(window.visualViewport, \"resize\", update, listenerOptions);\n }\n if (listenOrientation) {\n const matches = useMediaQuery(\"(orientation: portrait)\");\n watch(matches, () => update());\n }\n return { width, height };\n}\n\nexport { DefaultMagicKeysAliasMap, StorageSerializers, TransitionPresets, computedAsync as asyncComputed, breakpointsAntDesign, breakpointsBootstrapV5, breakpointsElement, breakpointsMasterCss, breakpointsPrimeFlex, breakpointsQuasar, breakpointsSematic, breakpointsTailwind, breakpointsVuetify, breakpointsVuetifyV2, breakpointsVuetifyV3, cloneFnJSON, computedAsync, computedInject, createFetch, createReusableTemplate, createTemplatePromise, createUnrefFn, customStorageEventName, defaultDocument, defaultLocation, defaultNavigator, defaultWindow, executeTransition, formatTimeAgo, formatTimeAgoIntl, formatTimeAgoIntlParts, getSSRHandler, mapGamepadToXbox360Controller, onClickOutside, onElementRemoval, onKeyDown, onKeyPressed, onKeyStroke, onKeyUp, onLongPress, onStartTyping, provideSSRWidth, setSSRHandler, templateRef, unrefElement, useActiveElement, useAnimate, useAsyncQueue, useAsyncState, useBase64, useBattery, useBluetooth, useBreakpoints, useBroadcastChannel, useBrowserLocation, useCached, useClipboard, useClipboardItems, useCloned, useColorMode, useConfirmDialog, useCountdown, useCssVar, useCurrentElement, useCycleList, useDark, useDebouncedRefHistory, useDeviceMotion, useDeviceOrientation, useDevicePixelRatio, useDevicesList, useDisplayMedia, useDocumentVisibility, useDraggable, useDropZone, useElementBounding, useElementByPoint, useElementHover, useElementSize, useElementVisibility, useEventBus, useEventListener, useEventSource, useEyeDropper, useFavicon, useFetch, useFileDialog, useFileSystemAccess, useFocus, useFocusWithin, useFps, useFullscreen, useGamepad, useGeolocation, useIdle, useImage, useInfiniteScroll, useIntersectionObserver, useKeyModifier, useLocalStorage, useMagicKeys, useManualRefHistory, useMediaControls, useMediaQuery, useMemoize, useMemory, useMounted, useMouse, useMouseInElement, useMousePressed, useMutationObserver, useNavigatorLanguage, useNetwork, useNow, useObjectUrl, useOffsetPagination, useOnline, usePageLeave, useParallax, useParentElement, usePerformanceObserver, usePermission, usePointer, usePointerLock, usePointerSwipe, usePreferredColorScheme, usePreferredContrast, usePreferredDark, usePreferredLanguages, usePreferredReducedMotion, usePreferredReducedTransparency, usePrevious, useRafFn, useRefHistory, useResizeObserver, useSSRWidth, useScreenOrientation, useScreenSafeArea, useScriptTag, useScroll, useScrollLock, useSessionStorage, useShare, useSorted, useSpeechRecognition, useSpeechSynthesis, useStepper, useStorage, useStorageAsync, useStyleTag, useSupported, useSwipe, useTemplateRefsList, useTextDirection, useTextSelection, useTextareaAutosize, useThrottledRefHistory, useTimeAgo, useTimeAgoIntl, useTimeoutPoll, useTimestamp, useTitle, useTransition, useUrlSearchParams, useUserMedia, useVModel, useVModels, useVibrate, useVirtualList, useWakeLock, useWebNotification, useWebSocket, useWebWorker, useWebWorkerFn, useWindowFocus, useWindowScroll, useWindowSize };\n","import {\n nextTick,\n ref,\n watch,\n type ComponentPublicInstance,\n type Ref,\n} from \"vue\";\nimport { onClickOutside } from \"@vueuse/core\";\n\n/** A template ref that may point to an element or a Vue/Kendo component. */\nexport type PopupMenuElementRef = Ref<\n HTMLElement | ComponentPublicInstance | null\n>;\n\n/** Why the popup was closed, including the focus policy for mouse paths. */\nexport type PopupMenuCloseReason =\n | \"keyboard\"\n | \"mouse-selection\"\n | \"outside-click\"\n | \"trigger-click\"\n | null;\nexport type PopupMenuCloseTrigger = Exclude<PopupMenuCloseReason, null>;\n\n/** Minimal event shape emitted by Kendo Menu `@select`. */\nexport type KendoMenuSelectEvent = {\n item?: {\n text?: string;\n };\n event?: {\n type?: string;\n } | null;\n};\n\n/** Options for configuring {@link usePopupMenu}. */\nexport type UsePopupMenuOptions = {\n /** Reactive flag reflecting whether the popup menu is currently open. */\n isOpen: Ref<boolean>;\n /** Ref to the popup menu element or component. Used for outside-click detection. */\n menuRef: PopupMenuElementRef;\n /** Ref to the trigger button element or component. Ignored by outside-click detection. */\n triggerRef: PopupMenuElementRef;\n /** Called to open the popup menu. */\n requestShow: () => void;\n /** Called to close the popup menu. */\n requestHide: () => void;\n /**\n * Optional target to focus after a keyboard-driven close.\n * Supports ordinary elements and Vue/Kendo components exposing `$el`.\n */\n focusTargetRef?: PopupMenuElementRef;\n /**\n * Resolves the focus target when it is virtualized or dynamically rendered.\n * Takes precedence over `focusTargetRef`.\n */\n resolveFocusTarget?: () => HTMLElement | null;\n /**\n * CSS selector used to find the first focusable menu item after open.\n * Defaults to `\".k-menu-item:not(.k-disabled)\"` for Kendo Menu.\n */\n menuItemSelector?: string;\n /**\n * Keeps `aria-expanded` on the trigger in sync with `isOpen`.\n * Applies only to button-like triggers. Defaults to `true`.\n */\n manageAriaExpanded?: boolean;\n};\n\n/** Functions returned by {@link usePopupMenu} for the action menu. */\nexport type UsePopupMenuReturn = {\n /** Opens the menu, or closes it when it is already open. */\n handleActionButtonClick: () => void;\n /**\n * Handles keyboard input on the action button. Enter and Space open or close\n * the menu. Escape closes an open menu or moves focus to the configured target.\n */\n handleActionButtonKeydown: (event: KeyboardEvent) => void;\n /** Closes the menu when Escape is pressed while using the menu. */\n handleActionMenuEscape: (event: KeyboardEvent) => void;\n /**\n * Closes the menu after an item is chosen, then runs the optional action\n * provided by the consuming component.\n */\n handleMenuSelect: (\n event: KendoMenuSelectEvent,\n onAction?: (event: KendoMenuSelectEvent) => void,\n ) => void;\n /**\n * Restores focus after the popup closes. Keyboard actions prefer the\n * configured focus target; mouse menu selections return focus to the trigger.\n */\n handlePopupClose: () => void;\n};\n\nconst resolveElement = (\n target: HTMLElement | ComponentPublicInstance | null | undefined,\n) => {\n if (target instanceof HTMLElement) return target;\n\n const componentElement = target?.$el;\n return componentElement instanceof HTMLElement ? componentElement : null;\n};\n\n/** Kendo often renders triggers as anchors, so accept explicit button semantics too. */\nconst isButtonLike = (element: HTMLElement) =>\n element instanceof HTMLButtonElement ||\n element.getAttribute(\"role\") === \"button\" ||\n element.hasAttribute(\"aria-haspopup\");\n\n/**\n * Composable for accessible Kendo Popup + Menu action-menu interactions.\n *\n * It manages toggling, menu-item focus, selection modality, and contextual\n * focus restoration. The consuming component keeps ownership of menu state\n * and business-specific actions.\n *\n * @param options - Parent-owned popup state, refs, and focus configuration.\n * @returns Template event handlers for the action trigger, Kendo Menu, and Popup.\n */\nexport const usePopupMenu = (\n options: UsePopupMenuOptions,\n): UsePopupMenuReturn => {\n const popupCloseReason = ref<PopupMenuCloseReason>(null);\n const menuItemSelector =\n options.menuItemSelector ?? \".k-menu-item:not(.k-disabled)\";\n\n const resolveTriggerElement = () => resolveElement(options.triggerRef.value);\n\n const resolveConfiguredFocusTarget = () =>\n options.resolveFocusTarget?.() ??\n resolveElement(options.focusTargetRef?.value);\n\n const focusConfiguredTargetOrTrigger = () => {\n const target = resolveConfiguredFocusTarget();\n if (target) {\n target.focus();\n return true;\n }\n\n const trigger = resolveTriggerElement();\n trigger?.focus();\n return !!trigger;\n };\n\n const focusFirstEnabledMenuItem = () => {\n const menuElement = resolveElement(options.menuRef.value);\n const firstEnabledItem = menuElement?.querySelector(menuItemSelector);\n (firstEnabledItem as HTMLElement | null)?.focus();\n };\n\n /** Closes the popup if open, preserving its input modality for restoration. */\n const closePopup = (reason: PopupMenuCloseTrigger) => {\n if (!options.isOpen.value) return;\n popupCloseReason.value = reason;\n options.requestHide();\n };\n\n onClickOutside(options.menuRef, () => closePopup(\"outside-click\"), {\n ignore: [options.triggerRef],\n });\n\n if (options.manageAriaExpanded !== false) {\n watch(\n [options.isOpen, options.triggerRef],\n ([open]) => {\n const trigger = resolveTriggerElement();\n if (!trigger || !isButtonLike(trigger)) return;\n trigger.setAttribute(\"aria-expanded\", open ? \"true\" : \"false\");\n },\n { immediate: true, flush: \"post\" },\n );\n }\n\n /** Toggles the menu and focuses its first enabled item after opening. */\n const handleActionButtonClick = () => {\n if (options.isOpen.value) {\n closePopup(\"trigger-click\");\n return;\n }\n\n options.requestShow();\n nextTick(focusFirstEnabledMenuItem);\n };\n\n /** Handles Enter, Space, and Escape on the trigger button. */\n const handleActionButtonKeydown = (event: KeyboardEvent) => {\n if (event.key === \"Enter\" || event.code === \"Space\") {\n event.preventDefault();\n handleActionButtonClick();\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (options.isOpen.value) {\n closePopup(\"keyboard\");\n return;\n }\n\n focusConfiguredTargetOrTrigger();\n }\n };\n\n /** Escape handler bound inside the menu. */\n const handleActionMenuEscape = (event: KeyboardEvent) => {\n event.preventDefault();\n event.stopPropagation();\n closePopup(\"keyboard\");\n };\n\n /** Closes the menu then delegates its business action to the caller. */\n const handleMenuSelect = (\n event: KendoMenuSelectEvent,\n onAction?: (event: KendoMenuSelectEvent) => void,\n ) => {\n closePopup(\n event.event?.type?.startsWith(\"key\") ? \"keyboard\" : \"mouse-selection\",\n );\n onAction?.(event);\n };\n\n /**\n * Bind to the Kendo Popup `@close` event after the owner updates `isOpen`.\n * Keyboard close first tries the configured focus target, then falls back to\n * the trigger. Mouse menu selection restores the trigger, while outside\n * clicks leave focus under browser control.\n */\n const handlePopupClose = () => {\n nextTick(() => {\n if (popupCloseReason.value === \"keyboard\") {\n focusConfiguredTargetOrTrigger();\n } else if (popupCloseReason.value === \"mouse-selection\") {\n resolveTriggerElement()?.focus();\n }\n\n popupCloseReason.value = null;\n });\n };\n\n return {\n /**\n * Handles Kendo Menu selection: records keyboard or mouse modality,\n * requests popup close, then runs the optional caller-owned action.\n */\n handleMenuSelect,\n /**\n * Toggles the action menu. When opening, focuses the first enabled Kendo\n * Menu item after Vue renders the popup.\n */\n handleActionButtonClick,\n /**\n * Handles trigger keyboard input: Enter and Space toggle the menu; Escape\n * closes an open menu or focuses the configured target when already closed.\n */\n handleActionButtonKeydown,\n /** Closes the open menu through the keyboard path when Escape is pressed inside it. */\n handleActionMenuEscape,\n /**\n * Restores focus after Kendo Popup closes: keyboard closes prefer the\n * configured focus target, mouse selections return to the trigger, and\n * outside clicks do not move focus.\n */\n handlePopupClose,\n };\n};\n","import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\n\nexport type ChangePayload = { value: Date | null; event: any };\n\nexport function useMaskedDateInput(args: {\n id: string;\n onChange: (p: ChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<string | Date | null | undefined>;\n min?: Date | null | undefined;\n max?: Date | null | undefined;\n /** When true, empty/incomplete value is considered invalid after blur */\n required?: boolean;\n /** Optional default date for this field (e.g., today). */\n defaultValue?: Date | null;\n dateFormat?: string;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const placeholder = ref<string>(args.dateFormat ?? \"mm/dd/yyyy\");\n const isRequired = computed(() => !!args.required);\n const MIN_YEAR = 1000;\n const isTouched = ref(false);\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"];\n\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n\n const datePart = (pos: number) => {\n if (pos <= 2) return \"mm\";\n if (pos <= 5) return \"dd\";\n if (digitsOnly.value.length <= 10) return \"yyyy\";\n return \"mm\";\n };\n\n const month = computed(() => {\n const m = raw.value\n ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(m).toString().padStart(2, \"0\");\n });\n const day = computed(() => {\n const d = raw.value\n ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(d).toString().padStart(2, \"0\");\n });\n const year = computed(() => {\n const y = raw.value\n ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n return parseInt(y).toString().padStart(4, \"0\");\n });\n\n const emitParsedIfComplete = (event: any) => {\n if (digitsOnly.value.length === 0) {\n args.onChange({ value: null, event });\n return;\n }\n if (digitsOnly.value.length < 8) {\n args.onChange({ value: null, event });\n return;\n }\n if ((raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8) {\n const [mmStr, ddStr, yyyyStr] = raw.value.split(\"/\");\n const mm = parseInt(mmStr);\n const dd = parseInt(ddStr);\n const yyyy = parseInt(yyyyStr);\n // Prevent auto-correction: only emit if parts are a real calendar date\n if (isValidParts(yyyy, mm, dd)) {\n const d = createDate(yyyy, mm, dd);\n if (inRange(d)) {\n args.onChange({ value: d, event });\n } else {\n args.onChange({ value: null, event });\n }\n } else {\n args.onChange({ value: null, event });\n }\n }\n };\n const inRange = (d: Date) => {\n const min = args.min ?? undefined;\n const max = args.max ?? undefined;\n if (min && d < min) return false;\n if (max && d > max) return false;\n return true;\n };\n\n const parsedRawDate = computed<Date | null>(() => {\n if ((raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8) {\n const [mmStr, ddStr, yyyyStr] = (raw.value ?? \"\").split(\"/\");\n const mm = parseInt(mmStr);\n const dd = parseInt(ddStr);\n const yyyy = parseInt(yyyyStr);\n if (isValidParts(yyyy, mm, dd)) {\n return createDate(yyyy, mm, dd);\n }\n }\n return null;\n });\n\n const isComplete = computed(() => {\n return (raw.value ?? \"\").length === 10 && digitsOnly.value.length === 8;\n });\n\n // Helpers to centralize validity checks and baseline selection\n const createDate = (yy: number, mm: number, dd: number) => {\n const date = new Date(0);\n date.setFullYear(yy, mm - 1, dd);\n date.setHours(0, 0, 0, 0);\n return date;\n };\n\n const daysInMonth = (yy: number, mm: number) => {\n return createDate(yy, mm + 1, 0).getDate();\n };\n\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 &&\n mm <= 12 &&\n yy >= MIN_YEAR &&\n dd >= 1 &&\n dd <= daysInMonth(yy, mm)\n );\n };\n\n const handleChange = (event: any): void => {\n raw.value = event.value as string;\n const src = event.event?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n let m = parseInt(month.value);\n let d = parseInt(day.value);\n let y = parseInt(year.value);\n\n // If input is invalid or incomplete, set to today's date and ignore the step\n const hasEightDigits = digitsOnly.value.length >= 8;\n if (!hasEightDigits || !isValidParts(y, m, d)) {\n const today = args.defaultValue ?? new Date();\n m = today.getMonth() + 1;\n d = today.getDate();\n y = today.getFullYear();\n raw.value = `${String(m).padStart(2, \"0\")}/${String(d).padStart(\n 2,\n \"0\",\n )}/${String(y)}`;\n\n const setDate = createDate(y, m, d);\n args.onChange({ value: inRange(setDate) ? setDate : null, event });\n\n focusAndRestore({ useRAF: true });\n return;\n }\n\n const part = datePart(pos);\n\n if (part === \"mm\") {\n m = direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n } else if (part === \"dd\") {\n const days = new Date(y, m, 0).getDate();\n d =\n direction === \"ArrowUp\" ? (d < days ? d + 1 : 1) : d > 1 ? d - 1 : days;\n } else if (part === \"yyyy\") {\n y = direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1);\n }\n\n raw.value = `${String(m).padStart(2, \"0\")}/${String(d).padStart(\n 2,\n \"0\",\n )}/${String(y)}`;\n\n const [mmStr, ddStr, yyyyStr] = raw.value.split(\"/\");\n const steppedDate = createDate(\n parseInt(yyyyStr),\n parseInt(mmStr),\n parseInt(ddStr),\n );\n if (\n steppedDate.toString() !== \"Invalid Date\" &&\n parseInt(yyyyStr) >= 1000\n ) {\n args.onChange({\n value: inRange(steppedDate) ? steppedDate : null,\n event,\n });\n } else {\n args.onChange({ value: null, event });\n }\n\n focusAndRestore({ useRAF: true });\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.code === \"Space\" || event.key === \" \") {\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt+Down opens the menu; allow Alt combos to pass through\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n // Justified: ArrowUp/Down act as date-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n // Map mouse wheel to stepper behavior (up/down) based on caret segment\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, event.target as HTMLInputElement, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n const src = event.target as HTMLInputElement;\n if (cursorKeys.includes(event.key)) {\n // Do not prevent default for caret navigation\n cursorPos.value = src?.selectionStart ?? 0;\n return;\n }\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const handleBlur = (event: FocusEvent): void => {\n isTouched.value = true;\n\n // If required, no default provided, and value is still undefined/blank,\n // coerce external value from undefined -> \"\" so downstream validation\n // treats this as an incomplete required field.\n if (\n isRequired.value &&\n !args.defaultValue &&\n args.externalValue &&\n args.externalValue.value === undefined &&\n digitsOnly.value.length === 0\n ) {\n (args.externalValue as Ref<any>).value = \"\";\n }\n\n // Also ensure caret position is captured on blur\n const src = event.target as HTMLInputElement | null;\n if (src) {\n cursorPos.value = src.selectionStart ?? 0;\n }\n };\n\n // Centralized focus + caret restore helper to avoid duplicated logic.\n const focusAndRestore = (opts?: {\n /** milliseconds to delay the focus (useful to wait for popups to close) */\n delay?: number;\n /** when true, use requestAnimationFrame to schedule the focus */\n useRAF?: boolean;\n /** explicit caret position override; otherwise uses `cursorPos` or end */\n pos?: number | undefined;\n }) => {\n const run = () => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (!inputEl) return;\n const p = opts?.pos ?? cursorPos.value ?? inputEl.value.length;\n try {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n } catch {\n // ignore if element not focusable or selection not supported\n }\n };\n\n nextTick(() => {\n if (opts?.delay && opts.delay > 0) {\n setTimeout(run, opts.delay);\n return;\n }\n if (opts?.useRAF) {\n requestAnimationFrame(run);\n return;\n }\n run();\n });\n };\n\n // Sync external value into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n if (newVal) {\n const date = new Date(newVal as any);\n if (date.toString() !== \"Invalid Date\") {\n const m = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const d = date.getDate().toString().padStart(2, \"0\");\n const y = date.getFullYear().toString();\n raw.value = `${m}/${d}/${y}`;\n\n // When external value is updated (e.g., user selects a date\n // from the calendar), refocus the input and restore caret.\n // Delay slightly to avoid Kendo calendar focus/DOM operations\n // overriding our focus call.\n focusAndRestore({ delay: 50 });\n return;\n }\n }\n // If external value is null/invalid, keep current raw as-is\n },\n { immediate: true },\n );\n }\n\n const debugLines = computed(() => {\n return [\n [\"Date\", `${month.value} / ${day.value} / ${year.value}`],\n [\"Digits only\", digitsOnly.value],\n [\n \"min\",\n args.min?.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }) ?? null,\n ],\n [\n \"max\",\n args.max?.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n }) ?? null,\n ],\n ];\n });\n\n // Range validation based on provided min/max and current external value\n const isValid = computed(() => {\n // Optional field preserves existing forgiving behavior\n if (!isRequired.value) {\n if (!isComplete.value) return true;\n const candidate = parsedRawDate.value;\n if (!candidate) return false; // complete but invalid parts\n return inRange(candidate);\n }\n\n // Required field: do not flag invalid until after blur\n if (!isTouched.value) return true;\n\n const candidate = parsedRawDate.value;\n if (!isComplete.value) return false; // incomplete after blur\n if (!candidate) return false; // complete but invalid parts\n return inRange(candidate);\n });\n\n const reason = computed<string | undefined>(() => {\n // When not required, only report reasons for completed-but-bad values\n if (!isRequired.value) {\n if (!isComplete.value) return undefined;\n const candidate = parsedRawDate.value;\n if (!candidate) return \"invalid-date\";\n if (!inRange(candidate)) return \"out-of-bounds\";\n return \"valid\";\n }\n\n // Required: only validate after blur\n if (!isTouched.value) return undefined;\n\n if (digitsOnly.value.length === 0 || !isComplete.value) {\n return \"incomplete\";\n }\n\n const candidate = parsedRawDate.value;\n if (!candidate) return \"invalid-date\";\n if (!inRange(candidate)) return \"out-of-bounds\";\n return \"valid\";\n });\n\n const validationMessage = computed(() => {\n const r = reason.value;\n if (!r || r === \"valid\") return \"\";\n\n if (r === \"incomplete\") {\n return \"Required\";\n }\n\n if (r === \"invalid-date\") {\n return `Must be in ${placeholder.value} format.`;\n }\n\n const minStr = args.min\n ? args.min.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n : null;\n const maxStr = args.max\n ? args.max.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n })\n : null;\n if (r === \"out-of-bounds\") {\n if (minStr && maxStr) return `Must be between ${minStr} and ${maxStr}.`;\n if (minStr) return `Must be on or after ${minStr}.`;\n if (maxStr) return `Must be on or before ${maxStr}.`;\n }\n\n return \"\";\n });\n\n const initStyling = () => {\n // Adds our `fk-datepicker` class to the parent of the Kendo datepicker\n // This is separated so callers can invoke styling on demand.\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n\n if (!inputEl) {\n console.warn(`ID (#${args.id}) not found for styling.`);\n return;\n }\n const datePicker = inputEl.closest(\".k-datepicker\");\n if (!datePicker) {\n console.warn(`.k-datepicker parent not found for #${args.id} styling.`);\n return;\n }\n\n // Add class to parent to avoid it being wiped away by Kendo's DOM manipulation\n const parent = datePicker.parentElement;\n if (parent) {\n // Idempotent: if we've already added our class, do nothing.\n if (parent.classList.contains(\"fk-datepicker\")) {\n return;\n }\n parent.classList.add(\"fk-datepicker\");\n } else {\n console.warn(\n `Parent of .k-datepicker not found for #${args.id} styling.`,\n );\n }\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n return {\n raw,\n cursorPos,\n debugEnabled,\n debugLines,\n placeholder,\n isValid,\n reason: readonly(reason),\n validationMessage,\n digitsOnly,\n month: readonly(month),\n day: readonly(day),\n year: readonly(year),\n datePart,\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n // Expose so consumers can re-run styling when needed\n initStyling,\n };\n}\n","import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\nimport type { SelectionRange } from \"@progress/kendo-vue-dateinputs\";\n\nexport type RangeChangePayload = { value: SelectionRange | null; event: any };\n\ntype Part = \"mm\" | \"dd\" | \"yyyy\";\n\ntype Side = \"start\" | \"end\";\n\nexport function useMaskedDateRangeInput(args: {\n id: string; // id of the MaskedTextBox input element\n onChange: (p: RangeChangePayload) => void;\n onShowCalendar: (e: KeyboardEvent) => void;\n externalValue?: Ref<SelectionRange | null | undefined>;\n externalValid?: Ref<boolean | undefined>;\n manageValid?: boolean; // default true: mirror computed validity into externalValid\n maxSpanDays?: number; // optional maximum allowed span between start and end (in days)\n min?: Date;\n max?: Date;\n allowReverse?: boolean; // default false\n // Popup control hooks\n isOpen?: Ref<boolean>;\n onRequestClose?: () => void;\n closeDelay?: Ref<number> | number;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const calendarChanged = ref<boolean>(false);\n\n const ONE_DAY = 24 * 60 * 60 * 1000;\n const ONE_YEAR = 365 * ONE_DAY;\n const TODAY = new Date();\n const MIN_DATE = new Date(TODAY.getTime() - ONE_YEAR);\n const MAX_DATE = new Date(TODAY.getTime() + ONE_YEAR);\n\n args.min = args.min ?? MIN_DATE;\n args.max = args.max ?? MAX_DATE;\n\n // Define helpers early to avoid \"used before initialization\" issues\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n const daysInMonth = (yy: number, mm: number) => new Date(yy, mm, 0).getDate();\n const isValidParts = (yy: number, mm: number, dd: number) => {\n return (\n mm >= 1 && mm <= 12 && yy >= 1000 && dd >= 1 && dd <= daysInMonth(yy, mm)\n );\n };\n // Compare dates by date-only (UTC midnight) to avoid time-of-day issues\n const toUtcMidnightMs = (d: Date) =>\n Date.UTC(d.getFullYear(), d.getMonth(), d.getDate());\n const clampToMinMax = (d: Date | null): Date | null => {\n if (!d) return null;\n // default to 90days ago if min/max not provided\n const min = args.min ?? new Date(Date.now() - 90 * ONE_DAY);\n // default to today\n const max = args.max ?? new Date();\n const dMs = toUtcMidnightMs(d);\n if (dMs < toUtcMidnightMs(min) || dMs > toUtcMidnightMs(max)) return null;\n return d;\n };\n const rangeIsOrdered = (start: Date, end: Date) => {\n return (args.allowReverse ?? false) ? true : start <= end;\n };\n const maskComplete = computed(() => {\n return (raw.value?.length ?? 0) >= 23 && digitsOnly.value.length >= 16;\n });\n\n const parseFromRaw = (\n s: string,\n ): { start: Date | null; end: Date | null } => {\n // Expect MM/DD/YYYY - MM/DD/YYYY\n if ((s ?? \"\").length < 23 || digitsOnly.value.length < 16)\n return { start: null, end: null };\n const left = s.substring(0, 10);\n const right = s.substring(13, 23);\n const [mm1, dd1, yyyy1] = left\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const [mm2, dd2, yyyy2] = right\n .split(\"/\")\n .map((x) => parseInt(x || \"0\", 10));\n const sDate = new Date(yyyy1, mm1 - 1, dd1);\n const eDate = new Date(yyyy2, mm2 - 1, dd2);\n const sOk =\n isValidParts(yyyy1, mm1, dd1) && sDate.toString() !== \"Invalid Date\";\n const eOk =\n isValidParts(yyyy2, mm2, dd2) && eDate.toString() !== \"Invalid Date\";\n return { start: sOk ? sDate : null, end: eOk ? eDate : null };\n };\n\n // validity state shared with consumer when provided\n // Initialize to true to avoid showing validation errors before first blur\n const valid = args.externalValid ?? ref<boolean | undefined>(true);\n // Derived validity and reason\n const parsed = computed(() => parseFromRaw(raw.value));\n const clamped = computed(() => {\n const s = clampToMinMax(parsed.value.start);\n const e = clampToMinMax(parsed.value.end);\n return { start: s, end: e };\n });\n\n // Span in days between clamped start/end; undefined when incomplete or out-of-bounds\n const spanDays = computed<number | undefined>(() => {\n if (!maskComplete.value) return undefined;\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!s || !e) return undefined;\n const diffMs = Math.abs(toUtcMidnightMs(e) - toUtcMidnightMs(s));\n return Math.round(diffMs / 86400000 + 1); // NOTE: FEATHER-1155\n });\n\n // Set on first blur/clear; nothing is flagged before the user leaves the field\n const isTouched = ref(false);\n\n const reasonComputed = computed<string | undefined>(() => {\n if (!isTouched.value) return undefined;\n\n const { start, end } = parsed.value;\n if (!maskComplete.value) return \"incomplete\";\n if (!start || !end) return \"invalid-date\";\n if (!clamped.value.start || !clamped.value.end) return \"out-of-bounds\";\n const s = clamped.value.start;\n const e = clamped.value.end;\n if (!rangeIsOrdered(s, e)) return \"reversed-range\";\n if (typeof args.maxSpanDays === \"number\" && spanDays.value !== undefined) {\n if (spanDays.value > args.maxSpanDays) return \"span-exceeds-limit\";\n }\n return \"valid\";\n });\n\n const validComputed = computed<boolean | undefined>(() => {\n const r = reasonComputed.value;\n return r === undefined || r === \"valid\";\n });\n\n // User-facing validation message derived from the same live reason as validComputed\n const validationMessage = computed<string>(() => {\n const { min, max } = args;\n const r = reasonComputed.value;\n\n if (!r) return \"\";\n\n switch (r) {\n case \"incomplete\":\n return \"Required\";\n case \"invalid-date\":\n return \"One or both dates invalid.\";\n case \"reversed-range\":\n return \"End Date must be on or after Start Date.\";\n case \"out-of-bounds\":\n if (min && max) {\n return `Dates must be between ${formatDate(min)} and ${formatDate(max)}.`;\n }\n return \"Dates must be within the allowed range.\";\n case \"span-exceeds-limit\":\n return typeof args.maxSpanDays === \"number\"\n ? `Date range exceeds ${args.maxSpanDays} days.`\n : \"Date range exceeds maximum allowed span.\";\n case \"valid\":\n default:\n return \"\";\n }\n });\n // // Mirror computed validity into external ref when enabled\n // watch(\n // validComputed,\n // (v) => {\n // if (args.manageValid ?? true) {\n // valid.value = v;\n // }\n // },\n // { immediate: true },\n // );\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"]; // tracked to keep caret\n\n const fmt = (n: number, w: number) => String(n).padStart(w, \"0\");\n const formatDate = (d: Date) =>\n `${fmt(d.getMonth() + 1, 2)}/${fmt(d.getDate(), 2)}/${fmt(\n d.getFullYear(),\n 4,\n )}`;\n\n // rangeIsOrdered declared earlier\n\n const datePartForPos = (pos: number): { side: Side; part: Part } => {\n // Mask: 00/00/0000 - 00/00/0000\n // Index map (digits start at 0..9 for start, 13..22 for end)\n if (pos <= 2) return { side: \"start\", part: \"mm\" };\n if (pos <= 5) return { side: \"start\", part: pos <= 3 ? \"dd\" : \"dd\" };\n if (pos <= 11) return { side: \"start\", part: \"yyyy\" };\n if (pos <= 15) return { side: \"end\", part: \"mm\" };\n if (pos <= 18) return { side: \"end\", part: \"dd\" };\n return { side: \"end\", part: \"yyyy\" };\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n\n // Current parsed values\n const { start, end } = parseFromRaw(raw.value);\n\n // If SelectionRange is null/undefined (both sides missing), default to today and ignore the step\n if (!start && !end) {\n const today = new Date();\n const tStr = formatDate(today);\n raw.value = `${tStr} - ${tStr}`;\n args.onChange({ value: { start: today, end: today }, event });\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n return;\n }\n\n // Build baseline from user's parsed input; clamp only when emitting\n const today = new Date();\n\n const which = datePartForPos(pos);\n\n // Baseline dates: prefer parsed values (even if out-of-bounds); otherwise today\n let s = start ? new Date(start) : new Date(today);\n let e = end ? new Date(end) : new Date(today);\n\n const mutate = (d: Date, part: Part) => {\n if (part === \"mm\") {\n const m = d.getMonth() + 1;\n const next =\n direction === \"ArrowUp\" ? (m < 12 ? m + 1 : 1) : m > 1 ? m - 1 : 12;\n d.setMonth(next - 1);\n // Fix day overflow after month change\n const days = daysInMonth(d.getFullYear(), next);\n if (d.getDate() > days) d.setDate(days);\n } else if (part === \"dd\") {\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n const day = d.getDate();\n const next =\n direction === \"ArrowUp\"\n ? day < days\n ? day + 1\n : 1\n : day > 1\n ? day - 1\n : days;\n d.setDate(next);\n } else if (part === \"yyyy\") {\n const y = d.getFullYear();\n d.setFullYear(direction === \"ArrowUp\" ? y + 1 : Math.max(1, y - 1));\n // Fix Feb 29 overflow, etc.\n const days = daysInMonth(d.getFullYear(), d.getMonth() + 1);\n if (d.getDate() > days) d.setDate(days);\n }\n };\n\n if (which.side === \"start\") mutate(s, which.part);\n else mutate(e, which.part);\n\n // Compose new raw string: keep the untouched side as-is from current raw if parseable\n const sText = formatDate(s);\n const eText = formatDate(e);\n raw.value = `${sText} - ${eText}`;\n\n // Emit if valid and ordered and within min/max; else null\n const sClamped = clampToMinMax(s);\n const eClamped = clampToMinMax(e);\n if (sClamped && eClamped && rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n } else {\n args.onChange({ value: null, event });\n }\n\n // Restore caret\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n };\n\n const emitParsedIfComplete = (event: any) => {\n const { start, end } = parseFromRaw(raw.value);\n if (!start || !end) {\n args.onChange({ value: null, event });\n return;\n }\n const sClamped = clampToMinMax(start);\n const eClamped = clampToMinMax(end);\n if (!sClamped || !eClamped) {\n args.onChange({ value: null, event });\n return;\n }\n if (!rangeIsOrdered(sClamped, eClamped)) {\n args.onChange({ value: null, event });\n return;\n }\n args.onChange({ value: { start: sClamped, end: eClamped }, event });\n };\n\n const handleChange = (event: any): void => {\n const newValue = (event.value ?? \"\") as string;\n const originalEvent = event.event as Event | undefined;\n\n // No clear event handler from Kendo...\n // Kendo's clear button sets the value to empty and raises change;\n // treat that as an explicit clear action.\n if (!newValue && originalEvent && (originalEvent as any).type === \"click\") {\n handleClear(originalEvent);\n return;\n }\n\n raw.value = newValue;\n const src = originalEvent?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n // Do not coerce user's input; only emit parsed range when complete and valid\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n // Space already opens calendar\n if (event.code === \"Space\" || event.key === \" \") {\n // Do not let Space modify the input; only open the calendar\n // Justified: Space opens the calendar popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n // Alt + ArrowDown: open calendar popup without changing the value via stepper\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the calendar popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowCalendar(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n // Justified: ArrowUp/Down act as range-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, event.target as HTMLInputElement, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n if (cursorKeys.includes(event.key) || steppers.includes(event.key)) {\n const src = event.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const applyBlurValidation = () => {\n isTouched.value = true;\n\n if (args.manageValid ?? true) {\n valid.value = validComputed.value;\n }\n };\n\n const handleBlur = (_event: FocusEvent): void => {\n applyBlurValidation();\n };\n\n const handleClear = (event?: Event): void => {\n raw.value = \"\";\n cursorPos.value = 0;\n\n // Emit cleared range to consumer\n args.onChange({ value: null, event });\n\n // Run the same validation flow as on blur\n applyBlurValidation();\n\n // Return focus to the masked input so the user can retype\n nextTick(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(0, 0);\n }\n });\n };\n\n // Sync external range into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n const start = newVal?.start ?? null;\n const end = newVal?.end ?? null;\n if (start && end) {\n raw.value = `${formatDate(start)} - ${formatDate(end)}`;\n // If the change originated from calendar and popup is open, request close\n if (\n args.isOpen?.value &&\n calendarChanged.value &&\n args.onRequestClose\n ) {\n const delay =\n typeof args.closeDelay === \"number\"\n ? args.closeDelay\n : (args.closeDelay?.value ?? 0);\n setTimeout(() => {\n args.onRequestClose?.();\n calendarChanged.value = false;\n applyBlurValidation();\n }, delay);\n }\n return;\n }\n // If external is null/invalid, keep current raw as-is to preserve user's typing\n },\n { immediate: true },\n );\n }\n\n const month1 = computed(() =>\n raw.value ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day1 = computed(() =>\n raw.value ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year1 = computed(() =>\n raw.value ? raw.value.substring(6, 10).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const month2 = computed(() =>\n raw.value ? raw.value.substring(13, 15).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const day2 = computed(() =>\n raw.value ? raw.value.substring(16, 18).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n const year2 = computed(() =>\n raw.value ? raw.value.substring(19, 23).replace(/\\D/g, \"0\") || \"0\" : \"0\",\n );\n\n const debugLines = computed((): Array<{ label: string; value: string }> => {\n const { start, end } = parseFromRaw(raw.value);\n return [\n {\n label: \"Raw\",\n value: raw.value,\n },\n {\n label: \"Min Date\",\n value: `${args.min ? args.min.toDateString() : \"-\"}`,\n },\n {\n label: \"Max Date\",\n value: `${args.max ? args.max.toDateString() : \"-\"}`,\n },\n {\n label: \"Start\",\n value: `${String(month1.value).padStart(2, \"0\")} / ${String(\n day1.value,\n ).padStart(2, \"0\")} / ${String(year1.value).padStart(4, \"0\")}`,\n },\n {\n label: \"End\",\n value: `${String(month2.value).padStart(2, \"0\")} / ${String(\n day2.value,\n ).padStart(2, \"0\")} / ${String(year2.value).padStart(4, \"0\")}`,\n },\n { label: \"Digits only\", value: digitsOnly.value },\n { label: \"Mask complete\", value: `${maskComplete.value}` },\n {\n label: \"Parsed\",\n value: `${start ? start.toDateString() : \"-\"} | ${\n end ? end.toDateString() : \"-\"\n }`,\n },\n {\n label: \"Valid (managed)\",\n value: `${valid.value ?? \"-\"}`,\n },\n { label: \"Span (days)\", value: `${spanDays.value ?? \"-\"}` },\n {\n label: \"Reason\",\n value: `${reasonComputed.value ?? \"-\"}`,\n },\n {\n label: \"Cursor in\",\n value: `${cursorPos.value ?? \"-\"} (${(() => {\n const p = cursorPos.value ?? 0;\n const w = datePartForPos(p);\n return `${w.side}.${w.part}`;\n })()})`,\n },\n ];\n });\n\n const initStyling = () => {\n // Idempotent application of the `fk-daterangepicker` class to the input's parent\n nextTick(() => {\n const rangeInput = document.getElementById(args.id) as HTMLElement | null;\n if (!rangeInput) {\n console.warn(`#${args.id} not found for styling.`);\n return;\n }\n const parentDiv = rangeInput.closest(\"div\");\n if (!parentDiv) {\n console.warn(`Parent div of #${args.id} not found for styling.`);\n return;\n }\n if (parentDiv.classList.contains(\"fk-daterangepicker\")) return;\n parentDiv.classList.add(\"fk-daterangepicker\");\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n // Accessibility fix: ensure only one month grid has tabIndex=0\n const calendarMonthTabIndexFix = () => {\n nextTick(() => {\n try {\n const containers = Array.from(\n document.querySelectorAll(\".k-animation-container\"),\n ) as HTMLElement[];\n if (!containers.length) return;\n\n // Prefer the most recently added visible container that has a calendar\n const candidate = [...containers]\n .reverse()\n .find((c) => c.querySelector(\".k-calendar\"));\n const calendarRoot = candidate?.querySelector(\n \".k-calendar\",\n ) as HTMLElement | null;\n if (!calendarRoot) return;\n\n const months = calendarRoot.querySelectorAll(\n \".k-calendar-table\",\n ) as NodeListOf<HTMLElement>;\n let foundTab0 = false;\n months.forEach((m) => {\n if (m.tabIndex === 0) {\n if (!foundTab0) {\n foundTab0 = true;\n } else {\n m.tabIndex = -1;\n }\n }\n });\n } catch (e) {\n // no-op; defensive\n console.warn(e);\n }\n });\n };\n\n // When popup opens, run the fix after render\n if (args.isOpen) {\n watch(\n args.isOpen,\n (open) => {\n if (open) {\n // Allow popup DOM to mount first\n setTimeout(() => calendarMonthTabIndexFix(), 0);\n }\n },\n { immediate: false },\n );\n }\n\n return {\n raw,\n cursorPos,\n debugEnabled: debugEnabled,\n debugLines: debugLines,\n digitsOnly: digitsOnly,\n valid,\n validComputed: readonly(validComputed),\n reason: readonly(reasonComputed),\n validationMessage: readonly(validationMessage),\n spanDays: readonly(spanDays),\n month1: readonly(month1),\n day1: readonly(day1),\n year1: readonly(year1),\n month2: readonly(month2),\n day2: readonly(day2),\n year2: readonly(year2),\n handleChange,\n handleKeyDown,\n handleWheel,\n handleKeyUp,\n handleClick,\n handleBlur,\n handleClear,\n onCalendarChange: () => {\n calendarChanged.value = true;\n },\n initStyling,\n };\n}\n","import {\n computed,\n nextTick,\n onMounted,\n readonly,\n ref,\n watch,\n type Ref,\n} from \"vue\";\n\nexport type ChangePayload = { value: Date | null; event: any };\n\ntype PopupAction = \"now\" | \"set\" | null;\ntype AnyArgsHandler = (...args: unknown[]) => void;\n\nexport function useMaskedTimeInput(args: {\n id: string;\n onChange: (p: ChangePayload) => void;\n onShowPicker: (e: KeyboardEvent) => void;\n externalValue?: Ref<string | Date | null | undefined>;\n // Minute stepping granularity for ArrowUp/ArrowDown when focused in minutes.\n // Supported values: 1, 5, 10, 15, 20, 30. If not provided, defaults to 1-minute steps.\n minuteStep?: 1 | 5 | 10 | 15 | 20 | 30;\n // Reactive alternative: pass a Ref to allow dynamic updates at runtime.\n minuteStepRef?: Ref<1 | 5 | 10 | 15 | 20 | 30 | undefined>;\n timeFormat?: string;\n min?: Date | null | undefined;\n max?: Date | null | undefined;\n /** When true, empty/incomplete value is considered invalid after blur */\n required?: boolean;\n debug?: boolean;\n}) {\n const raw = ref(\"\");\n const cursorPos = ref<number | undefined>(undefined);\n const debugEnabled = ref<boolean>(!!args.debug);\n const placeholder = ref<string>(args.timeFormat ?? \"hh:mm AM\");\n const isRequired = computed(() => !!args.required);\n const isTouched = ref(false);\n\n const steppers: string[] = [\"ArrowUp\", \"ArrowDown\"];\n const cursorKeys: string[] = [\"ArrowLeft\", \"ArrowRight\"];\n\n const digitsOnly = computed(() => (raw.value ?? \"\").replace(/\\D/g, \"\"));\n\n // Mask rules to be used by MaskedTextBox\n // Relax numeric constraints: allow any digits, then validate afterwards\n const rules = {\n H: /[0-9]/,\n h: /[0-9]/,\n M: /[0-9]/,\n m: /[0-9]/,\n A: /[AaPp]/,\n a: /[Mm]/,\n } as const;\n\n const partAt = (pos: number) => {\n if (pos <= 2) return \"hh\"; // hours\n if (pos <= 5) return \"mm\"; // minutes\n return \"ampm\"; // AM/PM\n };\n\n const hour = computed(() => {\n const h = raw.value\n ? raw.value.substring(0, 2).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n const v = parseInt(h);\n return Math.min(Math.max(v, 0), 23); // keep as 0-23 for parsing convenience\n });\n const minute = computed(() => {\n const m = raw.value\n ? raw.value.substring(3, 5).replace(/\\D/g, \"0\") || \"0\"\n : \"0\";\n const v = parseInt(m);\n return Math.min(Math.max(v, 0), 59);\n });\n const period = computed(() => {\n const p = (raw.value?.substring(6, 8) || \"AM\").toUpperCase();\n return p.startsWith(\"P\") ? \"PM\" : \"AM\";\n });\n\n const hour24 = computed(() => {\n const h12 = parseInt(raw.value?.substring(0, 2).replace(/\\D/g, \"0\") || \"0\");\n const p = period.value;\n\n // Convert 12-hour to 24-hour format\n if (h12 === 12) {\n return p === \"AM\" ? 0 : 12;\n }\n return p === \"PM\" ? h12 + 12 : h12;\n });\n\n const time24 = computed(() => {\n if (!isComplete.value) return null;\n return `${String(hour24.value).padStart(2, \"0\")}:${String(minute.value).padStart(2, \"0\")}:00`;\n });\n\n const isComplete = computed(() =>\n /^(\\d{2}):(\\d{2})\\s([AP]M)$/i.test(raw.value ?? \"\"),\n );\n\n const toDisplay = (h24: number, m: number, ap: \"AM\" | \"PM\") => {\n // display uses 12-hour formatting in the field\n let h12 = h24 % 12;\n if (h12 === 0) h12 = 12;\n return `${String(h12).padStart(2, \"0\")}:${String(m).padStart(\n 2,\n \"0\",\n )} ${ap}`;\n };\n\n const toDateFromDisplay = (display: string) => {\n const match = display.match(/^(\\d{2}):(\\d{2})\\s([AP]M)$/i);\n if (!match) return null;\n const hh = parseInt(match[1]);\n const mm = parseInt(match[2]);\n const ap = match[3].toUpperCase();\n // Enforce 12-hour bounds and minute bounds; reject invalid formats like 99:99 AM\n if (hh < 1 || hh > 12 || mm < 0 || mm > 59) return null;\n let h24 = hh % 12;\n if (ap === \"PM\") h24 += 12;\n const d = new Date();\n d.setSeconds(0, 0);\n d.setHours(h24);\n d.setMinutes(mm);\n return d;\n };\n\n const emitParsedIfComplete = (event: any) => {\n if (digitsOnly.value.length === 0) {\n args.onChange({ value: null, event });\n return;\n }\n if (!isComplete.value) {\n args.onChange({ value: null, event });\n return;\n }\n const date = toDateFromDisplay(raw.value);\n if (date && inRangeTime(date)) {\n args.onChange({ value: date, event });\n } else {\n args.onChange({ value: null, event });\n }\n };\n const minutesSinceMidnight = (d: Date) => d.getHours() * 60 + d.getMinutes();\n const inRangeTime = (d: Date) => {\n const min = args.min ?? undefined;\n const max = args.max ?? undefined;\n const m = minutesSinceMidnight(d);\n if (min) {\n const minM = minutesSinceMidnight(min);\n if (m < minM) return false;\n }\n if (max) {\n const maxM = minutesSinceMidnight(max);\n if (m > maxM) return false;\n }\n return true;\n };\n\n const syncRawFromDate = (date: Date) => {\n const h24 = date.getHours();\n const ap = h24 >= 12 ? \"PM\" : \"AM\";\n raw.value = toDisplay(h24, date.getMinutes(), ap);\n };\n\n const emitValue = (value: Date | null, event: any) => {\n args.onChange({ value, event });\n };\n\n const focusInputAfterPopupClose = () => {\n // Defer focus long enough for the popup close lifecycle to complete.\n nextTick(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n const end = (inputEl.value ?? \"\").length;\n inputEl.setSelectionRange(end, end);\n }\n });\n });\n });\n };\n\n const inferPopupAction = (event: any): PopupAction => {\n const target = event?.event?.target as HTMLElement | null | undefined;\n if (!target) return null;\n if (target.closest(\".k-time-now\")) return \"now\";\n if (target.closest(\".k-time-accept\")) return \"set\";\n return null;\n };\n\n const emitParsedDate = (date: Date | null, event: any) => {\n if (date && inRangeTime(date)) {\n emitValue(date, event);\n } else {\n emitValue(null, event);\n }\n };\n\n const handleChange: AnyArgsHandler = (...eventArgs) => {\n const event = eventArgs[0] as any;\n if (!event) return;\n\n const action = inferPopupAction(event);\n\n // TimePicker popup path: distinguish NOW vs SET and normalize value handling.\n if (action === \"now\") {\n const now = new Date();\n syncRawFromDate(now);\n emitParsedDate(now, event);\n focusInputAfterPopupClose();\n return;\n }\n\n if (event?.value instanceof Date) {\n const nextValue = new Date(event.value);\n syncRawFromDate(nextValue);\n emitParsedDate(nextValue, event);\n if (action === \"set\") {\n focusInputAfterPopupClose();\n }\n return;\n }\n\n if (event?.value === null) {\n raw.value = \"\";\n emitValue(null, event);\n return;\n }\n\n // Set raw first from event\n raw.value = event.value as string;\n const src = event.event?.target as HTMLInputElement;\n cursorPos.value = src?.selectionStart ?? 0;\n // If caret is in AM/PM segment and user typed A/a or P/p, auto-complete to AM/PM\n try {\n const pos = cursorPos.value ?? 0;\n if (partAt(pos) === \"ampm\" && (raw.value ?? \"\").length >= 8) {\n const first = raw.value.charAt(6);\n if (/[Aa]/.test(first)) {\n raw.value = `${raw.value.slice(0, 6)}AM${raw.value.slice(8)}`;\n // Move caret to end of AM/PM\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(8, 8);\n }\n });\n });\n } else if (/[Pp]/.test(first)) {\n raw.value = `${raw.value.slice(0, 6)}PM${raw.value.slice(8)}`;\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(8, 8);\n }\n });\n });\n }\n }\n } catch {}\n emitParsedIfComplete(event);\n };\n\n const handleClick = (event: MouseEvent): void => {\n cursorPos.value = (event.target as HTMLInputElement).selectionStart ?? 0;\n };\n\n const applyStep = (\n direction: \"ArrowUp\" | \"ArrowDown\",\n sourceEl: HTMLInputElement | null | undefined,\n event: Event,\n ): void => {\n const pos = sourceEl?.selectionStart ?? cursorPos.value ?? 0;\n cursorPos.value = pos;\n const part = partAt(pos);\n\n const dispMatch = (raw.value ?? \"\").match(/^(\\d{2}):(\\d{2})\\s([AP]M)$/i);\n if (!dispMatch) {\n // If empty, initialize to current time on first step\n if ((raw.value ?? \"\").length === 0 || digitsOnly.value.length === 0) {\n const now = new Date();\n const h24 = now.getHours();\n const ap = h24 >= 12 ? \"PM\" : \"AM\";\n raw.value = toDisplay(h24, now.getMinutes(), ap);\n const date = toDateFromDisplay(raw.value);\n emitParsedDate(date, event);\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n }\n // For non-empty but invalid formats, do not auto-correct\n return;\n }\n let hh = parseInt(dispMatch[1]);\n let mm = parseInt(dispMatch[2]);\n let ap = dispMatch[3].toUpperCase() as \"AM\" | \"PM\";\n\n if (part === \"hh\") {\n if (direction === \"ArrowUp\") hh = hh < 12 ? hh + 1 : 1;\n else hh = hh > 1 ? hh - 1 : 12;\n } else if (part === \"mm\") {\n const step = args.minuteStepRef?.value ?? args.minuteStep ?? 1;\n if (step === 1) {\n if (direction === \"ArrowUp\") mm = mm < 59 ? mm + 1 : 0;\n else mm = mm > 0 ? mm - 1 : 59;\n } else {\n if (direction === \"ArrowUp\") {\n const rem = mm % step;\n let next = rem === 0 ? mm + step : mm + (step - rem);\n if (next >= 60) next = 0; // wrap to top of hour\n mm = next;\n } else {\n const rem = mm % step;\n let prev = rem === 0 ? mm - step : mm - rem;\n if (prev < 0) prev = 60 - step; // wrap to last step in hour\n mm = prev;\n }\n }\n } else if (part === \"ampm\") {\n ap = ap === \"AM\" ? \"PM\" : \"AM\";\n }\n\n raw.value = `${String(hh).padStart(2, \"0\")}:${String(mm).padStart(\n 2,\n \"0\",\n )} ${ap}`;\n const date = toDateFromDisplay(raw.value);\n emitParsedDate(date, event);\n\n nextTick(() => {\n requestAnimationFrame(() => {\n const inputEl = document.getElementById(\n args.id,\n ) as HTMLInputElement | null;\n const p = cursorPos.value ?? 0;\n if (inputEl) {\n inputEl.focus();\n inputEl.setSelectionRange(p, p);\n }\n });\n });\n };\n\n const handleKeyDown = (event: KeyboardEvent): void => {\n if (event.code === \"Space\" || event.key === \" \") {\n // Open the picker without modifying the input\n // Justified: Space opens the time picker popup instead of inserting a space.\n event.preventDefault();\n // Justified: Parent containers such as grid keyboard handlers should not consume this.\n event.stopPropagation();\n args.onShowPicker(event);\n return;\n }\n\n // Alt+Down opens the picker; allow other Alt+arrow combinations to pass through\n if (event.key === \"ArrowDown\" && event.altKey) {\n // Justified: Alt+Down is reserved for opening the time picker popup.\n event.preventDefault();\n // Justified: Prevent parent keyboard navigation from treating this as row movement.\n event.stopPropagation();\n args.onShowPicker(event);\n return;\n }\n\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n // Justified: ArrowUp/Down act as time-part steppers instead of native caret/page behavior.\n event.preventDefault();\n // Justified: Prevent parent containers such as the grid from also handling these arrows.\n event.stopPropagation();\n const src = event.target as HTMLInputElement;\n applyStep(event.key as \"ArrowUp\" | \"ArrowDown\", src, event);\n return;\n }\n };\n\n const handleWheel = (event: WheelEvent): void => {\n // Map mouse wheel to stepper behavior (up/down) based on caret segment\n // Prevent page scroll when interacting with the input\n event.preventDefault();\n const direction = event.deltaY < 0 ? \"ArrowUp\" : \"ArrowDown\";\n applyStep(direction, event.target as HTMLInputElement, event);\n };\n\n const handleKeyUp = (event: KeyboardEvent): void => {\n const src = event.target as HTMLInputElement;\n if (cursorKeys.includes(event.key)) {\n // Do not prevent default for caret navigation\n cursorPos.value = src?.selectionStart ?? 0;\n return;\n }\n if (steppers.includes(event.key)) {\n if (event.altKey) return;\n cursorPos.value = src?.selectionStart ?? 0;\n }\n };\n\n const handleBlur = (event: FocusEvent): void => {\n isTouched.value = true;\n\n // If required and value is still undefined/blank, coerce external\n // value from undefined -> \"\" so downstream validation can treat\n // this as an incomplete required field.\n if (\n isRequired.value &&\n args.externalValue &&\n args.externalValue.value === undefined &&\n digitsOnly.value.length === 0\n ) {\n (args.externalValue as Ref<any>).value = \"\";\n }\n\n const src = event.target as HTMLInputElement | null;\n if (src) {\n cursorPos.value = src.selectionStart ?? 0;\n }\n };\n\n // Sync external value into raw when provided\n if (args.externalValue) {\n watch(\n args.externalValue,\n (newVal) => {\n if (newVal) {\n const date = new Date(newVal as any);\n if (date.toString() !== \"Invalid Date\") {\n const h24 = date.getHours();\n const ap = h24 >= 12 ? \"PM\" : \"AM\";\n raw.value = toDisplay(h24, date.getMinutes(), ap);\n return;\n }\n }\n // If external value is null/invalid, keep current raw as-is\n },\n { immediate: true },\n );\n }\n\n const debugLines = computed(() => {\n return [\n [\"Time\", raw.value || \"--:-- --\"],\n [\"Hour (12h)\", hour.value],\n [\"Hour (24h)\", hour24.value],\n [\"Minute\", minute.value],\n [\"Period\", period.value],\n [\"Time (24h)\", time24.value ?? \"--:--:--\"],\n [\"Digits only\", digitsOnly.value],\n [\n \"Parsed Date\",\n parsedRawTime.value?.toLocaleDateString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }) ?? null,\n ],\n [\n \"min\",\n args.min?.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }) ?? null,\n ],\n [\n \"max\",\n args.max?.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }) ?? null,\n ],\n [\"valid\", isValid.value],\n [\"reason\", reason.value],\n [\"validationMessage\", validationMessage.value],\n ];\n });\n\n // Validation based on completeness and parse-ability\n const parsedRawTime = computed<Date | null>(\n () => toDateFromDisplay(raw.value) ?? null,\n );\n const isValid = computed(() => {\n // Optional field preserves forgiving behavior\n if (!isRequired.value) {\n if (!isComplete.value) return true;\n const t = parsedRawTime.value;\n if (!t) return false;\n return inRangeTime(t);\n }\n\n // Required field: do not flag invalid until after blur\n if (!isTouched.value) return true;\n\n const t = parsedRawTime.value;\n if (!isComplete.value) return false;\n if (!t) return false;\n return inRangeTime(t);\n });\n\n const reason = computed<string | undefined>(() => {\n // Optional: only report reasons for completed-but-bad values\n if (!isRequired.value) {\n if (!isComplete.value) return undefined;\n const t = parsedRawTime.value;\n if (!t) return \"invalid-time\";\n if (!inRangeTime(t)) return \"out-of-bounds\";\n return \"valid\";\n }\n\n // Required: only validate after blur\n if (!isTouched.value) return undefined;\n\n if (digitsOnly.value.length === 0 || !isComplete.value) {\n return \"incomplete\";\n }\n\n const t = parsedRawTime.value;\n if (!t) return \"invalid-time\";\n if (!inRangeTime(t)) return \"out-of-bounds\";\n return \"valid\";\n });\n\n const validationMessage = computed(() => {\n const r = reason.value;\n if (!r || r === \"valid\") return \"\";\n\n if (r === \"incomplete\") {\n return \"Required\";\n }\n\n if (r === \"invalid-time\") {\n return `Must be in ${placeholder.value} format.`;\n }\n\n const opts: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n };\n const minStr = args.min ? args.min.toLocaleTimeString(\"en-US\", opts) : null;\n const maxStr = args.max ? args.max.toLocaleTimeString(\"en-US\", opts) : null;\n if (r === \"out-of-bounds\") {\n if (minStr && maxStr) return `Must be between ${minStr} and ${maxStr}.`;\n if (minStr) return `Must be ${minStr} or later.`;\n if (maxStr) return `Must be ${maxStr} or earlier.`;\n }\n\n return \"\";\n });\n\n const initStyling = () => {\n // Idempotent application of the `fk-timepicker` class to the time picker's parent\n nextTick(() => {\n const inputEl = document.getElementById(args.id) as HTMLElement | null;\n if (!inputEl) {\n console.warn(`#${args.id} not found for styling.`);\n return;\n }\n const timePicker = inputEl.closest(\".k-timepicker\");\n if (!timePicker) {\n console.warn(\n `.k-timepicker parent of #${args.id} not found for styling.`,\n );\n return;\n }\n const parent = timePicker.parentElement;\n if (!parent) {\n console.warn(\n `Parent of .k-timepicker not found for #${args.id} styling.`,\n );\n return;\n }\n if (parent.classList.contains(\"fk-timepicker\")) return;\n parent.classList.add(\"fk-timepicker\");\n });\n };\n\n onMounted(() => {\n initStyling();\n });\n\n return {\n raw,\n rules,\n debugEnabled,\n debugLines,\n placeholder,\n isValid,\n reason: readonly(reason),\n validationMessage,\n isComplete,\n inRangeTime,\n cursorPos,\n hour: readonly(hour),\n hour24: readonly(hour24),\n minute: readonly(minute),\n period: readonly(period),\n time24: readonly(time24),\n parsedRawTime: readonly(parsedRawTime),\n handleChange,\n handleKeyDown,\n handleKeyUp,\n handleClick,\n handleWheel,\n handleBlur,\n // Expose so consumers can reapply theming when Kendo updates DOM\n initStyling,\n };\n}\n","import { nextTick, readonly, ref, shallowRef, watch, type Ref } from \"vue\";\nimport { useFocusTrap } from \"@vueuse/integrations/useFocusTrap\";\nimport { onClickOutside } from \"@vueuse/core\";\n\nexport type CloseReason = \"escape\" | \"outside\";\nexport type InitialFocus =\n | string\n | ((root: HTMLElement) => HTMLElement | null | undefined);\n\nexport function usePopupTrap(opts: {\n isOpen: Ref<boolean>;\n onRequestClose?: (reason: CloseReason, ev?: Event) => void;\n popupSelector?: string | string[];\n triggerEl?: Ref<HTMLElement | null>;\n resolvePopupEl?: () => HTMLElement | null;\n initialFocus?: InitialFocus;\n focusTrapOptions?: Parameters<typeof useFocusTrap>[1];\n returnFocusToTrigger?: boolean;\n}) {\n const popupRef = shallowRef<HTMLElement | null>(null);\n\n const defaultSelectors = [\n \".k-animation-container .k-popup\",\n \".k-popup\",\n \".k-timepicker-popup\",\n \".k-menu-popup\",\n ];\n\n const selectors = Array.isArray(opts.popupSelector)\n ? opts.popupSelector\n : [opts.popupSelector ?? defaultSelectors].flat();\n\n const pickInitialFocus = (root: HTMLElement) => {\n if (!root) return null as unknown as HTMLElement;\n if (typeof opts.initialFocus === \"string\") {\n const found = root.querySelector(opts.initialFocus) as HTMLElement | null;\n return found ?? root;\n }\n if (typeof opts.initialFocus === \"function\") {\n return (opts.initialFocus(root) as HTMLElement | null) ?? root;\n }\n const candidate = root.querySelector(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n ) as HTMLElement | null;\n return candidate ?? root;\n };\n\n const { activate, deactivate } = useFocusTrap(popupRef, {\n escapeDeactivates: false,\n clickOutsideDeactivates: false,\n fallbackFocus: () => popupRef.value as HTMLElement,\n initialFocus: () => pickInitialFocus(popupRef.value as HTMLElement),\n ...(opts.focusTrapOptions ?? {}),\n });\n\n let escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n let lastCloseReason = ref<CloseReason | null>(null);\n\n const findPopup = (): HTMLElement | null => {\n if (opts.resolvePopupEl) return opts.resolvePopupEl();\n\n const pickLastVisible = (root: ParentNode, sel: string) => {\n const list = Array.from(root.querySelectorAll(sel)) as HTMLElement[];\n if (!list.length) return null as HTMLElement | null;\n const visible = list.filter(\n (el) => el.offsetParent !== null || el.getClientRects().length > 0,\n );\n return visible[visible.length - 1] ?? list[list.length - 1] ?? null;\n };\n\n const scopeRoot =\n opts.triggerEl?.value?.closest?.(\".k-animation-container\") ??\n document.body;\n\n for (const sel of selectors) {\n const el = pickLastVisible(scopeRoot, sel);\n if (el) return el;\n }\n\n for (const sel of selectors) {\n const el = pickLastVisible(document, sel);\n if (el) return el;\n }\n\n return null;\n };\n\n onClickOutside(popupRef, (e) => {\n lastCloseReason.value = \"outside\";\n if (opts.isOpen.value) {\n opts.onRequestClose?.(\"outside\", e);\n }\n });\n\n watch(\n () => opts.isOpen.value,\n (open) => {\n if (open) {\n // Reset on open so the previous reason remains visible while closed\n lastCloseReason.value = null;\n nextTick(() => {\n const popup = findPopup();\n if (!popup) return;\n popupRef.value = popup;\n setTimeout(() => activate(), 0);\n\n if (!escapeHandler) {\n escapeHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n lastCloseReason.value = \"escape\";\n if (opts.isOpen.value) {\n opts.onRequestClose?.(\"escape\", e);\n }\n }\n };\n // Capture on document to catch Escape even when focus\n // stays on the trigger (e.g., TimeInput masked field).\n document.addEventListener(\"keydown\", escapeHandler, true);\n }\n });\n } else {\n deactivate();\n if (escapeHandler) {\n document.removeEventListener(\"keydown\", escapeHandler, true);\n escapeHandler = null;\n }\n popupRef.value = null;\n\n // On outside close, ensure trigger/input is not focused\n if (lastCloseReason.value === \"outside\") {\n nextTick(() => {\n const doBlur = () => {\n const root = opts.triggerEl?.value as HTMLElement | null;\n const input = root?.querySelector(\"input\") as HTMLElement | null;\n const active = document.activeElement as HTMLElement | null;\n // Only blur if focus is still on the trigger/input to avoid interfering\n if (\n active &&\n (active === input || (root && root.contains(active)))\n ) {\n (input ?? root)?.blur?.();\n }\n };\n requestAnimationFrame(() => setTimeout(doBlur, 0));\n });\n }\n\n if (\n opts.returnFocusToTrigger !== false &&\n lastCloseReason.value === \"escape\"\n ) {\n if (opts.triggerEl?.value) {\n // Schedule after Vue updates and after event/click propagation\n nextTick(() => {\n const doFocus = () => {\n const root = opts.triggerEl?.value as HTMLElement | null;\n if (!root) return;\n const input = root.querySelector(\"input\") as HTMLElement | null;\n const target = (input ?? root) as HTMLElement | null;\n target?.focus?.();\n };\n requestAnimationFrame(() => setTimeout(doFocus, 0));\n });\n }\n }\n }\n },\n );\n\n return {\n popupRef,\n activate,\n deactivate,\n lastCloseReason: readonly(lastCloseReason),\n setPopupEl: (el: HTMLElement | null) => (popupRef.value = el),\n };\n}\n"],"names":["useGridA11y","gridRef","options","activeFilterButton","ref","a11yInitialized","mutationsObserver","rowObserver","headerThTeardownCallbacks","intraRowNavigationSelector","getGridRootElement","host","isWithinThisGridScope","target","gridRoot","ariaRoot","fallbackScope","isEnterActivation","event","getColumns","handleFilterButtonKeyboardListener","key","handleFilterMenuKeyboardListener","menuItems","filterContainer","defaultFocusable","focusableSelectors","focusableElements","focusedIndex","el","targetIndex","item","currentTh","setupFilterMenuObserver","mutations","mutation","node","element","column","nextTick","wrapper","tryFocusMenuItem","container","isFormControl","tagName","handleGridKeyDown","e","row","isIntraRowHorizontalNavKey","focusedRow","r","findSiblingRow","start","direction","sib","targetRow","tabbable","currentIndex","setupGridStyling","gridHost","gridElement","setupTrNavigation","ensureSingleTabindex","rows","err","index","tbody","error","setupFilterButtonAccessibility","filterButtons","setupHeaderThTriggers","cleanupGridA11y","teardown","th","btn","columns","field","filterable","sortable","openMenu","clickHandler","columnLink","keyHandler","thead","theadKeyboardHandler","handleSortChange","customHandler","menuOpened","menuItemSelected","fieldIsSortable","c","s","initA11y","onBeforeUnmount","isCompositeFilter","filterItem","isFilterDescriptor","hasFieldFilterRecursive","child","useGridActiveFilter","filterRef","f","DEFAULT_IGNORE_SELECTORS","useGridRowAction","onRowAction","dataItems","ignoreSelectors","shouldIgnoreTarget","enableKeyboardAction","combinedIgnoreSelectors","isIgnoredTarget","selectorString","hasTextSelection","selection","anchorParent","focusParent","isAnchorInside","isFocusInside","nativeEvent","context","explicitDataItem","rowEl","rowIndexAttr","rowIndex","resolvedDataItem","itemsList","DEFAULT_ZIP_ERROR_MESSAGE","formatZipDisplay","input","digits","countDigitsBeforeIndex","value","digitIndexToDisplayIndex","digitIndex","useZipTextBox","zipDisplay","submitted","errorMessage","zipRaw","computed","isZipValid","length","showZipError","textBoxValid","textBoxValidate","restoreCaret","inputElement","caretIndex","args","nextValue","inputValue","opts","valid","useFieldsetTouchTracker","fieldsetRef","touched","watchEffect","onFocusout","fieldset","next","reset","useFieldsetValidationKit","suppressNextTouch","fieldsetValidate","toValue","fieldsetIsValid","tracker","createFieldValidity","isValid","createFieldValidationsMap","isValidMap","focusFirstInvalidField","formRef","form","US_STATES_BY_ABBREVIATION","readInputValue","payload","useUSAddressFormData","formData","reactive","useUSAddressZip","zipInputId","zipField","zipWrapperClass","onZipInput","watch","useUSAddressValidation","strictAddress1Valid","strictCityValid","strictStateValid","strictZipValid","strictAddressValid","focusFirstInvalid","focusoutLeavesFieldset","useUSAddress","optionalFeedbackReviewed","isRequired","onAddress1Input","onAddress2Input","onCityInput","onStateChange","resetFormData","resetZip","validationKit","fieldValidations","rawAddress1Valid","rawCityValid","rawStateValid","rawZipValid","rawAddressValid","addressValidate","address1Valid","cityValid","stateValid","zipValid","addressValid","stateDefaultItem","stateOptions","label","normalizedPayload","isAddressEmpty","optionalAddressHasAnyInput","optionalMissingRequiredFields","optionalZipInvalid","zipDigits","optionalPartialInvalid","optionalFeedbackActive","required","leftFieldset","tryOnScopeDispose","fn","getCurrentScope","onScopeDispose","isClient","toString","isObject","val","noop","isIOS","getIsIOS","_a","_b","toArray","watchImmediate","source","cb","defaultWindow","unrefElement","elRef","plain","useEventListener","cleanups","cleanup","register","listener","firstParamTargets","test","stopWatch","unref","raw_targets","raw_events","raw_listeners","raw_options","optionsClone","stop","_iOSWorkaround","onClickOutside","handler","window","ignore","capture","detectIframe","controls","listenerOptions","shouldListen","shouldIgnore","target2","hasMultipleRoots","vm","checkMultipleRoots","children","isProcessingClick","resolveElement","componentElement","isButtonLike","usePopupMenu","popupCloseReason","menuItemSelector","resolveTriggerElement","resolveConfiguredFocusTarget","focusConfiguredTargetOrTrigger","trigger","focusFirstEnabledMenuItem","closePopup","reason","open","handleActionButtonClick","onAction","useMaskedDateInput","raw","cursorPos","debugEnabled","placeholder","MIN_YEAR","isTouched","steppers","cursorKeys","digitsOnly","datePart","pos","month","m","day","d","year","y","emitParsedIfComplete","mmStr","ddStr","yyyyStr","mm","dd","yyyy","isValidParts","createDate","inRange","min","max","parsedRawDate","isComplete","yy","date","daysInMonth","handleChange","src","handleClick","applyStep","sourceEl","today","setDate","focusAndRestore","part","days","steppedDate","handleKeyDown","handleWheel","handleKeyUp","handleBlur","run","inputEl","p","newVal","debugLines","candidate","validationMessage","minStr","maxStr","initStyling","datePicker","parent","onMounted","readonly","useMaskedDateRangeInput","calendarChanged","ONE_DAY","ONE_YEAR","TODAY","MIN_DATE","MAX_DATE","toUtcMidnightMs","clampToMinMax","dMs","rangeIsOrdered","end","maskComplete","parseFromRaw","left","right","mm1","dd1","yyyy1","x","mm2","dd2","yyyy2","sDate","eDate","sOk","eOk","parsed","clamped","spanDays","diffMs","reasonComputed","validComputed","formatDate","fmt","n","w","datePartForPos","tStr","which","mutate","sText","eText","sClamped","eClamped","newValue","originalEvent","handleClear","applyBlurValidation","_event","delay","month1","day1","year1","month2","day2","year2","rangeInput","parentDiv","calendarMonthTabIndexFix","containers","calendarRoot","months","foundTab0","useMaskedTimeInput","rules","partAt","hour","h","v","minute","period","hour24","h12","time24","toDisplay","h24","ap","toDateFromDisplay","display","match","hh","inRangeTime","minutesSinceMidnight","minM","maxM","syncRawFromDate","emitValue","focusInputAfterPopupClose","inferPopupAction","emitParsedDate","eventArgs","action","now","first","dispMatch","step","rem","prev","parsedRawTime","t","timePicker","usePopupTrap","popupRef","shallowRef","defaultSelectors","selectors","pickInitialFocus","root","activate","deactivate","useFocusTrap","escapeHandler","lastCloseReason","findPopup","pickLastVisible","sel","list","visible","scopeRoot","popup","doBlur","active","doFocus"],"mappings":"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","x_google_ignoreList":[11,12]}