Skip to content

Commit 9cef30a

Browse files
committed
refactor: create MenuAccordion to isolate custom styles and logic
1 parent c6dced5 commit 9cef30a

File tree

3 files changed

+75
-58
lines changed

3 files changed

+75
-58
lines changed

src/components/Nav/Mobile/LvlAccordion.tsx

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ import { trackCustomEvent } from "@/lib/utils/matomo"
99
import { cleanPath } from "@/lib/utils/url"
1010

1111
import { BaseLink } from "../../../../tailwind/Link"
12+
import type { Level, NavItem, NavSectionKey } from "../types"
13+
14+
import ExpandIcon from "./ExpandIcon"
1215
import {
1316
Accordion,
1417
AccordionContent,
1518
AccordionItem,
16-
} from "../../../../tailwind/ui/accordion"
17-
import type { Level, NavItem, NavSectionKey } from "../types"
18-
19-
import ExpandIcon from "./ExpandIcon"
19+
AccordionTrigger,
20+
} from "./MenuAccordion"
2021

2122
import { useNavMenuColorsTw } from "@/hooks/useNavMenuColorsTw"
2223

@@ -106,15 +107,15 @@ const LvlAccordion = ({
106107
</AccordionItem>
107108
)
108109

109-
const Heading = `h${lvl + 1}` as "h2" | "h3" | "h4" | "h5"
110110
return (
111111
<AccordionItem
112112
key={label}
113113
value={label}
114114
className="border-t border-body-light last:border-b"
115115
>
116-
<AccordionPrimitive.Header
117-
className="flex"
116+
<AccordionTrigger
117+
heading={`h${lvl + 1}` as "h2" | "h3" | "h4" | "h5"}
118+
className={cn(menuColors.body, nestedAccordionSpacingMap[lvl])}
118119
onClick={() => {
119120
trackCustomEvent({
120121
eventCategory: "Mobile navigation menu",
@@ -124,38 +125,27 @@ const LvlAccordion = ({
124125
} section: ${label} - ${description.slice(0, 16)}...`,
125126
})
126127
}}
127-
asChild
128128
>
129-
<Heading>
130-
<AccordionPrimitive.Trigger
129+
<ExpandIcon isOpen={isExpanded} />
130+
<div>
131+
<p
132+
className={cn(
133+
"flex-1 text-md font-bold leading-tight",
134+
menuColors.body
135+
)}
136+
>
137+
{label}
138+
</p>
139+
<p
131140
className={cn(
132-
"group flex flex-1 items-center justify-start gap-2 px-4 py-4 text-start font-medium transition-all hover:bg-background-highlight focus-visible:outline-1 focus-visible:-outline-offset-1 focus-visible:outline-primary-hover md:px-4 [&[data-state=open]]:bg-background-highlight [&[data-state=open]]:text-primary-high-contrast",
133-
menuColors.body,
134-
nestedAccordionSpacingMap[lvl]
141+
"text-sm font-normal leading-tight",
142+
menuColors.lvl[lvl].subtext
135143
)}
136144
>
137-
<ExpandIcon isOpen={isExpanded} />
138-
<div>
139-
<p
140-
className={cn(
141-
"flex-1 text-md font-bold leading-tight",
142-
menuColors.body
143-
)}
144-
>
145-
{label}
146-
</p>
147-
<p
148-
className={cn(
149-
"text-sm font-normal leading-tight",
150-
menuColors.lvl[lvl].subtext
151-
)}
152-
>
153-
{description}
154-
</p>
155-
</div>
156-
</AccordionPrimitive.Trigger>
157-
</Heading>
158-
</AccordionPrimitive.Header>
145+
{description}
146+
</p>
147+
</div>
148+
</AccordionTrigger>
159149

160150
<AccordionContent
161151
className={cn("mt-0 p-0", menuColors.lvl[lvl + 1].background)}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import * as AccordionPrimitive from "@radix-ui/react-accordion"
2+
3+
import { cn } from "@/lib/utils/cn"
4+
5+
import {
6+
Accordion,
7+
AccordionContent,
8+
AccordionItem,
9+
} from "../../../../tailwind/ui/accordion"
10+
11+
type AccordionTriggerProps = {
12+
heading?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"
13+
} & React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
14+
15+
const AccordionTrigger = ({
16+
heading = "h2",
17+
className,
18+
...props
19+
}: AccordionTriggerProps) => {
20+
const Heading = heading
21+
22+
return (
23+
<AccordionPrimitive.Header className="flex" asChild>
24+
<Heading>
25+
<AccordionPrimitive.Trigger
26+
className={cn(
27+
"group flex flex-1 items-center justify-start gap-2 px-4 py-4 text-start font-medium transition-all hover:bg-background-highlight focus-visible:outline-1 focus-visible:-outline-offset-1 focus-visible:outline-primary-hover md:px-4 [&[data-state=open]]:bg-background-highlight [&[data-state=open]]:text-primary-high-contrast",
28+
className
29+
)}
30+
{...props}
31+
/>
32+
</Heading>
33+
</AccordionPrimitive.Header>
34+
)
35+
}
36+
37+
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger }

src/components/Nav/Mobile/MenuBody.tsx

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
import { useState } from "react"
22
import { useRouter } from "next/router"
3-
import * as AccordionPrimitive from "@radix-ui/react-accordion"
43

54
import { cn } from "@/lib/utils/cn"
65
import { trackCustomEvent } from "@/lib/utils/matomo"
76

87
import { SECTION_LABELS } from "@/lib/constants"
98

10-
import {
11-
Accordion,
12-
AccordionContent,
13-
AccordionItem,
14-
} from "../../../../tailwind/ui/accordion"
159
import type { Level, NavSections } from "../types"
1610

1711
import ExpandIcon from "./ExpandIcon"
1812
import LvlAccordion from "./LvlAccordion"
13+
import {
14+
Accordion,
15+
AccordionContent,
16+
AccordionItem,
17+
AccordionTrigger,
18+
} from "./MenuAccordion"
1919

2020
import { useNavMenuColorsTw } from "@/hooks/useNavMenuColorsTw"
2121

@@ -47,8 +47,8 @@ const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => {
4747
value={key}
4848
className="border-b border-body-light first:border-t"
4949
>
50-
<AccordionPrimitive.Header
51-
className="flex"
50+
<AccordionTrigger
51+
className={cn(menuColors.body)}
5252
onClick={() => {
5353
trackCustomEvent({
5454
eventCategory: "Mobile navigation menu",
@@ -58,22 +58,12 @@ const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => {
5858
} section: ${locale} - ${key}`,
5959
})
6060
}}
61-
asChild
6261
>
63-
<h2>
64-
<AccordionPrimitive.Trigger
65-
className={cn(
66-
"group flex flex-1 items-center justify-between gap-2 px-4 py-4 font-medium transition-all hover:bg-background-highlight focus-visible:outline-1 focus-visible:-outline-offset-1 focus-visible:outline-primary-hover md:px-4 [&[data-state=open]]:bg-background-highlight [&[data-state=open]]:text-primary-high-contrast",
67-
menuColors.body
68-
)}
69-
>
70-
<ExpandIcon isOpen={isExpanded} />
71-
<span className="flex-1 text-start text-lg font-bold leading-none">
72-
{label}
73-
</span>
74-
</AccordionPrimitive.Trigger>
75-
</h2>
76-
</AccordionPrimitive.Header>
62+
<ExpandIcon isOpen={isExpanded} />
63+
<span className="flex-1 text-start text-lg font-bold leading-none">
64+
{label}
65+
</span>
66+
</AccordionTrigger>
7767

7868
<AccordionContent
7969
className={cn(

0 commit comments

Comments
 (0)