Skip to content

Commit ba48445

Browse files
committed
feat: expand ToC variants, docs + beginner + left
1 parent 778aea7 commit ba48445

File tree

4 files changed

+70
-26
lines changed

4 files changed

+70
-26
lines changed

src/components/TableOfContents/ItemsList.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,30 @@ import type { ToCItem } from "@/lib/types"
44

55
import ToCLink from "@/components/TableOfContents/TableOfContentsLink"
66

7-
const variants = cva("mb-2 last:mb-0", {
7+
const itemVariants = cva("last:mb-0", {
88
variants: {
99
variant: {
10-
default: "",
10+
docs: "mb-2",
1111
beginner:
1212
"[&:has([data-state-active='true'])]:text-primary hover:text-primary-hover list-item",
13+
left: "mb-4 list-none text-xl",
1314
},
1415
},
1516
defaultVariants: {
16-
variant: "default",
17+
variant: "docs",
18+
},
19+
})
20+
21+
const listVariants = cva("", {
22+
variants: {
23+
variant: {
24+
docs: "m-0 mt-2 list-none gap-2 ps-2 text-sm",
25+
beginner: "",
26+
left: "",
27+
},
28+
},
29+
defaultVariants: {
30+
variant: "docs",
1731
},
1832
})
1933

@@ -22,7 +36,7 @@ export type ItemsListProps = {
2236
depth: number
2337
maxDepth: number
2438
activeHash?: string
25-
} & VariantProps<typeof variants>
39+
} & VariantProps<typeof itemVariants>
2640

2741
const ItemsList = ({
2842
items,
@@ -39,15 +53,15 @@ const ItemsList = ({
3953
{items.map((item, index) => {
4054
const { title, items } = item
4155
return (
42-
<li key={index} className={variants({ variant })} {...rest}>
56+
<li key={index} className={itemVariants({ variant })} {...rest}>
4357
<ToCLink
4458
variant={variant}
4559
depth={depth}
4660
item={item}
4761
activeHash={activeHash}
4862
/>
4963
{items && (
50-
<ul key={title} className="m-0 mt-2 list-none gap-2 ps-2 text-sm">
64+
<ul key={title} className={listVariants({ variant })}>
5165
<ItemsList
5266
items={items}
5367
depth={depth + 1}

src/components/TableOfContents/TableOfContentsLink.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@ import { cn } from "@/lib/utils/cn"
77
import { BaseLink } from "../ui/Link"
88

99
const variants = cva(
10-
"group relative inline-block w-full py-0.5 text-body-medium no-underline lg:w-auto",
10+
"group relative inline-block w-full text-body-medium no-underline lg:w-auto",
1111
{
1212
variants: {
1313
variant: {
14-
default: "",
14+
docs: "",
1515
beginner: "[&_[data-label='marker']]:!hidden inline leading-base",
16+
left: "",
1617
},
1718
},
1819
defaultVariants: {
19-
variant: "default",
20+
variant: "docs",
2021
},
2122
}
2223
)

src/components/TableOfContents/TableOfContentsMobile.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,14 @@ import { useTranslation } from "@/hooks/useTranslation"
1919
const variants = cva("flex w-full justify-between lg:hidden", {
2020
variants: {
2121
variant: {
22-
default: "",
22+
docs: "",
2323
beginner:
2424
"[&>span]:flex-none mb-16 justify-center rounded-lg border-border bg-accent-a/10 text-lg font-bold",
25+
left: "",
2526
},
2627
},
2728
defaultVariants: {
28-
variant: "default",
29+
variant: "docs",
2930
},
3031
})
3132

src/components/TableOfContents/index.tsx

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { cva, type VariantProps } from "class-variance-authority"
44

55
import type { ToCItem } from "@/lib/types"
66

7+
import ButtonDropdown, {
8+
List as ButtonDropdownList,
9+
} from "@/components/ButtonDropdown"
710
import Github from "@/components/icons/github.svg"
811
import ItemsList from "@/components/TableOfContents/ItemsList"
912
import Mobile from "@/components/TableOfContents/TableOfContentsMobile"
@@ -17,34 +20,47 @@ import { useTranslation } from "@/hooks/useTranslation"
1720
import { usePathname } from "@/i18n/routing"
1821

1922
const variants = cva(
20-
"sticky hidden flex-col items-start overflow-y-auto lg:flex",
23+
"sticky top-28 flex h-fit max-lg:hidden flex-col items-start overflow-y-auto",
2124
{
2225
variants: {
2326
variant: {
24-
default:
25-
"top-19 min-w-48 max-w-[25%] p-4 pe-0 h-[calc(100vh-80px)] gap-4",
27+
docs: "top-20 min-w-48 max-w-[25%] p-4 pe-0 gap-4",
2628
beginner: cn(
27-
"top-[7.25rem] min-w-80 max-w-72 lg:p-8 px-3 py-2",
28-
"h-fit shrink-0 space-y-2.5 rounded-2xl bg-accent-a/10 text-body-medium",
29-
"[&_ul]:list-decimal [&_ul]:border-s-0 [&_ul]:text-base [&_ul]:list-inside [&_ul]:ps-0"
29+
"min-w-80 max-w-72 lg:p-8 px-3 py-2",
30+
"shrink-0 gap-y-2.5 rounded-2xl bg-accent-a/10 text-body-medium"
3031
),
32+
left: "me-16 ms-8 basis-[400px] [&_ul]:leading-relaxed",
3133
},
3234
},
3335
defaultVariants: {
34-
variant: "default",
36+
variant: "docs",
3537
},
3638
}
3739
)
3840

39-
const labelVariants = cva("text-body-medium", {
41+
const labelVariants = cva("font-bold", {
4042
variants: {
4143
variant: {
42-
default: "uppercase",
43-
beginner: "font-bold text-lg",
44+
docs: "uppercase text-body-medium font-normal",
45+
beginner: "text-lg text-body-medium",
46+
left: "mb-8 text-3xl leading-xs",
4447
},
4548
},
4649
defaultVariants: {
47-
variant: "default",
50+
variant: "docs",
51+
},
52+
})
53+
54+
const listVariants = cva("mx-0 gap-2 py-0", {
55+
variants: {
56+
variant: {
57+
docs: "list-none border-s border-s-body-medium ps-4 my-2",
58+
beginner: "list-decimal border-s-0 text-base list-inside ps-0 my-2",
59+
left: "list-none my-0",
60+
},
61+
},
62+
defaultVariants: {
63+
variant: "docs",
4864
},
4965
})
5066

@@ -55,6 +71,8 @@ export interface TableOfContentsProps extends VariantProps<typeof variants> {
5571
hideEditButton?: boolean
5672
isMobile?: boolean
5773
className?: string
74+
dropdownLinks?: ButtonDropdownList
75+
showDropdown?: boolean
5876
}
5977

6078
const TableOfContents = ({
@@ -65,6 +83,8 @@ const TableOfContents = ({
6583
isMobile = false,
6684
className,
6785
variant,
86+
dropdownLinks,
87+
showDropdown = true,
6888
...rest
6989
}: TableOfContentsProps) => {
7090
const pathname = usePathname()
@@ -93,7 +113,7 @@ const TableOfContents = ({
93113
}
94114

95115
return (
96-
<aside className={variants({ variant, className })} {...rest}>
116+
<nav className={variants({ variant, className })} {...rest}>
97117
{!hideEditButton && editPath && (
98118
<ButtonLink
99119
href={editPath}
@@ -108,17 +128,25 @@ const TableOfContents = ({
108128
{t("edit-page")}
109129
</ButtonLink>
110130
)}
131+
{variant === "left" && showDropdown && dropdownLinks && (
132+
<div className="relative mb-8 flex items-end justify-end">
133+
<ButtonDropdown
134+
list={dropdownLinks}
135+
className="w-full min-w-[240px]"
136+
/>
137+
</div>
138+
)}
111139
<div className={labelVariants({ variant })}>{t("on-this-page")}</div>
112-
<ul className="m-0 mb-2 mt-2 list-none gap-2 border-s border-s-body-medium ps-4 pt-0 text-sm">
140+
<ul className={listVariants({ variant })}>
113141
<ItemsList
114142
items={items}
115143
depth={0}
116-
maxDepth={maxDepth ? maxDepth : 1}
144+
maxDepth={maxDepth ?? 1}
117145
activeHash={activeHash}
118146
variant={variant}
119147
/>
120148
</ul>
121-
</aside>
149+
</nav>
122150
)
123151
}
124152

0 commit comments

Comments
 (0)