Skip to content

Commit 3632149

Browse files
committed
feat: 헤더 메뉴를 Nav 컴포넌트로 분리
1 parent f2a9f94 commit 3632149

File tree

3 files changed

+454
-185
lines changed

3 files changed

+454
-185
lines changed
Lines changed: 7 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,22 @@
11
import styled from "@emotion/styled";
22

33
import * as Common from "@frontend/common";
4-
import { useNavigate } from 'react-router-dom';
5-
import { useMenu } from "../../../hooks/useMenu";
4+
import { useNavigate } from "react-router-dom";
65
import LanguageSelector from "../LanguageSelector";
76
import LoginButton from "../LoginButton";
7+
import Nav from "../Nav";
88

9-
interface SubMenuItem {
10-
text: string;
11-
href: string;
12-
}
13-
14-
interface MenuItem {
15-
text: string;
16-
href?: string;
17-
subMenu?: SubMenuItem[];
18-
}
9+
interface HeaderProps {}
1910

20-
interface HeaderProps {
21-
menus: MenuItem[];
22-
}
23-
24-
export default function Header({ menus }: HeaderProps) {
25-
const {
26-
hoveredMenu,
27-
focusedMenu,
28-
menuRefs,
29-
setHoveredMenu,
30-
setFocusedMenu,
31-
handleKeyDown,
32-
handleBlur,
33-
} = useMenu();
34-
const navigate = useNavigate()
11+
export default function Header({}: HeaderProps) {
12+
const navigate = useNavigate();
3513

3614
return (
3715
<HeaderContainer>
38-
<HeaderLogo onClick={() => navigate('/')}>
16+
<HeaderLogo onClick={() => navigate("/")}>
3917
<Common.Components.PythonKorea style={{ width: 40, height: 40 }} />
4018
</HeaderLogo>
41-
42-
<nav>
43-
<HeaderNav>
44-
{menus.map((menu) => (
45-
<li
46-
key={menu.text}
47-
ref={(el) => {
48-
menuRefs.current[menu.text] = el;
49-
}}
50-
onMouseEnter={() => setHoveredMenu(menu.text)}
51-
onMouseLeave={() => setHoveredMenu(null)}
52-
onFocus={() => setFocusedMenu(menu.text)}
53-
onBlur={() => handleBlur(menu)}
54-
onKeyDown={(e) => handleKeyDown(e, menu)}
55-
tabIndex={0}
56-
>
57-
{menu.text}
58-
{menu.subMenu &&
59-
(hoveredMenu === menu.text || focusedMenu === menu.text) && (
60-
<SubMenu>
61-
{menu.subMenu.map((subItem) => (
62-
<SubMenuItem key={subItem.text}>
63-
<a href={subItem.href} tabIndex={0}>
64-
{subItem.text}
65-
</a>
66-
</SubMenuItem>
67-
))}
68-
</SubMenu>
69-
)}
70-
</li>
71-
))}
72-
</HeaderNav>
73-
</nav>
19+
<Nav />
7420
<HeaderLeft>
7521
<LanguageSelector />
7622
<LoginButton />
@@ -91,85 +37,17 @@ const HeaderContainer = styled.header`
9137
justify-content: space-between;
9238
align-items: center;
9339
position: relative;
94-
95-
ul {
96-
list-style: none;
97-
}
9840
`;
9941

10042
const HeaderLogo = styled.div`
10143
display: flex;
10244
align-items: center;
10345
justify-content: center;
104-
10546
cursor: pointer;
10647
`;
10748

108-
const HeaderNav = styled.ul`
109-
display: flex;
110-
align-items: center;
111-
gap: 2rem;
112-
font-size: 0.875rem;
113-
font-weight: 500;
114-
position: relative;
115-
116-
li {
117-
position: relative;
118-
cursor: pointer;
119-
outline: none;
120-
121-
&:focus {
122-
outline: 2px solid ${({ theme }) => theme.palette.primary.main};
123-
outline-offset: 1px;
124-
}
125-
}
126-
`;
127-
12849
const HeaderLeft = styled.div`
12950
display: flex;
13051
align-items: center;
13152
gap: 1.125rem;
13253
`;
133-
134-
// const HeaderItem = styled.div`
135-
// display: flex;
136-
// align-items: center;
137-
// gap: 0.625rem;
138-
// `;
139-
140-
const SubMenu = styled.ul`
141-
position: absolute;
142-
top: 100%;
143-
left: 50%;
144-
transform: translateX(-50%);
145-
background-color: white;
146-
border-radius: 5px;
147-
padding: 5px 0;
148-
width: 125px;
149-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
150-
z-index: 1000;
151-
`;
152-
153-
const SubMenuItem = styled.li`
154-
padding: 5px 0;
155-
text-align: center;
156-
157-
a {
158-
color: ${({ theme }) => theme.palette.primary.light};
159-
text-decoration: none;
160-
font-size: 10px;
161-
display: block;
162-
outline: none;
163-
164-
&:hover,
165-
&:focus {
166-
color: ${({ theme }) => theme.palette.primary.main};
167-
font-weight: 600;
168-
}
169-
170-
&:focus {
171-
outline: 2px solid ${({ theme }) => theme.palette.primary.main};
172-
outline-offset: 0.5px;
173-
}
174-
}
175-
`;

0 commit comments

Comments
 (0)