11import styled from "@emotion/styled" ;
22
33import * 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" ;
65import LanguageSelector from "../LanguageSelector" ;
76import 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
10042const 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-
12849const 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