---
title: Toc
description: Table of contents components scan a page for headings and render jump links that track the reader's scroll position.
category: Navigation
---
import { meta as TocMeta, Default } from '@/content/stories/toc';
import Canvas from '@/components/component-docs/canvas';
import Demo from '@/components/component-docs/demo';
export const config = {
dependencies: {
components: [Canvas, Demo],
scripts: [
'../../components/component-docs/demo.script.tsx',
'../../components/component-docs/canvas.script.tsx',
'../../components/component-docs/controls.script.tsx',
],
},
};
# Toc
Table of contents components scan a page for headings and render jump links that track the reader's scroll position.
## Try it
## Usage
Point `target` at the content root selector. Adjust `headingSelector` to match the heading levels you want to include.
```tsx
import { RuiToc } from '@ecopages/radiant-ui/toc';
```
## Heading levels
Default `h2,h3` suits most docs pages. Include `h4` only when the page has deep nesting worth navigating.
## Scroll offset
Set `scrollOffset` to account for a fixed header so jumped headings are not hidden beneath it.
## Theming
Toc maps to **semantic surface roles**, never Tailwind palette steps:
| Part | CSS roles |
| --- | --- |
| Label (`rui-toc__label`) | `on-background` |
| List (`rui-toc__list`) | `border` (left rule) |
| Link (`rui-toc__link`) | `on-background`; hover `on-background` |
| Active link (`rui-toc__link--active`) | `primary` (text + left rail) |
Override roles at the theme layer, not in component CSS.
## API
`RuiToc` is a Derived Tree host (``): the element `render()` owns the `nav` landmark and jump-link list. It scans headings in an external content root identified by `target` and `heading-selector` — not authored children of the host.
### Attributes
| Attribute | Type | Default | Description |
| --- | --- | --- | --- |
| `target` | `string` | `''` | CSS selector for the content root that contains headings. Defaults to the parent element. |
| `heading-selector` | `string` | `h2,h3` | Selector for headings to include. |
| `label` | `string` | `On this page` | Visible label above the link list. |
| `scroll-offset` | `number` | `120` | Pixel offset from the viewport top when tracking the active section. |
| `navigation-events` | `string` | `''` | Comma-separated document events that trigger a rebuild (e.g. `eco:page-load`). |
### Scan contract
| Setting | Default | Description |
| --- | --- | --- |
| `target` | parent element | CSS selector for the content root containing headings. |
| `heading-selector` | `h2,h3` | Selector for headings to include; missing `id` values are assigned. |
### CSS classes
Public BEM classes on the rendered link list (documented via `@cssclass`):
| Class | Description |
| --- | --- |
| `.rui-toc` | Root `nav` landmark. |
| `.rui-toc__label` | Section label above the list. |
| `.rui-toc__list` | Link list. |
| `.rui-toc__item` | List item. |
| `.rui-toc__item--depth-3` | Indented item for `h3` headings. |
| `.rui-toc__link` | Heading jump link. |
| `.rui-toc__link--active` | Link for the section currently in view. |
### Theme roles
| Part | CSS variables consumed |
| --- | --- |
| Label | `--on-background` |
| List rule | `--border` |
| Link | `--on-background`; active `--primary` |
## Accessibility
- The TOC renders as a `nav` landmark with `label` as its accessible name.
- Current section is indicated visually and for assistive technologies during scroll.
- Nested headings use indentation to convey hierarchy.