@angular/aria 22.0.0-next.7 → 22.0.0-next.8

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.
Files changed (93) hide show
  1. package/fesm2022/_accordion-chunk.mjs +1 -1
  2. package/fesm2022/_click-event-manager-chunk.mjs +1 -1
  3. package/fesm2022/{_signal-like-chunk.mjs → _collection-chunk.mjs} +51 -2
  4. package/fesm2022/_collection-chunk.mjs.map +1 -0
  5. package/fesm2022/_deferred-content-chunk.mjs +6 -6
  6. package/fesm2022/_list-chunk.mjs +4 -1
  7. package/fesm2022/_list-chunk.mjs.map +1 -1
  8. package/fesm2022/_list-navigation-chunk.mjs +1 -1
  9. package/fesm2022/_list-typeahead-chunk.mjs +1 -1
  10. package/fesm2022/_menu-chunk.mjs +1 -1
  11. package/fesm2022/{_combobox-listbox-chunk.mjs → _option-chunk.mjs} +3 -50
  12. package/fesm2022/_option-chunk.mjs.map +1 -0
  13. package/fesm2022/_tabs-chunk.mjs +1 -1
  14. package/fesm2022/_toolbar-widget-group-chunk.mjs +1 -1
  15. package/fesm2022/_transforms-chunk.mjs +8 -0
  16. package/fesm2022/_transforms-chunk.mjs.map +1 -0
  17. package/fesm2022/{_combobox-tree-chunk.mjs → _tree-chunk.mjs} +3 -48
  18. package/fesm2022/_tree-chunk.mjs.map +1 -0
  19. package/fesm2022/_widget-chunk.mjs +36 -15
  20. package/fesm2022/_widget-chunk.mjs.map +1 -1
  21. package/fesm2022/accordion.mjs +28 -55
  22. package/fesm2022/accordion.mjs.map +1 -1
  23. package/fesm2022/aria.mjs +1 -1
  24. package/fesm2022/aria.mjs.map +1 -1
  25. package/fesm2022/combobox-testing.mjs +79 -0
  26. package/fesm2022/combobox-testing.mjs.map +1 -0
  27. package/fesm2022/combobox.mjs +273 -307
  28. package/fesm2022/combobox.mjs.map +1 -1
  29. package/fesm2022/grid-testing.mjs +8 -0
  30. package/fesm2022/grid-testing.mjs.map +1 -1
  31. package/fesm2022/grid.mjs +68 -87
  32. package/fesm2022/grid.mjs.map +1 -1
  33. package/fesm2022/listbox-testing.mjs +4 -0
  34. package/fesm2022/listbox-testing.mjs.map +1 -1
  35. package/fesm2022/listbox.mjs +184 -205
  36. package/fesm2022/listbox.mjs.map +1 -1
  37. package/fesm2022/menu-testing.mjs +11 -0
  38. package/fesm2022/menu-testing.mjs.map +1 -1
  39. package/fesm2022/menu.mjs +42 -66
  40. package/fesm2022/menu.mjs.map +1 -1
  41. package/fesm2022/private.mjs +19 -13
  42. package/fesm2022/private.mjs.map +1 -1
  43. package/fesm2022/tabs.mjs +78 -84
  44. package/fesm2022/tabs.mjs.map +1 -1
  45. package/fesm2022/toolbar-testing.mjs +5 -1
  46. package/fesm2022/toolbar-testing.mjs.map +1 -1
  47. package/fesm2022/toolbar.mjs +21 -31
  48. package/fesm2022/toolbar.mjs.map +1 -1
  49. package/fesm2022/tree-testing.mjs +12 -0
  50. package/fesm2022/tree-testing.mjs.map +1 -1
  51. package/fesm2022/tree.mjs +118 -146
  52. package/fesm2022/tree.mjs.map +1 -1
  53. package/package.json +6 -6
  54. package/types/_accordion-chunk.d.ts +2 -2
  55. package/types/_collection-chunk.d.ts +42 -0
  56. package/types/_expansion-chunk.d.ts +1 -1
  57. package/types/_grid-chunk.d.ts +9 -3
  58. package/types/_keyboard-event-manager-chunk.d.ts +1 -1
  59. package/types/_list-chunk.d.ts +1 -1
  60. package/types/_list-navigation-chunk.d.ts +1 -1
  61. package/types/_listbox-chunk.d.ts +1 -1
  62. package/types/_menu-chunk.d.ts +1 -1
  63. package/types/_tabs-chunk.d.ts +1 -1
  64. package/types/_toolbar-chunk.d.ts +1 -1
  65. package/types/_tree-chunk.d.ts +1 -1
  66. package/types/accordion.d.ts +7 -13
  67. package/types/combobox-testing.d.ts +63 -0
  68. package/types/combobox.d.ts +96 -193
  69. package/types/grid-testing.d.ts +4 -0
  70. package/types/grid.d.ts +101 -97
  71. package/types/listbox-testing.d.ts +25 -0
  72. package/types/listbox.d.ts +55 -60
  73. package/types/menu-testing.d.ts +6 -0
  74. package/types/menu.d.ts +17 -13
  75. package/types/private.d.ts +24 -138
  76. package/types/tabs.d.ts +69 -72
  77. package/types/toolbar-testing.d.ts +4 -0
  78. package/types/toolbar.d.ts +5 -6
  79. package/types/tree-testing.d.ts +8 -0
  80. package/types/tree.d.ts +7 -14
  81. package/fesm2022/_combobox-chunk.mjs +0 -478
  82. package/fesm2022/_combobox-chunk.mjs.map +0 -1
  83. package/fesm2022/_combobox-listbox-chunk.mjs.map +0 -1
  84. package/fesm2022/_combobox-tree-chunk.mjs.map +0 -1
  85. package/fesm2022/_element-chunk.mjs +0 -6
  86. package/fesm2022/_element-chunk.mjs.map +0 -1
  87. package/fesm2022/_signal-like-chunk.mjs.map +0 -1
  88. package/fesm2022/simple-combobox.mjs +0 -443
  89. package/fesm2022/simple-combobox.mjs.map +0 -1
  90. package/types/_combobox-chunk.d.ts +0 -224
  91. package/types/_element-chunk.d.ts +0 -10
  92. package/types/_signal-like-chunk.d.ts +0 -14
  93. package/types/simple-combobox.d.ts +0 -124
