-
Notifications
You must be signed in to change notification settings - Fork 6.5k
Expand file tree
/
Copy pathindex.tsx
More file actions
58 lines (50 loc) · 1.46 KB
/
index.tsx
File metadata and controls
58 lines (50 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import { ChevronRightIcon } from '@heroicons/react/24/outline';
import classNames from 'classnames';
import { LinkLike } from '#ui/types';
import type { Heading } from '@vcarl/remark-headings';
import type { ComponentProps, FC } from 'react';
import styles from './index.module.css';
const depthClasses: Record<number, string> = {
3: styles.depthThree,
4: styles.depthFour,
};
type TableOfContentsProps = ComponentProps<'details'> & {
headings: Array<Heading>;
summaryTitle: string;
minDepth?: number;
maxDepth?: number;
as?: LinkLike;
};
const TableOfContents: FC<TableOfContentsProps> = ({
headings,
summaryTitle,
minDepth = 2,
className,
maxDepth = 4,
as: Component = 'a',
...props
}) => {
const filteredHeadings = headings.filter(
({ depth }) => depth >= minDepth && depth <= maxDepth
);
return (
<details className={classNames(styles.details, className)} {...props}>
<summary className={styles.summary}>
<ChevronRightIcon className={styles.icon} /> {summaryTitle}
</summary>
<ul className={styles.list}>
{filteredHeadings.map((head, index) => (
<li key={head.data?.id ?? index}>
<Component
href={head.data?.id && `#${head.data.id}`}
className={classNames(styles.link, depthClasses[head.depth])}
>
{head.value}
</Component>
</li>
))}
</ul>
</details>
);
};
export default TableOfContents;