{"version":3,"file":"useTextTilt.cjs","sources":["../../../src/hooks/useTextTilt.ts"],"sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\nimport { Container, DisplacementFilter } from \"pixi.js\";\nimport { gsap } from \"gsap\";\nimport ResourceManager from '../managers/ResourceManager';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n// Enhanced error logging utility\nconst logError = (context: string, error: unknown) => {\n    if (isDevelopment) {\n        console.error(`[useTextTilt:${context}] Error:`, error);\n    }\n};\n\n// Comprehensive interface for hook props\ninterface UseTextTiltProps {\n    sliderRef: RefObject<HTMLDivElement | null>;\n    textContainersRef: RefObject<Container[]>;\n    currentIndex: RefObject<number>;\n    cursorTextEffect: boolean;\n    maxContainerShiftFraction: number;\n    bgDispFilterRef: RefObject<DisplacementFilter | null>;\n    cursorDispFilterRef: RefObject<DisplacementFilter | null>;\n    cursorImgEffect: boolean;\n    resourceManager?: ResourceManager | null;\n    throttleTime?: number;\n}\n\n// Enhanced state management interface\ninterface TiltState {\n    isAnimating: boolean;\n    lastOffsetX: number;\n    lastOffsetY: number;\n}\n\n// Cancellation and lifecycle management interface\ninterface CancellationFlags {\n    isCancelled: boolean;\n}\n\n/**\n * Advanced text tilt hook with comprehensive optimization\n */\nconst useTextTilt = ({\n                         sliderRef,\n                         textContainersRef,\n                         currentIndex,\n                         cursorTextEffect,\n                         maxContainerShiftFraction,\n                         bgDispFilterRef,\n                         cursorDispFilterRef,\n                         cursorImgEffect,\n                         resourceManager,\n                         throttleTime = 50\n                     }: UseTextTiltProps) => {\n    // Enhanced refs with strict typing\n    const lastMoveTimeRef = useRef<number>(0);\n    const tiltTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n    const animationStateRef = useRef<TiltState>({\n        isAnimating: false,\n        lastOffsetX: 0,\n        lastOffsetY: 0\n    });\n    const cancellationRef = useRef<CancellationFlags>({ isCancelled: false });\n    const activeTweensRef = useRef<gsap.core.Tween[]>([]);\n\n    useEffect(() => {\n        // Skip during server-side rendering\n        if (typeof window === 'undefined') return;\n\n        // Early exit if effect is disabled\n        if (!cursorTextEffect || !sliderRef.current) {\n            if (isDevelopment) {\n                console.log('Text tilt effect disabled or missing slider reference');\n            }\n            return;\n        }\n\n        // Reset cancellation flag\n        cancellationRef.current.isCancelled = false;\n\n        const sliderElement = sliderRef.current;\n\n        /**\n         * Comprehensive cleanup of active tweens\n         */\n        const cleanupActiveTweens = () => {\n            try {\n                activeTweensRef.current.forEach(tween => {\n                    if (tween && tween.isActive()) {\n                        tween.kill();\n                    }\n                });\n                activeTweensRef.current = [];\n            } catch (error) {\n                logError('cleanupActiveTweens', error);\n            }\n        };\n\n        /**\n         * Safe calculation of tilt values with comprehensive error handling\n         */\n        const calculateTiltValues = (mouseX: number, mouseY: number) => {\n            try {\n                // Validate slider element\n                if (!sliderElement) {\n                    logError('calculateTiltValues', 'Slider element is undefined');\n                    return {\n                        containerShiftX: 0,\n                        containerShiftY: 0,\n                        titleShiftX: 0,\n                        subtitleShiftX: 0,\n                        centerX: 0,\n                        centerY: 0\n                    };\n                }\n\n                const containerWidth = sliderElement.clientWidth;\n                const containerHeight = sliderElement.clientHeight;\n\n                // Validate container dimensions\n                if (containerWidth <= 0 || containerHeight <= 0) {\n                    logError('calculateTiltValues', 'Invalid container dimensions');\n                    return {\n                        containerShiftX: 0,\n                        containerShiftY: 0,\n                        titleShiftX: 0,\n                        subtitleShiftX: 0,\n                        centerX: 0,\n                        centerY: 0\n                    };\n                }\n\n                const centerX = containerWidth / 2;\n                const centerY = containerHeight / 2;\n\n                // Calculate offsets from center\n                const offsetX = centerX - mouseX;\n                const offsetY = centerY - mouseY;\n\n                // Store for comparison in throttling\n                animationStateRef.current.lastOffsetX = offsetX;\n                animationStateRef.current.lastOffsetY = offsetY;\n\n                // Constrained shift calculations\n                const rawContainerShiftX = offsetX * 0.05;\n                const rawContainerShiftY = offsetY * 0.1;\n                const maxShiftX = containerWidth * maxContainerShiftFraction;\n                const maxShiftY = containerHeight * maxContainerShiftFraction;\n\n                const containerShiftX = Math.max(Math.min(rawContainerShiftX, maxShiftX), -maxShiftX);\n                const containerShiftY = Math.max(Math.min(rawContainerShiftY, maxShiftY), -maxShiftY);\n\n                // Title and subtitle shift calculations\n                const maxTitleShift = containerWidth * 0.1;\n                const titleRawShiftX = offsetX * 0.8;\n                const titleShiftX = Math.max(Math.min(titleRawShiftX, maxTitleShift), -maxTitleShift);\n\n                const maxSubtitleShift = containerWidth * 0.15;\n                const subtitleShiftX = Math.max(Math.min(offsetX, maxSubtitleShift), -maxSubtitleShift);\n\n                return {\n                    containerShiftX,\n                    containerShiftY,\n                    titleShiftX,\n                    subtitleShiftX,\n                    centerX,\n                    centerY\n                };\n            } catch (error) {\n                logError('calculateTiltValues', error);\n\n                // Return safe default values\n                return {\n                    containerShiftX: 0,\n                    containerShiftY: 0,\n                    titleShiftX: 0,\n                    subtitleShiftX: 0,\n                    centerX: sliderElement?.clientWidth / 2 || 0,\n                    centerY: sliderElement?.clientHeight / 2 || 0\n                };\n            }\n        };\n\n        /**\n         * Apply tilt effect with comprehensive error handling and resource tracking\n         */\n        const applyTiltEffect = (tiltValues: ReturnType<typeof calculateTiltValues>) => {\n            try {\n                // Check for cancellation\n                if (cancellationRef.current.isCancelled) return;\n\n                const activeTextContainer = textContainersRef.current[currentIndex.current];\n\n                if (!activeTextContainer || activeTextContainer.children.length < 2) {\n                    return;\n                }\n\n                // Clear previous animations\n                cleanupActiveTweens();\n\n                // Create and track animations\n                const createTrackedTween = (target: any, props: any) => {\n                    const tween = gsap.to(target, {\n                        ...props,\n                        onComplete: () => {\n                            // Re-track the object after animation\n                            if (resourceManager) {\n                                resourceManager.trackDisplayObject(target);\n                            }\n                        }\n                    });\n\n                    // Track the animation\n                    if (resourceManager) {\n                        resourceManager.trackAnimation(tween);\n                    }\n\n                    activeTweensRef.current.push(tween);\n                    return tween;\n                };\n\n                // Container animation\n                createTrackedTween(activeTextContainer, {\n                    x: tiltValues.centerX + tiltValues.containerShiftX,\n                    y: tiltValues.centerY + tiltValues.containerShiftY,\n                    duration: 0.5,\n                    ease: \"expo.out\"\n                });\n\n                // Title animation\n                if (activeTextContainer.children[0]) {\n                    createTrackedTween(activeTextContainer.children[0], {\n                        x: tiltValues.titleShiftX,\n                        duration: 0.5,\n                        ease: \"expo.out\"\n                    });\n                }\n\n                // Subtitle animation\n                if (activeTextContainer.children[1]) {\n                    createTrackedTween(activeTextContainer.children[1], {\n                        x: tiltValues.subtitleShiftX,\n                        duration: 0.5,\n                        ease: \"expo.out\"\n                    });\n                }\n\n                // Mark as animating\n                animationStateRef.current.isAnimating = true;\n            } catch (error) {\n                logError('applyTiltEffect', error);\n\n                // Reset animation state on error\n                animationStateRef.current.isAnimating = false;\n            }\n        };\n\n        /**\n         * Reset tilt effect with comprehensive cleanup\n         */\n        const resetTiltEffect = () => {\n            try {\n                // Check for cancellation\n                if (cancellationRef.current.isCancelled) return;\n\n                const activeContainer = textContainersRef.current[currentIndex.current];\n\n                if (!activeContainer) return;\n\n                // Clear previous animations\n                cleanupActiveTweens();\n\n                // Calculate center\n                const centerX = sliderElement.clientWidth / 2;\n                const centerY = sliderElement.clientHeight / 2;\n\n                // Create reset animation function\n                const createResetTween = (target: any, props: any) => {\n                    const tween = gsap.to(target, {\n                        ...props,\n                        duration: 1,\n                        ease: \"expo.inOut\",\n                        onComplete: () => {\n                            // Re-track object after animation\n                            if (resourceManager) {\n                                resourceManager.trackDisplayObject(target);\n                            }\n                        }\n                    });\n\n                    // Track animation\n                    if (resourceManager) {\n                        resourceManager.trackAnimation(tween);\n                    }\n\n                    activeTweensRef.current.push(tween);\n                    return tween;\n                };\n\n                // Container reset\n                createResetTween(activeContainer, {\n                    x: centerX,\n                    y: centerY,\n                    onComplete: () => {\n                        animationStateRef.current.isAnimating = false;\n                    }\n                });\n\n                // Reset title\n                if (activeContainer.children[0]) {\n                    createResetTween(activeContainer.children[0], { x: 0 });\n                }\n\n                // Reset subtitle\n                if (activeContainer.children[1]) {\n                    createResetTween(activeContainer.children[1], { x: 0 });\n                }\n\n                // Reset filters if they exist\n                const resetFilterTween = (filterRef: RefObject<DisplacementFilter | null>) => {\n                    if (filterRef.current) {\n                        const tween = gsap.to(filterRef.current.scale, {\n                            x: 0,\n                            y: 0,\n                            duration: 1,\n                            ease: \"expo.inOut\",\n                            onComplete: () => {\n                                if (resourceManager && filterRef.current) {\n                                    resourceManager.trackFilter(filterRef.current);\n                                }\n                            }\n                        });\n\n                        if (resourceManager) {\n                            resourceManager.trackAnimation(tween);\n                        }\n\n                        activeTweensRef.current.push(tween);\n                    }\n                };\n\n                resetFilterTween(bgDispFilterRef);\n                if (cursorImgEffect) {\n                    resetFilterTween(cursorDispFilterRef);\n                }\n            } catch (error) {\n                logError('resetTiltEffect', error);\n\n                // Ensure animation state is reset\n                animationStateRef.current.isAnimating = false;\n            }\n        };\n\n        /**\n         * Throttled mouse move handler\n         */\n        const handleTextTilt = (e: MouseEvent) => {\n            try {\n                // Skip if cancelled\n                if (cancellationRef.current.isCancelled) return;\n\n                const now = Date.now();\n\n                // Throttle check\n                if (now - lastMoveTimeRef.current < throttleTime) {\n                    return;\n                }\n\n                // Update last move time\n                lastMoveTimeRef.current = now;\n\n                // Calculate tilt values\n                const tiltValues = calculateTiltValues(e.clientX, e.clientY);\n\n                // Apply tilt effect\n                applyTiltEffect(tiltValues);\n\n                // Clear existing timeout\n                if (tiltTimeoutRef.current !== null) {\n                    if (resourceManager) {\n                        resourceManager.clearTimeout(tiltTimeoutRef.current);\n                    } else {\n                        clearTimeout(tiltTimeoutRef.current);\n                    }\n                    tiltTimeoutRef.current = null;\n                }\n\n                // Set reset timeout\n                const setTimeoutFn = () => {\n                    resetTiltEffect();\n                    tiltTimeoutRef.current = null;\n                };\n\n                // Use ResourceManager for timeout if available\n                if (resourceManager) {\n                    tiltTimeoutRef.current = resourceManager.setTimeout(setTimeoutFn, 300);\n                } else {\n                    // Use type assertion since browser's setTimeout returns number while Node's returns Timeout\n                    tiltTimeoutRef.current = window.setTimeout(setTimeoutFn, 300) as unknown as ReturnType<typeof setTimeout>;\n                }\n            } catch (error) {\n                logError('handleTextTilt', error);\n            }\n        };\n\n        // Add event listener\n        sliderElement.addEventListener(\"mousemove\", handleTextTilt, { passive: true });\n\n        // Cleanup function\n        return () => {\n            // Set cancellation flag\n            cancellationRef.current.isCancelled = true;\n\n            // Remove event listener\n            sliderElement.removeEventListener(\"mousemove\", handleTextTilt);\n\n            // Clean up tweens\n            cleanupActiveTweens();\n\n            // Clear timeout\n            if (tiltTimeoutRef.current !== null) {\n                if (resourceManager) {\n                    resourceManager.clearTimeout(tiltTimeoutRef.current);\n                } else {\n                    clearTimeout(tiltTimeoutRef.current);\n                }\n                tiltTimeoutRef.current = null;\n            }\n        };\n    }, [\n        sliderRef,\n        textContainersRef,\n        currentIndex,\n        cursorTextEffect,\n        maxContainerShiftFraction,\n        bgDispFilterRef,\n        cursorDispFilterRef,\n        cursorImgEffect,\n        resourceManager,\n        throttleTime\n    ]);\n};\n\nexport default useTextTilt;"],"names":["useRef","useEffect","gsap"],"mappings":"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"}