@@ -38,8 +38,9 @@ interface ElementRefs {
38
38
} ;
39
39
primary : {
40
40
[ El . Main ] : HTMLElement ;
41
+ [ El . PrimaryNavWrapper ] : HTMLElement ;
41
42
[ El . PrimaryNav ] : HTMLElement ;
42
- [ El . NavItems ] : HTMLElement [ ] ;
43
+ [ El . NavItems ] : HTMLLIElement [ ] ;
43
44
[ El . OverflowNav ] : HTMLElement ;
44
45
[ El . ToggleBtn ] : HTMLElement ;
45
46
} ;
@@ -144,21 +145,12 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
144
145
}
145
146
146
147
/**
147
- * Generates the HTML to use in-place of the user's supplied element .
148
+ * Generates the HTML wrapper to use in-place of the user's supplied menu .
148
149
*/
149
150
function createMarkup ( ) : string {
150
151
return `
151
152
<div ${ dv ( El . Main ) } class="${ cn ( El . Main ) } ">
152
- <div class="${ cn ( El . PrimaryNavWrapper ) } ">
153
- <${ targetElem . tagName }
154
- ${ dv ( El . PrimaryNav ) }
155
- class="${ cn ( El . PrimaryNav ) } "
156
- >
157
- ${ Array . from ( targetElem . children ) . map ( ( elem : Element ) => (
158
- `<li ${ dv ( El . NavItems ) } class="${ cn ( El . NavItems ) } ">${ elem . innerHTML } </li>`
159
- ) ) . join ( '' ) }
160
- </${ targetElem . tagName } >
161
- </div>
153
+ <div class="${ cn ( El . PrimaryNavWrapper ) } " ${ dv ( El . PrimaryNavWrapper ) } ></div>
162
154
<button
163
155
${ dv ( El . ToggleBtn ) }
164
156
class="${ cn ( El . ToggleBtn ) } "
@@ -174,6 +166,36 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
174
166
` ;
175
167
}
176
168
169
+ /**
170
+ * Clones the target menu and enhances it with additional properties, such
171
+ * as data attributes and classes.
172
+ */
173
+ function cloneNav ( elem : HTMLElement ) : HTMLElement {
174
+ const targetClone = elem . cloneNode ( true ) as HTMLElement ;
175
+ enhanceOriginalMenu ( targetClone ) ;
176
+
177
+ const navItems = Array . from ( targetClone . children ) as HTMLLIElement [ ] ;
178
+ navItems . forEach ( enhanceOriginalNavItem )
179
+
180
+ return targetClone ;
181
+ }
182
+
183
+ /**
184
+ * Enhance the original list element with classes/attributes.
185
+ */
186
+ function enhanceOriginalMenu ( elem : HTMLElement ) {
187
+ elem . classList . add ( ...classNames [ El . PrimaryNav ] )
188
+ elem . setAttribute ( dv ( El . PrimaryNav ) , '' ) ;
189
+ }
190
+
191
+ /**
192
+ * Enhance an original menu list-item with classes/attributes.
193
+ */
194
+ function enhanceOriginalNavItem ( elem : HTMLLIElement ) {
195
+ elem . classList . add ( ...classNames [ El . NavItems ] )
196
+ elem . setAttribute ( dv ( El . NavItems ) , '' ) ;
197
+ }
198
+
177
199
/**
178
200
* Replaces the navigation with the two clones and populates the 'el' object.
179
201
*/
@@ -186,22 +208,26 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
186
208
el [ El . Container ] = container ;
187
209
188
210
const original = document . createRange ( ) . createContextualFragment ( markup ) ;
211
+
212
+ // Setup the wrapper and clone/enhance the original menu.
213
+ el . primary [ El . PrimaryNavWrapper ] = original . querySelector ( `[${ dv ( El . PrimaryNavWrapper ) } ]` ) as HTMLElement ;
214
+ el . primary [ El . PrimaryNavWrapper ] . appendChild ( cloneNav ( targetElem ) )
215
+
189
216
const cloned = original . cloneNode ( true ) as Element ;
190
217
218
+ // Establish references. By this point the menu is fully built.
191
219
el . primary [ El . Main ] = original . querySelector ( `[${ dv ( El . Main ) } ]` ) as HTMLElement ;
192
220
el . primary [ El . PrimaryNav ] = original . querySelector ( `[${ dv ( El . PrimaryNav ) } ]` ) as HTMLElement ;
193
- el . primary [ El . NavItems ] = Array . from ( original . querySelectorAll ( `[${ dv ( El . NavItems ) } ]` ) ) as HTMLElement [ ] ;
221
+ el . primary [ El . NavItems ] = Array . from ( original . querySelectorAll ( `[${ dv ( El . NavItems ) } ]` ) ) as HTMLLIElement [ ] ;
194
222
el . primary [ El . OverflowNav ] = original . querySelector ( `[${ dv ( El . OverflowNav ) } ]` ) as HTMLElement ;
195
223
el . primary [ El . ToggleBtn ] = original . querySelector ( `[${ dv ( El . ToggleBtn ) } ]` ) as HTMLElement ;
196
224
197
225
el . clone [ El . Main ] = cloned . querySelector ( `[${ dv ( El . Main ) } ]` ) as HTMLElement ;
198
226
el . clone [ El . NavItems ] = Array . from ( cloned . querySelectorAll ( `[${ dv ( El . NavItems ) } ]` ) ) as HTMLElement [ ] ;
199
227
el . clone [ El . ToggleBtn ] = cloned . querySelector ( `[${ dv ( El . ToggleBtn ) } ]` ) as HTMLElement ;
200
-
201
228
el . clone [ El . Main ] . setAttribute ( 'aria-hidden' , 'true' ) ;
202
229
el . clone [ El . Main ] . setAttribute ( 'data-clone' , 'true' ) ;
203
230
el . clone [ El . Main ] . classList . add ( `${ classNames [ El . Main ] [ 0 ] } --clone` ) ;
204
-
205
231
el . clone [ El . Main ] . classList . add ( `${ classNames [ El . Main ] [ 0 ] } --${ StateModifiers . ButtonVisible } ` ) ;
206
232
207
233
container . appendChild ( original ) ;
0 commit comments