@@ -1,191 +1,26 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, ElementRef, computed, input, booleanAttribute, Directive, contentChildren, numberAttribute, model, signal, afterRenderEffect, untracked } from '@angular/core';
2
+ import { InjectionToken, input, inject, ElementRef, booleanAttribute, model, computed, signal, afterNextRender, afterRenderEffect, untracked, Directive } from '@angular/core';
3
3
  import { Directionality } from '@angular/cdk/bidi';
4
4
  import { _IdGenerator } from '@angular/cdk/a11y';
5
- import { OptionPattern, ComboboxListboxPattern, ListboxPattern } from './_combobox-listbox-chunk.mjs';
6
- import { ComboboxPopup } from './combobox.mjs';
7
- export { Combobox as ɵɵCombobox, ComboboxDialog as ɵɵComboboxDialog, ComboboxInput as ɵɵComboboxInput, ComboboxPopupContainer as ɵɵComboboxPopupContainer } from './combobox.mjs';
8
- import './_signal-like-chunk.mjs';
9
- import '@angular/core/primitives/signals';
5
+ import { ListboxPattern, OptionPattern } from './_option-chunk.mjs';
6
+ import { SortedCollection } from './_collection-chunk.mjs';
7
+ import { tabIndexTransform } from './_transforms-chunk.mjs';
10
8
  import './_list-chunk.mjs';
11
9
  import './_list-navigation-chunk.mjs';
12
10
  import './_list-typeahead-chunk.mjs';
13
11
  import './_click-event-manager-chunk.mjs';
14
- import './_deferred-content-chunk.mjs';
15
- import './_combobox-chunk.mjs';
12
+ import '@angular/core/primitives/signals';
16
13
 
17
14
  const LISTBOX = new InjectionToken('LISTBOX');
18
15
 
19
- class Option {
20
- element = inject(ElementRef).nativeElement;
21
- active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
22
- debugName: "active"
23
- }] : []));
24
- _listbox = inject(LISTBOX);
25
- id = input(inject(_IdGenerator).getId('ng-option-', true), ...(ngDevMode ? [{
26
- debugName: "id"
27
- }] : []));
28
- _listboxPattern = computed(() => this._listbox._pattern, ...(ngDevMode ? [{
29
- debugName: "_listboxPattern"
30
- }] : []));
31
- value = input.required(...(ngDevMode ? [{
32
- debugName: "value"
33
- }] : []));
34
- disabled = input(false, {
35
- ...(ngDevMode ? {
36
- debugName: "disabled"
37
- } : {}),
38
- transform: booleanAttribute
39
- });
40
- label = input(...(ngDevMode ? [undefined, {
41
- debugName: "label"
42
- }] : []));
43
- selected = computed(() => this._pattern.selected(), ...(ngDevMode ? [{
44
- debugName: "selected"
45
- }] : []));
46
- _pattern = new OptionPattern({
47
- ...this,
48
- id: this.id,
49
- value: this.value,
50
- listbox: this._listboxPattern,
51
- element: () => this.element,
52
- searchTerm: () => this.label() ?? ''
53
- });
54
- static ɵfac = i0.ɵɵngDeclareFactory({
55
- minVersion: "12.0.0",
56
- version: "22.0.0-next.9",
57
- ngImport: i0,
58
- type: Option,
59
- deps: [],
60
- target: i0.ɵɵFactoryTarget.Directive
61
- });
62
- static ɵdir = i0.ɵɵngDeclareDirective({
63
- minVersion: "17.1.0",
64
- version: "22.0.0-next.9",
65
- type: Option,
66
- isStandalone: true,
67
- selector: "[ngOption]",
68
- inputs: {
69
- id: {
70
- classPropertyName: "id",
71
- publicName: "id",
72
- isSignal: true,
73
- isRequired: false,
74
- transformFunction: null
75
- },
76
- value: {
77
- classPropertyName: "value",
78
- publicName: "value",
79
- isSignal: true,
80
- isRequired: true,
81
- transformFunction: null
82
- },
83
- disabled: {
84
- classPropertyName: "disabled",
85
- publicName: "disabled",
86
- isSignal: true,
87
- isRequired: false,
88
- transformFunction: null
89
- },
90
- label: {
91
- classPropertyName: "label",
92
- publicName: "label",
93
- isSignal: true,
94
- isRequired: false,
95
- transformFunction: null
96
- }
97
- },
98
- host: {
99
- attributes: {
100
- "role": "option"
101
- },
102
- properties: {
103
- "attr.data-active": "active()",
104
- "attr.id": "_pattern.id()",
105
- "attr.tabindex": "_pattern.tabIndex()",
106
- "attr.aria-selected": "_pattern.selected()",
107
- "attr.aria-disabled": "_pattern.disabled()"
108
- }
109
- },
110
- exportAs: ["ngOption"],
111
- ngImport: i0
112
- });
113
- }
114
- i0.ɵɵngDeclareClassMetadata({
115
- minVersion: "12.0.0",
116
- version: "22.0.0-next.9",
117
- ngImport: i0,
118
- type: Option,
119
- decorators: [{
120
- type: Directive,
121
- args: [{
122
- selector: '[ngOption]',
123
- exportAs: 'ngOption',
124
- host: {
125
- 'role': 'option',
126
- '[attr.data-active]': 'active()',
127
- '[attr.id]': '_pattern.id()',
128
- '[attr.tabindex]': '_pattern.tabIndex()',
129
- '[attr.aria-selected]': '_pattern.selected()',
130
- '[attr.aria-disabled]': '_pattern.disabled()'
131
- }
132
- }]
133
- }],
134
- propDecorators: {
135
- id: [{
136
- type: i0.Input,
137
- args: [{
138
- isSignal: true,
139
- alias: "id",
140
- required: false
141
- }]
142
- }],
143
- value: [{
144
- type: i0.Input,
145
- args: [{
146
- isSignal: true,
147
- alias: "value",
148
- required: true
149
- }]
150
- }],
151
- disabled: [{
152
- type: i0.Input,
153
- args: [{
154
- isSignal: true,
155
- alias: "disabled",
156
- required: false
157
- }]
158
- }],
159
- label: [{
160
- type: i0.Input,
161
- args: [{
162
- isSignal: true,
163
- alias: "label",
164
- required: false
165
- }]
166
- }]
167
- }
168
- });
169
-
170
16
  class Listbox {
171
17
  id = input(inject(_IdGenerator).getId('ng-listbox-', true), ...(ngDevMode ? [{
172
18
  debugName: "id"
173
19
  }] : []));
174
- _popup = inject(ComboboxPopup, {
175
- optional: true
176
- });
177
20
  _elementRef = inject(ElementRef);
178
21
  element = this._elementRef.nativeElement;
179
- _options = contentChildren(Option, {
180
- ...(ngDevMode ? {
181
- debugName: "_options"
182
- } : {}),
183
- descendants: true
184
- });
22
+ _collection = new SortedCollection();
185
23
  textDirection = inject(Directionality).valueSignal.asReadonly();
186
- items = computed(() => this._options().map(option => option._pattern), ...(ngDevMode ? [{
187
- debugName: "items"
188
- }] : []));
189
24
  orientation = input('vertical', ...(ngDevMode ? [{
190
25
  debugName: "orientation"
191
26
  }] : []));
@@ -232,7 +67,8 @@ class Listbox {
232
67
  ...(ngDevMode ? {
233
68
  debugName: "tabIndex"
234
69
  } : {}),
235
- transform: v => v === undefined ? undefined : numberAttribute(v)
70
+ alias: 'tabindex',
71
+ transform: tabIndexTransform
236
72
  });
