Scroll Area

Augments native scroll functionality for custom, cross-browser styling.

Examples

Basic

PropDefaultTypeDescription
dirltrltr, rtlThe reading direction of the combobox when applicable. If omitted, inherits globally from ConfigProvider or assumes LTR (left-to-right) reading mode.
scrollHideDelay600numberDetermines the length of time, in milliseconds, before the scrollbars are hidden
typehoverscroll, always, auto, hoverDescribes the nature of scrollbar visibility, similar to how the scrollbar preferences in MacOS control visibility of native scrollbars.
Preview
Code

Tags

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

Orientation

The orientation prop controls the scroll direction and can be set on either the ScrollArea component or via _scrollAreaScrollbar.

PropDefaultTypeDescription
orientationverticalvertical, horizontalThe orientation of the scrollbar
Preview
Code
Photo by Ornella Binni
Photo by Ornella Binni
Photo by Tom Byrom
Photo by Tom Byrom
Photo by Vladimir Malyavko
Photo by Vladimir Malyavko

Color

PropDefaultTypeDescription
scrollAreagraystringThe color of the scroll area.
Preview
Code
scroll-area="primary"

Notifications

New message

You have a new message from Sarah

2 min ago
Meeting reminder

Team meeting in 30 minutes

10 min ago
Task completed

Project X has been marked as complete

1 hour ago
New sign-up

New user registered: John Doe

3 hours ago
System update

System will be updated at midnight

5 hours ago
scroll-area="pink"

Comments

Sarah Johnson

Great progress on the project!

2 hours ago
Michael Chen

I think we should reconsider the approach for the homepage.

3 hours ago
Emily Rodriguez

The new design looks amazing!

5 hours ago
David Kim

When is the next release scheduled?

1 day ago
Alex Turner

I found a small bug in the navigation menu when testing on mobile.

2 days ago
scroll-area="lime"

Tasks

Update documentation

High

Fix navigation bug

Critical

Review pull requests

Medium

Prepare for release

High

Team meeting notes

Low
scroll-area="orange"

Events

Team Meeting
📅 Today, 2:00 PM📍 Conference Room A
Product Launch
📅 Tomorrow, 10:00 AM📍 Main Hall
Client Presentation
📅 Jan 15, 3:30 PM📍 Meeting Room B
Workshop
📅 Jan 20, 9:00 AM📍 Training Center
Company Retreat
📅 Feb 5-7📍 Mountain Resort

Size

PropDefaultTypeDescription
sizemdstringThe size of the scroll area.
Preview
Code
size="10px"

10 Pixel

Item 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 3: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 4: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 5: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 6: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 7: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 8: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 9: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 10: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 11: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 12: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 13: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 14: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 15: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
size="sm"

Small

Item 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 3: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 4: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 5: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 6: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 7: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 8: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 9: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 10: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 11: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 12: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 13: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 14: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 15: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
size="0.75cm"

0.75 cm

Item 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 3: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 4: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 5: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 6: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 7: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 8: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 9: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 10: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 11: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 12: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 13: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 14: Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Item 15: Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Rounded

PropDefaultTypeDescription
roundedfullstringThe roundedness of the scroll area.
Preview
Code

Notifications

New Feature
Scroll area component now supports custom rounded corners
10 minutes ago
Documentation
Updated examples for better visual representation
45 minutes ago
Bug Fix
Fixed overflow issues in mobile view
2 hours ago
Performance
Improved scrolling performance on all devices
5 hours ago
New Feature
Added multiple color options for scrollbars
1 day ago
Update
Core library upgraded to latest version
1 day ago
Documentation
Added new examples for customization
2 days ago
Bug Fix
Resolved styling conflicts with other components
3 days ago
Accessibility
Improved keyboard navigation support
4 days ago
Performance
Reduced bundle size by 15%
1 week ago

Customization

You can also use the una prop to add utility classes, refer to the Props and Presets sections for more information.

Preview
Code

Accessible Scrolling

Cross-browser consistent scrollbars that work on all devices with keyboard navigation and screen reader support.

Display Modes

hover

Shows scrollbars when hovering over the scroll area

always

Always shows scrollbars regardless of interaction

scroll

Shows scrollbars during scrolling and hides after

Common Use Cases

Content panels

For dashboards, chat interfaces, and document viewers

Long forms

For registration flows, surveys, and user settings

Code blocks

For documentation, code editors, and technical content

Media galleries

For image collections, video libraries, and portfolios

Slots

NamePropsDescription
default-The default slot for the ScrollArea component.

Presets

shortcuts/scroll-area.ts
import type { Theme } from '@unocss/preset-mini'
import type { RuleContext } from 'unocss'
import { parseColor } from '@unocss/preset-mini'

type ScrollAreaPrefix = 'scroll-area'

