scroll-area.tsx 1.7 KB

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