237
73
  value = model([], ...(ngDevMode ? [{
238
74
  debugName: "value"
@@ -240,22 +76,24 @@ class Listbox {
240
76
  _pattern;
241
77
  activeDescendant;
242
78
  constructor() {
79
+ const orderedItemPatterns = computed(() => this._collection.orderedItems().map(option => option._pattern), ...(ngDevMode ? [{
80
+ debugName: "orderedItemPatterns"
81
+ }] : []));
243
82
  const inputs = {
244
83
  ...this,
245
84
  id: this.id,
246
- items: this.items,
85
+ items: orderedItemPatterns,
247
86
  activeItem: signal(undefined),
248
87
  textDirection: this.textDirection,
249
- element: () => this._elementRef.nativeElement,
250
- combobox: () => this._popup?.combobox?._pattern
88
+ element: () => this._elementRef.nativeElement
251
89
  };
252
- this._pattern = this._popup?.combobox ? new ComboboxListboxPattern(inputs) : new ListboxPattern(inputs);
90
+ this._pattern = new ListboxPattern(inputs);
253
91
  this.activeDescendant = computed(() => this._pattern.activeDescendant(), ...(ngDevMode ? [{
254
92
  debugName: "activeDescendant"
255
93
  }] : []));
256
- if (this._popup) {
257
- this._popup._controls.set(this._pattern);
258
- }
94
+ afterNextRender(() => {
95
+ this._collection.startObserving(this.element);
96
+ });
259
97
  afterRenderEffect({
260
98
  read: () => {
261
99
  if (typeof ngDevMode === 'undefined' || ngDevMode) {
@@ -288,6 +126,9 @@ class Listbox {
288
126
  }
289
127
  });
290
128
  }
129
+ ngOnDestroy() {
130
+ this._collection.stopObserving();
131
+ }
291
132
  scrollActiveItemIntoView(options = {
292
133
  block: 'nearest'
293
134
  }) {
@@ -298,15 +139,15 @@ class Listbox {
298
139
  }
299
140
  static ɵfac = i0.ɵɵngDeclareFactory({
300
141
  minVersion: "12.0.0",
301
- version: "22.0.0-next.9",
142
+ version: "22.0.0-next.10",
302
143
  ngImport: i0,
303
144
  type: Listbox,
304
145
  deps: [],
305
146
  target: i0.ɵɵFactoryTarget.Directive
306
147
  });
307
148
  static ɵdir = i0.ɵɵngDeclareDirective({
308
- minVersion: "17.2.0",
309
- version: "22.0.0-next.9",
149
+ minVersion: "17.1.0",
150
+ version: "22.0.0-next.10",
310
151
  type: Listbox,
311
152
  isStandalone: true,
312
153
  selector: "[ngListbox]",
@@ -383,7 +224,7 @@ class Listbox {
383
224
  },
384
225
  tabIndex: {
385
226
  classPropertyName: "tabIndex",
386
- publicName: "tabIndex",
227
+ publicName: "tabindex",
387
228
  isSignal: true,
388
229
  isRequired: false,
389
230
  transformFunction: null
@@ -422,22 +263,13 @@ class Listbox {
422
263
  provide: LISTBOX,
423
264
  useExisting: Listbox
424
265
  }],
425
- queries: [{
426
- propertyName: "_options",
427
- predicate: Option,
428
- descendants: true,
429
- isSignal: true
430
- }],
431
266
  exportAs: ["ngListbox"],
432
- hostDirectives: [{
433
- directive: ComboboxPopup
434
- }],
435
267
  ngImport: i0
436
268
  });
437
269
  }
438
270
  i0.ɵɵngDeclareClassMetadata({
439
271
  minVersion: "12.0.0",
440
- version: "22.0.0-next.9",
272
+ version: "22.0.0-next.10",
441
273
  ngImport: i0,
442
274
  type: Listbox,
443
275
  decorators: [{
@@ -458,7 +290,6 @@ i0.ɵɵngDeclareClassMetadata({
458
290
  '(click)': '_pattern.onClick($event)',
459
291
  '(focusin)': '_pattern.onFocusIn()'
460
292
  },
461
- hostDirectives: [ComboboxPopup],
462
293
  providers: [{
463
294
  provide: LISTBOX,
464
295
  useExisting: Listbox
@@ -475,15 +306,6 @@ i0.ɵɵngDeclareClassMetadata({
475
306
  required: false
476
307
  }]
477
308
  }],
478
- _options: [{
479
- type: i0.ContentChildren,
480
- args: [i0.forwardRef(() => Option), {
481
- ...{
482
- descendants: true
483
- },
484
- isSignal: true
485
- }]
486
- }],
487
309
  orientation: [{
488
310
  type: i0.Input,
489
311
  args: [{
@@ -560,7 +382,7 @@ i0.ɵɵngDeclareClassMetadata({
560
382
  type: i0.Input,
561
383
  args: [{
562
384
  isSignal: true,
563
- alias: "tabIndex",
385
+ alias: "tabindex",
564
386
  required: false
565
387
  }]
566
388
  }],
@@ -578,5 +400,162 @@ i0.ɵɵngDeclareClassMetadata({
578
400
  }
579
401
  });
580
402
 
581
- export { Listbox, Option, ComboboxPopup as ɵɵComboboxPopup };
403
+ class Option {
404
+ element = inject(ElementRef).nativeElement;
405
+ active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
406
+ debugName: "active"
407
+ }] : []));
408
+ _listbox = inject(LISTBOX);
409
+ id = input(inject(_IdGenerator).getId('ng-option-', true), ...(ngDevMode ? [{
410
+ debugName: "id"
411
+ }] : []));
412
+ _listboxPattern = computed(() => this._listbox._pattern, ...(ngDevMode ? [{
413
+ debugName: "_listboxPattern"
414
+ }] : []));
415
+ value = input.required(...(ngDevMode ? [{
416
+ debugName: "value"
417
+ }] : []));
418
+ disabled = input(false, {
419
+ ...(ngDevMode ? {
420
+ debugName: "disabled"
421
+ } : {}),
422
+ transform: booleanAttribute
423
+ });
424
+ label = input(...(ngDevMode ? [undefined, {
425
+ debugName: "label"
426
+ }] : []));
427
+ selected = computed(() => this._pattern.selected(), ...(ngDevMode ? [{
428
+ debugName: "selected"
429
+ }] : []));
430
+ _pattern = new OptionPattern({
431
+ ...this,
432
+ id: this.id,
433
+ value: this.value,
434
+ listbox: this._listboxPattern,
435
+ element: () => this.element,
436
+ searchTerm: () => this.label() ?? ''
437
+ });
438
+ ngOnInit() {
439
+ this._listbox._collection.register(this);
440
+ }
441
+ ngOnDestroy() {
442
+ this._listbox._collection.unregister(this);
443
+ }
444
+ static ɵfac = i0.ɵɵngDeclareFactory({
445
+ minVersion: "12.0.0",
446
+ version: "22.0.0-next.10",
447
+ ngImport: i0,
448
+ type: Option,
449
+ deps: [],
450
+ target: i0.ɵɵFactoryTarget.Directive
451
+ });
452
+ static ɵdir = i0.ɵɵngDeclareDirective({
453
+ minVersion: "17.1.0",
454
+ version: "22.0.0-next.10",
455
+ type: Option,
456
+ isStandalone: true,
457
+ selector: "[ngOption]",
458
+ inputs: {
459
+ id: {
460
+ classPropertyName: "id",
461
+ publicName: "id",
462
+ isSignal: true,
463
+ isRequired: false,
464
+ transformFunction: null
465
+ },
466
+ value: {
467
+ classPropertyName: "value",
468
+ publicName: "value",
469
+ isSignal: true,
470
+ isRequired: true,
471
+ transformFunction: null
472
+ },
473
+ disabled: {
474
+ classPropertyName: "disabled",
475
+ publicName: "disabled",
476
+ isSignal: true,
477
+ isRequired: false,
478
+ transformFunction: null
479
+ },
480
+ label: {
481
+ classPropertyName: "label",
482
+ publicName: "label",
483
+ isSignal: true,
484
+ isRequired: false,
485
+ transformFunction: null
486
+ }
487
+ },
488
+ host: {
489
+ attributes: {
490
+ "role": "option"
491
+ },
492
+ properties: {
493
+ "attr.data-active": "active()",
494
+ "attr.id": "_pattern.id()",
495
+ "attr.tabindex": "_pattern.tabIndex()",
496
+ "attr.aria-selected": "_pattern.selected()",
497
+ "attr.aria-disabled": "_pattern.disabled()"
498
+ }
499
+ },
500
+ exportAs: ["ngOption"],
501
+ ngImport: i0
502
+ });
503
+ }
504
+ i0.ɵɵngDeclareClassMetadata({
505
+ minVersion: "12.0.0",
506
+ version: "22.0.0-next.10",
507
+ ngImport: i0,
508
+ type: Option,
509
+ decorators: [{
510
+ type: Directive,
511
+ args: [{
512
+ selector: '[ngOption]',
513
+ exportAs: 'ngOption',
514
+ host: {
515
+ 'role': 'option',
516
+ '[attr.data-active]': 'active()',
517
+ '[attr.id]': '_pattern.id()',
518
+ '[attr.tabindex]': '_pattern.tabIndex()',
519
+ '[attr.aria-selected]': '_pattern.selected()',
520
+ '[attr.aria-disabled]': '_pattern.disabled()'
521
+ }
522
+ }]
523
+ }],
524
+ propDecorators: {
525
+ id: [{
526
+ type: i0.Input,
527
+ args: [{
528
+ isSignal: true,
529
+ alias: "id",
530
+ required: false
531
+ }]
532
+ }],
533
+ value: [{
534
+ type: i0.Input,
535
+ args: [{
536
+ isSignal: true,
537
+ alias: "value",
538
+ required: true
539
+ }]
540
+ }],
541
+ disabled: [{
542
+ type: i0.Input,
543
+ args: [{
544
+ isSignal: true,
545
+ alias: "disabled",
546
+ required: false
547
+ }]
548
+ }],
549
+ label: [{
550
+ type: i0.Input,
551
+ args: [{
552
+ isSignal: true,
553
+ alias: "label",
554
+ required: false
555
+ }]
556
+ }]
557
+ }
558
+ });
559
+
560
+ export { Listbox, Option };
582
561
  //# sourceMappingURL=listbox.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"listbox.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/listbox/tokens.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/listbox/option.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/listbox/listbox.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\nimport type {Listbox} from './listbox';\n\nexport const LISTBOX = new InjectionToken<Listbox<any>>('LISTBOX');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {booleanAttribute, computed, Directive, ElementRef, inject, input} from '@angular/core';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {OptionPattern} from '../private';\nimport {LISTBOX} from './tokens';\n\n/**\n * A selectable option in an `ngListbox`.\n *\n * This directive should be applied to an element (e.g., `<li>`, `<div>`) within an\n * `ngListbox`. The `value` input is used to identify the option, and the `label` input provides\n * the accessible name for the option.\n *\n * ```html\n * <li ngOption value=\"item-id\" label=\"Item Name\">\n * Item Name\n * </li>\n * ```\n *\n * @developerPreview 21.0\n *\n * @see [Listbox](guide/aria/listbox)\n * @see [Autocomplete](guide/aria/autocomplete)\n * @see [Select](guide/aria/select)\n * @see [Multiselect](guide/aria/multiselect)\n */\n@Directive({\n selector: '[ngOption]',\n exportAs: 'ngOption',\n host: {\n 'role': 'option',\n '[attr.data-active]': 'active()',\n '[attr.id]': '_pattern.id()',\n '[attr.tabindex]': '_pattern.tabIndex()',\n '[attr.aria-selected]': '_pattern.selected()',\n '[attr.aria-disabled]': '_pattern.disabled()',\n },\n})\nexport class Option<V> {\n /** A reference to the host element. */\n readonly element = inject(ElementRef).nativeElement as HTMLElement;\n\n /** Whether the option is currently active (focused). */\n readonly active = computed(() => this._pattern.active());\n\n /** The parent Listbox. */\n private readonly _listbox = inject(LISTBOX);\n\n /** A unique identifier for the option. */\n readonly id = input(inject(_IdGenerator).getId('ng-option-', true));\n\n /** The parent Listbox UIPattern. */\n private readonly _listboxPattern = computed(() => this._listbox._pattern);\n\n /** The value of the option. */\n readonly value = input.required<V>();\n\n /** Whether an item is disabled. */\n readonly disabled = input(false, {transform: booleanAttribute});\n\n /** The text used by the typeahead search. */\n readonly label = input<string>();\n\n /** Whether the option is selected. */\n readonly selected = computed(() => this._pattern.selected());\n\n /** The Option UIPattern. */\n readonly _pattern = new OptionPattern<V>({\n ...this,\n id: this.id,\n value: this.value,\n listbox: this._listboxPattern,\n element: () => this.element,\n searchTerm: () => this.label() ?? '',\n });\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChildren,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n numberAttribute,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {ComboboxListboxPattern, ListboxPattern, OptionPattern} from '../private';\nimport {ComboboxPopup} from '../combobox';\nimport {Option} from './option';\nimport {LISTBOX} from './tokens';\n\n/**\n * Represents a container used to display a list of items for a user to select from.\n *\n * The `ngListbox` is meant to be used in conjunction with `ngOption` directives to create a\n * selectable list. It supports single and multiple selection modes, as well as various focus and\n * orientation strategies.\n *\n * ```html\n * <ul ngListbox [(value)]=\"selectedItems\" [multi]=\"true\" orientation=\"vertical\">\n * @for (item of items; track item.id) {\n * <li ngOption [value]=\"item.id\" [label]=\"item.name\" [disabled]=\"item.disabled\">\n * {{item.name}}\n * </li>\n * }\n * </ul>\n * ```\n *\n * @developerPreview 21.0\n *\n * @see [Listbox](guide/aria/listbox)\n * @see [Autocomplete](guide/aria/autocomplete)\n * @see [Select](guide/aria/select)\n * @see [Multiselect](guide/aria/multiselect)\n */\n@Directive({\n selector: '[ngListbox]',\n exportAs: 'ngListbox',\n host: {\n 'role': 'listbox',\n '[attr.id]': 'id()',\n '[attr.tabindex]': 'tabIndex() !== undefined ? tabIndex() : _pattern.tabIndex()',\n '[attr.aria-readonly]': '_pattern.readonly()',\n '[attr.aria-disabled]': '_pattern.disabled()',\n '[attr.aria-orientation]': '_pattern.orientation()',\n '[attr.aria-multiselectable]': '_pattern.multi()',\n '[attr.aria-activedescendant]': '_pattern.activeDescendant()',\n '(keydown)': '_pattern.onKeydown($event)',\n '(click)': '_pattern.onClick($event)',\n '(focusin)': '_pattern.onFocusIn()',\n },\n hostDirectives: [ComboboxPopup],\n providers: [{provide: LISTBOX, useExisting: Listbox}],\n})\nexport class Listbox<V> {\n /** A unique identifier for the listbox. */\n readonly id = input(inject(_IdGenerator).getId('ng-listbox-', true));\n\n /** A reference to the parent combobox popup, if one exists. */\n private readonly _popup = inject<ComboboxPopup<V>>(ComboboxPopup, {\n optional: true,\n });\n\n /** A reference to the host element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** A reference to the host element. */\n readonly element = this._elementRef.nativeElement as HTMLElement;\n\n /** The Options nested inside of the Listbox. */\n private readonly _options = contentChildren(Option, {descendants: true});\n\n /** A signal wrapper for directionality. */\n protected readonly textDirection = inject(Directionality).valueSignal.asReadonly();\n\n /** The Option UIPatterns of the child Options. */\n protected readonly items = computed<OptionPattern<V>[]>(() =>\n this._options().map((option: Option<V>) => option._pattern),\n );\n\n /** Whether the list is vertically or horizontally oriented. */\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n\n /** Whether multiple items in the list can be selected at once. */\n readonly multi = input(false, {transform: booleanAttribute});\n\n /** Whether focus should wrap when navigating. */\n readonly wrap = input(true, {transform: booleanAttribute});\n\n /**\n * Whether to allow disabled items to receive focus. When `true`, disabled items are\n * focusable but not interactive. When `false`, disabled items are skipped during navigation.\n */\n readonly softDisabled = input(true, {transform: booleanAttribute});\n\n /**\n * The focus strategy used by the list.\n * - `roving`: Focus is moved to the active item using `tabindex`.\n * - `activedescendant`: Focus remains on the listbox container, and `aria-activedescendant` is used to indicate the active item.\n */\n readonly focusMode = input<'roving' | 'activedescendant'>('roving');\n\n /**\n * The selection strategy used by the list.\n * - `follow`: The focused item is automatically selected.\n * - `explicit`: Items are selected explicitly by the user (e.g., via click or spacebar).\n */\n readonly selectionMode = input<'follow' | 'explicit'>('follow');\n\n /** The amount of time before the typeahead search is reset. */\n readonly typeaheadDelay = input<number>(500); // Picked arbitrarily.\n\n /** Whether the listbox is disabled. */\n readonly disabled = input(false, {transform: booleanAttribute});\n\n /** Whether the listbox is readonly. */\n readonly readonly = input(false, {transform: booleanAttribute});\n\n /** The tabindex of the listbox. */\n readonly tabIndex = input(undefined, {\n transform: (v: string | number | undefined) =>\n v === undefined ? undefined : numberAttribute(v),\n });\n\n /** The values of the currently selected items. */\n readonly value = model<V[]>([]);\n\n /** The Listbox UIPattern. */\n readonly _pattern: ListboxPattern<V>;\n\n /** The ID of the active descendant in the listbox. */\n readonly activeDescendant: Signal<string | undefined>;\n\n constructor() {\n const inputs = {\n ...this,\n id: this.id,\n items: this.items,\n activeItem: signal(undefined),\n textDirection: this.textDirection,\n element: () => this._elementRef.nativeElement,\n combobox: () => this._popup?.combobox?._pattern,\n };\n\n this._pattern = this._popup?.combobox\n ? new ComboboxListboxPattern<V>(inputs)\n : new ListboxPattern<V>(inputs);\n\n this.activeDescendant = computed(() => this._pattern.activeDescendant());\n\n if (this._popup) {\n this._popup._controls.set(this._pattern as ComboboxListboxPattern<V>);\n }\n\n // Check for any violationns after the DOM has been updated.\n afterRenderEffect({\n read: () => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const violations = this._pattern.validate();\n for (const violation of violations) {\n console.error(violation);\n }\n }\n },\n });\n\n afterRenderEffect({write: () => this._pattern.setDefaultStateEffect()});\n\n // Ensure that if the active item is removed from\n // the list, the listbox updates it's focus state.\n afterRenderEffect({\n write: () => {\n const items = inputs.items();\n const activeItem = untracked(() => inputs.activeItem());\n\n if (!items.some(i => i === activeItem) && activeItem) {\n this._pattern.listBehavior.unfocus();\n }\n },\n });\n\n // Ensure that the value is always in sync with the available options.\n // This needs to be after the render for the value to always be available.\n afterRenderEffect({\n write: () => {\n const items = inputs.items();\n const value = untracked(() => this.value());\n\n if (items && value.some(v => !items.some(i => i.value() === v))) {\n this.value.set(value.filter(v => items.some(i => i.value() === v)));\n }\n },\n });\n }\n\n scrollActiveItemIntoView(options: ScrollIntoViewOptions = {block: 'nearest'}) {\n this._pattern.inputs.activeItem()?.element()?.scrollIntoView(options);\n }\n\n /** Navigates to the first item in the listbox. */\n gotoFirst() {\n this._pattern.listBehavior.first();\n }\n}\n"],"names":["LISTBOX","InjectionToken","Option","element","inject","ElementRef","nativeElement","active","computed","_pattern","_listbox","id","input","_IdGenerator","getId","_listboxPattern","value","required","disabled","transform","booleanAttribute","label","selected","OptionPattern","listbox","searchTerm","deps","target","i0","ɵɵFactoryTarget","Directive","isStandalone","selector","inputs","classPropertyName","publicName","isSignal","isRequired","transformFunction","host","attributes","properties","exportAs","ngImport","decorators","args","Listbox","_popup","ComboboxPopup","optional","_elementRef","_options","contentChildren","descendants","textDirection","Directionality","valueSignal","asReadonly","items","map","option","orientation","multi","wrap","softDisabled","focusMode","selectionMode","typeaheadDelay","ngDevMode","debugName","readonly","tabIndex","undefined","v","numberAttribute","model","activeDescendant","constructor","activeItem","signal","combobox","ComboboxListboxPattern","ListboxPattern","_controls","set","afterRenderEffect","read","violations","validate","violation","console","error","write","setDefaultStateEffect","untracked","some","i","listBehavior","unfocus","filter","scrollActiveItemIntoView","options","block","scrollIntoView","gotoFirst","first","ɵdir","ɵɵngDeclareDirective","minVersion","version","type","outputs","listeners","providers","provide","useExisting","hostDirectives","directive","i1","ctorParameters","propDecorators","Input","alias","ContentChildren","forwardRef","Output"],"mappings":"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"}
1
+ {"version":3,"file":"listbox.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/listbox/tokens.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/listbox/listbox.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/src/aria/listbox/option.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {InjectionToken} from '@angular/core';\nimport type {Listbox} from './listbox';\n\nexport const LISTBOX = new InjectionToken<Listbox<any>>('LISTBOX');\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n afterRenderEffect,\n afterNextRender,\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n model,\n OnDestroy,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {ListboxPattern, SortedCollection, tabIndexTransform} from '../private';\nimport {Option} from './option';\nimport {LISTBOX} from './tokens';\n\n/**\n * Represents a container used to display a list of items for a user to select from.\n *\n * The `ngListbox` is meant to be used in conjunction with `ngOption` directives to create a\n * selectable list. It supports single and multiple selection modes, as well as various focus and\n * orientation strategies.\n *\n * ```html\n * <ul ngListbox [(value)]=\"selectedItems\" [multi]=\"true\" orientation=\"vertical\">\n * @for (item of items; track item.id) {\n * <li ngOption [value]=\"item.id\" [label]=\"item.name\" [disabled]=\"item.disabled\">\n * {{item.name}}\n * </li>\n * }\n * </ul>\n * ```\n *\n * @developerPreview 21.0\n *\n * @see [Listbox](guide/aria/listbox)\n * @see [Autocomplete](guide/aria/autocomplete)\n * @see [Select](guide/aria/select)\n * @see [Multiselect](guide/aria/multiselect)\n */\n@Directive({\n selector: '[ngListbox]',\n exportAs: 'ngListbox',\n host: {\n 'role': 'listbox',\n '[attr.id]': 'id()',\n '[attr.tabindex]': 'tabIndex() !== undefined ? tabIndex() : _pattern.tabIndex()',\n '[attr.aria-readonly]': '_pattern.readonly()',\n '[attr.aria-disabled]': '_pattern.disabled()',\n '[attr.aria-orientation]': '_pattern.orientation()',\n '[attr.aria-multiselectable]': '_pattern.multi()',\n '[attr.aria-activedescendant]': '_pattern.activeDescendant()',\n '(keydown)': '_pattern.onKeydown($event)',\n '(click)': '_pattern.onClick($event)',\n '(focusin)': '_pattern.onFocusIn()',\n },\n providers: [{provide: LISTBOX, useExisting: Listbox}],\n})\nexport class Listbox<V> implements OnDestroy {\n /** A unique identifier for the listbox. */\n readonly id = input(inject(_IdGenerator).getId('ng-listbox-', true));\n\n /** A reference to the host element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** A reference to the host element. */\n readonly element = this._elementRef.nativeElement as HTMLElement;\n\n /** The collection of Options. */\n readonly _collection = new SortedCollection<Option<V>>();\n\n /** A signal wrapper for directionality. */\n protected readonly textDirection = inject(Directionality).valueSignal.asReadonly();\n\n /** Whether the list is vertically or horizontally oriented. */\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n\n /** Whether multiple items in the list can be selected at once. */\n readonly multi = input(false, {transform: booleanAttribute});\n\n /** Whether focus should wrap when navigating. */\n readonly wrap = input(true, {transform: booleanAttribute});\n\n /**\n * Whether to allow disabled items to receive focus. When `true`, disabled items are\n * focusable but not interactive. When `false`, disabled items are skipped during navigation.\n */\n readonly softDisabled = input(true, {transform: booleanAttribute});\n\n /**\n * The focus strategy used by the list.\n * - `roving`: Focus is moved to the active item using `tabindex`.\n * - `activedescendant`: Focus remains on the listbox container, and `aria-activedescendant` is used to indicate the active item.\n */\n readonly focusMode = input<'roving' | 'activedescendant'>('roving');\n\n /**\n * The selection strategy used by the list.\n * - `follow`: The focused item is automatically selected.\n * - `explicit`: Items are selected explicitly by the user (e.g., via click or spacebar).\n */\n readonly selectionMode = input<'follow' | 'explicit'>('follow');\n\n /** The amount of time before the typeahead search is reset. */\n readonly typeaheadDelay = input<number>(500); // Picked arbitrarily.\n\n /** Whether the listbox is disabled. */\n readonly disabled = input(false, {transform: booleanAttribute});\n\n /** Whether the listbox is readonly. */\n readonly readonly = input(false, {transform: booleanAttribute});\n\n /** The tabindex of the listbox. */\n readonly tabIndex = input(undefined, {\n alias: 'tabindex',\n transform: tabIndexTransform,\n });\n\n /** The values of the currently selected items. */\n readonly value = model<V[]>([]);\n\n /** The Listbox UIPattern. */\n readonly _pattern: ListboxPattern<V>;\n\n /** The ID of the active descendant in the listbox. */\n readonly activeDescendant: Signal<string | undefined>;\n\n constructor() {\n // Map directives to their patterns for the ListboxPattern\n const orderedItemPatterns = computed(() =>\n this._collection.orderedItems().map(option => option._pattern),\n );\n\n const inputs = {\n ...this,\n id: this.id,\n items: orderedItemPatterns,\n activeItem: signal(undefined),\n textDirection: this.textDirection,\n element: () => this._elementRef.nativeElement,\n };\n\n this._pattern = new ListboxPattern<V>(inputs);\n\n this.activeDescendant = computed(() => this._pattern.activeDescendant());\n\n afterNextRender(() => {\n this._collection.startObserving(this.element);\n });\n\n // Check for any violationns after the DOM has been updated.\n afterRenderEffect({\n read: () => {\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n const violations = this._pattern.validate();\n for (const violation of violations) {\n console.error(violation);\n }\n }\n },\n });\n\n afterRenderEffect({write: () => this._pattern.setDefaultStateEffect()});\n\n // Ensure that if the active item is removed from\n // the list, the listbox updates it's focus state.\n afterRenderEffect({\n write: () => {\n const items = inputs.items();\n const activeItem = untracked(() => inputs.activeItem());\n\n if (!items.some(i => i === activeItem) && activeItem) {\n this._pattern.listBehavior.unfocus();\n }\n },\n });\n\n // Ensure that the value is always in sync with the available options.\n // This needs to be after the render for the value to always be available.\n afterRenderEffect({\n write: () => {\n const items = inputs.items();\n const value = untracked(() => this.value());\n\n if (items && value.some(v => !items.some(i => i.value() === v))) {\n this.value.set(value.filter(v => items.some(i => i.value() === v)));\n }\n },\n });\n }\n\n ngOnDestroy() {\n this._collection.stopObserving();\n }\n\n scrollActiveItemIntoView(options: ScrollIntoViewOptions = {block: 'nearest'}) {\n this._pattern.inputs.activeItem()?.element()?.scrollIntoView(options);\n }\n\n /** Navigates to the first item in the listbox. */\n gotoFirst() {\n this._pattern.listBehavior.first();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n OnInit,\n OnDestroy,\n} from '@angular/core';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {OptionPattern} from '../private';\nimport {LISTBOX} from './tokens';\n\n/**\n * A selectable option in an `ngListbox`.\n *\n * This directive should be applied to an element (e.g., `<li>`, `<div>`) within an\n * `ngListbox`. The `value` input is used to identify the option, and the `label` input provides\n * the accessible name for the option.\n *\n * ```html\n * <li ngOption value=\"item-id\" label=\"Item Name\">\n * Item Name\n * </li>\n * ```\n *\n * @developerPreview 21.0\n *\n * @see [Listbox](guide/aria/listbox)\n * @see [Autocomplete](guide/aria/autocomplete)\n * @see [Select](guide/aria/select)\n * @see [Multiselect](guide/aria/multiselect)\n */\n@Directive({\n selector: '[ngOption]',\n exportAs: 'ngOption',\n host: {\n 'role': 'option',\n '[attr.data-active]': 'active()',\n '[attr.id]': '_pattern.id()',\n '[attr.tabindex]': '_pattern.tabIndex()',\n '[attr.aria-selected]': '_pattern.selected()',\n '[attr.aria-disabled]': '_pattern.disabled()',\n },\n})\nexport class Option<V> implements OnInit, OnDestroy {\n /** A reference to the host element. */\n readonly element = inject(ElementRef).nativeElement as HTMLElement;\n\n /** Whether the option is currently active (focused). */\n readonly active = computed(() => this._pattern.active());\n\n /** The parent Listbox. */\n private readonly _listbox = inject(LISTBOX);\n\n /** A unique identifier for the option. */\n readonly id = input(inject(_IdGenerator).getId('ng-option-', true));\n\n /** The parent Listbox UIPattern. */\n private readonly _listboxPattern = computed(() => this._listbox._pattern);\n\n /** The value of the option. */\n readonly value = input.required<V>();\n\n /** Whether an item is disabled. */\n readonly disabled = input(false, {transform: booleanAttribute});\n\n /** The text used by the typeahead search. */\n readonly label = input<string>();\n\n /** Whether the option is selected. */\n readonly selected = computed(() => this._pattern.selected());\n\n /** The Option UIPattern. */\n readonly _pattern = new OptionPattern<V>({\n ...this,\n id: this.id,\n value: this.value,\n listbox: this._listboxPattern,\n element: () => this.element,\n searchTerm: () => this.label() ?? '',\n });\n\n ngOnInit() {\n this._listbox._collection.register(this);\n }\n\n ngOnDestroy() {\n this._listbox._collection.unregister(this);\n }\n}\n"],"names":["LISTBOX","InjectionToken","Listbox","id","input","inject","_IdGenerator","getId","_elementRef","ElementRef","element","nativeElement","_collection","SortedCollection","textDirection","Directionality","valueSignal","asReadonly","orientation","multi","transform","booleanAttribute","wrap","softDisabled","focusMode","selectionMode","typeaheadDelay","ngDevMode","debugName","disabled","readonly","tabIndex","undefined","alias","tabIndexTransform","value","model","_pattern","activeDescendant","constructor","orderedItemPatterns","computed","orderedItems","map","option","inputs","items","activeItem","signal","ListboxPattern","afterNextRender","startObserving","afterRenderEffect","read","violations","validate","violation","console","error","write","setDefaultStateEffect","untracked","some","i","listBehavior","unfocus","v","set","filter","ngOnDestroy","stopObserving","scrollActiveItemIntoView","options","block","scrollIntoView","gotoFirst","first","deps","target","i0","ɵɵFactoryTarget","Directive","isStandalone","selector","classPropertyName","publicName","isSignal","isRequired","transformFunction","outputs","host","attributes","listeners","properties","providers","provide","useExisting","exportAs","ngImport","decorators","args","Option","active","_listbox","_listboxPattern","required","label","selected","OptionPattern","listbox","searchTerm","ngOnInit","register","unregister"],"mappings":"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"}
@@ -28,6 +28,13 @@ class MenuItemHarness extends ComponentHarness {
28
28
  }
29
29
  return null;
30
30
  }
31
+ async isFocused() {
32
+ return (await this.host()).isFocused();
33
+ }
34
+ async hasSubmenu() {
35
+ const host = await this.host();
36
+ return (await host.getAttribute('aria-haspopup')) === 'true' || !!(await host.getAttribute('aria-controls'));
37
+ }
31
38
  }
32
39
  class MenuHarness extends ComponentHarness {
33
40
  static hostSelector = '[ngMenu], [ngMenuBar]';
@@ -50,6 +57,10 @@ class MenuHarness extends ComponentHarness {
50
57
  }
51
58
  return (await host.getAttribute('data-visible')) === 'true';
52
59
  }
60
+ async isMenuBar() {
61
+ const host = await this.host();
62
+ return host.matchesSelector('[ngMenuBar]');
63
+ }
53
64
  async open() {
54
65
  if (!(await this.isOpen())) {
55
66
  const trigger = await this._getTrigger();