v-float 0.9.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -175
- package/dist/index.d.mts +688 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2038 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +74 -74
- package/dist/composables/index.d.ts +0 -4
- package/dist/composables/index.d.ts.map +0 -1
- package/dist/composables/interactions/index.d.ts +0 -7
- package/dist/composables/interactions/index.d.ts.map +0 -1
- package/dist/composables/interactions/navigation-strategies.d.ts +0 -36
- package/dist/composables/interactions/navigation-strategies.d.ts.map +0 -1
- package/dist/composables/interactions/polygon.d.ts +0 -38
- package/dist/composables/interactions/polygon.d.ts.map +0 -1
- package/dist/composables/interactions/use-click.d.ts +0 -120
- package/dist/composables/interactions/use-click.d.ts.map +0 -1
- package/dist/composables/interactions/use-escape-key.d.ts +0 -57
- package/dist/composables/interactions/use-escape-key.d.ts.map +0 -1
- package/dist/composables/interactions/use-focus-trap.d.ts +0 -41
- package/dist/composables/interactions/use-focus-trap.d.ts.map +0 -1
- package/dist/composables/interactions/use-focus.d.ts +0 -60
- package/dist/composables/interactions/use-focus.d.ts.map +0 -1
- package/dist/composables/interactions/use-hover.d.ts +0 -78
- package/dist/composables/interactions/use-hover.d.ts.map +0 -1
- package/dist/composables/interactions/use-list-navigation.d.ts +0 -109
- package/dist/composables/interactions/use-list-navigation.d.ts.map +0 -1
- package/dist/composables/middlewares/arrow.d.ts +0 -25
- package/dist/composables/middlewares/arrow.d.ts.map +0 -1
- package/dist/composables/middlewares/index.d.ts +0 -4
- package/dist/composables/middlewares/index.d.ts.map +0 -1
- package/dist/composables/positioning/index.d.ts +0 -5
- package/dist/composables/positioning/index.d.ts.map +0 -1
- package/dist/composables/positioning/use-arrow.d.ts +0 -55
- package/dist/composables/positioning/use-arrow.d.ts.map +0 -1
- package/dist/composables/positioning/use-client-point.d.ts +0 -218
- package/dist/composables/positioning/use-client-point.d.ts.map +0 -1
- package/dist/composables/positioning/use-floating-tree.d.ts +0 -240
- package/dist/composables/positioning/use-floating-tree.d.ts.map +0 -1
- package/dist/composables/positioning/use-floating.d.ts +0 -162
- package/dist/composables/positioning/use-floating.d.ts.map +0 -1
- package/dist/composables/utils/is-using-keyboard.d.ts +0 -2
- package/dist/composables/utils/is-using-keyboard.d.ts.map +0 -1
- package/dist/composables/utils/use-active-descendant.d.ts +0 -8
- package/dist/composables/utils/use-active-descendant.d.ts.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/types.d.ts +0 -18
- package/dist/types.d.ts.map +0 -1
- package/dist/utils.d.ts +0 -92
- package/dist/utils.d.ts.map +0 -1
- package/dist/v-float.es.js +0 -3520
- package/dist/v-float.umd.js +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["FloatingUIArrow","floatingUIAutoUpdate"],"sources":["../src/composables/utils/use-event-listener.ts","../src/core/floating-accessors.ts","../src/core/lifecycle.ts","../src/utils.ts","../src/composables/interactions/use-click.ts","../src/composables/utils/use-composition.ts","../src/composables/interactions/use-escape-key.ts","../src/composables/utils/is-using-keyboard.ts","../src/composables/interactions/use-focus.ts","../src/composables/interactions/use-focus-trap.ts","../src/composables/interactions/polygon/geometry.ts","../src/composables/interactions/polygon/bridge.ts","../src/composables/interactions/use-hover.ts","../src/composables/utils/use-active-descendant.ts","../src/composables/interactions/list-navigation/strategies.ts","../src/composables/interactions/use-list-navigation.ts","../src/composables/middlewares/arrow.ts","../src/core/floating-internals.ts","../src/composables/positioning/use-arrow.ts","../src/composables/positioning/client-point/tracking-strategies.ts","../src/composables/positioning/client-point/virtual-element-factory.ts","../src/composables/positioning/use-client-point.ts","../src/core/elements.ts","../src/composables/positioning/internal/open-state.ts","../src/composables/positioning/internal/middleware-registry.ts","../src/composables/positioning/internal/position-controller.ts","../src/composables/positioning/use-floating.ts"],"sourcesContent":["import { type MaybeRefOrGetter, toValue, watch } from \"vue\";\nimport type { Fn } from \"@/types\";\n\nexport function useEventListener<TEvent extends Event = Event>(\n target: MaybeRefOrGetter<EventTarget | null | undefined>,\n event: MaybeRefOrGetter<string>,\n listener: (event: TEvent) => void,\n options?: boolean | AddEventListenerOptions,\n): Fn {\n let removeListener: Fn | undefined;\n\n const cleanup = () => {\n removeListener?.();\n removeListener = undefined;\n };\n\n const stopWatch = watch(\n () => [toValue(target), toValue(event)] as const,\n ([currentTarget, currentEvent], _, onCleanup) => {\n cleanup();\n\n if (!currentTarget || !currentEvent) return;\n\n const listenerOptions =\n typeof options === \"object\" && options !== null ? { ...options } : options;\n\n currentTarget.addEventListener(currentEvent, listener as EventListener, listenerOptions);\n\n removeListener = () => {\n currentTarget.removeEventListener(currentEvent, listener as EventListener, listenerOptions);\n };\n\n onCleanup(cleanup);\n },\n {\n immediate: true,\n flush: \"post\",\n },\n );\n\n return () => {\n stopWatch();\n cleanup();\n };\n}\n","import type { MiddlewareData, Placement, Strategy } from \"@floating-ui/dom\";\nimport type { Ref } from \"vue\";\nimport type {\n AnchorElement,\n FloatingElement,\n FloatingStyles,\n} from \"@/composables/positioning/use-floating\";\nimport type { OpenChangeReason } from \"@/types\";\n\nexport interface FloatingRefsShape {\n anchorEl: Ref<AnchorElement>;\n floatingEl: Ref<FloatingElement>;\n arrowEl: Ref<HTMLElement | null>;\n}\n\nexport interface FloatingStateShape {\n open: Readonly<Ref<boolean>>;\n setOpen: (open: boolean, reason?: OpenChangeReason, event?: Event) => void;\n}\n\nexport interface FloatingPositionShape {\n x: Readonly<Ref<number>>;\n y: Readonly<Ref<number>>;\n strategy: Readonly<Ref<Strategy>>;\n placement: Readonly<Ref<Placement>>;\n middlewareData: Readonly<Ref<MiddlewareData>>;\n isPositioned: Readonly<Ref<boolean>>;\n styles: Readonly<Ref<FloatingStyles>>;\n update: () => void;\n}\n\ntype FloatingStateLike = {\n state?: FloatingStateShape;\n open?: FloatingStateShape[\"open\"];\n setOpen?: FloatingStateShape[\"setOpen\"];\n};\n\ntype FloatingPositionLike = {\n position?: FloatingPositionShape;\n x?: FloatingPositionShape[\"x\"];\n y?: FloatingPositionShape[\"y\"];\n strategy?: FloatingPositionShape[\"strategy\"];\n placement?: FloatingPositionShape[\"placement\"];\n middlewareData?: FloatingPositionShape[\"middlewareData\"];\n isPositioned?: FloatingPositionShape[\"isPositioned\"];\n floatingStyles?: FloatingPositionShape[\"styles\"];\n update?: FloatingPositionShape[\"update\"];\n};\n\nexport function getFloatingRefs<R>(context: { refs?: R }): R {\n if (context.refs) {\n return context.refs;\n }\n\n throw new Error(\"[VFloat] Floating refs are missing from the provided context.\");\n}\n\nexport function getFloatingState(context: FloatingStateLike): FloatingStateShape {\n if (context.state) {\n return context.state;\n }\n\n if (context.open && context.setOpen) {\n return {\n open: context.open,\n setOpen: context.setOpen,\n };\n }\n\n throw new Error(\"[VFloat] Floating state is missing from the provided context.\");\n}\n\nexport function getFloatingPosition(context: FloatingPositionLike): FloatingPositionShape {\n if (context.position) {\n return context.position;\n }\n\n if (\n context.x &&\n context.y &&\n context.strategy &&\n context.placement &&\n context.middlewareData &&\n context.isPositioned &&\n context.floatingStyles &&\n context.update\n ) {\n return {\n x: context.x,\n y: context.y,\n strategy: context.strategy,\n placement: context.placement,\n middlewareData: context.middlewareData,\n isPositioned: context.isPositioned,\n styles: context.floatingStyles,\n update: context.update,\n };\n }\n\n throw new Error(\"[VFloat] Floating position data is missing from the provided context.\");\n}\n","import { getCurrentScope, onScopeDispose } from \"vue\";\n\nexport function tryOnScopeDispose(cleanup: () => void): boolean {\n if (!getCurrentScope()) {\n return false;\n }\n\n onScopeDispose(cleanup);\n return true;\n}\n\nexport function createCleanupRegistry() {\n const cleanups = new Set<() => void>();\n\n const add = (cleanup: () => void) => {\n cleanups.add(cleanup);\n\n return () => {\n cleanups.delete(cleanup);\n };\n };\n\n const flush = () => {\n for (const cleanup of [...cleanups].reverse()) {\n cleanups.delete(cleanup);\n cleanup();\n }\n };\n\n return {\n add,\n flush,\n };\n}\n","import { useId as vueUseId } from \"vue\";\nimport type { AnyFn, VirtualElement } from \"@/types\";\n\nlet idCounter = 0;\n\n/**\n * Wrapper around Vue's useId that provides a fallback counter-based ID generator.\n * This ensures unique IDs even when useId() returns empty strings (e.g., in test environments).\n */\nexport function useId(): string {\n const id = vueUseId();\n // If Vue's useId returns an empty string, use a counter-based fallback\n return id || `id-${++idCounter}`;\n}\n\n//=======================================================================================\n// 📌 General Utilities\n//=======================================================================================\n\n/**\n * Checks if a value is a function\n */\nexport function isFunction(value: unknown): value is AnyFn {\n return typeof value === \"function\";\n}\n\n/**\n * Type guard for HTMLElement\n */\nexport function isHTMLElement(value: unknown | null): value is HTMLElement {\n return value instanceof Element && value instanceof HTMLElement;\n}\n\n//=======================================================================================\n// 📌 Browser Environment Detection\n//=======================================================================================\n\n/**\n * Checks if the user agent is on a Mac.\n */\nexport function isMac(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return navigator.platform.toUpperCase().indexOf(\"MAC\") >= 0;\n}\n\n/**\n * Checks if the browser is Safari.\n */\nexport function isSafari(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n}\n\n/**\n * A simple utility to check if an element matches `:focus-visible`.\n */\nexport function matchesFocusVisible(element: Element): boolean {\n if (typeof (element as Element)?.matches !== \"function\") return false;\n return element.matches(\":focus-visible\");\n}\n\n//=======================================================================================\n// 📌 Element & Input Detection\n//=======================================================================================\n\n/**\n * Checks if the pointer type is mouse-like (mouse or pen).\n */\nexport function isMouseLikePointerType(pointerType: string | undefined, strict?: boolean): boolean {\n if (pointerType === undefined) return false;\n const isMouse = pointerType === \"mouse\";\n return strict ? isMouse : isMouse || pointerType === \"pen\";\n}\n\n/**\n * Checks if the element is an input, textarea, or contenteditable element.\n */\nexport function isTypeableElement(element: Element | null): boolean {\n if (!element || !(element instanceof HTMLElement)) return false;\n return (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n (element.isContentEditable && element.contentEditable !== \"false\")\n );\n}\n\n/**\n * Checks if the event target is a button-like element.\n */\nexport function isButtonTarget(event: KeyboardEvent): boolean {\n const target = event.target;\n if (!(target instanceof HTMLElement)) return false;\n return (\n target.tagName === \"BUTTON\" ||\n (target.tagName === \"INPUT\" && target.getAttribute(\"type\") === \"button\") ||\n target.getAttribute(\"role\") === \"button\"\n );\n}\n\n/**\n * Checks if the Space key press should be ignored for the given element.\n */\nexport function isSpaceIgnored(element: Element | null): boolean {\n return isTypeableElement(element);\n}\n\n/**\n * Checks if the value is a VirtualElement.\n */\nexport function isVirtualElement(el: unknown): el is VirtualElement {\n return typeof el === \"object\" && el !== null && \"contextElement\" in el;\n}\n\n/**\n * Checks if the event target is within the given element.\n */\nexport function isEventTargetWithin(event: Event, element: Element | null | undefined): boolean {\n if (!element) return false;\n if (\n \"composedPath\" in event &&\n typeof (event as Event & { composedPath?: () => EventTarget[] }).composedPath === \"function\"\n ) {\n return (event as Event & { composedPath: () => Node[] }).composedPath().includes(element);\n }\n return element.contains(event.target as Node);\n}\n\n/**\n * Checks if a click event occurred on a scrollbar.\n */\nexport function isClickOnScrollbar(event: MouseEvent, target: HTMLElement): boolean {\n const rect = target.getBoundingClientRect();\n const scrollbarWidth = target.offsetWidth - target.clientWidth;\n const scrollbarHeight = target.offsetHeight - target.clientHeight;\n\n // Convert event coordinates to element-relative coordinates\n const elementX = event.clientX - rect.left;\n const elementY = event.clientY - rect.top;\n\n // Check vertical scrollbar (typically on the right)\n if (scrollbarWidth > 0) {\n const scrollbarStart = target.clientWidth;\n if (elementX >= scrollbarStart && elementX <= target.offsetWidth) {\n return true;\n }\n }\n\n // Check horizontal scrollbar (typically on the bottom)\n if (scrollbarHeight > 0) {\n const scrollbarStart = target.clientHeight;\n if (elementY >= scrollbarStart && elementY <= target.offsetHeight) {\n return true;\n }\n }\n\n return false;\n}\n\n//=======================================================================================\n// 📌 Event Handling & Timing\n//=======================================================================================\n\n/**\n * Simple element containment wrapper.\n */\nexport function contains(el: HTMLElement, target: Element | null): boolean {\n return el.contains(target);\n}\n\n/**\n * Event target extraction utility.\n */\nexport function getTarget(event: MouseEvent | TouchEvent): Element | null {\n return event.target as Element | null;\n}\n\n/**\n * Safe performance timing that handles environments without performance API.\n */\nexport function getCurrentTime(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\n/**\n * Centralized timeout management to prevent memory leaks.\n */\nexport function clearTimeoutIfSet(timeoutId: number): void {\n if (timeoutId !== -1) {\n clearTimeout(timeoutId);\n }\n}\n\n/**\n * Checks if an element (or virtual element's context) is present in the event path.\n */\nexport function isElementInEventPath(element: unknown, path: EventTarget[]): boolean {\n if (element instanceof Element) {\n return path.includes(element);\n }\n if (isVirtualElement(element) && element.contextElement instanceof Element) {\n return path.includes(element.contextElement);\n }\n return false;\n}\n\n/**\n * Returns the composed path of a node, handling Shadow DOM.\n */\nexport function getDomPath(node: Node | null): EventTarget[] {\n const path: EventTarget[] = [];\n let current: Node | null = node;\n while (current) {\n path.push(current);\n if (current instanceof ShadowRoot) {\n current = current.host;\n } else {\n current = current.parentNode;\n }\n }\n return path;\n}\n","import { computed, type MaybeRefOrGetter, onWatcherCleanup, toValue, watchPostEffect } from \"vue\";\nimport type { FloatingContext } from \"@/composables/positioning/use-floating\";\nimport { useEventListener } from \"@/composables/utils/use-event-listener\";\nimport { getFloatingRefs, getFloatingState } from \"@/core/floating-accessors\";\nimport { tryOnScopeDispose } from \"@/core/lifecycle\";\nimport type { OpenChangeReason } from \"@/types\";\nimport {\n isButtonTarget,\n isClickOnScrollbar,\n isEventTargetWithin,\n isHTMLElement,\n isMouseLikePointerType,\n isSpaceIgnored,\n} from \"@/utils\";\n\ntype PointerType = \"mouse\" | \"touch\" | \"pen\";\n\n//=======================================================================================\n// 📌 Main\n//=======================================================================================\n\n/**\n * Enables showing/hiding the floating element when clicking the anchor element\n * and optionally when clicking outside both the anchor and floating elements.\n *\n * This composable provides unified event handlers for both inside click interactions\n * (to open/toggle floating elements) and outside click interactions (to close them).\n *\n * @param context - The floating context with open state and change handler.\n * @param options - Configuration options for click behavior.\n *\n * @example Basic usage with outside click enabled\n * ```ts\n * const context = useFloating(...)\n * useClick(context, {\n * toggle: true,\n * closeOnOutsideClick: true,\n * outsideClickEvent: 'pointerdown'\n * })\n * ```\n *\n * @example Custom outside click handler\n * ```ts\n * useClick(context, {\n * closeOnOutsideClick: true,\n * onOutsideClick: (event) => {\n * if (confirm(\"Close dialog?\")) {\n * context.setOpen(false)\n * }\n * },\n * })\n * ```\n */\nexport function useClick(context: UseClickContext, options: UseClickOptions = {}): void {\n const { open, setOpen } = getFloatingState(context);\n const refs = getFloatingRefs(context);\n const {\n enabled = true,\n event: eventOption = \"click\",\n toggle = true,\n ignoreMouse = false,\n ignoreKeyboard = false,\n ignoreTouch = false,\n // Outside click options\n closeOnOutsideClick = false,\n outsideClickEvent = \"pointerdown\",\n outsideCapture = true,\n onOutsideClick,\n ignoreScrollbar = true,\n ignoreDrag = true,\n } = options;\n\n //=====================================================================================\n // Interaction State\n //=====================================================================================\n // Kept as plain locals (not refs/reactive) because they only coordinate\n // intra-event ordering and short-lived suppression windows.\n const interactionState = {\n pointerType: undefined as PointerType | undefined,\n didKeyDown: false,\n dragStartedInside: false,\n interactionInProgress: false,\n };\n\n // Timeout used to clear `dragStartedInside` after a `mouseup`.\n // Stored so we can cancel/avoid late updates on unmount/anchor change.\n let dragResetTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const isEnabled = computed(() => toValue(enabled));\n const isOutsideClickEnabled = computed(() => toValue(closeOnOutsideClick));\n\n const anchorEl = computed(() => {\n const el = refs.anchorEl.value;\n if (el instanceof HTMLElement) return el;\n return null;\n });\n\n const floatingEl = computed(() => refs.floatingEl.value);\n\n //=====================================================================================\n // Event Handlers (Anchor & Outside)\n //=====================================================================================\n\n function clearDragResetTimeout() {\n if (dragResetTimeoutId == null) return;\n clearTimeout(dragResetTimeoutId);\n dragResetTimeoutId = undefined;\n }\n\n function handleOpenChange(reason: OpenChangeReason, event: Event) {\n interactionState.interactionInProgress = true;\n try {\n if (open.value) {\n // When `toggle` is enabled, anchor clicks toggle open/closed.\n toValue(toggle) && setOpen(false, reason, event);\n } else {\n setOpen(true, reason, event);\n }\n } finally {\n // Reset after a micro-task so the same native event can finish bubbling\n // before the document-level outside listener potentially closes the element.\n queueMicrotask(() => {\n interactionState.interactionInProgress = false;\n });\n }\n }\n\n function resetInteractionState() {\n interactionState.pointerType = undefined;\n interactionState.didKeyDown = false;\n interactionState.dragStartedInside = false;\n clearDragResetTimeout();\n }\n\n function onPointerDown(e: PointerEvent) {\n interactionState.pointerType = e.pointerType as PointerType;\n }\n\n function isSyntheticKeyboardClick(e: MouseEvent): boolean {\n // When keyboard interactions are disabled, browsers may still dispatch a\n // click after Enter/Space activation on some elements.\n return toValue(ignoreKeyboard) && e.detail === 0;\n }\n\n function onMouseDown(e: MouseEvent) {\n // Ignore non-primary buttons\n if (e.button !== 0) return;\n if (toValue(eventOption) === \"click\") return;\n if (shouldIgnorePointerType(interactionState.pointerType)) return;\n\n handleOpenChange(\"anchor-click\", e);\n }\n\n function onClick(e: MouseEvent): void {\n if (isSyntheticKeyboardClick(e)) {\n resetInteractionState();\n return;\n }\n\n if (toValue(eventOption) === \"mousedown\" && interactionState.pointerType) {\n // If pointerdown exists, reset it and skip click, as mousedown handled it.\n resetInteractionState();\n return;\n }\n\n if (shouldIgnorePointerType(interactionState.pointerType)) {\n resetInteractionState();\n return;\n }\n\n handleOpenChange(\"anchor-click\", e);\n resetInteractionState();\n }\n\n function onKeyDown(e: KeyboardEvent) {\n interactionState.pointerType = undefined;\n\n if (e.defaultPrevented || toValue(ignoreKeyboard) || isButtonTarget(e)) {\n return;\n }\n\n const el = anchorEl.value;\n if (!el) return;\n\n if (e.key === \" \" && !isSpaceIgnored(el)) {\n // Prevent scrolling\n e.preventDefault();\n interactionState.didKeyDown = true;\n }\n\n if (e.key === \"Enter\") {\n handleOpenChange(\"keyboard-activate\", e);\n }\n }\n\n function onKeyUp(e: KeyboardEvent) {\n const el = anchorEl.value; // Get current element inside handler\n if (!el) return;\n\n if (e.defaultPrevented || toValue(ignoreKeyboard) || isButtonTarget(e) || isSpaceIgnored(el)) {\n return;\n }\n\n if (e.key === \" \" && interactionState.didKeyDown) {\n interactionState.didKeyDown = false;\n handleOpenChange(\"keyboard-activate\", e);\n }\n }\n\n // --- Outside Click Event Handlers ---\n\n function onOutsideClickHandler(event: MouseEvent) {\n if (!isEnabled.value || !isOutsideClickEnabled.value || !open.value) {\n return;\n }\n\n // Suppress outside-close for click sequences caused by a drag that started\n // inside the floating content.\n if (suppressOutsideClickForDragSequence()) return;\n\n // Don't process outside clicks during ongoing interactions\n if (interactionState.interactionInProgress) {\n return;\n }\n\n const target = event.target as Node | null;\n if (!target) return;\n\n // Clicked on a scrollbar\n if (\n toValue(ignoreScrollbar) &&\n isHTMLElement(target) &&\n floatingEl.value &&\n isClickOnScrollbar(event, target)\n ) {\n return;\n }\n\n if (\n isEventTargetWithin(event, anchorEl.value) ||\n isEventTargetWithin(event, floatingEl.value)\n ) {\n return;\n }\n\n // Use custom handler if provided, otherwise use default behavior\n if (onOutsideClick) {\n onOutsideClick(event);\n } else {\n setOpen(false, \"outside-pointer\", event);\n }\n }\n\n function suppressOutsideClickForDragSequence(): boolean {\n if (toValue(outsideClickEvent) !== \"click\") return false;\n if (!toValue(ignoreDrag)) return false;\n if (!interactionState.dragStartedInside) return false;\n\n interactionState.dragStartedInside = false;\n return true;\n }\n\n function onFloatingMouseDown() {\n interactionState.dragStartedInside = true;\n }\n\n function onFloatingMouseUp() {\n // Reset drag state after a brief delay to allow click events to process\n clearDragResetTimeout();\n dragResetTimeoutId = setTimeout(() => {\n interactionState.dragStartedInside = false;\n }, 0);\n }\n\n //=====================================================================================\n // Helper Functions\n //=====================================================================================\n\n function shouldIgnorePointerType(type: PointerType | undefined): boolean {\n if (isMouseLikePointerType(type, true) && toValue(ignoreMouse)) {\n return true;\n }\n if (type === \"touch\" && toValue(ignoreTouch)) {\n return true;\n }\n return false;\n }\n\n // Ensure the drag suppression timer can't update state after unmount.\n tryOnScopeDispose(() => {\n clearDragResetTimeout();\n });\n\n //=====================================================================================\n // Wiring: attach handlers to the current anchor element\n //=====================================================================================\n\n watchPostEffect(() => {\n const el = anchorEl.value;\n if (!isEnabled.value || !el) return;\n\n el.addEventListener(\"pointerdown\", onPointerDown);\n el.addEventListener(\"mousedown\", onMouseDown);\n el.addEventListener(\"click\", onClick);\n el.addEventListener(\"keydown\", onKeyDown);\n el.addEventListener(\"keyup\", onKeyUp);\n\n onWatcherCleanup(() => {\n el.removeEventListener(\"pointerdown\", onPointerDown);\n el.removeEventListener(\"mousedown\", onMouseDown);\n el.removeEventListener(\"click\", onClick);\n el.removeEventListener(\"keydown\", onKeyDown);\n el.removeEventListener(\"keyup\", onKeyUp);\n resetInteractionState();\n });\n });\n\n //=====================================================================================\n // Wiring: document outside-click listener + drag suppression on floating\n //=====================================================================================\n\n // Document listener for outside clicks\n useEventListener(\n () => (isEnabled.value && isOutsideClickEnabled.value ? document : null),\n outsideClickEvent,\n onOutsideClickHandler,\n { capture: toValue(outsideCapture) },\n );\n\n // Floating element listeners for drag detection\n useEventListener(\n () =>\n isEnabled.value && isOutsideClickEnabled.value && toValue(ignoreDrag)\n ? floatingEl.value\n : null,\n \"mousedown\",\n onFloatingMouseDown,\n { capture: true },\n );\n\n useEventListener(\n () =>\n isEnabled.value && isOutsideClickEnabled.value && toValue(ignoreDrag)\n ? floatingEl.value\n : null,\n \"mouseup\",\n onFloatingMouseUp,\n { capture: true },\n );\n}\n\n//=======================================================================================\n// 📌 Types\n//=======================================================================================\n\nexport interface UseClickContext {\n refs: FloatingContext[\"refs\"];\n state?: FloatingContext[\"state\"];\n open?: FloatingContext[\"open\"];\n setOpen?: FloatingContext[\"setOpen\"];\n}\n\n/**\n * Options for configuring the useClick behavior.\n */\nexport interface UseClickOptions {\n /**\n * Whether the composable is enabled.\n * @default true\n */\n enabled?: MaybeRefOrGetter<boolean>;\n\n /**\n * The type of event to use to determine a \"click\" with mouse input.\n * This option does not effect keyboard interactions.\n * @default 'click'\n */\n event?: MaybeRefOrGetter<\"click\" | \"mousedown\">;\n\n /**\n * Whether to toggle the open state with repeated clicks.\n * @default true\n */\n toggle?: MaybeRefOrGetter<boolean>;\n\n /**\n * Whether to ignore the logic for mouse input.\n * @default false\n */\n ignoreMouse?: MaybeRefOrGetter<boolean>;\n\n /**\n * Whether to ignore keyboard handlers (Enter and Space key functionality).\n * @default false\n */\n ignoreKeyboard?: MaybeRefOrGetter<boolean>;\n\n /**\n * Whether to ignore touch events.\n * @default false\n */\n ignoreTouch?: MaybeRefOrGetter<boolean>;\n\n // --- Outside Click Options ---\n\n /**\n * Whether to close the floating element when clicking outside.\n * @default false\n */\n closeOnOutsideClick?: MaybeRefOrGetter<boolean>;\n\n /**\n * The event to use for outside click detection.\n * @default 'pointerdown'\n */\n outsideClickEvent?: MaybeRefOrGetter<\"pointerdown\" | \"mousedown\" | \"click\">;\n\n /**\n * Whether to use capture phase for document outside click listener.\n * @default true\n */\n outsideCapture?: MaybeRefOrGetter<boolean>;\n\n /**\n * Custom function to handle outside clicks.\n * If provided, this function will be called instead of the default behavior.\n * @param event - The mouse event that triggered the outside click\n */\n onOutsideClick?: (event: MouseEvent) => void;\n\n /**\n * Whether to ignore clicks on scrollbars (prevent them from closing the floating element).\n * @default true\n */\n ignoreScrollbar?: MaybeRefOrGetter<boolean>;\n\n /**\n * Whether to ignore outside clicks that are part of a drag sequence\n * (where the drag started inside the floating element and ended outside).\n * @default true\n */\n ignoreDrag?: MaybeRefOrGetter<boolean>;\n}\n","import { effectScope, getCurrentScope, onScopeDispose, type Ref, ref } from \"vue\";\nimport { useEventListener } from \"@/composables/utils/use-event-listener\";\n\ninterface CompositionState {\n scope: ReturnType<typeof effectScope>;\n isComposing: Ref<boolean>;\n consumers: number;\n}\n\nlet sharedCompositionState: CompositionState | undefined;\n\nfunction getSharedCompositionState(): CompositionState {\n if (sharedCompositionState) {\n return sharedCompositionState;\n }\n\n const scope = effectScope(true);\n const isComposing = ref(false);\n\n scope.run(() => {\n useEventListener(document, \"compositionstart\", () => {\n isComposing.value = true;\n });\n\n useEventListener(document, \"compositionend\", () => {\n isComposing.value = false;\n });\n });\n\n sharedCompositionState = {\n scope,\n isComposing,\n consumers: 0,\n };\n\n return sharedCompositionState;\n}\n\nexport function useComposition() {\n const state = getSharedCompositionState();\n\n state.consumers += 1;\n\n if (getCurrentScope()) {\n onScopeDispose(() => {\n state.consumers -= 1;\n\n if (state.consumers <= 0) {\n state.scope.stop();\n sharedCompositionState = undefined;\n }\n });\n }\n\n return {\n isComposing: state.isComposing,\n };\n}\n","import { type MaybeRefOrGetter, toValue } from \"vue\";\nimport { useEventListener } from \"@/composables/utils/use-event-listener\";\nimport { getFloatingState } from \"@/core/floating-accessors\";\nimport type { FloatingContext } from \"../positioning\";\nimport { useComposition } from \"../utils/use-composition\";\n\n// =======================================================================================\n// 📌 Types\n// =======================================================================================\n\nexport interface UseEscapeKeyContext {\n state?: FloatingContext[\"state\"];\n open?: FloatingContext[\"open\"];\n setOpen?: FloatingContext[\"setOpen\"];\n}\n\nexport interface UseEscapeKeyOptions {\n /**\n * Condition to enable the escape key listener.\n * @default true\n */\n enabled?: MaybeRefOrGetter<boolean>;\n\n /**\n * Whether to use capture phase for document event listeners.\n * @default false\n */\n capture?: boolean;\n\n /**\n * Whether to call preventDefault on the escape key event before handling it.\n * @default false\n */\n preventDefault?: boolean;\n\n /**\n * Custom callback function to be executed when the escape key is pressed.\n * When provided, overrides default behavior.\n */\n onEscape?: (event: KeyboardEvent) => void;\n}\n\n// =======================================================================================\n// 📌 Composition\n// =======================================================================================\n\n/**\n * A composable to handle the escape key press with composition event handling.\n *\n * When triggered, it will close the floating element by setting open to false.\n *\n * @param context - The floating context with open state and change handler.\n * @param options - {@link UseEscapeKeyOptions}\n *\n * @example Basic usage\n * ```ts\n * const context = useFloating(...)\n * useEscapeKey(context) // Closes the floating element on escape\n * ```\n *\n * @example Custom handler\n * ```ts\n * useEscapeKey(context, {\n * onEscape: (event) => {\n * if (hasUnsavedChanges.value) {\n * showConfirmDialog.value = true\n * } else {\n * context.setOpen(false)\n * }\n * }\n * })\n * ```\n */\nexport function useEscapeKey(\n context: UseEscapeKeyContext,\n options: UseEscapeKeyOptions = {},\n): void {\n const { enabled = true, capture = false, preventDefault = false, onEscape } = options;\n const { isComposing } = useComposition();\n const { open, setOpen } = getFloatingState(context);\n\n const handleEscape = (event: KeyboardEvent) => {\n if (\n event.key !== \"Escape\" ||\n event.defaultPrevented ||\n !toValue(enabled) ||\n !open.value ||\n isComposing.value\n ) {\n return;\n }\n\n if (preventDefault) {\n event.preventDefault();\n }\n\n // Use custom handler if provided\n if (onEscape) {\n onEscape(event);\n return;\n }\n\n // Default behavior: close current context\n setOpen(false, \"escape-key\", event);\n };\n\n // Event listener setup\n useEventListener(document, \"keydown\", handleEscape, capture);\n}\n","import { readonly, ref } from \"vue\";\n\nconst mutableRef = ref(false);\n\nif (typeof window !== \"undefined\") {\n const options = { capture: true };\n\n function switchToKeyboard() {\n mutableRef.value = true;\n\n window.removeEventListener(\"keydown\", switchToKeyboard, options);\n window.addEventListener(\"pointerdown\", switchToPointer, options);\n }\n\n function switchToPointer() {\n mutableRef.value = false;\n\n window.removeEventListener(\"pointerdown\", switchToPointer, options);\n window.addEventListener(\"keydown\", switchToKeyboard, options);\n }\n\n switchToPointer();\n}\n\nexport const isUsingKeyboard = readonly(mutableRef);\n","import { computed, type MaybeRefOrGetter, onWatcherCleanup, toValue, watchPostEffect } from \"vue\";\nimport type { FloatingContext } from \"@/composables/positioning/use-floating\";\nimport { isUsingKeyboard } from \"@/composables/utils/is-using-keyboard\";\nimport { useEventListener } from \"@/composables/utils/use-event-listener\";\nimport { getFloatingRefs, getFloatingState } from \"@/core/floating-accessors\";\nimport { tryOnScopeDispose } from \"@/core/lifecycle\";\nimport {\n isEventTargetWithin,\n isMac,\n isSafari,\n isTypeableElement,\n matchesFocusVisible,\n} from \"@/utils\";\n\n//=======================================================================================\n// 📌 Constants\n//=======================================================================================\n\n/**\n * Delay in milliseconds for checking active element after blur event.\n * Using 0ms ensures check happens in next event loop tick, which is more\n * reliable than relatedTarget for Shadow DOM and programmatic focus changes.\n */\nconst BLUR_CHECK_DELAY = 0;\n\n//=======================================================================================\n// 📌 Main Composable\n//=======================================================================================\n\n/**\n * Enables showing/hiding the floating element when the reference element receives or loses focus.\n *\n * Keyboard-only interaction hook. Compose with `useClick`, `useHover`, `useEscapeKey` for a complete UX.\n *\n * @param context - The floating context with open state and change handler\n * @param options - Configuration options\n *\n * @example\n * ```ts\n * const ctx = useFloating(...)\n * useFocus(ctx)\n * ```\n */\n\nexport function useFocus(context: UseFocusContext, options: UseFocusOptions = {}): UseFocusReturn {\n const { open, setOpen } = getFloatingState(context);\n const { floatingEl, anchorEl: _anchorEl } = getFloatingRefs(context);\n\n const { enabled = true, requireFocusVisible = true } = options;\n\n /**\n * Computed anchor element that handles both HTMLElement and virtual element references.\n * Virtual elements (from libraries like Floating UI) use a `contextElement` property\n * to reference the actual DOM element for positioning calculations.\n */\n const anchorEl = computed(() => {\n if (!_anchorEl.value) return null;\n return _anchorEl.value instanceof HTMLElement\n ? _anchorEl.value\n : _anchorEl.value.contextElement;\n });\n\n let isFocusBlocked = false;\n const isSafariOnMac = isMac() && isSafari();\n let timeoutId: number;\n\n // --- Window Event Listeners for Edge Cases ---\n\n // 1. Blocks the floating element from opening when a user switches back to a\n // tab where the reference element was focused but the popover was closed.\n useEventListener(window, \"blur\", () => {\n if (!open.value && anchorEl.value && anchorEl.value === document.activeElement) {\n isFocusBlocked = true;\n }\n });\n\n // 2. Resets the block when the window regains focus.\n useEventListener(window, \"focus\", () => {\n isFocusBlocked = false;\n });\n\n // --- Element Event Handlers ---\n function onFocus(event: FocusEvent): void {\n if (isFocusBlocked) {\n isFocusBlocked = false;\n return;\n }\n\n const target = event.target instanceof Element ? event.target : null;\n if (toValue(requireFocusVisible) && target) {\n // Safari fails to match `:focus-visible` if focus was initially outside\n // the document. This is a workaround.\n if (isSafariOnMac && !event.relatedTarget) {\n if (!isUsingKeyboard.value && !isTypeableElement(target)) {\n return; // Do not open if interaction was pointer-based on a non-typeable element.\n }\n } else if (!matchesFocusVisible(target)) {\n return; // Standard check for other browsers.\n }\n }\n\n try {\n setOpen(true, \"focus\", event);\n } catch (error) {\n console.error(\"[useFocus] Error in onFocus handler:\", error);\n }\n }\n\n function onBlur(event: FocusEvent): void {\n // Clear any existing timeout from a previous blur event.\n clearTimeout(timeoutId);\n\n // Use a timeout to check the activeElement in the next event loop tick.\n // This is more reliable than `event.relatedTarget` for complex cases\n // like Shadow DOM or when focus is programmatically moved.\n timeoutId = window.setTimeout(() => {\n const ownerDocument = anchorEl.value?.ownerDocument ?? document;\n const activeEl = ownerDocument.activeElement;\n\n // Case 1: Focus has left the window entirely, but the browser is tricky\n // and hasn't blurred the window yet. If `relatedTarget` is null but focus\n // is still on the anchor, we assume focus is about to leave, so don't close.\n if (!event.relatedTarget && activeEl === anchorEl.value) {\n return;\n }\n\n // Case 2: Check if focus is within the floating element\n if (activeEl && floatingEl.value?.contains(activeEl)) {\n return;\n }\n\n // If neither of the above conditions are met, focus has moved elsewhere.\n try {\n setOpen(false, \"blur\", event);\n } catch (error) {\n console.error(\"[useFocus] Error in onBlur handler:\", error);\n }\n }, BLUR_CHECK_DELAY);\n }\n\n // In addition to element-level blur, observe focus changes at the document level\n // to handle cases where focus moves between descendants and outside elements\n // without triggering another blur on the original anchor.\n useEventListener(\n document,\n \"focusin\",\n (evt: FocusEvent) => {\n if (!toValue(enabled)) return;\n const target = evt.target;\n if (!(target instanceof Element)) return;\n\n // Ignore focus entering the anchor itself\n if (isEventTargetWithin(evt, anchorEl.value)) return;\n\n if (isEventTargetWithin(evt, floatingEl.value)) return;\n\n try {\n setOpen(false, \"blur\", evt);\n } catch (error) {\n console.error(\"[useFocus] Error in document focusin handler:\", error);\n }\n },\n { capture: true },\n );\n\n // --- Attach Listeners to the Anchor Element ---\n const removeWatcher = watchPostEffect(() => {\n if (!toValue(enabled)) return;\n const el = anchorEl.value;\n if (!el || !(el instanceof HTMLElement)) return;\n\n el.addEventListener(\"focus\", onFocus);\n el.addEventListener(\"blur\", onBlur);\n\n onWatcherCleanup(() => {\n el.removeEventListener(\"focus\", onFocus);\n el.removeEventListener(\"blur\", onBlur);\n });\n });\n\n // Ensure the timeout is cleared if the component unmounts.\n tryOnScopeDispose(() => {\n clearTimeout(timeoutId);\n });\n\n return {\n /**\n * Cleanup function that removes all event listeners and clears pending timeouts.\n * Useful for manual cleanup in testing scenarios.\n */\n cleanup: () => {\n clearTimeout(timeoutId);\n removeWatcher();\n },\n };\n}\n\n//=======================================================================================\n// 📌 Types\n//=======================================================================================\n\nexport interface UseFocusContext {\n refs: FloatingContext[\"refs\"];\n state?: FloatingContext[\"state\"];\n open?: FloatingContext[\"open\"];\n setOpen?: FloatingContext[\"setOpen\"];\n}\n\nexport interface UseFocusOptions {\n /**\n * Whether focus event listeners are enabled\n * @default true\n */\n enabled?: MaybeRefOrGetter<boolean>;\n\n /**\n * Whether the open state only changes if the focus event is considered\n * visible (`:focus-visible` CSS selector).\n * @default true\n */\n requireFocusVisible?: MaybeRefOrGetter<boolean>;\n}\n\n/**\n * Return value of the useFocus composable\n */\nexport interface UseFocusReturn {\n /**\n * Cleanup function that removes all event listeners and clears pending timeouts.\n * Useful for manual cleanup in testing scenarios.\n */\n cleanup: () => void;\n}\n","import { createFocusTrap, type FocusTrap } from \"focus-trap\";\nimport {\n type ComputedRef,\n computed,\n type MaybeRefOrGetter,\n shallowRef,\n toValue,\n watchPostEffect,\n} from \"vue\";\nimport type { FloatingContext } from \"@/composables/positioning/use-floating\";\nimport { getFloatingRefs, getFloatingState } from \"@/core/floating-accessors\";\nimport { tryOnScopeDispose } from \"@/core/lifecycle\";\n\n//=======================================================================================\n// 📌 Types\n//=======================================================================================\n\nexport interface UseFocusTrapContext {\n refs: FloatingContext[\"refs\"];\n state?: FloatingContext[\"state\"];\n open?: FloatingContext[\"open\"];\n setOpen?: FloatingContext[\"setOpen\"];\n}\n\nexport interface UseFocusTrapOptions {\n /**\n * Determines if the focus trap should be enabled.\n * When `true`, the focus trap is active.\n * @default true\n */\n enabled?: MaybeRefOrGetter<boolean>;\n /**\n * When `true`, content outside the trap will be hidden from accessibility\n * trees (via `aria-hidden`) and potentially made inert (via `inert` attribute\n * if `outsideElementsInert` is `true` and supported).\n * This mimics modal behavior.\n * @default false\n */\n modal?: MaybeRefOrGetter<boolean>;\n /**\n * Specifies the element that should receive initial focus when the trap is activated.\n * - `undefined` or omitted: Focuses the first tabbable element within the trap.\n * - CSS selector string: Queries and focuses the first matching element.\n * - `HTMLElement`: Focuses the specific provided HTML element.\n * - `Function`: A function that returns an `HTMLElement` or `false`. The returned\n * element will receive focus.\n * - `false`: Prevents any initial focus from being set by the trap.\n */\n initialFocus?: HTMLElement | (() => HTMLElement | false) | string | false;\n /**\n * When `true`, focus will be returned to the element that was focused\n * immediately before the trap was activated, upon deactivation.\n * @default true\n */\n returnFocus?: MaybeRefOrGetter<boolean>;\n /**\n * When `true` and the trap is not `modal`, the trap will deactivate (and potentially close\n * the associated component) if focus moves outside the defined trap elements.\n * @default false\n */\n closeOnFocusOut?: MaybeRefOrGetter<boolean>;\n /**\n * Controls whether the browser should scroll to the focused element.\n * Passed directly to the `focus()` method's `preventScroll` option.\n * @default true\n */\n preventScroll?: MaybeRefOrGetter<boolean>;\n /**\n * When `true` and `modal` is `true`, applies the `inert` attribute (if supported\n * by the browser) to elements outside the focus trap to prevent user interaction\n * and assistive technology access.\n * @default false\n */\n outsideElementsInert?: MaybeRefOrGetter<boolean>;\n /**\n * An optional error handler function that will be called if there's an\n * issue during the focus trap activation process.\n * @param error - The error object.\n */\n onError?: (error: unknown) => void;\n}\n\nexport interface UseFocusTrapReturn {\n /** Check if the focus trap is currently active */\n isActive: ComputedRef<boolean>;\n /** Manually activate the focus trap (if enabled and open) */\n activate: () => void;\n /** Manually deactivate the focus trap */\n deactivate: () => void;\n}\n\n//=======================================================================================\n// 📌 Constants & State Management\n//=======================================================================================\n\n// Check for inert support\nconst supportsInert = typeof HTMLElement !== \"undefined\" && \"inert\" in HTMLElement.prototype;\n\ntype TrapIsolationMode = false | \"inert\" | \"aria-hidden\";\n\nfunction resolveInitialFocus(initialFocus: UseFocusTrapOptions[\"initialFocus\"]) {\n return () => (typeof initialFocus === \"function\" ? initialFocus() : initialFocus);\n}\n\nfunction resolveIsolationMode(modal: boolean, outsideElementsInert: boolean): TrapIsolationMode {\n if (!modal) return false;\n if (outsideElementsInert && supportsInert) return \"inert\";\n return \"aria-hidden\";\n}\n\n//=======================================================================================\n// 📌 Main Composable\n//=======================================================================================\n\n/**\n * Creates a focus trap for a floating element using focus-trap library.\n * Manages focus containment, modal behavior, and accessibility features.\n *\n * @param context - Floating context containing floating element refs\n * @param options - Configuration options for the focus trap\n * @returns Object with isActive state, and manual control methods\n */\nexport function useFocusTrap(\n context: UseFocusTrapContext,\n options: UseFocusTrapOptions = {},\n): UseFocusTrapReturn {\n const { floatingEl } = getFloatingRefs(context);\n const { open, setOpen } = getFloatingState(context);\n\n // Normalize options with defaults\n const {\n enabled = true,\n modal = false,\n initialFocus,\n returnFocus = true,\n closeOnFocusOut = false,\n preventScroll = true,\n outsideElementsInert = false,\n onError,\n } = options;\n\n // Lazy-evaluated computed values (only created once)\n const isEnabled = computed(() => !!toValue(enabled));\n const isModal = computed(() => !!toValue(modal));\n const shouldCloseOnFocusOut = computed(() => !isModal.value && !!toValue(closeOnFocusOut));\n const shouldInertOutside = computed(() => !!toValue(outsideElementsInert));\n\n // Use shallowRef for trap instance (don't need deep reactivity)\n const trapRef = shallowRef<FocusTrap | null>(null);\n const isActive = computed(() => trapRef.value !== null);\n\n // Tracks whether the current deactivation should close the floating surface.\n let shouldCloseOnDeactivate = false;\n\n // Guard to prevent double-deactivation\n let isDeactivating = false;\n\n /**\n * Deactivates the focus trap and cleans up state.\n */\n const deactivateTrap = (options: { returnFocus?: boolean; closeFloating?: boolean } = {}) => {\n if (isDeactivating || !trapRef.value) return;\n\n isDeactivating = true;\n if (options.closeFloating) {\n shouldCloseOnDeactivate = true;\n }\n try {\n trapRef.value.deactivate({\n returnFocus: options.returnFocus ?? toValue(returnFocus),\n });\n trapRef.value = null;\n } finally {\n isDeactivating = false;\n }\n };\n\n /**\n * Creates and activates the focus trap.\n */\n const createTrap = () => {\n if (!isEnabled.value || !open.value) return;\n\n // Deactivate existing trap first without side effects from a real close.\n deactivateTrap({ returnFocus: false });\n\n const container = floatingEl.value;\n if (!container) {\n if (import.meta.env.DEV) {\n console.warn(\"[useFocusTrap] No floating element available for focus trap\");\n }\n return;\n }\n\n // Create the focus trap instance\n trapRef.value = createFocusTrap(container, {\n onActivate: () => {\n shouldCloseOnDeactivate = false;\n },\n onDeactivate: () => {\n trapRef.value = null;\n if (shouldCloseOnDeactivate) {\n shouldCloseOnDeactivate = false;\n setOpen(false);\n }\n },\n initialFocus: resolveInitialFocus(initialFocus),\n fallbackFocus: () => container,\n returnFocusOnDeactivate: toValue(returnFocus),\n clickOutsideDeactivates: () => {\n if (!shouldCloseOnFocusOut.value) return false;\n shouldCloseOnDeactivate = true;\n return true;\n },\n allowOutsideClick: !isModal.value,\n escapeDeactivates: false,\n preventScroll: toValue(preventScroll),\n isolateSubtrees: resolveIsolationMode(isModal.value, shouldInertOutside.value),\n tabbableOptions: { displayCheck: \"none\" },\n });\n\n // Activate with proper error handling\n try {\n trapRef.value.activate();\n } catch (error) {\n // Ensure state is cleaned up even on error\n shouldCloseOnDeactivate = false;\n trapRef.value = null;\n\n // Call custom error handler if provided\n if (onError) {\n onError(error);\n } else if (import.meta.env.DEV) {\n console.error(\"[useFocusTrap] Failed to activate focus trap:\", error);\n }\n }\n };\n\n // Single watcher to manage trap lifecycle\n watchPostEffect(() => {\n if (isEnabled.value && open.value && floatingEl.value) {\n createTrap();\n } else {\n deactivateTrap();\n }\n });\n\n // Cleanup on scope disposal\n tryOnScopeDispose(() => {\n deactivateTrap();\n });\n\n return {\n isActive,\n activate: createTrap,\n deactivate: () => deactivateTrap({ closeFloating: true }),\n };\n}\n","export type Point = [number, number];\nexport type Polygon = Point[];\n\nexport type Rect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type Side = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport function isInside(point: Point, rect: Rect): boolean {\n return (\n point[0] >= rect.x &&\n point[0] <= rect.x + rect.width &&\n point[1] >= rect.y &&\n point[1] <= rect.y + rect.height\n );\n}\n\nexport function isPointInPolygon(point: Point, polygon: Polygon) {\n const [x, y] = point;\n let isInsidePolygon = false;\n const length = polygon.length;\n\n for (let i = 0, j = length - 1; i < length; j = i++) {\n const [xi, yi] = polygon[i] || [0, 0];\n const [xj, yj] = polygon[j] || [0, 0];\n const intersect = yi >= y !== yj >= y && x <= ((xj - xi) * (y - yi)) / (yj - yi) + xi;\n\n if (intersect) {\n isInsidePolygon = !isInsidePolygon;\n }\n }\n\n return isInsidePolygon;\n}\n\nexport function getCursorSpeed(\n x: number,\n y: number,\n lastX: number | null,\n lastY: number | null,\n lastCursorTime: number,\n currentTime: number,\n): { speed: number | null; lastX: number; lastY: number; lastCursorTime: number } {\n const elapsedTime = currentTime - lastCursorTime;\n\n if (lastX === null || lastY === null || elapsedTime === 0) {\n return {\n speed: null,\n lastX: x,\n lastY: y,\n lastCursorTime: currentTime,\n };\n }\n\n const deltaX = x - lastX;\n const deltaY = y - lastY;\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n return {\n speed: distance / elapsedTime,\n lastX: x,\n lastY: y,\n lastCursorTime: currentTime,\n };\n}\n\nexport function isPointerLeavingOppositeSide(\n side: Side,\n leaveX: number,\n leaveY: number,\n refRect: DOMRect | undefined,\n): boolean {\n return (\n (side === \"top\" && leaveY >= (refRect?.bottom ?? 0) - 1) ||\n (side === \"bottom\" && leaveY <= (refRect?.top ?? 0) + 1) ||\n (side === \"left\" && leaveX >= (refRect?.right ?? 0) - 1) ||\n (side === \"right\" && leaveX <= (refRect?.left ?? 0) + 1)\n );\n}\n\nexport function buildRectangularTrough(\n side: Side,\n rect: DOMRect | undefined,\n refRect: DOMRect | undefined,\n): Polygon {\n const isFloatingWider = (rect?.width ?? 0) > (refRect?.width ?? 0);\n const isFloatingTaller = (rect?.height ?? 0) > (refRect?.height ?? 0);\n const left = (isFloatingWider ? refRect : rect)?.left ?? 0;\n const right = (isFloatingWider ? refRect : rect)?.right ?? 0;\n const top = (isFloatingTaller ? refRect : rect)?.top ?? 0;\n const bottom = (isFloatingTaller ? refRect : rect)?.bottom ?? 0;\n\n switch (side) {\n case \"top\":\n return [\n [left, (refRect?.top ?? 0) + 1],\n [left, (rect?.bottom ?? 0) - 1],\n [right, (rect?.bottom ?? 0) - 1],\n [right, (refRect?.top ?? 0) + 1],\n ];\n case \"bottom\":\n return [\n [left, (rect?.top ?? 0) + 1],\n [left, (refRect?.bottom ?? 0) - 1],\n [right, (refRect?.bottom ?? 0) - 1],\n [right, (rect?.top ?? 0) + 1],\n ];\n case \"left\":\n return [\n [(rect?.right ?? 0) - 1, bottom],\n [(rect?.right ?? 0) - 1, top],\n [(refRect?.left ?? 0) + 1, top],\n [(refRect?.left ?? 0) + 1, bottom],\n ];\n case \"right\":\n return [\n [(refRect?.right ?? 0) - 1, bottom],\n [(refRect?.right ?? 0) - 1, top],\n [(rect?.left ?? 0) + 1, top],\n [(rect?.left ?? 0) + 1, bottom],\n ];\n }\n}\n\nexport function buildSafePolygon(\n side: Side,\n leaveX: number,\n leaveY: number,\n rect: DOMRect | undefined,\n refRect: DOMRect | undefined,\n buffer: number,\n): Polygon {\n const isFloatingWider = (rect?.width ?? 0) > (refRect?.width ?? 0);\n const isFloatingTaller = (rect?.height ?? 0) > (refRect?.height ?? 0);\n const cursorLeaveFromRight = leaveX > (rect?.right ?? 0) - (rect?.width ?? 0) / 2;\n const cursorLeaveFromBottom = leaveY > (rect?.bottom ?? 0) - (rect?.height ?? 0) / 2;\n\n switch (side) {\n case \"top\": {\n const cursorPointOne: Point = [\n isFloatingWider\n ? leaveX + buffer / 2\n : cursorLeaveFromRight\n ? leaveX + buffer * 4\n : leaveX - buffer * 4,\n leaveY + buffer + 1,\n ];\n const cursorPointTwo: Point = [\n isFloatingWider\n ? leaveX - buffer / 2\n : cursorLeaveFromRight\n ? leaveX + buffer * 4\n : leaveX - buffer * 4,\n leaveY + buffer + 1,\n ];\n const commonPoints: [Point, Point] = [\n [\n rect?.left ?? 0,\n cursorLeaveFromRight\n ? (rect?.bottom ?? 0) - buffer\n : isFloatingWider\n ? (rect?.bottom ?? 0) - buffer\n : (rect?.top ?? 0),\n ],\n [\n rect?.right ?? 0,\n cursorLeaveFromRight\n ? isFloatingWider\n ? (rect?.bottom ?? 0) - buffer\n : (rect?.top ?? 0)\n : (rect?.bottom ?? 0) - buffer,\n ],\n ];\n\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case \"bottom\": {\n const cursorPointOne: Point = [\n isFloatingWider\n ? leaveX + buffer / 2\n : cursorLeaveFromRight\n ? leaveX + buffer * 4\n : leaveX - buffer * 4,\n leaveY - buffer,\n ];\n const cursorPointTwo: Point = [\n isFloatingWider\n ? leaveX - buffer / 2\n : cursorLeaveFromRight\n ? leaveX + buffer * 4\n : leaveX - buffer * 4,\n leaveY - buffer,\n ];\n const commonPoints: [Point, Point] = [\n [\n rect?.left ?? 0,\n cursorLeaveFromRight\n ? (rect?.top ?? 0) + buffer\n : isFloatingWider\n ? (rect?.top ?? 0) + buffer\n : (rect?.bottom ?? 0),\n ],\n [\n rect?.right ?? 0,\n cursorLeaveFromRight\n ? isFloatingWider\n ? (rect?.top ?? 0) + buffer\n : (rect?.bottom ?? 0)\n : (rect?.top ?? 0) + buffer,\n ],\n ];\n\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case \"left\": {\n const cursorPointOne: Point = [\n leaveX + buffer + 1,\n isFloatingTaller\n ? leaveY + buffer / 2\n : cursorLeaveFromBottom\n ? leaveY + buffer * 4\n : leaveY - buffer * 4,\n ];\n const cursorPointTwo: Point = [\n leaveX + buffer + 1,\n isFloatingTaller\n ? leaveY - buffer / 2\n : cursorLeaveFromBottom\n ? leaveY + buffer * 4\n : leaveY - buffer * 4,\n ];\n const commonPoints: [Point, Point] = [\n [\n cursorLeaveFromBottom\n ? (rect?.right ?? 0) - buffer\n : isFloatingTaller\n ? (rect?.right ?? 0) - buffer\n : (rect?.left ?? 0),\n rect?.top ?? 0,\n ],\n [\n cursorLeaveFromBottom\n ? isFloatingTaller\n ? (rect?.right ?? 0) - buffer\n : (rect?.left ?? 0)\n : (rect?.right ?? 0) - buffer,\n rect?.bottom ?? 0,\n ],\n ];\n\n return [...commonPoints, cursorPointOne, cursorPointTwo];\n }\n case \"right\": {\n const cursorPointOne: Point = [\n leaveX - buffer,\n isFloatingTaller\n ? leaveY + buffer / 2\n : cursorLeaveFromBottom\n ? leaveY + buffer * 4\n : leaveY - buffer * 4,\n ];\n const cursorPointTwo: Point = [\n leaveX - buffer,\n isFloatingTaller\n ? leaveY - buffer / 2\n : cursorLeaveFromBottom\n ? leaveY + buffer * 4\n : leaveY - buffer * 4,\n ];\n const commonPoints: [Point, Point] = [\n [\n cursorLeaveFromBottom\n ? (rect?.left ?? 0) + buffer\n : isFloatingTaller\n ? (rect?.left ?? 0) + buffer\n : (rect?.right ?? 0),\n rect?.top ?? 0,\n ],\n [\n cursorLeaveFromBottom\n ? isFloatingTaller\n ? (rect?.left ?? 0) + buffer\n : (rect?.right ?? 0)\n : (rect?.left ?? 0) + buffer,\n rect?.bottom ?? 0,\n ],\n ];\n\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n }\n}\n","import { computed } from \"vue\";\nimport type {\n AnchorElement,\n FloatingContext,\n FloatingElement,\n} from \"@/composables/positioning/use-floating\";\nimport { clearTimeoutIfSet, contains, getCurrentTime, getTarget, isHTMLElement } from \"@/utils\";\nimport {\n buildRectangularTrough,\n buildSafePolygon,\n getCursorSpeed,\n isInside,\n isPointerLeavingOppositeSide,\n isPointInPolygon,\n type Point,\n type Polygon,\n type Side,\n} from \"./geometry\";\n\nexport interface SafePolygonOptions {\n buffer?: number;\n requireIntent?: boolean;\n onPolygonChange?: (polygon: Polygon) => void;\n}\n\nexport type SafePolygon = (context: CreateSafePolygonHandlerContext) => SafePolygonHandler;\nexport type SafePolygonHandler = (event: MouseEvent) => void;\n\nexport interface CreateSafePolygonHandlerContext {\n x: number;\n y: number;\n placement: FloatingContext[\"placement\"][\"value\"];\n elements: {\n domReference: AnchorElement | null;\n floating: FloatingElement | null;\n };\n buffer: number;\n onClose: () => void;\n}\n\nexport function safePolygon(options: SafePolygonOptions = {}): SafePolygon {\n const { requireIntent = true } = options;\n\n let timeoutId = -1;\n let hasLanded = false;\n\n return function createSafePolygonHandler(context: CreateSafePolygonHandlerContext) {\n const { x, y, placement, elements, buffer: contextBuffer, onClose } = context;\n const referenceEl = computed(() => {\n const domReference = elements.domReference;\n\n if (isHTMLElement(domReference)) {\n return domReference;\n }\n\n return (domReference?.contextElement as HTMLElement) ?? null;\n });\n\n let lastX: number | null = null;\n let lastY: number | null = null;\n let lastCursorTime = getCurrentTime();\n\n const close = () => {\n clearTimeoutIfSet(timeoutId);\n timeoutId = -1;\n onClose();\n };\n\n return function onMouseMove(event: MouseEvent) {\n clearTimeoutIfSet(timeoutId);\n timeoutId = -1;\n\n if (\n !elements.domReference ||\n !elements.floating ||\n placement == null ||\n x == null ||\n y == null\n ) {\n return;\n }\n\n const { clientX, clientY } = event;\n const clientPoint: Point = [clientX, clientY];\n const target = getTarget(event) as Element | null;\n const isLeave = event.type === \"mouseleave\";\n const isOverFloatingEl = elements.floating && contains(elements.floating, target);\n const isOverReferenceEl = referenceEl.value && contains(referenceEl.value, target);\n const refRect = referenceEl.value?.getBoundingClientRect();\n const rect = elements.floating?.getBoundingClientRect();\n const side = placement.split(\"-\")[0] as Side;\n const isOverReferenceRect = refRect ? isInside(clientPoint, refRect) : false;\n\n if (isOverFloatingEl) {\n hasLanded = true;\n\n if (!isLeave) {\n return;\n }\n }\n\n if (isOverReferenceEl) {\n hasLanded = false;\n }\n\n if (isOverReferenceEl && !isLeave) {\n hasLanded = true;\n return;\n }\n\n if (\n isLeave &&\n isHTMLElement(event.relatedTarget) &&\n elements.floating &&\n contains(elements.floating, event.relatedTarget)\n ) {\n return;\n }\n\n if (isPointerLeavingOppositeSide(side, x, y, refRect)) {\n close();\n return;\n }\n\n const rectPoly = buildRectangularTrough(side, rect, refRect);\n const polygon = buildSafePolygon(side, x, y, rect, refRect, contextBuffer);\n options.onPolygonChange?.(polygon);\n\n if (isPointInPolygon(clientPoint, rectPoly)) {\n return;\n }\n\n if (isPointInPolygon(clientPoint, polygon)) {\n if (!hasLanded && requireIntent) {\n const speedResult = getCursorSpeed(\n event.clientX,\n event.clientY,\n lastX,\n lastY,\n lastCursorTime,\n getCurrentTime(),\n );\n\n lastX = speedResult.lastX;\n lastY = speedResult.lastY;\n lastCursorTime = speedResult.lastCursorTime;\n\n if (speedResult.speed !== null && speedResult.speed < 0.1) {\n timeoutId = window.setTimeout(close, 40);\n }\n }\n\n return;\n }\n\n if (hasLanded && !isOverReferenceRect) {\n close();\n return;\n }\n\n close();\n };\n };\n}\n","import type { Coords } from \"@floating-ui/dom\";\nimport { computed, type MaybeRef, onWatcherCleanup, toValue, watchPostEffect } from \"vue\";\nimport { getFloatingPosition, getFloatingRefs, getFloatingState } from \"@/core/floating-accessors\";\nimport { tryOnScopeDispose } from \"@/core/lifecycle\";\nimport type { FloatingContext } from \"../positioning/use-floating\";\nimport { type SafePolygonOptions, safePolygon } from \"./polygon\";\n\n//=======================================================================================\n// 📌 Types & Interfaces\n//=======================================================================================\n\nexport interface UseHoverOptions {\n /**\n * Whether hover event listeners are enabled.\n * @default true\n */\n enabled?: MaybeRef<boolean>;\n\n /**\n * Delay in milliseconds before showing/hiding the floating element.\n * Can be a single number for both open and close, or an object\n * specifying different delays.\n * @default 0\n */\n delay?: MaybeRef<number | { open?: number; close?: number }>;\n\n /**\n * Time in milliseconds the pointer must rest within the reference\n * element before opening the floating element.\n * this option is ignored if an open delay is specified.\n * @default 0\n */\n restMs?: MaybeRef<number>;\n\n /**\n * Whether hover events should only trigger for mouse like pointers (mouse, pen ,stylus ..etc).\n * @default false\n */\n mouseOnly?: MaybeRef<boolean>;\n\n /**\n * Enable floating-ui style safe polygon algorithm that keeps the\n * floating element open while the pointer traverses the rectangle/triangle\n * region between the reference and floating elements.\n * – `true` → enabled with defaults\n * – `false | undefined` → disabled (current behaviour)\n * – `SafePolygonOptions` → enabled with custom buffer\n */\n safePolygon?: MaybeRef<boolean | SafePolygonOptions>;\n}\n\n//=======================================================================================\n// 📌 Constants\n//=======================================================================================\n\nconst POINTER_MOVE_THRESHOLD = 10; // Threshold in pixels for movement detection\n\n//=======================================================================================\n// 📌 Helper Functions\n//=======================================================================================\n\ninterface UseDelayedOpenOptions {\n delay: MaybeRef<number | { open?: number; close?: number }>;\n}\n\nfunction useDelayedOpen(\n show: (event?: Event) => void,\n hide: (event?: Event) => void,\n options: UseDelayedOpenOptions,\n) {\n const { delay } = options;\n\n const showDelay = computed<number>(() => {\n const delayVal = toValue(delay);\n return (typeof delayVal === \"number\" ? delayVal : delayVal.open) ?? 0;\n });\n const hideDelay = computed<number>(() => {\n const delayVal = toValue(delay);\n return (typeof delayVal === \"number\" ? delayVal : delayVal.close) ?? 0;\n });\n\n let showTimeoutID: ReturnType<typeof setTimeout> | undefined;\n let hideTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n const clearTimeouts = () => {\n clearTimeout(showTimeoutID);\n clearTimeout(hideTimeoutID);\n };\n\n tryOnScopeDispose(clearTimeouts);\n\n return {\n show: (overrideDelay?: number, event?: Event) => {\n clearTimeouts();\n const resolvedDelay = overrideDelay ?? showDelay.value;\n\n if (resolvedDelay === 0) show(event);\n else showTimeoutID = setTimeout(() => show(event), resolvedDelay);\n },\n\n hide: (overrideDelay?: number, event?: Event) => {\n clearTimeouts();\n const resolvedDelay = overrideDelay ?? hideDelay.value;\n\n if (resolvedDelay === 0) hide(event);\n else hideTimeoutID = setTimeout(() => hide(event), resolvedDelay);\n },\n\n showDelay,\n hideDelay,\n clearTimeouts,\n };\n}\n\n//=======================================================================================\n// 📌 Main Logic\n//=======================================================================================\n\n/**\n * Enables showing/hiding the floating element when hovering the reference element\n * with enhanced behaviors like delayed open/close, rest detection, and custom\n * exit handling.\n *\n * @param context - The floating context with open state and change handler\n * @param options - Configuration options for hover behavior\n *\n * @example Basic usage\n * ```ts\n * const context = useFloating(...)\n * useHover(context, {\n * delay: { open: 100, close: 300 },\n * restMs: 150\n * })\n * ```\n */\nexport function useHover(context: FloatingContext, options: UseHoverOptions = {}): void {\n const { open, setOpen } = getFloatingState(context);\n const { placement } = getFloatingPosition(context);\n const { anchorEl, floatingEl } = getFloatingRefs(context);\n const {\n enabled: enabledOption = true,\n delay = 0,\n restMs: restMsOption = 0,\n mouseOnly = false,\n safePolygon: safePolygonOption = false,\n } = options;\n\n const enabled = computed(() => toValue(enabledOption));\n const restMs = computed(() => toValue(restMsOption));\n const reference = computed(() => {\n const el = anchorEl.value;\n if (!el || el instanceof HTMLElement) return el;\n return (el.contextElement as HTMLElement) ?? null;\n });\n\n const { hide, show, showDelay, clearTimeouts } = useDelayedOpen(\n (event?: Event) => {\n open.value || setOpen(true, \"hover\", event);\n },\n (event?: Event) => {\n open.value && setOpen(false, \"hover\", event);\n },\n { delay },\n );\n\n //-------------------------\n // Rest Detection\n //-------------------------\n\n let restCoords: Coords | null = null;\n let restTimeoutId: ReturnType<typeof setTimeout> | undefined;\n const isRestMsEnabled = computed<boolean>(() => showDelay.value === 0 && restMs.value > 0);\n\n function onPointerMoveForRest(e: PointerEvent): void {\n if (!enabled.value || !isValidPointerType(e) || !isRestMsEnabled.value) return;\n if (!restCoords) return;\n const newCoords = { x: e.clientX, y: e.clientY };\n\n const dx = Math.abs(newCoords.x - restCoords.x);\n const dy = Math.abs(newCoords.y - restCoords.y);\n\n if (dx > POINTER_MOVE_THRESHOLD || dy > POINTER_MOVE_THRESHOLD) {\n restCoords = newCoords;\n clearTimeout(restTimeoutId);\n restTimeoutId = setTimeout(() => {\n show(0, e);\n }, restMs.value);\n }\n }\n\n function onPointerEnterForRest(e: PointerEvent) {\n if (!enabled.value || !isValidPointerType(e) || !isRestMsEnabled.value) return;\n restCoords = { x: e.clientX, y: e.clientY };\n restTimeoutId = setTimeout(() => {\n show(0, e);\n }, restMs.value);\n }\n\n function onPointerLeaveForRest() {\n clearTimeout(restTimeoutId);\n restCoords = null;\n }\n\n watchPostEffect(() => {\n const el = reference.value;\n if (!el || !enabled.value || !isRestMsEnabled.value) return;\n el.addEventListener(\"pointerenter\", onPointerEnterForRest);\n el.addEventListener(\"pointermove\", onPointerMoveForRest);\n el.addEventListener(\"pointerleave\", onPointerLeaveForRest);\n\n onWatcherCleanup(() => {\n el.removeEventListener(\"pointerenter\", onPointerEnterForRest);\n el.removeEventListener(\"pointermove\", onPointerMoveForRest);\n el.removeEventListener(\"pointerleave\", onPointerLeaveForRest);\n });\n });\n\n tryOnScopeDispose(() => {\n clearTimeout(restTimeoutId);\n });\n\n //-------------------------\n // General Event Handlers\n //-------------------------\n function isValidPointerType(e: PointerEvent): boolean {\n if (toValue(mouseOnly)) {\n // When mouseOnly is true, only accept actual mouse events\n return e.pointerType === \"mouse\";\n }\n // When mouseOnly is false, accept mouse, pen, and touch\n return true;\n }\n\n function onPointerEnterReference(e: PointerEvent): void {\n if (!enabled.value || !isValidPointerType(e) || isRestMsEnabled.value) return;\n cleanupPolygon();\n show(undefined, e);\n }\n\n function onPointerEnterFloating(e: PointerEvent): void {\n if (!enabled.value || !isValidPointerType(e)) return;\n clearTimeouts();\n cleanupPolygon();\n }\n\n let polygonMouseMoveHandler: ((e: MouseEvent) => void) | null = null;\n\n function cleanupPolygon() {\n if (polygonMouseMoveHandler) {\n document.removeEventListener(\"pointermove\", polygonMouseMoveHandler);\n polygonMouseMoveHandler = null;\n }\n // Clear the polygon visualization\n const polygonOptions = safePolygonOptions.value;\n if (polygonOptions?.onPolygonChange) {\n polygonOptions.onPolygonChange([]);\n }\n }\n\n const safePolygonEnabled = computed(() => !!toValue(safePolygonOption));\n const safePolygonOptions = computed<SafePolygonOptions | undefined>(() => {\n const val = toValue(safePolygonOption);\n if (typeof val === \"object\" && val) return val;\n if (val === true) return {};\n return undefined;\n });\n\n function onPointerLeave(e: PointerEvent): void {\n if (!enabled.value || !isValidPointerType(e)) return;\n\n const { clientX, clientY } = e;\n const relatedTarget = e.relatedTarget as Node | null;\n\n if (safePolygonEnabled.value) {\n setTimeout(() => {\n cleanupPolygon();\n const refEl = reference.value;\n const floatEl = floatingEl.value;\n\n if (!refEl || !floatEl) {\n hide(undefined, e);\n return;\n }\n\n polygonMouseMoveHandler = safePolygon(safePolygonOptions.value)({\n x: clientX,\n y: clientY,\n placement: placement.value,\n elements: {\n domReference: refEl,\n floating: floatEl,\n },\n buffer: safePolygonOptions.value?.buffer ?? 1,\n onClose: () => {\n cleanupPolygon();\n hide(undefined);\n },\n });\n\n if (polygonMouseMoveHandler) {\n document.addEventListener(\"pointermove\", polygonMouseMoveHandler);\n }\n }, 0);\n } else {\n // Standard logic for standalone usage\n if (floatingEl.value?.contains(relatedTarget)) {\n return; // Pointer moved to floating element - don't hide\n }\n\n hide(undefined, e);\n }\n }\n\n watchPostEffect(() => {\n const el = reference.value;\n if (!el || !enabled.value) return;\n\n el.addEventListener(\"pointerenter\", onPointerEnterReference);\n el.addEventListener(\"pointerleave\", onPointerLeave);\n\n onWatcherCleanup(() => {\n el.removeEventListener(\"pointerenter\", onPointerEnterReference);\n el.removeEventListener(\"pointerleave\", onPointerLeave);\n });\n });\n\n watchPostEffect(() => {\n const el = floatingEl.value;\n if (!el || !enabled.value) return;\n\n el.addEventListener(\"pointerenter\", onPointerEnterFloating);\n el.addEventListener(\"pointerleave\", onPointerLeave);\n\n onWatcherCleanup(() => {\n el.removeEventListener(\"pointerenter\", onPointerEnterFloating);\n el.removeEventListener(\"pointerleave\", onPointerLeave);\n });\n });\n\n tryOnScopeDispose(() => {\n cleanupPolygon();\n });\n}\n","import { type ComputedRef, type MaybeRefOrGetter, type Ref, ref, toValue, watch } from \"vue\";\n\nexport interface UseActiveDescendantOptions {\n virtual: MaybeRefOrGetter<boolean>;\n open: Ref<boolean>;\n}\n\nexport interface UseActiveDescendantReturn {\n /**\n * Reference to the currently active element in the list.\n * Updated whenever the active index changes.\n */\n activeItem: Ref<HTMLElement | null>;\n}\n\n/**\n * Manages \"Virtual Focus\" (via aria-activedescendant) for a list of items.\n *\n * **Important:** All items in `listRef` MUST have an `id` attribute set in the template.\n * The composable will not auto-generate IDs to avoid hydration mismatches and re-render issues.\n *\n * @param anchorEl - The element that will receive the aria-activedescendant attribute\n * @param listRef - Array of list item elements (each must have an id attribute)\n * @param activeIndex - The currently active index in the list\n * @param options - Configuration options\n * @returns Object containing the activeItem ref\n */\nexport function useActiveDescendant(\n anchorEl: ComputedRef<HTMLElement | null>,\n listRef: Ref<Array<HTMLElement | null>>,\n activeIndex: MaybeRefOrGetter<number | null>,\n options: UseActiveDescendantOptions,\n): UseActiveDescendantReturn {\n const activeItem = ref<HTMLElement | null>(null);\n\n watch(\n [() => toValue(options.virtual), options.open, () => toValue(activeIndex), anchorEl, listRef],\n ([isVirtual, isOpen, idx], _oldValues, onCleanup) => {\n const anchor = anchorEl.value;\n\n // Cleanup function to remove attribute when component unmounts or watcher re-runs\n // Note: Only cleanup DOM state, not activeItem to prevent state flickering\n onCleanup(() => {\n anchor?.removeAttribute(\"aria-activedescendant\");\n });\n\n // Early return if conditions not met - cleanup already handled attribute removal\n if (!anchor || !isVirtual || !isOpen || idx == null) {\n activeItem.value = null;\n return;\n }\n\n const el = listRef.value[idx];\n\n // Fix: Clear active item when element is not found (cleanup already removed attribute)\n if (!el) {\n activeItem.value = null;\n return;\n }\n\n // Fix: Require IDs to be set in the template - don't mutate DOM directly\n if (!el.id) {\n if (import.meta.env.DEV) {\n console.warn(\n \"[useActiveDescendant] List item at index\",\n idx,\n \"is missing an 'id' attribute. All list items must have stable IDs for proper accessibility.\",\n );\n }\n activeItem.value = null;\n return;\n }\n\n // Set the aria-activedescendant attribute and update the active item\n anchor.setAttribute(\"aria-activedescendant\", el.id);\n activeItem.value = el;\n },\n {\n // Ensure watcher runs after DOM updates to avoid race conditions\n // when activeIndex and list data change simultaneously\n flush: \"post\",\n },\n );\n\n return { activeItem };\n}\n","export type NavigationAction = { type: \"navigate\"; index: number | null } | { type: \"close\" };\n\nexport interface StrategyContext {\n current: number | null;\n items: Array<HTMLElement | null>;\n isRtl: boolean;\n loop: boolean;\n allowEscape: boolean;\n isVirtual: boolean;\n cols: number;\n nested: boolean;\n isDisabled: (index: number) => boolean;\n findNextEnabled: (start: number, dir: 1 | -1, wrap: boolean) => number | null;\n getFirstEnabledIndex: () => number | null;\n getLastEnabledIndex: () => number | null;\n}\n\nexport interface NavigationStrategy {\n handleKey(key: string, context: StrategyContext): NavigationAction | null;\n}\n\nfunction resolveLinearMove(\n current: number | null,\n dir: 1 | -1,\n context: StrategyContext,\n): NavigationAction | null {\n const {\n items,\n loop,\n allowEscape,\n isVirtual,\n findNextEnabled,\n getFirstEnabledIndex,\n getLastEnabledIndex,\n } = context;\n const itemCount = items.length;\n const start = current == null ? (dir === 1 ? 0 : itemCount - 1) : current + dir;\n let next = findNextEnabled(start, dir, loop);\n\n if (next == null && loop) {\n if (allowEscape && isVirtual) {\n return { type: \"navigate\", index: null };\n }\n\n next = dir === 1 ? getFirstEnabledIndex() : getLastEnabledIndex();\n }\n\n if (next != null) {\n return { type: \"navigate\", index: next };\n }\n\n return null;\n}\n\nexport class VerticalNavigationStrategy implements NavigationStrategy {\n handleKey(key: string, context: StrategyContext): NavigationAction | null {\n const { isRtl, nested } = context;\n\n if (key === \"ArrowDown\") return resolveLinearMove(context.current, 1, context);\n if (key === \"ArrowUp\") return resolveLinearMove(context.current, -1, context);\n\n if (nested) {\n const closeKey = isRtl ? \"ArrowRight\" : \"ArrowLeft\";\n if (key === closeKey) return { type: \"close\" };\n }\n\n return null;\n }\n}\n\nexport class HorizontalNavigationStrategy implements NavigationStrategy {\n handleKey(key: string, context: StrategyContext): NavigationAction | null {\n const { isRtl, nested } = context;\n\n if (key === \"ArrowRight\") return resolveLinearMove(context.current, isRtl ? -1 : 1, context);\n if (key === \"ArrowLeft\") return resolveLinearMove(context.current, isRtl ? 1 : -1, context);\n\n if (nested && key === \"ArrowUp\") {\n return { type: \"close\" };\n }\n\n return null;\n }\n}\n\nexport class GridNavigationStrategy implements NavigationStrategy {\n constructor(\n private fallbackToLinear: boolean = false,\n private loopDirection: \"row\" | \"next\" = \"row\",\n ) {}\n\n handleKey(key: string, context: StrategyContext): NavigationAction | null {\n const {\n current,\n items,\n isDisabled,\n loop,\n allowEscape,\n isVirtual,\n getFirstEnabledIndex,\n getLastEnabledIndex,\n cols,\n } = context;\n\n if (key === \"ArrowRight\" || key === \"ArrowLeft\") {\n const dir = key === \"ArrowRight\" ? 1 : -1;\n\n if (current === null) {\n return resolveLinearMove(current, dir, context);\n }\n\n const next = current + dir;\n const currentRow = Math.floor(current / cols);\n const nextRow = Math.floor(next / cols);\n\n if (next >= 0 && next < items.length && currentRow === nextRow && !isDisabled(next)) {\n return { type: \"navigate\", index: next };\n }\n\n if (loop) {\n if (allowEscape && isVirtual) {\n const isAtStart = current === 0;\n const isAtEnd = current === items.length - 1;\n\n if ((dir === -1 && isAtStart) || (dir === 1 && isAtEnd)) {\n return { type: \"navigate\", index: null };\n }\n }\n\n let wrapCandidate: number;\n\n if (this.loopDirection === \"next\") {\n wrapCandidate = dir === 1 ? current + 1 : current - 1;\n\n if (wrapCandidate >= items.length) {\n wrapCandidate = 0;\n }\n\n if (wrapCandidate < 0) {\n wrapCandidate = items.length - 1;\n }\n } else {\n wrapCandidate =\n dir === 1 ? currentRow * cols : Math.min((currentRow + 1) * cols - 1, items.length - 1);\n }\n\n if (this.loopDirection === \"next\") {\n let candidate = wrapCandidate;\n\n for (let i = 0; i < items.length; i++) {\n if (!isDisabled(candidate)) {\n return { type: \"navigate\", index: candidate };\n }\n\n candidate += dir;\n if (candidate >= items.length) candidate = 0;\n if (candidate < 0) candidate = items.length - 1;\n if (candidate === wrapCandidate) break;\n }\n } else {\n const rowStart = currentRow * cols;\n const rowEnd = Math.min((currentRow + 1) * cols - 1, items.length - 1);\n\n while (wrapCandidate >= rowStart && wrapCandidate <= rowEnd) {\n if (!isDisabled(wrapCandidate)) {\n return { type: \"navigate\", index: wrapCandidate };\n }\n\n wrapCandidate += dir;\n\n if (wrapCandidate < rowStart || wrapCandidate > rowEnd) {\n break;\n }\n }\n }\n }\n\n return resolveLinearMove(current, dir, context);\n }\n\n if (key === \"ArrowDown\" || key === \"ArrowUp\") {\n if (cols <= 1) {\n return null;\n }\n\n const offset = key === \"ArrowDown\" ? cols : -cols;\n const step = offset > 0 ? cols : -cols;\n const start = current == null ? (offset > 0 ? -cols : items.length) : current;\n let candidate = start + offset;\n\n while (candidate >= 0 && candidate < items.length && isDisabled(candidate)) {\n candidate += step;\n }\n\n if (candidate >= 0 && candidate < items.length) {\n return { type: \"navigate\", index: candidate };\n }\n\n if (loop) {\n if (allowEscape && isVirtual) {\n return { type: \"navigate\", index: null };\n }\n\n if (current === null) {\n const boundary = offset > 0 ? getFirstEnabledIndex() : getLastEnabledIndex();\n return boundary != null ? { type: \"navigate\", index: boundary } : null;\n }\n\n const col = current % cols;\n let wrapCandidate: number;\n\n if (offset > 0) {\n wrapCandidate = col;\n } else {\n const lastRowStart = (Math.ceil(items.length / cols) - 1) * cols;\n wrapCandidate = lastRowStart + col;\n\n if (wrapCandidate >= items.length) {\n wrapCandidate -= cols;\n }\n }\n\n while (wrapCandidate >= 0 && wrapCandidate < items.length && isDisabled(wrapCandidate)) {\n wrapCandidate += step;\n }\n\n if (wrapCandidate >= 0 && wrapCandidate < items.length) {\n return { type: \"navigate\", index: wrapCandidate };\n }\n }\n\n if (this.fallbackToLinear) {\n return resolveLinearMove(current, key === \"ArrowDown\" ? 1 : -1, context);\n }\n }\n\n return null;\n }\n}\n\nfunction doSwitch(\n orientation: \"vertical\" | \"horizontal\" | \"both\",\n vertical: boolean,\n horizontal: boolean,\n) {\n switch (orientation) {\n case \"vertical\":\n return vertical;\n case \"horizontal\":\n return horizontal;\n default:\n return vertical || horizontal;\n }\n}\n\nexport function isMainOrientationKey(key: string, orientation: \"vertical\" | \"horizontal\" | \"both\") {\n const vertical = key === \"ArrowUp\" || key === \"ArrowDown\";\n const horizontal = key === \"ArrowLeft\" || key === \"ArrowRight\";\n return doSwitch(orientation, vertical, horizontal);\n}\n\nexport function isMainOrientationToEndKey(\n key: string,\n orientation: \"vertical\" | \"horizontal\" | \"both\",\n isRtl: boolean,\n) {\n const vertical = key === \"ArrowDown\";\n const horizontal = isRtl ? key === \"ArrowLeft\" : key === \"ArrowRight\";\n return (\n doSwitch(orientation, vertical, horizontal) || key === \"Enter\" || key === \" \" || key === \"\"\n );\n}\n\nexport function createNavigationStrategy(\n orientation: \"vertical\" | \"horizontal\" | \"both\",\n cols: number,\n gridLoopDirection: \"row\" | \"next\",\n): NavigationStrategy {\n if (orientation === \"vertical\") {\n return new VerticalNavigationStrategy();\n }\n\n if (orientation === \"horizontal\") {\n return cols > 1\n ? new GridNavigationStrategy(false, gridLoopDirection)\n : new HorizontalNavigationStrategy();\n }\n\n return new GridNavigationStrategy(true, gridLoopDirection);\n}\n","import {\n computed,\n type MaybeRefOrGetter,\n onWatcherCleanup,\n type Ref,\n ref,\n toValue,\n watch,\n watchPostEffect,\n} from \"vue\";\nimport type { FloatingContext } from \"@/composables/positioning/use-floating\";\nimport { useEventListener } from \"@/composables/utils/use-event-listener\";\nimport { isTypeableElement } from \"@/utils\";\nimport { isUsingKeyboard } from \"../utils/is-using-keyboard\";\nimport { useActiveDescendant } from \"../utils/use-active-descendant\";\nimport {\n createNavigationStrategy,\n isMainOrientationKey,\n isMainOrientationToEndKey,\n type StrategyContext,\n} from \"./list-navigation/strategies\";\n\n// ============================================================================\n// List Navigation Composable\n// ============================================================================\n\n/**\n * Options for configuring list-style keyboard/mouse navigation behavior.\n *\n * This interface drives how items in a floating list/grid are navigated,\n * focused, and announced (including support for virtual focus).\n */\nexport interface UseListNavigationOptions {\n /**\n * Reactive collection of list item elements in DOM order.\n * Null entries are allowed while items mount/unmount.\n */\n listRef: Ref<Array<HTMLElement | null>>;\n\n /**\n * The currently active (navigated) index. Null means no active item.\n */\n activeIndex?: MaybeRefOrGetter<number | null>;\n\n /**\n * Callback invoked when navigation sets a new active index.\n */\n onNavigate?: (index: number | null) => void;\n\n /**\n * Whether navigation behavior is enabled.\n */\n enabled?: MaybeRefOrGetter<boolean>;\n\n /**\n * If true, arrow-key navigation wraps from end-to-start and vice versa.\n */\n loop?: MaybeRefOrGetter<boolean>;\n\n /**\n * Primary navigation orientation.\n * - \"vertical\": Up/Down to navigate\n * - \"horizontal\": Left/Right to navigate\n * - \"both\": Grid navigation (supports cols/itemSizes)\n */\n orientation?: MaybeRefOrGetter<\"vertical\" | \"horizontal\" | \"both\">;\n\n /**\n * Indices that should be treated as disabled and skipped by navigation.\n * Can be an array of indices or a predicate.\n */\n disabledIndices?: Array<number> | ((index: number) => boolean);\n\n /**\n * If true, hovering an item moves the active index to that item.\n */\n focusItemOnHover?: MaybeRefOrGetter<boolean>;\n\n /**\n * If true, pressing an arrow key when closed opens and moves focus.\n */\n openOnArrowKeyDown?: MaybeRefOrGetter<boolean>;\n\n /**\n * Controls automatic scrolling when the active item changes.\n * true for default \"nearest\" behavior or a custom ScrollIntoViewOptions.\n */\n scrollItemIntoView?: boolean | ScrollIntoViewOptions;\n\n /**\n * Index to prefer when opening (e.g., currently selected option).\n */\n selectedIndex?: MaybeRefOrGetter<number | null>;\n\n /**\n * Controls focusing an item when the list opens.\n * - true: always focus an item\n * - false: never focus an item\n * - \"auto\": focus based on input modality/heuristics\n */\n focusItemOnOpen?: MaybeRefOrGetter<boolean | \"auto\">;\n\n /**\n * Whether this list is nested inside another navigable list.\n * Affects cross-orientation close/open key handling.\n */\n nested?: MaybeRefOrGetter<boolean>;\n\n /**\n * Parent list orientation when nested, for cross-navigation behavior.\n */\n parentOrientation?: MaybeRefOrGetter<\"vertical\" | \"horizontal\" | \"both\">;\n\n /**\n * Right-to-left layout flag affecting horizontal arrow semantics.\n */\n rtl?: MaybeRefOrGetter<boolean>;\n\n /**\n * Enables virtual focus mode (aria-activedescendant) instead of DOM focus.\n */\n virtual?: MaybeRefOrGetter<boolean>;\n\n /**\n * Receives the HTMLElement corresponding to the virtual active item.\n * Used for aria-activedescendant and screen reader announcement.\n */\n virtualItemRef?: Ref<HTMLElement | null>;\n\n /**\n * Column count for grid navigation when orientation is \"both\".\n */\n cols?: MaybeRefOrGetter<number>;\n\n /**\n * If true, allows escaping to a null active index via keyboard (e.g., ArrowDown on last).\n */\n allowEscape?: MaybeRefOrGetter<boolean>;\n\n /**\n * Defines the wrapping behavior for grid navigation when moving horizontally past the end of a row.\n * - \"row\": Wraps to the start of the *same* row (default).\n * - \"next\": Moves to the start of the *next* row (or previous row if moving left).\n */\n gridLoopDirection?: MaybeRefOrGetter<\"row\" | \"next\">;\n}\n\nexport interface UseListNavigationReturn {\n cleanup: () => void;\n}\n\nexport function useListNavigation(\n context: FloatingContext,\n options: UseListNavigationOptions,\n): UseListNavigationReturn {\n const { refs, open, setOpen } = context;\n\n const {\n listRef,\n activeIndex,\n onNavigate,\n enabled = true,\n loop = false,\n orientation = \"vertical\",\n disabledIndices,\n focusItemOnHover = true,\n openOnArrowKeyDown = true,\n scrollItemIntoView = true,\n selectedIndex = null,\n focusItemOnOpen = \"auto\",\n nested = false,\n rtl = false,\n virtual = false,\n virtualItemRef,\n cols = 1,\n allowEscape = false,\n } = options;\n\n // --------------------------------------------------------------------------\n // Derived State\n // --------------------------------------------------------------------------\n\n const isEnabled = computed(() => toValue(enabled));\n const anchorEl = computed(() => {\n const el = refs.anchorEl.value;\n if (el instanceof HTMLElement) return el;\n if (el && \"contextElement\" in el && el.contextElement instanceof HTMLElement) {\n return el.contextElement;\n }\n return null;\n });\n const floatingEl = computed(() => refs.floatingEl.value);\n const isVirtual = computed(() => !!toValue(virtual));\n const isRtl = computed(() => !!toValue(rtl));\n const gridCols = computed(() => Math.max(1, Number(toValue(cols) ?? 1)));\n\n // --------------------------------------------------------------------------\n // Cleanup Registry\n // --------------------------------------------------------------------------\n\n const cleanupFns: Array<() => void> = [];\n const registerCleanup = (fn: () => void) => {\n cleanupFns.push(fn);\n return fn;\n };\n const runCleanups = () => {\n while (cleanupFns.length) {\n cleanupFns.pop()?.();\n }\n };\n\n // --------------------------------------------------------------------------\n // Index Helpers\n // --------------------------------------------------------------------------\n\n const getActiveIndex = () => (activeIndex !== undefined ? toValue(activeIndex) : null);\n\n const isDisabled = (idx: number): boolean => {\n if (!disabledIndices) return false;\n return Array.isArray(disabledIndices) ? disabledIndices.includes(idx) : !!disabledIndices(idx);\n };\n\n const getFirstEnabledIndex = (): number | null => {\n const items = listRef.value;\n for (let i = 0; i < items.length; i++) {\n if (items[i] && !isDisabled(i)) return i;\n }\n return null;\n };\n\n const getLastEnabledIndex = (): number | null => {\n const items = listRef.value;\n for (let i = items.length - 1; i >= 0; i--) {\n if (items[i] && !isDisabled(i)) return i;\n }\n return null;\n };\n\n const findNextEnabled = (start: number, dir: 1 | -1, wrap: boolean): number | null => {\n const items = listRef.value;\n const len = items.length;\n let i = start;\n for (let step = 0; step < len; step++) {\n if (i < 0 || i >= len) {\n if (!wrap) return null;\n i = (i + len) % len;\n }\n if (items[i] && !isDisabled(i)) return i;\n i += dir;\n }\n return null;\n };\n\n // --------------------------------------------------------------------------\n // Focus Management\n // --------------------------------------------------------------------------\n\n const focusItem = (index: number | null, forceScroll = false): void => {\n if (index == null) return;\n const el = listRef.value[index];\n if (!el) return;\n\n // In virtual mode, ARIA and virtualItemRef management is handled by useActiveDescendant\n if (isVirtual.value) return;\n\n el.focus({ preventScroll: true });\n const opts = scrollItemIntoView;\n const shouldScroll = !!opts && (forceScroll || isUsingKeyboard.value);\n if (shouldScroll) {\n el.scrollIntoView?.(\n typeof opts === \"boolean\" ? { block: \"nearest\", inline: \"nearest\" } : opts,\n );\n }\n };\n\n // --------------------------------------------------------------------------\n // Event Handlers\n // --------------------------------------------------------------------------\n\n let lastKey: string | null = null;\n\n const handleAnchorKeyDown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented) return;\n\n const target = e.target as Element | null;\n // Allow navigation if the target is the anchor (e.g. input)\n if (target && isTypeableElement(target) && target !== anchorEl.value) return;\n\n const key = e.key;\n const ori = toValue(orientation);\n lastKey = key;\n\n // In virtual mode, delegate to floating handler\n if (open.value && isVirtual.value) {\n handleFloatingKeyDown(e);\n return;\n }\n\n if (!isMainOrientationKey(key, ori)) return;\n if (open.value || !toValue(openOnArrowKeyDown)) return;\n\n e.preventDefault();\n setOpen(true, \"keyboard-activate\", e);\n\n const sel = selectedIndex !== undefined ? toValue(selectedIndex) : null;\n const initial =\n sel ??\n (isMainOrientationToEndKey(key, ori, isRtl.value)\n ? getFirstEnabledIndex()\n : getLastEnabledIndex());\n if (initial != null) onNavigate?.(initial);\n };\n\n const handleFloatingKeyDown = (e: KeyboardEvent): void => {\n if (e.defaultPrevented) return;\n\n const key = e.key;\n const ori = toValue(orientation);\n const items = listRef.value;\n if (!items.length) return;\n\n // Handle Home/End (skip in virtual mode to allow text cursor navigation)\n if (!isVirtual.value) {\n if (key === \"Home\") {\n e.preventDefault();\n const idx = getFirstEnabledIndex();\n if (idx != null) onNavigate?.(idx);\n return;\n }\n if (key === \"End\") {\n e.preventDefault();\n const idx = getLastEnabledIndex();\n if (idx != null) onNavigate?.(idx);\n return;\n }\n }\n\n // Determine navigation strategy based on orientation\n const strategy = createNavigationStrategy(\n ori,\n gridCols.value,\n toValue(options.gridLoopDirection) ?? \"row\",\n );\n\n // Build strategy context\n const strategyContext: StrategyContext = {\n current: getActiveIndex(),\n items,\n isRtl: isRtl.value,\n loop: !!toValue(loop),\n allowEscape: !!toValue(allowEscape),\n isVirtual: isVirtual.value,\n cols: gridCols.value,\n nested: !!toValue(nested),\n isDisabled,\n findNextEnabled,\n getFirstEnabledIndex,\n getLastEnabledIndex,\n };\n\n const result = strategy.handleKey(key, strategyContext);\n if (!result) return;\n\n e.preventDefault();\n\n if (result.type === \"navigate\") {\n onNavigate?.(result.index);\n } else if (result.type === \"close\") {\n setOpen(false, \"programmatic\", e);\n }\n };\n\n // --------------------------------------------------------------------------\n // Watchers & Event Listeners\n // --------------------------------------------------------------------------\n\n // Focus active item when it changes\n registerCleanup(\n watch(\n [open, computed(() => getActiveIndex())],\n ([isOpen, idx]) => {\n if (!isEnabled.value || !isOpen || idx == null) return;\n focusItem(idx);\n },\n { flush: \"post\" },\n ),\n );\n\n // Keyboard navigation on anchor element\n registerCleanup(\n useEventListener(\n () => (isEnabled.value ? anchorEl.value : null),\n \"keydown\",\n handleAnchorKeyDown,\n ),\n );\n\n // Keyboard navigation on floating element\n registerCleanup(\n useEventListener(\n () => (isEnabled.value ? floatingEl.value : null),\n \"keydown\",\n handleFloatingKeyDown,\n ),\n );\n\n // Hover-to-focus behavior\n registerCleanup(\n watchPostEffect(() => {\n if (!isEnabled.value || !toValue(focusItemOnHover)) return;\n const container = floatingEl.value;\n if (!container) return;\n\n let lastX: number | null = null;\n let lastY: number | null = null;\n\n // \"State-Driven Hover\" pattern:\n // Only update selection if the mouse *actually moved*.\n // This prevents \"ghost hovers\" where the list scrolls/updates under a stationary mouse.\n const onMove = (evt: MouseEvent) => {\n if (lastX === evt.clientX && lastY === evt.clientY) return;\n lastX = evt.clientX;\n lastY = evt.clientY;\n\n const target = evt.target as Element | null;\n if (!target) return;\n\n const idx = findItemIndexFromTarget(target);\n if (idx >= 0) onNavigate?.(idx);\n };\n\n container.addEventListener(\"mousemove\", onMove);\n onWatcherCleanup(() => container.removeEventListener(\"mousemove\", onMove));\n }),\n );\n\n // Focus item when list opens\n const prevOpen = ref(false);\n registerCleanup(\n watch(\n () => open.value,\n (isOpen) => {\n if (!isEnabled.value) return;\n\n if (isOpen && !prevOpen.value) {\n const f = toValue(focusItemOnOpen);\n if (f === true || (f === \"auto\" && lastKey != null)) {\n const sel = selectedIndex !== undefined ? toValue(selectedIndex) : null;\n const idx =\n sel ??\n (lastKey && isMainOrientationToEndKey(lastKey, toValue(orientation), isRtl.value)\n ? getFirstEnabledIndex()\n : getLastEnabledIndex());\n if (idx != null) {\n onNavigate?.(idx);\n focusItem(idx, true);\n }\n }\n }\n\n prevOpen.value = isOpen;\n },\n { flush: \"post\", immediate: true },\n ),\n );\n\n const findItemIndexFromTarget = (target: Element): number => {\n const items = listRef.value;\n for (let i = 0; i < items.length; i++) {\n const el = items[i];\n if (el && (el === target || el.contains(target))) return i;\n }\n return -1;\n };\n\n // --------------------------------------------------------------------------\n // Active Descendant (Virtual Focus)\n // --------------------------------------------------------------------------\n\n const { activeItem } = useActiveDescendant(\n anchorEl,\n listRef,\n computed(() => getActiveIndex()),\n { virtual, open },\n );\n\n // Sync activeItem with user-provided virtualItemRef\n if (virtualItemRef) {\n registerCleanup(\n watch(\n activeItem,\n (item) => {\n virtualItemRef.value = item;\n },\n { flush: \"post\" },\n ),\n );\n }\n\n return { cleanup: runCleanups };\n}\n","import type { Middleware, Padding } from \"@floating-ui/dom\";\nimport { arrow as FloatingUIArrow } from \"@floating-ui/dom\";\nimport { type Ref, toValue } from \"vue\";\n\n//=======================================================================================\n// 📌 Types & Interfaces\n//=======================================================================================\n\n/**\n * Options for configuring arrow positioning within floating elements\n */\nexport interface ArrowMiddlewareOptions {\n /**\n * Padding to apply around the arrow element\n */\n padding?: Padding;\n\n /**\n * Reference to the arrow element\n */\n element: Ref<HTMLElement | null>;\n}\n\n//=======================================================================================\n// 📌 Main Logic / Primary Export(s)\n//=======================================================================================\n\n/**\n * Positions an inner element of the floating element such that it is centered to the anchor element.\n *\n * This middleware is used to position arrow elements within floating elements.\n *\n * @param options - The arrow options including padding and element reference\n * @returns A middleware function for arrow positioning\n */\nexport function arrow(options: ArrowMiddlewareOptions): Middleware {\n return {\n name: \"arrow\",\n options,\n fn(args) {\n const element = toValue(options.element);\n\n if (element == null) {\n return {};\n }\n\n return FloatingUIArrow({ element, padding: options.padding }).fn(args);\n },\n };\n}\n","import type { Middleware as FloatingMiddleware } from \"@floating-ui/dom\";\nimport type { ComputedRef, MaybeRefOrGetter } from \"vue\";\n\nexport interface FloatingMiddlewareRegistry {\n middlewares: ComputedRef<FloatingMiddleware[]>;\n register: (middleware: MaybeRefOrGetter<FloatingMiddleware | null | undefined>) => () => void;\n}\n\nexport interface FloatingInternals {\n middlewareRegistry: FloatingMiddlewareRegistry;\n}\n\nconst floatingInternals = new WeakMap<object, FloatingInternals>();\n\nexport function setFloatingInternals(target: object, internals: FloatingInternals) {\n floatingInternals.set(target, internals);\n}\n\nexport function getFloatingInternals(target: object) {\n return floatingInternals.get(target);\n}\n","import { type ComputedRef, computed, type Ref, toValue, watch } from \"vue\";\nimport { getFloatingPosition, getFloatingRefs } from \"@/core/floating-accessors\";\nimport { getFloatingInternals } from \"@/core/floating-internals\";\nimport { arrow } from \"../middlewares\";\nimport type { FloatingContext } from \"./use-floating\";\n\nexport interface UseArrowReturn {\n arrowX: ComputedRef<number>;\n arrowY: ComputedRef<number>;\n arrowStyles: ComputedRef<Record<string, string>>;\n}\n\nexport interface UseArrowOptions {\n element?: Ref<HTMLElement | null>;\n offset?: string;\n}\n\nexport function useArrow(\n context: FloatingContext,\n options: UseArrowOptions & { element: Ref<HTMLElement | null> },\n): UseArrowReturn;\nexport function useArrow(\n arrowEl: Ref<HTMLElement | null>,\n context: FloatingContext,\n options?: Omit<UseArrowOptions, \"element\">,\n): UseArrowReturn;\nexport function useArrow(\n contextOrArrow: FloatingContext | Ref<HTMLElement | null>,\n contextOrOptions?: FloatingContext | UseArrowOptions,\n maybeOptions: Omit<UseArrowOptions, \"element\"> = {},\n): UseArrowReturn {\n const normalized = normalizeArrowArgs(contextOrArrow, contextOrOptions, maybeOptions);\n const { context, arrowEl, options } = normalized;\n const { refs } = context;\n const { middlewareData, placement } = getFloatingPosition(context);\n const { offset = \"-4px\" } = options;\n\n watch(\n arrowEl,\n (element) => {\n refs.setArrow(element);\n },\n { immediate: true },\n );\n\n const internals = getFloatingInternals(context);\n internals?.middlewareRegistry.register(\n computed(() => {\n if (!arrowEl.value) {\n return null;\n }\n\n return arrow({ element: arrowEl });\n }),\n );\n\n const arrowX = computed(() => middlewareData.value.arrow?.x ?? 0);\n const arrowY = computed(() => middlewareData.value.arrow?.y ?? 0);\n\n const arrowStyles = computed(() => {\n const arrowElement = arrowEl.value || refs.arrowEl.value;\n\n if (!arrowElement || !middlewareData.value.arrow) {\n return {};\n }\n\n const side = toValue(placement).split(\"-\")[0] as \"top\" | \"bottom\" | \"left\" | \"right\";\n\n if (side === \"bottom\") {\n return {\n \"inset-inline-start\": `${arrowX.value}px`,\n \"inset-block-start\": offset,\n };\n }\n\n if (side === \"top\") {\n return {\n \"inset-inline-start\": `${arrowX.value}px`,\n \"inset-block-end\": offset,\n };\n }\n\n if (side === \"right\") {\n return {\n \"inset-block-start\": `${arrowY.value}px`,\n \"inset-inline-start\": offset,\n };\n }\n\n return {\n \"inset-block-start\": `${arrowY.value}px`,\n \"inset-inline-end\": offset,\n };\n }) as ComputedRef<Record<string, string>>;\n\n return {\n arrowX,\n arrowY,\n arrowStyles,\n };\n}\n\nfunction normalizeArrowArgs(\n contextOrArrow: FloatingContext | Ref<HTMLElement | null>,\n contextOrOptions?: FloatingContext | UseArrowOptions,\n maybeOptions: Omit<UseArrowOptions, \"element\"> = {},\n) {\n if (isFloatingContext(contextOrArrow)) {\n const context = contextOrArrow;\n const options = (contextOrOptions ?? {}) as UseArrowOptions;\n\n if (!options.element) {\n throw new Error(\n \"[useArrow] `options.element` is required when calling useArrow(context, options).\",\n );\n }\n\n getFloatingRefs(context);\n\n return {\n context,\n arrowEl: options.element,\n options,\n };\n }\n\n const arrowEl = contextOrArrow;\n const context = contextOrOptions as FloatingContext;\n\n return {\n context,\n arrowEl,\n options: maybeOptions,\n };\n}\n\nfunction isFloatingContext(value: unknown): value is FloatingContext {\n return typeof value === \"object\" && value !== null && \"refs\" in value;\n}\n","import { isMouseLikePointerType } from \"@/utils\";\nimport type { Coordinates, PointerEventData, TrackingContext, TrackingMode } from \"./types\";\n\nexport abstract class TrackingStrategy {\n abstract readonly name: TrackingMode;\n\n protected lastKnownCoordinates: Coordinates | null = null;\n\n abstract process(event: PointerEventData, context: TrackingContext): Coordinates | null;\n abstract getRequiredEvents(): PointerEventData[\"type\"][];\n\n getCoordinatesForOpening(): Coordinates | null {\n return this.lastKnownCoordinates;\n }\n\n onClose(): void {\n this.lastKnownCoordinates = null;\n }\n\n reset(): void {\n this.lastKnownCoordinates = null;\n }\n}\n\nexport class FollowTracker extends TrackingStrategy {\n readonly name = \"follow\" as const;\n\n getRequiredEvents(): PointerEventData[\"type\"][] {\n return [\"pointerdown\", \"pointermove\", \"pointerenter\"];\n }\n\n process(event: PointerEventData, context: TrackingContext): Coordinates | null {\n const coordinates = event.coordinates;\n this.lastKnownCoordinates = coordinates;\n\n switch (event.type) {\n case \"pointerdown\":\n return coordinates;\n case \"pointermove\":\n if (context.isOpen && isMouseLikePointerType(event.originalEvent.pointerType, true)) {\n return coordinates;\n }\n\n return null;\n case \"pointerenter\":\n return coordinates;\n default:\n return null;\n }\n }\n}\n\nexport class StaticTracker extends TrackingStrategy {\n readonly name = \"static\" as const;\n\n private triggerCoordinates: Coordinates | null = null;\n\n getRequiredEvents(): PointerEventData[\"type\"][] {\n return [\"pointerdown\", \"pointermove\"];\n }\n\n process(event: PointerEventData, context: TrackingContext): Coordinates | null {\n const coordinates = event.coordinates;\n this.lastKnownCoordinates = coordinates;\n\n if (event.type === \"pointerdown\") {\n this.triggerCoordinates = coordinates;\n return context.isOpen ? coordinates : null;\n }\n\n return null;\n }\n\n getCoordinatesForOpening(): Coordinates | null {\n if (this.triggerCoordinates) {\n return this.triggerCoordinates;\n }\n\n return this.lastKnownCoordinates;\n }\n\n reset(): void {\n super.reset();\n this.triggerCoordinates = null;\n }\n\n onClose(): void {\n this.triggerCoordinates = null;\n }\n}\n","import type { VirtualElement } from \"@/types\";\nimport type {\n AxisConstraint,\n Coordinates,\n VirtualElementFactoryContract,\n VirtualElementFactoryOptions,\n} from \"./types\";\n\nexport class VirtualElementFactory implements VirtualElementFactoryContract {\n private static readonly DEFAULT_DIMENSIONS = { width: 100, height: 30 };\n\n create(options: VirtualElementFactoryOptions): VirtualElement {\n const config = this.buildConfiguration(options);\n\n return {\n contextElement: config.referenceElement || undefined,\n getBoundingClientRect: () => this.buildBoundingRect(config),\n };\n }\n\n private buildConfiguration(options: VirtualElementFactoryOptions): {\n coordinates: Coordinates;\n referenceElement: HTMLElement | null;\n baselineCoordinates: Coordinates | null;\n axis: AxisConstraint;\n } {\n return {\n coordinates: options.coordinates,\n referenceElement: options.referenceElement ?? null,\n baselineCoordinates: options.baselineCoordinates ?? null,\n axis: options.axis ?? \"both\",\n };\n }\n\n private buildBoundingRect(config: {\n coordinates: Coordinates;\n referenceElement: HTMLElement | null;\n baselineCoordinates: Coordinates | null;\n axis: AxisConstraint;\n }): DOMRect {\n const referenceRect = this.getReferenceRect(config.referenceElement);\n const position = this.resolvePosition(config, referenceRect);\n const size = this.calculateSize(config.axis, referenceRect);\n\n return this.buildDOMRect({\n x: position.x,\n y: position.y,\n width: size.width,\n height: size.height,\n });\n }\n\n private getReferenceRect(element: HTMLElement | null): DOMRect {\n if (element) {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n if (import.meta.env.DEV) {\n console.warn(\"VirtualElementFactory: Failed to get element bounds\", { element, error });\n }\n }\n }\n\n return this.buildDOMRect({\n x: 0,\n y: 0,\n width: VirtualElementFactory.DEFAULT_DIMENSIONS.width,\n height: VirtualElementFactory.DEFAULT_DIMENSIONS.height,\n });\n }\n\n private resolvePosition(\n config: {\n coordinates: Coordinates;\n baselineCoordinates: Coordinates | null;\n axis: AxisConstraint;\n },\n referenceRect: DOMRect,\n ): { x: number; y: number } {\n return {\n x: this.resolveAxisCoordinate({\n current: config.coordinates.x,\n baseline: config.baselineCoordinates?.x ?? null,\n fallback: referenceRect.x,\n isAxisEnabled: config.axis === \"x\" || config.axis === \"both\",\n }),\n y: this.resolveAxisCoordinate({\n current: config.coordinates.y,\n baseline: config.baselineCoordinates?.y ?? null,\n fallback: referenceRect.y,\n isAxisEnabled: config.axis === \"y\" || config.axis === \"both\",\n }),\n };\n }\n\n private resolveAxisCoordinate(sources: {\n current: number | null;\n baseline: number | null;\n fallback: number;\n isAxisEnabled: boolean;\n }): number {\n const { current, baseline, fallback, isAxisEnabled } = sources;\n\n if (isAxisEnabled && current !== null) {\n return current;\n }\n\n if (baseline !== null) {\n return baseline;\n }\n\n return fallback;\n }\n\n private calculateSize(\n axis: AxisConstraint,\n referenceRect: DOMRect,\n ): {\n width: number;\n height: number;\n } {\n const ensurePositive = (value: number, fallback: number) => Math.max(0, value || fallback);\n\n switch (axis) {\n case \"both\":\n return { width: 0, height: 0 };\n case \"x\":\n return {\n width: ensurePositive(\n referenceRect.width,\n VirtualElementFactory.DEFAULT_DIMENSIONS.width,\n ),\n height: 0,\n };\n case \"y\":\n return {\n width: 0,\n height: ensurePositive(\n referenceRect.height,\n VirtualElementFactory.DEFAULT_DIMENSIONS.height,\n ),\n };\n }\n }\n\n private buildDOMRect(rect: { x: number; y: number; width: number; height: number }): DOMRect {\n const { x, y, width, height } = rect;\n const safeWidth = Math.max(0, width);\n const safeHeight = Math.max(0, height);\n\n return {\n x,\n y,\n width: safeWidth,\n height: safeHeight,\n top: y,\n right: x + safeWidth,\n bottom: y + safeHeight,\n left: x,\n toJSON: () => ({ x, y, width: safeWidth, height: safeHeight }),\n } as DOMRect;\n }\n}\n","import {\n computed,\n type MaybeRefOrGetter,\n type Ref,\n readonly,\n ref,\n toValue,\n watch,\n watchEffect,\n} from \"vue\";\nimport { getFloatingState } from \"@/core/floating-accessors\";\nimport { FollowTracker, StaticTracker, TrackingStrategy } from \"./client-point/tracking-strategies\";\nimport type {\n AxisConstraint,\n Coordinates,\n PointerEventData,\n TrackingMode,\n} from \"./client-point/types\";\nimport { VirtualElementFactory } from \"./client-point/virtual-element-factory\";\nimport type { AnchorElement, FloatingContext } from \"./use-floating\";\n\nconst sanitizeCoordinate = (value: number | null | undefined): number | null => {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n};\n\nexport type { AxisConstraint, Coordinates, TrackingMode } from \"./client-point/types\";\nexport { FollowTracker, StaticTracker, TrackingStrategy, VirtualElementFactory };\n\nexport interface UseClientPointOptions {\n pointerTarget?: Ref<HTMLElement | null>;\n enabled?: MaybeRefOrGetter<boolean>;\n axis?: MaybeRefOrGetter<AxisConstraint>;\n x?: MaybeRefOrGetter<number | null>;\n y?: MaybeRefOrGetter<number | null>;\n trackingMode?: TrackingMode;\n}\n\nexport interface UseClientPointReturn {\n coordinates: Readonly<Ref<{ x: number | null; y: number | null }>>;\n updatePosition: (x: number, y: number) => void;\n}\n\nexport interface UseClientPointContext {\n refs: {\n anchorEl: Ref<AnchorElement>;\n };\n state?: FloatingContext[\"state\"];\n open?: FloatingContext[\"open\"];\n setOpen?: FloatingContext[\"setOpen\"];\n position?: Pick<FloatingContext[\"position\"], \"update\">;\n update?: () => void;\n}\n\nexport function useClientPoint(\n context: UseClientPointContext,\n options?: UseClientPointOptions,\n): UseClientPointReturn;\nexport function useClientPoint(\n pointerTarget: Ref<HTMLElement | null>,\n context: UseClientPointContext,\n options?: Omit<UseClientPointOptions, \"pointerTarget\">,\n): UseClientPointReturn;\nexport function useClientPoint(\n contextOrPointerTarget: UseClientPointContext | Ref<HTMLElement | null>,\n contextOrOptions: UseClientPointContext | UseClientPointOptions = {},\n maybeOptions: Omit<UseClientPointOptions, \"pointerTarget\"> = {},\n): UseClientPointReturn {\n const normalized = normalizeClientPointArgs(\n contextOrPointerTarget,\n contextOrOptions,\n maybeOptions,\n );\n const { pointerTarget, context, options } = normalized;\n const { open } = getFloatingState(context);\n const refs = context.refs;\n const update =\n \"position\" in context && context.position ? context.position.update : context.update;\n\n const virtualElementFactory = new VirtualElementFactory();\n const internalCoordinates = ref<Coordinates>({ x: null, y: null });\n const lockedCoordinates = ref<Coordinates | null>(null);\n\n const axis = computed(() => toValue(options.axis ?? \"both\"));\n const enabled = computed(() => toValue(options.enabled ?? true));\n const externalX = computed(() => sanitizeCoordinate(toValue(options.x ?? null)));\n const externalY = computed(() => sanitizeCoordinate(toValue(options.y ?? null)));\n const isExternallyControlled = computed(\n () => externalX.value !== null && externalY.value !== null,\n );\n\n const coordinates = computed<Coordinates>(() => {\n if (isExternallyControlled.value) {\n return {\n x: externalX.value,\n y: externalY.value,\n };\n }\n\n return internalCoordinates.value;\n });\n\n const constrainedCoordinates = computed<Coordinates>(() => {\n const coords = coordinates.value;\n const currentAxis = axis.value;\n\n switch (currentAxis) {\n case \"x\":\n return { x: coords.x, y: null };\n case \"y\":\n return { x: null, y: coords.y };\n case \"both\":\n return coords;\n }\n });\n\n const trackingStrategy = createTrackingStrategy(options.trackingMode ?? \"follow\");\n\n const setCoordinates = (x: number | null, y: number | null) => {\n if (isExternallyControlled.value) {\n return;\n }\n\n internalCoordinates.value = {\n x: sanitizeCoordinate(x),\n y: sanitizeCoordinate(y),\n };\n };\n\n const resetCoordinates = () => {\n if (!isExternallyControlled.value) {\n internalCoordinates.value = { x: null, y: null };\n }\n };\n\n const processPointerEvent = (event: PointerEvent, type: PointerEventData[\"type\"]) => {\n const nextCoordinates = trackingStrategy.process(\n {\n type,\n coordinates: { x: event.clientX, y: event.clientY },\n originalEvent: event,\n },\n { isOpen: open.value },\n );\n\n if (nextCoordinates) {\n setCoordinates(nextCoordinates.x, nextCoordinates.y);\n }\n };\n\n watch(\n [constrainedCoordinates, lockedCoordinates, axis, pointerTarget],\n () => {\n refs.anchorEl.value = virtualElementFactory.create({\n coordinates: constrainedCoordinates.value,\n referenceElement: pointerTarget.value,\n baselineCoordinates: lockedCoordinates.value,\n axis: axis.value,\n });\n\n if (open.value) {\n update?.();\n }\n },\n { immediate: true },\n );\n\n watch(open, (isOpen) => {\n if (!enabled.value || isExternallyControlled.value) {\n return;\n }\n\n if (isOpen) {\n const openingCoordinates = trackingStrategy.getCoordinatesForOpening();\n\n if (openingCoordinates) {\n setCoordinates(openingCoordinates.x, openingCoordinates.y);\n lockedCoordinates.value = { ...openingCoordinates };\n } else {\n lockedCoordinates.value = { ...internalCoordinates.value };\n }\n\n return;\n }\n\n trackingStrategy.onClose();\n resetCoordinates();\n lockedCoordinates.value = null;\n });\n\n const handlers: Record<PointerEventData[\"type\"], (event: PointerEvent) => void> = {\n pointerdown: (event) => processPointerEvent(event, \"pointerdown\"),\n pointerenter: (event) => processPointerEvent(event, \"pointerenter\"),\n pointermove: (event) => processPointerEvent(event, \"pointermove\"),\n };\n\n watchEffect((onCleanup) => {\n if (isExternallyControlled.value || !enabled.value) {\n return;\n }\n\n const target = pointerTarget.value;\n\n if (!target) {\n return;\n }\n\n const requiredEvents = trackingStrategy.getRequiredEvents();\n\n for (const eventType of requiredEvents) {\n target.addEventListener(eventType, handlers[eventType]);\n }\n\n onCleanup(() => {\n for (const eventType of requiredEvents) {\n target.removeEventListener(eventType, handlers[eventType]);\n }\n });\n });\n\n return {\n coordinates: readonly(constrainedCoordinates),\n updatePosition: (x: number, y: number) => setCoordinates(x, y),\n };\n}\n\nfunction createTrackingStrategy(trackingMode: TrackingMode): TrackingStrategy {\n return trackingMode === \"follow\" ? new FollowTracker() : new StaticTracker();\n}\n\nfunction normalizeClientPointArgs(\n contextOrPointerTarget: UseClientPointContext | Ref<HTMLElement | null>,\n contextOrOptions: UseClientPointContext | UseClientPointOptions,\n maybeOptions: Omit<UseClientPointOptions, \"pointerTarget\">,\n) {\n if (isClientPointContext(contextOrPointerTarget)) {\n const context = contextOrPointerTarget;\n const options = contextOrOptions as UseClientPointOptions;\n\n if (!options.pointerTarget) {\n throw new Error(\n \"[useClientPoint] `options.pointerTarget` is required when calling useClientPoint(context, options).\",\n );\n }\n\n return {\n context,\n pointerTarget: options.pointerTarget,\n options,\n };\n }\n\n return {\n pointerTarget: contextOrPointerTarget,\n context: contextOrOptions as UseClientPointContext,\n options: maybeOptions as UseClientPointOptions,\n };\n}\n\nfunction isClientPointContext(\n value: UseClientPointContext | Ref<HTMLElement | null>,\n): value is UseClientPointContext {\n return typeof value === \"object\" && value !== null && \"refs\" in value;\n}\n","import type { Ref } from \"vue\";\nimport type { VirtualElement } from \"@/types\";\n\nexport type AnchorDomElement = HTMLElement | VirtualElement | null;\nexport type FloatingDomElement = HTMLElement | null;\n\nexport function resolveAnchorElement(anchor: AnchorDomElement): HTMLElement | null {\n if (!anchor) {\n return null;\n }\n\n if (anchor instanceof HTMLElement) {\n return anchor;\n }\n\n return anchor.contextElement instanceof HTMLElement ? anchor.contextElement : null;\n}\n\nexport function createRefSetter<T>(target: Ref<T>) {\n return (value: T) => {\n target.value = value;\n };\n}\n","import { type Ref, ref } from \"vue\";\nimport type { OpenChangeReason } from \"@/types\";\n\nexport interface OpenStateControllerOptions {\n open?: Ref<boolean>;\n onOpenChange?: (open: boolean, reason: OpenChangeReason, event?: Event) => void;\n}\n\nexport function createOpenStateController(options: OpenStateControllerOptions = {}) {\n const open = options.open ?? ref(false);\n\n const setOpen = (value: boolean, reason?: OpenChangeReason, event?: Event) => {\n if (open.value === value) {\n return;\n }\n\n open.value = value;\n options.onOpenChange?.(value, reason ?? \"programmatic\", event);\n };\n\n return {\n open,\n setOpen,\n };\n}\n","import type { Middleware } from \"@floating-ui/dom\";\nimport { computed, type MaybeRefOrGetter, ref, toValue } from \"vue\";\nimport type { FloatingMiddlewareRegistry } from \"@/core/floating-internals\";\nimport { tryOnScopeDispose } from \"@/core/lifecycle\";\n\ntype MiddlewareRegistration = {\n id: number;\n middleware: MaybeRefOrGetter<Middleware | null | undefined>;\n};\n\nexport function createMiddlewareRegistry(\n baseMiddlewares: MaybeRefOrGetter<Middleware[] | undefined>,\n): FloatingMiddlewareRegistry {\n const registrations = ref<MiddlewareRegistration[]>([]);\n let nextRegistrationId = 0;\n\n const middlewares = computed(() => {\n const merged = [...(toValue(baseMiddlewares) ?? [])];\n\n for (const registration of registrations.value) {\n const middleware = toValue(registration.middleware);\n\n if (!middleware) {\n continue;\n }\n\n const existingIndex = merged.findIndex((candidate) => candidate.name === middleware.name);\n\n if (existingIndex === -1) {\n merged.push(middleware);\n } else {\n merged[existingIndex] = middleware;\n }\n }\n\n return merged;\n });\n\n const register = (middleware: MaybeRefOrGetter<Middleware | null | undefined>) => {\n const registration = {\n id: nextRegistrationId++,\n middleware,\n };\n\n registrations.value = [...registrations.value, registration];\n\n const unregister = () => {\n registrations.value = registrations.value.filter(\n (candidate) => candidate.id !== registration.id,\n );\n };\n\n tryOnScopeDispose(unregister);\n\n return unregister;\n };\n\n return {\n middlewares,\n register,\n };\n}\n","import type {\n AutoUpdateOptions,\n Middleware,\n MiddlewareData,\n Placement,\n Strategy,\n} from \"@floating-ui/dom\";\nimport { computePosition, autoUpdate as floatingUIAutoUpdate } from \"@floating-ui/dom\";\nimport { computed, type MaybeRefOrGetter, type Ref, ref, shallowRef, toValue, watch } from \"vue\";\nimport { tryOnScopeDispose } from \"@/core/lifecycle\";\nimport type { AnchorElement, FloatingElement, FloatingStyles } from \"../use-floating\";\nimport { createMiddlewareRegistry } from \"./middleware-registry\";\n\nexport interface PositionControllerOptions {\n anchorEl: Ref<AnchorElement>;\n floatingEl: Ref<FloatingElement>;\n open: Ref<boolean>;\n placement?: MaybeRefOrGetter<Placement | undefined>;\n strategy?: MaybeRefOrGetter<Strategy | undefined>;\n transform?: MaybeRefOrGetter<boolean | undefined>;\n middlewares?: MaybeRefOrGetter<Middleware[]>;\n autoUpdate?: boolean | AutoUpdateOptions;\n}\n\nexport function createPositionController(options: PositionControllerOptions) {\n const {\n anchorEl,\n floatingEl,\n open,\n transform = true,\n middlewares = [],\n autoUpdate: autoUpdateOptions = true,\n } = options;\n\n const preferredPlacement = computed(() => toValue(options.placement) ?? \"bottom\");\n const preferredStrategy = computed(() => toValue(options.strategy) ?? \"absolute\");\n const middlewareRegistry = createMiddlewareRegistry(middlewares);\n\n const x = ref(0);\n const y = ref(0);\n const placement = ref<Placement>(preferredPlacement.value);\n const strategy = ref<Strategy>(preferredStrategy.value);\n const middlewareData = shallowRef<MiddlewareData>({});\n const isPositioned = ref(false);\n\n const update = async () => {\n if (!anchorEl.value || !floatingEl.value) {\n return;\n }\n\n try {\n const result = await computePosition(anchorEl.value, floatingEl.value, {\n placement: preferredPlacement.value,\n strategy: preferredStrategy.value,\n middleware: middlewareRegistry.middlewares.value,\n });\n\n x.value = result.x;\n y.value = result.y;\n placement.value = result.placement;\n strategy.value = result.strategy;\n middlewareData.value = result.middlewareData;\n isPositioned.value = open.value;\n } catch (error) {\n if (import.meta.env.DEV) {\n console.error(\"[useFloating] Failed to compute position:\", error);\n }\n }\n };\n\n watch([preferredPlacement, preferredStrategy, middlewareRegistry.middlewares], () => {\n if (open.value) {\n void update();\n }\n });\n\n watch(\n [anchorEl, floatingEl, open],\n ([currentAnchor, currentFloating, isOpen], _oldValue, onCleanup) => {\n if (!isOpen || !currentAnchor || !currentFloating) {\n return;\n }\n\n void update();\n\n if (!autoUpdateOptions) {\n return;\n }\n\n const cleanup = floatingUIAutoUpdate(\n currentAnchor,\n currentFloating,\n update,\n typeof autoUpdateOptions === \"object\" ? autoUpdateOptions : undefined,\n );\n\n onCleanup(cleanup);\n },\n { immediate: true },\n );\n\n watch(open, (isOpen) => {\n if (!isOpen) {\n isPositioned.value = false;\n }\n });\n\n const styles = computed<FloatingStyles>(() => {\n const floatingElement = floatingEl.value;\n const baseStyles = {\n position: strategy.value,\n left: \"0\",\n top: \"0\",\n } satisfies FloatingStyles;\n\n if (!floatingElement) {\n return baseStyles;\n }\n\n const resolvedTransform = toValue(transform);\n const roundedX = roundByDPR(floatingElement, x.value);\n const roundedY = roundByDPR(floatingElement, y.value);\n\n if (!resolvedTransform) {\n return {\n ...baseStyles,\n left: `${roundedX}px`,\n top: `${roundedY}px`,\n };\n }\n\n return {\n ...baseStyles,\n transform: `translate(${roundedX}px, ${roundedY}px)`,\n ...(getDPR(floatingElement) >= 1.5 ? { \"will-change\": \"transform\" } : {}),\n };\n });\n\n tryOnScopeDispose(() => {\n isPositioned.value = false;\n });\n\n return {\n middlewareRegistry,\n position: {\n x,\n y,\n strategy,\n placement,\n middlewareData,\n isPositioned,\n styles,\n update,\n },\n };\n}\n\nfunction roundByDPR(el: HTMLElement, value: number) {\n const dpr = getDPR(el);\n return Math.round(value * dpr) / dpr;\n}\n\nfunction getDPR(el: HTMLElement) {\n if (typeof window === \"undefined\") {\n return 1;\n }\n\n const win = el.ownerDocument.defaultView || window;\n return win.devicePixelRatio || 1;\n}\n","import type {\n AutoUpdateOptions,\n Middleware,\n MiddlewareData,\n Placement,\n Strategy,\n} from \"@floating-ui/dom\";\nimport type { MaybeRefOrGetter, Ref } from \"vue\";\nimport { ref } from \"vue\";\nimport { createRefSetter } from \"@/core/elements\";\nimport { setFloatingInternals } from \"@/core/floating-internals\";\nimport type { OpenChangeReason, VirtualElement } from \"@/types\";\nimport { createOpenStateController } from \"./internal/open-state\";\nimport { createPositionController } from \"./internal/position-controller\";\n\nexport type AnchorElement = HTMLElement | VirtualElement | null;\nexport type FloatingElement = HTMLElement | null;\n\nexport type FloatingStyles = {\n position: Strategy;\n top: string;\n left: string;\n transform?: string;\n \"will-change\"?: string;\n} & {\n // biome-ignore lint/suspicious/noExplicitAny: CSS custom property passthrough\n [key: `--${string}`]: any;\n};\n\nexport interface UseFloatingOptions {\n placement?: MaybeRefOrGetter<Placement | undefined>;\n strategy?: MaybeRefOrGetter<Strategy | undefined>;\n transform?: MaybeRefOrGetter<boolean | undefined>;\n middlewares?: MaybeRefOrGetter<Middleware[]>;\n autoUpdate?: boolean | AutoUpdateOptions;\n open?: Ref<boolean>;\n onOpenChange?: (open: boolean, reason: OpenChangeReason, event?: Event) => void;\n}\n\nexport interface FloatingRefs {\n anchorEl: Ref<AnchorElement>;\n floatingEl: Ref<FloatingElement>;\n arrowEl: Ref<HTMLElement | null>;\n setAnchor: (value: AnchorElement) => void;\n setFloating: (value: FloatingElement) => void;\n setArrow: (value: HTMLElement | null) => void;\n}\n\nexport interface FloatingState {\n open: Readonly<Ref<boolean>>;\n setOpen: (open: boolean, reason?: OpenChangeReason, event?: Event) => void;\n}\n\nexport interface FloatingPosition {\n x: Readonly<Ref<number>>;\n y: Readonly<Ref<number>>;\n strategy: Readonly<Ref<Strategy>>;\n placement: Readonly<Ref<Placement>>;\n middlewareData: Readonly<Ref<MiddlewareData>>;\n isPositioned: Readonly<Ref<boolean>>;\n styles: Readonly<Ref<FloatingStyles>>;\n update: () => void;\n}\n\nexport interface FloatingRoot {\n refs: FloatingRefs;\n state: FloatingState;\n position: FloatingPosition;\n}\n\nexport interface FloatingContext extends FloatingRoot {\n /**\n * Deprecated flat aliases kept during the grouped-return transition.\n */\n open: FloatingState[\"open\"];\n setOpen: FloatingState[\"setOpen\"];\n x: FloatingPosition[\"x\"];\n y: FloatingPosition[\"y\"];\n strategy: FloatingPosition[\"strategy\"];\n placement: FloatingPosition[\"placement\"];\n middlewareData: FloatingPosition[\"middlewareData\"];\n isPositioned: FloatingPosition[\"isPositioned\"];\n floatingStyles: FloatingPosition[\"styles\"];\n update: FloatingPosition[\"update\"];\n}\n\nexport function useFloating(\n anchorEl: Ref<AnchorElement>,\n floatingEl: Ref<FloatingElement>,\n options: UseFloatingOptions = {},\n): FloatingContext {\n const stateController = createOpenStateController({\n open: options.open,\n onOpenChange: options.onOpenChange,\n });\n const arrowEl = ref<HTMLElement | null>(null);\n\n const refs: FloatingRefs = {\n anchorEl,\n floatingEl,\n arrowEl,\n setAnchor: createRefSetter(anchorEl),\n setFloating: createRefSetter(floatingEl),\n setArrow: createRefSetter(arrowEl),\n };\n\n const positionController = createPositionController({\n anchorEl,\n floatingEl,\n open: stateController.open,\n placement: options.placement,\n strategy: options.strategy,\n transform: options.transform,\n middlewares: options.middlewares,\n autoUpdate: options.autoUpdate,\n });\n\n const state: FloatingState = {\n open: stateController.open,\n setOpen: stateController.setOpen,\n };\n\n const position: FloatingPosition = {\n x: positionController.position.x,\n y: positionController.position.y,\n strategy: positionController.position.strategy,\n placement: positionController.position.placement,\n middlewareData: positionController.position.middlewareData,\n isPositioned: positionController.position.isPositioned,\n styles: positionController.position.styles,\n update: positionController.position.update,\n };\n\n const context = {\n refs,\n state,\n position,\n open: state.open,\n setOpen: state.setOpen,\n x: position.x,\n y: position.y,\n strategy: position.strategy,\n placement: position.placement,\n middlewareData: position.middlewareData,\n isPositioned: position.isPositioned,\n floatingStyles: position.styles,\n update: position.update,\n } satisfies FloatingContext;\n\n setFloatingInternals(context, {\n middlewareRegistry: positionController.middlewareRegistry,\n });\n\n return context;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "v-float",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"types": "./dist/src/index.d.ts",
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "v-float",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Vue 3 port of Floating UI - a library for positioning floating elements",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"type": "module",
|
|
10
|
+
"types": "./dist/src/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": "./dist/index.mjs",
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@floating-ui/dom": "^1.7.6",
|
|
17
|
+
"@typescript/native-preview": "7.0.0-dev.20260327.2",
|
|
18
|
+
"focus-trap": "^8.0.1",
|
|
19
|
+
"tabbable": "^6.4.0",
|
|
20
|
+
"vue": "^3.5.31"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@biomejs/biome": "2.2.2",
|
|
24
|
+
"@tailwindcss/vite": "^4.2.2",
|
|
25
|
+
"@tsconfig/node22": "^22.0.5",
|
|
26
|
+
"@types/jsdom": "^28.0.1",
|
|
27
|
+
"@types/node": "^25.5.0",
|
|
28
|
+
"@vitejs/plugin-vue": "^6.0.5",
|
|
29
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
30
|
+
"@vue/tsconfig": "^0.9.1",
|
|
31
|
+
"changelogen": "^0.6.2",
|
|
32
|
+
"jsdom": "^29.0.1",
|
|
33
|
+
"lucide-vue-next": "^0.577.0",
|
|
34
|
+
"npm-run-all2": "^8.0.4",
|
|
35
|
+
"playwright": "^1.58.2",
|
|
36
|
+
"release-it": "^19.2.4",
|
|
37
|
+
"tailwindcss": "^4.2.2",
|
|
38
|
+
"typescript": "~5.9.3",
|
|
39
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@^0.1.14",
|
|
40
|
+
"vite-plugin-dts": "^4.5.4",
|
|
41
|
+
"vite-plugin-vue-devtools": "^8.1.1",
|
|
42
|
+
"vite-plus": "latest",
|
|
43
|
+
"vitepress": "^1.6.4",
|
|
44
|
+
"vitepress-plugin-demo": "^0.8.1",
|
|
45
|
+
"vitest": "npm:@voidzero-dev/vite-plus-test@^0.1.14",
|
|
46
|
+
"vitest-browser-vue": "^2.1.0",
|
|
47
|
+
"vue-tsc": "^3.2.6"
|
|
48
|
+
},
|
|
49
|
+
"overrides": {
|
|
50
|
+
"vite": "npm:@voidzero-dev/vite-plus-core@^0.1.14",
|
|
51
|
+
"vitest": "npm:@voidzero-dev/vite-plus-test@^0.1.14"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"dev": "vp dev",
|
|
55
|
+
"build": "run-p type-check \"build-only {@}\" --",
|
|
56
|
+
"preview": "vp preview",
|
|
57
|
+
"build-only": "vp build",
|
|
58
|
+
"type-check": "vue-tsc --build tsconfig.build.json",
|
|
59
|
+
"lint": "biome check",
|
|
60
|
+
"lint:fix": "biome check --write",
|
|
61
|
+
"test": "vp test",
|
|
62
|
+
"test:coverage": "vp test --run --coverage",
|
|
63
|
+
"docs:dev": "vitepress dev docs",
|
|
64
|
+
"docs:build": "vitepress build docs",
|
|
65
|
+
"docs:preview": "vitepress preview docs",
|
|
66
|
+
"release": "release-it",
|
|
67
|
+
"release:patch": "release-it patch",
|
|
68
|
+
"release:minor": "release-it minor",
|
|
69
|
+
"release:major": "release-it major",
|
|
70
|
+
"release:dry": "release-it --dry-run",
|
|
71
|
+
"changelog": "changelogen",
|
|
72
|
+
"changelog:preview": "changelogen --no-output"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/composables/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA"}
|