use-scroll-animate 1.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/presets.ts","../src/core.ts","../src/react.ts","../src/vue.ts","../src/index.ts"],"sourcesContent":["/**\n * use-scroll-animate - Animation Presets\n * Defines keyframes for all built-in animation presets\n */\n\nimport type { AnimationPreset, CustomAnimation } from './types';\n\ntype KeyframeMap = {\n from: Record<string, string | number>;\n to: Record<string, string | number>;\n};\n\nexport const PRESETS: Record<AnimationPreset, KeyframeMap> = {\n 'fade-in': {\n from: { opacity: 0 },\n to: { opacity: 1 },\n },\n 'fade-in-up': {\n from: { opacity: 0, transform: 'translateY(40px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n 'fade-in-down': {\n from: { opacity: 0, transform: 'translateY(-40px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n 'fade-in-left': {\n from: { opacity: 0, transform: 'translateX(-40px)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n },\n 'fade-in-right': {\n from: { opacity: 0, transform: 'translateX(40px)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n },\n 'zoom-in': {\n from: { opacity: 0, transform: 'scale(0.8)' },\n to: { opacity: 1, transform: 'scale(1)' },\n },\n 'zoom-out': {\n from: { opacity: 0, transform: 'scale(1.2)' },\n to: { opacity: 1, transform: 'scale(1)' },\n },\n 'flip-x': {\n from: { opacity: 0, transform: 'rotateX(-90deg)' },\n to: { opacity: 1, transform: 'rotateX(0)' },\n },\n 'flip-y': {\n from: { opacity: 0, transform: 'rotateY(-90deg)' },\n to: { opacity: 1, transform: 'rotateY(0)' },\n },\n 'slide-up': {\n from: { transform: 'translateY(100%)' },\n to: { transform: 'translateY(0)' },\n },\n 'slide-down': {\n from: { transform: 'translateY(-100%)' },\n to: { transform: 'translateY(0)' },\n },\n 'slide-left': {\n from: { transform: 'translateX(-100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'slide-right': {\n from: { transform: 'translateX(100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'bounce': {\n from: { opacity: 0, transform: 'translateY(-60px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n 'rotate-in': {\n from: { opacity: 0, transform: 'rotate(-180deg) scale(0.5)' },\n to: { opacity: 1, transform: 'rotate(0deg) scale(1)' },\n },\n 'blur-in': {\n from: { opacity: 0, filter: 'blur(12px)' },\n to: { opacity: 1, filter: 'blur(0px)' },\n },\n 'skew-in': {\n from: { opacity: 0, transform: 'skewX(20deg) translateX(30px)' },\n to: { opacity: 1, transform: 'skewX(0deg) translateX(0)' },\n },\n 'scale-x': {\n from: { transform: 'scaleX(0)' },\n to: { transform: 'scaleX(1)' },\n },\n 'scale-y': {\n from: { transform: 'scaleY(0)' },\n to: { transform: 'scaleY(1)' },\n },\n 'shimmer': {\n from: { opacity: 0.5, filter: 'brightness(1)' },\n to: { opacity: 1, filter: 'brightness(1.5)' },\n },\n 'pulse': {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.05)' },\n },\n 'swing': {\n from: { transform: 'rotate(-10deg)' },\n to: { transform: 'rotate(10deg)' },\n },\n};\n\nexport function resolvePreset(animation: AnimationPreset | AnimationPreset[] | CustomAnimation): KeyframeMap {\n if (typeof animation === 'string') {\n return PRESETS[animation] ?? PRESETS['fade-in-up'];\n }\n \n if (Array.isArray(animation)) {\n const combined: KeyframeMap = { from: {}, to: {} };\n animation.forEach(name => {\n const preset = PRESETS[name];\n if (preset) {\n Object.entries(preset.from).forEach(([key, val]) => {\n if (key === 'transform' && combined.from[key]) {\n combined.from[key] = `${combined.from[key]} ${val}`;\n } else {\n combined.from[key] = val;\n }\n });\n Object.entries(preset.to).forEach(([key, val]) => {\n if (key === 'transform' && combined.to[key]) {\n combined.to[key] = `${combined.to[key]} ${val}`;\n } else {\n combined.to[key] = val;\n }\n });\n }\n });\n return combined;\n }\n \n return animation;\n}\n\n/** Easing to CSS cubic-bezier mapping */\nexport const EASING_MAP: Record<string, string> = {\n linear: 'linear',\n ease: 'ease',\n 'ease-in': 'ease-in',\n 'ease-out': 'ease-out',\n 'ease-in-out': 'ease-in-out',\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n};\n\nexport function resolveEasing(easing: string): string {\n return EASING_MAP[easing] ?? easing;\n}\n","/**\n * use-scroll-animate - Core Implementation\n * Uses IntersectionObserver + Web Animations API for zero-dependency,\n * high-performance scroll-triggered animations.\n */\n\nimport type {\n AnimateOptions,\n AnimatedElement,\n ScrollAnimateConfig,\n ScrollAnimateInstance,\n ParallaxOptions,\n} from './types';\nimport { resolvePreset, resolveEasing } from './presets';\n\nconst DEFAULT_CONFIG: Required<ScrollAnimateConfig> = {\n defaultAnimation: 'fade-in-up',\n defaultDuration: 600,\n defaultDelay: 0,\n defaultEasing: 'ease',\n defaultThreshold: 0.1,\n defaultRootMargin: '0px',\n defaultRepeat: false,\n defaultOnce: true,\n defaultOffset: 0,\n hiddenClass: 'sa-hidden',\n visibleClass: 'sa-visible',\n useClassNames: false,\n disabled: false,\n root: null,\n};\n\nconst DEFAULT_OPTIONS: Required<AnimateOptions> = {\n animation: 'fade-in-up',\n duration: 600,\n delay: 0,\n easing: 'ease',\n threshold: 0.1,\n rootMargin: '0px',\n repeat: false,\n once: true,\n offset: 0,\n stagger: 0,\n parallax: {},\n onStart: () => undefined,\n onComplete: () => undefined,\n onEnter: () => undefined,\n onLeave: () => undefined,\n onProgress: () => undefined,\n};\n\nfunction parseDataAttributes(el: Element, config: Required<ScrollAnimateConfig>): Required<AnimateOptions> {\n const dataset = (el as HTMLElement).dataset;\n const opts: AnimateOptions = {};\n\n if (dataset.saAnimation) {\n const anim = dataset.saAnimation;\n opts.animation = anim.includes(',') \n ? anim.split(',').map(s => s.trim()) as any \n : anim as any;\n }\n if (dataset.saDuration) opts.duration = parseInt(dataset.saDuration, 10);\n if (dataset.saDelay) opts.delay = parseInt(dataset.saDelay, 10);\n if (dataset.saEasing) opts.easing = dataset.saEasing;\n if (dataset.saThreshold) {\n const t = dataset.saThreshold;\n opts.threshold = t.includes(',') ? t.split(',').map(parseFloat) : parseFloat(t);\n }\n if (dataset.saRootMargin) opts.rootMargin = dataset.saRootMargin;\n if (dataset.saRepeat !== undefined) opts.repeat = dataset.saRepeat !== 'false';\n if (dataset.saOnce !== undefined) opts.once = dataset.saOnce !== 'false';\n if (dataset.saOffset) opts.offset = parseInt(dataset.saOffset, 10);\n if (dataset.saStagger) opts.stagger = parseInt(dataset.saStagger, 10);\n \n if (dataset.saParallaxX || dataset.saParallaxY || dataset.saParallaxRotate || dataset.saParallaxScale) {\n opts.parallax = {\n x: dataset.saParallaxX,\n y: dataset.saParallaxY,\n rotate: dataset.saParallaxRotate ? parseFloat(dataset.saParallaxRotate) : undefined,\n scale: dataset.saParallaxScale ? parseFloat(dataset.saParallaxScale) : undefined,\n speed: dataset.saParallaxSpeed ? parseFloat(dataset.saParallaxSpeed) : 1,\n };\n }\n\n return mergeOptions(opts, config);\n}\n\nfunction mergeOptions(\n opts: AnimateOptions,\n config: Required<ScrollAnimateConfig>\n): Required<AnimateOptions> {\n const repeat = opts.repeat ?? config.defaultRepeat;\n return {\n animation: opts.animation ?? config.defaultAnimation,\n duration: opts.duration ?? config.defaultDuration,\n delay: opts.delay ?? config.defaultDelay,\n easing: opts.easing ?? config.defaultEasing,\n threshold: opts.threshold ?? config.defaultThreshold,\n rootMargin: opts.rootMargin ?? config.defaultRootMargin,\n repeat: repeat,\n once: opts.once ?? (repeat ? false : config.defaultOnce),\n offset: opts.offset ?? config.defaultOffset,\n stagger: opts.stagger ?? DEFAULT_OPTIONS.stagger,\n parallax: opts.parallax ?? DEFAULT_OPTIONS.parallax,\n onStart: opts.onStart ?? DEFAULT_OPTIONS.onStart,\n onComplete: opts.onComplete ?? DEFAULT_OPTIONS.onComplete,\n onEnter: opts.onEnter ?? DEFAULT_OPTIONS.onEnter,\n onLeave: opts.onLeave ?? DEFAULT_OPTIONS.onLeave,\n onProgress: opts.onProgress ?? DEFAULT_OPTIONS.onProgress,\n };\n}\n\nfunction resolveTargets(target: string | Element | NodeList | Element[]): Element[] {\n if (typeof target === 'string') {\n return Array.from(document.querySelectorAll(target));\n }\n if (target instanceof Element) {\n return [target];\n }\n if (target instanceof NodeList) {\n return Array.from(target) as Element[];\n }\n if (Array.isArray(target)) {\n return target;\n }\n return [];\n}\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n}\n\nfunction runAnimation(\n el: Element,\n opts: Required<AnimateOptions>,\n config: Required<ScrollAnimateConfig>,\n staggerIndex = 0\n): void {\n const { animation, duration, delay, easing, stagger, onStart, onComplete } = opts;\n const totalDelay = delay + staggerIndex * stagger;\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n\n if (config.useClassNames) {\n if (totalDelay > 0) {\n (el as HTMLElement).style.animationDelay = `${totalDelay}ms`;\n }\n el.classList.remove(config.hiddenClass);\n el.classList.add(config.visibleClass);\n onStart(el);\n setTimeout(() => onComplete(el), duration + totalDelay);\n return;\n }\n\n const keyframes: Keyframe[] = [\n preset.from as Keyframe,\n preset.to as Keyframe,\n ];\n\n const timing: KeyframeAnimationOptions = {\n duration,\n delay: totalDelay,\n easing: easingValue,\n fill: 'both',\n };\n\n // Check if Web Animations API is supported\n if (typeof el.animate === 'function') {\n const anim = el.animate(keyframes, timing);\n onStart(el);\n anim.onfinish = () => onComplete(el);\n } else {\n // Fallback for older browsers\n (el as HTMLElement).style.opacity = '1';\n (el as HTMLElement).style.transform = 'none';\n onStart(el);\n onComplete(el);\n }\n}\n\nfunction applyParallax(el: Element, progress: number, parallax: ParallaxOptions): void {\n const { x = 0, y = 0, rotate = 0, scale = 1, speed = 1 } = parallax;\n const p = (progress - 0.5) * 2 * speed;\n \n let transform = '';\n if (x) transform += ` translateX(${typeof x === 'number' ? x * p + 'px' : 'calc(' + x + ' * ' + p + ')'})`;\n if (y) transform += ` translateY(${typeof y === 'number' ? y * p + 'px' : 'calc(' + y + ' * ' + p + ')'})`;\n if (rotate) transform += ` rotate(${rotate * p}deg)`;\n if (scale !== 1) transform += ` scale(${1 + (scale - 1) * p})`;\n \n (el as HTMLElement).style.transform = transform;\n}\n\nfunction hideElement(el: Element, config: Required<ScrollAnimateConfig>): void {\n if (config.useClassNames) {\n el.classList.add(config.hiddenClass);\n el.classList.remove(config.visibleClass);\n } else {\n (el as HTMLElement).style.opacity = '0';\n }\n}\n\nexport function createScrollAnimate(userConfig: ScrollAnimateConfig = {}): ScrollAnimateInstance {\n let config: Required<ScrollAnimateConfig> = { ...DEFAULT_CONFIG, ...userConfig };\n const registry = new Map<Element, AnimatedElement>();\n\n function createObserver(opts: Required<AnimateOptions>): IntersectionObserver {\n // Handle offset by adjusting rootMargin\n const rootMargin = opts.offset !== 0 \n ? `${opts.rootMargin.split(' ')[0]} 0px -${opts.offset}px 0px`\n : opts.rootMargin;\n\n return new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const record = registry.get(entry.target);\n if (!record) return;\n\n if (entry.isIntersecting) {\n opts.onEnter(entry.target);\n\n if (!record.animated || opts.repeat) {\n const parent = entry.target.parentElement;\n let staggerIndex = 0;\n if (parent && opts.stagger > 0) {\n // BUG FIX: Use a more robust way to find index among siblings that are also observed\n const siblings = Array.from(parent.children).filter((c) => registry.has(c));\n staggerIndex = siblings.indexOf(entry.target);\n }\n\n if (!config.disabled && !prefersReducedMotion()) {\n runAnimation(entry.target, opts, config, staggerIndex);\n } else {\n (entry.target as HTMLElement).style.opacity = '1';\n (entry.target as HTMLElement).style.transform = '';\n }\n\n record.animated = true;\n \n // Handle 'once' functionality\n if (opts.once) {\n record.observer.unobserve(entry.target);\n record.progressObserver?.unobserve(entry.target);\n // We don't delete from registry yet to allow other potential interactions\n }\n }\n } else {\n opts.onLeave(entry.target);\n if (opts.repeat && record.animated) {\n hideElement(entry.target, config);\n record.animated = false;\n }\n }\n });\n },\n {\n threshold: typeof opts.threshold === 'number' ? opts.threshold : opts.threshold[0],\n rootMargin: rootMargin,\n root: config.root,\n }\n );\n }\n\n function createProgressObserver(el: Element, opts: Required<AnimateOptions>): IntersectionObserver {\n const thresholds = [];\n for (let i = 0; i <= 100; i++) thresholds.push(i / 100);\n\n return new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const progress = entry.intersectionRatio;\n opts.onProgress(el, progress);\n \n if (Object.keys(opts.parallax).length > 0) {\n applyParallax(el, progress, opts.parallax);\n }\n });\n },\n {\n threshold: thresholds,\n rootMargin: opts.rootMargin,\n root: config.root,\n }\n );\n }\n\n function observeElement(el: Element, opts: Required<AnimateOptions>): void {\n if (registry.has(el)) return;\n\n if (!config.useClassNames) {\n hideElement(el, config);\n }\n\n const observer = createObserver(opts);\n observer.observe(el);\n\n let progressObserver;\n if (Object.keys(opts.parallax).length > 0 || opts.onProgress !== DEFAULT_OPTIONS.onProgress) {\n progressObserver = createProgressObserver(el, opts);\n progressObserver.observe(el);\n }\n\n registry.set(el, { \n element: el, \n options: opts, \n observer, \n animated: false,\n progressObserver \n });\n }\n\n const instance: ScrollAnimateInstance = {\n observe(target, options = {}) {\n const elements = resolveTargets(target);\n const opts = mergeOptions(options, config);\n elements.forEach((el) => observeElement(el, opts));\n },\n\n unobserve(target) {\n const elements = resolveTargets(target);\n elements.forEach((el) => {\n const record = registry.get(el);\n if (record) {\n record.observer.disconnect(); // BUG FIX: Use disconnect for better cleanup\n record.progressObserver?.disconnect();\n registry.delete(el);\n }\n });\n },\n\n init(rootElement = document) {\n const elements = rootElement.querySelectorAll('[data-sa]');\n elements.forEach((el) => {\n const opts = parseDataAttributes(el, config);\n observeElement(el, opts);\n });\n },\n\n destroy() {\n registry.forEach((record) => {\n record.observer.disconnect();\n record.progressObserver?.disconnect();\n });\n registry.clear();\n },\n\n refresh() {\n const entries = Array.from(registry.entries());\n instance.destroy();\n entries.forEach(([el, record]) => {\n observeElement(el, record.options);\n });\n },\n\n animate(target, options = {}) {\n const elements = resolveTargets(target);\n const opts = mergeOptions(options, config);\n elements.forEach((el) => {\n runAnimation(el, opts, config, 0);\n });\n },\n\n getObservedElements() {\n return Array.from(registry.values());\n },\n\n configure(newConfig) {\n config = { ...config, ...newConfig };\n },\n };\n\n return instance;\n}\n","/**\n * use-scroll-animate - React Integration\n * Provides useScrollAnimate and useScrollRef hooks for React applications.\n */\n\nimport type { AnimateOptions } from './types';\nimport { resolvePreset, resolveEasing } from './presets';\n\ntype ReactRef<T> = { current: T | null };\n\nexport function createReactHooks(React: {\n useRef: <T>(initial: T | null) => ReactRef<T>;\n useEffect: (effect: () => (() => void) | void, deps?: unknown[]) => void;\n}) {\n function useScrollAnimate(options: AnimateOptions = {}) {\n const ref = React.useRef<Element>(null);\n\n React.useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const {\n animation = 'fade-in-up',\n duration = 600,\n delay = 0,\n easing = 'ease',\n threshold = 0.1,\n rootMargin = '0px',\n repeat = false,\n parallax = {},\n onStart,\n onComplete,\n onEnter,\n onLeave,\n onProgress,\n } = options;\n\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n let animated = false;\n\n (el as HTMLElement).style.opacity = '0';\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n onEnter?.(el);\n if (!animated || repeat) {\n const keyframes: Keyframe[] = [\n preset.from as Keyframe,\n preset.to as Keyframe,\n ];\n const anim = el.animate(keyframes, {\n duration,\n delay,\n easing: easingValue,\n fill: 'both',\n });\n onStart?.(el);\n anim.onfinish = () => onComplete?.(el);\n animated = true;\n if (!repeat && !Object.keys(parallax).length && !onProgress) {\n observer.unobserve(el);\n }\n }\n } else {\n onLeave?.(el);\n if (repeat && animated) {\n (el as HTMLElement).style.opacity = '0';\n animated = false;\n }\n }\n });\n },\n { threshold: typeof threshold === 'number' ? threshold : threshold[0], rootMargin }\n );\n\n let progressObserver: IntersectionObserver | null = null;\n if (Object.keys(parallax).length > 0 || onProgress) {\n const thresholds = [];\n for (let i = 0; i <= 100; i++) thresholds.push(i / 100);\n \n progressObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const progress = entry.intersectionRatio;\n onProgress?.(el, progress);\n \n if (Object.keys(parallax).length > 0) {\n const { x = 0, y = 0, rotate = 0, scale = 1, speed = 1 } = parallax;\n const p = (progress - 0.5) * 2 * speed;\n let transform = '';\n if (x) transform += ` translateX(${typeof x === 'number' ? x * p + 'px' : 'calc(' + x + ' * ' + p + ')'})`;\n if (y) transform += ` translateY(${typeof y === 'number' ? y * p + 'px' : 'calc(' + y + ' * ' + p + ')'})`;\n if (rotate) transform += ` rotate(${rotate * p}deg)`;\n if (scale !== 1) transform += ` scale(${1 + (scale - 1) * p})`;\n (el as HTMLElement).style.transform = transform;\n }\n });\n },\n { threshold: thresholds, rootMargin }\n );\n progressObserver.observe(el);\n }\n\n observer.observe(el);\n return () => {\n observer.disconnect();\n progressObserver?.disconnect();\n };\n }, []);\n\n return ref;\n }\n\n function useScrollStagger(options: AnimateOptions & { stagger?: number } = {}) {\n const ref = React.useRef<Element>(null);\n\n React.useEffect(() => {\n const container = ref.current;\n if (!container) return;\n\n const {\n animation = 'fade-in-up',\n duration = 600,\n delay = 0,\n easing = 'ease',\n threshold = 0.1,\n rootMargin = '0px',\n stagger = 80,\n } = options;\n\n const children = Array.from(container.children) as HTMLElement[];\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n\n children.forEach((child) => {\n child.style.opacity = '0';\n });\n\n let animated = false;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !animated) {\n animated = true;\n children.forEach((child, i) => {\n child.animate(\n [preset.from as Keyframe, preset.to as Keyframe],\n {\n duration,\n delay: delay + i * stagger,\n easing: easingValue,\n fill: 'both',\n }\n );\n });\n observer.unobserve(container);\n }\n });\n },\n { threshold: typeof threshold === 'number' ? threshold : threshold[0], rootMargin }\n );\n\n observer.observe(container);\n return () => observer.disconnect();\n }, []);\n\n return ref;\n }\n\n return { useScrollAnimate, useScrollStagger };\n}\n","/**\n * use-scroll-animate - Vue 3 Integration\n * Provides useScrollAnimate composable for Vue 3 applications.\n */\n\nimport type { AnimateOptions } from './types';\nimport { resolvePreset, resolveEasing } from './presets';\n\nexport function createVueComposables(Vue: {\n ref: <T>(value: T | null) => { value: T | null };\n onMounted: (fn: () => void) => void;\n onUnmounted: (fn: () => void) => void;\n}) {\n function useScrollAnimate(options: AnimateOptions = {}) {\n const animateRef = Vue.ref<Element>(null);\n let observer: IntersectionObserver | null = null;\n let progressObserver: IntersectionObserver | null = null;\n\n Vue.onMounted(() => {\n const el = animateRef.value;\n if (!el) return;\n\n const {\n animation = 'fade-in-up',\n duration = 600,\n delay = 0,\n easing = 'ease',\n threshold = 0.1,\n rootMargin = '0px',\n repeat = false,\n parallax = {},\n onStart,\n onComplete,\n onEnter,\n onLeave,\n onProgress,\n } = options;\n\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n let animated = false;\n\n (el as HTMLElement).style.opacity = '0';\n\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n onEnter?.(el);\n if (!animated || repeat) {\n const anim = el.animate(\n [preset.from as Keyframe, preset.to as Keyframe],\n {\n duration,\n delay,\n easing: easingValue,\n fill: 'both',\n }\n );\n onStart?.(el);\n anim.onfinish = () => onComplete?.(el);\n animated = true;\n if (!repeat && !Object.keys(parallax).length && !onProgress) {\n observer?.unobserve(el);\n }\n }\n } else {\n onLeave?.(el);\n if (repeat && animated) {\n (el as HTMLElement).style.opacity = '0';\n animated = false;\n }\n }\n });\n },\n { threshold: typeof threshold === 'number' ? threshold : threshold[0], rootMargin }\n );\n\n if (Object.keys(parallax).length > 0 || onProgress) {\n const thresholds = [];\n for (let i = 0; i <= 100; i++) thresholds.push(i / 100);\n \n progressObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const progress = entry.intersectionRatio;\n onProgress?.(el, progress);\n \n if (Object.keys(parallax).length > 0) {\n const { x = 0, y = 0, rotate = 0, scale = 1, speed = 1 } = parallax;\n const p = (progress - 0.5) * 2 * speed;\n let transform = '';\n if (x) transform += ` translateX(${typeof x === 'number' ? x * p + 'px' : 'calc(' + x + ' * ' + p + ')'})`;\n if (y) transform += ` translateY(${typeof y === 'number' ? y * p + 'px' : 'calc(' + y + ' * ' + p + ')'})`;\n if (rotate) transform += ` rotate(${rotate * p}deg)`;\n if (scale !== 1) transform += ` scale(${1 + (scale - 1) * p})`;\n (el as HTMLElement).style.transform = transform;\n }\n });\n },\n { threshold: thresholds, rootMargin }\n );\n progressObserver.observe(el);\n }\n\n observer.observe(el);\n });\n\n Vue.onUnmounted(() => {\n observer?.disconnect();\n progressObserver?.disconnect();\n });\n\n return { animateRef };\n }\n\n return { useScrollAnimate };\n}\n","/**\n * use-scroll-animate\n *\n * A lightweight (~4KB gzipped), dependency-free scroll animation library\n * for modern web applications. Built with TypeScript, powered by\n * IntersectionObserver and the Web Animations API.\n *\n * @version 1.0.0\n * @license MIT\n * @see https://github.com/use-scroll-animate/use-scroll-animate\n */\n\nexport { createScrollAnimate } from './core';\nexport { PRESETS, resolvePreset, resolveEasing, EASING_MAP } from './presets';\nexport { createReactHooks } from './react';\nexport { createVueComposables } from './vue';\n\nexport type {\n AnimationPreset,\n EasingType,\n AnimationKeyframe,\n CustomAnimation,\n AnimateOptions,\n ScrollAnimateConfig,\n AnimatedElement,\n ScrollAnimateInstance,\n} from './types';\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 = createScrollAnimate();\nexport default ScrollAnimate;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
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(0)"}},"fade-in-down":{from:{opacity:0,transform:"translateY(-40px)"},to:{opacity:1,transform:"translateY(0)"}},"fade-in-left":{from:{opacity:0,transform:"translateX(-40px)"},to:{opacity:1,transform:"translateX(0)"}},"fade-in-right":{from:{opacity:0,transform:"translateX(40px)"},to:{opacity:1,transform:"translateX(0)"}},"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(0)"}},"flip-y":{from:{opacity:0,transform:"rotateY(-90deg)"},to:{opacity:1,transform:"rotateY(0)"}},"slide-up":{from:{transform:"translateY(100%)"},to:{transform:"translateY(0)"}},"slide-down":{from:{transform:"translateY(-100%)"},to:{transform:"translateY(0)"}},"slide-left":{from:{transform:"translateX(-100%)"},to:{transform:"translateX(0)"}},"slide-right":{from:{transform:"translateX(100%)"},to:{transform:"translateX(0)"}},bounce:{from:{opacity:0,transform:"translateY(-60px)"},to:{opacity:1,transform:"translateY(0)"}},"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(0)"}},"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)"}}};function a(e){var a;if("string"==typeof e)return null!==(a=t[e])&&void 0!==a?a:t["fade-in-up"];if(Array.isArray(e)){const a={from:{},to:{}};return e.forEach(e=>{const o=t[e];o&&(Object.entries(o.from).forEach(([e,t])=>{"transform"===e&&a.from[e]?a.from[e]=`${a.from[e]} ${t}`:a.from[e]=t}),Object.entries(o.to).forEach(([e,t])=>{"transform"===e&&a.to[e]?a.to[e]=`${a.to[e]} ${t}`:a.to[e]=t}))}),a}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)"};function r(e){var t;return null!==(t=o[e])&&void 0!==t?t:e}const n={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},s={stagger:0,parallax:{},onStart:()=>{},onComplete:()=>{},onEnter:()=>{},onLeave:()=>{},onProgress:()=>{}};function l(e,t){var a,o,r,n,l,i,f,c,u,d,m,p,g,y,h,v;const b=null!==(a=e.repeat)&&void 0!==a?a:t.defaultRepeat;return{animation:null!==(o=e.animation)&&void 0!==o?o:t.defaultAnimation,duration:null!==(r=e.duration)&&void 0!==r?r:t.defaultDuration,delay:null!==(n=e.delay)&&void 0!==n?n:t.defaultDelay,easing:null!==(l=e.easing)&&void 0!==l?l:t.defaultEasing,threshold:null!==(i=e.threshold)&&void 0!==i?i:t.defaultThreshold,rootMargin:null!==(f=e.rootMargin)&&void 0!==f?f:t.defaultRootMargin,repeat:b,once:null!==(c=e.once)&&void 0!==c?c:!b&&t.defaultOnce,offset:null!==(u=e.offset)&&void 0!==u?u:t.defaultOffset,stagger:null!==(d=e.stagger)&&void 0!==d?d:s.stagger,parallax:null!==(m=e.parallax)&&void 0!==m?m:s.parallax,onStart:null!==(p=e.onStart)&&void 0!==p?p:s.onStart,onComplete:null!==(g=e.onComplete)&&void 0!==g?g:s.onComplete,onEnter:null!==(y=e.onEnter)&&void 0!==y?y:s.onEnter,onLeave:null!==(h=e.onLeave)&&void 0!==h?h:s.onLeave,onProgress:null!==(v=e.onProgress)&&void 0!==v?v:s.onProgress}}function i(e){return"string"==typeof e?Array.from(document.querySelectorAll(e)):e instanceof Element?[e]:e instanceof NodeList?Array.from(e):Array.isArray(e)?e:[]}function f(e,t,o,n=0){const{animation:s,duration:l,delay:i,easing:f,stagger:c,onStart:u,onComplete:d}=t,m=i+n*c,p=a(s),g=r(f);if(o.useClassNames)return m>0&&(e.style.animationDelay=`${m}ms`),e.classList.remove(o.hiddenClass),e.classList.add(o.visibleClass),u(e),void setTimeout(()=>d(e),l+m);const y=[p.from,p.to],h={duration:l,delay:m,easing:g,fill:"both"};if("function"==typeof e.animate){const t=e.animate(y,h);u(e),t.onfinish=()=>d(e)}else e.style.opacity="1",e.style.transform="none",u(e),d(e)}function c(e,t){t.useClassNames?(e.classList.add(t.hiddenClass),e.classList.remove(t.visibleClass)):e.style.opacity="0"}function u(e={}){let t={...n,...e};const a=new Map;function o(e){const o=0!==e.offset?`${e.rootMargin.split(" ")[0]} 0px -${e.offset}px 0px`:e.rootMargin;return new IntersectionObserver(o=>{o.forEach(o=>{var r;const n=a.get(o.target);if(n)if(o.isIntersecting){if(e.onEnter(o.target),!n.animated||e.repeat){const s=o.target.parentElement;let l=0;if(s&&e.stagger>0){l=Array.from(s.children).filter(e=>a.has(e)).indexOf(o.target)}t.disabled||function(){var e,t;return null!==(t=null===(e=window.matchMedia)||void 0===e?void 0:e.call(window,"(prefers-reduced-motion: reduce)").matches)&&void 0!==t&&t}()?(o.target.style.opacity="1",o.target.style.transform=""):f(o.target,e,t,l),n.animated=!0,e.once&&(n.observer.unobserve(o.target),null===(r=n.progressObserver)||void 0===r||r.unobserve(o.target))}}else e.onLeave(o.target),e.repeat&&n.animated&&(c(o.target,t),n.animated=!1)})},{threshold:"number"==typeof e.threshold?e.threshold:e.threshold[0],rootMargin:o,root:t.root})}function r(e,r){if(a.has(e))return;t.useClassNames||c(e,t);const n=o(r);let l;n.observe(e),(Object.keys(r.parallax).length>0||r.onProgress!==s.onProgress)&&(l=function(e,a){const o=[];for(let e=0;e<=100;e++)o.push(e/100);return new IntersectionObserver(t=>{t.forEach(t=>{const o=t.intersectionRatio;a.onProgress(e,o),Object.keys(a.parallax).length>0&&function(e,t,a){const{x:o=0,y:r=0,rotate:n=0,scale:s=1,speed:l=1}=a,i=2*(t-.5)*l;let f="";o&&(f+=` translateX(${"number"==typeof o?o*i+"px":"calc("+o+" * "+i+")"})`),r&&(f+=` translateY(${"number"==typeof r?r*i+"px":"calc("+r+" * "+i+")"})`),n&&(f+=` rotate(${n*i}deg)`),1!==s&&(f+=` scale(${1+(s-1)*i})`),e.style.transform=f}(e,o,a.parallax)})},{threshold:o,rootMargin:a.rootMargin,root:t.root})}(e,r),l.observe(e)),a.set(e,{element:e,options:r,observer:n,animated:!1,progressObserver:l})}const u={observe(e,a={}){const o=i(e),n=l(a,t);o.forEach(e=>r(e,n))},unobserve(e){i(e).forEach(e=>{var t;const o=a.get(e);o&&(o.observer.disconnect(),null===(t=o.progressObserver)||void 0===t||t.disconnect(),a.delete(e))})},init(e=document){e.querySelectorAll("[data-sa]").forEach(e=>{const a=function(e,t){const a=e.dataset,o={};if(a.saAnimation){const e=a.saAnimation;o.animation=e.includes(",")?e.split(",").map(e=>e.trim()):e}if(a.saDuration&&(o.duration=parseInt(a.saDuration,10)),a.saDelay&&(o.delay=parseInt(a.saDelay,10)),a.saEasing&&(o.easing=a.saEasing),a.saThreshold){const e=a.saThreshold;o.threshold=e.includes(",")?e.split(",").map(parseFloat):parseFloat(e)}return a.saRootMargin&&(o.rootMargin=a.saRootMargin),void 0!==a.saRepeat&&(o.repeat="false"!==a.saRepeat),void 0!==a.saOnce&&(o.once="false"!==a.saOnce),a.saOffset&&(o.offset=parseInt(a.saOffset,10)),a.saStagger&&(o.stagger=parseInt(a.saStagger,10)),(a.saParallaxX||a.saParallaxY||a.saParallaxRotate||a.saParallaxScale)&&(o.parallax={x:a.saParallaxX,y:a.saParallaxY,rotate:a.saParallaxRotate?parseFloat(a.saParallaxRotate):void 0,scale:a.saParallaxScale?parseFloat(a.saParallaxScale):void 0,speed:a.saParallaxSpeed?parseFloat(a.saParallaxSpeed):1}),l(o,t)}(e,t);r(e,a)})},destroy(){a.forEach(e=>{var t;e.observer.disconnect(),null===(t=e.progressObserver)||void 0===t||t.disconnect()}),a.clear()},refresh(){const e=Array.from(a.entries());u.destroy(),e.forEach(([e,t])=>{r(e,t.options)})},animate(e,a={}){const o=i(e),r=l(a,t);o.forEach(e=>{f(e,r,t,0)})},getObservedElements:()=>Array.from(a.values()),configure(e){t={...t,...e}}};return u}
2
+ /**
3
+ * use-scroll-animate
4
+ *
5
+ * A lightweight (~4KB gzipped), dependency-free scroll animation library
6
+ * for modern web applications. Built with TypeScript, powered by
7
+ * IntersectionObserver and the Web Animations API.
8
+ *
9
+ * @version 1.0.0
10
+ * @license MIT
11
+ * @see https://github.com/use-scroll-animate/use-scroll-animate
12
+ */
13
+ const d=u();e.EASING_MAP=o,e.PRESETS=t,e.createReactHooks=function(e){return{useScrollAnimate:function(t={}){const o=e.useRef(null);return e.useEffect(()=>{const e=o.current;if(!e)return;const{animation:n="fade-in-up",duration:s=600,delay:l=0,easing:i="ease",threshold:f=.1,rootMargin:c="0px",repeat:u=!1,parallax:d={},onStart:m,onComplete:p,onEnter:g,onLeave:y,onProgress:h}=t,v=a(n),b=r(i);let x=!1;e.style.opacity="0";const E=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){if(null==g||g(e),!x||u){const t=[v.from,v.to],a=e.animate(t,{duration:s,delay:l,easing:b,fill:"both"});null==m||m(e),a.onfinish=()=>null==p?void 0:p(e),x=!0,u||Object.keys(d).length||h||E.unobserve(e)}}else null==y||y(e),u&&x&&(e.style.opacity="0",x=!1)})},{threshold:"number"==typeof f?f:f[0],rootMargin:c});let O=null;if(Object.keys(d).length>0||h){const t=[];for(let e=0;e<=100;e++)t.push(e/100);O=new IntersectionObserver(t=>{t.forEach(t=>{const a=t.intersectionRatio;if(null==h||h(e,a),Object.keys(d).length>0){const{x:t=0,y:o=0,rotate:r=0,scale:n=1,speed:s=1}=d,l=2*(a-.5)*s;let i="";t&&(i+=` translateX(${"number"==typeof t?t*l+"px":"calc("+t+" * "+l+")"})`),o&&(i+=` translateY(${"number"==typeof o?o*l+"px":"calc("+o+" * "+l+")"})`),r&&(i+=` rotate(${r*l}deg)`),1!==n&&(i+=` scale(${1+(n-1)*l})`),e.style.transform=i}})},{threshold:t,rootMargin:c}),O.observe(e)}return E.observe(e),()=>{E.disconnect(),null==O||O.disconnect()}},[]),o},useScrollStagger:function(t={}){const o=e.useRef(null);return e.useEffect(()=>{const e=o.current;if(!e)return;const{animation:n="fade-in-up",duration:s=600,delay:l=0,easing:i="ease",threshold:f=.1,rootMargin:c="0px",stagger:u=80}=t,d=Array.from(e.children),m=a(n),p=r(i);d.forEach(e=>{e.style.opacity="0"});let g=!1;const y=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&!g&&(g=!0,d.forEach((e,t)=>{e.animate([m.from,m.to],{duration:s,delay:l+t*u,easing:p,fill:"both"})}),y.unobserve(e))})},{threshold:"number"==typeof f?f:f[0],rootMargin:c});return y.observe(e),()=>y.disconnect()},[]),o}}},e.createScrollAnimate=u,e.createVueComposables=function(e){return{useScrollAnimate:function(t={}){const o=e.ref(null);let n=null,s=null;return e.onMounted(()=>{const e=o.value;if(!e)return;const{animation:l="fade-in-up",duration:i=600,delay:f=0,easing:c="ease",threshold:u=.1,rootMargin:d="0px",repeat:m=!1,parallax:p={},onStart:g,onComplete:y,onEnter:h,onLeave:v,onProgress:b}=t,x=a(l),E=r(c);let O=!1;if(e.style.opacity="0",n=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){if(null==h||h(e),!O||m){const t=e.animate([x.from,x.to],{duration:i,delay:f,easing:E,fill:"both"});null==g||g(e),t.onfinish=()=>null==y?void 0:y(e),O=!0,m||Object.keys(p).length||b||null==n||n.unobserve(e)}}else null==v||v(e),m&&O&&(e.style.opacity="0",O=!1)})},{threshold:"number"==typeof u?u:u[0],rootMargin:d}),Object.keys(p).length>0||b){const t=[];for(let e=0;e<=100;e++)t.push(e/100);s=new IntersectionObserver(t=>{t.forEach(t=>{const a=t.intersectionRatio;if(null==b||b(e,a),Object.keys(p).length>0){const{x:t=0,y:o=0,rotate:r=0,scale:n=1,speed:s=1}=p,l=2*(a-.5)*s;let i="";t&&(i+=` translateX(${"number"==typeof t?t*l+"px":"calc("+t+" * "+l+")"})`),o&&(i+=` translateY(${"number"==typeof o?o*l+"px":"calc("+o+" * "+l+")"})`),r&&(i+=` rotate(${r*l}deg)`),1!==n&&(i+=` scale(${1+(n-1)*l})`),e.style.transform=i}})},{threshold:t,rootMargin:d}),s.observe(e)}n.observe(e)}),e.onUnmounted(()=>{null==n||n.disconnect(),null==s||s.disconnect()}),{animateRef:o}}}},e.default=d,e.resolveEasing=r,e.resolvePreset=a,Object.defineProperty(e,"__esModule",{value:!0})});
14
+ //# sourceMappingURL=index.umd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../src/presets.ts","../src/core.ts","../src/index.ts","../src/react.ts","../src/vue.ts"],"sourcesContent":["/**\n * use-scroll-animate - Animation Presets\n * Defines keyframes for all built-in animation presets\n */\n\nimport type { AnimationPreset, CustomAnimation } from './types';\n\ntype KeyframeMap = {\n from: Record<string, string | number>;\n to: Record<string, string | number>;\n};\n\nexport const PRESETS: Record<AnimationPreset, KeyframeMap> = {\n 'fade-in': {\n from: { opacity: 0 },\n to: { opacity: 1 },\n },\n 'fade-in-up': {\n from: { opacity: 0, transform: 'translateY(40px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n 'fade-in-down': {\n from: { opacity: 0, transform: 'translateY(-40px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n 'fade-in-left': {\n from: { opacity: 0, transform: 'translateX(-40px)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n },\n 'fade-in-right': {\n from: { opacity: 0, transform: 'translateX(40px)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n },\n 'zoom-in': {\n from: { opacity: 0, transform: 'scale(0.8)' },\n to: { opacity: 1, transform: 'scale(1)' },\n },\n 'zoom-out': {\n from: { opacity: 0, transform: 'scale(1.2)' },\n to: { opacity: 1, transform: 'scale(1)' },\n },\n 'flip-x': {\n from: { opacity: 0, transform: 'rotateX(-90deg)' },\n to: { opacity: 1, transform: 'rotateX(0)' },\n },\n 'flip-y': {\n from: { opacity: 0, transform: 'rotateY(-90deg)' },\n to: { opacity: 1, transform: 'rotateY(0)' },\n },\n 'slide-up': {\n from: { transform: 'translateY(100%)' },\n to: { transform: 'translateY(0)' },\n },\n 'slide-down': {\n from: { transform: 'translateY(-100%)' },\n to: { transform: 'translateY(0)' },\n },\n 'slide-left': {\n from: { transform: 'translateX(-100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'slide-right': {\n from: { transform: 'translateX(100%)' },\n to: { transform: 'translateX(0)' },\n },\n 'bounce': {\n from: { opacity: 0, transform: 'translateY(-60px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n 'rotate-in': {\n from: { opacity: 0, transform: 'rotate(-180deg) scale(0.5)' },\n to: { opacity: 1, transform: 'rotate(0deg) scale(1)' },\n },\n 'blur-in': {\n from: { opacity: 0, filter: 'blur(12px)' },\n to: { opacity: 1, filter: 'blur(0px)' },\n },\n 'skew-in': {\n from: { opacity: 0, transform: 'skewX(20deg) translateX(30px)' },\n to: { opacity: 1, transform: 'skewX(0deg) translateX(0)' },\n },\n 'scale-x': {\n from: { transform: 'scaleX(0)' },\n to: { transform: 'scaleX(1)' },\n },\n 'scale-y': {\n from: { transform: 'scaleY(0)' },\n to: { transform: 'scaleY(1)' },\n },\n 'shimmer': {\n from: { opacity: 0.5, filter: 'brightness(1)' },\n to: { opacity: 1, filter: 'brightness(1.5)' },\n },\n 'pulse': {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.05)' },\n },\n 'swing': {\n from: { transform: 'rotate(-10deg)' },\n to: { transform: 'rotate(10deg)' },\n },\n};\n\nexport function resolvePreset(animation: AnimationPreset | AnimationPreset[] | CustomAnimation): KeyframeMap {\n if (typeof animation === 'string') {\n return PRESETS[animation] ?? PRESETS['fade-in-up'];\n }\n \n if (Array.isArray(animation)) {\n const combined: KeyframeMap = { from: {}, to: {} };\n animation.forEach(name => {\n const preset = PRESETS[name];\n if (preset) {\n Object.entries(preset.from).forEach(([key, val]) => {\n if (key === 'transform' && combined.from[key]) {\n combined.from[key] = `${combined.from[key]} ${val}`;\n } else {\n combined.from[key] = val;\n }\n });\n Object.entries(preset.to).forEach(([key, val]) => {\n if (key === 'transform' && combined.to[key]) {\n combined.to[key] = `${combined.to[key]} ${val}`;\n } else {\n combined.to[key] = val;\n }\n });\n }\n });\n return combined;\n }\n \n return animation;\n}\n\n/** Easing to CSS cubic-bezier mapping */\nexport const EASING_MAP: Record<string, string> = {\n linear: 'linear',\n ease: 'ease',\n 'ease-in': 'ease-in',\n 'ease-out': 'ease-out',\n 'ease-in-out': 'ease-in-out',\n spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)',\n};\n\nexport function resolveEasing(easing: string): string {\n return EASING_MAP[easing] ?? easing;\n}\n","/**\n * use-scroll-animate - Core Implementation\n * Uses IntersectionObserver + Web Animations API for zero-dependency,\n * high-performance scroll-triggered animations.\n */\n\nimport type {\n AnimateOptions,\n AnimatedElement,\n ScrollAnimateConfig,\n ScrollAnimateInstance,\n ParallaxOptions,\n} from './types';\nimport { resolvePreset, resolveEasing } from './presets';\n\nconst DEFAULT_CONFIG: Required<ScrollAnimateConfig> = {\n defaultAnimation: 'fade-in-up',\n defaultDuration: 600,\n defaultDelay: 0,\n defaultEasing: 'ease',\n defaultThreshold: 0.1,\n defaultRootMargin: '0px',\n defaultRepeat: false,\n defaultOnce: true,\n defaultOffset: 0,\n hiddenClass: 'sa-hidden',\n visibleClass: 'sa-visible',\n useClassNames: false,\n disabled: false,\n root: null,\n};\n\nconst DEFAULT_OPTIONS: Required<AnimateOptions> = {\n animation: 'fade-in-up',\n duration: 600,\n delay: 0,\n easing: 'ease',\n threshold: 0.1,\n rootMargin: '0px',\n repeat: false,\n once: true,\n offset: 0,\n stagger: 0,\n parallax: {},\n onStart: () => undefined,\n onComplete: () => undefined,\n onEnter: () => undefined,\n onLeave: () => undefined,\n onProgress: () => undefined,\n};\n\nfunction parseDataAttributes(el: Element, config: Required<ScrollAnimateConfig>): Required<AnimateOptions> {\n const dataset = (el as HTMLElement).dataset;\n const opts: AnimateOptions = {};\n\n if (dataset.saAnimation) {\n const anim = dataset.saAnimation;\n opts.animation = anim.includes(',') \n ? anim.split(',').map(s => s.trim()) as any \n : anim as any;\n }\n if (dataset.saDuration) opts.duration = parseInt(dataset.saDuration, 10);\n if (dataset.saDelay) opts.delay = parseInt(dataset.saDelay, 10);\n if (dataset.saEasing) opts.easing = dataset.saEasing;\n if (dataset.saThreshold) {\n const t = dataset.saThreshold;\n opts.threshold = t.includes(',') ? t.split(',').map(parseFloat) : parseFloat(t);\n }\n if (dataset.saRootMargin) opts.rootMargin = dataset.saRootMargin;\n if (dataset.saRepeat !== undefined) opts.repeat = dataset.saRepeat !== 'false';\n if (dataset.saOnce !== undefined) opts.once = dataset.saOnce !== 'false';\n if (dataset.saOffset) opts.offset = parseInt(dataset.saOffset, 10);\n if (dataset.saStagger) opts.stagger = parseInt(dataset.saStagger, 10);\n \n if (dataset.saParallaxX || dataset.saParallaxY || dataset.saParallaxRotate || dataset.saParallaxScale) {\n opts.parallax = {\n x: dataset.saParallaxX,\n y: dataset.saParallaxY,\n rotate: dataset.saParallaxRotate ? parseFloat(dataset.saParallaxRotate) : undefined,\n scale: dataset.saParallaxScale ? parseFloat(dataset.saParallaxScale) : undefined,\n speed: dataset.saParallaxSpeed ? parseFloat(dataset.saParallaxSpeed) : 1,\n };\n }\n\n return mergeOptions(opts, config);\n}\n\nfunction mergeOptions(\n opts: AnimateOptions,\n config: Required<ScrollAnimateConfig>\n): Required<AnimateOptions> {\n const repeat = opts.repeat ?? config.defaultRepeat;\n return {\n animation: opts.animation ?? config.defaultAnimation,\n duration: opts.duration ?? config.defaultDuration,\n delay: opts.delay ?? config.defaultDelay,\n easing: opts.easing ?? config.defaultEasing,\n threshold: opts.threshold ?? config.defaultThreshold,\n rootMargin: opts.rootMargin ?? config.defaultRootMargin,\n repeat: repeat,\n once: opts.once ?? (repeat ? false : config.defaultOnce),\n offset: opts.offset ?? config.defaultOffset,\n stagger: opts.stagger ?? DEFAULT_OPTIONS.stagger,\n parallax: opts.parallax ?? DEFAULT_OPTIONS.parallax,\n onStart: opts.onStart ?? DEFAULT_OPTIONS.onStart,\n onComplete: opts.onComplete ?? DEFAULT_OPTIONS.onComplete,\n onEnter: opts.onEnter ?? DEFAULT_OPTIONS.onEnter,\n onLeave: opts.onLeave ?? DEFAULT_OPTIONS.onLeave,\n onProgress: opts.onProgress ?? DEFAULT_OPTIONS.onProgress,\n };\n}\n\nfunction resolveTargets(target: string | Element | NodeList | Element[]): Element[] {\n if (typeof target === 'string') {\n return Array.from(document.querySelectorAll(target));\n }\n if (target instanceof Element) {\n return [target];\n }\n if (target instanceof NodeList) {\n return Array.from(target) as Element[];\n }\n if (Array.isArray(target)) {\n return target;\n }\n return [];\n}\n\nfunction prefersReducedMotion(): boolean {\n return window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;\n}\n\nfunction runAnimation(\n el: Element,\n opts: Required<AnimateOptions>,\n config: Required<ScrollAnimateConfig>,\n staggerIndex = 0\n): void {\n const { animation, duration, delay, easing, stagger, onStart, onComplete } = opts;\n const totalDelay = delay + staggerIndex * stagger;\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n\n if (config.useClassNames) {\n if (totalDelay > 0) {\n (el as HTMLElement).style.animationDelay = `${totalDelay}ms`;\n }\n el.classList.remove(config.hiddenClass);\n el.classList.add(config.visibleClass);\n onStart(el);\n setTimeout(() => onComplete(el), duration + totalDelay);\n return;\n }\n\n const keyframes: Keyframe[] = [\n preset.from as Keyframe,\n preset.to as Keyframe,\n ];\n\n const timing: KeyframeAnimationOptions = {\n duration,\n delay: totalDelay,\n easing: easingValue,\n fill: 'both',\n };\n\n // Check if Web Animations API is supported\n if (typeof el.animate === 'function') {\n const anim = el.animate(keyframes, timing);\n onStart(el);\n anim.onfinish = () => onComplete(el);\n } else {\n // Fallback for older browsers\n (el as HTMLElement).style.opacity = '1';\n (el as HTMLElement).style.transform = 'none';\n onStart(el);\n onComplete(el);\n }\n}\n\nfunction applyParallax(el: Element, progress: number, parallax: ParallaxOptions): void {\n const { x = 0, y = 0, rotate = 0, scale = 1, speed = 1 } = parallax;\n const p = (progress - 0.5) * 2 * speed;\n \n let transform = '';\n if (x) transform += ` translateX(${typeof x === 'number' ? x * p + 'px' : 'calc(' + x + ' * ' + p + ')'})`;\n if (y) transform += ` translateY(${typeof y === 'number' ? y * p + 'px' : 'calc(' + y + ' * ' + p + ')'})`;\n if (rotate) transform += ` rotate(${rotate * p}deg)`;\n if (scale !== 1) transform += ` scale(${1 + (scale - 1) * p})`;\n \n (el as HTMLElement).style.transform = transform;\n}\n\nfunction hideElement(el: Element, config: Required<ScrollAnimateConfig>): void {\n if (config.useClassNames) {\n el.classList.add(config.hiddenClass);\n el.classList.remove(config.visibleClass);\n } else {\n (el as HTMLElement).style.opacity = '0';\n }\n}\n\nexport function createScrollAnimate(userConfig: ScrollAnimateConfig = {}): ScrollAnimateInstance {\n let config: Required<ScrollAnimateConfig> = { ...DEFAULT_CONFIG, ...userConfig };\n const registry = new Map<Element, AnimatedElement>();\n\n function createObserver(opts: Required<AnimateOptions>): IntersectionObserver {\n // Handle offset by adjusting rootMargin\n const rootMargin = opts.offset !== 0 \n ? `${opts.rootMargin.split(' ')[0]} 0px -${opts.offset}px 0px`\n : opts.rootMargin;\n\n return new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const record = registry.get(entry.target);\n if (!record) return;\n\n if (entry.isIntersecting) {\n opts.onEnter(entry.target);\n\n if (!record.animated || opts.repeat) {\n const parent = entry.target.parentElement;\n let staggerIndex = 0;\n if (parent && opts.stagger > 0) {\n // BUG FIX: Use a more robust way to find index among siblings that are also observed\n const siblings = Array.from(parent.children).filter((c) => registry.has(c));\n staggerIndex = siblings.indexOf(entry.target);\n }\n\n if (!config.disabled && !prefersReducedMotion()) {\n runAnimation(entry.target, opts, config, staggerIndex);\n } else {\n (entry.target as HTMLElement).style.opacity = '1';\n (entry.target as HTMLElement).style.transform = '';\n }\n\n record.animated = true;\n \n // Handle 'once' functionality\n if (opts.once) {\n record.observer.unobserve(entry.target);\n record.progressObserver?.unobserve(entry.target);\n // We don't delete from registry yet to allow other potential interactions\n }\n }\n } else {\n opts.onLeave(entry.target);\n if (opts.repeat && record.animated) {\n hideElement(entry.target, config);\n record.animated = false;\n }\n }\n });\n },\n {\n threshold: typeof opts.threshold === 'number' ? opts.threshold : opts.threshold[0],\n rootMargin: rootMargin,\n root: config.root,\n }\n );\n }\n\n function createProgressObserver(el: Element, opts: Required<AnimateOptions>): IntersectionObserver {\n const thresholds = [];\n for (let i = 0; i <= 100; i++) thresholds.push(i / 100);\n\n return new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const progress = entry.intersectionRatio;\n opts.onProgress(el, progress);\n \n if (Object.keys(opts.parallax).length > 0) {\n applyParallax(el, progress, opts.parallax);\n }\n });\n },\n {\n threshold: thresholds,\n rootMargin: opts.rootMargin,\n root: config.root,\n }\n );\n }\n\n function observeElement(el: Element, opts: Required<AnimateOptions>): void {\n if (registry.has(el)) return;\n\n if (!config.useClassNames) {\n hideElement(el, config);\n }\n\n const observer = createObserver(opts);\n observer.observe(el);\n\n let progressObserver;\n if (Object.keys(opts.parallax).length > 0 || opts.onProgress !== DEFAULT_OPTIONS.onProgress) {\n progressObserver = createProgressObserver(el, opts);\n progressObserver.observe(el);\n }\n\n registry.set(el, { \n element: el, \n options: opts, \n observer, \n animated: false,\n progressObserver \n });\n }\n\n const instance: ScrollAnimateInstance = {\n observe(target, options = {}) {\n const elements = resolveTargets(target);\n const opts = mergeOptions(options, config);\n elements.forEach((el) => observeElement(el, opts));\n },\n\n unobserve(target) {\n const elements = resolveTargets(target);\n elements.forEach((el) => {\n const record = registry.get(el);\n if (record) {\n record.observer.disconnect(); // BUG FIX: Use disconnect for better cleanup\n record.progressObserver?.disconnect();\n registry.delete(el);\n }\n });\n },\n\n init(rootElement = document) {\n const elements = rootElement.querySelectorAll('[data-sa]');\n elements.forEach((el) => {\n const opts = parseDataAttributes(el, config);\n observeElement(el, opts);\n });\n },\n\n destroy() {\n registry.forEach((record) => {\n record.observer.disconnect();\n record.progressObserver?.disconnect();\n });\n registry.clear();\n },\n\n refresh() {\n const entries = Array.from(registry.entries());\n instance.destroy();\n entries.forEach(([el, record]) => {\n observeElement(el, record.options);\n });\n },\n\n animate(target, options = {}) {\n const elements = resolveTargets(target);\n const opts = mergeOptions(options, config);\n elements.forEach((el) => {\n runAnimation(el, opts, config, 0);\n });\n },\n\n getObservedElements() {\n return Array.from(registry.values());\n },\n\n configure(newConfig) {\n config = { ...config, ...newConfig };\n },\n };\n\n return instance;\n}\n","/**\n * use-scroll-animate\n *\n * A lightweight (~4KB gzipped), dependency-free scroll animation library\n * for modern web applications. Built with TypeScript, powered by\n * IntersectionObserver and the Web Animations API.\n *\n * @version 1.0.0\n * @license MIT\n * @see https://github.com/use-scroll-animate/use-scroll-animate\n */\n\nexport { createScrollAnimate } from './core';\nexport { PRESETS, resolvePreset, resolveEasing, EASING_MAP } from './presets';\nexport { createReactHooks } from './react';\nexport { createVueComposables } from './vue';\n\nexport type {\n AnimationPreset,\n EasingType,\n AnimationKeyframe,\n CustomAnimation,\n AnimateOptions,\n ScrollAnimateConfig,\n AnimatedElement,\n ScrollAnimateInstance,\n} from './types';\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 = createScrollAnimate();\nexport default ScrollAnimate;\n","/**\n * use-scroll-animate - React Integration\n * Provides useScrollAnimate and useScrollRef hooks for React applications.\n */\n\nimport type { AnimateOptions } from './types';\nimport { resolvePreset, resolveEasing } from './presets';\n\ntype ReactRef<T> = { current: T | null };\n\nexport function createReactHooks(React: {\n useRef: <T>(initial: T | null) => ReactRef<T>;\n useEffect: (effect: () => (() => void) | void, deps?: unknown[]) => void;\n}) {\n function useScrollAnimate(options: AnimateOptions = {}) {\n const ref = React.useRef<Element>(null);\n\n React.useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const {\n animation = 'fade-in-up',\n duration = 600,\n delay = 0,\n easing = 'ease',\n threshold = 0.1,\n rootMargin = '0px',\n repeat = false,\n parallax = {},\n onStart,\n onComplete,\n onEnter,\n onLeave,\n onProgress,\n } = options;\n\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n let animated = false;\n\n (el as HTMLElement).style.opacity = '0';\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n onEnter?.(el);\n if (!animated || repeat) {\n const keyframes: Keyframe[] = [\n preset.from as Keyframe,\n preset.to as Keyframe,\n ];\n const anim = el.animate(keyframes, {\n duration,\n delay,\n easing: easingValue,\n fill: 'both',\n });\n onStart?.(el);\n anim.onfinish = () => onComplete?.(el);\n animated = true;\n if (!repeat && !Object.keys(parallax).length && !onProgress) {\n observer.unobserve(el);\n }\n }\n } else {\n onLeave?.(el);\n if (repeat && animated) {\n (el as HTMLElement).style.opacity = '0';\n animated = false;\n }\n }\n });\n },\n { threshold: typeof threshold === 'number' ? threshold : threshold[0], rootMargin }\n );\n\n let progressObserver: IntersectionObserver | null = null;\n if (Object.keys(parallax).length > 0 || onProgress) {\n const thresholds = [];\n for (let i = 0; i <= 100; i++) thresholds.push(i / 100);\n \n progressObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const progress = entry.intersectionRatio;\n onProgress?.(el, progress);\n \n if (Object.keys(parallax).length > 0) {\n const { x = 0, y = 0, rotate = 0, scale = 1, speed = 1 } = parallax;\n const p = (progress - 0.5) * 2 * speed;\n let transform = '';\n if (x) transform += ` translateX(${typeof x === 'number' ? x * p + 'px' : 'calc(' + x + ' * ' + p + ')'})`;\n if (y) transform += ` translateY(${typeof y === 'number' ? y * p + 'px' : 'calc(' + y + ' * ' + p + ')'})`;\n if (rotate) transform += ` rotate(${rotate * p}deg)`;\n if (scale !== 1) transform += ` scale(${1 + (scale - 1) * p})`;\n (el as HTMLElement).style.transform = transform;\n }\n });\n },\n { threshold: thresholds, rootMargin }\n );\n progressObserver.observe(el);\n }\n\n observer.observe(el);\n return () => {\n observer.disconnect();\n progressObserver?.disconnect();\n };\n }, []);\n\n return ref;\n }\n\n function useScrollStagger(options: AnimateOptions & { stagger?: number } = {}) {\n const ref = React.useRef<Element>(null);\n\n React.useEffect(() => {\n const container = ref.current;\n if (!container) return;\n\n const {\n animation = 'fade-in-up',\n duration = 600,\n delay = 0,\n easing = 'ease',\n threshold = 0.1,\n rootMargin = '0px',\n stagger = 80,\n } = options;\n\n const children = Array.from(container.children) as HTMLElement[];\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n\n children.forEach((child) => {\n child.style.opacity = '0';\n });\n\n let animated = false;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !animated) {\n animated = true;\n children.forEach((child, i) => {\n child.animate(\n [preset.from as Keyframe, preset.to as Keyframe],\n {\n duration,\n delay: delay + i * stagger,\n easing: easingValue,\n fill: 'both',\n }\n );\n });\n observer.unobserve(container);\n }\n });\n },\n { threshold: typeof threshold === 'number' ? threshold : threshold[0], rootMargin }\n );\n\n observer.observe(container);\n return () => observer.disconnect();\n }, []);\n\n return ref;\n }\n\n return { useScrollAnimate, useScrollStagger };\n}\n","/**\n * use-scroll-animate - Vue 3 Integration\n * Provides useScrollAnimate composable for Vue 3 applications.\n */\n\nimport type { AnimateOptions } from './types';\nimport { resolvePreset, resolveEasing } from './presets';\n\nexport function createVueComposables(Vue: {\n ref: <T>(value: T | null) => { value: T | null };\n onMounted: (fn: () => void) => void;\n onUnmounted: (fn: () => void) => void;\n}) {\n function useScrollAnimate(options: AnimateOptions = {}) {\n const animateRef = Vue.ref<Element>(null);\n let observer: IntersectionObserver | null = null;\n let progressObserver: IntersectionObserver | null = null;\n\n Vue.onMounted(() => {\n const el = animateRef.value;\n if (!el) return;\n\n const {\n animation = 'fade-in-up',\n duration = 600,\n delay = 0,\n easing = 'ease',\n threshold = 0.1,\n rootMargin = '0px',\n repeat = false,\n parallax = {},\n onStart,\n onComplete,\n onEnter,\n onLeave,\n onProgress,\n } = options;\n\n const preset = resolvePreset(animation);\n const easingValue = resolveEasing(easing);\n let animated = false;\n\n (el as HTMLElement).style.opacity = '0';\n\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n onEnter?.(el);\n if (!animated || repeat) {\n const anim = el.animate(\n [preset.from as Keyframe, preset.to as Keyframe],\n {\n duration,\n delay,\n easing: easingValue,\n fill: 'both',\n }\n );\n onStart?.(el);\n anim.onfinish = () => onComplete?.(el);\n animated = true;\n if (!repeat && !Object.keys(parallax).length && !onProgress) {\n observer?.unobserve(el);\n }\n }\n } else {\n onLeave?.(el);\n if (repeat && animated) {\n (el as HTMLElement).style.opacity = '0';\n animated = false;\n }\n }\n });\n },\n { threshold: typeof threshold === 'number' ? threshold : threshold[0], rootMargin }\n );\n\n if (Object.keys(parallax).length > 0 || onProgress) {\n const thresholds = [];\n for (let i = 0; i <= 100; i++) thresholds.push(i / 100);\n \n progressObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const progress = entry.intersectionRatio;\n onProgress?.(el, progress);\n \n if (Object.keys(parallax).length > 0) {\n const { x = 0, y = 0, rotate = 0, scale = 1, speed = 1 } = parallax;\n const p = (progress - 0.5) * 2 * speed;\n let transform = '';\n if (x) transform += ` translateX(${typeof x === 'number' ? x * p + 'px' : 'calc(' + x + ' * ' + p + ')'})`;\n if (y) transform += ` translateY(${typeof y === 'number' ? y * p + 'px' : 'calc(' + y + ' * ' + p + ')'})`;\n if (rotate) transform += ` rotate(${rotate * p}deg)`;\n if (scale !== 1) transform += ` scale(${1 + (scale - 1) * p})`;\n (el as HTMLElement).style.transform = transform;\n }\n });\n },\n { threshold: thresholds, rootMargin }\n );\n progressObserver.observe(el);\n }\n\n observer.observe(el);\n });\n\n Vue.onUnmounted(() => {\n observer?.disconnect();\n progressObserver?.disconnect();\n });\n\n return { animateRef };\n }\n\n return { useScrollAnimate };\n}\n"],"names":["PRESETS","from","opacity","to","transform","bounce","filter","shimmer","pulse","swing","resolvePreset","animation","_a","Array","isArray","combined","forEach","name","preset","Object","entries","key","val","EASING_MAP","linear","ease","spring","resolveEasing","easing","DEFAULT_CONFIG","defaultAnimation","defaultDuration","defaultDelay","defaultEasing","defaultThreshold","defaultRootMargin","defaultRepeat","defaultOnce","defaultOffset","hiddenClass","visibleClass","useClassNames","disabled","root","DEFAULT_OPTIONS","stagger","parallax","onStart","onComplete","onEnter","onLeave","onProgress","mergeOptions","opts","config","repeat","_b","duration","_c","delay","_d","_e","threshold","_f","rootMargin","_g","once","_h","offset","_j","_k","_l","_m","_o","_p","_q","_r","resolveTargets","target","document","querySelectorAll","Element","NodeList","runAnimation","el","staggerIndex","totalDelay","easingValue","style","animationDelay","classList","remove","add","setTimeout","keyframes","timing","fill","animate","anim","onfinish","hideElement","createScrollAnimate","userConfig","registry","Map","createObserver","split","IntersectionObserver","entry","record","get","isIntersecting","animated","parent","parentElement","children","c","has","indexOf","window","matchMedia","call","matches","prefersReducedMotion","observer","unobserve","progressObserver","observeElement","observe","keys","length","thresholds","i","push","progress","intersectionRatio","x","y","rotate","scale","speed","p","applyParallax","createProgressObserver","set","element","options","instance","elements","disconnect","delete","init","rootElement","dataset","saAnimation","includes","map","s","trim","saDuration","parseInt","saDelay","saEasing","saThreshold","t","parseFloat","saRootMargin","undefined","saRepeat","saOnce","saOffset","saStagger","saParallaxX","saParallaxY","saParallaxRotate","saParallaxScale","saParallaxSpeed","parseDataAttributes","destroy","clear","refresh","getObservedElements","values","configure","newConfig","ScrollAnimate","React","useScrollAnimate","ref","useRef","useEffect","current","useScrollStagger","container","child","Vue","animateRef","onMounted","value","onUnmounted"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * use-scroll-animate - Core Implementation
3
+ * Uses IntersectionObserver + Web Animations API for zero-dependency,
4
+ * high-performance scroll-triggered animations.
5
+ */
6
+ import type { ScrollAnimateConfig, ScrollAnimateInstance } from './types';
7
+ export declare function createScrollAnimate(userConfig?: ScrollAnimateConfig): ScrollAnimateInstance;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * use-scroll-animate
3
+ *
4
+ * A lightweight (~4KB gzipped), dependency-free scroll animation library
5
+ * for modern web applications. Built with TypeScript, powered by
6
+ * IntersectionObserver and the Web Animations API.
7
+ *
8
+ * @version 1.0.0
9
+ * @license MIT
10
+ * @see https://github.com/use-scroll-animate/use-scroll-animate
11
+ */
12
+ export { createScrollAnimate } from './core';
13
+ export { PRESETS, resolvePreset, resolveEasing, EASING_MAP } from './presets';
14
+ export { createReactHooks } from './react';
15
+ export { createVueComposables } from './vue';
16
+ export type { AnimationPreset, EasingType, AnimationKeyframe, CustomAnimation, AnimateOptions, ScrollAnimateConfig, AnimatedElement, ScrollAnimateInstance, } from './types';
17
+ /**
18
+ * Default singleton instance of ScrollAnimate.
19
+ * Ready to use out of the box with sensible defaults.
20
+ *
21
+ * @example
22
+ * ```js
23
+ * import ScrollAnimate from 'use-scroll-animate';
24
+ *
25
+ * // Auto-initialize all elements with data-sa attribute
26
+ * ScrollAnimate.init();
27
+ *
28
+ * // Or manually observe elements
29
+ * ScrollAnimate.observe('.my-element', { animation: 'fade-in-up' });
30
+ * ```
31
+ */
32
+ declare const ScrollAnimate: import("./types").ScrollAnimateInstance;
33
+ export default ScrollAnimate;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * use-scroll-animate - Animation Presets
3
+ * Defines keyframes for all built-in animation presets
4
+ */
5
+ import type { AnimationPreset, CustomAnimation } from './types';
6
+ type KeyframeMap = {
7
+ from: Record<string, string | number>;
8
+ to: Record<string, string | number>;
9
+ };
10
+ export declare const PRESETS: Record<AnimationPreset, KeyframeMap>;
11
+ export declare function resolvePreset(animation: AnimationPreset | AnimationPreset[] | CustomAnimation): KeyframeMap;
12
+ /** Easing to CSS cubic-bezier mapping */
13
+ export declare const EASING_MAP: Record<string, string>;
14
+ export declare function resolveEasing(easing: string): string;
15
+ export {};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * use-scroll-animate - React Integration
3
+ * Provides useScrollAnimate and useScrollRef hooks for React applications.
4
+ */
5
+ import type { AnimateOptions } from './types';
6
+ type ReactRef<T> = {
7
+ current: T | null;
8
+ };
9
+ export declare function createReactHooks(React: {
10
+ useRef: <T>(initial: T | null) => ReactRef<T>;
11
+ useEffect: (effect: () => (() => void) | void, deps?: unknown[]) => void;
12
+ }): {
13
+ useScrollAnimate: (options?: AnimateOptions) => ReactRef<Element>;
14
+ useScrollStagger: (options?: AnimateOptions & {
15
+ stagger?: number;
16
+ }) => ReactRef<Element>;
17
+ };
18
+ export {};
@@ -0,0 +1,123 @@
1
+ /**
2
+ * use-scroll-animate - Core Type Definitions
3
+ * A lightweight, high-performance scroll animation library
4
+ */
5
+ /** Built-in animation presets */
6
+ export type AnimationPreset = 'fade-in' | 'fade-in-up' | 'fade-in-down' | 'fade-in-left' | 'fade-in-right' | 'zoom-in' | 'zoom-out' | 'flip-x' | 'flip-y' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right' | 'bounce' | 'rotate-in' | 'blur-in' | 'skew-in' | 'scale-x' | 'scale-y' | 'shimmer' | 'pulse' | 'swing';
7
+ /** Easing function types */
8
+ export type EasingType = 'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'spring' | string;
9
+ /** Keyframe definition for custom animations */
10
+ export interface AnimationKeyframe {
11
+ [property: string]: string | number;
12
+ }
13
+ /** Custom animation definition */
14
+ export interface CustomAnimation {
15
+ from: AnimationKeyframe;
16
+ to: AnimationKeyframe;
17
+ }
18
+ /** Parallax configuration */
19
+ export interface ParallaxOptions {
20
+ /** Movement on X axis (e.g., '100px', '20%') */
21
+ x?: string | number;
22
+ /** Movement on Y axis (e.g., '100px', '20%') */
23
+ y?: string | number;
24
+ /** Rotation in degrees */
25
+ rotate?: number;
26
+ /** Scale factor */
27
+ scale?: number;
28
+ /** Speed multiplier (default: 1) */
29
+ speed?: number;
30
+ }
31
+ /** Per-element animation options */
32
+ export interface AnimateOptions {
33
+ /** Animation preset name, array of presets, or custom animation object */
34
+ animation?: AnimationPreset | AnimationPreset[] | CustomAnimation;
35
+ /** Duration in milliseconds (default: 600) */
36
+ duration?: number;
37
+ /** Delay in milliseconds (default: 0) */
38
+ delay?: number;
39
+ /** Easing function (default: 'ease') */
40
+ easing?: EasingType;
41
+ /** Intersection threshold 0-1 (default: 0.1) */
42
+ threshold?: number | number[];
43
+ /** Root margin for IntersectionObserver (default: '0px') */
44
+ rootMargin?: string;
45
+ /** Whether to replay animation each time element enters viewport (default: false) */
46
+ repeat?: boolean;
47
+ /** Whether to trigger animation only once (default: true if repeat is false) */
48
+ once?: boolean;
49
+ /** Offset in pixels from the viewport edge to trigger animation (default: 0) */
50
+ offset?: number;
51
+ /** Stagger delay for child elements in ms (default: 0) */
52
+ stagger?: number;
53
+ /** Parallax effect configuration */
54
+ parallax?: ParallaxOptions;
55
+ /** Callback fired when animation starts */
56
+ onStart?: (element: Element) => void;
57
+ /** Callback fired when animation completes */
58
+ onComplete?: (element: Element) => void;
59
+ /** Callback fired when element enters viewport */
60
+ onEnter?: (element: Element) => void;
61
+ /** Callback fired when element leaves viewport */
62
+ onLeave?: (element: Element) => void;
63
+ /** Callback fired with scroll progress (0 to 1) */
64
+ onProgress?: (element: Element, progress: number) => void;
65
+ }
66
+ /** Global configuration for ScrollAnimate instance */
67
+ export interface ScrollAnimateConfig {
68
+ /** Default animation preset (default: 'fade-in-up') */
69
+ defaultAnimation?: AnimationPreset | AnimationPreset[] | CustomAnimation;
70
+ /** Default duration in ms (default: 600) */
71
+ defaultDuration?: number;
72
+ /** Default delay in ms (default: 0) */
73
+ defaultDelay?: number;
74
+ /** Default easing (default: 'ease') */
75
+ defaultEasing?: EasingType;
76
+ /** Default threshold (default: 0.1) */
77
+ defaultThreshold?: number | number[];
78
+ /** Default root margin (default: '0px') */
79
+ defaultRootMargin?: string;
80
+ /** Whether animations replay by default (default: false) */
81
+ defaultRepeat?: boolean;
82
+ /** Default once setting (default: true) */
83
+ defaultOnce?: boolean;
84
+ /** Default offset in pixels (default: 0) */
85
+ defaultOffset?: number;
86
+ /** CSS class added before animation (default: 'sa-hidden') */
87
+ hiddenClass?: string;
88
+ /** CSS class added when element is visible (default: 'sa-visible') */
89
+ visibleClass?: string;
90
+ /** Whether to use CSS class-based animation instead of Web Animations API */
91
+ useClassNames?: boolean;
92
+ /** Disable all animations (useful for reduced-motion preference) */
93
+ disabled?: boolean;
94
+ /** Custom IntersectionObserver root element */
95
+ root?: Element | null;
96
+ }
97
+ /** Registered element entry */
98
+ export interface AnimatedElement {
99
+ element: Element;
100
+ options: Required<AnimateOptions>;
101
+ observer: IntersectionObserver;
102
+ animated: boolean;
103
+ progressObserver?: IntersectionObserver;
104
+ }
105
+ /** ScrollAnimate public API */
106
+ export interface ScrollAnimateInstance {
107
+ /** Observe a single element or CSS selector */
108
+ observe(target: string | Element | NodeList | Element[], options?: AnimateOptions): void;
109
+ /** Stop observing a single element or CSS selector */
110
+ unobserve(target: string | Element | NodeList | Element[]): void;
111
+ /** Observe all elements matching the data-sa attribute */
112
+ init(rootElement?: Element | Document): void;
113
+ /** Destroy the instance and clean up all observers */
114
+ destroy(): void;
115
+ /** Refresh all observers (useful after DOM changes) */
116
+ refresh(): void;
117
+ /** Manually trigger animation on an element */
118
+ animate(target: string | Element, options?: AnimateOptions): void;
119
+ /** Get all currently observed elements */
120
+ getObservedElements(): AnimatedElement[];
121
+ /** Update global configuration */
122
+ configure(config: Partial<ScrollAnimateConfig>): void;
123
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * use-scroll-animate - Vue 3 Integration
3
+ * Provides useScrollAnimate composable for Vue 3 applications.
4
+ */
5
+ import type { AnimateOptions } from './types';
6
+ export declare function createVueComposables(Vue: {
7
+ ref: <T>(value: T | null) => {
8
+ value: T | null;
9
+ };
10
+ onMounted: (fn: () => void) => void;
11
+ onUnmounted: (fn: () => void) => void;
12
+ }): {
13
+ useScrollAnimate: (options?: AnimateOptions) => {
14
+ animateRef: {
15
+ value: Element | null;
16
+ };
17
+ };
18
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * use-scroll-animate — React Example
3
+ *
4
+ * This example demonstrates how to use the useScrollAnimate and useScrollStagger
5
+ * hooks in a React application.
6
+ */
7
+
8
+ import React from 'react';
9
+ import { createReactHooks } from 'use-scroll-animate';
10
+
11
+ const { useScrollAnimate, useScrollStagger } = createReactHooks(React);
12
+
13
+ const features = [
14
+ { title: 'Zero Dependencies', desc: 'No lodash, no jQuery, no bloat.' },
15
+ { title: 'TypeScript First', desc: 'Full type safety and IntelliSense.' },
16
+ { title: 'Framework Agnostic', desc: 'Works with React, Vue, Svelte, and more.' },
17
+ { title: 'Accessible', desc: 'Respects prefers-reduced-motion.' },
18
+ ];
19
+
20
+ export default function App() {
21
+ const heroTitleRef = useScrollAnimate({ animation: 'fade-in-down', duration: 1000 });
22
+ const heroSubRef = useScrollAnimate({ animation: 'fade-in-up', delay: 300 });
23
+ const featuresRef = useScrollStagger({ animation: 'fade-in-up', stagger: 120 });
24
+ const ctaRef = useScrollAnimate({ animation: 'zoom-in', easing: 'spring' });
25
+
26
+ return (
27
+ <main style={{ fontFamily: 'system-ui, sans-serif', background: '#0a0a0a', color: '#fff', minHeight: '100vh' }}>
28
+ {/* Hero Section */}
29
+ <section style={{ height: '100vh', display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', textAlign: 'center', padding: '2rem' }}>
30
+ <h1 ref={heroTitleRef} style={{ fontSize: 'clamp(2rem, 6vw, 5rem)', fontWeight: 800 }}>
31
+ use-scroll-animate
32
+ </h1>
33
+ <p ref={heroSubRef} style={{ fontSize: '1.2rem', color: '#aaa', marginTop: '1rem' }}>
34
+ Lightweight. Dependency-free. Blazing fast.
35
+ </p>
36
+ </section>
37
+
38
+ {/* Features Section */}
39
+ <section style={{ maxWidth: 900, margin: '0 auto', padding: '6rem 2rem' }}>
40
+ <ul ref={featuresRef} style={{ listStyle: 'none', padding: 0, display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: '1.5rem' }}>
41
+ {features.map((f) => (
42
+ <li key={f.title} style={{ background: '#1a1a1a', border: '1px solid #333', borderRadius: 12, padding: '1.5rem' }}>
43
+ <h3 style={{ marginBottom: '0.5rem' }}>{f.title}</h3>
44
+ <p style={{ color: '#aaa', lineHeight: 1.6 }}>{f.desc}</p>
45
+ </li>
46
+ ))}
47
+ </ul>
48
+ </section>
49
+
50
+ {/* CTA Section */}
51
+ <section style={{ textAlign: 'center', padding: '6rem 2rem' }}>
52
+ <div ref={ctaRef} style={{ display: 'inline-block', background: 'linear-gradient(135deg, #6366f1, #8b5cf6)', borderRadius: 16, padding: '3rem 4rem' }}>
53
+ <h2 style={{ fontSize: '2rem', marginBottom: '1rem' }}>Get Started Today</h2>
54
+ <code style={{ background: 'rgba(0,0,0,0.3)', padding: '0.5rem 1rem', borderRadius: 8, fontSize: '1rem' }}>
55
+ npm install use-scroll-animate
56
+ </code>
57
+ </div>
58
+ </section>
59
+ </main>
60
+ );
61
+ }