{"version":3,"file":"useAdaptiveLayout.mjs","sources":["../../../../../src/lib/layouts/adaptive/hooks/useAdaptiveLayout.ts"],"sourcesContent":["/**\n * @fileoverview useAdaptiveLayout Hook\n *\n * Primary hook for accessing and controlling the adaptive layout system.\n * Provides access to layout state, mode, analysis, and control functions.\n *\n * @module layouts/adaptive/hooks/useAdaptiveLayout\n * @version 1.0.0\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n  ContentAnalysis,\n  Dimensions,\n  LayoutComputeResult,\n  LayoutEngineConfig,\n  LayoutMode,\n  LayoutState,\n  UseAdaptiveLayoutReturn,\n} from '../types';\nimport { DEFAULT_LAYOUT_ENGINE_CONFIG } from '../types';\nimport { createLayoutEngine } from '../layout-engine';\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Options for useAdaptiveLayout hook.\n */\nexport interface UseAdaptiveLayoutOptions {\n  /** Initial layout mode */\n  initialMode?: LayoutMode;\n  /** Layout engine configuration */\n  config?: Partial<LayoutEngineConfig>;\n  /** Callback when layout mode changes */\n  onModeChange?: (mode: LayoutMode, analysis: ContentAnalysis) => void;\n  /** Callback when layout is computed */\n  onLayoutComputed?: (result: LayoutComputeResult) => void;\n  /** Whether to auto-detect layout mode */\n  autoDetect?: boolean;\n}\n\n/**\n * Hook for accessing and controlling the adaptive layout system.\n *\n * @param options - Hook configuration options\n * @returns Adaptive layout state and controls\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const {\n *     layoutState,\n *     mode,\n *     analysis,\n *     setMode,\n *     containerRef\n *   } = useAdaptiveLayout({\n *     initialMode: 'grid',\n *     autoDetect: true,\n *     onModeChange: (mode) => console.log('Mode changed:', mode)\n *   });\n *\n *   return (\n *     <div ref={containerRef}>\n *       <p>Current mode: {mode}</p>\n *       <p>Items: {analysis?.itemCount}</p>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useAdaptiveLayout(options: UseAdaptiveLayoutOptions = {}): UseAdaptiveLayoutReturn {\n  const {\n    initialMode = 'grid',\n    config = {},\n    onModeChange,\n    onLayoutComputed,\n    autoDetect = true,\n  } = options;\n\n  // Refs\n  const containerRef = useRef<HTMLDivElement>(null);\n  const engineRef = useRef<ReturnType<typeof createLayoutEngine> | null>(null);\n\n  // State\n  const [mode, setModeState] = useState<LayoutMode>(initialMode);\n  const [layoutState, setLayoutState] = useState<LayoutState | null>(null);\n  const [analysis, setAnalysis] = useState<ContentAnalysis | null>(null);\n  const [isComputing, setIsComputing] = useState(false);\n  const [isTransitioning, setIsTransitioning] = useState(false);\n\n  // Merge config with defaults\n  const mergedConfig = useMemo<LayoutEngineConfig>(\n    () => ({ ...DEFAULT_LAYOUT_ENGINE_CONFIG, ...config }),\n    [config]\n  );\n\n  // Initialize engine\n  useEffect(() => {\n    engineRef.current = createLayoutEngine(mergedConfig);\n\n    return () => {\n      engineRef.current?.destroy();\n      engineRef.current = null;\n    };\n  }, [mergedConfig]);\n\n  // Compute layout\n  const computeLayout = useCallback(() => {\n    const engine = engineRef.current;\n    const container = containerRef.current;\n\n    if (!engine || !container) return;\n\n    setIsComputing(true);\n\n    try {\n      // Analyze content\n      const contentAnalysis = engine.analyze(container);\n      setAnalysis(contentAnalysis);\n\n      // Get container dimensions\n      const rect = container.getBoundingClientRect();\n      const containerDimensions: Dimensions = { width: rect.width, height: rect.height };\n\n      // Get item IDs from children\n      const itemIds = Array.from(container.children).map((child, index) => {\n        const id = (child as HTMLElement).getAttribute('data-layout-id');\n        return id ?? `item-${index}`;\n      });\n\n      // Compute layout\n      const result = engine.compute({\n        containerId: container.id || 'adaptive-container',\n        itemIds,\n        containerDimensions,\n        forcedMode: autoDetect ? undefined : mode,\n      });\n\n      // Update state\n      setLayoutState(result.state);\n\n      // Check for mode change\n      if (autoDetect && result.state.mode !== mode) {\n        setModeState(result.state.mode);\n        onModeChange?.(result.state.mode, contentAnalysis);\n      }\n\n      onLayoutComputed?.(result);\n    } finally {\n      setIsComputing(false);\n    }\n  }, [autoDetect, mode, onModeChange, onLayoutComputed]);\n\n  // Set mode manually\n  const setMode = useCallback(\n    (newMode: LayoutMode) => {\n      const previousMode = mode;\n      setModeState(newMode);\n\n      if (newMode !== previousMode) {\n        setIsTransitioning(true);\n\n        // Recompute layout with new mode\n        requestAnimationFrame(() => {\n          computeLayout();\n          setIsTransitioning(false);\n        });\n      }\n    },\n    [mode, computeLayout]\n  );\n\n  // Recompute layout\n  const recompute = useCallback(() => {\n    computeLayout();\n  }, [computeLayout]);\n\n  // Observe container size changes\n  useEffect(() => {\n    const container = containerRef.current;\n    if (!container) return;\n\n    const engine = engineRef.current;\n    if (!engine) return;\n\n    let timeoutId: ReturnType<typeof setTimeout>;\n\n    const cleanup = engine.observe(container, () => {\n      clearTimeout(timeoutId);\n      timeoutId = setTimeout(computeLayout, mergedConfig.resizeDebounceMs);\n    });\n\n    // Initial computation\n    computeLayout();\n\n    return () => {\n      cleanup();\n      clearTimeout(timeoutId);\n    };\n  }, [computeLayout, mergedConfig.resizeDebounceMs]);\n\n  return {\n    layoutState,\n    mode,\n    analysis,\n    isComputing,\n    isTransitioning,\n    setMode,\n    recompute,\n    containerRef,\n  };\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\nexport type { UseAdaptiveLayoutReturn };\n"],"names":["useAdaptiveLayout","options","initialMode","config","onModeChange","onLayoutComputed","autoDetect","containerRef","useRef","engineRef","mode","setModeState","useState","layoutState","setLayoutState","analysis","setAnalysis","isComputing","setIsComputing","isTransitioning","setIsTransitioning","mergedConfig","useMemo","DEFAULT_LAYOUT_ENGINE_CONFIG","useEffect","createLayoutEngine","computeLayout","useCallback","engine","container","contentAnalysis","rect","containerDimensions","itemIds","child","index","result","setMode","newMode","previousMode","recompute","timeoutId","cleanup"],"mappings":"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"}