Getting Started
App Providerglobal.d.tsThemesTypes
cn(...args)Text ParserUnits Converters
AnchorAvatarBreadcrumbBurgerButtonCardCarouselCheckerCodeColor PickerCommandConfettiCopyButtonDouble Helix WordsFloating IndicatorGroupHighlight TextIndicatorInputKbdLabelLoaderPaginationPassword RequirementPolymorphic SlotProgressProseRatingRunning AreaScroll AreaSheetsSkeletonSliderStackSvgTableTabsTextareaTimelineTimesToasterTooltipTyping WordsTypography
useClickOutsideuseClipboarduseDeviceInfouseDialoguseDidUpdateuseDirectionuseDisclosureuseDocumentTitleuseDocumentVisibilityuseElementInfouseEyeDropperuseFetchuseFullscreenuseGeoLocationuseHotkeysuseHoveruseIduseImagePopupuseInputStateuseIntersectionuseIntervaluseIsomorphicEffectuseListStateuseLocalStorageuseMeasureScrollbaruseMediaQueryuseMergedRefuseMouseuseMoveuseMutationObserveruseNetworkuseOpenStateuseOrientationuseOSusePaginationusePWAInstalleruseRandomColorsuseReducedMotionuseReloaduseResizeObserveruseScrollIntoViewuseStateHistoryuseTimeoutuseTouchuseTriggeruseUncontrolleduseValidatedStateuseViewportSizeuseWindowEventuseWindowScroll
Docs
Web
Components
Scroll Area
Running Area

A looping motion container for creating continuous scrolling effects like marquees.

Sheets

A flexible system for creating dialogs, dropdowns, drawers, and accordions, including nested support.


Edit this page on GitHub
  • Started
  • Utilities
  • Configuration
  • Components
  • Hooks
  • Examples
  • Github
  • Contributing
⌘+J

© 2025 oeri rights MIT


Designed in Earth-616

Built by oeri

Scroll Area

A styled scroll container with custom scrollbars and behavior, useful for containing overflowing content in a clean, controlled manner.

Usage

Basic usage example to quickly see how the ScrollArea works.

Scrollbar area

v1.2.0-beta.58

v1.2.0-beta.57

v1.2.0-beta.56

v1.2.0-beta.55

v1.2.0-beta.54

v1.2.0-beta.53

v1.2.0-beta.52

v1.2.0-beta.51

v1.2.0-beta.50

v1.2.0-beta.49

v1.2.0-beta.48

v1.2.0-beta.47

v1.2.0-beta.46

v1.2.0-beta.45

v1.2.0-beta.44

v1.2.0-beta.43

v1.2.0-beta.42

v1.2.0-beta.41

v1.2.0-beta.40

v1.2.0-beta.39

v1.2.0-beta.38

v1.2.0-beta.37

v1.2.0-beta.36

v1.2.0-beta.35

v1.2.0-beta.34

v1.2.0-beta.33

v1.2.0-beta.32

v1.2.0-beta.31

v1.2.0-beta.30

v1.2.0-beta.29

v1.2.0-beta.28

v1.2.0-beta.27

v1.2.0-beta.26

v1.2.0-beta.25

v1.2.0-beta.24

v1.2.0-beta.23

v1.2.0-beta.22

v1.2.0-beta.21

v1.2.0-beta.20

v1.2.0-beta.19

v1.2.0-beta.18

v1.2.0-beta.17

v1.2.0-beta.16

v1.2.0-beta.15

v1.2.0-beta.14

v1.2.0-beta.13

v1.2.0-beta.12

v1.2.0-beta.11

v1.2.0-beta.10

v1.2.0-beta.9

v1.2.0-beta.8

v1.2.0-beta.7

v1.2.0-beta.6

v1.2.0-beta.5

v1.2.0-beta.4

v1.2.0-beta.3

v1.2.0-beta.2

v1.2.0-beta.1

import { ScrollArea } from "@/ui/scroll-area";
import { Typography } from "@/ui/typography";
import { FileIcon } from "@/icons/*";

const TAGS = Array.from({ length: 58 }).map((_, i, a) => `v1.2.0-beta.${a.length - i}`);
export function ScrollAreaDemo() {
  return (
    <ScrollArea
      /* use color="" to changes thumb color only */
      color={{ thumb: "hsl(var(--muted-foreground))", track: "hsl(var(--muted))" }}
      className="rounded-md border p-4 data-[orientation=horizontal]:h-max data-[orientation=vertical]:h-72 data-[orientation=vertical]:w-48"
    >
      <Typography
        prose="h6"
        className="inline-flex min-w-max max-w-max items-center rounded-sm border border-constructive bg-constructive/30 px-1.5 py-1 leading-none text-constructive-emphasis group-data-[orientation=horizontal]/sa:mr-4 group-data-[orientation=vertical]/sa:mb-4"
      >
        Scrollbar area
      </Typography>
      {TAGS.map(tag => (
        <p
          key={tag}
          className="flex min-w-max items-center gap-3 border-muted text-sm text-muted-foreground group-data-[orientation=vertical]/sa:mt-2 group-data-[orientation=horizontal]/sa:border-l group-data-[orientation=vertical]/sa:border-b group-data-[orientation=horizontal]/sa:px-4 group-data-[orientation=vertical]/sa:py-1"
        >
          <FileIcon /> {tag}
        </p>
      ))}
    </ScrollArea>
  );
}

