{"version":3,"file":"MorphTransition.mjs","sources":["../../../../src/lib/layouts/adaptive/MorphTransition.tsx"],"sourcesContent":["/**\n * @fileoverview MorphTransition Component\n *\n * A wrapper component that enables FLIP-based morphing transitions for its\n * children. Tracks element positions across renders and animates between\n * states using GPU-accelerated transforms.\n *\n * @module layouts/adaptive/MorphTransition\n * @version 1.0.0\n */\n\nimport {\n  Children,\n  cloneElement,\n  isValidElement,\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n  type CSSProperties,\n  type ReactElement,\n  type ReactNode,\n} from 'react';\nimport type { LayoutRect, MorphTransitionConfig, MorphTransitionProps } from './types';\nimport { DEFAULT_MORPH_TRANSITION_CONFIG } from './types';\n// import { createMorphController } from './morph-transition';\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\n/**\n * Default initial animation state.\n */\nconst DEFAULT_INITIAL: Partial<LayoutRect> = {\n  opacity: 0,\n  scaleX: 0.95,\n  scaleY: 0.95,\n};\n\n/**\n * Default animate state.\n */\nconst DEFAULT_ANIMATE: Partial<LayoutRect> = {\n  opacity: 1,\n  scaleX: 1,\n  scaleY: 1,\n};\n\n/**\n * Default exit animation state.\n */\nconst DEFAULT_EXIT: Partial<LayoutRect> = {\n  opacity: 0,\n  scaleX: 0.95,\n  scaleY: 0.95,\n};\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Applies a layout rect as CSS transform and opacity.\n */\nfunction applyLayoutRect(element: HTMLElement, rect: Partial<LayoutRect>): void {\n  const transforms: string[] = [];\n\n  if (rect.x !== undefined || rect.y !== undefined) {\n    transforms.push(`translate3d(${rect.x ?? 0}px, ${rect.y ?? 0}px, 0)`);\n  }\n\n  if (rect.scaleX !== undefined || rect.scaleY !== undefined) {\n    transforms.push(`scale(${rect.scaleX ?? 1}, ${rect.scaleY ?? 1})`);\n  }\n\n  if (rect.rotation !== undefined) {\n    transforms.push(`rotate(${rect.rotation}deg)`);\n  }\n\n  if (transforms.length > 0) {\n    element.style.transform = transforms.join(' ');\n  }\n\n  if (rect.opacity !== undefined) {\n    element.style.opacity = String(rect.opacity);\n  }\n}\n\n/**\n * Interpolates between two layout rect values.\n */\nfunction interpolateRect(\n  from: Partial<LayoutRect>,\n  to: Partial<LayoutRect>,\n  progress: number\n): Partial<LayoutRect> {\n  const lerp = (a: number | undefined, b: number | undefined, t: number): number | undefined => {\n    if (a === undefined && b === undefined) return undefined;\n    return (a ?? 0) + ((b ?? 0) - (a ?? 0)) * t;\n  };\n\n  return {\n    x: lerp(from.x, to.x, progress),\n    y: lerp(from.y, to.y, progress),\n    width: lerp(from.width, to.width, progress),\n    height: lerp(from.height, to.height, progress),\n    scaleX: lerp(from.scaleX, to.scaleX, progress),\n    scaleY: lerp(from.scaleY, to.scaleY, progress),\n    rotation: lerp(from.rotation, to.rotation, progress),\n    opacity: lerp(from.opacity, to.opacity, progress),\n  };\n}\n\n/**\n * Easing function for animations.\n */\nfunction easeOutCubic(t: number): number {\n  return 1 - Math.pow(1 - t, 3);\n}\n\n// =============================================================================\n// MORPH TRANSITION COMPONENT\n// =============================================================================\n\n/**\n * MorphTransition enables FLIP-based morphing transitions for its child element.\n * It tracks the element's position across renders and animates between states.\n *\n * @example\n * ```tsx\n * // Basic usage with layout ID\n * <MorphTransition layoutId=\"card-1\">\n *   <Card>{content}</Card>\n * </MorphTransition>\n *\n * // With enter/exit animations\n * <MorphTransition\n *   layoutId=\"modal\"\n *   initial={{ opacity: 0, scaleX: 0.9, scaleY: 0.9 }}\n *   animate={{ opacity: 1, scaleX: 1, scaleY: 1 }}\n *   exit={{ opacity: 0, scaleX: 0.9, scaleY: 0.9 }}\n *   config={{ duration: 300, easing: 'ease-out' }}\n * >\n *   <Modal>{children}</Modal>\n * </MorphTransition>\n * ```\n */\nexport function MorphTransition({\n  children,\n  layoutId,\n  config = {},\n  present = true,\n  initial = DEFAULT_INITIAL,\n  animate = DEFAULT_ANIMATE,\n  exit = DEFAULT_EXIT,\n  className,\n  style,\n}: MorphTransitionProps): ReactNode {\n  // Refs\n  const elementRef = useRef<HTMLElement | null>(null);\n  const previousRectRef = useRef<DOMRect | null>(null);\n  const animationFrameRef = useRef<number | null>(null);\n\n  // State\n  const [isAnimating, setIsAnimating] = useState(false);\n  const [isExiting, setIsExiting] = useState(false);\n  const [isVisible, setIsVisible] = useState(present);\n\n  // Merged configuration\n  const mergedConfig = useMemo<MorphTransitionConfig>(\n    () => ({ ...DEFAULT_MORPH_TRANSITION_CONFIG, ...config }),\n    [config]\n  );\n\n  // Cancel any running animation\n  const cancelAnimation = useCallback(() => {\n    if (animationFrameRef.current !== null) {\n      cancelAnimationFrame(animationFrameRef.current);\n      animationFrameRef.current = null;\n    }\n  }, []);\n\n  // Run an animation\n  const runAnimation = useCallback(\n    (from: Partial<LayoutRect>, to: Partial<LayoutRect>, onComplete?: () => void) => {\n      cancelAnimation();\n      setIsAnimating(true);\n\n      const startTime = performance.now();\n      const { duration } = mergedConfig;\n\n      const animate = (currentTime: number): void => {\n        const elapsed = currentTime - startTime - mergedConfig.delay;\n\n        if (elapsed < 0) {\n          animationFrameRef.current = requestAnimationFrame(animate);\n          return;\n        }\n\n        const rawProgress = Math.min(elapsed / duration, 1);\n        const easedProgress = easeOutCubic(rawProgress);\n\n        if (elementRef.current) {\n          const currentRect = interpolateRect(from, to, easedProgress);\n          applyLayoutRect(elementRef.current, currentRect);\n        }\n\n        if (rawProgress < 1) {\n          animationFrameRef.current = requestAnimationFrame(animate);\n        } else {\n          setIsAnimating(false);\n          onComplete?.();\n        }\n      };\n\n      animationFrameRef.current = requestAnimationFrame(animate);\n    },\n    [cancelAnimation, mergedConfig]\n  );\n\n  // Handle presence changes\n  useEffect(() => {\n    if (present && !isVisible) {\n      // Enter animation\n      setIsVisible(true);\n      setIsExiting(false);\n\n      // Apply initial state immediately\n      if (elementRef.current) {\n        applyLayoutRect(elementRef.current, initial);\n      }\n\n      // Animate to final state\n      requestAnimationFrame(() => {\n        runAnimation(initial, animate);\n      });\n    } else if (!present && isVisible && !isExiting) {\n      // Exit animation\n      setIsExiting(true);\n\n      runAnimation(animate, exit, () => {\n        setIsVisible(false);\n        setIsExiting(false);\n      });\n    }\n  }, [present, isVisible, isExiting, initial, animate, exit, runAnimation]);\n\n  // FLIP animation for layout changes\n  useLayoutEffect(() => {\n    const element = elementRef.current;\n    if (!element || !isVisible || isExiting) return;\n\n    const currentRect = element.getBoundingClientRect();\n\n    if (previousRectRef.current) {\n      const prevRect = previousRectRef.current;\n\n      // Check if position/size changed\n      const dx = prevRect.x - currentRect.x;\n      const dy = prevRect.y - currentRect.y;\n      const dw = prevRect.width / currentRect.width;\n      const dh = prevRect.height / currentRect.height;\n\n      const hasChanged =\n        Math.abs(dx) > 1 || Math.abs(dy) > 1 || Math.abs(dw - 1) > 0.01 || Math.abs(dh - 1) > 0.01;\n\n      if (hasChanged && mergedConfig.interruptible) {\n        // Apply inverted transform\n        element.style.transform = `translate3d(${dx}px, ${dy}px, 0) scale(${dw}, ${dh})`;\n        element.style.transition = 'none';\n\n        // Force reflow\n        void element.offsetHeight;\n\n        // Animate to identity\n        element.style.transition = `transform ${mergedConfig.duration}ms ${mergedConfig.easing}`;\n        element.style.transform = 'translate3d(0, 0, 0) scale(1, 1)';\n\n        // Clean up after animation\n        const cleanup = (): void => {\n          element.style.transform = '';\n          element.style.transition = '';\n        };\n\n        element.addEventListener('transitionend', cleanup, { once: true });\n      }\n    }\n\n    previousRectRef.current = currentRect;\n  });\n\n  // Cleanup on unmount\n  useEffect(() => {\n    return () => {\n      cancelAnimation();\n    };\n  }, [cancelAnimation]);\n\n  // Create ref callback (must be before early return to satisfy hooks rules)\n  const refCallback = useCallback((el: HTMLElement | null) => {\n    elementRef.current = el;\n    // Forward ref if child has one - child is stable from Children.only\n    const childElement = Children.only(children);\n    if (isValidElement(childElement)) {\n      const childRef = (childElement as ReactElement<{ ref?: (el: HTMLElement | null) => void }>)\n        .props.ref;\n      if (typeof childRef === 'function') {\n        childRef(el);\n      }\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Don't render if not visible\n  if (!isVisible) {\n    return null;\n  }\n\n  // Clone child with ref and layout ID\n  const child = Children.only(children);\n  if (!isValidElement(child)) {\n    return child;\n  }\n\n  return cloneElement(\n    child as ReactElement<{\n      ref?: (el: HTMLElement | null) => void;\n      'data-layout-id'?: string;\n      'data-morph-animating'?: boolean;\n      'data-morph-exiting'?: boolean;\n      className?: string;\n      style?: CSSProperties;\n    }>,\n    {\n      ref: refCallback,\n      'data-layout-id': layoutId,\n      'data-morph-animating': isAnimating,\n      'data-morph-exiting': isExiting,\n      className:\n        className != null && className !== ''\n          ? `${(child.props as { className?: string }).className ?? ''} ${className}`.trim()\n          : (child.props as { className?: string }).className,\n      style: {\n        ...(child.props as { style?: CSSProperties }).style,\n        ...style,\n        // Ensure GPU acceleration\n        willChange: isAnimating ? 'transform, opacity' : undefined,\n      },\n    }\n  );\n}\n\n// =============================================================================\n// ANIMATED PRESENCE\n// =============================================================================\n\n/**\n * Props for AnimatedPresence component.\n */\ninterface AnimatedPresenceProps {\n  /** Children to animate */\n  children: ReactNode;\n  /** Whether to wait for exit animations before removing */\n  exitBeforeEnter?: boolean;\n  /** Callback when all exits are complete */\n  onExitComplete?: () => void;\n}\n\n/**\n * AnimatedPresence enables exit animations for children when they're removed.\n *\n * @example\n * ```tsx\n * <AnimatedPresence>\n *   {isVisible && (\n *     <MorphTransition layoutId=\"item\" exit={{ opacity: 0 }}>\n *       <Item />\n *     </MorphTransition>\n *   )}\n * </AnimatedPresence>\n * ```\n */\nexport function AnimatedPresence({\n  children,\n  exitBeforeEnter = false,\n  onExitComplete,\n}: AnimatedPresenceProps): ReactNode {\n  const [presentChildren, setPresentChildren] = useState<ReactNode>(children);\n  const [_exitingKeys, setExitingKeys] = useState<Set<string>>(new Set());\n  const previousChildrenRef = useRef<ReactNode>(children);\n\n  useEffect(() => {\n    const previousChildren = previousChildrenRef.current;\n    previousChildrenRef.current = children;\n\n    // Get keys from current and previous children\n    const currentKeys = new Set<string>();\n    const previousKeys = new Set<string>();\n\n    Children.forEach(children, (child) => {\n      if (isValidElement(child) && child.key !== null) {\n        currentKeys.add(String(child.key));\n      }\n    });\n\n    Children.forEach(previousChildren, (child) => {\n      if (isValidElement(child) && child.key !== null) {\n        previousKeys.add(String(child.key));\n      }\n    });\n\n    // Find exiting children\n    const newExitingKeys = new Set<string>();\n    for (const key of previousKeys) {\n      if (!currentKeys.has(key)) {\n        newExitingKeys.add(key);\n      }\n    }\n\n    if (newExitingKeys.size > 0) {\n      // Use requestAnimationFrame to defer state update\n      const frameId = requestAnimationFrame(() => {\n        setExitingKeys(newExitingKeys);\n\n        // Keep exiting children in the render\n        const exitingChildren: ReactNode[] = [];\n        Children.forEach(previousChildren, (child) => {\n          if (\n            isValidElement(child) &&\n            child.key !== null &&\n            newExitingKeys.has(String(child.key))\n          ) {\n            // Clone with present=false to trigger exit animation\n            exitingChildren.push(\n              cloneElement(child as ReactElement<{ present?: boolean; key: string }>, {\n                present: false,\n                key: `exiting-${child.key}`,\n              })\n            );\n          }\n        });\n\n        setPresentChildren(\n          <>\n            {exitBeforeEnter ? null : children}\n            {exitingChildren}\n          </>\n        );\n\n        // Remove exiting children after animation\n        const duration = 300; // Default duration\n        setTimeout(() => {\n          setExitingKeys(new Set());\n          setPresentChildren(children);\n          onExitComplete?.();\n        }, duration + 50);\n      });\n\n      return () => {\n        cancelAnimationFrame(frameId);\n      };\n    } else {\n      requestAnimationFrame(() => {\n        setPresentChildren(children);\n      });\n      return undefined;\n    }\n  }, [children, exitBeforeEnter, onExitComplete]);\n\n  return presentChildren;\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\nexport type { MorphTransitionProps, AnimatedPresenceProps };\n"],"names":["DEFAULT_INITIAL","DEFAULT_ANIMATE","DEFAULT_EXIT","applyLayoutRect","element","rect","transforms","interpolateRect","from","to","progress","lerp","a","b","t","easeOutCubic","MorphTransition","children","layoutId","config","present","initial","animate","exit","className","style","elementRef","useRef","previousRectRef","animationFrameRef","isAnimating","setIsAnimating","useState","isExiting","setIsExiting","isVisible","setIsVisible","mergedConfig","useMemo","DEFAULT_MORPH_TRANSITION_CONFIG","cancelAnimation","useCallback","runAnimation","onComplete","startTime","duration","currentTime","elapsed","rawProgress","easedProgress","currentRect","useEffect","useLayoutEffect","prevRect","dx","dy","dw","dh","cleanup","refCallback","el","childElement","Children","isValidElement","childRef","child","cloneElement","AnimatedPresence","exitBeforeEnter","onExitComplete","presentChildren","setPresentChildren","_exitingKeys","setExitingKeys","previousChildrenRef","previousChildren","currentKeys","previousKeys","newExitingKeys","key","frameId","exitingChildren","jsxs","Fragment"],"mappings":"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"}