export const staticScrollArea: Record<`${ScrollAreaPrefix}-${string}` | ScrollAreaPrefix, string> = {
  // configurations
  'scroll-area': '',
  'scroll-area-scrollbar-vertical': 'h-full w-0.625em border-l border-l-transparent p-0.0625em',
  'scroll-area-scrollbar-horizontal': 'h-0.625em flex-col border-t border-t-transparent p-0.0625em',

  // components
  'scroll-area-root': 'relative overflow-hidden',
  'scroll-area-scrollbar': 'flex touch-none select-none transition-colors',
  'scroll-area-viewport': 'h-full w-full rounded-inherit',
  'scroll-area-scrollbar-thumb': 'relative flex-1',

  'scroll-area-gray': 'bg-border',
}

export const dynamicScrollArea = [
  // dynamic preset
  [/^scroll-area(-(\S+))?$/, ([, , c]: [string, string, string], { theme }: RuleContext<Theme>) => {
    const parsedColor = parseColor(c, theme)
    if ((parsedColor?.cssColor?.type === 'rgb' || parsedColor?.cssColor?.type === 'rgba') && parsedColor.cssColor.components)
      return `bg-${c}-200 dark:bg-${c}-700/58`
    return undefined
  }],
]

export const scrollArea = [
  ...dynamicScrollArea,
  staticScrollArea,
]

Props

types/scroll-area.ts
import type {
  ScrollAreaRootProps,
  ScrollAreaScrollbarProps,
  ScrollAreaThumbProps,
  ScrollAreaViewportProps,
} from 'reka-ui'
import type { HTMLAttributes } from 'vue'

interface BaseExtension {
  class?: HTMLAttributes['class']
  size?: HTMLAttributes['class']
  rounded?: HTMLAttributes['class']
}

export interface NScrollAreaProps extends
  ScrollAreaRootProps,
  Pick<ScrollAreaScrollbarProps, 'orientation'>,
  BaseExtension {
  /**
   * Allows you to add `UnaUI` scroll area preset properties,
   * Think of it as a shortcut for adding options or variants to the preset if available.
   *
   * @see https://github.com/una-ui/una-ui/blob/main/packages/preset/src/_shortcuts/scroll-area.ts
   * @example
   * scrollArea="green"
   */
  scrollArea?: HTMLAttributes['class']
  /**
   * The scroll area root props.
   */
  _scrollAreaRoot?: NScrollAreaRootProps
  /**
   * The scroll area scrollbar props.
   */
  _scrollAreaScrollbar?: NScrollAreaScrollbarProps
  /**
   * The scroll area viewport props.
   */
  _scrollAreaViewport?: NScrollAreaViewportProps

  /**
   * `UnaUI` preset configuration
   *
   * @see https://github.com/una-ui/una-ui/blob/main/packages/preset/src/_shortcuts/scroll-area.ts
   */
  una?: NScrollAreaUnaProps
}

export interface NScrollAreaRootProps extends ScrollAreaRootProps, BaseExtension {
  una?: NScrollAreaUnaProps['scrollAreaRoot']
}

export interface NScrollAreaScrollbarProps extends ScrollAreaScrollbarProps, Pick<NScrollAreaProps, 'scrollArea'>, BaseExtension {
  una?: Pick<NScrollAreaUnaProps, 'scrollAreaScrollbar' | 'scrollAreaThumb'>
}

export interface NScrollAreaThumbProps extends ScrollAreaThumbProps, BaseExtension {
  una?: NScrollAreaUnaProps['scrollAreaThumb']
}

export interface NScrollAreaViewportProps extends ScrollAreaViewportProps, Pick<BaseExtension, 'class'> {
  una?: NScrollAreaUnaProps['scrollAreaViewport']
}

export interface NScrollAreaUnaProps {
  scrollAreaRoot?: HTMLAttributes['class']
  scrollAreaViewport?: HTMLAttributes['class']
  scrollAreaScrollbar?: HTMLAttributes['class']
  scrollAreaThumb?: HTMLAttributes['class']
}

Components

ScrollArea.vue
ScrollBar.vue
<script setup lang="ts">
import type { NScrollAreaProps } from '../../types'
import { reactiveOmit } from '@vueuse/core'
import {
  ScrollAreaCorner,
  ScrollAreaRoot,
  ScrollAreaViewport,
} from 'reka-ui'
import { cn } from '../../utils'
import ScrollBar from './ScrollBar.vue'

const props = withDefaults(defineProps<NScrollAreaProps>(), {
  scrollArea: 'gray',
  rounded: 'full',
  size: 'md',
})

const delegatedProps = reactiveOmit(props, ['class', 'size', 'rounded'])
</script>

<template>
  <ScrollAreaRoot
    v-bind="delegatedProps"
    :class="cn(
      'scroll-area-root',
      props.una?.scrollAreaRoot,
      props.class,
    )"
  >
    <ScrollAreaViewport
      v-bind="_scrollAreaViewport"
      :class="cn(
        'scroll-area-viewport',
        props.una?.scrollAreaViewport,
        _scrollAreaViewport?.class,
      )"
    >
      <slot />
    </ScrollAreaViewport>
    <ScrollBar
      v-bind="_scrollAreaScrollbar"
      :orientation="orientation ?? _scrollAreaScrollbar?.orientation"
      :una
      :size
      :rounded
      :scroll-area
    />
    <ScrollAreaCorner />
  </ScrollAreaRoot>
</template>