scroll-area.tsx 1.8 KB

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