@@ -10,156 +10,10 @@ import { BaseComponent } from '../base-component.js';
10
10
import Mousetrap from 'mousetrap' ;
11
11
import 'url-search-params-polyfill' ;
12
12
13
- const SubSubList = props => {
14
- const { children, category, elem } = props ;
15
- const reorderedChildren = [ ] ;
16
-
17
- const nonViewAllItems = children . filter ( item => ! item . isDocPattern ) ;
18
- const viewAllItems = elem . noViewAll
19
- ? [ ]
20
- : children . filter ( item => item . isDocPattern ) ;
21
-
22
- reorderedChildren . push ( ...viewAllItems , ...nonViewAllItems ) ;
23
-
24
- return (
25
- < li className = { `pl-c-nav__item pl-c-nav__item--${ category . toLowerCase ( ) } ` } >
26
- { viewAllItems . length > 0 ? (
27
- viewAllItems . map ( patternSubtypeItem => (
28
- < div class = "pl-c-nav__link--overview-wrapper" >
29
- < a
30
- href = { `patterns/${ patternSubtypeItem . patternPath } ` }
31
- className = { `pl-c-nav__link pl-c-nav__link--sublink
32
- ${
33
- patternSubtypeItem . isDocPattern
34
- ? 'pl-c-nav__link--overview pl-js-link-overview'
35
- : 'pl-c-nav__link--subsublink'
36
- }
37
- ` }
38
- onClick = { e =>
39
- elem . handleClick ( e , patternSubtypeItem . patternPartial )
40
- }
41
- data-patternpartial = { patternSubtypeItem . patternPartial }
42
- >
43
- { patternSubtypeItem . isDocPattern
44
- ? `${ category } `
45
- : patternSubtypeItem . patternName }
46
- { patternSubtypeItem . patternState && (
47
- < span
48
- class = { `pl-c-pattern-state pl-c-pattern-state--${ patternSubtypeItem . patternState } ` }
49
- title = { patternSubtypeItem . patternState }
50
- />
51
- ) }
52
- </ a >
53
-
54
- { nonViewAllItems . length >= 1 && (
55
- < SpecialButton
56
- aria-controls = { category }
57
- onClick = { elem . toggleSpecialNavPanel }
58
- >
59
- { category }
60
- </ SpecialButton >
61
- ) }
62
- </ div >
63
- ) )
64
- ) : (
65
- < Button aria-controls = { category } onClick = { elem . toggleNavPanel } >
66
- { category }
67
- </ Button >
68
- ) }
69
-
70
- { ( ( viewAllItems . length && nonViewAllItems . length ) ||
71
- viewAllItems . length === 0 ) && (
72
- < ol
73
- id = { category }
74
- className = { `pl-c-nav__subsublist pl-c-nav__subsublist--dropdown pl-js-acc-panel` }
75
- >
76
- { nonViewAllItems . map ( patternSubtypeItem => (
77
- < li class = "pl-c-nav__item" >
78
- < a
79
- href = { `patterns/${ patternSubtypeItem . patternPath } ` }
80
- className = { `pl-c-nav__link pl-c-nav__link--sublink
81
- ${
82
- patternSubtypeItem . isDocPattern
83
- ? 'pl-c-nav__link--overview'
84
- : 'pl-c-nav__link--subsublink'
85
- }
86
- ` }
87
- onClick = { e =>
88
- elem . handleClick ( e , patternSubtypeItem . patternPartial )
89
- }
90
- data-patternpartial = { patternSubtypeItem . patternPartial }
91
- >
92
- { patternSubtypeItem . isDocPattern
93
- ? `${ category } Overview`
94
- : patternSubtypeItem . patternName }
95
- { patternSubtypeItem . patternState && (
96
- < span
97
- class = { `pl-c-pattern-state pl-c-pattern-state--${ patternSubtypeItem . patternState } ` }
98
- title = { patternSubtypeItem . patternState }
99
- />
100
- ) }
101
- </ a >
102
- </ li >
103
- ) ) }
104
- </ ol >
105
- ) }
106
- </ li >
107
- ) ;
108
- } ;
109
-
110
- const SpecialButton = props => {
111
- return (
112
- < button
113
- className = { `pl-c-nav__link pl-c-nav__link--section-dropdown pl-js-acc-handle` }
114
- role = "tab"
115
- { ...props }
116
- >
117
- { props . children }
118
- < span
119
- class = "pl-c-nav__link-icon"
120
- dangerouslySetInnerHTML = { {
121
- __html : '<pl-icon name="arrow-down"></pl-icon>' ,
122
- } }
123
- />
124
- </ button >
125
- ) ;
126
- } ;
127
-
128
- const Button = props => {
129
- return (
130
- < button
131
- className = { `pl-c-nav__link pl-c-nav__link--dropdown pl-js-acc-handle` }
132
- role = "tab"
133
- { ...props }
134
- >
135
- < span className = { `pl-c-nav__link-text` } > { props . children } </ span >
136
- < span
137
- class = "pl-c-nav__link-icon"
138
- dangerouslySetInnerHTML = { {
139
- __html : '<pl-icon name="arrow-down"></pl-icon>' ,
140
- } }
141
- />
142
- </ button >
143
- ) ;
144
- } ;
145
-
146
- const ButtonTitle = props => {
147
- return (
148
- < button
149
- className = { `pl-c-nav__link pl-c-nav__link--title pl-js-acc-handle` }
150
- role = "tab"
151
- { ...props }
152
- >
153
- < span
154
- class = "pl-c-nav__link-icon"
155
- dangerouslySetInnerHTML = { {
156
- __html : '<pl-icon name="arrow-down"></pl-icon>' ,
157
- } }
158
- />
159
- < span className = { `pl-c-nav__link-text` } > { props . children } </ span >
160
- </ button >
161
- ) ;
162
- } ;
13
+ import { NavTitle } from './src/NavTitle' ;
14
+ import { NavList } from './src/NavList' ;
15
+ import { NavLink } from './src/NavLink' ;
16
+ import { NavItem } from './src/NavItem' ;
163
17
164
18
@define
165
19
class Nav extends BaseComponent {
@@ -365,7 +219,22 @@ class Nav extends BaseComponent {
365
219
366
220
toggleNavPanel ( e ) {
367
221
const target = e . target ;
222
+
368
223
target . classList . toggle ( 'pl-is-active' ) ;
224
+
225
+ // when the Nav renders as a dropdown menu, only allow one top-level menu item to be open at a time to prevent overlap issues
226
+ if ( this . layoutMode !== 'vertical' && window . innerWidth > 670 ) {
227
+ this . topLevelTriggers = document . querySelectorAll (
228
+ '.pl-c-nav__link--title.pl-is-active'
229
+ ) ;
230
+
231
+ this . topLevelTriggers . forEach ( trigger => {
232
+ if ( trigger !== target ) {
233
+ trigger . classList . remove ( 'pl-is-active' ) ;
234
+ trigger . nextSibling . classList . remove ( 'pl-is-active' ) ;
235
+ }
236
+ } ) ;
237
+ }
369
238
}
370
239
371
240
rendered ( ) {
@@ -388,32 +257,28 @@ class Nav extends BaseComponent {
388
257
return (
389
258
< ol class = "pl-c-nav__list pl-js-pattern-nav-target" >
390
259
{ patternTypes . map ( ( item , i ) => {
391
- const classes = classNames ( {
392
- [ `pl-c-nav__item pl-c-nav__item--${ item . patternTypeLC } ` ] : true ,
393
- } ) ;
394
-
395
260
const patternItems = item . patternItems ;
396
261
397
262
return (
398
- < li className = { classes } >
399
- < ButtonTitle
263
+ < NavItem className = { `pl-c-nav__item-- ${ item . patternTypeLC } ` } >
264
+ < NavTitle
400
265
aria-controls = { item . patternTypeLC }
401
266
onClick = { this . toggleNavPanel }
402
267
>
403
268
{ item . patternTypeUC }
404
- </ ButtonTitle >
269
+ </ NavTitle >
405
270
< ol
406
271
id = { item . patternSubtypeUC }
407
272
className = { `pl-c-nav__sublist pl-c-nav__sublist--dropdown pl-js-acc-panel` }
408
273
>
409
274
{ item . patternTypeItems . map ( ( patternSubtype , i ) => {
410
275
return (
411
- < SubSubList
276
+ < NavList
412
277
elem = { this . elem }
413
278
category = { patternSubtype . patternSubtypeLC }
414
279
>
415
280
{ patternSubtype . patternSubtypeItems }
416
- </ SubSubList >
281
+ </ NavList >
417
282
) ;
418
283
} ) }
419
284
@@ -423,53 +288,33 @@ class Nav extends BaseComponent {
423
288
patternItem . patternPartial . includes ( 'viewall' ) ? (
424
289
''
425
290
) : (
426
- < li class = "pl-c-nav__item" >
427
- < a
428
- href = { `patterns/${ patternItem . patternPath } ` }
429
- class = "pl-c-nav__link pl-c-nav__link--pattern"
430
- onClick = { e =>
431
- this . handleClick ( e , patternItem . patternPartial )
432
- }
433
- data-patternpartial = { patternItem . patternPartial }
434
- tabindex = "0"
435
- >
436
- { patternItem . patternName }
437
- { patternItem . patternState && (
438
- < span
439
- class = { `pl-c-pattern-state pl-c-pattern-state--${ patternItem . patternState } ` }
440
- title = { patternItem . patternState }
441
- />
442
- ) }
443
- </ a >
444
- </ li >
291
+ < NavItem >
292
+ < NavLink item = { patternItem } elem = { this } />
293
+ </ NavItem >
445
294
) ;
446
295
} ) }
447
296
</ ol >
448
- </ li >
297
+ </ NavItem >
449
298
) ;
450
299
} ) }
451
300
452
301
{ /* display the All link if window.ishControlsHide is undefined (for some reason) OR window.ishControls.ishControlsHide doesn't have `views-all` and/or `all` set to true */ }
453
302
{ ( window . ishControls === undefined ||
454
303
window . ishControls . ishControlsHide === undefined ||
455
- ( ! window . ishControls . ishControlsHide [ 'views-all' ] &&
456
- ! window . ishControls . ishControlsHide . all ) ) &&
457
- ! this . noViewAll && (
458
- < li class = "pl-c-nav__item" >
459
- < a
460
- onClick = { e => this . handleClick ( e , 'all' ) }
461
- href = "styleguide/html/styleguide.html"
462
- class = "pl-c-nav__link pl-c-nav__link--pattern"
463
- data-patternpartial = "all"
464
- tabindex = "0"
465
- >
466
- { window . config . patternTranslations &&
467
- window . config . patternTranslations . viewAllRoot
468
- ? window . config . patternTranslations . viewAllRoot
469
- : 'All' }
470
- </ a >
471
- </ li >
472
- ) }
304
+ ( window . ishControls . ishControlsHide [ 'views-all' ] !== true &&
305
+ window . ishControls . ishControlsHide . all !== true ) ) && (
306
+ < NavItem >
307
+ < a
308
+ onClick = { e => this . handleClick ( e , 'all' ) }
309
+ href = "styleguide/html/styleguide.html"
310
+ class = "pl-c-nav__link pl-c-nav__link--pattern"
311
+ data-patternpartial = "all"
312
+ tabindex = "0"
313
+ >
314
+ All
315
+ </ a >
316
+ </ NavItem >
317
+ ) }
473
318
</ ol >
474
319
) ;
475
320
}
0 commit comments