Scroll Area
Augments native scroll functionality for custom, cross-browser styling.
Installation
Install the following dependencies:
pnpm add @radix-ui/react-scroll-area
Copy and paste the following code into your project.
"use client";
import * as React from "react";
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
import { cn } from "~/utils/tailwind";
const ScrollArea = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> & {
showScrollbar?: boolean;
}
>(({ className, children, showScrollbar = true, ...props }, ref) => (
<ScrollAreaPrimitive.Root
ref={ref}
className={cn("relative overflow-hidden", className)}
{...props}
>
<ScrollAreaPrimitive.Viewport className="size-full rounded-[inherit]">
{children}
</ScrollAreaPrimitive.Viewport>
<ScrollAreaBar showScrollbar={showScrollbar} />
<ScrollAreaPrimitive.Corner />
</ScrollAreaPrimitive.Root>
));
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
const ScrollAreaBar = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
React.ComponentPropsWithoutRef<
typeof ScrollAreaPrimitive.ScrollAreaScrollbar
> & { showScrollbar?: boolean }
>(
(
{ className, orientation = "vertical", showScrollbar = true, ...props },
ref,
) => (
<ScrollAreaPrimitive.ScrollAreaScrollbar
ref={ref}
orientation={orientation}
className={cn(
"flex touch-none select-none transition-colors",
orientation === "vertical" &&
"h-full w-2.5 border-l border-l-transparent p-px",
orientation === "horizontal" &&
"h-2.5 flex-col border-t border-t-transparent p-px",
className,
)}
{...props}
>
<ScrollAreaPrimitive.ScrollAreaThumb
className={cn(
"relative flex-1 rounded-full",
showScrollbar && "bg-border",
)}
/>
</ScrollAreaPrimitive.ScrollAreaScrollbar>
),
);
ScrollAreaBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
export { ScrollArea, ScrollAreaBar };
Update the import paths to match your project setup.
Usage
import { ScrollArea } from "~/components/ui/ScrollArea";
<ScrollArea className="h-48 w-[350px] rounded-md border p-4">
Jokester began sneaking into the castle in the middle of the night and leaving
jokes all over the place: under the king's pillow, in his soup, even in the
royal toilet. The king was furious, but he couldn't seem to stop Jokester. And
then, one day, the people of the kingdom discovered that the jokes left by
Jokester were so funny that they couldn't help but laugh. And once they
started laughing, they couldn't stop.
</ScrollArea>
Examples
Vertical Scrolling
By default, <ScrollArea>
will scroll vertically.
Horizontal Scrolling
Add <ScrollAreaBar orientation="horizontal" />
as a child of <ScrollArea>
to enable horizontal scrolling.