scroll-area.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. "use client"
  2. import * as React from "react"
  3. import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
  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. orientation={orientation}
  36. className={cn(
  37. "flex touch-none p-px transition-colors select-none",
  38. orientation === "vertical" &&
  39. "h-full w-2.5 border-l border-l-transparent",
  40. orientation === "horizontal" &&
  41. "h-2.5 flex-col border-t border-t-transparent",
  42. className
  43. )}
  44. {...props}
  45. >
  46. <ScrollAreaPrimitive.ScrollAreaThumb
  47. data-slot="scroll-area-thumb"
  48. className="bg-border relative flex-1 rounded-full"
  49. />
  50. </ScrollAreaPrimitive.ScrollAreaScrollbar>
  51. )
  52. }
  53. export { ScrollArea, ScrollBar }