@@ -51,42 +51,34 @@ export default (hostComponent) => {
51
51
display: flex;
52
52
gap: 0.2rem;
53
53
align-items: center;
54
- padding:0.5rem 0.3rem;
55
- border-radius:0.3rem;
54
+ padding: 0.5rem 0.3rem;
55
+ border-radius: 0.3rem;
56
+ }
57
+ a:hover {
58
+ background-color: var(--secondary-color);
56
59
}
57
-
58
- a:hover{
59
- background-color:var(--secondary-color);
60
- }
61
-
62
60
a.active {
63
61
color: var(--primary-color); /* Active link color */
64
62
}
65
-
66
63
&.header-bar-mode {
67
-
68
64
flex-direction: row;
69
65
justify-content: top;
70
66
background-color: transparent;
71
67
width: 100%;
72
-
73
68
@media (max-width: ${ burgerPx } px) {
74
69
flex-direction: column;
75
-
76
70
a {
77
71
width: 100%;
78
72
}
79
-
80
73
align-items: center;
81
74
position: absolute;
82
75
background-color: var(--nav-background-color);
83
76
top: 0;
84
- bottom:0;
77
+ bottom: 0;
85
78
display: none;
86
79
}
87
80
}
88
81
}
89
-
90
82
.burger-button {
91
83
position: absolute;
92
84
right: 0;
@@ -95,44 +87,62 @@ export default (hostComponent) => {
95
87
cursor: pointer;
96
88
z-index: 100;
97
89
}
98
-
99
90
nav:not(.header-bar-mode) {
100
91
@media (max-width: 499px) {
101
- padding: 10px 6px;
102
-
92
+ padding: 10px 6px;
103
93
.text {
104
94
display: none;
105
95
}
106
96
}
107
- a {padding:0.4rem 0.6rem;}
108
-
97
+ a {
98
+ padding: 0.4rem 0.6rem;
99
+ }
109
100
@media (min-width: 500px) {
110
101
.icon {
111
102
display: none;
112
103
}
113
104
}
114
105
}
115
-
116
106
@media (max-width: ${ burgerPx } px) {
117
107
nav.header-bar-mode.burger-open {
118
108
display: flex !important;
119
109
}
120
110
}
121
-
122
111
@media (min-width: ${ burgerPx } px) {
123
112
.burger-button {
124
113
display: none !important;
125
114
}
126
115
}
116
+ /* Burger icon animation */
117
+ .burger-button svg rect {
118
+ transition: transform 0.3s ease, opacity 0.3s ease;
119
+ transform-box: fill-box;
120
+ transform-origin: center;
121
+ }
122
+ .burger-button.open svg rect:nth-child(1) {
123
+ transform: translateY(30px) rotate(45deg);
124
+ }
125
+ .burger-button.open svg rect:nth-child(2) {
126
+ opacity: 0;
127
+ }
128
+ .burger-button.open svg rect:nth-child(3) {
129
+ transform: translateY(-30px) rotate(-45deg);
130
+ }
127
131
` ;
128
132
129
133
if ( headerBar === 'true' ) {
130
134
hostComponent . classList . add ( 'header-bar-mode' ) ;
131
135
hostComponent . parentElement . style . flexDirection = 'column' ;
132
136
}
133
137
138
+ // Declare burgerButton outside toggleNavVisibility to ensure accessibility within the closure.
139
+ let burgerButton ;
140
+
134
141
const toggleNavVisibility = ( ) => {
135
142
hostComponent . classList . toggle ( 'burger-open' ) ;
143
+ if ( burgerButton ) {
144
+ burgerButton . classList . toggle ( 'open' ) ;
145
+ }
136
146
} ;
137
147
138
148
hostComponent . innerHTML = `
@@ -171,7 +181,6 @@ export default (hostComponent) => {
171
181
</a>
172
182
` ;
173
183
174
- // Function to update the active link based on the current path
175
184
const updateActiveLink = ( ) => {
176
185
const currentPath = window . location . pathname ;
177
186
hostComponent . querySelectorAll ( 'a' ) . forEach ( ( link ) => {
@@ -181,24 +190,23 @@ export default (hostComponent) => {
181
190
} ;
182
191
updateActiveLink ( ) ;
183
192
184
- // Listen for popstate events to update active link on browser navigation
185
193
window . addEventListener ( 'popstate' , updateActiveLink ) ;
186
194
187
195
if ( headerBar === 'true' && burgerPx ) {
188
196
hostComponent . parentElement . insertAdjacentHTML (
189
- 'afterbegin' ,
190
- `
197
+ 'afterbegin' ,
198
+ `
191
199
<button class="burger-button squarify wireframe border-none" title="Open or close nav menu">
192
- <svg class="icon" viewBox="0 0 100 80" width="20" height="20" fill="currentColor">
200
+ <svg class="icon" viewBox="0 0 100 80" preserveAspectRatio="xMidYMid meet" width="20" height="20" fill="currentColor">
193
201
<rect width="100" height="20"></rect>
194
202
<rect y="30" width="100" height="20"></rect>
195
203
<rect y="60" width="100" height="20"></rect>
196
204
</svg>
197
205
</button>
198
- ` ,
206
+ `
199
207
) ;
200
208
201
- const burgerButton = hostComponent . parentElement . querySelector ( '.burger-button' ) ;
209
+ burgerButton = hostComponent . parentElement . querySelector ( '.burger-button' ) ;
202
210
203
211
document . addEventListener ( 'click' , ( event ) => {
204
212
const isBurgerOpen = hostComponent . classList . contains ( 'burger-open' ) ;
@@ -208,14 +216,23 @@ export default (hostComponent) => {
208
216
if ( clickedBurgerButton ) {
209
217
event . stopPropagation ( ) ;
210
218
toggleNavVisibility ( ) ;
219
+ return ;
211
220
}
212
221
213
222
if ( isBurgerOpen && clickedNavItem ) {
214
223
toggleNavVisibility ( ) ;
224
+ return ;
215
225
}
216
226
217
227
if ( isBurgerOpen && ! event . target . closest ( 'nav' ) && ! clickedBurgerButton ) {
218
228
toggleNavVisibility ( ) ;
229
+ return ;
230
+ }
231
+ } ) ;
232
+
233
+ document . addEventListener ( 'keydown' , ( event ) => {
234
+ if ( event . key === 'Escape' && hostComponent . classList . contains ( 'burger-open' ) ) {
235
+ toggleNavVisibility ( ) ;
219
236
}
220
237
} ) ;
221
238
}
0 commit comments