scroll-area.tsx
1'use client'
2
3import * as React from 'react'
4import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'
5
6import { cn } from '@/lib/utils'
7
8const ScrollArea = React.forwardRef<
9 React.ElementRef<typeof ScrollAreaPrimitive.Root>,
10 React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
11>(({ className, children, ...props }, ref) => (
12 <ScrollAreaPrimitive.Root
13 ref={ref}
14 className={cn('relative overflow-hidden', className)}
15 {...props}
16 >
17 <ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
18 {children}
19 </ScrollAreaPrimitive.Viewport>
20 <ScrollBar />
21 <ScrollAreaPrimitive.Corner />
22 </ScrollAreaPrimitive.Root>
23))
24ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
25
26const ScrollBar = React.forwardRef<
27 React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
28 React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
29>(({ className, orientation = 'vertical', ...props }, ref) => (
30 <ScrollAreaPrimitive.ScrollAreaScrollbar
31 ref={ref}
32 orientation={orientation}
33 className={cn(
34 'flex touch-none select-none transition-colors',
35 orientation === 'vertical' &&
36 'h-full w-2.5 border-l border-l-transparent p-[1px]',
37 orientation === 'horizontal' &&
38 'h-2.5 flex-col border-t border-t-transparent p-[1px]',
39 className,
40 )}
41 {...props}
42 >
43 <ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
44 </ScrollAreaPrimitive.ScrollAreaScrollbar>
45))
46ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
47
48export { ScrollArea, ScrollBar }
49