| import React from 'react' | |
| import { Link } from '@/frame/components/Link' | |
| import type { TocItem } from '@/landings/types' | |
| type Props = { | |
| items: Array<TocItem> | |
| variant?: 'compact' | 'expanded' | |
| } | |
| export const TableOfContents = (props: Props) => { | |
| const { items, variant = 'expanded' } = props | |
| return ( | |
| <div data-testid="table-of-contents"> | |
| {variant === 'expanded' && | |
| items.map((item) => { | |
| const { fullPath: href, title, intro } = item | |
| return ( | |
| <div | |
| key={href} | |
| data-testid="expanded-item" | |
| className="pt-4 pb-3 f4 d-list-item width-full list-style-none border-bottom" | |
| > | |
| <h2 className="py-1 h4"> | |
| <Link href={href} className="color-fg-accent"> | |
| {title} | |
| </Link> | |
| </h2> | |
| {intro && ( | |
| <div className="f4 color-fg-muted" dangerouslySetInnerHTML={{ __html: intro }} /> | |
| )} | |
| </div> | |
| ) | |
| })} | |
| {variant === 'compact' && ( | |
| <ul className="list-style-none f4"> | |
| {items.map((item) => { | |
| const { fullPath, title, childTocItems } = item | |
| return ( | |
| <li key={fullPath} className="mb-2"> | |
| <Link href={fullPath} className="text-underline mb-2 d-block"> | |
| {title} | |
| </Link> | |
| {(childTocItems || []).filter(Boolean).length > 0 && ( | |
| <ul className="pl-4 list-style-none"> | |
| {(childTocItems || []).filter(Boolean).map((childItem) => ( | |
| <li key={childItem.fullPath} className="mb-2"> | |
| <Link href={childItem.fullPath} className="text-underline"> | |
| {childItem.title} | |
| </Link> | |
| </li> | |
| ))} | |
| </ul> | |
| )} | |
| </li> | |
| ) | |
| })} | |
| </ul> | |
| )} | |
| </div> | |
| ) | |
| } | |