forked from nodejs/nodejs.org
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.tsx
More file actions
54 lines (47 loc) · 1.31 KB
/
index.tsx
File metadata and controls
54 lines (47 loc) · 1.31 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
import classNames from 'classnames';
import { LinkLike } from '#ui/types';
import type { Heading } from '@vcarl/remark-headings';
import type { FC } from 'react';
import styles from './index.module.css';
type TableOfContentsProps = {
headings: Array<Heading>;
ariaLabel: string;
summaryTitle: string;
minDepth?: number;
maxDepth?: number;
as?: LinkLike;
};
const TableOfContents: FC<TableOfContentsProps> = ({
headings,
ariaLabel,
summaryTitle,
minDepth = 2,
maxDepth = 4,
as: Component = 'a',
}) => {
const filteredHeadings = headings.filter(
({ depth }) => depth >= minDepth && depth <= maxDepth
);
return (
<details className={styles.details} aria-label={ariaLabel}>
<summary className={styles.summary}>{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,
head.depth === 3 && styles.depthThree,
head.depth === 4 && styles.depthFour
)}
>
{head.value}
</Component>
</li>
))}
</ul>
</details>
);
};
export default TableOfContents;