Peer Dependencies

Install required dependencies before using the ScrollArea. These libraries handle the low-level mechanics to ensure smooth performance.

pnpm add @radix-ui/react-scroll-area
npm install @radix-ui/react-scroll-area
yarn add @radix-ui/react-scroll-area
bun add @radix-ui/react-scroll-area

Properties

Interactive configurator to explore customization options for the ScrollArea component.

Scrollbar area

v1.2.0-beta.58

v1.2.0-beta.57

v1.2.0-beta.56

v1.2.0-beta.55

v1.2.0-beta.54

v1.2.0-beta.53

v1.2.0-beta.52

v1.2.0-beta.51

v1.2.0-beta.50

v1.2.0-beta.49

v1.2.0-beta.48

v1.2.0-beta.47

v1.2.0-beta.46

v1.2.0-beta.45

v1.2.0-beta.44

v1.2.0-beta.43

v1.2.0-beta.42

v1.2.0-beta.41

v1.2.0-beta.40

v1.2.0-beta.39

v1.2.0-beta.38

v1.2.0-beta.37

v1.2.0-beta.36

v1.2.0-beta.35

v1.2.0-beta.34

v1.2.0-beta.33

v1.2.0-beta.32

v1.2.0-beta.31

v1.2.0-beta.30

v1.2.0-beta.29

v1.2.0-beta.28

v1.2.0-beta.27

v1.2.0-beta.26

v1.2.0-beta.25

v1.2.0-beta.24

v1.2.0-beta.23

v1.2.0-beta.22

v1.2.0-beta.21

v1.2.0-beta.20

v1.2.0-beta.19

v1.2.0-beta.18

v1.2.0-beta.17

v1.2.0-beta.16

v1.2.0-beta.15

v1.2.0-beta.14

v1.2.0-beta.13

v1.2.0-beta.12

v1.2.0-beta.11

v1.2.0-beta.10

v1.2.0-beta.9

v1.2.0-beta.8

v1.2.0-beta.7

v1.2.0-beta.6

v1.2.0-beta.5

v1.2.0-beta.4

v1.2.0-beta.3

v1.2.0-beta.2

v1.2.0-beta.1

Size
Color
import { ScrollArea } from "@/ui/scroll-area";
import { Typography } from "@/ui/typography";
import { FileIcon } from "@/icons/*";

const TAGS = Array.from({ length: 58 }).map((_, i, a) => `v1.2.0-beta.${a.length - i}`);
export function ScrollAreaDemo() {
  return (
    <ScrollArea
      className="rounded-md border p-4 data-[orientation=horizontal]:h-max data-[orientation=vertical]:h-72 data-[orientation=vertical]:w-full"
    >
      <Typography
        prose="h6"
        className="inline-flex min-w-max max-w-max items-center rounded-sm border border-constructive bg-constructive/30 px-1.5 py-1 leading-none text-constructive-emphasis group-data-[orientation=horizontal]/sa:mr-4 group-data-[orientation=vertical]/sa:mb-4"
      >
        Scrollbar area
      </Typography>
      {TAGS.map(tag => (
        <p
          key={tag}
          className="flex min-w-max items-center gap-3 border-muted text-sm text-muted-foreground group-data-[orientation=vertical]/sa:mt-2 group-data-[orientation=horizontal]/sa:border-l group-data-[orientation=vertical]/sa:border-b group-data-[orientation=horizontal]/sa:px-4 group-data-[orientation=vertical]/sa:py-1"
        >
          <FileIcon /> {tag}
        </p>
      ))}
    </ScrollArea>
  );
}

API References

Scroll Area uses @radix-ui under the hood. For a full list of supported props and advanced usage:

  • @radix-ui

Styles API

type T = "root" | "viewport" | "scrollbar" | "thumb" | "corner";
Styles APITypeDefaultAnnotation
className?stringundefinedPass to root component <p>
classNames?Partial<Record<T, string>>undefined
style?CSSPropertiesundefinedPass to root component <p>
styles?Partial<Record<T, CSSProperties>>undefined
unstyled?Partial<Record<T, boolean>>undefined
color?Color | { thumb?: Color; track?: Color }hsl(var(--muted))Passed to thumb | track component

Props API

Props APITypeDefaultAnnotation
unstyled?booleanfalseif true, all default styles will be removed

Source Codes

Full working code example, including necessary markup and styles. You can copy and paste this code directly to start using the component immediately.

scroll-area.tsx