use-scroll-animate 2.9.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +4 -3
  3. package/README_ja.md +1 -0
  4. package/README_zh.md +2 -1
  5. package/dist/chunks/{base-BkQcvoSG.cjs → base-CXx7jZ-o.cjs} +4 -23
  6. package/dist/chunks/{base-BkQcvoSG.cjs.map → base-CXx7jZ-o.cjs.map} +1 -1
  7. package/dist/chunks/{base-CB8gChoe.js → base-Cu-86Z31.js} +5 -24
  8. package/dist/chunks/{base-CB8gChoe.js.map → base-Cu-86Z31.js.map} +1 -1
  9. package/dist/chunks/{core-J_KM443q.js → core-mV_TPgG_.js} +2 -52
  10. package/dist/chunks/core-mV_TPgG_.js.map +1 -0
  11. package/dist/chunks/{core-C1cEwjJj.cjs → core-qpECfEkb.cjs} +2 -52
  12. package/dist/chunks/core-qpECfEkb.cjs.map +1 -0
  13. package/dist/chunks/{index-tags-f37txHmb.js → index-tags-D7NynL4r.js} +2 -1
  14. package/dist/chunks/{index-tags-f37txHmb.js.map → index-tags-D7NynL4r.js.map} +1 -1
  15. package/dist/chunks/{index-tags-BEM98giN.cjs → index-tags-Gw1G06Pb.cjs} +2 -1
  16. package/dist/chunks/{index-tags-BEM98giN.cjs.map → index-tags-Gw1G06Pb.cjs.map} +1 -1
  17. package/dist/chunks/{spring-7U9MC6yQ.cjs → spring-2OTnYCzm.cjs} +2 -2
  18. package/dist/chunks/{spring-7U9MC6yQ.cjs.map → spring-2OTnYCzm.cjs.map} +1 -1
  19. package/dist/chunks/{spring-ka0YJ_ZR.js → spring-BV-cpTHC.js} +2 -2
  20. package/dist/chunks/{spring-ka0YJ_ZR.js.map → spring-BV-cpTHC.js.map} +1 -1
  21. package/dist/chunks/{stagger-CGF18oNs.js → stagger-BFAhKknX.js} +2 -2
  22. package/dist/chunks/{stagger-CGF18oNs.js.map → stagger-BFAhKknX.js.map} +1 -1
  23. package/dist/chunks/{stagger-DtKKS6GP.cjs → stagger-CLc3j58T.cjs} +2 -2
  24. package/dist/chunks/{stagger-DtKKS6GP.cjs.map → stagger-CLc3j58T.cjs.map} +1 -1
  25. package/dist/chunks/{variants-PsCXbQ5h.cjs → variants-BNIrn4ch.cjs} +2 -2
  26. package/dist/chunks/{variants-PsCXbQ5h.cjs.map → variants-BNIrn4ch.cjs.map} +1 -1
  27. package/dist/chunks/{variants-Ce9CboVc.js → variants-BQ3gCb5L.js} +2 -2
  28. package/dist/chunks/{variants-Ce9CboVc.js.map → variants-BQ3gCb5L.js.map} +1 -1
  29. package/dist/components/background.cjs +3 -3
  30. package/dist/components/background.cjs.map +1 -1
  31. package/dist/components/background.css +1 -1
  32. package/dist/components/background.d.cts +1 -1
  33. package/dist/components/background.d.ts +1 -1
  34. package/dist/components/background.js +4 -4
  35. package/dist/components/background.js.map +1 -1
  36. package/dist/components/cards.cjs +2 -2
  37. package/dist/components/cards.js +3 -3
  38. package/dist/components/click.cjs +2 -2
  39. package/dist/components/click.js +3 -3
  40. package/dist/components/feedback.cjs +9 -16
  41. package/dist/components/feedback.cjs.map +1 -1
  42. package/dist/components/feedback.css +2 -2
  43. package/dist/components/feedback.d.cts +2 -4
  44. package/dist/components/feedback.d.ts +2 -4
  45. package/dist/components/feedback.js +10 -17
  46. package/dist/components/feedback.js.map +1 -1
  47. package/dist/components/interaction.cjs +1 -1
  48. package/dist/components/interaction.js +2 -2
  49. package/dist/components/jsx.d.cts +1 -0
  50. package/dist/components/jsx.d.ts +1 -0
  51. package/dist/components/lazy.cjs +2 -1
  52. package/dist/components/lazy.cjs.map +1 -1
  53. package/dist/components/lazy.d.cts +1 -0
  54. package/dist/components/lazy.d.ts +1 -0
  55. package/dist/components/lazy.js +2 -1
  56. package/dist/components/lazy.js.map +1 -1
  57. package/dist/components/page.cjs +2 -2
  58. package/dist/components/page.js +3 -3
  59. package/dist/components/physics.cjs +2 -2
  60. package/dist/components/physics.js +4 -4
  61. package/dist/components/react.cjs +1 -1
  62. package/dist/components/react.js +1 -1
  63. package/dist/components/reveal.cjs +1 -1
  64. package/dist/components/reveal.js +2 -2
  65. package/dist/components/text.cjs +1 -1
  66. package/dist/components/text.js +2 -2
  67. package/dist/components/timeline.cjs +303 -0
  68. package/dist/components/timeline.cjs.map +1 -0
  69. package/dist/components/timeline.css +3 -0
  70. package/dist/components/timeline.d.cts +164 -0
  71. package/dist/components/timeline.d.ts +164 -0
  72. package/dist/components/timeline.js +296 -0
  73. package/dist/components/timeline.js.map +1 -0
  74. package/dist/components/transitions.cjs +7 -7
  75. package/dist/components/transitions.cjs.map +1 -1
  76. package/dist/components/transitions.d.cts +1 -1
  77. package/dist/components/transitions.d.ts +1 -1
  78. package/dist/components/transitions.js +8 -8
  79. package/dist/components/transitions.js.map +1 -1
  80. package/dist/components/ui.cjs +3 -3
  81. package/dist/components/ui.js +5 -5
  82. package/dist/components/vue.cjs +5 -4
  83. package/dist/components/vue.cjs.map +1 -1
  84. package/dist/components/vue.d.cts +91 -6
  85. package/dist/components/vue.d.ts +91 -6
  86. package/dist/components/vue.js +5 -4
  87. package/dist/components/vue.js.map +1 -1
  88. package/dist/components.cjs +11 -4
  89. package/dist/components.cjs.map +1 -1
  90. package/dist/components.css +4 -3
  91. package/dist/components.d.cts +124 -8
  92. package/dist/components.d.ts +124 -8
  93. package/dist/components.js +10 -7
  94. package/dist/components.js.map +1 -1
  95. package/dist/components.umd.js +2 -2
  96. package/dist/components.umd.js.map +1 -1
  97. package/dist/element.cjs +2 -3
  98. package/dist/element.cjs.map +1 -1
  99. package/dist/element.d.cts +4 -19
  100. package/dist/element.d.ts +4 -19
  101. package/dist/element.js +2 -3
  102. package/dist/element.js.map +1 -1
  103. package/dist/element.umd.js +1 -1
  104. package/dist/element.umd.js.map +1 -1
  105. package/dist/index.cjs +2 -2
  106. package/dist/index.cjs.map +1 -1
  107. package/dist/index.d.cts +4 -19
  108. package/dist/index.d.ts +4 -19
  109. package/dist/index.js +3 -3
  110. package/dist/index.js.map +1 -1
  111. package/dist/index.umd.js +2 -2
  112. package/dist/index.umd.js.map +1 -1
  113. package/dist/react.cjs +3 -3
  114. package/dist/react.cjs.map +1 -1
  115. package/dist/react.d.cts +3 -18
  116. package/dist/react.d.ts +3 -18
  117. package/dist/react.js +3 -3
  118. package/dist/react.js.map +1 -1
  119. package/dist/solid.cjs +2 -2
  120. package/dist/solid.d.cts +3 -18
  121. package/dist/solid.d.ts +3 -18
  122. package/dist/solid.js +2 -2
  123. package/dist/svelte.cjs +2 -2
  124. package/dist/svelte.d.cts +3 -18
  125. package/dist/svelte.d.ts +3 -18
  126. package/dist/svelte.js +2 -2
  127. package/dist/vue.cjs +3 -3
  128. package/dist/vue.cjs.map +1 -1
  129. package/dist/vue.d.cts +3 -18
  130. package/dist/vue.d.ts +3 -18
  131. package/dist/vue.js +3 -3
  132. package/dist/vue.js.map +1 -1
  133. package/docs/API.md +1 -2
  134. package/docs/components.md +12 -3
  135. package/docs/upgrading-3.md +1 -0
  136. package/package.json +14 -3
  137. package/dist/chunks/core-C1cEwjJj.cjs.map +0 -1
  138. package/dist/chunks/core-J_KM443q.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { h as hasDOM, s as supportsObserver, b as resolveTargets, p as prepareElement, a as stopAnimation, c as createScrollAnimate, g as getScrollProgress, d as prefersReducedMotion } from './chunks/core-J_KM443q.js';
2
- export { E as EASING_MAP, P as PRESETS, e as resolveEasing, f as resolvePreset, i as supportsScrollTimeline } from './chunks/core-J_KM443q.js';
3
- export { s as staggerChildren } from './chunks/stagger-CGF18oNs.js';
1
+ import { h as hasDOM, s as supportsObserver, b as resolveTargets, p as prepareElement, a as stopAnimation, c as createScrollAnimate, g as getScrollProgress, d as prefersReducedMotion } from './chunks/core-mV_TPgG_.js';
2
+ export { E as EASING_MAP, P as PRESETS, e as resolveEasing, f as resolvePreset, i as supportsScrollTimeline } from './chunks/core-mV_TPgG_.js';
3
+ export { s as staggerChildren } from './chunks/stagger-BFAhKknX.js';
4
4
 
