@@ -38,8 +38,9 @@ interface ElementRefs {
3838 } ;
3939 primary : {
4040 [ El . Main ] : HTMLElement ;
41+ [ El . PrimaryNavWrapper ] : HTMLElement ;
4142 [ El . PrimaryNav ] : HTMLElement ;
42- [ El . NavItems ] : HTMLElement [ ] ;
43+ [ El . NavItems ] : HTMLLIElement [ ] ;
4344 [ El . OverflowNav ] : HTMLElement ;
4445 [ El . ToggleBtn ] : HTMLElement ;
4546 } ;
@@ -144,21 +145,12 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
144145 }
145146
146147 /**
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 .
148149 */
149150 function createMarkup ( ) : string {
150151 return `
151152 <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>
162154 <button
163155 ${ dv ( El . ToggleBtn ) }
164156 class="${ cn ( El . ToggleBtn ) } "
@@ -174,6 +166,36 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
174166 ` ;
175167 }
176168
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+
177199 /**
178200 * Replaces the navigation with the two clones and populates the 'el' object.
179201 */
@@ -186,22 +208,26 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
186208 el [ El . Container ] = container ;
187209
188210 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+
189216 const cloned = original . cloneNode ( true ) as Element ;
190217
218+ // Establish references. By this point the menu is fully built.
191219 el . primary [ El . Main ] = original . querySelector ( `[${ dv ( El . Main ) } ]` ) as HTMLElement ;
192220 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 [ ] ;
194222 el . primary [ El . OverflowNav ] = original . querySelector ( `[${ dv ( El . OverflowNav ) } ]` ) as HTMLElement ;
195223 el . primary [ El . ToggleBtn ] = original . querySelector ( `[${ dv ( El . ToggleBtn ) } ]` ) as HTMLElement ;
196224
197225 el . clone [ El . Main ] = cloned . querySelector ( `[${ dv ( El . Main ) } ]` ) as HTMLElement ;
198226 el . clone [ El . NavItems ] = Array . from ( cloned . querySelectorAll ( `[${ dv ( El . NavItems ) } ]` ) ) as HTMLElement [ ] ;
199227 el . clone [ El . ToggleBtn ] = cloned . querySelector ( `[${ dv ( El . ToggleBtn ) } ]` ) as HTMLElement ;
200-
201228 el . clone [ El . Main ] . setAttribute ( 'aria-hidden' , 'true' ) ;
202229 el . clone [ El . Main ] . setAttribute ( 'data-clone' , 'true' ) ;
203230 el . clone [ El . Main ] . classList . add ( `${ classNames [ El . Main ] [ 0 ] } --clone` ) ;
204-
205231 el . clone [ El . Main ] . classList . add ( `${ classNames [ El . Main ] [ 0 ] } --${ StateModifiers . ButtonVisible } ` ) ;
206232
207233 container . appendChild ( original ) ;
0 commit comments