@sky.ui/core 0.0.57 → 0.0.59
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/auto-import.js +1 -0
- package/dist/custom-elements.json +2270 -1694
- package/dist/helper/controllers/popover-controller.d.ts +4 -0
- package/dist/helper/controllers/popover-controller.js +1 -1
- package/dist/helper/controllers/popover-controller.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/sky-button/sky-button.js +6 -1
- package/dist/sky-button/sky-button.js.map +1 -1
- package/dist/sky-color-picker/color-model.d.ts +26 -0
- package/dist/sky-color-picker/color-model.js +2 -0
- package/dist/sky-color-picker/color-model.js.map +1 -0
- package/dist/sky-color-picker/index.d.ts +1 -0
- package/dist/sky-color-picker/index.js +1 -0
- package/dist/sky-color-picker/index.js.map +1 -0
- package/dist/sky-color-picker/sky-color-picker.d.ts +101 -0
- package/dist/sky-color-picker/sky-color-picker.js +417 -0
- package/dist/sky-color-picker/sky-color-picker.js.map +1 -0
- package/dist/sky-input/sky-input.d.ts +3 -0
- package/dist/sky-input/sky-input.js +36 -11
- package/dist/sky-input/sky-input.js.map +1 -1
- package/dist/sky-theme-provider/sky-theme-provider.js +1 -1
- package/dist/sky-theme-provider/sky-theme-provider.js.map +1 -1
- package/package.json +11 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover-controller.js","sources":["../../../src/helper/controllers/popover-controller.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\r\n\r\nexport type PopoverSide = \"top\" | \"bottom\" | \"left\" | \"right\";\r\nexport type PopoverPlacement = PopoverSide | \"auto\";\r\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\r\nexport type MaxWidthMode = \"cap\" | \"fill\";\r\nexport type CloseReason = \"api\" | \"toggle\" | \"escape\" | \"light-dismiss\" | \"group\";\r\ntype ArrowAlign = \"center\" | \"start\" | \"end\";\r\ntype ScrollContainerMode = \"auto\" | \"window\";\r\n\r\n/** Named animation presets; consumer selects by name. */\r\nexport type PopoverPreset =\r\n | \"none\"\r\n | \"fade\"\r\n | \"scale\"\r\n | \"slide\"\r\n | \"iosMenu\"\r\n | \"iosSheet\"\r\n | \"materialMenu\"\r\n | \"materialSheet\"\r\n | \"floaty\"\r\n | \"soft\"\r\n | \"sharp\"\r\n | \"blurIn\"\r\n | \"blurFade\"\r\n | \"zoomFromAnchor\"\r\n | \"zoomFromCorner\"\r\n | \"flip3d\"\r\n | \"card3d\"\r\n | \"tilt3d\"\r\n | \"depth3d\"\r\n | \"rotate3d\"\r\n | \"springy\"\r\n | \"bouncy\"\r\n | \"glide\"\r\n | \"pop\"\r\n | \"drop\"\r\n | \"grow\";\r\n\r\nexport type PopoverPresetConfig = {\r\n enterPx?: number; // translate distance\r\n exitPx?: number;\r\n enterScale?: number;\r\n exitScale?: number;\r\n blurInPx?: number;\r\n blurOutPx?: number;\r\n perspectivePx?: number;\r\n rotateDeg?: number; // 3d rotation magnitude\r\n tiltDeg?: number; // 3d tilt magnitude\r\n origin?: \"auto\" | \"anchor\" | \"center\" | \"corner\";\r\n easingOpen?: string;\r\n easingClose?: string;\r\n enterDuration?: number;\r\n exitDuration?: number;\r\n};\r\n\r\ntype PresetDef = {\r\n name: PopoverPreset;\r\n defaults: Required<PopoverPresetConfig>;\r\n getKeyframes: (\r\n args: {\r\n side: PopoverSide;\r\n phase: \"open\" | \"close\";\r\n cfg: Required<PopoverPresetConfig>;\r\n origin: string;\r\n }\r\n ) => Keyframe[];\r\n};\r\n\r\nexport interface PopoverControllerOptions {\r\n // Required functions\r\n getAnchor: () => HTMLElement | null;\r\n getPopover: () => HTMLElement | null;\r\n\r\n // CSS variable names\r\n cssVarLeft?: string;\r\n cssVarTop?: string;\r\n cssVarWidth?: string;\r\n\r\n // Reactive property getters\r\n // (Preferred - automatically update when component properties change)\r\n getPlacement?: () => PopoverPlacement;\r\n getAlign?: () => PopoverAlign;\r\n getGap?: () => number;\r\n getPadding?: () => number;\r\n getMatchAnchorWidth?: () => boolean;\r\n getMaxWidthToViewport?: () => boolean;\r\n getMaxWidthMode?: () => MaxWidthMode;\r\n getFlip?: () => boolean;\r\n getFlipOrder?: () => PopoverSide[];\r\n getPreset?: () => PopoverPreset;\r\n getDuration?: () => number;\r\n getCloseDuration?: () => number;\r\n getAnimateReposition?: () => boolean;\r\n getRepositionMs?: () => number;\r\n getCloseOnEscape?: () => boolean;\r\n getRestoreFocusOnClose?: () => boolean;\r\n getCloseOnOutside?: () => boolean;\r\n getIgnoreOutsideSelector?: () => string;\r\n getIgnoreOutsideAttr?: () => string;\r\n\r\n // Static fallback values\r\n // (For backward compatibility or when values don't change)\r\n placement?: PopoverPlacement;\r\n align?: PopoverAlign;\r\n gap?: number;\r\n padding?: number;\r\n matchAnchorWidth?: boolean;\r\n maxWidthToViewport?: boolean;\r\n maxWidthMode?: MaxWidthMode;\r\n flip?: boolean;\r\n flipOrder?: PopoverSide[];\r\n preset?: PopoverPreset;\r\n duration?: number;\r\n closeDuration?: number;\r\n animateReposition?: boolean;\r\n repositionMs?: number;\r\n closeOnEscape?: boolean;\r\n restoreFocusOnClose?: boolean;\r\n closeOnOutside?: boolean;\r\n ignoreOutsideSelector?: string;\r\n ignoreOutsideAttr?: string;\r\n\r\n // Scroll and focus\r\n focusOnOpen?: () => void;\r\n scrollContainer?: ScrollContainerMode | HTMLElement;\r\n\r\n // Group behavior\r\n groupEventName?: string;\r\n groupId?: unknown;\r\n\r\n // Callbacks\r\n onOpenChange?: (open: boolean, meta: { reason: CloseReason }) => void;\r\n /** Focus target on close; defaults to {@link getAnchor} when omitted. */\r\n getFocusTarget?: () => HTMLElement | null;\r\n\r\n // Other options\r\n sideAttr?: string;\r\n respectReducedMotion?: boolean;\r\n}\r\n\r\n/**\r\n * PopoverController with Reactive Getter Bindings\r\n * - Automatically reads latest values from host component via getter functions\r\n * - No manual updates needed when host properties change\r\n * - WAAPI preset animations with side-aware enter/exit\r\n * - Smooth reposition animation on flip/move\r\n */\r\nexport class PopoverController implements ReactiveController {\r\n private host: ReactiveControllerHost;\r\n private _open = false;\r\n\r\n private raf = 0;\r\n\r\n private anchorRO?: ResizeObserver;\r\n private popoverRO?: ResizeObserver;\r\n\r\n private boundScrollParents: Array<{ el: EventTarget; fn: EventListener }> = [];\r\n private visualViewport?: VisualViewport;\r\n /** When true, global listeners and observers are attached (deferred until first open for perf with many instances). */\r\n private _listenersAttached = false;\r\n\r\n private lastCloseReason: CloseReason = \"toggle\";\r\n private lastFocusedEl: Element | null = null;\r\n\r\n private hasEverOpened = false;\r\n private _skipNextReposition = false;\r\n\r\n private lastMeta: { place: PopoverSide; arrowAlign: ArrowAlign } = {\r\n place: \"bottom\",\r\n arrowAlign: \"center\",\r\n };\r\n\r\n private _phase: \"idle\" | \"opening\" | \"open\" | \"closing\" = \"idle\";\r\n private presetAnim?: Animation;\r\n private moveAnim?: Animation;\r\n\r\n // Helper to create getters with fallback to static values\r\n private static createGetter<T>(\r\n getter: (() => T) | undefined,\r\n staticValue: T | undefined,\r\n defaultValue: T\r\n ): () => T {\r\n return getter || (() => staticValue ?? defaultValue);\r\n }\r\n\r\n private opts: {\r\n // Required functions\r\n getAnchor: () => HTMLElement | null;\r\n getPopover: () => HTMLElement | null;\r\n\r\n // Reactive property getters\r\n getPlacement: () => PopoverPlacement;\r\n getAlign: () => PopoverAlign;\r\n getGap: () => number;\r\n getPadding: () => number;\r\n getMatchAnchorWidth: () => boolean;\r\n getMaxWidthToViewport: () => boolean;\r\n getMaxWidthMode: () => MaxWidthMode;\r\n getFlip: () => boolean;\r\n getFlipOrder: () => PopoverSide[];\r\n getPreset: () => PopoverPreset;\r\n getDuration: () => number;\r\n getCloseDuration: () => number;\r\n getAnimateReposition: () => boolean;\r\n getRepositionMs: () => number;\r\n getCloseOnEscape: () => boolean;\r\n getRestoreFocusOnClose: () => boolean;\r\n getCloseOnOutside: () => boolean;\r\n getIgnoreOutsideSelector: () => string;\r\n getIgnoreOutsideAttr: () => string;\r\n\r\n // Other options\r\n cssVarLeft: string;\r\n cssVarTop: string;\r\n cssVarWidth: string;\r\n focusOnOpen?: () => void;\r\n scrollContainer: ScrollContainerMode | HTMLElement;\r\n groupEventName?: string;\r\n groupId?: unknown;\r\n onOpenChange?: (open: boolean, meta: { reason: CloseReason }) => void;\r\n getFocusTarget?: () => HTMLElement | null;\r\n sideAttr: string;\r\n respectReducedMotion: boolean;\r\n };\r\n\r\n constructor(host: ReactiveControllerHost, options: PopoverControllerOptions) {\r\n this.host = host;\r\n host.addController(this);\r\n\r\n // Initialize getters with fallback values\r\n const dur = options.duration ?? 220;\r\n const closeDur = options.closeDuration ?? Math.min(180, dur);\r\n\r\n this.opts = {\r\n // Required functions\r\n getAnchor: options.getAnchor,\r\n getPopover: options.getPopover,\r\n\r\n // Reactive property getters\r\n getPlacement: PopoverController.createGetter(\r\n options.getPlacement,\r\n options.placement,\r\n \"auto\"\r\n ),\r\n getAlign: PopoverController.createGetter(\r\n options.getAlign,\r\n options.align,\r\n \"start\"\r\n ),\r\n getGap: PopoverController.createGetter(\r\n options.getGap,\r\n options.gap,\r\n 6\r\n ),\r\n getPadding: PopoverController.createGetter(\r\n options.getPadding,\r\n options.padding,\r\n 8\r\n ),\r\n getMatchAnchorWidth: PopoverController.createGetter(\r\n options.getMatchAnchorWidth,\r\n options.matchAnchorWidth,\r\n true\r\n ),\r\n getMaxWidthToViewport: PopoverController.createGetter(\r\n options.getMaxWidthToViewport,\r\n options.maxWidthToViewport,\r\n true\r\n ),\r\n getMaxWidthMode: PopoverController.createGetter(\r\n options.getMaxWidthMode,\r\n options.maxWidthMode,\r\n \"cap\"\r\n ),\r\n getFlip: PopoverController.createGetter(\r\n options.getFlip,\r\n options.flip,\r\n true\r\n ),\r\n getFlipOrder: PopoverController.createGetter(\r\n options.getFlipOrder,\r\n options.flipOrder,\r\n []\r\n ),\r\n getPreset: PopoverController.createGetter(\r\n options.getPreset,\r\n options.preset,\r\n \"slide\"\r\n ),\r\n getDuration: PopoverController.createGetter(\r\n options.getDuration,\r\n options.duration,\r\n dur\r\n ),\r\n getCloseDuration: PopoverController.createGetter(\r\n options.getCloseDuration,\r\n options.closeDuration,\r\n closeDur\r\n ),\r\n getAnimateReposition: PopoverController.createGetter(\r\n options.getAnimateReposition,\r\n options.animateReposition,\r\n true\r\n ),\r\n getRepositionMs: PopoverController.createGetter(\r\n options.getRepositionMs,\r\n options.repositionMs,\r\n 160\r\n ),\r\n getCloseOnEscape: PopoverController.createGetter(\r\n options.getCloseOnEscape,\r\n options.closeOnEscape,\r\n true\r\n ),\r\n getCloseOnOutside: PopoverController.createGetter(\r\n options.getCloseOnOutside,\r\n options.closeOnOutside,\r\n false\r\n ),\r\n\r\n getIgnoreOutsideSelector: PopoverController.createGetter(\r\n options.getIgnoreOutsideSelector,\r\n options.ignoreOutsideSelector,\r\n \"\" // none by default\r\n ),\r\n\r\n getIgnoreOutsideAttr: PopoverController.createGetter(\r\n options.getIgnoreOutsideAttr,\r\n options.ignoreOutsideAttr,\r\n \"data-popover-ignore-outside\"\r\n ),\r\n getRestoreFocusOnClose: PopoverController.createGetter(\r\n options.getRestoreFocusOnClose,\r\n options.restoreFocusOnClose,\r\n true\r\n ),\r\n\r\n // Other options\r\n cssVarLeft: options.cssVarLeft ?? \"--sky-pop-left\",\r\n cssVarTop: options.cssVarTop ?? \"--sky-pop-top\",\r\n cssVarWidth: options.cssVarWidth ?? \"--sky-pop-width\",\r\n focusOnOpen: options.focusOnOpen,\r\n scrollContainer: options.scrollContainer ?? \"auto\",\r\n groupEventName: options.groupEventName,\r\n groupId: options.groupId,\r\n onOpenChange: options.onOpenChange,\r\n getFocusTarget: options.getFocusTarget,\r\n sideAttr: options.sideAttr ?? \"data-side\",\r\n respectReducedMotion: options.respectReducedMotion ?? true,\r\n };\r\n }\r\n\r\n get open() {\r\n return this._open;\r\n }\r\n\r\n get meta() {\r\n return this.lastMeta;\r\n }\r\n\r\n hostConnected() {\r\n if (typeof window === \"undefined\") return;\r\n this.visualViewport = window.visualViewport ?? undefined;\r\n // Defer global listeners and observers until first open (avoids N×listeners with many instances, e.g. combobox in every flow node).\r\n }\r\n\r\n hostDisconnected() {\r\n this.detachGlobalListenersIfAttached();\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n }\r\n\r\n /** Attach window/document listeners and observers. Called on first open. */\r\n private attachGlobalListeners() {\r\n if (typeof window === \"undefined\" || this._listenersAttached) return;\r\n this._listenersAttached = true;\r\n\r\n if (this.visualViewport) {\r\n this.visualViewport.addEventListener(\"resize\", this.onViewportMove, { passive: true });\r\n this.visualViewport.addEventListener(\"scroll\", this.onViewportMove, { passive: true });\r\n }\r\n window.addEventListener(\"resize\", this.onViewportMove, { passive: true });\r\n window.addEventListener(\"scroll\", this.onViewportMove, { passive: true, capture: true });\r\n\r\n if (this.opts.groupEventName) {\r\n window.addEventListener(this.opts.groupEventName, this.onGroupOpen as EventListener);\r\n }\r\n if (this.opts.getCloseOnEscape()) {\r\n window.addEventListener(\"keydown\", this.onKeydown, true);\r\n }\r\n document.addEventListener(\"pointerdown\", this.onDocumentPointerDown, true);\r\n\r\n this.setupObserversAndScrollParents();\r\n }\r\n\r\n /** Remove window/document listeners and observers. Called on close and on hostDisconnected. */\r\n private detachGlobalListenersIfAttached() {\r\n if (!this._listenersAttached) return;\r\n this._listenersAttached = false;\r\n\r\n if (typeof window !== \"undefined\") {\r\n window.removeEventListener(\"resize\", this.onViewportMove);\r\n window.removeEventListener(\"scroll\", this.onViewportMove, true);\r\n if (this.visualViewport) {\r\n this.visualViewport.removeEventListener(\"resize\", this.onViewportMove);\r\n this.visualViewport.removeEventListener(\"scroll\", this.onViewportMove);\r\n }\r\n if (this.opts.groupEventName) {\r\n window.removeEventListener(this.opts.groupEventName, this.onGroupOpen as EventListener);\r\n }\r\n window.removeEventListener(\"keydown\", this.onKeydown, true);\r\n }\r\n document.removeEventListener(\"pointerdown\", this.onDocumentPointerDown, true);\r\n\r\n this.teardownScrollParents();\r\n this.anchorRO?.disconnect();\r\n this.anchorRO = undefined;\r\n this.popoverRO?.disconnect();\r\n this.popoverRO = undefined;\r\n }\r\n\r\n refreshTargets() {\r\n if (this._listenersAttached) this.setupObserversAndScrollParents();\r\n if (this._open) this.position();\r\n }\r\n\r\n /** Wire to popover element: @toggle=${controller.onToggle} */\r\n onToggle = (e: Event) => {\r\n if (this.lastCloseReason === \"light-dismiss\") {\r\n this.lastCloseReason = \"toggle\";\r\n return;\r\n }\r\n const pop = this.opts.getPopover();\r\n const ev = e as any;\r\n\r\n let isOpen: boolean | null = null;\r\n if (typeof ev?.newState === \"string\") isOpen = ev.newState === \"open\";\r\n if (isOpen === null && pop) isOpen = pop.matches?.(\":popover-open\") ?? false;\r\n if (isOpen === null) return;\r\n\r\n if (!isOpen) {\r\n this._open = false;\r\n this.detachGlobalListenersIfAttached();\r\n this.opts.onOpenChange?.(false, { reason: this.lastCloseReason });\r\n if (this.opts.getRestoreFocusOnClose()) this.restoreFocus();\r\n return;\r\n }\r\n\r\n this._open = true;\r\n this.attachGlobalListeners();\r\n this.opts.onOpenChange?.(true, { reason: \"toggle\" });\r\n\r\n this.position();\r\n this.raf = requestAnimationFrame(() => this.opts.focusOnOpen?.());\r\n };\r\n\r\n toggle() {\r\n this._open ? this.closePopover(\"api\") : this.openPopover();\r\n }\r\n\r\n openPopover() {\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n this.raf = 0;\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n\r\n if (typeof window !== \"undefined\" && this.opts.groupEventName) {\r\n window.dispatchEvent(\r\n new CustomEvent(this.opts.groupEventName, {\r\n detail: { id: this.opts.groupId ?? this.host },\r\n }),\r\n );\r\n }\r\n\r\n this.captureFocusBeforeOpen();\r\n this.ensurePopoverMarginZero();\r\n\r\n this._open = true;\r\n this.attachGlobalListeners();\r\n this.opts.onOpenChange?.(true, { reason: \"api\" });\r\n\r\n // Hide until positioned to avoid first-paint flicker.\r\n const prevVisibility = pop.style.visibility;\r\n pop.style.visibility = \"hidden\";\r\n\r\n (pop as any).showPopover?.();\r\n const wasEverOpen = this.hasEverOpened;\r\n this.hasEverOpened = true;\r\n\r\n // later: pass this to position or set a field\r\n this._skipNextReposition = !wasEverOpen;\r\n\r\n // 1) compute and apply css-var position ASAP\r\n this.position();\r\n\r\n // 2) force style/layout flush so left/top vars take effect before animation\r\n pop.getBoundingClientRect();\r\n\r\n // 3) now animate + reveal\r\n const side = this.lastMeta.place;\r\n this.setSideAttr(side);\r\n\r\n // reveal on next frame so hidden state doesn't get captured mid-animation\r\n this.raf = requestAnimationFrame(() => {\r\n pop.style.visibility = prevVisibility || \"visible\";\r\n\r\n this.playPreset(pop, side, \"open\").then(() => this.opts.focusOnOpen?.());\r\n });\r\n }\r\n\r\n private onDocumentPointerDown = (e: PointerEvent) => {\r\n if (!this._open) return;\r\n if (!this.opts.getCloseOnOutside()) return;\r\n\r\n const pop = this.opts.getPopover();\r\n const anchor = this.opts.getAnchor();\r\n if (!pop || !anchor) return;\r\n\r\n // ignore non-primary clicks\r\n if (typeof e.button === \"number\" && e.button !== 0) return;\r\n\r\n const path = (e.composedPath?.() ?? []) as EventTarget[];\r\n\r\n // If click is on anchor or inside popover => not outside\r\n const insidePopover = path.includes(pop);\r\n const insideAnchor = path.includes(anchor);\r\n if (insidePopover || insideAnchor) return;\r\n\r\n // Nested popovers (combobox lists, datepicker calendars, nested menus) live in\r\n // the top layer outside this popover. Treat those clicks as inside nested UI.\r\n for (const node of path) {\r\n if (!(node instanceof Element)) continue;\r\n if (typeof (node as Element).matches === \"function\") {\r\n if ((node as Element).matches(\":popover-open\")) return;\r\n }\r\n const openAncestor = (node as Element).closest?.(\":popover-open\");\r\n if (openAncestor && openAncestor !== pop) return;\r\n }\r\n\r\n // Ignore scrollbar clicks (rare but real)\r\n const x = e.clientX, y = e.clientY;\r\n if (x >= window.innerWidth || y >= window.innerHeight) return;\r\n\r\n // Ignore zones: attr + selector\r\n const ignoreAttr = this.opts.getIgnoreOutsideAttr();\r\n const ignoreSel = (this.opts.getIgnoreOutsideSelector() || \"\").trim();\r\n\r\n for (const node of path) {\r\n if (!(node instanceof HTMLElement)) continue;\r\n\r\n // attr ignore\r\n if (ignoreAttr && node.hasAttribute(ignoreAttr)) return;\r\n\r\n // selector ignore\r\n if (ignoreSel) {\r\n // If any node in the path matches OR is inside an element that matches\r\n if (node.matches(ignoreSel)) return;\r\n if (node.closest(ignoreSel)) return;\r\n }\r\n }\r\n\r\n this.closePopover(\"light-dismiss\");\r\n };\r\n\r\n\r\n\r\n async closePopover(reason: CloseReason = \"api\") {\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n\r\n this.lastCloseReason = reason;\r\n\r\n if (!this._open) {\r\n (pop as any).hidePopover?.();\r\n return;\r\n }\r\n\r\n this._open = false;\r\n // Restore focus before onOpenChange so the host can re-render with aria-hidden=\"true\"\r\n // without violating \"aria-hidden must not hide a focused element\" (focus is already on anchor).\r\n if (this.opts.getRestoreFocusOnClose()) this.restoreFocus();\r\n this.detachGlobalListenersIfAttached();\r\n this.opts.onOpenChange?.(false, { reason });\r\n\r\n const side = this.lastMeta.place;\r\n this.setSideAttr(side);\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n this.raf = 0;\r\n this.moveAnim?.cancel();\r\n await this.playPreset(pop, side, \"close\");\r\n\r\n (pop as any).hidePopover?.();\r\n }\r\n\r\n private normalizeFlipOrder(order?: PopoverSide[]) {\r\n const base: PopoverSide[] = [\"bottom\", \"top\", \"right\", \"left\"];\r\n if (!order || !order.length) return base;\r\n\r\n const valid = new Set<PopoverSide>([\"top\", \"bottom\", \"left\", \"right\"]);\r\n const out: PopoverSide[] = [];\r\n for (const s of order) if (valid.has(s) && !out.includes(s)) out.push(s);\r\n for (const s of base) if (!out.includes(s)) out.push(s);\r\n return out;\r\n }\r\n\r\n private defaultOrderFromPlacement(p: PopoverPlacement): PopoverSide[] {\r\n switch (p) {\r\n case \"top\": return [\"top\", \"bottom\", \"right\", \"left\"];\r\n case \"bottom\": return [\"bottom\", \"top\", \"right\", \"left\"];\r\n case \"left\": return [\"left\", \"right\", \"bottom\", \"top\"];\r\n case \"right\": return [\"right\", \"left\", \"bottom\", \"top\"];\r\n default: return [\"bottom\", \"top\", \"right\", \"left\"];\r\n }\r\n }\r\n\r\n position() {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const anchor = this.opts.getAnchor();\r\n const pop = this.opts.getPopover();\r\n if (!anchor || !pop) return;\r\n\r\n this.ensurePopoverMarginZero();\r\n\r\n const isActuallyVisible =\r\n (pop as any).matches?.(\":popover-open\") && pop.offsetParent !== null;\r\n\r\n const before = (this._open && isActuallyVisible) ? pop.getBoundingClientRect() : null;\r\n\r\n const pad = this.opts.getPadding();\r\n const gap = this.opts.getGap();\r\n\r\n const a = anchor.getBoundingClientRect();\r\n\r\n const vv = window.visualViewport ?? null;\r\n const vw = vv?.width ?? window.innerWidth;\r\n const vh = vv?.height ?? window.innerHeight;\r\n\r\n const offsetX = vv?.offsetLeft ?? 0;\r\n const offsetY = vv?.offsetTop ?? 0;\r\n\r\n if (this.opts.getMaxWidthToViewport()) {\r\n const maxW = Math.max(0, vw - pad * 2);\r\n pop.style.maxWidth = `${maxW}px`;\r\n pop.style.boxSizing = \"border-box\";\r\n }\r\n\r\n const pr = pop.getBoundingClientRect();\r\n const popW = pr.width || 220;\r\n const popH = pr.height || 50;\r\n\r\n const space = {\r\n top: a.top - gap - offsetY,\r\n bottom: vh - (a.bottom - offsetY) - gap,\r\n left: a.left - gap - offsetX,\r\n right: vw - (a.right - offsetX) - gap,\r\n };\r\n\r\n const fits = (side: PopoverSide) => {\r\n if (side === \"top\") return space.top >= popH;\r\n if (side === \"bottom\") return space.bottom >= popH;\r\n if (side === \"left\") return space.left >= popW;\r\n return space.right >= popW;\r\n };\r\n\r\n const requested = this.opts.getPlacement();\r\n const flipEnabled = this.opts.getFlip();\r\n\r\n const baseOrder =\r\n this.opts.getFlipOrder()?.length\r\n ? this.normalizeFlipOrder(this.opts.getFlipOrder())\r\n : this.normalizeFlipOrder(this.defaultOrderFromPlacement(requested));\r\n\r\n let place: PopoverSide;\r\n\r\n if (requested === \"auto\") {\r\n const firstFit = baseOrder.find(fits);\r\n place =\r\n firstFit ??\r\n (baseOrder\r\n .map((s) => [s, space[s]] as const)\r\n .sort((x, y) => y[1] - x[1])[0][0]);\r\n } else if (!flipEnabled) {\r\n place = requested as PopoverSide;\r\n } else {\r\n const req = requested as PopoverSide;\r\n const prioritized = baseOrder.includes(req)\r\n ? [req, ...baseOrder.filter((s) => s !== req)]\r\n : [req, ...baseOrder];\r\n\r\n const firstFit = prioritized.find(fits);\r\n place =\r\n firstFit ??\r\n (prioritized\r\n .map((s) => [s, space[s]] as const)\r\n .sort((x, y) => y[1] - x[1])[0][0]);\r\n }\r\n\r\n let top = 0;\r\n let left = 0;\r\n let arrowAlign: ArrowAlign = \"center\";\r\n\r\n const isRTL = getComputedStyle(anchor).direction === \"rtl\";\r\n let align = this.opts.getAlign();\r\n if (isRTL) {\r\n if (align === \"start\") align = \"end\";\r\n else if (align === \"end\") align = \"start\";\r\n }\r\n\r\n const ax1 = a.left - offsetX;\r\n const ax2 = a.right - offsetX;\r\n const ay1 = a.top - offsetY;\r\n const ay2 = a.bottom - offsetY;\r\n const aw = a.width;\r\n const ah = a.height;\r\n\r\n if (place === \"top\" || place === \"bottom\") {\r\n if (align === \"start\") left = ax1;\r\n else if (align === \"end\") left = ax2 - popW;\r\n else left = ax1 + aw / 2 - popW / 2;\r\n\r\n top = place === \"top\" ? ay1 - popH - gap : ay2 + gap;\r\n\r\n const clampedLeft = Math.max(pad, Math.min(vw - popW - pad, left));\r\n if (clampedLeft !== left) arrowAlign = clampedLeft <= pad + 0.5 ? \"start\" : \"end\";\r\n left = clampedLeft;\r\n\r\n top = Math.max(pad, Math.min(vh - popH - pad, top));\r\n } else {\r\n left = place === \"left\" ? ax1 - popW - gap : ax2 + gap;\r\n top = ay1 + ah / 2 - popH / 2;\r\n\r\n const clampedTop = Math.max(pad, Math.min(vh - popH - pad, top));\r\n if (clampedTop !== top) arrowAlign = clampedTop <= pad + 0.5 ? \"start\" : \"end\";\r\n top = clampedTop;\r\n\r\n left = Math.max(pad, Math.min(vw - popW - pad, left));\r\n }\r\n\r\n left += offsetX;\r\n top += offsetY;\r\n\r\n const hostEl = this.host as unknown as HTMLElement;\r\n\r\n if (this.opts.getMatchAnchorWidth()) {\r\n const maxW = Math.max(0, vw - pad * 2);\r\n const width = Math.min(a.width, maxW);\r\n hostEl.style.setProperty(this.opts.cssVarWidth, `${width}px`);\r\n } else {\r\n hostEl.style.removeProperty(this.opts.cssVarWidth);\r\n }\r\n\r\n hostEl.style.setProperty(this.opts.cssVarLeft, `${left}px`);\r\n hostEl.style.setProperty(this.opts.cssVarTop, `${top}px`);\r\n // Top-layer popovers do not reliably inherit custom props from the host.\r\n pop.style.setProperty(this.opts.cssVarLeft, `${left}px`);\r\n pop.style.setProperty(this.opts.cssVarTop, `${top}px`);\r\n if (this.opts.getMatchAnchorWidth()) {\r\n const width = hostEl.style.getPropertyValue(this.opts.cssVarWidth);\r\n if (width) pop.style.setProperty(this.opts.cssVarWidth, width);\r\n } else {\r\n pop.style.removeProperty(this.opts.cssVarWidth);\r\n }\r\n\r\n const prevPlace = this.lastMeta.place;\r\n this.lastMeta = { place, arrowAlign };\r\n this.setSideAttr(place);\r\n\r\n const canReposition =\r\n this._open &&\r\n this.opts.getAnimateReposition() &&\r\n before &&\r\n !this._skipNextReposition &&\r\n pop.matches?.(\":popover-open\") &&\r\n isActuallyVisible &&\r\n this._phase === \"open\" &&\r\n !this.presetAnim; // extra safety\r\n\r\n if (canReposition) {\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n this.raf = requestAnimationFrame(() => {\r\n const after = pop.getBoundingClientRect();\r\n this.animateMove(pop, before, after);\r\n });\r\n }\r\n\r\n this._skipNextReposition = false;\r\n }\r\n\r\n private vec(side: PopoverSide, v: number) {\r\n if (side === \"top\") return { x: 0, y: +v };\r\n if (side === \"bottom\") return { x: 0, y: -v };\r\n if (side === \"left\") return { x: +v, y: 0 };\r\n return { x: -v, y: 0 };\r\n }\r\n\r\n private prefersReducedMotion() {\r\n if (!this.opts.respectReducedMotion) return false;\r\n return typeof window !== \"undefined\"\r\n && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches;\r\n }\r\n\r\n /** sets transformOrigin according to preset + side */\r\n private computeOrigin(side: PopoverSide, mode: PopoverPresetConfig[\"origin\"]) {\r\n if (mode === \"center\") return \"50% 50%\";\r\n if (mode === \"corner\") {\r\n // corner opposite of side looks best\r\n if (side === \"top\") return \"50% 100%\";\r\n if (side === \"bottom\") return \"50% 0%\";\r\n if (side === \"left\") return \"100% 50%\";\r\n return \"0% 50%\";\r\n }\r\n if (mode === \"anchor\") {\r\n // you can refine this using anchor rect; for now side-based is good\r\n if (side === \"top\") return \"50% 100%\";\r\n if (side === \"bottom\") return \"50% 0%\";\r\n if (side === \"left\") return \"100% 50%\";\r\n return \"0% 50%\";\r\n }\r\n // auto\r\n if (side === \"top\") return \"50% 100%\";\r\n if (side === \"bottom\") return \"50% 0%\";\r\n if (side === \"left\") return \"100% 50%\";\r\n return \"0% 50%\";\r\n }\r\n\r\n private kf(opacity: number, transform: string, filter?: string): Keyframe {\r\n const out: any = { opacity, transform };\r\n if (filter) out.filter = filter;\r\n return out as Keyframe;\r\n }\r\n\r\n // Preset registry\r\n private presetRegistry(): Record<PopoverPreset, PresetDef> {\r\n\r\n const fade: PresetDef = {\r\n name: \"fade\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n easingClose: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n enterDuration: 180, exitDuration: 150,\r\n },\r\n getKeyframes: ({ phase }) =>\r\n phase === \"open\"\r\n ? [{ opacity: 0 }, { opacity: 1 }]\r\n : [{ opacity: 1 }, { opacity: 0 }],\r\n };\r\n\r\n const scale: PresetDef = {\r\n name: \"scale\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.9, exitScale: 0.95,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n easingClose: \"cubic-bezier(0.36, 0, 0.66, -0.56)\",\r\n enterDuration: 200, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, \"scale(1)\")]\r\n : [this.kf(1, \"scale(1)\"), this.kf(0, `scale(${cfg.exitScale})`)],\r\n };\r\n\r\n const slide: PresetDef = {\r\n name: \"slide\",\r\n defaults: {\r\n enterPx: 12, exitPx: 8, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.23, 1, 0.32, 1)\",\r\n easingClose: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n enterDuration: 250, exitDuration: 220,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px, 0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px, 0)`)];\r\n },\r\n };\r\n\r\n const iosMenu: PresetDef = {\r\n name: \"iosMenu\",\r\n defaults: {\r\n enterPx: 12, exitPx: 8, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 6, blurOutPx: 3, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n easingClose: \"cubic-bezier(0.55, 0.085, 0.68, 0.53)\",\r\n enterDuration: 250, exitDuration: 220,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `translate3d(${a.x}px, ${a.y}px, 0) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n this.kf(0, `translate3d(${b.x}px, ${b.y}px, 0) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ];\r\n },\r\n };\r\n\r\n const iosSheet: PresetDef = {\r\n name: \"iosSheet\",\r\n defaults: {\r\n enterPx: 16, exitPx: 12, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.36, 0, 0.66, -0.56)\",\r\n easingClose: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n enterDuration: 200, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`)];\r\n },\r\n };\r\n\r\n const materialMenu: PresetDef = {\r\n name: \"materialMenu\",\r\n defaults: {\r\n enterPx: 10, exitPx: 6, enterScale: 0.96, exitScale: 0.98,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n easingClose: \"cubic-bezier(0.4, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n ]\r\n : [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const materialSheet: PresetDef = {\r\n name: \"materialSheet\",\r\n defaults: {\r\n enterPx: 18, exitPx: 14, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.05, 0.7, 0.1, 1)\",\r\n easingClose: \"cubic-bezier(0.3, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`)];\r\n },\r\n };\r\n\r\n const floaty: PresetDef = {\r\n name: \"floaty\",\r\n defaults: {\r\n enterPx: 14, exitPx: 10, enterScale: 0.985, exitScale: 0.99,\r\n blurInPx: 10, blurOutPx: 6, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\r\n easingClose: \"cubic-bezier(0.55, 0.06, 0.68, 0.19)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ];\r\n },\r\n };\r\n\r\n const soft: PresetDef = {\r\n name: \"soft\",\r\n defaults: {\r\n enterPx: 10, exitPx: 8, enterScale: 0.97, exitScale: 0.98,\r\n blurInPx: 4, blurOutPx: 2, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.33, 1, 0.68, 1)\",\r\n easingClose: \"cubic-bezier(0.32, 0, 0.67, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`), this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`)];\r\n },\r\n };\r\n\r\n const sharp: PresetDef = {\r\n name: \"sharp\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.2, 1)\",\r\n easingClose: \"cubic-bezier(0.4, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`), this.kf(1, \"translate3d(0,0,0) scale(1)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`)];\r\n },\r\n };\r\n\r\n const blurIn: PresetDef = {\r\n name: \"blurIn\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 1, exitScale: 1,\r\n blurInPx: 12, blurOutPx: 8, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n easingClose: \"cubic-bezier(0.33, 0, 0.67, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, \"translate3d(0,0,0)\", `blur(${cfg.blurInPx}px)`), this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\"), this.kf(0, \"translate3d(0,0,0)\", `blur(${cfg.blurOutPx}px)`)],\r\n };\r\n\r\n const blurFade: PresetDef = {\r\n name: \"blurFade\",\r\n defaults: {\r\n enterPx: 10, exitPx: 8, enterScale: 0.99, exitScale: 0.99,\r\n blurInPx: 10, blurOutPx: 6, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.45, 0, 0.55, 1)\",\r\n easingClose: \"cubic-bezier(0.3, 0, 0.7, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`, `blur(${cfg.blurInPx}px)`), this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`, `blur(${cfg.blurOutPx}px)`)];\r\n },\r\n };\r\n\r\n const zoomFromAnchor: PresetDef = {\r\n name: \"zoomFromAnchor\",\r\n defaults: {\r\n enterPx: 6, exitPx: 4, enterScale: 0.92, exitScale: 0.96,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n easingClose: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`), this.kf(1, \"translate3d(0,0,0) scale(1)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`)];\r\n },\r\n };\r\n\r\n const zoomFromCorner: PresetDef = {\r\n name: \"zoomFromCorner\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.88, exitScale: 0.94,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.18, 0.89, 0.32, 1.28)\",\r\n easingClose: \"cubic-bezier(0.6, -0.28, 0.74, 0.05)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, \"scale(1)\")]\r\n : [this.kf(1, \"scale(1)\"), this.kf(0, `scale(${cfg.exitScale})`)],\r\n };\r\n\r\n const flip3d: PresetDef = {\r\n name: \"flip3d\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 14, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n easingClose: \"cubic-bezier(0.33, 0, 0.67, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg, origin }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const axis = (side === \"left\" || side === \"right\") ? \"Y\" : \"X\";\r\n const sign = (side === \"top\" || side === \"left\") ? 1 : -1;\r\n const r = cfg.rotateDeg * sign;\r\n\r\n if (phase === \"open\") {\r\n return [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotate${axis}(${r}deg) scale(${cfg.enterScale})`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`),\r\n ];\r\n }\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v2.x}px, ${v2.y}px, 0) rotate${axis}(${r * 0.7}deg) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const card3d: PresetDef = {\r\n name: \"card3d\",\r\n defaults: {\r\n enterPx: 10, exitPx: 8, enterScale: 0.96, exitScale: 0.98,\r\n blurInPx: 6, blurOutPx: 3, perspectivePx: 1000,\r\n rotateDeg: 10, tiltDeg: 10, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n easingClose: \"cubic-bezier(0.55, 0.085, 0.68, 0.53)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const axis = (side === \"left\" || side === \"right\") ? \"Y\" : \"X\";\r\n const sign = (side === \"top\" || side === \"left\") ? 1 : -1;\r\n const t = cfg.tiltDeg * sign;\r\n\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotate${axis}(${t}deg) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`, \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`, \"blur(0px)\"),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${this.vec(side, cfg.exitPx).x}px, ${this.vec(side, cfg.exitPx).y}px, 0) rotate${axis}(${t * 0.7}deg) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ];\r\n },\r\n };\r\n\r\n const tilt3d: PresetDef = {\r\n name: \"tilt3d\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 12, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.23, 1, 0.32, 1)\",\r\n easingClose: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const rx = (side === \"top\" ? cfg.tiltDeg : side === \"bottom\" ? -cfg.tiltDeg : 0);\r\n const ry = (side === \"left\" ? cfg.tiltDeg : side === \"right\" ? -cfg.tiltDeg : 0);\r\n\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotateX(${rx}deg) rotateY(${ry}deg) scale(${cfg.enterScale})`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateX(0deg) rotateY(0deg) scale(1)`),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateX(0deg) rotateY(0deg) scale(1)`),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${this.vec(side, cfg.exitPx).x}px, ${this.vec(side, cfg.exitPx).y}px, 0) rotateX(${rx * 0.6}deg) rotateY(${ry * 0.6}deg) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const depth3d: PresetDef = {\r\n name: \"depth3d\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.9, exitScale: 0.94,\r\n blurInPx: 8, blurOutPx: 5, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\r\n easingClose: \"cubic-bezier(0.55, 0.06, 0.68, 0.19)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(0,0,-40px) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) scale(1)`, \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) scale(1)`, \"blur(0px)\"),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(0,0,-30px) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ],\r\n };\r\n\r\n const rotate3d: PresetDef = {\r\n name: \"rotate3d\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 12, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.36, 0, 0.66, -0.56)\",\r\n easingClose: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const sign = (side === \"top\" || side === \"left\") ? 1 : -1;\r\n const r = cfg.rotateDeg * sign;\r\n\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotateZ(${r}deg) scale(${cfg.enterScale})`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateZ(0deg) scale(1)`),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateZ(0deg) scale(1)`),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${this.vec(side, cfg.exitPx).x}px, ${this.vec(side, cfg.exitPx).y}px, 0) rotateZ(${r * 0.7}deg) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const springy: PresetDef = {\r\n name: \"springy\",\r\n defaults: {\r\n enterPx: 12, exitPx: 8, enterScale: 0.94, exitScale: 0.98,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.18, 1.15)\",\r\n easingClose: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n if (phase === \"open\") {\r\n return [\r\n this.kf(0, `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`),\r\n this.kf(1, `translate3d(0,0,0) scale(1.02)`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n ];\r\n }\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const bouncy: PresetDef = {\r\n name: \"bouncy\",\r\n defaults: {\r\n enterPx: 14, exitPx: 10, enterScale: 0.9, exitScale: 0.96,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.18, 1.15)\",\r\n easingClose: \"cubic-bezier(0.6, -0.28, 0.74, 0.05)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n if (phase === \"open\") {\r\n return [\r\n this.kf(0, `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1.03)\"),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n ];\r\n }\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const glide: PresetDef = {\r\n name: \"glide\",\r\n defaults: {\r\n enterPx: 18, exitPx: 12, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.08, 0.82, 0.17, 1)\",\r\n easingClose: \"cubic-bezier(0.3, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 200,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${v.x}px, ${v.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0)`)];\r\n },\r\n };\r\n\r\n const pop: PresetDef = {\r\n name: \"pop\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.85, exitScale: 0.95,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.18, 0.89, 0.32, 1.28)\",\r\n easingClose: \"cubic-bezier(0.6, -0.28, 0.74, 0.05)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, \"scale(1.03)\"), this.kf(1, \"scale(1)\")]\r\n : [this.kf(1, \"scale(1)\"), this.kf(0, `scale(${cfg.exitScale})`)],\r\n };\r\n\r\n const drop: PresetDef = {\r\n name: \"drop\",\r\n defaults: {\r\n enterPx: 22, exitPx: 14, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.18, 1)\",\r\n easingClose: \"cubic-bezier(0.45, 0, 0.55, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${v.x}px, ${v.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0)`)];\r\n },\r\n };\r\n\r\n const grow: PresetDef = {\r\n name: \"grow\",\r\n defaults: {\r\n enterPx: 6, exitPx: 4, enterScale: 0.95, exitScale: 0.98,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n easingClose: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`), this.kf(1, \"translate3d(0,0,0) scale(1)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\"), this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`)];\r\n },\r\n };\r\n\r\n const none: PresetDef = {\r\n name: \"none\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.16, 1, 0.3, 1)\",\r\n easingClose: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: () => [{ opacity: 1 }],\r\n };\r\n\r\n const floatAlias = floaty;\r\n\r\n return {\r\n none,\r\n fade,\r\n scale,\r\n slide,\r\n iosMenu,\r\n iosSheet,\r\n materialMenu,\r\n materialSheet,\r\n floaty: floatAlias,\r\n soft,\r\n sharp,\r\n blurIn,\r\n blurFade,\r\n zoomFromAnchor,\r\n zoomFromCorner,\r\n flip3d,\r\n card3d,\r\n tilt3d,\r\n depth3d,\r\n rotate3d,\r\n springy,\r\n bouncy,\r\n glide,\r\n pop,\r\n drop,\r\n grow,\r\n };\r\n }\r\n\r\n // Update the getPresetKeyframes method:\r\n private getPresetKeyframes(\r\n preset: PopoverPreset,\r\n side: PopoverSide,\r\n phase: \"open\" | \"close\",\r\n overrides?: PopoverPresetConfig,\r\n ) {\r\n const reg = this.presetRegistry();\r\n const def = reg[preset] ?? reg.iosMenu;\r\n\r\n // Merge base defaults with preset defaults, then with overrides\r\n const baseDefaults = this.getBaseDefaults();\r\n const cfg = {\r\n\r\n ...def.defaults,\r\n ...(overrides ?? {})\r\n } as Required<PopoverPresetConfig>;\r\n\r\n const origin = this.computeOrigin(side, cfg.origin);\r\n\r\n return {\r\n keyframes: def.getKeyframes({ side, phase, cfg, origin }),\r\n cfg,\r\n origin\r\n };\r\n }\r\n\r\n // Add this helper method for base defaults:\r\n private getBaseDefaults(): Required<PopoverPresetConfig> {\r\n return {\r\n enterPx: 12,\r\n exitPx: 8,\r\n enterScale: 0.98,\r\n exitScale: 0.99,\r\n blurInPx: 6,\r\n blurOutPx: 3,\r\n perspectivePx: 900,\r\n rotateDeg: 10,\r\n tiltDeg: 8,\r\n origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.16, 1, 0.3, 1)\",\r\n easingClose: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n enterDuration: 220,\r\n exitDuration: 180,\r\n };\r\n }\r\n\r\n private async playPreset(pop: HTMLElement, side: PopoverSide, phase: \"open\" | \"close\") {\r\n this.checkForConflictingCSS(pop);\r\n if (this.prefersReducedMotion()) return;\r\n\r\n const preset = this.opts.getPreset();\r\n if (preset === \"none\") return;\r\n\r\n // cancel transform-related animations\r\n this.moveAnim?.cancel();\r\n this.presetAnim?.cancel();\r\n\r\n this._phase = phase === \"open\" ? \"opening\" : \"closing\";\r\n\r\n pop.style.transition = \"none\";\r\n\r\n\r\n // Get keyframes and config for the current preset\r\n const { keyframes, cfg, origin } = this.getPresetKeyframes(preset, side, phase);\r\n\r\n // Use duration from config, fallback to controller options\r\n const duration = phase === \"open\" ? cfg.enterDuration : cfg.exitDuration;\r\n\r\n const is3d = this.is3dPreset(preset);\r\n if (is3d) {\r\n pop.style.transformStyle = \"preserve-3d\";\r\n pop.style.backfaceVisibility = \"hidden\";\r\n // Perspective lives in the transform; do not set it here.\r\n } else {\r\n pop.style.transformStyle = \"\";\r\n pop.style.backfaceVisibility = \"\";\r\n }\r\n pop.style.transformOrigin = origin;\r\n\r\n const easing = phase === \"open\" ? cfg.easingOpen : cfg.easingClose;\r\n\r\n const anim = pop.animate(keyframes as any, {\r\n duration,\r\n easing,\r\n fill: \"both\",\r\n });\r\n\r\n this.presetAnim = anim;\r\n\r\n try {\r\n await anim.finished;\r\n } catch {\r\n // cancelled is fine\r\n } finally {\r\n if (this.presetAnim === anim) this.presetAnim = undefined;\r\n pop.style.transition = \"\";\r\n if (is3d) {\r\n pop.style.transformStyle = \"\";\r\n pop.style.backfaceVisibility = \"\";\r\n }\r\n\r\n this._phase = phase === \"open\" ? \"open\" : \"idle\";\r\n }\r\n }\r\n\r\n private checkForConflictingCSS(pop: HTMLElement) {\r\n const transitions = pop.style.transition || \"\";\r\n\r\n // Check for conflicting CSS transitions\r\n if (transitions.includes(\"transform\") && transitions.includes(\"opacity\")) {\r\n console.warn(\r\n \"Warning: Using 3D animation (WAAPI) alongside CSS transitions on 'transform' or 'opacity' can cause conflicts. Consider removing CSS transitions on these properties.\"\r\n );\r\n }\r\n\r\n if (transitions.includes(\"margin\") || transitions.includes(\"padding\")) {\r\n console.warn(\r\n \"Warning: Animating 'margin' or 'padding' alongside 3D animation (WAAPI) may cause visual glitches. Please avoid transitioning these properties during WAAPI animations.\"\r\n );\r\n }\r\n }\r\n\r\n private animateMove(pop: HTMLElement, from: DOMRect, to: DOMRect) {\r\n if (this._phase !== \"open\") return;\r\n\r\n const dx = from.left - to.left;\r\n const dy = from.top - to.top;\r\n if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) return;\r\n\r\n this.moveAnim?.cancel();\r\n\r\n const duration = this.opts.getRepositionMs();\r\n\r\n const anim = pop.animate(\r\n [\r\n { transform: `translate3d(${dx}px, ${dy}px, 0)` },\r\n { transform: \"translate3d(0, 0, 0)\" },\r\n ],\r\n {\r\n duration,\r\n easing: \"cubic-bezier(0.16, 1, 0.3, 1)\",\r\n fill: \"both\",\r\n },\r\n );\r\n\r\n this.moveAnim = anim;\r\n anim.finished.finally(() => {\r\n if (this.moveAnim === anim) this.moveAnim = undefined;\r\n });\r\n }\r\n\r\n private is3dPreset(preset: PopoverPreset) {\r\n return (\r\n preset === \"flip3d\" ||\r\n preset === \"card3d\" ||\r\n preset === \"tilt3d\" ||\r\n preset === \"depth3d\" ||\r\n preset === \"rotate3d\"\r\n );\r\n }\r\n\r\n private setSideAttr(side: PopoverSide) {\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n pop.setAttribute(this.opts.sideAttr, side);\r\n }\r\n\r\n private setupObserversAndScrollParents() {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const anchor = this.opts.getAnchor();\r\n const pop = this.opts.getPopover();\r\n\r\n if (anchor && \"ResizeObserver\" in window) {\r\n this.anchorRO?.disconnect();\r\n this.anchorRO = new ResizeObserver(() => {\r\n if (this._open) this.position();\r\n });\r\n this.anchorRO.observe(anchor);\r\n }\r\n\r\n if (pop && \"ResizeObserver\" in window) {\r\n this.popoverRO?.disconnect();\r\n this.popoverRO = new ResizeObserver(() => {\r\n if (this._open) this.position();\r\n });\r\n this.popoverRO.observe(pop);\r\n }\r\n\r\n this.teardownScrollParents();\r\n\r\n const mode = this.opts.scrollContainer;\r\n if (mode === \"window\") return;\r\n\r\n if (mode instanceof HTMLElement) {\r\n this.bindScroll(mode);\r\n return;\r\n }\r\n\r\n if (anchor) {\r\n for (const p of this.getScrollParents(anchor)) this.bindScroll(p);\r\n }\r\n }\r\n\r\n private bindScroll(el: HTMLElement) {\r\n const fn = this.onViewportMove as EventListener;\r\n el.addEventListener(\"scroll\", fn, { passive: true });\r\n this.boundScrollParents.push({ el, fn });\r\n }\r\n\r\n private teardownScrollParents() {\r\n for (const { el, fn } of this.boundScrollParents) {\r\n (el as any).removeEventListener?.(\"scroll\", fn);\r\n }\r\n this.boundScrollParents = [];\r\n }\r\n\r\n private getScrollParents(node: HTMLElement): HTMLElement[] {\r\n const parents: HTMLElement[] = [];\r\n let el: HTMLElement | null = node.parentElement;\r\n\r\n while (el && el !== document.body) {\r\n const style = getComputedStyle(el);\r\n const overflowY = style.overflowY;\r\n const overflowX = style.overflowX;\r\n\r\n const canScrollY =\r\n (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") &&\r\n el.scrollHeight > el.clientHeight;\r\n\r\n const canScrollX =\r\n (overflowX === \"auto\" || overflowX === \"scroll\" || overflowX === \"overlay\") &&\r\n el.scrollWidth > el.clientWidth;\r\n\r\n if (canScrollY || canScrollX) parents.push(el);\r\n el = el.parentElement;\r\n }\r\n\r\n return parents;\r\n }\r\n\r\n private onViewportMove = () => {\r\n if (this._open) this.position();\r\n };\r\n\r\n private onKeydown = (e: KeyboardEvent) => {\r\n if (!this._open) return;\r\n if (e.key !== \"Escape\") return;\r\n\r\n if (!this.opts.getCloseOnEscape()) return;\r\n\r\n const pop = this.opts.getPopover();\r\n const anchor = this.opts.getAnchor();\r\n const active = document.activeElement;\r\n\r\n const withinPopover = !!(pop && active && pop.contains(active));\r\n const onAnchor = !!(anchor && active && anchor.contains(active));\r\n\r\n if (withinPopover || onAnchor) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.closePopover(\"escape\");\r\n }\r\n };\r\n\r\n private onGroupOpen = (e: CustomEvent) => {\r\n const other = e.detail?.id;\r\n const mine = this.opts.groupId ?? this.host;\r\n\r\n if (other !== mine && this._open) {\r\n this.closePopover(\"group\");\r\n }\r\n };\r\n\r\n private captureFocusBeforeOpen() {\r\n this.lastFocusedEl = document.activeElement;\r\n }\r\n\r\n private elementIsTriggerRelated(el: EventTarget | null | undefined): boolean {\r\n if (!(el instanceof HTMLElement)) return false;\r\n\r\n const anchor = this.opts.getAnchor();\r\n const focusTarget = this.opts.getFocusTarget?.() ?? null;\r\n\r\n if (focusTarget && (el === focusTarget || focusTarget.contains(el))) {\r\n return true;\r\n }\r\n if (!anchor) return false;\r\n if (el === anchor || anchor.contains(el)) return true;\r\n if (anchor.shadowRoot?.contains(el)) return true;\r\n return false;\r\n }\r\n\r\n private restoreFocus() {\r\n if (!this.opts.getRestoreFocusOnClose()) return;\r\n\r\n const anchor = this.opts.getAnchor();\r\n if (!anchor) return;\r\n\r\n const focusTarget = this.opts.getFocusTarget?.() ?? anchor;\r\n const active = document.activeElement;\r\n const last = this.lastFocusedEl;\r\n const pop = this.opts.getPopover();\r\n\r\n const lastWasInsidePopover = !!(pop && last && pop.contains(last));\r\n const lastWasInsideTrigger = this.elementIsTriggerRelated(last);\r\n const activeInsidePopover = !!(pop && active && pop.contains(active));\r\n\r\n if (activeInsidePopover || lastWasInsidePopover || lastWasInsideTrigger) {\r\n focusTarget.focus?.({ preventScroll: true });\r\n }\r\n }\r\n\r\n private ensurePopoverMarginZero() {\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n if (!pop.style.margin) pop.style.margin = \"0\";\r\n }\r\n\r\n /**\r\n * Utility method to manually update a specific option\r\n * (Useful for edge cases where you need direct control)\r\n */\r\n updateOption<T extends keyof typeof this.opts>(\r\n key: T,\r\n value: typeof this.opts[T]\r\n ) {\r\n if (typeof value === \"function\") {\r\n // For getters, replace the function\r\n (this.opts as any)[key] = value;\r\n } else {\r\n // For other values, wrap in a getter\r\n (this.opts as any)[key] = () => value;\r\n }\r\n\r\n if (this._open && key.startsWith(\"get\")) {\r\n // Reposition if open and a positioning property changed\r\n this.position();\r\n }\r\n }\r\n}"],"names":["PopoverController","constructor","host","options","this","_open","raf","boundScrollParents","_listenersAttached","lastCloseReason","lastFocusedEl","hasEverOpened","_skipNextReposition","lastMeta","place","arrowAlign","_phase","onToggle","e","pop","opts","getPopover","ev","isOpen","newState","matches","detachGlobalListenersIfAttached","onOpenChange","reason","getRestoreFocusOnClose","restoreFocus","attachGlobalListeners","position","requestAnimationFrame","focusOnOpen","onDocumentPointerDown","getCloseOnOutside","anchor","getAnchor","button","path","composedPath","insidePopover","includes","insideAnchor","node","Element","openAncestor","closest","x","clientX","y","clientY","window","innerWidth","innerHeight","ignoreAttr","getIgnoreOutsideAttr","ignoreSel","getIgnoreOutsideSelector","trim","HTMLElement","hasAttribute","closePopover","onViewportMove","onKeydown","key","getCloseOnEscape","active","document","activeElement","withinPopover","contains","onAnchor","preventDefault","stopPropagation","onGroupOpen","other","detail","id","groupId","addController","dur","duration","closeDur","closeDuration","Math","min","getPlacement","createGetter","placement","getAlign","align","getGap","gap","getPadding","padding","getMatchAnchorWidth","matchAnchorWidth","getMaxWidthToViewport","maxWidthToViewport","getMaxWidthMode","maxWidthMode","getFlip","flip","getFlipOrder","flipOrder","getPreset","preset","getDuration","getCloseDuration","getAnimateReposition","animateReposition","getRepositionMs","repositionMs","closeOnEscape","closeOnOutside","ignoreOutsideSelector","ignoreOutsideAttr","restoreFocusOnClose","cssVarLeft","cssVarTop","cssVarWidth","scrollContainer","groupEventName","getFocusTarget","sideAttr","respectReducedMotion","getter","staticValue","defaultValue","open","meta","hostConnected","visualViewport","hostDisconnected","cancelAnimationFrame","addEventListener","passive","capture","setupObserversAndScrollParents","removeEventListener","teardownScrollParents","anchorRO","disconnect","popoverRO","refreshTargets","toggle","openPopover","dispatchEvent","CustomEvent","captureFocusBeforeOpen","ensurePopoverMarginZero","prevVisibility","style","visibility","showPopover","wasEverOpen","getBoundingClientRect","side","setSideAttr","playPreset","then","hidePopover","moveAnim","cancel","normalizeFlipOrder","order","base","length","valid","Set","out","s","has","push","defaultOrderFromPlacement","p","isActuallyVisible","offsetParent","before","pad","a","vv","vw","width","vh","height","offsetX","offsetLeft","offsetY","offsetTop","maxW","max","maxWidth","boxSizing","pr","popW","popH","space","top","bottom","left","right","fits","requested","flipEnabled","baseOrder","find","map","sort","req","prioritized","filter","isRTL","getComputedStyle","direction","ax1","ax2","ay1","ay2","aw","ah","clampedLeft","clampedTop","hostEl","setProperty","removeProperty","getPropertyValue","presetAnim","after","animateMove","vec","v","prefersReducedMotion","matchMedia","computeOrigin","mode","kf","opacity","transform","presetRegistry","none","name","defaults","enterPx","exitPx","enterScale","exitScale","blurInPx","blurOutPx","perspectivePx","rotateDeg","tiltDeg","origin","easingOpen","easingClose","enterDuration","exitDuration","getKeyframes","fade","phase","scale","cfg","slide","b","iosMenu","iosSheet","materialMenu","materialSheet","floaty","soft","sharp","blurIn","blurFade","zoomFromAnchor","zoomFromCorner","flip3d","axis","sign","r","v2","card3d","t","tilt3d","rx","ry","depth3d","rotate3d","springy","bouncy","glide","drop","grow","getPresetKeyframes","overrides","reg","def","getBaseDefaults","keyframes","checkForConflictingCSS","transition","is3d","is3dPreset","transformStyle","backfaceVisibility","transformOrigin","easing","anim","animate","fill","finished","transitions","console","warn","from","to","dx","dy","abs","finally","setAttribute","ResizeObserver","observe","bindScroll","getScrollParents","el","fn","parents","parentElement","body","overflowY","overflowX","canScrollY","scrollHeight","clientHeight","canScrollX","scrollWidth","clientWidth","elementIsTriggerRelated","focusTarget","shadowRoot","last","lastWasInsidePopover","lastWasInsideTrigger","focus","preventScroll","margin","updateOption","value","startsWith"],"mappings":"AAoJO,MAAMA,EA8EX,WAAAC,CAAYC,EAA8BC,GA5E1CC,KAAQC,OAAQ,EAEhBD,KAAQE,IAAM,EAKdF,KAAQG,mBAAoE,GAG5EH,KAAQI,oBAAqB,EAE7BJ,KAAQK,gBAA+B,SACvCL,KAAQM,cAAgC,KAExCN,KAAQO,eAAgB,EACxBP,KAAQQ,qBAAsB,EAE9BR,KAAQS,SAA2D,CACjEC,MAAO,SACPC,WAAY,UAGdX,KAAQY,OAAkD,OA8P1DZ,KAAAa,SAAYC,IACV,GAA6B,kBAAzBd,KAAKK,gBAEP,YADAL,KAAKK,gBAAkB,UAGzB,MAAMU,EAAMf,KAAKgB,KAAKC,aAChBC,EAAKJ,EAEX,IAAIK,EAAyB,KAG7B,GAF4B,iBAAjBD,GAAIE,WAAuBD,EAAyB,SAAhBD,EAAGE,UACnC,OAAXD,GAAmBJ,MAAcA,EAAIM,UAAU,mBAAoB,GACxD,OAAXF,EAAJ,CAEA,IAAKA,EAKH,OAJAnB,KAAKC,OAAQ,EACbD,KAAKsB,kCACLtB,KAAKgB,KAAKO,gBAAe,EAAO,CAAEC,OAAQxB,KAAKK,uBAC3CL,KAAKgB,KAAKS,+BAA+BC,gBAI/C1B,KAAKC,OAAQ,EACbD,KAAK2B,wBACL3B,KAAKgB,KAAKO,gBAAe,EAAM,CAAEC,OAAQ,WAEzCxB,KAAK4B,WACL5B,KAAKE,IAAM2B,sBAAsB,IAAM7B,KAAKgB,KAAKc,gBAf5B,GAwEvB9B,KAAQ+B,sBAAyBjB,IAC/B,IAAKd,KAAKC,MAAO,OACjB,IAAKD,KAAKgB,KAAKgB,oBAAqB,OAEpC,MAAMjB,EAAMf,KAAKgB,KAAKC,aAChBgB,EAASjC,KAAKgB,KAAKkB,YACzB,IAAKnB,IAAQkB,EAAQ,OAGrB,GAAwB,iBAAbnB,EAAEqB,QAAoC,IAAbrB,EAAEqB,OAAc,OAEpD,MAAMC,EAAQtB,EAAEuB,kBAAoB,GAG9BC,EAAgBF,EAAKG,SAASxB,GAC9ByB,EAAeJ,EAAKG,SAASN,GACnC,GAAIK,GAAiBE,EAAc,OAInC,IAAA,MAAWC,KAAQL,EAAM,CACvB,KAAMK,aAAgBC,SAAU,SAChC,GAAyC,mBAA7BD,EAAiBpB,SACtBoB,EAAiBpB,QAAQ,iBAAkB,OAElD,MAAMsB,EAAgBF,EAAiBG,UAAU,iBACjD,GAAID,GAAgBA,IAAiB5B,EAAK,MAC5C,CAGA,MAAM8B,EAAI/B,EAAEgC,QAASC,EAAIjC,EAAEkC,QAC3B,GAAIH,GAAKI,OAAOC,YAAcH,GAAKE,OAAOE,YAAa,OAGvD,MAAMC,EAAapD,KAAKgB,KAAKqC,uBACvBC,GAAatD,KAAKgB,KAAKuC,4BAA8B,IAAIC,OAE/D,IAAA,MAAWf,KAAQL,EACjB,GAAMK,aAAgBgB,YAAtB,CAGA,GAAIL,GAAcX,EAAKiB,aAAaN,GAAa,OAGjD,GAAIE,EAAW,CAEb,GAAIb,EAAKpB,QAAQiC,GAAY,OAC7B,GAAIb,EAAKG,QAAQU,GAAY,MAC/B,CAVoC,CAatCtD,KAAK2D,aAAa,kBAskCpB3D,KAAQ4D,eAAiB,KACnB5D,KAAKC,OAAOD,KAAK4B,YAGvB5B,KAAQ6D,UAAa/C,IACnB,IAAKd,KAAKC,MAAO,OACjB,GAAc,WAAVa,EAAEgD,IAAkB,OAExB,IAAK9D,KAAKgB,KAAK+C,mBAAoB,OAEnC,MAAMhD,EAAMf,KAAKgB,KAAKC,aAChBgB,EAASjC,KAAKgB,KAAKkB,YACnB8B,EAASC,SAASC,cAElBC,KAAmBpD,GAAOiD,GAAUjD,EAAIqD,SAASJ,IACjDK,KAAcpC,GAAU+B,GAAU/B,EAAOmC,SAASJ,KAEpDG,GAAiBE,KACnBvD,EAAEwD,iBACFxD,EAAEyD,kBACFvE,KAAK2D,aAAa,YAItB3D,KAAQwE,YAAe1D,IACrB,MAAM2D,EAAQ3D,EAAE4D,QAAQC,GAGpBF,KAFSzE,KAAKgB,KAAK4D,SAAW5E,KAAKF,OAEjBE,KAAKC,OACzBD,KAAK2D,aAAa,UAj7CpB3D,KAAKF,KAAOA,EACZA,EAAK+E,cAAc7E,MAGnB,MAAM8E,EAAM/E,EAAQgF,UAAY,IAC1BC,EAAWjF,EAAQkF,eAAiBC,KAAKC,IAAI,IAAKL,GAExD9E,KAAKgB,KAAO,CAEVkB,UAAWnC,EAAQmC,UACnBjB,WAAYlB,EAAQkB,WAGpBmE,aAAcxF,EAAkByF,aAC9BtF,EAAQqF,aACRrF,EAAQuF,UACR,QAEFC,SAAU3F,EAAkByF,aAC1BtF,EAAQwF,SACRxF,EAAQyF,MACR,SAEFC,OAAQ7F,EAAkByF,aACxBtF,EAAQ0F,OACR1F,EAAQ2F,IACR,GAEFC,WAAY/F,EAAkByF,aAC5BtF,EAAQ4F,WACR5F,EAAQ6F,QACR,GAEFC,oBAAqBjG,EAAkByF,aACrCtF,EAAQ8F,oBACR9F,EAAQ+F,kBACR,GAEFC,sBAAuBnG,EAAkByF,aACvCtF,EAAQgG,sBACRhG,EAAQiG,oBACR,GAEFC,gBAAiBrG,EAAkByF,aACjCtF,EAAQkG,gBACRlG,EAAQmG,aACR,OAEFC,QAASvG,EAAkByF,aACzBtF,EAAQoG,QACRpG,EAAQqG,MACR,GAEFC,aAAczG,EAAkByF,aAC9BtF,EAAQsG,aACRtG,EAAQuG,UACR,IAEFC,UAAW3G,EAAkByF,aAC3BtF,EAAQwG,UACRxG,EAAQyG,OACR,SAEFC,YAAa7G,EAAkByF,aAC7BtF,EAAQ0G,YACR1G,EAAQgF,SACRD,GAEF4B,iBAAkB9G,EAAkByF,aAClCtF,EAAQ2G,iBACR3G,EAAQkF,cACRD,GAEF2B,qBAAsB/G,EAAkByF,aACtCtF,EAAQ4G,qBACR5G,EAAQ6G,mBACR,GAEFC,gBAAiBjH,EAAkByF,aACjCtF,EAAQ8G,gBACR9G,EAAQ+G,aACR,KAEF/C,iBAAkBnE,EAAkByF,aAClCtF,EAAQgE,iBACRhE,EAAQgH,eACR,GAEF/E,kBAAmBpC,EAAkByF,aACnCtF,EAAQiC,kBACRjC,EAAQiH,gBACR,GAGFzD,yBAA0B3D,EAAkByF,aAC1CtF,EAAQwD,yBACRxD,EAAQkH,sBACR,IAGF5D,qBAAsBzD,EAAkByF,aACtCtF,EAAQsD,qBACRtD,EAAQmH,kBACR,+BAEFzF,uBAAwB7B,EAAkByF,aACxCtF,EAAQ0B,uBACR1B,EAAQoH,qBACR,GAIFC,WAAYrH,EAAQqH,YAAc,iBAClCC,UAAWtH,EAAQsH,WAAa,gBAChCC,YAAavH,EAAQuH,aAAe,kBACpCxF,YAAa/B,EAAQ+B,YACrByF,gBAAiBxH,EAAQwH,iBAAmB,OAC5CC,eAAgBzH,EAAQyH,eACxB5C,QAAS7E,EAAQ6E,QACjBrD,aAAcxB,EAAQwB,aACtBkG,eAAgB1H,EAAQ0H,eACxBC,SAAU3H,EAAQ2H,UAAY,YAC9BC,qBAAsB5H,EAAQ4H,uBAAwB,EAE1D,CA7KA,mBAAetC,CACbuC,EACAC,EACAC,GAEA,OAAOF,GAAA,KAAiBC,GAAeC,EACzC,CAyKA,QAAIC,GACF,OAAO/H,KAAKC,KACd,CAEA,QAAI+H,GACF,OAAOhI,KAAKS,QACd,CAEA,aAAAwH,GACwB,oBAAXhF,SACXjD,KAAKkI,eAAiBjF,OAAOiF,qBAAkB,EAEjD,CAEA,gBAAAC,GACEnI,KAAKsB,kCACDtB,KAAKE,KAAKkI,qBAAqBpI,KAAKE,IAC1C,CAGQ,qBAAAyB,GACgB,oBAAXsB,QAA0BjD,KAAKI,qBAC1CJ,KAAKI,oBAAqB,EAEtBJ,KAAKkI,iBACPlI,KAAKkI,eAAeG,iBAAiB,SAAUrI,KAAK4D,eAAgB,CAAE0E,SAAS,IAC/EtI,KAAKkI,eAAeG,iBAAiB,SAAUrI,KAAK4D,eAAgB,CAAE0E,SAAS,KAEjFrF,OAAOoF,iBAAiB,SAAUrI,KAAK4D,eAAgB,CAAE0E,SAAS,IAClErF,OAAOoF,iBAAiB,SAAUrI,KAAK4D,eAAgB,CAAE0E,SAAS,EAAMC,SAAS,IAE7EvI,KAAKgB,KAAKwG,gBACZvE,OAAOoF,iBAAiBrI,KAAKgB,KAAKwG,eAAgBxH,KAAKwE,aAErDxE,KAAKgB,KAAK+C,oBACZd,OAAOoF,iBAAiB,UAAWrI,KAAK6D,WAAW,GAErDI,SAASoE,iBAAiB,cAAerI,KAAK+B,uBAAuB,GAErE/B,KAAKwI,iCACP,CAGQ,+BAAAlH,GACDtB,KAAKI,qBACVJ,KAAKI,oBAAqB,EAEJ,oBAAX6C,SACTA,OAAOwF,oBAAoB,SAAUzI,KAAK4D,gBAC1CX,OAAOwF,oBAAoB,SAAUzI,KAAK4D,gBAAgB,GACtD5D,KAAKkI,iBACPlI,KAAKkI,eAAeO,oBAAoB,SAAUzI,KAAK4D,gBACvD5D,KAAKkI,eAAeO,oBAAoB,SAAUzI,KAAK4D,iBAErD5D,KAAKgB,KAAKwG,gBACZvE,OAAOwF,oBAAoBzI,KAAKgB,KAAKwG,eAAgBxH,KAAKwE,aAE5DvB,OAAOwF,oBAAoB,UAAWzI,KAAK6D,WAAW,IAExDI,SAASwE,oBAAoB,cAAezI,KAAK+B,uBAAuB,GAExE/B,KAAK0I,wBACL1I,KAAK2I,UAAUC,aACf5I,KAAK2I,cAAW,EAChB3I,KAAK6I,WAAWD,aAChB5I,KAAK6I,eAAY,EACnB,CAEA,cAAAC,GACM9I,KAAKI,oBAAoBJ,KAAKwI,iCAC9BxI,KAAKC,OAAOD,KAAK4B,UACvB,CAgCA,MAAAmH,GACE/I,KAAKC,MAAQD,KAAK2D,aAAa,OAAS3D,KAAKgJ,aAC/C,CAEA,WAAAA,GACMhJ,KAAKE,KAAKkI,qBAAqBpI,KAAKE,KACxCF,KAAKE,IAAM,EACX,MAAMa,EAAMf,KAAKgB,KAAKC,aACtB,IAAKF,EAAK,OAEY,oBAAXkC,QAA0BjD,KAAKgB,KAAKwG,gBAC7CvE,OAAOgG,cACL,IAAIC,YAAYlJ,KAAKgB,KAAKwG,eAAgB,CACxC9C,OAAQ,CAAEC,GAAI3E,KAAKgB,KAAK4D,SAAW5E,KAAKF,SAK9CE,KAAKmJ,yBACLnJ,KAAKoJ,0BAELpJ,KAAKC,OAAQ,EACbD,KAAK2B,wBACL3B,KAAKgB,KAAKO,gBAAe,EAAM,CAAEC,OAAQ,QAGzC,MAAM6H,EAAiBtI,EAAIuI,MAAMC,WACjCxI,EAAIuI,MAAMC,WAAa,SAEtBxI,EAAYyI,gBACb,MAAMC,EAAczJ,KAAKO,cACzBP,KAAKO,eAAgB,EAGrBP,KAAKQ,qBAAuBiJ,EAG5BzJ,KAAK4B,WAGLb,EAAI2I,wBAGJ,MAAMC,EAAO3J,KAAKS,SAASC,MAC3BV,KAAK4J,YAAYD,GAGjB3J,KAAKE,IAAM2B,sBAAsB,KAC/Bd,EAAIuI,MAAMC,WAAaF,GAAkB,UAEzCrJ,KAAK6J,WAAW9I,EAAK4I,EAAM,QAAQG,KAAK,IAAM9J,KAAKgB,KAAKc,kBAE5D,CA0DA,kBAAM6B,CAAanC,EAAsB,OACvC,MAAMT,EAAMf,KAAKgB,KAAKC,aACtB,IAAKF,EAAK,OAIV,GAFAf,KAAKK,gBAAkBmB,GAElBxB,KAAKC,MAER,YADCc,EAAYgJ,gBAIf/J,KAAKC,OAAQ,EAGTD,KAAKgB,KAAKS,+BAA+BC,eAC7C1B,KAAKsB,kCACLtB,KAAKgB,KAAKO,gBAAe,EAAO,CAAEC,WAElC,MAAMmI,EAAO3J,KAAKS,SAASC,MAC3BV,KAAK4J,YAAYD,GACb3J,KAAKE,KAAKkI,qBAAqBpI,KAAKE,KACxCF,KAAKE,IAAM,EACXF,KAAKgK,UAAUC,eACTjK,KAAK6J,WAAW9I,EAAK4I,EAAM,SAEhC5I,EAAYgJ,eACf,CAEQ,kBAAAG,CAAmBC,GACzB,MAAMC,EAAsB,CAAC,SAAU,MAAO,QAAS,QACvD,IAAKD,IAAUA,EAAME,OAAQ,OAAOD,EAEpC,MAAME,MAAYC,IAAiB,CAAC,MAAO,SAAU,OAAQ,UACvDC,EAAqB,GAC3B,IAAA,MAAWC,KAAKN,EAAWG,EAAMI,IAAID,KAAOD,EAAIjI,SAASkI,IAAID,EAAIG,KAAKF,GACtE,IAAA,MAAWA,KAAKL,EAAWI,EAAIjI,SAASkI,IAAID,EAAIG,KAAKF,GACrD,OAAOD,CACT,CAEQ,yBAAAI,CAA0BC,GAChC,OAAQA,GACN,IAAK,MAAO,MAAO,CAAC,MAAO,SAAU,QAAS,QAC9C,IAAK,SAGL,QAAS,MAAO,CAAC,SAAU,MAAO,QAAS,QAF3C,IAAK,OAAQ,MAAO,CAAC,OAAQ,QAAS,SAAU,OAChD,IAAK,QAAS,MAAO,CAAC,QAAS,OAAQ,SAAU,OAGrD,CAEA,QAAAjJ,GACE,GAAsB,oBAAXqB,OAAwB,OAEnC,MAAMhB,EAASjC,KAAKgB,KAAKkB,YACnBnB,EAAMf,KAAKgB,KAAKC,aACtB,IAAKgB,IAAWlB,EAAK,OAErBf,KAAKoJ,0BAEL,MAAM0B,EACH/J,EAAYM,UAAU,kBAAyC,OAArBN,EAAIgK,aAE3CC,EAAUhL,KAAKC,OAAS6K,EAAqB/J,EAAI2I,wBAA0B,KAE3EuB,EAAMjL,KAAKgB,KAAK2E,aAChBD,EAAM1F,KAAKgB,KAAKyE,SAEhByF,EAAIjJ,EAAOyH,wBAEXyB,EAAKlI,OAAOiF,gBAAkB,KAC9BkD,EAAKD,GAAIE,OAASpI,OAAOC,WACzBoI,EAAKH,GAAII,QAAUtI,OAAOE,YAE1BqI,EAAUL,GAAIM,YAAc,EAC5BC,EAAUP,GAAIQ,WAAa,EAEjC,GAAI3L,KAAKgB,KAAK+E,wBAAyB,CACrC,MAAM6F,EAAO1G,KAAK2G,IAAI,EAAGT,EAAW,EAANH,GAC9BlK,EAAIuI,MAAMwC,SAAW,GAAGF,MACxB7K,EAAIuI,MAAMyC,UAAY,YACxB,CAEA,MAAMC,EAAKjL,EAAI2I,wBACTuC,EAAOD,EAAGX,OAAS,IACnBa,EAAOF,EAAGT,QAAU,GAEpBY,EAAQ,CACZC,IAAKlB,EAAEkB,IAAM1G,EAAMgG,EACnBW,OAAQf,GAAMJ,EAAEmB,OAASX,GAAWhG,EACpC4G,KAAMpB,EAAEoB,KAAO5G,EAAM8F,EACrBe,MAAOnB,GAAMF,EAAEqB,MAAQf,GAAW9F,GAG9B8G,EAAQ7C,GACC,QAATA,EAAuBwC,EAAMC,KAAOF,EAC3B,WAATvC,EAA0BwC,EAAME,QAAUH,EACjC,SAATvC,EAAwBwC,EAAMG,MAAQL,EACnCE,EAAMI,OAASN,EAGlBQ,EAAYzM,KAAKgB,KAAKoE,eACtBsH,EAAc1M,KAAKgB,KAAKmF,UAExBwG,EACJ3M,KAAKgB,KAAKqF,gBAAgBgE,OACtBrK,KAAKkK,mBAAmBlK,KAAKgB,KAAKqF,gBAClCrG,KAAKkK,mBAAmBlK,KAAK4K,0BAA0B6B,IAE7D,IAAI/L,EAEJ,GAAkB,SAAd+L,EAAsB,CAExB/L,EADiBiM,EAAUC,KAAKJ,IAG7BG,EACEE,IAAKpC,GAAM,CAACA,EAAG0B,EAAM1B,KACrBqC,KAAK,CAACjK,EAAGE,IAAMA,EAAE,GAAKF,EAAE,IAAI,GAAG,EACtC,MAAA,GAAY6J,EAEL,CACL,MAAMK,EAAMN,EACNO,EAAcL,EAAUpK,SAASwK,GACnC,CAACA,KAAQJ,EAAUM,OAAQxC,GAAMA,IAAMsC,IACvC,CAACA,KAAQJ,GAGbjM,EADiBsM,EAAYJ,KAAKJ,IAG/BQ,EACEH,IAAKpC,GAAM,CAACA,EAAG0B,EAAM1B,KACrBqC,KAAK,CAACjK,EAAGE,IAAMA,EAAE,GAAKF,EAAE,IAAI,GAAG,EACtC,MAbEnC,EAAQ+L,EAeV,IAAIL,EAAM,EACNE,EAAO,EACP3L,EAAyB,SAE7B,MAAMuM,EAA+C,QAAvCC,iBAAiBlL,GAAQmL,UACvC,IAAI5H,EAAQxF,KAAKgB,KAAKuE,WAClB2H,IACY,UAAV1H,EAAmBA,EAAQ,MACZ,QAAVA,IAAiBA,EAAQ,UAGpC,MAAM6H,EAAMnC,EAAEoB,KAAOd,EACf8B,EAAMpC,EAAEqB,MAAQf,EAChB+B,EAAMrC,EAAEkB,IAAMV,EACd8B,EAAMtC,EAAEmB,OAASX,EACjB+B,EAAKvC,EAAEG,MACPqC,EAAKxC,EAAEK,OAEb,GAAc,QAAV7K,GAA6B,WAAVA,EAAoB,CAClB4L,EAAT,UAAV9G,EAA0B6H,EACX,QAAV7H,EAAwB8H,EAAMrB,EAC3BoB,EAAMI,EAAK,EAAIxB,EAAO,EAElCG,EAAgB,QAAV1L,EAAkB6M,EAAMrB,EAAOxG,EAAM8H,EAAM9H,EAEjD,MAAMiI,EAAczI,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAIiG,EAAKa,EAAOhB,EAAKqB,IACxDqB,IAAgBrB,IAAM3L,EAAagN,GAAe1C,EAAM,GAAM,QAAU,OAC5EqB,EAAOqB,EAEPvB,EAAMlH,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAImG,EAAKY,EAAOjB,EAAKmB,GAChD,KAAO,CACLE,EAAiB,SAAV5L,EAAmB2M,EAAMpB,EAAOvG,EAAM4H,EAAM5H,EACnD0G,EAAMmB,EAAMG,EAAK,EAAIxB,EAAO,EAE5B,MAAM0B,EAAa1I,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAImG,EAAKY,EAAOjB,EAAKmB,IACvDwB,IAAexB,IAAKzL,EAAaiN,GAAc3C,EAAM,GAAM,QAAU,OACzEmB,EAAMwB,EAENtB,EAAOpH,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAIiG,EAAKa,EAAOhB,EAAKqB,GACjD,CAEAA,GAAQd,EACRY,GAAOV,EAEP,MAAMmC,EAAS7N,KAAKF,KAEpB,GAAIE,KAAKgB,KAAK6E,sBAAuB,CACnC,MAAM+F,EAAO1G,KAAK2G,IAAI,EAAGT,EAAW,EAANH,GACxBI,EAAQnG,KAAKC,IAAI+F,EAAEG,MAAOO,GAChCiC,EAAOvE,MAAMwE,YAAY9N,KAAKgB,KAAKsG,YAAa,GAAG+D,MACrD,MACEwC,EAAOvE,MAAMyE,eAAe/N,KAAKgB,KAAKsG,aAQxC,GALAuG,EAAOvE,MAAMwE,YAAY9N,KAAKgB,KAAKoG,WAAY,GAAGkF,OAClDuB,EAAOvE,MAAMwE,YAAY9N,KAAKgB,KAAKqG,UAAW,GAAG+E,OAEjDrL,EAAIuI,MAAMwE,YAAY9N,KAAKgB,KAAKoG,WAAY,GAAGkF,OAC/CvL,EAAIuI,MAAMwE,YAAY9N,KAAKgB,KAAKqG,UAAW,GAAG+E,OAC1CpM,KAAKgB,KAAK6E,sBAAuB,CACnC,MAAMwF,EAAQwC,EAAOvE,MAAM0E,iBAAiBhO,KAAKgB,KAAKsG,aAClD+D,GAAOtK,EAAIuI,MAAMwE,YAAY9N,KAAKgB,KAAKsG,YAAa+D,EAC1D,MACEtK,EAAIuI,MAAMyE,eAAe/N,KAAKgB,KAAKsG,aAGnBtH,KAAKS,SAASC,MAChCV,KAAKS,SAAW,CAAEC,QAAOC,cACzBX,KAAK4J,YAAYlJ,GAGfV,KAAKC,OACLD,KAAKgB,KAAK2F,wBACVqE,IACChL,KAAKQ,qBACNO,EAAIM,UAAU,kBACdyJ,GACgB,SAAhB9K,KAAKY,SACJZ,KAAKiO,aAGFjO,KAAKE,KAAKkI,qBAAqBpI,KAAKE,KACxCF,KAAKE,IAAM2B,sBAAsB,KAC/B,MAAMqM,EAAQnN,EAAI2I,wBAClB1J,KAAKmO,YAAYpN,EAAKiK,EAAQkD,MAIlClO,KAAKQ,qBAAsB,CAC7B,CAEQ,GAAA4N,CAAIzE,EAAmB0E,GAC7B,MAAa,QAAT1E,EAAuB,CAAE9G,EAAG,EAAGE,GAAIsL,GAC1B,WAAT1E,EAA0B,CAAE9G,EAAG,EAAGE,GAAIsL,GAC7B,SAAT1E,EAAwB,CAAE9G,GAAIwL,EAAGtL,EAAG,GACjC,CAAEF,GAAIwL,EAAGtL,EAAG,EACrB,CAEQ,oBAAAuL,GACN,QAAKtO,KAAKgB,KAAK2G,uBACU,oBAAX1E,QACTA,OAAOsL,aAAa,qCAAqClN,QAChE,CAGQ,aAAAmN,CAAc7E,EAAmB8E,GACvC,MAAa,WAATA,EAA0B,UAGf,QAAT9E,EAAuB,WACd,WAATA,EAA0B,SACjB,SAATA,EAAwB,WACrB,QAcX,CAEQ,EAAA+E,CAAGC,EAAiBC,EAAmB3B,GAC7C,MAAMzC,EAAW,CAAEmE,UAASC,aAE5B,OADI3B,MAAYA,OAASA,GAClBzC,CACT,CAGQ,cAAAqE,GAsiBN,MAAO,CACLC,KAhBsB,CACtBC,KAAM,OACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EACjDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,gCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,IAAM,CAAC,CAAEpB,QAAS,KAOhCqB,KAtiBsB,CACtBjB,KAAM,OACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EACjDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,+BACZC,YAAa,+BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,WACL,SAAVA,EACI,CAAC,CAAEtB,QAAS,GAAK,CAAEA,QAAS,IAC5B,CAAC,CAAEA,QAAS,GAAK,CAAEA,QAAS,KA0hBlCuB,MAvhBuB,CACvBnB,KAAM,QACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,GAAKC,UAAW,IACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,qCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAACjQ,KAAK0O,GAAG,EAAG,SAASyB,EAAIhB,eAAgBnP,KAAK0O,GAAG,EAAG,aACpD,CAAC1O,KAAK0O,GAAG,EAAG,YAAa1O,KAAK0O,GAAG,EAAG,SAASyB,EAAIf,gBA2gBvDgB,MAxgBuB,CACvBrB,KAAM,QACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EAClDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,iCACZC,YAAa,gCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,WAAY/C,KAAK0O,GAAG,EAAG,uBAC9D,CAAC1O,KAAK0O,GAAG,EAAG,sBAAuB1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,cA0f/EuN,QAtfyB,CACzBvB,KAAM,UACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,uCACZC,YAAa,wCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACAjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,iBAAiBoN,EAAIhB,cAAe,QAAQgB,EAAId,eACtFrP,KAAK0O,GAAG,EAAG,8BAA+B,cAE1C,CACA1O,KAAK0O,GAAG,EAAG,8BAA+B,aAC1C1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,iBAAiBoN,EAAIf,aAAc,QAAQe,EAAIb,mBAme3FiB,SA9d0B,CAC1BxB,KAAM,WACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,qCACZC,YAAa,oCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,UAAW/C,KAAK0O,GAAG,EAAG,uBAC7D,CAAC1O,KAAK0O,GAAG,EAAG,sBAAuB1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,aAgd/EyN,aA5c8B,CAC9BzB,KAAM,eACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,6BACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACAjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,gBAAgBoN,EAAIhB,eAC1DnP,KAAK0O,GAAG,EAAG,gCAEX,CACA1O,KAAK0O,GAAG,EAAG,+BACX1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,gBAAgBoN,EAAIf,iBAybhEqB,cApb+B,CAC/B1B,KAAM,gBACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,kCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,UAAW/C,KAAK0O,GAAG,EAAG,uBAC7D,CAAC1O,KAAK0O,GAAG,EAAG,sBAAuB1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,aAsa/E2N,OAlawB,CACxB3B,KAAM,SACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,KAAOC,UAAW,IACvDC,SAAU,GAAIC,UAAW,EAAGC,cAAe,IAC3CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACAjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,gBAAgBoN,EAAIhB,cAAe,QAAQgB,EAAId,eACrFrP,KAAK0O,GAAG,EAAG,8BAA+B,cAE1C,CACA1O,KAAK0O,GAAG,EAAG,8BAA+B,aAC1C1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,gBAAgBoN,EAAIf,aAAc,QAAQe,EAAIb,mBA+Y1FqB,KA1YsB,CACtB5B,KAAM,OACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,iCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,gBAAgBoN,EAAIhB,cAAe,QAAQgB,EAAId,eAAgBrP,KAAK0O,GAAG,EAAG,8BAA+B,cAChJ,CAAC1O,KAAK0O,GAAG,EAAG,8BAA+B,aAAc1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,gBAAgBoN,EAAIf,aAAc,QAAQe,EAAIb,mBA4XnJsB,MAxXuB,CACvB7B,KAAM,QACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,kCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,gBAAgBoN,EAAIhB,eAAgBnP,KAAK0O,GAAG,EAAG,gCACtF,CAAC1O,KAAK0O,GAAG,EAAG,+BAAgC1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,gBAAgBoN,EAAIf,iBA0W5GyB,OAtWwB,CACxB9B,KAAM,SACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EACjDC,SAAU,GAAIC,UAAW,EAAGC,cAAe,IAC3CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,gCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAACjQ,KAAK0O,GAAG,EAAG,qBAAsB,QAAQyB,EAAId,eAAgBrP,KAAK0O,GAAG,EAAG,qBAAsB,cAC/F,CAAC1O,KAAK0O,GAAG,EAAG,qBAAsB,aAAc1O,KAAK0O,GAAG,EAAG,qBAAsB,QAAQyB,EAAIb,kBA0VnGwB,SAvV0B,CAC1B/B,KAAM,WACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,GAAIC,UAAW,EAAGC,cAAe,IAC3CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,iCACZC,YAAa,+BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,SAAU,QAAQoN,EAAId,eAAgBrP,KAAK0O,GAAG,EAAG,qBAAsB,cAC9G,CAAC1O,KAAK0O,GAAG,EAAG,qBAAsB,aAAc1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,SAAU,QAAQoN,EAAIb,mBAyUlHyB,eArUgC,CAChChC,KAAM,iBACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAMjF,EAAIlL,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoB,EAAIrQ,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAexD,EAAErI,QAAQqI,EAAEnI,gBAAgBoN,EAAIhB,eAAgBnP,KAAK0O,GAAG,EAAG,gCACtF,CAAC1O,KAAK0O,GAAG,EAAG,+BAAgC1O,KAAK0O,GAAG,EAAG,eAAe2B,EAAExN,QAAQwN,EAAEtN,gBAAgBoN,EAAIf,iBAuT5G4B,eAnTgC,CAChCjC,KAAM,iBACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,uCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAACjQ,KAAK0O,GAAG,EAAG,SAASyB,EAAIhB,eAAgBnP,KAAK0O,GAAG,EAAG,aACpD,CAAC1O,KAAK0O,GAAG,EAAG,YAAa1O,KAAK0O,GAAG,EAAG,SAASyB,EAAIf,gBAuSvD6B,OApSwB,CACxBlC,KAAM,SACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,gCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,MAAKT,aACjC,MAAMrB,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBiC,EAAiB,SAATvH,GAA4B,UAATA,EAAoB,IAAM,IACrDwH,EAAiB,QAATxH,GAA2B,SAATA,EAAmB,GAAI,EACjDyH,EAAIjB,EAAIX,UAAY2B,EAE1B,GAAc,SAAVlB,EACF,MAAO,CACLjQ,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAExL,QAAQwL,EAAEtL,iBAAiBmO,KAAQE,eAAejB,EAAIhB,eACtHnP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,qBAG/E,MAAMG,EAAKrR,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC9B,MAAO,CACLlP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,oBAC3ElR,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgC8B,EAAGxO,QAAQwO,EAAGtO,iBAAiBmO,KAAY,GAAJE,eAAqBjB,EAAIf,iBA4QlIkC,OAvQwB,CACxBvC,KAAM,SACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,GAAIC,OAAQ,SACpCC,WAAY,uCACZC,YAAa,wCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBiC,EAAiB,SAATvH,GAA4B,UAATA,EAAoB,IAAM,IACrDwH,EAAiB,QAATxH,GAA2B,SAATA,EAAmB,GAAI,EACjD4H,EAAIpB,EAAIV,QAAU0B,EAExB,MAAiB,SAAVlB,EACH,CACAjQ,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAExL,QAAQwL,EAAEtL,iBAAiBmO,KAAQK,eAAepB,EAAIhB,cAAe,QAAQgB,EAAId,eACjJrP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,mBAAuB,cAElG,CACAlR,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,mBAAuB,aAClGlR,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgCvP,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAAQrM,QAAQ7C,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAAQnM,iBAAiBmO,KAAY,GAAJK,eAAqBpB,EAAIf,aAAc,QAAQe,EAAIb,mBAiP9MkC,OA5OwB,CACxBzC,KAAM,SACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,GAAIC,OAAQ,SACpCC,WAAY,iCACZC,YAAa,gCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBwC,EAAe,QAAT9H,EAAiBwG,EAAIV,QAAmB,WAAT9F,GAAqBwG,EAAIV,QAAU,EACxEiC,EAAe,SAAT/H,EAAkBwG,EAAIV,QAAmB,UAAT9F,GAAoBwG,EAAIV,QAAU,EAE9E,MAAiB,SAAVQ,EACH,CACAjQ,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAExL,QAAQwL,EAAEtL,mBAAmB0O,iBAAkBC,eAAgBvB,EAAIhB,eACnInP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,6EAE9B,CACAvP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,4EAC9BvP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgCvP,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAAQrM,QAAQ7C,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAAQnM,mBAAwB,GAAL0O,iBAA6B,GAALC,eAAsBvB,EAAIf,iBAuNvMuC,QAlNyB,CACzB5C,KAAM,UACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,GAAKC,UAAW,IACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CACAjQ,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,iDAAiDY,EAAIhB,cAAe,QAAQgB,EAAId,eAC9GrP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,+CAAgD,cAE9E,CACAvP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,+CAAgD,aAC9EvP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,iDAAiDY,EAAIf,aAAc,QAAQe,EAAIb,kBAiMnHsC,SA7L0B,CAC1B7C,KAAM,WACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,qCACZC,YAAa,oCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBkC,EAAiB,QAATxH,GAA2B,SAATA,EAAmB,GAAI,EACjDyH,EAAIjB,EAAIX,UAAY2B,EAE1B,MAAiB,SAAVlB,EACH,CACAjQ,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAExL,QAAQwL,EAAEtL,mBAAmBqO,eAAejB,EAAIhB,eAChHnP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,+DAE9B,CACAvP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,8DAC9BvP,KAAK0O,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgCvP,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAAQrM,QAAQ7C,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAAQnM,mBAAuB,GAAJqO,eAAqBjB,EAAIf,iBAwK9KyC,QAnKyB,CACzB9C,KAAM,UACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,sCACZC,YAAa,gCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SAC7B,GAAc,SAAVgB,EACF,MAAO,CACLjQ,KAAK0O,GAAG,EAAG,eAAeL,EAAExL,QAAQwL,EAAEtL,gBAAgBoN,EAAIhB,eAC1DnP,KAAK0O,GAAG,EAAG,kCACX1O,KAAK0O,GAAG,EAAG,gCAGf,MAAM2C,EAAKrR,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC9B,MAAO,CACLlP,KAAK0O,GAAG,EAAG,+BACX1O,KAAK0O,GAAG,EAAG,eAAe2C,EAAGxO,QAAQwO,EAAGtO,gBAAgBoN,EAAIf,iBA8IhE0C,OAzIwB,CACxB/C,KAAM,SACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,GAAKC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,sCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SAC7B,GAAc,SAAVgB,EACF,MAAO,CACLjQ,KAAK0O,GAAG,EAAG,eAAeL,EAAExL,QAAQwL,EAAEtL,gBAAgBoN,EAAIhB,eAC1DnP,KAAK0O,GAAG,EAAG,kCACX1O,KAAK0O,GAAG,EAAG,gCAGf,MAAM2C,EAAKrR,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC9B,MAAO,CACLlP,KAAK0O,GAAG,EAAG,+BACX1O,KAAK0O,GAAG,EAAG,eAAe2C,EAAGxO,QAAQwO,EAAGtO,gBAAgBoN,EAAIf,iBAoHhE2C,MA/GuB,CACvBhD,KAAM,QACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoC,EAAKrR,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAeL,EAAExL,QAAQwL,EAAEtL,UAAW/C,KAAK0O,GAAG,EAAG,uBAC7D,CAAC1O,KAAK0O,GAAG,EAAG,sBAAuB1O,KAAK0O,GAAG,EAAG,eAAe2C,EAAGxO,QAAQwO,EAAGtO,aAiGjFhC,IA7FqB,CACrBgO,KAAM,MACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,uCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAACjQ,KAAK0O,GAAG,EAAG,SAASyB,EAAIhB,eAAgBnP,KAAK0O,GAAG,EAAG,eAAgB1O,KAAK0O,GAAG,EAAG,aAC/E,CAAC1O,KAAK0O,GAAG,EAAG,YAAa1O,KAAK0O,GAAG,EAAG,SAASyB,EAAIf,gBAiFvD4C,KA9EsB,CACtBjD,KAAM,OACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,mCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoC,EAAKrR,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAeL,EAAExL,QAAQwL,EAAEtL,UAAW/C,KAAK0O,GAAG,EAAG,uBAC7D,CAAC1O,KAAK0O,GAAG,EAAG,sBAAuB1O,KAAK0O,GAAG,EAAG,eAAe2C,EAAGxO,QAAQwO,EAAGtO,aAgEjFkP,KA5DsB,CACtBlD,KAAM,OACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOtG,OAAMwG,UAC5B,MAAM9B,EAAIrO,KAAKoO,IAAIzE,EAAMwG,EAAIlB,SACvBoC,EAAKrR,KAAKoO,IAAIzE,EAAMwG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CAACjQ,KAAK0O,GAAG,EAAG,eAAeL,EAAExL,QAAQwL,EAAEtL,gBAAgBoN,EAAIhB,eAAgBnP,KAAK0O,GAAG,EAAG,gCACtF,CAAC1O,KAAK0O,GAAG,EAAG,+BAAgC1O,KAAK0O,GAAG,EAAG,eAAe2C,EAAGxO,QAAQwO,EAAGtO,gBAAgBoN,EAAIf,iBA+ClH,CAGQ,kBAAA8C,CACN1L,EACAmD,EACAsG,EACAkC,GAEA,MAAMC,EAAMpS,KAAK6O,iBACXwD,EAAMD,EAAI5L,IAAW4L,EAAI9B,QAGVtQ,KAAKsS,kBAC1B,MAAMnC,EAAM,IAEPkC,EAAIrD,YACHmD,GAAa,CAAA,GAGbzC,EAAS1P,KAAKwO,cAAc7E,EAAMwG,EAAIT,QAE5C,MAAO,CACL6C,UAAWF,EAAItC,aAAa,CAAEpG,OAAMsG,QAAOE,MAAKT,WAChDS,MACAT,SAEJ,CAGQ,eAAA4C,GACN,MAAO,CACLrD,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,OACRC,WAAY,gCACZC,YAAa,6BACbC,cAAe,IACfC,aAAc,IAElB,CAEA,gBAAcjG,CAAW9I,EAAkB4I,EAAmBsG,GAE5D,GADAjQ,KAAKwS,uBAAuBzR,GACxBf,KAAKsO,uBAAwB,OAEjC,MAAM9H,EAASxG,KAAKgB,KAAKuF,YACzB,GAAe,SAAXC,EAAmB,OAGvBxG,KAAKgK,UAAUC,SACfjK,KAAKiO,YAAYhE,SAEjBjK,KAAKY,OAAmB,SAAVqP,EAAmB,UAAY,UAE7ClP,EAAIuI,MAAMmJ,WAAa,OAIvB,MAAMF,UAAEA,MAAWpC,EAAAT,OAAKA,GAAW1P,KAAKkS,mBAAmB1L,EAAQmD,EAAMsG,GAGnElL,EAAqB,SAAVkL,EAAmBE,EAAIN,cAAgBM,EAAIL,aAEtD4C,EAAO1S,KAAK2S,WAAWnM,GACzBkM,GACF3R,EAAIuI,MAAMsJ,eAAiB,cAC3B7R,EAAIuI,MAAMuJ,mBAAqB,WAG/B9R,EAAIuI,MAAMsJ,eAAiB,GAC3B7R,EAAIuI,MAAMuJ,mBAAqB,IAEjC9R,EAAIuI,MAAMwJ,gBAAkBpD,EAE5B,MAAMqD,EAAmB,SAAV9C,EAAmBE,EAAIR,WAAaQ,EAAIP,YAEjDoD,EAAOjS,EAAIkS,QAAQV,EAAkB,CACzCxN,WACAgO,SACAG,KAAM,SAGRlT,KAAKiO,WAAa+E,EAElB,UACQA,EAAKG,QACb,CAAA,MAEA,CAAA,QACMnT,KAAKiO,aAAe+E,IAAMhT,KAAKiO,gBAAa,GAChDlN,EAAIuI,MAAMmJ,WAAa,GACnBC,IACF3R,EAAIuI,MAAMsJ,eAAiB,GAC3B7R,EAAIuI,MAAMuJ,mBAAqB,IAGjC7S,KAAKY,OAAmB,SAAVqP,EAAmB,OAAS,MAC5C,CACF,CAEQ,sBAAAuC,CAAuBzR,GAC7B,MAAMqS,EAAcrS,EAAIuI,MAAMmJ,YAAc,GAGxCW,EAAY7Q,SAAS,cAAgB6Q,EAAY7Q,SAAS,YAC5D8Q,QAAQC,KACN,0KAIAF,EAAY7Q,SAAS,WAAa6Q,EAAY7Q,SAAS,aACzD8Q,QAAQC,KACN,0KAGN,CAEQ,WAAAnF,CAAYpN,EAAkBwS,EAAeC,GACnD,GAAoB,SAAhBxT,KAAKY,OAAmB,OAE5B,MAAM6S,EAAKF,EAAKjH,KAAOkH,EAAGlH,KACpBoH,EAAKH,EAAKnH,IAAMoH,EAAGpH,IACzB,GAAIlH,KAAKyO,IAAIF,GAAM,IAAOvO,KAAKyO,IAAID,GAAM,GAAK,OAE9C1T,KAAKgK,UAAUC,SAEf,MAAMlF,EAAW/E,KAAKgB,KAAK6F,kBAErBmM,EAAOjS,EAAIkS,QACf,CACE,CAAErE,UAAW,eAAe6E,QAASC,WACrC,CAAE9E,UAAW,yBAEf,CACE7J,WACAgO,OAAQ,gCACRG,KAAM,SAIVlT,KAAKgK,SAAWgJ,EAChBA,EAAKG,SAASS,QAAQ,KAChB5T,KAAKgK,WAAagJ,IAAMhT,KAAKgK,cAAW,IAEhD,CAEQ,UAAA2I,CAAWnM,GACjB,MACa,WAAXA,GACW,WAAXA,GACW,WAAXA,GACW,YAAXA,GACW,aAAXA,CAEJ,CAEQ,WAAAoD,CAAYD,GAClB,MAAM5I,EAAMf,KAAKgB,KAAKC,aACjBF,GACLA,EAAI8S,aAAa7T,KAAKgB,KAAK0G,SAAUiC,EACvC,CAEQ,8BAAAnB,GACN,GAAsB,oBAAXvF,OAAwB,OAEnC,MAAMhB,EAASjC,KAAKgB,KAAKkB,YACnBnB,EAAMf,KAAKgB,KAAKC,aAElBgB,GAAU,mBAAoBgB,SAChCjD,KAAK2I,UAAUC,aACf5I,KAAK2I,SAAW,IAAImL,eAAe,KAC7B9T,KAAKC,OAAOD,KAAK4B,aAEvB5B,KAAK2I,SAASoL,QAAQ9R,IAGpBlB,GAAO,mBAAoBkC,SAC7BjD,KAAK6I,WAAWD,aAChB5I,KAAK6I,UAAY,IAAIiL,eAAe,KAC9B9T,KAAKC,OAAOD,KAAK4B,aAEvB5B,KAAK6I,UAAUkL,QAAQhT,IAGzBf,KAAK0I,wBAEL,MAAM+F,EAAOzO,KAAKgB,KAAKuG,gBACvB,GAAa,WAATkH,EAEJ,GAAIA,aAAgBhL,YAClBzD,KAAKgU,WAAWvF,QAIlB,GAAIxM,EACF,IAAA,MAAW4I,KAAK7K,KAAKiU,iBAAiBhS,GAASjC,KAAKgU,WAAWnJ,EAEnE,CAEQ,UAAAmJ,CAAWE,GACjB,MAAMC,EAAKnU,KAAK4D,eAChBsQ,EAAG7L,iBAAiB,SAAU8L,EAAI,CAAE7L,SAAS,IAC7CtI,KAAKG,mBAAmBwK,KAAK,CAAEuJ,KAAIC,MACrC,CAEQ,qBAAAzL,GACN,IAAA,MAAWwL,GAAEA,EAAAC,GAAIA,KAAQnU,KAAKG,mBAC3B+T,EAAWzL,sBAAsB,SAAU0L,GAE9CnU,KAAKG,mBAAqB,EAC5B,CAEQ,gBAAA8T,CAAiBxR,GACvB,MAAM2R,EAAyB,GAC/B,IAAIF,EAAyBzR,EAAK4R,cAElC,KAAOH,GAAMA,IAAOjQ,SAASqQ,MAAM,CACjC,MAAMhL,EAAQ6D,iBAAiB+G,GACzBK,EAAYjL,EAAMiL,UAClBC,EAAYlL,EAAMkL,UAElBC,GACW,SAAdF,GAAsC,WAAdA,GAAwC,YAAdA,IACnDL,EAAGQ,aAAeR,EAAGS,aAEjBC,GACW,SAAdJ,GAAsC,WAAdA,GAAwC,YAAdA,IACnDN,EAAGW,YAAcX,EAAGY,aAElBL,GAAcG,IAAYR,EAAQzJ,KAAKuJ,GAC3CA,EAAKA,EAAGG,aACV,CAEA,OAAOD,CACT,CAmCQ,sBAAAjL,GACNnJ,KAAKM,cAAgB2D,SAASC,aAChC,CAEQ,uBAAA6Q,CAAwBb,GAC9B,KAAMA,aAAczQ,aAAc,OAAO,EAEzC,MAAMxB,EAASjC,KAAKgB,KAAKkB,YACnB8S,EAAchV,KAAKgB,KAAKyG,oBAAsB,KAEpD,SAAIuN,GAAgBd,IAAOc,IAAeA,EAAY5Q,SAAS8P,OAG1DjS,MACDiS,IAAOjS,IAAUA,EAAOmC,SAAS8P,OACjCjS,EAAOgT,YAAY7Q,SAAS8P,GAElC,CAEQ,YAAAxS,GACN,IAAK1B,KAAKgB,KAAKS,yBAA0B,OAEzC,MAAMQ,EAASjC,KAAKgB,KAAKkB,YACzB,IAAKD,EAAQ,OAEb,MAAM+S,EAAchV,KAAKgB,KAAKyG,oBAAsBxF,EAC9C+B,EAASC,SAASC,cAClBgR,EAAOlV,KAAKM,cACZS,EAAMf,KAAKgB,KAAKC,aAEhBkU,KAA0BpU,GAAOmU,GAAQnU,EAAIqD,SAAS8Q,IACtDE,EAAuBpV,KAAK+U,wBAAwBG,OAC3BnU,GAAOiD,GAAUjD,EAAIqD,SAASJ,KAElCmR,GAAwBC,IACjDJ,EAAYK,QAAQ,CAAEC,eAAe,GAEzC,CAEQ,uBAAAlM,GACN,MAAMrI,EAAMf,KAAKgB,KAAKC,aACjBF,IACAA,EAAIuI,MAAMiM,SAAQxU,EAAIuI,MAAMiM,OAAS,KAC5C,CAMA,YAAAC,CACE1R,EACA2R,GAIGzV,KAAKgB,KAAa8C,GAFA,mBAAV2R,EAEiBA,EAGA,IAAMA,EAG9BzV,KAAKC,OAAS6D,EAAI4R,WAAW,QAE/B1V,KAAK4B,UAET"}
|
|
1
|
+
{"version":3,"file":"popover-controller.js","sources":["../../../src/helper/controllers/popover-controller.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from \"lit\";\r\n\r\nexport type PopoverSide = \"top\" | \"bottom\" | \"left\" | \"right\";\r\nexport type PopoverPlacement = PopoverSide | \"auto\";\r\nexport type PopoverAlign = \"start\" | \"center\" | \"end\";\r\nexport type MaxWidthMode = \"cap\" | \"fill\";\r\nexport type CloseReason = \"api\" | \"toggle\" | \"escape\" | \"light-dismiss\" | \"group\";\r\ntype ArrowAlign = \"center\" | \"start\" | \"end\";\r\ntype ScrollContainerMode = \"auto\" | \"window\";\r\n\r\n/** Named animation presets; consumer selects by name. */\r\nexport type PopoverPreset =\r\n | \"none\"\r\n | \"fade\"\r\n | \"scale\"\r\n | \"slide\"\r\n | \"iosMenu\"\r\n | \"iosSheet\"\r\n | \"materialMenu\"\r\n | \"materialSheet\"\r\n | \"floaty\"\r\n | \"soft\"\r\n | \"sharp\"\r\n | \"blurIn\"\r\n | \"blurFade\"\r\n | \"zoomFromAnchor\"\r\n | \"zoomFromCorner\"\r\n | \"flip3d\"\r\n | \"card3d\"\r\n | \"tilt3d\"\r\n | \"depth3d\"\r\n | \"rotate3d\"\r\n | \"springy\"\r\n | \"bouncy\"\r\n | \"glide\"\r\n | \"pop\"\r\n | \"drop\"\r\n | \"grow\";\r\n\r\nexport type PopoverPresetConfig = {\r\n enterPx?: number; // translate distance\r\n exitPx?: number;\r\n enterScale?: number;\r\n exitScale?: number;\r\n blurInPx?: number;\r\n blurOutPx?: number;\r\n perspectivePx?: number;\r\n rotateDeg?: number; // 3d rotation magnitude\r\n tiltDeg?: number; // 3d tilt magnitude\r\n origin?: \"auto\" | \"anchor\" | \"center\" | \"corner\";\r\n easingOpen?: string;\r\n easingClose?: string;\r\n enterDuration?: number;\r\n exitDuration?: number;\r\n};\r\n\r\ntype PresetDef = {\r\n name: PopoverPreset;\r\n defaults: Required<PopoverPresetConfig>;\r\n getKeyframes: (\r\n args: {\r\n side: PopoverSide;\r\n phase: \"open\" | \"close\";\r\n cfg: Required<PopoverPresetConfig>;\r\n origin: string;\r\n }\r\n ) => Keyframe[];\r\n};\r\n\r\nexport interface PopoverControllerOptions {\r\n // Required functions\r\n getAnchor: () => HTMLElement | null;\r\n getPopover: () => HTMLElement | null;\r\n\r\n // CSS variable names\r\n cssVarLeft?: string;\r\n cssVarTop?: string;\r\n cssVarWidth?: string;\r\n\r\n // Reactive property getters\r\n // (Preferred - automatically update when component properties change)\r\n getPlacement?: () => PopoverPlacement;\r\n getAlign?: () => PopoverAlign;\r\n getGap?: () => number;\r\n getPadding?: () => number;\r\n getMatchAnchorWidth?: () => boolean;\r\n getMaxWidthToViewport?: () => boolean;\r\n getMaxWidthMode?: () => MaxWidthMode;\r\n getFlip?: () => boolean;\r\n getFlipOrder?: () => PopoverSide[];\r\n getPreset?: () => PopoverPreset;\r\n getDuration?: () => number;\r\n getCloseDuration?: () => number;\r\n getAnimateReposition?: () => boolean;\r\n getRepositionMs?: () => number;\r\n getCloseOnEscape?: () => boolean;\r\n getRestoreFocusOnClose?: () => boolean;\r\n getCloseOnOutside?: () => boolean;\r\n getIgnoreOutsideSelector?: () => string;\r\n getIgnoreOutsideAttr?: () => string;\r\n\r\n // Static fallback values\r\n // (For backward compatibility or when values don't change)\r\n placement?: PopoverPlacement;\r\n align?: PopoverAlign;\r\n gap?: number;\r\n padding?: number;\r\n matchAnchorWidth?: boolean;\r\n maxWidthToViewport?: boolean;\r\n maxWidthMode?: MaxWidthMode;\r\n flip?: boolean;\r\n flipOrder?: PopoverSide[];\r\n preset?: PopoverPreset;\r\n duration?: number;\r\n closeDuration?: number;\r\n animateReposition?: boolean;\r\n repositionMs?: number;\r\n closeOnEscape?: boolean;\r\n restoreFocusOnClose?: boolean;\r\n closeOnOutside?: boolean;\r\n ignoreOutsideSelector?: string;\r\n ignoreOutsideAttr?: string;\r\n\r\n // Scroll and focus\r\n focusOnOpen?: () => void;\r\n scrollContainer?: ScrollContainerMode | HTMLElement;\r\n\r\n // Group behavior\r\n groupEventName?: string;\r\n groupId?: unknown;\r\n\r\n // Callbacks\r\n onOpenChange?: (open: boolean, meta: { reason: CloseReason }) => void;\r\n /** Focus target on close; defaults to {@link getAnchor} when omitted. */\r\n getFocusTarget?: () => HTMLElement | null;\r\n\r\n // Other options\r\n sideAttr?: string;\r\n respectReducedMotion?: boolean;\r\n}\r\n\r\n/**\r\n * PopoverController with Reactive Getter Bindings\r\n * - Automatically reads latest values from host component via getter functions\r\n * - No manual updates needed when host properties change\r\n * - WAAPI preset animations with side-aware enter/exit\r\n * - Smooth reposition animation on flip/move\r\n */\r\nexport class PopoverController implements ReactiveController {\r\n private host: ReactiveControllerHost;\r\n private _open = false;\r\n\r\n private raf = 0;\r\n\r\n private anchorRO?: ResizeObserver;\r\n private popoverRO?: ResizeObserver;\r\n\r\n private boundScrollParents: Array<{ el: EventTarget; fn: EventListener }> = [];\r\n private visualViewport?: VisualViewport;\r\n /** When true, global listeners and observers are attached (deferred until first open for perf with many instances). */\r\n private _listenersAttached = false;\r\n\r\n private lastCloseReason: CloseReason = \"toggle\";\r\n private lastFocusedEl: Element | null = null;\r\n\r\n private hasEverOpened = false;\r\n private _skipNextReposition = false;\r\n\r\n private lastMeta: { place: PopoverSide; arrowAlign: ArrowAlign } = {\r\n place: \"bottom\",\r\n arrowAlign: \"center\",\r\n };\r\n\r\n private _phase: \"idle\" | \"opening\" | \"open\" | \"closing\" = \"idle\";\r\n private presetAnim?: Animation;\r\n private moveAnim?: Animation;\r\n\r\n // Helper to create getters with fallback to static values\r\n private static createGetter<T>(\r\n getter: (() => T) | undefined,\r\n staticValue: T | undefined,\r\n defaultValue: T\r\n ): () => T {\r\n return getter || (() => staticValue ?? defaultValue);\r\n }\r\n\r\n private opts: {\r\n // Required functions\r\n getAnchor: () => HTMLElement | null;\r\n getPopover: () => HTMLElement | null;\r\n\r\n // Reactive property getters\r\n getPlacement: () => PopoverPlacement;\r\n getAlign: () => PopoverAlign;\r\n getGap: () => number;\r\n getPadding: () => number;\r\n getMatchAnchorWidth: () => boolean;\r\n getMaxWidthToViewport: () => boolean;\r\n getMaxWidthMode: () => MaxWidthMode;\r\n getFlip: () => boolean;\r\n getFlipOrder: () => PopoverSide[];\r\n getPreset: () => PopoverPreset;\r\n getDuration: () => number;\r\n getCloseDuration: () => number;\r\n getAnimateReposition: () => boolean;\r\n getRepositionMs: () => number;\r\n getCloseOnEscape: () => boolean;\r\n getRestoreFocusOnClose: () => boolean;\r\n getCloseOnOutside: () => boolean;\r\n getIgnoreOutsideSelector: () => string;\r\n getIgnoreOutsideAttr: () => string;\r\n\r\n // Other options\r\n cssVarLeft: string;\r\n cssVarTop: string;\r\n cssVarWidth: string;\r\n focusOnOpen?: () => void;\r\n scrollContainer: ScrollContainerMode | HTMLElement;\r\n groupEventName?: string;\r\n groupId?: unknown;\r\n onOpenChange?: (open: boolean, meta: { reason: CloseReason }) => void;\r\n getFocusTarget?: () => HTMLElement | null;\r\n sideAttr: string;\r\n respectReducedMotion: boolean;\r\n };\r\n\r\n constructor(host: ReactiveControllerHost, options: PopoverControllerOptions) {\r\n this.host = host;\r\n host.addController(this);\r\n\r\n // Initialize getters with fallback values\r\n const dur = options.duration ?? 220;\r\n const closeDur = options.closeDuration ?? Math.min(180, dur);\r\n\r\n this.opts = {\r\n // Required functions\r\n getAnchor: options.getAnchor,\r\n getPopover: options.getPopover,\r\n\r\n // Reactive property getters\r\n getPlacement: PopoverController.createGetter(\r\n options.getPlacement,\r\n options.placement,\r\n \"auto\"\r\n ),\r\n getAlign: PopoverController.createGetter(\r\n options.getAlign,\r\n options.align,\r\n \"start\"\r\n ),\r\n getGap: PopoverController.createGetter(\r\n options.getGap,\r\n options.gap,\r\n 6\r\n ),\r\n getPadding: PopoverController.createGetter(\r\n options.getPadding,\r\n options.padding,\r\n 8\r\n ),\r\n getMatchAnchorWidth: PopoverController.createGetter(\r\n options.getMatchAnchorWidth,\r\n options.matchAnchorWidth,\r\n true\r\n ),\r\n getMaxWidthToViewport: PopoverController.createGetter(\r\n options.getMaxWidthToViewport,\r\n options.maxWidthToViewport,\r\n true\r\n ),\r\n getMaxWidthMode: PopoverController.createGetter(\r\n options.getMaxWidthMode,\r\n options.maxWidthMode,\r\n \"cap\"\r\n ),\r\n getFlip: PopoverController.createGetter(\r\n options.getFlip,\r\n options.flip,\r\n true\r\n ),\r\n getFlipOrder: PopoverController.createGetter(\r\n options.getFlipOrder,\r\n options.flipOrder,\r\n []\r\n ),\r\n getPreset: PopoverController.createGetter(\r\n options.getPreset,\r\n options.preset,\r\n \"slide\"\r\n ),\r\n getDuration: PopoverController.createGetter(\r\n options.getDuration,\r\n options.duration,\r\n dur\r\n ),\r\n getCloseDuration: PopoverController.createGetter(\r\n options.getCloseDuration,\r\n options.closeDuration,\r\n closeDur\r\n ),\r\n getAnimateReposition: PopoverController.createGetter(\r\n options.getAnimateReposition,\r\n options.animateReposition,\r\n true\r\n ),\r\n getRepositionMs: PopoverController.createGetter(\r\n options.getRepositionMs,\r\n options.repositionMs,\r\n 160\r\n ),\r\n getCloseOnEscape: PopoverController.createGetter(\r\n options.getCloseOnEscape,\r\n options.closeOnEscape,\r\n true\r\n ),\r\n getCloseOnOutside: PopoverController.createGetter(\r\n options.getCloseOnOutside,\r\n options.closeOnOutside,\r\n false\r\n ),\r\n\r\n getIgnoreOutsideSelector: PopoverController.createGetter(\r\n options.getIgnoreOutsideSelector,\r\n options.ignoreOutsideSelector,\r\n \"\" // none by default\r\n ),\r\n\r\n getIgnoreOutsideAttr: PopoverController.createGetter(\r\n options.getIgnoreOutsideAttr,\r\n options.ignoreOutsideAttr,\r\n \"data-popover-ignore-outside\"\r\n ),\r\n getRestoreFocusOnClose: PopoverController.createGetter(\r\n options.getRestoreFocusOnClose,\r\n options.restoreFocusOnClose,\r\n true\r\n ),\r\n\r\n // Other options\r\n cssVarLeft: options.cssVarLeft ?? \"--sky-pop-left\",\r\n cssVarTop: options.cssVarTop ?? \"--sky-pop-top\",\r\n cssVarWidth: options.cssVarWidth ?? \"--sky-pop-width\",\r\n focusOnOpen: options.focusOnOpen,\r\n scrollContainer: options.scrollContainer ?? \"auto\",\r\n groupEventName: options.groupEventName,\r\n groupId: options.groupId,\r\n onOpenChange: options.onOpenChange,\r\n getFocusTarget: options.getFocusTarget,\r\n sideAttr: options.sideAttr ?? \"data-side\",\r\n respectReducedMotion: options.respectReducedMotion ?? true,\r\n };\r\n }\r\n\r\n get open() {\r\n return this._open;\r\n }\r\n\r\n get meta() {\r\n return this.lastMeta;\r\n }\r\n\r\n hostConnected() {\r\n if (typeof window === \"undefined\") return;\r\n this.visualViewport = window.visualViewport ?? undefined;\r\n // Defer global listeners and observers until first open (avoids N×listeners with many instances, e.g. combobox in every flow node).\r\n }\r\n\r\n hostDisconnected() {\r\n this.detachGlobalListenersIfAttached();\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n }\r\n\r\n /** Attach window/document listeners and observers. Called on first open. */\r\n private attachGlobalListeners() {\r\n if (typeof window === \"undefined\" || this._listenersAttached) return;\r\n this._listenersAttached = true;\r\n\r\n if (this.visualViewport) {\r\n this.visualViewport.addEventListener(\"resize\", this.onViewportMove, { passive: true });\r\n this.visualViewport.addEventListener(\"scroll\", this.onViewportMove, { passive: true });\r\n }\r\n window.addEventListener(\"resize\", this.onViewportMove, { passive: true });\r\n window.addEventListener(\"scroll\", this.onViewportMove, { passive: true, capture: true });\r\n\r\n if (this.opts.groupEventName) {\r\n window.addEventListener(this.opts.groupEventName, this.onGroupOpen as EventListener);\r\n }\r\n if (this.opts.getCloseOnEscape()) {\r\n window.addEventListener(\"keydown\", this.onKeydown, true);\r\n }\r\n document.addEventListener(\"pointerdown\", this.onDocumentPointerDown, true);\r\n\r\n this.setupObserversAndScrollParents();\r\n }\r\n\r\n /** Remove window/document listeners and observers. Called on close and on hostDisconnected. */\r\n private detachGlobalListenersIfAttached() {\r\n if (!this._listenersAttached) return;\r\n this._listenersAttached = false;\r\n\r\n if (typeof window !== \"undefined\") {\r\n window.removeEventListener(\"resize\", this.onViewportMove);\r\n window.removeEventListener(\"scroll\", this.onViewportMove, true);\r\n if (this.visualViewport) {\r\n this.visualViewport.removeEventListener(\"resize\", this.onViewportMove);\r\n this.visualViewport.removeEventListener(\"scroll\", this.onViewportMove);\r\n }\r\n if (this.opts.groupEventName) {\r\n window.removeEventListener(this.opts.groupEventName, this.onGroupOpen as EventListener);\r\n }\r\n window.removeEventListener(\"keydown\", this.onKeydown, true);\r\n }\r\n document.removeEventListener(\"pointerdown\", this.onDocumentPointerDown, true);\r\n\r\n this.teardownScrollParents();\r\n this.anchorRO?.disconnect();\r\n this.anchorRO = undefined;\r\n this.popoverRO?.disconnect();\r\n this.popoverRO = undefined;\r\n }\r\n\r\n refreshTargets() {\r\n if (this._listenersAttached) this.setupObserversAndScrollParents();\r\n if (this._open) this.position();\r\n }\r\n\r\n /** Wire to popover element: @toggle=${controller.onToggle} */\r\n onToggle = (e: Event) => {\r\n if (this.lastCloseReason === \"light-dismiss\") {\r\n this.lastCloseReason = \"toggle\";\r\n return;\r\n }\r\n const pop = this.opts.getPopover();\r\n const ev = e as any;\r\n\r\n let isOpen: boolean | null = null;\r\n if (typeof ev?.newState === \"string\") isOpen = ev.newState === \"open\";\r\n if (isOpen === null && pop) isOpen = pop.matches?.(\":popover-open\") ?? false;\r\n if (isOpen === null) return;\r\n\r\n if (!isOpen) {\r\n this._open = false;\r\n this.detachGlobalListenersIfAttached();\r\n this.opts.onOpenChange?.(false, { reason: this.lastCloseReason });\r\n if (this.opts.getRestoreFocusOnClose()) this.restoreFocus();\r\n return;\r\n }\r\n\r\n this._open = true;\r\n this.attachGlobalListeners();\r\n this.opts.onOpenChange?.(true, { reason: \"toggle\" });\r\n\r\n this.position();\r\n this.raf = requestAnimationFrame(() => this.opts.focusOnOpen?.());\r\n };\r\n\r\n toggle() {\r\n this._open ? this.closePopover(\"api\") : this.openPopover();\r\n }\r\n\r\n openPopover() {\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n this.raf = 0;\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n\r\n if (typeof window !== \"undefined\" && this.opts.groupEventName) {\r\n window.dispatchEvent(\r\n new CustomEvent(this.opts.groupEventName, {\r\n detail: { id: this.opts.groupId ?? this.host },\r\n }),\r\n );\r\n }\r\n\r\n this.captureFocusBeforeOpen();\r\n this.ensurePopoverMarginZero();\r\n\r\n this._open = true;\r\n this.attachGlobalListeners();\r\n this.opts.onOpenChange?.(true, { reason: \"api\" });\r\n\r\n // Hide until positioned to avoid first-paint flicker.\r\n const prevVisibility = pop.style.visibility;\r\n pop.style.visibility = \"hidden\";\r\n\r\n (pop as any).showPopover?.();\r\n const wasEverOpen = this.hasEverOpened;\r\n this.hasEverOpened = true;\r\n\r\n // later: pass this to position or set a field\r\n this._skipNextReposition = !wasEverOpen;\r\n\r\n // 1) compute and apply css-var position ASAP\r\n this.position();\r\n\r\n // 2) force style/layout flush so left/top vars take effect before animation\r\n pop.getBoundingClientRect();\r\n\r\n // 3) now animate + reveal\r\n const side = this.lastMeta.place;\r\n this.setSideAttr(side);\r\n\r\n // reveal on next frame so hidden state doesn't get captured mid-animation\r\n this.raf = requestAnimationFrame(() => {\r\n pop.style.visibility = prevVisibility || \"visible\";\r\n\r\n this.playPreset(pop, side, \"open\").then(() => this.opts.focusOnOpen?.());\r\n });\r\n }\r\n\r\n private onDocumentPointerDown = (e: PointerEvent) => {\r\n if (!this._open) return;\r\n if (!this.opts.getCloseOnOutside()) return;\r\n\r\n const pop = this.opts.getPopover();\r\n const anchor = this.opts.getAnchor();\r\n if (!pop || !anchor) return;\r\n\r\n // ignore non-primary clicks\r\n if (typeof e.button === \"number\" && e.button !== 0) return;\r\n\r\n const path = (e.composedPath?.() ?? []) as EventTarget[];\r\n\r\n // If click is on anchor or inside popover => not outside\r\n const insidePopover = path.includes(pop);\r\n const insideAnchor = path.includes(anchor);\r\n if (insidePopover || insideAnchor) return;\r\n\r\n // Nested popovers (combobox lists, datepicker calendars, nested menus) live in\r\n // the top layer. Only treat them as inside when they belong to this menu —\r\n // sibling dropdowns must still light-dismiss each other.\r\n for (const node of path) {\r\n if (!(node instanceof Element)) continue;\r\n if (this.isNestedOwnedPopover(node, pop)) return;\r\n }\r\n\r\n // Ignore scrollbar clicks (rare but real)\r\n const x = e.clientX, y = e.clientY;\r\n if (x >= window.innerWidth || y >= window.innerHeight) return;\r\n\r\n // Ignore zones: attr + selector (this menu only — not sibling hosts)\r\n const ignoreAttr = this.opts.getIgnoreOutsideAttr();\r\n const ignoreSel = (this.opts.getIgnoreOutsideSelector() || \"\").trim();\r\n\r\n for (const node of path) {\r\n if (!(node instanceof HTMLElement)) continue;\r\n\r\n if (ignoreAttr && node.hasAttribute(ignoreAttr) && this.isOwnedByThisPopover(node, pop)) {\r\n return;\r\n }\r\n\r\n if (ignoreSel) {\r\n const matched = node.matches(ignoreSel) ? node : node.closest(ignoreSel);\r\n if (matched && this.isOwnedByThisPopover(matched, pop)) return;\r\n }\r\n }\r\n\r\n this.closePopover(\"light-dismiss\");\r\n };\r\n\r\n /** True when `el` is this host or a descendant of this host / popover. */\r\n private isOwnedByThisPopover(el: Element | null, pop: HTMLElement): boolean {\r\n if (!el) return false;\r\n const hostEl = this.host instanceof Element ? this.host : null;\r\n if (hostEl && (el === hostEl || hostEl.contains(el))) return true;\r\n if (pop.contains(el)) return true;\r\n return false;\r\n }\r\n\r\n /** Other top-layer popover owned by a nested component of this menu. */\r\n private isNestedOwnedPopover(node: Element, pop: HTMLElement): boolean {\r\n const otherPop = node.matches?.(\":popover-open\")\r\n ? node\r\n : node.closest?.(\":popover-open\");\r\n if (!otherPop || otherPop === pop) return false;\r\n const root = otherPop.getRootNode();\r\n const otherHost =\r\n root instanceof ShadowRoot ? root.host : otherPop.parentElement;\r\n return this.isOwnedByThisPopover(otherHost, pop);\r\n }\r\n\r\n\r\n\r\n async closePopover(reason: CloseReason = \"api\") {\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n\r\n this.lastCloseReason = reason;\r\n\r\n if (!this._open) {\r\n (pop as any).hidePopover?.();\r\n return;\r\n }\r\n\r\n this._open = false;\r\n // Restore focus before onOpenChange so the host can re-render with aria-hidden=\"true\"\r\n // without violating \"aria-hidden must not hide a focused element\" (focus is already on anchor).\r\n if (this.opts.getRestoreFocusOnClose()) this.restoreFocus();\r\n this.detachGlobalListenersIfAttached();\r\n this.opts.onOpenChange?.(false, { reason });\r\n\r\n const side = this.lastMeta.place;\r\n this.setSideAttr(side);\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n this.raf = 0;\r\n this.moveAnim?.cancel();\r\n await this.playPreset(pop, side, \"close\");\r\n\r\n (pop as any).hidePopover?.();\r\n }\r\n\r\n private normalizeFlipOrder(order?: PopoverSide[]) {\r\n const base: PopoverSide[] = [\"bottom\", \"top\", \"right\", \"left\"];\r\n if (!order || !order.length) return base;\r\n\r\n const valid = new Set<PopoverSide>([\"top\", \"bottom\", \"left\", \"right\"]);\r\n const out: PopoverSide[] = [];\r\n for (const s of order) if (valid.has(s) && !out.includes(s)) out.push(s);\r\n for (const s of base) if (!out.includes(s)) out.push(s);\r\n return out;\r\n }\r\n\r\n private defaultOrderFromPlacement(p: PopoverPlacement): PopoverSide[] {\r\n switch (p) {\r\n case \"top\": return [\"top\", \"bottom\", \"right\", \"left\"];\r\n case \"bottom\": return [\"bottom\", \"top\", \"right\", \"left\"];\r\n case \"left\": return [\"left\", \"right\", \"bottom\", \"top\"];\r\n case \"right\": return [\"right\", \"left\", \"bottom\", \"top\"];\r\n default: return [\"bottom\", \"top\", \"right\", \"left\"];\r\n }\r\n }\r\n\r\n position() {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const anchor = this.opts.getAnchor();\r\n const pop = this.opts.getPopover();\r\n if (!anchor || !pop) return;\r\n\r\n this.ensurePopoverMarginZero();\r\n\r\n const isActuallyVisible =\r\n (pop as any).matches?.(\":popover-open\") && pop.offsetParent !== null;\r\n\r\n const before = (this._open && isActuallyVisible) ? pop.getBoundingClientRect() : null;\r\n\r\n const pad = this.opts.getPadding();\r\n const gap = this.opts.getGap();\r\n\r\n const a = anchor.getBoundingClientRect();\r\n\r\n const vv = window.visualViewport ?? null;\r\n const vw = vv?.width ?? window.innerWidth;\r\n const vh = vv?.height ?? window.innerHeight;\r\n\r\n const offsetX = vv?.offsetLeft ?? 0;\r\n const offsetY = vv?.offsetTop ?? 0;\r\n\r\n if (this.opts.getMaxWidthToViewport()) {\r\n const maxW = Math.max(0, vw - pad * 2);\r\n pop.style.maxWidth = `${maxW}px`;\r\n pop.style.boxSizing = \"border-box\";\r\n }\r\n\r\n const pr = pop.getBoundingClientRect();\r\n const popW = pr.width || 220;\r\n const popH = pr.height || 50;\r\n\r\n const space = {\r\n top: a.top - gap - offsetY,\r\n bottom: vh - (a.bottom - offsetY) - gap,\r\n left: a.left - gap - offsetX,\r\n right: vw - (a.right - offsetX) - gap,\r\n };\r\n\r\n const fits = (side: PopoverSide) => {\r\n if (side === \"top\") return space.top >= popH;\r\n if (side === \"bottom\") return space.bottom >= popH;\r\n if (side === \"left\") return space.left >= popW;\r\n return space.right >= popW;\r\n };\r\n\r\n const requested = this.opts.getPlacement();\r\n const flipEnabled = this.opts.getFlip();\r\n\r\n const baseOrder =\r\n this.opts.getFlipOrder()?.length\r\n ? this.normalizeFlipOrder(this.opts.getFlipOrder())\r\n : this.normalizeFlipOrder(this.defaultOrderFromPlacement(requested));\r\n\r\n let place: PopoverSide;\r\n\r\n if (requested === \"auto\") {\r\n const firstFit = baseOrder.find(fits);\r\n place =\r\n firstFit ??\r\n (baseOrder\r\n .map((s) => [s, space[s]] as const)\r\n .sort((x, y) => y[1] - x[1])[0][0]);\r\n } else if (!flipEnabled) {\r\n place = requested as PopoverSide;\r\n } else {\r\n const req = requested as PopoverSide;\r\n const prioritized = baseOrder.includes(req)\r\n ? [req, ...baseOrder.filter((s) => s !== req)]\r\n : [req, ...baseOrder];\r\n\r\n const firstFit = prioritized.find(fits);\r\n place =\r\n firstFit ??\r\n (prioritized\r\n .map((s) => [s, space[s]] as const)\r\n .sort((x, y) => y[1] - x[1])[0][0]);\r\n }\r\n\r\n let top = 0;\r\n let left = 0;\r\n let arrowAlign: ArrowAlign = \"center\";\r\n\r\n const isRTL = getComputedStyle(anchor).direction === \"rtl\";\r\n let align = this.opts.getAlign();\r\n if (isRTL) {\r\n if (align === \"start\") align = \"end\";\r\n else if (align === \"end\") align = \"start\";\r\n }\r\n\r\n const ax1 = a.left - offsetX;\r\n const ax2 = a.right - offsetX;\r\n const ay1 = a.top - offsetY;\r\n const ay2 = a.bottom - offsetY;\r\n const aw = a.width;\r\n const ah = a.height;\r\n\r\n if (place === \"top\" || place === \"bottom\") {\r\n if (align === \"start\") left = ax1;\r\n else if (align === \"end\") left = ax2 - popW;\r\n else left = ax1 + aw / 2 - popW / 2;\r\n\r\n top = place === \"top\" ? ay1 - popH - gap : ay2 + gap;\r\n\r\n const clampedLeft = Math.max(pad, Math.min(vw - popW - pad, left));\r\n if (clampedLeft !== left) arrowAlign = clampedLeft <= pad + 0.5 ? \"start\" : \"end\";\r\n left = clampedLeft;\r\n\r\n top = Math.max(pad, Math.min(vh - popH - pad, top));\r\n } else {\r\n left = place === \"left\" ? ax1 - popW - gap : ax2 + gap;\r\n top = ay1 + ah / 2 - popH / 2;\r\n\r\n const clampedTop = Math.max(pad, Math.min(vh - popH - pad, top));\r\n if (clampedTop !== top) arrowAlign = clampedTop <= pad + 0.5 ? \"start\" : \"end\";\r\n top = clampedTop;\r\n\r\n left = Math.max(pad, Math.min(vw - popW - pad, left));\r\n }\r\n\r\n left += offsetX;\r\n top += offsetY;\r\n\r\n const hostEl = this.host as unknown as HTMLElement;\r\n\r\n if (this.opts.getMatchAnchorWidth()) {\r\n const maxW = Math.max(0, vw - pad * 2);\r\n const width = Math.min(a.width, maxW);\r\n hostEl.style.setProperty(this.opts.cssVarWidth, `${width}px`);\r\n } else {\r\n hostEl.style.removeProperty(this.opts.cssVarWidth);\r\n }\r\n\r\n hostEl.style.setProperty(this.opts.cssVarLeft, `${left}px`);\r\n hostEl.style.setProperty(this.opts.cssVarTop, `${top}px`);\r\n // Top-layer popovers do not reliably inherit custom props from the host.\r\n pop.style.setProperty(this.opts.cssVarLeft, `${left}px`);\r\n pop.style.setProperty(this.opts.cssVarTop, `${top}px`);\r\n if (this.opts.getMatchAnchorWidth()) {\r\n const width = hostEl.style.getPropertyValue(this.opts.cssVarWidth);\r\n if (width) pop.style.setProperty(this.opts.cssVarWidth, width);\r\n } else {\r\n pop.style.removeProperty(this.opts.cssVarWidth);\r\n }\r\n\r\n const prevPlace = this.lastMeta.place;\r\n this.lastMeta = { place, arrowAlign };\r\n this.setSideAttr(place);\r\n\r\n const canReposition =\r\n this._open &&\r\n this.opts.getAnimateReposition() &&\r\n before &&\r\n !this._skipNextReposition &&\r\n pop.matches?.(\":popover-open\") &&\r\n isActuallyVisible &&\r\n this._phase === \"open\" &&\r\n !this.presetAnim; // extra safety\r\n\r\n if (canReposition) {\r\n if (this.raf) cancelAnimationFrame(this.raf);\r\n this.raf = requestAnimationFrame(() => {\r\n const after = pop.getBoundingClientRect();\r\n this.animateMove(pop, before, after);\r\n });\r\n }\r\n\r\n this._skipNextReposition = false;\r\n }\r\n\r\n private vec(side: PopoverSide, v: number) {\r\n if (side === \"top\") return { x: 0, y: +v };\r\n if (side === \"bottom\") return { x: 0, y: -v };\r\n if (side === \"left\") return { x: +v, y: 0 };\r\n return { x: -v, y: 0 };\r\n }\r\n\r\n private prefersReducedMotion() {\r\n if (!this.opts.respectReducedMotion) return false;\r\n return typeof window !== \"undefined\"\r\n && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\")?.matches;\r\n }\r\n\r\n /** sets transformOrigin according to preset + side */\r\n private computeOrigin(side: PopoverSide, mode: PopoverPresetConfig[\"origin\"]) {\r\n if (mode === \"center\") return \"50% 50%\";\r\n if (mode === \"corner\") {\r\n // corner opposite of side looks best\r\n if (side === \"top\") return \"50% 100%\";\r\n if (side === \"bottom\") return \"50% 0%\";\r\n if (side === \"left\") return \"100% 50%\";\r\n return \"0% 50%\";\r\n }\r\n if (mode === \"anchor\") {\r\n // you can refine this using anchor rect; for now side-based is good\r\n if (side === \"top\") return \"50% 100%\";\r\n if (side === \"bottom\") return \"50% 0%\";\r\n if (side === \"left\") return \"100% 50%\";\r\n return \"0% 50%\";\r\n }\r\n // auto\r\n if (side === \"top\") return \"50% 100%\";\r\n if (side === \"bottom\") return \"50% 0%\";\r\n if (side === \"left\") return \"100% 50%\";\r\n return \"0% 50%\";\r\n }\r\n\r\n private kf(opacity: number, transform: string, filter?: string): Keyframe {\r\n const out: any = { opacity, transform };\r\n if (filter) out.filter = filter;\r\n return out as Keyframe;\r\n }\r\n\r\n // Preset registry\r\n private presetRegistry(): Record<PopoverPreset, PresetDef> {\r\n\r\n const fade: PresetDef = {\r\n name: \"fade\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n easingClose: \"cubic-bezier(0.4, 0, 0.2, 1)\",\r\n enterDuration: 180, exitDuration: 150,\r\n },\r\n getKeyframes: ({ phase }) =>\r\n phase === \"open\"\r\n ? [{ opacity: 0 }, { opacity: 1 }]\r\n : [{ opacity: 1 }, { opacity: 0 }],\r\n };\r\n\r\n const scale: PresetDef = {\r\n name: \"scale\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.9, exitScale: 0.95,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n easingClose: \"cubic-bezier(0.36, 0, 0.66, -0.56)\",\r\n enterDuration: 200, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, \"scale(1)\")]\r\n : [this.kf(1, \"scale(1)\"), this.kf(0, `scale(${cfg.exitScale})`)],\r\n };\r\n\r\n const slide: PresetDef = {\r\n name: \"slide\",\r\n defaults: {\r\n enterPx: 12, exitPx: 8, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.23, 1, 0.32, 1)\",\r\n easingClose: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n enterDuration: 250, exitDuration: 220,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px, 0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px, 0)`)];\r\n },\r\n };\r\n\r\n const iosMenu: PresetDef = {\r\n name: \"iosMenu\",\r\n defaults: {\r\n enterPx: 12, exitPx: 8, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 6, blurOutPx: 3, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n easingClose: \"cubic-bezier(0.55, 0.085, 0.68, 0.53)\",\r\n enterDuration: 250, exitDuration: 220,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `translate3d(${a.x}px, ${a.y}px, 0) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n this.kf(0, `translate3d(${b.x}px, ${b.y}px, 0) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ];\r\n },\r\n };\r\n\r\n const iosSheet: PresetDef = {\r\n name: \"iosSheet\",\r\n defaults: {\r\n enterPx: 16, exitPx: 12, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.36, 0, 0.66, -0.56)\",\r\n easingClose: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n enterDuration: 200, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`)];\r\n },\r\n };\r\n\r\n const materialMenu: PresetDef = {\r\n name: \"materialMenu\",\r\n defaults: {\r\n enterPx: 10, exitPx: 6, enterScale: 0.96, exitScale: 0.98,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n easingClose: \"cubic-bezier(0.4, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n ]\r\n : [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const materialSheet: PresetDef = {\r\n name: \"materialSheet\",\r\n defaults: {\r\n enterPx: 18, exitPx: 14, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.05, 0.7, 0.1, 1)\",\r\n easingClose: \"cubic-bezier(0.3, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`)];\r\n },\r\n };\r\n\r\n const floaty: PresetDef = {\r\n name: \"floaty\",\r\n defaults: {\r\n enterPx: 14, exitPx: 10, enterScale: 0.985, exitScale: 0.99,\r\n blurInPx: 10, blurOutPx: 6, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\r\n easingClose: \"cubic-bezier(0.55, 0.06, 0.68, 0.19)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"),\r\n this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ];\r\n },\r\n };\r\n\r\n const soft: PresetDef = {\r\n name: \"soft\",\r\n defaults: {\r\n enterPx: 10, exitPx: 8, enterScale: 0.97, exitScale: 0.98,\r\n blurInPx: 4, blurOutPx: 2, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.33, 1, 0.68, 1)\",\r\n easingClose: \"cubic-bezier(0.32, 0, 0.67, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`), this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\", \"blur(0px)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`)];\r\n },\r\n };\r\n\r\n const sharp: PresetDef = {\r\n name: \"sharp\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.2, 1)\",\r\n easingClose: \"cubic-bezier(0.4, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`), this.kf(1, \"translate3d(0,0,0) scale(1)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`)];\r\n },\r\n };\r\n\r\n const blurIn: PresetDef = {\r\n name: \"blurIn\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 1, exitScale: 1,\r\n blurInPx: 12, blurOutPx: 8, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n easingClose: \"cubic-bezier(0.33, 0, 0.67, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, \"translate3d(0,0,0)\", `blur(${cfg.blurInPx}px)`), this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\"), this.kf(0, \"translate3d(0,0,0)\", `blur(${cfg.blurOutPx}px)`)],\r\n };\r\n\r\n const blurFade: PresetDef = {\r\n name: \"blurFade\",\r\n defaults: {\r\n enterPx: 10, exitPx: 8, enterScale: 0.99, exitScale: 0.99,\r\n blurInPx: 10, blurOutPx: 6, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.45, 0, 0.55, 1)\",\r\n easingClose: \"cubic-bezier(0.3, 0, 0.7, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`, `blur(${cfg.blurInPx}px)`), this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\", \"blur(0px)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`, `blur(${cfg.blurOutPx}px)`)];\r\n },\r\n };\r\n\r\n const zoomFromAnchor: PresetDef = {\r\n name: \"zoomFromAnchor\",\r\n defaults: {\r\n enterPx: 6, exitPx: 4, enterScale: 0.92, exitScale: 0.96,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n easingClose: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const a = this.vec(side, cfg.enterPx);\r\n const b = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`), this.kf(1, \"translate3d(0,0,0) scale(1)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\"), this.kf(0, `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`)];\r\n },\r\n };\r\n\r\n const zoomFromCorner: PresetDef = {\r\n name: \"zoomFromCorner\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.88, exitScale: 0.94,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.18, 0.89, 0.32, 1.28)\",\r\n easingClose: \"cubic-bezier(0.6, -0.28, 0.74, 0.05)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, \"scale(1)\")]\r\n : [this.kf(1, \"scale(1)\"), this.kf(0, `scale(${cfg.exitScale})`)],\r\n };\r\n\r\n const flip3d: PresetDef = {\r\n name: \"flip3d\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 14, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n easingClose: \"cubic-bezier(0.33, 0, 0.67, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg, origin }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const axis = (side === \"left\" || side === \"right\") ? \"Y\" : \"X\";\r\n const sign = (side === \"top\" || side === \"left\") ? 1 : -1;\r\n const r = cfg.rotateDeg * sign;\r\n\r\n if (phase === \"open\") {\r\n return [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotate${axis}(${r}deg) scale(${cfg.enterScale})`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`),\r\n ];\r\n }\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v2.x}px, ${v2.y}px, 0) rotate${axis}(${r * 0.7}deg) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const card3d: PresetDef = {\r\n name: \"card3d\",\r\n defaults: {\r\n enterPx: 10, exitPx: 8, enterScale: 0.96, exitScale: 0.98,\r\n blurInPx: 6, blurOutPx: 3, perspectivePx: 1000,\r\n rotateDeg: 10, tiltDeg: 10, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n easingClose: \"cubic-bezier(0.55, 0.085, 0.68, 0.53)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const axis = (side === \"left\" || side === \"right\") ? \"Y\" : \"X\";\r\n const sign = (side === \"top\" || side === \"left\") ? 1 : -1;\r\n const t = cfg.tiltDeg * sign;\r\n\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotate${axis}(${t}deg) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`, \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`, \"blur(0px)\"),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${this.vec(side, cfg.exitPx).x}px, ${this.vec(side, cfg.exitPx).y}px, 0) rotate${axis}(${t * 0.7}deg) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ];\r\n },\r\n };\r\n\r\n const tilt3d: PresetDef = {\r\n name: \"tilt3d\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 12, origin: \"corner\",\r\n easingOpen: \"cubic-bezier(0.23, 1, 0.32, 1)\",\r\n easingClose: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const rx = (side === \"top\" ? cfg.tiltDeg : side === \"bottom\" ? -cfg.tiltDeg : 0);\r\n const ry = (side === \"left\" ? cfg.tiltDeg : side === \"right\" ? -cfg.tiltDeg : 0);\r\n\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotateX(${rx}deg) rotateY(${ry}deg) scale(${cfg.enterScale})`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateX(0deg) rotateY(0deg) scale(1)`),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateX(0deg) rotateY(0deg) scale(1)`),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${this.vec(side, cfg.exitPx).x}px, ${this.vec(side, cfg.exitPx).y}px, 0) rotateX(${rx * 0.6}deg) rotateY(${ry * 0.6}deg) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const depth3d: PresetDef = {\r\n name: \"depth3d\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.9, exitScale: 0.94,\r\n blurInPx: 8, blurOutPx: 5, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.22, 0.61, 0.36, 1)\",\r\n easingClose: \"cubic-bezier(0.55, 0.06, 0.68, 0.19)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(0,0,-40px) scale(${cfg.enterScale})`, `blur(${cfg.blurInPx}px)`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) scale(1)`, \"blur(0px)\"),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) scale(1)`, \"blur(0px)\"),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(0,0,-30px) scale(${cfg.exitScale})`, `blur(${cfg.blurOutPx}px)`),\r\n ],\r\n };\r\n\r\n const rotate3d: PresetDef = {\r\n name: \"rotate3d\",\r\n defaults: {\r\n enterPx: 8, exitPx: 6, enterScale: 0.98, exitScale: 0.99,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 12, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.36, 0, 0.66, -0.56)\",\r\n easingClose: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const sign = (side === \"top\" || side === \"left\") ? 1 : -1;\r\n const r = cfg.rotateDeg * sign;\r\n\r\n return phase === \"open\"\r\n ? [\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotateZ(${r}deg) scale(${cfg.enterScale})`),\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateZ(0deg) scale(1)`),\r\n ]\r\n : [\r\n this.kf(1, `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateZ(0deg) scale(1)`),\r\n this.kf(0, `perspective(${cfg.perspectivePx}px) translate3d(${this.vec(side, cfg.exitPx).x}px, ${this.vec(side, cfg.exitPx).y}px, 0) rotateZ(${r * 0.7}deg) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const springy: PresetDef = {\r\n name: \"springy\",\r\n defaults: {\r\n enterPx: 12, exitPx: 8, enterScale: 0.94, exitScale: 0.98,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.18, 1.15)\",\r\n easingClose: \"cubic-bezier(0.5, 0, 0.75, 0)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n if (phase === \"open\") {\r\n return [\r\n this.kf(0, `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`),\r\n this.kf(1, `translate3d(0,0,0) scale(1.02)`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n ];\r\n }\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const bouncy: PresetDef = {\r\n name: \"bouncy\",\r\n defaults: {\r\n enterPx: 14, exitPx: 10, enterScale: 0.9, exitScale: 0.96,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.18, 1.15)\",\r\n easingClose: \"cubic-bezier(0.6, -0.28, 0.74, 0.05)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n if (phase === \"open\") {\r\n return [\r\n this.kf(0, `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`),\r\n this.kf(1, \"translate3d(0,0,0) scale(1.03)\"),\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n ];\r\n }\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return [\r\n this.kf(1, \"translate3d(0,0,0) scale(1)\"),\r\n this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`),\r\n ];\r\n },\r\n };\r\n\r\n const glide: PresetDef = {\r\n name: \"glide\",\r\n defaults: {\r\n enterPx: 18, exitPx: 12, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.08, 0.82, 0.17, 1)\",\r\n easingClose: \"cubic-bezier(0.3, 0, 1, 1)\",\r\n enterDuration: 220, exitDuration: 200,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${v.x}px, ${v.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0)`)];\r\n },\r\n };\r\n\r\n const pop: PresetDef = {\r\n name: \"pop\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 0.85, exitScale: 0.95,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.18, 0.89, 0.32, 1.28)\",\r\n easingClose: \"cubic-bezier(0.6, -0.28, 0.74, 0.05)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, cfg }) =>\r\n phase === \"open\"\r\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, \"scale(1.03)\"), this.kf(1, \"scale(1)\")]\r\n : [this.kf(1, \"scale(1)\"), this.kf(0, `scale(${cfg.exitScale})`)],\r\n };\r\n\r\n const drop: PresetDef = {\r\n name: \"drop\",\r\n defaults: {\r\n enterPx: 22, exitPx: 14, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"center\",\r\n easingOpen: \"cubic-bezier(0.12, 0.9, 0.18, 1)\",\r\n easingClose: \"cubic-bezier(0.45, 0, 0.55, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${v.x}px, ${v.y}px,0)`), this.kf(1, \"translate3d(0,0,0)\")]\r\n : [this.kf(1, \"translate3d(0,0,0)\"), this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0)`)];\r\n },\r\n };\r\n\r\n const grow: PresetDef = {\r\n name: \"grow\",\r\n defaults: {\r\n enterPx: 6, exitPx: 4, enterScale: 0.95, exitScale: 0.98,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"anchor\",\r\n easingOpen: \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\r\n easingClose: \"cubic-bezier(0.25, 0.46, 0.45, 0.94)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: ({ phase, side, cfg }) => {\r\n const v = this.vec(side, cfg.enterPx);\r\n const v2 = this.vec(side, cfg.exitPx);\r\n return phase === \"open\"\r\n ? [this.kf(0, `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`), this.kf(1, \"translate3d(0,0,0) scale(1)\")]\r\n : [this.kf(1, \"translate3d(0,0,0) scale(1)\"), this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`)];\r\n },\r\n };\r\n\r\n const none: PresetDef = {\r\n name: \"none\",\r\n defaults: {\r\n enterPx: 0, exitPx: 0, enterScale: 1, exitScale: 1,\r\n blurInPx: 0, blurOutPx: 0, perspectivePx: 900,\r\n rotateDeg: 10, tiltDeg: 8, origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.16, 1, 0.3, 1)\",\r\n easingClose: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n enterDuration: 220, exitDuration: 180,\r\n },\r\n getKeyframes: () => [{ opacity: 1 }],\r\n };\r\n\r\n const floatAlias = floaty;\r\n\r\n return {\r\n none,\r\n fade,\r\n scale,\r\n slide,\r\n iosMenu,\r\n iosSheet,\r\n materialMenu,\r\n materialSheet,\r\n floaty: floatAlias,\r\n soft,\r\n sharp,\r\n blurIn,\r\n blurFade,\r\n zoomFromAnchor,\r\n zoomFromCorner,\r\n flip3d,\r\n card3d,\r\n tilt3d,\r\n depth3d,\r\n rotate3d,\r\n springy,\r\n bouncy,\r\n glide,\r\n pop,\r\n drop,\r\n grow,\r\n };\r\n }\r\n\r\n // Update the getPresetKeyframes method:\r\n private getPresetKeyframes(\r\n preset: PopoverPreset,\r\n side: PopoverSide,\r\n phase: \"open\" | \"close\",\r\n overrides?: PopoverPresetConfig,\r\n ) {\r\n const reg = this.presetRegistry();\r\n const def = reg[preset] ?? reg.iosMenu;\r\n\r\n // Merge base defaults with preset defaults, then with overrides\r\n const baseDefaults = this.getBaseDefaults();\r\n const cfg = {\r\n\r\n ...def.defaults,\r\n ...(overrides ?? {})\r\n } as Required<PopoverPresetConfig>;\r\n\r\n const origin = this.computeOrigin(side, cfg.origin);\r\n\r\n return {\r\n keyframes: def.getKeyframes({ side, phase, cfg, origin }),\r\n cfg,\r\n origin\r\n };\r\n }\r\n\r\n // Add this helper method for base defaults:\r\n private getBaseDefaults(): Required<PopoverPresetConfig> {\r\n return {\r\n enterPx: 12,\r\n exitPx: 8,\r\n enterScale: 0.98,\r\n exitScale: 0.99,\r\n blurInPx: 6,\r\n blurOutPx: 3,\r\n perspectivePx: 900,\r\n rotateDeg: 10,\r\n tiltDeg: 8,\r\n origin: \"auto\",\r\n easingOpen: \"cubic-bezier(0.16, 1, 0.3, 1)\",\r\n easingClose: \"cubic-bezier(0.2, 0, 0, 1)\",\r\n enterDuration: 220,\r\n exitDuration: 180,\r\n };\r\n }\r\n\r\n private async playPreset(pop: HTMLElement, side: PopoverSide, phase: \"open\" | \"close\") {\r\n this.checkForConflictingCSS(pop);\r\n if (this.prefersReducedMotion()) return;\r\n\r\n const preset = this.opts.getPreset();\r\n if (preset === \"none\") return;\r\n\r\n // cancel transform-related animations\r\n this.moveAnim?.cancel();\r\n this.presetAnim?.cancel();\r\n\r\n this._phase = phase === \"open\" ? \"opening\" : \"closing\";\r\n\r\n pop.style.transition = \"none\";\r\n\r\n\r\n // Get keyframes and config for the current preset\r\n const { keyframes, cfg, origin } = this.getPresetKeyframes(preset, side, phase);\r\n\r\n // Use duration from config, fallback to controller options\r\n const duration = phase === \"open\" ? cfg.enterDuration : cfg.exitDuration;\r\n\r\n const is3d = this.is3dPreset(preset);\r\n if (is3d) {\r\n pop.style.transformStyle = \"preserve-3d\";\r\n pop.style.backfaceVisibility = \"hidden\";\r\n // Perspective lives in the transform; do not set it here.\r\n } else {\r\n pop.style.transformStyle = \"\";\r\n pop.style.backfaceVisibility = \"\";\r\n }\r\n pop.style.transformOrigin = origin;\r\n\r\n const easing = phase === \"open\" ? cfg.easingOpen : cfg.easingClose;\r\n\r\n const anim = pop.animate(keyframes as any, {\r\n duration,\r\n easing,\r\n fill: \"both\",\r\n });\r\n\r\n this.presetAnim = anim;\r\n\r\n try {\r\n await anim.finished;\r\n } catch {\r\n // cancelled is fine\r\n } finally {\r\n if (this.presetAnim === anim) this.presetAnim = undefined;\r\n pop.style.transition = \"\";\r\n if (is3d) {\r\n pop.style.transformStyle = \"\";\r\n pop.style.backfaceVisibility = \"\";\r\n }\r\n\r\n this._phase = phase === \"open\" ? \"open\" : \"idle\";\r\n }\r\n }\r\n\r\n private checkForConflictingCSS(pop: HTMLElement) {\r\n const transitions = pop.style.transition || \"\";\r\n\r\n // Check for conflicting CSS transitions\r\n if (transitions.includes(\"transform\") && transitions.includes(\"opacity\")) {\r\n console.warn(\r\n \"Warning: Using 3D animation (WAAPI) alongside CSS transitions on 'transform' or 'opacity' can cause conflicts. Consider removing CSS transitions on these properties.\"\r\n );\r\n }\r\n\r\n if (transitions.includes(\"margin\") || transitions.includes(\"padding\")) {\r\n console.warn(\r\n \"Warning: Animating 'margin' or 'padding' alongside 3D animation (WAAPI) may cause visual glitches. Please avoid transitioning these properties during WAAPI animations.\"\r\n );\r\n }\r\n }\r\n\r\n private animateMove(pop: HTMLElement, from: DOMRect, to: DOMRect) {\r\n if (this._phase !== \"open\") return;\r\n\r\n const dx = from.left - to.left;\r\n const dy = from.top - to.top;\r\n if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) return;\r\n\r\n this.moveAnim?.cancel();\r\n\r\n const duration = this.opts.getRepositionMs();\r\n\r\n const anim = pop.animate(\r\n [\r\n { transform: `translate3d(${dx}px, ${dy}px, 0)` },\r\n { transform: \"translate3d(0, 0, 0)\" },\r\n ],\r\n {\r\n duration,\r\n easing: \"cubic-bezier(0.16, 1, 0.3, 1)\",\r\n fill: \"both\",\r\n },\r\n );\r\n\r\n this.moveAnim = anim;\r\n anim.finished.finally(() => {\r\n if (this.moveAnim === anim) this.moveAnim = undefined;\r\n });\r\n }\r\n\r\n private is3dPreset(preset: PopoverPreset) {\r\n return (\r\n preset === \"flip3d\" ||\r\n preset === \"card3d\" ||\r\n preset === \"tilt3d\" ||\r\n preset === \"depth3d\" ||\r\n preset === \"rotate3d\"\r\n );\r\n }\r\n\r\n private setSideAttr(side: PopoverSide) {\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n pop.setAttribute(this.opts.sideAttr, side);\r\n }\r\n\r\n private setupObserversAndScrollParents() {\r\n if (typeof window === \"undefined\") return;\r\n\r\n const anchor = this.opts.getAnchor();\r\n const pop = this.opts.getPopover();\r\n\r\n if (anchor && \"ResizeObserver\" in window) {\r\n this.anchorRO?.disconnect();\r\n this.anchorRO = new ResizeObserver(() => {\r\n if (this._open) this.position();\r\n });\r\n this.anchorRO.observe(anchor);\r\n }\r\n\r\n if (pop && \"ResizeObserver\" in window) {\r\n this.popoverRO?.disconnect();\r\n this.popoverRO = new ResizeObserver(() => {\r\n if (this._open) this.position();\r\n });\r\n this.popoverRO.observe(pop);\r\n }\r\n\r\n this.teardownScrollParents();\r\n\r\n const mode = this.opts.scrollContainer;\r\n if (mode === \"window\") return;\r\n\r\n if (mode instanceof HTMLElement) {\r\n this.bindScroll(mode);\r\n return;\r\n }\r\n\r\n if (anchor) {\r\n for (const p of this.getScrollParents(anchor)) this.bindScroll(p);\r\n }\r\n }\r\n\r\n private bindScroll(el: HTMLElement) {\r\n const fn = this.onViewportMove as EventListener;\r\n el.addEventListener(\"scroll\", fn, { passive: true });\r\n this.boundScrollParents.push({ el, fn });\r\n }\r\n\r\n private teardownScrollParents() {\r\n for (const { el, fn } of this.boundScrollParents) {\r\n (el as any).removeEventListener?.(\"scroll\", fn);\r\n }\r\n this.boundScrollParents = [];\r\n }\r\n\r\n private getScrollParents(node: HTMLElement): HTMLElement[] {\r\n const parents: HTMLElement[] = [];\r\n let el: HTMLElement | null = node.parentElement;\r\n\r\n while (el && el !== document.body) {\r\n const style = getComputedStyle(el);\r\n const overflowY = style.overflowY;\r\n const overflowX = style.overflowX;\r\n\r\n const canScrollY =\r\n (overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\") &&\r\n el.scrollHeight > el.clientHeight;\r\n\r\n const canScrollX =\r\n (overflowX === \"auto\" || overflowX === \"scroll\" || overflowX === \"overlay\") &&\r\n el.scrollWidth > el.clientWidth;\r\n\r\n if (canScrollY || canScrollX) parents.push(el);\r\n el = el.parentElement;\r\n }\r\n\r\n return parents;\r\n }\r\n\r\n private onViewportMove = () => {\r\n if (this._open) this.position();\r\n };\r\n\r\n private onKeydown = (e: KeyboardEvent) => {\r\n if (!this._open) return;\r\n if (e.key !== \"Escape\") return;\r\n\r\n if (!this.opts.getCloseOnEscape()) return;\r\n\r\n const pop = this.opts.getPopover();\r\n const anchor = this.opts.getAnchor();\r\n const active = document.activeElement;\r\n\r\n const withinPopover = !!(pop && active && pop.contains(active));\r\n const onAnchor = !!(anchor && active && anchor.contains(active));\r\n\r\n if (withinPopover || onAnchor) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.closePopover(\"escape\");\r\n }\r\n };\r\n\r\n private onGroupOpen = (e: CustomEvent) => {\r\n const other = e.detail?.id;\r\n const mine = this.opts.groupId ?? this.host;\r\n\r\n if (other === mine || !this._open) return;\r\n\r\n // Nested menus share the group event; keep ancestors/descendants open.\r\n if (other instanceof Node && this.host instanceof Node) {\r\n if (this.host.contains(other) || other.contains(this.host as Node)) return;\r\n }\r\n\r\n this.closePopover(\"group\");\r\n };\r\n\r\n private captureFocusBeforeOpen() {\r\n this.lastFocusedEl = document.activeElement;\r\n }\r\n\r\n private elementIsTriggerRelated(el: EventTarget | null | undefined): boolean {\r\n if (!(el instanceof HTMLElement)) return false;\r\n\r\n const anchor = this.opts.getAnchor();\r\n const focusTarget = this.opts.getFocusTarget?.() ?? null;\r\n\r\n if (focusTarget && (el === focusTarget || focusTarget.contains(el))) {\r\n return true;\r\n }\r\n if (!anchor) return false;\r\n if (el === anchor || anchor.contains(el)) return true;\r\n if (anchor.shadowRoot?.contains(el)) return true;\r\n return false;\r\n }\r\n\r\n private restoreFocus() {\r\n if (!this.opts.getRestoreFocusOnClose()) return;\r\n\r\n const anchor = this.opts.getAnchor();\r\n if (!anchor) return;\r\n\r\n const focusTarget = this.opts.getFocusTarget?.() ?? anchor;\r\n const active = document.activeElement;\r\n const last = this.lastFocusedEl;\r\n const pop = this.opts.getPopover();\r\n\r\n const lastWasInsidePopover = !!(pop && last && pop.contains(last));\r\n const lastWasInsideTrigger = this.elementIsTriggerRelated(last);\r\n const activeInsidePopover = !!(pop && active && pop.contains(active));\r\n\r\n if (activeInsidePopover || lastWasInsidePopover || lastWasInsideTrigger) {\r\n focusTarget.focus?.({ preventScroll: true });\r\n }\r\n }\r\n\r\n private ensurePopoverMarginZero() {\r\n const pop = this.opts.getPopover();\r\n if (!pop) return;\r\n if (!pop.style.margin) pop.style.margin = \"0\";\r\n }\r\n\r\n /**\r\n * Utility method to manually update a specific option\r\n * (Useful for edge cases where you need direct control)\r\n */\r\n updateOption<T extends keyof typeof this.opts>(\r\n key: T,\r\n value: typeof this.opts[T]\r\n ) {\r\n if (typeof value === \"function\") {\r\n // For getters, replace the function\r\n (this.opts as any)[key] = value;\r\n } else {\r\n // For other values, wrap in a getter\r\n (this.opts as any)[key] = () => value;\r\n }\r\n\r\n if (this._open && key.startsWith(\"get\")) {\r\n // Reposition if open and a positioning property changed\r\n this.position();\r\n }\r\n }\r\n}"],"names":["PopoverController","constructor","host","options","this","_open","raf","boundScrollParents","_listenersAttached","lastCloseReason","lastFocusedEl","hasEverOpened","_skipNextReposition","lastMeta","place","arrowAlign","_phase","onToggle","e","pop","opts","getPopover","ev","isOpen","newState","matches","detachGlobalListenersIfAttached","onOpenChange","reason","getRestoreFocusOnClose","restoreFocus","attachGlobalListeners","position","requestAnimationFrame","focusOnOpen","onDocumentPointerDown","getCloseOnOutside","anchor","getAnchor","button","path","composedPath","insidePopover","includes","insideAnchor","node","Element","isNestedOwnedPopover","x","clientX","y","clientY","window","innerWidth","innerHeight","ignoreAttr","getIgnoreOutsideAttr","ignoreSel","getIgnoreOutsideSelector","trim","HTMLElement","hasAttribute","isOwnedByThisPopover","matched","closest","closePopover","onViewportMove","onKeydown","key","getCloseOnEscape","active","document","activeElement","withinPopover","contains","onAnchor","preventDefault","stopPropagation","onGroupOpen","other","detail","id","groupId","Node","addController","dur","duration","closeDur","closeDuration","Math","min","getPlacement","createGetter","placement","getAlign","align","getGap","gap","getPadding","padding","getMatchAnchorWidth","matchAnchorWidth","getMaxWidthToViewport","maxWidthToViewport","getMaxWidthMode","maxWidthMode","getFlip","flip","getFlipOrder","flipOrder","getPreset","preset","getDuration","getCloseDuration","getAnimateReposition","animateReposition","getRepositionMs","repositionMs","closeOnEscape","closeOnOutside","ignoreOutsideSelector","ignoreOutsideAttr","restoreFocusOnClose","cssVarLeft","cssVarTop","cssVarWidth","scrollContainer","groupEventName","getFocusTarget","sideAttr","respectReducedMotion","getter","staticValue","defaultValue","open","meta","hostConnected","visualViewport","hostDisconnected","cancelAnimationFrame","addEventListener","passive","capture","setupObserversAndScrollParents","removeEventListener","teardownScrollParents","anchorRO","disconnect","popoverRO","refreshTargets","toggle","openPopover","dispatchEvent","CustomEvent","captureFocusBeforeOpen","ensurePopoverMarginZero","prevVisibility","style","visibility","showPopover","wasEverOpen","getBoundingClientRect","side","setSideAttr","playPreset","then","el","hostEl","otherPop","root","getRootNode","otherHost","ShadowRoot","parentElement","hidePopover","moveAnim","cancel","normalizeFlipOrder","order","base","length","valid","Set","out","s","has","push","defaultOrderFromPlacement","p","isActuallyVisible","offsetParent","before","pad","a","vv","vw","width","vh","height","offsetX","offsetLeft","offsetY","offsetTop","maxW","max","maxWidth","boxSizing","pr","popW","popH","space","top","bottom","left","right","fits","requested","flipEnabled","baseOrder","find","map","sort","req","prioritized","filter","isRTL","getComputedStyle","direction","ax1","ax2","ay1","ay2","aw","ah","clampedLeft","clampedTop","setProperty","removeProperty","getPropertyValue","presetAnim","after","animateMove","vec","v","prefersReducedMotion","matchMedia","computeOrigin","mode","kf","opacity","transform","presetRegistry","none","name","defaults","enterPx","exitPx","enterScale","exitScale","blurInPx","blurOutPx","perspectivePx","rotateDeg","tiltDeg","origin","easingOpen","easingClose","enterDuration","exitDuration","getKeyframes","fade","phase","scale","cfg","slide","b","iosMenu","iosSheet","materialMenu","materialSheet","floaty","soft","sharp","blurIn","blurFade","zoomFromAnchor","zoomFromCorner","flip3d","axis","sign","r","v2","card3d","t","tilt3d","rx","ry","depth3d","rotate3d","springy","bouncy","glide","drop","grow","getPresetKeyframes","overrides","reg","def","getBaseDefaults","keyframes","checkForConflictingCSS","transition","is3d","is3dPreset","transformStyle","backfaceVisibility","transformOrigin","easing","anim","animate","fill","finished","transitions","console","warn","from","to","dx","dy","abs","finally","setAttribute","ResizeObserver","observe","bindScroll","getScrollParents","fn","parents","body","overflowY","overflowX","canScrollY","scrollHeight","clientHeight","canScrollX","scrollWidth","clientWidth","elementIsTriggerRelated","focusTarget","shadowRoot","last","lastWasInsidePopover","lastWasInsideTrigger","focus","preventScroll","margin","updateOption","value","startsWith"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{html}from"lit";export{AnimationController}from"./helper/controllers/animation-controller.js";export{COMBOBOX_RENDERERS_STATE_KEY,SkyCombobox}from"./sky-combobox/sky-combobox.js";export{CONTRAST_COLOR_SUPPORT_QUERY,ON_COLOR_FALLBACK_DARK,ON_COLOR_FALLBACK_LIGHT,contrastOnFill,contrastOverlay,contrastThemeInk,cssContrastColor,cssOnFill,cssOnFillEnhance,isLightFill,parseCssRgb,perceivedLuminance,relativeLuminance}from"./helper/utils/contrast-color.js";export{ColorResolver,DEFAULT_COLOR_TOKENS,colorResolver,createGradient,darkShade,fadeMix,hoverShade,isDefaultColorToken,lightShade,parseGradientSpec,resolveAccentColorForToken,resolveColor,resolveGradientStop,resolveInkColorForToken,resolveSemanticSurfaceKey,semanticSoftSurfaceTokens,skyBorderPrimaryShorthand,skyBorderWidthSolid,tuneSurfaceVariantForDefaultColor}from"./helper/utils/color-resolver.js";export{EMPTY_ARRAY,arrayPropHasChanged,coerceArray}from"./helper/utils/stable-array.js";export{FormControlBase}from"./helper/internals/form-control-base.js";export{PopoverController}from"./helper/controllers/popover-controller.js";export{PresetController}from"./helper/controllers/preset-controller.js";export{SkyAlert}from"./sky-alert/sky-alert.js";export{SkyAppbar}from"./sky-appbar/sky-appbar.js";export{SkyAvatar}from"./sky-avatar/sky-avatar.js";export{SkyBadge}from"./sky-badge/sky-badge.js";export{SkyButton}from"./sky-button/sky-button.js";export{SkyCard}from"./sky-card/sky-card.js";export{SkyCheckbox}from"./sky-checkbox/sky-checkbox.js";export{SkyChip}from"./sky-chip/sky-chip.js";export{SkyCol}from"./sky-col/sky-col.js";export{SkyDialog}from"./sky-dialog/sky-dialog.js";export{SkyDivider}from"./sky-divider/sky-divider.js";export{SkyFlexbox}from"./sky-flexbox/sky-flexbox.js";export{SkyFlexcol}from"./sky-flexcol/sky-flexcol.js";export{SkyForm}from"./sky-form/sky-form.js";export{SkyGrid}from"./sky-grid/sky-grid.js";export{SkyIcon}from"./sky-icon/sky-icon.js";export{SkyImage}from"./sky-image/sky-image.js";export{SkyInput}from"./sky-input/sky-input.js";export{SkyList}from"./sky-list/sky-list.js";export{SkyListitem}from"./sky-listitem/sky-listitem.js";export{SkyRadio}from"./sky-radio/sky-radio.js";export{SkyRow}from"./sky-row/sky-row.js";export{SkySheet,resolveSheetRadius}from"./sky-sheet/sky-sheet.js";export{SkySimpleTable}from"./sky-simple-table/sky-simple-table.js";export{SkyThemeProvider,defaultTheme,getCurrentTheme,getThemePreference,mergeTheme,onThemeChange,resolveActualTheme,themeContext}from"./sky-theme-provider/sky-theme-provider.js";export{applyPresetLayer,camelToKebab,captureBuiltInPropSnapshot,captureInitialUserAttributes,clearAppliedPresetLayer,configContext,finalizeBuiltInPropSnapshot,findNearestPresetsConfig,getPresetLayer,isSkyCompositeInternal,isUserSetProp,lookupPresetSection,markUserSetProp,mergePresetsConfig,presetKeyAliases,refreshUserAttributes,resolveComponentProps,toPresetTagKey}from"./helper/utils/component-presets.js";export{extractIconNames,fetchIconsForOffline,registerOfflineIcons}from"./helper/iconify-offline.js";export{resolveRadius}from"./helper/utils/size-resolver.js";
|
|
1
|
+
export{html}from"lit";export{AnimationController}from"./helper/controllers/animation-controller.js";export{COMBOBOX_RENDERERS_STATE_KEY,SkyCombobox}from"./sky-combobox/sky-combobox.js";export{CONTRAST_COLOR_SUPPORT_QUERY,ON_COLOR_FALLBACK_DARK,ON_COLOR_FALLBACK_LIGHT,contrastOnFill,contrastOverlay,contrastThemeInk,cssContrastColor,cssOnFill,cssOnFillEnhance,isLightFill,parseCssRgb,perceivedLuminance,relativeLuminance}from"./helper/utils/contrast-color.js";export{ColorResolver,DEFAULT_COLOR_TOKENS,colorResolver,createGradient,darkShade,fadeMix,hoverShade,isDefaultColorToken,lightShade,parseGradientSpec,resolveAccentColorForToken,resolveColor,resolveGradientStop,resolveInkColorForToken,resolveSemanticSurfaceKey,semanticSoftSurfaceTokens,skyBorderPrimaryShorthand,skyBorderWidthSolid,tuneSurfaceVariantForDefaultColor}from"./helper/utils/color-resolver.js";export{EMPTY_ARRAY,arrayPropHasChanged,coerceArray}from"./helper/utils/stable-array.js";export{FormControlBase}from"./helper/internals/form-control-base.js";export{PopoverController}from"./helper/controllers/popover-controller.js";export{PresetController}from"./helper/controllers/preset-controller.js";export{SkyAlert}from"./sky-alert/sky-alert.js";export{SkyAppbar}from"./sky-appbar/sky-appbar.js";export{SkyAvatar}from"./sky-avatar/sky-avatar.js";export{SkyBadge}from"./sky-badge/sky-badge.js";export{SkyButton}from"./sky-button/sky-button.js";export{SkyCard}from"./sky-card/sky-card.js";export{SkyCheckbox}from"./sky-checkbox/sky-checkbox.js";export{SkyChip}from"./sky-chip/sky-chip.js";export{SkyCol}from"./sky-col/sky-col.js";export{SkyColorPicker}from"./sky-color-picker/sky-color-picker.js";export{SkyDialog}from"./sky-dialog/sky-dialog.js";export{SkyDivider}from"./sky-divider/sky-divider.js";export{SkyFlexbox}from"./sky-flexbox/sky-flexbox.js";export{SkyFlexcol}from"./sky-flexcol/sky-flexcol.js";export{SkyForm}from"./sky-form/sky-form.js";export{SkyGrid}from"./sky-grid/sky-grid.js";export{SkyIcon}from"./sky-icon/sky-icon.js";export{SkyImage}from"./sky-image/sky-image.js";export{SkyInput}from"./sky-input/sky-input.js";export{SkyList}from"./sky-list/sky-list.js";export{SkyListitem}from"./sky-listitem/sky-listitem.js";export{SkyRadio}from"./sky-radio/sky-radio.js";export{SkyRow}from"./sky-row/sky-row.js";export{SkySheet,resolveSheetRadius}from"./sky-sheet/sky-sheet.js";export{SkySimpleTable}from"./sky-simple-table/sky-simple-table.js";export{SkyThemeProvider,defaultTheme,getCurrentTheme,getThemePreference,mergeTheme,onThemeChange,resolveActualTheme,themeContext}from"./sky-theme-provider/sky-theme-provider.js";export{applyPresetLayer,camelToKebab,captureBuiltInPropSnapshot,captureInitialUserAttributes,clearAppliedPresetLayer,configContext,finalizeBuiltInPropSnapshot,findNearestPresetsConfig,getPresetLayer,isSkyCompositeInternal,isUserSetProp,lookupPresetSection,markUserSetProp,mergePresetsConfig,presetKeyAliases,refreshUserAttributes,resolveComponentProps,toPresetTagKey}from"./helper/utils/component-presets.js";export{extractIconNames,fetchIconsForOffline,registerOfflineIcons}from"./helper/iconify-offline.js";export{resolveRadius}from"./helper/utils/size-resolver.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -40,6 +40,7 @@ import{unsafeCSS as t,css as o,LitElement as r,html as e,nothing as n}from"lit";
|
|
|
40
40
|
min-width: var(--btn-min-width, auto);
|
|
41
41
|
aspect-ratio: 1;
|
|
42
42
|
gap: 0;
|
|
43
|
+
line-height: 0;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
:host([variant="link"]) button {
|
|
@@ -193,10 +194,14 @@ import{unsafeCSS as t,css as o,LitElement as r,html as e,nothing as n}from"lit";
|
|
|
193
194
|
}
|
|
194
195
|
}
|
|
195
196
|
sky-icon {
|
|
196
|
-
display:
|
|
197
|
+
display: flex;
|
|
198
|
+
align-items: center;
|
|
199
|
+
justify-content: center;
|
|
200
|
+
flex-shrink: 0;
|
|
197
201
|
width: 1em;
|
|
198
202
|
height: 1em;
|
|
199
203
|
font-size: var(--icon-size, 18px);
|
|
204
|
+
line-height: 0;
|
|
200
205
|
backdrop-filter: none;
|
|
201
206
|
-webkit-backdrop-filter: none;
|
|
202
207
|
}
|