'use client'; import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'; import * as React from 'react'; import { cn } from '@/lib/utils'; const ScrollArea = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { viewPortClassName?: string; orientation?: 'vertical' | 'horizontal'; viewPortRef?: React.RefObject; showGradient?: boolean; gradientClassName?: string; } >( ( { className, children, viewPortClassName, viewPortRef, orientation = 'vertical', showGradient = false, gradientClassName, ...props }, ref, ) => { const [showBottomGradient, setShowBottomGradient] = React.useState(false); const internalViewPortRef = React.useRef(null); const viewportRef = viewPortRef || internalViewPortRef; React.useEffect(() => { if (!showGradient || !viewportRef.current) return; const viewport = viewportRef.current; const checkScroll = () => { const { scrollTop, scrollHeight, clientHeight } = viewport; const hasScrollableContent = scrollHeight > clientHeight; const isAtBottom = scrollTop + clientHeight >= scrollHeight - 1; setShowBottomGradient(hasScrollableContent && !isAtBottom); }; checkScroll(); viewport.addEventListener('scroll', checkScroll); const resizeObserver = new ResizeObserver(checkScroll); if (viewport.firstElementChild) { resizeObserver.observe(viewport.firstElementChild); } return () => { viewport.removeEventListener('scroll', checkScroll); resizeObserver.disconnect(); }; }, [showGradient, viewportRef]); return ( div]:block!', viewPortClassName, )} ref={viewportRef} > {children} {showGradient && showBottomGradient && (
)} ); }, ); ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName; const ScrollBar = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, orientation = 'vertical', ...props }, ref) => ( )); ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName; export { ScrollArea, ScrollBar };