kinetic-slider
Version:
A WebGL-powered kinetic slider component using PIXI.js
1 lines • 23.5 kB
Source Map (JSON)
{"version":3,"file":"useTextContainers.cjs","sources":["../../../src/hooks/useTextContainers.ts"],"sourcesContent":["import { useEffect, type RefObject } from 'react';\nimport { Application, Container, Text, TextStyle, Sprite } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { type TextPair } from '../types';\nimport { setupCustomFonts } from '../utils/fontUtils';\nimport ResourceManager from '../managers/ResourceManager';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n// Comprehensive logging utility\nconst log = {\n info: (message: string, ...args: any[]) => {\n if (isDevelopment) {\n console.log(`[useTextContainers:INFO] ${message}`, ...args);\n }\n },\n warn: (message: string, ...args: any[]) => {\n if (isDevelopment) {\n console.warn(`[useTextContainers:WARN] ${message}`, ...args);\n }\n },\n error: (message: string, error?: unknown) => {\n if (isDevelopment) {\n console.error(`[useTextContainers:ERROR] ${message}`, error);\n }\n }\n};\n\n// Cancellation and lifecycle management interface\ninterface CancellationFlags {\n isCancelled: boolean;\n}\n\n// Enhanced prop interface with comprehensive typing\ninterface UseTextContainersProps {\n sliderRef: RefObject<HTMLDivElement | null>;\n appRef: RefObject<Application | null>;\n slidesRef: RefObject<Sprite[]>;\n textContainersRef: RefObject<Container[]>;\n currentIndex: RefObject<number>;\n buttonMode: boolean;\n texts: TextPair[];\n\n // Title styling\n textTitleColor: string;\n textTitleSize: number;\n mobileTextTitleSize: number;\n textTitleLetterspacing: number;\n textTitleFontFamily?: string;\n\n // Subtitle styling\n textSubTitleColor: string;\n textSubTitleSize: number;\n mobileTextSubTitleSize: number;\n textSubTitleLetterspacing: number;\n textSubTitleOffsetTop: number;\n mobileTextSubTitleOffsetTop: number;\n textSubTitleFontFamily?: string;\n\n resourceManager?: ResourceManager | null;\n}\n\n// Default font fallbacks with more comprehensive options\nconst DEFAULT_FONTS = {\n title: 'Georgia, Times, \"Times New Roman\", serif',\n subtitle: 'Helvetica, Arial, sans-serif'\n};\n\n/**\n * Prepare font family string with comprehensive fallback handling\n */\nfunction prepareFontFamily(\n fontStack?: string,\n defaultStack = DEFAULT_FONTS.title\n): string {\n try {\n // If no font stack provided, return default\n if (!fontStack) {\n log.info(`No font stack provided, using default: ${defaultStack}`);\n return defaultStack;\n }\n\n // Trim and clean font stack\n const cleanedStack = fontStack\n .split(',')\n .map(font => font.trim().replace(/['\"]/g, ''))\n .filter(Boolean)\n .join(', ');\n\n log.info(`Processed font stack: ${cleanedStack}`);\n return cleanedStack || defaultStack;\n } catch (error) {\n log.error('Error processing font family', error);\n return defaultStack;\n }\n}\n\n/**\n * Advanced text containers hook with comprehensive optimization\n */\nconst useTextContainers = ({\n sliderRef,\n appRef,\n slidesRef,\n textContainersRef,\n currentIndex,\n buttonMode,\n texts,\n\n // Title props\n textTitleColor,\n textTitleSize,\n mobileTextTitleSize,\n textTitleLetterspacing,\n textTitleFontFamily,\n\n // Subtitle props\n textSubTitleColor,\n textSubTitleSize,\n mobileTextSubTitleSize,\n textSubTitleLetterspacing,\n textSubTitleOffsetTop,\n mobileTextSubTitleOffsetTop,\n textSubTitleFontFamily,\n\n resourceManager\n }: UseTextContainersProps) => {\n // Cancellation mechanism\n const cancellationRef = { current: { isCancelled: false } };\n\n // Text containers creation effect\n useEffect(() => {\n // Server-side rendering guard\n if (typeof window === 'undefined') return;\n\n // Reset cancellation flag\n cancellationRef.current.isCancelled = false;\n\n // Validate essential references\n if (!appRef.current || !slidesRef.current.length || !texts.length) {\n log.warn('Initialization aborted due to missing references');\n return;\n }\n\n // Async font setup\n const setupFontsAndCreateContainers = async () => {\n try {\n // Preload fonts if custom fonts are specified\n if (textTitleFontFamily || textSubTitleFontFamily) {\n log.info('Setting up custom fonts', {\n titleFont: textTitleFontFamily,\n subtitleFont: textSubTitleFontFamily\n });\n await setupCustomFonts(textTitleFontFamily, textSubTitleFontFamily);\n }\n\n // Check for cancellation after font setup\n if (cancellationRef.current.isCancelled) return;\n\n const app = appRef.current!;\n const stage = app.stage.children[0] as Container;\n\n // Clear existing text containers\n textContainersRef.current.forEach(container => {\n try {\n if (container.parent) {\n container.parent.removeChild(container);\n }\n } catch (removeError) {\n log.error('Error removing existing text container', removeError);\n }\n });\n textContainersRef.current = [];\n\n // Compute responsive text sizes\n const isMobile = window.innerWidth < 768;\n const computedTitleSize = isMobile ? mobileTextTitleSize : textTitleSize;\n const computedSubTitleSize = isMobile ? mobileTextSubTitleSize : textSubTitleSize;\n const computedSubTitleOffset = isMobile ? mobileTextSubTitleOffsetTop : textSubTitleOffsetTop;\n\n // Prepare font families\n const titleFontFamily = prepareFontFamily(textTitleFontFamily);\n const subtitleFontFamily = prepareFontFamily(textSubTitleFontFamily, DEFAULT_FONTS.subtitle);\n\n log.info('Creating text containers', {\n titleFont: titleFontFamily,\n subtitleFont: subtitleFontFamily\n });\n\n // Create text containers\n texts.forEach((textPair, index) => {\n const [title, subtitle] = textPair;\n\n // Create container\n const textContainer = new Container();\n textContainer.x = app.screen.width / 2;\n textContainer.y = app.screen.height / 2;\n\n // Track container with ResourceManager\n if (resourceManager) {\n resourceManager.trackDisplayObject(textContainer);\n }\n\n // Create title text\n const titleStyle = new TextStyle({\n fill: textTitleColor,\n fontSize: computedTitleSize,\n letterSpacing: textTitleLetterspacing,\n fontWeight: 'bold',\n align: 'center',\n fontFamily: titleFontFamily\n });\n const titleText = new Text({ text: title, style: titleStyle });\n titleText.anchor.set(0.5, 0);\n titleText.y = 0;\n\n // Track title with ResourceManager\n if (resourceManager) {\n resourceManager.trackDisplayObject(titleText);\n }\n\n // Create subtitle text\n const subtitleStyle = new TextStyle({\n fill: textSubTitleColor,\n fontSize: computedSubTitleSize,\n letterSpacing: textSubTitleLetterspacing,\n align: 'center',\n fontFamily: subtitleFontFamily\n });\n const subText = new Text({ text: subtitle, style: subtitleStyle });\n subText.anchor.set(0.5, 0);\n subText.y = titleText.height + computedSubTitleOffset;\n\n // Track subtitle with ResourceManager\n if (resourceManager) {\n resourceManager.trackDisplayObject(subText);\n }\n\n // Add texts to container\n textContainer.addChild(titleText, subText);\n textContainer.pivot.y = textContainer.height / 2;\n\n // Set initial visibility\n textContainer.alpha = index === 0 ? 1 : 0;\n textContainer.visible = index === 0;\n\n // Button mode configuration\n if (buttonMode) {\n textContainer.eventMode = 'static';\n textContainer.cursor = 'pointer';\n\n // Hover effects with GSAP\n textContainer.on('pointerover', () => {\n gsap.to(titleText.scale, {\n x: 1.1,\n y: 1.1,\n duration: 0.2,\n onComplete: () => {\n if (resourceManager) {\n resourceManager.trackDisplayObject(titleText);\n }\n }\n });\n });\n\n textContainer.on('pointerout', () => {\n gsap.to(titleText.scale, {\n x: 1,\n y: 1,\n duration: 0.2,\n onComplete: () => {\n if (resourceManager) {\n resourceManager.trackDisplayObject(titleText);\n }\n }\n });\n });\n\n // Slide change on click\n textContainer.on('pointerdown', () => {\n const nextIndex = (currentIndex.current + 1) % slidesRef.current.length;\n window.dispatchEvent(new CustomEvent('slideChange', {\n detail: { nextIndex }\n }));\n });\n }\n\n // Add to stage and store reference\n stage.addChild(textContainer);\n textContainersRef.current.push(textContainer);\n });\n\n log.info(`Created ${texts.length} text containers`);\n } catch (error) {\n log.error('Error in text containers setup', error);\n }\n };\n\n // Execute font and container setup\n setupFontsAndCreateContainers();\n\n // Resize handling effect\n const handleResize = () => {\n try {\n // Skip if cancelled or references missing\n if (cancellationRef.current.isCancelled ||\n !appRef.current ||\n !sliderRef.current ||\n !textContainersRef.current.length) return;\n\n const containerWidth = sliderRef.current.clientWidth || 0;\n const containerHeight = sliderRef.current.clientHeight || 0;\n const isMobile = window.innerWidth < 768;\n\n // Compute responsive sizes\n const computedTitleSize = isMobile ? mobileTextTitleSize : textTitleSize;\n const computedSubTitleSize = isMobile ? mobileTextSubTitleSize : textSubTitleSize;\n const computedSubTitleOffset = isMobile ? mobileTextSubTitleOffsetTop : textSubTitleOffsetTop;\n\n // Prepare font families\n const titleFontFamily = prepareFontFamily(textTitleFontFamily);\n const subtitleFontFamily = prepareFontFamily(textSubTitleFontFamily, DEFAULT_FONTS.subtitle);\n\n // Update each text container\n textContainersRef.current.forEach(container => {\n // Reposition container\n container.x = containerWidth / 2;\n container.y = containerHeight / 2;\n\n // Update title text\n const titleText = container.children[0] as Text;\n titleText.style.fontSize = computedTitleSize;\n titleText.style.fontFamily = titleFontFamily;\n // Force text update by reassigning the text content\n const titleContent = titleText.text;\n titleText.text = titleContent;\n\n // Update subtitle text\n const subText = container.children[1] as Text;\n subText.style.fontSize = computedSubTitleSize;\n subText.style.fontFamily = subtitleFontFamily;\n // Reposition subtitle\n subText.y = titleText.height + computedSubTitleOffset;\n // Force text update by reassigning the text content\n const subContent = subText.text;\n subText.text = subContent;\n\n // Update container pivot\n container.pivot.y = container.height / 2;\n\n // Track updates with ResourceManager\n if (resourceManager) {\n resourceManager.trackDisplayObject(container);\n resourceManager.trackDisplayObject(titleText);\n resourceManager.trackDisplayObject(subText);\n }\n });\n\n log.info('Text containers resized');\n } catch (error) {\n log.error('Error during text containers resize', error);\n }\n };\n\n // Add resize listener\n window.addEventListener('resize', handleResize);\n\n // Initial resize\n handleResize();\n\n // Cleanup function\n return () => {\n // Set cancellation flag\n cancellationRef.current.isCancelled = true;\n\n // Remove resize listener\n window.removeEventListener('resize', handleResize);\n };\n }, [\n // Dependency array with all props for comprehensive updates\n appRef.current,\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 buttonMode,\n resourceManager\n ]);\n\n // No return value needed as this is a side-effect hook\n};\n\nexport default useTextContainers;"],"names":["useEffect","setupCustomFonts","Container","TextStyle","Text","gsap"],"mappings":"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"}