{"version":3,"file":"KineticSlider.cjs","sources":["../../src/KineticSlider.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useCallback } from 'react';\nimport styles from './KineticSlider.module.css';\nimport type { KineticSliderProps } from './types';\nimport { Application, Sprite, Container, DisplacementFilter } from 'pixi.js';\nimport ResourceManager from './managers/ResourceManager';\nimport {AtlasManager} from './managers/AtlasManager';\nimport RenderScheduler from './managers/RenderScheduler';\nimport { UpdateType } from './managers/UpdateTypes';\nimport { ThrottleStrategy } from './managers/FrameThrottler';\nimport AnimationCoordinator from './managers/AnimationCoordinator';\nimport SlidingWindowManager from './managers/SlidingWindowManager';\nimport { FilterFactory } from './filters';\nimport { type FilterConfig, type FilterType } from './filters/types';\n\n// Import hooks directly\nimport { useDisplacementEffects } from './hooks';\nimport { useFilters } from './hooks';\nimport { useSlides } from './hooks';\nimport { useTextContainers } from './hooks';\nimport { useMouseTracking } from './hooks';\nimport { useIdleTimer } from './hooks';\nimport { useNavigation } from './hooks';\nimport { useExternalNav } from './hooks';\nimport { useTouchSwipe } from './hooks';\nimport { useMouseDrag } from './hooks';\nimport { useTextTilt } from './hooks';\nimport { useResizeHandler } from './hooks';\nimport { loadKineticSliderDependencies } from './ImportHelpers';\nimport { preloadKineticSliderAssets } from './utils/assetPreload';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n// Define the filter coordination event name\nconst FILTER_COORDINATION_EVENT = 'kinetic-slider:filter-update';\n\n/**\n * Creates an interactive image slider with various displacement and transition effects\n */\nconst KineticSlider: React.FC<KineticSliderProps> = ({\n                                                          // Content sources\n                                                          images = [],\n                                                          texts = [],\n                                                          slidesBasePath = '/images/',\n\n                                                          // Displacement settings\n                                                          backgroundDisplacementSpriteLocation = '/images/background-displace.jpg',\n                                                          cursorDisplacementSpriteLocation = '/images/cursor-displace.png',\n                                                          cursorImgEffect = true,\n                                                          cursorTextEffect = true,\n                                                          cursorScaleIntensity = 0.65,\n                                                          cursorMomentum = 0.14,\n\n                                                          // Cursor displacement sizing options\n                                                          cursorDisplacementSizing = 'natural',\n                                                          cursorDisplacementWidth,\n                                                          cursorDisplacementHeight,\n\n                                                          // Text styling\n                                                          textTitleColor = 'white',\n                                                          textTitleSize = 64,\n                                                          mobileTextTitleSize = 40,\n                                                          textTitleLetterspacing = 2,\n                                                          textTitleFontFamily,\n                                                          textSubTitleColor = 'white',\n                                                          textSubTitleSize = 24,\n                                                          mobileTextSubTitleSize = 18,\n                                                          textSubTitleLetterspacing = 1,\n                                                          textSubTitleOffsetTop = 10,\n                                                          mobileTextSubTitleOffsetTop = 5,\n                                                          textSubTitleFontFamily,\n\n                                                          // Animation settings\n                                                          maxContainerShiftFraction = 0.05,\n                                                          swipeScaleIntensity = 2,\n                                                          transitionScaleIntensity = 30,\n\n                                                          // Navigation settings\n                                                          externalNav = false,\n                                                          navElement = { prev: '.main-nav.prev', next: '.main-nav.next' },\n                                                          buttonMode = false,\n\n                                                          // Filter configurations\n                                                          imageFilters,\n                                                          textFilters,\n\n                                                          // Atlas configuration\n                                                          slidesAtlas = 'slides-atlas',\n                                                          effectsAtlas = 'effects-atlas',\n                                                          useEffectsAtlas = false,\n                                                          useSlidesAtlas = false\n                                                      }) => {\n    // Debug log the props\n    console.log(\"KineticSlider received props:\", {\n        useSlidesAtlas,\n        useEffectsAtlas,\n        slidesAtlas,\n        effectsAtlas\n    });\n\n    // Core references\n    const sliderRef = useRef<HTMLDivElement>(null);\n    const [isClient, setIsClient] = useState(false);\n    const [currentSlideIndex, setCurrentSlideIndex] = useState(0);\n    const [isInteracting, setIsInteracting] = useState(false);\n    const [isAppReady, setIsAppReady] = useState(false);\n    const [assetsLoaded, setAssetsLoaded] = useState(false);\n    const cursorActiveRef = useRef<boolean>(false);\n\n    // Initialize the render scheduler (singleton)\n    const scheduler = RenderScheduler.getInstance();\n\n    // Create ResourceManager instance with unique ID\n    const resourceManagerRef = useRef<ResourceManager | null>(null);\n\n    // Create SlidingWindowManager reference\n    const slidingWindowManagerRef = useRef<SlidingWindowManager | null>(null);\n\n    // Initialize the animation coordinator and set the resource manager\n    const animationCoordinator = AnimationCoordinator.getInstance();\n\n    // Configure the scheduler for optimal performance\n    useEffect(() => {\n        // Only run on client-side\n        if (typeof window === 'undefined') return;\n\n        scheduler.configureThrottling({\n            targetFps: 60,\n            strategy: ThrottleStrategy.PRIORITY\n        });\n\n        return () => {\n            // Clear any pending updates related to this component when unmounting\n            scheduler.clearQueue();\n        };\n    }, [scheduler]);\n\n    // Create AtlasManager instance\n    const atlasManagerRef = useRef<AtlasManager | null>(null);\n\n    // Set up Pixi app\n    const appRef = useRef<Application | null>(null);\n    const slidesRef = useRef<Sprite[]>([]);\n    const textContainersRef = useRef<Container[]>([]);\n    const backgroundDisplacementSpriteRef = useRef<Sprite | null>(null);\n    const cursorDisplacementSpriteRef = useRef<Sprite | null>(null);\n    const bgDispFilterRef = useRef<DisplacementFilter | null>(null);\n    const cursorDispFilterRef = useRef<DisplacementFilter | null>(null);\n    const currentIndexRef = useRef<number>(0);\n\n    // Client-side initialization\n    useEffect(() => {\n        setIsClient(true);\n    }, []);\n\n    // Initialize ResourceManager and AtlasManager on mount\n    useEffect(() => {\n        const componentId = `kinetic-slider-${Math.random().toString(36).substring(2, 9)}`;\n\n        // Initialize ResourceManager\n        resourceManagerRef.current = new ResourceManager(componentId, {\n            enableMetrics: true,\n            enableShaderPooling: true,\n            logLevel: import.meta.env.NODE_ENV === 'development' ? 'debug' : 'warn'\n        });\n\n        // Initialize FilterFactory with lazy loading\n        FilterFactory.initialize({\n            enableShaderPooling: true,\n            enableDebug: import.meta.env.NODE_ENV === 'development',\n            lazyLoadConfig: {\n                unloadTimeoutMs: 120000, // 2 minutes\n                maxCachedModules: 20,\n                enablePrefetching: true,\n                retryFailedLoads: true,\n                maxRetries: 3\n            }\n        });\n\n        // Initialize AtlasManager with resource manager\n        atlasManagerRef.current = new AtlasManager({\n            debug: true,\n            preferAtlas: true,\n            cacheFrameTextures: true,\n            basePath: '/atlas'\n        }, resourceManagerRef.current);\n\n        // Set the resource manager for the animation coordinator\n        if (resourceManagerRef.current) {\n            animationCoordinator.setResourceManager(resourceManagerRef.current);\n        }\n\n        // Initialize SlidingWindowManager with default window size and initial index\n        slidingWindowManagerRef.current = new SlidingWindowManager({\n            totalSlides: images.length,\n            initialIndex: 0,\n            windowSize: 2, // Default: current slide ±2\n            debug: import.meta.env.NODE_ENV === 'development'\n        }, resourceManagerRef.current);\n\n        return () => {\n            // Mark as unmounting to prevent new resource allocation\n            if (resourceManagerRef.current) {\n                console.log(\"Component unmounting - disposing all resources\");\n                resourceManagerRef.current.markUnmounting();\n                // Dispose all tracked resources\n                resourceManagerRef.current.dispose();\n                resourceManagerRef.current = null;\n            }\n\n            // Clean up atlas manager\n            if (atlasManagerRef.current) {\n                atlasManagerRef.current.dispose();\n                atlasManagerRef.current = null;\n            }\n\n            // Clear the sliding window manager\n            slidingWindowManagerRef.current = null;\n        };\n    }, [images.length, animationCoordinator]);\n\n    // Create a pixi refs object for hooks\n    const pixiRefs = {\n        app: appRef,\n        slides: slidesRef,\n        textContainers: textContainersRef,\n        backgroundDisplacementSprite: backgroundDisplacementSpriteRef,\n        cursorDisplacementSprite: cursorDisplacementSpriteRef,\n        bgDispFilter: bgDispFilterRef,\n        cursorDispFilter: cursorDispFilterRef,\n        currentIndex: currentIndexRef\n    };\n\n    // Props object for hooks\n    const hookProps = {\n        images,\n        texts,\n        slidesBasePath,\n        backgroundDisplacementSpriteLocation,\n        cursorDisplacementSpriteLocation,\n        cursorImgEffect,\n        cursorTextEffect,\n        cursorScaleIntensity,\n        cursorMomentum,\n        cursorDisplacementSizing,\n        cursorDisplacementWidth,\n        cursorDisplacementHeight,\n        textTitleColor,\n        textTitleSize,\n        mobileTextTitleSize,\n        textTitleLetterspacing,\n        textTitleFontFamily,\n        textSubTitleColor,\n        textSubTitleSize,\n        mobileTextSubTitleSize,\n        textSubTitleLetterspacing,\n        textSubTitleOffsetTop,\n        mobileTextSubTitleOffsetTop,\n        textSubTitleFontFamily,\n        maxContainerShiftFraction,\n        swipeScaleIntensity,\n        transitionScaleIntensity,\n        imageFilters,\n        textFilters,\n        slidesAtlas,\n        effectsAtlas,\n        useSlidesAtlas,\n        useEffectsAtlas\n    };\n\n    // Enhanced hook params with resource and atlas managers\n    const hookParams = {\n        sliderRef,\n        pixi: pixiRefs,\n        props: hookProps,\n        resourceManager: resourceManagerRef.current,\n        atlasManager: atlasManagerRef.current,\n        slidingWindowManager: slidingWindowManagerRef.current\n    };\n\n    // Use displacement effects\n    const { showDisplacementEffects, hideDisplacementEffects } = useDisplacementEffects({\n        sliderRef,\n        bgDispFilterRef,\n        cursorDispFilterRef,\n        backgroundDisplacementSpriteRef,\n        cursorDisplacementSpriteRef,\n        appRef,\n        backgroundDisplacementSpriteLocation,\n        cursorDisplacementSpriteLocation,\n        cursorImgEffect,\n        cursorScaleIntensity,\n        cursorDisplacementSizing,\n        cursorDisplacementWidth,\n        cursorDisplacementHeight,\n        resourceManager: resourceManagerRef.current,\n        atlasManager: atlasManagerRef.current || undefined,\n        effectsAtlas,\n        useEffectsAtlas\n    });\n\n    // Use filter effects\n    const {\n        updateFilterIntensities,\n        resetAllFilters,\n        activateFilterEffects,\n        isInitialized: filtersInitialized,\n        isActive: filtersActive,\n        setFiltersActive\n    } = useFilters(hookParams);\n\n    // Coordinate filter states with interaction state\n    useEffect(() => {\n        if (!isAppReady || !assetsLoaded) {\n            console.log(\"Skipping filter coordination - not ready\", {\n                filtersInitialized,\n                isAppReady,\n                assetsLoaded\n            });\n            return;\n        }\n\n        // Try to initialize filters if they're not already initialized\n        if (!filtersInitialized && typeof activateFilterEffects === 'function') {\n            console.log(\"Attempting to initialize filters during coordination\");\n            activateFilterEffects();\n        }\n\n        console.log(`Filter coordination - isInteracting: ${isInteracting}, filtersActive: ${filtersActive}`);\n\n        if (isInteracting) {\n            // When interaction starts, activate both displacement and custom filters\n            console.log(\"Interaction started - activating effects\");\n            showDisplacementEffects();\n\n            // First try to use the dedicated activation function\n            if (typeof activateFilterEffects === 'function') {\n                console.log(\"Using activateFilterEffects\");\n                activateFilterEffects();\n            } else {\n                // Fallback to updateFilterIntensities\n                console.log(\"Using updateFilterIntensities\");\n                updateFilterIntensities(true, true);\n            }\n        } else {\n            // When interaction ends, deactivate both\n            console.log(\"Interaction ended - deactivating effects\");\n            hideDisplacementEffects();\n            updateFilterIntensities(false);\n        }\n    }, [\n        isInteracting,\n        isAppReady,\n        assetsLoaded,\n        filtersInitialized,\n        filtersActive,\n        showDisplacementEffects,\n        hideDisplacementEffects,\n        updateFilterIntensities,\n        activateFilterEffects\n    ]);\n\n    // Reset filters when component unmounts or when app/assets state changes\n    useEffect(() => {\n        if (!isAppReady || !assetsLoaded) {\n            resetAllFilters();\n        }\n        return () => {\n            resetAllFilters();\n        };\n    }, [isAppReady, assetsLoaded, resetAllFilters]);\n\n    // Preload assets including fonts and atlases\n    useEffect(() => {\n        if (typeof window === 'undefined' || !isClient) return;\n\n        const loadAssets = async () => {\n            try {\n                console.log(\"Preloading assets and fonts...\");\n\n                // Preload atlases first\n                if (atlasManagerRef.current) {\n                    // Load the slides atlas\n                    if (slidesAtlas) {\n                        await atlasManagerRef.current.loadAtlas(\n                            slidesAtlas,\n                            `/atlas/${slidesAtlas}.json`,\n                            `/atlas/${slidesAtlas}.png`\n                        );\n                    }\n\n                    // Load the effects atlas\n                    if (effectsAtlas) {\n                        await atlasManagerRef.current.loadAtlas(\n                            effectsAtlas,\n                            `/atlas/${effectsAtlas}.json`,\n                            `/atlas/${effectsAtlas}.png`\n                        );\n                    }\n                }\n\n                // Then preload any remaining assets (as fallback)\n                await preloadKineticSliderAssets(\n                    images,\n                    backgroundDisplacementSpriteLocation,\n                    cursorDisplacementSpriteLocation,\n                    textTitleFontFamily,\n                    textSubTitleFontFamily\n                );\n\n                setAssetsLoaded(true);\n                console.log(\"Assets and fonts preloaded successfully\");\n            } catch (error) {\n                console.error(\"Failed to preload assets:\", error);\n                // Continue anyway so the component doesn't totally fail\n                setAssetsLoaded(true);\n            }\n        };\n\n        loadAssets();\n    }, [\n        isClient,\n        images,\n        backgroundDisplacementSpriteLocation,\n        cursorDisplacementSpriteLocation,\n        textTitleFontFamily,\n        textSubTitleFontFamily,\n        slidesAtlas,\n        effectsAtlas\n    ]);\n\n    // Initialize Pixi.js application\n    useEffect(() => {\n        if (typeof window === 'undefined' || !sliderRef.current || appRef.current || !assetsLoaded) return;\n\n        const initPixi = async () => {\n            try {\n                console.log(\"Loading PixiJS dependencies...\");\n                // Load all dependencies first\n                const { gsap, pixi, pixiPlugin } = await loadKineticSliderDependencies();\n\n                // Only register plugins in browser\n                if (typeof window !== 'undefined' && pixiPlugin) {\n                    // Register GSAP plugins\n                    gsap.registerPlugin(pixiPlugin);\n\n                    // Check if we have the actual plugin (not the mock)\n                    if (pixiPlugin.registerPIXI) {\n                        pixiPlugin.registerPIXI(pixi);\n                    }\n                }\n\n                console.log(\"Creating Pixi.js application...\");\n\n                // Create Pixi application\n                const app = new Application();\n                await app.init({\n                    width: sliderRef.current?.clientWidth || 800,\n                    height: sliderRef.current?.clientHeight || 600,\n                    backgroundAlpha: 0,\n                    resizeTo: sliderRef.current || undefined,\n                });\n\n                // Track the application with the resource manager\n                if (resourceManagerRef.current) {\n                    resourceManagerRef.current.trackPixiApp(app);\n                }\n\n                // Add canvas to DOM\n                if (sliderRef.current) {\n                    sliderRef.current.appendChild(app.canvas);\n                }\n\n                // Store reference\n                appRef.current = app;\n\n                // Create main container\n                const stage = new Container();\n                app.stage.addChild(stage);\n\n                // Track the stage with the resource manager\n                if (resourceManagerRef.current) {\n                    resourceManagerRef.current.trackDisplayObject(stage);\n                }\n\n                // Set app as ready\n                setIsAppReady(true);\n\n                console.log(\"Pixi.js application initialized\");\n            } catch (error) {\n                console.error(\"Failed to initialize Pixi.js application:\", error);\n            }\n        };\n\n        initPixi();\n\n        // Cleanup on unmount\n        return () => {\n            if (appRef.current) {\n                if (sliderRef.current) {\n                    const canvas = sliderRef.current.querySelector('canvas');\n                    if (canvas) {\n                        sliderRef.current.removeChild(canvas);\n                    }\n                }\n\n                // Note: We don't need to manually destroy the app here\n                // as the ResourceManager will handle it during disposal\n                appRef.current = null;\n                setIsAppReady(false);\n            }\n        };\n    }, [sliderRef.current, assetsLoaded]);\n\n    // Prefetch filters based on props\n    useEffect(() => {\n        // Only run on client-side after app is initialized and props are loaded\n        if (typeof window === 'undefined' || !isAppReady) return;\n\n        // Skip if no filter configurations\n        if (!hookProps.imageFilters && !hookProps.textFilters) return;\n\n        // Helper to extract filter types from configurations\n        const getFilterTypes = (config?: any): FilterType[] => {\n            if (!config) return [];\n\n            const configs = Array.isArray(config) ? config : [config];\n            return configs\n                .filter(c => c && c.type && c.enabled !== false)\n                .map(c => c.type as FilterType);\n        };\n\n        // Get unique filter types from both image and text filters\n        const imageFilterTypes = getFilterTypes(hookProps.imageFilters);\n        const textFilterTypes = getFilterTypes(hookProps.textFilters);\n        const allFilterTypes = [...new Set([...imageFilterTypes, ...textFilterTypes])];\n\n        // Prefetch all filter types\n        if (allFilterTypes.length > 0) {\n            console.log(`Prefetching ${allFilterTypes.length} filter types:`, allFilterTypes);\n            FilterFactory.prefetchFilterModules(allFilterTypes as any, 'high');\n        }\n    }, [isAppReady, hookProps.imageFilters, hookProps.textFilters]);\n\n    // Handle slide transitions\n    const handleSlideChange = useCallback((newIndex: number) => {\n        // Update the current index\n        currentIndexRef.current = newIndex;\n        setCurrentSlideIndex(newIndex);\n\n        // Activate filters for the new slide\n        if (filtersInitialized) {\n            // If cursor is within the canvas, apply filters immediately with critical priority\n            if (isInteracting) {\n                console.log(\"Cursor is within canvas - applying filters immediately with critical priority\");\n\n                // Schedule displacement effects with critical priority\n                scheduler.scheduleTypedUpdate(\n                    'slider',\n                    UpdateType.DISPLACEMENT_EFFECT,\n                    () => {\n                        showDisplacementEffects();\n                    },\n                    'critical'\n                );\n\n                // Schedule filter activation with critical priority\n                // Force the filter activation to use the new slide index\n                scheduler.scheduleTypedUpdate(\n                    'slider',\n                    UpdateType.FILTER_UPDATE,\n                    () => {\n                        // Explicitly update the current index ref before activating filters\n                        currentIndexRef.current = newIndex;\n\n                        // Force filter activation for the new slide\n                        if (typeof activateFilterEffects === 'function') {\n                            activateFilterEffects();\n\n                            // Double-check that filters are active\n                            setFiltersActive(true);\n                        }\n                    },\n                    'critical'\n                );\n            } else {\n                // Use activateFilterEffects to properly apply filters to the new slide\n                activateFilterEffects();\n\n                // Schedule filter deactivation if not interacting\n                const transitionDuration = 1000; // 1 second transition\n                setTimeout(() => {\n                    if (!isInteracting) { // Check again in case interaction started during transition\n                        updateFilterIntensities(false);\n                        hideDisplacementEffects();\n                    }\n                }, transitionDuration);\n            }\n        }\n    }, [\n        filtersInitialized,\n        isInteracting,\n        activateFilterEffects,\n        updateFilterIntensities,\n        hideDisplacementEffects,\n        showDisplacementEffects,\n        scheduler,\n        setFiltersActive\n    ]);\n\n    // Use slides hook with transition handler\n    const { nextSlide, prevSlide } = useSlides({\n        ...hookParams,\n        onSlideChange: handleSlideChange\n    });\n\n    // Use text containers\n    useTextContainers({\n        sliderRef,\n        appRef,\n        slidesRef,\n        textContainersRef,\n        currentIndex: currentIndexRef,\n        buttonMode,\n        texts,\n        textTitleColor,\n        textTitleSize,\n        mobileTextTitleSize,\n        textTitleLetterspacing,\n        textTitleFontFamily,\n        textSubTitleColor,\n        textSubTitleSize,\n        mobileTextSubTitleSize,\n        textSubTitleLetterspacing,\n        textSubTitleOffsetTop,\n        mobileTextSubTitleOffsetTop,\n        textSubTitleFontFamily,\n        resourceManager: resourceManagerRef.current\n    });\n\n    // Use mouse tracking\n    useMouseTracking({\n        ...hookParams,\n        backgroundDisplacementSpriteRef,\n        cursorDisplacementSpriteRef,\n        cursorImgEffect,\n        cursorMomentum\n    });\n\n    // Use idle timer\n    useIdleTimer({\n        sliderRef,\n        cursorActive: cursorActiveRef,\n        bgDispFilterRef,\n        cursorDispFilterRef,\n        cursorImgEffect,\n        defaultBgFilterScale: 20,\n        defaultCursorFilterScale: 10,\n        resourceManager: resourceManagerRef.current\n    });\n\n    /**\n     * Handles transition to the next slide\n     * Updates state and reapplies effects after transition\n     */\n    const handleNext = useCallback(() => {\n        if (!appRef.current || !isAppReady || slidesRef.current.length === 0) return;\n        const nextIndex = (currentSlideIndex + 1) % slidesRef.current.length;\n\n        // Schedule slide transition with high priority\n        scheduler.scheduleTypedUpdate(\n            'slider',\n            UpdateType.SLIDE_TRANSITION,\n            () => {\n                // First transition the slide\n                nextSlide(nextIndex);\n\n                // Update the current index\n                currentIndexRef.current = nextIndex;\n                setCurrentSlideIndex(nextIndex);\n\n                // Always schedule effect reapplication after a short delay\n                // regardless of whether we're interacting or not\n                setTimeout(() => {\n                    console.log(\"Scheduling effects after slide change (next)\");\n\n                    // Schedule displacement effects reapplication\n                    scheduler.scheduleTypedUpdate(\n                        'slider',\n                        UpdateType.DISPLACEMENT_EFFECT,\n                        () => {\n                            showDisplacementEffects();\n                        },\n                        // Use critical priority if cursor is within the canvas\n                        isInteracting ? 'critical' : undefined\n                    );\n\n                    // Schedule filter update with appropriate priority based on interaction state\n                    scheduler.scheduleTypedUpdate(\n                        'slider',\n                        UpdateType.FILTER_UPDATE,\n                        () => {\n                            // Ensure current index is set correctly\n                            currentIndexRef.current = nextIndex;\n\n                            // Use activateFilterEffects to properly apply filters to the new slide\n                            if (typeof activateFilterEffects === 'function') {\n                                activateFilterEffects();\n\n                                // If cursor is within canvas, ensure filters are active\n                                if (isInteracting) {\n                                    setFiltersActive(true);\n                                }\n                            }\n                        },\n                        // Use critical priority if cursor is within the canvas\n                        isInteracting ? 'critical' : undefined\n                    );\n                }, 100); // Short delay to allow transition to start\n            }\n        );\n    }, [\n        appRef,\n        isAppReady,\n        slidesRef,\n        currentSlideIndex,\n        nextSlide,\n        isInteracting,\n        showDisplacementEffects,\n        activateFilterEffects,\n        scheduler,\n        setFiltersActive\n    ]);\n\n    /**\n     * Handles transition to the previous slide\n     * Updates state and reapplies effects after transition\n     */\n    const handlePrev = useCallback(() => {\n        if (!appRef.current || !isAppReady || slidesRef.current.length === 0) return;\n        const prevIndex = (currentSlideIndex - 1 + slidesRef.current.length) % slidesRef.current.length;\n\n        // Schedule slide transition with high priority\n        scheduler.scheduleTypedUpdate(\n            'slider',\n            UpdateType.SLIDE_TRANSITION,\n            () => {\n                // First transition the slide\n                prevSlide(prevIndex);\n\n                // Update the current index\n                currentIndexRef.current = prevIndex;\n                setCurrentSlideIndex(prevIndex);\n\n                // Always schedule effect reapplication after a short delay\n                // regardless of whether we're interacting or not\n                setTimeout(() => {\n                    console.log(\"Scheduling effects after slide change (prev)\");\n\n                    // Schedule displacement effects reapplication\n                    scheduler.scheduleTypedUpdate(\n                        'slider',\n                        UpdateType.DISPLACEMENT_EFFECT,\n                        () => {\n                            showDisplacementEffects();\n                        },\n                        // Use critical priority if cursor is within the canvas\n                        isInteracting ? 'critical' : undefined\n                    );\n\n                    // Schedule filter update with appropriate priority based on interaction state\n                    scheduler.scheduleTypedUpdate(\n                        'slider',\n                        UpdateType.FILTER_UPDATE,\n                        () => {\n                            // Ensure current index is set correctly\n                            currentIndexRef.current = prevIndex;\n\n                            // Use activateFilterEffects to properly apply filters to the new slide\n                            if (typeof activateFilterEffects === 'function') {\n                                activateFilterEffects();\n\n                                // If cursor is within canvas, ensure filters are active\n                                if (isInteracting) {\n                                    setFiltersActive(true);\n                                }\n                            }\n                        },\n                        // Use critical priority if cursor is within the canvas\n                        isInteracting ? 'critical' : undefined\n                    );\n                }, 100); // Short delay to allow transition to start\n            }\n        );\n    }, [\n        appRef,\n        isAppReady,\n        slidesRef,\n        currentSlideIndex,\n        prevSlide,\n        isInteracting,\n        showDisplacementEffects,\n        activateFilterEffects,\n        scheduler,\n        setFiltersActive\n    ]);\n\n    // Apply hooks only when appRef is available and ready - NOW updateFilterIntensities is defined before being referenced\n    useEffect(() => {\n        // Skip if app is not initialized\n        if (!appRef.current || !isAppReady) return;\n\n        // Update current index ref when state changes\n        currentIndexRef.current = currentSlideIndex;\n\n        // Note: We no longer need to handle filter updates here as they are now handled directly\n        // in the navigation functions (handleNext/handlePrev)\n    }, [appRef.current, currentSlideIndex, isAppReady]);\n\n    // Use navigation\n    useNavigation({\n        onNext: handleNext,\n        onPrev: handlePrev,\n        enableKeyboardNav: true\n    });\n\n    // Use external navigation if enabled\n    useExternalNav({\n        externalNav,\n        navElement,\n        handleNext,\n        handlePrev\n    });\n\n    // Use touch swipe\n    useTouchSwipe({\n        sliderRef,\n        onSwipeLeft: handleNext,\n        onSwipeRight: handlePrev\n    });\n\n    // Use mouse drag\n    useMouseDrag({\n        sliderRef,\n        slidesRef,\n        currentIndex: currentIndexRef,\n        swipeScaleIntensity,\n        swipeDistance: typeof window !== 'undefined' ? window.innerWidth * 0.2 : 200,\n        onSwipeLeft: handleNext,\n        onSwipeRight: handlePrev\n    });\n\n    // Use text tilt\n    useTextTilt({\n        sliderRef,\n        textContainersRef,\n        currentIndex: currentIndexRef,\n        cursorTextEffect,\n        maxContainerShiftFraction,\n        bgDispFilterRef,\n        cursorDispFilterRef,\n        cursorImgEffect\n    });\n\n    // Use resize handler\n    useResizeHandler({\n        sliderRef,\n        appRef,\n        slidesRef,\n        textContainersRef,\n        backgroundDisplacementSpriteRef,\n        cursorDisplacementSpriteRef\n    });\n\n    /**\n     * Handles mouse enter events on the slider element\n     * Activates displacement effects and filter intensities\n     * Now uses scheduler for batched updates\n     */\n    const handleMouseEnter = useCallback(() => {\n        if (!isAppReady) return;\n        console.log(\"Mouse entered the slider - activating effects immediately\", {\n            filtersInitialized,\n            filtersActive,\n            hasActivateFunction: typeof activateFilterEffects === 'function',\n            hasUpdateFunction: typeof updateFilterIntensities === 'function',\n            currentSlideIndex\n        });\n\n        // Update cursor active state\n        cursorActiveRef.current = true;\n\n        // Set interaction state immediately to ensure proper coordination\n        setIsInteracting(true);\n\n        // Schedule displacement effects with critical priority\n        scheduler.scheduleTypedUpdate(\n            'slider',\n            UpdateType.DISPLACEMENT_EFFECT,\n            () => {\n                // Apply displacement effects immediately\n                showDisplacementEffects();\n                console.log(\"Displacement effects activated\");\n            },\n            'critical'\n        );\n\n        // Schedule filter activation with critical priority\n        scheduler.scheduleTypedUpdate(\n            'slider',\n            UpdateType.FILTER_UPDATE,\n            () => {\n                // Force initialize filters if not already initialized\n                if (!filtersInitialized && typeof activateFilterEffects === 'function') {\n                    console.log(\"Filters not initialized, initializing now\");\n                    activateFilterEffects();\n                } else if (typeof activateFilterEffects === 'function') {\n                    // Use the dedicated activation function as the primary method\n                    console.log(\"Using activateFilterEffects function for slide\", currentSlideIndex);\n                    activateFilterEffects();\n                } else if (typeof updateFilterIntensities === 'function') {\n                    // Only use updateFilterIntensities as fallback\n                    console.log(\"Using updateFilterIntensities function with force=true\");\n                    updateFilterIntensities(true, true);\n                }\n\n                // Explicitly set filters as active\n                setFiltersActive(true);\n\n                console.log(\"Filter activation completed with critical priority\");\n            },\n            'critical'\n        );\n\n        // Schedule a final render update to ensure all changes are applied\n        scheduler.scheduleTypedUpdate(\n            'slider',\n            UpdateType.FILTER_UPDATE,\n            () => {\n                console.log(\"Final render update after mouse enter completed\");\n\n                // Double-check filter state after render\n                console.log(\"Filter state after render:\", {\n                    filtersActive,\n                    bgDispFilterEnabled: bgDispFilterRef.current?.enabled,\n                    cursorDispFilterEnabled: cursorDispFilterRef.current?.enabled,\n                    currentSlideIndex\n                });\n            },\n            'critical'\n        );\n    }, [\n        isAppReady,\n        showDisplacementEffects,\n        updateFilterIntensities,\n        activateFilterEffects,\n        filtersInitialized,\n        filtersActive,\n        setFiltersActive,\n        currentSlideIndex,\n        scheduler\n    ]);\n\n    /**\n     * Handles mouse leave event\n     */\n    const handleMouseLeave = useCallback(() => {\n        if (!isAppReady) return;\n\n        if (isDevelopment) {\n            console.log('[KineticSlider] Mouse left slider - deactivating all effects');\n        }\n\n        // Set interaction state immediately\n        setIsInteracting(false);\n\n        // Explicitly dispatch filter coordination events for both displacement filters\n        const event1 = new CustomEvent(FILTER_COORDINATION_EVENT, {\n            detail: {\n                type: 'background-displacement',\n                intensity: 0,\n                timestamp: Date.now(),\n                source: 'slider-component',\n                priority: 'critical'\n            }\n        });\n        window.dispatchEvent(event1);\n\n        const event2 = new CustomEvent(FILTER_COORDINATION_EVENT, {\n            detail: {\n                type: 'cursor-displacement',\n                intensity: 0,\n                timestamp: Date.now(),\n                source: 'slider-component',\n                priority: 'critical'\n            }\n        });\n        window.dispatchEvent(event2);\n\n        // Force the filters to deactivate with critical priority\n        updateFilterIntensities(false, true);\n\n        // Schedule a final update after mouse leave to ensure everything is cleaned up\n        scheduler.scheduleTypedUpdate(\n            'slider',\n            UpdateType.FILTER_UPDATE,\n            () => {\n                if (isDevelopment) {\n                    console.log('[KineticSlider] Final render update after mouse leave');\n                }\n            },\n            'critical'\n        );\n    }, [isAppReady, setIsInteracting, updateFilterIntensities, scheduler]);\n\n    // Handle component cleanup\n    useEffect(() => {\n        return () => {\n            // Reset all filters\n            resetAllFilters();\n\n            // Clear any pending filter updates\n            if (resourceManagerRef.current) {\n                resourceManagerRef.current.clearPendingUpdates();\n            }\n\n            // Clear any scheduled filter transitions\n            const transitionTimeouts = Array.from(document.querySelectorAll(`[data-slider-id=\"${sliderRef.current?.id}\"]`))\n                .map(el => parseInt(el.getAttribute('data-timeout-id') || '0'))\n                .filter(id => id > 0);\n\n            transitionTimeouts.forEach(clearTimeout);\n        };\n    }, [resetAllFilters]);\n\n    // Error boundary for filter operations\n    useEffect(() => {\n        const handleError = (error: Error) => {\n            console.error('Filter system error:', error);\n            // Attempt recovery by resetting filters\n            resetAllFilters();\n            // Hide all effects\n            hideDisplacementEffects();\n        };\n\n        window.addEventListener('error', (e) => handleError(e.error));\n        return () => window.removeEventListener('error', (e) => handleError(e.error));\n    }, [resetAllFilters, hideDisplacementEffects]);\n\n    // Add a new useEffect to handle cleanup\n    useEffect(() => {\n        return () => {\n            // Clean up any resources when component unmounts\n            if (resourceManagerRef.current) {\n                // Use the existing methods instead of the non-existent 'cleanup' method\n                resourceManagerRef.current.clearPendingUpdates();\n                resourceManagerRef.current.markUnmounting();\n            }\n        };\n    }, []);\n\n    // FPS monitoring for filter optimization\n    useEffect(() => {\n        if (!resourceManagerRef.current) return;\n\n        let frameCount = 0;\n        let lastTime = performance.now();\n        let fps = 60;\n\n        // Function to calculate FPS and optimize filters\n        const monitorPerformance = () => {\n            frameCount++;\n            const currentTime = performance.now();\n            const elapsed = currentTime - lastTime;\n\n            // Update FPS approximately every second\n            if (elapsed > 1000) {\n                fps = (frameCount * 1000) / elapsed;\n                frameCount = 0;\n                lastTime = currentTime;\n\n                // Auto-optimize filters based on current FPS\n                if (resourceManagerRef.current && fps < 55) {\n                    resourceManagerRef.current.autoOptimizeFilters(fps, 55);\n                }\n            }\n\n            performanceMonitorId = requestAnimationFrame(monitorPerformance);\n        };\n\n        // Start performance monitoring\n        let performanceMonitorId = requestAnimationFrame(monitorPerformance);\n\n        // Cleanup\n        return () => {\n            if (performanceMonitorId) {\n                cancelAnimationFrame(performanceMonitorId);\n            }\n        };\n    }, [resourceManagerRef]);\n\n    // Render component\n    return (\n        <div\n            className={styles.kineticSlider}\n            ref={sliderRef}\n            onMouseEnter={handleMouseEnter}\n            onMouseLeave={handleMouseLeave}\n        >\n            {/* Placeholder while loading */}\n            {(!isAppReady || !assetsLoaded) && (\n                <div className={styles.placeholder}>\n                    <div className={styles.loadingIndicator}>\n                        <div className={styles.spinner}></div>\n                        <div>Loading slider...</div>\n                    </div>\n                </div>\n            )}\n\n            {/* Navigation buttons - only render on client and if external nav is not enabled */}\n            {!externalNav && isClient && (\n                <nav>\n                    <button onClick={handlePrev} className={styles.prev}>\n                        Prev\n                    </button>\n                    <button onClick={handleNext} className={styles.next}>\n                        Next\n                    </button>\n                </nav>\n            )}\n        </div>\n    );\n};\n\nexport default KineticSlider;"],"names":["useRef","useState","RenderScheduler","AnimationCoordinator","useEffect","ThrottleStrategy","ResourceManager","FilterFactory","AtlasManager","SlidingWindowManager","useDisplacementEffects","useFilters","preloadKineticSliderAssets","loadKineticSliderDependencies","Application","Container","useCallback","UpdateType","useSlides","useTextContainers","useMouseTracking","useIdleTimer","useNavigation","useExternalNav","useTouchSwipe","useMouseDrag","useTextTilt","useResizeHandler","jsxs","styles","jsx"],"mappings":"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"}