@@ -4,6 +4,9 @@ import { cva, type VariantProps } from "class-variance-authority"
4
4
5
5
import type { ToCItem } from "@/lib/types"
6
6
7
+ import ButtonDropdown , {
8
+ List as ButtonDropdownList ,
9
+ } from "@/components/ButtonDropdown"
7
10
import Github from "@/components/icons/github.svg"
8
11
import ItemsList from "@/components/TableOfContents/ItemsList"
9
12
import Mobile from "@/components/TableOfContents/TableOfContentsMobile"
@@ -17,34 +20,47 @@ import { useTranslation } from "@/hooks/useTranslation"
17
20
import { usePathname } from "@/i18n/routing"
18
21
19
22
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" ,
21
24
{
22
25
variants : {
23
26
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" ,
26
28
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"
30
31
) ,
32
+ left : "me-16 ms-8 basis-[400px] [&_ul]:leading-relaxed" ,
31
33
} ,
32
34
} ,
33
35
defaultVariants : {
34
- variant : "default " ,
36
+ variant : "docs " ,
35
37
} ,
36
38
}
37
39
)
38
40
39
- const labelVariants = cva ( "text-body-medium " , {
41
+ const labelVariants = cva ( "font-bold " , {
40
42
variants : {
41
43
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" ,
44
47
} ,
45
48
} ,
46
49
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" ,
48
64
} ,
49
65
} )
50
66
@@ -55,6 +71,8 @@ export interface TableOfContentsProps extends VariantProps<typeof variants> {
55
71
hideEditButton ?: boolean
56
72
isMobile ?: boolean
57
73
className ?: string
74
+ dropdownLinks ?: ButtonDropdownList
75
+ showDropdown ?: boolean
58
76
}
59
77
60
78
const TableOfContents = ( {
@@ -65,6 +83,8 @@ const TableOfContents = ({
65
83
isMobile = false ,
66
84
className,
67
85
variant,
86
+ dropdownLinks,
87
+ showDropdown = true ,
68
88
...rest
69
89
} : TableOfContentsProps ) => {
70
90
const pathname = usePathname ( )
@@ -93,7 +113,7 @@ const TableOfContents = ({
93
113
}
94
114
95
115
return (
96
- < aside className = { variants ( { variant, className } ) } { ...rest } >
116
+ < nav className = { variants ( { variant, className } ) } { ...rest } >
97
117
{ ! hideEditButton && editPath && (
98
118
< ButtonLink
99
119
href = { editPath }
@@ -108,17 +128,25 @@ const TableOfContents = ({
108
128
{ t ( "edit-page" ) }
109
129
</ ButtonLink >
110
130
) }
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
+ ) }
111
139
< 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 } ) } >
113
141
< ItemsList
114
142
items = { items }
115
143
depth = { 0 }
116
- maxDepth = { maxDepth ? maxDepth : 1 }
144
+ maxDepth = { maxDepth ?? 1 }
117
145
activeHash = { activeHash }
118
146
variant = { variant }
119
147
/>
120
148
</ ul >
121
- </ aside >
149
+ </ nav >
122
150
)
123
151
}
124
152
0 commit comments