> ## Documentation Index
> Fetch the complete documentation index at: https://araf.badr.co.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Scroll Area

> A cross-browser custom scrollable container with consistent styled scrollbars — replaces native OS scrollbars.

## Overview

<div style={{padding:"28px 24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",display:"flex",gap:"24px",flexWrap:"wrap",justifyContent:"center"}}>
  <div style={{fontFamily:"Inter,sans-serif"}}>
    <div style={{width:"220px",height:"200px",border:"1px solid #E5E7EB",borderRadius:"10px",background:"#fff",overflow:"hidden",position:"relative"}}>
      <div style={{padding:"12px",overflowY:"auto",height:"100%"}}>
        {["Accordion","Alert","Alert Dialog","Avatar","Badge","Button","Calendar","Card","Carousel","Checkbox","Collapsible","Command","Context Menu","Date Picker","Dialog","Drawer"].map(name => (
                        <div key={name} style={{padding:"8px 4px",borderBottom:"1px solid #F9FAFB",fontSize:"13px",color:"#344054"}}>{name}</div>
                      ))}
      </div>

      <div style={{position:"absolute",right:"4px",top:"4px",bottom:"4px",width:"6px",borderRadius:"3px",background:"#E5E7EB"}}>
        <div style={{width:"6px",height:"40px",borderRadius:"3px",background:"#D0D5DD",marginTop:"8px"}} />
      </div>
    </div>
  </div>
</div>

**Scroll Area** wraps a scrollable container with a styled, cross-browser-consistent scrollbar. Use it to replace native OS scrollbars in sidebars, lists, code blocks, and chat windows.

***

## Installation

<CodeGroup>
  ```bash npm theme={null}
  npm install @araf-ds/core
  ```

  ```bash yarn theme={null}
  yarn add @araf-ds/core
  ```

  ```bash pnpm theme={null}
  pnpm add @araf-ds/core
  ```
</CodeGroup>

***

## Usage

```tsx theme={null}
import { ScrollArea } from "@araf-ds/core"

export default function Example() {
  return (
    <ScrollArea className="h-64 w-56 rounded-md border">
      <div className="p-3">
        {components.map(name => (
          <div key={name} className="py-2 text-sm border-b last:border-0">
            {name}
          </div>
        ))}
      </div>
    </ScrollArea>
  )
}
```

***

## Variants

### Vertical Scroll

<div style={{padding:"24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",display:"flex",justifyContent:"center"}}>
  <div style={{width:"220px",height:"160px",border:"1px solid #E5E7EB",borderRadius:"10px",background:"#fff",overflow:"hidden",position:"relative",fontFamily:"Inter,sans-serif"}}>
    <div style={{padding:"12px",overflowY:"auto",height:"100%"}}>
      {["Ahmad Dani","Budi Santoso","Citra Dewi","Dian Purnama","Eka Wijaya","Fauzi Rahman","Gilang Pratama","Hana Sari"].map(name => (
                  <div key={name} style={{display:"flex",alignItems:"center",gap:"8px",padding:"6px 4px",borderBottom:"1px solid #F9FAFB"}}>
                    <div style={{width:"28px",height:"28px",borderRadius:"50%",background:"#EFF8FF",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:600,color:"#0479CE",flexShrink:0}}>{name[0]}</div>
                    <span style={{fontSize:"13px",color:"#344054"}}>{name}</span>
                  </div>
                ))}
    </div>

    <div style={{position:"absolute",right:"4px",top:"4px",bottom:"4px",width:"6px",borderRadius:"3px",background:"#F2F4F7"}}>
      <div style={{width:"6px",height:"32px",borderRadius:"3px",background:"#D0D5DD",marginTop:"4px"}} />
    </div>
  </div>
</div>

```tsx theme={null}
<ScrollArea className="h-40 w-56 rounded-md border">
  <div className="p-3 space-y-1">
    {users.map(user => (
      <div key={user.id} className="flex items-center gap-2 py-1.5">
        <Avatar size="sm" src={user.avatar} fallback={user.initials} />
        <span className="text-sm">{user.name}</span>
      </div>
    ))}
  </div>
</ScrollArea>
```

### Horizontal Scroll

```tsx theme={null}
<ScrollArea className="w-72 whitespace-nowrap rounded-md border">
  <div className="flex gap-3 p-3">
    {artworks.map(art => (
      <figure key={art.id} className="shrink-0">
        <div className="overflow-hidden rounded-md">
          <img src={art.src} alt={art.title} className="h-32 w-32 object-cover" />
        </div>
        <figcaption className="pt-1 text-xs text-muted-foreground">
          {art.title}
        </figcaption>
      </figure>
    ))}
  </div>
  <ScrollBar orientation="horizontal" />
</ScrollArea>
```

### With ScrollBar Visibility

```tsx theme={null}
// Always visible scrollbar
<ScrollArea type="always" className="h-48 rounded-md border">
  <div className="p-3">{content}</div>
</ScrollArea>

// Scrollbar only on hover
<ScrollArea type="hover" className="h-48 rounded-md border">
  <div className="p-3">{content}</div>
</ScrollArea>

// Scrollbar only while scrolling (default)
<ScrollArea type="scroll" className="h-48 rounded-md border">
  <div className="p-3">{content}</div>
</ScrollArea>
```

***

## API Reference

### ScrollArea

<ParamField path="type" type="string" default="hover">
  When to show the scrollbar. Values: `auto` · `always` · `scroll` · `hover`
</ParamField>

<ParamField path="scrollHideDelay" type="number" default="600">
  Milliseconds before the scrollbar hides after scrolling stops (when `type="scroll"`).
</ParamField>

<ParamField path="className" type="string">
  Additional class names for the outer container. Use this to set `height` and `width`.
</ParamField>

### ScrollBar

<ParamField path="orientation" type="string" default="vertical">
  Scrollbar direction. Values: `vertical` · `horizontal`
</ParamField>

***

## Accessibility

* ScrollArea uses `overflow: scroll` under the hood — the content remains keyboard scrollable
* Keyboard users can scroll with Arrow keys, Page Up/Down, and Home/End when the scroll area is focused
* Screen readers interact with the content inside ScrollArea directly — no special ARIA attributes are needed
* Ensure the scroll container has a set height/width — without bounds it will expand to fit content and never scroll

***

## Do's & Don'ts

<CardGroup cols={2}>
  <Card title="Do" icon="check" iconType="solid" color="#16A34A">
    * Always set an explicit height (or max-height) on the ScrollArea
    * Add `<ScrollBar orientation="horizontal" />` explicitly for horizontal scrolling
    * Use `type="always"` for sidebars so users always know the list is scrollable
    * Use inside bounded containers: sidebars, modals, cards
  </Card>

  <Card title="Don't" icon="xmark" iconType="solid" color="#DC2626">
    * Don't use ScrollArea for full-page scroll — use native page scroll instead
    * Don't nest multiple ScrollAreas — outer and inner scroll compete on trackpad
    * Don't forget to set height — without it, the area will never scroll
    * Don't use for tables — use sticky headers with native table scroll instead
  </Card>
</CardGroup>
