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.
- package/CHANGELOG.md +58 -0
- package/CONTRIBUTING.md +76 -0
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/README_ja.md +69 -0
- package/README_zh.md +69 -0
- package/dist/index.esm.js +697 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +708 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.js +14 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/types/core.d.ts +7 -0
- package/dist/types/index.d.ts +33 -0
- package/dist/types/presets.d.ts +15 -0
- package/dist/types/react.d.ts +18 -0
- package/dist/types/types.d.ts +123 -0
- package/dist/types/vue.d.ts +18 -0
- package/examples/react/App.tsx +61 -0
- package/examples/vanilla/index.html +201 -0
- package/package.json +35 -0
- package/rollup.config.js +41 -0
- package/src/core.ts +373 -0
- package/src/index.ts +48 -0
- package/src/presets.ts +148 -0
- package/src/react.ts +175 -0
- package/src/types.ts +161 -0
- package/src/vue.ts +118 -0
- package/tsconfig.json +17 -0
|
@@ -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
|
+
}
|