{"version":3,"file":"index-YKqGJSeK.mjs","sources":["../src/core/utilities.ts","../src/types/plugins.ts","../../motion/src/AnimationGroup.ts","../../motion/src/easings.ts","../../motion/src/utils.ts","../../motion/src/Sequence.ts","../../motion/src/CustomAnimation.ts","../../../node_modules/fastdom/fastdom.js","../../motion/src/api/registry.ts","../../motion/src/api/common.ts","../../motion/src/api/webAnimations.ts","../../motion/src/api/cssAnimations.ts","../../motion/src/api/prepare.ts","../../motion/src/motion.ts","../src/utils.ts","../src/core/resolvers.ts","../src/core/cssUtils.ts","../src/handlers/utilities.ts","../src/core/css.ts","../src/handlers/viewEnter.ts","../../../node_modules/fizban/src/utilities.js","../../../node_modules/fizban/src/view.js","../../../node_modules/fizban/src/controller.js","../../../node_modules/fizban/src/Scroll.js","../src/handlers/viewProgress.ts","../../../node_modules/kuliso/src/utilities.js","../../../node_modules/kuliso/src/scrollend.js","../../../node_modules/kuliso/src/controller.js","../../../node_modules/kuliso/src/Pointer.js","../src/handlers/pointerMove.ts","../src/handlers/animationEnd.ts","../src/handlers/effectHandlers.ts","../src/handlers/eventTrigger.ts","../src/handlers/constants.ts","../src/handlers/index.ts","../src/core/Interact.ts","../src/core/add.ts","../src/core/remove.ts","../src/core/InteractionController.ts","../src/dom/api.ts"],"sourcesContent":["import type { Interaction, ElementIdentifier, TimeAnimationTriggerType } from '../types';\n\nexport function _processKeysForInterpolation(key: string) {\n  return [...key.matchAll(/\\[([^\\]]+)]/g)].map(([_, _instanceKey]) => _instanceKey);\n}\n\n// TODO: currently only supports simple one-to-one mapping, e.g. item[0] -> item[0], item[1] -> item[1]\nexport function getInterpolatedKey(template: string, key: string) {\n  const keys = _processKeysForInterpolation(key);\n  let index = 0;\n  return keys.length\n    ? template.replace(/\\[]/g, () => {\n        const k = keys[index++];\n        return k !== undefined ? `[${k}]` : '[]';\n      })\n    : template;\n}\n\nexport function shouldUseInitial(\n  interaction: Interaction,\n  effect: ElementIdentifier & { triggerType: TimeAnimationTriggerType },\n) {\n  return (\n    interaction.trigger === 'viewEnter' &&\n    effect.triggerType === 'once' &&\n    getElementHash(interaction) === getElementHash(effect)\n  );\n}\n\nexport function getElementHash(elementIdentifier: ElementIdentifier): string {\n  const { key, listContainer, listItemSelector, selector } = elementIdentifier;\n  return `${key}\\0${listContainer || ''}\\0${listItemSelector || ''}\\0${selector || ''}`;\n}\n","/**\n * Generic plugin bridge types.\n *\n * Interact knows nothing about any specific plugin. A plugin is registered by name via\n * `Interact.use(name, plugin)` and invoked whenever an interaction/effect carries a matching\n * `$`-prefixed field (e.g. `$splitText` → the `splitText` plugin). The plugin receives the raw\n * field value plus a context describing where it was found, and may return a cleanup function that\n * Interact runs on disconnect/teardown.\n */\n\nimport { CSSRuleData } from './css';\n\n/**\n * Prefix that marks a config field as plugin config. A field named `$<name>` routes its value to\n * the plugin registered under `<name>`. NOTE: the value here and the `` `$${string}` `` literal in\n * {@link PluginFields} must stay in sync.\n */\nexport const PLUGIN_FIELD_PREFIX = '$';\n\nexport type InteractPluginContext = {\n  /** The interaction's (or effect target's) resolved root element. */\n  root: HTMLElement;\n  /** The interaction (or effect) key the plugin was found under. */\n  key: string;\n  /** Whether the plugin was declared on an interaction or on an effect. */\n  scope: 'interaction' | 'effect';\n  /** The full interaction or effect config object the plugin field was found on. */\n  config: Record<string, unknown>;\n};\n\n/** Called on disconnect/teardown to undo whatever the plugin did (e.g. revert a DOM mutation). */\nexport type InteractPluginCleanup = () => void;\n\n/**\n * A plugin is a plain callback. It receives the value of its `$`-prefixed config field and a\n * context, and may return a cleanup function. Interact is agnostic to the shape of `value`.\n */\nexport type InteractPlugin = (\n  value: unknown,\n  context: InteractPluginContext,\n) => void | InteractPluginCleanup;\n\n/**\n * Context passed to a plugin's SSR style generator (see {@link InteractPluginStyleGenerator}).\n * Unlike {@link InteractPluginContext}, there is no live DOM — only the selector that scopes to\n * the element the plugin field is on.\n */\nexport type InteractPluginStyleContext = {\n  /** The interaction (or effect target) key the plugin field was found on. */\n  key: string;\n  /** Whether the plugin field was declared on an interaction or on an effect. */\n  scope: 'interaction' | 'effect';\n  /** The full interaction or effect config object the plugin field was found on. */\n  config: Record<string, unknown>;\n};\n\n/**\n * A plugin's **build-time** styling callback, passed to `generate()` (NOT the same callback given\n * to `Interact.use()`). Given the raw `$`-prefixed field value and a context, it returns initial\n * CSS rule(s) for the element — e.g. hiding the pre-plugin content to prevent FOUC before an\n * entrance animation. Interact emits the returned rules verbatim and never inspects `value`.\n */\nexport type InteractPluginStyleGenerator = (\n  value: unknown,\n  context: InteractPluginStyleContext,\n) => Pick<CSSRuleData, 'declarations' | 'selectorSuffix'>[];\n\n/** Map of plugin name → SSR style generator, passed as `generate()`'s `plugins` option. */\nexport type InteractPluginStyles = Record<string, InteractPluginStyleGenerator>;\n\n/**\n * Consumers augment this interface (via declaration merging) to type the config values of the\n * plugins they register. Keys are the **unprefixed** plugin names, e.g.:\n *\n * ```ts\n * declare module '@wix/interact' {\n *   interface InteractPluginConfigMap { splitText: { container: string } }\n * }\n * ```\n *\n * That types the `$splitText` field. It is intentionally empty by default — Interact ships no\n * built-in plugins.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface InteractPluginConfigMap {}\n\n/**\n * The `$`-prefixed plugin fields allowed on interactions and effects. Plugins registered through\n * augmentation keep their value types (as `$<name>`); any other `$`-prefixed field is still\n * allowed at runtime with an `unknown` value.\n */\nexport type PluginFields = {\n  [K in keyof InteractPluginConfigMap as `$${K & string}`]?: InteractPluginConfigMap[K];\n} & {\n  [pluginField: `$${string}`]: unknown;\n};\n","import { AnimationGroupOptions, RangeOffset } from './types';\n\n/**\n * @class AnimationGroup\n *\n * A wrapper object for simulating a GroupEffect and managing multiple animations.\n * See: https://www.w3.org/TR/web-animations-2/#grouping-and-synchronization\n */\nexport class AnimationGroup {\n  animations: (Animation & {\n    start?: RangeOffset;\n    end?: RangeOffset;\n  })[];\n  options?: AnimationGroupOptions;\n  ready: Promise<void>;\n  isCSS: boolean;\n  longestAnimation: Animation;\n\n  constructor(animations: Animation[], options?: AnimationGroupOptions) {\n    this.animations = animations;\n    this.options = options;\n    this.ready = options?.measured || Promise.resolve();\n    this.isCSS = animations[0] instanceof CSSAnimation;\n    this.longestAnimation = this._getAnimationWithLongestEndTime();\n  }\n\n  _getAnimationWithLongestEndTime() {\n    return this.animations.reduce((longest, current) => {\n      const longestEndTime = longest.effect?.getComputedTiming().endTime ?? 0;\n      const currentEndTime = current.effect?.getComputedTiming().endTime ?? 0;\n      return longestEndTime > currentEndTime ? longest : current;\n    }, this.animations[0]);\n  }\n\n  getProgress() {\n    return this.longestAnimation?.effect?.getComputedTiming().progress || 0;\n  }\n\n  async play(callback?: () => void): Promise<void> {\n    await this.ready;\n\n    for (const animation of this.animations) {\n      animation.play();\n    }\n\n    // TODO: Wait for all animations to be ready, using allSettled to handle rejections gracefully\n    // await Promise.allSettled(\n    await Promise.all(this.animations.map((animation) => animation.ready));\n\n    if (callback) {\n      callback();\n    }\n  }\n\n  pause() {\n    for (const animation of this.animations) {\n      animation.pause();\n    }\n  }\n\n  async reverse(callback?: () => void): Promise<void> {\n    await this.ready;\n\n    for (const animation of this.animations) {\n      animation.reverse();\n    }\n\n    // TODO: Wait for all animations to be ready, using allSettled to handle rejections gracefully\n    // await Promise.allSettled(\n    await Promise.all(this.animations.map((animation) => animation.ready));\n\n    if (callback) {\n      callback();\n    }\n  }\n\n  progress(p: number) {\n    for (const animation of this.animations) {\n      const { delay, duration, iterations } = animation.effect!.getTiming();\n      const time =\n        (Number.isFinite(duration) ? (duration as number) : 0) *\n        (Number.isFinite(iterations) ? (iterations as number) : 1);\n      animation.currentTime = ((delay || 0) + time) * p;\n    }\n  }\n\n  cancel() {\n    for (const animation of this.animations) {\n      animation.cancel();\n    }\n  }\n\n  setPlaybackRate(rate: number) {\n    for (const animation of this.animations) {\n      animation.playbackRate = rate;\n    }\n  }\n\n  async onFinish(callback: () => void): Promise<void> {\n    try {\n      await Promise.all(this.animations.map((animation) => animation.finished));\n\n      const a = this.animations[0];\n\n      if (a && !this.isCSS) {\n        const target = (a.effect as KeyframeEffect)?.target;\n\n        if (target) {\n          const effectId = this.options?.effectId || a.id;\n          const endEvent = new CustomEvent('animationend', { detail: { effectId } });\n          target.dispatchEvent(endEvent);\n        }\n      }\n\n      callback();\n    } catch (_error) {\n      console.warn('animation was interrupted - aborting onFinish callback - ', _error);\n    }\n  }\n\n  async onAbort(callback: () => void): Promise<void> {\n    try {\n      await Promise.all(this.animations.map((animation) => animation.finished));\n    } catch (error: any) {\n      if (error.name === 'AbortError') {\n        const a = this.animations[0];\n\n        if (a && !this.isCSS) {\n          const target = (a.effect as KeyframeEffect)?.target;\n\n          if (target) {\n            const cancelEvent = new Event('animationcancel');\n            target.dispatchEvent(cancelEvent);\n          }\n        }\n\n        callback();\n      }\n    }\n  }\n\n  get finished() {\n    return Promise.all(this.animations.map((animation) => animation.finished));\n  }\n\n  get playState() {\n    return this.animations.some((a) => a.playState === 'running')\n      ? 'running'\n      : this.animations[0]?.playState;\n  }\n\n  hasAnimationName(name: string): boolean {\n    return this.animations.some((a) => (a as CSSAnimation).animationName === name);\n  }\n\n  hasAnimationId(id: string): boolean {\n    return this.animations.some((a) => a.id === id);\n  }\n\n  getTimingOptions() {\n    return this.animations.map((a) => {\n      const timing = a.effect?.getTiming();\n      const delay = timing?.delay ?? 0;\n      const duration = Number(timing?.duration) || 0;\n      const iterations = timing?.iterations ?? 1;\n\n      return {\n        delay,\n        duration,\n        iterations,\n      };\n    });\n  }\n}\n","/**\n * @file Easing functions as defined by Robert Penner.\n * @example A playground I made https://codepen.io/tombigel/pen/eYLLVRg\n */\n\n/**\n * Linear easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const linear = (t: number) => t;\n\n/**\n * Sine-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const sineIn = (t: number) => 1 - Math.cos((t * Math.PI) / 2);\n\n/**\n * Sine-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const sineOut = (t: number) => Math.sin((t * Math.PI) / 2);\n\n/**\n * Sine-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const sineInOut = (t: number) => -(Math.cos(Math.PI * t) - 1) / 2;\n\n/**\n * Quadratic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quadIn = (t: number) => t ** 2;\n\n/**\n * Quadratic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quadOut = (t: number) => 1 - (1 - t) ** 2;\n\n/**\n * Quadratic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quadInOut = (t: number) => (t < 0.5 ? 2 * t ** 2 : 1 - (-2 * t + 2) ** 2 / 2);\n\n/**\n * Cubic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const cubicIn = (t: number) => t ** 3;\n\n/**\n * Cubic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const cubicOut = (t: number) => 1 - (1 - t) ** 3;\n\n/**\n * Cubic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const cubicInOut = (t: number) => (t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2);\n\n/**\n * Quartic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quartIn = (t: number) => t ** 4;\n\n/**\n * Quartic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quartOut = (t: number) => 1 - (1 - t) ** 4;\n\n/**\n * Quartic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quartInOut = (t: number) => (t < 0.5 ? 8 * t ** 4 : 1 - (-2 * t + 2) ** 4 / 2);\n\n/**\n * Quintic-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quintIn = (t: number) => t ** 5;\n\n/**\n * Quintic-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quintOut = (t: number) => 1 - (1 - t) ** 5;\n\n/**\n * Quintic-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const quintInOut = (t: number) => (t < 0.5 ? 16 * t ** 5 : 1 - (-2 * t + 2) ** 5 / 2);\n\n/**\n * Exponential-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const expoIn = (t: number) => (t === 0 ? 0 : 2 ** (10 * t - 10));\n\n/**\n * Exponential-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const expoOut = (t: number) => (t === 1 ? 1 : 1 - 2 ** (-10 * t));\n\n/**\n * Exponential-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const expoInOut = (t: number) =>\n  t === 0 ? 0 : t === 1 ? 1 : t < 0.5 ? 2 ** (20 * t - 10) / 2 : (2 - 2 ** (-20 * t + 10)) / 2;\n\n/**\n * Circular-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const circIn = (t: number) => 1 - Math.sqrt(1 - t ** 2);\n\n/**\n * Circular-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const circOut = (t: number) => Math.sqrt(1 - (t - 1) ** 2);\n\n/**\n * Circular-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const circInOut = (t: number) =>\n  t < 0.5 ? (1 - Math.sqrt(1 - 4 * t ** 2)) / 2 : (Math.sqrt(-(2 * t - 3) * (2 * t - 1)) + 1) / 2;\n\n/**\n * Back-in easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const backIn = (t: number) => 2.70158 * t ** 3 - 1.70158 * t ** 2;\n\n/**\n * Back-out easing function.\n * @param t - The time value (between 0 and 1).\n * @returns The eased value.\n */\nexport const backOut = (t: number) => 1 + 2.70158 * (t - 1) ** 3 + 1.70158 * (t - 1) ** 2;\n\n/**\n * Back-in-out easing function.\n * @param t - The time value (between 0 and 1).\n * @param k - The back factor (optional, default is 1.70158 * 1.525).\n * @returns The eased value.\n */\nexport const backInOut = (t: number, k = 1.70158 * 1.525) =>\n  t < 0.5\n    ? ((2 * t) ** 2 * ((k + 1) * 2 * t - k)) / 2\n    : ((2 * t - 2) ** 2 * ((k + 1) * (t * 2 - 2) + k) + 2) / 2;\n\nexport const jsEasings = {\n  linear,\n  sineIn,\n  sineOut,\n  sineInOut,\n  quadIn,\n  quadOut,\n  quadInOut,\n  cubicIn,\n  cubicOut,\n  cubicInOut,\n  quartIn,\n  quartOut,\n  quartInOut,\n  quintIn,\n  quintOut,\n  quintInOut,\n  expoIn,\n  expoOut,\n  expoInOut,\n  circIn,\n  circOut,\n  circInOut,\n  backIn,\n  backOut,\n  backInOut,\n};\n\nexport const cubicBezierCalc = (t: string, x1: number, y1: number, x2: number, y2: number) => {\n  const cx1 = 3 * x1;\n  const cx2 = 3 * (x2 - 2 * x1);\n  const cx3 = 1 - 3 * x2 + 3 * x1;\n  const cy1 = 3 * y1;\n  const cy2 = 3 * (y2 - 2 * y1);\n  const cy3 = 1 - 3 * y2 + 3 * y1;\n\n  let t_val: string;\n\n  if (cx3 === 0) {\n    // degenerate curve - x(s) is quadratic (or linear when cx2 is also 0), not cubic\n    t_val =\n      cx2 === 0\n        ? `(${t} / ${cx1})`\n        : `((sqrt(max(0, ${cx1 * cx1} + ${4 * cx2} * ${t})) - ${cx1}) / ${2 * cx2})`;\n  } else {\n    const shift = cx2 / (3 * cx3);\n    const qNum = 2 * Math.pow(cx2, 3) - 9 * cx1 * cx2 * cx3;\n    const qDen = 54 * Math.pow(cx3, 3);\n    const p_3 = (3 * cx3 * cx1 - cx2 * cx2) / (9 * cx3 * cx3);\n    const q_2 = `((${qNum} - ${27 * cx3 * cx3} * ${t}) / ${qDen})`;\n\n    if (p_3 < 0) {\n      // casus irreducibilis - Cardano's cube roots would be complex here, so use the trigonometric form\n      const m = 2 * Math.sqrt(-p_3);\n\n      let rootIdx = 0;\n      for (const k of [0, 1, 2]) {\n        const inDomain = [0, 0.25, 0.5, 0.75, 1].every((t) => {\n          const arg = Math.min(\n            Math.max((2 * (qNum - 27 * cx3 * cx3 * t)) / (qDen * p_3 * m), -1),\n            1,\n          );\n          const root = m * Math.cos((Math.acos(arg) - k * 2 * Math.PI) / 3) - shift;\n\n          return root >= -1e-6 && root <= 1 + 1e-6;\n        });\n\n        if (inDomain) rootIdx = k;\n      }\n      // clamping guards acos against arguments pushed just outside [-1, 1] by float error\n      const angle = `(acos(clamp(-1, ${2 / (p_3 * m)} * ${q_2}, 1)) - ${360 * rootIdx}deg) / 3`;\n\n      t_val = `(${m} * cos(${angle}) - ${shift})`;\n    } else {\n      const sqrt = `sqrt(pow(${q_2}, 2) + ${Math.pow(p_3, 3)})`;\n      t_val = `(pow(${sqrt} - ${q_2}, 1 / 3) - pow(${sqrt} + ${q_2}, 1 / 3) - ${shift})`;\n    }\n  }\n\n  return `(${cy3} * pow(${t_val}, 3) + ${cy2} * pow(${t_val}, 2) + ${cy1} * ${t_val})`;\n};\n\nexport const jsEasingsInCSS = {\n  linear: (t: string) => t,\n  ease: (t: string) => cubicBezierCalc(t, 0.25, 0.1, 0.25, 1),\n  easeIn: (t: string) => cubicBezierCalc(t, 0.42, 0, 1, 1),\n  easeOut: (t: string) => cubicBezierCalc(t, 0, 0, 0.58, 1),\n  easeInOut: (t: string) => cubicBezierCalc(t, 0.42, 0, 0.58, 1),\n  sineIn: (t: string) => `(1 - cos(${t} * 90deg))`,\n  sineOut: (t: string) => `(sin(${t} * 90deg))`,\n  sineInOut: (t: string) => `((1 - cos(${t} * 180deg)) / 2)`,\n  quadIn: (t: string) => `(${t} * ${t})`,\n  quadOut: (t: string) => `(1 - (1 - ${t}) * (1 - ${t}))`,\n  quadInOut: (t: string) =>\n    `(round(${t}) * (1 - (-2 * ${t} + 2) * (-2 * ${t} + 2) / 2) + (1 - round(${t})) * 2 * ${t} * ${t})`,\n  cubicIn: (t: string) => `pow(${t}, 3)`,\n  cubicOut: (t: string) => `(1 - pow(1 - ${t}, 3))`,\n  cubicInOut: (t: string) =>\n    `(round(${t}) * (1 - pow(-2 * ${t} + 2, 3) / 2) + (1 - round(${t})) * 4 * pow(${t}, 3))`,\n  quartIn: (t: string) => `pow(${t}, 4)`,\n  quartOut: (t: string) => `(1 - pow(1 - ${t}, 4))`,\n  quartInOut: (t: string) =>\n    `(round(${t}) * (1 - pow(-2 * ${t} + 2, 4) / 2) + (1 - round(${t})) * 8 * pow(${t}, 4))`,\n  quintIn: (t: string) => `pow(${t}, 5)`,\n  quintOut: (t: string) => `(1 - pow(1 - ${t}, 5))`,\n  quintInOut: (t: string) =>\n    `(round(${t}) * (1 - pow(-2 * ${t} + 2, 5) / 2) + (1 - round(${t})) * 16 * pow(${t}, 5))`,\n  expoIn: (t: string) => `(pow(2, 10 * ${t} - 10) - pow(2, -10) * (1 - ${t}))`,\n  expoOut: (t: string) => `(1 - pow(2, -10 * ${t}) + pow(2, -10) * ${t})`,\n  expoInOut: (t: string) =>\n    `((round(${t}) * (2 - pow(2, -20 * ${t} + 10)) + (1 - round(${t})) * pow(2, 20 * ${t} - 10)) / 2)`,\n  circIn: (t: string) => `(1 - sqrt(1 - ${t} * ${t}))`,\n  circOut: (t: string) => `sqrt(1 - (${t} - 1) * (${t} - 1))`,\n  circInOut: (t: string) =>\n    `((round(${t}) * (sqrt(max(0, (3 - 2 * ${t}) * (2 * ${t} - 1))) + 1) + (1 - round(${t})) * (1 - sqrt(max(0, 1 - 4 * ${t} * ${t})))) / 2)`,\n  backIn: (t: string) => `(2.70158 * pow(${t}, 3) - 1.70158 * ${t} * ${t})`,\n  backOut: (t: string) => `(1 + 2.70158 * pow(${t} - 1, 3) + 1.70158 * (${t} - 1) * (${t} - 1))`,\n  backInOut: (t: string) =>\n    `((round(${t}) * (2 + (2 * ${t} - 2) * (2 * ${t} - 2) * (2.5949095 + 3.5949095 * (2 * ${t} - 2))) + (1 - round(${t})) * 4 * ${t} * ${t} * (3.5949095 * 2 * ${t} - 2.5949095)) / 2)`,\n};\n\n/**\n * CSS cubic-bezier easings based on PostCSS Easings\n */\nexport const cssEasings = {\n  linear: 'linear',\n  ease: 'ease',\n  easeIn: 'ease-in',\n  easeOut: 'ease-out',\n  easeInOut: 'ease-in-out',\n  sineIn: 'cubic-bezier(0.47, 0, 0.745, 0.715)',\n  sineOut: 'cubic-bezier(0.39, 0.575, 0.565, 1)',\n  sineInOut: 'cubic-bezier(0.445, 0.05, 0.55, 0.95)',\n  quadIn: 'cubic-bezier(0.55, 0.085, 0.68, 0.53)',\n  quadOut: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',\n  quadInOut: 'cubic-bezier(0.455, 0.03, 0.515, 0.955)',\n  cubicIn: 'cubic-bezier(0.55, 0.055, 0.675, 0.19)',\n  cubicOut: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n  cubicInOut: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n  quartIn: 'cubic-bezier(0.895, 0.03, 0.685, 0.22)',\n  quartOut: 'cubic-bezier(0.165, 0.84, 0.44, 1)',\n  quartInOut: 'cubic-bezier(0.77, 0, 0.175, 1)',\n  quintIn: 'cubic-bezier(0.755, 0.05, 0.855, 0.06)',\n  quintOut: 'cubic-bezier(0.23, 1, 0.32, 1)',\n  quintInOut: 'cubic-bezier(0.86, 0, 0.07, 1)',\n  expoIn: 'cubic-bezier(0.95, 0.05, 0.795, 0.035)',\n  expoOut: 'cubic-bezier(0.19, 1, 0.22, 1)',\n  expoInOut: 'cubic-bezier(1, 0, 0, 1)',\n  circIn: 'cubic-bezier(0.6, 0.04, 0.98, 0.335)',\n  circOut: 'cubic-bezier(0.075, 0.82, 0.165, 1)',\n  circInOut: 'cubic-bezier(0.785, 0.135, 0.15, 0.86)',\n  backIn: 'cubic-bezier(0.6, -0.28, 0.735, 0.045)',\n  backOut: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)',\n  backInOut: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\n} as const;\n","import { cssEasings, jsEasings, jsEasingsInCSS, cubicBezierCalc } from './easings';\n\nexport function getCssUnits(unit: 'percentage' | string) {\n  return unit === 'percentage' ? '%' : unit || 'px';\n}\n\n// A vendor-prefixed property is `webkitTransform` as an IDL attribute and\n// `-webkit-transform` as a CSS property - the leading dash has to be restored.\nconst VENDOR_PREFIX = /^(webkit|moz|ms|o)(?=[A-Z])/;\n\n// Keyframe keys that are not plain CSS property names. `offset`, `easing` and\n// `composite` keep their WAAPI meaning, so the CSS `offset` shorthand is only\n// reachable as `cssOffset`.\n// null-prototype so that keys like `constructor` or `toString` don't resolve\n// to an inherited member\nconst KEYFRAME_CSS_TO_WAAPI: Record<string, string> = Object.assign(Object.create(null), {\n  float: 'cssFloat',\n  'animation-timing-function': 'easing',\n  'animation-composition': 'composite',\n});\n\n/**\n * Converts a CSS property name to its kebab-case form, for use in CSS text.\n * Already kebab-case names are returned as-is, and custom properties (`--*`)\n * are left untouched since they are case-sensitive.\n */\nexport function toCSSPropertyName(name: string): string {\n  if (name.startsWith('--')) {\n    return name;\n  }\n\n  const prefixed = VENDOR_PREFIX.test(name) ? `-${name}` : name;\n\n  return prefixed.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n}\n\n/**\n * Converts a CSS property name to its camelCase form, for use with the Web\n * Animations API. Already camelCase names are returned as-is, and custom\n * properties (`--*`) are left untouched since they are case-sensitive.\n */\nexport function toWAAPIPropertyName(name: string): string {\n  if (name.startsWith('--') || !name.includes('-')) {\n    return name;\n  }\n\n  return name.replace(/^-/, '').replace(/-([a-z])/g, (_, char: string) => char.toUpperCase());\n}\n\nfunction toWAAPIKeyframeKey(name: string): string {\n  return KEYFRAME_CSS_TO_WAAPI[name] || toWAAPIPropertyName(name);\n}\n\nfunction keyframeNeedsNormalizing(frame: Record<string, any>): boolean {\n  for (const name in frame) {\n    if (Object.hasOwn(frame, name) && toWAAPIKeyframeKey(name) !== name) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Normalizes keyframe property names to the camelCase form WAAPI expects, so\n * that both camelCase and kebab-case are valid input. Returns the same array\n * (and the same frame objects) when everything is already normalized, without\n * allocating - the common case is keyframes that are already camelCase.\n */\nexport function normalizeKeyframes<T extends Record<string, any>>(keyframes: T[]): T[] {\n  if (!Array.isArray(keyframes)) {\n    return keyframes;\n  }\n\n  let normalized: T[] | undefined;\n\n  keyframes.forEach((frame, index) => {\n    if (!frame || typeof frame !== 'object' || !keyframeNeedsNormalizing(frame)) {\n      return;\n    }\n\n    // first frame that needs normalizing - copy the array, keeping every other frame by reference\n    normalized ??= keyframes.slice();\n\n    const normalizedFrame: Record<string, unknown> = {};\n\n    for (const name in frame) {\n      if (Object.hasOwn(frame, name)) {\n        normalizedFrame[toWAAPIKeyframeKey(name)] = frame[name];\n      }\n    }\n\n    normalized[index] = normalizedFrame as T;\n  });\n\n  return normalized || keyframes;\n}\n\nexport function getEasing(easing?: keyof typeof cssEasings | string): string {\n  return easing ? cssEasings[easing as keyof typeof cssEasings] || easing : cssEasings.linear;\n}\n\nexport function cubicBezierEasing(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n): (t: number) => number {\n  const cx = 3 * x1;\n  const bx = 3 * (x2 - x1) - cx;\n  const ax = 1 - cx - bx;\n  const cy = 3 * y1;\n  const by = 3 * (y2 - y1) - cy;\n  const ay = 1 - cy - by;\n\n  const sampleX = (t: number) => ((ax * t + bx) * t + cx) * t;\n  const sampleY = (t: number) => ((ay * t + by) * t + cy) * t;\n  const sampleDX = (t: number) => (3 * ax * t + 2 * bx) * t + cx;\n\n  function solveT(x: number): number {\n    let t = x;\n\n    for (let i = 0; i < 8; i++) {\n      const dx = sampleX(t) - x;\n\n      if (Math.abs(dx) < 1e-7) return t;\n\n      const d = sampleDX(t);\n\n      if (Math.abs(d) < 1e-6) break;\n\n      t -= dx / d;\n    }\n    // Bisection fallback\n    let lo = 0,\n      hi = 1;\n    t = (lo + hi) / 2;\n\n    while (hi - lo > 1e-7) {\n      const xMid = sampleX(t);\n      if (Math.abs(xMid - x) < 1e-7) return t;\n      if (x > xMid) lo = t;\n      else hi = t;\n      t = (lo + hi) / 2;\n    }\n\n    return t;\n  }\n\n  return (t: number) => {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    return sampleY(solveT(t));\n  };\n}\n\nfunction parseCubicBezierParams(str: string): [number, number, number, number] | undefined {\n  const m = str.match(\n    /^cubic-bezier\\(\\s*(-?[\\d.]+)\\s*,\\s*(-?[\\d.]+)\\s*,\\s*(-?[\\d.]+)\\s*,\\s*(-?[\\d.]+)\\s*\\)$/,\n  );\n\n  if (!m) return undefined;\n\n  const x1 = parseFloat(m[1]);\n  const y1 = parseFloat(m[2]);\n  const x2 = parseFloat(m[3]);\n  const y2 = parseFloat(m[4]);\n\n  if ([x1, y1, x2, y2].some(isNaN)) return undefined;\n\n  return [x1, y1, x2, y2];\n}\n\nfunction parseCubicBezier(str: string): ((t: number) => number) | undefined {\n  const params = parseCubicBezierParams(str);\n\n  if (!params || params.some(isNaN)) return undefined;\n\n  return cubicBezierEasing(...params);\n}\n\nfunction parseCubicBezierToCalc(str: string): ((t: string) => string) | undefined {\n  const params = parseCubicBezierParams(str);\n\n  if (!params || params.some(isNaN)) return undefined;\n\n  return (t) => cubicBezierCalc(t, ...params);\n}\n\nfunction parseCssLinearStops(str: string): Array<{ output: number; pos: number }> | undefined {\n  const m = str.match(/^linear\\((.+)\\)$/);\n  if (!m) return undefined;\n\n  const parts = m[1]\n    .split(',')\n    .map((s) => s.trim())\n    .filter(Boolean);\n\n  if (parts.length === 0) return undefined;\n\n  type Stop = { output: number; pos: number | null };\n  const stops: Stop[] = [];\n\n  for (const part of parts) {\n    const tokens = part.split(/\\s+/);\n    const output = parseFloat(tokens[0]);\n\n    if (isNaN(output)) return undefined;\n\n    const pcts: number[] = [];\n\n    for (let i = 1; i < tokens.length; i++) {\n      if (tokens[i].endsWith('%')) {\n        const v = parseFloat(tokens[i]) / 100;\n        if (isNaN(v)) return undefined;\n        pcts.push(v);\n      }\n    }\n\n    if (pcts.length === 0) {\n      stops.push({ output, pos: null });\n    } else if (pcts.length === 1) {\n      stops.push({ output, pos: pcts[0] });\n    } else {\n      // Two percentages: creates a plateau between the two positions\n      stops.push({ output, pos: pcts[0] });\n      stops.push({ output, pos: pcts[1] });\n    }\n  }\n\n  if (stops.length === 0) return undefined;\n  if (stops[0].pos === null) stops[0].pos = 0;\n  if (stops[stops.length - 1].pos === null) stops[stops.length - 1].pos = 1;\n\n  // Distribute positions for stops without an explicit position\n  let i = 0;\n\n  while (i < stops.length) {\n    if (stops[i].pos === null) {\n      const start = i - 1;\n      let end = i;\n\n      while (end < stops.length && stops[end].pos === null) end++;\n\n      const startPos = stops[start].pos!;\n      const endPos = stops[end].pos!;\n      const span = end - start;\n\n      for (let k = start + 1; k < end; k++) {\n        stops[k].pos = startPos + ((endPos - startPos) * (k - start)) / span;\n      }\n\n      i = end + 1;\n    } else {\n      i++;\n    }\n  }\n\n  // Clamp: each stop must be no earlier than the previous one\n  for (let j = 1; j < stops.length; j++) {\n    if (stops[j].pos! < stops[j - 1].pos!) stops[j].pos = stops[j - 1].pos;\n  }\n\n  return stops as Array<{ output: number; pos: number }>;\n}\n\nfunction parseCssLinear(str: string): ((t: number) => number) | undefined {\n  const resolved = parseCssLinearStops(str);\n  if (!resolved) return undefined;\n\n  return (t: number) => {\n    if (t <= resolved[0].pos) return resolved[0].output;\n\n    const last = resolved[resolved.length - 1];\n\n    if (t >= last.pos) return last.output;\n\n    let lo = 0,\n      hi = resolved.length - 1;\n\n    while (lo < hi - 1) {\n      const mid = (lo + hi) >>> 1;\n\n      if (resolved[mid].pos <= t) lo = mid;\n      else hi = mid;\n    }\n\n    const a = resolved[lo];\n    const b = resolved[hi];\n    if (b.pos === a.pos) return b.output;\n    return a.output + ((b.output - a.output) * (t - a.pos)) / (b.pos - a.pos);\n  };\n}\n\nfunction parseCssLinearToCalc(str: string): ((t: string) => string) | undefined {\n  const resolved = parseCssLinearStops(str);\n  if (!resolved) return undefined;\n\n  return (t: string) => {\n    const terms: string[] = [`${resolved[0].output}`];\n    for (let i = 1; i < resolved.length; i++) {\n      const dx = resolved[i].pos - resolved[i - 1].pos;\n      const dy = resolved[i].output - resolved[i - 1].output;\n\n      if (dx === 0 && resolved[i - 1].pos === 0) {\n        terms.push(`${dy}`);\n      } else {\n        const clampMid =\n          dx === 0\n            ? `round(${t} / ${2 * resolved[i - 1].pos})`\n            : `(${t} - ${resolved[i - 1].pos}) / ${dx}`;\n        terms.push(`clamp(0, ${clampMid}, 1) * ${dy}`);\n      }\n    }\n    return `(${terms.join(' + ')})`;\n  };\n}\n\nexport function getJsEasing(\n  easing?: keyof typeof jsEasings | string,\n): ((t: number) => number) | undefined {\n  if (!easing) return undefined;\n\n  const named = jsEasings[easing as keyof typeof jsEasings];\n\n  if (named) return named;\n\n  return parseCubicBezier(easing) ?? parseCssLinear(easing) ?? jsEasings.linear;\n}\n\nexport function getJsEasingInCSS(\n  easing?: keyof typeof jsEasingsInCSS | string,\n): ((t: string) => string) | undefined {\n  if (!easing) return undefined;\n\n  const named = jsEasingsInCSS[easing as keyof typeof jsEasingsInCSS];\n\n  if (named) return named;\n\n  return parseCubicBezierToCalc(easing) ?? parseCssLinearToCalc(easing) ?? jsEasingsInCSS.linear;\n}\n","import { AnimationGroup } from './AnimationGroup';\nimport type { IndexedGroup, SequenceOptions } from './types';\nimport { linear } from './easings';\nimport { getJsEasing } from './utils';\n\n/**\n * @class Sequence\n *\n * Manages multiple AnimationGroups as a coordinated timeline with staggered delays.\n * Extends AnimationGroup to inherit the playback control API while delegating\n * to child AnimationGroup instances.\n */\nexport class Sequence extends AnimationGroup {\n  animationGroups: AnimationGroup[];\n  delay: number;\n  offset: number;\n  offsetEasing: (p: number) => number;\n  sequenceId: string | undefined;\n  private timingOptions: { delay: number; duration: number; iterations: number }[][];\n\n  constructor(animationGroups: AnimationGroup[], options: SequenceOptions = {}) {\n    const allAnimations = animationGroups.flatMap((group) => [...group.animations]);\n    super(allAnimations);\n\n    this.animationGroups = animationGroups;\n    this.delay = options.delay ?? 0;\n    this.offset = options.offset ?? 0;\n    this.sequenceId = options.sequenceId;\n    this.offsetEasing =\n      typeof options.offsetEasing === 'function'\n        ? options.offsetEasing\n        : (getJsEasing(options.offsetEasing) ?? linear);\n\n    this.timingOptions = this.animationGroups.map((g) => {\n      return g.getTimingOptions().map(({ delay, duration, iterations }) => {\n        return {\n          delay,\n          duration: Number.isFinite(duration) ? duration : 0,\n          iterations: Number.isFinite(iterations) ? iterations : 1,\n        };\n      });\n    });\n\n    this.applyOffsets();\n\n    this.ready = Promise.all(animationGroups.map((g) => g.ready)).then(() => {});\n  }\n\n  /**\n   * Calculates stagger delay offsets for each animation group using the formula:\n   *   easing(i / last) * last * offset\n   * where i is the group index and last is the index of the final group.\n   */\n  private calculateOffsets(): number[] {\n    const count = this.animationGroups.length;\n    if (count <= 1) return [0];\n\n    const last = count - 1;\n\n    return Array.from(\n      { length: count },\n      (_, i) => (this.offsetEasing(i / last) * last * this.offset) | 0,\n    );\n  }\n\n  private applyOffsets(): void {\n    if (this.animationGroups.length === 0 || this.animations.length === 0) return;\n\n    const offsets = this.calculateOffsets();\n    const sequenceDuration = this.getSequenceActiveDuration(offsets);\n\n    const last = this.animationGroups.length - 1;\n    this.animationGroups.forEach((group, groupIdx) => {\n      group.animations.forEach((animation, animIdx) => {\n        const effect = animation.effect;\n\n        if (!effect) return;\n\n        const { delay: baseDelay, duration, iterations } = this.timingOptions[groupIdx][animIdx];\n        const delay = baseDelay + offsets[groupIdx];\n        const endDelay = sequenceDuration - (delay + duration * iterations);\n\n        if (group.isCSS && !!this.sequenceId) {\n          const { target } = effect as KeyframeEffect;\n\n          if (target instanceof HTMLElement) {\n            target.style.setProperty(`--motion-${this.sequenceId}-index`, `${groupIdx}`);\n            target.style.setProperty(`--motion-${this.sequenceId}-last`, `${last}`);\n          }\n\n          effect.updateTiming({ endDelay });\n        } else {\n          // add the sequence delay to the animation delay at the end - it doesn't need to affect the endDelay\n          effect.updateTiming({ delay: delay + this.delay, endDelay });\n        }\n      });\n    });\n  }\n\n  private getSequenceActiveDuration(offsets: number[]): number {\n    const result: number[] = [];\n\n    for (let i = 0; i < this.timingOptions.length; i++) {\n      const activeDuration = this.timingOptions[i].reduce((max, options) => {\n        if (!options) return max;\n\n        const { delay, duration, iterations } = options;\n\n        return Math.max(max, delay + duration * iterations);\n      }, 0);\n\n      result.push(offsets[i] + activeDuration);\n    }\n\n    return Math.max(...result);\n  }\n\n  /**\n   * Inserts new AnimationGroups at specified indices, then recalculates\n   * stagger offsets for all groups. Each entry specifies the target index\n   * in the animationGroups array where the group should be inserted.\n   */\n  addGroups(entries: IndexedGroup[]): void {\n    if (entries.length === 0) return;\n\n    const sorted = [...entries].sort((a, b) => b.index - a.index);\n\n    for (const { index, group } of sorted) {\n      const clampedIndex = Math.min(index, this.animationGroups.length);\n      this.animationGroups.splice(clampedIndex, 0, group);\n      this.timingOptions.splice(clampedIndex, 0, group.getTimingOptions());\n\n      const flatAnimations = [...group.animations];\n      const insertAt = this.animationGroups\n        .slice(0, clampedIndex)\n        .reduce((sum, g) => sum + g.animations.length, 0);\n      this.animations.splice(insertAt, 0, ...flatAnimations);\n    }\n\n    this.applyOffsets();\n    this.ready = Promise.all(this.animationGroups.map((g) => g.ready)).then(() => {});\n  }\n\n  /**\n   * Removes AnimationGroups that match the predicate, then recalculates\n   * stagger offsets for remaining groups. Cancelled animations in removed\n   * groups are returned.\n   */\n  removeGroups(predicate: (group: AnimationGroup) => boolean): AnimationGroup[] {\n    const removed: AnimationGroup[] = [];\n    const keptGroups: AnimationGroup[] = [];\n    const keptTimingOptions: { delay: number; duration: number; iterations: number }[][] = [];\n\n    for (let i = 0; i < this.animationGroups.length; i++) {\n      if (predicate(this.animationGroups[i])) {\n        removed.push(this.animationGroups[i]);\n      } else {\n        keptGroups.push(this.animationGroups[i]);\n        keptTimingOptions.push(this.timingOptions[i]);\n      }\n    }\n\n    if (removed.length === 0) return removed;\n\n    for (const group of removed) {\n      group.cancel();\n    }\n\n    this.animationGroups = keptGroups;\n    this.timingOptions = keptTimingOptions;\n    this.animations = keptGroups.flatMap((group) => [...group.animations]);\n\n    this.applyOffsets();\n    this.ready = Promise.all(this.animationGroups.map((g) => g.ready)).then(() => {});\n\n    return removed;\n  }\n\n  async onFinish(callback: () => void): Promise<void> {\n    try {\n      await Promise.all(this.animationGroups.map((group) => group.finished));\n      callback();\n    } catch (_error) {\n      console.warn('animation was interrupted - aborting onFinish callback - ', _error);\n    }\n  }\n}\n","/**\n * @class CustomAnimation\n *\n * A wrapper object for Animation that mimics the same interface but implements CustomEffect that runs JS code instead of KeyframeEffect.\n * The class is implemented by holding an inner Animation object instead of inheritance due to some browsers not allowing extension of built-in objects.\n */\nexport class CustomAnimation {\n  _animation: Animation;\n  customEffect: (progress: number | null) => void;\n  progress: number | null;\n  _tickCbId: number | null;\n  _finishHandler: (_: any) => void;\n\n  constructor(\n    customEffect: (element: Element | null, progress: number | null) => void,\n    target: Element | null,\n    effectOptions: KeyframeEffectOptions,\n    timingOptions: { timeline?: AnimationTimeline | null },\n  ) {\n    // overriding composite so that animation is not replaced and removed\n    const effect = new KeyframeEffect(target, [], {\n      ...effectOptions,\n      composite: 'add',\n    });\n    const { timeline } = timingOptions;\n    this._animation = new Animation(effect, timeline);\n\n    this._tickCbId = null;\n    this.progress = null;\n    this.customEffect = (progress: number | null) => customEffect(effect.target, progress);\n\n    // stop loop if animation is removed from the DOM after finish (does not fire 'remove' event)\n    this._finishHandler = (_: any) => {\n      if (\n        !(this.effect as KeyframeEffect).target?.getAnimations().find((a) => a === this._animation)\n      ) {\n        this.cancel();\n      }\n    };\n    this.addEventListener('finish', this._finishHandler);\n    this.addEventListener('remove', this._finishHandler);\n  }\n\n  // private tick method for customEffect loop implementation\n  private _tick() {\n    try {\n      const progress = this.effect?.getComputedTiming().progress ?? null;\n      if (progress !== this.progress) {\n        this.customEffect?.(progress);\n        this.progress = progress;\n      }\n      this._tickCbId = requestAnimationFrame(() => {\n        this._tick();\n      });\n    } catch (error) {\n      this._tickCbId = null;\n      console.error(\n        `failed to run customEffect! effectId: ${this.id}, error: ${\n          error instanceof Error ? error.message : error\n        }`,\n      );\n    }\n  }\n\n  // Animation timing properties\n  get currentTime() {\n    return this._animation.currentTime;\n  }\n  set currentTime(time: CSSNumberish | null) {\n    this._animation.currentTime = time;\n  }\n  get startTime() {\n    return this._animation.startTime;\n  }\n  set startTime(time: CSSNumberish | null) {\n    this._animation.startTime = time;\n  }\n  get playbackRate() {\n    return this._animation.playbackRate;\n  }\n  set playbackRate(speed: number) {\n    this._animation.playbackRate = speed;\n  }\n\n  // Animation basic properties\n  get id() {\n    return this._animation.id;\n  }\n  set id(uid: string) {\n    this._animation.id = uid;\n  }\n  get effect() {\n    return this._animation.effect;\n  }\n  set effect(e: AnimationEffect | null) {\n    this._animation.effect = e;\n  }\n  get timeline() {\n    return this._animation.timeline;\n  }\n  set timeline(tl: AnimationTimeline | null) {\n    this._animation.timeline = tl;\n  }\n\n  // Animation readonly state properties\n  get finished() {\n    return this._animation.finished;\n  }\n  get pending() {\n    return this._animation.pending;\n  }\n  get playState() {\n    return this._animation.playState;\n  }\n  get ready() {\n    return this._animation.ready;\n  }\n  get replaceState() {\n    return this._animation.replaceState;\n  }\n\n  // Animation event handlers\n  get oncancel() {\n    return this._animation.oncancel;\n  }\n  set oncancel(cb: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null) {\n    this._animation.oncancel = cb;\n  }\n  get onfinish() {\n    return this._animation.onfinish;\n  }\n  set onfinish(cb: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null) {\n    this._animation.onfinish = cb;\n  }\n  get onremove() {\n    return this._animation.onremove;\n  }\n  set onremove(cb: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null) {\n    this._animation.onremove = cb;\n  }\n\n  // CustomAnimation overridden methods\n  play() {\n    this._animation.play();\n    cancelAnimationFrame(this._tickCbId!);\n    this._tickCbId = requestAnimationFrame(() => this._tick());\n  }\n\n  pause() {\n    this._animation.pause();\n    cancelAnimationFrame(this._tickCbId!);\n    this._tickCbId = null;\n  }\n\n  cancel() {\n    this.removeEventListener('finish', this._finishHandler);\n    this.removeEventListener('remove', this._finishHandler);\n    this._animation.cancel();\n    // signaling cancelation for customEffect to handle it as desired\n    this.customEffect(null);\n    cancelAnimationFrame(this._tickCbId!);\n    this._tickCbId = null;\n  }\n\n  commitStyles() {\n    console.warn(\n      'CustomEffect animations do not support commitStyles method as they have no style to commit',\n    );\n  }\n\n  // Animation methods without override\n  finish() {\n    this._animation.finish();\n  }\n  persist() {\n    this._animation.persist();\n  }\n  reverse() {\n    this._animation.reverse();\n  }\n  updatePlaybackRate(playbackRate: number) {\n    this._animation.updatePlaybackRate(playbackRate);\n  }\n\n  // Animation events API\n  addEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    this._animation.addEventListener(type, listener, options);\n  }\n  removeEventListener(\n    type: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    this._animation.removeEventListener(type, listener, options);\n  }\n  dispatchEvent(event: Event) {\n    return this._animation.dispatchEvent(event);\n  }\n}\n","!(function(win) {\n\n/**\n * FastDom\n *\n * Eliminates layout thrashing\n * by batching DOM read/write\n * interactions.\n *\n * @author Wilson Page <wilsonpage@me.com>\n * @author Kornel Lesinski <kornel.lesinski@ft.com>\n */\n\n'use strict';\n\n/**\n * Mini logger\n *\n * @return {Function}\n */\nvar debug = 0 ? console.log.bind(console, '[fastdom]') : function() {};\n\n/**\n * Normalized rAF\n *\n * @type {Function}\n */\nvar raf = win.requestAnimationFrame\n  || win.webkitRequestAnimationFrame\n  || win.mozRequestAnimationFrame\n  || win.msRequestAnimationFrame\n  || function(cb) { return setTimeout(cb, 16); };\n\n/**\n * Initialize a `FastDom`.\n *\n * @constructor\n */\nfunction FastDom() {\n  var self = this;\n  self.reads = [];\n  self.writes = [];\n  self.raf = raf.bind(win); // test hook\n  debug('initialized', self);\n}\n\nFastDom.prototype = {\n  constructor: FastDom,\n\n  /**\n   * We run this inside a try catch\n   * so that if any jobs error, we\n   * are able to recover and continue\n   * to flush the batch until it's empty.\n   *\n   * @param {Array} tasks\n   */\n  runTasks: function(tasks) {\n    debug('run tasks');\n    var task; while (task = tasks.shift()) task();\n  },\n\n  /**\n   * Adds a job to the read batch and\n   * schedules a new frame if need be.\n   *\n   * @param  {Function} fn\n   * @param  {Object} ctx the context to be bound to `fn` (optional).\n   * @public\n   */\n  measure: function(fn, ctx) {\n    debug('measure');\n    var task = !ctx ? fn : fn.bind(ctx);\n    this.reads.push(task);\n    scheduleFlush(this);\n    return task;\n  },\n\n  /**\n   * Adds a job to the\n   * write batch and schedules\n   * a new frame if need be.\n   *\n   * @param  {Function} fn\n   * @param  {Object} ctx the context to be bound to `fn` (optional).\n   * @public\n   */\n  mutate: function(fn, ctx) {\n    debug('mutate');\n    var task = !ctx ? fn : fn.bind(ctx);\n    this.writes.push(task);\n    scheduleFlush(this);\n    return task;\n  },\n\n  /**\n   * Clears a scheduled 'read' or 'write' task.\n   *\n   * @param {Object} task\n   * @return {Boolean} success\n   * @public\n   */\n  clear: function(task) {\n    debug('clear', task);\n    return remove(this.reads, task) || remove(this.writes, task);\n  },\n\n  /**\n   * Extend this FastDom with some\n   * custom functionality.\n   *\n   * Because fastdom must *always* be a\n   * singleton, we're actually extending\n   * the fastdom instance. This means tasks\n   * scheduled by an extension still enter\n   * fastdom's global task queue.\n   *\n   * The 'super' instance can be accessed\n   * from `this.fastdom`.\n   *\n   * @example\n   *\n   * var myFastdom = fastdom.extend({\n   *   initialize: function() {\n   *     // runs on creation\n   *   },\n   *\n   *   // override a method\n   *   measure: function(fn) {\n   *     // do extra stuff ...\n   *\n   *     // then call the original\n   *     return this.fastdom.measure(fn);\n   *   },\n   *\n   *   ...\n   * });\n   *\n   * @param  {Object} props  properties to mixin\n   * @return {FastDom}\n   */\n  extend: function(props) {\n    debug('extend', props);\n    if (typeof props != 'object') throw new Error('expected object');\n\n    var child = Object.create(this);\n    mixin(child, props);\n    child.fastdom = this;\n\n    // run optional creation hook\n    if (child.initialize) child.initialize();\n\n    return child;\n  },\n\n  // override this with a function\n  // to prevent Errors in console\n  // when tasks throw\n  catch: null\n};\n\n/**\n * Schedules a new read/write\n * batch if one isn't pending.\n *\n * @private\n */\nfunction scheduleFlush(fastdom) {\n  if (!fastdom.scheduled) {\n    fastdom.scheduled = true;\n    fastdom.raf(flush.bind(null, fastdom));\n    debug('flush scheduled');\n  }\n}\n\n/**\n * Runs queued `read` and `write` tasks.\n *\n * Errors are caught and thrown by default.\n * If a `.catch` function has been defined\n * it is called instead.\n *\n * @private\n */\nfunction flush(fastdom) {\n  debug('flush');\n\n  var writes = fastdom.writes;\n  var reads = fastdom.reads;\n  var error;\n\n  try {\n    debug('flushing reads', reads.length);\n    fastdom.runTasks(reads);\n    debug('flushing writes', writes.length);\n    fastdom.runTasks(writes);\n  } catch (e) { error = e; }\n\n  fastdom.scheduled = false;\n\n  // If the batch errored we may still have tasks queued\n  if (reads.length || writes.length) scheduleFlush(fastdom);\n\n  if (error) {\n    debug('task errored', error.message);\n    if (fastdom.catch) fastdom.catch(error);\n    else throw error;\n  }\n}\n\n/**\n * Remove an item from an Array.\n *\n * @param  {Array} array\n * @param  {*} item\n * @return {Boolean}\n */\nfunction remove(array, item) {\n  var index = array.indexOf(item);\n  return !!~index && !!array.splice(index, 1);\n}\n\n/**\n * Mixin own properties of source\n * object into the target.\n *\n * @param  {Object} target\n * @param  {Object} source\n */\nfunction mixin(target, source) {\n  for (var key in source) {\n    if (source.hasOwnProperty(key)) target[key] = source[key];\n  }\n}\n\n// There should never be more than\n// one instance of `FastDom` in an app\nvar exports = win.fastdom = (win.fastdom || new FastDom()); // jshint ignore:line\n\n// Expose to CJS & AMD\nif ((typeof define) == 'function') define(function() { return exports; });\nelse if ((typeof module) == 'object') module.exports = exports;\n\n})( typeof window !== 'undefined' ? window : typeof this != 'undefined' ? this : globalThis);\n","import type { EffectModule } from '../types';\n\nconst registry: Record<string, EffectModule> = {};\n\nexport function registerEffects(effects: Record<string, EffectModule>) {\n  Object.assign(registry, effects);\n}\n\nexport function getRegisteredEffect(name: string, warn: boolean = true) {\n  if (name in registry) {\n    return registry[name];\n  }\n  if (warn) {\n    console.warn(\n      `${name} not found in registry. Please make sure to import and register the preset.`,\n    );\n  }\n  return null;\n}\n","import type {\n  AnimationData,\n  AnimationDataForScrub,\n  AnimationOptions,\n  MeasureCallback,\n  RangeOffset,\n  TimeAnimationOptions,\n  TriggerVariant,\n  UnitLengthPercentage,\n} from '../types';\nimport { getCssUnits, getEasing } from '../utils';\nimport fastdom from 'fastdom';\nimport { getRegisteredEffect } from './registry';\n\nfunction getElement(id: string | null, ownerDocument?: Document): HTMLElement | null {\n  return id ? (ownerDocument || document).getElementById(id) : null;\n}\n\nfunction getElementMotionPart(element: Element | null, part: string) {\n  if (element?.matches(`[data-motion-part~=\"${part}\"]`)) {\n    return element;\n  }\n  return element?.querySelector(`[data-motion-part~=\"${part}\"]`);\n}\n\nfunction getTargetParts(target: HTMLElement | string | null, parts?: string[]) {\n  const element = typeof target === 'string' ? getElement(target) : target;\n  if (parts?.length) {\n    return parts\n      .map((part) => getElementMotionPart(element, part))\n      .filter(Boolean) as HTMLElement[];\n  }\n  return element ? [element] : [];\n}\n\nfunction getDirection(effect: AnimationData): KeyframeEffectOptions['direction'] {\n  const alternate = effect.alternate ? 'alternate' : '';\n  return effect.reversed\n    ? (`${alternate ? `${alternate}-` : ''}reverse` as 'reverse' | 'alternate-reverse')\n    : alternate || 'normal';\n}\n\nfunction getLength(length: UnitLengthPercentage): string {\n  return `${length.value}${getCssUnits(length.unit)}`;\n}\n\nfunction getRange(range: RangeOffset, add: string | undefined, isEnd?: boolean) {\n  // according to the CSS spec if the end range is a <length> then it is calculated from the start of the named range\n  // our model assumes that <length> in end range is calculated from the end of the named range\n  return `${range.name || 'cover'} ${\n    isEnd && range.offset!.unit !== 'percentage'\n      ? `calc(100% + ${getLength(range.offset!)}${add ? ` + ${add}` : ''})`\n      : add\n        ? `calc(${getLength(range.offset!)} + ${add})`\n        : getLength(range.offset!)\n  }`;\n}\n\nfunction getRanges(effect: AnimationDataForScrub) {\n  return {\n    start: getRange(effect.startOffset!, effect.startOffsetAdd),\n    end: getRange(effect.endOffset!, effect.endOffsetAdd, true),\n  };\n}\n\nfunction measure(target: HTMLElement | null): MeasureCallback {\n  return (fn) => fastdom.measure(() => fn(target));\n}\n\nfunction mutate(target: HTMLElement | null): MeasureCallback {\n  return (fn) => fastdom.mutate(() => fn(target));\n}\n\nfunction getNamedEffect(animation: AnimationOptions) {\n  if (animation.namedEffect) {\n    const effectName = animation.namedEffect.type;\n    return typeof effectName === 'string' ? getRegisteredEffect(effectName) : null;\n  } else if (animation.keyframeEffect) {\n    const effect = (animation_: AnimationOptions) => {\n      const { name, keyframes } = animation_.keyframeEffect!;\n\n      return [{ ...animation_, name, keyframes }];\n    };\n    const getNames = (animation_: AnimationOptions) => {\n      const { effectId } = animation_;\n      const { name } = animation_.keyframeEffect!;\n      const uid = name || effectId;\n\n      return uid ? [uid] : [];\n    };\n    return { web: effect, style: effect, getNames };\n  } else if (animation.customEffect) {\n    return (animation_: AnimationOptions) => [{ ...animation_, keyframes: [] }];\n  }\n  return null;\n}\n\nfunction getEffectsData(\n  animations: AnimationData[],\n  trigger?: Partial<TriggerVariant>,\n  effectId?: string,\n  forCSS?: boolean,\n) {\n  // process each AnimationData object into a KeyframeEffect object\n  return animations.map((effect, index) => {\n    // prepare the KeyframeEffectOptions object\n    const effectOptions = {\n      fill: effect.fill,\n      easing: getEasing(effect.easing),\n      iterations: effect.iterations === 0 ? Infinity : effect.iterations || 1,\n      composite: effect.composite,\n      direction: getDirection(effect),\n    } as KeyframeEffectOptions & { rangeStart: string; rangeEnd: string };\n\n    // if this is a time-based animation then set the duration and delay as time values\n    if (isNotAScrubTrigger(trigger)) {\n      effectOptions.duration = effect.duration as number;\n      effectOptions.delay = (effect as TimeAnimationOptions).delay || 0;\n    } else {\n      // forCSS bypasses the runtime ViewTimeline check so that SSR / CSS generation\n      // always emits `duration: auto` for scroll-driven animations.\n      if (trigger?.trigger === 'view-progress' && (forCSS || window.ViewTimeline)) {\n        effectOptions.duration = 'auto';\n      } else {\n        // if ViewTimeline not supported then put a 100ms value in duration get a progress we can easily relate to\n        // we split the duration to 99.99ms and delay of 0.01ms to get the fill-mode effect working\n        effectOptions.duration = 99.99;\n        effectOptions.delay = 0.01;\n      }\n    }\n\n    return {\n      // pass the preset's object as is - its keyframes and ranges may be getters\n      // that must only be read after its measure() callbacks ran\n      effect,\n      options: effectOptions,\n      id: effectId && `${effectId}-${index + 1}`,\n      part: effect.part,\n    };\n  });\n}\n\nfunction isNotAScrubTrigger(trigger?: Partial<TriggerVariant>) {\n  return !trigger || (trigger.trigger !== 'pointer-move' && trigger.trigger !== 'view-progress');\n}\n\nexport {\n  isNotAScrubTrigger,\n  getElement,\n  getElementMotionPart,\n  getTargetParts,\n  getNamedEffect,\n  getEffectsData,\n  measure,\n  mutate,\n  getDirection,\n  getLength,\n  getRanges,\n};\n","import type {\n  AnimationData,\n  AnimationDataForScrub,\n  AnimationEffectAPI,\n  AnimationOptions,\n  MouseAnimationFactory,\n  MouseAnimationInstance,\n  ScrubAnimationOptions,\n  TriggerVariant,\n  WebAnimationEffectFactory,\n} from '../types';\nimport { CustomAnimation } from '../CustomAnimation';\nimport { AnimationGroup } from '../AnimationGroup';\nimport { normalizeKeyframes } from '../utils';\nimport {\n  getElement,\n  getElementMotionPart,\n  measure,\n  mutate,\n  getRanges,\n  getNamedEffect,\n  getEffectsData,\n  isNotAScrubTrigger,\n} from './common';\nimport fastdom from 'fastdom';\n\nfunction getWebAnimationEffect(\n  preset: AnimationEffectAPI<any> | WebAnimationEffectFactory<any> | null,\n  animation: AnimationOptions,\n  target: Element | string | null,\n  trigger?: Partial<TriggerVariant>,\n  options?: Record<string, any>,\n): AnimationData[] | MouseAnimationFactory {\n  if (preset) {\n    // validate duration is a number over 0\n    if (isNotAScrubTrigger(trigger)) {\n      animation.duration = animation.duration || 1;\n\n      if (options?.reducedMotion) {\n        if (animation.iterations === 1 || animation.iterations == undefined) {\n          animation = { ...animation, duration: 1 };\n        } else {\n          return [];\n        }\n      }\n    }\n\n    let domApi;\n    if (target instanceof HTMLElement) {\n      domApi = { measure: measure(target), mutate: mutate(target) };\n    }\n\n    return (preset as AnimationEffectAPI<any>).web\n      ? (preset as AnimationEffectAPI<any>).web(animation, domApi, options)\n      : (preset as WebAnimationEffectFactory<any>)(animation, domApi, options);\n  }\n\n  return [];\n}\n\nfunction getWebAnimation(\n  target: Element | string | null,\n  animationOptions: AnimationOptions,\n  trigger?: Partial<TriggerVariant> & { element?: HTMLElement },\n  options?: Record<string, any>,\n  ownerDocument?: Document,\n): AnimationGroup | MouseAnimationInstance | null {\n  const element = typeof target === 'string' ? getElement(target, ownerDocument) : target;\n\n  if (trigger?.trigger === 'pointer-move' && !animationOptions.keyframeEffect) {\n    let effectOptions = animationOptions;\n\n    if (animationOptions.customEffect) {\n      effectOptions = {\n        ...animationOptions,\n        namedEffect: { id: '', type: 'CustomMouse' },\n      };\n    }\n\n    // TODO: need to fix the type here, currently lying about the returned type to be WebAnimationEffectFactory instead of MouseAnimationFactoryCreate\n    const mouseAnimationPreset = getNamedEffect(\n      effectOptions,\n    ) as WebAnimationEffectFactory<'scrub'>;\n    const mouseAnimationFactory = getWebAnimationEffect(\n      mouseAnimationPreset,\n      animationOptions,\n      element,\n      trigger,\n      options,\n    ) as MouseAnimationFactory;\n\n    if (typeof mouseAnimationFactory !== 'function') {\n      return null;\n    }\n\n    return mouseAnimationFactory(element as HTMLElement);\n  }\n\n  // get the preset for the given animation options\n  const namedEffect = getNamedEffect(animationOptions) as AnimationEffectAPI<any> | null;\n\n  const animationsData = getWebAnimationEffect(\n    namedEffect,\n    animationOptions,\n    element,\n    trigger,\n    options,\n  ) as AnimationData[];\n\n  // Return null if animation data cannot be generated\n  if (!animationsData || animationsData.length === 0) {\n    return null;\n  }\n\n  const data = getEffectsData(animationsData, trigger, animationOptions.effectId);\n\n  let timeline: typeof window.ViewTimeline | undefined;\n  const isViewProgress = trigger?.trigger === 'view-progress';\n\n  // if this is a ScrubAnimation with view-progress trigger and the browser supports the ViewTimeline API\n  if (isViewProgress && window.ViewTimeline) {\n    // generate the timeline object\n    // @ts-expect-error\n    timeline = new ViewTimeline({\n      subject: trigger.element || getElement(trigger.componentId!),\n    });\n  }\n\n  // generate an Animation object for each data object\n  const animations = data.map(({ effect, options: effectOptions, id, part }) => {\n    const effectTarget = part ? getElementMotionPart(element, part) : element;\n\n    const keyframeEffect = new KeyframeEffect(effectTarget || null, [], effectOptions);\n\n    // set the keyframes for the KeyframeEffect after measurements and mutations\n    fastdom.mutate(() => {\n      if ('timing' in effect) {\n        keyframeEffect.updateTiming(effect.timing as OptionalEffectTiming);\n      }\n\n      // keyframe property names may be authored in camelCase or kebab-case,\n      // WAAPI only understands camelCase\n      keyframeEffect.setKeyframes(normalizeKeyframes(effect.keyframes));\n    });\n\n    const timingOptions =\n      isViewProgress && timeline ? { timeline: timeline as AnimationTimeline } : {};\n    const animation: Animation | CustomAnimation =\n      typeof effect.customEffect === 'function'\n        ? (new CustomAnimation(\n            effect.customEffect,\n            effectTarget || null,\n            effectOptions,\n            timingOptions,\n          ) as Animation)\n        : new Animation(keyframeEffect, timingOptions.timeline);\n\n    // if this is a ScrubAnimation with view-progress trigger and the browser supports the ViewTimeline API\n    if (isViewProgress) {\n      if (timeline) {\n        // set the ranges for the animation after measurements and mutations\n        fastdom.mutate(() => {\n          const { start, end } = getRanges(effect as AnimationDataForScrub);\n          // @ts-expect-error\n          animation.rangeStart = start;\n          // @ts-expect-error\n          animation.rangeEnd = end;\n\n          animation.play();\n        });\n      } else {\n        const { startOffset, endOffset } = animationOptions as ScrubAnimationOptions;\n\n        // set the ranges for the animation after measurements and mutations\n        fastdom.mutate(() => {\n          const startOffsetToWrite = (effect as AnimationDataForScrub).startOffset || startOffset;\n          const endOffsetToWrite = (effect as AnimationDataForScrub).endOffset || endOffset;\n\n          Object.assign(animation, {\n            start: {\n              name: startOffsetToWrite!.name,\n              offset: startOffsetToWrite!.offset?.value,\n              add: (effect as AnimationDataForScrub)!.startOffsetAdd,\n            },\n            end: {\n              name: endOffsetToWrite!.name,\n              offset: endOffsetToWrite!.offset?.value,\n              add: (effect as AnimationDataForScrub)!.endOffsetAdd,\n            },\n          });\n        });\n      }\n    }\n\n    if (id) {\n      animation.id = id;\n    }\n\n    return animation;\n  });\n\n  // create an AnimationGroup with the generate animations\n  return new AnimationGroup(animations, {\n    ...animationOptions,\n    trigger: { ...(trigger || ({} as Partial<TriggerVariant>)) },\n    // make sure the group is ready after all animation targets are measured and mutated\n    measured: new Promise((resolve) => fastdom.mutate(resolve)),\n  });\n}\n\nexport { getWebAnimation };\n","import type {\n  AnimationData,\n  AnimationDataForScrub,\n  AnimationEffectAPI,\n  AnimationOptions,\n  SequenceOptions,\n  TriggerVariant,\n} from '../types';\nimport { getJsEasingInCSS, normalizeKeyframes } from '../utils';\nimport { getEffectsData, getRanges, getNamedEffect, isNotAScrubTrigger } from './common';\n\nfunction getAnimationAsCSS(\n  data: {\n    effect: AnimationData;\n    options: KeyframeEffectOptions;\n    id: string | undefined;\n    part: string | undefined;\n  },\n  isRunning?: boolean,\n  sequenceOptions?: SequenceOptions,\n) {\n  const { duration, delay, iterations = 1, fill, easing = 'linear', direction } = data.options;\n  const animationName = data.effect.name;\n  const isAutoDuration = duration === 'auto';\n\n  const { sequenceId, delay: seqDelay, offset, offsetEasing = 'linear' } = sequenceOptions || {};\n  let delayStr = `${delay ?? 0}ms`;\n\n  if (sequenceId && typeof offsetEasing === 'string') {\n    const calcEasing = getJsEasingInCSS(offsetEasing);\n\n    if (calcEasing) {\n      const baseDelay = (delay ?? 0) + (seqDelay ?? 0);\n\n      if (offset) {\n        const easing = calcEasing(\n          `(var(--motion-${sequenceId}-index, 0) / var(--motion-${sequenceId}-last, 1))`,\n        );\n        const stagger = `(${baseDelay} + ${easing} * ${offset} * var(--motion-${sequenceId}-last, 1))`;\n        delayStr = `calc(${stagger} * 1ms)`;\n      } else {\n        delayStr = `${baseDelay}ms`;\n      }\n    }\n  }\n\n  return `${animationName} ${isAutoDuration ? 'auto' : `${duration}ms`}${\n    isAutoDuration ? ' ' : ` ${delayStr} `\n  }${easing}${fill && fill !== 'none' ? ` ${fill}` : ''} ${\n    !iterations || iterations === Infinity ? 'infinite' : iterations\n  }${direction === 'normal' ? '' : ` ${direction}`} ${isRunning ? '' : 'paused'}`;\n}\n\nfunction getCSSAnimationEffect(\n  preset: AnimationEffectAPI<any> | null,\n  animation: AnimationOptions,\n  trigger?: Partial<TriggerVariant>,\n): AnimationData[] {\n  if (preset?.style) {\n    // validate duration is a number over 0\n    if (isNotAScrubTrigger(trigger)) {\n      animation.duration = animation.duration || 1;\n    }\n\n    return preset.style(animation);\n  }\n\n  return [];\n}\n\nfunction getCSSAnimation(\n  _: string | null,\n  animationOptions: AnimationOptions,\n  trigger?: TriggerVariant,\n  sequenceOptions?: SequenceOptions,\n) {\n  // get the preset for the given animation options\n  const namedEffect = getNamedEffect(animationOptions) as AnimationEffectAPI<any> | null;\n\n  const animationsData = getCSSAnimationEffect(namedEffect, animationOptions);\n  const data = getEffectsData(animationsData, trigger, animationOptions.effectId, true);\n  const isViewProgress = trigger?.trigger === 'view-progress';\n\n  return data.map((item, index) => {\n    const { start, end }: { start?: string; end?: string } = isViewProgress\n      ? getRanges(item.effect as AnimationDataForScrub)\n      : {};\n\n    return {\n      part: item.part,\n      animation: getAnimationAsCSS(item, isViewProgress, sequenceOptions),\n      composition: item.options.composite,\n      custom: item.effect.custom,\n      name: item.effect.name,\n      keyframes: normalizeKeyframes(item.effect.keyframes),\n      id: item.id && `${item.id}-${index + 1}`,\n      animationTimeline: isViewProgress ? `--${trigger?.id}` : '',\n      animationRange: start || end ? `${start} ${end}` : '',\n    };\n  });\n}\n\nexport { getCSSAnimation, getCSSAnimationEffect, getAnimationAsCSS };\n","import type { AnimationEffectAPI, AnimationOptions, TimeAnimationOptions } from '../types';\nimport { getElement, getNamedEffect, measure, mutate } from './common';\nimport fastdom from 'fastdom';\n\nfunction prepareAnimation(\n  target: HTMLElement | string | null,\n  animation: AnimationOptions,\n  callback?: () => void,\n) {\n  const preset = getNamedEffect(animation);\n  const element = target instanceof HTMLElement ? target : getElement(target);\n\n  if (preset && (preset as AnimationEffectAPI<'time'>).prepare && element) {\n    const domApi = { measure: measure(element), mutate: mutate(element) };\n\n    (preset as AnimationEffectAPI<'time'>).prepare!(animation as TimeAnimationOptions, domApi);\n  }\n\n  if (callback) {\n    fastdom.mutate(callback);\n  }\n}\n\nexport { prepareAnimation };\n","import type {\n  AnimationOptions,\n  ScrubAnimationOptions,\n  TriggerVariant,\n  MouseAnimationInstance,\n  AnimationEffectAPI,\n  CustomMouseAnimationInstance,\n  ScrubScrollScene,\n  ScrubPointerScene,\n  PointerMoveAxis,\n  SequenceOptions,\n  AnimationGroupArgs,\n} from './types';\nimport { AnimationGroup } from './AnimationGroup';\nimport { Sequence } from './Sequence';\nimport { getEasing, getJsEasing } from './utils';\nimport { getWebAnimation } from './api/webAnimations';\nimport { getCSSAnimation } from './api/cssAnimations';\nimport { prepareAnimation } from './api/prepare';\nimport { getElement, getNamedEffect, getTargetParts } from './api/common';\n\nfunction getElementCSSAnimation(\n  target: HTMLElement | string | null,\n  animationOptions: AnimationOptions,\n): AnimationGroup | null {\n  const namedEffect = getNamedEffect(animationOptions) as AnimationEffectAPI<any> | null;\n\n  if (!namedEffect) {\n    return null;\n  }\n\n  if (!namedEffect.style) {\n    // if this named effect does not have a style method, attempt to get group of Web Animations\n    if (animationOptions.effectId && target) {\n      return getElementAnimation(target, animationOptions.effectId, namedEffect.parts);\n    }\n\n    return null;\n  }\n\n  const effectNames = namedEffect.getNames(animationOptions);\n  const elements = getTargetParts(target, namedEffect.parts);\n  const animations = elements?.flatMap((el) => el.getAnimations());\n  const animationNames =\n    animations?.map((anim) => (anim as CSSAnimation).animationName) || ([] as string[]);\n  const filteredAnimations: CSSAnimation[] = [];\n\n  effectNames.forEach((name) => {\n    if (animationNames.includes(name)) {\n      filteredAnimations.push(\n        animations?.find((anim) => (anim as CSSAnimation).animationName === name) as CSSAnimation,\n      );\n    }\n  });\n\n  return filteredAnimations?.length ? new AnimationGroup(filteredAnimations) : null;\n}\n\nfunction getElementAnimation(\n  target: HTMLElement | string,\n  effectId: string,\n  parts?: string[],\n): AnimationGroup | null {\n  const elements = getTargetParts(target, parts);\n  // somehow get the right animations\n  const animations = elements\n    ?.flatMap((el) => el.getAnimations())\n    .filter((anim: Animation | CSSAnimation) => {\n      const id = anim.id || (anim as CSSAnimation).animationName;\n      // if no id/name just return all animations\n      return id ? id.startsWith(effectId) : true;\n    });\n\n  return animations?.length ? new AnimationGroup(animations) : null;\n}\n\nfunction getScrubScene(\n  target: HTMLElement | string | null,\n  animationOptions: AnimationOptions,\n  trigger: Partial<TriggerVariant> & { element?: HTMLElement },\n  sceneOptions: Record<string, any> = {},\n): ScrubScrollScene[] | ScrubPointerScene | ScrubPointerScene[] | null {\n  const { disabled, allowActiveEvent, ...rest } = sceneOptions;\n  const animation = getWebAnimation(target, animationOptions, trigger, rest);\n\n  // Return null if animation could not be created\n  if (!animation) {\n    return null;\n  }\n\n  let typeSpecificOptions = {} as Record<string, any>;\n\n  if (trigger.trigger === 'view-progress' && !window.ViewTimeline) {\n    // TODO(ameerf): consider doing this only for bgscrub to not affect the other scroll effects\n    const viewSource = trigger.element || getElement(trigger.componentId!);\n    const { ready } = animation as AnimationGroup;\n\n    return (animation as AnimationGroup).animations.map((partialAnimation) => {\n      return {\n        /* we use getters for start and end in order to access the animation's start and end\n           only when initializing the scrub scene rather than immediately */\n        get start() {\n          return partialAnimation.start;\n        },\n        get end() {\n          return partialAnimation.end;\n        },\n        viewSource,\n        ready,\n        getProgress() {\n          return (animation as AnimationGroup).getProgress();\n        },\n        effect(__: any, p: number) {\n          const { activeDuration } = partialAnimation.effect!.getComputedTiming();\n          const { delay } = partialAnimation.effect!.getTiming();\n\n          partialAnimation.currentTime = ((delay || 0) + ((activeDuration as number) || 0)) * p;\n        },\n        disabled,\n        destroy() {\n          partialAnimation.cancel();\n        },\n      } as ScrubScrollScene;\n    });\n  } else if (trigger.trigger === 'pointer-move') {\n    const scrubOptions = animationOptions as ScrubAnimationOptions;\n    const { centeredToTarget, transitionDuration, transitionEasing } = scrubOptions;\n    const axis = (trigger as { axis?: PointerMoveAxis }).axis;\n\n    if (scrubOptions.keyframeEffect) {\n      const animationGroup = animation as AnimationGroup;\n\n      if (animationGroup.animations?.length === 0) {\n        return null;\n      }\n\n      const scene: ScrubPointerScene & { _currentProgress: number } = {\n        target: undefined,\n        centeredToTarget,\n        ready: animationGroup.ready,\n        _currentProgress: 0,\n        getProgress() {\n          return this._currentProgress;\n        },\n        effect(__: any, p: { x: number; y: number }) {\n          const linearProgress = axis === 'x' ? p.x : p.y;\n          this._currentProgress = linearProgress;\n          animationGroup.progress(linearProgress);\n        },\n        disabled: disabled ?? false,\n        destroy() {\n          animationGroup.cancel();\n        },\n      };\n\n      return scene;\n    }\n\n    typeSpecificOptions = {\n      centeredToTarget,\n      allowActiveEvent,\n    };\n\n    if (animationOptions.customEffect && transitionDuration) {\n      typeSpecificOptions.transitionDuration = transitionDuration;\n      // TODO: refactor js easings\n      typeSpecificOptions.transitionEasing = getJsEasing(transitionEasing);\n    }\n    typeSpecificOptions.target = (animation as MouseAnimationInstance).target;\n  }\n\n  return {\n    ...typeSpecificOptions,\n    getProgress() {\n      return (animation as AnimationGroup | CustomMouseAnimationInstance).getProgress();\n    },\n    effect(\n      __: any,\n      p: number | { x: number; y: number },\n      v?: { x: number; y: number },\n      active?: boolean,\n    ) {\n      animation.progress(\n        v\n          ? {\n              // @ts-expect-error spread error on p\n              ...p,\n              v,\n              active,\n            }\n          : p,\n      );\n    },\n    disabled,\n    destroy() {\n      animation.cancel();\n    },\n  } as ScrubPointerScene;\n}\n\nfunction getAnimation(\n  target: HTMLElement | string | null,\n  animationOptions: AnimationOptions,\n  trigger?: Partial<TriggerVariant> & { element?: HTMLElement },\n  reducedMotion: boolean = false,\n): AnimationGroup | MouseAnimationInstance | null {\n  const animation = getElementCSSAnimation(target, animationOptions);\n\n  if (animation) {\n    animation.ready = new Promise((resolve) => {\n      prepareAnimation(target, animationOptions, resolve);\n    });\n\n    return animation;\n  }\n\n  return getWebAnimation(target, animationOptions, trigger, { reducedMotion });\n}\n\nfunction resolveTargets(\n  target: HTMLElement | HTMLElement[] | string | null,\n): (HTMLElement | null)[] {\n  if (target === null) return [null];\n  if (typeof target === 'string') {\n    return Array.from(document.querySelectorAll<HTMLElement>(target));\n  }\n  if (Array.isArray(target)) return target;\n\n  return [target];\n}\n\n/**\n * Creates AnimationGroup instances from AnimationGroupArgs without wrapping them in a Sequence.\n */\nfunction createAnimationGroups(\n  animationGroupArgs: AnimationGroupArgs[],\n  context?: Record<string, any>,\n): AnimationGroup[] {\n  const groups: AnimationGroup[] = [];\n\n  for (const { target, options: animationGroupOptions } of animationGroupArgs) {\n    const elements = resolveTargets(target);\n\n    for (const element of elements) {\n      const result = getAnimation(\n        element,\n        animationGroupOptions,\n        undefined,\n        context?.reducedMotion,\n      );\n\n      if (result instanceof AnimationGroup) {\n        groups.push(result);\n      }\n    }\n  }\n\n  return groups;\n}\n\n/**\n * Creates a Sequence that coordinates multiple AnimationGroups with staggered delays.\n */\nfunction getSequence(\n  options: SequenceOptions,\n  animationGroups: AnimationGroupArgs[],\n  context?: Record<string, any>,\n): Sequence {\n  const groups = createAnimationGroups(animationGroups, context);\n  return new Sequence(groups, options);\n}\n\nexport {\n  getCSSAnimation,\n  getWebAnimation,\n  getElementCSSAnimation,\n  getElementAnimation,\n  getScrubScene,\n  prepareAnimation,\n  getAnimation,\n  getSequence,\n  createAnimationGroups,\n  getEasing,\n};\n\nexport type { AnimationGroup, Sequence };\n","import { getEasing, toCSSPropertyName } from '@wix/motion';\nimport type { Condition, CreateTransitionCSSParams, StateEffect, StyleProperty } from './types';\n\nexport function roundNumber(num: number, precision = 2): number {\n  return parseFloat(num.toFixed(precision));\n}\n\nexport function isTemplatedKey(key: string) {\n  return /\\[]/g.test(key);\n}\n\nexport function camelToKebabCase(property: string): string {\n  return property.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n}\n\n/**\n * Applies a selector condition predicate to a base selector.\n * - If `&` is in the predicate, replace `&` with the base selector\n * - If no `&`, assume `&<predicate>` (append predicate to base selector)\n */\nexport function applySelectorCondition(baseSelector: string, predicate: string): string {\n  if (predicate.includes('&')) {\n    return predicate.replace(/&/g, baseSelector);\n  }\n  return `${baseSelector}${predicate}`;\n}\n\nexport function generateId() {\n  return 'wi-12343210'.replace(\n    /\\d/g,\n    (c) =>\n      String.fromCharCode(\n        (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))) + 97,\n      ), // 97 for \"a\"\n  );\n}\n\n/**\n * Resolves the style properties of a state effect - `transition.styleProperties` wins\n * when both are set - with property names normalized to the kebab-case form CSS expects.\n * Property names may be authored in either camelCase or kebab-case.\n */\nexport function getStateStyleProperties(\n  transitionEffect: Pick<StateEffect, 'transition' | 'transitionProperties'>,\n): StyleProperty[] {\n  const { transition, transitionProperties } = transitionEffect;\n  const properties = transition?.styleProperties || transitionProperties || [];\n\n  return properties.map((property) => ({\n    ...property,\n    name: toCSSPropertyName(property.name),\n  }));\n}\n\nexport function transitionEffectToTransitionsList(transitionEffect: StateEffect) {\n  let { transition, transitionProperties } = transitionEffect;\n  let transitions: string[] = [];\n\n  if (transition?.styleProperties) {\n    const { duration, easing, delay } = transition;\n\n    if (duration) {\n      const hasCustomPropertiesTransition = transition.styleProperties.some((styleProperty) =>\n        styleProperty.name.startsWith('--'),\n      );\n\n      if (hasCustomPropertiesTransition) {\n        // If there are custom properties in the transition, we need to fall back to Viewer's legacy implementation\n        transitions = [\n          `all ${duration}ms ${getEasing(easing || 'ease')}${delay ? ` ${delay}ms` : ''}`,\n          'visibility 0s',\n        ];\n      } else {\n        transitions = transition.styleProperties.map(\n          (styleProperty) =>\n            `${toCSSPropertyName(styleProperty.name)} ${duration}ms ${getEasing(\n              easing || 'ease',\n            )}${delay ? ` ${delay}ms` : ''}`,\n        );\n      }\n    }\n  } else {\n    transitions =\n      transitionProperties\n        ?.filter((property) => property.duration)\n        .map(\n          (property) =>\n            `${toCSSPropertyName(property.name)} ${property.duration}ms ${\n              getEasing(property.easing) || 'ease'\n            }${property.delay ? ` ${property.delay}ms` : ''}`,\n        ) || [];\n  }\n\n  return transitions;\n}\n\n// TODO: createTransitionCSS overlaps with effectToCSS's transition branch and could be\n// consolidated once the runtime path migrates to the CSS generation pipeline.\nexport function createTransitionCSS({\n  key,\n  effectId,\n  transition,\n  transitionProperties,\n  childSelector = '> :first-child',\n  selectorCondition,\n}: CreateTransitionCSSParams): string[] {\n  const transitions: string[] = transitionEffectToTransitionsList({\n    transition,\n    transitionProperties,\n  });\n\n  const styleProperties = getStateStyleProperties({ transition, transitionProperties }).map(\n    (property) => `${property.name}: ${property.value};`,\n  );\n  const escapedKey = key.replace(/\"/g, \"'\");\n\n  // Build selectors, applying condition if present\n  const stateSelector = `:is(:state(${effectId}), :--${effectId}) ${childSelector}`;\n  const dataAttrSelector = `[data-interact-effect~=\"${effectId}\"] ${childSelector}`;\n\n  const finalStateSelector = selectorCondition\n    ? applySelectorCondition(stateSelector, selectorCondition)\n    : stateSelector;\n  const finalDataAttrSelector = selectorCondition\n    ? applySelectorCondition(dataAttrSelector, selectorCondition)\n    : dataAttrSelector;\n\n  const result = [\n    `${finalStateSelector},\n    ${finalDataAttrSelector} {\n      ${styleProperties.join(`\n      `)}\n    }`,\n  ];\n\n  if (transitions.length) {\n    const transitionSelector = `[data-interact-key=\"${escapedKey}\"] ${childSelector}`;\n    const finalTransitionSelector = selectorCondition\n      ? applySelectorCondition(transitionSelector, selectorCondition)\n      : transitionSelector;\n\n    result.push(`@media (prefers-reduced-motion: no-preference) { ${finalTransitionSelector} {\n      transition: ${transitions.join(', ')};\n    } }`);\n  }\n  return result;\n}\n\nexport function getFullPredicateByType(\n  conditionNames: string[] | undefined,\n  conditions: Record<string, Condition>,\n  type: 'media' | 'container',\n) {\n  const conditionContent = (conditionNames || [])\n    .filter((conditionName) => {\n      return conditions[conditionName]?.type === type && conditions[conditionName].predicate;\n    })\n    .map((conditionName) => {\n      return conditions[conditionName].predicate;\n    })\n    .join(') and (');\n\n  return conditionContent && `(${conditionContent})`;\n}\n\nexport function getMediaQuery(\n  conditionNames: string[] | undefined,\n  conditions: Record<string, Condition>,\n) {\n  const condition = getFullPredicateByType(conditionNames, conditions, 'media');\n  const mql = condition && window.matchMedia(condition);\n\n  return mql;\n}\n\nexport function getSelectorCondition(\n  conditionNames: string[] | undefined,\n  conditions: Record<string, Condition>,\n): string | undefined {\n  return (conditionNames || [])\n    .filter((conditionName) => {\n      return conditions[conditionName]?.type === 'selector' && conditions[conditionName].predicate;\n    })\n    .map((conditionName) => {\n      return `:is(${conditions[conditionName].predicate})`;\n    })\n    .join('');\n}\n","import { MotionKeyframeEffect, NamedEffect } from '@wix/motion';\nimport type {\n  InteractConfig,\n  Effect,\n  EffectRef,\n  EffectBase,\n  StateEffect,\n  Interaction,\n  ResolvedEffect,\n  ResolvedSequence,\n  SequenceConfig,\n  SequenceConfigRef,\n  TimeAnimationTriggerType,\n  TriggerType,\n} from '../types';\nimport { isTemplatedKey, generateId } from '../utils';\nimport { shouldUseInitial } from './utilities';\n\nconst TIME_TRIGGER_TO_DEFAULT_TYPE: Map<TriggerType, TimeAnimationTriggerType> = new Map([\n  ['viewEnter', 'once'],\n  ['animationEnd', 'once'],\n  ['hover', 'alternate'],\n  ['click', 'alternate'],\n  ['activate', 'alternate'],\n  ['interest', 'alternate'],\n]);\n\nexport function resolveEffectForCSS(\n  effect: Effect | EffectRef,\n  interaction: Interaction,\n  config: InteractConfig,\n  fallbackId?: string,\n): ResolvedEffect | null {\n  const { effects = {}, conditions: configConditions = {} } = config;\n  const { key: interactionKey, trigger } = interaction;\n  const isPointerMove = trigger === 'pointerMove';\n\n  // ensuring the original reference of the effect has an id (required for states)\n  if (!effect.effectId) {\n    effect.effectId = fallbackId || generateId();\n  }\n  const { effectId } = effect;\n\n  const fullEffect: EffectBase &\n    StateEffect & {\n      triggerType?: TimeAnimationTriggerType;\n      namedEffect?: NamedEffect;\n      customEffect?: (element: Element, progress: any) => void;\n      keyframeEffect?: MotionKeyframeEffect;\n    } = { ...(effects[effectId] || {}), ...effect };\n\n  let { key, conditions, triggerType } = fullEffect;\n\n  if (!key) {\n    if (!interactionKey) {\n      return null;\n    }\n    key = interactionKey;\n  }\n  if (isTemplatedKey(key)) {\n    // should probably find a way to support those\n    return null;\n  }\n  // TODO: handle here any key escaping if needed\n\n  conditions = [\n    ...new Set((conditions || []).filter((condition: string) => configConditions[condition])),\n  ];\n\n  if (!triggerType) {\n    triggerType = TIME_TRIGGER_TO_DEFAULT_TYPE.get(trigger)!;\n  }\n\n  const { namedEffect, customEffect, keyframeEffect, transition, transitionProperties, ...rest } = {\n    ...fullEffect,\n    key,\n    conditions,\n    effectId,\n    triggerType,\n  };\n\n  const initial = shouldUseInitial(interaction, rest);\n\n  if (namedEffect) {\n    // With the 2D nature of pointerMove namedEffects, there is no easy way to mimic the\n    // behavior with CSSAnimations.\n    return isPointerMove || !namedEffect.type ? null : { namedEffect, initial, ...rest };\n  } else if (keyframeEffect) {\n    // Need to verify validity of name for CSS?\n    if (!keyframeEffect.name) {\n      const canUseEffectId = effectId && !(effects[effectId] && 'keyframeEffect' in effect);\n      keyframeEffect.name = canUseEffectId ? effectId : generateId();\n    }\n    return { keyframeEffect, initial, ...rest };\n  } else if (customEffect) {\n    return isPointerMove ? null : { initial, ...rest };\n  } else if (transition) {\n    return { transition, initial, ...rest };\n  } else {\n    return transitionProperties ? { transitionProperties, initial, ...rest } : { initial, ...rest };\n  }\n}\n\nexport function resolveSequenceForCSS(\n  sequence: SequenceConfig | SequenceConfigRef,\n  interaction: Interaction,\n  config: InteractConfig,\n  fallbackId?: string,\n  getSlotKey?: (effectIndex: number) => string,\n): ResolvedSequence | null {\n  const { sequences = {}, conditions: configConditions = {} } = config;\n\n  if (!sequence.sequenceId) {\n    sequence.sequenceId = fallbackId || generateId();\n  }\n\n  const { sequenceId } = sequence;\n  const fullSequence = { ...(sequences[sequenceId] || {}), ...sequence };\n\n  let {\n    effects,\n    conditions,\n    triggerType,\n    delay = 0,\n    offset = 0,\n    offsetEasing = 'linear',\n  } = fullSequence;\n\n  if (typeof offsetEasing === 'function') {\n    return null; // CSS does not support JS functions for easing\n  }\n  if (!effects) {\n    return null; // an unresolved sequence reference\n  }\n\n  if (!triggerType) {\n    triggerType = TIME_TRIGGER_TO_DEFAULT_TYPE.get(interaction.trigger)!;\n  }\n\n  conditions = [\n    ...new Set((conditions || []).filter((condition: string) => configConditions[condition])),\n  ];\n  // resolving effects and cascading the conditions from sequence\n  const resolvedEffects = effects.map((effect, index) => {\n    const resolved = resolveEffectForCSS(\n      { ...effect, triggerType, conditions: [...(effect.conditions || []), ...conditions] },\n      interaction,\n      config,\n      `${sequenceId}-eff-${index}`,\n    );\n    return resolved && Object.assign(resolved, { slotKey: getSlotKey?.(index) });\n  });\n\n  // removing unsupported effects and the whole sequence if all are unsupported\n  const filteredEffects = resolvedEffects.filter((effect) => effect !== null);\n  if (!filteredEffects.length) {\n    return null;\n  }\n\n  return {\n    sequenceId,\n    triggerType,\n    conditions,\n    delay,\n    offset,\n    offsetEasing,\n    effects: filteredEffects,\n  };\n}\n","import type { Condition, ListPropertyName, CSSRuleData } from '../types';\nimport { toCSSPropertyName } from '@wix/motion';\nimport {\n  roundNumber,\n  getFullPredicateByType,\n  getSelectorCondition,\n  applySelectorCondition,\n} from '../utils';\n\nexport function keyframePropertyToCSS(key: string): string {\n  if (key === 'cssFloat') {\n    return 'float';\n  }\n  if (key === 'easing') {\n    return 'animation-timing-function';\n  }\n  if (key === 'cssOffset') {\n    return 'offset';\n  }\n  if (key === 'composite') {\n    return 'animation-composition';\n  }\n  return toCSSPropertyName(key);\n}\n\nexport function interpolateKeyframesOffsets(keyframes: Keyframe[]): Keyframe[] {\n  if (!keyframes.length) {\n    return [];\n  }\n\n  const result = keyframes.map((kf) => ({ ...kf }));\n\n  // Set first if not present\n  if (result[0].offset === undefined) {\n    result[0].offset = 0;\n  }\n  // Single keyframe without offset defaults to 1; multi-keyframe last defaults to 1 if missing\n  if (result.length === 1) {\n    if (keyframes[0].offset === undefined) {\n      result[0].offset = 1;\n    }\n  } else if (result[result.length - 1].offset === undefined) {\n    result[result.length - 1].offset = 1;\n  }\n\n  // Find segments between defined offsets and interpolate\n  let lastDefinedIndex = 0,\n    currentOffset = result[0].offset as number;\n  for (let i = 1; i < result.length; i++) {\n    if (result[i].offset !== undefined) {\n      const endOffset = result[i].offset as number;\n\n      if (endOffset < currentOffset) {\n        console.error('Offsets must be monotonically non-decreasing');\n        return [];\n      } else if (endOffset > 1) {\n        console.error('Offsets must be in the range [0,1]');\n        return [];\n      }\n      const gap = i - lastDefinedIndex;\n\n      for (let j = lastDefinedIndex + 1; j < i; j++) {\n        const progress = (j - lastDefinedIndex) / gap;\n        result[j].offset = currentOffset + (endOffset - currentOffset) * progress;\n      }\n\n      lastDefinedIndex = i;\n      currentOffset = endOffset;\n    }\n  }\n\n  return result;\n}\n\nexport function keyframeObjectToKeyframeCSS(keyframeObj: Keyframe, percentage: number): string {\n  const properties = Object.entries(keyframeObj)\n    .filter(([key, value]) => key !== 'offset' && value !== undefined && value !== null)\n    .map(([key, value]) => {\n      const cssKey = keyframePropertyToCSS(key);\n      return `${cssKey}: ${value};`;\n    })\n    .join('\\n    ');\n  return `${percentage}% {\\n    ${properties}\\n  }`;\n}\n\nexport function keyframesToCSS(name: string, keyframes: Keyframe[]): string {\n  const interpolated = interpolateKeyframesOffsets(keyframes);\n  if (!interpolated.length) {\n    return '';\n  }\n\n  let keyframeBlocks = interpolated\n    .map((kf) => {\n      const offset = kf.offset as number;\n      const percentage = roundNumber(offset * 100);\n\n      return keyframeObjectToKeyframeCSS(kf, percentage);\n    })\n    .join('\\n  ');\n\n  return `@keyframes ${name} {\\n  ${keyframeBlocks}\\n}`;\n}\n\nexport function CSSRuleToString(rule: CSSRuleData): string {\n  const { key, childSelector, declarations, media, states, selectorCondition, selectorSuffix } =\n    rule;\n  if (!declarations.length) {\n    return '';\n  }\n\n  let selector = `[data-interact-key=\"${key}\"]`;\n\n  // maybe nesting is simpler? - no need for `:is` only adding `&` before every option\n  if (states && states.length) {\n    const statesSelector = states\n      .map((state) => `:state(${state}), :--${state}, [data-interact-effect~=\"${state}\"]`)\n      .join(', ');\n    selector = `${selector}:is(${statesSelector})`;\n  }\n\n  // here nesting might be confusing due to spaces already being handled?\n  if (childSelector) {\n    selector = `${selector} ${childSelector}`;\n  }\n\n  if (selectorSuffix) {\n    selector = `${selector}${selectorSuffix}`;\n  }\n\n  // maybe nesting is simpler? -\n  // equivalent to `baseSelector { ${applySelectorCondition('&', selectorCondition)} { ... } }`\n  if (selectorCondition) {\n    selector = applySelectorCondition(selector, selectorCondition);\n  }\n\n  const declarationsStr = declarations\n    .map(({ name, value, important }) => `${name}: ${value}${important ? ' !important' : ''};`)\n    .join('\\n  ');\n  const cssRule = `${selector} {\\n  ${declarationsStr}\\n}`;\n\n  return media ? `@media ${media} {\\n${cssRule}\\n}` : cssRule;\n}\n\nexport const LIST_ANIMATION_PROPERTY_NAMES = [\n  'animation',\n  'animation-composition',\n  'animation-timeline',\n  'animation-range',\n] as const satisfies readonly ListPropertyName[];\nexport const LIST_PROPERTY_NAMES = [\n  ...LIST_ANIMATION_PROPERTY_NAMES,\n  'transition',\n  'view-timeline',\n] as const satisfies readonly ListPropertyName[];\nexport const LIST_KINDS = ['animation', 'transition', 'timeline'] as const;\nexport type ListKind = (typeof LIST_KINDS)[number];\nexport type ListSlots = {\n  listIndex: number;\n  slotCursor: number;\n  slotsInSequence: number;\n};\n\nexport function listKind(name: ListPropertyName): ListKind {\n  if (name === 'transition') {\n    return 'transition';\n  }\n  return name === 'view-timeline' ? 'timeline' : 'animation';\n}\n\nexport const LIST_PROPERTY_FALLBACKS: Record<ListPropertyName, string> = {\n  transition: '_',\n  animation: 'none',\n  'animation-composition': 'replace',\n  'animation-timeline': 'auto',\n  'animation-range': 'normal',\n  'view-timeline': 'none',\n};\n\n// TODO: maybe add `-intrct` to names? --anm-0 or --trns-0 could collide with user-defined names\nexport function getCustomPropName(name: string, index: number, isSlot: boolean = false): string {\n  return `--${name.replace(/(?<!(^|-))([aeiou]|tion)/g, '')}${isSlot ? '-slot' : ''}-${index}`;\n}\n\nexport function buildAtPropertyRules(\n  animationLength: number,\n  transitionLength: number,\n  animationSlotLength: number,\n  transitionSlotLength: number,\n  timelineLength: number = 0,\n): string[] {\n  const lengths = {\n    animation: animationLength,\n    transition: transitionLength,\n    timeline: timelineLength,\n  };\n  const slotLengths = {\n    animation: animationSlotLength,\n    transition: transitionSlotLength,\n    timeline: 0,\n  };\n  return LIST_PROPERTY_NAMES.flatMap((name) => [\n    ...Array.from(\n      { length: lengths[listKind(name)] },\n      (_, i) =>\n        `@property ${getCustomPropName(name, i)} { syntax: \"*\"; inherits: false; initial-value: ${LIST_PROPERTY_FALLBACKS[name]}; }`,\n    ),\n    ...Array.from(\n      { length: slotLengths[listKind(name)] },\n      (_, i) =>\n        `@property ${getCustomPropName(name, i, true)} { syntax: \"*\"; inherits: false; initial-value: ${LIST_PROPERTY_FALLBACKS[name]}; }`,\n    ),\n  ]);\n}\n\nexport function buildSequenceListsRule(\n  target: {\n    key: string;\n    childSelector?: string;\n    animation: ListSlots;\n    transition: ListSlots;\n    timeline: ListSlots;\n  },\n  conditions?: string[],\n  configConditions?: Record<string, Condition>,\n): CSSRuleData | null {\n  const propertyNames = LIST_PROPERTY_NAMES.filter(\n    (name) => target[listKind(name)].slotsInSequence > 0,\n  );\n  if (propertyNames.length === 0) {\n    return null;\n  }\n\n  const declarations = propertyNames.map((name) => {\n    const { listIndex, slotCursor, slotsInSequence } = target[listKind(name)];\n\n    return {\n      name: getCustomPropName(name, listIndex),\n      value: Array.from(\n        { length: slotsInSequence },\n        (_, i) => `var(${getCustomPropName(name, slotCursor + i, true)})`,\n      ).join(', '),\n    };\n  });\n\n  const rule: CSSRuleData = { key: target.key, childSelector: target.childSelector, declarations };\n\n  if (conditions) {\n    rule.media = getFullPredicateByType(conditions, configConditions || {}, 'media');\n    rule.selectorCondition = getSelectorCondition(conditions, configConditions || {});\n  }\n\n  return rule;\n}\n\nexport function buildListsRule(\n  targets: { key: string; childSelector?: string }[],\n  animationLength: number,\n  transitionLength: number,\n  timelineLength: number = 0,\n): string {\n  if (targets.length === 0) {\n    return '';\n  }\n\n  const lengths = {\n    animation: animationLength,\n    transition: transitionLength,\n    timeline: timelineLength,\n  };\n  const propertyNames = LIST_PROPERTY_NAMES.filter((name) => lengths[listKind(name)] > 0);\n  if (propertyNames.length === 0) {\n    return '';\n  }\n\n  const declarations = propertyNames.map((name) => ({\n    name,\n    value: Array.from(\n      { length: lengths[listKind(name)] },\n      // TODO: maybe add `-intrct` to names? --anm-0 or --trns-0 could collide with user-defined names\n      (_, i) => `var(${getCustomPropName(name, i)})`,\n    ).join(', '),\n  }));\n\n  const joinedSelector = targets\n    .map(\n      ({ key, childSelector }) =>\n        `[data-interact-key=\"${key}\"]${childSelector ? ` ${childSelector}` : ''}`,\n    )\n    .join(', ');\n\n  return `${joinedSelector} {\\n${declarations.map(({ name, value }) => `  ${name}: ${value};`).join('\\n')}\\n}`;\n}\n","import type {\n  TimeEffect,\n  ScrubEffect,\n  RangeOffset,\n  HandlerObject,\n  HandlerObjectMap,\n  AnimationOptions,\n} from '../types';\n\nconst DEFAULT_RANGE_VALUES = {\n  rangeStart: { name: 'cover' as const, offset: { value: 0, unit: 'percentage' as const } },\n  rangeEnd: { name: 'cover' as const, offset: { value: 100, unit: 'percentage' as const } },\n};\n\nfunction resolveRangeOffsets(\n  rangeStart: RangeOffset | undefined,\n  rangeEnd: RangeOffset | undefined,\n): { startOffset: RangeOffset; endOffset: RangeOffset } {\n  const startName = rangeStart?.name ?? DEFAULT_RANGE_VALUES.rangeStart.name;\n  const endName = rangeEnd?.name ?? rangeStart?.name ?? DEFAULT_RANGE_VALUES.rangeEnd.name;\n\n  const startOffset: RangeOffset = {\n    name: startName,\n    offset: rangeStart?.offset || DEFAULT_RANGE_VALUES.rangeStart.offset,\n  };\n\n  const endOffset: RangeOffset = {\n    name: endName,\n    offset: rangeEnd?.offset || DEFAULT_RANGE_VALUES.rangeEnd.offset,\n  };\n\n  return { startOffset, endOffset };\n}\n\nexport function effectToAnimationOptions(effect: TimeEffect | ScrubEffect) {\n  if ('keyframeEffect' in effect && !effect.keyframeEffect.name && 'effectId' in effect) {\n    effect.keyframeEffect.name = effect.effectId as string;\n  }\n\n  if ('duration' in effect) {\n    return {\n      id: '',\n      ...effect,\n    } as AnimationOptions<'time'>;\n  }\n\n  const { rangeStart, rangeEnd, ...rest } = effect;\n  const { startOffset, endOffset } = resolveRangeOffsets(rangeStart, rangeEnd);\n\n  return {\n    id: '',\n    startOffset,\n    endOffset,\n    ...rest,\n  } as AnimationOptions<'scrub'>;\n}\n\nexport function addHandlerToMap(\n  handlersMap: HandlerObjectMap,\n  element: HTMLElement,\n  handlerObj: HandlerObject,\n) {\n  let handlers = handlersMap.get(element);\n\n  if (!handlers) {\n    handlers = new Set();\n    handlersMap.set(element, handlers);\n  }\n\n  handlers.add(handlerObj);\n}\n\nexport function removeElementFromHandlerMap(handlerMap: HandlerObjectMap, element: HTMLElement) {\n  const handlers = handlerMap.get(element);\n\n  handlers?.forEach((handlerObj) => {\n    const { source, target, cleanup } = handlerObj;\n    cleanup();\n\n    const otherKey = source === element ? target : source;\n    const otherHandlers = handlerMap.get(otherKey);\n    otherHandlers?.delete(handlerObj);\n  });\n\n  handlerMap.delete(element);\n}\n","import type {\n  InteractConfig,\n  Interaction,\n  ResolvedEffect,\n  ResolvedSequence,\n  Condition,\n  ListPropertyName,\n  CSSRuleData,\n  InteractPluginStyles,\n  GenerateOptions,\n} from '../types';\nimport { PLUGIN_FIELD_PREFIX } from '../types';\nimport {\n  camelToKebabCase,\n  getStateStyleProperties,\n  transitionEffectToTransitionsList,\n  getFullPredicateByType,\n  getSelectorCondition,\n} from '../utils';\nimport { getSelector } from './Interact';\nimport { resolveEffectForCSS, resolveSequenceForCSS } from './resolvers';\nimport { getElementHash } from './utilities';\nimport {\n  LIST_ANIMATION_PROPERTY_NAMES,\n  LIST_PROPERTY_NAMES,\n  LIST_PROPERTY_FALLBACKS,\n  keyframesToCSS,\n  CSSRuleToString,\n  buildListsRule,\n  buildAtPropertyRules,\n  getCustomPropName,\n  buildSequenceListsRule,\n  LIST_KINDS,\n  listKind,\n} from './cssUtils';\nimport type { ListKind, ListSlots } from './cssUtils';\nimport { effectToAnimationOptions } from '../handlers/utilities';\nimport {\n  getCSSAnimation,\n  getRegisteredEffect,\n  MotionKeyframeEffect,\n  TriggerVariant,\n} from '@wix/motion';\nimport type { AnimationEffectAPI } from '@wix/motion';\n\nexport const DEFAULT_INITIAL = [\n  { name: 'visibility', value: 'hidden' },\n  { name: 'clip-path', value: 'none', important: true },\n  { name: 'transform', value: 'none', important: true },\n  { name: 'translate', value: 'none', important: true },\n  { name: 'scale', value: 'none', important: true },\n  { name: 'rotate', value: 'none', important: true },\n];\n\ntype AnimationPropertyName = (typeof LIST_ANIMATION_PROPERTY_NAMES)[number];\n\ntype ListCounters = ListSlots & {\n  slotsInInteraction: number;\n  touched: boolean;\n};\ntype SlotUsage = Record<ListKind, boolean>;\nconst NO_SLOTS: SlotUsage = { animation: false, transition: false, timeline: false };\ntype KeyframeSlotMember = { slotKey: string; getNames: (suffix?: string) => string[] };\ntype TargetContext = {\n  key: string;\n  childSelector?: string;\n  partSelectors: Set<string>;\n  assigned: Set<string>;\n  animation: ListCounters;\n  transition: ListCounters;\n  timeline: ListCounters;\n  // namedEffects by the animation list entry they write (see getKeyframeSlots)\n  keyframeEntries: Map<string, KeyframeSlotMember[]>;\n};\ntype TargetsMap = Map<string, TargetContext>;\n\ntype GenerateContext = {\n  config: InteractConfig;\n  configConditions: Record<string, Condition>;\n  targetsMap: TargetsMap;\n  keyframesMap: Map<string, Keyframe[]>;\n  keyframeSlots: Map<string, string>;\n  // view timelines whose targets may be outside their source's subtree\n  scopedTimelines: string[];\n  // only collecting the effects' list entries for getKeyframeSlots, without generating CSS\n  collectSlots: boolean;\n  useFirstChild: boolean;\n  plugins?: InteractPluginStyles;\n};\n\nfunction createTargetContext(key: string, childSelector?: string): TargetContext {\n  const createListCounters = (): ListCounters => ({\n    listIndex: 0,\n    slotCursor: 0,\n    slotsInInteraction: 0,\n    slotsInSequence: 0,\n    touched: false,\n  });\n\n  return {\n    key,\n    childSelector,\n    partSelectors: new Set<string>(),\n    assigned: new Set<string>(),\n    animation: createListCounters(),\n    transition: createListCounters(),\n    timeline: createListCounters(),\n    keyframeEntries: new Map<string, KeyframeSlotMember[]>(),\n  };\n}\n\nfunction getCustomProps(\n  target: TargetContext,\n  useSlots: SlotUsage,\n): Record<ListPropertyName, string> {\n  return Object.fromEntries(\n    LIST_PROPERTY_NAMES.map((name) => {\n      const kind = listKind(name);\n      const { listIndex, slotCursor, slotsInSequence } = target[kind];\n      return [\n        name,\n        useSlots[kind]\n          ? getCustomPropName(name, slotCursor + slotsInSequence, true)\n          : getCustomPropName(name, listIndex),\n      ];\n    }),\n  ) as Record<ListPropertyName, string>;\n}\n\nfunction endEffect(\n  target: TargetContext,\n  wrote: Record<ListKind, boolean>,\n  useSlots: SlotUsage,\n): void {\n  LIST_KINDS.forEach((kind) => {\n    if (!wrote[kind]) {\n      return;\n    }\n\n    target[kind].touched = true;\n    if (useSlots[kind]) {\n      target[kind].slotsInSequence += 1;\n    }\n  });\n}\n\nfunction getEffectListKind(effect: ResolvedEffect): ListKind | null {\n  const { namedEffect, keyframeEffect, transition, transitionProperties } = effect;\n\n  if (namedEffect || keyframeEffect) {\n    return 'animation';\n  }\n  if (transition || transitionProperties) {\n    return 'transition';\n  }\n  return null;\n}\n\nfunction getSlotUsage(sequence: ResolvedSequence): Map<string, SlotUsage> {\n  const counts = new Map<string, Record<ListKind, number>>();\n\n  sequence.effects.forEach((effect) => {\n    const kind = getEffectListKind(effect);\n    if (!kind) {\n      return;\n    }\n\n    const targetHash = getElementHash(effect);\n    const count = counts.get(targetHash) || { animation: 0, transition: 0, timeline: 0 };\n    count[kind] += 1;\n    counts.set(targetHash, count);\n  });\n\n  return new Map(\n    [...counts].map(([targetHash, { animation, transition }]) => [\n      targetHash,\n      { animation: animation > 1, transition: transition > 1, timeline: false },\n    ]),\n  );\n}\n\nfunction endSequence(target: TargetContext): void {\n  LIST_KINDS.forEach((kind) => {\n    const counters = target[kind];\n    counters.slotsInInteraction = Math.max(counters.slotsInInteraction, counters.slotsInSequence);\n    counters.slotsInSequence = 0;\n  });\n}\n\nfunction endInteraction(target: TargetContext): void {\n  LIST_KINDS.forEach((kind) => {\n    const counters = target[kind];\n    counters.listIndex += counters.touched ? 1 : 0;\n    counters.slotCursor += counters.slotsInInteraction;\n    counters.slotsInInteraction = 0;\n    counters.touched = false;\n  });\n}\n\nconst LIST_PROPERTY_NAMES_MOTION: Record<AnimationPropertyName, string> = {\n  animation: 'animation',\n  'animation-composition': 'composition',\n  'animation-timeline': 'animationTimeline',\n  'animation-range': 'animationRange',\n};\n\n// the interaction's timeline is an entry of its source's view-timeline list\nfunction triggerToCSS(\n  ctx: GenerateContext,\n  interaction: Interaction,\n  triggerId: string,\n  visited: Set<string>,\n): CSSRuleData {\n  const { key, conditions } = interaction;\n\n  const media = getFullPredicateByType(conditions, ctx.configConditions, 'media');\n  const selectorCondition = getSelectorCondition(conditions, ctx.configConditions);\n\n  const childSelector = getSelector(interaction, {\n    asCombinator: true,\n    useFirstChild: ctx.useFirstChild,\n    addItemFilter: true,\n  });\n\n  const sourceHash = getElementHash(interaction);\n  const source = ctx.targetsMap.get(sourceHash) || createTargetContext(key, childSelector);\n  const name = getCustomProps(source, NO_SLOTS)['view-timeline'];\n  endEffect(source, { animation: false, transition: false, timeline: true }, NO_SLOTS);\n  ctx.targetsMap.set(sourceHash, source);\n  visited.add(sourceHash);\n\n  return {\n    key,\n    media,\n    selectorCondition,\n    childSelector,\n    declarations: [\n      {\n        name,\n        value: `--${triggerId}`,\n      },\n    ],\n  };\n}\n\nfunction collectFieldPluginStyles(\n  scope: 'interaction' | 'effect',\n  source: Record<string, unknown>,\n  key: string,\n  media: string,\n  plugins: InteractPluginStyles,\n): CSSRuleData[] {\n  const rules = [];\n  for (const pluginName of Object.keys(plugins)) {\n    const pluginField = `${PLUGIN_FIELD_PREFIX}${pluginName}`;\n    if (!(pluginField in source)) {\n      continue;\n    }\n\n    rules.push(\n      ...plugins[pluginName](source[pluginField], {\n        key,\n        scope,\n        config: source,\n      }).map((data) => ({ ...data, key, media })),\n    );\n  }\n  return rules;\n}\n\nfunction effectToCSS(\n  ctx: GenerateContext,\n  effect: ResolvedEffect,\n  target: TargetContext,\n  trigger: TriggerVariant,\n  customProps: Record<ListPropertyName, string>,\n  sequence?: ResolvedSequence,\n): {\n  rules: CSSRuleData[];\n  keyframes: MotionKeyframeEffect[];\n  wrote: Record<ListKind, boolean>;\n} {\n  const { assigned, childSelector, partSelectors } = target;\n  const wrote: Record<ListKind, boolean> = { animation: false, transition: false, timeline: false };\n  const {\n    key,\n    effectId,\n    conditions,\n    namedEffect,\n    keyframeEffect,\n    transition,\n    transitionProperties,\n    initial,\n  } = effect;\n\n  const media = getFullPredicateByType(conditions, ctx.configConditions, 'media');\n  const selectorCondition = getSelectorCondition(conditions, ctx.configConditions);\n\n  const rules: CSSRuleData[] = [\n    {\n      key,\n      media,\n      selectorCondition,\n      childSelector,\n      declarations: [],\n    },\n  ];\n  let keyframes: MotionKeyframeEffect[] = [];\n\n  const { declarations } = rules[0];\n\n  if (ctx.plugins) {\n    rules.push(...collectFieldPluginStyles('effect', effect, key, media, ctx.plugins));\n  }\n\n  if (namedEffect || keyframeEffect) {\n    const animationOptions = effectToAnimationOptions(effect);\n    const cssAnimations = getCSSAnimation(null, animationOptions, trigger, sequence).filter(\n      (anim) => anim.name,\n    );\n    const animationsByPart: Record<string, typeof cssAnimations> = cssAnimations.length\n      ? {}\n      : { '': [] };\n    cssAnimations.forEach((anim) => {\n      const part = anim.part || '';\n      (animationsByPart[part] ||= []).push(anim);\n    });\n\n    // accumulate keyframes\n    keyframes = cssAnimations.map((anim) => ({\n      name: anim.name as string,\n      keyframes: anim.keyframes,\n    }));\n\n    // declare custom parameters\n    // TODO - register those to define with @property to prevent unintended override\n    declarations.push(\n      ...cssAnimations.flatMap(({ custom }) =>\n        Object.entries(custom || {})\n          .filter(([_, value]) => value !== undefined)\n          .map(([key, value]) => ({ name: key, value: value as string | number })),\n      ),\n    );\n\n    // TODO - part animations introduce a problem with cascade where to override it you must override all parts.\n    // Currently this is in play only for background scroll effects, which are not mixed with other effects in cascade,\n    // but this should be fixed. style queries may help in handling this and cascade in general by setting --active-effect-id and querying it by order.\n    Object.entries(animationsByPart).forEach(([part, animations]) => {\n      const animationDeclarations = LIST_ANIMATION_PROPERTY_NAMES.map((propertyName) => ({\n        _listPropertyName: propertyName,\n        name: customProps[propertyName],\n        value: animations\n          .map((animation) => {\n            const name = LIST_PROPERTY_NAMES_MOTION[propertyName];\n            return (\n              (animation as Record<string, unknown>)[name] || LIST_PROPERTY_FALLBACKS[propertyName]\n            );\n          })\n          .join(', '),\n      })).filter(\n        ({ _listPropertyName, name, value }) =>\n          value !== LIST_PROPERTY_FALLBACKS[_listPropertyName] || assigned.has(name),\n      );\n      animationDeclarations.forEach(({ name }) => assigned.add(name));\n      wrote.animation = wrote.animation || animationDeclarations.length > 0;\n\n      const childOrPartSelector = part ? `[data-motion-part~=\"${part}\"]` : childSelector;\n      if (part && animationDeclarations.length) {\n        partSelectors.add(childOrPartSelector!);\n      }\n\n      if (initial) {\n        // declare animation custom properties with initial dependent on data-motion-enter\n        rules.push({\n          key,\n          media,\n          selectorCondition,\n          childSelector: childOrPartSelector,\n          declarations: DEFAULT_INITIAL,\n          selectorSuffix: ':not([data-interact-enter])',\n        });\n        rules.push({\n          key,\n          media,\n          selectorCondition,\n          childSelector: childOrPartSelector,\n          declarations: animationDeclarations,\n          selectorSuffix: ':not([data-interact-enter=\"done\"])',\n        });\n      } else {\n        // declare animation custom properties\n        if (part) {\n          rules.push({\n            key,\n            media,\n            selectorCondition,\n            childSelector: childOrPartSelector,\n            declarations: animationDeclarations,\n          });\n        } else {\n          declarations.push(...animationDeclarations);\n        }\n      }\n    });\n  } else if (transition || transitionProperties) {\n    const properties = getStateStyleProperties(effect);\n    const transitions = transitionEffectToTransitionsList(effect);\n\n    // declaring transition custom property\n    if (transitions.length || assigned.has(customProps.transition)) {\n      declarations.push({\n        name: customProps.transition,\n        value: transitions.join(', ') || LIST_PROPERTY_FALLBACKS.transition,\n      });\n      assigned.add(customProps.transition);\n      wrote.transition = true;\n    }\n\n    // adding state rule\n    rules.push({\n      key,\n      media,\n      selectorCondition,\n      childSelector,\n      states: [effectId],\n      declarations: properties,\n    });\n  } else {\n    // setting off animation custom properties\n    declarations.push(\n      ...LIST_ANIMATION_PROPERTY_NAMES.filter((propertyName) =>\n        assigned.has(customProps[propertyName]),\n      ).map((propertyName) => ({\n        name: customProps[propertyName],\n        value: LIST_PROPERTY_FALLBACKS[propertyName],\n      })),\n    );\n  }\n\n  return { rules: rules.filter((r) => r.declarations.length), keyframes, wrote };\n}\n\n// records a namedEffect under the animation list entry it writes on its target\nfunction collectKeyframeEntry(target: TargetContext, effect: ResolvedEffect, entry: string) {\n  const module =\n    effect.namedEffect &&\n    (getRegisteredEffect(effect.namedEffect.type, false) as AnimationEffectAPI<'time'> | null);\n  if (!module?.getNames) {\n    return;\n  }\n  const getNames = (suffix?: string) =>\n    module.getNames({ ...effect, suffix } as Parameters<typeof module.getNames>[0]);\n  // effects that ignore the suffix can't use slots\n  if (getNames('-1').join() === getNames().join()) {\n    return;\n  }\n  const members = target.keyframeEntries.get(entry) || [];\n  target.keyframeEntries.set(entry, [...members, { slotKey: effect.slotKey!, getNames }]);\n}\n\nfunction parseEffect(\n  ctx: GenerateContext,\n  effect: ResolvedEffect,\n  trigger: TriggerVariant,\n  visited: Set<string>,\n  sequence?: ResolvedSequence,\n  slotUsage?: Map<string, SlotUsage>,\n): CSSRuleData[] {\n  const targetHash = getElementHash(effect);\n  const current =\n    ctx.targetsMap.get(targetHash) ||\n    createTargetContext(\n      effect.key,\n      getSelector(effect, {\n        asCombinator: true,\n        useFirstChild: ctx.useFirstChild,\n        addItemFilter: true,\n      }),\n    );\n  visited.add(targetHash);\n\n  const useSlots = slotUsage?.get(targetHash) || NO_SLOTS;\n  const customProps = getCustomProps(current, useSlots);\n\n  if (ctx.collectSlots) {\n    collectKeyframeEntry(current, effect, customProps.animation);\n    const kind = getEffectListKind(effect);\n    endEffect(\n      current,\n      { animation: kind === 'animation', transition: kind === 'transition', timeline: false },\n      useSlots,\n    );\n    ctx.targetsMap.set(targetHash, current);\n    return [];\n  }\n\n  if (effect.namedEffect) {\n    effect.suffix = ctx.keyframeSlots.get(effect.slotKey!);\n  }\n\n  const { rules, keyframes, wrote } = effectToCSS(\n    ctx,\n    effect,\n    current,\n    trigger,\n    customProps,\n    sequence,\n  );\n\n  keyframes.forEach(({ name, keyframes }) => ctx.keyframesMap.set(name, keyframes));\n\n  endEffect(current, wrote, useSlots);\n  ctx.targetsMap.set(targetHash, current);\n\n  return rules;\n}\n\nfunction parseSequence(\n  ctx: GenerateContext,\n  sequence: ResolvedSequence,\n  trigger: TriggerVariant,\n  visited: Set<string>,\n): CSSRuleData[] {\n  const cssRules: CSSRuleData[] = [];\n\n  const localVisited = new Set<string>();\n  const slotUsage = getSlotUsage(sequence);\n\n  cssRules.push(\n    ...sequence.effects.flatMap((effect) =>\n      parseEffect(ctx, effect, trigger, localVisited, sequence, slotUsage),\n    ),\n  );\n\n  const { conditions } = sequence;\n\n  localVisited.forEach((targetHash) => {\n    visited.add(targetHash);\n    const current = ctx.targetsMap.get(targetHash)!;\n\n    const rule = buildSequenceListsRule(current, conditions, ctx.configConditions);\n    if (rule) {\n      rule.declarations.forEach(({ name }) => current.assigned.add(name));\n      cssRules.push(rule);\n    }\n\n    endSequence(current);\n  });\n\n  return cssRules;\n}\n\nfunction parseInteraction(\n  ctx: GenerateContext,\n  interaction: Interaction,\n  interactionIdx: number,\n): CSSRuleData[] {\n  const { key, conditions, effects = [], sequences = [] } = interaction;\n\n  const cssRules = ctx.plugins\n    ? collectFieldPluginStyles(\n        'interaction',\n        interaction,\n        key,\n        getFullPredicateByType(conditions, ctx.configConditions, 'media'),\n        ctx.plugins,\n      )\n    : [];\n\n  const { trigger } = interaction;\n  const motionTrigger = {\n    trigger: camelToKebabCase(trigger),\n    id: ['trigger', interactionIdx].join('-'),\n    componentId: '',\n  } as TriggerVariant;\n  const visited = new Set<string>();\n\n  if (trigger === 'viewProgress') {\n    cssRules.push(triggerToCSS(ctx, interaction, motionTrigger.id, visited));\n  }\n\n  const resolvedEffects = effects\n    .map((effect, effIndex) => {\n      const resolved = resolveEffectForCSS(\n        effect,\n        interaction,\n        ctx.config,\n        `eff-${interactionIdx}-${effIndex}`,\n      );\n      return resolved && Object.assign(resolved, { slotKey: getSlotKey(interactionIdx, effIndex) });\n    })\n    .filter((effect) => effect !== null);\n\n  cssRules.push(\n    ...resolvedEffects.flatMap((effect) => parseEffect(ctx, effect, motionTrigger, visited)),\n  );\n\n  const resolvedSequences = sequences\n    .map((sequence, seqIndex) =>\n      resolveSequenceForCSS(\n        sequence,\n        interaction,\n        ctx.config,\n        `seq-${interactionIdx}-${seqIndex}`,\n        (effIndex) => getSlotKey(interactionIdx, effIndex, seqIndex),\n      ),\n    )\n    .filter((sequence) => sequence !== null);\n\n  cssRules.push(\n    ...resolvedSequences.flatMap((sequence) =>\n      parseSequence(ctx, sequence, motionTrigger, visited),\n    ),\n  );\n\n  // a named view timeline is visible only in its source's subtree, so targets outside it, e.g. siblings,\n  // need its name scoped to the page (visited holds the source and every target)\n  if (trigger === 'viewProgress' && visited.size > 1) {\n    ctx.scopedTimelines.push(`--${motionTrigger.id}`);\n  }\n\n  visited.forEach((targetHash) => endInteraction(ctx.targetsMap.get(targetHash)!));\n\n  return cssRules;\n}\n\n// ----- EndPoints -----\n\n/**\n * Normalizes `generate()`'s single optional argument, which is either the legacy `useFirstChild`\n * boolean or an options bag.\n */\nfunction normalizeGenerateOptions(options: boolean | GenerateOptions = {}): {\n  useFirstChild: boolean;\n  plugins?: InteractPluginStyles;\n} {\n  const { useFirstChild = true, plugins } =\n    typeof options === 'boolean' ? { useFirstChild: options, plugins: undefined } : options;\n\n  return { useFirstChild, plugins };\n}\n\nfunction parseConfig(\n  config: InteractConfig,\n  options: { useFirstChild?: boolean; plugins?: InteractPluginStyles; collectSlots?: boolean },\n) {\n  const { useFirstChild = true, plugins, collectSlots = false } = options;\n  const ctx: GenerateContext = {\n    config,\n    configConditions: config.conditions || {},\n    targetsMap: new Map<string, TargetContext>(),\n    keyframesMap: new Map<string, Keyframe[]>(),\n    keyframeSlots: collectSlots ? new Map() : getKeyframeSlots(config),\n    scopedTimelines: [],\n    collectSlots,\n    useFirstChild,\n    plugins,\n  };\n\n  const cssRules = config.interactions.flatMap((interaction, interactionIdx) =>\n    parseInteraction(ctx, interaction, interactionIdx),\n  );\n\n  return { ctx, cssRules };\n}\n\nexport function getSlotKey(interactionIndex: number, effectIndex: number, sequenceIndex?: number) {\n  return [interactionIndex, sequenceIndex, effectIndex].filter((i) => i !== undefined).join(':');\n}\n\n/**\n * Keyframes are shared between effects and parameterized by custom properties on their target, so effects that\n * write different animation list entries of a target (they play together) need their own names when theirs collide:\n * each entry takes the first slot free of the names of the target's other entries, and its effects' names are\n * suffixed by it. Effects of the same entry cascade over each other, so they share its slot.\n * Slots are chosen before any CSS is written, since a later effect of an entry can collide with an entry created\n * after its first one. Uses the same traversal as generate(), so the runtime finds an effect's animations by its\n * position.\n *\n * @returns the suffix of every effect not in the first slot, by its slot key (see getSlotKey)\n */\nexport function getKeyframeSlots(config: InteractConfig): Map<string, string> {\n  const { ctx } = parseConfig(config, { collectSlots: true });\n  const slots = new Map<string, string>();\n  const suffixOf = (slot: number) => (slot ? `-${slot}` : undefined);\n\n  ctx.targetsMap.forEach(({ keyframeEntries }) => {\n    const used = new Set<string>();\n    keyframeEntries.forEach((members) => {\n      const namesAt = (slot: number) => members.flatMap(({ getNames }) => getNames(suffixOf(slot)));\n      let slot = 0;\n      let names = namesAt(slot);\n      while (names.some((name) => used.has(name))) {\n        names = namesAt(++slot);\n      }\n      names.forEach((name) => used.add(name));\n      if (slot) {\n        members.forEach(({ slotKey }) => slots.set(slotKey, suffixOf(slot)!));\n      }\n    });\n  });\n\n  return slots;\n}\n\nexport function _generate(\n  config: InteractConfig,\n  options?: boolean | GenerateOptions,\n): {\n  cssRules: CSSRuleData[];\n  listsRule: string;\n  keyframes: Map<string, Keyframe[]>;\n  atProperty: string[];\n  timelineScopeRule: string;\n} {\n  const { ctx, cssRules } = parseConfig(config, normalizeGenerateOptions(options));\n\n  const targets = [...ctx.targetsMap.values()];\n\n  const animationLength = Math.max(0, ...targets.map(({ animation }) => animation.listIndex));\n  const transitionLength = Math.max(0, ...targets.map(({ transition }) => transition.listIndex));\n  const timelineLength = Math.max(0, ...targets.map(({ timeline }) => timeline.listIndex));\n  const listsRule = buildListsRule(\n    targets.flatMap((target) => [\n      target,\n      ...[...target.partSelectors].map((childSelector) => ({ key: target.key, childSelector })),\n    ]),\n    animationLength,\n    transitionLength,\n    timelineLength,\n  );\n\n  const animationSlotLength = Math.max(0, ...targets.map(({ animation }) => animation.slotCursor));\n  const transitionSlotLength = Math.max(\n    0,\n    ...targets.map(({ transition }) => transition.slotCursor),\n  );\n  const atProperty = buildAtPropertyRules(\n    animationLength,\n    transitionLength,\n    animationSlotLength,\n    transitionSlotLength,\n    timelineLength,\n  );\n\n  // trigger names are unique in a config, and a target inside its source still resolves the source's timeline first\n  const timelineScopeRule = ctx.scopedTimelines.length\n    ? `:root {\\n  timeline-scope: ${ctx.scopedTimelines.join(', ')};\\n}`\n    : '';\n\n  return { keyframes: ctx.keyframesMap, atProperty, cssRules, listsRule, timelineScopeRule };\n}\n/**\n * Generates CSS for animations from an InteractConfig.\n *\n * @param config - The interact configuration containing effects and interactions\n * @param options - Either a {@link GenerateOptions} bag or — for backwards compatibility — a bare\n *   boolean used as `useFirstChild`:\n *\n *   - `useFirstChild` - Whether to use the first child selector (default: true)\n *   - `plugins` - Optional map of plugin name → SSR style generator. For every `$<name>` field in\n *       the config, the matching generator is called with the field's (opaque) value and a context;\n *       its returned CSS is appended. Used e.g. to hide pre-split text for FOUC prevention.\n *       Interact never inspects the field value — mirroring `create()`/`use()`.\n *\n * @returns string containing all of the CSS rules needed for time-based animations\n */\nexport function generate(config: InteractConfig, options?: boolean | GenerateOptions): string {\n  const { cssRules, keyframes, atProperty, listsRule, timelineScopeRule } = _generate(\n    config,\n    options,\n  );\n\n  const css = [\n    ...atProperty,\n    ...[...keyframes.entries()].map(([name, keyframes]) => keyframesToCSS(name, keyframes)),\n    ...cssRules.map(CSSRuleToString),\n    listsRule,\n    timelineScopeRule,\n  ].filter((rule) => rule);\n\n  return css.join('\\n');\n}\n","import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation } from '@wix/motion';\nimport type { TimeEffect, HandlerObjectMap, ViewEnterParams, InteractOptions } from '../types';\nimport {\n  effectToAnimationOptions,\n  addHandlerToMap,\n  removeElementFromHandlerMap,\n} from './utilities';\nimport fastdom from 'fastdom';\n\nconst SAFE_OBSERVER_CONFIG: IntersectionObserverInit = {\n  root: null,\n  rootMargin: '0px 0px -10% 0px',\n  threshold: [0],\n};\n\n// Exit observer config for repeat/state types - watches when element is completely out of view\nconst EXIT_OBSERVER_CONFIG: IntersectionObserverInit = {\n  root: null,\n  rootMargin: '0px',\n  threshold: [0],\n};\n\nconst DEFAULT_THRESHOLD = 0.2;\n\n/**\n * Converts an `inset` value to a CSS `rootMargin` string.\n *\n * `inset` is one-dimensional: a single value applies to both top and bottom,\n * two space-separated values set top and bottom independently.\n * The inset direction is the inverse of rootMargin: a positive inset shrinks\n * the intersection root (triggers later), so values are negated.\n *\n * Examples:\n *   \"20%\"      → \"-20% 0px -20%\"\n *   \"10% 30%\"  → \"-10% 0px -30%\"\n */\nfunction insetToRootMargin(inset: string): string {\n  const parts = inset.trim().split(/\\s+/);\n  const top = parts[0];\n  const bottom = parts.length > 1 ? parts[1] : parts[0];\n\n  const negate = (value: string): string => {\n    if (value.startsWith('-')) {\n      return value.slice(1);\n    }\n    return parseFloat(value) ? `-${value}` : value;\n  };\n\n  return `${negate(top)} 0px ${negate(bottom)}`;\n}\n\nconst observers: Record<string, IntersectionObserver> = {};\nconst handlerMap = new WeakMap() as HandlerObjectMap;\nconst elementFirstRun = new WeakSet<HTMLElement>();\nconst elementObserverMap = new WeakMap<HTMLElement, IntersectionObserver>();\nlet viewEnterOptions: Partial<ViewEnterParams> = {};\nlet sharedExitObserver: IntersectionObserver | null = null;\n\nfunction setOptions(options: Partial<ViewEnterParams>) {\n  viewEnterOptions = options;\n}\n\nfunction invokeHandlers(target: HTMLElement, isIntersecting: boolean, isFullExit?: boolean) {\n  const handlers = handlerMap.get(target);\n  handlers?.forEach(({ source, handler }) => {\n    if (source === target) {\n      handler!(isIntersecting, isFullExit);\n    }\n  });\n}\n\nfunction getExitObserver() {\n  if (sharedExitObserver) {\n    return sharedExitObserver;\n  }\n\n  sharedExitObserver = new IntersectionObserver((entries) => {\n    entries.forEach((entry) => {\n      const target = entry.target as HTMLElement;\n\n      if (!entry.isIntersecting) {\n        invokeHandlers(target, false, true);\n      }\n    });\n  }, EXIT_OBSERVER_CONFIG);\n\n  return sharedExitObserver;\n}\n\nfunction getObserver(options: ViewEnterParams, isSafeMode: boolean = false) {\n  const key = JSON.stringify({ ...options, isSafeMode });\n\n  if (observers[key]) {\n    return observers[key];\n  }\n\n  const threshold = options.threshold ?? DEFAULT_THRESHOLD;\n\n  const config: IntersectionObserverInit = isSafeMode\n    ? SAFE_OBSERVER_CONFIG\n    : {\n        root: null,\n        rootMargin: options.inset ? insetToRootMargin(options.inset) : '0px',\n        threshold,\n      };\n\n  const observer = new IntersectionObserver((entries) => {\n    entries.forEach((entry) => {\n      const target = entry.target as HTMLElement;\n      const isFirstRun = !elementFirstRun.has(target);\n\n      if (isFirstRun) {\n        elementFirstRun.add(target);\n\n        if (options.useSafeViewEnter && !entry.isIntersecting) {\n          fastdom.measure(() => {\n            const sourceHeight = entry.boundingClientRect.height;\n            const rootHeight = entry.rootBounds?.height;\n\n            if (!rootHeight) {\n              return;\n            }\n\n            const threshold = Array.isArray(options.threshold)\n              ? Math.min(...options.threshold)\n              : options.threshold;\n\n            const needsSafeObserver = threshold && sourceHeight * threshold > rootHeight;\n\n            if (needsSafeObserver) {\n              fastdom.mutate(() => {\n                observer.unobserve(target);\n                const safeObserver = getObserver(options, true);\n                elementObserverMap.set(target, safeObserver);\n                safeObserver.observe(target);\n              });\n            }\n          });\n          return;\n        }\n      }\n\n      if (entry.isIntersecting || !isFirstRun) {\n        invokeHandlers(target, entry.isIntersecting);\n      }\n    });\n  }, config);\n\n  observers[key] = observer;\n\n  return observer;\n}\n\nfunction addViewEnterHandler(\n  source: HTMLElement,\n  target: HTMLElement,\n  effect: TimeEffect,\n  options: ViewEnterParams = {},\n  { reducedMotion, selectorCondition, animation: preCreatedAnimation }: InteractOptions = {},\n) {\n  const mergedOptions = { ...viewEnterOptions, ...options };\n  const type = effect.triggerType || 'once';\n  const animation = (preCreatedAnimation ||\n    getAnimation(\n      target,\n      effectToAnimationOptions(effect),\n      undefined,\n      reducedMotion,\n    )) as AnimationGroup | null;\n\n  // Early return if animation is null, no observer created\n  if (!animation) {\n    return;\n  }\n\n  const observer = getObserver(mergedOptions);\n\n  // Persist animation for non-once types to prevent auto-cleanup\n  if (type !== 'once') {\n    // Use persist() if available (Web Animations API)\n    (animation as AnimationGroup & { persist?: () => void }).persist?.();\n  }\n\n  // Track initial play state for alternate type\n  let isInitialPlay = true;\n\n  let onceDone = false;\n\n  // Declared early so the handler closure can reference it for self-cleanup\n  let handlerObj: {\n    source: HTMLElement;\n    target: HTMLElement;\n    handler: typeof handler;\n    cleanup: () => void;\n  };\n\n  const handler = (isIntersecting?: boolean, isFullExit?: boolean) => {\n    if (selectorCondition && !target.matches(selectorCondition)) return;\n\n    if (type === 'once') {\n      if (isIntersecting && !onceDone) {\n        onceDone = true;\n\n        // if no more handlers exist we unobserve but keep the handler on the map\n        const sourceHandlers = handlerMap.get(source);\n        if (\n          !sourceHandlers ||\n          sourceHandlers.size === 0 ||\n          (sourceHandlers.size === 1 && sourceHandlers.has(handlerObj))\n        ) {\n          const currentObserver = elementObserverMap.get(source) || observer;\n          currentObserver.unobserve(source);\n          elementFirstRun.delete(source);\n        }\n\n        // we delete the handlers only when there is no running animation to cancel\n        // allowing remove to find the handler to cleanup ongoing animations\n        animation.onFinish(() => {\n          handlerMap.get(source)?.delete(handlerObj);\n          handlerMap.get(target)?.delete(handlerObj);\n        });\n\n        animation.play(() => {\n          const setEnterStart = () => {\n            target.dataset.interactEnter = 'start';\n          };\n\n          if (animation.isCSS) {\n            fastdom.mutate(() => {\n              requestAnimationFrame(setEnterStart);\n            });\n\n            const setEnterDone = () => {\n              fastdom.mutate(() => {\n                target.dataset.interactEnter = 'done';\n              });\n            };\n\n            animation.onFinish(setEnterDone);\n            animation.onAbort(setEnterDone);\n          } else {\n            fastdom.mutate(setEnterStart);\n          }\n        });\n      }\n    } else if (type === 'alternate') {\n      if (isInitialPlay && isIntersecting) {\n        isInitialPlay = false;\n        animation.play();\n      } else if (!isInitialPlay) {\n        animation.reverse();\n      }\n    } else if (type === 'repeat') {\n      if (isIntersecting) {\n        animation.progress(0);\n        animation.play();\n      } else if (isFullExit) {\n        animation.pause();\n        animation.progress(0);\n      }\n    } else if (type === 'state') {\n      if (isIntersecting) {\n        animation.play();\n      } else if (isFullExit) {\n        animation.pause();\n      }\n    }\n  };\n\n  const cleanup = () => {\n    const currentObserver = elementObserverMap.get(source) || observer;\n    currentObserver.unobserve(source);\n\n    if (type === 'repeat' || type === 'state') {\n      const exitObserver = getExitObserver();\n      exitObserver.unobserve(source);\n    }\n\n    animation.cancel();\n    elementFirstRun.delete(source);\n    elementObserverMap.delete(source);\n  };\n\n  handlerObj = { source, target, handler, cleanup };\n\n  addHandlerToMap(handlerMap, source, handlerObj);\n  addHandlerToMap(handlerMap, target, handlerObj);\n\n  elementObserverMap.set(source, observer);\n  observer.observe(source);\n\n  // For repeat and state types, set up a separate exit observer\n  // that watches when element is completely out of view\n  if (type === 'repeat' || type === 'state') {\n    const exitObserver = getExitObserver();\n    exitObserver.observe(source);\n  }\n}\n\nfunction removeViewEnterHandler(element: HTMLElement) {\n  removeElementFromHandlerMap(handlerMap, element);\n}\n\nfunction reset() {\n  sharedExitObserver = null;\n  Object.keys(observers).forEach((key) => delete observers[key]);\n}\n\nexport default {\n  add: addViewEnterHandler,\n  remove: removeViewEnterHandler,\n  setOptions,\n  reset,\n};\n","/**\n * Returns a new Object with the properties of the first argument\n * assigned to it, and the second argument as its prototype, so\n * its properties are served as defaults.\n *\n * @param {Object} obj properties to assign\n * @param {Object|null} defaults\n * @return {Object}\n */\nfunction defaultTo (obj, defaults) {\n  return Object.assign(Object.create(defaults), obj);\n}\n\n/**\n * Interpolate from a to b by the factor t.\n *\n * @param {number} a start point\n * @param {number} b end point\n * @param {number} t interpolation factor\n * @param {number} e minimal possible delta between result and start, and between result and end\n * @return {number}\n */\nfunction lerp (a, b, t, e) {\n  let res = a * (1 - t) + b * t;\n\n  if (e) {\n    const deltaFromStart = res - a;\n    if (Math.abs(deltaFromStart) < e) {\n      res = a + e * Math.sign(deltaFromStart);\n    }\n\n    const deltaFromEnd = b - res;\n\n    if (Math.abs(deltaFromEnd) < e) {\n      return b;\n    }\n  }\n\n  return res;\n}\n\n/**\n * Throttle a function to trigger once per animation frame.\n * Keeps the arguments from last call, even if that call gets ignored.\n *\n * @param {function} fn function to throttle\n * @return {(function(): void)}\n */\nfunction frameThrottle (fn) {\n  let throttled = false;\n\n  return function () {\n    if (!throttled) {\n      throttled = true;\n\n      window.requestAnimationFrame(() => {\n        throttled = false;\n        fn();\n      });\n    }\n  };\n}\n\n/**\n * Debounce a function by interval in milliseconds.\n *\n * @param {function} fn\n * @param {number} interval\n * @return {function}\n */\nfunction debounce (fn, interval) {\n  let debounced = 0;\n\n  return function bounce () {\n    if (debounced) {\n      window.clearTimeout(debounced);\n    }\n\n    debounced = window.setTimeout(() => {\n      debounced = 0;\n      fn();\n    }, interval);\n  };\n}\n\nexport {\n  defaultTo,\n  lerp,\n  frameThrottle,\n  debounce\n};\n","/**\n * parses offsetString of the format calc(<length> + <length>)\n * @param {string|undefined} offsetString\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n */\nfunction parseOffsetCalc(offsetString, absoluteOffsetContext) {\n  const match = offsetString.match(/^calc\\s*\\(\\s*(-?\\d+((px)|([lsd]?vh)|([lsd]?vw)))\\s*\\+\\s*(-?\\d+((px)|([lsd]?vh)|([lsd]?vw)))\\s*\\)\\s*$/);\n  return transformAbsoluteOffsetToNumber(match[1], absoluteOffsetContext) + transformAbsoluteOffsetToNumber(match[6], absoluteOffsetContext);\n}\n\n/**\n * Convert an absolute offset as string to number of pixels\n *\n * @param {string|undefined} offsetString\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @return {number}\n */\nfunction transformAbsoluteOffsetToNumber (offsetString, absoluteOffsetContext) {\n  return offsetString\n    ? /^-?\\d+px$/.test(offsetString)\n      ? parseInt(offsetString)\n      : /^-?\\d+[lsd]?vh$/.test(offsetString)\n        ? parseInt(offsetString) * absoluteOffsetContext.viewportHeight / 100\n        : /^-?\\d+[lsd]?vw$/.test(offsetString)\n          ? parseInt(offsetString) * absoluteOffsetContext.viewportWidth / 100\n          : /^calc\\s*\\(\\s*-?\\d+((px)|([lsd]?vh)|([lsd]?vw))\\s*\\+\\s*-?\\d+((px)|([lsd]?vh)|([lsd]?vw))\\s*\\)\\s*$/.test(offsetString)\n            ? parseOffsetCalc(offsetString, absoluteOffsetContext)\n            : parseInt(offsetString) || 0\n    : 0;\n}\n\n/**\n * Convert a range into offset in pixels.\n *\n * @param {{name: RangeName, offset: number}} range\n * @param {number} viewportSize\n * @param {{start: number, end: number}} rect\n * @return {number}\n */\nfunction transformRangeToPosition (range, viewportSize, rect) {\n  const { name, offset = 0 } = range;\n  const { start, end } = rect;\n  const height = end - start;\n  const percentage = offset / 100;\n\n  let startPosition, duration;\n\n  if (name === 'entry') {\n    startPosition = start - viewportSize;\n    duration = Math.min(viewportSize, height);\n  }\n  else if (name === 'entry-crossing') {\n    startPosition = start - viewportSize;\n    duration = height;\n  }\n  else if (name === 'contain') {\n    startPosition = Math.min(end - viewportSize, start);\n    // it's either VH - height OR height - VH; so it boils down to just the absolute value of that\n    duration = Math.abs(viewportSize - height);\n  }\n  else if (name === 'exit') {\n    startPosition = Math.max(start, end - viewportSize);\n    duration = Math.min(viewportSize, height);\n  }\n  else if (name === 'exit-crossing') {\n    startPosition = start;\n    duration = height;\n  }\n  else if (name === 'cover') {\n    startPosition = start - viewportSize;\n    duration = height + viewportSize;\n  }\n\n  return (startPosition + percentage * duration) | 0;\n}\n\nfunction computeStickinessIntoFullRange(offsetTree, absoluteStartOffset, absoluteEndOffset, viewportSize, isHorizontal) {\n  let accumulatedOffset = 0;\n  const newAbsoluteRange = {start: absoluteStartOffset, end: absoluteEndOffset}\n\n  /*\n   * loop from root down to subject\n   * check for sticky positioned elements in the tree and add stuck intervals if needed\n   */\n  offsetTree.forEach((node, index) => {\n    accumulatedOffset += node.offset;\n    const sticky = node.sticky;\n\n    if (sticky) {\n      if ('end' in sticky) {\n        const parent = offsetTree[index - 1]?.element;\n\n        if (parent) {\n          const elementSize = (isHorizontal ? node.element.offsetWidth : node.element.offsetHeight) || 0;\n          const offsetFromViewEnd = elementSize + sticky.end - viewportSize;\n          /*\n           * Sticky bottom:\n           * starts on the starting edge of element's parent - viewport size + element size + offset from bottom of view\n           * ends on the element's offset + offset from bottom of view\n           * duration is essentially element's offset\n           */\n          const stuckStart = accumulatedOffset + offsetFromViewEnd - node.offset;\n          // check if stuckStart is before the point of scroll where the timeline starts\n          const isBeforeStart = stuckStart < newAbsoluteRange.start;\n          // check if stuckStart is inside the timeline's active scroll interval\n          const isInsideDuration = !isBeforeStart && stuckStart <= absoluteEndOffset;\n\n          let extraOffset = 0;\n          if (isBeforeStart || isInsideDuration) {\n            extraOffset = node.offset;\n            newAbsoluteRange.end += extraOffset;\n          }\n\n          if (isBeforeStart) {\n            newAbsoluteRange.start += extraOffset;\n          }\n        }\n      }\n\n      if ('start' in sticky) {\n        // stuckStart is the amount needed to scroll to reach the stuck state\n        const stuckStart = accumulatedOffset - sticky.start;\n\n        // check if stuckStart is before the point of scroll where the timeline starts\n        const isBeforeStart = stuckStart < newAbsoluteRange.start;\n        // check if stuckStart is inside the timeline's active scroll interval\n        const isInsideDuration = !isBeforeStart && stuckStart <= newAbsoluteRange.end;\n\n        let extraOffset = 0;\n        const parent = offsetTree[index - 1]?.element;\n\n        if (parent) {\n          if (isBeforeStart || isInsideDuration) {\n            const parentSize = (isHorizontal ? parent.offsetWidth : parent.offsetHeight) || 0;\n            const elementOffset = node.offset;\n            const elementSize = (isHorizontal ? node.element.offsetWidth : node.element.offsetHeight) || 0;\n\n            extraOffset = parentSize - (elementOffset + elementSize);\n            accumulatedOffset += extraOffset;\n            newAbsoluteRange.end += extraOffset;\n          }\n\n          if (isBeforeStart) {\n            newAbsoluteRange.start += extraOffset;\n          }\n        }\n      }\n    }\n  });\n\n  return newAbsoluteRange;\n}\n\n/**\n * Convert scene data in ranges into offsets in pixels.\n *\n * @param {ScrollScene} scene\n * @param {{start: number, end: number}} rect\n * @param {number} viewportSize\n * @param {boolean} isHorizontal\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @param {Array<{element: HTMLElement, offset: number, sticky: {start?: number, end?: number}}>} offsetTree\n * @return {ScrollScene}\n */\nfunction transformSceneRangesToOffsets (scene, rect, viewportSize, isHorizontal, absoluteOffsetContext, offsetTree) {\n  const { start, end, duration } = scene;\n\n  let startOffset = start;\n  let endOffset = end;\n  let startRange = scene.startRange;\n  let endRange = scene.endRange;\n  let overrideDuration;\n\n  if (typeof duration === 'string') {\n    startRange = { name: duration, offset: 0 }\n    endRange = { name: duration, offset: 100 }\n\n    startOffset = transformRangeToPosition(startRange, viewportSize, rect);\n    endOffset = transformRangeToPosition(endRange, viewportSize, rect);\n    overrideDuration = endOffset - startOffset;\n\n    const newAbsoluteRange = computeStickinessIntoFullRange(offsetTree, startOffset, endOffset, viewportSize, isHorizontal);\n\n    startOffset = newAbsoluteRange.start;\n    endOffset = newAbsoluteRange.end;\n  }\n  else {\n    if (startRange || start?.name) {\n      startRange = startRange || start;\n\n      const startAdd = transformAbsoluteOffsetToNumber(startRange.add, absoluteOffsetContext);\n      const absoluteStartOffset = transformRangeToPosition({...startRange, offset: 0}, viewportSize, rect);\n      const absoluteEndOffset = transformRangeToPosition({...startRange, offset: 100}, viewportSize, rect);\n      // we take 0% to 100% of the named range for start, and we compute the position by adding the sticky addition for the given start offset\n      const newAbsoluteRange = computeStickinessIntoFullRange(offsetTree, absoluteStartOffset, absoluteEndOffset, viewportSize, isHorizontal);\n\n      startOffset = newAbsoluteRange.start + (startRange.offset / 100) * (newAbsoluteRange.end - newAbsoluteRange.start) + startAdd;\n    }\n\n    if (endRange || end?.name) {\n      endRange = endRange || end;\n\n      const endAdd = transformAbsoluteOffsetToNumber(endRange.add, absoluteOffsetContext);\n      const absoluteStartOffset = transformRangeToPosition({...endRange, offset: 0}, viewportSize, rect);\n      const absoluteEndOffset = transformRangeToPosition({...endRange, offset: 100}, viewportSize, rect);\n      // we take 0% to 100% of the named range for end, and we compute the position by adding the sticky addition for the given end offset\n      const newAbsoluteRange = computeStickinessIntoFullRange(offsetTree, absoluteStartOffset, absoluteEndOffset, viewportSize, isHorizontal);\n\n      endOffset = newAbsoluteRange.start + (endRange.offset / 100) * (newAbsoluteRange.end - newAbsoluteRange.start) + endAdd;\n    }\n    else if (typeof duration === 'number') {\n      endOffset = startOffset + duration;\n    }\n  }\n\n  if (!overrideDuration && !duration) {\n    overrideDuration = endOffset - startOffset;\n  }\n\n  return {...scene, start: startOffset, end: endOffset, startRange, endRange, duration: overrideDuration || duration };\n}\n\n/**\n * Check whether the position of an element is sticky.\n *\n * @param {CSSStyleDeclaration} style\n * @return {boolean}\n */\nfunction getIsSticky (style) {\n  return style.position === 'sticky';\n}\n\n/**\n * Check whether the position of an element is sticky.\n *\n * @param {CSSStyleDeclaration} style\n * @param {HTMLElement} offsetParent\n * @param {HTMLElement} root\n * @return {boolean}\n */\nfunction getIsFixed (style, offsetParent, root) {\n  return style.position === 'fixed' && (!offsetParent || offsetParent === window.document.body || offsetParent === root);\n}\n\n/**\n * Get start offset of an element in scroll direction.\n *\n * @param {CSSStyleDeclaration} style\n * @param {boolean} isHorizontal\n * @return {number}\n */\nfunction getStickyStartOffset (style, isHorizontal) {\n  return parseInt(isHorizontal ? style.left : style.top);\n}\n\n/**\n * Get end offset of an element in scroll direction.\n *\n * @param {CSSStyleDeclaration} style\n * @param {boolean} isHorizontal\n * @return {number}\n */\nfunction getStickyEndOffset (style, isHorizontal) {\n  return parseInt(isHorizontal ? style.right : style.bottom);\n}\n\n/**\n *\n * @param {HTMLElement} element\n * @param {boolean} isHorizontal\n * @param {boolean} isSticky\n * @return {number}\n */\nfunction getRectStart (element, isHorizontal, isSticky) {\n  // TODO: implement support for RTL writing-mode\n  if (isSticky) {\n    element.style.position = 'static';\n  }\n\n  const result = (isHorizontal ? element.offsetLeft : element.offsetTop) || 0;\n\n  if (isSticky) {\n    // assuming the sticky position came from a stylesheet and not set inline\n    element.style.position = null;\n  }\n\n  return result\n}\n\nfunction getStickyData (style, isHorizontal) {\n  let sticky;\n  const stickyStart = getStickyStartOffset(style, isHorizontal);\n  const stickyEnd = getStickyEndOffset(style, isHorizontal);\n  const hasStickyStart = !isNaN(stickyStart);\n  const hasStickyEnd = !isNaN(stickyEnd);\n\n  if (hasStickyStart || hasStickyEnd) {\n    sticky = {};\n\n    if (hasStickyStart) {\n      sticky.start = stickyStart;\n    }\n    if (hasStickyEnd) {\n      sticky.end = stickyEnd;\n    }\n  }\n\n  return sticky;\n}\n\n/**\n * Returns an array of converted scenes' data for grouped scenes (assumes same viewSource) from ranges into offsets in pixels.\n *\n * @param {ScrollScene[]} scenes\n * @param {Window|HTMLElement} root\n * @param {number} viewportSize\n * @param {boolean} isHorizontal\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @return {ScrollScene[]}\n */\nexport function getTransformedSceneGroup (scenes, root, viewportSize, isHorizontal, absoluteOffsetContext) {\n  const element = scenes[0].viewSource;\n  const offsetTree = [];\n  let size = (isHorizontal ? element.offsetWidth : element.offsetHeight) || 0;\n  let elementLayoutStart = 0;\n  let parent = element;\n\n  while (parent) {\n    const nodeStyle = window.getComputedStyle(parent);\n    const isSticky = getIsSticky(nodeStyle);\n    const sticky = isSticky ? getStickyData(nodeStyle, isHorizontal) : undefined;\n\n    // get the base offset of the source element - before adding sticky intervals\n    const offset = getRectStart(parent, isHorizontal, isSticky);\n\n    // if we have sticky end (bottom or right) ignore offset for this element because it will stick to its parent's start edge\n    if (!sticky || !('end' in sticky)) {\n      elementLayoutStart += offset;\n    }\n\n    offsetTree.push({element: parent, offset, sticky});\n\n    parent = parent.offsetParent;\n    const isFixed = getIsFixed(nodeStyle, parent, root);\n    if (isFixed) {\n      break;\n    } else if (parent === root) {\n      offsetTree.push({element: parent, offset: 0});\n      break;\n    }\n  }\n\n  offsetTree.reverse();\n\n  const transformedScenes = scenes.map(scene => ({\n    ...transformSceneRangesToOffsets(\n      scene,\n      {start: elementLayoutStart, end: elementLayoutStart + size},\n      viewportSize,\n      isHorizontal,\n      absoluteOffsetContext,\n      offsetTree\n    ),\n  }));\n\n  return transformedScenes;\n}\n\n/**\n * Returns a converted scene data from ranges into offsets in pixels.\n *\n * @param {ScrollScene} scene\n * @param {Window|HTMLElement} root\n * @param {number} viewportSize\n * @param {boolean} isHorizontal\n * @param {AbsoluteOffsetContext} absoluteOffsetContext\n * @return {ScrollScene}\n */\nexport function getTransformedScene (scene, root, viewportSize, isHorizontal, absoluteOffsetContext) {\n  return getTransformedSceneGroup([scene], root, viewportSize, isHorizontal, absoluteOffsetContext)[0];\n}\n\n","import { debounce, defaultTo } from './utilities.js';\nimport { getTransformedSceneGroup } from './view.js';\n\nconst VIEWPORT_RESIZE_INTERVAL = 100;\n\n/**\n * @private\n * @type {scrollConfig}\n */\nconst DEFAULTS = {\n  horizontal: false,\n  observeViewportEntry: true,\n  viewportRootMargin: '7% 7%',\n  observeViewportResize: false,\n  observeSourcesResize: false,\n  observeContentResize: false,\n};\n\n/*\n * Utilities for scroll controller\n */\n\n\n/**\n * Utility for calculating effect progress.\n *\n * @private\n * @param {number} p current scroll position\n * @param {number} start start position\n * @param {number} end end position\n * @param {number} duration duration of effect in scroll pixels\n * @return {number} effect progress, between 0 and 1\n */\nfunction calcProgress (p, start, end, duration) {\n  let progress = 0;\n\n  if (p >= start && p <= end) {\n    progress = duration ? (p - start) / duration : 1;\n  }\n  else if (p > end) {\n    progress = 1;\n  }\n\n  return progress;\n}\n\n/**\n *\n * @param {Window|HTMLElement} root\n * @param {boolean} isHorizontal\n * @return {number}\n */\nfunction getViewportSize (root, isHorizontal) {\n  if (root === window) {\n    return isHorizontal\n        ? window.document.documentElement.clientWidth\n        : window.document.documentElement.clientHeight;\n  }\n\n  return isHorizontal ? root.clientWidth : root.clientHeight;\n}\n\nfunction getAbsoluteOffsetContext () {\n  // TODO: re-calc on viewport resize\n  return {\n    viewportWidth: window.document.documentElement.clientWidth,\n    viewportHeight: window.document.documentElement.clientHeight\n  };\n}\n\n/*\n * Scroll controller factory\n */\n\n/**\n * Initialize and return a scroll controller.\n *\n * @private\n * @param {scrollConfig} config\n * @return {{tick: function, destroy: function}}\n */\nexport function getController (config) {\n  const _config = defaultTo(config, DEFAULTS);\n  const root = _config.root;\n  const horizontal = _config.horizontal;\n  const scenesByElement = new WeakMap();\n  let viewportSize = getViewportSize(root, horizontal);\n\n  let lastP;\n  let viewportObserver, rangesResizeObserver, viewportResizeHandler, scrollportResizeObserver;\n  const rangesToObserve = [];\n  const absoluteOffsetContext = getAbsoluteOffsetContext()\n\n  /*\n   * Prepare scenes data.\n   */\n  _config.scenes = Object.values(\n    // TODO(ameerf): find a polyfill and use groupBy instead of following reduce\n    config.scenes.reduce((acc, scene, index) => {\n      const key = scene.groupId ? `group-${scene.groupId}` : String(index);\n      if (acc[key]) {\n        acc[key].push(scene)\n      } else {\n        acc[key] = [scene];\n      }\n      return acc;\n    },\n    {})\n  ).flatMap(sceneGroup => {\n    if (sceneGroup.every(scene => (scene.viewSource && (typeof scene.duration === 'string' || scene.start?.name)))) {\n      sceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n      if (_config.observeSourcesResize || _config.observeContentResize) {\n        rangesToObserve.push(sceneGroup);\n      }\n    } else {\n      sceneGroup.forEach(scene => {\n        if (scene.end == null) {\n          scene.end = scene.start + scene.duration;\n        }\n        if (scene.duration == null) {\n          scene.duration = scene.end - scene.start;\n        }\n      });\n    }\n\n    return sceneGroup;\n  });\n  _config.scenes.forEach((scene, index) => {scene.index = index;});\n\n  if (rangesToObserve.length) {\n    const targetToSceneGroup = new Map();\n\n    if (window.ResizeObserver) {\n      /*\n       * Observe resize of view-timeline subjects.\n       */\n      rangesResizeObserver = new window.ResizeObserver(function (entries) {\n        entries.forEach(entry => {\n          const sceneGroup = targetToSceneGroup.get(entry.target);\n          // TODO: try to optimize by using `const {blockSize, inlineSize} = entry.borderBoxSize[0]`\n          const transformedSceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n          transformedSceneGroup.forEach((scene, localIndex) => {_config.scenes[scene.index] = transformedSceneGroup[localIndex];});\n          // replace the old object from the cache with the new one\n          rangesToObserve.splice(rangesToObserve.indexOf(sceneGroup), 1, transformedSceneGroup);\n        });\n      });\n\n      rangesToObserve.forEach(sceneGroup => {\n        rangesResizeObserver.observe(sceneGroup[0].viewSource, {box: 'border-box'});\n        targetToSceneGroup.set(sceneGroup[0].viewSource, sceneGroup);\n      });\n\n      /*\n       * Observe resize of content root.\n       */\n      if (_config.observeContentResize && _config.contentRoot) {\n        const contentResizeObserver = new window.ResizeObserver(debounce(() => {\n          const newRanges = rangesToObserve.map(sceneGroup => {\n            const newSceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n            newSceneGroup.forEach((scene, localIndex) => {_config.scenes[scene.index] = newSceneGroup[localIndex];});\n\n            return newSceneGroup;\n          });\n\n          // reset cache\n          rangesToObserve.length = 0;\n          rangesToObserve.push(...newRanges);\n          rangesToObserve.forEach(sceneGroup => {\n            targetToSceneGroup.set(sceneGroup[0].viewSource, sceneGroup);\n          });\n        }, VIEWPORT_RESIZE_INTERVAL));\n\n        contentResizeObserver.observe(_config.contentRoot, {box: 'border-box'});\n      }\n    }\n\n    if (_config.observeViewportResize) {\n      viewportResizeHandler = debounce(function () {\n        viewportSize = getViewportSize(root, horizontal);\n\n        const newRanges = rangesToObserve.map(sceneGroup => {\n          const newSceneGroup = getTransformedSceneGroup(sceneGroup, root, viewportSize, horizontal, absoluteOffsetContext);\n          newSceneGroup.forEach((scene, localIndex) => {_config.scenes[scene.index] = newSceneGroup[localIndex];});\n\n          return newSceneGroup;\n        });\n\n        // reset cache\n        rangesToObserve.length = 0;\n        rangesToObserve.push(...newRanges);\n        rangesToObserve.forEach(sceneGroup => {\n          targetToSceneGroup.set(sceneGroup[0].viewSource, sceneGroup);\n        });\n      }, VIEWPORT_RESIZE_INTERVAL);\n\n      if (root === window) {\n        window.addEventListener('resize', viewportResizeHandler);\n      }\n      else if (window.ResizeObserver) {\n        scrollportResizeObserver = new window.ResizeObserver(viewportResizeHandler);\n        scrollportResizeObserver.observe(root, {box: 'border-box'});\n      }\n    }\n  }\n\n  /*\n   * Observe entry and exit of scenes into view\n   */\n  if (_config.observeViewportEntry && window.IntersectionObserver) {\n    viewportObserver = new window.IntersectionObserver(function (intersections) {\n      intersections.forEach(intersection => {\n        (scenesByElement.get(intersection.target) || []).forEach(scene => {\n          scene.disabled = !intersection.isIntersecting;\n        });\n      });\n    }, {\n      root: root === window ? window.document : root,\n      rootMargin: _config.viewportRootMargin,\n      threshold: 0\n    });\n\n    _config.scenes.forEach(scene => {\n      if (scene.viewSource) {\n        let scenesArray = scenesByElement.get(scene.viewSource);\n\n        if (!scenesArray) {\n          scenesArray = [];\n          scenesByElement.set(scene.viewSource, scenesArray);\n\n          viewportObserver.observe(scene.viewSource);\n        }\n\n        scenesArray.push(scene);\n      }\n    });\n  }\n\n  /**\n   * Updates progress in all scene effects.\n   *\n   * @private\n   * @param {Object} progress\n   * @param {number} progress.p\n   * @param {number} progress.vp\n   */\n  function tick ({p, vp}) {\n    p = +p.toFixed(1);\n\n    const velocity = +vp.toFixed(4);\n\n    // if nothing changed bail out\n    if (p === lastP) return;\n\n    /*\n     * Perform scene progression.\n     */\n    for (let scene of _config.scenes) {\n      // if active\n      if (!scene.disabled) {\n        const {start, end, duration} = scene;\n        // calculate scene's progress\n        const progress = calcProgress(p, start, end, duration);\n\n        // run effect\n        scene.effect(scene, progress, velocity);\n      }\n    }\n\n    // cache last position\n    lastP = p;\n  }\n\n  /**\n   * Removes all side effects and deletes all objects.\n   */\n  function destroy () {\n    _config.scenes.forEach(scene => scene.destroy?.());\n\n    if (viewportObserver) {\n      viewportObserver.disconnect();\n      viewportObserver = null;\n    }\n\n    if (rangesResizeObserver) {\n      rangesResizeObserver.disconnect();\n      rangesResizeObserver = null;\n    }\n\n    if (viewportResizeHandler) {\n      if (scrollportResizeObserver) {\n        scrollportResizeObserver.disconnect();\n        scrollportResizeObserver = null;\n      }\n      else {\n        window.removeEventListener('resize', viewportResizeHandler);\n      }\n    }\n  }\n\n  /**\n   * Scroll controller.\n   */\n  return {\n    tick,\n    destroy\n  };\n}\n","import { getController } from './controller.js';\nimport { defaultTo, frameThrottle, lerp } from './utilities.js';\n\n/**\n * @private\n */\nconst DEFAULTS = {\n  transitionActive: false,\n  transitionFriction: 0.9,\n  transitionEpsilon: 1,\n  velocityActive: false,\n  velocityMax: 1\n};\n\n/**\n * @class Scroll\n * @param {scrollConfig} config\n *\n * @example\n * import { Scroll } from 'fizban';\n *\n * const scroll = new Scroll({\n *     scenes: [...]\n * });\n * scroll.start();\n */\nexport class Scroll {\n  constructor (config = {}) {\n    this.config = defaultTo(config, DEFAULTS);\n\n    this.progress = {\n      p: 0,\n      prevP: 0,\n      vp: 0\n    };\n    this.currentProgress = {\n      p: 0,\n      prevP: 0,\n      vp: 0\n    };\n\n    this._lerpFrameId = 0;\n    this.effect = null;\n    const isDocumentRoot = (!this.config.root || this.config.root === window.document.body);\n    // if no root or root is document.body then use window\n    this.config.root = isDocumentRoot ? window : this.config.root;\n    this.config.contentRoot = this.config.contentRoot || (isDocumentRoot ? window.document.body : this.config.root.firstElementChild);\n    this.config.resetProgress = this.config.resetProgress || this.resetProgress.bind(this);\n\n    this._measure = this.config.measure || (() => {\n      const root = this.config.root;\n      // get current scroll position from window or element\n      this.progress.p = this.config.horizontal\n        ? root.scrollX || root.scrollLeft || 0\n        : root.scrollY || root.scrollTop || 0;\n    });\n\n    this._trigger = frameThrottle(() => {\n      this._measure?.();\n      this.tick(true);\n    });\n  }\n\n  /**\n   * Setup event and effect, and reset progress and frame.\n   */\n  start () {\n    this.setupEffect();\n    this.setupEvent();\n    this.resetProgress();\n    this.tick();\n  }\n\n  /**\n   * Removes event listener.\n   */\n  pause () {\n    this.removeEvent();\n  }\n\n  /**\n   * Reset progress in the DOM and inner state to given x and y.\n   *\n   * @param {Object} [scrollPosition]\n   * @param {number} [scrollPosition.x]\n   * @param {number} [scrollPosition.y]\n   */\n  resetProgress (scrollPosition = {}) {\n    // get current scroll position (support window, element)\n    const root = this.config.root;\n    const x = scrollPosition.x || scrollPosition.x === 0 ? scrollPosition.x : root.scrollX || root.scrollLeft || 0;\n    const y = scrollPosition.y || scrollPosition.y === 0 ? scrollPosition.y : root.scrollY || root.scrollTop || 0;\n    const p = this.config.horizontal ? x : y;\n    this.progress.p = p;\n    this.progress.prevP = p;\n    this.progress.vp = 0;\n\n    if ( this.config.transitionActive ) {\n      this.currentProgress.p = p;\n      this.currentProgress.prevP = p;\n      this.currentProgress.vp = 0;\n    }\n\n    if (scrollPosition) {\n      this.config.root.scrollTo(x, y);\n    }\n  }\n\n  /**\n   * Handle animation frame work.\n   *\n   * @param {boolean} [clearLerpFrame] whether to cancel an existing lerp frame\n   */\n  tick (clearLerpFrame) {\n    const hasLerp = this.config.transitionActive;\n\n    // if transition is active interpolate to next point\n    if (hasLerp) {\n      this.lerp();\n    }\n\n    // choose the object we iterate on\n    const progress = hasLerp ? this.currentProgress : this.progress;\n\n    if (this.config.velocityActive) {\n      const dp = progress.p - progress.prevP;\n      const factorP = dp < 0 ? -1 : 1;\n      progress.vp = Math.min(this.config.velocityMax, Math.abs(dp)) / this.config.velocityMax * factorP;\n    }\n\n    // update effect\n    this.effect.tick(progress);\n\n    if (hasLerp && (progress.p !== this.progress.p)) {\n      if (clearLerpFrame && this._lerpFrameId) {\n        window.cancelAnimationFrame(this._lerpFrameId);\n      }\n\n      this._lerpFrameId = window.requestAnimationFrame(() => this.tick());\n    }\n\n    progress.prevP = progress.p;\n  }\n\n  /**\n   * Calculate current progress.\n   */\n  lerp () {\n    this.currentProgress.p = lerp(this.currentProgress.p, this.progress.p, +(1 - this.config.transitionFriction).toFixed(3), this.config.transitionEpsilon);\n  }\n\n  /**\n   * Stop the event and effect, and remove all DOM side-effects.\n   */\n  destroy () {\n    this.pause();\n    this.removeEffect();\n  }\n\n  /**\n   * Register to scroll for triggering update.\n   */\n  setupEvent () {\n    this.removeEvent();\n    this.config.root.addEventListener('scroll', this._trigger);\n  }\n\n  /**\n   * Remove scroll handler.\n   */\n  removeEvent () {\n    this.config.root.removeEventListener('scroll', this._trigger);\n  }\n\n  /**\n   * Reset registered effect.\n   */\n  setupEffect () {\n    this.removeEffect();\n    this.effect = getController(this.config);\n  }\n\n  /**\n   * Remove registered effect.\n   */\n  removeEffect () {\n    this.effect && this.effect.destroy();\n    this.effect = null;\n  }\n}\n\n/**\n * @typedef {object} scrollConfig\n * @property {ScrollScene[]} scenes list of effect scenes to perform during scroll.\n * @property {boolean} [horizontal] whether to use the horizontal axis. Defaults to `false`.\n * @property {boolean} [transitionActive] whether to animate effect progress.\n * @property {number} [transitionFriction] between 0 to 1, amount of friction effect in the transition. 1 being no movement and 0 as no friction. Defaults to 0.4.\n * @property {boolean} [velocityActive] whether to calculate velocity with progress.\n * @property {number} [velocityMax] max possible value for velocity. Velocity value will be normalized according to this number, so it is kept between 0 and 1. Defaults to 1.\n * @property {boolean} [observeViewportEntry] whether to observe entry/exit of scenes into viewport for disabling/enabling them. Defaults to `true`.\n * @property {boolean} [viewportRootMargin] `rootMargin` option to be used for viewport observation. Defaults to `'7% 7%'`.\n * @property {boolean} [observeViewportResize] whether to observe resize of the layout viewport. Defaults to `false`.\n * @property {boolean} [observeSourcesResize] whether to observe resize of view-timeline source elements. Defaults to `false`.\n * @property {boolean} [observeContentResize] whether to observe resize of content root of the scroll container. Defaults to `false`.\n * @property {Element|Window} [root] the scrollable element, defaults to window.\n * @property {Element} [contentRoot] the root element for the content, defaults to first child of root or body element.\n */\n\n/**\n * @typedef {Object} ScrollScene\n * @desc A configuration object for a scene. Must be provided an effect function, and either a start and end, a start and duration, or a duration as RangeName.\n * @example { effects: (scene, p) => { animation.currentTime = p; }, duration: 'contain' }\n * @property {EffectCallback} effect the effect to perform.\n * @property {number|RangeOffset} start scroll position in pixels where effect starts.\n * @property {number|RangeName} [duration] duration of effect in pixels. Defaults to end - start.\n * @property {number|RangeOffset} [end] scroll position in pixels where effect ends. Defaults to start + duration.\n * @property {boolean} [disabled] whether to perform updates on the scene. Defaults to false.\n * @property {Element} [viewSource] an element to be used for observing intersection with viewport for disabling/enabling the scene, or the source of a ViewTimeline if scene start/end are provided as ranges.\n * @property {function} [destroy] a function clean up the scene when it's controller is destroyed.\n * @property {string} [groupId] a string id for a group of scenes sharing same viewSource and part of the same overall animation\n */\n\n/**\n * @typedef {function(scene: ScrollScene, progress: number, velocity: number): void} EffectCallback\n * @param {ScrollScene} scene\n * @param {number} progress\n * @param {number} velocity\n */\n\n/**\n * @typedef {'entry' | 'contain' | 'exit' | 'cover' | 'entry-crossing' | 'exit-crossing'} RangeName\n */\n\n/**\n * @typedef {Object} RangeOffset\n * @property {RangeName} name\n * @property {number} offset\n * @property {CSSUnitValue} [add]\n */\n\n/**\n * @typedef {Object} CSSUnitValue\n * @property {number} value\n * @property {'px'|'vh'|'vw'} unit\n */\n\n/**\n * @typedef {Object} AbsoluteOffsetContext\n * @property {number} viewportWidth\n * @property {number} viewportHeight\n */\n","import type { AnimationGroup, ScrubScrollScene } from '@wix/motion';\nimport { getAnimation, getScrubScene } from '@wix/motion';\nimport { Scroll } from 'fizban';\nimport type { ViewEnterParams, ScrubEffect, HandlerObjectMap, InteractOptions } from '../types';\nimport {\n  effectToAnimationOptions,\n  addHandlerToMap,\n  removeElementFromHandlerMap,\n} from './utilities';\n\nconst scrollManagerMap = new WeakMap() as HandlerObjectMap;\nlet scrollOptionsGetter: () => Partial<scrollConfig> = () => ({});\n\nfunction registerOptionsGetter(getter: () => Partial<scrollConfig>) {\n  scrollOptionsGetter = getter;\n}\n\nfunction addViewProgressHandler(\n  source: HTMLElement,\n  target: HTMLElement,\n  effect: ScrubEffect,\n  __: ViewEnterParams,\n  { reducedMotion, selectorCondition }: InteractOptions,\n): void {\n  if (reducedMotion) {\n    return;\n  }\n\n  if (selectorCondition && !target.matches(selectorCondition)) return;\n\n  const triggerParams = {\n    trigger: 'view-progress' as const,\n    element: source,\n  };\n\n  const effectOptions = effectToAnimationOptions(effect);\n  let cleanup;\n  if ('ViewTimeline' in window) {\n    // Use ViewTimeline for modern browsers\n    const animationGroup = getAnimation(\n      target,\n      effectOptions,\n      triggerParams,\n    ) as AnimationGroup | null;\n\n    if (animationGroup && !animationGroup.isCSS) {\n      animationGroup.play();\n\n      cleanup = () => {\n        (animationGroup as AnimationGroup).ready.then(() => {\n          animationGroup.cancel();\n        });\n      };\n    }\n  } else {\n    const scene = getScrubScene(target, effectOptions, triggerParams);\n\n    if (scene) {\n      const scenes = Array.isArray(scene) ? scene : [scene];\n      const scroll = new Scroll({\n        viewSource: source,\n        scenes,\n        observeViewportEntry: false,\n        observeViewportResize: false,\n        observeSourcesResize: true,\n        root: document.body,\n        ...scrollOptionsGetter(),\n      });\n\n      cleanup = () => {\n        scroll.destroy();\n      };\n\n      Promise.all((scenes as ScrubScrollScene[]).map((s) => s.ready || Promise.resolve())).then(\n        () => {\n          scroll.start();\n        },\n      );\n    }\n  }\n\n  if (!cleanup) return;\n\n  const handlerObj = { source, target, cleanup };\n\n  addHandlerToMap(scrollManagerMap, source, handlerObj);\n  addHandlerToMap(scrollManagerMap, target, handlerObj);\n}\n\nfunction removeViewProgressHandler(element: HTMLElement): void {\n  removeElementFromHandlerMap(scrollManagerMap, element);\n}\n\nexport default {\n  add: addViewProgressHandler,\n  remove: removeViewProgressHandler,\n  registerOptionsGetter,\n};\n","/**\n * Clamps a value between limits.\n *\n * @private\n * @param {number} min lower limit\n * @param {number} max upper limit\n * @param {number} value value to clamp\n * @return {number} clamped value\n *\n * @example\n * const x = clamp(0, 1, 1.5); // returns 1\n */\nfunction clamp (min, max, value) {\n  return Math.min(Math.max(min, value), max);\n}\n\n/**\n * Throttle a function to trigger once per animation frame.\n * Keeps the arguments from last call, even if that call gets ignored.\n *\n * @private\n * @param {function} fn function to throttle\n * @return {(function(): number)} a function that will trigger the throttled function on next animation frame,\n * returns the requestAnimationFrame id, so it can be cancelled\n */\nfunction frameThrottle (fn) {\n  let throttled = false;\n\n  return function () {\n    if (!throttled) {\n      throttled = true;\n\n      return window.requestAnimationFrame(() => {\n        throttled = false;\n        fn();\n      });\n    }\n  };\n}\n\n/**\n * Returns an object containing the layout properties (left, top, width, and height) of the given element.\n *\n * @private\n * @param {HTMLElement} element\n * @returns {{top: number, left: number, width: number, height: number}}\n */\nfunction getRect (element) {\n  let el = element;\n  let left = 0;\n  let top = 0;\n\n  if (el.offsetParent) {\n    do {\n      left += el.offsetLeft;\n      top += el.offsetTop;\n      el = el.offsetParent;\n    } while (el);\n  }\n\n  return {\n    left,\n    top,\n    width: element.offsetWidth,\n    height: element.offsetHeight\n  };\n}\n\n/**\n * @see https://issues.chromium.org/issues/40887601?pli=1\n */\nfunction testPointerOffsetDprBug () {\n  const DPR = window.devicePixelRatio;\n  let fixRequired = false;\n\n  if (DPR === 1) {\n    // we can immediately return here, not required to fix\n    return false;\n  }\n\n  document.body.addEventListener('pointerdown', (e) => {\n    fixRequired = e.offsetX !== 10;\n  }, { once: true });\n\n  const event = new PointerEvent('pointerdown', {\n    clientX: 10\n  });\n\n  document.body.dispatchEvent(event);\n\n  return fixRequired;\n}\n\nfunction testPointerOffsetScrollBug () {\n  return new Promise((resolve) => {\n    const startY = window.scrollY;\n    let fixRequired = false;\n    let currentY;\n\n    function sampleOffsetY () {\n      document.body.addEventListener('pointerdown', (e) => {\n        if (currentY === undefined) {\n          currentY = e.offsetY;\n        } else {\n          // when dispatching on BODY in different scroll it gives the same offsetY value only on WebKit\n          fixRequired = e.offsetY === currentY;\n        }\n      }, { once: true });\n\n      const event = new PointerEvent('pointerdown', {\n        clientY: 500\n      });\n\n      document.body.dispatchEvent(event);\n    }\n\n    function scrollHandler () {\n      if (window.scrollY !== startY) {\n        window.removeEventListener('scroll', scrollHandler);\n        sampleOffsetY();\n        resolve(fixRequired);\n      }\n    }\n\n    sampleOffsetY();\n\n    window.addEventListener('scroll', scrollHandler);\n\n    if (window.scrollY > 0) {\n      window.scrollBy(0, -1);\n    }\n  });\n}\n\n/**\n * @see https://bugs.webkit.org/show_bug.cgi?id=287799\n */\nfunction testScrollOffsetsForWebKitPointerBug (scrollOffsets) {\n  testPointerOffsetScrollBug().then((fixRequired) => {\n    scrollOffsets.fixRequired = fixRequired;\n\n    if (fixRequired) {\n      window.addEventListener('scroll', scrollOffsets.scrollHandler);\n      scrollOffsets.scrollHandler();\n    }\n  });\n}\n\nexport {\n  getRect,\n  clamp,\n  frameThrottle,\n  testPointerOffsetDprBug,\n  testScrollOffsetsForWebKitPointerBug\n};\n","let listeners = 0;\nconst pointers = new Set();\n\nfunction initScrollendPolyfill () {\n  const touchStartHandler = e => {\n    for (let touch of e.changedTouches) {\n      pointers.add(touch.identifier);\n    }\n  };\n  const touchEndHandler = e => {\n    for (let touch of e.changedTouches) {\n      pointers.delete(touch.identifier);\n    }\n  };\n  // Track if any pointer is active\n  document.addEventListener('touchstart', touchStartHandler, {passive: true});\n  document.addEventListener('touchend', touchEndHandler, {passive: true});\n\n  return function () {\n    pointers.clear();\n    document.removeEventListener('touchstart', touchStartHandler);\n    document.removeEventListener('touchend', touchEndHandler);\n  };\n}\n\nexport function addScrollendListener (target, listener) {\n  if ('onscrollend' in window) {\n    target.addEventListener('scrollend', listener);\n\n    return function () {\n      target.removeEventListener('scrollend', listener);\n    };\n  }\n\n  let timeout = 0;\n  let removeScrollendPolyfill;\n\n  if (!listeners) {\n    removeScrollendPolyfill = initScrollendPolyfill();\n  }\n\n  listeners += 1;\n\n  function scrollListener (evt) {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => {\n      if (pointers.size) {\n        // if pointer(s) are down, wait longer\n        setTimeout(scrollListener, 100);\n      }\n      else {\n        // dispatch\n        listener(evt);\n        timeout = 0;\n      }\n    }, 100);\n  }\n\n  target.addEventListener('scroll', scrollListener);\n\n  return function () {\n    target.removeEventListener('scroll', scrollListener);\n    listeners -= 1;\n\n    if (!listeners) {\n      removeScrollendPolyfill();\n    }\n  };\n}\n","import { getRect, clamp } from './utilities.js';\nimport { addScrollendListener } from './scrollend.js';\n\n/**\n * Return new progress for {x, y} for the farthest-side formula (\"cover\").\n *\n * @param {Object} target\n * @param {number} target.left\n * @param {number} target.top\n * @param {number} target.width\n * @param {number} target.height\n * @param {Object} root\n * @param {number} root.width\n * @param {number} root.height\n * @param {{x: number, y: number}} scrollPosition\n * @returns {{x: (x: number) => number, y: (y: number) => number}}\n */\nfunction centerToTargetFactory (target, root, scrollPosition) {\n  // we store reference to the arguments and do all calculation on the fly\n  // so that target dims, scroll position, and root dims are always up-to-date\n  return {\n    x (x1) {\n      const layerCenterX = target.left - scrollPosition.x + target.width / 2;\n      const isXStartFarthest = layerCenterX >= root.width / 2;\n\n      const xDuration = (isXStartFarthest ? layerCenterX : root.width - layerCenterX) * 2;\n      const x0 = isXStartFarthest ? 0 : layerCenterX - xDuration / 2;\n\n      return (x1 - x0) / xDuration;\n    },\n    y (y1) {\n      const layerCenterY = target.top - scrollPosition.y + target.height / 2;\n      const isYStartFarthest = layerCenterY >= root.height / 2;\n\n      const yDuration = (isYStartFarthest ? layerCenterY : root.height - layerCenterY) * 2;\n      const y0 = isYStartFarthest ? 0 : layerCenterY - yDuration / 2;\n\n      return (y1 - y0) / yDuration;\n    }\n  };\n}\n\n/**\n * Updates scroll position on scrollend.\n * Used when root is entire viewport and centeredOnTarget=true.\n */\nfunction scrollendCallback (tick, lastProgress) {\n  this.x = window.scrollX;\n  this.y = window.scrollY;\n\n  requestAnimationFrame(() => tick && tick(lastProgress));\n}\n\n/**\n * Update root rect when root is entire viewport.\n *\n * @param {PointerConfig} config\n */\nfunction windowResize (config) {\n  config.rect.width = window.document.documentElement.clientWidth;\n  config.rect.height = window.document.documentElement.clientHeight;\n}\n\n/**\n * Observe and update root rect when root is an element.\n *\n * @param {PointerConfig} config\n * @returns {ResizeObserver}\n */\nfunction observeRootResize (config) {\n  const observer = new ResizeObserver((entries) => {\n    entries.forEach((entry) => {\n      config.rect.width = entry.borderBoxSize[0].inlineSize;\n      config.rect.height = entry.borderBoxSize[0].blockSize;\n    });\n  });\n\n  observer.observe(config.root, { box: 'border-box' });\n\n  return observer;\n}\n\n/**\n * Initialize and return a pointer controller.\n *\n * @private\n * @param {PointerConfig} config\n * @return {{tick: function, destroy: function}}\n */\nexport function getController (config) {\n  let hasCenteredToTarget = false;\n  let lastProgress = {x: config.rect.width / 2, y: config.rect.height / 2, vx: 0, vy: 0};\n  let tick, resizeObserver, windowResizeHandler, scrollendHandler, removeScrollendListener;\n\n  const scrollPosition = {x: 0, y: 0};\n\n  /*\n   * Prepare scenes data.\n   */\n  config.scenes.forEach((scene) => {\n    if (scene.target && scene.centeredToTarget) {\n      scene.transform = centerToTargetFactory(getRect(scene.target), config.rect, scrollPosition);\n\n      hasCenteredToTarget = true;\n    }\n\n    if (config.root) {\n      resizeObserver = observeRootResize(config);\n    }\n    else {\n      windowResizeHandler = windowResize.bind(null, config);\n      window.addEventListener('resize', windowResizeHandler);\n    }\n  });\n\n  /**\n   * Updates progress in all scene effects.\n   *\n   * @private\n   * @param {Object} progress\n   * @param {number} progress.x\n   * @param {number} progress.y\n   * @param {number} progress.vx\n   * @param {number} progress.vy\n   */\n  tick = function (progress) {\n    for (let scene of config.scenes) {\n      if (!scene.disabled) {\n        // get scene's progress\n        const normalizedX = scene.transform?.x(progress.x) || progress.x / config.rect.width;\n        const normalizedY = scene.transform?.y(progress.y) || progress.y / config.rect.height;\n\n        const x = +clamp(0, 1, normalizedX).toPrecision(4);\n        const y = +clamp(0, 1, normalizedY).toPrecision(4);\n\n        const velocity = {x: progress.vx, y: progress.vy};\n\n        if (config.allowActiveEvent) {\n          progress.active = (normalizedX <= 1 && normalizedY <= 1 && normalizedX >= 0 && normalizedY >= 0);\n        }\n\n        // run effect\n        scene.effect(scene, {x, y}, velocity, progress.active);\n      }\n    }\n\n    Object.assign(lastProgress, progress);\n  }\n\n  if (hasCenteredToTarget) {\n    scrollendHandler = scrollendCallback.bind(scrollPosition, tick, lastProgress)\n    removeScrollendListener = addScrollendListener(document, scrollendHandler);\n  }\n\n  /**\n   * Removes all side effects and deletes all objects.\n   */\n  function destroy () {\n    config.scenes.forEach(scene => scene.destroy?.());\n\n    removeScrollendListener?.();\n\n    if (resizeObserver) {\n      resizeObserver.disconnect();\n      resizeObserver = null;\n    }\n    else {\n      window.removeEventListener('resize', windowResizeHandler);\n      windowResizeHandler = null;\n    }\n\n    tick = null;\n    lastProgress = null;\n  }\n\n  /**\n   * Mouse controller.\n   */\n  return {\n    tick,\n    destroy\n  };\n}\n","import { getController } from './controller.js';\nimport { frameThrottle, testPointerOffsetDprBug, testScrollOffsetsForWebKitPointerBug } from './utilities.js';\n\nconst MOVEMENT_RESET_DELAY = 1e3 / 60 * 3; // == 50 (3 frames in 60fps)\nlet shouldFixSynthPointer;\n\nfunction scrollHandler () {\n  scrollOffsets.x = window.scrollX;\n  scrollOffsets.y = window.scrollY;\n}\nconst scrollOffsets = { x: 0, y: 0, scrollHandler, fixRequired: undefined };\n\n/**\n * @class Pointer\n * @param {PointerConfig} config\n *\n * @example\n * import { Pointer } from 'kuliso';\n *\n * const pointer = new Pointer({\n *     scenes: [...]\n * });\n *\n * pointer.start();\n */\nexport class Pointer {\n  constructor (config = {}) {\n    this.config = { ...config };\n\n    this.effect = null;\n    this._nextTick = null;\n    this._nextTransitionTick = null;\n    this._startTime = 0;\n\n    let trigger;\n\n    if (this.config.transitionDuration) {\n      trigger = this.config.noThrottle\n        ? () => this.transition()\n        : frameThrottle(() => this.transition());\n    }\n    else {\n      trigger = this.config.noThrottle\n        ? () => {\n          this.tick();\n          return null;\n        }\n        : frameThrottle(() => {\n          this.tick();\n        });\n    }\n\n    // in no root then use the viewport's size\n    this.config.rect = this.config.root\n      ? {\n        width: this.config.root.offsetWidth,\n        height: this.config.root.offsetHeight\n      }\n      : {\n        width: window.document.documentElement.clientWidth,\n        height: window.document.documentElement.clientHeight\n      };\n\n\n    this.progress = {\n      x: this.config.rect.width / 2,\n      y: this.config.rect.height / 2,\n      vx: 0,\n      vy: 0\n    };\n    this.previousProgress = { ...this.progress };\n    this.currentProgress = null;\n\n    const _measure = (event) => {\n      const newX = this.config.root ? event.offsetX : event.x;\n      const newY = this.config.root ? event.offsetY : event.y;\n      this.progress.vx = newX - this.progress.x;\n      this.progress.vy = newY - this.progress.y;\n      this.progress.x = newX;\n      this.progress.y = newY;\n      this._nextTick = trigger();\n    };\n\n    this._pointerLeave = () => {\n        this.progress.active = false;\n        this.progress.vx = 0;\n        this.progress.vy = 0;\n        this._nextTick = trigger();\n    };\n\n    this._pointerEnter = () => {\n      this.progress.active = true;\n      this._nextTick = trigger();\n    };\n\n    if (this.config.root) {\n      shouldFixSynthPointer = typeof shouldFixSynthPointer === 'boolean' ? shouldFixSynthPointer : testPointerOffsetDprBug();\n      const DPR = shouldFixSynthPointer ? window.devicePixelRatio : 1;\n\n      if (typeof scrollOffsets.fixRequired === 'undefined') {\n        testScrollOffsetsForWebKitPointerBug(scrollOffsets);\n      }\n\n      this._measure = (e) => {\n        if (e.target !== this.config.root) {\n          const event = new PointerEvent('pointermove', {\n            bubbles: true,\n            cancelable: true,\n            clientX: e.x * DPR + scrollOffsets.x,\n            clientY: e.y * DPR + scrollOffsets.y,\n          });\n\n          e.stopPropagation();\n\n          this.config.root.dispatchEvent(event);\n        } else {\n          _measure(e);\n        }\n      }\n    } else {\n      this._measure = _measure;\n    }\n  }\n\n  /**\n   * Setup event and effect, and reset progress and frame.\n   */\n  start () {\n    this.setupEffect();\n    this.setupEvent();\n  }\n\n  /**\n   * Removes event listener.\n   */\n  pause () {\n    this.removeEvent();\n  }\n\n  /**\n   * Handle animation frame work.\n   */\n  tick () {\n    this.effect.tick(this.progress);\n  }\n\n  /**\n   * Starts a transition from the previous progress to the current progress.\n   *\n   * @returns {number} the requestAnimationFrame id for the transition tick.\n   */\n  transition () {\n    const duration = this.config.transitionDuration;\n    const easing = this.config.transitionEasing || ((p) => p);\n    const now = performance.now();\n    let resetMovement = false;\n\n    const tick = (time) => {\n      const p = (time - this._startTime) / duration;\n      const t = easing(Math.min(1, p));\n\n      if (resetMovement) {\n        this.progress.vx = 0;\n        this.progress.vy = 0;\n        resetMovement = false;\n      }\n\n      this.currentProgress = Object.entries(this.progress).reduce((acc, [key, value]) => {\n        if (key === 'active') {\n          acc[key] = value;\n        } else {\n          acc[key] = this.previousProgress[key] + (value - this.previousProgress[key]) * t;\n        }\n        return acc;\n      }, this.currentProgress || {});\n\n      if (p < 1) {\n        this._nextTransitionTick = requestAnimationFrame(tick);\n\n        // reset movement on next frame\n        resetMovement = time - this._startTime > MOVEMENT_RESET_DELAY;\n      }\n\n      this.effect.tick(this.currentProgress);\n    };\n\n    if (this._startTime) {\n      this._nextTransitionTick && cancelAnimationFrame(this._nextTransitionTick);\n\n      Object.assign(this.previousProgress, this.currentProgress);\n\n      this._startTime = now;\n\n      tick(now);\n    } else {\n      this._startTime = now;\n    }\n\n    return this._nextTransitionTick;\n  }\n\n  /**\n   * Stop the event and effect, and remove all DOM side effects.\n   */\n  destroy () {\n    this.pause();\n    this.removeEffect();\n    this._nextTick && cancelAnimationFrame(this._nextTick);\n    this._nextTransitionTick && cancelAnimationFrame(this._nextTransitionTick);\n  }\n\n  /**\n   * Register to pointermove for triggering update.\n   */\n  setupEvent () {\n    this.removeEvent();\n    const element = this.config.root || window;\n    element.addEventListener('pointermove', this._measure, {passive: true});\n\n    if (this.config.eventSource) {\n      this.config.eventSource.addEventListener('pointermove', this._measure, {passive: true});\n    }\n\n    if (this.config.allowActiveEvent) {\n      element.addEventListener('pointerleave', this._pointerLeave, {passive: true});\n      element.addEventListener('pointerenter', this._pointerEnter, {passive: true});\n\n      if (this.config.eventSource) {\n        this.config.eventSource.addEventListener('pointerleave', this._pointerLeave, {passive: true});\n        this.config.eventSource.addEventListener('pointerenter', this._pointerEnter, {passive: true});\n      }\n    }\n  }\n\n  /**\n   * Remove pointermove handler.\n   */\n  removeEvent () {\n    const element = this.config.root || window;\n    element.removeEventListener('pointermove', this._measure);\n\n    if (this.config.eventSource) {\n      this.config.eventSource.removeEventListener('pointermove', this._measure);\n    }\n\n    if (this.config.allowActiveEvent) {\n      element.removeEventListener('pointerleave', this._pointerLeave);\n      element.removeEventListener('pointerenter', this._pointerEnter);\n\n      if (this.config.eventSource) {\n        this.config.eventSource.removeEventListener('pointerleave', this._pointerLeave);\n        this.config.eventSource.removeEventListener('pointerenter', this._pointerEnter);\n      }\n    }\n  }\n\n  /**\n   * Reset registered effect.\n   */\n  setupEffect () {\n    this.removeEffect();\n    this.effect = getController(this.config);\n  }\n\n  /**\n   * Remove registered effect.\n   */\n  removeEffect () {\n    this.effect && this.effect.destroy();\n    this.effect = null;\n  }\n}\n\n/**\n * @typedef {object} PointerConfig\n * @property {PointerScene[]} scenes list of effect scenes to perform during pointermove.\n * @property {HTMLElement} [root] element to use as hit area for pointermove events. Defaults to entire viewport.\n * @property {{width: number, height: number}} [rect] created automatically on Pointer construction.\n * @property {boolean} [noThrottle] whether to disable throttling the effect by framerate.\n * @property {number} [transitionDuration] duration of transition effect in milliseconds.\n * @property {function} [transitionEasing] easing function for transition effect.\n * @property {boolean} [allowActiveEvent] whether to track timeline activation events.\n * @property {HTMLElement} [eventSource] an alternative source element to attach event handlers and retarget to root.\n */\n\n/**\n * @typedef {Object} PointerScene\n * @desc A configuration object for a scene. Must be provided an effect function.\n * @example { effects: (scene, p) => { animation.currentTime = p.x; } }\n * @property {PointerEffectCallback} effect the effect to perform.\n * @property {boolean} [centeredToTarget] whether this scene's progress is centered on the target's center.\n * @property {HTMLElement} [target] target element for the effect.\n * @property {boolean} [disabled] whether this scene is disabled.\n * @property {function} [destroy] a function clean up the scene when it's controller is destroyed.\n */\n\n/**\n * @typedef {function(scene: PointerScene, progress: {x: number, y: number}, velocity: {x: number, y: number}): void} PointerEffectCallback\n * @param {PointerScene} scene\n * @param {{x: number, y: number}} progress\n * @param {{x: number, y: number}} velocity\n */\n","import { getScrubScene } from '@wix/motion';\nimport { Pointer } from 'kuliso';\nimport type { PointerMoveParams, ScrubEffect, HandlerObjectMap, InteractOptions } from '../types';\nimport {\n  effectToAnimationOptions,\n  addHandlerToMap,\n  removeElementFromHandlerMap,\n} from './utilities';\n\nconst pointerManagerMap = new WeakMap() as HandlerObjectMap;\nlet pointerOptionsGetter: () => Partial<PointerConfig> = () => ({});\n\nfunction registerOptionsGetter(getter: () => Partial<PointerConfig>) {\n  pointerOptionsGetter = getter;\n}\n\nfunction addPointerMoveHandler(\n  source: HTMLElement,\n  target: HTMLElement,\n  effect: ScrubEffect,\n  options: PointerMoveParams = {},\n  { reducedMotion, selectorCondition }: InteractOptions,\n) {\n  if (reducedMotion) {\n    return;\n  }\n\n  if (selectorCondition && !target.matches(selectorCondition)) return;\n\n  const triggerParams = {\n    trigger: 'pointer-move' as const,\n    element: source,\n    axis: options.axis ?? 'y',\n  };\n\n  const scene = getScrubScene(target, effectToAnimationOptions(effect), triggerParams);\n\n  if (scene) {\n    const scenes = Array.isArray(scene) ? scene : [scene];\n    const pointer = new Pointer({\n      root: options.hitArea === 'self' ? source : undefined,\n      scenes,\n      ...pointerOptionsGetter(),\n    });\n    const cleanup = () => {\n      pointer.destroy();\n    };\n\n    const handlerObj = { source, target, cleanup };\n\n    addHandlerToMap(pointerManagerMap, source, handlerObj);\n    addHandlerToMap(pointerManagerMap, target, handlerObj);\n\n    Promise.all(\n      scenes.map((s) => (s as { ready?: Promise<void> }).ready || Promise.resolve()),\n    ).then(() => {\n      pointer.start();\n    });\n  }\n}\n\nfunction removePointerMoveHandler(element: HTMLElement) {\n  removeElementFromHandlerMap(pointerManagerMap, element);\n}\n\nexport default {\n  add: addPointerMoveHandler,\n  remove: removePointerMoveHandler,\n  registerOptionsGetter,\n};\n","import type { AnimationGroup } from '@wix/motion';\nimport { getAnimation, getElementCSSAnimation } from '@wix/motion';\nimport type { AnimationEndParams, TimeEffect, HandlerObjectMap, InteractOptions } from '../types';\nimport {\n  effectToAnimationOptions,\n  addHandlerToMap,\n  removeElementFromHandlerMap,\n} from './utilities';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\nfunction addAnimationEndHandler(\n  source: HTMLElement,\n  target: HTMLElement,\n  effect: TimeEffect,\n  params: AnimationEndParams,\n  {\n    reducedMotion,\n    selectorCondition,\n    animation: preCreatedAnimation,\n    sourceAnimationOptions,\n  }: InteractOptions,\n): void {\n  const animation = (preCreatedAnimation ||\n    getAnimation(\n      target,\n      effectToAnimationOptions(effect),\n      undefined,\n      reducedMotion,\n    )) as AnimationGroup | null;\n\n  // Early return if animation is null, no handler attached\n  if (!animation) {\n    return;\n  }\n\n  const { effectId } = params;\n\n  const handler = (event: Event) => {\n    if (selectorCondition && !target.matches(selectorCondition)) return;\n\n    const animName = (event as AnimationEvent).animationName;\n    const eventEffectId = (event as CustomEvent).detail?.effectId;\n\n    const sourceAnimationGroup = sourceAnimationOptions\n      ? getElementCSSAnimation(source, sourceAnimationOptions)\n      : null;\n\n    if (sourceAnimationGroup) {\n      if (sourceAnimationGroup.playState === 'running') return;\n      if (animName && !sourceAnimationGroup.hasAnimationName(animName)) {\n        return;\n      } else if (\n        eventEffectId &&\n        eventEffectId !== effectId &&\n        !sourceAnimationGroup.hasAnimationId(eventEffectId)\n      ) {\n        return;\n      }\n    }\n\n    animation.play();\n  };\n\n  const cleanup = () => {\n    animation.cancel();\n    source.removeEventListener('animationend', handler);\n  };\n\n  const handlerObj = { source, target, cleanup };\n  addHandlerToMap(handlerMap, source, handlerObj);\n  addHandlerToMap(handlerMap, target, handlerObj);\n\n  source.addEventListener('animationend', handler);\n}\n\nfunction removeAnimationEndHandler(element: HTMLElement): void {\n  removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n  add: addAnimationEndHandler,\n  remove: removeAnimationEndHandler,\n};\n","import { getAnimation } from '@wix/motion';\nimport type { AnimationGroup } from '@wix/motion';\nimport type {\n  TimeEffect,\n  StateEffect,\n  EffectBase,\n  IInteractionController,\n  EventTriggerConfigEnterLeave,\n} from '../types';\nimport { effectToAnimationOptions } from './utilities';\nimport fastdom from 'fastdom';\n\nexport function createTimeEffectHandler(\n  element: HTMLElement,\n  effect: TimeEffect & EffectBase,\n  reducedMotion: boolean = false,\n  selectorCondition?: string,\n  enterLeave?: EventTriggerConfigEnterLeave,\n  preCreatedAnimation?: AnimationGroup,\n): ((event: Event) => void) | null {\n  const animation =\n    preCreatedAnimation ||\n    (getAnimation(\n      element,\n      effectToAnimationOptions(effect),\n      undefined,\n      reducedMotion,\n    ) as AnimationGroup | null);\n\n  if (!animation) {\n    return null;\n  }\n\n  let initialPlay = true;\n  const type = effect.triggerType || 'alternate';\n\n  return (event: Event) => {\n    if (selectorCondition && !element.matches(selectorCondition)) return;\n\n    const isToggle = !enterLeave;\n    const isEnter = enterLeave?.enter?.includes(event.type);\n    const isLeave = enterLeave?.leave?.includes(event.type);\n\n    if (isEnter || isToggle) {\n      if (type === 'alternate' || type === 'state') {\n        if (initialPlay) {\n          initialPlay = false;\n          animation.play();\n        } else if (type === 'alternate') {\n          animation.reverse();\n        } else if (type === 'state') {\n          if (animation.playState === 'running') {\n            animation.pause();\n          } else if (animation.playState !== 'finished') {\n            animation.play();\n          }\n        }\n      } else {\n        animation.progress(0);\n        delete element.dataset.interactEnter;\n        if (animation.isCSS) {\n          const setEnterDone = () => {\n            fastdom.mutate(() => {\n              element.dataset.interactEnter = 'done';\n            });\n          };\n\n          animation.onFinish(setEnterDone);\n          animation.onAbort(setEnterDone);\n        }\n        animation.play();\n      }\n      return;\n    }\n\n    if (isLeave) {\n      if (type === 'alternate') {\n        animation.reverse();\n      } else if (type === 'repeat') {\n        animation.cancel();\n        fastdom.mutate(() => {\n          delete element.dataset.interactEnter;\n        });\n      } else if (type === 'state' && animation.playState === 'running') {\n        animation.pause();\n      }\n    }\n  };\n}\n\nexport function createTransitionHandler(\n  element: HTMLElement,\n  targetController: IInteractionController,\n  {\n    effectId,\n    listContainer,\n    listItemSelector,\n    stateAction,\n  }: StateEffect & EffectBase & { effectId: string },\n  selectorCondition?: string,\n  enterLeave?: EventTriggerConfigEnterLeave,\n): (event: Event) => void {\n  const shouldSetStateOnElement = !!listContainer;\n  const action = stateAction ?? 'toggle';\n  const isToggle = action === 'toggle';\n\n  return (event: Event) => {\n    if (selectorCondition && !element.matches(selectorCondition)) return;\n\n    const item: HTMLElement | null | undefined = shouldSetStateOnElement\n      ? (element.closest(\n          `${listContainer} > ${listItemSelector || ''}:has(:scope)`,\n        ) as HTMLElement | null)\n      : undefined; // undefined when no listContainer so controller delegates to element.toggleEffect\n    const isToggleMode = !enterLeave;\n    const isEnter = enterLeave?.enter?.includes(event.type);\n    const isLeave = enterLeave?.leave?.includes(event.type);\n\n    if (isToggleMode) {\n      targetController.toggleEffect(effectId, action, item);\n    } else {\n      if (isEnter) {\n        targetController.toggleEffect(effectId, isToggle ? 'add' : action, item);\n      }\n      if (isLeave && isToggle) {\n        targetController.toggleEffect(effectId, 'remove', item);\n      }\n    }\n  };\n}\n","import type {\n  TimeEffect,\n  StateEffect,\n  HandlerObjectMap,\n  EffectBase,\n  InteractOptions,\n  EventTriggerConfig,\n  EventTriggerConfigEnterLeave,\n  EventTriggerParams,\n} from '../types';\nimport { addHandlerToMap, removeElementFromHandlerMap } from './utilities';\nimport { createTimeEffectHandler, createTransitionHandler } from './effectHandlers';\n\nconst handlerMap = new WeakMap() as HandlerObjectMap;\n\ntype EventHandler = (event: Event) => void;\n\nfunction createFocusListener(source: HTMLElement, handler: EventHandler): EventListener {\n  return (e: Event) => {\n    const ev = e as FocusEvent;\n    if (!source.contains(ev.relatedTarget as HTMLElement)) {\n      handler(ev);\n    }\n  };\n}\n\nfunction createClickListener(handler: EventHandler): EventListener {\n  return (e: Event) => {\n    const ev = e as MouseEvent;\n    if ((ev as PointerEvent).pointerType) {\n      handler(ev);\n    }\n  };\n}\n\nfunction createKeydownListener(handler: EventHandler): EventListener {\n  return (e: Event) => {\n    const ev = e as KeyboardEvent;\n    if (ev.code === 'Space') {\n      ev.preventDefault();\n      handler(ev);\n    } else if (ev.code === 'Enter') {\n      handler(ev);\n    }\n  };\n}\n\nconst LISTENER_FACTORY_BY_EVENT_TYPE: Partial<\n  Record<string, (source: HTMLElement, handler: EventHandler) => EventListener>\n> = {\n  focusin: (source, handler) => createFocusListener(source, handler),\n  focusout: (source, handler) => createFocusListener(source, handler),\n  click: (_source, handler) => createClickListener(handler),\n  keydown: (_source, handler) => createKeydownListener(handler),\n};\n\nfunction getListenerForEventType(\n  event: string,\n  source: HTMLElement,\n  handler: EventHandler,\n): EventListener {\n  const factory = LISTENER_FACTORY_BY_EVENT_TYPE[event];\n  return factory ? factory(source, handler) : (e: Event) => handler(e);\n}\n\ntype GenericEventConfig = {\n  toggle?: string[];\n  enter?: string[];\n  leave?: string[];\n};\n\nfunction isEnterLeaveConfigShape(\n  config: EventTriggerConfig,\n): config is EventTriggerConfigEnterLeave {\n  return (\n    typeof config === 'object' && !Array.isArray(config) && ('enter' in config || 'leave' in config)\n  );\n}\n\nfunction createGenericEventConfig(config: EventTriggerConfig): GenericEventConfig {\n  if (typeof config === 'string') {\n    return { toggle: [config] };\n  }\n  if (Array.isArray(config)) {\n    return { toggle: [...config] };\n  }\n  if (isEnterLeaveConfigShape(config)) {\n    const enter = config.enter ? [...config.enter] : [];\n    const leave = config.leave ? [...config.leave] : [];\n    return { enter, leave };\n  }\n  return {};\n}\n\nfunction isEnterLeaveMode(genericConfig: GenericEventConfig): boolean {\n  return !!(genericConfig.enter?.length || genericConfig.leave?.length);\n}\n\nfunction getEnterLeaveConfig(\n  genericConfig: GenericEventConfig,\n): EventTriggerConfigEnterLeave | undefined {\n  return isEnterLeaveMode(genericConfig)\n    ? { enter: genericConfig.enter ?? [], leave: genericConfig.leave ?? [] }\n    : undefined;\n}\n\nfunction addEventTriggerHandler(\n  source: HTMLElement,\n  target: HTMLElement,\n  effect: (TimeEffect | StateEffect) & EffectBase,\n  options: EventTriggerParams,\n  {\n    reducedMotion,\n    targetController,\n    selectorCondition,\n    animation: preCreatedAnimation,\n  }: InteractOptions,\n) {\n  const genericConfig = createGenericEventConfig(options.eventConfig);\n  const isTransition =\n    (effect as StateEffect).transition || (effect as StateEffect).transitionProperties;\n\n  const enterLeave = getEnterLeaveConfig(genericConfig);\n\n  let handler: EventHandler | null;\n  let once = false;\n\n  if (isTransition) {\n    handler = createTransitionHandler(\n      target,\n      targetController!,\n      effect as StateEffect & EffectBase & { effectId: string },\n      selectorCondition,\n      enterLeave,\n    );\n  } else {\n    handler = createTimeEffectHandler(\n      target,\n      effect as TimeEffect & EffectBase,\n      reducedMotion,\n      selectorCondition,\n      enterLeave,\n      preCreatedAnimation,\n    );\n    once = (effect as TimeEffect).triggerType === 'once';\n  }\n\n  if (!handler) {\n    return;\n  }\n\n  const resolvedHandler = handler;\n  const controller = new AbortController();\n\n  function addListener(element: HTMLElement, event: string, options?: AddEventListenerOptions) {\n    const fn = getListenerForEventType(event, source, resolvedHandler);\n    element.addEventListener(event, fn, { ...options, signal: controller.signal });\n  }\n\n  const cleanup = () => {\n    controller.abort();\n  };\n\n  const handlerObj = { source, target, cleanup };\n  addHandlerToMap(handlerMap, source, handlerObj);\n  addHandlerToMap(handlerMap, target, handlerObj);\n\n  if (enterLeave) {\n    const enter = genericConfig.enter!;\n    const leaveEvents = genericConfig.leave!;\n\n    enter.forEach((eventType) => {\n      if (eventType === 'focusin') {\n        source.tabIndex = 0;\n      }\n      addListener(source, eventType, { passive: true, once });\n    });\n\n    const isToggle =\n      !(effect as StateEffect).stateAction || (effect as StateEffect).stateAction === 'toggle';\n    const addLeaveListeners = isTransition\n      ? isToggle\n      : (effect as TimeEffect).triggerType !== 'once';\n\n    if (addLeaveListeners) {\n      leaveEvents.forEach((eventType) => {\n        if (eventType === 'focusout') {\n          addListener(source, eventType, { once });\n          return;\n        }\n        addListener(source, eventType, { passive: true });\n      });\n    }\n  } else {\n    const events = genericConfig.toggle ?? [];\n    events.forEach((eventType) => {\n      const passive = eventType !== 'keydown';\n      const opts = { once, passive };\n      addListener(source, eventType, opts);\n    });\n  }\n}\n\nfunction removeEventTriggerHandler(element: HTMLElement) {\n  removeElementFromHandlerMap(handlerMap, element);\n}\n\nexport default {\n  add: addEventTriggerHandler,\n  remove: removeEventTriggerHandler,\n};\n","export const EVENT_TRIGGER_PRESETS = {\n  click: ['click'] as const,\n  activate: ['click', 'keydown'] as const,\n  hover: { enter: ['mouseenter'], leave: ['mouseleave'] } as const,\n  interest: {\n    enter: ['mouseenter', 'focusin'],\n    leave: ['mouseleave', 'focusout'],\n  } as const,\n} as const;\n","import type { Effect, InteractOptions, TriggerHandlerMap, TriggerType } from '../types';\nimport viewEnterHandler from './viewEnter';\nimport viewProgressHandler from './viewProgress';\nimport pointerMoveHandler from './pointerMove';\nimport animationEndHandler from './animationEnd';\nimport eventTrigger from './eventTrigger';\nimport { EVENT_TRIGGER_PRESETS } from './constants';\n\nconst a11yTriggerOverrides = {\n  click: EVENT_TRIGGER_PRESETS.activate,\n  hover: EVENT_TRIGGER_PRESETS.interest,\n} as const;\n\nfunction withEventTriggerConfig(presetKey: keyof typeof EVENT_TRIGGER_PRESETS) {\n  const preset = EVENT_TRIGGER_PRESETS[presetKey];\n  return (\n    source: HTMLElement,\n    target: HTMLElement,\n    effect: Effect,\n    _options: Record<string, never>,\n    interactOptions?: InteractOptions,\n  ) => {\n    const eventConfig =\n      interactOptions?.allowA11yTriggers && presetKey in a11yTriggerOverrides\n        ? a11yTriggerOverrides[presetKey as keyof typeof a11yTriggerOverrides]\n        : preset;\n    eventTrigger.add(source, target, effect, { eventConfig }, interactOptions ?? {});\n  };\n}\n\nexport default {\n  viewEnter: viewEnterHandler,\n  hover: {\n    add: withEventTriggerConfig('hover'),\n    remove: eventTrigger.remove,\n  },\n  click: {\n    add: withEventTriggerConfig('click'),\n    remove: eventTrigger.remove,\n  },\n  animationEnd: animationEndHandler,\n  viewProgress: viewProgressHandler,\n  pointerMove: pointerMoveHandler,\n  activate: {\n    add: withEventTriggerConfig('activate'),\n    remove: eventTrigger.remove,\n  },\n  interest: {\n    add: withEventTriggerConfig('interest'),\n    remove: eventTrigger.remove,\n  },\n} as TriggerHandlerMap<TriggerType>;\n","import {\n  InteractCache,\n  InteractConfig,\n  EffectRef,\n  Effect,\n  Interaction,\n  SequenceConfig,\n  SequenceConfigRef,\n  ViewEnterParams,\n  ViewEnterHandlerModule,\n  IInteractionController,\n  IInteractElement,\n  InteractPlugin,\n} from '../types';\nimport { getElementHash, getInterpolatedKey } from './utilities';\nimport { getKeyframeSlots, getSlotKey } from './css';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\nimport {\n  registerEffects,\n  getRegisteredEffect,\n  getSequence as getMotionSequence,\n  createAnimationGroups,\n  Sequence,\n} from '@wix/motion';\nimport type { SequenceOptions, AnimationGroupArgs, IndexedGroup } from '@wix/motion';\n\nfunction _convertToKeyTemplate(key: string) {\n  return key.replace(/\\[[^\\]]+]/g, '[]');\n}\n\nexport class Interact {\n  static defineInteractElement?: () => boolean;\n  dataCache: InteractCache;\n  addedInteractions: { [interactionId: string]: boolean };\n  mediaQueryListeners: Map<\n    string,\n    {\n      mql: MediaQueryList;\n      handler: (e: MediaQueryListEvent | MediaQueryList) => void;\n      key: string;\n    }\n  >;\n  listInteractionsCache: {\n    [listContainer: string]: { [interactionId: string]: boolean };\n  };\n  controllers: Set<IInteractionController>;\n  static forceReducedMotion: boolean = false;\n  static allowA11yTriggers: boolean = true;\n  static instances: Interact[] = [];\n  static controllerCache = new Map<string, IInteractionController>();\n  static sequenceCache = new Map<string, Sequence>();\n  static elementSequenceMap = new WeakMap<HTMLElement, Set<Sequence>>();\n  private static plugins = new Map<string, InteractPlugin>();\n\n  constructor() {\n    this.dataCache = { effects: {}, sequences: {}, conditions: {}, interactions: {} };\n    this.addedInteractions = {};\n    this.mediaQueryListeners = new Map();\n    this.listInteractionsCache = {};\n    this.controllers = new Set();\n  }\n\n  init(config: InteractConfig, options?: { useCustomElement?: boolean }): void {\n    if (typeof window === 'undefined' || !window.customElements) {\n      return;\n    }\n\n    const useCustomElement = options?.useCustomElement ?? !!Interact.defineInteractElement;\n\n    this.dataCache = parseConfig(config, useCustomElement);\n\n    const defined = Interact.defineInteractElement?.();\n\n    if (useCustomElement && defined === false) {\n      // mostly to recover from React's <StrictMode>, blah...\n      document.querySelectorAll('interact-element').forEach((element) => {\n        (element as IInteractElement).connect();\n      });\n    } else {\n      // Always try to reconnect elements from cache.\n      // This handles cases where elements were added to DOM before the instance was created\n      // (e.g., in React where useEffect runs after render), or when an instance is recreated\n      // (e.g., in React StrictMode where effects run twice).\n      // The connect() method has a guard to skip if already connected.\n      Interact.controllerCache.forEach((controller: IInteractionController, key) =>\n        controller.connect(key),\n      );\n    }\n  }\n\n  destroy({ clearCache = false }: { clearCache?: boolean } = {}): void {\n    for (const controller of this.controllers) {\n      controller.disconnect({ removeFromCache: clearCache });\n    }\n\n    // Properly remove all media query listeners before clearing the Map\n    // This is critical for React StrictMode where instances are destroyed and recreated,\n    // to prevent duplicate listeners from firing with stale instance references\n    for (const [, listener] of this.mediaQueryListeners.entries()) {\n      listener.mql.removeEventListener('change', listener.handler);\n    }\n    this.mediaQueryListeners.clear();\n    this.addedInteractions = {};\n    this.listInteractionsCache = {};\n    this.controllers.clear();\n    this.dataCache = { effects: {}, sequences: {}, conditions: {}, interactions: {} };\n    Interact.instances.splice(Interact.instances.indexOf(this), 1);\n  }\n\n  setController(key: string, controller: IInteractionController) {\n    this.controllers.add(controller);\n\n    Interact.setController(key, controller);\n  }\n\n  deleteController(key: string, removeFromCache: boolean = false) {\n    const controller = Interact.controllerCache.get(key);\n\n    this.clearInteractionStateForKey(key);\n    this.clearMediaQueryListenersForKey(key);\n\n    if (controller && removeFromCache) {\n      this.controllers.delete(controller);\n      Interact.deleteController(key);\n    }\n  }\n\n  has(key: string): boolean {\n    return !!this.get(key);\n  }\n\n  get(key: string): InteractCache['interactions'][string] | undefined {\n    const processedKey = _convertToKeyTemplate(key);\n    return this.dataCache.interactions[processedKey];\n  }\n\n  clearMediaQueryListenersForKey(key: string): void {\n    for (const [id, listener] of this.mediaQueryListeners.entries()) {\n      if (listener.key === key) {\n        listener.mql.removeEventListener('change', listener.handler);\n        this.mediaQueryListeners.delete(id);\n      }\n    }\n  }\n\n  clearInteractionStateForKey(key: string): void {\n    const interactionIds = this.get(key)?.interactionIds || [];\n\n    interactionIds.forEach((interactionId_) => {\n      const interactionId = getInterpolatedKey(interactionId_, key);\n      delete this.addedInteractions[interactionId];\n    });\n\n    const seqPrefix = `${key}::seq::`;\n    for (const cacheKey of Interact.sequenceCache.keys()) {\n      if (cacheKey.startsWith(seqPrefix)) {\n        Interact.sequenceCache.delete(cacheKey);\n        delete this.addedInteractions[cacheKey];\n      }\n    }\n  }\n\n  setupMediaQueryListener(id: string, mql: MediaQueryList, key: string, handler: () => void) {\n    if (this.mediaQueryListeners.has(id)) {\n      return;\n    }\n\n    mql.addEventListener('change', handler);\n\n    this.mediaQueryListeners.set(id, {\n      mql,\n      handler,\n      key,\n    });\n  }\n\n  static create(config: InteractConfig, options?: { useCustomElement?: boolean }): Interact {\n    const instance = new Interact();\n    Interact.instances.push(instance);\n\n    instance.init(config, options);\n\n    return instance;\n  }\n\n  static destroy(): void {\n    Interact.controllerCache.forEach((controller: IInteractionController) => {\n      controller.disconnect();\n    });\n    Interact.instances.length = 0;\n    Interact.controllerCache.clear();\n    Interact.sequenceCache.clear();\n    Interact.elementSequenceMap = new WeakMap();\n  }\n\n  static setup(options: {\n    scrollOptionsGetter?: () => Partial<scrollConfig>;\n    pointerOptionsGetter?: () => Partial<PointerConfig>;\n    viewEnter?: Partial<ViewEnterParams>;\n    allowA11yTriggers?: boolean;\n  }): void {\n    if (options.scrollOptionsGetter) {\n      TRIGGER_TO_HANDLER_MODULE_MAP.viewProgress.registerOptionsGetter?.(\n        options.scrollOptionsGetter,\n      );\n    }\n\n    if (options.pointerOptionsGetter) {\n      TRIGGER_TO_HANDLER_MODULE_MAP.pointerMove.registerOptionsGetter?.(\n        options.pointerOptionsGetter,\n      );\n    }\n\n    if (options.viewEnter) {\n      (TRIGGER_TO_HANDLER_MODULE_MAP.viewEnter as ViewEnterHandlerModule).setOptions(\n        options.viewEnter,\n      );\n    }\n\n    if (options.allowA11yTriggers !== undefined) {\n      Interact.allowA11yTriggers = options.allowA11yTriggers;\n    }\n  }\n\n  static getInstance(key: string): Interact | undefined {\n    const instance = Interact.instances.find((instance) => instance.has(key));\n    if (!instance) {\n      console.warn(`Interact: Instance for key \"${key}\" not found`);\n    }\n    return instance;\n  }\n\n  static getController(key: string | undefined): IInteractionController | undefined {\n    const controller = key ? Interact.controllerCache.get(key) : undefined;\n    if (!controller) {\n      console.warn(`Interact: Controller for key \"${key}\" not found`);\n    }\n    return controller;\n  }\n\n  static setController(key: string, controller: IInteractionController): void {\n    Interact.controllerCache.set(key, controller);\n  }\n\n  static deleteController(key: string): void {\n    Interact.controllerCache.delete(key);\n  }\n\n  static registerEffects = registerEffects;\n  static getRegisteredEffect = getRegisteredEffect;\n\n  /**\n   * Registers a plugin under a name. When the config carries a plugin field (e.g. `$splitText`) with a matching key\n   * (on an interaction or effect), Interact invokes the plugin with the field's value and a\n   * context. Interact is agnostic to what the plugin does — see the `InteractPlugin` type.\n   */\n  static use(name: string, plugin: InteractPlugin): void {\n    Interact.plugins.set(name, plugin);\n  }\n\n  static getPlugin(name: string): InteractPlugin | undefined {\n    return Interact.plugins.get(name);\n  }\n\n  static getPluginsNames(): Set<string> {\n    return new Set(Interact.plugins.keys());\n  }\n\n  static getSequence(\n    cacheKey: string,\n    sequenceOptions: SequenceOptions,\n    animationGroupArgs: AnimationGroupArgs[],\n    context?: { reducedMotion?: boolean },\n  ): Sequence {\n    const cached = Interact.sequenceCache.get(cacheKey);\n    if (cached) return cached;\n\n    const sequence = getMotionSequence(sequenceOptions, animationGroupArgs, context);\n    Interact.sequenceCache.set(cacheKey, sequence);\n    Interact._registerSequenceElements(animationGroupArgs, sequence);\n\n    return sequence;\n  }\n\n  static addToSequence(\n    cacheKey: string,\n    animationGroupArgs: AnimationGroupArgs[],\n    indices: number[],\n    context?: { reducedMotion?: boolean },\n  ): boolean {\n    const cached = Interact.sequenceCache.get(cacheKey);\n\n    if (!cached) return false;\n\n    const newGroups = createAnimationGroups(animationGroupArgs, context);\n    const entries: IndexedGroup[] = newGroups.map((group, i) => ({\n      index: indices[i] ?? cached.animationGroups.length,\n      group,\n    }));\n\n    cached.addGroups(entries);\n    Interact._registerSequenceElements(animationGroupArgs, cached);\n\n    return true;\n  }\n\n  private static _registerSequenceElements(\n    animationGroupArgs: AnimationGroupArgs[],\n    sequence: Sequence,\n  ): void {\n    for (const { target } of animationGroupArgs) {\n      // String selector targets are resolved to HTMLElements before reaching here\n      // (see _buildAnimationGroupArgsFromSequence in add.ts), so only HTMLElement\n      // and HTMLElement[] need handling.\n      const elements = Array.isArray(target)\n        ? target\n        : target instanceof HTMLElement\n          ? [target]\n          : [];\n      for (const el of elements) {\n        let seqs = Interact.elementSequenceMap.get(el);\n        if (!seqs) {\n          seqs = new Set();\n          Interact.elementSequenceMap.set(el, seqs);\n        }\n        seqs.add(sequence);\n      }\n    }\n  }\n\n  static removeFromSequences(elements: HTMLElement[]): void {\n    for (const element of elements) {\n      const sequences = Interact.elementSequenceMap.get(element);\n      if (!sequences) continue;\n\n      for (const sequence of sequences) {\n        // Optional chaining on `.effect` handles cases where animations were\n        // already cancelled (e.g. by a prior removeGroups call in this loop),\n        // which may null out the effect reference.\n        sequence.removeGroups((group) =>\n          group.animations.some((a) => (a.effect as KeyframeEffect)?.target === element),\n        );\n      }\n\n      Interact.elementSequenceMap.delete(element);\n    }\n  }\n}\n\nlet interactionIdCounter = 0;\n\nexport function getSelector(\n  d: Interaction | Effect,\n  {\n    asCombinator = false,\n    addItemFilter = false,\n    useFirstChild = false,\n  }: { asCombinator?: boolean; addItemFilter?: boolean; useFirstChild?: boolean } = {},\n): string {\n  if (d.listContainer) {\n    const itemFilter = `${addItemFilter && d.listItemSelector ? ` > ${d.listItemSelector}` : ''}`;\n\n    if (d.selector) {\n      return `${d.listContainer}${itemFilter} ${d.selector}`;\n    }\n\n    return `${d.listContainer}${itemFilter || ' > *'}`;\n  } else if (d.selector) {\n    return d.selector;\n  }\n\n  // TODO: consider moving :scope to be configurable since it may lead to unexpected results in some cases\n  return useFirstChild ? (asCombinator ? '> :first-child' : ':scope > :first-child') : '';\n}\n\n/**\n * Parses the config object and caches interactions, effects, and conditions\n */\nfunction _isSequenceConfigRef(\n  config: SequenceConfig | SequenceConfigRef,\n): config is SequenceConfigRef {\n  return 'sequenceId' in config && !('effects' in config);\n}\n\nfunction _ensureInteractionEntry(\n  interactions: InteractCache['interactions'],\n  key: string,\n): InteractCache['interactions'][string] {\n  if (!interactions[key]) {\n    interactions[key] = {\n      triggers: [],\n      effects: {},\n      sequences: {},\n      interactionIds: new Set(),\n      selectors: new Set(),\n    };\n  }\n\n  return interactions[key];\n}\n\n// the sequence's effects in their slots - copied, since a referenced sequence can be in different slots\nfunction withSlots<T extends SequenceConfig | SequenceConfigRef>(\n  sequence: T,\n  getKey: (effectIndex: number) => string,\n  slots: Map<string, string>,\n): T {\n  const { effects = [] } = sequence as Partial<SequenceConfig>;\n  if (!effects.some((_, index) => slots.has(getKey(index)))) {\n    return sequence;\n  }\n  return {\n    ...sequence,\n    effects: effects.map((effect, index) => {\n      const suffix = slots.get(getKey(index));\n      return suffix ? { ...effect, suffix } : effect;\n    }),\n  };\n}\n\nfunction parseConfig(config: InteractConfig, useCustomElement: boolean = false): InteractCache {\n  const { effects: effectMap = {}, sequences: sequenceMap = {}, conditions = {} } = config;\n  const interactions: InteractCache['interactions'] = {};\n  const slots = config.interactions ? getKeyframeSlots(config) : new Map<string, string>();\n\n  config.interactions?.forEach((interaction_, configIndex) => {\n    const source = interaction_.key;\n    const interactionIdx = ++interactionIdCounter;\n    const { effects: effects_, sequences: sequences_, ...rest } = interaction_;\n\n    if (!source) {\n      console.error(`Interaction ${interactionIdx} is missing a key for source element.`);\n      return;\n    }\n\n    _ensureInteractionEntry(interactions, source);\n\n    /*\n     * Cache interaction trigger by source element\n     */\n    const effects = effects_ ? Array.from(effects_) : [];\n    effects.reverse(); // reverse to ensure the first effect is the one that will be applied first\n\n    // Resolve and preprocess sequences\n    const processedSequences = sequences_?.map((seqOrRef, sequenceIndex) => {\n      if (_isSequenceConfigRef(seqOrRef)) {\n        const resolved = sequenceMap[seqOrRef.sequenceId];\n        if (!resolved) {\n          console.warn(`Interact: Sequence \"${seqOrRef.sequenceId}\" not found in config`);\n          return seqOrRef;\n        }\n        return { ...resolved, ...seqOrRef } as SequenceConfig;\n      }\n\n      const seq = seqOrRef as SequenceConfig;\n      if (!seq.sequenceId) {\n        seq.sequenceId = `seq-${configIndex}-${sequenceIndex}`;\n      }\n      return seq;\n    });\n\n    const interaction = {\n      ...rest,\n      effects: effects.length > 0 ? effects : undefined,\n      sequences: processedSequences?.map((seq, sequenceIndex) =>\n        withSlots(seq, (effectIndex) => getSlotKey(configIndex, effectIndex, sequenceIndex), slots),\n      ),\n    } as Interaction;\n\n    interactions[source].triggers.push(interaction);\n    interactions[source].selectors.add(\n      getSelector(interaction, { useFirstChild: useCustomElement }),\n    );\n\n    const listContainer = interaction.listContainer;\n\n    effects.forEach((effect, effectIndex) => {\n      /*\n       * Target cascade order is the first of:\n       *  -> Config.interactions.effects.effect.key\n       *  -> Config.effects.effect.key\n       *  -> Config.interactions.interaction.key\n       */\n      const referencedEffect = (effect as EffectRef).effectId\n        ? effectMap[(effect as EffectRef).effectId]\n        : undefined;\n      let target = effect.key || referencedEffect?.key;\n\n      const configEffectIndex = effects.length - 1 - effectIndex;\n      if (!(effect as EffectRef).effectId) {\n        (effect as EffectRef).effectId = `eff-${configIndex}-${configEffectIndex}`;\n      }\n      const suffix = slots.get(getSlotKey(configIndex, configEffectIndex));\n      if (suffix) {\n        (effect as { suffix?: string }).suffix = suffix;\n      }\n\n      // if no target is specified, use the source element as the target\n      target = target || source;\n      effect.key = target;\n\n      if (listContainer && effect.listContainer) {\n        // we do not support having 2 separate lists for same interaction\n        if (target !== source || effect.listContainer !== listContainer) {\n          return;\n        }\n      }\n\n      const targetHash = getElementHash({ ...referencedEffect, ...effect, key: target });\n      const interactionId = `${source}::${targetHash}::${interactionIdx}`;\n      effect.interactionId = interactionId;\n      interactions[source].interactionIds.add(interactionId);\n\n      if (target === source) {\n        // if target is the source element, no need to add an interaction to `effects`\n        return;\n      }\n\n      /*\n       * Cache interaction effect by target element\n       */\n      const targetEntry = _ensureInteractionEntry(interactions, target);\n      if (!targetEntry.effects[interactionId]) {\n        targetEntry.effects[interactionId] = [];\n        targetEntry.interactionIds.add(interactionId);\n      }\n\n      targetEntry.effects[interactionId].push({ ...rest, effect });\n      targetEntry.selectors.add(getSelector(effect, { useFirstChild: useCustomElement }));\n    });\n\n    // Process sequence effects for selector tracking and cross-element referencing\n    processedSequences?.forEach((seqConfig) => {\n      if (!seqConfig || _isSequenceConfigRef(seqConfig)) return;\n\n      const sequenceConfig = seqConfig as SequenceConfig;\n      const sequenceId = sequenceConfig.sequenceId!;\n      const seqEffects = sequenceConfig.effects;\n\n      seqEffects.forEach((effect, effectIndex) => {\n        if (!(effect as EffectRef).effectId) {\n          (effect as EffectRef).effectId = `eff-${sequenceId}-${effectIndex}`;\n        }\n\n        let target = effect.key;\n        if (!target && (effect as EffectRef).effectId) {\n          const referencedEffect = effectMap[(effect as EffectRef).effectId];\n          if (referencedEffect) {\n            target = referencedEffect.key;\n          }\n        }\n        target = target || source;\n\n        const effectSelector = getSelector(effect, { useFirstChild: useCustomElement });\n        if (effectSelector) {\n          interactions[source].selectors.add(effectSelector);\n        }\n\n        if (target !== source) {\n          const targetEntry = _ensureInteractionEntry(interactions, target);\n          const seqInteractionId = `${target}::seq::${sequenceId}::${interactionIdx}`;\n\n          if (!targetEntry.sequences[seqInteractionId]) {\n            targetEntry.sequences[seqInteractionId] = [];\n            targetEntry.interactionIds.add(seqInteractionId);\n          }\n\n          targetEntry.sequences[seqInteractionId].push({\n            ...rest,\n            sequence: sequenceConfig,\n          });\n          targetEntry.selectors.add(effectSelector);\n        }\n      });\n    });\n  });\n\n  return {\n    effects: effectMap,\n    sequences: sequenceMap,\n    conditions,\n    interactions,\n  };\n}\n","import type {\n  Effect,\n  TriggerType,\n  EffectRef,\n  InteractionParamsTypes,\n  StateEffect,\n  TimeEffect,\n  Interaction,\n  InteractionTrigger,\n  SequenceConfig,\n  SequenceConfigRef,\n  CreateTransitionCSSParams,\n  IInteractionController,\n  AnimationEndParams,\n  AnimationOptions,\n} from '../types';\nimport { PLUGIN_FIELD_PREFIX } from '../types';\nimport { createTransitionCSS, getMediaQuery, getSelectorCondition, generateId } from '../utils';\nimport { getInterpolatedKey } from './utilities';\nimport { effectToAnimationOptions } from '../handlers/utilities';\nimport { Interact, getSelector } from './Interact';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\nimport type { AnimationGroupArgs } from '@wix/motion';\n\ntype InteractionsToApply = Array<\n  [\n    string,\n    InteractionTrigger,\n    Effect,\n    HTMLElement | HTMLElement[],\n    HTMLElement | HTMLElement[],\n    string | undefined,\n    boolean,\n    string | undefined,\n  ]\n>;\n\ntype ListElements = {\n  controllerKey: string;\n  listContainer: string;\n  elements: HTMLElement[];\n};\n\n/**\n * Generic plugin bridge. For every `$`-prefixed field on an interaction or effect (e.g. `$splitText`\n * → the `splitText` plugin), look up the plugin registered via `Interact.use()` and invoke it with\n * the raw field value and a context. Any returned cleanup is stored on the owning controller and\n * run on disconnect. Interact never inspects what a plugin does — it only routes config → plugin.\n *\n * Plugins run BEFORE target resolution (`_getElementsFromData`), so any DOM they produce (e.g.\n * split `<span>`s) is visible to the selectors that follow. Each distinct plugin value object is\n * applied at most once per connect — the field values are shared by reference across resolution\n * passes, so identity is a stable dedup key.\n */\nfunction _applyPlugins(\n  owner: IInteractionController,\n  root: HTMLElement,\n  config: Record<string, unknown>,\n  key: string,\n  scope: 'interaction' | 'effect',\n): void {\n  const pluginNames = Interact.getPluginsNames();\n\n  for (const name of pluginNames) {\n    const field = `${PLUGIN_FIELD_PREFIX}${name}`;\n    if (!(field in config)) {\n      continue;\n    }\n\n    const value = config[field];\n\n    if (value !== null && typeof value === 'object') {\n      if (owner._appliedPlugins.has(value)) {\n        continue;\n      }\n      owner._appliedPlugins.add(value);\n    }\n\n    const plugin = Interact.getPlugin(name)!;\n\n    const cleanup = plugin(value, { root, key, scope, config });\n\n    if (typeof cleanup === 'function') {\n      owner._pluginCleanups.push(cleanup);\n    }\n  }\n}\n\nfunction _getElementsFromData(\n  data: Interaction | Effect,\n  root: HTMLElement,\n  useFirstChild: boolean,\n): HTMLElement | HTMLElement[] | null {\n  if (data.listContainer) {\n    const container = root.querySelector(data.listContainer);\n\n    if (!container) {\n      console.warn(`Interact: No container found for list container \"${data.listContainer}\"`);\n\n      return [];\n    }\n\n    if (data.selector) {\n      return Array.from(container.querySelectorAll(data.selector)) as HTMLElement[];\n    }\n\n    return Array.from(container.children) as HTMLElement[];\n  }\n\n  if (data.selector) {\n    const elements = root.querySelectorAll(data.selector);\n\n    if (elements.length > 0) {\n      return Array.from(elements) as HTMLElement[];\n    } else {\n      console.warn(`Interact: No elements found for selector \"${data.selector}\"`);\n    }\n  }\n\n  return useFirstChild\n    ? (root.firstElementChild as HTMLElement | null)\n    : (root as HTMLElement | null);\n}\n\nfunction _queryItemElement(data: Interaction | Effect, elements: HTMLElement[]): HTMLElement[] {\n  return elements\n    .map((element) => {\n      return data.selector ? element.querySelector(data.selector) : element;\n    })\n    .filter(Boolean) as HTMLElement[];\n}\n\nfunction _getInteractionElements(\n  interaction: InteractionTrigger,\n  effect: Effect,\n  source: HTMLElement,\n  sourceUseFirstChild: boolean,\n  target: HTMLElement,\n  targetUseFirstChild: boolean,\n  sourceElements?: HTMLElement[],\n  targetElements?: HTMLElement[],\n): [HTMLElement | HTMLElement[] | null, HTMLElement | HTMLElement[] | null] {\n  return [\n    sourceElements\n      ? _queryItemElement(interaction, sourceElements)\n      : _getElementsFromData(interaction, source, sourceUseFirstChild),\n    targetElements\n      ? _queryItemElement(effect, targetElements)\n      : _getElementsFromData(effect, target, targetUseFirstChild),\n  ];\n}\n\nfunction _applyInteraction(\n  targetKey: string,\n  interaction: InteractionTrigger,\n  effect: Effect,\n  sourceElements: HTMLElement | HTMLElement[],\n  targetElements: HTMLElement | HTMLElement[],\n  selectorCondition?: string,\n  useFirstChild?: boolean,\n  sourceKey?: string,\n) {\n  const isSourceArray = Array.isArray(sourceElements);\n  const isTargetArray = Array.isArray(targetElements);\n\n  if (isSourceArray) {\n    sourceElements.forEach((sourceEl, index) => {\n      const targetEl = isTargetArray ? targetElements[index] : targetElements;\n\n      if (targetEl) {\n        addInteraction(\n          targetKey,\n          sourceEl,\n          interaction.trigger,\n          targetEl,\n          effect as Effect,\n          interaction.params!,\n          selectorCondition,\n          useFirstChild,\n          sourceKey,\n        );\n      }\n    });\n  } else {\n    const targets = isTargetArray ? targetElements : [targetElements];\n    targets.forEach((targetEl) => {\n      addInteraction(\n        targetKey,\n        sourceElements,\n        interaction.trigger,\n        targetEl,\n        effect as Effect,\n        interaction.params!,\n        selectorCondition,\n        useFirstChild,\n        sourceKey,\n      );\n    });\n  }\n}\n\nfunction _addInteraction(\n  sourceKey: string,\n  sourceController: IInteractionController,\n  instance: Interact,\n  interaction: Interaction,\n  elements?: HTMLElement[],\n) {\n  const interactionVariations: Record<string, boolean> = {};\n\n  const interactionsToApply: InteractionsToApply = [];\n\n  (interaction.effects || []).forEach((effect, effectIndex) => {\n    const effectId = (effect as EffectRef).effectId;\n\n    const effectOptions = {\n      ...(instance.dataCache.effects[effectId] || {}),\n      ...effect,\n      effectId,\n    };\n    const targetKey_ = effectOptions.key;\n\n    const interactionId = getInterpolatedKey(effect.interactionId!, sourceKey);\n\n    if (interactionVariations[interactionId!]) {\n      // Skip this effect if it has already been added\n      return;\n    }\n\n    if (instance.addedInteractions[interactionId!] && !elements) {\n      // Skip this interaction if it has already been added\n      return;\n    }\n\n    const mql = getMediaQuery(effectOptions.conditions || [], instance.dataCache.conditions);\n\n    if (mql) {\n      instance.setupMediaQueryListener(`${interactionId}::${effectIndex}`, mql, sourceKey, () => {\n        sourceController.update();\n      });\n    }\n\n    if (!mql || mql.matches) {\n      interactionVariations[interactionId!] = true;\n\n      const target = targetKey_ && getInterpolatedKey(targetKey_, sourceKey);\n\n      let targetController;\n      if (target) {\n        targetController = Interact.getController(target);\n\n        if (!targetController) {\n          // Bail out :: no target element in cache\n          return;\n        }\n\n        if (effectOptions.listContainer) {\n          targetController.watchChildList(effectOptions.listContainer);\n        }\n      } else {\n        // target is not specified - fallback to same as source\n        targetController = sourceController;\n      }\n\n      // Effect-level plugins act on the effect's target element before it is resolved.\n      _applyPlugins(\n        targetController,\n        targetController.element,\n        effectOptions,\n        target || interaction.key,\n        'effect',\n      );\n\n      const [sourceElements, targetElements] = _getInteractionElements(\n        interaction,\n        effectOptions,\n        sourceController.element,\n        sourceController.useFirstChild,\n        targetController.element,\n        targetController.useFirstChild,\n        elements,\n      );\n\n      if (!sourceElements || !targetElements) {\n        return;\n      }\n\n      instance.addedInteractions[interactionId!] = true;\n\n      const key = target || interaction.key;\n      const selectorCondition = getSelectorCondition(\n        effectOptions.conditions || [],\n        instance.dataCache.conditions,\n      );\n\n      interactionsToApply.push([\n        key,\n        interaction,\n        effectOptions,\n        sourceElements,\n        targetElements,\n        selectorCondition,\n        targetController.useFirstChild,\n        sourceKey,\n      ]);\n    }\n  });\n\n  // apply the effects in reverse to return to the order specified by the user to ensure order of composition is as defined\n  interactionsToApply.reverse().forEach((interaction) => {\n    _applyInteraction(...interaction);\n  });\n\n  _processSequences(sourceKey, sourceController, instance, interaction, elements);\n}\n\nfunction _isSequenceConfigRef(\n  config: SequenceConfig | SequenceConfigRef,\n): config is SequenceConfigRef {\n  return 'sequenceId' in config && !('effects' in config);\n}\n\n/**\n * Shared logic for building animation group args from a sequence config.\n * Handles sequence-level and effect-level media conditions, target resolution, and element lookup.\n * Returns null when the sequence should be skipped (conditions not met, missing targets, etc.).\n *\n * When `listElements` is provided (from addListItems), effects matching the specified controller\n * and listContainer will resolve targets from the provided elements instead of querying the DOM.\n * Returns null if listElements was provided but no effects matched it (avoids duplicate sequences).\n */\nfunction _buildAnimationGroupArgsFromSequence(\n  sequenceConfig: SequenceConfig,\n  cacheKey: string,\n  sourceKey: string,\n  sourceController: IInteractionController,\n  instance: Interact,\n  options: { updateKey: string; onUpdate: () => void },\n  listElements?: ListElements,\n): AnimationGroupArgs[] | null {\n  const seqMql = getMediaQuery(sequenceConfig.conditions || [], instance.dataCache.conditions);\n\n  if (seqMql) {\n    instance.setupMediaQueryListener(cacheKey, seqMql, options.updateKey, options.onUpdate);\n  }\n\n  if (seqMql && !seqMql.matches) return null;\n\n  const seqEffects: (Effect | EffectRef)[] = sequenceConfig.effects || [];\n  const animationGroupArgs: AnimationGroupArgs[] = [];\n  let usedListElements = false;\n\n  for (const effect of seqEffects) {\n    const effectId = (effect as EffectRef).effectId;\n    const resolvedEffect = effectId ? instance.dataCache.effects[effectId] || {} : {};\n    const effectOptions = {\n      ...resolvedEffect,\n      ...effect,\n    };\n\n    const effectMql = getMediaQuery(effectOptions.conditions || [], instance.dataCache.conditions);\n\n    if (effectMql) {\n      const effectCacheKey = `${cacheKey}::${effectId || 'eff'}`;\n      instance.setupMediaQueryListener(\n        effectCacheKey,\n        effectMql,\n        options.updateKey,\n        options.onUpdate,\n      );\n    }\n\n    if (effectMql && !effectMql.matches) continue;\n\n    const targetKey_ = effectOptions.key;\n    const target = targetKey_ && getInterpolatedKey(targetKey_, sourceKey);\n\n    let targetController;\n    if (target) {\n      targetController = Interact.getController(target);\n      if (!targetController) return null;\n    } else {\n      targetController = sourceController;\n    }\n\n    const resolvedTargetKey = target || sourceKey;\n\n    // Effect-level plugins act on the effect's target element before it is resolved.\n    _applyPlugins(\n      targetController,\n      targetController.element,\n      effectOptions,\n      resolvedTargetKey,\n      'effect',\n    );\n\n    let targetElement: HTMLElement | HTMLElement[] | null;\n\n    if (\n      listElements &&\n      resolvedTargetKey === listElements.controllerKey &&\n      effectOptions.listContainer === listElements.listContainer\n    ) {\n      targetElement = _queryItemElement(effectOptions, listElements.elements);\n      if ((targetElement as HTMLElement[]).length > 0) {\n        usedListElements = true;\n      }\n    } else {\n      targetElement = _getElementsFromData(\n        effectOptions,\n        targetController.element,\n        targetController.useFirstChild,\n      );\n    }\n\n    if (!targetElement || (Array.isArray(targetElement) && targetElement.length === 0)) return null;\n\n    const animOptions = effectToAnimationOptions(effectOptions as TimeEffect);\n    animationGroupArgs.push({ target: targetElement, options: animOptions });\n  }\n\n  if (listElements && !usedListElements) return null;\n\n  return animationGroupArgs.length > 0 ? animationGroupArgs : null;\n}\n\nfunction _resolveSourceElements(\n  interaction: Interaction,\n  sourceController: IInteractionController,\n  elements?: HTMLElement[],\n): HTMLElement | HTMLElement[] | null {\n  const resolved = elements\n    ? _queryItemElement(interaction, elements)\n    : _getElementsFromData(interaction, sourceController.element, sourceController.useFirstChild);\n\n  // Treat an empty array as \"no elements\" so callers' null-guards bail instead of\n  // marking the interaction added while attaching zero triggers.\n  return Array.isArray(resolved) && resolved.length === 0 ? null : resolved;\n}\n\nfunction _attachSequenceTriggers(\n  interaction: Interaction,\n  sequenceConfig: SequenceConfig,\n  sourceElements: HTMLElement | HTMLElement[],\n  sequence: ReturnType<typeof Interact.getSequence>,\n  selectorCondition?: string,\n) {\n  const sources = Array.isArray(sourceElements) ? sourceElements : [sourceElements];\n\n  sources.forEach((sourceEl) => {\n    (TRIGGER_TO_HANDLER_MODULE_MAP[interaction.trigger] as any)?.add(\n      sourceEl,\n      sourceEl,\n      { triggerType: sequenceConfig.triggerType } as Effect,\n      interaction.params || {},\n      {\n        reducedMotion: Interact.forceReducedMotion,\n        selectorCondition,\n        animation: sequence,\n        allowA11yTriggers: Interact.allowA11yTriggers,\n      },\n    );\n  });\n}\n\nfunction _resolveListItemIndices(\n  controller: IInteractionController,\n  listContainer: string,\n  elements: HTMLElement[],\n): number[] {\n  const useFirstChild = controller.useFirstChild;\n  const root = useFirstChild\n    ? (controller.element.firstElementChild as HTMLElement)\n    : controller.element;\n  const container = root?.querySelector(listContainer);\n\n  if (!container) return elements.map((_, i) => i);\n\n  const allChildren = Array.from(container.children);\n\n  return elements.map((el) => {\n    const idx = allChildren.indexOf(el);\n    return idx >= 0 ? idx : allChildren.length;\n  });\n}\n\nfunction _processSequences(\n  sourceKey: string,\n  sourceController: IInteractionController,\n  instance: Interact,\n  interaction: Interaction,\n  elements?: HTMLElement[],\n) {\n  interaction.sequences?.forEach((seqOrRef) => {\n    let sequenceConfig: SequenceConfig;\n\n    if (_isSequenceConfigRef(seqOrRef)) {\n      const resolved = instance.dataCache.sequences[seqOrRef.sequenceId];\n\n      if (!resolved) {\n        console.warn(`Interact: Sequence \"${seqOrRef.sequenceId}\" not found in cache`);\n        return;\n      }\n\n      sequenceConfig = { ...resolved, ...seqOrRef };\n    } else {\n      sequenceConfig = seqOrRef as SequenceConfig;\n    }\n\n    const sequenceId = sequenceConfig.sequenceId || generateId();\n    const cacheKey = getInterpolatedKey(`${sourceKey}::seq::${sequenceId}`, sourceKey);\n\n    if (instance.addedInteractions[cacheKey] && !elements) return;\n\n    const listElements: ListElements | undefined =\n      elements && interaction.listContainer\n        ? { controllerKey: sourceKey, listContainer: interaction.listContainer, elements }\n        : undefined;\n\n    const animationGroupArgs = _buildAnimationGroupArgsFromSequence(\n      sequenceConfig,\n      cacheKey,\n      sourceKey,\n      sourceController,\n      instance,\n      { updateKey: sourceKey, onUpdate: () => sourceController.update() },\n      listElements,\n    );\n\n    if (!animationGroupArgs) return;\n\n    if (elements && instance.addedInteractions[cacheKey]) {\n      const indices = _resolveListItemIndices(\n        sourceController,\n        interaction.listContainer!,\n        elements,\n      );\n\n      Interact.addToSequence(cacheKey, animationGroupArgs, indices, {\n        reducedMotion: Interact.forceReducedMotion,\n      });\n\n      const sequence = Interact.getSequence(cacheKey, sequenceConfig, animationGroupArgs, {\n        reducedMotion: Interact.forceReducedMotion,\n      });\n\n      const selectorCondition = getSelectorCondition(\n        interaction.conditions || [],\n        instance.dataCache.conditions,\n      );\n\n      const sourceElements = _resolveSourceElements(interaction, sourceController, elements);\n\n      if (sourceElements) {\n        _attachSequenceTriggers(\n          interaction,\n          sequenceConfig,\n          sourceElements,\n          sequence,\n          selectorCondition,\n        );\n      }\n\n      return;\n    }\n\n    const sequence = Interact.getSequence(cacheKey, sequenceConfig, animationGroupArgs, {\n      reducedMotion: Interact.forceReducedMotion,\n    });\n\n    const selectorCondition = getSelectorCondition(\n      interaction.conditions || [],\n      instance.dataCache.conditions,\n    );\n\n    const sourceElements = _resolveSourceElements(interaction, sourceController, elements);\n\n    if (!sourceElements) return;\n\n    // Mark added only after the source resolves, so an unresolved element can be\n    // retried on a later pass instead of being permanently disabled by the guard above.\n    instance.addedInteractions[cacheKey] = true;\n\n    _attachSequenceTriggers(\n      interaction,\n      sequenceConfig,\n      sourceElements,\n      sequence,\n      selectorCondition,\n    );\n  });\n}\n\nfunction _processSequencesForTarget(\n  targetKey: string,\n  targetController: IInteractionController,\n  instance: Interact,\n  listContainer?: string,\n  elements?: HTMLElement[],\n) {\n  const sequences = instance.get(targetKey)?.sequences || {};\n  const seqInteractionIds = Object.keys(sequences);\n\n  seqInteractionIds.forEach((seqInteractionId_) => {\n    const seqVariations = sequences[seqInteractionId_];\n\n    seqVariations.some(({ sequence: sequenceConfig, ...interaction }) => {\n      const interactionMql = getMediaQuery(\n        interaction.conditions || [],\n        instance.dataCache.conditions,\n      );\n\n      if (interactionMql && !interactionMql.matches) {\n        return false;\n      }\n\n      const sourceKey = interaction.key && getInterpolatedKey(interaction.key, targetKey);\n      const sourceController = Interact.getController(sourceKey);\n\n      if (!sourceController) {\n        return true;\n      }\n\n      const sequenceId = sequenceConfig.sequenceId || generateId();\n      const cacheKey = getInterpolatedKey(`${sourceKey}::seq::${sequenceId}`, sourceKey!);\n\n      if (instance.addedInteractions[cacheKey] && !elements) {\n        return true;\n      }\n\n      const listElements: ListElements | undefined =\n        elements && listContainer\n          ? { controllerKey: targetKey, listContainer, elements }\n          : undefined;\n\n      const animationGroupArgs = _buildAnimationGroupArgsFromSequence(\n        sequenceConfig,\n        cacheKey,\n        sourceKey!,\n        sourceController,\n        instance,\n        { updateKey: targetKey, onUpdate: () => targetController.update() },\n        listElements,\n      );\n\n      if (!animationGroupArgs) return true;\n\n      if (elements && instance.addedInteractions[cacheKey]) {\n        const indices = _resolveListItemIndices(targetController, listContainer!, elements);\n\n        Interact.addToSequence(cacheKey, animationGroupArgs, indices, {\n          reducedMotion: Interact.forceReducedMotion,\n        });\n\n        return true;\n      }\n\n      const sequence = Interact.getSequence(cacheKey, sequenceConfig, animationGroupArgs, {\n        reducedMotion: Interact.forceReducedMotion,\n      });\n\n      const selectorCondition = getSelectorCondition(\n        interaction.conditions || [],\n        instance.dataCache.conditions,\n      );\n\n      const sourceElements = _resolveSourceElements(interaction, sourceController);\n\n      if (!sourceElements) return true;\n\n      // Mark added only after the source resolves, so an unresolved element can be\n      // retried on a later pass instead of being permanently disabled by the guard above.\n      instance.addedInteractions[cacheKey] = true;\n\n      _attachSequenceTriggers(\n        interaction,\n        sequenceConfig,\n        sourceElements,\n        sequence,\n        selectorCondition,\n      );\n\n      return true;\n    });\n  });\n}\n\nfunction addEffectsForTarget(\n  targetKey: string,\n  targetController: IInteractionController,\n  instance: Interact,\n  listContainer?: string,\n  elements?: HTMLElement[],\n) {\n  const targetData = instance.get(targetKey);\n  const effects = targetData?.effects || {};\n  const interactionIds = Object.keys(effects);\n  const interactionsToApply: InteractionsToApply = [];\n\n  interactionIds.forEach((interactionId_) => {\n    const interactionId = getInterpolatedKey(interactionId_, targetKey);\n\n    if (instance.addedInteractions[interactionId] && !elements) {\n      // Skip this interaction if it has already been added\n      return;\n    }\n\n    const effectVariations = effects[interactionId_];\n\n    // use `some` to short-circuit after the first effect that matches the conditions\n    effectVariations.some(({ effect, ...interaction }, variationIndex) => {\n      const interactionMql = getMediaQuery(\n        interaction.conditions || [],\n        instance!.dataCache.conditions,\n      );\n\n      if (interactionMql && !interactionMql.matches) {\n        // skip this effect if the interaction's media conditions don't match\n        return false;\n      }\n\n      const effectId = (effect as EffectRef).effectId;\n\n      const effectOptions = {\n        ...(instance!.dataCache.effects[effectId] || {}),\n        ...effect,\n        effectId,\n      };\n\n      if (listContainer && effectOptions.listContainer !== listContainer) {\n        // skip this effect if a listContainer was provided and it's not matching this effect.listContainer\n        return false;\n      }\n\n      const mql = getMediaQuery(effectOptions.conditions || [], instance!.dataCache.conditions);\n\n      if (mql) {\n        instance.setupMediaQueryListener(\n          `${interactionId}::${variationIndex}`,\n          mql,\n          targetKey,\n          () => {\n            // For effects on target, we reconcile the target element\n            targetController.update();\n          },\n        );\n      }\n\n      if (!mql || mql.matches) {\n        const sourceKey = interaction.key && getInterpolatedKey(interaction.key, targetKey);\n        const sourceController = Interact.getController(sourceKey);\n\n        if (!sourceController) {\n          // Bail out :: no source or target elements in cache\n          return true;\n        }\n\n        // Effect-level plugins act on the effect's target element before it is resolved.\n        _applyPlugins(\n          targetController,\n          targetController.element,\n          effectOptions,\n          targetKey,\n          'effect',\n        );\n\n        if (effectOptions.listContainer) {\n          targetController.watchChildList(effectOptions.listContainer);\n        }\n\n        const [sourceElements, targetElements] = _getInteractionElements(\n          interaction,\n          effectOptions,\n          sourceController.element,\n          sourceController.useFirstChild,\n          targetController.element,\n          targetController.useFirstChild,\n          undefined,\n          elements,\n        );\n\n        if (!sourceElements || !targetElements) {\n          // Bail out :: no source or target elements found in DOM\n          return true;\n        }\n\n        instance!.addedInteractions[interactionId] = true;\n\n        const selectorCondition = getSelectorCondition(\n          effectOptions.conditions || [],\n          instance!.dataCache.conditions,\n        );\n\n        interactionsToApply.push([\n          targetKey,\n          interaction,\n          effectOptions as Effect,\n          sourceElements,\n          targetElements,\n          selectorCondition,\n          targetController.useFirstChild,\n          sourceKey || undefined,\n        ]);\n\n        // short-circuit the loop since we have a match\n        return true;\n      }\n\n      return false;\n    });\n  });\n\n  // apply the effects in reverse to return to the order specified by the user to ensure order of composition is as defined\n  interactionsToApply.reverse().forEach((interaction) => {\n    _applyInteraction(...interaction);\n  });\n\n  _processSequencesForTarget(targetKey, targetController, instance, listContainer, elements);\n\n  const hasSequences = Object.keys(targetData?.sequences || {}).length > 0;\n  return interactionIds.length > 0 || hasSequences;\n}\n\n/**\n * Registers a handler to an event on a given element.\n */\nfunction addInteraction<T extends TriggerType>(\n  targetKey: string,\n  source: HTMLElement,\n  trigger: T,\n  target: HTMLElement,\n  effect: Effect,\n  options: InteractionParamsTypes[T],\n  selectorCondition?: string,\n  useFirstChild?: boolean,\n  sourceKey?: string,\n): void {\n  let targetController;\n\n  if ((effect as StateEffect).transition || (effect as StateEffect).transitionProperties) {\n    const args: CreateTransitionCSSParams = {\n      key: targetKey,\n      effectId: (effect as Effect).effectId!,\n      transition: (effect as StateEffect).transition,\n      transitionProperties: (effect as StateEffect).transitionProperties,\n      childSelector: getSelector(effect, {\n        asCombinator: true,\n        addItemFilter: true,\n        useFirstChild,\n      }),\n      selectorCondition,\n    };\n\n    targetController = Interact.getController(targetKey);\n    if (!targetController) {\n      return;\n    }\n\n    targetController.renderStyle(createTransitionCSS(args));\n  }\n\n  let sourceAnimationOptions;\n  if (trigger === 'animationEnd') {\n    const triggerEffectId = (options as AnimationEndParams).effectId;\n    const instance = sourceKey ? Interact.getInstance(sourceKey) : undefined;\n    const srcEffect = instance?.dataCache.effects[triggerEffectId] as TimeEffect | undefined;\n    if (srcEffect) {\n      sourceAnimationOptions = effectToAnimationOptions(srcEffect) as\n        | AnimationOptions<'time'>\n        | undefined;\n    }\n  }\n\n  TRIGGER_TO_HANDLER_MODULE_MAP[trigger]?.add(source, target, effect, options, {\n    reducedMotion: Interact.forceReducedMotion,\n    targetController,\n    selectorCondition,\n    allowA11yTriggers: Interact.allowA11yTriggers,\n    sourceAnimationOptions,\n  });\n}\n\n/**\n * Adds all events and effects to an element based on config\n */\nexport function add(controller: IInteractionController): boolean {\n  const key = controller.key as string;\n  const instance = Interact.getInstance(key);\n\n  if (!instance) {\n    console.warn(`No instance found for key: ${key}`);\n\n    // even if we don't find a matching instance, we still want to cache the element\n    Interact.setController(key, controller);\n    return false;\n  }\n\n  const { triggers = [] } = instance?.get(key) || {};\n  const hasTriggers = triggers.length > 0;\n\n  instance.setController(key, controller);\n\n  triggers.forEach((interaction, index) => {\n    const mql = getMediaQuery(interaction.conditions, instance!.dataCache.conditions);\n\n    if (mql) {\n      const interactionId = `${key}::trigger::${index}`;\n      instance.setupMediaQueryListener(interactionId, mql, key, () => {\n        controller.update();\n      });\n    }\n\n    if (!mql || mql.matches) {\n      // Run interaction-level plugins before target resolution / list observation so any DOM they\n      // create is visible to the selectors and MutationObservers that follow.\n      _applyPlugins(controller, controller.element, interaction, key, 'interaction');\n\n      if (interaction.listContainer) {\n        controller.watchChildList(interaction.listContainer);\n      }\n\n      _addInteraction(key, controller, instance!, interaction);\n    }\n  });\n\n  let hasEffects = false;\n  if (instance) {\n    hasEffects = addEffectsForTarget(key, controller, instance);\n  }\n\n  return hasTriggers || hasEffects;\n}\n\nexport function addListItems(\n  controller: IInteractionController,\n  listContainer: string,\n  elements: HTMLElement[],\n) {\n  const key = controller.key as string;\n  const instance = Interact.getInstance(key);\n\n  if (instance) {\n    const { triggers = [] } = instance?.get(key) || {};\n\n    triggers.forEach((interaction, index) => {\n      if (interaction.listContainer !== listContainer) {\n        return;\n      }\n\n      const mql = getMediaQuery(interaction.conditions, instance!.dataCache.conditions);\n\n      if (mql) {\n        const interactionId = `${key}::listTrigger::${listContainer}::${index}`;\n        instance.setupMediaQueryListener(interactionId, mql, key, () => {\n          // For list items, reconciling the root might be expensive but safe\n          controller.update();\n        });\n      }\n\n      if (!mql || mql.matches) {\n        _addInteraction(key, controller, instance!, interaction, elements);\n      }\n    });\n\n    addEffectsForTarget(key, controller, instance, listContainer, elements);\n  }\n}\n","import { Interact } from './Interact';\nimport TRIGGER_TO_HANDLER_MODULE_MAP from '../handlers';\nimport type { IInteractionController } from '../types';\n\n/**\n * Removes all events and effects from an element based on config\n */\nexport function remove(controller: IInteractionController, removeFromCache: boolean = false): void {\n  const key = controller.key as string;\n  const instance = Interact.getInstance(key);\n\n  if (!instance) {\n    return;\n  }\n\n  const selectors = [...(instance.get(key)?.selectors.values() || [])].filter(Boolean).join(',');\n  let elements;\n\n  if (selectors) {\n    elements = [...controller.element.querySelectorAll(selectors)];\n\n    if (!controller.useFirstChild) {\n      elements.push(controller.element);\n    }\n  } else {\n    elements = [controller.element];\n  }\n\n  removeListItems(elements as HTMLElement[]);\n\n  // React can't seem to recover in StrictMode since it doesn't invoke ref callback 2nd time\n  instance.deleteController(key, removeFromCache);\n}\n\nexport function removeListItems(elements: HTMLElement[]) {\n  const modules = Object.values(TRIGGER_TO_HANDLER_MODULE_MAP);\n\n  for (const element of elements) {\n    for (const module of modules) {\n      module.remove(element);\n    }\n  }\n\n  Interact.removeFromSequences(elements);\n}\n","import type { IInteractElement, InteractPluginCleanup, StateAction } from '../types';\nimport { add, addListItems } from './add';\nimport { remove, removeListItems } from './remove';\n\nexport const INTERACT_EFFECT_DATA_ATTR = 'interactEffect';\n\nexport class InteractionController {\n  element: HTMLElement;\n  key: string | undefined;\n  connected: boolean;\n  sheet: CSSStyleSheet | null;\n  useFirstChild: boolean;\n  _observers: WeakMap<HTMLElement, MutationObserver>;\n  _pluginCleanups: InteractPluginCleanup[];\n  _appliedPlugins: WeakSet<object>;\n\n  constructor(element: HTMLElement, key?: string, options?: { useFirstChild?: boolean }) {\n    this.element = element;\n    this.key = key;\n    this.connected = false;\n    this.sheet = null;\n    this._observers = new WeakMap();\n    this._pluginCleanups = [];\n    this._appliedPlugins = new WeakSet();\n    this.useFirstChild = options?.useFirstChild ?? false;\n  }\n\n  connect(key?: string) {\n    if (this.connected) {\n      return;\n    }\n\n    const domKey = this.element.dataset.interactKey;\n\n    key = key || this.key || domKey;\n\n    if (!key) {\n      console.warn('Interact: No key provided');\n      return;\n    }\n\n    if (domKey !== key) {\n      if (domKey) {\n        console.warn(\n          `Interact: Key mismatch between element ${domKey} and parameter ${key}, updating element key`,\n        );\n      }\n\n      this.element.dataset.interactKey = key;\n    }\n\n    this.key = key;\n\n    this.connected = add(this);\n  }\n\n  disconnect({ removeFromCache = false }: { removeFromCache?: boolean } = {}) {\n    const key = this.key || this.element.dataset.interactKey;\n\n    if (key) {\n      remove(this, removeFromCache);\n    }\n\n    // Run plugin cleanups after `remove()` has torn down animations on the (possibly\n    // plugin-generated) elements, then revert the plugins' DOM mutations.\n    if (this._pluginCleanups.length) {\n      for (const cleanup of this._pluginCleanups) {\n        try {\n          cleanup();\n        } catch (e) {\n          console.error(e);\n        }\n      }\n      this._pluginCleanups.length = 0;\n    }\n    this._appliedPlugins = new WeakSet();\n\n    if (this.sheet) {\n      const rootNode = this.element?.getRootNode() as ShadowRoot | Document;\n      const adoptTarget: { adoptedStyleSheets: CSSStyleSheet[] } = ((rootNode as ShadowRoot).host\n        ? (rootNode as ShadowRoot)\n        : document) as unknown as { adoptedStyleSheets: CSSStyleSheet[] };\n      const index = adoptTarget.adoptedStyleSheets.indexOf(this.sheet);\n      if (index !== -1) {\n        adoptTarget.adoptedStyleSheets = adoptTarget.adoptedStyleSheets.filter(\n          (s) => s !== this.sheet,\n        );\n      }\n    }\n\n    this._observers = new WeakMap();\n    this.sheet = null;\n    this.connected = false;\n  }\n\n  update() {\n    this.disconnect();\n    this.connect();\n  }\n\n  renderStyle(cssRules: string[]) {\n    const rootNode = this.element?.getRootNode() as ShadowRoot | Document;\n    const adoptTarget: { adoptedStyleSheets: CSSStyleSheet[] } = ((rootNode as ShadowRoot).host\n      ? (rootNode as ShadowRoot)\n      : document) as unknown as { adoptedStyleSheets: CSSStyleSheet[] };\n    if (!this.sheet) {\n      this.sheet = new CSSStyleSheet();\n      void this.sheet.replaceSync(cssRules.join('\\n'));\n\n      adoptTarget.adoptedStyleSheets = [...(adoptTarget.adoptedStyleSheets || []), this.sheet];\n    } else {\n      let position = this.sheet.cssRules.length;\n\n      for (const cssRule of cssRules) {\n        try {\n          this.sheet.insertRule(cssRule, position);\n          position++;\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    }\n  }\n\n  toggleEffect(\n    effectId: string,\n    stateAction: StateAction,\n    item?: HTMLElement | null,\n    isLegacy?: boolean,\n  ) {\n    if (item === null) {\n      return;\n    }\n\n    if (!isLegacy && (this.element as IInteractElement).toggleEffect) {\n      (this.element as IInteractElement).toggleEffect(effectId, stateAction, item);\n      return;\n    }\n\n    const currentEffects = new Set(\n      this.element.dataset[INTERACT_EFFECT_DATA_ATTR]?.split(' ') || [],\n    );\n\n    if (stateAction === 'toggle') {\n      if (currentEffects.has(effectId)) {\n        currentEffects.delete(effectId);\n      } else {\n        currentEffects.add(effectId);\n      }\n    } else if (stateAction === 'add') {\n      currentEffects.add(effectId);\n    } else if (stateAction === 'remove') {\n      currentEffects.delete(effectId);\n    } else if (stateAction === 'clear') {\n      currentEffects.clear();\n    }\n\n    (item || this.element).dataset[INTERACT_EFFECT_DATA_ATTR] =\n      Array.from(currentEffects).join(' ');\n  }\n\n  getActiveEffects(): string[] {\n    const raw = this.element.dataset[INTERACT_EFFECT_DATA_ATTR] || '';\n    const trimmed = raw.trim();\n    return trimmed ? trimmed.split(/\\s+/) : [];\n  }\n\n  watchChildList(listContainer: string): void {\n    const list = this.element.querySelector(listContainer);\n\n    if (list) {\n      // TODO: we can probably improve this and use less observers, this impl. uses one per container element\n      let observer = this._observers.get(list as HTMLElement);\n\n      if (!observer) {\n        observer = new MutationObserver(this._childListChangeHandler.bind(this, listContainer));\n\n        this._observers.set(list as HTMLElement, observer);\n\n        observer.observe(list as HTMLElement, { childList: true });\n      }\n    }\n  }\n\n  _childListChangeHandler(listContainer: string, entries: MutationRecord[]) {\n    const key = this.key || this.element.dataset.interactKey;\n    const removedElements: HTMLElement[] = [];\n    const addedElements: HTMLElement[] = [];\n\n    entries.forEach((entry) => {\n      entry.removedNodes.forEach((el) => {\n        if (el instanceof HTMLElement) {\n          removedElements.push(el);\n        }\n      });\n\n      entry.addedNodes.forEach((el) => {\n        if (el instanceof HTMLElement) {\n          addedElements.push(el);\n        }\n      });\n    });\n\n    removeListItems(removedElements);\n\n    if (key) {\n      addListItems(this, listContainer, addedElements);\n    }\n  }\n}\n","import { Interact } from '../core/Interact';\nimport { InteractionController } from '../core/InteractionController';\n\nexport function add(element: HTMLElement, key?: string): void {\n  const controller = new InteractionController(element, key);\n\n  controller.connect();\n}\n\nexport function remove(key: string): void {\n  const controller = Interact.getController(key);\n  if (!controller) {\n    return;\n  }\n\n  controller.disconnect({ removeFromCache: true });\n}\n"],"names":["_processKeysForInterpolation","key","_","_instanceKey","getInterpolatedKey","template","keys","index","k","shouldUseInitial","interaction","effect","getElementHash","elementIdentifier","listContainer","listItemSelector","selector","PLUGIN_FIELD_PREFIX","AnimationGroup","animations","options","longest","current","longestEndTime","currentEndTime","callback","animation","p","delay","duration","iterations","time","rate","a","target","effectId","endEvent","_error","error","cancelEvent","name","id","timing","linear","t","sineIn","sineOut","sineInOut","quadIn","quadOut","quadInOut","cubicIn","cubicOut","cubicInOut","quartIn","quartOut","quartInOut","quintIn","quintOut","quintInOut","expoIn","expoOut","expoInOut","circIn","circOut","circInOut","backIn","backOut","backInOut","jsEasings","cubicBezierCalc","x1","y1","x2","y2","cx1","cx2","cx3","cy1","cy2","cy3","t_val","shift","qNum","qDen","p_3","q_2","m","rootIdx","arg","root","angle","sqrt","jsEasingsInCSS","cssEasings","getCssUnits","unit","VENDOR_PREFIX","KEYFRAME_CSS_TO_WAAPI","toCSSPropertyName","char","toWAAPIPropertyName","toWAAPIKeyframeKey","keyframeNeedsNormalizing","frame","normalizeKeyframes","keyframes","normalized","normalizedFrame","getEasing","easing","cubicBezierEasing","cx","bx","ax","cy","by","ay","sampleX","sampleY","sampleDX","solveT","x","i","dx","d","lo","hi","xMid","parseCubicBezierParams","str","parseCubicBezier","params","parseCubicBezierToCalc","parseCssLinearStops","parts","s","stops","part","tokens","output","pcts","v","start","end","startPos","endPos","span","j","parseCssLinear","resolved","last","mid","b","parseCssLinearToCalc","terms","dy","clampMid","getJsEasing","named","getJsEasingInCSS","Sequence","animationGroups","allAnimations","group","g","count","offsets","sequenceDuration","groupIdx","animIdx","baseDelay","endDelay","result","activeDuration","max","entries","sorted","clampedIndex","flatAnimations","insertAt","sum","predicate","removed","keptGroups","keptTimingOptions","CustomAnimation","customEffect","effectOptions","timingOptions","timeline","progress","speed","uid","e","tl","cb","playbackRate","type","listener","event","getDefaultExportFromCjs","win","debug","raf","FastDom","self","tasks","task","fn","ctx","scheduleFlush","remove","props","child","mixin","fastdom","flush","writes","reads","array","item","source","exports","module","this","registry","registerEffects","effects","getRegisteredEffect","warn","getElement","ownerDocument","getElementMotionPart","element","getTargetParts","getDirection","alternate","getLength","length","getRange","range","add","isEnd","getRanges","measure","mutate","getNamedEffect","effectName","animation_","getEffectsData","trigger","forCSS","isNotAScrubTrigger","getWebAnimationEffect","preset","domApi","getWebAnimation","animationOptions","mouseAnimationPreset","mouseAnimationFactory","namedEffect","animationsData","data","isViewProgress","effectTarget","keyframeEffect","startOffset","endOffset","startOffsetToWrite","endOffsetToWrite","resolve","getAnimationAsCSS","isRunning","sequenceOptions","fill","direction","animationName","isAutoDuration","sequenceId","seqDelay","offset","offsetEasing","delayStr","calcEasing","getCSSAnimationEffect","getCSSAnimation","prepareAnimation","getElementCSSAnimation","getElementAnimation","effectNames","el","animationNames","anim","filteredAnimations","getScrubScene","sceneOptions","disabled","allowActiveEvent","rest","typeSpecificOptions","viewSource","ready","partialAnimation","__","scrubOptions","centeredToTarget","transitionDuration","transitionEasing","axis","animationGroup","linearProgress","active","getAnimation","reducedMotion","resolveTargets","createAnimationGroups","animationGroupArgs","context","groups","animationGroupOptions","elements","getSequence","roundNumber","num","precision","isTemplatedKey","camelToKebabCase","property","applySelectorCondition","baseSelector","generateId","c","getStateStyleProperties","transitionEffect","transition","transitionProperties","transitionEffectToTransitionsList","transitions","styleProperty","createTransitionCSS","childSelector","selectorCondition","styleProperties","escapedKey","stateSelector","dataAttrSelector","finalStateSelector","finalDataAttrSelector","transitionSelector","finalTransitionSelector","getFullPredicateByType","conditionNames","conditions","conditionContent","conditionName","getMediaQuery","condition","getSelectorCondition","TIME_TRIGGER_TO_DEFAULT_TYPE","resolveEffectForCSS","config","fallbackId","configConditions","interactionKey","isPointerMove","fullEffect","triggerType","initial","canUseEffectId","resolveSequenceForCSS","sequence","getSlotKey","sequences","fullSequence","filteredEffects","keyframePropertyToCSS","interpolateKeyframesOffsets","kf","lastDefinedIndex","currentOffset","gap","keyframeObjectToKeyframeCSS","keyframeObj","percentage","properties","value","keyframesToCSS","interpolated","keyframeBlocks","CSSRuleToString","rule","declarations","media","states","selectorSuffix","statesSelector","state","declarationsStr","important","cssRule","LIST_ANIMATION_PROPERTY_NAMES","LIST_PROPERTY_NAMES","LIST_KINDS","listKind","LIST_PROPERTY_FALLBACKS","getCustomPropName","isSlot","buildAtPropertyRules","animationLength","transitionLength","animationSlotLength","transitionSlotLength","timelineLength","lengths","slotLengths","buildSequenceListsRule","propertyNames","listIndex","slotCursor","slotsInSequence","buildListsRule","targets","DEFAULT_RANGE_VALUES","resolveRangeOffsets","rangeStart","rangeEnd","startName","endName","effectToAnimationOptions","addHandlerToMap","handlersMap","handlerObj","handlers","removeElementFromHandlerMap","handlerMap","cleanup","otherKey","DEFAULT_INITIAL","NO_SLOTS","createTargetContext","createListCounters","getCustomProps","useSlots","kind","endEffect","wrote","getEffectListKind","getSlotUsage","counts","targetHash","endSequence","counters","endInteraction","LIST_PROPERTY_NAMES_MOTION","triggerToCSS","triggerId","visited","getSelector","sourceHash","collectFieldPluginStyles","scope","plugins","rules","pluginName","pluginField","effectToCSS","customProps","assigned","partSelectors","cssAnimations","animationsByPart","custom","animationDeclarations","propertyName","_listPropertyName","childOrPartSelector","r","collectKeyframeEntry","entry","getNames","suffix","members","parseEffect","slotUsage","parseSequence","cssRules","localVisited","parseInteraction","interactionIdx","motionTrigger","resolvedEffects","effIndex","resolvedSequences","seqIndex","normalizeGenerateOptions","useFirstChild","parseConfig","collectSlots","getKeyframeSlots","interactionIndex","effectIndex","sequenceIndex","slots","suffixOf","slot","keyframeEntries","used","namesAt","names","slotKey","_generate","listsRule","atProperty","timelineScopeRule","generate","SAFE_OBSERVER_CONFIG","EXIT_OBSERVER_CONFIG","DEFAULT_THRESHOLD","insetToRootMargin","inset","top","bottom","negate","observers","elementFirstRun","elementObserverMap","viewEnterOptions","sharedExitObserver","setOptions","invokeHandlers","isIntersecting","isFullExit","handler","getExitObserver","getObserver","isSafeMode","threshold","observer","isFirstRun","sourceHeight","rootHeight","safeObserver","addViewEnterHandler","preCreatedAnimation","mergedOptions","isInitialPlay","onceDone","sourceHandlers","setEnterStart","setEnterDone","removeViewEnterHandler","reset","viewEnterHandler","defaultTo","obj","defaults","lerp","res","deltaFromStart","deltaFromEnd","frameThrottle","throttled","debounce","interval","debounced","parseOffsetCalc","offsetString","absoluteOffsetContext","match","transformAbsoluteOffsetToNumber","transformRangeToPosition","viewportSize","rect","height","startPosition","computeStickinessIntoFullRange","offsetTree","absoluteStartOffset","absoluteEndOffset","isHorizontal","accumulatedOffset","newAbsoluteRange","node","sticky","offsetFromViewEnd","stuckStart","isBeforeStart","isInsideDuration","extraOffset","parent","parentSize","elementOffset","elementSize","transformSceneRangesToOffsets","scene","startRange","endRange","overrideDuration","startAdd","endAdd","getIsSticky","style","getIsFixed","offsetParent","getStickyStartOffset","getStickyEndOffset","getRectStart","isSticky","getStickyData","stickyStart","stickyEnd","hasStickyStart","hasStickyEnd","getTransformedSceneGroup","scenes","size","elementLayoutStart","nodeStyle","VIEWPORT_RESIZE_INTERVAL","DEFAULTS","calcProgress","getViewportSize","getAbsoluteOffsetContext","getController","_config","horizontal","scenesByElement","lastP","viewportObserver","rangesResizeObserver","viewportResizeHandler","scrollportResizeObserver","rangesToObserve","acc","sceneGroup","targetToSceneGroup","transformedSceneGroup","localIndex","newRanges","newSceneGroup","intersections","intersection","scenesArray","tick","vp","velocity","destroy","Scroll","isDocumentRoot","scrollPosition","y","clearLerpFrame","hasLerp","dp","factorP","scrollManagerMap","scrollOptionsGetter","registerOptionsGetter","getter","addViewProgressHandler","triggerParams","scroll","removeViewProgressHandler","viewProgressHandler","clamp","min","getRect","left","testPointerOffsetDprBug","DPR","fixRequired","testPointerOffsetScrollBug","startY","currentY","sampleOffsetY","scrollHandler","testScrollOffsetsForWebKitPointerBug","scrollOffsets","listeners","pointers","initScrollendPolyfill","touchStartHandler","touch","touchEndHandler","addScrollendListener","timeout","removeScrollendPolyfill","scrollListener","evt","centerToTargetFactory","layerCenterX","isXStartFarthest","xDuration","x0","layerCenterY","isYStartFarthest","yDuration","y0","scrollendCallback","lastProgress","windowResize","observeRootResize","hasCenteredToTarget","resizeObserver","windowResizeHandler","scrollendHandler","removeScrollendListener","normalizedX","normalizedY","MOVEMENT_RESET_DELAY","shouldFixSynthPointer","Pointer","_measure","newX","newY","now","resetMovement","pointerManagerMap","pointerOptionsGetter","addPointerMoveHandler","pointer","removePointerMoveHandler","pointerMoveHandler","addAnimationEndHandler","sourceAnimationOptions","animName","eventEffectId","sourceAnimationGroup","removeAnimationEndHandler","animationEndHandler","createTimeEffectHandler","enterLeave","initialPlay","isToggle","isEnter","isLeave","createTransitionHandler","targetController","stateAction","shouldSetStateOnElement","action","isToggleMode","createFocusListener","ev","createClickListener","createKeydownListener","LISTENER_FACTORY_BY_EVENT_TYPE","_source","getListenerForEventType","factory","isEnterLeaveConfigShape","createGenericEventConfig","enter","leave","isEnterLeaveMode","genericConfig","getEnterLeaveConfig","addEventTriggerHandler","isTransition","once","resolvedHandler","controller","addListener","leaveEvents","eventType","removeEventTriggerHandler","eventTrigger","EVENT_TRIGGER_PRESETS","a11yTriggerOverrides","withEventTriggerConfig","presetKey","_options","interactOptions","eventConfig","TRIGGER_TO_HANDLER_MODULE_MAP","_convertToKeyTemplate","Interact","useCustomElement","defined","clearCache","removeFromCache","processedKey","interactionId_","interactionId","seqPrefix","cacheKey","mql","instance","plugin","cached","getMotionSequence","indices","seqs","interactionIdCounter","asCombinator","addItemFilter","itemFilter","_isSequenceConfigRef","_ensureInteractionEntry","interactions","withSlots","getKey","effectMap","sequenceMap","interaction_","configIndex","effects_","sequences_","processedSequences","seqOrRef","seq","referencedEffect","configEffectIndex","targetEntry","seqConfig","sequenceConfig","effectSelector","seqInteractionId","_applyPlugins","owner","pluginNames","field","_getElementsFromData","container","_queryItemElement","_getInteractionElements","sourceUseFirstChild","targetUseFirstChild","sourceElements","targetElements","_applyInteraction","targetKey","sourceKey","isSourceArray","isTargetArray","sourceEl","targetEl","addInteraction","_addInteraction","sourceController","interactionVariations","interactionsToApply","targetKey_","_processSequences","_buildAnimationGroupArgsFromSequence","listElements","seqMql","seqEffects","usedListElements","effectMql","effectCacheKey","resolvedTargetKey","targetElement","animOptions","_resolveSourceElements","_attachSequenceTriggers","_resolveListItemIndices","allChildren","idx","_processSequencesForTarget","seqInteractionId_","interactionMql","addEffectsForTarget","targetData","interactionIds","variationIndex","hasSequences","args","triggerEffectId","srcEffect","triggers","hasTriggers","hasEffects","addListItems","selectors","removeListItems","modules","INTERACT_EFFECT_DATA_ATTR","InteractionController","domKey","rootNode","adoptTarget","position","isLegacy","currentEffects","trimmed","list","removedElements","addedElements"],"mappings":"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","x_google_ignoreList":[7,20,21,22,23,25,26,27,28]}