Table of Contents
ページ内の目次。点線が上から選んでいる節まで伸び、届いたところで先がフックの形に曲がって項目へ入る。
インポート
import { TableOfContents } from '@caroainc/ui-components/client'個別サブパス(バンドルサイズを抑えたい場合):
import { TableOfContents } from '@caroainc/ui-components/table-of-contents'記事・ヘルプ・設定の長いページで、節へ移る目次に使います。
基本的な使い方
項目を押すと、点線が新しい節の高さまで伸び縮みし、届いたところで先がくるっと曲がって項目へ入ります。触れた項目には、薄い線が上から伸びて先回りし、離れると縮んで消えます。depthを付けた小見出しは右へ下げ、フックも長く伸ばします。
Loading...
<TableOfContents
heading="目次"
items={[
{ id: 'intro', label: 'はじめに' },
{ id: 'history', label: '物語の背景' },
{ id: 'cast', label: '登場人物', depth: 1 },
{ id: 'ticket', label: 'チケットと当日の流れ' },
]}
/>スクロールに合わせる
hrefに#節のidを渡してtrackScrollを付けると、スクロールに合わせていま読んでいる節を選びます。節の上端が画面の上からscrollOffset(既定96px。固定ヘッダーの高さ分)を越えたら、その節を読んでいるとみなします。スクロールしてページの底まで来たら最後の節を選びます。
<TableOfContents
heading="目次"
trackScroll
items={headings.map((heading) => ({
id: heading.id,
label: heading.text,
href: `#${heading.id}`,
depth: heading.level === 3 ? 1 : 0,
}))}
/>色と弾み方
線の色はvariantで選びます(baseは黒、primaryはブランド色)。縦の線が伸び縮みするときの弾み方はbounceで、Segmented Control・Tabsと同じ値を使います。動きを減らす設定(prefers-reduced-motion)の利用者には、動かさずに切り替えます。
Loading...
const [value, setValue] = useState('cast')
<TableOfContents items={items} value={value} onValueChange={setValue} variant="primary" bounce="medium" />Props
| Prop | Type | Default | Description |
|---|---|---|---|
items | { id: string; label: ReactNode; href?: string; depth?: 0 | 1 | 2; disabled?: boolean }[] | - | 目次の項目(必須)。hrefがあればリンク、なければボタン |
heading | ReactNode | - | 一覧の上の小さな見出し |
value | string | - | 選んでいる項目のid(制御コンポーネント) |
defaultValue | string | 最初の項目 | 初期値(非制御コンポーネント) |
onValueChange | (id: string) => void | - | 選び直したとき(押したとき・スクロールで節が変わったとき) |
trackScroll | boolean | false | スクロールに合わせていま読んでいる節を選ぶ |
scrollOffset | number | 96 | 節を読んでいるとみなす、画面の上からの距離(px) |
variant | 'base' | 'primary' | 'base' | 線の色 |
bounce | 'none' | 'subtle' | 'medium' | 'strong' | 'subtle' | 線が伸び縮みするときの弾み方 |