UILab

Message Scroller

A scrollable container for chat messages with auto-scroll behavior and a scroll-to-bottom button.

Today
👤
Hello!
10:28 AM
Hi, how can I help you?
10:30 AM
"use client"
import {
  MessageScrollerProvider,
  MessageScroller,
  MessageScrollerViewport,

Usage

import {
  MessageScrollerProvider,
  MessageScroller,
  MessageScrollerViewport,
  MessageScrollerContent,
  MessageScrollerItem,
  MessageScrollerButton,
} from "uilab-core"
<MessageScrollerProvider>
  <MessageScroller>
    <MessageScrollerViewport>
      <MessageScrollerContent>
        <MessageScrollerItem>
          {/* message content */}
        </MessageScrollerItem>
      </MessageScrollerContent>
    </MessageScrollerViewport>
    <MessageScrollerButton />
  </MessageScroller>
</MessageScrollerProvider>

MessageScroller must be wrapped in MessageScrollerProvider — omitting it throws "useMessageScroller must be used within a MessageScroller."

Dual buttons

Use two MessageScrollerButtons with direction="start" and direction="end" for two-way navigation.

Message #1
10:20 AM
Message #2
10:21 AM
Message #3
10:22 AM
Message #4
10:23 AM
Message #5
10:24 AM
Message #6
10:25 AM
Message #7
10:26 AM
Message #8
10:27 AM
Message #9
10:28 AM
Message #10
10:29 AM
Message #11
10:30 AM
Message #12
10:31 AM
"use client"
import {
  MessageScrollerProvider,
  MessageScroller,
  MessageScrollerViewport,

Scrollable state

Use useMessageScrollerScrollable to read which directions have more content, and update surrounding UI accordingly.

Message #1
Message #2
Message #3
Message #4
Message #5
Message #6
Message #7
Message #8
Message #9
Message #10

All messages fit on the screen

"use client"
import {
  MessageScrollerProvider,
  MessageScroller,
  MessageScrollerViewport,

Jump controls

Use useMessageScroller to drive the transcript from outside — jump to the start, end, or a specific message.

Message #1
Message #2
Message #3
Message #4
Message #5
Message #6
Message #7
Message #8
Message #9
Message #10
Message #11
Message #12
"use client"
import {
  MessageScrollerProvider,
  MessageScroller,
  MessageScrollerViewport,

Visibility tracking

Use useMessageScrollerVisibility to detect which messages are currently in view — useful for read receipts or active-turn indicators.

Message #1
Message #2
Message #3
Message #4
Message #5
Message #6
Message #7
Message #8
Message #9
Message #10
Message #11
Message #12

Current message: · Visible: 0

"use client"
import {
  MessageScrollerProvider,
  MessageScroller,
  MessageScrollerViewport,

On this page