|
1 | | -"use client"; |
| 1 | +'use client'; |
2 | 2 |
|
3 | | -import Hamburger from "@heroicons/react/24/solid/Bars3Icon"; |
4 | | -import XMark from "@heroicons/react/24/solid/XMarkIcon"; |
5 | | -import * as Label from "@radix-ui/react-label"; |
6 | | -import { useState } from "react"; |
7 | | -import type { FC, ComponentProps, HTMLAttributeAnchorTarget } from "react"; |
| 3 | +import Hamburger from '@heroicons/react/24/solid/Bars3Icon'; |
| 4 | +import XMark from '@heroicons/react/24/solid/XMarkIcon'; |
| 5 | +import * as Label from '@radix-ui/react-label'; |
| 6 | +import dynamic from 'next/dynamic'; |
| 7 | +import { useState } from 'react'; |
| 8 | +import type { FC, ComponentProps, HTMLAttributeAnchorTarget } from 'react'; |
8 | 9 |
|
9 | | -import LanguageDropdown from "@/components/Common/LanguageDropDown"; |
10 | | -import { SearchButton } from "@/components/Common/Search"; |
11 | | -import ThemeToggle from "@/components/Common/ThemeToggle"; |
12 | | -import NavItem from "@/components/Containers/NavBar/NavItem"; |
13 | | -import GitHub from "@/components/Icons/Social/GitHub"; |
14 | | -import Link from "@/components/Link"; |
15 | | -import WithNodejsLogo from "@/components/withNodejsLogo"; |
16 | | -import type { FormattedMessage } from "@/types"; |
| 10 | +import LanguageDropdown from '@/components/Common/LanguageDropDown'; |
| 11 | +import ThemeToggle from '@/components/Common/ThemeToggle'; |
| 12 | +import NavItem from '@/components/Containers/NavBar/NavItem'; |
| 13 | +import GitHub from '@/components/Icons/Social/GitHub'; |
| 14 | +import Link from '@/components/Link'; |
| 15 | +import WithNodejsLogo from '@/components/withNodejsLogo'; |
| 16 | +import type { FormattedMessage } from '@/types'; |
17 | 17 |
|
18 | | -import style from "./index.module.css"; |
| 18 | +import style from './index.module.css'; |
| 19 | + |
| 20 | +const SearchButton = dynamic(() => import('@/components/Common/Search'), { |
| 21 | + ssr: false, |
| 22 | +}); |
19 | 23 |
|
20 | 24 | const navInteractionIcons = { |
21 | | - show: <Hamburger className={style.navInteractionIcon} />, |
22 | | - close: <XMark className={style.navInteractionIcon} />, |
| 25 | + show: <Hamburger className={style.navInteractionIcon} />, |
| 26 | + close: <XMark className={style.navInteractionIcon} />, |
23 | 27 | }; |
24 | 28 |
|
25 | 29 | type NavbarProps = { |
26 | | - navItems: Array<{ |
27 | | - text: FormattedMessage; |
28 | | - link: string; |
29 | | - target?: HTMLAttributeAnchorTarget | undefined; |
30 | | - }>; |
31 | | - languages: ComponentProps<typeof LanguageDropdown>; |
32 | | - onThemeTogglerClick: () => void; |
| 30 | + navItems: Array<{ |
| 31 | + text: FormattedMessage; |
| 32 | + link: string; |
| 33 | + target?: HTMLAttributeAnchorTarget | undefined; |
| 34 | + }>; |
| 35 | + languages: ComponentProps<typeof LanguageDropdown>; |
| 36 | + onThemeTogglerClick: () => void; |
33 | 37 | }; |
34 | 38 |
|
35 | 39 | const NavBar: FC<NavbarProps> = ({ |
36 | | - navItems, |
37 | | - languages, |
38 | | - onThemeTogglerClick, |
| 40 | + navItems, |
| 41 | + languages, |
| 42 | + onThemeTogglerClick, |
39 | 43 | }) => { |
40 | | - const [isMenuOpen, setIsMenuOpen] = useState(false); |
41 | | - |
42 | | - return ( |
43 | | - <nav className={`${style.container}`}> |
44 | | - <div className={style.nodeIconAndMobileItemsToggler}> |
45 | | - <Link className={style.nodeIconWrapper} href="/" aria-label="Home"> |
46 | | - <WithNodejsLogo /> |
47 | | - </Link> |
48 | | - |
49 | | - <Label.Root |
50 | | - onClick={() => setIsMenuOpen((prev) => !prev)} |
51 | | - className={style.sidebarItemTogglerLabel} |
52 | | - htmlFor="sidebarItemToggler" |
53 | | - > |
54 | | - {navInteractionIcons[isMenuOpen ? "close" : "show"]} |
55 | | - </Label.Root> |
56 | | - </div> |
57 | | - |
58 | | - <input className="peer hidden" id="sidebarItemToggler" type="checkbox" /> |
59 | | - |
60 | | - <div className={`${style.main} peer-checked:flex`}> |
61 | | - <div className={style.navItems}> |
62 | | - {navItems.map(({ text, link, target }) => ( |
63 | | - <NavItem key={link} href={link} target={target}> |
64 | | - {text} |
65 | | - </NavItem> |
66 | | - ))} |
67 | | - </div> |
68 | | - |
69 | | - <div className={style.actionsWrapper}> |
70 | | - <SearchButton /> |
71 | | - |
72 | | - <ThemeToggle onClick={onThemeTogglerClick} /> |
73 | | - |
74 | | - <LanguageDropdown |
75 | | - onChange={languages.onChange} |
76 | | - availableLanguages={languages.availableLanguages} |
77 | | - currentLanguage={languages.currentLanguage} |
78 | | - /> |
79 | | - |
80 | | - <Link |
81 | | - className={style.ghIconWrapper} |
82 | | - href="https://github.com/nodejs/node" |
83 | | - aria-label="Node.js Github" |
84 | | - > |
85 | | - <GitHub /> |
86 | | - </Link> |
87 | | - </div> |
88 | | - </div> |
89 | | - </nav> |
90 | | - ); |
| 44 | + const [isMenuOpen, setIsMenuOpen] = useState(false); |
| 45 | + |
| 46 | + return ( |
| 47 | + <nav className={`${style.container}`}> |
| 48 | + <div className={style.nodeIconAndMobileItemsToggler}> |
| 49 | + <Link className={style.nodeIconWrapper} href="/" aria-label="Home"> |
| 50 | + <WithNodejsLogo /> |
| 51 | + </Link> |
| 52 | + |
| 53 | + <Label.Root |
| 54 | + onClick={() => setIsMenuOpen(prev => !prev)} |
| 55 | + className={style.sidebarItemTogglerLabel} |
| 56 | + htmlFor="sidebarItemToggler" |
| 57 | + > |
| 58 | + {navInteractionIcons[isMenuOpen ? 'close' : 'show']} |
| 59 | + </Label.Root> |
| 60 | + </div> |
| 61 | + |
| 62 | + <input className="peer hidden" id="sidebarItemToggler" type="checkbox" /> |
| 63 | + |
| 64 | + <div className={`${style.main} peer-checked:flex`}> |
| 65 | + <div className={style.navItems}> |
| 66 | + {navItems.map(({ text, link, target }) => ( |
| 67 | + <NavItem key={link} href={link} target={target}> |
| 68 | + {text} |
| 69 | + </NavItem> |
| 70 | + ))} |
| 71 | + </div> |
| 72 | + |
| 73 | + <div className={style.actionsWrapper}> |
| 74 | + <SearchButton /> |
| 75 | + |
| 76 | + <ThemeToggle onClick={onThemeTogglerClick} /> |
| 77 | + |
| 78 | + <LanguageDropdown |
| 79 | + onChange={languages.onChange} |
| 80 | + availableLanguages={languages.availableLanguages} |
| 81 | + currentLanguage={languages.currentLanguage} |
| 82 | + /> |
| 83 | + |
| 84 | + <Link |
| 85 | + className={style.ghIconWrapper} |
| 86 | + href="https://github.com/nodejs/node" |
| 87 | + aria-label="Node.js Github" |
| 88 | + > |
| 89 | + <GitHub /> |
| 90 | + </Link> |
| 91 | + </div> |
| 92 | + </div> |
| 93 | + </nav> |
| 94 | + ); |
91 | 95 | }; |
92 | 96 |
|
93 | 97 | export default NavBar; |
0 commit comments