Skip to content

Commit 4d34e06

Browse files
committed
refactor: resolve PR review feedback
1 parent ab5de01 commit 4d34e06

10 files changed

Lines changed: 285 additions & 275 deletions

File tree

src/components/header.tsx

Lines changed: 0 additions & 265 deletions
This file was deleted.
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
"use client"
2+
3+
import Link from "next/link"
4+
import { FiChevronDown } from "react-icons/fi"
5+
import { Glass } from "@/components/glass"
6+
import {
7+
NavigationMenu,
8+
NavigationMenuContent,
9+
NavigationMenuItem,
10+
NavigationMenuLink,
11+
NavigationMenuList,
12+
NavigationMenuTrigger,
13+
navigationMenuTriggerStyle,
14+
} from "@/components/ui/navigation-menu"
15+
import { headerMenuItems } from "./constants"
16+
import { IconButtonsDesktop } from "./IconButtons"
17+
import { Logo } from "./Logo"
18+
19+
export const DesktopLayout = () => {
20+
const removeDefaultHoverEffectClass = "hover:bg-transparent focus:bg-transparent bg-transparent"
21+
const customHoverEffectClass = "hover:underline focus:underline decoration-1 decoration-blue-secondary "
22+
23+
return (
24+
<Glass className="fixed inset-x-6 top-10 z-20 mx-auto box-border max-w-261.25 rounded-full px-17.5 py-5">
25+
<NavigationMenu
26+
viewport={false}
27+
className="top-0 isolate flex max-w-full shrink-0 items-stretch bg-card [&>div]:w-full"
28+
>
29+
<NavigationMenuList className="flex w-full justify-between">
30+
<NavigationMenuLink asChild className={`${removeDefaultHoverEffectClass} p-0 py-0.75`}>
31+
<Logo />
32+
</NavigationMenuLink>
33+
34+
{headerMenuItems.map((item) => (
35+
<NavigationMenuItem key={item.title}>
36+
{"menu" in item && item.menu ? (
37+
<>
38+
<NavigationMenuTrigger
39+
className={`typo-body-medium font-red-hat text-text-primary ${removeDefaultHoverEffectClass} ${customHoverEffectClass} group h-fit p-0 [&_.lucide-chevron-down]:hidden`}
40+
hideChevron
41+
>
42+
<div className="flex flex-col gap-1">
43+
<span className="typo-body-medium font-red-hat text-text-primary">{item.title}</span>
44+
</div>
45+
<FiChevronDown
46+
size={24}
47+
className="relative top-px ml-1 text-text-primary transition duration-300 group-data-[state=open]:rotate-180"
48+
/>
49+
</NavigationMenuTrigger>
50+
51+
<NavigationMenuContent className="-translate-x-1/2 left-1/2 mt-8.5! border-none bg-transparent p-0 shadow-none! data-[state=closed]:bg-transparent data-[state=open]:bg-transparent">
52+
<ul className="w-fit text-nowrap">
53+
<Glass>
54+
{"menu" in item &&
55+
item.menu.map((subItem) => {
56+
const Icon = subItem.icon
57+
return (
58+
<li key={subItem.title}>
59+
<NavigationMenuLink
60+
asChild
61+
className={`flex shrink-0 flex-row flex-nowrap items-center justify-between ${removeDefaultHoverEffectClass} ${customHoverEffectClass}`}
62+
>
63+
<Link href={subItem.href || "#"}>
64+
<div className="flex flex-col gap-1">
65+
<span className="typo-body-medium font-red-hat text-text-primary">
66+
{subItem.title}
67+
</span>
68+
</div>
69+
<Icon size={24} className="text-text-primary" />
70+
</Link>
71+
</NavigationMenuLink>
72+
</li>
73+
)
74+
})}
75+
</Glass>
76+
</ul>
77+
</NavigationMenuContent>
78+
</>
79+
) : (
80+
<NavigationMenuLink asChild>
81+
<Link href={"href" in item ? item.href || "#" : "#"} className={navigationMenuTriggerStyle()}>
82+
{item.title}
83+
</Link>
84+
</NavigationMenuLink>
85+
)}
86+
</NavigationMenuItem>
87+
))}
88+
89+
<NavigationMenuItem className="flex items-center gap-5">
90+
<IconButtonsDesktop removeHoverClass={removeDefaultHoverEffectClass} />
91+
</NavigationMenuItem>
92+
</NavigationMenuList>
93+
</NavigationMenu>
94+
</Glass>
95+
)
96+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { FiGlobe, FiMoon, FiUser } from "react-icons/fi"
2+
import { NavigationMenuLink } from "@/components/ui/navigation-menu"
3+
import { handleGlobeIconClick, handleMoonIconClick, handleUserIconClick } from "./handlers"
4+
5+
const iconConfigs = [
6+
{ key: "user", label: "User profile", Icon: FiUser, onClick: handleUserIconClick },
7+
{ key: "globe", label: "Language", Icon: FiGlobe, onClick: handleGlobeIconClick },
8+
{ key: "moon", label: "Theme", Icon: FiMoon, onClick: handleMoonIconClick },
9+
]
10+
11+
export const IconButtonsMobile = () => (
12+
<>
13+
{iconConfigs.map(({ key, label, Icon, onClick }) => (
14+
<button key={key} type="button" onClick={onClick} aria-label={label}>
15+
<Icon size={24} className="text-black" />
16+
</button>
17+
))}
18+
</>
19+
)
20+
21+
export const IconButtonsDesktop = ({ removeHoverClass }: { removeHoverClass: string }) => (
22+
<>
23+
{iconConfigs.map(({ key, label, Icon, onClick }) => (
24+
<NavigationMenuLink key={key} asChild className={`${removeHoverClass} p-0`}>
25+
<button type="button" onClick={onClick} aria-label={label}>
26+
<Icon size={24} className="text-text-primary" />
27+
</button>
28+
</NavigationMenuLink>
29+
))}
30+
</>
31+
)

0 commit comments

Comments
 (0)