scroll-area.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import * as React from 'react'
  2. import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'
  3. import { cn } from '@/lib/utils'
  4. interface ScrollAreaProps
  5. extends React.ComponentProps<typeof ScrollAreaPrimitive.Root> {
  6. orientation?: 'vertical' | 'horizontal'
  7. }
  8. function ScrollArea({
  9. className,
  10. children,
  11. orientation = 'vertical',
  12. ...props
  13. }: ScrollAreaProps) {
  14. return (
  15. <ScrollAreaPrimitive.Root
  16. data-slot='scroll-area'
  17. className={cn('relative', className)}
  18. {...props}
  19. >
  20. <ScrollAreaPrimitive.Viewport
  21. data-slot='scroll-area-viewport'
  22. className={cn(
  23. 'focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1',
  24. orientation === 'horizontal' && 'overflow-x-auto!'
  25. )}
  26. >
  27. {children}
  28. </ScrollAreaPrimitive.Viewport>
  29. <ScrollBar orientation={orientation} />
  30. <ScrollAreaPrimitive.Corner />
  31. </ScrollAreaPrimitive.Root>
  32. )
  33. }
  34. function ScrollBar({
  35. className,
  36. orientation = 'vertical',
  37. ...props
  38. }: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {
  39. return (
  40. <ScrollAreaPrimitive.ScrollAreaScrollbar
  41. data-slot='scroll-area-scrollbar'
  42. orientation={orientation}
  43. className={cn(
  44. 'flex touch-none p-px transition-colors select-none',
  45. orientation === 'vertical' &&
  46. 'h-full w-2.5 border-l border-l-transparent',
  47. orientation === 'horizontal' &&
  48. 'h-2.5 flex-col border-t border-t-transparent',
  49. className
  50. )}
  51. {...props}
  52. >
  53. <ScrollAreaPrimitive.ScrollAreaThumb
  54. data-slot='scroll-area-thumb'
  55. className='bg-border relative flex-1 rounded-full'
  56. />
  57. </ScrollAreaPrimitive.ScrollAreaScrollbar>
  58. )
  59. }
  60. export { ScrollArea, ScrollBar }