{"version":3,"file":"ScrollAwareContainer.mjs","sources":["../../../../src/lib/layouts/context-aware/ScrollAwareContainer.tsx"],"sourcesContent":["/**\n * @fileoverview Scroll-Aware Container Component\n *\n * A container component that provides scroll state awareness\n * and optional virtualization for performance.\n *\n * Features:\n * - Tracks scroll position and direction\n * - Emits scroll events and edge events\n * - Optional content virtualization\n * - Sticky element coordination\n * - Custom scrollbar styling support\n *\n * @module layouts/context-aware/ScrollAwareContainer\n * @author Agent 4 - PhD Context Systems Expert\n * @version 1.0.0\n */\n\nimport React, {\n  useRef,\n  useEffect,\n  useState,\n  useCallback,\n  useMemo,\n  useContext,\n  forwardRef,\n} from 'react';\nimport { ScrollContainerContext } from '../../contexts/ScrollContainerContext';\n\nimport type { ScrollContainer, ScrollAwareContainerProps } from './types';\nimport {\n  type ScrollTracker,\n  ScrollContainerRegistry,\n  type ScrollCallback,\n  type ScrollEdgeCallback,\n} from './scroll-tracker';\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/* @refresh reset */\n\n/**\n * Hook to access scroll container context.\n */\n// eslint-disable-next-line react-refresh/only-export-components -- hook export is valid\nexport function useScrollContainerContext(): ScrollContainer | null {\n  const context = useContext(ScrollContainerContext);\n  return (context as ScrollContainer | null) ?? null;\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended props with additional scroll features.\n */\nexport interface ExtendedScrollAwareContainerProps extends ScrollAwareContainerProps {\n  /** Maximum height before scroll */\n  maxHeight?: number | string;\n  /** Whether to show scroll indicators */\n  showScrollIndicators?: boolean;\n  /** Callback when scroll starts */\n  onScrollStart?: () => void;\n  /** Callback when scroll ends */\n  onScrollEnd?: () => void;\n  /** Scroll snap configuration */\n  scrollSnap?: {\n    type: 'mandatory' | 'proximity';\n    align: 'start' | 'center' | 'end';\n  };\n}\n\n/**\n * Scroll indicators visibility state.\n */\ninterface ScrollIndicators {\n  top: boolean;\n  right: boolean;\n  bottom: boolean;\n  left: boolean;\n}\n\n// ============================================================================\n// ScrollAwareContainer Component\n// ============================================================================\n\n/**\n * A scroll container that tracks and exposes scroll state.\n *\n * @remarks\n * This component wraps content in a scrollable container and\n * provides scroll state information to children and callbacks.\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ScrollAwareContainer>\n *   <LongContent />\n * </ScrollAwareContainer>\n *\n * // With scroll callbacks\n * <ScrollAwareContainer\n *   onScroll={(state) => console.log('Scroll:', state.scrollPosition)}\n *   onScrollEdge={(edge) => console.log('Reached:', edge)}\n * >\n *   <LongContent />\n * </ScrollAwareContainer>\n *\n * // With virtualization (for large lists)\n * <ScrollAwareContainer virtualize itemHeight={50}>\n *   {items.map((item) => <Item key={item.id} {...item} />)}\n * </ScrollAwareContainer>\n * ```\n */\nexport const ScrollAwareContainer = forwardRef<HTMLDivElement, ExtendedScrollAwareContainerProps>(\n  (\n    {\n      children,\n      className,\n      style,\n      virtualize = false,\n      itemHeight,\n      overscan = 5,\n      onScroll,\n      onScrollEdge,\n      hideScrollbar = false,\n      scrollBehavior = 'auto',\n      maxHeight,\n      showScrollIndicators = false,\n      onScrollStart,\n      onScrollEnd,\n      scrollSnap,\n      'data-testid': testId,\n    },\n    forwardedRef\n  ) => {\n    // Refs\n    const containerRef = useRef<HTMLDivElement>(null);\n    const trackerRef = useRef<ScrollTracker | null>(null);\n    const isScrollingRef = useRef(false);\n    const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n    // Combine refs\n    const setRefs = useCallback(\n      (node: HTMLDivElement | null) => {\n        // Use Object.assign to update ref.current without type escape\n        Object.assign(containerRef, { current: node });\n        if (typeof forwardedRef === 'function') {\n          forwardedRef(node);\n        } else if (forwardedRef) {\n          forwardedRef.current = node;\n        }\n      },\n      [forwardedRef]\n    );\n\n    // State\n    const [scrollState, setScrollState] = useState<ScrollContainer | null>(null);\n    const [indicators, setIndicators] = useState<ScrollIndicators>({\n      top: false,\n      right: false,\n      bottom: true,\n      left: false,\n    });\n\n    // Check SSR\n    const isSSR = typeof window === 'undefined';\n\n    /**\n     * Handles scroll state updates.\n     */\n    const handleScrollUpdate = useCallback<ScrollCallback>(\n      (state) => {\n        setScrollState(state);\n\n        // Update indicators\n        if (showScrollIndicators) {\n          setIndicators({\n            top: !state.atEdge.top,\n            right: !state.atEdge.right,\n            bottom: !state.atEdge.bottom,\n            left: !state.atEdge.left,\n          });\n        }\n\n        // Handle scroll start/end\n        if (!isScrollingRef.current && state.isScrolling) {\n          isScrollingRef.current = true;\n          onScrollStart?.();\n        }\n\n        if (scrollTimeoutRef.current) {\n          clearTimeout(scrollTimeoutRef.current);\n        }\n\n        scrollTimeoutRef.current = setTimeout(() => {\n          if (isScrollingRef.current) {\n            isScrollingRef.current = false;\n            onScrollEnd?.();\n          }\n        }, 150);\n\n        // Call external callback\n        onScroll?.(state);\n      },\n      [showScrollIndicators, onScroll, onScrollStart, onScrollEnd]\n    );\n\n    /**\n     * Handles scroll edge events.\n     */\n    const handleEdge = useCallback<ScrollEdgeCallback>(\n      (edge) => {\n        onScrollEdge?.(edge);\n      },\n      [onScrollEdge]\n    );\n\n    // Initialize scroll tracker\n    useEffect(() => {\n      if (isSSR || !containerRef.current) {\n        return;\n      }\n\n      const registry = ScrollContainerRegistry.getInstance();\n      const tracker = registry.getTracker(containerRef.current, {\n        throttleMs: 16,\n        trackVelocity: true,\n        trackDirection: true,\n      });\n\n      trackerRef.current = tracker;\n\n      // Subscribe to scroll events\n      const unsubScroll = tracker.onScroll(handleScrollUpdate);\n      const unsubEdge = tracker.onEdge(handleEdge);\n\n      // Set initial state\n      setScrollState(tracker.getState());\n\n      return () => {\n        unsubScroll();\n        unsubEdge();\n\n        if (scrollTimeoutRef.current) {\n          clearTimeout(scrollTimeoutRef.current);\n        }\n      };\n    }, [isSSR, handleScrollUpdate, handleEdge]);\n\n    /**\n     * Computes container styles.\n     */\n    const containerStyle = useMemo((): React.CSSProperties => {\n      const baseStyle: React.CSSProperties = {\n        overflow: 'auto',\n        scrollBehavior,\n        ...style,\n      };\n\n      if (maxHeight !== undefined) {\n        baseStyle.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n      }\n\n      if (hideScrollbar) {\n        baseStyle.scrollbarWidth = 'none';\n        // Note: For WebKit, use CSS class\n      }\n\n      if (scrollSnap) {\n        baseStyle.scrollSnapType = `y ${scrollSnap.type}`;\n      }\n\n      return baseStyle;\n    }, [style, maxHeight, hideScrollbar, scrollBehavior, scrollSnap]);\n\n    /**\n     * Computes class name with scrollbar hiding.\n     */\n    const computedClassName = useMemo(() => {\n      const classes = [className];\n\n      if (hideScrollbar) {\n        classes.push('hide-scrollbar');\n      }\n\n      return classes.filter(Boolean).join(' ');\n    }, [className, hideScrollbar]);\n\n    /**\n     * Renders virtualized content.\n     */\n    const renderVirtualized = useCallback(async () => {\n      if (!virtualize || itemHeight == null || itemHeight === 0 || scrollState == null) {\n        return children;\n      }\n\n      const childArray = React.Children.toArray(children);\n      const totalItems = childArray.length;\n      const scrollTop = scrollState.scrollPosition.y;\n      const containerHeight = scrollState.visibleDimensions.height;\n\n      // Calculate visible range\n      const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n      const visibleCount = Math.ceil(containerHeight / itemHeight);\n      const endIndex = Math.min(totalItems, startIndex + visibleCount + overscan * 2);\n\n      // Calculate offsets\n      const offsetTop = startIndex * itemHeight;\n      const totalHeight = totalItems * itemHeight;\n\n      return (\n        <div\n          style={{\n            height: totalHeight,\n            position: 'relative',\n          }}\n        >\n          <div\n            style={{\n              position: 'absolute',\n              top: offsetTop,\n              left: 0,\n              right: 0,\n            }}\n          >\n            {childArray.slice(startIndex, endIndex).map((child, index) => (\n              <div\n                key={startIndex + index}\n                style={{\n                  height: itemHeight,\n                  scrollSnapAlign: scrollSnap?.align,\n                }}\n              >\n                {child}\n              </div>\n            ))}\n          </div>\n        </div>\n      );\n    }, [virtualize, itemHeight, scrollState, children, overscan, scrollSnap]);\n\n    return (\n      <ScrollContainerContext.Provider\n        value={\n          scrollState\n            ? {\n                element: scrollState.element as HTMLElement,\n                position: {\n                  x: scrollState.scrollPosition.x,\n                  y: scrollState.scrollPosition.y,\n                },\n                isScrolling: scrollState.isScrolling,\n                scrollTo: (x: number, y: number, smooth?: boolean) => {\n                  scrollState.element.scrollTo({\n                    left: x,\n                    top: y,\n                    behavior: smooth ? 'smooth' : 'auto',\n                  });\n                },\n                scrollToTop: (smooth?: boolean) => {\n                  scrollState.element.scrollTo({\n                    top: 0,\n                    behavior: smooth ? 'smooth' : 'auto',\n                  });\n                },\n                scrollToBottom: (smooth?: boolean) => {\n                  scrollState.element.scrollTo({\n                    top: scrollState.element.scrollHeight,\n                    behavior: smooth ? 'smooth' : 'auto',\n                  });\n                },\n                scrollToElement: (element: HTMLElement, options?: ScrollIntoViewOptions) => {\n                  element.scrollIntoView({ behavior: 'smooth', ...options });\n                },\n              }\n            : null\n        }\n      >\n        <div\n          ref={setRefs}\n          className={computedClassName}\n          style={containerStyle}\n          data-testid={testId}\n          data-scroll-container=\"true\"\n          data-scroll-direction={scrollState?.scrollDirection ?? 'none'}\n        >\n          {/* Scroll indicators */}\n          {showScrollIndicators && (\n            <>\n              {indicators.top && <ScrollIndicator position=\"top\" />}\n              {indicators.bottom && <ScrollIndicator position=\"bottom\" />}\n              {indicators.left && <ScrollIndicator position=\"left\" />}\n              {indicators.right && <ScrollIndicator position=\"right\" />}\n            </>\n          )}\n\n          {/* Content */}\n          {virtualize ? renderVirtualized() : children}\n        </div>\n\n        {/* CSS for hiding scrollbar in WebKit */}\n        {hideScrollbar && (\n          <style>\n            {`\n              .hide-scrollbar::-webkit-scrollbar {\n                display: none;\n              }\n            `}\n          </style>\n        )}\n      </ScrollContainerContext.Provider>\n    );\n  }\n);\n\n// ============================================================================\n// Scroll Indicator Component\n// ============================================================================\n\n/**\n * Props for ScrollIndicator.\n */\ninterface ScrollIndicatorProps {\n  position: 'top' | 'right' | 'bottom' | 'left';\n}\n\n/**\n * Visual indicator showing scroll direction availability.\n */\nfunction ScrollIndicator({ position }: ScrollIndicatorProps): React.JSX.Element {\n  const style: React.CSSProperties = {\n    position: 'absolute',\n    pointerEvents: 'none',\n    zIndex: 1,\n    background: 'linear-gradient(to bottom, rgba(0,0,0,0.1), transparent)',\n    ...(position === 'top' && {\n      top: 0,\n      left: 0,\n      right: 0,\n      height: '20px',\n      background: 'linear-gradient(to bottom, rgba(0,0,0,0.1), transparent)',\n    }),\n    ...(position === 'bottom' && {\n      bottom: 0,\n      left: 0,\n      right: 0,\n      height: '20px',\n      background: 'linear-gradient(to top, rgba(0,0,0,0.1), transparent)',\n    }),\n    ...(position === 'left' && {\n      top: 0,\n      bottom: 0,\n      left: 0,\n      width: '20px',\n      background: 'linear-gradient(to right, rgba(0,0,0,0.1), transparent)',\n    }),\n    ...(position === 'right' && {\n      top: 0,\n      bottom: 0,\n      right: 0,\n      width: '20px',\n      background: 'linear-gradient(to left, rgba(0,0,0,0.1), transparent)',\n    }),\n  };\n\n  return <div style={style} data-scroll-indicator={position} />;\n}\n\n// ============================================================================\n// Imperative Handle Hook\n// ============================================================================\n\n/**\n * Hook to get imperative scroll control methods.\n */\n// eslint-disable-next-line react-refresh/only-export-components -- hook export is valid\nexport function useScrollControl(): {\n  scrollState: ScrollContainer | null;\n  scrollTo: (options: { x?: number; y?: number; behavior?: 'auto' | 'smooth' }) => void;\n  scrollBy: (options: { x?: number; y?: number; behavior?: 'auto' | 'smooth' }) => void;\n  scrollToTop: (behavior?: 'auto' | 'smooth') => void;\n  scrollToBottom: (behavior?: 'auto' | 'smooth') => void;\n  isScrolling: boolean;\n  scrollDirection: string;\n  scrollProgress: { x: number; y: number };\n} {\n  const scrollState = useScrollContainerContext();\n\n  const scrollTo = useCallback(\n    (options: { x?: number; y?: number; behavior?: 'auto' | 'smooth' }) => {\n      if (scrollState?.element !== null && scrollState?.element !== undefined) {\n        scrollState.element.scrollTo({\n          left: options.x,\n          top: options.y,\n          behavior: options.behavior,\n        });\n      }\n    },\n    [scrollState]\n  );\n\n  const scrollBy = useCallback(\n    (options: { x?: number; y?: number; behavior?: 'auto' | 'smooth' }) => {\n      if (scrollState?.element !== null && scrollState?.element !== undefined) {\n        scrollState.element.scrollBy({\n          left: options.x,\n          top: options.y,\n          behavior: options.behavior,\n        });\n      }\n    },\n    [scrollState]\n  );\n\n  const scrollToTop = useCallback(\n    (behavior: 'auto' | 'smooth' = 'smooth') => {\n      scrollTo({ y: 0, behavior });\n    },\n    [scrollTo]\n  );\n\n  const scrollToBottom = useCallback(\n    (behavior: 'auto' | 'smooth' = 'smooth') => {\n      if (scrollState !== null && scrollState !== undefined) {\n        scrollTo({\n          y: scrollState.scrollDimensions.height,\n          behavior,\n        });\n      }\n    },\n    [scrollTo, scrollState]\n  );\n\n  return {\n    scrollState,\n    scrollTo,\n    scrollBy,\n    scrollToTop,\n    scrollToBottom,\n    isScrolling: scrollState?.isScrolling ?? false,\n    scrollDirection: scrollState?.scrollDirection ?? 'none',\n    scrollProgress: scrollState?.scrollProgress ?? { x: 0, y: 0 },\n  };\n}\n"],"names":["useScrollContainerContext","useContext","ScrollContainerContext","ScrollAwareContainer","forwardRef","children","className","style","virtualize","itemHeight","overscan","onScroll","onScrollEdge","hideScrollbar","scrollBehavior","maxHeight","showScrollIndicators","onScrollStart","onScrollEnd","scrollSnap","testId","forwardedRef","containerRef","useRef","trackerRef","isScrollingRef","scrollTimeoutRef","setRefs","useCallback","node","scrollState","setScrollState","useState","indicators","setIndicators","isSSR","handleScrollUpdate","state","handleEdge","edge","useEffect","tracker","ScrollContainerRegistry","unsubScroll","unsubEdge","containerStyle","useMemo","baseStyle","computedClassName","classes","renderVirtualized","childArray","React","totalItems","scrollTop","containerHeight","startIndex","visibleCount","endIndex","offsetTop","totalHeight","jsx","child","index","jsxs","x","y","smooth","element","options","Fragment","ScrollIndicator","position","useScrollControl","scrollTo","scrollBy","scrollToTop","behavior","scrollToBottom"],"mappings":"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"}