@italia/dropdown 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1015 @@
1
+ import { _ as __decorate, a as __metadata, B as BaseComponent } from '../form-control-ddGGHusp.js';
2
+ import { css, LitElement, nothing, html } from 'lit';
3
+ import { property, state, query, customElement } from 'lit/decorators.js';
4
+ import { ifDefined } from 'lit/directives/if-defined.js';
5
+ import 'lit/directive.js';
6
+
7
+ class AriaKeyboardListController {
8
+ constructor(host) {
9
+ this.host = host;
10
+ this.host.addController(this);
11
+ }
12
+ setConfig(config) {
13
+ this.config = config;
14
+ }
15
+ hostDisconnected() {
16
+ this.host.removeController(this);
17
+ }
18
+ // eslint-disable-next-line class-methods-use-this
19
+ getActiveElement() {
20
+ let active = document.activeElement;
21
+ while (active && active.shadowRoot && active.shadowRoot.activeElement) {
22
+ active = active.shadowRoot.activeElement;
23
+ }
24
+ return active;
25
+ }
26
+ handleKeyDown(event) {
27
+ if (!this.config)
28
+ return;
29
+ const items = this.config.getItems();
30
+ const currentIndex = items.indexOf(this.getActiveElement());
31
+ switch (event.key) {
32
+ case 'ArrowDown':
33
+ // case 'ArrowRight':
34
+ event.preventDefault();
35
+ if (items.length && currentIndex < items.length - 1)
36
+ this.config.setActive(currentIndex < 0 ? 0 : currentIndex + 1);
37
+ break;
38
+ case 'ArrowUp':
39
+ // case 'ArrowLeft':
40
+ event.preventDefault();
41
+ if (items.length)
42
+ this.config.setActive(currentIndex < 0 ? items.length - 1 : currentIndex - 1);
43
+ break;
44
+ case 'Home':
45
+ event.preventDefault();
46
+ if (items.length)
47
+ this.config.setActive(0);
48
+ break;
49
+ case 'End':
50
+ event.preventDefault();
51
+ if (items.length)
52
+ this.config.setActive(items.length - 1);
53
+ break;
54
+ case 'Escape':
55
+ event.preventDefault();
56
+ this.config.closeMenu();
57
+ break;
58
+ }
59
+ }
60
+ }
61
+
62
+ var styles = css`/***************************** 1 ****************************************/
63
+ /***************************** 2 ****************************************/
64
+ /***************************** 1 ****************************************/
65
+ /***************************** 2 ****************************************/
66
+ /***************************** 1 ****************************************/
67
+ /***************************** 2 ****************************************/
68
+ /***************************** 3 ****************************************/
69
+ /***************************** 1 ****************************************/
70
+ /***************************** 2 ****************************************/
71
+ /***************************** 3 ****************************************/
72
+ /***************************** NEUTRAL 1 ****************************************/
73
+ /***************************** NEUTRAL 2 ****************************************/
74
+ /***************************** NEUTRAL 2 / 3 ****************************************/
75
+ .dropdown-menu {
76
+ --bs-dropdown-zindex: 8;
77
+ --bs-dropdown-min-width: 10rem;
78
+ --bs-dropdown-padding-x: 0;
79
+ --bs-dropdown-padding-y: var(--bs-spacing-xxs);
80
+ --bs-dropdown-spacer: 0.125rem;
81
+ --bs-dropdown-font-size: var(--bs-label-font-size);
82
+ --bs-dropdown-color: var(--bs-color-text-base);
83
+ --bs-dropdown-background: var(--bs-color-background-inverse);
84
+ --bs-dropdown-border-color: transparent;
85
+ --bs-dropdown-border-radius: var(--bs-radius-smooth);
86
+ --bs-dropdown-border-width: 0;
87
+ --bs-dropdown-inner-border-radius: var(--bs-radius-smooth);
88
+ --bs-dropdown-divider-bg: var(--bs-color-border-subtle);
89
+ --bs-dropdown-divider-margin-y: var(--bs-spacing-xxs);
90
+ --bs-dropdown-box-shadow: var(--bs-elevation-medium);
91
+ --bs-dropdown-link-color: var(--bs-color-text-primary);
92
+ --bs-dropdown-link-hover-color: var(--bs-color-text-primary-hover);
93
+ --bs-dropdown-link-active-color: var(--bs-color-text-primary-active);
94
+ --bs-dropdown-item-padding-x: var(--bs-spacing-s);
95
+ --bs-dropdown-item-padding-y: var(--bs-spacing-xs);
96
+ --bs-dropdown-header-color: var(--bs-color-text-secondary);
97
+ --bs-dropdown-header-font-size: var(--bs-label-font-size);
98
+ --bs-dropdown-header-padding-x: var(--bs-spacing-s);
99
+ --bs-dropdown-header-padding-y: var(--bs-spacing-xxs);
100
+ --bs-dropdown-notch-base-size: 1.125rem;
101
+ --bs-dropdown-notch-position-x: 20px;
102
+ --bs-dropdown-notch-position-y: -8px;
103
+ --bs-dropdown-animation-speed: var(--bs-transition-instant);
104
+ --bs-dropdown-vertical-shift: 10px;
105
+ }
106
+
107
+ .dropup,
108
+ .dropend,
109
+ .dropdown,
110
+ .dropstart,
111
+ .dropup-center,
112
+ .dropdown-center {
113
+ position: relative;
114
+ }
115
+
116
+ .dropdown-toggle {
117
+ white-space: nowrap;
118
+ }
119
+ .dropdown-toggle::after {
120
+ display: inline-block;
121
+ margin-left: 0.255em;
122
+ vertical-align: 0.255em;
123
+ content: "";
124
+ border-top: 0.3em solid;
125
+ border-right: 0.3em solid transparent;
126
+ border-bottom: 0;
127
+ border-left: 0.3em solid transparent;
128
+ }
129
+ .dropdown-toggle:empty::after {
130
+ margin-left: 0;
131
+ }
132
+
133
+ .dropdown-menu {
134
+ position: absolute;
135
+ z-index: var(--bs-dropdown-zindex);
136
+ display: none;
137
+ min-width: var(--bs-dropdown-min-width);
138
+ margin: 0;
139
+ padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);
140
+ border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);
141
+ border-radius: 0 0 var(--bs-dropdown-border-radius) var(--bs-dropdown-border-radius);
142
+ background-color: var(--bs-dropdown-background);
143
+ color: var(--bs-dropdown-color);
144
+ list-style: none;
145
+ text-align: left;
146
+ background-clip: padding-box;
147
+ font-size: var(--bs-dropdown-font-size);
148
+ box-shadow: var(--bs-dropdown-box-shadow);
149
+ }
150
+ .dropdown-menu[data-bs-popper] {
151
+ top: 100%;
152
+ left: 0;
153
+ margin-top: var(--bs-dropdown-spacer);
154
+ }
155
+ .dropdown-menu.full-width {
156
+ width: 100%;
157
+ }
158
+ .dropdown-menu.full-width .link-list li {
159
+ display: inline-block;
160
+ width: auto;
161
+ }
162
+ .dropdown-menu.full-width .link-list li:hover, .dropdown-menu.full-width .link-list li:focus {
163
+ background: none;
164
+ text-decoration: underline;
165
+ }
166
+ .dropdown-menu .link-list {
167
+ margin-bottom: 0;
168
+ }
169
+ .dropdown-menu:before {
170
+ position: absolute;
171
+ top: var(--bs-dropdown-notch-position-y);
172
+ left: var(--bs-dropdown-notch-position-x);
173
+ content: "";
174
+ width: var(--bs-dropdown-notch-base-size);
175
+ height: var(--bs-dropdown-notch-base-size);
176
+ border-radius: var(--bs-dropdown-border-radius);
177
+ background-color: var(--bs-dropdown-background);
178
+ transform: rotate(45deg);
179
+ }
180
+ .dropdown-menu[data-popper-placement=top-start] {
181
+ border-radius: var(--bs-dropdown-border-radius) var(--bs-dropdown-border-radius) 0 0;
182
+ }
183
+ .dropdown-menu[data-popper-placement=top-start]:before {
184
+ top: auto;
185
+ bottom: var(--bs-dropdown-notch-position-y);
186
+ }
187
+ .dropdown-menu[data-popper-placement=bottom-end]:before {
188
+ right: calc(var(--bs-dropdown-notch-position-x) / 2);
189
+ left: auto;
190
+ }
191
+ .dropdown-menu.dark {
192
+ --bs-dropdown-text-color: hsl(0, 0%, 83%);
193
+ --bs-dropdown-background: var(--bs-color-background-primary-muted);
194
+ --bs-dropdown-link-color: hsl(0, 0%, 83%);
195
+ --bs-dropdown-divider-bg: transparent;
196
+ --bs-dropdown-link-active-color: var(--bs-color-text-inverses);
197
+ --bs-dropdown-header-color: hsl(0, 0%, 45%);
198
+ }
199
+ .dropdown-menu.dark:before {
200
+ background-color: var(--bs-dropdown-background);
201
+ }
202
+ .dropdown-menu.dark .link-list-heading {
203
+ color: var(--bs-color-text-inverse);
204
+ }
205
+ .dropdown-menu.dark .link-list span.divider {
206
+ background: #2e465e;
207
+ }
208
+ .dropdown-menu.dark .link-list a span,
209
+ .dropdown-menu.dark .link-list a:hover span {
210
+ color: var(--bs-color-text-inverse);
211
+ }
212
+ .dropdown-menu.dark .link-list a.active span {
213
+ text-decoration: underline;
214
+ }
215
+ .dropdown-menu.show {
216
+ display: block;
217
+ }
218
+ .dropdown-menu.show[data-popper-placement=bottom-start] {
219
+ animation: dropdownFadeIn forwards var(--bs-dropdown-animation-speed);
220
+ }
221
+ .dropdown-menu.show[data-popper-placement=top-start] {
222
+ animation: dropdownFadeInTop forwards var(--bs-dropdown-animation-speed);
223
+ }
224
+ .dropdown-menu.show[data-popper-placement=left-start] {
225
+ animation: dropdownFadeInTop forwards var(--bs-dropdown-animation-speed);
226
+ }
227
+ .dropdown-menu.show[data-popper-placement=left-start]:before {
228
+ top: 20px;
229
+ right: -6px;
230
+ left: auto;
231
+ }
232
+ .dropdown-menu.show[data-popper-placement=right-start] {
233
+ animation: dropdownFadeInTop forwards var(--bs-dropdown-animation-speed);
234
+ }
235
+ .dropdown-menu.show[data-popper-placement=right-start]:before {
236
+ top: 20px;
237
+ left: -6px;
238
+ }
239
+
240
+ .dropdown-menu-start {
241
+ --bs-position: start;
242
+ }
243
+ .dropdown-menu-start[data-bs-popper] {
244
+ right: auto;
245
+ left: 0;
246
+ }
247
+
248
+ .dropdown-menu-end {
249
+ --bs-position: end;
250
+ }
251
+ .dropdown-menu-end[data-bs-popper] {
252
+ right: 0;
253
+ left: auto;
254
+ }
255
+
256
+ @media (min-width: 576px) {
257
+ .dropdown-menu-sm-start {
258
+ --bs-position: start;
259
+ }
260
+ .dropdown-menu-sm-start[data-bs-popper] {
261
+ right: auto;
262
+ left: 0;
263
+ }
264
+ .dropdown-menu-sm-end {
265
+ --bs-position: end;
266
+ }
267
+ .dropdown-menu-sm-end[data-bs-popper] {
268
+ right: 0;
269
+ left: auto;
270
+ }
271
+ }
272
+ @media (min-width: 768px) {
273
+ .dropdown-menu-md-start {
274
+ --bs-position: start;
275
+ }
276
+ .dropdown-menu-md-start[data-bs-popper] {
277
+ right: auto;
278
+ left: 0;
279
+ }
280
+ .dropdown-menu-md-end {
281
+ --bs-position: end;
282
+ }
283
+ .dropdown-menu-md-end[data-bs-popper] {
284
+ right: 0;
285
+ left: auto;
286
+ }
287
+ }
288
+ @media (min-width: 992px) {
289
+ .dropdown-menu-lg-start {
290
+ --bs-position: start;
291
+ }
292
+ .dropdown-menu-lg-start[data-bs-popper] {
293
+ right: auto;
294
+ left: 0;
295
+ }
296
+ .dropdown-menu-lg-end {
297
+ --bs-position: end;
298
+ }
299
+ .dropdown-menu-lg-end[data-bs-popper] {
300
+ right: 0;
301
+ left: auto;
302
+ }
303
+ }
304
+ @media (min-width: 1200px) {
305
+ .dropdown-menu-xl-start {
306
+ --bs-position: start;
307
+ }
308
+ .dropdown-menu-xl-start[data-bs-popper] {
309
+ right: auto;
310
+ left: 0;
311
+ }
312
+ .dropdown-menu-xl-end {
313
+ --bs-position: end;
314
+ }
315
+ .dropdown-menu-xl-end[data-bs-popper] {
316
+ right: 0;
317
+ left: auto;
318
+ }
319
+ }
320
+ @media (min-width: 1400px) {
321
+ .dropdown-menu-xxl-start {
322
+ --bs-position: start;
323
+ }
324
+ .dropdown-menu-xxl-start[data-bs-popper] {
325
+ right: auto;
326
+ left: 0;
327
+ }
328
+ .dropdown-menu-xxl-end {
329
+ --bs-position: end;
330
+ }
331
+ .dropdown-menu-xxl-end[data-bs-popper] {
332
+ right: 0;
333
+ left: auto;
334
+ }
335
+ }
336
+ .dropup .dropdown-menu[data-bs-popper] {
337
+ top: auto;
338
+ bottom: 100%;
339
+ margin-top: 0;
340
+ margin-bottom: var(--bs-dropdown-spacer);
341
+ }
342
+ .dropup .dropdown-toggle::after {
343
+ display: inline-block;
344
+ margin-left: 0.255em;
345
+ vertical-align: 0.255em;
346
+ content: "";
347
+ border-top: 0;
348
+ border-right: 0.3em solid transparent;
349
+ border-bottom: 0.3em solid;
350
+ border-left: 0.3em solid transparent;
351
+ }
352
+ .dropup .dropdown-toggle:empty::after {
353
+ margin-left: 0;
354
+ }
355
+
356
+ .dropend .dropdown-menu[data-bs-popper] {
357
+ top: 0;
358
+ right: auto;
359
+ left: 100%;
360
+ margin-top: 0;
361
+ margin-left: var(--bs-dropdown-spacer);
362
+ }
363
+ .dropend .dropdown-toggle::after {
364
+ display: inline-block;
365
+ margin-left: 0.255em;
366
+ vertical-align: 0.255em;
367
+ content: "";
368
+ border-top: 0.3em solid transparent;
369
+ border-right: 0;
370
+ border-bottom: 0.3em solid transparent;
371
+ border-left: 0.3em solid;
372
+ }
373
+ .dropend .dropdown-toggle:empty::after {
374
+ margin-left: 0;
375
+ }
376
+ .dropend .dropdown-toggle::after {
377
+ vertical-align: 0;
378
+ }
379
+
380
+ .dropstart .dropdown-menu[data-bs-popper] {
381
+ top: 0;
382
+ right: 100%;
383
+ left: auto;
384
+ margin-top: 0;
385
+ margin-right: var(--bs-dropdown-spacer);
386
+ }
387
+ .dropstart .dropdown-toggle::after {
388
+ display: inline-block;
389
+ margin-left: 0.255em;
390
+ vertical-align: 0.255em;
391
+ content: "";
392
+ }
393
+ .dropstart .dropdown-toggle::after {
394
+ display: none;
395
+ }
396
+ .dropstart .dropdown-toggle::before {
397
+ display: inline-block;
398
+ margin-right: 0.255em;
399
+ vertical-align: 0.255em;
400
+ content: "";
401
+ border-top: 0.3em solid transparent;
402
+ border-right: 0.3em solid;
403
+ border-bottom: 0.3em solid transparent;
404
+ }
405
+ .dropstart .dropdown-toggle:empty::after {
406
+ margin-left: 0;
407
+ }
408
+ .dropstart .dropdown-toggle::before {
409
+ vertical-align: 0;
410
+ }
411
+
412
+ .dropdown-divider {
413
+ height: 0;
414
+ margin: var(--bs-dropdown-divider-margin-y) 0;
415
+ overflow: hidden;
416
+ border-top: 1px solid var(--bs-dropdown-divider-bg);
417
+ opacity: 1;
418
+ }
419
+
420
+ .dropdown-item.list-item {
421
+ width: auto;
422
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
423
+ border: 0;
424
+ background-color: transparent;
425
+ text-align: inherit;
426
+ text-decoration: none;
427
+ white-space: nowrap;
428
+ }
429
+ .dropdown-item.list-item:hover, .dropdown-item.list-item:focus {
430
+ text-decoration: none;
431
+ }
432
+
433
+ .dropdown-header {
434
+ display: block;
435
+ margin-bottom: 0;
436
+ padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);
437
+ color: var(--bs-dropdown-header-color);
438
+ font-size: var(--bs-dropdown-header-font-size);
439
+ white-space: nowrap;
440
+ }
441
+
442
+ .dropdown-item-text {
443
+ display: block;
444
+ padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);
445
+ color: var(--bs-dropdown-link-color);
446
+ }
447
+
448
+ @keyframes dropdownFadeIn {
449
+ 0% {
450
+ margin-top: 0;
451
+ opacity: 0;
452
+ }
453
+ 100% {
454
+ margin-top: var(--bs-dropdown-vertical-shift);
455
+ opacity: 1;
456
+ }
457
+ }
458
+ @keyframes dropdownFadeInTop {
459
+ 0% {
460
+ margin-top: 0;
461
+ opacity: 0;
462
+ }
463
+ 100% {
464
+ margin-top: -var(--bs-dropdown-vertical-shift);
465
+ opacity: 1;
466
+ }
467
+ }
468
+ .dropdown.dropup .dropdown-toggle:after,
469
+ .btn-group.dropup .dropdown-toggle:after {
470
+ display: none;
471
+ }
472
+ .dropdown.dropup .dropdown-toggle[aria-expanded=true] .icon-expand,
473
+ .btn-group.dropup .dropdown-toggle[aria-expanded=true] .icon-expand {
474
+ transform: scaleY(1);
475
+ }
476
+ .dropdown.dropup .dropdown-toggle .icon-expand,
477
+ .btn-group.dropup .dropdown-toggle .icon-expand {
478
+ transform: scaleY(-1);
479
+ }
480
+ .dropdown.dropend .dropdown-toggle:after,
481
+ .btn-group.dropend .dropdown-toggle:after {
482
+ display: none;
483
+ }
484
+ .dropdown.dropend .dropdown-toggle[aria-expanded=true] .icon-expand,
485
+ .btn-group.dropend .dropdown-toggle[aria-expanded=true] .icon-expand {
486
+ transform: rotate(90deg);
487
+ }
488
+ .dropdown.dropend .dropdown-toggle .icon-expand,
489
+ .btn-group.dropend .dropdown-toggle .icon-expand {
490
+ transform: rotate(-90deg);
491
+ }
492
+ .dropdown.dropstart .dropdown-toggle:before,
493
+ .btn-group.dropstart .dropdown-toggle:before {
494
+ display: none;
495
+ }
496
+ .dropdown.dropstart .dropdown-toggle[aria-expanded=true] .icon-expand,
497
+ .btn-group.dropstart .dropdown-toggle[aria-expanded=true] .icon-expand {
498
+ transform: rotate(-90deg);
499
+ }
500
+ .dropdown.dropstart .dropdown-toggle .icon-expand,
501
+ .btn-group.dropstart .dropdown-toggle .icon-expand {
502
+ transform: rotate(90deg);
503
+ }
504
+
505
+ .btn-dropdown {
506
+ --bs-dropdown-button-color: var(--bs-color-text-primary);
507
+ --bs-dropdown-button-padding: 10px;
508
+ --bs-dropdown-button-background: #fff;
509
+ border-radius: 0;
510
+ box-shadow: none;
511
+ color: var(--bs-dropdown-button-color);
512
+ }
513
+ @media (min-width: 992px) {
514
+ .btn-dropdown {
515
+ font-size: var(--bs-label-font-size-m);
516
+ }
517
+ }
518
+ .btn-dropdown:hover {
519
+ --bs-dropdown-button-color: var(--bs-color-text-primary-hover);
520
+ text-decoration: underline;
521
+ }
522
+ .btn-dropdown:not(:disabled):active {
523
+ box-shadow: none;
524
+ }
525
+
526
+ .btn-dropdown:after,
527
+ .dropdown-toggle:after {
528
+ content: "";
529
+ display: inline;
530
+ width: auto;
531
+ height: auto;
532
+ margin: 0;
533
+ border: none;
534
+ vertical-align: bottom;
535
+ }
536
+ .btn-dropdown .icon-expand,
537
+ .dropdown-toggle .icon-expand {
538
+ transition: transform var(--bs-dropdown-animation-speed);
539
+ }
540
+ .btn-dropdown .icon.icon-xs,
541
+ .dropdown-toggle .icon.icon-xs {
542
+ transform: translateY(-1px);
543
+ transition: transform var(--bs-dropdown-animation-speed);
544
+ }
545
+ .btn-dropdown[aria-expanded=true] .icon-expand,
546
+ .dropdown-toggle[aria-expanded=true] .icon-expand {
547
+ transform: scaleY(-1);
548
+ }
549
+
550
+ .link-list-wrapper {
551
+ --bs-linklist-divider-size: 1px;
552
+ --bs-linklist-heading-font-size: var(--bs-heading-6-font-size);
553
+ --bs-linklist-heading-color: var(--bs-color-text-secondary);
554
+ --bs-linklist-item-font-size: var(--bs-label-font-size);
555
+ --bs-linklist-item-line-height: var(--bs-label-line-height);
556
+ --bs-linklist-item-spacing: var(--bs-spacing-xxs);
557
+ --bs-linklist-nested-spacing: var(--bs-spacing-s);
558
+ }
559
+
560
+ .link-list-wrapper .link-list-heading,
561
+ .link-list-wrapper h3 {
562
+ margin-bottom: var(--bs-spacing-xxs);
563
+ color: var(--bs-linklist-heading-color);
564
+ font-size: var(--bs-linklist-heading-font-size);
565
+ font-weight: var(--bs-heading-font-weight-weak);
566
+ line-height: var(--bs-heading-line-height);
567
+ }
568
+ .link-list-wrapper h3 {
569
+ padding: 0 var(--bs-spacing-m);
570
+ }
571
+ .link-list-wrapper ul {
572
+ padding: 0;
573
+ list-style-type: none;
574
+ }
575
+ .link-list-wrapper ul.link-sublist {
576
+ padding-left: var(--bs-linklist-nested-spacing);
577
+ }
578
+ .link-list-wrapper li span,
579
+ .link-list-wrapper .list-item {
580
+ font-size: var(--bs-linklist-item-font-size);
581
+ line-height: var(--bs-linklist-item-line-height);
582
+ }
583
+ .link-list-wrapper .list-item {
584
+ position: relative;
585
+ display: inline-block;
586
+ padding-top: var(--bs-linklist-item-spacing);
587
+ padding-bottom: var(--bs-linklist-item-spacing);
588
+ text-decoration: none;
589
+ }
590
+ .link-list-wrapper .list-item.active span, .link-list-wrapper .list-item:hover:not(.disable) span {
591
+ text-decoration: underline;
592
+ }
593
+ .link-list-wrapper .list-item.active span {
594
+ color: var(--bs-color-text-primary-active);
595
+ }
596
+ .link-list-wrapper .list-item.active .icon {
597
+ color: var(--bs-color-icon-primary-active);
598
+ }
599
+ .link-list-wrapper .list-item:hover:not(.disabled) span {
600
+ color: var(--bs-color-link-hover);
601
+ }
602
+ .link-list-wrapper .list-item:hover:not(.disabled) p {
603
+ color: var(--bs-color-text-secondary);
604
+ }
605
+ .link-list-wrapper .list-item:hover:not(.disabled) .icon {
606
+ fill: var(--bs-icon-primary-hover);
607
+ }
608
+ .link-list-wrapper .list-item:hover:not(.disabled) .icon.icon-inverse {
609
+ fill: var(--bs-icon-inverse);
610
+ }
611
+ .link-list-wrapper .list-item.disabled {
612
+ cursor: not-allowed;
613
+ }
614
+ .link-list-wrapper .list-item.disabled:hover span {
615
+ text-decoration: none;
616
+ }
617
+ .link-list-wrapper .list-item.disabled span {
618
+ color: var(--bs-color-text-disabled);
619
+ }
620
+ .link-list-wrapper .list-item.disabled svg {
621
+ fill: var(--bs-icon-disabled);
622
+ }
623
+ .link-list-wrapper .list-item.disabled svg.secondary {
624
+ fill: var(--bs-icon-disabled);
625
+ }
626
+ .link-list-wrapper .list-item.medium,
627
+ .link-list-wrapper .list-item .list-item-title {
628
+ font-weight: var(--bs-font-weight-solid);
629
+ }
630
+ .link-list-wrapper .list-item.large {
631
+ --bs-linklist-item-font-size: var(--bs-label-font-size-m);
632
+ }
633
+ .link-list-wrapper .list-item.avatar {
634
+ display: flex;
635
+ margin-bottom: var(--bs-spacing-xxs);
636
+ }
637
+ .link-list-wrapper .list-item.avatar .avatar {
638
+ display: block;
639
+ margin-right: var(--bs-spacing-s);
640
+ }
641
+ .link-list-wrapper .list-item.icon-right, .link-list-wrapper .list-item.icon-left {
642
+ padding-right: 0;
643
+ padding-left: 0;
644
+ }
645
+ .link-list-wrapper .list-item.icon-left .icon {
646
+ left: 0;
647
+ flex-shrink: 0;
648
+ margin-right: var(--bs-spacing-xxs);
649
+ }
650
+ .link-list-wrapper .list-item.icon-left p {
651
+ width: 100%;
652
+ }
653
+ .link-list-wrapper .list-item.icon-right {
654
+ width: 100%;
655
+ }
656
+ .link-list-wrapper .list-item.icon-right .list-item-title-icon-wrapper {
657
+ justify-content: space-between;
658
+ }
659
+ .link-list-wrapper .list-item.right-icon .list-item-title-icon-wrapper {
660
+ justify-content: space-between;
661
+ }
662
+ .link-list-wrapper .list-item.right-icon .icon {
663
+ transition: transform 0.3s;
664
+ }
665
+ .link-list-wrapper .list-item.right-icon .icon.secondary {
666
+ color: var(--bs-icon-secondary);
667
+ }
668
+ .link-list-wrapper .list-item[data-bs-toggle] .icon {
669
+ transition: transform 0.3s;
670
+ }
671
+ .link-list-wrapper .list-item[aria-expanded=true] .icon {
672
+ transform: rotate(180deg);
673
+ }
674
+ .link-list-wrapper .list-item .icon {
675
+ display: inline-block;
676
+ flex-shrink: 0;
677
+ }
678
+ .link-list-wrapper .list-item .list-item-title-icon-wrapper {
679
+ display: flex;
680
+ align-items: center;
681
+ justify-content: space-between;
682
+ }
683
+ .link-list-wrapper .list-item .list-item-title-icon-wrapper .list-item-title {
684
+ margin-right: var(--bs-spacing-xxs);
685
+ }
686
+ .link-list-wrapper .list-item > p {
687
+ color: var(--bs-color-text-secondary);
688
+ font-size: var(--bs-caption-font-size);
689
+ line-height: var(--bs-caption-line-height);
690
+ }
691
+ .link-list-wrapper .list-item > span {
692
+ display: inline-block;
693
+ color: var(--bs-color-link);
694
+ }
695
+ .link-list-wrapper .divider {
696
+ display: block;
697
+ height: var(--bs-linklist-divider-size);
698
+ margin: var(--bs-spacing-xxs) 0;
699
+ background: var(--bs-color-border-subtle);
700
+ }
701
+ .link-list-wrapper .form-check {
702
+ padding: 0 var(--bs-spacing-m);
703
+ }
704
+
705
+ .multiline .list-item-title-icon-wrapper {
706
+ margin-bottom: var(--bs-spacing-3xs);
707
+ }
708
+ .multiline .list-item.icon-right .list-item-title-icon-wrapper {
709
+ margin-right: 0;
710
+ }
711
+ .multiline .list-item-title {
712
+ font-size: var(--bs-label-font-size);
713
+ }
714
+ @media (min-width: 992px) {
715
+ .multiline .list-item-title {
716
+ font-size: var(--bs-label-font-size-m);
717
+ }
718
+ }
719
+ .multiline .list-item {
720
+ width: 100%;
721
+ }
722
+ .multiline p {
723
+ margin-bottom: 0;
724
+ }
725
+
726
+ @media (min-width: 768px) {
727
+ .link-list-wrapper ul li a.large.icon-left,
728
+ .link-list-wrapper ul li a.large.icon-right {
729
+ --bs-linklist-item-spacing: var(--bs-spacing-s);
730
+ }
731
+ }
732
+ .dark,
733
+ .theme-dark {
734
+ --bs-linklist-heading-color: var(--bs-color-text-inverse);
735
+ }
736
+ .dark .link-list-wrapper .list-item:not(.disabled) span,
737
+ .dark .link-list-wrapper .list-item:hover span,
738
+ .theme-dark .link-list-wrapper .list-item:not(.disabled) span,
739
+ .theme-dark .link-list-wrapper .list-item:hover span {
740
+ color: var(--bs-color-text-inverse);
741
+ }
742
+ .dark .link-list-wrapper .list-item.disabled,
743
+ .dark .link-list-wrapper .list-item.disabled span,
744
+ .theme-dark .link-list-wrapper .list-item.disabled,
745
+ .theme-dark .link-list-wrapper .list-item.disabled span {
746
+ color: hsla(0, 0%, 100%, 0.35);
747
+ }
748
+
749
+ .dropdown-menu::before {
750
+ content: none;
751
+ }
752
+ .dropdown-menu.dark {
753
+ --bs-dropdown-header-color: var(--bs-color-text-inverse);
754
+ --bs-color-border-subtle: #2e465e;
755
+ }
756
+ .dropdown-menu .arrow {
757
+ z-index: -1;
758
+ width: var(--bs-dropdown-notch-base-size);
759
+ height: var(--bs-dropdown-notch-base-size);
760
+ border-radius: var(--bs-dropdown-border-radius);
761
+ background-color: var(--bs-dropdown-background);
762
+ }
763
+
764
+ .link-list {
765
+ margin-top: 0;
766
+ }
767
+
768
+ :host {
769
+ position: relative;
770
+ display: inline-block;
771
+ --bs-icon-default: currentColor;
772
+ }
773
+
774
+ it-button,
775
+ it-popover {
776
+ display: inline-flex;
777
+ }
778
+
779
+ .dropdown-toggle-icon.top {
780
+ transform: scaleY(-1);
781
+ }
782
+ .dropdown-toggle-icon.left {
783
+ transform: rotate(90deg);
784
+ }
785
+ .dropdown-toggle-icon.right {
786
+ transform: rotate(-90deg);
787
+ }`;
788
+
789
+ let ItDropdown = class ItDropdown extends BaseComponent {
790
+ constructor() {
791
+ super(...arguments);
792
+ this.disabled = false;
793
+ this.variant = 'primary';
794
+ this.alignment = 'bottom-start';
795
+ this.dark = false;
796
+ this.fullWidth = false;
797
+ this.itRole = 'menu';
798
+ this.itAriaLabel = '';
799
+ this._popoverOpen = false;
800
+ this._buttonId = this.generateId('it-dropdown');
801
+ this._menuId = this.generateId('it-dropdown-menu');
802
+ this._ariaNav = new AriaKeyboardListController(this);
803
+ this._onTriggerClick = () => {
804
+ if (this.disabled)
805
+ return;
806
+ this._popoverOpen = !this._popoverOpen;
807
+ };
808
+ this._onPopoverOpen = () => {
809
+ this._popoverOpen = true;
810
+ };
811
+ this._onPopoverClose = () => {
812
+ this._popoverOpen = false;
813
+ };
814
+ this._onKeyDown = (event) => {
815
+ const items = this._menuItems.map((item) => item.getFocusableElement()).filter((el) => !!el);
816
+ const active = this.getActiveElement();
817
+ if (!active)
818
+ return;
819
+ const currentIndex = items.indexOf(active);
820
+ if (event.key === 'Tab') {
821
+ if (event.shiftKey && currentIndex === -1) {
822
+ this._popoverOpen = false;
823
+ }
824
+ if (!event.shiftKey && currentIndex === items.length - 1) {
825
+ this._popoverOpen = false;
826
+ }
827
+ if (active.ariaDisabled) {
828
+ // as of the day of this implementation, tabbing through disabled items doesn't work natively
829
+ // maybe because of some web components behavior
830
+ if (event.shiftKey) {
831
+ this._ariaNav.handleKeyDown(new KeyboardEvent('keydown', { ...event, key: 'ArrowUp' }));
832
+ }
833
+ else {
834
+ this._ariaNav.handleKeyDown(new KeyboardEvent('keydown', { ...event, key: 'ArrowDown' }));
835
+ }
836
+ }
837
+ }
838
+ const handle = () => {
839
+ this._ariaNav.setConfig({
840
+ getItems: () => items,
841
+ setActive: (idx) => items[idx]?.focus(),
842
+ closeMenu: () => {
843
+ this.addEventListener('it-popover-close', () => {
844
+ this._triggerEl?.focus();
845
+ }, { once: true, capture: true });
846
+ this._popoverOpen = false;
847
+ },
848
+ trigger: this._triggerEl,
849
+ });
850
+ this._ariaNav.handleKeyDown(event);
851
+ };
852
+ if (['ArrowDown', 'ArrowUp'].includes(event.key)) {
853
+ if (!this._popoverOpen && currentIndex === -1) {
854
+ this.addEventListener('it-popover-open', handle, { once: true });
855
+ this._popoverOpen = true;
856
+ return;
857
+ }
858
+ }
859
+ handle();
860
+ };
861
+ }
862
+ get _triggerEl() {
863
+ return this.shadowRoot?.getElementById(this._buttonId) ?? null;
864
+ }
865
+ get _menuItems() {
866
+ if (!this._slotEl)
867
+ return [];
868
+ return this._slotEl
869
+ .assignedElements({ flatten: true })
870
+ .filter((el) => el.tagName === 'IT-DROPDOWN-ITEM');
871
+ }
872
+ _setChildrenProperties() {
873
+ for (const item of this._menuItems) {
874
+ item.dark = this.dark;
875
+ item.fullWidth = this.fullWidth;
876
+ if (this.itRole === 'menu')
877
+ item.itRole = 'menuitem';
878
+ else if (this.itRole === 'listbox')
879
+ item.itRole = 'option';
880
+ else if (this.itRole === 'tree')
881
+ item.itRole = 'treeitem';
882
+ else
883
+ item.itRole = undefined;
884
+ }
885
+ }
886
+ updated() {
887
+ this._setChildrenProperties();
888
+ }
889
+ // https://github.com/primefaces/primeng/issues/14851 for conditional aria controls
890
+ render() {
891
+ return html `
892
+ <it-popover
893
+ placement=${this.alignment}
894
+ @it-popover-open=${this._onPopoverOpen}
895
+ @it-popover-close=${this._onPopoverClose}
896
+ exportparts="focusable, icon, button"
897
+ ?open=${this._popoverOpen}
898
+ >
899
+ <it-button
900
+ id=${this._buttonId}
901
+ slot="trigger"
902
+ ?it-aria-disabled="${this.disabled}"
903
+ type="button"
904
+ variant=${ifDefined(this.variant)}
905
+ size=${ifDefined(this.size)}
906
+ @click=${this._onTriggerClick}
907
+ @keydown=${{ handleEvent: this._onKeyDown, capture: true }}
908
+ class="dropdown-toggle"
909
+ it-aria-label=${ifDefined(this.itAriaLabel ? this.itAriaLabel : undefined)}
910
+ exportparts="focusable, button"
911
+ it-aria-haspopup="${this.itRole === 'list' ? 'true' : this.itRole}"
912
+ it-aria-controls=${this._popoverOpen ? this._menuId : nothing}
913
+ >
914
+ ${this.alignment.startsWith('left')
915
+ ? html `<it-icon
916
+ name=${this._popoverOpen ? 'it-collapse' : 'it-expand'}
917
+ class="dropdown-toggle-icon left"
918
+ size="sm"
919
+ exportparts="icon"
920
+ ></it-icon>`
921
+ : ''}
922
+ ${this.label}
923
+ ${!this.alignment.startsWith('left')
924
+ ? html `<it-icon
925
+ name=${this._popoverOpen ? 'it-collapse' : 'it-expand'}
926
+ class=${this.composeClass('dropdown-toggle-icon', {
927
+ right: this.alignment.startsWith('right'),
928
+ top: this.alignment.startsWith('top'),
929
+ })}
930
+ exportparts="icon"
931
+ size="sm"
932
+ ></it-icon>`
933
+ : ''}
934
+ </it-button>
935
+ <div
936
+ slot="content"
937
+ class="${this.composeClass('dropdown-menu', {
938
+ show: this._popoverOpen,
939
+ dark: this.dark,
940
+ 'full-width': this.fullWidth,
941
+ })}"
942
+ aria-labelledby=${this._buttonId}
943
+ >
944
+ <div class="link-list-wrapper">
945
+ <slot name="header"></slot>
946
+ <ul
947
+ id=${this._menuId}
948
+ class="link-list"
949
+ role=${ifDefined(this.itRole !== 'list' ? this.itRole : undefined)}
950
+ @keydown=${{ handleEvent: this._onKeyDown, capture: true }}
951
+ aria-orientation=${ifDefined(this.fullWidth ? 'horizontal' : undefined)}
952
+ >
953
+ <slot @slotchange=${this._setChildrenProperties}></slot>
954
+ </ul>
955
+ </div>
956
+ </div>
957
+ </it-popover>
958
+ `;
959
+ }
960
+ };
961
+ ItDropdown.styles = styles;
962
+ ItDropdown.shadowRootOptions = {
963
+ ...LitElement.shadowRootOptions,
964
+ delegatesFocus: true,
965
+ };
966
+ __decorate([
967
+ property({ type: String }),
968
+ __metadata("design:type", String)
969
+ ], ItDropdown.prototype, "label", void 0);
970
+ __decorate([
971
+ property({ type: Boolean, reflect: true }),
972
+ __metadata("design:type", Object)
973
+ ], ItDropdown.prototype, "disabled", void 0);
974
+ __decorate([
975
+ property({ type: String }),
976
+ __metadata("design:type", String)
977
+ ], ItDropdown.prototype, "size", void 0);
978
+ __decorate([
979
+ property({ type: String }),
980
+ __metadata("design:type", String)
981
+ ], ItDropdown.prototype, "variant", void 0);
982
+ __decorate([
983
+ property({ type: String }),
984
+ __metadata("design:type", String)
985
+ ], ItDropdown.prototype, "alignment", void 0);
986
+ __decorate([
987
+ property({ type: Boolean }),
988
+ __metadata("design:type", Object)
989
+ ], ItDropdown.prototype, "dark", void 0);
990
+ __decorate([
991
+ property({ type: Boolean, attribute: 'full-width', reflect: true }),
992
+ __metadata("design:type", Object)
993
+ ], ItDropdown.prototype, "fullWidth", void 0);
994
+ __decorate([
995
+ property({ type: String, attribute: 'it-role' }),
996
+ __metadata("design:type", String)
997
+ ], ItDropdown.prototype, "itRole", void 0);
998
+ __decorate([
999
+ property({ type: String, attribute: 'it-aria-label' }),
1000
+ __metadata("design:type", String)
1001
+ ], ItDropdown.prototype, "itAriaLabel", void 0);
1002
+ __decorate([
1003
+ state(),
1004
+ __metadata("design:type", Object)
1005
+ ], ItDropdown.prototype, "_popoverOpen", void 0);
1006
+ __decorate([
1007
+ query('slot:not([name])'),
1008
+ __metadata("design:type", HTMLSlotElement)
1009
+ ], ItDropdown.prototype, "_slotEl", void 0);
1010
+ ItDropdown = __decorate([
1011
+ customElement('it-dropdown')
1012
+ ], ItDropdown);
1013
+
1014
+ export { ItDropdown };
1015
+ //# sourceMappingURL=it-dropdown.js.map