@angular/aria 22.0.0-next.7 → 22.0.0-rc.0

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 (96) hide show
  1. package/fesm2022/_accordion-chunk.mjs +11 -1
  2. package/fesm2022/_accordion-chunk.mjs.map +1 -1
  3. package/fesm2022/_click-event-manager-chunk.mjs +1 -1
  4. package/fesm2022/_deferred-content-chunk.mjs +6 -6
  5. package/fesm2022/_list-chunk.mjs +4 -1
  6. package/fesm2022/_list-chunk.mjs.map +1 -1
  7. package/fesm2022/_list-navigation-chunk.mjs +1 -1
  8. package/fesm2022/_list-typeahead-chunk.mjs +1 -1
  9. package/fesm2022/_menu-chunk.mjs +10 -1
  10. package/fesm2022/_menu-chunk.mjs.map +1 -1
  11. package/fesm2022/{_combobox-listbox-chunk.mjs → _option-chunk.mjs} +13 -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 +10 -1
  15. package/fesm2022/_toolbar-widget-group-chunk.mjs.map +1 -1
  16. package/fesm2022/_transforms-chunk.mjs +8 -0
  17. package/fesm2022/_transforms-chunk.mjs.map +1 -0
  18. package/fesm2022/{_combobox-tree-chunk.mjs → _tree-chunk.mjs} +8 -48
  19. package/fesm2022/_tree-chunk.mjs.map +1 -0
  20. package/fesm2022/{_signal-like-chunk.mjs → _violations-chunk.mjs} +60 -2
  21. package/fesm2022/_violations-chunk.mjs.map +1 -0
  22. package/fesm2022/_widget-chunk.mjs +46 -15
  23. package/fesm2022/_widget-chunk.mjs.map +1 -1
  24. package/fesm2022/accordion.mjs +116 -89
  25. package/fesm2022/accordion.mjs.map +1 -1
  26. package/fesm2022/aria.mjs +1 -1
  27. package/fesm2022/aria.mjs.map +1 -1
  28. package/fesm2022/combobox-testing.mjs +79 -0
  29. package/fesm2022/combobox-testing.mjs.map +1 -0
  30. package/fesm2022/combobox.mjs +273 -307
  31. package/fesm2022/combobox.mjs.map +1 -1
  32. package/fesm2022/grid-testing.mjs +8 -0
  33. package/fesm2022/grid-testing.mjs.map +1 -1
  34. package/fesm2022/grid.mjs +75 -87
  35. package/fesm2022/grid.mjs.map +1 -1
  36. package/fesm2022/listbox-testing.mjs +4 -0
  37. package/fesm2022/listbox-testing.mjs.map +1 -1
  38. package/fesm2022/listbox.mjs +192 -215
  39. package/fesm2022/listbox.mjs.map +1 -1
  40. package/fesm2022/menu-testing.mjs +11 -0
  41. package/fesm2022/menu-testing.mjs.map +1 -1
  42. package/fesm2022/menu.mjs +60 -66
  43. package/fesm2022/menu.mjs.map +1 -1
  44. package/fesm2022/private.mjs +19 -13
  45. package/fesm2022/private.mjs.map +1 -1
  46. package/fesm2022/tabs.mjs +172 -115
  47. package/fesm2022/tabs.mjs.map +1 -1
  48. package/fesm2022/toolbar-testing.mjs +5 -1
  49. package/fesm2022/toolbar-testing.mjs.map +1 -1
  50. package/fesm2022/toolbar.mjs +41 -30
  51. package/fesm2022/toolbar.mjs.map +1 -1
  52. package/fesm2022/tree-testing.mjs +12 -0
  53. package/fesm2022/tree-testing.mjs.map +1 -1
  54. package/fesm2022/tree.mjs +126 -156
  55. package/fesm2022/tree.mjs.map +1 -1
  56. package/package.json +6 -6
  57. package/types/_accordion-chunk.d.ts +4 -2
  58. package/types/_collection-chunk.d.ts +42 -0
  59. package/types/_expansion-chunk.d.ts +1 -1
  60. package/types/_grid-chunk.d.ts +11 -3
  61. package/types/_keyboard-event-manager-chunk.d.ts +1 -1
  62. package/types/_list-chunk.d.ts +1 -1
  63. package/types/_list-navigation-chunk.d.ts +1 -1
  64. package/types/_listbox-chunk.d.ts +1 -1
  65. package/types/_menu-chunk.d.ts +3 -1
  66. package/types/_tabs-chunk.d.ts +1 -1
  67. package/types/_toolbar-chunk.d.ts +3 -1
  68. package/types/_tree-chunk.d.ts +1 -1
  69. package/types/accordion.d.ts +10 -18
  70. package/types/combobox-testing.d.ts +63 -0
  71. package/types/combobox.d.ts +96 -193
  72. package/types/grid-testing.d.ts +4 -0
  73. package/types/grid.d.ts +99 -103
  74. package/types/listbox-testing.d.ts +25 -0
  75. package/types/listbox.d.ts +53 -62
  76. package/types/menu-testing.d.ts +6 -0
  77. package/types/menu.d.ts +17 -23
  78. package/types/private.d.ts +26 -137
  79. package/types/tabs.d.ts +69 -80
  80. package/types/toolbar-testing.d.ts +4 -0
  81. package/types/toolbar.d.ts +6 -12
  82. package/types/tree-testing.d.ts +8 -0
  83. package/types/tree.d.ts +7 -20
  84. package/fesm2022/_combobox-chunk.mjs +0 -478
  85. package/fesm2022/_combobox-chunk.mjs.map +0 -1
  86. package/fesm2022/_combobox-listbox-chunk.mjs.map +0 -1
  87. package/fesm2022/_combobox-tree-chunk.mjs.map +0 -1
  88. package/fesm2022/_element-chunk.mjs +0 -6
  89. package/fesm2022/_element-chunk.mjs.map +0 -1
  90. package/fesm2022/_signal-like-chunk.mjs.map +0 -1
  91. package/fesm2022/simple-combobox.mjs +0 -443
  92. package/fesm2022/simple-combobox.mjs.map +0 -1
  93. package/types/_combobox-chunk.d.ts +0 -224
  94. package/types/_element-chunk.d.ts +0 -10
  95. package/types/_signal-like-chunk.d.ts +0 -14
  96. 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, reportViolations } from './_violations-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,32 +76,31 @@ 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
