Scroll area
Custom scrollable region with a styled scrollbar. Use when native overflow would break a fixed layout.
Examples
Vertical
Horizontal
Overview
Scroll area composes a root, viewport, content, scrollbar, and thumb. Give the root a fixed height (or width for horizontal scroll) so overflow can appear. Built on Base UI Scroll Area.
tsx
import { ScrollArea, ScrollAreaViewport, ScrollAreaContent, ScrollAreaScrollbar, ScrollAreaThumb, } from "@standard-ui/react" <ScrollArea className="h-48"> <ScrollAreaViewport> <ScrollAreaContent> {/* long content */} </ScrollAreaContent> </ScrollAreaViewport> <ScrollAreaScrollbar orientation="vertical"> <ScrollAreaThumb /> </ScrollAreaScrollbar> </ScrollArea>
Usage
Structure
Put scrollable children inside ScrollAreaContent, nested in ScrollAreaViewport. Add a scrollbar with matching orientation and a ScrollAreaThumb.
tsx
<ScrollArea className="h-48 w-full"> <ScrollAreaViewport> <ScrollAreaContent className="p-4"> … </ScrollAreaContent> </ScrollAreaViewport> <ScrollAreaScrollbar orientation="vertical"> <ScrollAreaThumb /> </ScrollAreaScrollbar> </ScrollArea>
Orientation
Set orientation="vertical" or "horizontal" on the scrollbar. Default is vertical.
tsx
<ScrollAreaScrollbar orientation="vertical"> <ScrollAreaThumb /> </ScrollAreaScrollbar>
API
Parts mirror Base UI Scroll Area. Style the root for size and overflow; compose scrollbar and thumb for the track.
| Part | Role |
|---|---|
| ScrollArea | Root container. Set a fixed height or width. |
| ScrollAreaViewport | Focusable scrolling viewport. |
| ScrollAreaContent | Wraps the scrollable children. |
| ScrollAreaScrollbar | Track for vertical or horizontal scroll. |
| ScrollAreaThumb | Draggable thumb inside the scrollbar. |
ScrollAreaScrollbar
| Prop | Type | Default | Description |
|---|---|---|---|
| orientation | "vertical" | "horizontal" | "vertical" | Scroll direction the bar controls. |
| keepMounted | boolean | false | Keep the bar in the DOM when content is not scrollable. |
Guidelines
Do
- Give the root a constrained size so overflow is intentional
- Use in sidebars, dialogs, and panels where native scrollbars clash with chrome
- Keep paragraphs short so scrolling content stays scannable
Don't
- Don't wrap the whole page — prefer native document scroll
- Don't omit a scrollbar when content can overflow
- Don't nest scroll areas unless both axes are clearly needed