| 1 | import * as React from 'react' |
| 2 | import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' |
| 3 | import { cn } from '@renderer/lib/utils' |
| 4 | |
| 5 | interface ScrollAreaProps extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> { |
| 6 | viewportClassName?: string |
| 7 | viewportRef?: React.Ref<HTMLDivElement> |
| 8 | onViewportScroll?: React.UIEventHandler<HTMLDivElement> |
| 9 | scrollbars?: 'vertical' | 'horizontal' | 'both' |
| 10 | } |
| 11 | |
| 12 | export function ScrollArea({ |
| 13 | className, |
| 14 | children, |
| 15 | viewportClassName, |
| 16 | viewportRef, |
| 17 | onViewportScroll, |
| 18 | scrollbars = 'vertical', |
| 19 | ...props |
| 20 | }: ScrollAreaProps) { |
| 21 | return ( |
| 22 | <ScrollAreaPrimitive.Root className={cn('relative overflow-hidden', className)} {...props}> |
| 23 | <ScrollAreaPrimitive.Viewport |
| 24 | ref={viewportRef} |
| 25 | onScroll={onViewportScroll} |
| 26 | className={cn('h-full w-full rounded-[inherit]', viewportClassName)} |
| 27 | > |
| 28 | {children} |
| 29 | </ScrollAreaPrimitive.Viewport> |
| 30 | {(scrollbars === 'vertical' || scrollbars === 'both') && <ScrollBar orientation="vertical" />} |
| 31 | {(scrollbars === 'horizontal' || scrollbars === 'both') && <ScrollBar orientation="horizontal" />} |
| 32 | <ScrollAreaPrimitive.Corner className="bg-transparent" /> |
| 33 | </ScrollAreaPrimitive.Root> |
| 34 | ) |
| 35 | } |
| 36 | |
| 37 | const ScrollBar = React.forwardRef< |
| 38 | React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>, |
| 39 | React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> |
| 40 | >(({ className, orientation = 'vertical', ...props }, ref) => ( |
| 41 | <ScrollAreaPrimitive.ScrollAreaScrollbar |
| 42 | ref={ref} |
| 43 | orientation={orientation} |
| 44 | className={cn( |
| 45 | 'flex touch-none select-none p-0.5 transition-colors', |
| 46 | orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent', |
| 47 | orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent', |
| 48 | className |
| 49 | )} |
| 50 | {...props} |
| 51 | > |
| 52 | <ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-[#8ca66e]/70 transition-colors before:absolute before:left-1/2 before:top-1/2 before:h-full before:min-h-8 before:w-full before:min-w-8 before:-translate-x-1/2 before:-translate-y-1/2 hover:bg-[#6f8159]/82" /> |
| 53 | </ScrollAreaPrimitive.ScrollAreaScrollbar> |
| 54 | )) |
| 55 | ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName |
| 56 |