- }
259
- afterRenderEffect({
260
- read: () => {
261
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
262
- const violations = this._pattern.validate();
263
- for (const violation of violations) {
264
- console.error(violation);
265
- }
266
- }
267
- }
94
+ afterNextRender(() => {
95
+ this._collection.startObserving(this.element);
268
96
  });
97
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
98
+ afterRenderEffect({
99
+ read: () => {
100
+ reportViolations(this._pattern.validate(), this.element);
101
+ }
102
+ });
103
+ }
269
104
  afterRenderEffect({
270
105
  write: () => this._pattern.setDefaultStateEffect()
271
106
  });
@@ -273,8 +108,9 @@ class Listbox {
273
108
  write: () => {
274
109
  const items = inputs.items();
275
110
  const activeItem = untracked(() => inputs.activeItem());
276
- if (!items.some(i => i === activeItem) && activeItem) {
111
+ if (activeItem && !items.some(i => i === activeItem)) {
277
112
  this._pattern.listBehavior.unfocus();
113
+ this._pattern.setDefaultState();
278
114
  }
279
115
  }
280
116
  });
@@ -288,6 +124,9 @@ class Listbox {
288
124
  }
289
125
  });
290
126
  }
127
+ ngOnDestroy() {
128
+ this._collection.stopObserving();
129
+ }
291
130
  scrollActiveItemIntoView(options = {
292
131
  block: 'nearest'
293
132
  }) {
@@ -298,15 +137,15 @@ class Listbox {
298
137
  }
299
138
  static ɵfac = i0.ɵɵngDeclareFactory({
300
139
  minVersion: "12.0.0",
301
- version: "22.0.0-next.9",
140
+ version: "22.0.0-next.12",
302
141
  ngImport: i0,
303
142
  type: Listbox,
304
143
  deps: [],
305
144
  target: i0.ɵɵFactoryTarget.Directive
306
145
  });
307
146
  static ɵdir = i0.ɵɵngDeclareDirective({
308
- minVersion: "17.2.0",
309
- version: "22.0.0-next.9",
147
+ minVersion: "17.1.0",
148
+ version: "22.0.0-next.12",
310
149
  type: Listbox,
311
150
  isStandalone: true,
312
151
  selector: "[ngListbox]",
@@ -383,7 +222,7 @@ class Listbox {
383
222
  },
384
223
  tabIndex: {
385
224
  classPropertyName: "tabIndex",
386
- publicName: "tabIndex",
225
+ publicName: "tabindex",
387
226
  isSignal: true,
388
227
  isRequired: false,
389
228
  transformFunction: null
@@ -422,22 +261,13 @@ class Listbox {
422
261
  provide: LISTBOX,
423
262
  useExisting: Listbox
424
263
  }],
425
- queries: [{
426
- propertyName: "_options",
427
- predicate: Option,
428
- descendants: true,
429
- isSignal: true
430
- }],
431
264
  exportAs: ["ngListbox"],
432
- hostDirectives: [{
433
- directive: ComboboxPopup
434
- }],
435
265
  ngImport: i0
436
266
  });
437
267
  }
