Scroll Area
A native scroll container with custom scrollbars.
Anatomy
Import the component and assemble its parts:
Examples
Both scrollbars
Use <ScrollArea.Corner> to prevent the scrollbars from intersecting.
Gradient scroll fade
Use the viewport overflow CSS variables to drive a CSS mask, which gradually increases the fade as the user scrolls away from the edges.
For SSR, a fallback can be used as part of the end-side var() call so the mask is visible before the overflow CSS variables hydrate.
When the fade is applied to <ScrollArea.Viewport> itself, the variables can be used directly. However, inheritance to children is disabled, so they must explicitly opt-in using the inherit keyword.
Combining with Tabs
Use <Tabs.List>'s render snippet to render <ScrollArea.Viewport> directly when the tab list itself needs the viewport overflow values for a mask fade. This keeps the mask logic on the same element that receives the scroll state.
API reference
Root
Groups all parts of the scroll area. Renders a <div> element.
overflowEdgeThreshold OverflowEdgeThreshold 0
- Description
The threshold in pixels that must be passed before the overflow edge attributes are applied. Accepts a single number for all edges or an object to configure them individually.
- Type
OverflowEdgeThreshold- Default
0
render Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaRootState, children: Snippet | undefined]> —
- Name
- Description
Replace the default
<div>. Spreadpropsonto the host element.- Type
Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaRootState, children: Snippet | undefined]>
scrolling boolean
- Name
scrolling- Description
Whether the scroll area is being scrolled.
- Type
boolean
hasOverflowX boolean
- Name
hasOverflowX- Description
Whether horizontal overflow is present.
- Type
boolean
hasOverflowY boolean
- Name
hasOverflowY- Description
Whether vertical overflow is present.
- Type
boolean
overflowXStart boolean
- Name
overflowXStart- Description
Whether there is overflow on the inline start side for the horizontal axis.
- Type
boolean
overflowXEnd boolean
- Name
overflowXEnd- Description
Whether there is overflow on the inline end side for the horizontal axis.
- Type
boolean
overflowYStart boolean
- Name
overflowYStart- Description
Whether there is overflow on the block start side.
- Type
boolean
overflowYEnd boolean
- Name
overflowYEnd- Description
Whether there is overflow on the block end side.
- Type
boolean
cornerHidden boolean
- Name
cornerHidden- Description
Whether the scrollbar corner is hidden.
- Type
boolean
data-has-overflow-x
data-has-overflow-y
data-overflow-x-end
data-overflow-x-start
data-overflow-y-end
data-overflow-y-start
data-scrolling
--scroll-area-corner-height
--scroll-area-corner-width
Viewport
The scrollable container of the scroll area. Renders a <div> element.
render Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaViewportState, children: Snippet | undefined]> —
- Name
- Description
Replace the default
<div>. Spreadpropsonto the host element.- Type
Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaViewportState, children: Snippet | undefined]>
scrolling boolean
- Name
scrolling- Description
Whether the scroll area is being scrolled.
- Type
boolean
hasOverflowX boolean
- Name
hasOverflowX- Description
Whether horizontal overflow is present.
- Type
boolean
hasOverflowY boolean
- Name
hasOverflowY- Description
Whether vertical overflow is present.
- Type
boolean
overflowXStart boolean
- Name
overflowXStart- Description
Whether there is overflow on the inline start side for the horizontal axis.
- Type
boolean
overflowXEnd boolean
- Name
overflowXEnd- Description
Whether there is overflow on the inline end side for the horizontal axis.
- Type
boolean
overflowYStart boolean
- Name
overflowYStart- Description
Whether there is overflow on the block start side.
- Type
boolean
overflowYEnd boolean
- Name
overflowYEnd- Description
Whether there is overflow on the block end side.
- Type
boolean
cornerHidden boolean
- Name
cornerHidden- Description
Whether the scrollbar corner is hidden.
- Type
boolean
data-has-overflow-x
data-has-overflow-y
data-overflow-x-end
data-overflow-x-start
data-overflow-y-end
data-overflow-y-start
data-scrolling
--scroll-area-overflow-x-end
--scroll-area-overflow-x-start
--scroll-area-overflow-y-end
--scroll-area-overflow-y-start
Content
A container for the content of the scroll area. Renders a <div> element.
render Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaContentState, children: Snippet | undefined]> —
- Name
- Description
Replace the default
<div>. Spreadpropsonto the host element.- Type
Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaContentState, children: Snippet | undefined]>
scrolling boolean
- Name
scrolling- Description
Whether the scroll area is being scrolled.
- Type
boolean
hasOverflowX boolean
- Name
hasOverflowX- Description
Whether horizontal overflow is present.
- Type
boolean
hasOverflowY boolean
- Name
hasOverflowY- Description
Whether vertical overflow is present.
- Type
boolean
overflowXStart boolean
- Name
overflowXStart- Description
Whether there is overflow on the inline start side for the horizontal axis.
- Type
boolean
overflowXEnd boolean
- Name
overflowXEnd- Description
Whether there is overflow on the inline end side for the horizontal axis.
- Type
boolean
overflowYStart boolean
- Name
overflowYStart- Description
Whether there is overflow on the block start side.
- Type
boolean
overflowYEnd boolean
- Name
overflowYEnd- Description
Whether there is overflow on the block end side.
- Type
boolean
cornerHidden boolean
- Name
cornerHidden- Description
Whether the scrollbar corner is hidden.
- Type
boolean
data-has-overflow-x
data-has-overflow-y
data-overflow-x-end
data-overflow-x-start
data-overflow-y-end
data-overflow-y-start
data-scrolling
Scrollbar
A vertical or horizontal scrollbar. Renders a <div> element.
orientation ScrollAxis 'vertical'
- Name
- Description
Whether the scrollbar controls vertical or horizontal scroll.
- Type
ScrollAxis- Default
'vertical'
keepMounted boolean false
- Name
- Description
Whether to keep the HTML element in the DOM when the viewport isn't scrollable.
- Type
boolean- Default
false
render Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaScrollbarState, children: Snippet | undefined]> —
- Name
- Description
Replace the default
<div>. Spreadpropsonto the host element.- Type
Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaScrollbarState, children: Snippet | undefined]>
hovering boolean
- Name
hovering- Description
Whether the scroll area is being hovered.
- Type
boolean
scrolling boolean
- Name
scrolling- Description
Whether this scrollbar's axis is being scrolled.
- Type
boolean
orientation ScrollAxis
- Name
orientation- Description
The orientation of the scrollbar.
- Type
ScrollAxis
hasOverflowX boolean
- Name
hasOverflowX- Description
Whether horizontal overflow is present.
- Type
boolean
hasOverflowY boolean
- Name
hasOverflowY- Description
Whether vertical overflow is present.
- Type
boolean
overflowXStart boolean
- Name
overflowXStart- Description
Whether there is overflow on the inline start side for the horizontal axis.
- Type
boolean
overflowXEnd boolean
- Name
overflowXEnd- Description
Whether there is overflow on the inline end side for the horizontal axis.
- Type
boolean
overflowYStart boolean
- Name
overflowYStart- Description
Whether there is overflow on the block start side.
- Type
boolean
overflowYEnd boolean
- Name
overflowYEnd- Description
Whether there is overflow on the block end side.
- Type
boolean
cornerHidden boolean
- Name
cornerHidden- Description
Whether the scrollbar corner is hidden.
- Type
boolean
data-orientation
data-has-overflow-x
data-has-overflow-y
data-hovering
data-overflow-x-end
data-overflow-x-start
data-overflow-y-end
data-overflow-y-start
data-scrolling
--scroll-area-thumb-height
--scroll-area-thumb-width
Thumb
The draggable thumb that indicates the current scroll position. Renders a <div> element.
render Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaThumbState, children: Snippet | undefined]> —
- Name
- Description
Replace the default
<div>. Spreadpropsonto the host element.- Type
Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaThumbState, children: Snippet | undefined]>
scrolling boolean
- Name
scrolling- Description
Whether this thumb's axis is being scrolled.
- Type
boolean
orientation ScrollAxis
- Name
orientation- Description
The component orientation.
- Type
ScrollAxis
data-orientation
data-scrolling
Corner
The rectangle where the horizontal and vertical scrollbars meet. Renders a <div> element.
render Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaCornerState, children: Snippet | undefined]> —
- Name
- Description
Replace the default
<div>. Spreadpropsonto the host element.- Type
Snippet<[props: HTMLAttributes<HTMLDivElement>, state: ScrollAreaCornerState, children: Snippet | undefined]>