@sky.ui/core 0.0.39 → 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.
Files changed (86) hide show
  1. package/dist/custom-elements.json +1730 -1730
  2. package/dist/helper/controllers/animation-controller.d.ts +4 -4
  3. package/dist/helper/controllers/animation-controller.js.map +1 -1
  4. package/dist/helper/controllers/popover-controller.d.ts +11 -11
  5. package/dist/helper/controllers/popover-controller.js.map +1 -1
  6. package/dist/helper/iconify-offline.js.map +1 -1
  7. package/dist/helper/internals/form-control-base.d.ts +4 -4
  8. package/dist/helper/internals/form-control-base.js.map +1 -1
  9. package/dist/helper/utils/color-resolver.js.map +1 -1
  10. package/dist/helper/utils/contrast-color.d.ts +4 -4
  11. package/dist/helper/utils/contrast-color.js.map +1 -1
  12. package/dist/helper/utils/size-resolver.js.map +1 -1
  13. package/dist/sky-alert/sky-alert.d.ts +5 -5
  14. package/dist/sky-alert/sky-alert.js +16 -6
  15. package/dist/sky-alert/sky-alert.js.map +1 -1
  16. package/dist/sky-appbar/sky-appbar.d.ts +2 -2
  17. package/dist/sky-appbar/sky-appbar.js +15 -23
  18. package/dist/sky-appbar/sky-appbar.js.map +1 -1
  19. package/dist/sky-avatar/sky-avatar.d.ts +3 -3
  20. package/dist/sky-avatar/sky-avatar.js +8 -11
  21. package/dist/sky-avatar/sky-avatar.js.map +1 -1
  22. package/dist/sky-badge/sky-badge.d.ts +5 -5
  23. package/dist/sky-badge/sky-badge.js +10 -6
  24. package/dist/sky-badge/sky-badge.js.map +1 -1
  25. package/dist/sky-button/sky-button.d.ts +5 -5
  26. package/dist/sky-button/sky-button.js +24 -15
  27. package/dist/sky-button/sky-button.js.map +1 -1
  28. package/dist/sky-card/sky-card.d.ts +5 -5
  29. package/dist/sky-card/sky-card.js +20 -20
  30. package/dist/sky-card/sky-card.js.map +1 -1
  31. package/dist/sky-checkbox/sky-checkbox.d.ts +2 -2
  32. package/dist/sky-checkbox/sky-checkbox.js +67 -59
  33. package/dist/sky-checkbox/sky-checkbox.js.map +1 -1
  34. package/dist/sky-chip/sky-chip.d.ts +3 -3
  35. package/dist/sky-chip/sky-chip.js +34 -25
  36. package/dist/sky-chip/sky-chip.js.map +1 -1
  37. package/dist/sky-col/sky-col.d.ts +4 -4
  38. package/dist/sky-col/sky-col.js +8 -3
  39. package/dist/sky-col/sky-col.js.map +1 -1
  40. package/dist/sky-combobox/sky-combobox.d.ts +8 -8
  41. package/dist/sky-combobox/sky-combobox.js +201 -168
  42. package/dist/sky-combobox/sky-combobox.js.map +1 -1
  43. package/dist/sky-dialog/sky-dialog.d.ts +4 -4
  44. package/dist/sky-dialog/sky-dialog.js +17 -19
  45. package/dist/sky-dialog/sky-dialog.js.map +1 -1
  46. package/dist/sky-divider/sky-divider.d.ts +3 -3
  47. package/dist/sky-divider/sky-divider.js.map +1 -1
  48. package/dist/sky-flexbox/sky-flexbox.d.ts +7 -7
  49. package/dist/sky-flexbox/sky-flexbox.js +2 -2
  50. package/dist/sky-flexbox/sky-flexbox.js.map +1 -1
  51. package/dist/sky-flexcol/sky-flexcol.d.ts +3 -3
  52. package/dist/sky-flexcol/sky-flexcol.js.map +1 -1
  53. package/dist/sky-form/sky-form.d.ts +12 -12
  54. package/dist/sky-form/sky-form.js +12 -12
  55. package/dist/sky-form/sky-form.js.map +1 -1
  56. package/dist/sky-grid/sky-grid.d.ts +2 -2
  57. package/dist/sky-grid/sky-grid.js.map +1 -1
  58. package/dist/sky-icon/sky-icon.d.ts +1 -1
  59. package/dist/sky-icon/sky-icon.js +1 -1
  60. package/dist/sky-icon/sky-icon.js.map +1 -1
  61. package/dist/sky-image/sky-image.d.ts +5 -5
  62. package/dist/sky-image/sky-image.js.map +1 -1
  63. package/dist/sky-image/srcset-utils.js.map +1 -1
  64. package/dist/sky-input/sky-input.d.ts +6 -6
  65. package/dist/sky-input/sky-input.js +103 -88
  66. package/dist/sky-input/sky-input.js.map +1 -1
  67. package/dist/sky-list/sky-list.d.ts +4 -4
  68. package/dist/sky-list/sky-list.js +1 -3
  69. package/dist/sky-list/sky-list.js.map +1 -1
  70. package/dist/sky-listitem/sky-listitem.d.ts +2 -2
  71. package/dist/sky-listitem/sky-listitem.js +4 -7
  72. package/dist/sky-listitem/sky-listitem.js.map +1 -1
  73. package/dist/sky-radio/sky-radio.d.ts +3 -3
  74. package/dist/sky-radio/sky-radio.js +6 -3
  75. package/dist/sky-radio/sky-radio.js.map +1 -1
  76. package/dist/sky-row/sky-row.d.ts +2 -2
  77. package/dist/sky-row/sky-row.js.map +1 -1
  78. package/dist/sky-sheet/sky-sheet.d.ts +6 -6
  79. package/dist/sky-sheet/sky-sheet.js +21 -21
  80. package/dist/sky-sheet/sky-sheet.js.map +1 -1
  81. package/dist/sky-simple-table/sky-simple-table.d.ts +4 -4
  82. package/dist/sky-simple-table/sky-simple-table.js +4 -1
  83. package/dist/sky-simple-table/sky-simple-table.js.map +1 -1
  84. package/dist/sky-theme-provider/sky-theme-provider.d.ts +27 -27
  85. package/dist/sky-theme-provider/sky-theme-provider.js.map +1 -1
  86. 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":"AAoJO,MAAMA,EA8EX,WAAAC,CAAYC,EAA8BC,GA5E1CC,KAAQC,OAAQ,EAEhBD,KAAQE,IAAM,EAKdF,KAAQG,mBAAoE,GAG5EH,KAAQI,oBAAqB,EAE7BJ,KAAQK,gBAA+B,SACvCL,KAAQM,cAAgC,KAExCN,KAAQO,eAAgB,EACxBP,KAAQQ,qBAAsB,EAE9BR,KAAQS,SAA2D,CACjEC,MAAO,SACPC,WAAY,UAGdX,KAAQY,OAAkD,OAkQ1DZ,KAAAa,SAAYC,IACV,GAA6B,kBAAzBd,KAAKK,gBAEP,YADAL,KAAKK,gBAAkB,UAGzB,MAAMU,EAAMf,KAAKgB,KAAKC,aAChBC,EAAKJ,EAEX,IAAIK,EAAyB,KAG7B,GAF4B,iBAAjBD,GAAIE,WAAuBD,EAAyB,SAAhBD,EAAGE,UACnC,OAAXD,GAAmBJ,MAAcA,EAAIM,UAAU,mBAAoB,GACxD,OAAXF,EAAJ,CAEA,IAAKA,EAKH,OAJAnB,KAAKC,OAAQ,EACbD,KAAKsB,kCACLtB,KAAKgB,KAAKO,gBAAe,EAAO,CAAEC,OAAQxB,KAAKK,uBAC3CL,KAAKgB,KAAKS,+BAA+BC,gBAI/C1B,KAAKC,OAAQ,EACbD,KAAK2B,wBACL3B,KAAKgB,KAAKO,gBAAe,EAAM,CAAEC,OAAQ,WAEzCxB,KAAK4B,WACL5B,KAAKE,IAAM2B,sBAAsB,IAAM7B,KAAKgB,KAAKc,gBAf5B,GAwEvB9B,KAAQ+B,sBAAyBjB,IAC/B,IAAKd,KAAKC,MAAO,OACjB,IAAKD,KAAKgB,KAAKgB,oBAAqB,OAEpC,MAAMjB,EAAMf,KAAKgB,KAAKC,aAChBgB,EAASjC,KAAKgB,KAAKkB,YACzB,IAAKnB,IAAQkB,EAAQ,OAGrB,GAAwB,iBAAbnB,EAAEqB,QAAoC,IAAbrB,EAAEqB,OAAc,OAEpD,MAAMC,EAAQtB,EAAEuB,kBAAoB,GAG9BC,EAAgBF,EAAKG,SAASxB,GAC9ByB,EAAeJ,EAAKG,SAASN,GACnC,GAAIK,GAAiBE,EAAc,OAGnC,MAAMC,EAAI3B,EAAE4B,QAASC,EAAI7B,EAAE8B,QAC3B,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,kBA8kCpBzD,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,UAp7CpBzD,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,aACxBpF,EAAQwF,OACRxF,EAAQyF,IACR,GAEFC,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,CA7KA,mBAAetC,CACbuC,EACAC,EACAC,GAEA,OAAOF,GAAA,KAAiBC,GAAeC,EACzC,CAyKA,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,CAAE0E,SAAS,IAC/EpI,KAAKgI,eAAeG,iBAAiB,SAAUnI,KAAK0D,eAAgB,CAAE0E,SAAS,KAEjFvF,OAAOsF,iBAAiB,SAAUnI,KAAK0D,eAAgB,CAAE0E,SAAS,IAClEvF,OAAOsF,iBAAiB,SAAUnI,KAAK0D,eAAgB,CAAE0E,SAAS,EAAMC,SAAS,IAE7ErI,KAAKgB,KAAKsG,gBACZzE,OAAOsF,iBAAiBnI,KAAKgB,KAAKsG,eAAgBtH,KAAKsE,aAErDtE,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,oBAAoBvI,KAAKgB,KAAKsG,eAAgBtH,KAAKsE,aAE5DzB,OAAO0F,oBAAoB,UAAWvI,KAAK2D,WAAW,IAExDI,SAASwE,oBAAoB,cAAevI,KAAK+B,uBAAuB,GAExE/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,CAkCA,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,CAgDA,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,MAAO,MAAO,CAAC,MAAO,SAAU,QAAS,QAC9C,IAAK,SAGL,QAAS,MAAO,CAAC,SAAU,MAAO,QAAS,QAF3C,IAAK,OAAQ,MAAO,CAAC,OAAQ,QAAS,SAAU,OAChD,IAAK,QAAS,MAAO,CAAC,QAAS,OAAQ,SAAU,OAGrD,CAEA,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,EAAU9K,KAAKC,OAAS2K,EAAqB7J,EAAIyI,wBAA0B,KAG3EuB,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,EACJzM,KAAKgB,KAAKmF,gBAAgBgE,OACtBnK,KAAKgK,mBAAmBhK,KAAKgB,KAAKmF,gBAClCnG,KAAKgK,mBAAmBhK,KAAK0K,0BAA0B6B,IAE7D,IAAI7L,EAEJ,GAAkB,SAAd6L,EAAsB,CAExB7L,EADiB+L,EAAUC,KAAKJ,IAG7BG,EACEE,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,IAG/BQ,EACEH,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,IAAMzL,EAAa8M,GAAe1C,EAAM,GAAM,QAAU,OAC5EqB,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,IAAKvL,EAAa+M,GAAc3C,EAAM,GAAM,QAAU,OACzEmB,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,uBACU,oBAAX5E,QACTA,OAAOuL,aAAa,qCAAqC/M,QAChE,CAGQ,aAAAgN,CAAc5E,EAAmB6E,GACvC,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,GAsiBN,MAAO,CACLC,KAhBsB,CACtBC,KAAM,OACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EACjDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,gCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,IAAM,CAAC,CAAEpB,QAAS,KAOhCqB,KAtiBsB,CACtBjB,KAAM,OACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EACjDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,+BACZC,YAAa,+BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,WACL,SAAVA,EACI,CAAC,CAAEtB,QAAS,GAAK,CAAEA,QAAS,IAC5B,CAAC,CAAEA,QAAS,GAAK,CAAEA,QAAS,KA0hBlCuB,MAvhBuB,CACvBnB,KAAM,QACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,GAAKC,UAAW,IACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,qCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAAC9P,KAAKuO,GAAG,EAAG,SAASyB,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,aACpD,CAACvO,KAAKuO,GAAG,EAAG,YAAavO,KAAKuO,GAAG,EAAG,SAASyB,EAAIf,gBA2gBvDgB,MAxgBuB,CACvBrB,KAAM,QACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EAClDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,iCACZC,YAAa,gCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,WAAY3C,KAAKuO,GAAG,EAAG,uBAC9D,CAACvO,KAAKuO,GAAG,EAAG,sBAAuBvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,cA0f/EwN,QAtfyB,CACzBvB,KAAM,UACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,uCACZC,YAAa,wCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACA9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,iBAAiBqN,EAAIhB,cAAe,QAAQgB,EAAId,eACtFlP,KAAKuO,GAAG,EAAG,8BAA+B,cAE1C,CACAvO,KAAKuO,GAAG,EAAG,8BAA+B,aAC1CvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,iBAAiBqN,EAAIf,aAAc,QAAQe,EAAIb,mBAme3FiB,SA9d0B,CAC1BxB,KAAM,WACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,qCACZC,YAAa,oCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,UAAW3C,KAAKuO,GAAG,EAAG,uBAC7D,CAACvO,KAAKuO,GAAG,EAAG,sBAAuBvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,aAgd/E0N,aA5c8B,CAC9BzB,KAAM,eACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,6BACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACA9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,eAC1DhP,KAAKuO,GAAG,EAAG,gCAEX,CACAvO,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,iBAybhEqB,cApb+B,CAC/B1B,KAAM,gBACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,OACnCC,WAAY,kCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,UAAW3C,KAAKuO,GAAG,EAAG,uBAC7D,CAACvO,KAAKuO,GAAG,EAAG,sBAAuBvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,aAsa/E4N,OAlawB,CACxB3B,KAAM,SACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,KAAOC,UAAW,IACvDC,SAAU,GAAIC,UAAW,EAAGC,cAAe,IAC3CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CACA9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,cAAe,QAAQgB,EAAId,eACrFlP,KAAKuO,GAAG,EAAG,8BAA+B,cAE1C,CACAvO,KAAKuO,GAAG,EAAG,8BAA+B,aAC1CvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,aAAc,QAAQe,EAAIb,mBA+Y1FqB,KA1YsB,CACtB5B,KAAM,OACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,iCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,cAAe,QAAQgB,EAAId,eAAgBlP,KAAKuO,GAAG,EAAG,8BAA+B,cAChJ,CAACvO,KAAKuO,GAAG,EAAG,8BAA+B,aAAcvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,aAAc,QAAQe,EAAIb,mBA4XnJsB,MAxXuB,CACvB7B,KAAM,QACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,kCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,gCACtF,CAACvO,KAAKuO,GAAG,EAAG,+BAAgCvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,iBA0W5GyB,OAtWwB,CACxB9B,KAAM,SACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,EAAGC,UAAW,EACjDC,SAAU,GAAIC,UAAW,EAAGC,cAAe,IAC3CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,gCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAAC9P,KAAKuO,GAAG,EAAG,qBAAsB,QAAQyB,EAAId,eAAgBlP,KAAKuO,GAAG,EAAG,qBAAsB,cAC/F,CAACvO,KAAKuO,GAAG,EAAG,qBAAsB,aAAcvO,KAAKuO,GAAG,EAAG,qBAAsB,QAAQyB,EAAIb,kBA0VnGwB,SAvV0B,CAC1B/B,KAAM,WACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,GAAIC,UAAW,EAAGC,cAAe,IAC3CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,iCACZC,YAAa,+BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,SAAU,QAAQqN,EAAId,eAAgBlP,KAAKuO,GAAG,EAAG,qBAAsB,cAC9G,CAACvO,KAAKuO,GAAG,EAAG,qBAAsB,aAAcvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,SAAU,QAAQqN,EAAIb,mBAyUlHyB,eArUgC,CAChChC,KAAM,iBACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAMhF,EAAIhL,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoB,EAAIlQ,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC7B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAevD,EAAEvI,QAAQuI,EAAErI,gBAAgBqN,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,gCACtF,CAACvO,KAAKuO,GAAG,EAAG,+BAAgCvO,KAAKuO,GAAG,EAAG,eAAe2B,EAAEzN,QAAQyN,EAAEvN,gBAAgBqN,EAAIf,iBAuT5G4B,eAnTgC,CAChCjC,KAAM,iBACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,uCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAAC9P,KAAKuO,GAAG,EAAG,SAASyB,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,aACpD,CAACvO,KAAKuO,GAAG,EAAG,YAAavO,KAAKuO,GAAG,EAAG,SAASyB,EAAIf,gBAuSvD6B,OApSwB,CACxBlC,KAAM,SACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,gCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,MAAKT,aACjC,MAAMrB,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBiC,EAAiB,SAATtH,GAA4B,UAATA,EAAoB,IAAM,IACrDuH,EAAiB,QAATvH,GAA2B,SAATA,EAAmB,GAAI,EACjDwH,EAAIjB,EAAIX,UAAY2B,EAE1B,GAAc,SAAVlB,EACF,MAAO,CACL9P,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,iBAAiBoO,KAAQE,eAAejB,EAAIhB,eACtHhP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,qBAG/E,MAAMG,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAO,CACL/O,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,oBAC3E/Q,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgC8B,EAAGzO,QAAQyO,EAAGvO,iBAAiBoO,KAAY,GAAJE,eAAqBjB,EAAIf,iBA4QlIkC,OAvQwB,CACxBvC,KAAM,SACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,GAAIC,OAAQ,SACpCC,WAAY,uCACZC,YAAa,wCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBiC,EAAiB,SAATtH,GAA4B,UAATA,EAAoB,IAAM,IACrDuH,EAAiB,QAATvH,GAA2B,SAATA,EAAmB,GAAI,EACjD2H,EAAIpB,EAAIV,QAAU0B,EAExB,MAAiB,SAAVlB,EACH,CACA9P,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,iBAAiBoO,KAAQK,eAAepB,EAAIhB,cAAe,QAAQgB,EAAId,eACjJlP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,mBAAuB,cAElG,CACA/Q,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,6CAA6C2B,mBAAuB,aAClG/Q,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgCpP,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQtM,QAAQzC,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQpM,iBAAiBoO,KAAY,GAAJK,eAAqBpB,EAAIf,aAAc,QAAQe,EAAIb,mBAiP9MkC,OA5OwB,CACxBzC,KAAM,SACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,GAAIC,OAAQ,SACpCC,WAAY,iCACZC,YAAa,gCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBwC,EAAe,QAAT7H,EAAiBuG,EAAIV,QAAmB,WAAT7F,GAAqBuG,EAAIV,QAAU,EACxEiC,EAAe,SAAT9H,EAAkBuG,EAAIV,QAAmB,UAAT7F,GAAoBuG,EAAIV,QAAU,EAE9E,MAAiB,SAAVQ,EACH,CACA9P,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,mBAAmB2O,iBAAkBC,eAAgBvB,EAAIhB,eACnIhP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,6EAE9B,CACApP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,4EAC9BpP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgCpP,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQtM,QAAQzC,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQpM,mBAAwB,GAAL2O,iBAA6B,GAALC,eAAsBvB,EAAIf,iBAuNvMuC,QAlNyB,CACzB5C,KAAM,UACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,GAAKC,UAAW,IACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CACA9P,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,iDAAiDY,EAAIhB,cAAe,QAAQgB,EAAId,eAC9GlP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,+CAAgD,cAE9E,CACApP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,+CAAgD,aAC9EpP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,iDAAiDY,EAAIf,aAAc,QAAQe,EAAIb,kBAiMnHsC,SA7L0B,CAC1B7C,KAAM,WACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,qCACZC,YAAa,oCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBkC,EAAiB,QAATvH,GAA2B,SAATA,EAAmB,GAAI,EACjDwH,EAAIjB,EAAIX,UAAY2B,EAE1B,MAAiB,SAAVlB,EACH,CACA9P,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgClB,EAAEzL,QAAQyL,EAAEvL,mBAAmBsO,eAAejB,EAAIhB,eAChHhP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,+DAE9B,CACApP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,8DAC9BpP,KAAKuO,GAAG,EAAG,eAAeyB,EAAIZ,gCAAgCpP,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQtM,QAAQzC,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAAQpM,mBAAuB,GAAJsO,eAAqBjB,EAAIf,iBAwK9KyC,QAnKyB,CACzB9C,KAAM,UACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,sCACZC,YAAa,gCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SAC7B,GAAc,SAAVgB,EACF,MAAO,CACL9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,gBAAgBqN,EAAIhB,eAC1DhP,KAAKuO,GAAG,EAAG,kCACXvO,KAAKuO,GAAG,EAAG,gCAGf,MAAM2C,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAO,CACL/O,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,gBAAgBqN,EAAIf,iBA8IhE0C,OAzIwB,CACxB/C,KAAM,SACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,GAAKC,UAAW,IACrDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,sCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SAC7B,GAAc,SAAVgB,EACF,MAAO,CACL9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,gBAAgBqN,EAAIhB,eAC1DhP,KAAKuO,GAAG,EAAG,kCACXvO,KAAKuO,GAAG,EAAG,gCAGf,MAAM2C,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAO,CACL/O,KAAKuO,GAAG,EAAG,+BACXvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,gBAAgBqN,EAAIf,iBAoHhE2C,MA/GuB,CACvBhD,KAAM,QACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,6BACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoC,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,UAAW3C,KAAKuO,GAAG,EAAG,uBAC7D,CAACvO,KAAKuO,GAAG,EAAG,sBAAuBvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,aAiGjF5B,IA7FqB,CACrB6N,KAAM,MACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,uCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOE,SACZ,SAAVF,EACI,CAAC9P,KAAKuO,GAAG,EAAG,SAASyB,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,eAAgBvO,KAAKuO,GAAG,EAAG,aAC/E,CAACvO,KAAKuO,GAAG,EAAG,YAAavO,KAAKuO,GAAG,EAAG,SAASyB,EAAIf,gBAiFvD4C,KA9EsB,CACtBjD,KAAM,OACNC,SAAU,CACRC,QAAS,GAAIC,OAAQ,GAAIC,WAAY,EAAGC,UAAW,EACnDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,mCACZC,YAAa,iCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoC,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,UAAW3C,KAAKuO,GAAG,EAAG,uBAC7D,CAACvO,KAAKuO,GAAG,EAAG,sBAAuBvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,aAgEjFmP,KA5DsB,CACtBlD,KAAM,OACNC,SAAU,CACRC,QAAS,EAAGC,OAAQ,EAAGC,WAAY,IAAMC,UAAW,IACpDC,SAAU,EAAGC,UAAW,EAAGC,cAAe,IAC1CC,UAAW,GAAIC,QAAS,EAAGC,OAAQ,SACnCC,WAAY,oCACZC,YAAa,uCACbC,cAAe,IAAKC,aAAc,KAEpCC,aAAc,EAAGE,QAAOrG,OAAMuG,UAC5B,MAAM9B,EAAIlO,KAAKiO,IAAIxE,EAAMuG,EAAIlB,SACvBoC,EAAKlR,KAAKiO,IAAIxE,EAAMuG,EAAIjB,QAC9B,MAAiB,SAAVe,EACH,CAAC9P,KAAKuO,GAAG,EAAG,eAAeL,EAAEzL,QAAQyL,EAAEvL,gBAAgBqN,EAAIhB,eAAgBhP,KAAKuO,GAAG,EAAG,gCACtF,CAACvO,KAAKuO,GAAG,EAAG,+BAAgCvO,KAAKuO,GAAG,EAAG,eAAe2C,EAAGzO,QAAQyO,EAAGvO,gBAAgBqN,EAAIf,iBA+ClH,CAGQ,kBAAA8C,CACNzL,EACAmD,EACAqG,EACAkC,GAEA,MAAMC,EAAMjS,KAAK0O,iBACXwD,EAAMD,EAAI3L,IAAW2L,EAAI9B,QAGVnQ,KAAKmS,kBAC1B,MAAMnC,EAAM,IAEPkC,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,CAAW5I,EAAkB0I,EAAmBqG,GAE5D,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,OAIvB,MAAMF,UAAEA,MAAWpC,EAAAT,OAAKA,GAAWvP,KAAK+R,mBAAmBzL,EAAQmD,EAAMqG,GAGnEjL,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,GAAsC,WAAdA,GAAwC,YAAdA,IACnDL,EAAGQ,aAAeR,EAAGS,aAEjBC,GACW,SAAdJ,GAAsC,WAAdA,GAAwC,YAAdA,IACnDN,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
