Ballmac UI home

Table Of Contents

An 'On this page' list with a scroll spy and a sliding current-section marker. It collects headings itself or takes a list, and scrolls below sticky headers.

Overview

Short introduction to overview. Enough text that the section has real height and scrolling feels natural.

What this covers

Details about what this covers, written as plain paragraphs for the demo.

Who it is for

Details about who it is for, written as plain paragraphs for the demo.

More detail follows here so the next heading is not in view yet.

Installation

Short introduction to installation. Enough text that the section has real height and scrolling feels natural.

Requirements

Details about requirements, written as plain paragraphs for the demo.

Add the package

Details about add the package, written as plain paragraphs for the demo.

More detail follows here so the next heading is not in view yet.

Usage

Short introduction to usage. Enough text that the section has real height and scrolling feels natural.

Basic example

Details about basic example, written as plain paragraphs for the demo.

Options

Details about options, written as plain paragraphs for the demo.

More detail follows here so the next heading is not in view yet.

Accessibility

Short introduction to accessibility. Enough text that the section has real height and scrolling feels natural.

More detail follows here so the next heading is not in view yet.

Installation

$ pnpm dlx shadcn@latest add @ballmac/table-of-contents

Usage

import { TableOfContents } from "@/components/ballmac/table-of-contents"

The full example is in the Code tab above.

Examples

Explicit items

API reference

PropTypeDefault
items

Links to show. Leave out to collect headings from the page automatically.

TocItem[]—
headingsFrom

Where to look for headings when `items` is not given. Defaults to `<main>`, then the whole page.

React.RefObject<HTMLElement | null>—
levels

Heading levels to collect automatically.

number[][2, 3]
title

Title above the list. Also the accessible name of the navigation.

string—
offset

Pixels reserved at the top for a sticky header; also where a section counts as "reached".

number96
container

A scrollable element to watch and scroll instead of the page.

ScrollContainer—
onNavigate

Called when the reader chooses a link.

(id: string) => void—

Also accepts the standard attributes of its root element.

Accessibility

KeyAction
EnterScrolls to the section and updates the URL hash
Screen readersA labelled navigation; the current section has aria-current=location
Reduced motionJumps instead of smooth scrolling; the marker does not glide

Use with AI

Leave items out to collect h2 and h3 headings (they need text; missing ids are created). Current section gets aria-current=location. With the shadcn MCP server set up (guide), ask your agent:

Add the Ballmac UI Table Of Contents (@ballmac/table-of-contents) to this project with the shadcn MCP, then use it where it fits.

Use it for

  • Documentation and long articles
  • Settings pages with many sections

Not for

  • Horizontal in-page tabs; use section-tabs
  • App navigation; use sidebar

Registry JSON: https://ui.ballmac.com/r/table-of-contents.json

Credits

Free to use in personal and commercial projects.