@sky.ui/core 0.0.38 → 0.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-elements.json +2399 -2312
- package/dist/helper/controllers/animation-controller.d.ts +4 -4
- package/dist/helper/controllers/animation-controller.js.map +1 -1
- package/dist/helper/controllers/popover-controller.d.ts +11 -11
- package/dist/helper/controllers/popover-controller.js.map +1 -1
- package/dist/helper/iconify-offline.js.map +1 -1
- package/dist/helper/index.js +1 -1
- package/dist/helper/internals/form-control-base.d.ts +4 -4
- package/dist/helper/internals/form-control-base.js.map +1 -1
- package/dist/helper/utils/color-resolver.d.ts +9 -1
- package/dist/helper/utils/color-resolver.js +1 -1
- package/dist/helper/utils/color-resolver.js.map +1 -1
- package/dist/helper/utils/contrast-color.d.ts +128 -0
- package/dist/helper/utils/contrast-color.js +2 -0
- package/dist/helper/utils/contrast-color.js.map +1 -0
- package/dist/helper/utils/index.d.ts +1 -0
- package/dist/helper/utils/index.js +1 -1
- package/dist/helper/utils/size-resolver.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/sky-alert/sky-alert.d.ts +5 -5
- package/dist/sky-alert/sky-alert.js +28 -16
- package/dist/sky-alert/sky-alert.js.map +1 -1
- package/dist/sky-appbar/sky-appbar.d.ts +2 -2
- package/dist/sky-appbar/sky-appbar.js +20 -27
- package/dist/sky-appbar/sky-appbar.js.map +1 -1
- package/dist/sky-avatar/sky-avatar.d.ts +3 -3
- package/dist/sky-avatar/sky-avatar.js +8 -11
- package/dist/sky-avatar/sky-avatar.js.map +1 -1
- package/dist/sky-badge/sky-badge.d.ts +5 -5
- package/dist/sky-badge/sky-badge.js +22 -14
- package/dist/sky-badge/sky-badge.js.map +1 -1
- package/dist/sky-button/sky-button.d.ts +5 -5
- package/dist/sky-button/sky-button.js +38 -26
- package/dist/sky-button/sky-button.js.map +1 -1
- package/dist/sky-card/sky-card.d.ts +5 -5
- package/dist/sky-card/sky-card.js +20 -20
- package/dist/sky-card/sky-card.js.map +1 -1
- package/dist/sky-checkbox/sky-checkbox.d.ts +2 -2
- package/dist/sky-checkbox/sky-checkbox.js +78 -68
- package/dist/sky-checkbox/sky-checkbox.js.map +1 -1
- package/dist/sky-chip/sky-chip.d.ts +3 -3
- package/dist/sky-chip/sky-chip.js +48 -36
- package/dist/sky-chip/sky-chip.js.map +1 -1
- package/dist/sky-col/sky-col.d.ts +4 -4
- package/dist/sky-col/sky-col.js +8 -3
- package/dist/sky-col/sky-col.js.map +1 -1
- package/dist/sky-combobox/sky-combobox.d.ts +22 -9
- package/dist/sky-combobox/sky-combobox.js +792 -336
- package/dist/sky-combobox/sky-combobox.js.map +1 -1
- package/dist/sky-dialog/sky-dialog.d.ts +4 -4
- package/dist/sky-dialog/sky-dialog.js +17 -19
- package/dist/sky-dialog/sky-dialog.js.map +1 -1
- package/dist/sky-divider/sky-divider.d.ts +3 -3
- package/dist/sky-divider/sky-divider.js.map +1 -1
- package/dist/sky-flexbox/sky-flexbox.d.ts +7 -7
- package/dist/sky-flexbox/sky-flexbox.js +2 -2
- package/dist/sky-flexbox/sky-flexbox.js.map +1 -1
- package/dist/sky-flexcol/sky-flexcol.d.ts +3 -3
- package/dist/sky-flexcol/sky-flexcol.js.map +1 -1
- package/dist/sky-form/sky-form.d.ts +12 -12
- package/dist/sky-form/sky-form.js +12 -12
- package/dist/sky-form/sky-form.js.map +1 -1
- package/dist/sky-grid/sky-grid.d.ts +2 -2
- package/dist/sky-grid/sky-grid.js.map +1 -1
- package/dist/sky-icon/sky-icon.d.ts +1 -1
- package/dist/sky-icon/sky-icon.js +1 -1
- package/dist/sky-icon/sky-icon.js.map +1 -1
- package/dist/sky-image/sky-image.d.ts +5 -5
- package/dist/sky-image/sky-image.js.map +1 -1
- package/dist/sky-image/srcset-utils.js.map +1 -1
- package/dist/sky-input/sky-input.d.ts +8 -7
- package/dist/sky-input/sky-input.js +489 -202
- package/dist/sky-input/sky-input.js.map +1 -1
- package/dist/sky-list/sky-list.d.ts +4 -4
- package/dist/sky-list/sky-list.js +1 -3
- package/dist/sky-list/sky-list.js.map +1 -1
- package/dist/sky-listitem/sky-listitem.d.ts +2 -2
- package/dist/sky-listitem/sky-listitem.js +4 -7
- package/dist/sky-listitem/sky-listitem.js.map +1 -1
- package/dist/sky-radio/sky-radio.d.ts +5 -3
- package/dist/sky-radio/sky-radio.js +33 -15
- package/dist/sky-radio/sky-radio.js.map +1 -1
- package/dist/sky-row/sky-row.d.ts +2 -2
- package/dist/sky-row/sky-row.js.map +1 -1
- package/dist/sky-sheet/sky-sheet.d.ts +6 -6
- package/dist/sky-sheet/sky-sheet.js +21 -21
- package/dist/sky-sheet/sky-sheet.js.map +1 -1
- package/dist/sky-simple-table/sky-simple-table.d.ts +4 -4
- package/dist/sky-simple-table/sky-simple-table.js +4 -1
- package/dist/sky-simple-table/sky-simple-table.js.map +1 -1
- package/dist/sky-theme-provider/sky-theme-provider.d.ts +27 -27
- 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 +2 -2
|
@@ -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/** ✅ Presets: consumer only names it */\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 /* -------------------------------- Lifecycle -------------------------------- */\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 /* -------------------------------- Open/Close -------------------------------- */\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 // ✅ prevent first-paint flicker at wrong position\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 // 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 // ✅ real outside click\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 /* -------------------------------- Positioning -------------------------------- */\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 // ✅ Use getters to get current values\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 // ✅ Get current values via getters\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\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 /* -------------------------------- WAAPI Presets -------------------------------- */\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 // ✅ Get current preset via getter\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 /* ---------------- 3D SAFETY LOGIC ---------------- */\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 // DON'T set perspective here - it's already in the transform\r\n } else {\r\n pop.style.transformStyle = \"\";\r\n pop.style.backfaceVisibility = \"\";\r\n }\r\n /* -------------------------------------------------- */\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 /* -------------------------------- Move Animation (Flip Smooth) -------------------------------- */\r\n\r\n private animateMove(pop: HTMLElement, from: DOMRect, to: DOMRect) {\r\n if (this._phase !== \"open\") return; // ✅ hard gate\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 // ✅ Get current reposition duration via getter\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 /* -------------------------------- Observers & Scroll Parents -------------------------------- */\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 /* -------------------------------- Close / Focus / Group -------------------------------- */\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 // ✅ Check if escape closing is enabled via getter\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 /* -------------------------------- CSS Guard -------------------------------- */\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 /* -------------------------------- Utility Methods -------------------------------- */\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","x","clientX","y","clientY","window","innerWidth","innerHeight","ignoreAttr","getIgnoreOutsideAttr","ignoreSel","getIgnoreOutsideSelector","trim","node","HTMLElement","hasAttribute","closest","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","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":"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"}
|
|
1
|
+
{"version":3,"file":"popover-controller.js","sources":["../../../src/helper/controllers/popover-controller.ts"],"sourcesContent":["import type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nexport type PopoverSide = 'top' | 'bottom' | 'left' | 'right';\nexport type PopoverPlacement = PopoverSide | 'auto';\nexport type PopoverAlign = 'start' | 'center' | 'end';\nexport type MaxWidthMode = 'cap' | 'fill';\nexport type CloseReason =\n 'api' | 'toggle' | 'escape' | 'light-dismiss' | 'group';\ntype ArrowAlign = 'center' | 'start' | 'end';\ntype ScrollContainerMode = 'auto' | 'window';\n\n/** ✅ Presets: consumer only names it */\nexport type PopoverPreset =\n | 'none'\n | 'fade'\n | 'scale'\n | 'slide'\n | 'iosMenu'\n | 'iosSheet'\n | 'materialMenu'\n | 'materialSheet'\n | 'floaty'\n | 'soft'\n | 'sharp'\n | 'blurIn'\n | 'blurFade'\n | 'zoomFromAnchor'\n | 'zoomFromCorner'\n | 'flip3d'\n | 'card3d'\n | 'tilt3d'\n | 'depth3d'\n | 'rotate3d'\n | 'springy'\n | 'bouncy'\n | 'glide'\n | 'pop'\n | 'drop'\n | 'grow';\n\nexport type PopoverPresetConfig = {\n enterPx?: number; // translate distance\n exitPx?: number;\n enterScale?: number;\n exitScale?: number;\n blurInPx?: number;\n blurOutPx?: number;\n perspectivePx?: number;\n rotateDeg?: number; // 3d rotation magnitude\n tiltDeg?: number; // 3d tilt magnitude\n origin?: 'auto' | 'anchor' | 'center' | 'corner';\n easingOpen?: string;\n easingClose?: string;\n enterDuration?: number;\n exitDuration?: number;\n};\n\ntype PresetDef = {\n name: PopoverPreset;\n defaults: Required<PopoverPresetConfig>;\n getKeyframes: (args: {\n side: PopoverSide;\n phase: 'open' | 'close';\n cfg: Required<PopoverPresetConfig>;\n origin: string;\n }) => Keyframe[];\n};\n\nexport interface PopoverControllerOptions {\n // Required functions\n getAnchor: () => HTMLElement | null;\n getPopover: () => HTMLElement | null;\n\n // CSS variable names\n cssVarLeft?: string;\n cssVarTop?: string;\n cssVarWidth?: string;\n\n // ---------- Reactive Property Getters ----------\n // (Preferred - automatically update when component properties change)\n getPlacement?: () => PopoverPlacement;\n getAlign?: () => PopoverAlign;\n getGap?: () => number;\n getPadding?: () => number;\n getMatchAnchorWidth?: () => boolean;\n getMaxWidthToViewport?: () => boolean;\n getMaxWidthMode?: () => MaxWidthMode;\n getFlip?: () => boolean;\n getFlipOrder?: () => PopoverSide[];\n getPreset?: () => PopoverPreset;\n getDuration?: () => number;\n getCloseDuration?: () => number;\n getAnimateReposition?: () => boolean;\n getRepositionMs?: () => number;\n getCloseOnEscape?: () => boolean;\n getRestoreFocusOnClose?: () => boolean;\n getCloseOnOutside?: () => boolean;\n getIgnoreOutsideSelector?: () => string;\n getIgnoreOutsideAttr?: () => string;\n\n // ---------- Static Fallback Values ----------\n // (For backward compatibility or when values don't change)\n placement?: PopoverPlacement;\n align?: PopoverAlign;\n gap?: number;\n padding?: number;\n matchAnchorWidth?: boolean;\n maxWidthToViewport?: boolean;\n maxWidthMode?: MaxWidthMode;\n flip?: boolean;\n flipOrder?: PopoverSide[];\n preset?: PopoverPreset;\n duration?: number;\n closeDuration?: number;\n animateReposition?: boolean;\n repositionMs?: number;\n closeOnEscape?: boolean;\n restoreFocusOnClose?: boolean;\n closeOnOutside?: boolean;\n ignoreOutsideSelector?: string;\n ignoreOutsideAttr?: string;\n\n // ---------- Scroll and Focus ----------\n focusOnOpen?: () => void;\n scrollContainer?: ScrollContainerMode | HTMLElement;\n\n // ---------- Group Behavior ----------\n groupEventName?: string;\n groupId?: unknown;\n\n // ---------- Callbacks ----------\n onOpenChange?: (open: boolean, meta: { reason: CloseReason }) => void;\n /** Focus target on close; defaults to {@link getAnchor} when omitted. */\n getFocusTarget?: () => HTMLElement | null;\n\n // ---------- Other Options ----------\n sideAttr?: string;\n respectReducedMotion?: boolean;\n}\n\n/**\n * PopoverController with Reactive Getter Bindings\n * - Automatically reads latest values from host component via getter functions\n * - No manual updates needed when host properties change\n * - WAAPI preset animations with side-aware enter/exit\n * - Smooth reposition animation on flip/move\n */\nexport class PopoverController implements ReactiveController {\n private host: ReactiveControllerHost;\n private _open = false;\n\n private raf = 0;\n\n private anchorRO?: ResizeObserver;\n private popoverRO?: ResizeObserver;\n\n private boundScrollParents: Array<{ el: EventTarget; fn: EventListener }> =\n [];\n private visualViewport?: VisualViewport;\n /** When true, global listeners and observers are attached (deferred until first open for perf with many instances). */\n private _listenersAttached = false;\n\n private lastCloseReason: CloseReason = 'toggle';\n private lastFocusedEl: Element | null = null;\n\n private hasEverOpened = false;\n private _skipNextReposition = false;\n\n private lastMeta: { place: PopoverSide; arrowAlign: ArrowAlign } = {\n place: 'bottom',\n arrowAlign: 'center',\n };\n\n private _phase: 'idle' | 'opening' | 'open' | 'closing' = 'idle';\n private presetAnim?: Animation;\n private moveAnim?: Animation;\n\n // Helper to create getters with fallback to static values\n private static createGetter<T>(\n getter: (() => T) | undefined,\n staticValue: T | undefined,\n defaultValue: T\n ): () => T {\n return getter || (() => staticValue ?? defaultValue);\n }\n\n private opts: {\n // Required functions\n getAnchor: () => HTMLElement | null;\n getPopover: () => HTMLElement | null;\n\n // Reactive property getters\n getPlacement: () => PopoverPlacement;\n getAlign: () => PopoverAlign;\n getGap: () => number;\n getPadding: () => number;\n getMatchAnchorWidth: () => boolean;\n getMaxWidthToViewport: () => boolean;\n getMaxWidthMode: () => MaxWidthMode;\n getFlip: () => boolean;\n getFlipOrder: () => PopoverSide[];\n getPreset: () => PopoverPreset;\n getDuration: () => number;\n getCloseDuration: () => number;\n getAnimateReposition: () => boolean;\n getRepositionMs: () => number;\n getCloseOnEscape: () => boolean;\n getRestoreFocusOnClose: () => boolean;\n getCloseOnOutside: () => boolean;\n getIgnoreOutsideSelector: () => string;\n getIgnoreOutsideAttr: () => string;\n\n // Other options\n cssVarLeft: string;\n cssVarTop: string;\n cssVarWidth: string;\n focusOnOpen?: () => void;\n scrollContainer: ScrollContainerMode | HTMLElement;\n groupEventName?: string;\n groupId?: unknown;\n onOpenChange?: (open: boolean, meta: { reason: CloseReason }) => void;\n getFocusTarget?: () => HTMLElement | null;\n sideAttr: string;\n respectReducedMotion: boolean;\n };\n\n constructor(host: ReactiveControllerHost, options: PopoverControllerOptions) {\n this.host = host;\n host.addController(this);\n\n // Initialize getters with fallback values\n const dur = options.duration ?? 220;\n const closeDur = options.closeDuration ?? Math.min(180, dur);\n\n this.opts = {\n // Required functions\n getAnchor: options.getAnchor,\n getPopover: options.getPopover,\n\n // Reactive property getters\n getPlacement: PopoverController.createGetter(\n options.getPlacement,\n options.placement,\n 'auto'\n ),\n getAlign: PopoverController.createGetter(\n options.getAlign,\n options.align,\n 'start'\n ),\n getGap: PopoverController.createGetter(options.getGap, options.gap, 6),\n getPadding: PopoverController.createGetter(\n options.getPadding,\n options.padding,\n 8\n ),\n getMatchAnchorWidth: PopoverController.createGetter(\n options.getMatchAnchorWidth,\n options.matchAnchorWidth,\n true\n ),\n getMaxWidthToViewport: PopoverController.createGetter(\n options.getMaxWidthToViewport,\n options.maxWidthToViewport,\n true\n ),\n getMaxWidthMode: PopoverController.createGetter(\n options.getMaxWidthMode,\n options.maxWidthMode,\n 'cap'\n ),\n getFlip: PopoverController.createGetter(\n options.getFlip,\n options.flip,\n true\n ),\n getFlipOrder: PopoverController.createGetter(\n options.getFlipOrder,\n options.flipOrder,\n []\n ),\n getPreset: PopoverController.createGetter(\n options.getPreset,\n options.preset,\n 'slide'\n ),\n getDuration: PopoverController.createGetter(\n options.getDuration,\n options.duration,\n dur\n ),\n getCloseDuration: PopoverController.createGetter(\n options.getCloseDuration,\n options.closeDuration,\n closeDur\n ),\n getAnimateReposition: PopoverController.createGetter(\n options.getAnimateReposition,\n options.animateReposition,\n true\n ),\n getRepositionMs: PopoverController.createGetter(\n options.getRepositionMs,\n options.repositionMs,\n 160\n ),\n getCloseOnEscape: PopoverController.createGetter(\n options.getCloseOnEscape,\n options.closeOnEscape,\n true\n ),\n getCloseOnOutside: PopoverController.createGetter(\n options.getCloseOnOutside,\n options.closeOnOutside,\n false\n ),\n\n getIgnoreOutsideSelector: PopoverController.createGetter(\n options.getIgnoreOutsideSelector,\n options.ignoreOutsideSelector,\n '' // none by default\n ),\n\n getIgnoreOutsideAttr: PopoverController.createGetter(\n options.getIgnoreOutsideAttr,\n options.ignoreOutsideAttr,\n 'data-popover-ignore-outside'\n ),\n getRestoreFocusOnClose: PopoverController.createGetter(\n options.getRestoreFocusOnClose,\n options.restoreFocusOnClose,\n true\n ),\n\n // Other options\n cssVarLeft: options.cssVarLeft ?? '--sky-pop-left',\n cssVarTop: options.cssVarTop ?? '--sky-pop-top',\n cssVarWidth: options.cssVarWidth ?? '--sky-pop-width',\n focusOnOpen: options.focusOnOpen,\n scrollContainer: options.scrollContainer ?? 'auto',\n groupEventName: options.groupEventName,\n groupId: options.groupId,\n onOpenChange: options.onOpenChange,\n getFocusTarget: options.getFocusTarget,\n sideAttr: options.sideAttr ?? 'data-side',\n respectReducedMotion: options.respectReducedMotion ?? true,\n };\n }\n\n get open() {\n return this._open;\n }\n\n get meta() {\n return this.lastMeta;\n }\n\n /* -------------------------------- Lifecycle -------------------------------- */\n\n hostConnected() {\n if (typeof window === 'undefined') return;\n this.visualViewport = window.visualViewport ?? undefined;\n // Defer global listeners and observers until first open (avoids N×listeners with many instances, e.g. combobox in every flow node).\n }\n\n hostDisconnected() {\n this.detachGlobalListenersIfAttached();\n if (this.raf) cancelAnimationFrame(this.raf);\n }\n\n /** Attach window/document listeners and observers. Called on first open. */\n private attachGlobalListeners() {\n if (typeof window === 'undefined' || this._listenersAttached) return;\n this._listenersAttached = true;\n\n if (this.visualViewport) {\n this.visualViewport.addEventListener('resize', this.onViewportMove, {\n passive: true,\n });\n this.visualViewport.addEventListener('scroll', this.onViewportMove, {\n passive: true,\n });\n }\n window.addEventListener('resize', this.onViewportMove, { passive: true });\n window.addEventListener('scroll', this.onViewportMove, {\n passive: true,\n capture: true,\n });\n\n if (this.opts.groupEventName) {\n window.addEventListener(\n this.opts.groupEventName,\n this.onGroupOpen as EventListener\n );\n }\n if (this.opts.getCloseOnEscape()) {\n window.addEventListener('keydown', this.onKeydown, true);\n }\n document.addEventListener('pointerdown', this.onDocumentPointerDown, true);\n\n this.setupObserversAndScrollParents();\n }\n\n /** Remove window/document listeners and observers. Called on close and on hostDisconnected. */\n private detachGlobalListenersIfAttached() {\n if (!this._listenersAttached) return;\n this._listenersAttached = false;\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onViewportMove);\n window.removeEventListener('scroll', this.onViewportMove, true);\n if (this.visualViewport) {\n this.visualViewport.removeEventListener('resize', this.onViewportMove);\n this.visualViewport.removeEventListener('scroll', this.onViewportMove);\n }\n if (this.opts.groupEventName) {\n window.removeEventListener(\n this.opts.groupEventName,\n this.onGroupOpen as EventListener\n );\n }\n window.removeEventListener('keydown', this.onKeydown, true);\n }\n document.removeEventListener(\n 'pointerdown',\n this.onDocumentPointerDown,\n true\n );\n\n this.teardownScrollParents();\n this.anchorRO?.disconnect();\n this.anchorRO = undefined;\n this.popoverRO?.disconnect();\n this.popoverRO = undefined;\n }\n\n refreshTargets() {\n if (this._listenersAttached) this.setupObserversAndScrollParents();\n if (this._open) this.position();\n }\n\n /* -------------------------------- Open/Close -------------------------------- */\n\n /** Wire to popover element: @toggle=${controller.onToggle} */\n onToggle = (e: Event) => {\n if (this.lastCloseReason === 'light-dismiss') {\n this.lastCloseReason = 'toggle';\n return;\n }\n const pop = this.opts.getPopover();\n const ev = e as any;\n\n let isOpen: boolean | null = null;\n if (typeof ev?.newState === 'string') isOpen = ev.newState === 'open';\n if (isOpen === null && pop)\n isOpen = pop.matches?.(':popover-open') ?? false;\n if (isOpen === null) return;\n\n if (!isOpen) {\n this._open = false;\n this.detachGlobalListenersIfAttached();\n this.opts.onOpenChange?.(false, { reason: this.lastCloseReason });\n if (this.opts.getRestoreFocusOnClose()) this.restoreFocus();\n return;\n }\n\n this._open = true;\n this.attachGlobalListeners();\n this.opts.onOpenChange?.(true, { reason: 'toggle' });\n\n this.position();\n this.raf = requestAnimationFrame(() => this.opts.focusOnOpen?.());\n };\n\n toggle() {\n this._open ? this.closePopover('api') : this.openPopover();\n }\n\n openPopover() {\n if (this.raf) cancelAnimationFrame(this.raf);\n this.raf = 0;\n const pop = this.opts.getPopover();\n if (!pop) return;\n\n if (typeof window !== 'undefined' && this.opts.groupEventName) {\n window.dispatchEvent(\n new CustomEvent(this.opts.groupEventName, {\n detail: { id: this.opts.groupId ?? this.host },\n })\n );\n }\n\n this.captureFocusBeforeOpen();\n this.ensurePopoverMarginZero();\n\n this._open = true;\n this.attachGlobalListeners();\n this.opts.onOpenChange?.(true, { reason: 'api' });\n\n // ✅ prevent first-paint flicker at wrong position\n const prevVisibility = pop.style.visibility;\n pop.style.visibility = 'hidden';\n\n (pop as any).showPopover?.();\n const wasEverOpen = this.hasEverOpened;\n this.hasEverOpened = true;\n\n // later: pass this to position or set a field\n this._skipNextReposition = !wasEverOpen;\n\n // 1) compute and apply css-var position ASAP\n this.position();\n\n // 2) force style/layout flush so left/top vars take effect before animation\n pop.getBoundingClientRect();\n\n // 3) now animate + reveal\n const side = this.lastMeta.place;\n this.setSideAttr(side);\n\n // reveal on next frame so hidden state doesn't get captured mid-animation\n this.raf = requestAnimationFrame(() => {\n pop.style.visibility = prevVisibility || 'visible';\n\n this.playPreset(pop, side, 'open').then(() => this.opts.focusOnOpen?.());\n });\n }\n\n private onDocumentPointerDown = (e: PointerEvent) => {\n if (!this._open) return;\n if (!this.opts.getCloseOnOutside()) return;\n\n const pop = this.opts.getPopover();\n const anchor = this.opts.getAnchor();\n if (!pop || !anchor) return;\n\n // ignore non-primary clicks\n if (typeof e.button === 'number' && e.button !== 0) return;\n\n const path = (e.composedPath?.() ?? []) as EventTarget[];\n\n // If click is on anchor or inside popover => not outside\n const insidePopover = path.includes(pop);\n const insideAnchor = path.includes(anchor);\n if (insidePopover || insideAnchor) return;\n\n // Ignore scrollbar clicks (rare but real)\n const x = e.clientX,\n y = e.clientY;\n if (x >= window.innerWidth || y >= window.innerHeight) return;\n\n // Ignore zones: attr + selector\n const ignoreAttr = this.opts.getIgnoreOutsideAttr();\n const ignoreSel = (this.opts.getIgnoreOutsideSelector() || '').trim();\n\n for (const node of path) {\n if (!(node instanceof HTMLElement)) continue;\n\n // attr ignore\n if (ignoreAttr && node.hasAttribute(ignoreAttr)) return;\n\n // selector ignore\n if (ignoreSel) {\n // If any node in the path matches OR is inside an element that matches\n if (node.matches(ignoreSel)) return;\n if (node.closest(ignoreSel)) return;\n }\n }\n\n // ✅ real outside click\n this.closePopover('light-dismiss');\n };\n\n async closePopover(reason: CloseReason = 'api') {\n const pop = this.opts.getPopover();\n if (!pop) return;\n\n this.lastCloseReason = reason;\n\n if (!this._open) {\n (pop as any).hidePopover?.();\n return;\n }\n\n this._open = false;\n // Restore focus before onOpenChange so the host can re-render with aria-hidden=\"true\"\n // without violating \"aria-hidden must not hide a focused element\" (focus is already on anchor).\n if (this.opts.getRestoreFocusOnClose()) this.restoreFocus();\n this.detachGlobalListenersIfAttached();\n this.opts.onOpenChange?.(false, { reason });\n\n const side = this.lastMeta.place;\n this.setSideAttr(side);\n if (this.raf) cancelAnimationFrame(this.raf);\n this.raf = 0;\n this.moveAnim?.cancel();\n await this.playPreset(pop, side, 'close');\n\n (pop as any).hidePopover?.();\n }\n\n /* -------------------------------- Positioning -------------------------------- */\n\n private normalizeFlipOrder(order?: PopoverSide[]) {\n const base: PopoverSide[] = ['bottom', 'top', 'right', 'left'];\n if (!order || !order.length) return base;\n\n const valid = new Set<PopoverSide>(['top', 'bottom', 'left', 'right']);\n const out: PopoverSide[] = [];\n for (const s of order) if (valid.has(s) && !out.includes(s)) out.push(s);\n for (const s of base) if (!out.includes(s)) out.push(s);\n return out;\n }\n\n private defaultOrderFromPlacement(p: PopoverPlacement): PopoverSide[] {\n switch (p) {\n case 'top':\n return ['top', 'bottom', 'right', 'left'];\n case 'bottom':\n return ['bottom', 'top', 'right', 'left'];\n case 'left':\n return ['left', 'right', 'bottom', 'top'];\n case 'right':\n return ['right', 'left', 'bottom', 'top'];\n default:\n return ['bottom', 'top', 'right', 'left'];\n }\n }\n\n position() {\n if (typeof window === 'undefined') return;\n\n const anchor = this.opts.getAnchor();\n const pop = this.opts.getPopover();\n if (!anchor || !pop) return;\n\n this.ensurePopoverMarginZero();\n\n const isActuallyVisible =\n (pop as any).matches?.(':popover-open') && pop.offsetParent !== null;\n\n const before =\n this._open && isActuallyVisible ? pop.getBoundingClientRect() : null;\n\n // ✅ Use getters to get current values\n const pad = this.opts.getPadding();\n const gap = this.opts.getGap();\n\n const a = anchor.getBoundingClientRect();\n\n const vv = window.visualViewport ?? null;\n const vw = vv?.width ?? window.innerWidth;\n const vh = vv?.height ?? window.innerHeight;\n\n const offsetX = vv?.offsetLeft ?? 0;\n const offsetY = vv?.offsetTop ?? 0;\n\n if (this.opts.getMaxWidthToViewport()) {\n const maxW = Math.max(0, vw - pad * 2);\n pop.style.maxWidth = `${maxW}px`;\n pop.style.boxSizing = 'border-box';\n }\n\n const pr = pop.getBoundingClientRect();\n const popW = pr.width || 220;\n const popH = pr.height || 50;\n\n const space = {\n top: a.top - gap - offsetY,\n bottom: vh - (a.bottom - offsetY) - gap,\n left: a.left - gap - offsetX,\n right: vw - (a.right - offsetX) - gap,\n };\n\n const fits = (side: PopoverSide) => {\n if (side === 'top') return space.top >= popH;\n if (side === 'bottom') return space.bottom >= popH;\n if (side === 'left') return space.left >= popW;\n return space.right >= popW;\n };\n\n // ✅ Get current values via getters\n const requested = this.opts.getPlacement();\n const flipEnabled = this.opts.getFlip();\n\n const baseOrder = this.opts.getFlipOrder()?.length\n ? this.normalizeFlipOrder(this.opts.getFlipOrder())\n : this.normalizeFlipOrder(this.defaultOrderFromPlacement(requested));\n\n let place: PopoverSide;\n\n if (requested === 'auto') {\n const firstFit = baseOrder.find(fits);\n place =\n firstFit ??\n baseOrder\n .map((s) => [s, space[s]] as const)\n .sort((x, y) => y[1] - x[1])[0][0];\n } else if (!flipEnabled) {\n place = requested as PopoverSide;\n } else {\n const req = requested as PopoverSide;\n const prioritized = baseOrder.includes(req)\n ? [req, ...baseOrder.filter((s) => s !== req)]\n : [req, ...baseOrder];\n\n const firstFit = prioritized.find(fits);\n place =\n firstFit ??\n prioritized\n .map((s) => [s, space[s]] as const)\n .sort((x, y) => y[1] - x[1])[0][0];\n }\n\n let top = 0;\n let left = 0;\n let arrowAlign: ArrowAlign = 'center';\n\n const isRTL = getComputedStyle(anchor).direction === 'rtl';\n let align = this.opts.getAlign();\n if (isRTL) {\n if (align === 'start') align = 'end';\n else if (align === 'end') align = 'start';\n }\n\n const ax1 = a.left - offsetX;\n const ax2 = a.right - offsetX;\n const ay1 = a.top - offsetY;\n const ay2 = a.bottom - offsetY;\n const aw = a.width;\n const ah = a.height;\n\n if (place === 'top' || place === 'bottom') {\n if (align === 'start') left = ax1;\n else if (align === 'end') left = ax2 - popW;\n else left = ax1 + aw / 2 - popW / 2;\n\n top = place === 'top' ? ay1 - popH - gap : ay2 + gap;\n\n const clampedLeft = Math.max(pad, Math.min(vw - popW - pad, left));\n if (clampedLeft !== left)\n arrowAlign = clampedLeft <= pad + 0.5 ? 'start' : 'end';\n left = clampedLeft;\n\n top = Math.max(pad, Math.min(vh - popH - pad, top));\n } else {\n left = place === 'left' ? ax1 - popW - gap : ax2 + gap;\n top = ay1 + ah / 2 - popH / 2;\n\n const clampedTop = Math.max(pad, Math.min(vh - popH - pad, top));\n if (clampedTop !== top)\n arrowAlign = clampedTop <= pad + 0.5 ? 'start' : 'end';\n top = clampedTop;\n\n left = Math.max(pad, Math.min(vw - popW - pad, left));\n }\n\n left += offsetX;\n top += offsetY;\n\n const hostEl = this.host as unknown as HTMLElement;\n\n if (this.opts.getMatchAnchorWidth()) {\n const maxW = Math.max(0, vw - pad * 2);\n const width = Math.min(a.width, maxW);\n hostEl.style.setProperty(this.opts.cssVarWidth, `${width}px`);\n } else {\n hostEl.style.removeProperty(this.opts.cssVarWidth);\n }\n\n hostEl.style.setProperty(this.opts.cssVarLeft, `${left}px`);\n hostEl.style.setProperty(this.opts.cssVarTop, `${top}px`);\n\n const prevPlace = this.lastMeta.place;\n this.lastMeta = { place, arrowAlign };\n this.setSideAttr(place);\n\n const canReposition =\n this._open &&\n this.opts.getAnimateReposition() &&\n before &&\n !this._skipNextReposition &&\n pop.matches?.(':popover-open') &&\n isActuallyVisible &&\n this._phase === 'open' &&\n !this.presetAnim; // extra safety\n\n if (canReposition) {\n if (this.raf) cancelAnimationFrame(this.raf);\n this.raf = requestAnimationFrame(() => {\n const after = pop.getBoundingClientRect();\n this.animateMove(pop, before, after);\n });\n }\n\n this._skipNextReposition = false;\n }\n\n /* -------------------------------- WAAPI Presets -------------------------------- */\n\n private vec(side: PopoverSide, v: number) {\n if (side === 'top') return { x: 0, y: +v };\n if (side === 'bottom') return { x: 0, y: -v };\n if (side === 'left') return { x: +v, y: 0 };\n return { x: -v, y: 0 };\n }\n\n private prefersReducedMotion() {\n if (!this.opts.respectReducedMotion) return false;\n return (\n typeof window !== 'undefined' &&\n window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches\n );\n }\n\n /** sets transformOrigin according to preset + side */\n private computeOrigin(\n side: PopoverSide,\n mode: PopoverPresetConfig['origin']\n ) {\n if (mode === 'center') return '50% 50%';\n if (mode === 'corner') {\n // corner opposite of side looks best\n if (side === 'top') return '50% 100%';\n if (side === 'bottom') return '50% 0%';\n if (side === 'left') return '100% 50%';\n return '0% 50%';\n }\n if (mode === 'anchor') {\n // you can refine this using anchor rect; for now side-based is good\n if (side === 'top') return '50% 100%';\n if (side === 'bottom') return '50% 0%';\n if (side === 'left') return '100% 50%';\n return '0% 50%';\n }\n // auto\n if (side === 'top') return '50% 100%';\n if (side === 'bottom') return '50% 0%';\n if (side === 'left') return '100% 50%';\n return '0% 50%';\n }\n\n private kf(opacity: number, transform: string, filter?: string): Keyframe {\n const out: any = { opacity, transform };\n if (filter) out.filter = filter;\n return out as Keyframe;\n }\n\n // ---------- preset registry ----------\n private presetRegistry(): Record<PopoverPreset, PresetDef> {\n const fade: PresetDef = {\n name: 'fade',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.4, 0, 0.2, 1)',\n easingClose: 'cubic-bezier(0.4, 0, 0.2, 1)',\n enterDuration: 180,\n exitDuration: 150,\n },\n getKeyframes: ({ phase }) =>\n phase === 'open'\n ? [{ opacity: 0 }, { opacity: 1 }]\n : [{ opacity: 1 }, { opacity: 0 }],\n };\n\n const scale: PresetDef = {\n name: 'scale',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 0.9,\n exitScale: 0.95,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'corner',\n easingOpen: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n easingClose: 'cubic-bezier(0.36, 0, 0.66, -0.56)',\n enterDuration: 200,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, cfg }) =>\n phase === 'open'\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, 'scale(1)')]\n : [this.kf(1, 'scale(1)'), this.kf(0, `scale(${cfg.exitScale})`)],\n };\n\n const slide: PresetDef = {\n name: 'slide',\n defaults: {\n enterPx: 12,\n exitPx: 8,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'auto',\n easingOpen: 'cubic-bezier(0.23, 1, 0.32, 1)',\n easingClose: 'cubic-bezier(0.5, 0, 0.75, 0)',\n enterDuration: 250,\n exitDuration: 220,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(0, `translate3d(${a.x}px, ${a.y}px, 0)`),\n this.kf(1, 'translate3d(0,0,0)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)'),\n this.kf(0, `translate3d(${b.x}px, ${b.y}px, 0)`),\n ];\n },\n };\n\n const iosMenu: PresetDef = {\n name: 'iosMenu',\n defaults: {\n enterPx: 12,\n exitPx: 8,\n enterScale: 0.98,\n exitScale: 0.99,\n blurInPx: 6,\n blurOutPx: 3,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'auto',\n easingOpen: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n easingClose: 'cubic-bezier(0.55, 0.085, 0.68, 0.53)',\n enterDuration: 250,\n exitDuration: 220,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px, 0) scale(${cfg.enterScale})`,\n `blur(${cfg.blurInPx}px)`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)', 'blur(0px)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)', 'blur(0px)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px, 0) scale(${cfg.exitScale})`,\n `blur(${cfg.blurOutPx}px)`\n ),\n ];\n },\n };\n\n const iosSheet: PresetDef = {\n name: 'iosSheet',\n defaults: {\n enterPx: 16,\n exitPx: 12,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'auto',\n easingOpen: 'cubic-bezier(0.36, 0, 0.66, -0.56)',\n easingClose: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n enterDuration: 200,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`),\n this.kf(1, 'translate3d(0,0,0)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)'),\n this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`),\n ];\n },\n };\n\n const materialMenu: PresetDef = {\n name: 'materialMenu',\n defaults: {\n enterPx: 10,\n exitPx: 6,\n enterScale: 0.96,\n exitScale: 0.98,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'corner',\n easingOpen: 'cubic-bezier(0.2, 0, 0, 1)',\n easingClose: 'cubic-bezier(0.4, 0, 1, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const materialSheet: PresetDef = {\n name: 'materialSheet',\n defaults: {\n enterPx: 18,\n exitPx: 14,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'auto',\n easingOpen: 'cubic-bezier(0.05, 0.7, 0.1, 1)',\n easingClose: 'cubic-bezier(0.3, 0, 1, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(0, `translate3d(${a.x}px, ${a.y}px,0)`),\n this.kf(1, 'translate3d(0,0,0)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)'),\n this.kf(0, `translate3d(${b.x}px, ${b.y}px,0)`),\n ];\n },\n };\n\n const floaty: PresetDef = {\n name: 'floaty',\n defaults: {\n enterPx: 14,\n exitPx: 10,\n enterScale: 0.985,\n exitScale: 0.99,\n blurInPx: 10,\n blurOutPx: 6,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.22, 0.61, 0.36, 1)',\n easingClose: 'cubic-bezier(0.55, 0.06, 0.68, 0.19)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`,\n `blur(${cfg.blurInPx}px)`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)', 'blur(0px)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)', 'blur(0px)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`,\n `blur(${cfg.blurOutPx}px)`\n ),\n ];\n },\n };\n\n const soft: PresetDef = {\n name: 'soft',\n defaults: {\n enterPx: 10,\n exitPx: 8,\n enterScale: 0.97,\n exitScale: 0.98,\n blurInPx: 4,\n blurOutPx: 2,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.33, 1, 0.68, 1)',\n easingClose: 'cubic-bezier(0.32, 0, 0.67, 0)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`,\n `blur(${cfg.blurInPx}px)`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)', 'blur(0px)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)', 'blur(0px)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`,\n `blur(${cfg.blurOutPx}px)`\n ),\n ];\n },\n };\n\n const sharp: PresetDef = {\n name: 'sharp',\n defaults: {\n enterPx: 8,\n exitPx: 6,\n enterScale: 0.98,\n exitScale: 0.99,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'corner',\n easingOpen: 'cubic-bezier(0.12, 0.9, 0.2, 1)',\n easingClose: 'cubic-bezier(0.4, 0, 1, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const blurIn: PresetDef = {\n name: 'blurIn',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 12,\n blurOutPx: 8,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.5, 0, 0.75, 0)',\n easingClose: 'cubic-bezier(0.33, 0, 0.67, 0)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, cfg }) =>\n phase === 'open'\n ? [\n this.kf(0, 'translate3d(0,0,0)', `blur(${cfg.blurInPx}px)`),\n this.kf(1, 'translate3d(0,0,0)', 'blur(0px)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)', 'blur(0px)'),\n this.kf(0, 'translate3d(0,0,0)', `blur(${cfg.blurOutPx}px)`),\n ],\n };\n\n const blurFade: PresetDef = {\n name: 'blurFade',\n defaults: {\n enterPx: 10,\n exitPx: 8,\n enterScale: 0.99,\n exitScale: 0.99,\n blurInPx: 10,\n blurOutPx: 6,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.45, 0, 0.55, 1)',\n easingClose: 'cubic-bezier(0.3, 0, 0.7, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px,0)`,\n `blur(${cfg.blurInPx}px)`\n ),\n this.kf(1, 'translate3d(0,0,0)', 'blur(0px)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)', 'blur(0px)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px,0)`,\n `blur(${cfg.blurOutPx}px)`\n ),\n ];\n },\n };\n\n const zoomFromAnchor: PresetDef = {\n name: 'zoomFromAnchor',\n defaults: {\n enterPx: 6,\n exitPx: 4,\n enterScale: 0.92,\n exitScale: 0.96,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'anchor',\n easingOpen: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n easingClose: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const a = this.vec(side, cfg.enterPx);\n const b = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${a.x}px, ${a.y}px,0) scale(${cfg.enterScale})`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n this.kf(\n 0,\n `translate3d(${b.x}px, ${b.y}px,0) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const zoomFromCorner: PresetDef = {\n name: 'zoomFromCorner',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 0.88,\n exitScale: 0.94,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'corner',\n easingOpen: 'cubic-bezier(0.18, 0.89, 0.32, 1.28)',\n easingClose: 'cubic-bezier(0.6, -0.28, 0.74, 0.05)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, cfg }) =>\n phase === 'open'\n ? [this.kf(0, `scale(${cfg.enterScale})`), this.kf(1, 'scale(1)')]\n : [this.kf(1, 'scale(1)'), this.kf(0, `scale(${cfg.exitScale})`)],\n };\n\n const flip3d: PresetDef = {\n name: 'flip3d',\n defaults: {\n enterPx: 8,\n exitPx: 6,\n enterScale: 0.98,\n exitScale: 0.99,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 14,\n tiltDeg: 8,\n origin: 'anchor',\n easingOpen: 'cubic-bezier(0.5, 0, 0.75, 0)',\n easingClose: 'cubic-bezier(0.33, 0, 0.67, 0)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg, origin }) => {\n const v = this.vec(side, cfg.enterPx);\n const axis = side === 'left' || side === 'right' ? 'Y' : 'X';\n const sign = side === 'top' || side === 'left' ? 1 : -1;\n const r = cfg.rotateDeg * sign;\n\n if (phase === 'open') {\n return [\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotate${axis}(${r}deg) scale(${cfg.enterScale})`\n ),\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`\n ),\n ];\n }\n const v2 = this.vec(side, cfg.exitPx);\n return [\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`\n ),\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(${v2.x}px, ${v2.y}px, 0) rotate${axis}(${r * 0.7}deg) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const card3d: PresetDef = {\n name: 'card3d',\n defaults: {\n enterPx: 10,\n exitPx: 8,\n enterScale: 0.96,\n exitScale: 0.98,\n blurInPx: 6,\n blurOutPx: 3,\n perspectivePx: 1000,\n rotateDeg: 10,\n tiltDeg: 10,\n origin: 'anchor',\n easingOpen: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n easingClose: 'cubic-bezier(0.55, 0.085, 0.68, 0.53)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n const axis = side === 'left' || side === 'right' ? 'Y' : 'X';\n const sign = side === 'top' || side === 'left' ? 1 : -1;\n const t = cfg.tiltDeg * sign;\n\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotate${axis}(${t}deg) scale(${cfg.enterScale})`,\n `blur(${cfg.blurInPx}px)`\n ),\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`,\n 'blur(0px)'\n ),\n ]\n : [\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotate${axis}(0deg) scale(1)`,\n 'blur(0px)'\n ),\n this.kf(\n 0,\n `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})`,\n `blur(${cfg.blurOutPx}px)`\n ),\n ];\n },\n };\n\n const tilt3d: PresetDef = {\n name: 'tilt3d',\n defaults: {\n enterPx: 8,\n exitPx: 6,\n enterScale: 0.98,\n exitScale: 0.99,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 12,\n origin: 'corner',\n easingOpen: 'cubic-bezier(0.23, 1, 0.32, 1)',\n easingClose: 'cubic-bezier(0.5, 0, 0.75, 0)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n const rx =\n side === 'top' ? cfg.tiltDeg : side === 'bottom' ? -cfg.tiltDeg : 0;\n const ry =\n side === 'left' ? cfg.tiltDeg : side === 'right' ? -cfg.tiltDeg : 0;\n\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotateX(${rx}deg) rotateY(${ry}deg) scale(${cfg.enterScale})`\n ),\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateX(0deg) rotateY(0deg) scale(1)`\n ),\n ]\n : [\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateX(0deg) rotateY(0deg) scale(1)`\n ),\n this.kf(\n 0,\n `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})`\n ),\n ];\n },\n };\n\n const depth3d: PresetDef = {\n name: 'depth3d',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 0.9,\n exitScale: 0.94,\n blurInPx: 8,\n blurOutPx: 5,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.22, 0.61, 0.36, 1)',\n easingClose: 'cubic-bezier(0.55, 0.06, 0.68, 0.19)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, cfg }) =>\n phase === 'open'\n ? [\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,-40px) scale(${cfg.enterScale})`,\n `blur(${cfg.blurInPx}px)`\n ),\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) scale(1)`,\n 'blur(0px)'\n ),\n ]\n : [\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) scale(1)`,\n 'blur(0px)'\n ),\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,-30px) scale(${cfg.exitScale})`,\n `blur(${cfg.blurOutPx}px)`\n ),\n ],\n };\n\n const rotate3d: PresetDef = {\n name: 'rotate3d',\n defaults: {\n enterPx: 8,\n exitPx: 6,\n enterScale: 0.98,\n exitScale: 0.99,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 12,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.36, 0, 0.66, -0.56)',\n easingClose: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n const sign = side === 'top' || side === 'left' ? 1 : -1;\n const r = cfg.rotateDeg * sign;\n\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `perspective(${cfg.perspectivePx}px) translate3d(${v.x}px, ${v.y}px, 0) rotateZ(${r}deg) scale(${cfg.enterScale})`\n ),\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateZ(0deg) scale(1)`\n ),\n ]\n : [\n this.kf(\n 1,\n `perspective(${cfg.perspectivePx}px) translate3d(0,0,0) rotateZ(0deg) scale(1)`\n ),\n this.kf(\n 0,\n `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})`\n ),\n ];\n },\n };\n\n const springy: PresetDef = {\n name: 'springy',\n defaults: {\n enterPx: 12,\n exitPx: 8,\n enterScale: 0.94,\n exitScale: 0.98,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'anchor',\n easingOpen: 'cubic-bezier(0.12, 0.9, 0.18, 1.15)',\n easingClose: 'cubic-bezier(0.5, 0, 0.75, 0)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n if (phase === 'open') {\n return [\n this.kf(\n 0,\n `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`\n ),\n this.kf(1, `translate3d(0,0,0) scale(1.02)`),\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n ];\n }\n const v2 = this.vec(side, cfg.exitPx);\n return [\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n this.kf(\n 0,\n `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const bouncy: PresetDef = {\n name: 'bouncy',\n defaults: {\n enterPx: 14,\n exitPx: 10,\n enterScale: 0.9,\n exitScale: 0.96,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'anchor',\n easingOpen: 'cubic-bezier(0.12, 0.9, 0.18, 1.15)',\n easingClose: 'cubic-bezier(0.6, -0.28, 0.74, 0.05)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n if (phase === 'open') {\n return [\n this.kf(\n 0,\n `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1.03)'),\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n ];\n }\n const v2 = this.vec(side, cfg.exitPx);\n return [\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n this.kf(\n 0,\n `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const glide: PresetDef = {\n name: 'glide',\n defaults: {\n enterPx: 18,\n exitPx: 12,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.08, 0.82, 0.17, 1)',\n easingClose: 'cubic-bezier(0.3, 0, 1, 1)',\n enterDuration: 220,\n exitDuration: 200,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n const v2 = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(0, `translate3d(${v.x}px, ${v.y}px,0)`),\n this.kf(1, 'translate3d(0,0,0)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)'),\n this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0)`),\n ];\n },\n };\n\n const pop: PresetDef = {\n name: 'pop',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 0.85,\n exitScale: 0.95,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.18, 0.89, 0.32, 1.28)',\n easingClose: 'cubic-bezier(0.6, -0.28, 0.74, 0.05)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, cfg }) =>\n phase === 'open'\n ? [\n this.kf(0, `scale(${cfg.enterScale})`),\n this.kf(1, 'scale(1.03)'),\n this.kf(1, 'scale(1)'),\n ]\n : [this.kf(1, 'scale(1)'), this.kf(0, `scale(${cfg.exitScale})`)],\n };\n\n const drop: PresetDef = {\n name: 'drop',\n defaults: {\n enterPx: 22,\n exitPx: 14,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'center',\n easingOpen: 'cubic-bezier(0.12, 0.9, 0.18, 1)',\n easingClose: 'cubic-bezier(0.45, 0, 0.55, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n const v2 = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(0, `translate3d(${v.x}px, ${v.y}px,0)`),\n this.kf(1, 'translate3d(0,0,0)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0)'),\n this.kf(0, `translate3d(${v2.x}px, ${v2.y}px,0)`),\n ];\n },\n };\n\n const grow: PresetDef = {\n name: 'grow',\n defaults: {\n enterPx: 6,\n exitPx: 4,\n enterScale: 0.95,\n exitScale: 0.98,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'anchor',\n easingOpen: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n easingClose: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: ({ phase, side, cfg }) => {\n const v = this.vec(side, cfg.enterPx);\n const v2 = this.vec(side, cfg.exitPx);\n return phase === 'open'\n ? [\n this.kf(\n 0,\n `translate3d(${v.x}px, ${v.y}px,0) scale(${cfg.enterScale})`\n ),\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n ]\n : [\n this.kf(1, 'translate3d(0,0,0) scale(1)'),\n this.kf(\n 0,\n `translate3d(${v2.x}px, ${v2.y}px,0) scale(${cfg.exitScale})`\n ),\n ];\n },\n };\n\n const none: PresetDef = {\n name: 'none',\n defaults: {\n enterPx: 0,\n exitPx: 0,\n enterScale: 1,\n exitScale: 1,\n blurInPx: 0,\n blurOutPx: 0,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'auto',\n easingOpen: 'cubic-bezier(0.16, 1, 0.3, 1)',\n easingClose: 'cubic-bezier(0.2, 0, 0, 1)',\n enterDuration: 220,\n exitDuration: 180,\n },\n getKeyframes: () => [{ opacity: 1 }],\n };\n\n const floatAlias = floaty;\n\n return {\n none,\n fade,\n scale,\n slide,\n iosMenu,\n iosSheet,\n materialMenu,\n materialSheet,\n floaty: floatAlias,\n soft,\n sharp,\n blurIn,\n blurFade,\n zoomFromAnchor,\n zoomFromCorner,\n flip3d,\n card3d,\n tilt3d,\n depth3d,\n rotate3d,\n springy,\n bouncy,\n glide,\n pop,\n drop,\n grow,\n };\n }\n\n // Update the getPresetKeyframes method:\n private getPresetKeyframes(\n preset: PopoverPreset,\n side: PopoverSide,\n phase: 'open' | 'close',\n overrides?: PopoverPresetConfig\n ) {\n const reg = this.presetRegistry();\n const def = reg[preset] ?? reg.iosMenu;\n\n // Merge base defaults with preset defaults, then with overrides\n const baseDefaults = this.getBaseDefaults();\n const cfg = {\n ...def.defaults,\n ...(overrides ?? {}),\n } as Required<PopoverPresetConfig>;\n\n const origin = this.computeOrigin(side, cfg.origin);\n\n return {\n keyframes: def.getKeyframes({ side, phase, cfg, origin }),\n cfg,\n origin,\n };\n }\n\n // Add this helper method for base defaults:\n private getBaseDefaults(): Required<PopoverPresetConfig> {\n return {\n enterPx: 12,\n exitPx: 8,\n enterScale: 0.98,\n exitScale: 0.99,\n blurInPx: 6,\n blurOutPx: 3,\n perspectivePx: 900,\n rotateDeg: 10,\n tiltDeg: 8,\n origin: 'auto',\n easingOpen: 'cubic-bezier(0.16, 1, 0.3, 1)',\n easingClose: 'cubic-bezier(0.2, 0, 0, 1)',\n enterDuration: 220,\n exitDuration: 180,\n };\n }\n\n private async playPreset(\n pop: HTMLElement,\n side: PopoverSide,\n phase: 'open' | 'close'\n ) {\n this.checkForConflictingCSS(pop);\n if (this.prefersReducedMotion()) return;\n\n // ✅ Get current preset via getter\n const preset = this.opts.getPreset();\n if (preset === 'none') return;\n\n // cancel transform-related animations\n this.moveAnim?.cancel();\n this.presetAnim?.cancel();\n\n this._phase = phase === 'open' ? 'opening' : 'closing';\n\n pop.style.transition = 'none';\n\n // Get keyframes and config for the current preset\n const { keyframes, cfg, origin } = this.getPresetKeyframes(\n preset,\n side,\n phase\n );\n\n // Use duration from config, fallback to controller options\n const duration = phase === 'open' ? cfg.enterDuration : cfg.exitDuration;\n\n /* ---------------- 3D SAFETY LOGIC ---------------- */\n const is3d = this.is3dPreset(preset);\n if (is3d) {\n pop.style.transformStyle = 'preserve-3d';\n pop.style.backfaceVisibility = 'hidden';\n // DON'T set perspective here - it's already in the transform\n } else {\n pop.style.transformStyle = '';\n pop.style.backfaceVisibility = '';\n }\n /* -------------------------------------------------- */\n\n pop.style.transformOrigin = origin;\n\n const easing = phase === 'open' ? cfg.easingOpen : cfg.easingClose;\n\n const anim = pop.animate(keyframes as any, {\n duration,\n easing,\n fill: 'both',\n });\n\n this.presetAnim = anim;\n\n try {\n await anim.finished;\n } catch {\n // cancelled is fine\n } finally {\n if (this.presetAnim === anim) this.presetAnim = undefined;\n pop.style.transition = '';\n if (is3d) {\n pop.style.transformStyle = '';\n pop.style.backfaceVisibility = '';\n }\n\n this._phase = phase === 'open' ? 'open' : 'idle';\n }\n }\n\n private checkForConflictingCSS(pop: HTMLElement) {\n const transitions = pop.style.transition || '';\n\n // Check for conflicting CSS transitions\n if (transitions.includes('transform') && transitions.includes('opacity')) {\n console.warn(\n \"Warning: Using 3D animation (WAAPI) alongside CSS transitions on 'transform' or 'opacity' can cause conflicts. Consider removing CSS transitions on these properties.\"\n );\n }\n\n if (transitions.includes('margin') || transitions.includes('padding')) {\n console.warn(\n \"Warning: Animating 'margin' or 'padding' alongside 3D animation (WAAPI) may cause visual glitches. Please avoid transitioning these properties during WAAPI animations.\"\n );\n }\n }\n\n /* -------------------------------- Move Animation (Flip Smooth) -------------------------------- */\n\n private animateMove(pop: HTMLElement, from: DOMRect, to: DOMRect) {\n if (this._phase !== 'open') return; // ✅ hard gate\n\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) return;\n\n this.moveAnim?.cancel();\n\n // ✅ Get current reposition duration via getter\n const duration = this.opts.getRepositionMs();\n\n const anim = pop.animate(\n [\n { transform: `translate3d(${dx}px, ${dy}px, 0)` },\n { transform: 'translate3d(0, 0, 0)' },\n ],\n {\n duration,\n easing: 'cubic-bezier(0.16, 1, 0.3, 1)',\n fill: 'both',\n }\n );\n\n this.moveAnim = anim;\n anim.finished.finally(() => {\n if (this.moveAnim === anim) this.moveAnim = undefined;\n });\n }\n\n private is3dPreset(preset: PopoverPreset) {\n return (\n preset === 'flip3d' ||\n preset === 'card3d' ||\n preset === 'tilt3d' ||\n preset === 'depth3d' ||\n preset === 'rotate3d'\n );\n }\n\n private setSideAttr(side: PopoverSide) {\n const pop = this.opts.getPopover();\n if (!pop) return;\n pop.setAttribute(this.opts.sideAttr, side);\n }\n\n /* -------------------------------- Observers & Scroll Parents -------------------------------- */\n\n private setupObserversAndScrollParents() {\n if (typeof window === 'undefined') return;\n\n const anchor = this.opts.getAnchor();\n const pop = this.opts.getPopover();\n\n if (anchor && 'ResizeObserver' in window) {\n this.anchorRO?.disconnect();\n this.anchorRO = new ResizeObserver(() => {\n if (this._open) this.position();\n });\n this.anchorRO.observe(anchor);\n }\n\n if (pop && 'ResizeObserver' in window) {\n this.popoverRO?.disconnect();\n this.popoverRO = new ResizeObserver(() => {\n if (this._open) this.position();\n });\n this.popoverRO.observe(pop);\n }\n\n this.teardownScrollParents();\n\n const mode = this.opts.scrollContainer;\n if (mode === 'window') return;\n\n if (mode instanceof HTMLElement) {\n this.bindScroll(mode);\n return;\n }\n\n if (anchor) {\n for (const p of this.getScrollParents(anchor)) this.bindScroll(p);\n }\n }\n\n private bindScroll(el: HTMLElement) {\n const fn = this.onViewportMove as EventListener;\n el.addEventListener('scroll', fn, { passive: true });\n this.boundScrollParents.push({ el, fn });\n }\n\n private teardownScrollParents() {\n for (const { el, fn } of this.boundScrollParents) {\n (el as any).removeEventListener?.('scroll', fn);\n }\n this.boundScrollParents = [];\n }\n\n private getScrollParents(node: HTMLElement): HTMLElement[] {\n const parents: HTMLElement[] = [];\n let el: HTMLElement | null = node.parentElement;\n\n while (el && el !== document.body) {\n const style = getComputedStyle(el);\n const overflowY = style.overflowY;\n const overflowX = style.overflowX;\n\n const canScrollY =\n (overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay') &&\n el.scrollHeight > el.clientHeight;\n\n const canScrollX =\n (overflowX === 'auto' ||\n overflowX === 'scroll' ||\n overflowX === 'overlay') &&\n el.scrollWidth > el.clientWidth;\n\n if (canScrollY || canScrollX) parents.push(el);\n el = el.parentElement;\n }\n\n return parents;\n }\n\n /* -------------------------------- Close / Focus / Group -------------------------------- */\n\n private onViewportMove = () => {\n if (this._open) this.position();\n };\n\n private onKeydown = (e: KeyboardEvent) => {\n if (!this._open) return;\n if (e.key !== 'Escape') return;\n\n // ✅ Check if escape closing is enabled via getter\n if (!this.opts.getCloseOnEscape()) return;\n\n const pop = this.opts.getPopover();\n const anchor = this.opts.getAnchor();\n const active = document.activeElement;\n\n const withinPopover = !!(pop && active && pop.contains(active));\n const onAnchor = !!(anchor && active && anchor.contains(active));\n\n if (withinPopover || onAnchor) {\n e.preventDefault();\n e.stopPropagation();\n this.closePopover('escape');\n }\n };\n\n private onGroupOpen = (e: CustomEvent) => {\n const other = e.detail?.id;\n const mine = this.opts.groupId ?? this.host;\n\n if (other !== mine && this._open) {\n this.closePopover('group');\n }\n };\n\n private captureFocusBeforeOpen() {\n this.lastFocusedEl = document.activeElement;\n }\n\n private elementIsTriggerRelated(el: EventTarget | null | undefined): boolean {\n if (!(el instanceof HTMLElement)) return false;\n\n const anchor = this.opts.getAnchor();\n const focusTarget = this.opts.getFocusTarget?.() ?? null;\n\n if (focusTarget && (el === focusTarget || focusTarget.contains(el))) {\n return true;\n }\n if (!anchor) return false;\n if (el === anchor || anchor.contains(el)) return true;\n if (anchor.shadowRoot?.contains(el)) return true;\n return false;\n }\n\n private restoreFocus() {\n if (!this.opts.getRestoreFocusOnClose()) return;\n\n const anchor = this.opts.getAnchor();\n if (!anchor) return;\n\n const focusTarget = this.opts.getFocusTarget?.() ?? anchor;\n const active = document.activeElement;\n const last = this.lastFocusedEl;\n const pop = this.opts.getPopover();\n\n const lastWasInsidePopover = !!(pop && last && pop.contains(last));\n const lastWasInsideTrigger = this.elementIsTriggerRelated(last);\n const activeInsidePopover = !!(pop && active && pop.contains(active));\n\n if (activeInsidePopover || lastWasInsidePopover || lastWasInsideTrigger) {\n focusTarget.focus?.({ preventScroll: true });\n }\n }\n\n /* -------------------------------- CSS Guard -------------------------------- */\n\n private ensurePopoverMarginZero() {\n const pop = this.opts.getPopover();\n if (!pop) return;\n if (!pop.style.margin) pop.style.margin = '0';\n }\n\n /* -------------------------------- Utility Methods -------------------------------- */\n\n /**\n * Utility method to manually update a specific option\n * (Useful for edge cases where you need direct control)\n */\n updateOption<T extends keyof typeof this.opts>(\n key: T,\n value: (typeof this.opts)[T]\n ) {\n if (typeof value === 'function') {\n // For getters, replace the function\n (this.opts as any)[key] = value;\n } else {\n // For other values, wrap in a getter\n (this.opts as any)[key] = () => value;\n }\n\n if (this._open && key.startsWith('get')) {\n // Reposition if open and a positioning property changed\n this.position();\n }\n }\n}\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","x","clientX","y","clientY","window","innerWidth","innerHeight","ignoreAttr","getIgnoreOutsideAttr","ignoreSel","getIgnoreOutsideSelector","trim","node","HTMLElement","hasAttribute","closest","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","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":"AAmJO,MAAMA,EA+EX,WAAAC,CAAYC,EAA8BC,GA7E1CC,KAAQC,OAAQ,EAEhBD,KAAQE,IAAM,EAKdF,KAAQG,mBACN,GAGFH,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,OA+Q1DZ,KAAAa,SAAYC,IACV,GAA6B,kBAAzBd,KAAKK,gBAEP,YADAL,KAAKK,gBAAkB,UAGzB,MAAMU,EAAMf,KAAKgB,KAAKC,aAChBC,EAAKJ,EAEX,IAAIK,EAAyB,KAI7B,GAH4B,iBAAjBD,GAAIE,WAAuBD,EAAyB,SAAhBD,EAAGE,UACnC,OAAXD,GAAmBJ,IACrBI,EAASJ,EAAIM,UAAU,mBAAoB,GAC9B,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,OAGnC,MAAMC,EAAI3B,EAAE4B,QACVC,EAAI7B,EAAE8B,QACR,GAAIH,GAAKI,OAAOC,YAAcH,GAAKE,OAAOE,YAAa,OAGvD,MAAMC,EAAahD,KAAKgB,KAAKiC,uBACvBC,GAAalD,KAAKgB,KAAKmC,4BAA8B,IAAIC,OAE/D,IAAA,MAAWC,KAAQjB,EACjB,GAAMiB,aAAgBC,YAAtB,CAGA,GAAIN,GAAcK,EAAKE,aAAaP,GAAa,OAGjD,GAAIE,EAAW,CAEb,GAAIG,EAAKhC,QAAQ6B,GAAY,OAC7B,GAAIG,EAAKG,QAAQN,GAAY,MAC/B,CAVoC,CActClD,KAAKyD,aAAa,kBAigDpBzD,KAAQ0D,eAAiB,KACnB1D,KAAKC,OAAOD,KAAK4B,YAGvB5B,KAAQ2D,UAAa7C,IACnB,IAAKd,KAAKC,MAAO,OACjB,GAAc,WAAVa,EAAE8C,IAAkB,OAGxB,IAAK5D,KAAKgB,KAAK6C,mBAAoB,OAEnC,MAAM9C,EAAMf,KAAKgB,KAAKC,aAChBgB,EAASjC,KAAKgB,KAAKkB,YACnB4B,EAASC,SAASC,cAElBC,KAAmBlD,GAAO+C,GAAU/C,EAAImD,SAASJ,IACjDK,KAAclC,GAAU6B,GAAU7B,EAAOiC,SAASJ,KAEpDG,GAAiBE,KACnBrD,EAAEsD,iBACFtD,EAAEuD,kBACFrE,KAAKyD,aAAa,YAItBzD,KAAQsE,YAAexD,IACrB,MAAMyD,EAAQzD,EAAE0D,QAAQC,GAGpBF,KAFSvE,KAAKgB,KAAK0D,SAAW1E,KAAKF,OAEjBE,KAAKC,OACzBD,KAAKyD,aAAa,UAt3DpBzD,KAAKF,KAAOA,EACZA,EAAK6E,cAAc3E,MAGnB,MAAM4E,EAAM7E,EAAQ8E,UAAY,IAC1BC,EAAW/E,EAAQgF,eAAiBC,KAAKC,IAAI,IAAKL,GAExD5E,KAAKgB,KAAO,CAEVkB,UAAWnC,EAAQmC,UACnBjB,WAAYlB,EAAQkB,WAGpBiE,aAActF,EAAkBuF,aAC9BpF,EAAQmF,aACRnF,EAAQqF,UACR,QAEFC,SAAUzF,EAAkBuF,aAC1BpF,EAAQsF,SACRtF,EAAQuF,MACR,SAEFC,OAAQ3F,EAAkBuF,aAAapF,EAAQwF,OAAQxF,EAAQyF,IAAK,GACpEC,WAAY7F,EAAkBuF,aAC5BpF,EAAQ0F,WACR1F,EAAQ2F,QACR,GAEFC,oBAAqB/F,EAAkBuF,aACrCpF,EAAQ4F,oBACR5F,EAAQ6F,kBACR,GAEFC,sBAAuBjG,EAAkBuF,aACvCpF,EAAQ8F,sBACR9F,EAAQ+F,oBACR,GAEFC,gBAAiBnG,EAAkBuF,aACjCpF,EAAQgG,gBACRhG,EAAQiG,aACR,OAEFC,QAASrG,EAAkBuF,aACzBpF,EAAQkG,QACRlG,EAAQmG,MACR,GAEFC,aAAcvG,EAAkBuF,aAC9BpF,EAAQoG,aACRpG,EAAQqG,UACR,IAEFC,UAAWzG,EAAkBuF,aAC3BpF,EAAQsG,UACRtG,EAAQuG,OACR,SAEFC,YAAa3G,EAAkBuF,aAC7BpF,EAAQwG,YACRxG,EAAQ8E,SACRD,GAEF4B,iBAAkB5G,EAAkBuF,aAClCpF,EAAQyG,iBACRzG,EAAQgF,cACRD,GAEF2B,qBAAsB7G,EAAkBuF,aACtCpF,EAAQ0G,qBACR1G,EAAQ2G,mBACR,GAEFC,gBAAiB/G,EAAkBuF,aACjCpF,EAAQ4G,gBACR5G,EAAQ6G,aACR,KAEF/C,iBAAkBjE,EAAkBuF,aAClCpF,EAAQ8D,iBACR9D,EAAQ8G,eACR,GAEF7E,kBAAmBpC,EAAkBuF,aACnCpF,EAAQiC,kBACRjC,EAAQ+G,gBACR,GAGF3D,yBAA0BvD,EAAkBuF,aAC1CpF,EAAQoD,yBACRpD,EAAQgH,sBACR,IAGF9D,qBAAsBrD,EAAkBuF,aACtCpF,EAAQkD,qBACRlD,EAAQiH,kBACR,+BAEFvF,uBAAwB7B,EAAkBuF,aACxCpF,EAAQ0B,uBACR1B,EAAQkH,qBACR,GAIFC,WAAYnH,EAAQmH,YAAc,iBAClCC,UAAWpH,EAAQoH,WAAa,gBAChCC,YAAarH,EAAQqH,aAAe,kBACpCtF,YAAa/B,EAAQ+B,YACrBuF,gBAAiBtH,EAAQsH,iBAAmB,OAC5CC,eAAgBvH,EAAQuH,eACxB5C,QAAS3E,EAAQ2E,QACjBnD,aAAcxB,EAAQwB,aACtBgG,eAAgBxH,EAAQwH,eACxBC,SAAUzH,EAAQyH,UAAY,YAC9BC,qBAAsB1H,EAAQ0H,uBAAwB,EAE1D,CAzKA,mBAAetC,CACbuC,EACAC,EACAC,GAEA,OAAOF,GAAA,KAAiBC,GAAeC,EACzC,CAqKA,QAAIC,GACF,OAAO7H,KAAKC,KACd,CAEA,QAAI6H,GACF,OAAO9H,KAAKS,QACd,CAIA,aAAAsH,GACwB,oBAAXlF,SACX7C,KAAKgI,eAAiBnF,OAAOmF,qBAAkB,EAEjD,CAEA,gBAAAC,GACEjI,KAAKsB,kCACDtB,KAAKE,KAAKgI,qBAAqBlI,KAAKE,IAC1C,CAGQ,qBAAAyB,GACgB,oBAAXkB,QAA0B7C,KAAKI,qBAC1CJ,KAAKI,oBAAqB,EAEtBJ,KAAKgI,iBACPhI,KAAKgI,eAAeG,iBAAiB,SAAUnI,KAAK0D,eAAgB,CAClE0E,SAAS,IAEXpI,KAAKgI,eAAeG,iBAAiB,SAAUnI,KAAK0D,eAAgB,CAClE0E,SAAS,KAGbvF,OAAOsF,iBAAiB,SAAUnI,KAAK0D,eAAgB,CAAE0E,SAAS,IAClEvF,OAAOsF,iBAAiB,SAAUnI,KAAK0D,eAAgB,CACrD0E,SAAS,EACTC,SAAS,IAGPrI,KAAKgB,KAAKsG,gBACZzE,OAAOsF,iBACLnI,KAAKgB,KAAKsG,eACVtH,KAAKsE,aAGLtE,KAAKgB,KAAK6C,oBACZhB,OAAOsF,iBAAiB,UAAWnI,KAAK2D,WAAW,GAErDI,SAASoE,iBAAiB,cAAenI,KAAK+B,uBAAuB,GAErE/B,KAAKsI,iCACP,CAGQ,+BAAAhH,GACDtB,KAAKI,qBACVJ,KAAKI,oBAAqB,EAEJ,oBAAXyC,SACTA,OAAO0F,oBAAoB,SAAUvI,KAAK0D,gBAC1Cb,OAAO0F,oBAAoB,SAAUvI,KAAK0D,gBAAgB,GACtD1D,KAAKgI,iBACPhI,KAAKgI,eAAeO,oBAAoB,SAAUvI,KAAK0D,gBACvD1D,KAAKgI,eAAeO,oBAAoB,SAAUvI,KAAK0D,iBAErD1D,KAAKgB,KAAKsG,gBACZzE,OAAO0F,oBACLvI,KAAKgB,KAAKsG,eACVtH,KAAKsE,aAGTzB,OAAO0F,oBAAoB,UAAWvI,KAAK2D,WAAW,IAExDI,SAASwE,oBACP,cACAvI,KAAK+B,uBACL,GAGF/B,KAAKwI,wBACLxI,KAAKyI,UAAUC,aACf1I,KAAKyI,cAAW,EAChBzI,KAAK2I,WAAWD,aAChB1I,KAAK2I,eAAY,EACnB,CAEA,cAAAC,GACM5I,KAAKI,oBAAoBJ,KAAKsI,iCAC9BtI,KAAKC,OAAOD,KAAK4B,UACvB,CAmCA,MAAAiH,GACE7I,KAAKC,MAAQD,KAAKyD,aAAa,OAASzD,KAAK8I,aAC/C,CAEA,WAAAA,GACM9I,KAAKE,KAAKgI,qBAAqBlI,KAAKE,KACxCF,KAAKE,IAAM,EACX,MAAMa,EAAMf,KAAKgB,KAAKC,aACtB,IAAKF,EAAK,OAEY,oBAAX8B,QAA0B7C,KAAKgB,KAAKsG,gBAC7CzE,OAAOkG,cACL,IAAIC,YAAYhJ,KAAKgB,KAAKsG,eAAgB,CACxC9C,OAAQ,CAAEC,GAAIzE,KAAKgB,KAAK0D,SAAW1E,KAAKF,SAK9CE,KAAKiJ,yBACLjJ,KAAKkJ,0BAELlJ,KAAKC,OAAQ,EACbD,KAAK2B,wBACL3B,KAAKgB,KAAKO,gBAAe,EAAM,CAAEC,OAAQ,QAGzC,MAAM2H,EAAiBpI,EAAIqI,MAAMC,WACjCtI,EAAIqI,MAAMC,WAAa,SAEtBtI,EAAYuI,gBACb,MAAMC,EAAcvJ,KAAKO,cACzBP,KAAKO,eAAgB,EAGrBP,KAAKQ,qBAAuB+I,EAG5BvJ,KAAK4B,WAGLb,EAAIyI,wBAGJ,MAAMC,EAAOzJ,KAAKS,SAASC,MAC3BV,KAAK0J,YAAYD,GAGjBzJ,KAAKE,IAAM2B,sBAAsB,KAC/Bd,EAAIqI,MAAMC,WAAaF,GAAkB,UAEzCnJ,KAAK2J,WAAW5I,EAAK0I,EAAM,QAAQG,KAAK,IAAM5J,KAAKgB,KAAKc,kBAE5D,CA+CA,kBAAM2B,CAAajC,EAAsB,OACvC,MAAMT,EAAMf,KAAKgB,KAAKC,aACtB,IAAKF,EAAK,OAIV,GAFAf,KAAKK,gBAAkBmB,GAElBxB,KAAKC,MAER,YADCc,EAAY8I,gBAIf7J,KAAKC,OAAQ,EAGTD,KAAKgB,KAAKS,+BAA+BC,eAC7C1B,KAAKsB,kCACLtB,KAAKgB,KAAKO,gBAAe,EAAO,CAAEC,WAElC,MAAMiI,EAAOzJ,KAAKS,SAASC,MAC3BV,KAAK0J,YAAYD,GACbzJ,KAAKE,KAAKgI,qBAAqBlI,KAAKE,KACxCF,KAAKE,IAAM,EACXF,KAAK8J,UAAUC,eACT/J,KAAK2J,WAAW5I,EAAK0I,EAAM,SAEhC1I,EAAY8I,eACf,CAIQ,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,EAAI/H,SAASgI,IAAID,EAAIG,KAAKF,GACtE,IAAA,MAAWA,KAAKL,EAAWI,EAAI/H,SAASgI,IAAID,EAAIG,KAAKF,GACrD,OAAOD,CACT,CAEQ,yBAAAI,CAA0BC,GAChC,OAAQA,GACN,IAAK,MACH,MAAO,CAAC,MAAO,SAAU,QAAS,QACpC,IAAK,SAML,QACE,MAAO,CAAC,SAAU,MAAO,QAAS,QALpC,IAAK,OACH,MAAO,CAAC,OAAQ,QAAS,SAAU,OACrC,IAAK,QACH,MAAO,CAAC,QAAS,OAAQ,SAAU,OAIzC,CAEA,QAAA/I,GACE,GAAsB,oBAAXiB,OAAwB,OAEnC,MAAMZ,EAASjC,KAAKgB,KAAKkB,YACnBnB,EAAMf,KAAKgB,KAAKC,aACtB,IAAKgB,IAAWlB,EAAK,OAErBf,KAAKkJ,0BAEL,MAAM0B,EACH7J,EAAYM,UAAU,kBAAyC,OAArBN,EAAI8J,aAE3CC,EACJ9K,KAAKC,OAAS2K,EAAoB7J,EAAIyI,wBAA0B,KAG5DuB,EAAM/K,KAAKgB,KAAKyE,aAChBD,EAAMxF,KAAKgB,KAAKuE,SAEhByF,EAAI/I,EAAOuH,wBAEXyB,EAAKpI,OAAOmF,gBAAkB,KAC9BkD,EAAKD,GAAIE,OAAStI,OAAOC,WACzBsI,EAAKH,GAAII,QAAUxI,OAAOE,YAE1BuI,EAAUL,GAAIM,YAAc,EAC5BC,EAAUP,GAAIQ,WAAa,EAEjC,GAAIzL,KAAKgB,KAAK6E,wBAAyB,CACrC,MAAM6F,EAAO1G,KAAK2G,IAAI,EAAGT,EAAW,EAANH,GAC9BhK,EAAIqI,MAAMwC,SAAW,GAAGF,MACxB3K,EAAIqI,MAAMyC,UAAY,YACxB,CAEA,MAAMC,EAAK/K,EAAIyI,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,EAIlBQ,EAAYvM,KAAKgB,KAAKkE,eACtBsH,EAAcxM,KAAKgB,KAAKiF,UAExBwG,EAAYzM,KAAKgB,KAAKmF,gBAAgBgE,OACxCnK,KAAKgK,mBAAmBhK,KAAKgB,KAAKmF,gBAClCnG,KAAKgK,mBAAmBhK,KAAK0K,0BAA0B6B,IAE3D,IAAI7L,EAEJ,GAAkB,SAAd6L,EAAsB,CAExB7L,EADiB+L,EAAUC,KAAKJ,IAG9BG,EACGE,IAAKpC,GAAM,CAACA,EAAG0B,EAAM1B,KACrBqC,KAAK,CAACnK,EAAGE,IAAMA,EAAE,GAAKF,EAAE,IAAI,GAAG,EACtC,MAAA,GAAY+J,EAEL,CACL,MAAMK,EAAMN,EACNO,EAAcL,EAAUlK,SAASsK,GACnC,CAACA,KAAQJ,EAAUM,OAAQxC,GAAMA,IAAMsC,IACvC,CAACA,KAAQJ,GAGb/L,EADiBoM,EAAYJ,KAAKJ,IAGhCQ,EACGH,IAAKpC,GAAM,CAACA,EAAG0B,EAAM1B,KACrBqC,KAAK,CAACnK,EAAGE,IAAMA,EAAE,GAAKF,EAAE,IAAI,GAAG,EACtC,MAbE/B,EAAQ6L,EAeV,IAAIL,EAAM,EACNE,EAAO,EACPzL,EAAyB,SAE7B,MAAMqM,EAA+C,QAAvCC,iBAAiBhL,GAAQiL,UACvC,IAAI5H,EAAQtF,KAAKgB,KAAKqE,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,QAAV3K,GAA6B,WAAVA,EAAoB,CAClB0L,EAAT,UAAV9G,EAA0B6H,EACX,QAAV7H,EAAwB8H,EAAMrB,EAC3BoB,EAAMI,EAAK,EAAIxB,EAAO,EAElCG,EAAgB,QAAVxL,EAAkB2M,EAAMrB,EAAOxG,EAAM8H,EAAM9H,EAEjD,MAAMiI,EAAczI,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAIiG,EAAKa,EAAOhB,EAAKqB,IACxDqB,IAAgBrB,IAClBzL,EAAa8M,GAAe1C,EAAM,GAAM,QAAU,OACpDqB,EAAOqB,EAEPvB,EAAMlH,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAImG,EAAKY,EAAOjB,EAAKmB,GAChD,KAAO,CACLE,EAAiB,SAAV1L,EAAmByM,EAAMpB,EAAOvG,EAAM4H,EAAM5H,EACnD0G,EAAMmB,EAAMG,EAAK,EAAIxB,EAAO,EAE5B,MAAM0B,EAAa1I,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAImG,EAAKY,EAAOjB,EAAKmB,IACvDwB,IAAexB,IACjBvL,EAAa+M,GAAc3C,EAAM,GAAM,QAAU,OACnDmB,EAAMwB,EAENtB,EAAOpH,KAAK2G,IAAIZ,EAAK/F,KAAKC,IAAIiG,EAAKa,EAAOhB,EAAKqB,GACjD,CAEAA,GAAQd,EACRY,GAAOV,EAEP,MAAMmC,EAAS3N,KAAKF,KAEpB,GAAIE,KAAKgB,KAAK2E,sBAAuB,CACnC,MAAM+F,EAAO1G,KAAK2G,IAAI,EAAGT,EAAW,EAANH,GACxBI,EAAQnG,KAAKC,IAAI+F,EAAEG,MAAOO,GAChCiC,EAAOvE,MAAMwE,YAAY5N,KAAKgB,KAAKoG,YAAa,GAAG+D,MACrD,MACEwC,EAAOvE,MAAMyE,eAAe7N,KAAKgB,KAAKoG,aAGxCuG,EAAOvE,MAAMwE,YAAY5N,KAAKgB,KAAKkG,WAAY,GAAGkF,OAClDuB,EAAOvE,MAAMwE,YAAY5N,KAAKgB,KAAKmG,UAAW,GAAG+E,OAE/BlM,KAAKS,SAASC,MAChCV,KAAKS,SAAW,CAAEC,QAAOC,cACzBX,KAAK0J,YAAYhJ,GAGfV,KAAKC,OACLD,KAAKgB,KAAKyF,wBACVqE,IACC9K,KAAKQ,qBACNO,EAAIM,UAAU,kBACduJ,GACgB,SAAhB5K,KAAKY,SACJZ,KAAK8N,aAGF9N,KAAKE,KAAKgI,qBAAqBlI,KAAKE,KACxCF,KAAKE,IAAM2B,sBAAsB,KAC/B,MAAMkM,EAAQhN,EAAIyI,wBAClBxJ,KAAKgO,YAAYjN,EAAK+J,EAAQiD,MAIlC/N,KAAKQ,qBAAsB,CAC7B,CAIQ,GAAAyN,CAAIxE,EAAmByE,GAC7B,MAAa,QAATzE,EAAuB,CAAEhH,EAAG,EAAGE,GAAIuL,GAC1B,WAATzE,EAA0B,CAAEhH,EAAG,EAAGE,GAAIuL,GAC7B,SAATzE,EAAwB,CAAEhH,GAAIyL,EAAGvL,EAAG,GACjC,CAAEF,GAAIyL,EAAGvL,EAAG,EACrB,CAEQ,oBAAAwL,GACN,QAAKnO,KAAKgB,KAAKyG,uBAEK,oBAAX5E,QACPA,OAAOuL,aAAa,qCAAqC/M,QAE7D,CAGQ,aAAAgN,CACN5E,EACA6E,GAEA,MAAa,WAATA,EAA0B,UAGf,QAAT7E,EAAuB,WACd,WAATA,EAA0B,SACjB,SAATA,EAAwB,WACrB,QAcX,CAEQ,EAAA8E,CAAGC,EAAiBC,EAAmB1B,GAC7C,MAAMzC,EAAW,CAAEkE,UAASC,aAE5B,OADI1B,MAAYA,OAASA,GAClBzC,CACT,CAGQ,cAAAoE,GAq8BN,MAAO,CACLC,KAxBsB,CACtBC,KAAM,OACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,OACRC,WAAY,gCACZC,YAAa,6BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,IAAM,CAAC,CAAEpB,QAAS,KAOhCqB,KAt8BsB,CACtBjB,KAAM,OACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,+BACZC,YAAa,+BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,WACL,SAAVA,EACI,CAAC,CAAEtB,QAAS,GAAK,CAAEA,QAAS,IAC5B,CAAC,CAAEA,QAAS,GAAK,CAAEA,QAAS,KAk7BlCuB,MA/6BuB,CACvBnB,KAAM,QACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,GACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,oCACZC,YAAa,qCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAAC9P,KAAKuO,GAAG,EAAG,SAASyB,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,aACpD,CAACvO,KAAKuO,GAAG,EAAG,YAAavO,KAAKuO,GAAG,EAAG,SAASyB,EAAIf,gBA25BvDgB,MAx5BuB,CACvBrB,KAAM,QACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,OACRC,WAAY,iCACZC,YAAa,gCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,WACtC3C,KAAKuO,GAAG,EAAG,uBAEb,CACEvO,KAAKuO,GAAG,EAAG,sBACXvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,cA63B9CwN,QAx3ByB,CACzBvB,KAAM,UACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,OACRC,WAAY,uCACZC,YAAa,wCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,iBAAiBqN,EAAIhB,cAChD,QAAQgB,EAAId,eAEdlP,KAAKuO,GAAG,EAAG,8BAA+B,cAE5C,CACEvO,KAAKuO,GAAG,EAAG,8BAA+B,aAC1CvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,iBAAiBqN,EAAIf,aAChD,QAAQe,EAAIb,mBAs1BtBiB,SAh1B0B,CAC1BxB,KAAM,WACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,GACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,OACRC,WAAY,qCACZC,YAAa,oCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,UACtC3C,KAAKuO,GAAG,EAAG,uBAEb,CACEvO,KAAKuO,GAAG,EAAG,sBACXvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,aAqzB9C0N,aAhzB8B,CAC9BzB,KAAM,eACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,6BACZC,YAAa,6BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,eAEjDhP,KAAKuO,GAAG,EAAG,gCAEb,CACEvO,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,iBAgxBzDqB,cA1wB+B,CAC/B1B,KAAM,gBACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,GACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,OACRC,WAAY,kCACZC,YAAa,6BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,UACtC3C,KAAKuO,GAAG,EAAG,uBAEb,CACEvO,KAAKuO,GAAG,EAAG,sBACXvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,aA+uB9C4N,OA1uBwB,CACxB3B,KAAM,SACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,GACRC,WAAY,KACZC,UAAW,IACXC,SAAU,GACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,cAC/C,QAAQgB,EAAId,eAEdlP,KAAKuO,GAAG,EAAG,8BAA+B,cAE5C,CACEvO,KAAKuO,GAAG,EAAG,8BAA+B,aAC1CvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,aAC/C,QAAQe,EAAIb,mBAwsBtBqB,KAlsBsB,CACtB5B,KAAM,OACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,iCACZC,YAAa,iCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,cAC/C,QAAQgB,EAAId,eAEdlP,KAAKuO,GAAG,EAAG,8BAA+B,cAE5C,CACEvO,KAAKuO,GAAG,EAAG,8BAA+B,aAC1CvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,aAC/C,QAAQe,EAAIb,mBAgqBtBsB,MA1pBuB,CACvB7B,KAAM,QACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,kCACZC,YAAa,6BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,eAEjDhP,KAAKuO,GAAG,EAAG,gCAEb,CACEvO,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,iBA0nBzDyB,OApnBwB,CACxB9B,KAAM,SACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,EACZC,UAAW,EACXC,SAAU,GACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,gCACZC,YAAa,iCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CACE9P,KAAKuO,GAAG,EAAG,qBAAsB,QAAQyB,EAAId,eAC7ClP,KAAKuO,GAAG,EAAG,qBAAsB,cAEnC,CACEvO,KAAKuO,GAAG,EAAG,qBAAsB,aACjCvO,KAAKuO,GAAG,EAAG,qBAAsB,QAAQyB,EAAIb,kBA2lBrDwB,SAvlB0B,CAC1B/B,KAAM,WACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,GACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,iCACZC,YAAa,+BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,SAC3B,QAAQqN,EAAId,eAEdlP,KAAKuO,GAAG,EAAG,qBAAsB,cAEnC,CACEvO,KAAKuO,GAAG,EAAG,qBAAsB,aACjCvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,SAC3B,QAAQqN,EAAIb,mBAqjBtByB,eA/iBgC,CAChChC,KAAM,iBACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,eAEjDhP,KAAKuO,GAAG,EAAG,gCAEb,CACEvO,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GACH,EACA,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,iBA+gBzD4B,eAzgBgC,CAChCjC,KAAM,iBACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,uCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAAC9P,KAAKuO,GAAG,EAAG,SAASyB,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,aACpD,CAACvO,KAAKuO,GAAG,EAAG,YAAavO,KAAKuO,GAAG,EAAG,SAASyB,EAAIf,gBAqfvD6B,OAlfwB,CACxBlC,KAAM,SACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,gCACZC,YAAa,iCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,MAAKT,aACjC,MAAMrB,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBiC,EAAgB,SAATtH,GAA4B,UAATA,EAAmB,IAAM,IACnDuH,EAAgB,QAATvH,GAA2B,SAATA,EAAkB,GAAI,EAC/CwH,EAAIjB,EAAIX,UAAY2B,EAE1B,GAAc,SAAVlB,EACF,MAAO,CACL9P,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,iBAAiBoO,KAAQE,eAAejB,EAAIhB,eAE7GhP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,6CAA6C2B,qBAItE,MAAMG,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAO,CACL/O,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,6CAA6C2B,oBAElE/Q,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgC8B,EAAGzO,QAAQyO,EAAGvO,iBAAiBoO,KAAY,GAAJE,eAAqBjB,EAAIf,iBAuczHkC,OAjcwB,CACxBvC,KAAM,SACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,GACTC,OAAQ,SACRC,WAAY,uCACZC,YAAa,wCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBiC,EAAgB,SAATtH,GAA4B,UAATA,EAAmB,IAAM,IACnDuH,EAAgB,QAATvH,GAA2B,SAATA,EAAkB,GAAI,EAC/C2H,EAAIpB,EAAIV,QAAU0B,EAExB,MAAiB,SAAVlB,EACH,CACE9P,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,iBAAiBoO,KAAQK,eAAepB,EAAIhB,cAC3G,QAAQgB,EAAId,eAEdlP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,6CAA6C2B,mBAChE,cAGJ,CACE/Q,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,6CAA6C2B,mBAChE,aAEF/Q,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgCpP,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQtM,QAAQzC,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQpM,iBAAiBoO,KAAY,GAAJK,eAAqBpB,EAAIf,aACnK,QAAQe,EAAIb,mBAoZtBkC,OA9YwB,CACxBzC,KAAM,SACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,GACTC,OAAQ,SACRC,WAAY,iCACZC,YAAa,gCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBwC,EACK,QAAT7H,EAAiBuG,EAAIV,QAAmB,WAAT7F,GAAqBuG,EAAIV,QAAU,EAC9DiC,EACK,SAAT9H,EAAkBuG,EAAIV,QAAmB,UAAT7F,GAAoBuG,EAAIV,QAAU,EAEpE,MAAiB,SAAVQ,EACH,CACE9P,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,mBAAmB2O,iBAAkBC,eAAgBvB,EAAIhB,eAE1HhP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,6EAGvB,CACEpP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,4EAErBpP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgCpP,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQtM,QAAQzC,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQpM,mBAAwB,GAAL2O,iBAA6B,GAALC,eAAsBvB,EAAIf,iBAoWhMuC,QA9VyB,CACzB5C,KAAM,UACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,GACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CACE9P,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,iDAAiDY,EAAIhB,cACxE,QAAQgB,EAAId,eAEdlP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,+CACnB,cAGJ,CACEpP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,+CACnB,aAEFpP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,iDAAiDY,EAAIf,aACxE,QAAQe,EAAIb,kBAsTtBsC,SAjT0B,CAC1B7C,KAAM,WACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,qCACZC,YAAa,oCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBkC,EAAgB,QAATvH,GAA2B,SAATA,EAAkB,GAAI,EAC/CwH,EAAIjB,EAAIX,UAAY2B,EAE1B,MAAiB,SAAVlB,EACH,CACE9P,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,mBAAmBsO,eAAejB,EAAIhB,eAEvGhP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,+DAGvB,CACEpP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,8DAErBpP,KAAKuO,GACH,EACA,eAAeyB,EAAIZ,gCAAgCpP,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQtM,QAAQzC,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQpM,mBAAuB,GAAJsO,eAAqBjB,EAAIf,iBAyQvKyC,QAnQyB,CACzB9C,KAAM,UACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,sCACZC,YAAa,gCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SAC7B,GAAc,SAAVgB,EACF,MAAO,CACL9P,KAAKuO,GACH,EACA,eAAeL,EAAEzL,QAAQyL,EAAEvL,gBAAgBqN,EAAIhB,eAEjDhP,KAAKuO,GAAG,EAAG,kCACXvO,KAAKuO,GAAG,EAAG,gCAGf,MAAM2C,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAO,CACL/O,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GACH,EACA,eAAe2C,EAAGzO,QAAQyO,EAAGvO,gBAAgBqN,EAAIf,iBAiOvD0C,OA3NwB,CACxB/C,KAAM,SACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,GACRC,WAAY,GACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,sCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SAC7B,GAAc,SAAVgB,EACF,MAAO,CACL9P,KAAKuO,GACH,EACA,eAAeL,EAAEzL,QAAQyL,EAAEvL,gBAAgBqN,EAAIhB,eAEjDhP,KAAKuO,GAAG,EAAG,kCACXvO,KAAKuO,GAAG,EAAG,gCAGf,MAAM2C,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAO,CACL/O,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GACH,EACA,eAAe2C,EAAGzO,QAAQyO,EAAGvO,gBAAgBqN,EAAIf,iBAyLvD2C,MAnLuB,CACvBhD,KAAM,QACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,GACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,oCACZC,YAAa,6BACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoC,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,UACtC3C,KAAKuO,GAAG,EAAG,uBAEb,CACEvO,KAAKuO,GAAG,EAAG,sBACXvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,aAwJhD5B,IAnJqB,CACrB6N,KAAM,MACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,uCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CACE9P,KAAKuO,GAAG,EAAG,SAASyB,EAAIhB,eACxBhP,KAAKuO,GAAG,EAAG,eACXvO,KAAKuO,GAAG,EAAG,aAEb,CAACvO,KAAKuO,GAAG,EAAG,YAAavO,KAAKuO,GAAG,EAAG,SAASyB,EAAIf,gBA2HvD4C,KAxHsB,CACtBjD,KAAM,OACNC,SAAU,CACRC,QAAS,GACTC,OAAQ,GACRC,WAAY,EACZC,UAAW,EACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,mCACZC,YAAa,iCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoC,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,UACtC3C,KAAKuO,GAAG,EAAG,uBAEb,CACEvO,KAAKuO,GAAG,EAAG,sBACXvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,aA6FhDmP,KAxFsB,CACtBlD,KAAM,OACNC,SAAU,CACRC,QAAS,EACTC,OAAQ,EACRC,WAAY,IACZC,UAAW,IACXC,SAAU,EACVC,UAAW,EACXC,cAAe,IACfC,UAAW,GACXC,QAAS,EACTC,OAAQ,SACRC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IACfC,aAAc,KAEhBC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoC,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CACE9P,KAAKuO,GACH,EACA,eAAeL,EAAEzL,QAAQyL,EAAEvL,gBAAgBqN,EAAIhB,eAEjDhP,KAAKuO,GAAG,EAAG,gCAEb,CACEvO,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GACH,EACA,eAAe2C,EAAGzO,QAAQyO,EAAGvO,gBAAgBqN,EAAIf,iBAyD/D,CAGQ,kBAAA8C,CACNzL,EACAmD,EACAqG,EACAkC,GAEA,MAAMC,EAAMjS,KAAK0O,iBACXwD,EAAMD,EAAI3L,IAAW2L,EAAI9B,QAGVnQ,KAAKmS,kBAC1B,MAAMnC,EAAM,IACPkC,EAAIrD,YACHmD,GAAa,CAAA,GAGbzC,EAASvP,KAAKqO,cAAc5E,EAAMuG,EAAIT,QAE5C,MAAO,CACL6C,UAAWF,EAAItC,aAAa,CAAEnG,OAAMqG,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,gBAAchG,CACZ5I,EACA0I,EACAqG,GAGA,GADA9P,KAAKqS,uBAAuBtR,GACxBf,KAAKmO,uBAAwB,OAGjC,MAAM7H,EAAStG,KAAKgB,KAAKqF,YACzB,GAAe,SAAXC,EAAmB,OAGvBtG,KAAK8J,UAAUC,SACf/J,KAAK8N,YAAY/D,SAEjB/J,KAAKY,OAAmB,SAAVkP,EAAmB,UAAY,UAE7C/O,EAAIqI,MAAMkJ,WAAa,OAGvB,MAAMF,UAAEA,EAAApC,IAAWA,EAAAT,OAAKA,GAAWvP,KAAK+R,mBACtCzL,EACAmD,EACAqG,GAIIjL,EAAqB,SAAViL,EAAmBE,EAAIN,cAAgBM,EAAIL,aAGtD4C,EAAOvS,KAAKwS,WAAWlM,GACzBiM,GACFxR,EAAIqI,MAAMqJ,eAAiB,cAC3B1R,EAAIqI,MAAMsJ,mBAAqB,WAG/B3R,EAAIqI,MAAMqJ,eAAiB,GAC3B1R,EAAIqI,MAAMsJ,mBAAqB,IAIjC3R,EAAIqI,MAAMuJ,gBAAkBpD,EAE5B,MAAMqD,EAAmB,SAAV9C,EAAmBE,EAAIR,WAAaQ,EAAIP,YAEjDoD,EAAO9R,EAAI+R,QAAQV,EAAkB,CACzCvN,WACA+N,SACAG,KAAM,SAGR/S,KAAK8N,WAAa+E,EAElB,UACQA,EAAKG,QACb,CAAA,MAEA,CAAA,QACMhT,KAAK8N,aAAe+E,IAAM7S,KAAK8N,gBAAa,GAChD/M,EAAIqI,MAAMkJ,WAAa,GACnBC,IACFxR,EAAIqI,MAAMqJ,eAAiB,GAC3B1R,EAAIqI,MAAMsJ,mBAAqB,IAGjC1S,KAAKY,OAAmB,SAAVkP,EAAmB,OAAS,MAC5C,CACF,CAEQ,sBAAAuC,CAAuBtR,GAC7B,MAAMkS,EAAclS,EAAIqI,MAAMkJ,YAAc,GAGxCW,EAAY1Q,SAAS,cAAgB0Q,EAAY1Q,SAAS,YAC5D2Q,QAAQC,KACN,0KAIAF,EAAY1Q,SAAS,WAAa0Q,EAAY1Q,SAAS,aACzD2Q,QAAQC,KACN,0KAGN,CAIQ,WAAAnF,CAAYjN,EAAkBqS,EAAeC,GACnD,GAAoB,SAAhBrT,KAAKY,OAAmB,OAE5B,MAAM0S,EAAKF,EAAKhH,KAAOiH,EAAGjH,KACpBmH,EAAKH,EAAKlH,IAAMmH,EAAGnH,IACzB,GAAIlH,KAAKwO,IAAIF,GAAM,IAAOtO,KAAKwO,IAAID,GAAM,GAAK,OAE9CvT,KAAK8J,UAAUC,SAGf,MAAMlF,EAAW7E,KAAKgB,KAAK2F,kBAErBkM,EAAO9R,EAAI+R,QACf,CACE,CAAErE,UAAW,eAAe6E,QAASC,WACrC,CAAE9E,UAAW,yBAEf,CACE5J,WACA+N,OAAQ,gCACRG,KAAM,SAIV/S,KAAK8J,SAAW+I,EAChBA,EAAKG,SAASS,QAAQ,KAChBzT,KAAK8J,WAAa+I,IAAM7S,KAAK8J,cAAW,IAEhD,CAEQ,UAAA0I,CAAWlM,GACjB,MACa,WAAXA,GACW,WAAXA,GACW,WAAXA,GACW,YAAXA,GACW,aAAXA,CAEJ,CAEQ,WAAAoD,CAAYD,GAClB,MAAM1I,EAAMf,KAAKgB,KAAKC,aACjBF,GACLA,EAAI2S,aAAa1T,KAAKgB,KAAKwG,SAAUiC,EACvC,CAIQ,8BAAAnB,GACN,GAAsB,oBAAXzF,OAAwB,OAEnC,MAAMZ,EAASjC,KAAKgB,KAAKkB,YACnBnB,EAAMf,KAAKgB,KAAKC,aAElBgB,GAAU,mBAAoBY,SAChC7C,KAAKyI,UAAUC,aACf1I,KAAKyI,SAAW,IAAIkL,eAAe,KAC7B3T,KAAKC,OAAOD,KAAK4B,aAEvB5B,KAAKyI,SAASmL,QAAQ3R,IAGpBlB,GAAO,mBAAoB8B,SAC7B7C,KAAK2I,WAAWD,aAChB1I,KAAK2I,UAAY,IAAIgL,eAAe,KAC9B3T,KAAKC,OAAOD,KAAK4B,aAEvB5B,KAAK2I,UAAUiL,QAAQ7S,IAGzBf,KAAKwI,wBAEL,MAAM8F,EAAOtO,KAAKgB,KAAKqG,gBACvB,GAAa,WAATiH,EAEJ,GAAIA,aAAgBhL,YAClBtD,KAAK6T,WAAWvF,QAIlB,GAAIrM,EACF,IAAA,MAAW0I,KAAK3K,KAAK8T,iBAAiB7R,GAASjC,KAAK6T,WAAWlJ,EAEnE,CAEQ,UAAAkJ,CAAWE,GACjB,MAAMC,EAAKhU,KAAK0D,eAChBqQ,EAAG5L,iBAAiB,SAAU6L,EAAI,CAAE5L,SAAS,IAC7CpI,KAAKG,mBAAmBsK,KAAK,CAAEsJ,KAAIC,MACrC,CAEQ,qBAAAxL,GACN,IAAA,MAAWuL,GAAEA,EAAAC,GAAIA,KAAQhU,KAAKG,mBAC3B4T,EAAWxL,sBAAsB,SAAUyL,GAE9ChU,KAAKG,mBAAqB,EAC5B,CAEQ,gBAAA2T,CAAiBzQ,GACvB,MAAM4Q,EAAyB,GAC/B,IAAIF,EAAyB1Q,EAAK6Q,cAElC,KAAOH,GAAMA,IAAOhQ,SAASoQ,MAAM,CACjC,MAAM/K,EAAQ6D,iBAAiB8G,GACzBK,EAAYhL,EAAMgL,UAClBC,EAAYjL,EAAMiL,UAElBC,GACW,SAAdF,GACe,WAAdA,GACc,YAAdA,IACFL,EAAGQ,aAAeR,EAAGS,aAEjBC,GACW,SAAdJ,GACe,WAAdA,GACc,YAAdA,IACFN,EAAGW,YAAcX,EAAGY,aAElBL,GAAcG,IAAYR,EAAQxJ,KAAKsJ,GAC3CA,EAAKA,EAAGG,aACV,CAEA,OAAOD,CACT,CAsCQ,sBAAAhL,GACNjJ,KAAKM,cAAgByD,SAASC,aAChC,CAEQ,uBAAA4Q,CAAwBb,GAC9B,KAAMA,aAAczQ,aAAc,OAAO,EAEzC,MAAMrB,EAASjC,KAAKgB,KAAKkB,YACnB2S,EAAc7U,KAAKgB,KAAKuG,oBAAsB,KAEpD,SAAIsN,GAAgBd,IAAOc,IAAeA,EAAY3Q,SAAS6P,OAG1D9R,MACD8R,IAAO9R,IAAUA,EAAOiC,SAAS6P,OACjC9R,EAAO6S,YAAY5Q,SAAS6P,GAElC,CAEQ,YAAArS,GACN,IAAK1B,KAAKgB,KAAKS,yBAA0B,OAEzC,MAAMQ,EAASjC,KAAKgB,KAAKkB,YACzB,IAAKD,EAAQ,OAEb,MAAM4S,EAAc7U,KAAKgB,KAAKuG,oBAAsBtF,EAC9C6B,EAASC,SAASC,cAClB+Q,EAAO/U,KAAKM,cACZS,EAAMf,KAAKgB,KAAKC,aAEhB+T,KAA0BjU,GAAOgU,GAAQhU,EAAImD,SAAS6Q,IACtDE,EAAuBjV,KAAK4U,wBAAwBG,OAC3BhU,GAAO+C,GAAU/C,EAAImD,SAASJ,KAElCkR,GAAwBC,IACjDJ,EAAYK,QAAQ,CAAEC,eAAe,GAEzC,CAIQ,uBAAAjM,GACN,MAAMnI,EAAMf,KAAKgB,KAAKC,aACjBF,IACAA,EAAIqI,MAAMgM,SAAQrU,EAAIqI,MAAMgM,OAAS,KAC5C,CAQA,YAAAC,CACEzR,EACA0R,GAIGtV,KAAKgB,KAAa4C,GAFA,mBAAV0R,EAEiBA,EAGA,IAAMA,EAG9BtV,KAAKC,OAAS2D,EAAI2R,WAAW,QAE/BvV,KAAK4B,UAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iconify-offline.js","sources":["../../src/helper/iconify-offline.ts"],"sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"iconify-offline.js","sources":["../../src/helper/iconify-offline.ts"],"sourcesContent":["/**\n * Iconify/sky-icon helpers: extract icon names from code and fetch icon data for offline use.\n *\n * Usage (browser or Node):\n * import { extractIconNames, fetchIconsForOffline, registerOfflineIcons } from '~/components/helper/iconify-offline';\n * import { SkyIcon } from '~/components/sky-icon/sky-icon';\n *\n * // Extract icon names from a code page string\n * const names = extractIconNames('<sky-icon icon=\"ion:home\"></sky-icon>'); // ['ion:home']\n *\n * // Fetch and then register in SkyIcon (directly pass generated JSON)\n * const combined = await fetchIconsForOffline(['ion:home', 'mdi:bell']);\n * registerOfflineIcons(combined, (prefix, data) => SkyIcon.registerLocalSet(prefix, data));\n *\n * // Or from saved JSON string:\n * const combined = JSON.parse(savedJson);\n * registerOfflineIcons(combined, (prefix, data) => SkyIcon.registerLocalSet(prefix, data));\n */\n\nconst ICONIFY_API_BASE = 'https://api.iconify.design';\n\n/** Matches quoted \"prefix:icon-name\" (prefix must start with a letter so \"1:3\" etc. are ignored). */\nconst QUOTED_ICON_PATTERN = /([\"'`])([a-z][a-z0-9-]*:[a-zA-Z0-9_.-]+)\\1/g;\n\nexport interface IconifyIconData {\n body?: string;\n left?: number;\n top?: number;\n width?: number;\n height?: number;\n viewBox?: string;\n hidden?: boolean;\n}\n\nexport interface IconifySetData {\n prefix?: string;\n icons: Record<string, IconifyIconData>;\n width?: number;\n height?: number;\n left?: number;\n top?: number;\n /** Icon names requested but not in API response; add manually if needed. Omit when registering with SkyIcon. */\n _notFound?: string[];\n}\n\n/** Combined offline data: prefix -> Iconify set data (ready for SkyIcon.registerLocalSet). Skip keys starting with _ when registering. */\nexport type CombinedOfflineIcons = Record<string, IconifySetData>;\n\nexport interface FetchIconsForOfflineOptions {\n /** Iconify API base URL (default: https://api.iconify.design) */\n baseUrl?: string;\n}\n\n/**\n * Extracts all icon names in \"prefix:icon-name\" format from a code page string.\n * Looks for icon names inside single, double, or backtick quotes (e.g. in attributes\n * like icon=\"ion:home\", iconL='mdi:bell', or :icon=\"`ion:person`\").\n *\n * @param codePageString - Source code string (HTML, Vue, TS, JS, etc.)\n * @returns Array of unique icon names (e.g. [\"ion:home\", \"mdi:bell\"])\n */\nexport function extractIconNames(codePageString: string): string[] {\n if (!codePageString || typeof codePageString !== 'string') {\n return [];\n }\n const seen = new Set<string>();\n const result: string[] = [];\n let match: RegExpExecArray | null;\n QUOTED_ICON_PATTERN.lastIndex = 0;\n while ((match = QUOTED_ICON_PATTERN.exec(codePageString)) !== null) {\n const full = match[2];\n if (full && full.includes(':') && !seen.has(full)) {\n seen.add(full);\n result.push(full);\n }\n }\n return result;\n}\n\n/**\n * Fetches icon data from the Iconify API for the given icon names, groups by prefix,\n * and returns a combined JSON object keyed by prefix for offline use.\n *\n * @param iconNames - List of icon names in \"prefix:icon-name\" format (e.g. [\"ion:home\", \"mdi:bell\"])\n * @param options - Optional baseUrl for the Iconify API\n * @returns Combined object: { \"ion\": { prefix, icons, width, height }, \"mdi\": { ... }, ... }\n * Use with SkyIcon.registerLocalSet(prefix, combined[prefix]) for each prefix.\n */\nexport async function fetchIconsForOffline(\n iconNames: string[],\n options: FetchIconsForOfflineOptions = {}\n): Promise<CombinedOfflineIcons> {\n const baseUrl = (options.baseUrl || ICONIFY_API_BASE).replace(/\\/$/, '');\n const byPrefix = new Map<string, string[]>();\n\n for (const full of iconNames) {\n const trimmed = full.trim();\n if (!trimmed || !trimmed.includes(':')) continue;\n const [prefix, name] = trimmed.split(':');\n const iconName = name?.trim();\n if (!prefix || !iconName) continue;\n // Ignore non-icon patterns (e.g. \"1:3\"); Iconify prefixes start with a letter\n if (!/^[a-z]/.test(prefix)) continue;\n if (!byPrefix.has(prefix)) {\n byPrefix.set(prefix, []);\n }\n const list = byPrefix.get(prefix)!;\n if (!list.includes(iconName)) {\n list.push(iconName);\n }\n }\n\n const combined: CombinedOfflineIcons = {};\n\n await Promise.all(\n Array.from(byPrefix.entries()).map(async ([prefix, names]) => {\n const iconsParam = names.join(',');\n const url = `${baseUrl}/${prefix}.json?icons=${encodeURIComponent(iconsParam)}`;\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(\n `Iconify API error for ${prefix}: ${res.status} ${res.statusText}`\n );\n }\n const json = (await res.json()) as IconifySetData & {\n icons?: Record<string, IconifyIconData>;\n };\n const returnedIcons = json.icons || {};\n const notFound = names.filter((name) => !returnedIcons[name]);\n const setData: IconifySetData = {\n prefix,\n icons: returnedIcons,\n width: json.width,\n height: json.height,\n left: json.left,\n top: json.top,\n };\n if (notFound.length > 0) {\n setData._notFound = notFound;\n }\n combined[prefix] = setData;\n })\n );\n\n const hasAnyNotFound = Object.values(combined).some(\n (set) => set._notFound && set._notFound.length > 0\n );\n if (hasAnyNotFound) {\n (combined as Record<string, unknown>)['_comment_notFound'] =\n 'Icons listed in _notFound (per set) were not in the API response; add manually if needed.';\n }\n\n return combined;\n}\n\n/** Set data without _notFound / _comment (suitable for SkyIcon.registerLocalSet). */\ntype SetDataForRegister = Omit<IconifySetData, '_notFound'>;\n\n/**\n * Registers the generated offline JSON with SkyIcon. Pass the object returned by fetchIconsForOffline\n * (or parsed from saved JSON). Skips top-level keys starting with \"_\" and strips _notFound from each set.\n *\n * @param combined - The combined object (from fetchIconsForOffline or JSON.parse of saved output)\n * @param register - Callback to register each set, e.g. (prefix, data) => SkyIcon.registerLocalSet(prefix, data)\n */\nexport function registerOfflineIcons(\n combined: CombinedOfflineIcons & Record<string, unknown>,\n register: (prefix: string, data: SetDataForRegister) => void\n): void {\n for (const [key, set] of Object.entries(combined)) {\n if (key.startsWith('_')) continue;\n if (!set || typeof set !== 'object' || !('icons' in set)) continue;\n const { _notFound: _unused, ...data } = set as IconifySetData;\n register(key, data as SetDataForRegister);\n }\n}\n"],"names":["QUOTED_ICON_PATTERN","extractIconNames","codePageString","seen","Set","result","match","lastIndex","exec","full","includes","has","add","push","async","fetchIconsForOffline","iconNames","options","baseUrl","replace","byPrefix","Map","trimmed","trim","prefix","name","split","iconName","test","set","list","get","combined","Promise","all","Array","from","entries","map","names","iconsParam","join","url","encodeURIComponent","res","fetch","ok","Error","status","statusText","json","returnedIcons","icons","notFound","filter","setData","width","height","left","top","length","_notFound","Object","values","some","registerOfflineIcons","register","key","startsWith","_unused","data"],"mappings":"AAmBA,MAGMA,EAAsB,8CAuCrB,SAASC,EAAiBC,GAC/B,IAAKA,GAA4C,iBAAnBA,EAC5B,MAAO,GAET,MAAMC,MAAWC,IACXC,EAAmB,GACzB,IAAIC,EAEJ,IADAN,EAAoBO,UAAY,EAC8B,QAAtDD,EAAQN,EAAoBQ,KAAKN,KAA2B,CAClE,MAAMO,EAAOH,EAAM,GACfG,GAAQA,EAAKC,SAAS,OAASP,EAAKQ,IAAIF,KAC1CN,EAAKS,IAAIH,GACTJ,EAAOQ,KAAKJ,GAEhB,CACA,OAAOJ,CACT,CAWAS,eAAsBC,EACpBC,EACAC,EAAuC,IAEvC,MAAMC,GAAWD,EAAQC,SAzEF,8BAyE+BC,QAAQ,MAAO,IAC/DC,MAAeC,IAErB,IAAA,MAAWZ,KAAQO,EAAW,CAC5B,MAAMM,EAAUb,EAAKc,OACrB,IAAKD,IAAYA,EAAQZ,SAAS,KAAM,SACxC,MAAOc,EAAQC,GAAQH,EAAQI,MAAM,KAC/BC,EAAWF,GAAMF,OACvB,IAAKC,IAAWG,EAAU,SAE1B,IAAK,SAASC,KAAKJ,GAAS,SACvBJ,EAAST,IAAIa,IAChBJ,EAASS,IAAIL,EAAQ,IAEvB,MAAMM,EAAOV,EAASW,IAAIP,GACrBM,EAAKpB,SAASiB,IACjBG,EAAKjB,KAAKc,EAEd,CAEA,MAAMK,EAAiC,CAAA,QAEjCC,QAAQC,IACZC,MAAMC,KAAKhB,EAASiB,WAAWC,IAAIxB,OAAQU,EAAQe,MACjD,MAAMC,EAAaD,EAAME,KAAK,KACxBC,EAAM,GAAGxB,KAAWM,gBAAqBmB,mBAAmBH,KAC5DI,QAAYC,MAAMH,GACxB,IAAKE,EAAIE,GACP,MAAM,IAAIC,MACR,yBAAyBvB,MAAWoB,EAAII,UAAUJ,EAAIK,cAG1D,MAAMC,QAAcN,EAAIM,OAGlBC,EAAgBD,EAAKE,OAAS,CAAA,EAC9BC,EAAWd,EAAMe,OAAQ7B,IAAU0B,EAAc1B,IACjD8B,EAA0B,CAC9B/B,SACA4B,MAAOD,EACPK,MAAON,EAAKM,MACZC,OAAQP,EAAKO,OACbC,KAAMR,EAAKQ,KACXC,IAAKT,EAAKS,KAERN,EAASO,OAAS,IACpBL,EAAQM,UAAYR,GAEtBrB,EAASR,GAAU+B,KAYvB,OARuBO,OAAOC,OAAO/B,GAAUgC,KAC5CnC,GAAQA,EAAIgC,WAAahC,EAAIgC,UAAUD,OAAS,KAGhD5B,EAAwD,kBACvD,6FAGGA,CACT,CAYO,SAASiC,EACdjC,EACAkC,GAEA,IAAA,MAAYC,EAAKtC,KAAQiC,OAAOzB,QAAQL,GAAW,CACjD,GAAImC,EAAIC,WAAW,KAAM,SACzB,IAAKvC,GAAsB,iBAARA,KAAsB,UAAWA,GAAM,SAC1D,MAAQgC,UAAWQ,KAAYC,GAASzC,EACxCqC,EAASC,EAAKG,EAChB,CACF"}
|
package/dist/helper/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export{extractIconNames,fetchIconsForOffline,registerOfflineIcons}from"./iconify-offline.js";export{AnimationController}from"./controllers/animation-controller.js";export{ColorResolver,DEFAULT_COLOR_TOKENS,colorResolver,createGradient,darkShade,fadeMix,hoverShade,isDefaultColorToken,lightShade,parseGradientSpec,resolveAccentColorForToken,resolveColor,resolveGradientStop,resolveInkColorForToken,resolveSemanticSurfaceKey,resolveTextColorForToken,semanticSoftSurfaceTokens,skyBorderPrimaryShorthand,skyBorderWidthSolid,tuneSurfaceVariantForDefaultColor}from"./utils/color-resolver.js";export{FormControlBase}from"./internals/form-control-base.js";export{PopoverController}from"./controllers/popover-controller.js";export{resolveRadius}from"./utils/size-resolver.js";
|
|
1
|
+
export{extractIconNames,fetchIconsForOffline,registerOfflineIcons}from"./iconify-offline.js";export{AnimationController}from"./controllers/animation-controller.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"./utils/contrast-color.js";export{ColorResolver,DEFAULT_COLOR_TOKENS,colorResolver,createGradient,darkShade,fadeMix,hoverShade,isDefaultColorToken,lightShade,parseGradientSpec,resolveAccentColorForToken,resolveColor,resolveGradientStop,resolveInkColorForToken,resolveSemanticSurfaceKey,resolveTextColorForToken,semanticSoftSurfaceTokens,skyBorderPrimaryShorthand,skyBorderWidthSolid,tuneSurfaceVariantForDefaultColor}from"./utils/color-resolver.js";export{FormControlBase}from"./internals/form-control-base.js";export{PopoverController}from"./controllers/popover-controller.js";export{resolveRadius}from"./utils/size-resolver.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LitElement } from
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
2
|
export type FormState = string | File | FormData | null | string;
|
|
3
3
|
export declare abstract class FormControlBase extends LitElement {
|
|
4
4
|
/** Enables form-associated custom element behavior */
|
|
@@ -67,10 +67,10 @@ export declare abstract class FormControlBase extends LitElement {
|
|
|
67
67
|
set selectionStart(v: number | null);
|
|
68
68
|
get selectionEnd(): number | null;
|
|
69
69
|
set selectionEnd(v: number | null);
|
|
70
|
-
get selectionDirection():
|
|
70
|
+
get selectionDirection(): 'forward' | 'backward' | 'none' | null;
|
|
71
71
|
select(): void;
|
|
72
|
-
setSelectionRange(start: number, end: number, direction?:
|
|
73
|
-
setRangeText(replacement: string, start?: number, end?: number, selectionMode?:
|
|
72
|
+
setSelectionRange(start: number, end: number, direction?: 'forward' | 'backward' | 'none'): void;
|
|
73
|
+
setRangeText(replacement: string, start?: number, end?: number, selectionMode?: 'select' | 'start' | 'end' | 'preserve'): void;
|
|
74
74
|
get valueAsNumber(): number;
|
|
75
75
|
set valueAsNumber(v: number);
|
|
76
76
|
get valueAsDate(): Date | null;
|