+ {"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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"iconify-offline.js","sources":["../../src/helper/iconify-offline.ts"],"sourcesContent":["/**\r\n * Iconify/sky-icon helpers: extract icon names from code and fetch icon data for offline use.\r\n *\r\n * Usage (browser or Node):\r\n * import { extractIconNames, fetchIconsForOffline, registerOfflineIcons } from '~/components/helper/iconify-offline';\r\n * import { SkyIcon } from '~/components/sky-icon/sky-icon';\r\n *\r\n * // Extract icon names from a code page string\r\n * const names = extractIconNames('<sky-icon icon=\"ion:home\"></sky-icon>'); // ['ion:home']\r\n *\r\n * // Fetch and then register in SkyIcon (directly pass generated JSON)\r\n * const combined = await fetchIconsForOffline(['ion:home', 'mdi:bell']);\r\n * registerOfflineIcons(combined, (prefix, data) => SkyIcon.registerLocalSet(prefix, data));\r\n *\r\n * // Or from saved JSON string:\r\n * const combined = JSON.parse(savedJson);\r\n * registerOfflineIcons(combined, (prefix, data) => SkyIcon.registerLocalSet(prefix, data));\r\n */\r\n\r\nconst ICONIFY_API_BASE = 'https://api.iconify.design';\r\n\r\n/** Matches quoted \"prefix:icon-name\" (prefix must start with a letter so \"1:3\" etc. are ignored). */\r\nconst QUOTED_ICON_PATTERN = /([\"'`])([a-z][a-z0-9-]*:[a-zA-Z0-9_.-]+)\\1/g;\r\n\r\nexport interface IconifyIconData {\r\n body?: string;\r\n left?: number;\r\n top?: number;\r\n width?: number;\r\n height?: number;\r\n viewBox?: string;\r\n hidden?: boolean;\r\n}\r\n\r\nexport interface IconifySetData {\r\n prefix?: string;\r\n icons: Record<string, IconifyIconData>;\r\n width?: number;\r\n height?: number;\r\n left?: number;\r\n top?: number;\r\n /** Icon names requested but not in API response; add manually if needed. Omit when registering with SkyIcon. */\r\n _notFound?: string[];\r\n}\r\n\r\n/** Combined offline data: prefix -> Iconify set data (ready for SkyIcon.registerLocalSet). Skip keys starting with _ when registering. */\r\nexport type CombinedOfflineIcons = Record<string, IconifySetData>;\r\n\r\nexport interface FetchIconsForOfflineOptions {\r\n /** Iconify API base URL (default: https://api.iconify.design) */\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * Extracts all icon names in \"prefix:icon-name\" format from a code page string.\r\n * Looks for icon names inside single, double, or backtick quotes (e.g. in attributes\r\n * like icon=\"ion:home\", iconL='mdi:bell', or :icon=\"`ion:person`\").\r\n *\r\n * @param codePageString - Source code string (HTML, Vue, TS, JS, etc.)\r\n * @returns Array of unique icon names (e.g. [\"ion:home\", \"mdi:bell\"])\r\n */\r\nexport function extractIconNames(codePageString: string): string[] {\r\n if (!codePageString || typeof codePageString !== 'string') {\r\n return [];\r\n }\r\n const seen = new Set<string>();\r\n const result: string[] = [];\r\n let match: RegExpExecArray | null;\r\n QUOTED_ICON_PATTERN.lastIndex = 0;\r\n while ((match = QUOTED_ICON_PATTERN.exec(codePageString)) !== null) {\r\n const full = match[2];\r\n if (full && full.includes(':') && !seen.has(full)) {\r\n seen.add(full);\r\n result.push(full);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Fetches icon data from the Iconify API for the given icon names, groups by prefix,\r\n * and returns a combined JSON object keyed by prefix for offline use.\r\n *\r\n * @param iconNames - List of icon names in \"prefix:icon-name\" format (e.g. [\"ion:home\", \"mdi:bell\"])\r\n * @param options - Optional baseUrl for the Iconify API\r\n * @returns Combined object: { \"ion\": { prefix, icons, width, height }, \"mdi\": { ... }, ... }\r\n * Use with SkyIcon.registerLocalSet(prefix, combined[prefix]) for each prefix.\r\n */\r\nexport async function fetchIconsForOffline(\r\n iconNames: string[],\r\n options: FetchIconsForOfflineOptions = {}\r\n): Promise<CombinedOfflineIcons> {\r\n const baseUrl = (options.baseUrl || ICONIFY_API_BASE).replace(/\\/$/, '');\r\n const byPrefix = new Map<string, string[]>();\r\n\r\n for (const full of iconNames) {\r\n const trimmed = full.trim();\r\n if (!trimmed || !trimmed.includes(':')) continue;\r\n const [prefix, name] = trimmed.split(':');\r\n const iconName = name?.trim();\r\n if (!prefix || !iconName) continue;\r\n // Ignore non-icon patterns (e.g. \"1:3\"); Iconify prefixes start with a letter\r\n if (!/^[a-z]/.test(prefix)) continue;\r\n if (!byPrefix.has(prefix)) {\r\n byPrefix.set(prefix, []);\r\n }\r\n const list = byPrefix.get(prefix)!;\r\n if (!list.includes(iconName)) {\r\n list.push(iconName);\r\n }\r\n }\r\n\r\n const combined: CombinedOfflineIcons = {};\r\n\r\n await Promise.all(\r\n Array.from(byPrefix.entries()).map(async ([prefix, names]) => {\r\n const iconsParam = names.join(',');\r\n const url = `${baseUrl}/${prefix}.json?icons=${encodeURIComponent(iconsParam)}`;\r\n const res = await fetch(url);\r\n if (!res.ok) {\r\n throw new Error(`Iconify API error for ${prefix}: ${res.status} ${res.statusText}`);\r\n }\r\n const json = (await res.json()) as IconifySetData & { icons?: Record<string, IconifyIconData> };\r\n const returnedIcons = json.icons || {};\r\n const notFound = names.filter((name) => !returnedIcons[name]);\r\n const setData: IconifySetData = {\r\n prefix,\r\n icons: returnedIcons,\r\n width: json.width,\r\n height: json.height,\r\n left: json.left,\r\n top: json.top,\r\n };\r\n if (notFound.length > 0) {\r\n setData._notFound = notFound;\r\n }\r\n combined[prefix] = setData;\r\n })\r\n );\r\n\r\n const hasAnyNotFound = Object.values(combined).some((set) => set._notFound && set._notFound.length > 0);\r\n if (hasAnyNotFound) {\r\n (combined as Record<string, unknown>)['_comment_notFound'] =\r\n 'Icons listed in _notFound (per set) were not in the API response; add manually if needed.';\r\n }\r\n\r\n return combined;\r\n}\r\n\r\n/** Set data without _notFound / _comment (suitable for SkyIcon.registerLocalSet). */\r\ntype SetDataForRegister = Omit<IconifySetData, '_notFound'>;\r\n\r\n/**\r\n * Registers the generated offline JSON with SkyIcon. Pass the object returned by fetchIconsForOffline\r\n * (or parsed from saved JSON). Skips top-level keys starting with \"_\" and strips _notFound from each set.\r\n *\r\n * @param combined - The combined object (from fetchIconsForOffline or JSON.parse of saved output)\r\n * @param register - Callback to register each set, e.g. (prefix, data) => SkyIcon.registerLocalSet(prefix, data)\r\n */\r\nexport function registerOfflineIcons(\r\n combined: CombinedOfflineIcons & Record<string, unknown>,\r\n register: (prefix: string, data: SetDataForRegister) => void\r\n): void {\r\n for (const [key, set] of Object.entries(combined)) {\r\n if (key.startsWith('_')) continue;\r\n if (!set || typeof set !== 'object' || !('icons' in set)) continue;\r\n const { _notFound: _unused, ...data } = set as IconifySetData;\r\n register(key, data as SetDataForRegister);\r\n }\r\n}\r\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,MAAM,yBAAyBvB,MAAWoB,EAAII,UAAUJ,EAAIK,cAExE,MAAMC,QAAcN,EAAIM,OAClBC,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,KAUvB,OANuBO,OAAOC,OAAO/B,GAAUgC,KAAMnC,GAAQA,EAAIgC,WAAahC,EAAIgC,UAAUD,OAAS,KAElG5B,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"}
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"}
@@ -1,4 +1,4 @@
1
- import { LitElement } from "lit";
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(): "forward" | "backward" | "none" | null;
70
+ get selectionDirection(): 'forward' | 'backward' | 'none' | null;
71
71
  select(): void;
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;
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;