1
1
"use client"
2
2
3
+ import { cva , type VariantProps } from "class-variance-authority"
4
+
3
5
import type { ToCItem } from "@/lib/types"
4
6
5
7
import Github from "@/components/icons/github.svg"
@@ -14,7 +16,39 @@ import { useActiveHash } from "@/hooks/useActiveHash"
14
16
import { useTranslation } from "@/hooks/useTranslation"
15
17
import { usePathname } from "@/i18n/routing"
16
18
17
- export type TableOfContentsProps = {
19
+ const variants = cva (
20
+ "sticky hidden flex-col items-start overflow-y-auto lg:flex" ,
21
+ {
22
+ variants : {
23
+ variant : {
24
+ default :
25
+ "top-19 min-w-48 max-w-[25%] p-4 pe-0 h-[calc(100vh-80px)] gap-4" ,
26
+ 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"
30
+ ) ,
31
+ } ,
32
+ } ,
33
+ defaultVariants : {
34
+ variant : "default" ,
35
+ } ,
36
+ }
37
+ )
38
+
39
+ const labelVariants = cva ( "text-body-medium" , {
40
+ variants : {
41
+ variant : {
42
+ default : "uppercase" ,
43
+ beginner : "font-bold text-lg" ,
44
+ } ,
45
+ } ,
46
+ defaultVariants : {
47
+ variant : "default" ,
48
+ } ,
49
+ } )
50
+
51
+ export interface TableOfContentsProps extends VariantProps < typeof variants > {
18
52
items : Array < ToCItem >
19
53
maxDepth ?: number
20
54
editPath ?: string
@@ -30,13 +64,12 @@ const TableOfContents = ({
30
64
hideEditButton = false ,
31
65
isMobile = false ,
32
66
className,
67
+ variant,
33
68
...rest
34
69
} : TableOfContentsProps ) => {
35
70
const pathname = usePathname ( )
36
71
const { t } = useTranslation ( "common" )
37
-
38
72
const titleIds : Array < string > = [ ]
39
-
40
73
if ( ! isMobile ) {
41
74
const getTitleIds = ( items : Array < ToCItem > , depth : number ) : void => {
42
75
// Return early if maxDepth hit
@@ -56,17 +89,11 @@ const TableOfContents = ({
56
89
return null
57
90
}
58
91
if ( isMobile ) {
59
- return < Mobile items = { items } maxDepth = { maxDepth } />
92
+ return < Mobile variant = { variant } items = { items } maxDepth = { maxDepth } />
60
93
}
61
94
62
95
return (
63
- < aside
64
- className = { cn (
65
- "sticky top-19 hidden h-[calc(100vh-80px)] min-w-48 max-w-[25%] flex-col items-start gap-4 overflow-y-auto p-4 pe-0 lg:flex" ,
66
- className
67
- ) }
68
- { ...rest }
69
- >
96
+ < aside className = { variants ( { variant, className } ) } { ...rest } >
70
97
{ ! hideEditButton && editPath && (
71
98
< ButtonLink
72
99
href = { editPath }
@@ -81,15 +108,14 @@ const TableOfContents = ({
81
108
{ t ( "edit-page" ) }
82
109
</ ButtonLink >
83
110
) }
84
- < div data-label = "label" className = "uppercase text-body-medium" >
85
- { t ( "on-this-page" ) }
86
- </ div >
111
+ < div className = { labelVariants ( { variant } ) } > { t ( "on-this-page" ) } </ div >
87
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" >
88
113
< ItemsList
89
114
items = { items }
90
115
depth = { 0 }
91
116
maxDepth = { maxDepth ? maxDepth : 1 }
92
117
activeHash = { activeHash }
118
+ variant = { variant }
93
119
/>
94
120
</ ul >
95
121
</ aside >
0 commit comments