Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details →
Socket
Book a DemoInstallSign in
Socket

react-scroll-media

Package Overview
Dependencies
Maintainers
1
Versions
7
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

react-scroll-media - npm Package Compare versions

Comparing version
1.0.2
to
1.0.3
+1
-1
dist/index.js.map

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/react/ScrollSequence.tsx","../src/react/useScrollSequence.ts","../src/controllers/imageController.ts","../src/sequence/sequenceResolver.ts","../src/core/clamp.ts","../src/react/scrollTimelineContext.ts","../src/react/useScrollTimeline.ts","../src/react/ScrollTimelineProvider.tsx","../src/core/loopManager.ts","../src/constants.ts","../src/core/scrollTimeline.ts","../src/react/ScrollText.tsx","../src/react/ScrollWordReveal.tsx"],"sourcesContent":["/**\r\n * react-scroll-media\r\n * Production-ready scroll-driven image sequence rendering component\r\n */\r\n\r\n// Public exports\r\n// Public exports\r\nexport { ScrollSequence } from './react/ScrollSequence';\r\nexport { useScrollSequence } from './react/useScrollSequence';\r\nexport { ScrollTimelineProvider } from './react/ScrollTimelineProvider';\r\nexport { ScrollText } from './react/ScrollText';\r\nexport { ScrollWordReveal } from './react/ScrollWordReveal';\r\nexport { useScrollTimeline } from './react/useScrollTimeline';\r\n\r\n// Types\r\nexport type { ScrollSequenceProps, ResolvedSequence, ScrollProgress } from './types';\r\n\r\n// Core utilities (advanced users)\r\nexport { ScrollTimeline } from './core/scrollTimeline';\r\nexport { clamp } from './core/clamp';\r\n\r\n// Sequence utilities (advanced users)\r\nexport { resolveSequence } from './sequence/sequenceResolver';\r\n\r\n// Controllers (advanced users)\r\nexport { ImageController } from './controllers/imageController';\r\nexport type { ImageControllerConfig } from './controllers/imageController';\r\n","import React, { useRef } from 'react';\r\nimport type { ScrollSequenceProps } from '../types';\r\nimport { useScrollSequence } from './useScrollSequence';\r\nimport { ScrollTimelineProvider } from './ScrollTimelineProvider';\r\n\r\ninterface InnerSequenceProps {\r\n source: ScrollSequenceProps['source'];\r\n debug: boolean;\r\n memoryStrategy: ScrollSequenceProps['memoryStrategy'];\r\n lazyBuffer?: number;\r\n accessibilityLabel?: string;\r\n fallback?: React.ReactNode;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\nconst InnerSequence: React.FC<InnerSequenceProps> = ({ \r\n source, \r\n debug, \r\n memoryStrategy,\r\n lazyBuffer,\r\n accessibilityLabel = \"Scroll sequence\",\r\n fallback,\r\n onError\r\n}) => {\r\n const debugRef = useRef<HTMLDivElement>(null);\r\n const { canvasRef, isLoaded } = useScrollSequence({\r\n source,\r\n debugRef,\r\n memoryStrategy,\r\n lazyBuffer,\r\n onError\r\n });\r\n \r\n // Fallback logic could be handled here or by parent.\r\n // If we handle it here, we overlay it?\r\n // Actually, canvas opacity handles the fade-in.\r\n // Use fallback if provided and not loaded.\r\n\r\n const canvasStyle: React.CSSProperties = {\r\n display: 'block',\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n opacity: isLoaded ? 1 : 0,\r\n transition: 'opacity 0.2s ease-in',\r\n };\r\n \r\n const debugStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n top: '10px',\r\n left: '10px',\r\n background: 'rgba(0, 0, 0, 0.7)',\r\n color: '#00ff00',\r\n padding: '8px',\r\n borderRadius: '4px',\r\n fontFamily: 'monospace',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n whiteSpace: 'pre-wrap',\r\n zIndex: 9999,\r\n };\r\n\r\n return (\r\n <>\r\n {/* Render fallback behind canvas, or replace? \r\n If replace, we might loose the canvas ref init?\r\n Better to render both and cross-fade or just hide fallback when loaded.\r\n */}\r\n {!isLoaded && fallback && (\r\n <div style={{ position: 'absolute', inset: 0, zIndex: 1 }}>\r\n {fallback}\r\n </div>\r\n )}\r\n \r\n <canvas \r\n ref={canvasRef} \r\n style={canvasStyle} \r\n role=\"img\"\r\n aria-label={accessibilityLabel}\r\n />\r\n {debug && <div ref={debugRef} style={debugStyle}>Waiting for scroll...</div>}\r\n </>\r\n );\r\n};\r\n\r\nexport const ScrollSequence = React.forwardRef<HTMLDivElement, ScrollSequenceProps>(\r\n (props, ref) => {\r\n const {\r\n source,\r\n scrollLength = '300vh',\r\n className = '',\r\n debug = false,\r\n memoryStrategy = 'eager',\r\n lazyBuffer = 10,\r\n fallback,\r\n accessibilityLabel,\r\n onError,\r\n } = props;\r\n\r\n // Check for reduced motion\r\n const prefersReducedMotion = React.useMemo(() => {\r\n if (typeof window !== 'undefined') {\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n }\r\n return false;\r\n }, []);\r\n\r\n // Use ScrollSequence now acts as the convenient \"Bundle\"\r\n // It provides the Timeline context and renders the Canvas consumer.\r\n return (\r\n <div ref={ref} className={className} style={{ width: '100%' }}>\r\n <ScrollTimelineProvider scrollLength={scrollLength}>\r\n {prefersReducedMotion && fallback ? (\r\n <div style={{ position: 'sticky', top: 0, height: '100vh', width: '100%' }}>\r\n {fallback}\r\n </div>\r\n ) : (\r\n <InnerSequence \r\n source={source} \r\n debug={debug} \r\n memoryStrategy={memoryStrategy}\r\n lazyBuffer={lazyBuffer} \r\n fallback={fallback}\r\n accessibilityLabel={accessibilityLabel}\r\n onError={onError}\r\n />\r\n )}\r\n {props.children}\r\n </ScrollTimelineProvider>\r\n </div>\r\n );\r\n }\r\n);\r\n","import { useRef, useEffect, useState } from 'react';\r\nimport type { ScrollSequenceProps } from '../types';\r\nimport { ImageController } from '../controllers/imageController';\r\nimport { resolveSequence } from '../sequence/sequenceResolver';\r\nimport { clamp } from '../core/clamp';\r\nimport { useScrollTimeline } from './useScrollTimeline';\r\n\r\ninterface UseScrollSequenceParams {\r\n source: ScrollSequenceProps['source'];\r\n debugRef?: React.MutableRefObject<HTMLDivElement | null>;\r\n memoryStrategy?: 'eager' | 'lazy';\r\n lazyBuffer?: number;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n/**\r\n * Hook to manage image sequence in a timeline context.\r\n * MUST be used inside ScrollTimelineProvider.\r\n */\r\nexport function useScrollSequence({\r\n source,\r\n debugRef,\r\n memoryStrategy = 'eager',\r\n lazyBuffer = 10,\r\n onError,\r\n}: UseScrollSequenceParams) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const controllerRef = useRef<ImageController | null>(null);\r\n \r\n // Use the shared timeline\r\n const { subscribe } = useScrollTimeline();\r\n\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n useEffect(() => {\r\n let active = true;\r\n let currentController: ImageController | null = null;\r\n let unsubscribeTimeline: (() => void) | null = null;\r\n\r\n const init = async () => {\r\n setIsLoaded(false);\r\n setError(null);\r\n\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n try {\r\n // 1. Resolve Sequence\r\n // Guard: source change handled by effect dep, but verify environment?\r\n if (typeof window === 'undefined') return;\r\n\r\n const sequence = await resolveSequence(source);\r\n if (!active) return;\r\n\r\n if (sequence.frames.length === 0) {\r\n return;\r\n }\r\n\r\n // 2. Setup Dimensions (Initial)\r\n if (typeof window !== 'undefined') {\r\n canvas.width = window.innerWidth;\r\n canvas.height = window.innerHeight;\r\n }\r\n\r\n // 3. Initialize Controller\r\n currentController = new ImageController({\r\n canvas,\r\n frames: sequence.frames,\r\n strategy: memoryStrategy,\r\n bufferSize: lazyBuffer\r\n });\r\n controllerRef.current = currentController;\r\n\r\n // 4. Subscribe to Timeline\r\n unsubscribeTimeline = subscribe((progress) => {\r\n if (!currentController) return;\r\n const clamped = clamp(progress);\r\n currentController.update(clamped);\r\n\r\n // Debug Overlay\r\n if (debugRef?.current) {\r\n const frameIndex = Math.floor(clamped * (sequence.frames.length - 1));\r\n debugRef.current.innerText = `Progress: ${clamped.toFixed(2)}\\nFrame: ${frameIndex + 1} / ${sequence.frames.length}`;\r\n }\r\n });\r\n\r\n if (active) setIsLoaded(true);\r\n\r\n } catch (err) {\r\n if (active) {\r\n const e = err instanceof Error ? err : new Error('Unknown initialization error');\r\n setError(e);\r\n if (onError) onError(e);\r\n }\r\n }\r\n };\r\n\r\n init();\r\n\r\n return () => {\r\n active = false;\r\n currentController?.destroy();\r\n controllerRef.current = null;\r\n if (unsubscribeTimeline) unsubscribeTimeline();\r\n };\r\n }, [source, memoryStrategy, lazyBuffer, subscribe]); // Re-run if source or timeline changes\r\n\r\n return {\r\n canvasRef,\r\n isLoaded,\r\n error\r\n };\r\n}\r\n","/**\r\n * ImageController\r\n * Manages canvas rendering, image loading, and frame-by-frame drawing.\r\n * Handles preloading and caching to minimize redraws.\r\n */\r\n\r\nexport interface ImageControllerConfig {\r\n /** HTMLCanvasElement to draw on */\r\n canvas: HTMLCanvasElement;\r\n\r\n /** Array of sorted frame URLs */\r\n frames: string[];\r\n\r\n /** Memory management strategy */\r\n strategy?: 'eager' | 'lazy';\r\n\r\n /** Lazy load buffer size (default 10) */\r\n bufferSize?: number;\r\n}\r\n\r\nexport class ImageController {\r\n private canvas: HTMLCanvasElement;\r\n private ctx: CanvasRenderingContext2D;\r\n private frames: string[];\r\n private imageCache = new Map<string, HTMLImageElement>();\r\n private loadingPromises = new Map<string, Promise<HTMLImageElement>>();\r\n private currentFrameIndex = -1;\r\n private strategy: 'eager' | 'lazy';\r\n private bufferSize: number;\r\n\r\n /**\r\n * Create a new ImageController instance.\r\n *\r\n * @param config - Configuration object\r\n * @throws If canvas doesn't support 2D context\r\n */\r\n private isDestroyed = false;\r\n\r\n constructor(config: ImageControllerConfig) {\r\n this.canvas = config.canvas;\r\n this.frames = config.frames;\r\n this.strategy = config.strategy || 'eager';\r\n this.bufferSize = config.bufferSize || 10;\r\n\r\n const ctx = this.canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('Failed to get 2D context from canvas');\r\n }\r\n this.ctx = ctx;\r\n\r\n // Initial load\r\n if (this.strategy === 'eager') {\r\n this.preloadAll();\r\n } else {\r\n this.ensureFrameWindow(0);\r\n }\r\n }\r\n\r\n // ... preloadAll omitted for brevity if unchanged, but let's include for completeness if needed.\r\n // Actually, we need to add guards to preloadFrame, so let's check it.\r\n \r\n private preloadAll(): void {\r\n this.frames.forEach((_, index) => this.preloadFrame(index));\r\n }\r\n\r\n private ensureFrameWindow(currentIndex: number): void {\r\n if (this.isDestroyed) return;\r\n\r\n const radius = this.bufferSize;\r\n const start = Math.max(0, currentIndex - radius);\r\n const end = Math.min(this.frames.length - 1, currentIndex + radius);\r\n \r\n const needed = new Set<string>();\r\n for (let i = start; i <= end; i++) {\r\n needed.add(this.frames[i]);\r\n }\r\n\r\n // Cleanup unused frames (LRU-ish but simple Window-based)\r\n for (const [src] of this.imageCache) {\r\n if (!needed.has(src)) {\r\n this.imageCache.delete(src);\r\n // We should also cancel promises if possible, but we can't cancel a fetch/image load easily.\r\n // We just delete the tracking so we don't cache it when it lands.\r\n this.loadingPromises.delete(src);\r\n }\r\n }\r\n\r\n // Load needed\r\n for (let i = start; i <= end; i++) {\r\n void this.preloadFrame(i);\r\n }\r\n }\r\n\r\n async preloadFrame(index: number): Promise<void> {\r\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\r\n\r\n const src = this.frames[index];\r\n\r\n if (this.imageCache.has(src)) return;\r\n\r\n // Deduplication: Reuse existing promise if allowed\r\n if (!this.loadingPromises.has(src)) {\r\n this.loadingPromises.set(src, this.loadImage(src));\r\n }\r\n\r\n try {\r\n await this.loadingPromises.get(src);\r\n } catch {\r\n // Failed\r\n if (!this.isDestroyed) {\r\n // Silent failure\r\n }\r\n }\r\n }\r\n\r\n private loadImage(src: string): Promise<HTMLImageElement> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n \r\n img.onload = () => {\r\n if (this.isDestroyed) return;\r\n \r\n // Critical: decode() to prevent main-thread jank during draw\r\n img.decode()\r\n .then(() => {\r\n if (this.isDestroyed) return;\r\n this.imageCache.set(src, img);\r\n resolve(img);\r\n })\r\n .catch(() => {\r\n if (this.isDestroyed) return;\r\n // Even if decode fails, the image might be usable\r\n this.imageCache.set(src, img);\r\n resolve(img);\r\n });\r\n };\r\n\r\n img.onerror = () => {\r\n if (this.isDestroyed) return;\r\n reject(new Error(`Failed to load image: ${src}`));\r\n };\r\n\r\n img.src = src;\r\n });\r\n }\r\n\r\n update(progress: number): void {\r\n if (this.isDestroyed || this.frames.length === 0) return;\r\n\r\n const frameIndex = Math.floor(progress * (this.frames.length - 1));\r\n\r\n if (this.strategy === 'lazy') {\r\n this.ensureFrameWindow(frameIndex);\r\n }\r\n\r\n if (frameIndex === this.currentFrameIndex) return;\r\n\r\n this.currentFrameIndex = frameIndex;\r\n this.drawFrame(frameIndex);\r\n }\r\n\r\n private drawFrame(index: number): void {\r\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\r\n\r\n const src = this.frames[index];\r\n const img = this.imageCache.get(src);\r\n\r\n if (!img) {\r\n // Frame not ready. Optional: Show loading spinner or keep previous frame?\r\n // For now, keep previous (natural behavior of canvas).\r\n // Or check promise\r\n const promise = this.loadingPromises.get(src);\r\n if (promise) {\r\n promise.then(() => {\r\n if (this.currentFrameIndex === index) {\r\n this.drawFrame(index);\r\n }\r\n }).catch(() => {}); // catch ignore\r\n }\r\n return;\r\n }\r\n\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n const scale = Math.min(\r\n this.canvas.width / img.width,\r\n this.canvas.height / img.height\r\n );\r\n\r\n const scaledWidth = img.width * scale;\r\n const scaledHeight = img.height * scale;\r\n const x = (this.canvas.width - scaledWidth) / 2;\r\n const y = (this.canvas.height - scaledHeight) / 2;\r\n\r\n this.ctx.drawImage(img, x, y, scaledWidth, scaledHeight);\r\n }\r\n\r\n setCanvasSize(width: number, height: number): void {\r\n if (this.isDestroyed) return;\r\n this.canvas.width = width;\r\n this.canvas.height = height;\r\n if (this.currentFrameIndex >= 0) {\r\n this.drawFrame(this.currentFrameIndex);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.isDestroyed = true;\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.imageCache.clear();\r\n this.loadingPromises.clear();\r\n }\r\n}\r\n","/**\r\n * SequenceResolver\r\n * Handles intelligent frame resolution from multiple input sources:\r\n * - Manual frame list (frames[])\r\n * - Pattern generation (pattern, start, end, pad)\r\n * - Remote manifest (manifest URL)\r\n */\r\n\r\nimport type { ScrollSequenceProps, ResolvedSequence } from '../types';\r\n\r\n// Declare process for TS (avoiding @types/node dependency for just this)\r\ndeclare const process: { env: { NODE_ENV: string } };\r\n\r\n/**\r\n * Resolves frame sequence from props.\r\n * Prioritizes: frames > pattern > manifest\r\n */\r\n/**\r\n * Resolves frame sequence from props.\r\n * Handles 'manual', 'pattern', and 'manifest' sources.\r\n */\r\nexport async function resolveSequence(source: ScrollSequenceProps['source']): Promise<ResolvedSequence> {\r\n switch (source.type) {\r\n case 'manual':\r\n return processManualFrames(source.frames);\r\n \r\n case 'pattern':\r\n return processPatternMode(source.url, source.start ?? 1, source.end, source.pad);\r\n \r\n case 'manifest':\r\n return processManifestMode(source.url);\r\n \r\n default:\r\n return { frames: [], frameCount: 0 };\r\n }\r\n}\r\n\r\n/**\r\n * Mode A: Process manually provided frames\r\n */\r\nfunction processManualFrames(frames: string[]): ResolvedSequence {\r\n // Sort frames numerically by extracting numbers from filenames\r\n // Uses stable sort to preserve order for frames with no numbers or equal numbers\r\n const sorted = [...frames].sort((a, b) => {\r\n const numA = extractNumber(a);\r\n const numB = extractNumber(b);\r\n return numA - numB;\r\n });\r\n\r\n return {\r\n frames: sorted,\r\n frameCount: sorted.length\r\n };\r\n}\r\n\r\n/**\r\n * Mode B: Generate frames from pattern\r\n */\r\nfunction processPatternMode(pattern: string, start: number, end: number, pad?: number): ResolvedSequence {\r\n const frames: string[] = [];\r\n\r\n for (let i = start; i <= end; i++) {\r\n let indexStr = i.toString();\r\n if (pad) {\r\n indexStr = indexStr.padStart(pad, '0');\r\n }\r\n frames.push(pattern.replace('{index}', indexStr));\r\n }\r\n\r\n return {\r\n frames,\r\n frameCount: frames.length\r\n };\r\n}\r\n\r\n/**\r\n * Mode C: Fetch and process manifest\r\n */\r\nconst manifestCache = new Map<string, Promise<ResolvedSequence>>();\r\n\r\nasync function processManifestMode(url: string): Promise<ResolvedSequence> {\r\n if (manifestCache.has(url)) {\r\n return manifestCache.get(url)!;\r\n }\r\n\r\n const promise = (async () => {\r\n try {\r\n const res = await fetch(url);\r\n if (!res.ok) {\r\n throw new Error(`Failed to fetch manifest: ${res.statusText}`);\r\n }\r\n \r\n const data = await res.json();\r\n \r\n // Check for \"frames\" array in manifest\r\n if (data.frames && Array.isArray(data.frames)) {\r\n return processManualFrames(data.frames);\r\n }\r\n \r\n // Check for pattern config in manifest\r\n if (data.pattern && typeof data.end === 'number') {\r\n const start = data.start ?? 1;\r\n const pad = data.pad;\r\n return processPatternMode(data.pattern, start, data.end, pad);\r\n }\r\n \r\n return { frames: [], frameCount: 0 };\r\n \r\n } catch (err) {\r\n // Remove from cache on error so retry is possible\r\n manifestCache.delete(url);\r\n throw err;\r\n }\r\n })();\r\n\r\n manifestCache.set(url, promise);\r\n return promise;\r\n}\r\n\r\n// --- Helpers ---\r\n\r\n/**\r\n * Extract the first number found in a filename.\r\n * Returns -1 if no number is found, to differentiate from 0.\r\n */\r\nfunction extractNumber(filename: string): number {\r\n const match = filename.match(/\\d+/);\r\n return match ? parseInt(match[0], 10) : -1;\r\n}\r\n\r\n","/**\r\n * Clamps a value between a minimum and maximum.\r\n * Default range is [0, 1], suitable for progress values.\r\n *\r\n * @param value - The value to clamp\r\n * @param min - Minimum value (default: 0)\r\n * @param max - Maximum value (default: 1)\r\n * @returns The clamped value\r\n */\r\nexport function clamp(value: number, min: number = 0, max: number = 1): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n","import { createContext, useContext } from 'react';\r\nimport { ScrollTimeline } from '../core/scrollTimeline';\r\n\r\nexport interface ScrollTimelineContextValue {\r\n timeline: ScrollTimeline | null;\r\n // Expose current progress? No, that causes re-renders. Use subscription.\r\n}\r\n\r\nexport const ScrollTimelineContext = createContext<ScrollTimelineContextValue>({\r\n timeline: null,\r\n});\r\n\r\nexport function useTimelineContext() {\r\n return useContext(ScrollTimelineContext);\r\n}\r\n","import { ScrollTimeline, TimelineCallback } from '../core/scrollTimeline';\r\nimport { useTimelineContext } from './scrollTimelineContext';\r\n\r\nexport interface UseScrollTimelineResult {\r\n /** \r\n * Manual subscription to the timeline. \r\n * Useful for low-level DOM updates (refs) without re-rendering.\r\n */\r\n subscribe: (callback: TimelineCallback) => () => void;\r\n \r\n /** The raw timeline instance (for advanced usage) */\r\n timeline: ScrollTimeline | null; \r\n}\r\n\r\nexport function useScrollTimeline(): UseScrollTimelineResult {\r\n const { timeline } = useTimelineContext();\r\n\r\n const subscribe = (callback: TimelineCallback) => {\r\n if (!timeline) return () => {};\r\n return timeline.subscribe(callback);\r\n };\r\n\r\n return { subscribe, timeline };\r\n}\r\n","import React, { useRef, useState } from 'react';\r\nimport { ScrollTimeline } from '../core/scrollTimeline';\r\nimport { ScrollTimelineContext } from './scrollTimelineContext';\r\n\r\nexport interface ScrollTimelineProviderProps {\r\n children: React.ReactNode;\r\n \r\n /** CSS height for the scroll container (e.g., \"300vh\"). */\r\n scrollLength?: string;\r\n \r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport function ScrollTimelineProvider({\r\n children,\r\n scrollLength = '300vh',\r\n className = '',\r\n style = {},\r\n}: ScrollTimelineProviderProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [timeline, setTimeline] = useState<ScrollTimeline | null>(null);\r\n\r\n // Use layout effect to ensure timeline exists before children effects run\r\n // SSR safe fallback: use useEffect on server\r\n const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n if (!containerRef.current) return;\r\n\r\n // Future-proof: factory could be passed via props\r\n const instance = new ScrollTimeline(containerRef.current);\r\n \r\n // We do NOT call start() anymore, it starts on subscription\r\n // instance.start(); \r\n \r\n setTimeline(instance);\r\n\r\n return () => {\r\n instance.destroy();\r\n setTimeline(null);\r\n };\r\n }, []); // Dependencies? strict empty for one-time setup\r\n\r\n const containerStyle: React.CSSProperties = {\r\n height: scrollLength,\r\n position: 'relative',\r\n width: '100%',\r\n ...style,\r\n };\r\n\r\n const stickyWrapperStyle: React.CSSProperties = {\r\n position: 'sticky',\r\n top: 0,\r\n height: '100vh',\r\n width: '100%',\r\n overflow: 'hidden',\r\n };\r\n\r\n // Memoize context value to prevent unnecessary re-renders of consumers\r\n // when Parent component renders but timeline instance hasn't changed.\r\n const contextValue = React.useMemo(() => ({ timeline }), [timeline]);\r\n\r\n return (\r\n <ScrollTimelineContext.Provider value={contextValue}>\r\n <div \r\n ref={containerRef} \r\n className={className} \r\n style={containerStyle}\r\n >\r\n <div style={stickyWrapperStyle}>\r\n {children}\r\n </div>\r\n </div>\r\n </ScrollTimelineContext.Provider>\r\n );\r\n}\r\n","/**\r\n * ScrollLoopManager\r\n * \r\n * Singleton class to manage a single requestAnimationFrame loop\r\n * for all ScrollTimeline instances. This prevents multiple RAF\r\n * callbacks from piling up and degrading performance.\r\n */\r\n\r\ntype LoopCallback = () => void;\r\n\r\nexport class ScrollLoopManager {\r\n private static instance: ScrollLoopManager;\r\n private callbacks = new Set<LoopCallback>();\r\n private rafId: number | null = null;\r\n private isActive = false;\r\n\r\n private constructor() {}\r\n\r\n public static getInstance(): ScrollLoopManager {\r\n if (!ScrollLoopManager.instance) {\r\n ScrollLoopManager.instance = new ScrollLoopManager();\r\n }\r\n return ScrollLoopManager.instance;\r\n }\r\n\r\n /**\r\n * Register a callback to be called on every animation frame.\r\n */\r\n public register(callback: LoopCallback): void {\r\n if (this.callbacks.has(callback)) return;\r\n \r\n this.callbacks.add(callback);\r\n \r\n // Start loop if this is the first subscriber\r\n if (this.callbacks.size === 1) {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n * Unregister a callback.\r\n */\r\n public unregister(callback: LoopCallback): void {\r\n this.callbacks.delete(callback);\r\n\r\n // Stop loop if no subscribers left\r\n if (this.callbacks.size === 0) {\r\n this.stop();\r\n }\r\n }\r\n\r\n private start(): void {\r\n if (this.isActive) return;\r\n this.isActive = true;\r\n \r\n // Ensure we are in a browser environment\r\n if (typeof window !== 'undefined') {\r\n this.tick();\r\n }\r\n }\r\n\r\n private stop(): void {\r\n this.isActive = false;\r\n if (this.rafId !== null && typeof window !== 'undefined') {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n }\r\n\r\n private tick = (): void => {\r\n if (!this.isActive) return;\r\n\r\n // Execute all registered callbacks\r\n this.callbacks.forEach(cb => {\r\n try {\r\n cb();\r\n } catch (e) {\r\n // Silent catch to prevent loop crash\r\n }\r\n });\r\n\r\n this.rafId = requestAnimationFrame(this.tick);\r\n };\r\n}\r\n","/**\r\n * Global Constants for React Scroll Media\r\n */\r\n\r\n// Scroll Logic\r\nexport const SCROLL_THRESHOLD = 0.0001; // Minimum progress change to trigger update\r\nexport const DEFAULT_SCROLL_LENGTH = '300vh';\r\n\r\n// Memory Management\r\nexport const DEFAULT_LAZY_BUFFER = 10;\r\nexport const MAX_CACHE_SIZE = 50; // Fallback max size if not dynamic\r\n\r\n// Sequences\r\nexport const DEFAULT_PAD_LENGTH = 0; // Default padding for image numbering\r\n\r\n// Styles & Layout\r\nexport const DEFAULT_FALLBACK_COLOR = '#ccc';\r\n","import { ScrollLoopManager } from './loopManager';\r\nimport { SCROLL_THRESHOLD } from '../constants';\r\n\r\nexport type TimelineCallback = (progress: number) => void;\r\n\r\nexport class ScrollTimeline {\r\n private container: Element;\r\n private subscribers = new Set<TimelineCallback>();\r\n private currentProgress = 0;\r\n \r\n // Caching for performance\r\n private cachedRect: DOMRect | null = null;\r\n private cachedScrollParent: Element | Window | null = null;\r\n private cachedScrollParentRect: DOMRect | null = null;\r\n private cachedViewportHeight = 0;\r\n private cachedOffsetTop = 0;\r\n private isLayoutDirty = true;\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n public readonly id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\r\n\r\n constructor(container: Element) {\r\n this.container = container;\r\n \r\n if (typeof window !== 'undefined') {\r\n // Invalidate cache on resize\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.isLayoutDirty = true;\r\n });\r\n this.resizeObserver.observe(this.container);\r\n if (document.body) {\r\n this.resizeObserver.observe(document.body);\r\n }\r\n \r\n // Also listen to global resize\r\n window.addEventListener('resize', this.onWindowResize);\r\n }\r\n }\r\n\r\n private onWindowResize = () => {\r\n this.isLayoutDirty = true;\r\n };\r\n\r\n /**\r\n * Subscribe to progress updates.\r\n * Returns an unsubscribe function.\r\n */\r\n subscribe(callback: TimelineCallback): () => void {\r\n this.subscribers.add(callback);\r\n \r\n // Immediately call with current progress for initialization\r\n try {\r\n callback(this.currentProgress);\r\n } catch (e) {\r\n // Silent\r\n }\r\n\r\n // Register with unique LoopManager if we have subscribers\r\n if (this.subscribers.size === 1) {\r\n ScrollLoopManager.getInstance().register(this.tick);\r\n }\r\n \r\n return () => {\r\n this.subscribers.delete(callback);\r\n if (this.subscribers.size === 0) {\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n }\r\n };\r\n }\r\n\r\n unsubscribe(callback: TimelineCallback): void {\r\n this.subscribers.delete(callback);\r\n if (this.subscribers.size === 0) {\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n }\r\n }\r\n\r\n /**\r\n * Start is now handled by LoopManager via subscriptions\r\n * Deprecated but kept for API stability if needed.\r\n */\r\n start(): void {\r\n // No-op, managed by subscriptions\r\n }\r\n\r\n stop(): void {\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n }\r\n\r\n private tick = (): void => {\r\n // Calculate Progress\r\n const progress = this.calculateProgress();\r\n\r\n // Notify if changed significantly (using threshold constant)\r\n if (Math.abs(progress - this.currentProgress) > SCROLL_THRESHOLD) {\r\n this.currentProgress = progress;\r\n this.notify();\r\n }\r\n };\r\n\r\n private notify() {\r\n this.subscribers.forEach((cb) => {\r\n try {\r\n cb(this.currentProgress);\r\n } catch (e) {\r\n // Silent\r\n }\r\n });\r\n }\r\n\r\n private updateCache() {\r\n if (!this.isLayoutDirty && this.cachedRect) return;\r\n\r\n this.cachedRect = this.container.getBoundingClientRect();\r\n \r\n if (!this.cachedScrollParent) {\r\n this.cachedScrollParent = this.getScrollParent(this.container);\r\n }\r\n\r\n if (this.cachedScrollParent instanceof Element) {\r\n this.cachedScrollParentRect = this.cachedScrollParent.getBoundingClientRect();\r\n this.cachedViewportHeight = this.cachedScrollParentRect.height;\r\n this.cachedOffsetTop = this.cachedScrollParentRect.top;\r\n } else if (typeof window !== 'undefined') {\r\n this.cachedViewportHeight = window.innerHeight;\r\n this.cachedOffsetTop = 0;\r\n }\r\n\r\n this.isLayoutDirty = false;\r\n }\r\n\r\n private calculateProgress(): number {\r\n if (this.isLayoutDirty || !this.cachedRect) {\r\n this.updateCache();\r\n }\r\n\r\n const currentRect = this.container.getBoundingClientRect();\r\n const scrollDist = (this.cachedRect?.height || currentRect.height) - this.cachedViewportHeight;\r\n\r\n // Guard: Zero Height / Division by Zero\r\n if (scrollDist <= 0) return 1;\r\n\r\n const relativeTop = currentRect.top - this.cachedOffsetTop;\r\n const rawProgress = -relativeTop / scrollDist;\r\n \r\n const clamped = Math.min(Math.max(rawProgress, 0), 1);\r\n \r\n // Round to 6 decimals to prevent micro-drift\r\n return Math.round(clamped * 1000000) / 1000000;\r\n }\r\n\r\n private getScrollParent(node: Element): Element | Window {\r\n if (typeof window === 'undefined') return node; \r\n\r\n let current = node.parentElement;\r\n while (current) {\r\n const style = getComputedStyle(current);\r\n if (['auto', 'scroll'].includes(style.overflowY)) {\r\n return current;\r\n }\r\n current = current.parentElement;\r\n }\r\n return window;\r\n }\r\n\r\n destroy() {\r\n this.subscribers.clear();\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n \r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (typeof window !== 'undefined') {\r\n window.removeEventListener('resize', this.onWindowResize);\r\n }\r\n }\r\n}\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { useScrollTimeline } from './useScrollTimeline';\r\n\r\nexport interface ScrollTextProps {\r\n children: React.ReactNode;\r\n /** Progress start (0-1) where ENTRANCE animation begins */\r\n start?: number;\r\n /** Progress end (0-1) where ENTRANCE animation ends */\r\n end?: number;\r\n \r\n /** Progress start (0-1) where EXIT animation begins. If omitted, element stays visible. */\r\n exitStart?: number;\r\n /** Progress end (0-1) where EXIT animation ends */\r\n exitEnd?: number;\r\n\r\n /** Initial opacity */\r\n initialOpacity?: number;\r\n /** Target opacity (when entered) */\r\n targetOpacity?: number;\r\n /** Final opacity (after exit) */\r\n finalOpacity?: number;\r\n\r\n /** Y-axis translation range in pixels (e.g., 50 means move down 50px) */\r\n translateY?: number;\r\n \r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\nexport function ScrollText({\r\n children,\r\n start = 0,\r\n end = 0.2,\r\n exitStart,\r\n exitEnd,\r\n initialOpacity = 0,\r\n targetOpacity = 1,\r\n finalOpacity = 0,\r\n translateY = 50,\r\n style,\r\n className,\r\n}: ScrollTextProps) {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const { subscribe } = useScrollTimeline();\r\n\r\n useEffect(() => {\r\n // Subscribe to updates\r\n if (typeof window === 'undefined') return;\r\n\r\n const unsubscribe = subscribe((progress) => {\r\n if (!ref.current) return;\r\n\r\n // Check for reduced motion preference\r\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n // If reduced motion is preferred, disable translation (keep opacity fade)\r\n const effectiveTranslateY = prefersReducedMotion ? 0 : translateY;\r\n\r\n let opacity = initialOpacity;\r\n let currentY = effectiveTranslateY;\r\n\r\n // 1. Entrance Phase\r\n if (progress < start) {\r\n opacity = initialOpacity;\r\n currentY = effectiveTranslateY;\r\n } else if (progress >= start && progress <= end) {\r\n const local = (progress - start) / (end - start);\r\n opacity = initialOpacity + (targetOpacity - initialOpacity) * local;\r\n currentY = effectiveTranslateY * (1 - local);\r\n } \r\n // 2. Hold Phase\r\n else if (!exitStart || progress < exitStart) {\r\n opacity = targetOpacity;\r\n currentY = 0;\r\n }\r\n // 3. Exit Phase\r\n else if (exitStart && exitEnd && progress >= exitStart && progress <= exitEnd) {\r\n const local = (progress - exitStart) / (exitEnd - exitStart);\r\n opacity = targetOpacity + (finalOpacity - targetOpacity) * local;\r\n // Move from 0 -> -translateY (or 0 if reduced motion)\r\n currentY = -effectiveTranslateY * local; \r\n }\r\n // 4. Final Phase\r\n else {\r\n opacity = finalOpacity;\r\n currentY = -effectiveTranslateY;\r\n }\r\n\r\n // Apply styles\r\n ref.current.style.opacity = opacity.toFixed(3);\r\n ref.current.style.transform = `translateY(${currentY}px)`;\r\n });\r\n\r\n return unsubscribe;\r\n }, [subscribe, start, end, exitStart, exitEnd, initialOpacity, targetOpacity, finalOpacity, translateY]);\r\n\r\n return (\r\n <div \r\n ref={ref} \r\n className={className}\r\n style={{\r\n opacity: initialOpacity, \r\n transform: `translateY(${translateY}px)`,\r\n transition: 'none', // Critical: no CSS transition fighting JS\r\n willChange: 'opacity, transform',\r\n ...style\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { useScrollTimeline } from './useScrollTimeline';\r\n\r\nexport interface ScrollWordRevealProps {\r\n text: string;\r\n /** Progress start (0-1) */\r\n start?: number;\r\n /** Progress end (0-1) */\r\n end?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n /** Stagger delay factor (not used in pure scroll map, simpler logic: map word index to sub-progress) */\r\n}\r\n\r\nexport function ScrollWordReveal({\r\n text,\r\n start = 0,\r\n end = 1,\r\n className,\r\n style\r\n}: ScrollWordRevealProps) {\r\n // We cannot create refs in loop dynamically in top level easily without array.\r\n // Better to have one parent ref and querySelectorAll children, OR use callback refs.\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const { subscribe } = useScrollTimeline();\r\n\r\n // Split words\r\n const words = text.split(/\\s+/);\r\n\r\n useEffect(() => {\r\n const unsubscribe = subscribe((globalProgress) => {\r\n if (!containerRef.current) return;\r\n const spans = containerRef.current.children;\r\n \r\n // Map global progress to local range [start, end]\r\n let localProgress = 0;\r\n if (globalProgress <= start) localProgress = 0;\r\n else if (globalProgress >= end) localProgress = 1;\r\n else localProgress = (globalProgress - start) / (end - start);\r\n\r\n // Calculate which word should be visible\r\n const totalWords = spans.length;\r\n const progressPerWord = 1 / totalWords;\r\n\r\n for (let i = 0; i < totalWords; i++) {\r\n const span = spans[i] as HTMLElement;\r\n \r\n // Each word fades in during its \"slot\"\r\n // Word 0: 0 -> 0.1\r\n // Word 1: 0.1 -> 0.2\r\n const wordStart = i * progressPerWord;\r\n const wordEnd = (i + 1) * progressPerWord;\r\n \r\n let wordOpacity = 0;\r\n if (localProgress >= wordEnd) {\r\n wordOpacity = 1;\r\n } else if (localProgress <= wordStart) {\r\n wordOpacity = 0.1; // faint visibility initially? or 0\r\n } else {\r\n // Interpolate\r\n wordOpacity = 0.1 + 0.9 * ((localProgress - wordStart) / (wordEnd - wordStart));\r\n }\r\n \r\n span.style.opacity = wordOpacity.toFixed(2);\r\n // Optional: translate Y too?\r\n const translate = (1 - wordOpacity) * 10;\r\n span.style.transform = `translateY(${translate}px)`;\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }, [subscribe, start, end]);\r\n\r\n return (\r\n <div ref={containerRef} className={className} style={{ ...style, display: 'flex', flexWrap: 'wrap', gap: '0.25em' }}>\r\n {words.map((word, i) => (\r\n <span \r\n key={i} \r\n style={{ \r\n opacity: 0.1, \r\n transform: 'translateY(10px)',\r\n transition: 'none',\r\n willChange: 'opacity, transform'\r\n }}\r\n >\r\n {word}\r\n </span>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["import_react","import_react","import_react","React","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
{"version":3,"sources":["../src/index.ts","../src/react/ScrollSequence.tsx","../src/react/useScrollSequence.ts","../src/controllers/imageController.ts","../src/sequence/sequenceResolver.ts","../src/core/clamp.ts","../src/react/scrollTimelineContext.ts","../src/react/useScrollTimeline.ts","../src/react/ScrollTimelineProvider.tsx","../src/core/loopManager.ts","../src/constants.ts","../src/core/scrollTimeline.ts","../src/react/ScrollText.tsx","../src/react/ScrollWordReveal.tsx"],"sourcesContent":["/**\n * react-scroll-media\n * Production-ready scroll-driven image sequence rendering component\n */\n\n// Public exports\n// Public exports\nexport { ScrollSequence } from './react/ScrollSequence';\nexport { useScrollSequence } from './react/useScrollSequence';\nexport { ScrollTimelineProvider } from './react/ScrollTimelineProvider';\nexport { ScrollText } from './react/ScrollText';\nexport { ScrollWordReveal } from './react/ScrollWordReveal';\nexport { useScrollTimeline } from './react/useScrollTimeline';\n\n// Types\nexport type { ScrollSequenceProps, ResolvedSequence, ScrollProgress } from './types';\n\n// Core utilities (advanced users)\nexport { ScrollTimeline } from './core/scrollTimeline';\nexport { clamp } from './core/clamp';\n\n// Sequence utilities (advanced users)\nexport { resolveSequence } from './sequence/sequenceResolver';\n\n// Controllers (advanced users)\nexport { ImageController } from './controllers/imageController';\nexport type { ImageControllerConfig } from './controllers/imageController';\n","import React, { useRef } from 'react';\nimport type { ScrollSequenceProps } from '../types';\nimport { useScrollSequence } from './useScrollSequence';\nimport { ScrollTimelineProvider } from './ScrollTimelineProvider';\n\ninterface InnerSequenceProps {\n source: ScrollSequenceProps['source'];\n debug: boolean;\n memoryStrategy: ScrollSequenceProps['memoryStrategy'];\n lazyBuffer?: number;\n accessibilityLabel?: string;\n fallback?: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\nconst InnerSequence: React.FC<InnerSequenceProps> = ({ \n source, \n debug, \n memoryStrategy,\n lazyBuffer,\n accessibilityLabel = \"Scroll sequence\",\n fallback,\n onError\n}) => {\n const debugRef = useRef<HTMLDivElement>(null);\n const { canvasRef, isLoaded } = useScrollSequence({\n source,\n debugRef,\n memoryStrategy,\n lazyBuffer,\n onError\n });\n \n // Fallback logic could be handled here or by parent.\n // If we handle it here, we overlay it?\n // Actually, canvas opacity handles the fade-in.\n // Use fallback if provided and not loaded.\n\n const canvasStyle: React.CSSProperties = {\n display: 'block',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n opacity: isLoaded ? 1 : 0,\n transition: 'opacity 0.2s ease-in',\n };\n \n const debugStyle: React.CSSProperties = {\n position: 'absolute',\n top: '10px',\n left: '10px',\n background: 'rgba(0, 0, 0, 0.7)',\n color: '#00ff00',\n padding: '8px',\n borderRadius: '4px',\n fontFamily: 'monospace',\n fontSize: '12px',\n pointerEvents: 'none',\n whiteSpace: 'pre-wrap',\n zIndex: 9999,\n };\n\n return (\n <>\n {/* Render fallback behind canvas, or replace? \n If replace, we might loose the canvas ref init?\n Better to render both and cross-fade or just hide fallback when loaded.\n */}\n {!isLoaded && fallback && (\n <div style={{ position: 'absolute', inset: 0, zIndex: 1 }}>\n {fallback}\n </div>\n )}\n \n <canvas \n ref={canvasRef} \n style={canvasStyle} \n role=\"img\"\n aria-label={accessibilityLabel}\n />\n {debug && <div ref={debugRef} style={debugStyle}>Waiting for scroll...</div>}\n </>\n );\n};\n\nexport const ScrollSequence = React.forwardRef<HTMLDivElement, ScrollSequenceProps>(\n (props, ref) => {\n const {\n source,\n scrollLength = '300vh',\n className = '',\n debug = false,\n memoryStrategy = 'eager',\n lazyBuffer = 10,\n fallback,\n accessibilityLabel,\n onError,\n } = props;\n\n // Check for reduced motion\n const prefersReducedMotion = React.useMemo(() => {\n if (typeof window !== 'undefined') {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n return false;\n }, []);\n\n // Use ScrollSequence now acts as the convenient \"Bundle\"\n // It provides the Timeline context and renders the Canvas consumer.\n return (\n <div ref={ref} className={className} style={{ width: '100%' }}>\n <ScrollTimelineProvider scrollLength={scrollLength}>\n {prefersReducedMotion && fallback ? (\n <div style={{ position: 'sticky', top: 0, height: '100vh', width: '100%' }}>\n {fallback}\n </div>\n ) : (\n <InnerSequence \n source={source} \n debug={debug} \n memoryStrategy={memoryStrategy}\n lazyBuffer={lazyBuffer} \n fallback={fallback}\n accessibilityLabel={accessibilityLabel}\n onError={onError}\n />\n )}\n {props.children}\n </ScrollTimelineProvider>\n </div>\n );\n }\n);\n","import { useRef, useEffect, useState } from 'react';\nimport type { ScrollSequenceProps } from '../types';\nimport { ImageController } from '../controllers/imageController';\nimport { resolveSequence } from '../sequence/sequenceResolver';\nimport { clamp } from '../core/clamp';\nimport { useScrollTimeline } from './useScrollTimeline';\n\ninterface UseScrollSequenceParams {\n source: ScrollSequenceProps['source'];\n debugRef?: React.MutableRefObject<HTMLDivElement | null>;\n memoryStrategy?: 'eager' | 'lazy';\n lazyBuffer?: number;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to manage image sequence in a timeline context.\n * MUST be used inside ScrollTimelineProvider.\n */\nexport function useScrollSequence({\n source,\n debugRef,\n memoryStrategy = 'eager',\n lazyBuffer = 10,\n onError,\n}: UseScrollSequenceParams) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const controllerRef = useRef<ImageController | null>(null);\n \n // Use the shared timeline\n const { subscribe } = useScrollTimeline();\n\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let active = true;\n let currentController: ImageController | null = null;\n let unsubscribeTimeline: (() => void) | null = null;\n\n const init = async () => {\n setIsLoaded(false);\n setError(null);\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n try {\n // 1. Resolve Sequence\n // Guard: source change handled by effect dep, but verify environment?\n if (typeof window === 'undefined') return;\n\n const sequence = await resolveSequence(source);\n if (!active) return;\n\n if (sequence.frames.length === 0) {\n return;\n }\n\n // 2. Setup Dimensions (Initial)\n if (typeof window !== 'undefined') {\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n }\n\n // 3. Initialize Controller\n currentController = new ImageController({\n canvas,\n frames: sequence.frames,\n strategy: memoryStrategy,\n bufferSize: lazyBuffer\n });\n controllerRef.current = currentController;\n\n // 4. Subscribe to Timeline\n unsubscribeTimeline = subscribe((progress) => {\n if (!currentController) return;\n const clamped = clamp(progress);\n currentController.update(clamped);\n\n // Debug Overlay\n if (debugRef?.current) {\n const frameIndex = Math.floor(clamped * (sequence.frames.length - 1));\n debugRef.current.innerText = `Progress: ${clamped.toFixed(2)}\\nFrame: ${frameIndex + 1} / ${sequence.frames.length}`;\n }\n });\n\n if (active) setIsLoaded(true);\n\n } catch (err) {\n if (active) {\n const e = err instanceof Error ? err : new Error('Unknown initialization error');\n setError(e);\n if (onError) onError(e);\n }\n }\n };\n\n init();\n\n return () => {\n active = false;\n currentController?.destroy();\n controllerRef.current = null;\n if (unsubscribeTimeline) unsubscribeTimeline();\n };\n }, [source, memoryStrategy, lazyBuffer, subscribe]); // Re-run if source or timeline changes\n\n return {\n canvasRef,\n isLoaded,\n error\n };\n}\n","/**\n * ImageController\n * Manages canvas rendering, image loading, and frame-by-frame drawing.\n * Handles preloading and caching to minimize redraws.\n */\n\nexport interface ImageControllerConfig {\n /** HTMLCanvasElement to draw on */\n canvas: HTMLCanvasElement;\n\n /** Array of sorted frame URLs */\n frames: string[];\n\n /** Memory management strategy */\n strategy?: 'eager' | 'lazy';\n\n /** Lazy load buffer size (default 10) */\n bufferSize?: number;\n}\n\nexport class ImageController {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private frames: string[];\n private imageCache = new Map<string, HTMLImageElement>();\n private loadingPromises = new Map<string, Promise<HTMLImageElement>>();\n private currentFrameIndex = -1;\n private strategy: 'eager' | 'lazy';\n private bufferSize: number;\n\n /**\n * Create a new ImageController instance.\n *\n * @param config - Configuration object\n * @throws If canvas doesn't support 2D context\n */\n private isDestroyed = false;\n\n constructor(config: ImageControllerConfig) {\n this.canvas = config.canvas;\n this.frames = config.frames;\n this.strategy = config.strategy || 'eager';\n this.bufferSize = config.bufferSize || 10;\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2D context from canvas');\n }\n this.ctx = ctx;\n\n // Initial load\n if (this.strategy === 'eager') {\n this.preloadAll();\n } else {\n this.ensureFrameWindow(0);\n }\n }\n\n // ... preloadAll omitted for brevity if unchanged, but let's include for completeness if needed.\n // Actually, we need to add guards to preloadFrame, so let's check it.\n \n private preloadAll(): void {\n this.frames.forEach((_, index) => this.preloadFrame(index));\n }\n\n private ensureFrameWindow(currentIndex: number): void {\n if (this.isDestroyed) return;\n\n const radius = this.bufferSize;\n const start = Math.max(0, currentIndex - radius);\n const end = Math.min(this.frames.length - 1, currentIndex + radius);\n \n const needed = new Set<string>();\n for (let i = start; i <= end; i++) {\n needed.add(this.frames[i]);\n }\n\n // Cleanup unused frames (LRU-ish but simple Window-based)\n for (const [src] of this.imageCache) {\n if (!needed.has(src)) {\n this.imageCache.delete(src);\n // We should also cancel promises if possible, but we can't cancel a fetch/image load easily.\n // We just delete the tracking so we don't cache it when it lands.\n this.loadingPromises.delete(src);\n }\n }\n\n // Load needed\n for (let i = start; i <= end; i++) {\n void this.preloadFrame(i);\n }\n }\n\n async preloadFrame(index: number): Promise<void> {\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\n\n const src = this.frames[index];\n\n if (this.imageCache.has(src)) return;\n\n // Deduplication: Reuse existing promise if allowed\n if (!this.loadingPromises.has(src)) {\n this.loadingPromises.set(src, this.loadImage(src));\n }\n\n try {\n await this.loadingPromises.get(src);\n } catch {\n // Failed\n if (!this.isDestroyed) {\n // Silent failure\n }\n }\n }\n\n private loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n \n img.onload = () => {\n if (this.isDestroyed) return;\n \n // Critical: decode() to prevent main-thread jank during draw\n img.decode()\n .then(() => {\n if (this.isDestroyed) return;\n this.imageCache.set(src, img);\n resolve(img);\n })\n .catch(() => {\n if (this.isDestroyed) return;\n // Even if decode fails, the image might be usable\n this.imageCache.set(src, img);\n resolve(img);\n });\n };\n\n img.onerror = () => {\n if (this.isDestroyed) return;\n reject(new Error(`Failed to load image: ${src}`));\n };\n\n img.src = src;\n });\n }\n\n update(progress: number): void {\n if (this.isDestroyed || this.frames.length === 0) return;\n\n const frameIndex = Math.floor(progress * (this.frames.length - 1));\n\n if (this.strategy === 'lazy') {\n this.ensureFrameWindow(frameIndex);\n }\n\n if (frameIndex === this.currentFrameIndex) return;\n\n this.currentFrameIndex = frameIndex;\n this.drawFrame(frameIndex);\n }\n\n private drawFrame(index: number): void {\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\n\n const src = this.frames[index];\n const img = this.imageCache.get(src);\n\n if (!img) {\n // Frame not ready. Optional: Show loading spinner or keep previous frame?\n // For now, keep previous (natural behavior of canvas).\n // Or check promise\n const promise = this.loadingPromises.get(src);\n if (promise) {\n promise.then(() => {\n if (this.currentFrameIndex === index) {\n this.drawFrame(index);\n }\n }).catch(() => {}); // catch ignore\n }\n return;\n }\n\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n const scale = Math.min(\n this.canvas.width / img.width,\n this.canvas.height / img.height\n );\n\n const scaledWidth = img.width * scale;\n const scaledHeight = img.height * scale;\n const x = (this.canvas.width - scaledWidth) / 2;\n const y = (this.canvas.height - scaledHeight) / 2;\n\n this.ctx.drawImage(img, x, y, scaledWidth, scaledHeight);\n }\n\n setCanvasSize(width: number, height: number): void {\n if (this.isDestroyed) return;\n this.canvas.width = width;\n this.canvas.height = height;\n if (this.currentFrameIndex >= 0) {\n this.drawFrame(this.currentFrameIndex);\n }\n }\n\n destroy(): void {\n this.isDestroyed = true;\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.imageCache.clear();\n this.loadingPromises.clear();\n }\n}\n","/**\n * SequenceResolver\n * Handles intelligent frame resolution from multiple input sources:\n * - Manual frame list (frames[])\n * - Pattern generation (pattern, start, end, pad)\n * - Remote manifest (manifest URL)\n */\n\nimport type { ScrollSequenceProps, ResolvedSequence } from '../types';\n\n// Declare process for TS (avoiding @types/node dependency for just this)\ndeclare const process: { env: { NODE_ENV: string } };\n\n/**\n * Resolves frame sequence from props.\n * Prioritizes: frames > pattern > manifest\n */\n/**\n * Resolves frame sequence from props.\n * Handles 'manual', 'pattern', and 'manifest' sources.\n */\nexport async function resolveSequence(source: ScrollSequenceProps['source']): Promise<ResolvedSequence> {\n switch (source.type) {\n case 'manual':\n return processManualFrames(source.frames);\n \n case 'pattern':\n return processPatternMode(source.url, source.start ?? 1, source.end, source.pad);\n \n case 'manifest':\n return processManifestMode(source.url);\n \n default:\n return { frames: [], frameCount: 0 };\n }\n}\n\n/**\n * Mode A: Process manually provided frames\n */\nfunction processManualFrames(frames: string[]): ResolvedSequence {\n // Sort frames numerically by extracting numbers from filenames\n // Uses stable sort to preserve order for frames with no numbers or equal numbers\n const sorted = [...frames].sort((a, b) => {\n const numA = extractNumber(a);\n const numB = extractNumber(b);\n return numA - numB;\n });\n\n return {\n frames: sorted,\n frameCount: sorted.length\n };\n}\n\n/**\n * Mode B: Generate frames from pattern\n */\nfunction processPatternMode(pattern: string, start: number, end: number, pad?: number): ResolvedSequence {\n const frames: string[] = [];\n\n for (let i = start; i <= end; i++) {\n let indexStr = i.toString();\n if (pad) {\n indexStr = indexStr.padStart(pad, '0');\n }\n frames.push(pattern.replace('{index}', indexStr));\n }\n\n return {\n frames,\n frameCount: frames.length\n };\n}\n\n/**\n * Mode C: Fetch and process manifest\n */\nconst manifestCache = new Map<string, Promise<ResolvedSequence>>();\n\nasync function processManifestMode(url: string): Promise<ResolvedSequence> {\n if (manifestCache.has(url)) {\n return manifestCache.get(url)!;\n }\n\n const promise = (async () => {\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch manifest: ${res.statusText}`);\n }\n \n const data = await res.json();\n \n // Check for \"frames\" array in manifest\n if (data.frames && Array.isArray(data.frames)) {\n return processManualFrames(data.frames);\n }\n \n // Check for pattern config in manifest\n if (data.pattern && typeof data.end === 'number') {\n const start = data.start ?? 1;\n const pad = data.pad;\n return processPatternMode(data.pattern, start, data.end, pad);\n }\n \n return { frames: [], frameCount: 0 };\n \n } catch (err) {\n // Remove from cache on error so retry is possible\n manifestCache.delete(url);\n throw err;\n }\n })();\n\n manifestCache.set(url, promise);\n return promise;\n}\n\n// --- Helpers ---\n\n/**\n * Extract the first number found in a filename.\n * Returns -1 if no number is found, to differentiate from 0.\n */\nfunction extractNumber(filename: string): number {\n const match = filename.match(/\\d+/);\n return match ? parseInt(match[0], 10) : -1;\n}\n\n","/**\n * Clamps a value between a minimum and maximum.\n * Default range is [0, 1], suitable for progress values.\n *\n * @param value - The value to clamp\n * @param min - Minimum value (default: 0)\n * @param max - Maximum value (default: 1)\n * @returns The clamped value\n */\nexport function clamp(value: number, min: number = 0, max: number = 1): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { createContext, useContext } from 'react';\nimport { ScrollTimeline } from '../core/scrollTimeline';\n\nexport interface ScrollTimelineContextValue {\n timeline: ScrollTimeline | null;\n // Expose current progress? No, that causes re-renders. Use subscription.\n}\n\nexport const ScrollTimelineContext = createContext<ScrollTimelineContextValue>({\n timeline: null,\n});\n\nexport function useTimelineContext() {\n return useContext(ScrollTimelineContext);\n}\n","import { ScrollTimeline, TimelineCallback } from '../core/scrollTimeline';\nimport { useTimelineContext } from './scrollTimelineContext';\n\nexport interface UseScrollTimelineResult {\n /** \n * Manual subscription to the timeline. \n * Useful for low-level DOM updates (refs) without re-rendering.\n */\n subscribe: (callback: TimelineCallback) => () => void;\n \n /** The raw timeline instance (for advanced usage) */\n timeline: ScrollTimeline | null; \n}\n\nexport function useScrollTimeline(): UseScrollTimelineResult {\n const { timeline } = useTimelineContext();\n\n const subscribe = (callback: TimelineCallback) => {\n if (!timeline) return () => {};\n return timeline.subscribe(callback);\n };\n\n return { subscribe, timeline };\n}\n","import React, { useRef, useState } from 'react';\nimport { ScrollTimeline } from '../core/scrollTimeline';\nimport { ScrollTimelineContext } from './scrollTimelineContext';\n\nexport interface ScrollTimelineProviderProps {\n children: React.ReactNode;\n \n /** CSS height for the scroll container (e.g., \"300vh\"). */\n scrollLength?: string;\n \n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ScrollTimelineProvider({\n children,\n scrollLength = '300vh',\n className = '',\n style = {},\n}: ScrollTimelineProviderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [timeline, setTimeline] = useState<ScrollTimeline | null>(null);\n\n // Use layout effect to ensure timeline exists before children effects run\n // SSR safe fallback: use useEffect on server\n const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n if (!containerRef.current) return;\n\n // Future-proof: factory could be passed via props\n const instance = new ScrollTimeline(containerRef.current);\n \n // We do NOT call start() anymore, it starts on subscription\n // instance.start(); \n \n setTimeline(instance);\n\n return () => {\n instance.destroy();\n setTimeline(null);\n };\n }, []); // Dependencies? strict empty for one-time setup\n\n const containerStyle: React.CSSProperties = {\n height: scrollLength,\n position: 'relative',\n width: '100%',\n ...style,\n };\n\n const stickyWrapperStyle: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n height: '100vh',\n width: '100%',\n overflow: 'hidden',\n };\n\n // Memoize context value to prevent unnecessary re-renders of consumers\n // when Parent component renders but timeline instance hasn't changed.\n const contextValue = React.useMemo(() => ({ timeline }), [timeline]);\n\n return (\n <ScrollTimelineContext.Provider value={contextValue}>\n <div \n ref={containerRef} \n className={className} \n style={containerStyle}\n >\n <div style={stickyWrapperStyle}>\n {children}\n </div>\n </div>\n </ScrollTimelineContext.Provider>\n );\n}\n","/**\n * ScrollLoopManager\n * \n * Singleton class to manage a single requestAnimationFrame loop\n * for all ScrollTimeline instances. This prevents multiple RAF\n * callbacks from piling up and degrading performance.\n */\n\ntype LoopCallback = () => void;\n\nexport class ScrollLoopManager {\n private static instance: ScrollLoopManager;\n private callbacks = new Set<LoopCallback>();\n private rafId: number | null = null;\n private isActive = false;\n\n private constructor() {}\n\n public static getInstance(): ScrollLoopManager {\n if (!ScrollLoopManager.instance) {\n ScrollLoopManager.instance = new ScrollLoopManager();\n }\n return ScrollLoopManager.instance;\n }\n\n /**\n * Register a callback to be called on every animation frame.\n */\n public register(callback: LoopCallback): void {\n if (this.callbacks.has(callback)) return;\n \n this.callbacks.add(callback);\n \n // Start loop if this is the first subscriber\n if (this.callbacks.size === 1) {\n this.start();\n }\n }\n\n /**\n * Unregister a callback.\n */\n public unregister(callback: LoopCallback): void {\n this.callbacks.delete(callback);\n\n // Stop loop if no subscribers left\n if (this.callbacks.size === 0) {\n this.stop();\n }\n }\n\n private start(): void {\n if (this.isActive) return;\n this.isActive = true;\n \n // Ensure we are in a browser environment\n if (typeof window !== 'undefined') {\n this.tick();\n }\n }\n\n private stop(): void {\n this.isActive = false;\n if (this.rafId !== null && typeof window !== 'undefined') {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n private tick = (): void => {\n if (!this.isActive) return;\n\n // Execute all registered callbacks\n this.callbacks.forEach(cb => {\n try {\n cb();\n } catch (e) {\n // Silent catch to prevent loop crash\n }\n });\n\n this.rafId = requestAnimationFrame(this.tick);\n };\n}\n","/**\n * Global Constants for React Scroll Media\n */\n\n// Scroll Logic\nexport const SCROLL_THRESHOLD = 0.0001; // Minimum progress change to trigger update\nexport const DEFAULT_SCROLL_LENGTH = '300vh';\n\n// Memory Management\nexport const DEFAULT_LAZY_BUFFER = 10;\nexport const MAX_CACHE_SIZE = 50; // Fallback max size if not dynamic\n\n// Sequences\nexport const DEFAULT_PAD_LENGTH = 0; // Default padding for image numbering\n\n// Styles & Layout\nexport const DEFAULT_FALLBACK_COLOR = '#ccc';\n","import { ScrollLoopManager } from './loopManager';\nimport { SCROLL_THRESHOLD } from '../constants';\n\nexport type TimelineCallback = (progress: number) => void;\n\nexport class ScrollTimeline {\n private container: Element;\n private subscribers = new Set<TimelineCallback>();\n private currentProgress = 0;\n \n // Caching for performance\n private cachedRect: DOMRect | null = null;\n private cachedScrollParent: Element | Window | null = null;\n private cachedScrollParentRect: DOMRect | null = null;\n private cachedViewportHeight = 0;\n private cachedOffsetTop = 0;\n private isLayoutDirty = true;\n private resizeObserver: ResizeObserver | null = null;\n\n public readonly id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\n\n constructor(container: Element) {\n this.container = container;\n \n if (typeof window !== 'undefined') {\n // Invalidate cache on resize\n this.resizeObserver = new ResizeObserver(() => {\n this.isLayoutDirty = true;\n });\n this.resizeObserver.observe(this.container);\n if (document.body) {\n this.resizeObserver.observe(document.body);\n }\n \n // Also listen to global resize\n window.addEventListener('resize', this.onWindowResize);\n }\n }\n\n private onWindowResize = () => {\n this.isLayoutDirty = true;\n };\n\n /**\n * Subscribe to progress updates.\n * Returns an unsubscribe function.\n */\n subscribe(callback: TimelineCallback): () => void {\n this.subscribers.add(callback);\n \n // Immediately call with current progress for initialization\n try {\n callback(this.currentProgress);\n } catch (e) {\n // Silent\n }\n\n // Register with unique LoopManager if we have subscribers\n if (this.subscribers.size === 1) {\n ScrollLoopManager.getInstance().register(this.tick);\n }\n \n return () => {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n ScrollLoopManager.getInstance().unregister(this.tick);\n }\n };\n }\n\n unsubscribe(callback: TimelineCallback): void {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n ScrollLoopManager.getInstance().unregister(this.tick);\n }\n }\n\n /**\n * Start is now handled by LoopManager via subscriptions\n * Deprecated but kept for API stability if needed.\n */\n start(): void {\n // No-op, managed by subscriptions\n }\n\n stop(): void {\n ScrollLoopManager.getInstance().unregister(this.tick);\n }\n\n private tick = (): void => {\n // Calculate Progress\n const progress = this.calculateProgress();\n\n // Notify if changed significantly (using threshold constant)\n if (Math.abs(progress - this.currentProgress) > SCROLL_THRESHOLD) {\n this.currentProgress = progress;\n this.notify();\n }\n };\n\n private notify() {\n this.subscribers.forEach((cb) => {\n try {\n cb(this.currentProgress);\n } catch (e) {\n // Silent\n }\n });\n }\n\n private updateCache() {\n if (!this.isLayoutDirty && this.cachedRect) return;\n\n this.cachedRect = this.container.getBoundingClientRect();\n \n if (!this.cachedScrollParent) {\n this.cachedScrollParent = this.getScrollParent(this.container);\n }\n\n if (this.cachedScrollParent instanceof Element) {\n this.cachedScrollParentRect = this.cachedScrollParent.getBoundingClientRect();\n this.cachedViewportHeight = this.cachedScrollParentRect.height;\n this.cachedOffsetTop = this.cachedScrollParentRect.top;\n } else if (typeof window !== 'undefined') {\n this.cachedViewportHeight = window.innerHeight;\n this.cachedOffsetTop = 0;\n }\n\n this.isLayoutDirty = false;\n }\n\n private calculateProgress(): number {\n if (this.isLayoutDirty || !this.cachedRect) {\n this.updateCache();\n }\n\n const currentRect = this.container.getBoundingClientRect();\n const scrollDist = (this.cachedRect?.height || currentRect.height) - this.cachedViewportHeight;\n\n // Guard: Zero Height / Division by Zero\n if (scrollDist <= 0) return 1;\n\n const relativeTop = currentRect.top - this.cachedOffsetTop;\n const rawProgress = -relativeTop / scrollDist;\n \n const clamped = Math.min(Math.max(rawProgress, 0), 1);\n \n // Round to 6 decimals to prevent micro-drift\n return Math.round(clamped * 1000000) / 1000000;\n }\n\n private getScrollParent(node: Element): Element | Window {\n if (typeof window === 'undefined') return node; \n\n let current = node.parentElement;\n while (current) {\n const style = getComputedStyle(current);\n if (['auto', 'scroll'].includes(style.overflowY)) {\n return current;\n }\n current = current.parentElement;\n }\n return window;\n }\n\n destroy() {\n this.subscribers.clear();\n ScrollLoopManager.getInstance().unregister(this.tick);\n \n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onWindowResize);\n }\n }\n}\n","import React, { useRef, useEffect } from 'react';\nimport { useScrollTimeline } from './useScrollTimeline';\n\nexport interface ScrollTextProps {\n children: React.ReactNode;\n /** Progress start (0-1) where ENTRANCE animation begins */\n start?: number;\n /** Progress end (0-1) where ENTRANCE animation ends */\n end?: number;\n \n /** Progress start (0-1) where EXIT animation begins. If omitted, element stays visible. */\n exitStart?: number;\n /** Progress end (0-1) where EXIT animation ends */\n exitEnd?: number;\n\n /** Initial opacity */\n initialOpacity?: number;\n /** Target opacity (when entered) */\n targetOpacity?: number;\n /** Final opacity (after exit) */\n finalOpacity?: number;\n\n /** Y-axis translation range in pixels (e.g., 50 means move down 50px) */\n translateY?: number;\n \n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function ScrollText({\n children,\n start = 0,\n end = 0.2,\n exitStart,\n exitEnd,\n initialOpacity = 0,\n targetOpacity = 1,\n finalOpacity = 0,\n translateY = 50,\n style,\n className,\n}: ScrollTextProps) {\n const ref = useRef<HTMLDivElement>(null);\n const { subscribe } = useScrollTimeline();\n\n useEffect(() => {\n // Subscribe to updates\n if (typeof window === 'undefined') return;\n\n const unsubscribe = subscribe((progress) => {\n if (!ref.current) return;\n\n // Check for reduced motion preference\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n // If reduced motion is preferred, disable translation (keep opacity fade)\n const effectiveTranslateY = prefersReducedMotion ? 0 : translateY;\n\n let opacity = initialOpacity;\n let currentY = effectiveTranslateY;\n\n // 1. Entrance Phase\n if (progress < start) {\n opacity = initialOpacity;\n currentY = effectiveTranslateY;\n } else if (progress >= start && progress <= end) {\n const local = (progress - start) / (end - start);\n opacity = initialOpacity + (targetOpacity - initialOpacity) * local;\n currentY = effectiveTranslateY * (1 - local);\n } \n // 2. Hold Phase\n else if (!exitStart || progress < exitStart) {\n opacity = targetOpacity;\n currentY = 0;\n }\n // 3. Exit Phase\n else if (exitStart && exitEnd && progress >= exitStart && progress <= exitEnd) {\n const local = (progress - exitStart) / (exitEnd - exitStart);\n opacity = targetOpacity + (finalOpacity - targetOpacity) * local;\n // Move from 0 -> -translateY (or 0 if reduced motion)\n currentY = -effectiveTranslateY * local; \n }\n // 4. Final Phase\n else {\n opacity = finalOpacity;\n currentY = -effectiveTranslateY;\n }\n\n // Apply styles\n ref.current.style.opacity = opacity.toFixed(3);\n ref.current.style.transform = `translateY(${currentY}px)`;\n });\n\n return unsubscribe;\n }, [subscribe, start, end, exitStart, exitEnd, initialOpacity, targetOpacity, finalOpacity, translateY]);\n\n return (\n <div \n ref={ref} \n className={className}\n style={{\n opacity: initialOpacity, \n transform: `translateY(${translateY}px)`,\n transition: 'none', // Critical: no CSS transition fighting JS\n willChange: 'opacity, transform',\n ...style\n }}\n >\n {children}\n </div>\n );\n}\n","import React, { useRef, useEffect } from 'react';\nimport { useScrollTimeline } from './useScrollTimeline';\n\nexport interface ScrollWordRevealProps {\n text: string;\n /** Progress start (0-1) */\n start?: number;\n /** Progress end (0-1) */\n end?: number;\n className?: string;\n style?: React.CSSProperties;\n /** Stagger delay factor (not used in pure scroll map, simpler logic: map word index to sub-progress) */\n}\n\nexport function ScrollWordReveal({\n text,\n start = 0,\n end = 1,\n className,\n style\n}: ScrollWordRevealProps) {\n // We cannot create refs in loop dynamically in top level easily without array.\n // Better to have one parent ref and querySelectorAll children, OR use callback refs.\n const containerRef = useRef<HTMLDivElement>(null);\n const { subscribe } = useScrollTimeline();\n\n // Split words\n const words = text.split(/\\s+/);\n\n useEffect(() => {\n const unsubscribe = subscribe((globalProgress) => {\n if (!containerRef.current) return;\n const spans = containerRef.current.children;\n \n // Map global progress to local range [start, end]\n let localProgress = 0;\n if (globalProgress <= start) localProgress = 0;\n else if (globalProgress >= end) localProgress = 1;\n else localProgress = (globalProgress - start) / (end - start);\n\n // Calculate which word should be visible\n const totalWords = spans.length;\n const progressPerWord = 1 / totalWords;\n\n for (let i = 0; i < totalWords; i++) {\n const span = spans[i] as HTMLElement;\n \n // Each word fades in during its \"slot\"\n // Word 0: 0 -> 0.1\n // Word 1: 0.1 -> 0.2\n const wordStart = i * progressPerWord;\n const wordEnd = (i + 1) * progressPerWord;\n \n let wordOpacity = 0;\n if (localProgress >= wordEnd) {\n wordOpacity = 1;\n } else if (localProgress <= wordStart) {\n wordOpacity = 0.1; // faint visibility initially? or 0\n } else {\n // Interpolate\n wordOpacity = 0.1 + 0.9 * ((localProgress - wordStart) / (wordEnd - wordStart));\n }\n \n span.style.opacity = wordOpacity.toFixed(2);\n // Optional: translate Y too?\n const translate = (1 - wordOpacity) * 10;\n span.style.transform = `translateY(${translate}px)`;\n }\n });\n\n return unsubscribe;\n }, [subscribe, start, end]);\n\n return (\n <div ref={containerRef} className={className} style={{ ...style, display: 'flex', flexWrap: 'wrap', gap: '0.25em' }}>\n {words.map((word, i) => (\n <span \n key={i} \n style={{ \n opacity: 0.1, \n transform: 'translateY(10px)',\n transition: 'none',\n willChange: 'opacity, transform'\n }}\n >\n {word}\n </span>\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","React","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/react/ScrollSequence.tsx","../src/react/useScrollSequence.ts","../src/controllers/imageController.ts","../src/sequence/sequenceResolver.ts","../src/core/clamp.ts","../src/react/scrollTimelineContext.ts","../src/react/useScrollTimeline.ts","../src/react/ScrollTimelineProvider.tsx","../src/core/loopManager.ts","../src/constants.ts","../src/core/scrollTimeline.ts","../src/react/ScrollText.tsx","../src/react/ScrollWordReveal.tsx"],"sourcesContent":["import React, { useRef } from 'react';\r\nimport type { ScrollSequenceProps } from '../types';\r\nimport { useScrollSequence } from './useScrollSequence';\r\nimport { ScrollTimelineProvider } from './ScrollTimelineProvider';\r\n\r\ninterface InnerSequenceProps {\r\n source: ScrollSequenceProps['source'];\r\n debug: boolean;\r\n memoryStrategy: ScrollSequenceProps['memoryStrategy'];\r\n lazyBuffer?: number;\r\n accessibilityLabel?: string;\r\n fallback?: React.ReactNode;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\nconst InnerSequence: React.FC<InnerSequenceProps> = ({ \r\n source, \r\n debug, \r\n memoryStrategy,\r\n lazyBuffer,\r\n accessibilityLabel = \"Scroll sequence\",\r\n fallback,\r\n onError\r\n}) => {\r\n const debugRef = useRef<HTMLDivElement>(null);\r\n const { canvasRef, isLoaded } = useScrollSequence({\r\n source,\r\n debugRef,\r\n memoryStrategy,\r\n lazyBuffer,\r\n onError\r\n });\r\n \r\n // Fallback logic could be handled here or by parent.\r\n // If we handle it here, we overlay it?\r\n // Actually, canvas opacity handles the fade-in.\r\n // Use fallback if provided and not loaded.\r\n\r\n const canvasStyle: React.CSSProperties = {\r\n display: 'block',\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n opacity: isLoaded ? 1 : 0,\r\n transition: 'opacity 0.2s ease-in',\r\n };\r\n \r\n const debugStyle: React.CSSProperties = {\r\n position: 'absolute',\r\n top: '10px',\r\n left: '10px',\r\n background: 'rgba(0, 0, 0, 0.7)',\r\n color: '#00ff00',\r\n padding: '8px',\r\n borderRadius: '4px',\r\n fontFamily: 'monospace',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n whiteSpace: 'pre-wrap',\r\n zIndex: 9999,\r\n };\r\n\r\n return (\r\n <>\r\n {/* Render fallback behind canvas, or replace? \r\n If replace, we might loose the canvas ref init?\r\n Better to render both and cross-fade or just hide fallback when loaded.\r\n */}\r\n {!isLoaded && fallback && (\r\n <div style={{ position: 'absolute', inset: 0, zIndex: 1 }}>\r\n {fallback}\r\n </div>\r\n )}\r\n \r\n <canvas \r\n ref={canvasRef} \r\n style={canvasStyle} \r\n role=\"img\"\r\n aria-label={accessibilityLabel}\r\n />\r\n {debug && <div ref={debugRef} style={debugStyle}>Waiting for scroll...</div>}\r\n </>\r\n );\r\n};\r\n\r\nexport const ScrollSequence = React.forwardRef<HTMLDivElement, ScrollSequenceProps>(\r\n (props, ref) => {\r\n const {\r\n source,\r\n scrollLength = '300vh',\r\n className = '',\r\n debug = false,\r\n memoryStrategy = 'eager',\r\n lazyBuffer = 10,\r\n fallback,\r\n accessibilityLabel,\r\n onError,\r\n } = props;\r\n\r\n // Check for reduced motion\r\n const prefersReducedMotion = React.useMemo(() => {\r\n if (typeof window !== 'undefined') {\r\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n }\r\n return false;\r\n }, []);\r\n\r\n // Use ScrollSequence now acts as the convenient \"Bundle\"\r\n // It provides the Timeline context and renders the Canvas consumer.\r\n return (\r\n <div ref={ref} className={className} style={{ width: '100%' }}>\r\n <ScrollTimelineProvider scrollLength={scrollLength}>\r\n {prefersReducedMotion && fallback ? (\r\n <div style={{ position: 'sticky', top: 0, height: '100vh', width: '100%' }}>\r\n {fallback}\r\n </div>\r\n ) : (\r\n <InnerSequence \r\n source={source} \r\n debug={debug} \r\n memoryStrategy={memoryStrategy}\r\n lazyBuffer={lazyBuffer} \r\n fallback={fallback}\r\n accessibilityLabel={accessibilityLabel}\r\n onError={onError}\r\n />\r\n )}\r\n {props.children}\r\n </ScrollTimelineProvider>\r\n </div>\r\n );\r\n }\r\n);\r\n","import { useRef, useEffect, useState } from 'react';\r\nimport type { ScrollSequenceProps } from '../types';\r\nimport { ImageController } from '../controllers/imageController';\r\nimport { resolveSequence } from '../sequence/sequenceResolver';\r\nimport { clamp } from '../core/clamp';\r\nimport { useScrollTimeline } from './useScrollTimeline';\r\n\r\ninterface UseScrollSequenceParams {\r\n source: ScrollSequenceProps['source'];\r\n debugRef?: React.MutableRefObject<HTMLDivElement | null>;\r\n memoryStrategy?: 'eager' | 'lazy';\r\n lazyBuffer?: number;\r\n onError?: (error: Error) => void;\r\n}\r\n\r\n/**\r\n * Hook to manage image sequence in a timeline context.\r\n * MUST be used inside ScrollTimelineProvider.\r\n */\r\nexport function useScrollSequence({\r\n source,\r\n debugRef,\r\n memoryStrategy = 'eager',\r\n lazyBuffer = 10,\r\n onError,\r\n}: UseScrollSequenceParams) {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const controllerRef = useRef<ImageController | null>(null);\r\n \r\n // Use the shared timeline\r\n const { subscribe } = useScrollTimeline();\r\n\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n useEffect(() => {\r\n let active = true;\r\n let currentController: ImageController | null = null;\r\n let unsubscribeTimeline: (() => void) | null = null;\r\n\r\n const init = async () => {\r\n setIsLoaded(false);\r\n setError(null);\r\n\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n try {\r\n // 1. Resolve Sequence\r\n // Guard: source change handled by effect dep, but verify environment?\r\n if (typeof window === 'undefined') return;\r\n\r\n const sequence = await resolveSequence(source);\r\n if (!active) return;\r\n\r\n if (sequence.frames.length === 0) {\r\n return;\r\n }\r\n\r\n // 2. Setup Dimensions (Initial)\r\n if (typeof window !== 'undefined') {\r\n canvas.width = window.innerWidth;\r\n canvas.height = window.innerHeight;\r\n }\r\n\r\n // 3. Initialize Controller\r\n currentController = new ImageController({\r\n canvas,\r\n frames: sequence.frames,\r\n strategy: memoryStrategy,\r\n bufferSize: lazyBuffer\r\n });\r\n controllerRef.current = currentController;\r\n\r\n // 4. Subscribe to Timeline\r\n unsubscribeTimeline = subscribe((progress) => {\r\n if (!currentController) return;\r\n const clamped = clamp(progress);\r\n currentController.update(clamped);\r\n\r\n // Debug Overlay\r\n if (debugRef?.current) {\r\n const frameIndex = Math.floor(clamped * (sequence.frames.length - 1));\r\n debugRef.current.innerText = `Progress: ${clamped.toFixed(2)}\\nFrame: ${frameIndex + 1} / ${sequence.frames.length}`;\r\n }\r\n });\r\n\r\n if (active) setIsLoaded(true);\r\n\r\n } catch (err) {\r\n if (active) {\r\n const e = err instanceof Error ? err : new Error('Unknown initialization error');\r\n setError(e);\r\n if (onError) onError(e);\r\n }\r\n }\r\n };\r\n\r\n init();\r\n\r\n return () => {\r\n active = false;\r\n currentController?.destroy();\r\n controllerRef.current = null;\r\n if (unsubscribeTimeline) unsubscribeTimeline();\r\n };\r\n }, [source, memoryStrategy, lazyBuffer, subscribe]); // Re-run if source or timeline changes\r\n\r\n return {\r\n canvasRef,\r\n isLoaded,\r\n error\r\n };\r\n}\r\n","/**\r\n * ImageController\r\n * Manages canvas rendering, image loading, and frame-by-frame drawing.\r\n * Handles preloading and caching to minimize redraws.\r\n */\r\n\r\nexport interface ImageControllerConfig {\r\n /** HTMLCanvasElement to draw on */\r\n canvas: HTMLCanvasElement;\r\n\r\n /** Array of sorted frame URLs */\r\n frames: string[];\r\n\r\n /** Memory management strategy */\r\n strategy?: 'eager' | 'lazy';\r\n\r\n /** Lazy load buffer size (default 10) */\r\n bufferSize?: number;\r\n}\r\n\r\nexport class ImageController {\r\n private canvas: HTMLCanvasElement;\r\n private ctx: CanvasRenderingContext2D;\r\n private frames: string[];\r\n private imageCache = new Map<string, HTMLImageElement>();\r\n private loadingPromises = new Map<string, Promise<HTMLImageElement>>();\r\n private currentFrameIndex = -1;\r\n private strategy: 'eager' | 'lazy';\r\n private bufferSize: number;\r\n\r\n /**\r\n * Create a new ImageController instance.\r\n *\r\n * @param config - Configuration object\r\n * @throws If canvas doesn't support 2D context\r\n */\r\n private isDestroyed = false;\r\n\r\n constructor(config: ImageControllerConfig) {\r\n this.canvas = config.canvas;\r\n this.frames = config.frames;\r\n this.strategy = config.strategy || 'eager';\r\n this.bufferSize = config.bufferSize || 10;\r\n\r\n const ctx = this.canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('Failed to get 2D context from canvas');\r\n }\r\n this.ctx = ctx;\r\n\r\n // Initial load\r\n if (this.strategy === 'eager') {\r\n this.preloadAll();\r\n } else {\r\n this.ensureFrameWindow(0);\r\n }\r\n }\r\n\r\n // ... preloadAll omitted for brevity if unchanged, but let's include for completeness if needed.\r\n // Actually, we need to add guards to preloadFrame, so let's check it.\r\n \r\n private preloadAll(): void {\r\n this.frames.forEach((_, index) => this.preloadFrame(index));\r\n }\r\n\r\n private ensureFrameWindow(currentIndex: number): void {\r\n if (this.isDestroyed) return;\r\n\r\n const radius = this.bufferSize;\r\n const start = Math.max(0, currentIndex - radius);\r\n const end = Math.min(this.frames.length - 1, currentIndex + radius);\r\n \r\n const needed = new Set<string>();\r\n for (let i = start; i <= end; i++) {\r\n needed.add(this.frames[i]);\r\n }\r\n\r\n // Cleanup unused frames (LRU-ish but simple Window-based)\r\n for (const [src] of this.imageCache) {\r\n if (!needed.has(src)) {\r\n this.imageCache.delete(src);\r\n // We should also cancel promises if possible, but we can't cancel a fetch/image load easily.\r\n // We just delete the tracking so we don't cache it when it lands.\r\n this.loadingPromises.delete(src);\r\n }\r\n }\r\n\r\n // Load needed\r\n for (let i = start; i <= end; i++) {\r\n void this.preloadFrame(i);\r\n }\r\n }\r\n\r\n async preloadFrame(index: number): Promise<void> {\r\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\r\n\r\n const src = this.frames[index];\r\n\r\n if (this.imageCache.has(src)) return;\r\n\r\n // Deduplication: Reuse existing promise if allowed\r\n if (!this.loadingPromises.has(src)) {\r\n this.loadingPromises.set(src, this.loadImage(src));\r\n }\r\n\r\n try {\r\n await this.loadingPromises.get(src);\r\n } catch {\r\n // Failed\r\n if (!this.isDestroyed) {\r\n // Silent failure\r\n }\r\n }\r\n }\r\n\r\n private loadImage(src: string): Promise<HTMLImageElement> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n \r\n img.onload = () => {\r\n if (this.isDestroyed) return;\r\n \r\n // Critical: decode() to prevent main-thread jank during draw\r\n img.decode()\r\n .then(() => {\r\n if (this.isDestroyed) return;\r\n this.imageCache.set(src, img);\r\n resolve(img);\r\n })\r\n .catch(() => {\r\n if (this.isDestroyed) return;\r\n // Even if decode fails, the image might be usable\r\n this.imageCache.set(src, img);\r\n resolve(img);\r\n });\r\n };\r\n\r\n img.onerror = () => {\r\n if (this.isDestroyed) return;\r\n reject(new Error(`Failed to load image: ${src}`));\r\n };\r\n\r\n img.src = src;\r\n });\r\n }\r\n\r\n update(progress: number): void {\r\n if (this.isDestroyed || this.frames.length === 0) return;\r\n\r\n const frameIndex = Math.floor(progress * (this.frames.length - 1));\r\n\r\n if (this.strategy === 'lazy') {\r\n this.ensureFrameWindow(frameIndex);\r\n }\r\n\r\n if (frameIndex === this.currentFrameIndex) return;\r\n\r\n this.currentFrameIndex = frameIndex;\r\n this.drawFrame(frameIndex);\r\n }\r\n\r\n private drawFrame(index: number): void {\r\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\r\n\r\n const src = this.frames[index];\r\n const img = this.imageCache.get(src);\r\n\r\n if (!img) {\r\n // Frame not ready. Optional: Show loading spinner or keep previous frame?\r\n // For now, keep previous (natural behavior of canvas).\r\n // Or check promise\r\n const promise = this.loadingPromises.get(src);\r\n if (promise) {\r\n promise.then(() => {\r\n if (this.currentFrameIndex === index) {\r\n this.drawFrame(index);\r\n }\r\n }).catch(() => {}); // catch ignore\r\n }\r\n return;\r\n }\r\n\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n\r\n const scale = Math.min(\r\n this.canvas.width / img.width,\r\n this.canvas.height / img.height\r\n );\r\n\r\n const scaledWidth = img.width * scale;\r\n const scaledHeight = img.height * scale;\r\n const x = (this.canvas.width - scaledWidth) / 2;\r\n const y = (this.canvas.height - scaledHeight) / 2;\r\n\r\n this.ctx.drawImage(img, x, y, scaledWidth, scaledHeight);\r\n }\r\n\r\n setCanvasSize(width: number, height: number): void {\r\n if (this.isDestroyed) return;\r\n this.canvas.width = width;\r\n this.canvas.height = height;\r\n if (this.currentFrameIndex >= 0) {\r\n this.drawFrame(this.currentFrameIndex);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.isDestroyed = true;\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.imageCache.clear();\r\n this.loadingPromises.clear();\r\n }\r\n}\r\n","/**\r\n * SequenceResolver\r\n * Handles intelligent frame resolution from multiple input sources:\r\n * - Manual frame list (frames[])\r\n * - Pattern generation (pattern, start, end, pad)\r\n * - Remote manifest (manifest URL)\r\n */\r\n\r\nimport type { ScrollSequenceProps, ResolvedSequence } from '../types';\r\n\r\n// Declare process for TS (avoiding @types/node dependency for just this)\r\ndeclare const process: { env: { NODE_ENV: string } };\r\n\r\n/**\r\n * Resolves frame sequence from props.\r\n * Prioritizes: frames > pattern > manifest\r\n */\r\n/**\r\n * Resolves frame sequence from props.\r\n * Handles 'manual', 'pattern', and 'manifest' sources.\r\n */\r\nexport async function resolveSequence(source: ScrollSequenceProps['source']): Promise<ResolvedSequence> {\r\n switch (source.type) {\r\n case 'manual':\r\n return processManualFrames(source.frames);\r\n \r\n case 'pattern':\r\n return processPatternMode(source.url, source.start ?? 1, source.end, source.pad);\r\n \r\n case 'manifest':\r\n return processManifestMode(source.url);\r\n \r\n default:\r\n return { frames: [], frameCount: 0 };\r\n }\r\n}\r\n\r\n/**\r\n * Mode A: Process manually provided frames\r\n */\r\nfunction processManualFrames(frames: string[]): ResolvedSequence {\r\n // Sort frames numerically by extracting numbers from filenames\r\n // Uses stable sort to preserve order for frames with no numbers or equal numbers\r\n const sorted = [...frames].sort((a, b) => {\r\n const numA = extractNumber(a);\r\n const numB = extractNumber(b);\r\n return numA - numB;\r\n });\r\n\r\n return {\r\n frames: sorted,\r\n frameCount: sorted.length\r\n };\r\n}\r\n\r\n/**\r\n * Mode B: Generate frames from pattern\r\n */\r\nfunction processPatternMode(pattern: string, start: number, end: number, pad?: number): ResolvedSequence {\r\n const frames: string[] = [];\r\n\r\n for (let i = start; i <= end; i++) {\r\n let indexStr = i.toString();\r\n if (pad) {\r\n indexStr = indexStr.padStart(pad, '0');\r\n }\r\n frames.push(pattern.replace('{index}', indexStr));\r\n }\r\n\r\n return {\r\n frames,\r\n frameCount: frames.length\r\n };\r\n}\r\n\r\n/**\r\n * Mode C: Fetch and process manifest\r\n */\r\nconst manifestCache = new Map<string, Promise<ResolvedSequence>>();\r\n\r\nasync function processManifestMode(url: string): Promise<ResolvedSequence> {\r\n if (manifestCache.has(url)) {\r\n return manifestCache.get(url)!;\r\n }\r\n\r\n const promise = (async () => {\r\n try {\r\n const res = await fetch(url);\r\n if (!res.ok) {\r\n throw new Error(`Failed to fetch manifest: ${res.statusText}`);\r\n }\r\n \r\n const data = await res.json();\r\n \r\n // Check for \"frames\" array in manifest\r\n if (data.frames && Array.isArray(data.frames)) {\r\n return processManualFrames(data.frames);\r\n }\r\n \r\n // Check for pattern config in manifest\r\n if (data.pattern && typeof data.end === 'number') {\r\n const start = data.start ?? 1;\r\n const pad = data.pad;\r\n return processPatternMode(data.pattern, start, data.end, pad);\r\n }\r\n \r\n return { frames: [], frameCount: 0 };\r\n \r\n } catch (err) {\r\n // Remove from cache on error so retry is possible\r\n manifestCache.delete(url);\r\n throw err;\r\n }\r\n })();\r\n\r\n manifestCache.set(url, promise);\r\n return promise;\r\n}\r\n\r\n// --- Helpers ---\r\n\r\n/**\r\n * Extract the first number found in a filename.\r\n * Returns -1 if no number is found, to differentiate from 0.\r\n */\r\nfunction extractNumber(filename: string): number {\r\n const match = filename.match(/\\d+/);\r\n return match ? parseInt(match[0], 10) : -1;\r\n}\r\n\r\n","/**\r\n * Clamps a value between a minimum and maximum.\r\n * Default range is [0, 1], suitable for progress values.\r\n *\r\n * @param value - The value to clamp\r\n * @param min - Minimum value (default: 0)\r\n * @param max - Maximum value (default: 1)\r\n * @returns The clamped value\r\n */\r\nexport function clamp(value: number, min: number = 0, max: number = 1): number {\r\n return Math.max(min, Math.min(max, value));\r\n}\r\n","import { createContext, useContext } from 'react';\r\nimport { ScrollTimeline } from '../core/scrollTimeline';\r\n\r\nexport interface ScrollTimelineContextValue {\r\n timeline: ScrollTimeline | null;\r\n // Expose current progress? No, that causes re-renders. Use subscription.\r\n}\r\n\r\nexport const ScrollTimelineContext = createContext<ScrollTimelineContextValue>({\r\n timeline: null,\r\n});\r\n\r\nexport function useTimelineContext() {\r\n return useContext(ScrollTimelineContext);\r\n}\r\n","import { ScrollTimeline, TimelineCallback } from '../core/scrollTimeline';\r\nimport { useTimelineContext } from './scrollTimelineContext';\r\n\r\nexport interface UseScrollTimelineResult {\r\n /** \r\n * Manual subscription to the timeline. \r\n * Useful for low-level DOM updates (refs) without re-rendering.\r\n */\r\n subscribe: (callback: TimelineCallback) => () => void;\r\n \r\n /** The raw timeline instance (for advanced usage) */\r\n timeline: ScrollTimeline | null; \r\n}\r\n\r\nexport function useScrollTimeline(): UseScrollTimelineResult {\r\n const { timeline } = useTimelineContext();\r\n\r\n const subscribe = (callback: TimelineCallback) => {\r\n if (!timeline) return () => {};\r\n return timeline.subscribe(callback);\r\n };\r\n\r\n return { subscribe, timeline };\r\n}\r\n","import React, { useRef, useState } from 'react';\r\nimport { ScrollTimeline } from '../core/scrollTimeline';\r\nimport { ScrollTimelineContext } from './scrollTimelineContext';\r\n\r\nexport interface ScrollTimelineProviderProps {\r\n children: React.ReactNode;\r\n \r\n /** CSS height for the scroll container (e.g., \"300vh\"). */\r\n scrollLength?: string;\r\n \r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport function ScrollTimelineProvider({\r\n children,\r\n scrollLength = '300vh',\r\n className = '',\r\n style = {},\r\n}: ScrollTimelineProviderProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [timeline, setTimeline] = useState<ScrollTimeline | null>(null);\r\n\r\n // Use layout effect to ensure timeline exists before children effects run\r\n // SSR safe fallback: use useEffect on server\r\n const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n if (!containerRef.current) return;\r\n\r\n // Future-proof: factory could be passed via props\r\n const instance = new ScrollTimeline(containerRef.current);\r\n \r\n // We do NOT call start() anymore, it starts on subscription\r\n // instance.start(); \r\n \r\n setTimeline(instance);\r\n\r\n return () => {\r\n instance.destroy();\r\n setTimeline(null);\r\n };\r\n }, []); // Dependencies? strict empty for one-time setup\r\n\r\n const containerStyle: React.CSSProperties = {\r\n height: scrollLength,\r\n position: 'relative',\r\n width: '100%',\r\n ...style,\r\n };\r\n\r\n const stickyWrapperStyle: React.CSSProperties = {\r\n position: 'sticky',\r\n top: 0,\r\n height: '100vh',\r\n width: '100%',\r\n overflow: 'hidden',\r\n };\r\n\r\n // Memoize context value to prevent unnecessary re-renders of consumers\r\n // when Parent component renders but timeline instance hasn't changed.\r\n const contextValue = React.useMemo(() => ({ timeline }), [timeline]);\r\n\r\n return (\r\n <ScrollTimelineContext.Provider value={contextValue}>\r\n <div \r\n ref={containerRef} \r\n className={className} \r\n style={containerStyle}\r\n >\r\n <div style={stickyWrapperStyle}>\r\n {children}\r\n </div>\r\n </div>\r\n </ScrollTimelineContext.Provider>\r\n );\r\n}\r\n","/**\r\n * ScrollLoopManager\r\n * \r\n * Singleton class to manage a single requestAnimationFrame loop\r\n * for all ScrollTimeline instances. This prevents multiple RAF\r\n * callbacks from piling up and degrading performance.\r\n */\r\n\r\ntype LoopCallback = () => void;\r\n\r\nexport class ScrollLoopManager {\r\n private static instance: ScrollLoopManager;\r\n private callbacks = new Set<LoopCallback>();\r\n private rafId: number | null = null;\r\n private isActive = false;\r\n\r\n private constructor() {}\r\n\r\n public static getInstance(): ScrollLoopManager {\r\n if (!ScrollLoopManager.instance) {\r\n ScrollLoopManager.instance = new ScrollLoopManager();\r\n }\r\n return ScrollLoopManager.instance;\r\n }\r\n\r\n /**\r\n * Register a callback to be called on every animation frame.\r\n */\r\n public register(callback: LoopCallback): void {\r\n if (this.callbacks.has(callback)) return;\r\n \r\n this.callbacks.add(callback);\r\n \r\n // Start loop if this is the first subscriber\r\n if (this.callbacks.size === 1) {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n * Unregister a callback.\r\n */\r\n public unregister(callback: LoopCallback): void {\r\n this.callbacks.delete(callback);\r\n\r\n // Stop loop if no subscribers left\r\n if (this.callbacks.size === 0) {\r\n this.stop();\r\n }\r\n }\r\n\r\n private start(): void {\r\n if (this.isActive) return;\r\n this.isActive = true;\r\n \r\n // Ensure we are in a browser environment\r\n if (typeof window !== 'undefined') {\r\n this.tick();\r\n }\r\n }\r\n\r\n private stop(): void {\r\n this.isActive = false;\r\n if (this.rafId !== null && typeof window !== 'undefined') {\r\n cancelAnimationFrame(this.rafId);\r\n this.rafId = null;\r\n }\r\n }\r\n\r\n private tick = (): void => {\r\n if (!this.isActive) return;\r\n\r\n // Execute all registered callbacks\r\n this.callbacks.forEach(cb => {\r\n try {\r\n cb();\r\n } catch (e) {\r\n // Silent catch to prevent loop crash\r\n }\r\n });\r\n\r\n this.rafId = requestAnimationFrame(this.tick);\r\n };\r\n}\r\n","/**\r\n * Global Constants for React Scroll Media\r\n */\r\n\r\n// Scroll Logic\r\nexport const SCROLL_THRESHOLD = 0.0001; // Minimum progress change to trigger update\r\nexport const DEFAULT_SCROLL_LENGTH = '300vh';\r\n\r\n// Memory Management\r\nexport const DEFAULT_LAZY_BUFFER = 10;\r\nexport const MAX_CACHE_SIZE = 50; // Fallback max size if not dynamic\r\n\r\n// Sequences\r\nexport const DEFAULT_PAD_LENGTH = 0; // Default padding for image numbering\r\n\r\n// Styles & Layout\r\nexport const DEFAULT_FALLBACK_COLOR = '#ccc';\r\n","import { ScrollLoopManager } from './loopManager';\r\nimport { SCROLL_THRESHOLD } from '../constants';\r\n\r\nexport type TimelineCallback = (progress: number) => void;\r\n\r\nexport class ScrollTimeline {\r\n private container: Element;\r\n private subscribers = new Set<TimelineCallback>();\r\n private currentProgress = 0;\r\n \r\n // Caching for performance\r\n private cachedRect: DOMRect | null = null;\r\n private cachedScrollParent: Element | Window | null = null;\r\n private cachedScrollParentRect: DOMRect | null = null;\r\n private cachedViewportHeight = 0;\r\n private cachedOffsetTop = 0;\r\n private isLayoutDirty = true;\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n public readonly id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\r\n\r\n constructor(container: Element) {\r\n this.container = container;\r\n \r\n if (typeof window !== 'undefined') {\r\n // Invalidate cache on resize\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.isLayoutDirty = true;\r\n });\r\n this.resizeObserver.observe(this.container);\r\n if (document.body) {\r\n this.resizeObserver.observe(document.body);\r\n }\r\n \r\n // Also listen to global resize\r\n window.addEventListener('resize', this.onWindowResize);\r\n }\r\n }\r\n\r\n private onWindowResize = () => {\r\n this.isLayoutDirty = true;\r\n };\r\n\r\n /**\r\n * Subscribe to progress updates.\r\n * Returns an unsubscribe function.\r\n */\r\n subscribe(callback: TimelineCallback): () => void {\r\n this.subscribers.add(callback);\r\n \r\n // Immediately call with current progress for initialization\r\n try {\r\n callback(this.currentProgress);\r\n } catch (e) {\r\n // Silent\r\n }\r\n\r\n // Register with unique LoopManager if we have subscribers\r\n if (this.subscribers.size === 1) {\r\n ScrollLoopManager.getInstance().register(this.tick);\r\n }\r\n \r\n return () => {\r\n this.subscribers.delete(callback);\r\n if (this.subscribers.size === 0) {\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n }\r\n };\r\n }\r\n\r\n unsubscribe(callback: TimelineCallback): void {\r\n this.subscribers.delete(callback);\r\n if (this.subscribers.size === 0) {\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n }\r\n }\r\n\r\n /**\r\n * Start is now handled by LoopManager via subscriptions\r\n * Deprecated but kept for API stability if needed.\r\n */\r\n start(): void {\r\n // No-op, managed by subscriptions\r\n }\r\n\r\n stop(): void {\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n }\r\n\r\n private tick = (): void => {\r\n // Calculate Progress\r\n const progress = this.calculateProgress();\r\n\r\n // Notify if changed significantly (using threshold constant)\r\n if (Math.abs(progress - this.currentProgress) > SCROLL_THRESHOLD) {\r\n this.currentProgress = progress;\r\n this.notify();\r\n }\r\n };\r\n\r\n private notify() {\r\n this.subscribers.forEach((cb) => {\r\n try {\r\n cb(this.currentProgress);\r\n } catch (e) {\r\n // Silent\r\n }\r\n });\r\n }\r\n\r\n private updateCache() {\r\n if (!this.isLayoutDirty && this.cachedRect) return;\r\n\r\n this.cachedRect = this.container.getBoundingClientRect();\r\n \r\n if (!this.cachedScrollParent) {\r\n this.cachedScrollParent = this.getScrollParent(this.container);\r\n }\r\n\r\n if (this.cachedScrollParent instanceof Element) {\r\n this.cachedScrollParentRect = this.cachedScrollParent.getBoundingClientRect();\r\n this.cachedViewportHeight = this.cachedScrollParentRect.height;\r\n this.cachedOffsetTop = this.cachedScrollParentRect.top;\r\n } else if (typeof window !== 'undefined') {\r\n this.cachedViewportHeight = window.innerHeight;\r\n this.cachedOffsetTop = 0;\r\n }\r\n\r\n this.isLayoutDirty = false;\r\n }\r\n\r\n private calculateProgress(): number {\r\n if (this.isLayoutDirty || !this.cachedRect) {\r\n this.updateCache();\r\n }\r\n\r\n const currentRect = this.container.getBoundingClientRect();\r\n const scrollDist = (this.cachedRect?.height || currentRect.height) - this.cachedViewportHeight;\r\n\r\n // Guard: Zero Height / Division by Zero\r\n if (scrollDist <= 0) return 1;\r\n\r\n const relativeTop = currentRect.top - this.cachedOffsetTop;\r\n const rawProgress = -relativeTop / scrollDist;\r\n \r\n const clamped = Math.min(Math.max(rawProgress, 0), 1);\r\n \r\n // Round to 6 decimals to prevent micro-drift\r\n return Math.round(clamped * 1000000) / 1000000;\r\n }\r\n\r\n private getScrollParent(node: Element): Element | Window {\r\n if (typeof window === 'undefined') return node; \r\n\r\n let current = node.parentElement;\r\n while (current) {\r\n const style = getComputedStyle(current);\r\n if (['auto', 'scroll'].includes(style.overflowY)) {\r\n return current;\r\n }\r\n current = current.parentElement;\r\n }\r\n return window;\r\n }\r\n\r\n destroy() {\r\n this.subscribers.clear();\r\n ScrollLoopManager.getInstance().unregister(this.tick);\r\n \r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (typeof window !== 'undefined') {\r\n window.removeEventListener('resize', this.onWindowResize);\r\n }\r\n }\r\n}\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { useScrollTimeline } from './useScrollTimeline';\r\n\r\nexport interface ScrollTextProps {\r\n children: React.ReactNode;\r\n /** Progress start (0-1) where ENTRANCE animation begins */\r\n start?: number;\r\n /** Progress end (0-1) where ENTRANCE animation ends */\r\n end?: number;\r\n \r\n /** Progress start (0-1) where EXIT animation begins. If omitted, element stays visible. */\r\n exitStart?: number;\r\n /** Progress end (0-1) where EXIT animation ends */\r\n exitEnd?: number;\r\n\r\n /** Initial opacity */\r\n initialOpacity?: number;\r\n /** Target opacity (when entered) */\r\n targetOpacity?: number;\r\n /** Final opacity (after exit) */\r\n finalOpacity?: number;\r\n\r\n /** Y-axis translation range in pixels (e.g., 50 means move down 50px) */\r\n translateY?: number;\r\n \r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\nexport function ScrollText({\r\n children,\r\n start = 0,\r\n end = 0.2,\r\n exitStart,\r\n exitEnd,\r\n initialOpacity = 0,\r\n targetOpacity = 1,\r\n finalOpacity = 0,\r\n translateY = 50,\r\n style,\r\n className,\r\n}: ScrollTextProps) {\r\n const ref = useRef<HTMLDivElement>(null);\r\n const { subscribe } = useScrollTimeline();\r\n\r\n useEffect(() => {\r\n // Subscribe to updates\r\n if (typeof window === 'undefined') return;\r\n\r\n const unsubscribe = subscribe((progress) => {\r\n if (!ref.current) return;\r\n\r\n // Check for reduced motion preference\r\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n // If reduced motion is preferred, disable translation (keep opacity fade)\r\n const effectiveTranslateY = prefersReducedMotion ? 0 : translateY;\r\n\r\n let opacity = initialOpacity;\r\n let currentY = effectiveTranslateY;\r\n\r\n // 1. Entrance Phase\r\n if (progress < start) {\r\n opacity = initialOpacity;\r\n currentY = effectiveTranslateY;\r\n } else if (progress >= start && progress <= end) {\r\n const local = (progress - start) / (end - start);\r\n opacity = initialOpacity + (targetOpacity - initialOpacity) * local;\r\n currentY = effectiveTranslateY * (1 - local);\r\n } \r\n // 2. Hold Phase\r\n else if (!exitStart || progress < exitStart) {\r\n opacity = targetOpacity;\r\n currentY = 0;\r\n }\r\n // 3. Exit Phase\r\n else if (exitStart && exitEnd && progress >= exitStart && progress <= exitEnd) {\r\n const local = (progress - exitStart) / (exitEnd - exitStart);\r\n opacity = targetOpacity + (finalOpacity - targetOpacity) * local;\r\n // Move from 0 -> -translateY (or 0 if reduced motion)\r\n currentY = -effectiveTranslateY * local; \r\n }\r\n // 4. Final Phase\r\n else {\r\n opacity = finalOpacity;\r\n currentY = -effectiveTranslateY;\r\n }\r\n\r\n // Apply styles\r\n ref.current.style.opacity = opacity.toFixed(3);\r\n ref.current.style.transform = `translateY(${currentY}px)`;\r\n });\r\n\r\n return unsubscribe;\r\n }, [subscribe, start, end, exitStart, exitEnd, initialOpacity, targetOpacity, finalOpacity, translateY]);\r\n\r\n return (\r\n <div \r\n ref={ref} \r\n className={className}\r\n style={{\r\n opacity: initialOpacity, \r\n transform: `translateY(${translateY}px)`,\r\n transition: 'none', // Critical: no CSS transition fighting JS\r\n willChange: 'opacity, transform',\r\n ...style\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { useScrollTimeline } from './useScrollTimeline';\r\n\r\nexport interface ScrollWordRevealProps {\r\n text: string;\r\n /** Progress start (0-1) */\r\n start?: number;\r\n /** Progress end (0-1) */\r\n end?: number;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n /** Stagger delay factor (not used in pure scroll map, simpler logic: map word index to sub-progress) */\r\n}\r\n\r\nexport function ScrollWordReveal({\r\n text,\r\n start = 0,\r\n end = 1,\r\n className,\r\n style\r\n}: ScrollWordRevealProps) {\r\n // We cannot create refs in loop dynamically in top level easily without array.\r\n // Better to have one parent ref and querySelectorAll children, OR use callback refs.\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const { subscribe } = useScrollTimeline();\r\n\r\n // Split words\r\n const words = text.split(/\\s+/);\r\n\r\n useEffect(() => {\r\n const unsubscribe = subscribe((globalProgress) => {\r\n if (!containerRef.current) return;\r\n const spans = containerRef.current.children;\r\n \r\n // Map global progress to local range [start, end]\r\n let localProgress = 0;\r\n if (globalProgress <= start) localProgress = 0;\r\n else if (globalProgress >= end) localProgress = 1;\r\n else localProgress = (globalProgress - start) / (end - start);\r\n\r\n // Calculate which word should be visible\r\n const totalWords = spans.length;\r\n const progressPerWord = 1 / totalWords;\r\n\r\n for (let i = 0; i < totalWords; i++) {\r\n const span = spans[i] as HTMLElement;\r\n \r\n // Each word fades in during its \"slot\"\r\n // Word 0: 0 -> 0.1\r\n // Word 1: 0.1 -> 0.2\r\n const wordStart = i * progressPerWord;\r\n const wordEnd = (i + 1) * progressPerWord;\r\n \r\n let wordOpacity = 0;\r\n if (localProgress >= wordEnd) {\r\n wordOpacity = 1;\r\n } else if (localProgress <= wordStart) {\r\n wordOpacity = 0.1; // faint visibility initially? or 0\r\n } else {\r\n // Interpolate\r\n wordOpacity = 0.1 + 0.9 * ((localProgress - wordStart) / (wordEnd - wordStart));\r\n }\r\n \r\n span.style.opacity = wordOpacity.toFixed(2);\r\n // Optional: translate Y too?\r\n const translate = (1 - wordOpacity) * 10;\r\n span.style.transform = `translateY(${translate}px)`;\r\n }\r\n });\r\n\r\n return unsubscribe;\r\n }, [subscribe, start, end]);\r\n\r\n return (\r\n <div ref={containerRef} className={className} style={{ ...style, display: 'flex', flexWrap: 'wrap', gap: '0.25em' }}>\r\n {words.map((word, i) => (\r\n <span \r\n key={i} \r\n style={{ \r\n opacity: 0.1, \r\n transform: 'translateY(10px)',\r\n transition: 'none',\r\n willChange: 'opacity, transform'\r\n }}\r\n >\r\n {word}\r\n </span>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["React","useRef","useRef","useState","useRef","useState","jsx","useRef","React","useRef","useEffect","jsx","useRef","useEffect","useRef","useEffect","jsx","useRef","useEffect"]}
{"version":3,"sources":["../src/react/ScrollSequence.tsx","../src/react/useScrollSequence.ts","../src/controllers/imageController.ts","../src/sequence/sequenceResolver.ts","../src/core/clamp.ts","../src/react/scrollTimelineContext.ts","../src/react/useScrollTimeline.ts","../src/react/ScrollTimelineProvider.tsx","../src/core/loopManager.ts","../src/constants.ts","../src/core/scrollTimeline.ts","../src/react/ScrollText.tsx","../src/react/ScrollWordReveal.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport type { ScrollSequenceProps } from '../types';\nimport { useScrollSequence } from './useScrollSequence';\nimport { ScrollTimelineProvider } from './ScrollTimelineProvider';\n\ninterface InnerSequenceProps {\n source: ScrollSequenceProps['source'];\n debug: boolean;\n memoryStrategy: ScrollSequenceProps['memoryStrategy'];\n lazyBuffer?: number;\n accessibilityLabel?: string;\n fallback?: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\nconst InnerSequence: React.FC<InnerSequenceProps> = ({ \n source, \n debug, \n memoryStrategy,\n lazyBuffer,\n accessibilityLabel = \"Scroll sequence\",\n fallback,\n onError\n}) => {\n const debugRef = useRef<HTMLDivElement>(null);\n const { canvasRef, isLoaded } = useScrollSequence({\n source,\n debugRef,\n memoryStrategy,\n lazyBuffer,\n onError\n });\n \n // Fallback logic could be handled here or by parent.\n // If we handle it here, we overlay it?\n // Actually, canvas opacity handles the fade-in.\n // Use fallback if provided and not loaded.\n\n const canvasStyle: React.CSSProperties = {\n display: 'block',\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n opacity: isLoaded ? 1 : 0,\n transition: 'opacity 0.2s ease-in',\n };\n \n const debugStyle: React.CSSProperties = {\n position: 'absolute',\n top: '10px',\n left: '10px',\n background: 'rgba(0, 0, 0, 0.7)',\n color: '#00ff00',\n padding: '8px',\n borderRadius: '4px',\n fontFamily: 'monospace',\n fontSize: '12px',\n pointerEvents: 'none',\n whiteSpace: 'pre-wrap',\n zIndex: 9999,\n };\n\n return (\n <>\n {/* Render fallback behind canvas, or replace? \n If replace, we might loose the canvas ref init?\n Better to render both and cross-fade or just hide fallback when loaded.\n */}\n {!isLoaded && fallback && (\n <div style={{ position: 'absolute', inset: 0, zIndex: 1 }}>\n {fallback}\n </div>\n )}\n \n <canvas \n ref={canvasRef} \n style={canvasStyle} \n role=\"img\"\n aria-label={accessibilityLabel}\n />\n {debug && <div ref={debugRef} style={debugStyle}>Waiting for scroll...</div>}\n </>\n );\n};\n\nexport const ScrollSequence = React.forwardRef<HTMLDivElement, ScrollSequenceProps>(\n (props, ref) => {\n const {\n source,\n scrollLength = '300vh',\n className = '',\n debug = false,\n memoryStrategy = 'eager',\n lazyBuffer = 10,\n fallback,\n accessibilityLabel,\n onError,\n } = props;\n\n // Check for reduced motion\n const prefersReducedMotion = React.useMemo(() => {\n if (typeof window !== 'undefined') {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n return false;\n }, []);\n\n // Use ScrollSequence now acts as the convenient \"Bundle\"\n // It provides the Timeline context and renders the Canvas consumer.\n return (\n <div ref={ref} className={className} style={{ width: '100%' }}>\n <ScrollTimelineProvider scrollLength={scrollLength}>\n {prefersReducedMotion && fallback ? (\n <div style={{ position: 'sticky', top: 0, height: '100vh', width: '100%' }}>\n {fallback}\n </div>\n ) : (\n <InnerSequence \n source={source} \n debug={debug} \n memoryStrategy={memoryStrategy}\n lazyBuffer={lazyBuffer} \n fallback={fallback}\n accessibilityLabel={accessibilityLabel}\n onError={onError}\n />\n )}\n {props.children}\n </ScrollTimelineProvider>\n </div>\n );\n }\n);\n","import { useRef, useEffect, useState } from 'react';\nimport type { ScrollSequenceProps } from '../types';\nimport { ImageController } from '../controllers/imageController';\nimport { resolveSequence } from '../sequence/sequenceResolver';\nimport { clamp } from '../core/clamp';\nimport { useScrollTimeline } from './useScrollTimeline';\n\ninterface UseScrollSequenceParams {\n source: ScrollSequenceProps['source'];\n debugRef?: React.MutableRefObject<HTMLDivElement | null>;\n memoryStrategy?: 'eager' | 'lazy';\n lazyBuffer?: number;\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook to manage image sequence in a timeline context.\n * MUST be used inside ScrollTimelineProvider.\n */\nexport function useScrollSequence({\n source,\n debugRef,\n memoryStrategy = 'eager',\n lazyBuffer = 10,\n onError,\n}: UseScrollSequenceParams) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const controllerRef = useRef<ImageController | null>(null);\n \n // Use the shared timeline\n const { subscribe } = useScrollTimeline();\n\n const [isLoaded, setIsLoaded] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let active = true;\n let currentController: ImageController | null = null;\n let unsubscribeTimeline: (() => void) | null = null;\n\n const init = async () => {\n setIsLoaded(false);\n setError(null);\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n try {\n // 1. Resolve Sequence\n // Guard: source change handled by effect dep, but verify environment?\n if (typeof window === 'undefined') return;\n\n const sequence = await resolveSequence(source);\n if (!active) return;\n\n if (sequence.frames.length === 0) {\n return;\n }\n\n // 2. Setup Dimensions (Initial)\n if (typeof window !== 'undefined') {\n canvas.width = window.innerWidth;\n canvas.height = window.innerHeight;\n }\n\n // 3. Initialize Controller\n currentController = new ImageController({\n canvas,\n frames: sequence.frames,\n strategy: memoryStrategy,\n bufferSize: lazyBuffer\n });\n controllerRef.current = currentController;\n\n // 4. Subscribe to Timeline\n unsubscribeTimeline = subscribe((progress) => {\n if (!currentController) return;\n const clamped = clamp(progress);\n currentController.update(clamped);\n\n // Debug Overlay\n if (debugRef?.current) {\n const frameIndex = Math.floor(clamped * (sequence.frames.length - 1));\n debugRef.current.innerText = `Progress: ${clamped.toFixed(2)}\\nFrame: ${frameIndex + 1} / ${sequence.frames.length}`;\n }\n });\n\n if (active) setIsLoaded(true);\n\n } catch (err) {\n if (active) {\n const e = err instanceof Error ? err : new Error('Unknown initialization error');\n setError(e);\n if (onError) onError(e);\n }\n }\n };\n\n init();\n\n return () => {\n active = false;\n currentController?.destroy();\n controllerRef.current = null;\n if (unsubscribeTimeline) unsubscribeTimeline();\n };\n }, [source, memoryStrategy, lazyBuffer, subscribe]); // Re-run if source or timeline changes\n\n return {\n canvasRef,\n isLoaded,\n error\n };\n}\n","/**\n * ImageController\n * Manages canvas rendering, image loading, and frame-by-frame drawing.\n * Handles preloading and caching to minimize redraws.\n */\n\nexport interface ImageControllerConfig {\n /** HTMLCanvasElement to draw on */\n canvas: HTMLCanvasElement;\n\n /** Array of sorted frame URLs */\n frames: string[];\n\n /** Memory management strategy */\n strategy?: 'eager' | 'lazy';\n\n /** Lazy load buffer size (default 10) */\n bufferSize?: number;\n}\n\nexport class ImageController {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private frames: string[];\n private imageCache = new Map<string, HTMLImageElement>();\n private loadingPromises = new Map<string, Promise<HTMLImageElement>>();\n private currentFrameIndex = -1;\n private strategy: 'eager' | 'lazy';\n private bufferSize: number;\n\n /**\n * Create a new ImageController instance.\n *\n * @param config - Configuration object\n * @throws If canvas doesn't support 2D context\n */\n private isDestroyed = false;\n\n constructor(config: ImageControllerConfig) {\n this.canvas = config.canvas;\n this.frames = config.frames;\n this.strategy = config.strategy || 'eager';\n this.bufferSize = config.bufferSize || 10;\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2D context from canvas');\n }\n this.ctx = ctx;\n\n // Initial load\n if (this.strategy === 'eager') {\n this.preloadAll();\n } else {\n this.ensureFrameWindow(0);\n }\n }\n\n // ... preloadAll omitted for brevity if unchanged, but let's include for completeness if needed.\n // Actually, we need to add guards to preloadFrame, so let's check it.\n \n private preloadAll(): void {\n this.frames.forEach((_, index) => this.preloadFrame(index));\n }\n\n private ensureFrameWindow(currentIndex: number): void {\n if (this.isDestroyed) return;\n\n const radius = this.bufferSize;\n const start = Math.max(0, currentIndex - radius);\n const end = Math.min(this.frames.length - 1, currentIndex + radius);\n \n const needed = new Set<string>();\n for (let i = start; i <= end; i++) {\n needed.add(this.frames[i]);\n }\n\n // Cleanup unused frames (LRU-ish but simple Window-based)\n for (const [src] of this.imageCache) {\n if (!needed.has(src)) {\n this.imageCache.delete(src);\n // We should also cancel promises if possible, but we can't cancel a fetch/image load easily.\n // We just delete the tracking so we don't cache it when it lands.\n this.loadingPromises.delete(src);\n }\n }\n\n // Load needed\n for (let i = start; i <= end; i++) {\n void this.preloadFrame(i);\n }\n }\n\n async preloadFrame(index: number): Promise<void> {\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\n\n const src = this.frames[index];\n\n if (this.imageCache.has(src)) return;\n\n // Deduplication: Reuse existing promise if allowed\n if (!this.loadingPromises.has(src)) {\n this.loadingPromises.set(src, this.loadImage(src));\n }\n\n try {\n await this.loadingPromises.get(src);\n } catch {\n // Failed\n if (!this.isDestroyed) {\n // Silent failure\n }\n }\n }\n\n private loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n \n img.onload = () => {\n if (this.isDestroyed) return;\n \n // Critical: decode() to prevent main-thread jank during draw\n img.decode()\n .then(() => {\n if (this.isDestroyed) return;\n this.imageCache.set(src, img);\n resolve(img);\n })\n .catch(() => {\n if (this.isDestroyed) return;\n // Even if decode fails, the image might be usable\n this.imageCache.set(src, img);\n resolve(img);\n });\n };\n\n img.onerror = () => {\n if (this.isDestroyed) return;\n reject(new Error(`Failed to load image: ${src}`));\n };\n\n img.src = src;\n });\n }\n\n update(progress: number): void {\n if (this.isDestroyed || this.frames.length === 0) return;\n\n const frameIndex = Math.floor(progress * (this.frames.length - 1));\n\n if (this.strategy === 'lazy') {\n this.ensureFrameWindow(frameIndex);\n }\n\n if (frameIndex === this.currentFrameIndex) return;\n\n this.currentFrameIndex = frameIndex;\n this.drawFrame(frameIndex);\n }\n\n private drawFrame(index: number): void {\n if (this.isDestroyed || index < 0 || index >= this.frames.length) return;\n\n const src = this.frames[index];\n const img = this.imageCache.get(src);\n\n if (!img) {\n // Frame not ready. Optional: Show loading spinner or keep previous frame?\n // For now, keep previous (natural behavior of canvas).\n // Or check promise\n const promise = this.loadingPromises.get(src);\n if (promise) {\n promise.then(() => {\n if (this.currentFrameIndex === index) {\n this.drawFrame(index);\n }\n }).catch(() => {}); // catch ignore\n }\n return;\n }\n\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n const scale = Math.min(\n this.canvas.width / img.width,\n this.canvas.height / img.height\n );\n\n const scaledWidth = img.width * scale;\n const scaledHeight = img.height * scale;\n const x = (this.canvas.width - scaledWidth) / 2;\n const y = (this.canvas.height - scaledHeight) / 2;\n\n this.ctx.drawImage(img, x, y, scaledWidth, scaledHeight);\n }\n\n setCanvasSize(width: number, height: number): void {\n if (this.isDestroyed) return;\n this.canvas.width = width;\n this.canvas.height = height;\n if (this.currentFrameIndex >= 0) {\n this.drawFrame(this.currentFrameIndex);\n }\n }\n\n destroy(): void {\n this.isDestroyed = true;\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.imageCache.clear();\n this.loadingPromises.clear();\n }\n}\n","/**\n * SequenceResolver\n * Handles intelligent frame resolution from multiple input sources:\n * - Manual frame list (frames[])\n * - Pattern generation (pattern, start, end, pad)\n * - Remote manifest (manifest URL)\n */\n\nimport type { ScrollSequenceProps, ResolvedSequence } from '../types';\n\n// Declare process for TS (avoiding @types/node dependency for just this)\ndeclare const process: { env: { NODE_ENV: string } };\n\n/**\n * Resolves frame sequence from props.\n * Prioritizes: frames > pattern > manifest\n */\n/**\n * Resolves frame sequence from props.\n * Handles 'manual', 'pattern', and 'manifest' sources.\n */\nexport async function resolveSequence(source: ScrollSequenceProps['source']): Promise<ResolvedSequence> {\n switch (source.type) {\n case 'manual':\n return processManualFrames(source.frames);\n \n case 'pattern':\n return processPatternMode(source.url, source.start ?? 1, source.end, source.pad);\n \n case 'manifest':\n return processManifestMode(source.url);\n \n default:\n return { frames: [], frameCount: 0 };\n }\n}\n\n/**\n * Mode A: Process manually provided frames\n */\nfunction processManualFrames(frames: string[]): ResolvedSequence {\n // Sort frames numerically by extracting numbers from filenames\n // Uses stable sort to preserve order for frames with no numbers or equal numbers\n const sorted = [...frames].sort((a, b) => {\n const numA = extractNumber(a);\n const numB = extractNumber(b);\n return numA - numB;\n });\n\n return {\n frames: sorted,\n frameCount: sorted.length\n };\n}\n\n/**\n * Mode B: Generate frames from pattern\n */\nfunction processPatternMode(pattern: string, start: number, end: number, pad?: number): ResolvedSequence {\n const frames: string[] = [];\n\n for (let i = start; i <= end; i++) {\n let indexStr = i.toString();\n if (pad) {\n indexStr = indexStr.padStart(pad, '0');\n }\n frames.push(pattern.replace('{index}', indexStr));\n }\n\n return {\n frames,\n frameCount: frames.length\n };\n}\n\n/**\n * Mode C: Fetch and process manifest\n */\nconst manifestCache = new Map<string, Promise<ResolvedSequence>>();\n\nasync function processManifestMode(url: string): Promise<ResolvedSequence> {\n if (manifestCache.has(url)) {\n return manifestCache.get(url)!;\n }\n\n const promise = (async () => {\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch manifest: ${res.statusText}`);\n }\n \n const data = await res.json();\n \n // Check for \"frames\" array in manifest\n if (data.frames && Array.isArray(data.frames)) {\n return processManualFrames(data.frames);\n }\n \n // Check for pattern config in manifest\n if (data.pattern && typeof data.end === 'number') {\n const start = data.start ?? 1;\n const pad = data.pad;\n return processPatternMode(data.pattern, start, data.end, pad);\n }\n \n return { frames: [], frameCount: 0 };\n \n } catch (err) {\n // Remove from cache on error so retry is possible\n manifestCache.delete(url);\n throw err;\n }\n })();\n\n manifestCache.set(url, promise);\n return promise;\n}\n\n// --- Helpers ---\n\n/**\n * Extract the first number found in a filename.\n * Returns -1 if no number is found, to differentiate from 0.\n */\nfunction extractNumber(filename: string): number {\n const match = filename.match(/\\d+/);\n return match ? parseInt(match[0], 10) : -1;\n}\n\n","/**\n * Clamps a value between a minimum and maximum.\n * Default range is [0, 1], suitable for progress values.\n *\n * @param value - The value to clamp\n * @param min - Minimum value (default: 0)\n * @param max - Maximum value (default: 1)\n * @returns The clamped value\n */\nexport function clamp(value: number, min: number = 0, max: number = 1): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { createContext, useContext } from 'react';\nimport { ScrollTimeline } from '../core/scrollTimeline';\n\nexport interface ScrollTimelineContextValue {\n timeline: ScrollTimeline | null;\n // Expose current progress? No, that causes re-renders. Use subscription.\n}\n\nexport const ScrollTimelineContext = createContext<ScrollTimelineContextValue>({\n timeline: null,\n});\n\nexport function useTimelineContext() {\n return useContext(ScrollTimelineContext);\n}\n","import { ScrollTimeline, TimelineCallback } from '../core/scrollTimeline';\nimport { useTimelineContext } from './scrollTimelineContext';\n\nexport interface UseScrollTimelineResult {\n /** \n * Manual subscription to the timeline. \n * Useful for low-level DOM updates (refs) without re-rendering.\n */\n subscribe: (callback: TimelineCallback) => () => void;\n \n /** The raw timeline instance (for advanced usage) */\n timeline: ScrollTimeline | null; \n}\n\nexport function useScrollTimeline(): UseScrollTimelineResult {\n const { timeline } = useTimelineContext();\n\n const subscribe = (callback: TimelineCallback) => {\n if (!timeline) return () => {};\n return timeline.subscribe(callback);\n };\n\n return { subscribe, timeline };\n}\n","import React, { useRef, useState } from 'react';\nimport { ScrollTimeline } from '../core/scrollTimeline';\nimport { ScrollTimelineContext } from './scrollTimelineContext';\n\nexport interface ScrollTimelineProviderProps {\n children: React.ReactNode;\n \n /** CSS height for the scroll container (e.g., \"300vh\"). */\n scrollLength?: string;\n \n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ScrollTimelineProvider({\n children,\n scrollLength = '300vh',\n className = '',\n style = {},\n}: ScrollTimelineProviderProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [timeline, setTimeline] = useState<ScrollTimeline | null>(null);\n\n // Use layout effect to ensure timeline exists before children effects run\n // SSR safe fallback: use useEffect on server\n const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n\n useIsomorphicLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n if (!containerRef.current) return;\n\n // Future-proof: factory could be passed via props\n const instance = new ScrollTimeline(containerRef.current);\n \n // We do NOT call start() anymore, it starts on subscription\n // instance.start(); \n \n setTimeline(instance);\n\n return () => {\n instance.destroy();\n setTimeline(null);\n };\n }, []); // Dependencies? strict empty for one-time setup\n\n const containerStyle: React.CSSProperties = {\n height: scrollLength,\n position: 'relative',\n width: '100%',\n ...style,\n };\n\n const stickyWrapperStyle: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n height: '100vh',\n width: '100%',\n overflow: 'hidden',\n };\n\n // Memoize context value to prevent unnecessary re-renders of consumers\n // when Parent component renders but timeline instance hasn't changed.\n const contextValue = React.useMemo(() => ({ timeline }), [timeline]);\n\n return (\n <ScrollTimelineContext.Provider value={contextValue}>\n <div \n ref={containerRef} \n className={className} \n style={containerStyle}\n >\n <div style={stickyWrapperStyle}>\n {children}\n </div>\n </div>\n </ScrollTimelineContext.Provider>\n );\n}\n","/**\n * ScrollLoopManager\n * \n * Singleton class to manage a single requestAnimationFrame loop\n * for all ScrollTimeline instances. This prevents multiple RAF\n * callbacks from piling up and degrading performance.\n */\n\ntype LoopCallback = () => void;\n\nexport class ScrollLoopManager {\n private static instance: ScrollLoopManager;\n private callbacks = new Set<LoopCallback>();\n private rafId: number | null = null;\n private isActive = false;\n\n private constructor() {}\n\n public static getInstance(): ScrollLoopManager {\n if (!ScrollLoopManager.instance) {\n ScrollLoopManager.instance = new ScrollLoopManager();\n }\n return ScrollLoopManager.instance;\n }\n\n /**\n * Register a callback to be called on every animation frame.\n */\n public register(callback: LoopCallback): void {\n if (this.callbacks.has(callback)) return;\n \n this.callbacks.add(callback);\n \n // Start loop if this is the first subscriber\n if (this.callbacks.size === 1) {\n this.start();\n }\n }\n\n /**\n * Unregister a callback.\n */\n public unregister(callback: LoopCallback): void {\n this.callbacks.delete(callback);\n\n // Stop loop if no subscribers left\n if (this.callbacks.size === 0) {\n this.stop();\n }\n }\n\n private start(): void {\n if (this.isActive) return;\n this.isActive = true;\n \n // Ensure we are in a browser environment\n if (typeof window !== 'undefined') {\n this.tick();\n }\n }\n\n private stop(): void {\n this.isActive = false;\n if (this.rafId !== null && typeof window !== 'undefined') {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n private tick = (): void => {\n if (!this.isActive) return;\n\n // Execute all registered callbacks\n this.callbacks.forEach(cb => {\n try {\n cb();\n } catch (e) {\n // Silent catch to prevent loop crash\n }\n });\n\n this.rafId = requestAnimationFrame(this.tick);\n };\n}\n","/**\n * Global Constants for React Scroll Media\n */\n\n// Scroll Logic\nexport const SCROLL_THRESHOLD = 0.0001; // Minimum progress change to trigger update\nexport const DEFAULT_SCROLL_LENGTH = '300vh';\n\n// Memory Management\nexport const DEFAULT_LAZY_BUFFER = 10;\nexport const MAX_CACHE_SIZE = 50; // Fallback max size if not dynamic\n\n// Sequences\nexport const DEFAULT_PAD_LENGTH = 0; // Default padding for image numbering\n\n// Styles & Layout\nexport const DEFAULT_FALLBACK_COLOR = '#ccc';\n","import { ScrollLoopManager } from './loopManager';\nimport { SCROLL_THRESHOLD } from '../constants';\n\nexport type TimelineCallback = (progress: number) => void;\n\nexport class ScrollTimeline {\n private container: Element;\n private subscribers = new Set<TimelineCallback>();\n private currentProgress = 0;\n \n // Caching for performance\n private cachedRect: DOMRect | null = null;\n private cachedScrollParent: Element | Window | null = null;\n private cachedScrollParentRect: DOMRect | null = null;\n private cachedViewportHeight = 0;\n private cachedOffsetTop = 0;\n private isLayoutDirty = true;\n private resizeObserver: ResizeObserver | null = null;\n\n public readonly id = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 9);\n\n constructor(container: Element) {\n this.container = container;\n \n if (typeof window !== 'undefined') {\n // Invalidate cache on resize\n this.resizeObserver = new ResizeObserver(() => {\n this.isLayoutDirty = true;\n });\n this.resizeObserver.observe(this.container);\n if (document.body) {\n this.resizeObserver.observe(document.body);\n }\n \n // Also listen to global resize\n window.addEventListener('resize', this.onWindowResize);\n }\n }\n\n private onWindowResize = () => {\n this.isLayoutDirty = true;\n };\n\n /**\n * Subscribe to progress updates.\n * Returns an unsubscribe function.\n */\n subscribe(callback: TimelineCallback): () => void {\n this.subscribers.add(callback);\n \n // Immediately call with current progress for initialization\n try {\n callback(this.currentProgress);\n } catch (e) {\n // Silent\n }\n\n // Register with unique LoopManager if we have subscribers\n if (this.subscribers.size === 1) {\n ScrollLoopManager.getInstance().register(this.tick);\n }\n \n return () => {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n ScrollLoopManager.getInstance().unregister(this.tick);\n }\n };\n }\n\n unsubscribe(callback: TimelineCallback): void {\n this.subscribers.delete(callback);\n if (this.subscribers.size === 0) {\n ScrollLoopManager.getInstance().unregister(this.tick);\n }\n }\n\n /**\n * Start is now handled by LoopManager via subscriptions\n * Deprecated but kept for API stability if needed.\n */\n start(): void {\n // No-op, managed by subscriptions\n }\n\n stop(): void {\n ScrollLoopManager.getInstance().unregister(this.tick);\n }\n\n private tick = (): void => {\n // Calculate Progress\n const progress = this.calculateProgress();\n\n // Notify if changed significantly (using threshold constant)\n if (Math.abs(progress - this.currentProgress) > SCROLL_THRESHOLD) {\n this.currentProgress = progress;\n this.notify();\n }\n };\n\n private notify() {\n this.subscribers.forEach((cb) => {\n try {\n cb(this.currentProgress);\n } catch (e) {\n // Silent\n }\n });\n }\n\n private updateCache() {\n if (!this.isLayoutDirty && this.cachedRect) return;\n\n this.cachedRect = this.container.getBoundingClientRect();\n \n if (!this.cachedScrollParent) {\n this.cachedScrollParent = this.getScrollParent(this.container);\n }\n\n if (this.cachedScrollParent instanceof Element) {\n this.cachedScrollParentRect = this.cachedScrollParent.getBoundingClientRect();\n this.cachedViewportHeight = this.cachedScrollParentRect.height;\n this.cachedOffsetTop = this.cachedScrollParentRect.top;\n } else if (typeof window !== 'undefined') {\n this.cachedViewportHeight = window.innerHeight;\n this.cachedOffsetTop = 0;\n }\n\n this.isLayoutDirty = false;\n }\n\n private calculateProgress(): number {\n if (this.isLayoutDirty || !this.cachedRect) {\n this.updateCache();\n }\n\n const currentRect = this.container.getBoundingClientRect();\n const scrollDist = (this.cachedRect?.height || currentRect.height) - this.cachedViewportHeight;\n\n // Guard: Zero Height / Division by Zero\n if (scrollDist <= 0) return 1;\n\n const relativeTop = currentRect.top - this.cachedOffsetTop;\n const rawProgress = -relativeTop / scrollDist;\n \n const clamped = Math.min(Math.max(rawProgress, 0), 1);\n \n // Round to 6 decimals to prevent micro-drift\n return Math.round(clamped * 1000000) / 1000000;\n }\n\n private getScrollParent(node: Element): Element | Window {\n if (typeof window === 'undefined') return node; \n\n let current = node.parentElement;\n while (current) {\n const style = getComputedStyle(current);\n if (['auto', 'scroll'].includes(style.overflowY)) {\n return current;\n }\n current = current.parentElement;\n }\n return window;\n }\n\n destroy() {\n this.subscribers.clear();\n ScrollLoopManager.getInstance().unregister(this.tick);\n \n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.onWindowResize);\n }\n }\n}\n","import React, { useRef, useEffect } from 'react';\nimport { useScrollTimeline } from './useScrollTimeline';\n\nexport interface ScrollTextProps {\n children: React.ReactNode;\n /** Progress start (0-1) where ENTRANCE animation begins */\n start?: number;\n /** Progress end (0-1) where ENTRANCE animation ends */\n end?: number;\n \n /** Progress start (0-1) where EXIT animation begins. If omitted, element stays visible. */\n exitStart?: number;\n /** Progress end (0-1) where EXIT animation ends */\n exitEnd?: number;\n\n /** Initial opacity */\n initialOpacity?: number;\n /** Target opacity (when entered) */\n targetOpacity?: number;\n /** Final opacity (after exit) */\n finalOpacity?: number;\n\n /** Y-axis translation range in pixels (e.g., 50 means move down 50px) */\n translateY?: number;\n \n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function ScrollText({\n children,\n start = 0,\n end = 0.2,\n exitStart,\n exitEnd,\n initialOpacity = 0,\n targetOpacity = 1,\n finalOpacity = 0,\n translateY = 50,\n style,\n className,\n}: ScrollTextProps) {\n const ref = useRef<HTMLDivElement>(null);\n const { subscribe } = useScrollTimeline();\n\n useEffect(() => {\n // Subscribe to updates\n if (typeof window === 'undefined') return;\n\n const unsubscribe = subscribe((progress) => {\n if (!ref.current) return;\n\n // Check for reduced motion preference\n const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n // If reduced motion is preferred, disable translation (keep opacity fade)\n const effectiveTranslateY = prefersReducedMotion ? 0 : translateY;\n\n let opacity = initialOpacity;\n let currentY = effectiveTranslateY;\n\n // 1. Entrance Phase\n if (progress < start) {\n opacity = initialOpacity;\n currentY = effectiveTranslateY;\n } else if (progress >= start && progress <= end) {\n const local = (progress - start) / (end - start);\n opacity = initialOpacity + (targetOpacity - initialOpacity) * local;\n currentY = effectiveTranslateY * (1 - local);\n } \n // 2. Hold Phase\n else if (!exitStart || progress < exitStart) {\n opacity = targetOpacity;\n currentY = 0;\n }\n // 3. Exit Phase\n else if (exitStart && exitEnd && progress >= exitStart && progress <= exitEnd) {\n const local = (progress - exitStart) / (exitEnd - exitStart);\n opacity = targetOpacity + (finalOpacity - targetOpacity) * local;\n // Move from 0 -> -translateY (or 0 if reduced motion)\n currentY = -effectiveTranslateY * local; \n }\n // 4. Final Phase\n else {\n opacity = finalOpacity;\n currentY = -effectiveTranslateY;\n }\n\n // Apply styles\n ref.current.style.opacity = opacity.toFixed(3);\n ref.current.style.transform = `translateY(${currentY}px)`;\n });\n\n return unsubscribe;\n }, [subscribe, start, end, exitStart, exitEnd, initialOpacity, targetOpacity, finalOpacity, translateY]);\n\n return (\n <div \n ref={ref} \n className={className}\n style={{\n opacity: initialOpacity, \n transform: `translateY(${translateY}px)`,\n transition: 'none', // Critical: no CSS transition fighting JS\n willChange: 'opacity, transform',\n ...style\n }}\n >\n {children}\n </div>\n );\n}\n","import React, { useRef, useEffect } from 'react';\nimport { useScrollTimeline } from './useScrollTimeline';\n\nexport interface ScrollWordRevealProps {\n text: string;\n /** Progress start (0-1) */\n start?: number;\n /** Progress end (0-1) */\n end?: number;\n className?: string;\n style?: React.CSSProperties;\n /** Stagger delay factor (not used in pure scroll map, simpler logic: map word index to sub-progress) */\n}\n\nexport function ScrollWordReveal({\n text,\n start = 0,\n end = 1,\n className,\n style\n}: ScrollWordRevealProps) {\n // We cannot create refs in loop dynamically in top level easily without array.\n // Better to have one parent ref and querySelectorAll children, OR use callback refs.\n const containerRef = useRef<HTMLDivElement>(null);\n const { subscribe } = useScrollTimeline();\n\n // Split words\n const words = text.split(/\\s+/);\n\n useEffect(() => {\n const unsubscribe = subscribe((globalProgress) => {\n if (!containerRef.current) return;\n const spans = containerRef.current.children;\n \n // Map global progress to local range [start, end]\n let localProgress = 0;\n if (globalProgress <= start) localProgress = 0;\n else if (globalProgress >= end) localProgress = 1;\n else localProgress = (globalProgress - start) / (end - start);\n\n // Calculate which word should be visible\n const totalWords = spans.length;\n const progressPerWord = 1 / totalWords;\n\n for (let i = 0; i < totalWords; i++) {\n const span = spans[i] as HTMLElement;\n \n // Each word fades in during its \"slot\"\n // Word 0: 0 -> 0.1\n // Word 1: 0.1 -> 0.2\n const wordStart = i * progressPerWord;\n const wordEnd = (i + 1) * progressPerWord;\n \n let wordOpacity = 0;\n if (localProgress >= wordEnd) {\n wordOpacity = 1;\n } else if (localProgress <= wordStart) {\n wordOpacity = 0.1; // faint visibility initially? or 0\n } else {\n // Interpolate\n wordOpacity = 0.1 + 0.9 * ((localProgress - wordStart) / (wordEnd - wordStart));\n }\n \n span.style.opacity = wordOpacity.toFixed(2);\n // Optional: translate Y too?\n const translate = (1 - wordOpacity) * 10;\n span.style.transform = `translateY(${translate}px)`;\n }\n });\n\n return unsubscribe;\n }, [subscribe, start, end]);\n\n return (\n <div ref={containerRef} className={className} style={{ ...style, display: 'flex', flexWrap: 'wrap', gap: '0.25em' }}>\n {words.map((word, i) => (\n <span \n key={i} \n style={{ \n opacity: 0.1, \n transform: 'translateY(10px)',\n transition: 'none',\n willChange: 'opacity, transform'\n }}\n >\n {word}\n </span>\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["React","useRef","useRef","useState","useRef","useState","jsx","useRef","React","useRef","useEffect","jsx","useRef","useEffect","useRef","useEffect","jsx","useRef","useEffect"]}

@@ -0,0 +0,0 @@ MIT License

{
"name": "react-scroll-media",
"version": "1.0.2",
"version": "1.0.3",
"description": "Production-ready scroll-driven image sequence rendering component for React",

@@ -5,0 +5,0 @@ "license": "MIT",

@@ -9,3 +9,3 @@ <div align="center">

[![npm downloads](https://img.shields.io/npm/dm/react-scroll-media.svg)](https://www.npmjs.com/package/react-scroll-media)
[![bundle size](https://img.shields.io/bundlephobia/minzip/react-scroll-media)](https://bundlephobia.com/package/react-scroll-media)
[![package size](https://packagephobia.com/badge?p=react-scroll-media)](https://packagephobia.com/result?p=react-scroll-media)
[![license](https://img.shields.io/npm/l/react-scroll-media.svg)](https://github.com/yourusername/react-scroll-media/blob/main/LICENSE)

@@ -12,0 +12,0 @@