Skip to content

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.

PartRole
ScrollAreaRoot container. Set a fixed height or width.
ScrollAreaViewportFocusable scrolling viewport.
ScrollAreaContentWraps the scrollable children.
ScrollAreaScrollbarTrack for vertical or horizontal scroll.
ScrollAreaThumbDraggable thumb inside the scrollbar.

ScrollAreaScrollbar

PropTypeDefaultDescription
orientation"vertical" | "horizontal""vertical"Scroll direction the bar controls.
keepMountedbooleanfalseKeep 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