5
5
  /**
6
6
  * use-scroll-animate - Sequence / timeline helper
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/sequence.ts","../src/parallax.ts","../src/index.ts"],"sourcesContent":["/**\n * use-scroll-animate - Sequence / timeline helper\n * Chain animations on several targets, one after another (or overlapping).\n */\n\nimport type { AnimateOptions, ScrollAnimateInstance } from './types';\nimport { createScrollAnimate, hasDOM, prepareElement, resolveTargets, stopAnimation, supportsObserver } from './core';\n\nexport interface SequenceStep extends AnimateOptions {\n /** Selector, Element, NodeList or Element[] to animate in this step */\n target: string | Element | NodeList | Element[];\n /** Pause (ms) after the previous step ends before this one starts. Negative values overlap. (default: 0) */\n gap?: number;\n /** Absolute start time (ms) on the timeline; overrides `gap` */\n at?: number;\n}\n\nexport interface SequenceOptions extends AnimateOptions {\n /** Play automatically (once) when this element/selector enters the viewport */\n trigger?: string | Element;\n /** Instance whose global config (easing, classes, `disabled`) is used */\n instance?: ScrollAnimateInstance;\n}\n\nexport interface SequenceController {\n /** Play (or replay) the timeline. Resolves when every step has completed, or on `cancel()`. */\n play(): Promise<void>;\n /** Stop the trigger and running animations; elements are left visible. */\n cancel(): void;\n /** Total duration of the timeline in ms (computed for the current DOM). */\n duration(): number;\n}\n\nlet fallback: ScrollAnimateInstance | null = null;\n\ntype Planned = { el: Element; opts: AnimateOptions; end: number };\n\nfunction plan(steps: SequenceStep[], defaults: AnimateOptions): Planned[] {\n const out: Planned[] = [];\n let cursor = 0;\n steps.forEach((step) => {\n const { target, gap = 0, at, ...stepOpts } = step;\n const opts = { ...defaults, ...stepOpts };\n const duration = opts.duration ?? 600;\n const start = Math.max(0, at ?? cursor + gap) + (opts.delay ?? 0);\n let end = Math.max(cursor, start);\n resolveTargets(target).forEach((el, i) => {\n const delay = start + i * (opts.stagger ?? 0);\n out.push({ el, opts: { ...opts, duration, delay, stagger: 0 }, end: delay + duration });\n end = Math.max(end, delay + duration);\n });\n cursor = end;\n });\n return out;\n}\n\n/**\n * Build a timeline of animations.\n *\n * @example\n * sequence([\n * { target: '.title', animation: 'fade-in-up' },\n * { target: '.subtitle', animation: 'blur-in', gap: -300 }, // overlap by 300ms\n * { target: '.card', animation: 'scale-up', stagger: 80 },\n * ], { trigger: '.hero' });\n */\nexport function sequence(steps: SequenceStep[], options: SequenceOptions = {}): SequenceController {\n const { trigger, instance, ...defaults } = options;\n const sa = () => instance || fallback || (fallback = createScrollAnimate());\n let io: IntersectionObserver | undefined;\n let active: Planned[] = [];\n let settle: (() => void) | undefined;\n // Targets hidden while waiting for `trigger`; revealed if cancelled before it fires.\n let prepared: Element[] = [];\n\n const controller: SequenceController = {\n play() {\n controller.cancel();\n if (!hasDOM()) return Promise.resolve();\n active = plan(steps, defaults);\n return new Promise<void>((resolve) => {\n let left = active.length;\n settle = () => {\n settle = undefined;\n resolve();\n };\n if (!left) return settle();\n const run = active;\n run.forEach(({ el, opts }) => {\n const done = opts.onComplete;\n sa().animate(el, {\n ...opts,\n onComplete: (node) => {\n done?.(node);\n if (run === active && --left === 0) settle?.();\n },\n });\n });\n });\n },\n\n cancel() {\n io?.disconnect();\n io = undefined;\n prepared.forEach((el) => stopAnimation(el));\n prepared = [];\n active.forEach(({ el }) => stopAnimation(el));\n active = [];\n settle?.();\n },\n\n duration() {\n return plan(steps, defaults).reduce((max, p) => Math.max(max, p.end), 0);\n },\n };\n\n if (trigger && hasDOM() && supportsObserver()) {\n const el = resolveTargets(trigger)[0];\n if (el) {\n prepared = plan(steps, defaults).map(({ el: target }) => target);\n prepared.forEach((target) => prepareElement(target));\n io = new IntersectionObserver(\n (entries) => {\n if (!entries.some((e) => e.isIntersecting)) return;\n io?.disconnect();\n io = undefined;\n prepared = []; // play() takes over from here\n controller.play();\n },\n { threshold: defaults.threshold ?? 0.1, rootMargin: defaults.rootMargin ?? '0px' }\n );\n io.observe(el);\n }\n }\n\n return controller;\n}\n","/**\n * use-scroll-animate - parallax() helper\n *\n * Moves elements at a different speed than the page while they cross the\n * viewport. Built on the same scroll progress as `progressVar` (0 when the\n * element's top enters at the bottom, 1 when its bottom leaves at the top):\n * the progress is written to a CSS custom property (default `--sa-parallax`)\n * and the offset is applied with the individual `translate` property, so it\n * composes with entrance animations and other `transform`s.\n */\n\nimport { getScrollProgress, hasDOM, prefersReducedMotion, resolveTargets, supportsObserver } from './core';\n\nexport interface ParallaxHelperOptions {\n /**\n * Total distance the element shifts while it crosses the viewport, as a\n * fraction of the viewport size (`0.2` = 20vh on the y axis). Positive values\n * lag behind the scroll (background-like), negative values move ahead of it\n * (foreground-like). (default: `0.2`)\n */\n speed?: number;\n /** `'y'` (default) or `'x'` (horizontal drift, in `vw`) */\n axis?: 'x' | 'y';\n /** CSS custom property receiving the progress (default: `'--sa-parallax'`) */\n progressVar?: string;\n /** Scroll container (default: the viewport) */\n root?: Element | null;\n /**\n * Under `prefers-reduced-motion: reduce` no offset is applied (the progress\n * variable is still written). Set to `false` to move anyway. (default: `true`)\n */\n respectReducedMotion?: boolean;\n}\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\n/**\n * Apply a scroll parallax to `target` (selector, Element, NodeList or array).\n * Returns a function that stops it and removes the inline styles it set.\n * SSR-safe (no-op without a DOM / IntersectionObserver).\n *\n * @example\n * const stop = parallax('.hero-bg', { speed: 0.3 });\n * parallax('.badge', { speed: -0.15, axis: 'x' });\n */\nexport function parallax(\n target: string | Element | NodeList | Element[],\n options: ParallaxHelperOptions = {}\n): () => void {\n const els = resolveTargets(target);\n if (!els.length || !hasDOM() || !supportsObserver()) return () => undefined;\n const { speed = 0.2, axis = 'y', root = null, respectReducedMotion = true } = options;\n const name = options.progressVar ? (options.progressVar.startsWith('--') ? options.progressVar : `--${options.progressVar}`) : '--sa-parallax';\n const unit = axis === 'x' ? 'vw' : 'vh';\n const visible = new Set<Element>();\n let frame = 0;\n let listening = false;\n const scroller: EventTarget = root || window;\n\n const apply = (el: Element) => {\n const style = (el as HTMLElement).style;\n if (!style) return;\n const p = getScrollProgress(el, root);\n style.setProperty(name, String(+p.toFixed(4)));\n if (respectReducedMotion && prefersReducedMotion()) {\n style.removeProperty('translate');\n return;\n }\n const offset = `${+((p - 0.5) * speed * 100).toFixed(3)}${unit}`;\n style.setProperty('translate', axis === 'x' ? `${offset} 0px` : `0px ${offset}`);\n };\n\n const update = () => {\n frame = 0;\n visible.forEach(apply);\n };\n const schedule = () => {\n if (!frame) frame = requestAnimationFrame(update);\n };\n const listen = (on: boolean) => {\n if (on === listening) return;\n listening = on;\n const method = on ? 'addEventListener' : 'removeEventListener';\n scroller[method]('scroll', schedule, PASSIVE);\n window[method]('resize', schedule, PASSIVE);\n if (!on && frame) {\n cancelAnimationFrame(frame);\n frame = 0;\n }\n };\n\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) visible.add(entry.target);\n else visible.delete(entry.target);\n apply(entry.target); // report the edges even on fast scrolls\n });\n listen(visible.size > 0);\n },\n { threshold: 0, root }\n );\n els.forEach((el) => {\n apply(el); // no jump before the first observer callback\n io.observe(el);\n });\n\n return () => {\n io.disconnect();\n listen(false);\n visible.clear();\n els.forEach((el) => {\n const style = (el as HTMLElement).style;\n if (!style) return;\n style.removeProperty('translate');\n style.removeProperty(name);\n });\n };\n}\n","/**\n * use-scroll-animate\n *\n * A lightweight, dependency-free scroll animation library for modern web\n * applications. Built with TypeScript, powered by IntersectionObserver and\n * the Web Animations API (or the native scroll-driven timeline). Safe to\n * import during SSR. Framework integrations live in the subpath entries:\n * `use-scroll-animate/react`, `/vue`, `/svelte`, `/solid`, `/element`.\n *\n * @license MIT\n * @see https://github.com/HarrisonCN/use-scroll-animate\n */\n\nexport { createScrollAnimate, getScrollProgress, supportsScrollTimeline } from './core';\nexport { staggerChildren } from './stagger';\nexport { sequence } from './sequence';\nexport { parallax } from './parallax';\nexport { PRESETS, resolvePreset, resolveEasing, EASING_MAP } from './presets';\nexport type {\n AnimationPreset,\n EasingType,\n AnimationKeyframe,\n CustomAnimation,\n ParallaxOptions,\n ProgressMode,\n ScrollEngine,\n AnimateOptions,\n ScrollAnimateConfig,\n AnimatedElement,\n ScrollAnimateInstance,\n} from './types';\nexport type { StaggerOptions } from './stagger';\nexport type { ParallaxHelperOptions } from './parallax';\nexport type { SequenceStep, SequenceOptions, SequenceController } from './sequence';\n\n// Default export: a ready-to-use singleton instance\nimport { createScrollAnimate } from './core';\n\n/**\n * Default singleton instance of ScrollAnimate.\n * Ready to use out of the box with sensible defaults.\n *\n * @example\n * ```js\n * import ScrollAnimate from 'use-scroll-animate';\n *\n * // Auto-initialize all elements with data-sa attribute\n * ScrollAnimate.init();\n *\n * // Or manually observe elements\n * ScrollAnimate.observe('.my-element', { animation: 'fade-in-up' });\n * ```\n */\nconst ScrollAnimate = /* @__PURE__ */ createScrollAnimate();\nexport default ScrollAnimate;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/sequence.ts","../src/parallax.ts","../src/index.ts"],"sourcesContent":["/**\n * use-scroll-animate - Sequence / timeline helper\n * Chain animations on several targets, one after another (or overlapping).\n */\n\nimport type { AnimateOptions, ScrollAnimateInstance } from './types';\nimport { createScrollAnimate, hasDOM, prepareElement, resolveTargets, stopAnimation, supportsObserver } from './core';\n\nexport interface SequenceStep extends AnimateOptions {\n /** Selector, Element, NodeList or Element[] to animate in this step */\n target: string | Element | NodeList | Element[];\n /** Pause (ms) after the previous step ends before this one starts. Negative values overlap. (default: 0) */\n gap?: number;\n /** Absolute start time (ms) on the timeline; overrides `gap` */\n at?: number;\n}\n\nexport interface SequenceOptions extends AnimateOptions {\n /** Play automatically (once) when this element/selector enters the viewport */\n trigger?: string | Element;\n /** Instance whose global config (easing, classes, `disabled`) is used */\n instance?: ScrollAnimateInstance;\n}\n\nexport interface SequenceController {\n /** Play (or replay) the timeline. Resolves when every step has completed, or on `cancel()`. */\n play(): Promise<void>;\n /** Stop the trigger and running animations; elements are left visible. */\n cancel(): void;\n /** Total duration of the timeline in ms (computed for the current DOM). */\n duration(): number;\n}\n\nlet fallback: ScrollAnimateInstance | null = null;\n\ntype Planned = { el: Element; opts: AnimateOptions; end: number };\n\nfunction plan(steps: SequenceStep[], defaults: AnimateOptions): Planned[] {\n const out: Planned[] = [];\n let cursor = 0;\n steps.forEach((step) => {\n const { target, gap = 0, at, ...stepOpts } = step;\n const opts = { ...defaults, ...stepOpts };\n const duration = opts.duration ?? 600;\n const start = Math.max(0, at ?? cursor + gap) + (opts.delay ?? 0);\n let end = Math.max(cursor, start);\n resolveTargets(target).forEach((el, i) => {\n const delay = start + i * (opts.stagger ?? 0);\n out.push({ el, opts: { ...opts, duration, delay, stagger: 0 }, end: delay + duration });\n end = Math.max(end, delay + duration);\n });\n cursor = end;\n });\n return out;\n}\n\n/**\n * Build a timeline of animations.\n *\n * @example\n * sequence([\n * { target: '.title', animation: 'fade-in-up' },\n * { target: '.subtitle', animation: 'blur-in', gap: -300 }, // overlap by 300ms\n * { target: '.card', animation: 'scale-up', stagger: 80 },\n * ], { trigger: '.hero' });\n */\nexport function sequence(steps: SequenceStep[], options: SequenceOptions = {}): SequenceController {\n const { trigger, instance, ...defaults } = options;\n const sa = () => instance || fallback || (fallback = createScrollAnimate());\n let io: IntersectionObserver | undefined;\n let active: Planned[] = [];\n let settle: (() => void) | undefined;\n // Targets hidden while waiting for `trigger`; revealed if cancelled before it fires.\n let prepared: Element[] = [];\n\n const controller: SequenceController = {\n play() {\n controller.cancel();\n if (!hasDOM()) return Promise.resolve();\n active = plan(steps, defaults);\n return new Promise<void>((resolve) => {\n let left = active.length;\n settle = () => {\n settle = undefined;\n resolve();\n };\n if (!left) return settle();\n const run = active;\n run.forEach(({ el, opts }) => {\n const done = opts.onComplete;\n sa().animate(el, {\n ...opts,\n onComplete: (node) => {\n done?.(node);\n if (run === active && --left === 0) settle?.();\n },\n });\n });\n });\n },\n\n cancel() {\n io?.disconnect();\n io = undefined;\n prepared.forEach((el) => stopAnimation(el));\n prepared = [];\n active.forEach(({ el }) => stopAnimation(el));\n active = [];\n settle?.();\n },\n\n duration() {\n return plan(steps, defaults).reduce((max, p) => Math.max(max, p.end), 0);\n },\n };\n\n if (trigger && hasDOM() && supportsObserver()) {\n const el = resolveTargets(trigger)[0];\n if (el) {\n prepared = plan(steps, defaults).map(({ el: target }) => target);\n prepared.forEach((target) => prepareElement(target));\n io = new IntersectionObserver(\n (entries) => {\n if (!entries.some((e) => e.isIntersecting)) return;\n io?.disconnect();\n io = undefined;\n prepared = []; // play() takes over from here\n controller.play();\n },\n { threshold: defaults.threshold ?? 0.1, rootMargin: defaults.rootMargin ?? '0px' }\n );\n io.observe(el);\n }\n }\n\n return controller;\n}\n","/**\n * use-scroll-animate - parallax() helper\n *\n * Moves elements at a different speed than the page while they cross the\n * viewport. Built on the same scroll progress as `progressVar` (0 when the\n * element's top enters at the bottom, 1 when its bottom leaves at the top):\n * the progress is written to a CSS custom property (default `--sa-parallax`)\n * and the offset is applied with the individual `translate` property, so it\n * composes with entrance animations and other `transform`s.\n */\n\nimport { getScrollProgress, hasDOM, prefersReducedMotion, resolveTargets, supportsObserver } from './core';\n\nexport interface ParallaxHelperOptions {\n /**\n * Total distance the element shifts while it crosses the viewport, as a\n * fraction of the viewport size (`0.2` = 20vh on the y axis). Positive values\n * lag behind the scroll (background-like), negative values move ahead of it\n * (foreground-like). (default: `0.2`)\n */\n speed?: number;\n /** `'y'` (default) or `'x'` (horizontal drift, in `vw`) */\n axis?: 'x' | 'y';\n /** CSS custom property receiving the progress (default: `'--sa-parallax'`) */\n progressVar?: string;\n /** Scroll container (default: the viewport) */\n root?: Element | null;\n /**\n * Under `prefers-reduced-motion: reduce` no offset is applied (the progress\n * variable is still written). Set to `false` to move anyway. (default: `true`)\n */\n respectReducedMotion?: boolean;\n}\n\nconst PASSIVE: AddEventListenerOptions = { passive: true };\n\n/**\n * Apply a scroll parallax to `target` (selector, Element, NodeList or array).\n * Returns a function that stops it and removes the inline styles it set.\n * SSR-safe (no-op without a DOM / IntersectionObserver).\n *\n * @example\n * const stop = parallax('.hero-bg', { speed: 0.3 });\n * parallax('.badge', { speed: -0.15, axis: 'x' });\n */\nexport function parallax(\n target: string | Element | NodeList | Element[],\n options: ParallaxHelperOptions = {}\n): () => void {\n const els = resolveTargets(target);\n if (!els.length || !hasDOM() || !supportsObserver()) return () => undefined;\n const { speed = 0.2, axis = 'y', root = null, respectReducedMotion = true } = options;\n const name = options.progressVar ? (options.progressVar.startsWith('--') ? options.progressVar : `--${options.progressVar}`) : '--sa-parallax';\n const unit = axis === 'x' ? 'vw' : 'vh';\n const visible = new Set<Element>();\n let frame = 0;\n let listening = false;\n const scroller: EventTarget = root || window;\n\n const apply = (el: Element) => {\n const style = (el as HTMLElement).style;\n if (!style) return;\n const p = getScrollProgress(el, root);\n style.setProperty(name, String(+p.toFixed(4)));\n if (respectReducedMotion && prefersReducedMotion()) {\n style.removeProperty('translate');\n return;\n }\n const offset = `${+((p - 0.5) * speed * 100).toFixed(3)}${unit}`;\n style.setProperty('translate', axis === 'x' ? `${offset} 0px` : `0px ${offset}`);\n };\n\n const update = () => {\n frame = 0;\n visible.forEach(apply);\n };\n const schedule = () => {\n if (!frame) frame = requestAnimationFrame(update);\n };\n const listen = (on: boolean) => {\n if (on === listening) return;\n listening = on;\n const method = on ? 'addEventListener' : 'removeEventListener';\n scroller[method]('scroll', schedule, PASSIVE);\n window[method]('resize', schedule, PASSIVE);\n if (!on && frame) {\n cancelAnimationFrame(frame);\n frame = 0;\n }\n };\n\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) visible.add(entry.target);\n else visible.delete(entry.target);\n apply(entry.target); // report the edges even on fast scrolls\n });\n listen(visible.size > 0);\n },\n { threshold: 0, root }\n );\n els.forEach((el) => {\n apply(el); // no jump before the first observer callback\n io.observe(el);\n });\n\n return () => {\n io.disconnect();\n listen(false);\n visible.clear();\n els.forEach((el) => {\n const style = (el as HTMLElement).style;\n if (!style) return;\n style.removeProperty('translate');\n style.removeProperty(name);\n });\n };\n}\n","/**\n * use-scroll-animate\n *\n * A lightweight, dependency-free scroll animation library for modern web\n * applications. Built with TypeScript, powered by IntersectionObserver and\n * the Web Animations API (or the native scroll-driven timeline). Safe to\n * import during SSR. Framework integrations live in the subpath entries:\n * `use-scroll-animate/react`, `/vue`, `/svelte`, `/solid`, `/element`.\n *\n * @license MIT\n * @see https://github.com/HarrisonCN/use-scroll-animate\n */\n\nexport { createScrollAnimate, getScrollProgress, supportsScrollTimeline } from './core';\nexport { staggerChildren } from './stagger';\nexport { sequence } from './sequence';\nexport { parallax } from './parallax';\nexport { PRESETS, resolvePreset, resolveEasing, EASING_MAP } from './presets';\nexport type {\n AnimationPreset,\n EasingType,\n AnimationKeyframe,\n CustomAnimation,\n ProgressMode,\n ScrollEngine,\n AnimateOptions,\n ScrollAnimateConfig,\n AnimatedElement,\n ScrollAnimateInstance,\n} from './types';\nexport type { StaggerOptions } from './stagger';\nexport type { ParallaxHelperOptions } from './parallax';\nexport type { SequenceStep, SequenceOptions, SequenceController } from './sequence';\n\n// Default export: a ready-to-use singleton instance\nimport { createScrollAnimate } from './core';\n\n/**\n * Default singleton instance of ScrollAnimate.\n * Ready to use out of the box with sensible defaults.\n *\n * @example\n * ```js\n * import ScrollAnimate from 'use-scroll-animate';\n *\n * // Auto-initialize all elements with data-sa attribute\n * ScrollAnimate.init();\n *\n * // Or manually observe elements\n * ScrollAnimate.observe('.my-element', { animation: 'fade-in-up' });\n * ```\n */\nconst ScrollAnimate = /* @__PURE__ */ createScrollAnimate();\nexport default ScrollAnimate;\n"],"names":[],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,4 +1,4 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ScrollAnimate={})}(this,function(e){"use strict";const t={"fade-in":{from:{opacity:0},to:{opacity:1}},"fade-in-up":{from:{opacity:0,transform:"translateY(40px)"},to:{opacity:1,transform:"translateY(0px)"}},"fade-in-down":{from:{opacity:0,transform:"translateY(-40px)"},to:{opacity:1,transform:"translateY(0px)"}},"fade-in-left":{from:{opacity:0,transform:"translateX(-40px)"},to:{opacity:1,transform:"translateX(0px)"}},"fade-in-right":{from:{opacity:0,transform:"translateX(40px)"},to:{opacity:1,transform:"translateX(0px)"}},"zoom-in":{from:{opacity:0,transform:"scale(0.8)"},to:{opacity:1,transform:"scale(1)"}},"zoom-out":{from:{opacity:0,transform:"scale(1.2)"},to:{opacity:1,transform:"scale(1)"}},"flip-x":{from:{opacity:0,transform:"rotateX(-90deg)"},to:{opacity:1,transform:"rotateX(0deg)"}},"flip-y":{from:{opacity:0,transform:"rotateY(-90deg)"},to:{opacity:1,transform:"rotateY(0deg)"}},"slide-up":{from:{transform:"translateY(100%)"},to:{transform:"translateY(0px)"}},"slide-down":{from:{transform:"translateY(-100%)"},to:{transform:"translateY(0px)"}},"slide-left":{from:{transform:"translateX(-100%)"},to:{transform:"translateX(0px)"}},"slide-right":{from:{transform:"translateX(100%)"},to:{transform:"translateX(0px)"}},bounce:{from:{opacity:0,transform:"translateY(-60px)"},to:{opacity:1,transform:"translateY(0px)"}},"rotate-in":{from:{opacity:0,transform:"rotate(-180deg) scale(0.5)"},to:{opacity:1,transform:"rotate(0deg) scale(1)"}},"blur-in":{from:{opacity:0,filter:"blur(12px)"},to:{opacity:1,filter:"blur(0px)"}},"skew-in":{from:{opacity:0,transform:"skewX(20deg) translateX(30px)"},to:{opacity:1,transform:"skewX(0deg) translateX(0px)"}},"scale-x":{from:{transform:"scaleX(0)"},to:{transform:"scaleX(1)"}},"scale-y":{from:{transform:"scaleY(0)"},to:{transform:"scaleY(1)"}},shimmer:{from:{opacity:.5,filter:"brightness(1)"},to:{opacity:1,filter:"brightness(1.5)"}},pulse:{from:{transform:"scale(1)"},to:{transform:"scale(1.05)"}},swing:{from:{transform:"rotate(-10deg)"},to:{transform:"rotate(10deg)"}},"scale-up":{from:{opacity:0,transform:"scale(0.5)"},to:{opacity:1,transform:"scale(1)"}},"blur-in-up":{from:{opacity:0,filter:"blur(12px)",transform:"translateY(40px)"},to:{opacity:1,filter:"blur(0px)",transform:"translateY(0px)"}},"flip-up":{from:{opacity:0,transform:"perspective(800px) rotateX(60deg)"},to:{opacity:1,transform:"perspective(800px) rotateX(0deg)"}},"flip-down":{from:{opacity:0,transform:"perspective(800px) rotateX(-60deg)"},to:{opacity:1,transform:"perspective(800px) rotateX(0deg)"}},"rotate-left":{from:{opacity:0,transform:"rotate(-15deg) translateX(-40px)"},to:{opacity:1,transform:"rotate(0deg) translateX(0px)"}},"rotate-right":{from:{opacity:0,transform:"rotate(15deg) translateX(40px)"},to:{opacity:1,transform:"rotate(0deg) translateX(0px)"}},"clip-up":{from:{clipPath:"inset(100% 0% 0% 0%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-down":{from:{clipPath:"inset(0% 0% 100% 0%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-left":{from:{clipPath:"inset(0% 0% 0% 100%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-right":{from:{clipPath:"inset(0% 100% 0% 0%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-circle":{from:{clipPath:"circle(0% at 50% 50%)"},to:{clipPath:"circle(75% at 50% 50%)"}}};function r(e){if("string"==typeof e)return t[e.trim()]??t["fade-in-up"];if(Array.isArray(e)){const r={from:{},to:{}};return e.forEach(e=>{const n=t[e.trim()];n&&(Object.entries(n.from).forEach(([e,t])=>{"transform"===e&&r.from[e]?r.from[e]=`${r.from[e]} ${t}`:r.from[e]=t}),Object.entries(n.to).forEach(([e,t])=>{"transform"===e&&r.to[e]?r.to[e]=`${r.to[e]} ${t}`:r.to[e]=t}))}),r}return e}const n={linear:"linear",ease:"ease","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out",spring:"cubic-bezier(0.34, 1.56, 0.64, 1)","soft-spring":"cubic-bezier(0.175, 0.885, 0.32, 1.275)","heavy-bounce":"cubic-bezier(0.68, -0.55, 0.265, 1.55)"};function o(e){return"string"==typeof e?n[e]??e:Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:"function"==typeof e?"linear":"ease"}const a={defaultAnimation:"fade-in-up",defaultDuration:600,defaultDelay:0,defaultEasing:"ease",defaultThreshold:.1,defaultRootMargin:"0px",defaultRepeat:!1,defaultOnce:!0,defaultOffset:0,hiddenClass:"sa-hidden",visibleClass:"sa-visible",useClassNames:!1,disabled:!1,root:null,autoUnregister:!0,defaultEngine:"auto"},s=()=>{},i=()=>"undefined"!=typeof window&&"undefined"!=typeof document,c=()=>i()&&"undefined"!=typeof IntersectionObserver;let l,f;function d(){return!!i()&&(void 0===l&&(l="function"==typeof window.matchMedia?window.matchMedia("(prefers-reduced-motion: reduce)"):null),!!l&&l.matches)}function u(){return void 0===f&&(f=i()&&"undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports("animation-timeline: view()")&&"function"==typeof globalThis.ViewTimeline),f}function p(e){if(void 0===e||""===e.trim())return;const t=parseFloat(e);return Number.isFinite(t)?t:void 0}function m(e){if(void 0===e||""===e.trim())return;const t=e.trim();return/^-?(\d+\.?\d*|\.\d+)$/.test(t)?parseFloat(t):t}const g=["entry 0%","entry 100%"];function h(e){const t=e.trim();return t?t.startsWith("--")?t:`--${t}`:"--sa-progress"}function y(e,t){return v(function(e){const t={},r=e("animation");r&&(t.animation=r.includes(",")?r.split(",").map(e=>e.trim()):r.trim()),t.duration=p(e("duration")),t.delay=p(e("delay"));const n=e("easing");if(n){const e=n.trim();if(e.startsWith("["))try{t.easing=JSON.parse(e)}catch{}else t.easing=e}const o=e("threshold");o&&(t.threshold=o.includes(",")?o.split(",").map(parseFloat).filter(Number.isFinite):p(o));const a=e("root-margin");a&&(t.rootMargin=a);const s=e("repeat");void 0!==s&&(t.repeat="false"!==s);const i=e("once");void 0!==i&&(t.once="false"!==i),t.offset=p(e("offset")),t.stagger=p(e("stagger"));const c=e("progress-var");void 0!==c&&(t.progressVar=h(c));const l=e("engine")?.trim();"auto"!==l&&"js"!==l&&"css"!==l||(t.engine=l);const f=e("view-range");if(f){const[e,r]=f.split(",").map(e=>e.trim());e&&r&&(t.viewRange=[e,r])}const d=e("exit");if(void 0!==d){const e=d.trim();t.exit=""===e||"true"===e||"false"!==e&&(e.includes(",")?e.split(",").map(e=>e.trim()):e)}const u=e("progress");u&&(t.progressMode="scroll"===u.trim()?"scroll":"ratio");const g=e("parallax-x"),y=e("parallax-y"),v=e("parallax-rotate"),b=e("parallax-scale");return(g||y||v||b)&&(t.parallax={x:m(g),y:m(y),rotate:p(v),scale:p(b),speed:p(e("parallax-speed"))??1}),Object.keys(t).forEach(e=>void 0===t[e]&&delete t[e]),t}(t=>{const r=e.getAttribute(`data-sa-${t}`);return null===r?void 0:r}),t)}function v(e,t){let r=e.engine??t.defaultEngine;"auto"===r&&(void 0!==e.duration||void 0!==e.delay||void 0!==e.offset||(e.stagger??0)>0)&&(r="js");const n=e.exit??!1,o=e.repeat??(!!n||t.defaultRepeat),a=e.threshold??t.defaultThreshold;return{animation:e.animation??t.defaultAnimation,duration:e.duration??t.defaultDuration,delay:e.delay??t.defaultDelay,easing:e.easing??t.defaultEasing,threshold:Array.isArray(a)&&0===a.length?t.defaultThreshold:a,rootMargin:e.rootMargin??t.defaultRootMargin,repeat:o,once:e.once??(!o&&t.defaultOnce),offset:e.offset??t.defaultOffset,stagger:e.stagger??0,parallax:T(e.parallax)??{},onStart:e.onStart??s,onComplete:e.onComplete??s,onEnter:e.onEnter??s,onLeave:e.onLeave??s,onProgress:e.onProgress??s,progressMode:e.progressMode??"ratio",progressVar:e.progressVar?h(e.progressVar):"",engine:r,viewRange:e.viewRange??g,exit:n}}function b(e){return e&&i()?"string"==typeof e?Array.from(document.querySelectorAll(e)):e instanceof Element?[e]:Array.isArray(e)||e instanceof NodeList?Array.from(e).filter(e=>e instanceof Element):[]:[]}function x(e){return!!e&&Object.keys(e).some(t=>void 0!==e[t])}function E(e,t){if(!i())return 0;const r=e.getBoundingClientRect();let n=0,o=window.innerHeight||document.documentElement.clientHeight||0;if(t){const e=t.getBoundingClientRect();n=e.top,o=e.height}const a=o+r.height;if(a<=0)return 0;const s=(n+o-r.top)/a;return s<0?0:s>1?1:s}const w=new WeakMap,S=new WeakMap,M=new WeakMap;function C(e){const t=S.get(e);t&&(S.delete(e),t.cancel());const r=w.get(e);r&&(w.delete(e),r.onfinish=null,r.cancel());const n=M.get(e);void 0!==n&&(clearTimeout(n),M.delete(e))}function $(e,t){const r=e.style;r&&Object.keys(t).forEach(e=>{r[e]=String(t[e])})}const O=/(-?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?)([a-z%]*)/gi;let A;function P(e,t){if("function"!=typeof t)return{keyframes:[e.from,e.to],easing:o(t)};const r=function(e){const t=[];for(let r=0;r<=30;r++){const n=e(r/30);t.push(Number.isFinite(n)?+n.toFixed(4):r/30)}return t}(t);if(void 0===A&&(A="undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports("animation-timing-function","linear(0, 1)")),A)return{keyframes:[e.from,e.to],easing:`linear(${r.join(", ")})`};const n=Object.keys(e.from).filter(t=>t in e.to);return{keyframes:r.map((t,r)=>{const o={offset:r/30};return n.forEach(r=>{o[r]=function(e,t,r){if("number"==typeof e&&"number"==typeof t)return e+(t-e)*r;const n=String(e),o=String(t),a=[],s=[],i=n.replace(O,(e,t,r)=>(a.push([parseFloat(t),r]),"#"));if(i!==o.replace(O,(e,t,r)=>(s.push([parseFloat(t),r]),"#"))||a.length!==s.length)return r<.5?e:t;let c=0,l=!0;const f=i.replace(/#/g,()=>{const[e,t]=a[c],[n,o]=s[c++];t!==o&&0!==e&&0!==n&&t&&o&&(l=!1);const i=t||o;return`${+(e+(n-e)*r).toFixed(4)}${i}`});return l?f:r<.5?e:t}(e.from[r],e.to[r],t)}),o}),easing:"linear"}}function k(e,t){if(C(e),t.useClassNames)e.classList.remove(t.hiddenClass),e.classList.add(t.visibleClass);else{const t=e.style;t&&(t.opacity="")}}function X(e,t={}){k(e,{...a,...t})}function F(e){return!!e.disabled||d()}function j(e,t,n,o=0,a){const{duration:s,delay:i,stagger:c,onStart:l,onComplete:f}=t,d=Math.max(0,i+o*c);if(C(e),F(n))return k(e,n),l(e),void f(e);if(n.useClassNames)return d>0&&(e.style.animationDelay=`${d}ms`),e.classList.remove(n.hiddenClass),e.classList.add(n.visibleClass),l(e),a?.add(e),void M.set(e,setTimeout(()=>{M.delete(e),a?.delete(e),f(e)},s+d));const u=r(t.animation);if(!("opacity"in u.to)){const t=e.style;t&&"0"===t.opacity&&(t.opacity="")}if("function"!=typeof e.animate)return $(e,u.to),l(e),void f(e);const p=P(u,t.easing),m={duration:s,delay:d,easing:p.easing,fill:"both"};let g;try{g=e.animate(p.keyframes,m)}catch{g=e.animate(p.keyframes,{...m,easing:"ease"})}w.set(e,g),l(e),g.onfinish=()=>{if(w.get(e)===g){w.delete(e);try{g.commitStyles()}catch{$(e,u.to)}g.cancel()}f(e)}}let N,L=!1;function T(e){return e&&!L&&"undefined"!=typeof console&&Object.keys(e).length&&(L=!0,console.warn("[use-scroll-animate] The `parallax` option / data-sa-parallax-* attributes are deprecated and removed in 3.0. Use parallax(el, { speed }) or progressVar instead.")),e}function Y(e,t){if(C(e),t.useClassNames)e.classList.add(t.hiddenClass),e.classList.remove(t.visibleClass);else{const t=e.style;t&&(t.opacity="0")}}function V(e,t={}){const r={...a,...t};F(r)||Y(e,r)}function I(){if(!N){N=[];for(let e=0;e<=100;e++)N.push(e/100)}return N}const R={passive:!0};function z(e={}){let t={...a,...e};const n=new Map;let o=new WeakSet;const l=new Set;let f=0,d=null;const p=new Set,m=new Set,g=new Set,h=new Map;function O(e,t,r){let n=h.get(e);n||h.set(e,n=new Map);let o=n.get(t);return o||n.set(t,o=r()),o}function A(e,r){const o=n.get(e);o&&(o.observer.unobserve(e),o.progressObserver?.unobserve(e),n.delete(e),z(e),"css"!==o.engine?r&&!o.animated&&k(e,t):r?(g.delete(e),k(e,t)):!1===e.isConnected&&g.delete(e))}function X(){n.forEach((e,t)=>{!1===t.isConnected&&A(t,!1)})}function N(e,r,n){const o=r.options;if(o.onProgress(e,n),o.progressVar){const t=e.style;t&&t.setProperty(o.progressVar,String(+n.toFixed(4)))}x(o.parallax)&&!F(t)&&function(e,t,r){const{x:n=0,y:o=0,rotate:a=0,scale:s=1,speed:i=1}=r,c=2*(t-.5)*i,l=e=>"number"==typeof e?e*c+"px":`calc(${e} * ${c})`;let f="";n&&(f+=` translateX(${l(n)})`),o&&(f+=` translateY(${l(o)})`),a&&(f+=` rotate(${a*c}deg)`),1!==s&&(f+=` scale(${1+(s-1)*c})`),e.style.transform=f.trim()}(e,n,o.parallax)}function L(){f=0,l.forEach(e=>{const r=n.get(e);r&&N(e,r,E(e,t.root))})}const T=()=>f||(f=requestAnimationFrame(L));function V(e){if(e===!!d)return;const r=e?"addEventListener":"removeEventListener",n=d||t.root||window;n[r]("scroll",T,R),window[r]("resize",T,R),d=e?n:null,!e&&f&&(cancelAnimationFrame(f),f=0)}function z(e){l.delete(e)&&!l.size&&V(!1)}function W(e){e.forEach(e=>{const r=e.target,o=n.get(r);o&&(e.isIntersecting?(l.add(r),V(!0)):z(r),N(r,o,E(r,t.root)))})}function q(e){const a=new Map;e.forEach(e=>{const s=e.target,i=n.get(s);if(!i)return;const c=i.options;if(!1!==s.isConnected)if("css"!==i.engine)if(e.isIntersecting){if(c.onEnter(s),i.animated&&!c.repeat)return;let e=0;if(c.stagger>0){const t=s.parentElement;e=a.get(t)??0,a.set(t,e+1)}j(s,c,t,e,m),i.animated=!0,c.once&&!c.repeat&&(i.observer.unobserve(s),t.autoUnregister&&!i.progressObserver&&(o.add(s),A(s,!1)))}else c.onLeave(s),c.repeat&&i.animated&&(F(t)||(c.exit?function(e,t,n){if(n.useClassNames||"function"!=typeof e.animate)return void Y(e,n);C(e);const o=r(!0===t.exit?t.animation:t.exit),a=P({from:o.to,to:o.from},t.easing),s={duration:t.duration,easing:a.easing,fill:"forwards"};let i;try{i=e.animate(a.keyframes,s)}catch{i=e.animate(a.keyframes,{...s,easing:"ease"})}w.set(e,i)}(s,c,t):Y(s,t)),i.animated=!1);else e.isIntersecting?(c.onEnter(s),i.animated||(i.animated=!0,c.onStart(s)),c.once&&!c.repeat&&(i.observer.unobserve(s),t.autoUnregister&&!i.progressObserver&&(o.add(s),A(s,!1)))):(c.onLeave(s),c.repeat&&(i.animated=!1));else A(s,!1)})}function D(e){e.forEach(e=>{const t=n.get(e.target);t&&N(e.target,t,e.intersectionRatio)})}function U(e){const r=function(e,t){if(!t)return e;const r=(e||"0px").trim().split(/\s+/),n=r[0],o=r[1]??n,a=r[2]??n,s=r[3]??o,i=/^(-?\d*\.?\d+)(px)?$/.exec(a);return`${n} ${o} ${(i?parseFloat(i[1]):0)-t}px ${s}`}(e.rootMargin,e.offset),n=e.threshold,o=t.root;return O(o,`m|${r}|${String(n)}`,()=>new IntersectionObserver(q,{threshold:n,rootMargin:r,root:o}))}function _(e,r,n){var o;r.observer=U(r.options),n&&r.observer.observe(e),r.progressObserver=x((o=r.options).parallax)||o.onProgress!==s||o.progressVar?function(e){const r=t.root;return"scroll"===e.progressMode?O(r,`s|${e.rootMargin}`,()=>new IntersectionObserver(W,{threshold:0,rootMargin:e.rootMargin,root:r})):O(r,`p|${e.rootMargin}`,()=>new IntersectionObserver(D,{threshold:I(),rootMargin:e.rootMargin,root:r}))}(r.options):void 0,r.progressObserver?.observe(e)}function B(e,a){if(n.has(e)||o.has(e))return;if(!c())return void k(e,t);const s={element:e,options:a,animated:!1,engine:"js"};(function(e){return"js"!==e.engine&&!t.useClassNames&&!F(t)&&u()})(a)&&(C(e),function(e,t,n){if("function"!=typeof e.animate)return null;const o=r(t.animation),a=P(o,t.easing);let s;try{const r=new globalThis.ViewTimeline({subject:e,axis:"block"}),n={fill:"both",easing:a.easing,timeline:r,rangeStart:t.viewRange[0],rangeEnd:t.viewRange[1]};try{s=e.animate(a.keyframes,n)}catch{s=e.animate(a.keyframes,{...n,easing:"linear"})}}catch{return null}if(w.set(e,s),t.exit){const n=r(!0===t.exit?t.animation:t.exit),o=P({from:n.to,to:n.from},t.easing);try{const t=new globalThis.ViewTimeline({subject:e,axis:"block"}),r={fill:"forwards",easing:o.easing,timeline:t,rangeStart:"exit 0%",rangeEnd:"exit 100%"};S.set(e,e.animate(o.keyframes,r))}catch{}}const i=t.repeat||!t.once;return s.onfinish=()=>{if(!i&&w.get(e)===s){w.delete(e);try{s.commitStyles()}catch{$(e,o.to)}s.cancel(),n?.()}t.onComplete(e)},s}(e,a,()=>g.delete(e))&&(s.engine="css",g.add(e))),"js"!==s.engine||F(t)||Y(e,t),n.set(e,s),_(e,s,!0)}function H(e){n.has(e)||B(e,y(e,t))}const G={observe(e,r={}){X();const n=v(r,t);b(e).forEach(e=>B(e,n))},unobserve(e){b(e).forEach(e=>{o.delete(e),A(e,!0)})},init(e){const t=e??(i()?document:null);t&&(X(),t.querySelectorAll("[data-sa]").forEach(H))},watch(e){const t=e??(i()?document:null);if(!t||"undefined"==typeof MutationObserver)return s;G.init(t);const r=e=>{e.hasAttribute("data-sa")&&H(e),e.querySelectorAll("[data-sa]").forEach(H)},n=new MutationObserver(e=>{let t=!1;e.forEach(e=>{if("attributes"===e.type){const t=e.target;return void(!1!==t.isConnected&&r(t))}e.addedNodes.forEach(e=>{e instanceof Element&&!1!==e.isConnected&&r(e)}),e.removedNodes.length&&(t=!0)}),t&&X()});return n.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sa"]}),p.add(n),()=>{n.disconnect(),p.delete(n)}},destroy(){p.forEach(e=>e.disconnect()),p.clear(),m.forEach(e=>{const t=M.get(e);void 0!==t&&(clearTimeout(t),M.delete(e))}),m.clear(),n.forEach((e,r)=>{e.animated||"css"===e.engine||k(r,t)}),g.forEach(e=>{w.has(e)&&k(e,t)}),g.clear(),h.forEach(e=>e.forEach(e=>e.disconnect())),h.clear(),n.clear(),l.clear(),V(!1),o=new WeakSet},refresh(){h.forEach(e=>e.forEach(e=>e.disconnect())),h.clear(),l.clear(),V(!1),X(),c()&&n.forEach((e,t)=>{_(t,e,!(e.animated&&e.options.once&&!e.options.repeat))})},animate(e,r={}){const n=v(r,t);b(e).forEach(e=>j(e,n,t,0,m))},getObservedElements:()=>Array.from(n.values()),configure(e){t={...t,...e}}};return G}let W=null;let q=null;function D(e,t){const r=[];let n=0;return e.forEach(e=>{const{target:o,gap:a=0,at:s,...i}=e,c={...t,...i},l=c.duration??600,f=Math.max(0,s??n+a)+(c.delay??0);let d=Math.max(n,f);b(o).forEach((e,t)=>{const n=f+t*(c.stagger??0);r.push({el:e,opts:{...c,duration:l,delay:n,stagger:0},end:n+l}),d=Math.max(d,n+l)}),n=d}),r}const U={passive:!0};
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ScrollAnimate={})}(this,function(e){"use strict";const t={"fade-in":{from:{opacity:0},to:{opacity:1}},"fade-in-up":{from:{opacity:0,transform:"translateY(40px)"},to:{opacity:1,transform:"translateY(0px)"}},"fade-in-down":{from:{opacity:0,transform:"translateY(-40px)"},to:{opacity:1,transform:"translateY(0px)"}},"fade-in-left":{from:{opacity:0,transform:"translateX(-40px)"},to:{opacity:1,transform:"translateX(0px)"}},"fade-in-right":{from:{opacity:0,transform:"translateX(40px)"},to:{opacity:1,transform:"translateX(0px)"}},"zoom-in":{from:{opacity:0,transform:"scale(0.8)"},to:{opacity:1,transform:"scale(1)"}},"zoom-out":{from:{opacity:0,transform:"scale(1.2)"},to:{opacity:1,transform:"scale(1)"}},"flip-x":{from:{opacity:0,transform:"rotateX(-90deg)"},to:{opacity:1,transform:"rotateX(0deg)"}},"flip-y":{from:{opacity:0,transform:"rotateY(-90deg)"},to:{opacity:1,transform:"rotateY(0deg)"}},"slide-up":{from:{transform:"translateY(100%)"},to:{transform:"translateY(0px)"}},"slide-down":{from:{transform:"translateY(-100%)"},to:{transform:"translateY(0px)"}},"slide-left":{from:{transform:"translateX(-100%)"},to:{transform:"translateX(0px)"}},"slide-right":{from:{transform:"translateX(100%)"},to:{transform:"translateX(0px)"}},bounce:{from:{opacity:0,transform:"translateY(-60px)"},to:{opacity:1,transform:"translateY(0px)"}},"rotate-in":{from:{opacity:0,transform:"rotate(-180deg) scale(0.5)"},to:{opacity:1,transform:"rotate(0deg) scale(1)"}},"blur-in":{from:{opacity:0,filter:"blur(12px)"},to:{opacity:1,filter:"blur(0px)"}},"skew-in":{from:{opacity:0,transform:"skewX(20deg) translateX(30px)"},to:{opacity:1,transform:"skewX(0deg) translateX(0px)"}},"scale-x":{from:{transform:"scaleX(0)"},to:{transform:"scaleX(1)"}},"scale-y":{from:{transform:"scaleY(0)"},to:{transform:"scaleY(1)"}},shimmer:{from:{opacity:.5,filter:"brightness(1)"},to:{opacity:1,filter:"brightness(1.5)"}},pulse:{from:{transform:"scale(1)"},to:{transform:"scale(1.05)"}},swing:{from:{transform:"rotate(-10deg)"},to:{transform:"rotate(10deg)"}},"scale-up":{from:{opacity:0,transform:"scale(0.5)"},to:{opacity:1,transform:"scale(1)"}},"blur-in-up":{from:{opacity:0,filter:"blur(12px)",transform:"translateY(40px)"},to:{opacity:1,filter:"blur(0px)",transform:"translateY(0px)"}},"flip-up":{from:{opacity:0,transform:"perspective(800px) rotateX(60deg)"},to:{opacity:1,transform:"perspective(800px) rotateX(0deg)"}},"flip-down":{from:{opacity:0,transform:"perspective(800px) rotateX(-60deg)"},to:{opacity:1,transform:"perspective(800px) rotateX(0deg)"}},"rotate-left":{from:{opacity:0,transform:"rotate(-15deg) translateX(-40px)"},to:{opacity:1,transform:"rotate(0deg) translateX(0px)"}},"rotate-right":{from:{opacity:0,transform:"rotate(15deg) translateX(40px)"},to:{opacity:1,transform:"rotate(0deg) translateX(0px)"}},"clip-up":{from:{clipPath:"inset(100% 0% 0% 0%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-down":{from:{clipPath:"inset(0% 0% 100% 0%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-left":{from:{clipPath:"inset(0% 0% 0% 100%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-right":{from:{clipPath:"inset(0% 100% 0% 0%)"},to:{clipPath:"inset(0% 0% 0% 0%)"}},"clip-circle":{from:{clipPath:"circle(0% at 50% 50%)"},to:{clipPath:"circle(75% at 50% 50%)"}}};function r(e){if("string"==typeof e)return t[e.trim()]??t["fade-in-up"];if(Array.isArray(e)){const r={from:{},to:{}};return e.forEach(e=>{const o=t[e.trim()];o&&(Object.entries(o.from).forEach(([e,t])=>{"transform"===e&&r.from[e]?r.from[e]=`${r.from[e]} ${t}`:r.from[e]=t}),Object.entries(o.to).forEach(([e,t])=>{"transform"===e&&r.to[e]?r.to[e]=`${r.to[e]} ${t}`:r.to[e]=t}))}),r}return e}const o={linear:"linear",ease:"ease","ease-in":"ease-in","ease-out":"ease-out","ease-in-out":"ease-in-out",spring:"cubic-bezier(0.34, 1.56, 0.64, 1)","soft-spring":"cubic-bezier(0.175, 0.885, 0.32, 1.275)","heavy-bounce":"cubic-bezier(0.68, -0.55, 0.265, 1.55)"};function n(e){return"string"==typeof e?o[e]??e:Array.isArray(e)?`cubic-bezier(${e.join(", ")})`:"function"==typeof e?"linear":"ease"}const a={defaultAnimation:"fade-in-up",defaultDuration:600,defaultDelay:0,defaultEasing:"ease",defaultThreshold:.1,defaultRootMargin:"0px",defaultRepeat:!1,defaultOnce:!0,defaultOffset:0,hiddenClass:"sa-hidden",visibleClass:"sa-visible",useClassNames:!1,disabled:!1,root:null,autoUnregister:!0,defaultEngine:"auto"},s=()=>{},i=()=>"undefined"!=typeof window&&"undefined"!=typeof document,c=()=>i()&&"undefined"!=typeof IntersectionObserver;let l,f;function d(){return!!i()&&(void 0===l&&(l="function"==typeof window.matchMedia?window.matchMedia("(prefers-reduced-motion: reduce)"):null),!!l&&l.matches)}function u(){return void 0===f&&(f=i()&&"undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports("animation-timeline: view()")&&"function"==typeof globalThis.ViewTimeline),f}function p(e){if(void 0===e||""===e.trim())return;const t=parseFloat(e);return Number.isFinite(t)?t:void 0}const m=["entry 0%","entry 100%"];function g(e){const t=e.trim();return t?t.startsWith("--")?t:`--${t}`:"--sa-progress"}function h(e,t){return y(function(e){const t={},r=e("animation");r&&(t.animation=r.includes(",")?r.split(",").map(e=>e.trim()):r.trim()),t.duration=p(e("duration")),t.delay=p(e("delay"));const o=e("easing");if(o){const e=o.trim();if(e.startsWith("["))try{t.easing=JSON.parse(e)}catch{}else t.easing=e}const n=e("threshold");n&&(t.threshold=n.includes(",")?n.split(",").map(parseFloat).filter(Number.isFinite):p(n));const a=e("root-margin");a&&(t.rootMargin=a);const s=e("repeat");void 0!==s&&(t.repeat="false"!==s);const i=e("once");void 0!==i&&(t.once="false"!==i),t.offset=p(e("offset")),t.stagger=p(e("stagger"));const c=e("progress-var");void 0!==c&&(t.progressVar=g(c));const l=e("engine")?.trim();"auto"!==l&&"js"!==l&&"css"!==l||(t.engine=l);const f=e("view-range");if(f){const[e,r]=f.split(",").map(e=>e.trim());e&&r&&(t.viewRange=[e,r])}const d=e("exit");if(void 0!==d){const e=d.trim();t.exit=""===e||"true"===e||"false"!==e&&(e.includes(",")?e.split(",").map(e=>e.trim()):e)}const u=e("progress");return u&&(t.progressMode="scroll"===u.trim()?"scroll":"ratio"),Object.keys(t).forEach(e=>void 0===t[e]&&delete t[e]),t}(t=>{const r=e.getAttribute(`data-sa-${t}`);return null===r?void 0:r}),t)}function y(e,t){let r=e.engine??t.defaultEngine;"auto"===r&&(void 0!==e.duration||void 0!==e.delay||void 0!==e.offset||(e.stagger??0)>0)&&(r="js");const o=e.exit??!1,n=e.repeat??(!!o||t.defaultRepeat),a=e.threshold??t.defaultThreshold;return{animation:e.animation??t.defaultAnimation,duration:e.duration??t.defaultDuration,delay:e.delay??t.defaultDelay,easing:e.easing??t.defaultEasing,threshold:Array.isArray(a)&&0===a.length?t.defaultThreshold:a,rootMargin:e.rootMargin??t.defaultRootMargin,repeat:n,once:e.once??(!n&&t.defaultOnce),offset:e.offset??t.defaultOffset,stagger:e.stagger??0,onStart:e.onStart??s,onComplete:e.onComplete??s,onEnter:e.onEnter??s,onLeave:e.onLeave??s,onProgress:e.onProgress??s,progressMode:e.progressMode??"ratio",progressVar:e.progressVar?g(e.progressVar):"",engine:r,viewRange:e.viewRange??m,exit:o}}function v(e){return e&&i()?"string"==typeof e?Array.from(document.querySelectorAll(e)):e instanceof Element?[e]:Array.isArray(e)||e instanceof NodeList?Array.from(e).filter(e=>e instanceof Element):[]:[]}function b(e,t){if(!i())return 0;const r=e.getBoundingClientRect();let o=0,n=window.innerHeight||document.documentElement.clientHeight||0;if(t){const e=t.getBoundingClientRect();o=e.top,n=e.height}const a=n+r.height;if(a<=0)return 0;const s=(o+n-r.top)/a;return s<0?0:s>1?1:s}const x=new WeakMap,E=new WeakMap,w=new WeakMap;function S(e){const t=E.get(e);t&&(E.delete(e),t.cancel());const r=x.get(e);r&&(x.delete(e),r.onfinish=null,r.cancel());const o=w.get(e);void 0!==o&&(clearTimeout(o),w.delete(e))}function M(e,t){const r=e.style;r&&Object.keys(t).forEach(e=>{r[e]=String(t[e])})}const C=/(-?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?)([a-z%]*)/gi;let O,A;function P(e,t){if("function"!=typeof t)return{keyframes:[e.from,e.to],easing:n(t)};const r=function(e){const t=[];for(let r=0;r<=30;r++){const o=e(r/30);t.push(Number.isFinite(o)?+o.toFixed(4):r/30)}return t}(t);if(void 0===O&&(O="undefined"!=typeof CSS&&"function"==typeof CSS.supports&&CSS.supports("animation-timing-function","linear(0, 1)")),O)return{keyframes:[e.from,e.to],easing:`linear(${r.join(", ")})`};const o=Object.keys(e.from).filter(t=>t in e.to);return{keyframes:r.map((t,r)=>{const n={offset:r/30};return o.forEach(r=>{n[r]=function(e,t,r){if("number"==typeof e&&"number"==typeof t)return e+(t-e)*r;const o=String(e),n=String(t),a=[],s=[],i=o.replace(C,(e,t,r)=>(a.push([parseFloat(t),r]),"#"));if(i!==n.replace(C,(e,t,r)=>(s.push([parseFloat(t),r]),"#"))||a.length!==s.length)return r<.5?e:t;let c=0,l=!0;const f=i.replace(/#/g,()=>{const[e,t]=a[c],[o,n]=s[c++];t!==n&&0!==e&&0!==o&&t&&n&&(l=!1);const i=t||n;return`${+(e+(o-e)*r).toFixed(4)}${i}`});return l?f:r<.5?e:t}(e.from[r],e.to[r],t)}),n}),easing:"linear"}}function $(e,t){if(S(e),t.useClassNames)e.classList.remove(t.hiddenClass),e.classList.add(t.visibleClass);else{const t=e.style;t&&(t.opacity="")}}function X(e,t={}){$(e,{...a,...t})}function k(e){return!!e.disabled||d()}function F(e,t,o,n=0,a){const{duration:s,delay:i,stagger:c,onStart:l,onComplete:f}=t,d=Math.max(0,i+n*c);if(S(e),k(o))return $(e,o),l(e),void f(e);if(o.useClassNames)return d>0&&(e.style.animationDelay=`${d}ms`),e.classList.remove(o.hiddenClass),e.classList.add(o.visibleClass),l(e),a?.add(e),void w.set(e,setTimeout(()=>{w.delete(e),a?.delete(e),f(e)},s+d));const u=r(t.animation);if(!("opacity"in u.to)){const t=e.style;t&&"0"===t.opacity&&(t.opacity="")}if("function"!=typeof e.animate)return M(e,u.to),l(e),void f(e);const p=P(u,t.easing),m={duration:s,delay:d,easing:p.easing,fill:"both"};let g;try{g=e.animate(p.keyframes,m)}catch{g=e.animate(p.keyframes,{...m,easing:"ease"})}x.set(e,g),l(e),g.onfinish=()=>{if(x.get(e)===g){x.delete(e);try{g.commitStyles()}catch{M(e,u.to)}g.cancel()}f(e)}}function N(e,t){if(S(e),t.useClassNames)e.classList.add(t.hiddenClass),e.classList.remove(t.visibleClass);else{const t=e.style;t&&(t.opacity="0")}}function L(e,t={}){const r={...a,...t};k(r)||N(e,r)}function j(){if(!A){A=[];for(let e=0;e<=100;e++)A.push(e/100)}return A}const T={passive:!0};function Y(e={}){let t={...a,...e};const o=new Map;let n=new WeakSet;const l=new Set;let f=0,d=null;const p=new Set,m=new Set,g=new Set,C=new Map;function O(e,t,r){let o=C.get(e);o||C.set(e,o=new Map);let n=o.get(t);return n||o.set(t,n=r()),n}function A(e,r){const n=o.get(e);n&&(n.observer.unobserve(e),n.progressObserver?.unobserve(e),o.delete(e),V(e),"css"!==n.engine?r&&!n.animated&&$(e,t):r?(g.delete(e),$(e,t)):!1===e.isConnected&&g.delete(e))}function X(){o.forEach((e,t)=>{!1===t.isConnected&&A(t,!1)})}function L(e,t,r){const o=t.options;if(o.onProgress(e,r),o.progressVar){const t=e.style;t&&t.setProperty(o.progressVar,String(+r.toFixed(4)))}}function Y(){f=0,l.forEach(e=>{const r=o.get(e);r&&L(e,r,b(e,t.root))})}const I=()=>f||(f=requestAnimationFrame(Y));function R(e){if(e===!!d)return;const r=e?"addEventListener":"removeEventListener",o=d||t.root||window;o[r]("scroll",I,T),window[r]("resize",I,T),d=e?o:null,!e&&f&&(cancelAnimationFrame(f),f=0)}function V(e){l.delete(e)&&!l.size&&R(!1)}function z(e){e.forEach(e=>{const r=e.target,n=o.get(r);n&&(e.isIntersecting?(l.add(r),R(!0)):V(r),L(r,n,b(r,t.root)))})}function W(e){const a=new Map;e.forEach(e=>{const s=e.target,i=o.get(s);if(!i)return;const c=i.options;if(!1!==s.isConnected)if("css"!==i.engine)if(e.isIntersecting){if(c.onEnter(s),i.animated&&!c.repeat)return;let e=0;if(c.stagger>0){const t=s.parentElement;e=a.get(t)??0,a.set(t,e+1)}F(s,c,t,e,m),i.animated=!0,c.once&&!c.repeat&&(i.observer.unobserve(s),t.autoUnregister&&!i.progressObserver&&(n.add(s),A(s,!1)))}else c.onLeave(s),c.repeat&&i.animated&&(k(t)||(c.exit?function(e,t,o){if(o.useClassNames||"function"!=typeof e.animate)return void N(e,o);S(e);const n=r(!0===t.exit?t.animation:t.exit),a=P({from:n.to,to:n.from},t.easing),s={duration:t.duration,easing:a.easing,fill:"forwards"};let i;try{i=e.animate(a.keyframes,s)}catch{i=e.animate(a.keyframes,{...s,easing:"ease"})}x.set(e,i)}(s,c,t):N(s,t)),i.animated=!1);else e.isIntersecting?(c.onEnter(s),i.animated||(i.animated=!0,c.onStart(s)),c.once&&!c.repeat&&(i.observer.unobserve(s),t.autoUnregister&&!i.progressObserver&&(n.add(s),A(s,!1)))):(c.onLeave(s),c.repeat&&(i.animated=!1));else A(s,!1)})}function q(e){e.forEach(e=>{const t=o.get(e.target);t&&L(e.target,t,e.intersectionRatio)})}function D(e){const r=function(e,t){if(!t)return e;const r=(e||"0px").trim().split(/\s+/),o=r[0],n=r[1]??o,a=r[2]??o,s=r[3]??n,i=/^(-?\d*\.?\d+)(px)?$/.exec(a);return`${o} ${n} ${(i?parseFloat(i[1]):0)-t}px ${s}`}(e.rootMargin,e.offset),o=e.threshold,n=t.root;return O(n,`m|${r}|${String(o)}`,()=>new IntersectionObserver(W,{threshold:o,rootMargin:r,root:n}))}function U(e,r,o){var n;r.observer=D(r.options),o&&r.observer.observe(e),r.progressObserver=(n=r.options).onProgress!==s||n.progressVar?function(e){const r=t.root;return"scroll"===e.progressMode?O(r,`s|${e.rootMargin}`,()=>new IntersectionObserver(z,{threshold:0,rootMargin:e.rootMargin,root:r})):O(r,`p|${e.rootMargin}`,()=>new IntersectionObserver(q,{threshold:j(),rootMargin:e.rootMargin,root:r}))}(r.options):void 0,r.progressObserver?.observe(e)}function _(e,a){if(o.has(e)||n.has(e))return;if(!c())return void $(e,t);const s={element:e,options:a,animated:!1,engine:"js"};(function(e){return"js"!==e.engine&&!t.useClassNames&&!k(t)&&u()})(a)&&(S(e),function(e,t,o){if("function"!=typeof e.animate)return null;const n=r(t.animation),a=P(n,t.easing);let s;try{const r=new globalThis.ViewTimeline({subject:e,axis:"block"}),o={fill:"both",easing:a.easing,timeline:r,rangeStart:t.viewRange[0],rangeEnd:t.viewRange[1]};try{s=e.animate(a.keyframes,o)}catch{s=e.animate(a.keyframes,{...o,easing:"linear"})}}catch{return null}if(x.set(e,s),t.exit){const o=r(!0===t.exit?t.animation:t.exit),n=P({from:o.to,to:o.from},t.easing);try{const t=new globalThis.ViewTimeline({subject:e,axis:"block"}),r={fill:"forwards",easing:n.easing,timeline:t,rangeStart:"exit 0%",rangeEnd:"exit 100%"};E.set(e,e.animate(n.keyframes,r))}catch{}}const i=t.repeat||!t.once;return s.onfinish=()=>{if(!i&&x.get(e)===s){x.delete(e);try{s.commitStyles()}catch{M(e,n.to)}s.cancel(),o?.()}t.onComplete(e)},s}(e,a,()=>g.delete(e))&&(s.engine="css",g.add(e))),"js"!==s.engine||k(t)||N(e,t),o.set(e,s),U(e,s,!0)}function B(e){o.has(e)||_(e,h(e,t))}const H={observe(e,r={}){X();const o=y(r,t);v(e).forEach(e=>_(e,o))},unobserve(e){v(e).forEach(e=>{n.delete(e),A(e,!0)})},init(e){const t=e??(i()?document:null);t&&(X(),t.querySelectorAll("[data-sa]").forEach(B))},watch(e){const t=e??(i()?document:null);if(!t||"undefined"==typeof MutationObserver)return s;H.init(t);const r=e=>{e.hasAttribute("data-sa")&&B(e),e.querySelectorAll("[data-sa]").forEach(B)},o=new MutationObserver(e=>{let t=!1;e.forEach(e=>{if("attributes"===e.type){const t=e.target;return void(!1!==t.isConnected&&r(t))}e.addedNodes.forEach(e=>{e instanceof Element&&!1!==e.isConnected&&r(e)}),e.removedNodes.length&&(t=!0)}),t&&X()});return o.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-sa"]}),p.add(o),()=>{o.disconnect(),p.delete(o)}},destroy(){p.forEach(e=>e.disconnect()),p.clear(),m.forEach(e=>{const t=w.get(e);void 0!==t&&(clearTimeout(t),w.delete(e))}),m.clear(),o.forEach((e,r)=>{e.animated||"css"===e.engine||$(r,t)}),g.forEach(e=>{x.has(e)&&$(e,t)}),g.clear(),C.forEach(e=>e.forEach(e=>e.disconnect())),C.clear(),o.clear(),l.clear(),R(!1),n=new WeakSet},refresh(){C.forEach(e=>e.forEach(e=>e.disconnect())),C.clear(),l.clear(),R(!1),X(),c()&&o.forEach((e,t)=>{U(t,e,!(e.animated&&e.options.once&&!e.options.repeat))})},animate(e,r={}){const o=y(r,t);v(e).forEach(e=>F(e,o,t,0,m))},getObservedElements:()=>Array.from(o.values()),configure(e){t={...t,...e}}};return H}let I=null;let R=null;function V(e,t){const r=[];let o=0;return e.forEach(e=>{const{target:n,gap:a=0,at:s,...i}=e,c={...t,...i},l=c.duration??600,f=Math.max(0,s??o+a)+(c.delay??0);let d=Math.max(o,f);v(n).forEach((e,t)=>{const o=f+t*(c.stagger??0);r.push({el:e,opts:{...c,duration:l,delay:o,stagger:0},end:o+l}),d=Math.max(d,o+l)}),o=d}),r}const z={passive:!0};
2
2
  /**
3
3
  * use-scroll-animate
4
4
  *
@@ -11,5 +11,5 @@
11
11
  * @license MIT
12
12
  * @see https://github.com/HarrisonCN/use-scroll-animate
13
13
  */
14
- const _=z();e.EASING_MAP=n,e.PRESETS=t,e.createScrollAnimate=z,e.default=_,e.getScrollProgress=E,e.parallax=function(e,t={}){const r=b(e);if(!r.length||!i()||!c())return()=>{};const{speed:n=.2,axis:o="y",root:a=null,respectReducedMotion:s=!0}=t,l=t.progressVar?t.progressVar.startsWith("--")?t.progressVar:`--${t.progressVar}`:"--sa-parallax",f="x"===o?"vw":"vh",u=new Set;let p=0,m=!1;const g=a||window,h=e=>{const t=e.style;if(!t)return;const r=E(e,a);if(t.setProperty(l,String(+r.toFixed(4))),s&&d())return void t.removeProperty("translate");const i=`${+((r-.5)*n*100).toFixed(3)}${f}`;t.setProperty("translate","x"===o?`${i} 0px`:`0px ${i}`)},y=()=>{p=0,u.forEach(h)},v=()=>{p||(p=requestAnimationFrame(y))},x=e=>{if(e===m)return;m=e;const t=e?"addEventListener":"removeEventListener";g[t]("scroll",v,U),window[t]("resize",v,U),!e&&p&&(cancelAnimationFrame(p),p=0)},w=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting?u.add(e.target):u.delete(e.target),h(e.target)}),x(u.size>0)},{threshold:0,root:a});return r.forEach(e=>{h(e),w.observe(e)}),()=>{w.disconnect(),x(!1),u.clear(),r.forEach(e=>{const t=e.style;t&&(t.removeProperty("translate"),t.removeProperty(l))})}},e.resolveEasing=o,e.resolvePreset=r,e.sequence=function(e,t={}){const{trigger:r,instance:n,...o}=t;let a,s,l=[],f=[];const d={play:()=>(d.cancel(),i()?(l=D(e,o),new Promise(e=>{let t=l.length;if(s=()=>{s=void 0,e()},!t)return s();const r=l;r.forEach(({el:e,opts:o})=>{const a=o.onComplete;(n||q||(q=z())).animate(e,{...o,onComplete:e=>{a?.(e),r===l&&0===--t&&s?.()}})})})):Promise.resolve()),cancel(){a?.disconnect(),a=void 0,f.forEach(e=>X(e)),f=[],l.forEach(({el:e})=>X(e)),l=[],s?.()},duration:()=>D(e,o).reduce((e,t)=>Math.max(e,t.end),0)};if(r&&i()&&c()){const t=b(r)[0];t&&(f=D(e,o).map(({el:e})=>e),f.forEach(e=>V(e)),a=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(a?.disconnect(),a=void 0,f=[],d.play())},{threshold:o.threshold??.1,rootMargin:o.rootMargin??"0px"}),a.observe(t))}return d},e.staggerChildren=function(e,t={},r){if(!e||!i()||!c())return()=>{};const n=r||W||(W=z()),{stagger:o=80,delay:a=0,threshold:s=.1,rootMargin:l="0px",observeChildren:f=!1,...d}=t;let u=Array.from(e.children),p=!1;const m=[];u.forEach(e=>V(e));const g=new IntersectionObserver(t=>{!p&&t.some(e=>e.isIntersecting)&&(p=!0,g.disconnect(),u.forEach((t,r)=>{t.parentNode===e&&n.animate(t,{...d,delay:a+r*o})}),u=[])},{threshold:s,rootMargin:l});let h;return g.observe(e),f&&"undefined"!=typeof MutationObserver&&(h=new MutationObserver(t=>{t.forEach(t=>{t.addedNodes.forEach(t=>{t instanceof Element&&t.parentNode===e&&(p?(m.push(t),n.observe(t,{...d,delay:a,stagger:o,threshold:s,rootMargin:l})):(V(t),u.push(t)))}),t.removedNodes.forEach(e=>{if(!(e instanceof Element))return;u=u.filter(t=>t!==e);const t=m.indexOf(e);t>=0&&(m.splice(t,1),n.unobserve(e))})})}),h.observe(e,{childList:!0})),()=>{g.disconnect(),h?.disconnect(),p||(p=!0,u.forEach(e=>X(e)),u=[]),m.forEach(e=>n.unobserve(e)),m.length=0}},e.supportsScrollTimeline=u,Object.defineProperty(e,"__esModule",{value:!0})});
14
+ const W=Y();e.EASING_MAP=o,e.PRESETS=t,e.createScrollAnimate=Y,e.default=W,e.getScrollProgress=b,e.parallax=function(e,t={}){const r=v(e);if(!r.length||!i()||!c())return()=>{};const{speed:o=.2,axis:n="y",root:a=null,respectReducedMotion:s=!0}=t,l=t.progressVar?t.progressVar.startsWith("--")?t.progressVar:`--${t.progressVar}`:"--sa-parallax",f="x"===n?"vw":"vh",u=new Set;let p=0,m=!1;const g=a||window,h=e=>{const t=e.style;if(!t)return;const r=b(e,a);if(t.setProperty(l,String(+r.toFixed(4))),s&&d())return void t.removeProperty("translate");const i=`${+((r-.5)*o*100).toFixed(3)}${f}`;t.setProperty("translate","x"===n?`${i} 0px`:`0px ${i}`)},y=()=>{p=0,u.forEach(h)},x=()=>{p||(p=requestAnimationFrame(y))},E=e=>{if(e===m)return;m=e;const t=e?"addEventListener":"removeEventListener";g[t]("scroll",x,z),window[t]("resize",x,z),!e&&p&&(cancelAnimationFrame(p),p=0)},w=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting?u.add(e.target):u.delete(e.target),h(e.target)}),E(u.size>0)},{threshold:0,root:a});return r.forEach(e=>{h(e),w.observe(e)}),()=>{w.disconnect(),E(!1),u.clear(),r.forEach(e=>{const t=e.style;t&&(t.removeProperty("translate"),t.removeProperty(l))})}},e.resolveEasing=n,e.resolvePreset=r,e.sequence=function(e,t={}){const{trigger:r,instance:o,...n}=t;let a,s,l=[],f=[];const d={play:()=>(d.cancel(),i()?(l=V(e,n),new Promise(e=>{let t=l.length;if(s=()=>{s=void 0,e()},!t)return s();const r=l;r.forEach(({el:e,opts:n})=>{const a=n.onComplete;(o||R||(R=Y())).animate(e,{...n,onComplete:e=>{a?.(e),r===l&&0===--t&&s?.()}})})})):Promise.resolve()),cancel(){a?.disconnect(),a=void 0,f.forEach(e=>X(e)),f=[],l.forEach(({el:e})=>X(e)),l=[],s?.()},duration:()=>V(e,n).reduce((e,t)=>Math.max(e,t.end),0)};if(r&&i()&&c()){const t=v(r)[0];t&&(f=V(e,n).map(({el:e})=>e),f.forEach(e=>L(e)),a=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(a?.disconnect(),a=void 0,f=[],d.play())},{threshold:n.threshold??.1,rootMargin:n.rootMargin??"0px"}),a.observe(t))}return d},e.staggerChildren=function(e,t={},r){if(!e||!i()||!c())return()=>{};const o=r||I||(I=Y()),{stagger:n=80,delay:a=0,threshold:s=.1,rootMargin:l="0px",observeChildren:f=!1,...d}=t;let u=Array.from(e.children),p=!1;const m=[];u.forEach(e=>L(e));const g=new IntersectionObserver(t=>{!p&&t.some(e=>e.isIntersecting)&&(p=!0,g.disconnect(),u.forEach((t,r)=>{t.parentNode===e&&o.animate(t,{...d,delay:a+r*n})}),u=[])},{threshold:s,rootMargin:l});let h;return g.observe(e),f&&"undefined"!=typeof MutationObserver&&(h=new MutationObserver(t=>{t.forEach(t=>{t.addedNodes.forEach(t=>{t instanceof Element&&t.parentNode===e&&(p?(m.push(t),o.observe(t,{...d,delay:a,stagger:n,threshold:s,rootMargin:l})):(L(t),u.push(t)))}),t.removedNodes.forEach(e=>{if(!(e instanceof Element))return;u=u.filter(t=>t!==e);const t=m.indexOf(e);t>=0&&(m.splice(t,1),o.unobserve(e))})})}),h.observe(e,{childList:!0})),()=>{g.disconnect(),h?.disconnect(),p||(p=!0,u.forEach(e=>X(e)),u=[]),m.forEach(e=>o.unobserve(e)),m.length=0}},e.supportsScrollTimeline=u,Object.defineProperty(e,"__esModule",{value:!0})});
15
15
  //# sourceMappingURL=index.umd.js.map