438
268
  i0.ɵɵngDeclareClassMetadata({
439
269
  minVersion: "12.0.0",
440
- version: "22.0.0-next.9",
270
+ version: "22.0.0-next.12",
441
271
  ngImport: i0,
442
272
  type: Listbox,
443
273
  decorators: [{
@@ -458,7 +288,6 @@ i0.ɵɵngDeclareClassMetadata({
458
288
  '(click)': '_pattern.onClick($event)',
459
289
  '(focusin)': '_pattern.onFocusIn()'
460
290
  },
461
- hostDirectives: [ComboboxPopup],
462
291
  providers: [{
463
292
  provide: LISTBOX,
464
293
  useExisting: Listbox
@@ -475,15 +304,6 @@ i0.ɵɵngDeclareClassMetadata({
475
304
  required: false
476
305
  }]
477
306
  }],
478
- _options: [{
479
- type: i0.ContentChildren,
480
- args: [i0.forwardRef(() => Option), {
481
- ...{
482
- descendants: true
483
- },
484
- isSignal: true
485
- }]
486
- }],
487
307
  orientation: [{
488
308
  type: i0.Input,
489
309
  args: [{
@@ -560,7 +380,7 @@ i0.ɵɵngDeclareClassMetadata({
560
380
  type: i0.Input,
561
381
  args: [{
562
382
  isSignal: true,
563
- alias: "tabIndex",
383
+ alias: "tabindex",
564
384
  required: false
565
385
  }]
566
386
  }],
@@ -578,5 +398,162 @@ i0.ɵɵngDeclareClassMetadata({
578
398
  }
579
399
  });
580
400
 
581
- export { Listbox, Option, ComboboxPopup as ɵɵComboboxPopup };
401
+ class Option {
402
+ element = inject(ElementRef).nativeElement;
403
+ active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
404
+ debugName: "active"
405
+ }] : []));
406
+ _listbox = inject(LISTBOX);
407
+ id = input(inject(_IdGenerator).getId('ng-option-', true), ...(ngDevMode ? [{
408
+ debugName: "id"
409
+ }] : []));
410
+ _listboxPattern = computed(() => this._listbox._pattern, ...(ngDevMode ? [{
411
+ debugName: "_listboxPattern"
412
+ }] : []));
413
+ value = input.required(...(ngDevMode ? [{
414
+ debugName: "value"
415
+ }] : []));
416
+ disabled = input(false, {
417
+ ...(ngDevMode ? {
418
+ debugName: "disabled"
419
+ } : {}),
420
+ transform: booleanAttribute
421
+ });
422
+ label = input(...(ngDevMode ? [undefined, {
423
+ debugName: "label"
424
+ }] : []));
425
+ selected = computed(() => this._pattern.selected(), ...(ngDevMode ? [{
426
+ debugName: "selected"
427
+ }] : []));
428
+ _pattern = new OptionPattern({
429
+ ...this,
430
+ id: this.id,
431
+ value: this.value,
432
+ listbox: this._listboxPattern,
433
+ element: () => this.element,
434
+ searchTerm: () => this.label() ?? ''
435
+ });
436
+ ngOnInit() {
437
+ this._listbox._collection.register(this);
438
+ }
439
+ ngOnDestroy() {
440
+ this._listbox._collection.unregister(this);
441
+ }
442
+ static ɵfac = i0.ɵɵngDeclareFactory({
443
+ minVersion: "12.0.0",
444
+ version: "22.0.0-next.12",
445
+ ngImport: i0,
446
+ type: Option,
447
+ deps: [],
448
+ target: i0.ɵɵFactoryTarget.Directive
449
+ });
450
+ static ɵdir = i0.ɵɵngDeclareDirective({
451
+ minVersion: "17.1.0",
452
+ version: "22.0.0-next.12",
453
+ type: Option,
454
+ isStandalone: true,
455
+ selector: "[ngOption]",
456
+ inputs: {
457
+ id: {
458
+ classPropertyName: "id",
459
+ publicName: "id",
460
+ isSignal: true,
461
+ isRequired: false,
462
+ transformFunction: null
463
+ },
464
+ value: {
465
+ classPropertyName: "value",
466
+ publicName: "value",
467
+ isSignal: true,
468
+ isRequired: true,
469
+ transformFunction: null
470
+ },
471
+ disabled: {
472
+ classPropertyName: "disabled",
473
+ publicName: "disabled",
474
+ isSignal: true,
475
+ isRequired: false,
476
+ transformFunction: null
477
+ },
478
+ label: {
479
+ classPropertyName: "label",
480
+ publicName: "label",
481
+ isSignal: true,
482
+ isRequired: false,
483
+ transformFunction: null
484
+ }
485
+ },
486
+ host: {
487
+ attributes: {
488
+ "role": "option"
489
+ },
490
+ properties: {
491
+ "attr.data-active": "active()",
492
+ "attr.id": "_pattern.id()",
493
+ "attr.tabindex": "_pattern.tabIndex()",
494
+ "attr.aria-selected": "_pattern.selected()",
495
+ "attr.aria-disabled": "_pattern.disabled()"
496
+ }
497
+ },
498
+ exportAs: ["ngOption"],
499
+ ngImport: i0
500
+ });
501
+ }
502
+ i0.ɵɵngDeclareClassMetadata({
503
+ minVersion: "12.0.0",
504
+ version: "22.0.0-next.12",
505
+ ngImport: i0,
506
+ type: Option,
507
+ decorators: [{
508
+ type: Directive,
509
+ args: [{
510
+ selector: '[ngOption]',
511
+ exportAs: 'ngOption',
512
+ host: {
513
+ 'role': 'option',
514
+ '[attr.data-active]': 'active()',
515
+ '[attr.id]': '_pattern.id()',
516
+ '[attr.tabindex]': '_pattern.tabIndex()',
517
+ '[attr.aria-selected]': '_pattern.selected()',
518
+ '[attr.aria-disabled]': '_pattern.disabled()'
519
+ }
520
+ }]
521
+ }],
522
+ propDecorators: {
523
+ id: [{
524
+ type: i0.Input,
525
+ args: [{
526
+ isSignal: true,
527
+ alias: "id",
528
+ required: false
529
+ }]
530
+ }],
531
+ value: [{
532
+ type: i0.Input,
533
+ args: [{
534
+ isSignal: true,
535
+ alias: "value",
536
+ required: true
537
+ }]
538
+ }],
539
+ disabled: [{
540
+ type: i0.Input,
541
+ args: [{
542
+ isSignal: true,
543
+ alias: "disabled",
544
+ required: false
545
+ }]
546
+ }],
547
+ label: [{
548
+ type: i0.Input,
549
+ args: [{
550
+ isSignal: true,
551
+ alias: "label",
552
+ required: false
553
+ }]
554
+ }]
555
+ }
556
+ });
557
+
558
+ export { Listbox, Option };
582
559
  //# 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, reportViolations} 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 * @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 violations after the DOM has been updated.\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n afterRenderEffect({\n read: () => {\n reportViolations(this._pattern.validate(), this.element);\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 (activeItem && !items.some(i => i === activeItem)) {\n this._pattern.listBehavior.unfocus();\n this._pattern.setDefaultState();\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 * @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","reportViolations","validate","write","setDefaultStateEffect","untracked","some","i","listBehavior","unfocus","setDefaultState","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();