@angular/aria 21.1.0-next.1 → 21.1.0-next.3

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 (81) hide show
  1. package/fesm2022/_accordion-chunk.mjs +108 -0
  2. package/fesm2022/_accordion-chunk.mjs.map +1 -0
  3. package/fesm2022/_combobox-chunk.mjs +425 -0
  4. package/fesm2022/_combobox-chunk.mjs.map +1 -0
  5. package/fesm2022/_combobox-listbox-chunk.mjs +240 -0
  6. package/fesm2022/_combobox-listbox-chunk.mjs.map +1 -0
  7. package/fesm2022/_combobox-tree-chunk.mjs +331 -0
  8. package/fesm2022/_combobox-tree-chunk.mjs.map +1 -0
  9. package/fesm2022/_deferred-content-chunk.mjs +124 -0
  10. package/fesm2022/_deferred-content-chunk.mjs.map +1 -0
  11. package/fesm2022/_expansion-chunk.mjs +41 -0
  12. package/fesm2022/_expansion-chunk.mjs.map +1 -0
  13. package/fesm2022/_list-chunk.mjs +287 -0
  14. package/fesm2022/_list-chunk.mjs.map +1 -0
  15. package/fesm2022/_list-navigation-chunk.mjs +116 -0
  16. package/fesm2022/_list-navigation-chunk.mjs.map +1 -0
  17. package/fesm2022/_menu-chunk.mjs +515 -0
  18. package/fesm2022/_menu-chunk.mjs.map +1 -0
  19. package/fesm2022/_pointer-event-manager-chunk.mjs +54 -0
  20. package/fesm2022/_pointer-event-manager-chunk.mjs.map +1 -0
  21. package/fesm2022/_signal-like-chunk.mjs +118 -0
  22. package/fesm2022/_signal-like-chunk.mjs.map +1 -0
  23. package/fesm2022/_tabs-chunk.mjs +159 -0
  24. package/fesm2022/_tabs-chunk.mjs.map +1 -0
  25. package/fesm2022/_toolbar-widget-group-chunk.mjs +148 -0
  26. package/fesm2022/_toolbar-widget-group-chunk.mjs.map +1 -0
  27. package/fesm2022/_widget-chunk.mjs +5 -246
  28. package/fesm2022/_widget-chunk.mjs.map +1 -1
  29. package/fesm2022/accordion.mjs +73 -55
  30. package/fesm2022/accordion.mjs.map +1 -1
  31. package/fesm2022/aria.mjs +1 -1
  32. package/fesm2022/aria.mjs.map +1 -1
  33. package/fesm2022/combobox.mjs +166 -153
  34. package/fesm2022/combobox.mjs.map +1 -1
  35. package/fesm2022/grid.mjs +287 -261
  36. package/fesm2022/grid.mjs.map +1 -1
  37. package/fesm2022/listbox.mjs +211 -197
  38. package/fesm2022/listbox.mjs.map +1 -1
  39. package/fesm2022/menu.mjs +308 -286
  40. package/fesm2022/menu.mjs.map +1 -1
  41. package/fesm2022/private.mjs +15 -2329
  42. package/fesm2022/private.mjs.map +1 -1
  43. package/fesm2022/tabs.mjs +221 -199
  44. package/fesm2022/tabs.mjs.map +1 -1
  45. package/fesm2022/toolbar.mjs +64 -48
  46. package/fesm2022/toolbar.mjs.map +1 -1
  47. package/fesm2022/tree.mjs +54 -44
  48. package/fesm2022/tree.mjs.map +1 -1
  49. package/package.json +2 -2
  50. package/types/_accordion-chunk.d.ts +100 -0
  51. package/types/_combobox-chunk.d.ts +194 -0
  52. package/types/_deferred-content-chunk.d.ts +42 -0
  53. package/types/_expansion-chunk.d.ts +40 -0
  54. package/types/_grid-chunk.d.ts +43 -250
  55. package/types/_keyboard-event-manager-chunk.d.ts +68 -0
  56. package/types/_list-chunk.d.ts +211 -0
  57. package/types/_list-navigation-chunk.d.ts +119 -0
  58. package/types/_listbox-chunk.d.ts +107 -0
  59. package/types/_menu-chunk.d.ts +267 -0
  60. package/types/_pointer-event-manager-chunk.d.ts +34 -0
  61. package/types/_tabs-chunk.d.ts +153 -0
  62. package/types/_toolbar-chunk.d.ts +124 -0
  63. package/types/_tree-chunk.d.ts +185 -0
  64. package/types/accordion.d.ts +65 -54
  65. package/types/aria.d.ts +1 -1
  66. package/types/combobox.d.ts +86 -56
  67. package/types/grid.d.ts +47 -32
  68. package/types/listbox.d.ts +22 -7
  69. package/types/menu.d.ts +135 -117
  70. package/types/private.d.ts +28 -1376
  71. package/types/tabs.d.ts +109 -88
  72. package/types/toolbar.d.ts +77 -66
  73. package/types/tree.d.ts +118 -104
  74. package/_adev_assets/aria-accordion.json +0 -743
  75. package/_adev_assets/aria-combobox.json +0 -603
  76. package/_adev_assets/aria-grid.json +0 -893
  77. package/_adev_assets/aria-listbox.json +0 -540
  78. package/_adev_assets/aria-menu.json +0 -1049
  79. package/_adev_assets/aria-tabs.json +0 -880
  80. package/_adev_assets/aria-toolbar.json +0 -545
  81. package/_adev_assets/aria-tree.json +0 -853
package/fesm2022/menu.mjs CHANGED
@@ -1,9 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, computed, booleanAttribute, effect, Directive, contentChildren, signal, output, afterRenderEffect, untracked, model } from '@angular/core';
3
- import * as i1 from '@angular/aria/private';
4
- import { MenuTriggerPattern, DeferredContentAware, MenuPattern, MenuBarPattern, MenuItemPattern, DeferredContent } from '@angular/aria/private';
5
- import { _IdGenerator } from '@angular/cdk/a11y';
2
+ import { inject, ElementRef, input, computed, booleanAttribute, effect, Directive, InjectionToken, model, contentChildren, signal, output, afterRenderEffect, untracked } from '@angular/core';
6
3
  import { Directionality } from '@angular/cdk/bidi';
4
+ import { MenuTriggerPattern, MenuItemPattern, MenuBarPattern, MenuPattern } from './_menu-chunk.mjs';
5
+ import { _IdGenerator } from '@angular/cdk/a11y';
6
+ import { DeferredContentAware, DeferredContent } from './_deferred-content-chunk.mjs';
7
+ import './_signal-like-chunk.mjs';
8
+ import '@angular/core/primitives/signals';
9
+ import './_list-chunk.mjs';
10
+ import './_list-navigation-chunk.mjs';
7
11
 
8
12
  class MenuTrigger {
9
13
  _elementRef = inject(ElementRef);
@@ -18,18 +22,18 @@ class MenuTrigger {
18
22
  hasPopup = computed(() => this._pattern.hasPopup(), ...(ngDevMode ? [{
19
23
  debugName: "hasPopup"
20
24
  }] : []));
21
- disabled = input(false, ...(ngDevMode ? [{
22
- debugName: "disabled",
23
- transform: booleanAttribute
24
- }] : [{
25
+ disabled = input(false, {
26
+ ...(ngDevMode ? {
27
+ debugName: "disabled"
28
+ } : {}),
25
29
  transform: booleanAttribute
26
- }]));
27
- softDisabled = input(true, ...(ngDevMode ? [{
28
- debugName: "softDisabled",
29
- transform: booleanAttribute
30
- }] : [{
30
+ });
31
+ softDisabled = input(true, {
32
+ ...(ngDevMode ? {
33
+ debugName: "softDisabled"
34
+ } : {}),
31
35
  transform: booleanAttribute
32
- }]));
36
+ });
33
37
  _pattern = new MenuTriggerPattern({
34
38
  textDirection: this.textDirection,
35
39
  element: computed(() => this._elementRef.nativeElement),
@@ -49,7 +53,7 @@ class MenuTrigger {
49
53
  }
50
54
  static ɵfac = i0.ɵɵngDeclareFactory({
51
55
  minVersion: "12.0.0",
52
- version: "21.0.0",
56
+ version: "21.0.3",
53
57
  ngImport: i0,
54
58
  type: MenuTrigger,
55
59
  deps: [],
@@ -57,7 +61,7 @@ class MenuTrigger {
57
61
  });
58
62
  static ɵdir = i0.ɵɵngDeclareDirective({
59
63
  minVersion: "17.1.0",
60
- version: "21.0.0",
64
+ version: "21.0.3",
61
65
  type: MenuTrigger,
62
66
  isStandalone: true,
63
67
  selector: "button[ngMenuTrigger]",
@@ -106,7 +110,7 @@ class MenuTrigger {
106
110
  }
107
111
  i0.ɵɵngDeclareClassMetadata({
108
112
  minVersion: "12.0.0",
109
- version: "21.0.0",
113
+ version: "21.0.3",
110
114
  ngImport: i0,
111
115
  type: MenuTrigger,
112
116
  decorators: [{
@@ -156,87 +160,54 @@ i0.ɵɵngDeclareClassMetadata({
156
160
  }]
157
161
  }
158
162
  });
159
- class Menu {
160
- _deferredContentAware = inject(DeferredContentAware, {
161
- optional: true
162
- });
163
- _allItems = contentChildren(MenuItem, ...(ngDevMode ? [{
164
- debugName: "_allItems",
165
- descendants: true
166
- }] : [{
167
- descendants: true
168
- }]));
169
- _items = computed(() => this._allItems().filter(i => i.parent === this), ...(ngDevMode ? [{
170
- debugName: "_items"
171
- }] : []));
163
+
164
+ const MENU_COMPONENT = new InjectionToken('MENU_COMPONENT');
165
+
166
+ class MenuItem {
172
167
  _elementRef = inject(ElementRef);
173
168
  element = this._elementRef.nativeElement;
174
- textDirection = inject(Directionality).valueSignal;
175
- id = input(inject(_IdGenerator).getId('ng-menu-', true), ...(ngDevMode ? [{
169
+ id = input(inject(_IdGenerator).getId('ng-menu-item-', true), ...(ngDevMode ? [{
176
170
  debugName: "id"
177
171
  }] : []));
178
- wrap = input(true, ...(ngDevMode ? [{
179
- debugName: "wrap",
180
- transform: booleanAttribute
181
- }] : [{
182
- transform: booleanAttribute
183
- }]));
184
- typeaheadDelay = input(500, ...(ngDevMode ? [{
185
- debugName: "typeaheadDelay"
172
+ value = input.required(...(ngDevMode ? [{
173
+ debugName: "value"
186
174
  }] : []));
187
175
  disabled = input(false, ...(ngDevMode ? [{
188
- debugName: "disabled",
189
- transform: booleanAttribute
190
- }] : [{
191
- transform: booleanAttribute
192
- }]));
193
- parent = signal(undefined, ...(ngDevMode ? [{
194
- debugName: "parent"
176
+ debugName: "disabled"
195
177
  }] : []));
196
- _pattern;
197
- _itemPatterns = () => this._items().map(i => i._pattern);
198
- visible = computed(() => this._pattern.visible(), ...(ngDevMode ? [{
199
- debugName: "visible"
178
+ searchTerm = model('', ...(ngDevMode ? [{
179
+ debugName: "searchTerm"
200
180
  }] : []));
201
- tabIndex = computed(() => this._pattern.tabIndex(), ...(ngDevMode ? [{
202
- debugName: "tabIndex"
181
+ parent = inject(MENU_COMPONENT, {
182
+ optional: true
183
+ });
184
+ submenu = input(undefined, ...(ngDevMode ? [{
185
+ debugName: "submenu"
203
186
  }] : []));
204
- onSelect = output();
205
- expansionDelay = input(100, ...(ngDevMode ? [{
206
- debugName: "expansionDelay"
187
+ active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
188
+ debugName: "active"
189
+ }] : []));
190
+ expanded = computed(() => this._pattern.expanded(), ...(ngDevMode ? [{
191
+ debugName: "expanded"
207
192
  }] : []));
193
+ hasPopup = computed(() => this._pattern.hasPopup(), ...(ngDevMode ? [{
194
+ debugName: "hasPopup"
195
+ }] : []));
196
+ _pattern = new MenuItemPattern({
197
+ id: this.id,
198
+ value: this.value,
199
+ element: computed(() => this._elementRef.nativeElement),
200
+ disabled: this.disabled,
201
+ searchTerm: this.searchTerm,
202
+ parent: computed(() => this.parent?._pattern),
203
+ submenu: computed(() => this.submenu()?._pattern)
204
+ });
208
205
  constructor() {
209
- this._pattern = new MenuPattern({
210
- ...this,
211
- parent: computed(() => this.parent()?._pattern),
212
- items: this._itemPatterns,
213
- multi: () => false,
214
- softDisabled: () => true,
215
- focusMode: () => 'roving',
216
- orientation: () => 'vertical',
217
- selectionMode: () => 'explicit',
218
- activeItem: signal(undefined),
219
- element: computed(() => this._elementRef.nativeElement),
220
- onSelect: value => this.onSelect.emit(value)
221
- });
222
- afterRenderEffect(() => {
223
- const parent = this.parent();
224
- if (parent instanceof MenuItem && parent.parent instanceof MenuBar) {
225
- this._deferredContentAware?.contentVisible.set(true);
226
- } else {
227
- this._deferredContentAware?.contentVisible.set(this._pattern.visible() || !!this.parent()?._pattern.hasBeenFocused());
228
- }
229
- });
230
- afterRenderEffect(() => {
231
- if (this._pattern.visible()) {
232
- const activeItem = untracked(() => this._pattern.inputs.activeItem());
233
- this._pattern.listBehavior.goto(activeItem);
234
- }
235
- });
236
- afterRenderEffect(() => {
237
- if (!this._pattern.hasBeenFocused() && !this._pattern.hasBeenHovered() && this._items().length) {
238
- untracked(() => this._pattern.setDefaultState());
239
- }
206
+ effect(() => this.submenu()?.parent.set(this));
207
+ }
208
+ open() {
209
+ this._pattern.open({
210
+ first: true
240
211
  });
241
212
  }
242
213
  close() {
@@ -244,18 +215,18 @@ class Menu {
244
215
  }
245
216
  static ɵfac = i0.ɵɵngDeclareFactory({
246
217
  minVersion: "12.0.0",
247
- version: "21.0.0",
218
+ version: "21.0.3",
248
219
  ngImport: i0,
249
- type: Menu,
220
+ type: MenuItem,
250
221
  deps: [],
251
222
  target: i0.ɵɵFactoryTarget.Directive
252
223
  });
253
224
  static ɵdir = i0.ɵɵngDeclareDirective({
254
- minVersion: "17.2.0",
255
- version: "21.0.0",
256
- type: Menu,
225
+ minVersion: "17.1.0",
226
+ version: "21.0.3",
227
+ type: MenuItem,
257
228
  isStandalone: true,
258
- selector: "[ngMenu]",
229
+ selector: "[ngMenuItem]",
259
230
  inputs: {
260
231
  id: {
261
232
  classPropertyName: "id",
@@ -264,111 +235,82 @@ class Menu {
264
235
  isRequired: false,
265
236
  transformFunction: null
266
237
  },
267
- wrap: {
268
- classPropertyName: "wrap",
269
- publicName: "wrap",
238
+ value: {
239
+ classPropertyName: "value",
240
+ publicName: "value",
270
241
  isSignal: true,
271
- isRequired: false,
242
+ isRequired: true,
272
243
  transformFunction: null
273
244
  },
274
- typeaheadDelay: {
275
- classPropertyName: "typeaheadDelay",
276
- publicName: "typeaheadDelay",
245
+ disabled: {
246
+ classPropertyName: "disabled",
247
+ publicName: "disabled",
277
248
  isSignal: true,
278
249
  isRequired: false,
279
250
  transformFunction: null
280
251
  },
281
- disabled: {
282
- classPropertyName: "disabled",
283
- publicName: "disabled",
252
+ searchTerm: {
253
+ classPropertyName: "searchTerm",
254
+ publicName: "searchTerm",
284
255
  isSignal: true,
285
256
  isRequired: false,
286
257
  transformFunction: null
287
258
  },
288
- expansionDelay: {
289
- classPropertyName: "expansionDelay",
290
- publicName: "expansionDelay",
259
+ submenu: {
260
+ classPropertyName: "submenu",
261
+ publicName: "submenu",
291
262
  isSignal: true,
292
263
  isRequired: false,
293
264
  transformFunction: null
294
265
  }
295
266
  },
296
267
  outputs: {
297
- onSelect: "onSelect"
268
+ searchTerm: "searchTermChange"
298
269
  },
299
270
  host: {
300
271
  attributes: {
301
- "role": "menu"
272
+ "role": "menuitem"
302
273
  },
303
274
  listeners: {
304
- "keydown": "_pattern.onKeydown($event)",
305
- "mouseover": "_pattern.onMouseOver($event)",
306
- "mouseout": "_pattern.onMouseOut($event)",
307
- "focusout": "_pattern.onFocusOut($event)",
308
- "focusin": "_pattern.onFocusIn()",
309
- "click": "_pattern.onClick($event)"
275
+ "focusin": "_pattern.onFocusIn()"
310
276
  },
311
277
  properties: {
312
- "attr.id": "_pattern.id()",
278
+ "attr.tabindex": "_pattern.tabIndex()",
279
+ "attr.data-active": "active()",
280
+ "attr.aria-haspopup": "hasPopup()",
281
+ "attr.aria-expanded": "expanded()",
313
282
  "attr.aria-disabled": "_pattern.disabled()",
314
- "attr.tabindex": "tabIndex()",
315
- "attr.data-visible": "visible()"
283
+ "attr.aria-controls": "_pattern.submenu()?.id()"
316
284
  }
317
285
  },
318
- queries: [{
319
- propertyName: "_allItems",
320
- predicate: MenuItem,
321
- descendants: true,
322
- isSignal: true
323
- }],
324
- exportAs: ["ngMenu"],
325
- hostDirectives: [{
326
- directive: i1.DeferredContentAware,
327
- inputs: ["preserveContent", "preserveContent"]
328
- }],
286
+ exportAs: ["ngMenuItem"],
329
287
  ngImport: i0
330
288
  });
331
289
  }
332
290
  i0.ɵɵngDeclareClassMetadata({
333
291
  minVersion: "12.0.0",
334
- version: "21.0.0",
292
+ version: "21.0.3",
335
293
  ngImport: i0,
336
- type: Menu,
294
+ type: MenuItem,
337
295
  decorators: [{
338
296
  type: Directive,
339
297
  args: [{
340
- selector: '[ngMenu]',
341
- exportAs: 'ngMenu',
298
+ selector: '[ngMenuItem]',
299
+ exportAs: 'ngMenuItem',
342
300
  host: {
343
- 'role': 'menu',
344
- '[attr.id]': '_pattern.id()',
345
- '[attr.aria-disabled]': '_pattern.disabled()',
346
- '[attr.tabindex]': 'tabIndex()',
347
- '[attr.data-visible]': 'visible()',
348
- '(keydown)': '_pattern.onKeydown($event)',
349
- '(mouseover)': '_pattern.onMouseOver($event)',
350
- '(mouseout)': '_pattern.onMouseOut($event)',
351
- '(focusout)': '_pattern.onFocusOut($event)',
301
+ 'role': 'menuitem',
352
302
  '(focusin)': '_pattern.onFocusIn()',
353
- '(click)': '_pattern.onClick($event)'
354
- },
355
- hostDirectives: [{
356
- directive: DeferredContentAware,
357
- inputs: ['preserveContent']
358
- }]
303
+ '[attr.tabindex]': '_pattern.tabIndex()',
304
+ '[attr.data-active]': 'active()',
305
+ '[attr.aria-haspopup]': 'hasPopup()',
306
+ '[attr.aria-expanded]': 'expanded()',
307
+ '[attr.aria-disabled]': '_pattern.disabled()',
308
+ '[attr.aria-controls]': '_pattern.submenu()?.id()'
309
+ }
359
310
  }]
360
311
  }],
361
312
  ctorParameters: () => [],
362
313
  propDecorators: {
363
- _allItems: [{
364
- type: i0.ContentChildren,
365
- args: [i0.forwardRef(() => MenuItem), {
366
- ...{
367
- descendants: true
368
- },
369
- isSignal: true
370
- }]
371
- }],
372
314
  id: [{
373
315
  type: i0.Input,
374
316
  args: [{
@@ -377,76 +319,76 @@ i0.ɵɵngDeclareClassMetadata({
377
319
  required: false
378
320
  }]
379
321
  }],
380
- wrap: [{
322
+ value: [{
381
323
  type: i0.Input,
382
324
  args: [{
383
325
  isSignal: true,
384
- alias: "wrap",
385
- required: false
326
+ alias: "value",
327
+ required: true
386
328
  }]
387
329
  }],
388
- typeaheadDelay: [{
330
+ disabled: [{
389
331
  type: i0.Input,
390
332
  args: [{
391
333
  isSignal: true,
392
- alias: "typeaheadDelay",
334
+ alias: "disabled",
393
335
  required: false
394
336
  }]
395
337
  }],
396
- disabled: [{
338
+ searchTerm: [{
397
339
  type: i0.Input,
398
340
  args: [{
399
341
  isSignal: true,
400
- alias: "disabled",
342
+ alias: "searchTerm",
401
343
  required: false
402
344
  }]
403
- }],
404
- onSelect: [{
345
+ }, {
405
346
  type: i0.Output,
406
- args: ["onSelect"]
347
+ args: ["searchTermChange"]
407
348
  }],
408
- expansionDelay: [{
349
+ submenu: [{
409
350
  type: i0.Input,
410
351
  args: [{
411
352
  isSignal: true,
412
- alias: "expansionDelay",
353
+ alias: "submenu",
413
354
  required: false
414
355
  }]
415
356
  }]
416
357
  }
417
358
  });
359
+
418
360
  class MenuBar {
419
- _allItems = contentChildren(MenuItem, ...(ngDevMode ? [{
420
- debugName: "_allItems",
421
- descendants: true
422
- }] : [{
361
+ _allItems = contentChildren(MenuItem, {
362
+ ...(ngDevMode ? {
363
+ debugName: "_allItems"
364
+ } : {}),
423
365
  descendants: true
424
- }]));
366
+ });
425
367
  _items = () => this._allItems().filter(i => i.parent === this);
426
368
  _elementRef = inject(ElementRef);
427
369
  element = this._elementRef.nativeElement;
428
- disabled = input(false, ...(ngDevMode ? [{
429
- debugName: "disabled",
430
- transform: booleanAttribute
431
- }] : [{
370
+ disabled = input(false, {
371
+ ...(ngDevMode ? {
372
+ debugName: "disabled"
373
+ } : {}),
432
374
  transform: booleanAttribute
433
- }]));
434
- softDisabled = input(true, ...(ngDevMode ? [{
435
- debugName: "softDisabled",
436
- transform: booleanAttribute
437
- }] : [{
375
+ });
376
+ softDisabled = input(true, {
377
+ ...(ngDevMode ? {
378
+ debugName: "softDisabled"
379
+ } : {}),
438
380
  transform: booleanAttribute
439
- }]));
381
+ });
440
382
  textDirection = inject(Directionality).valueSignal;
441
383
  values = model([], ...(ngDevMode ? [{
442
384
  debugName: "values"
443
385
  }] : []));
444
- wrap = input(true, ...(ngDevMode ? [{
445
- debugName: "wrap",
446
- transform: booleanAttribute
447
- }] : [{
386
+ wrap = input(true, {
387
+ ...(ngDevMode ? {
388
+ debugName: "wrap"
389
+ } : {}),
448
390
  transform: booleanAttribute
449
- }]));
391
+ });
450
392
  typeaheadDelay = input(500, ...(ngDevMode ? [{
451
393
  debugName: "typeaheadDelay"
452
394
  }] : []));
@@ -482,7 +424,7 @@ class MenuBar {
482
424
  }
483
425
  static ɵfac = i0.ɵɵngDeclareFactory({
484
426
  minVersion: "12.0.0",
485
- version: "21.0.0",
427
+ version: "21.0.3",
486
428
  ngImport: i0,
487
429
  type: MenuBar,
488
430
  deps: [],
@@ -490,7 +432,7 @@ class MenuBar {
490
432
  });
491
433
  static ɵdir = i0.ɵɵngDeclareDirective({
492
434
  minVersion: "17.2.0",
493
- version: "21.0.0",
435
+ version: "21.0.3",
494
436
  type: MenuBar,
495
437
  isStandalone: true,
496
438
  selector: "[ngMenuBar]",
@@ -552,6 +494,10 @@ class MenuBar {
552
494
  "attr.tabindex": "_pattern.tabIndex()"
553
495
  }
554
496
  },
497
+ providers: [{
498
+ provide: MENU_COMPONENT,
499
+ useExisting: MenuBar
500
+ }],
555
501
  queries: [{
556
502
  propertyName: "_allItems",
557
503
  predicate: MenuItem,
@@ -564,7 +510,7 @@ class MenuBar {
564
510
  }
565
511
  i0.ɵɵngDeclareClassMetadata({
566
512
  minVersion: "12.0.0",
567
- version: "21.0.0",
513
+ version: "21.0.3",
568
514
  ngImport: i0,
569
515
  type: MenuBar,
570
516
  decorators: [{
@@ -582,7 +528,11 @@ i0.ɵɵngDeclareClassMetadata({
582
528
  '(click)': '_pattern.onClick($event)',
583
529
  '(focusin)': '_pattern.onFocusIn()',
584
530
  '(focusout)': '_pattern.onFocusOut($event)'
585
- }
531
+ },
532
+ providers: [{
533
+ provide: MENU_COMPONENT,
534
+ useExisting: MenuBar
535
+ }]
586
536
  }]
587
537
  }],
588
538
  ctorParameters: () => [],
@@ -645,55 +595,88 @@ i0.ɵɵngDeclareClassMetadata({
645
595
  }]
646
596
  }
647
597
  });
648
- class MenuItem {
598
+
599
+ class Menu {
600
+ _deferredContentAware = inject(DeferredContentAware, {
601
+ optional: true
602
+ });
603
+ _allItems = contentChildren(MenuItem, {
604
+ ...(ngDevMode ? {
605
+ debugName: "_allItems"
606
+ } : {}),
607
+ descendants: true
608
+ });
609
+ _items = computed(() => this._allItems().filter(i => i.parent === this), ...(ngDevMode ? [{
610
+ debugName: "_items"
611
+ }] : []));
649
612
  _elementRef = inject(ElementRef);
650
613
  element = this._elementRef.nativeElement;
651
- id = input(inject(_IdGenerator).getId('ng-menu-item-', true), ...(ngDevMode ? [{
614
+ textDirection = inject(Directionality).valueSignal;
615
+ id = input(inject(_IdGenerator).getId('ng-menu-', true), ...(ngDevMode ? [{
652
616
  debugName: "id"
653
617
  }] : []));
654
- value = input.required(...(ngDevMode ? [{
655
- debugName: "value"
656
- }] : []));
657
- disabled = input(false, ...(ngDevMode ? [{
658
- debugName: "disabled"
659
- }] : []));
660
- searchTerm = model('', ...(ngDevMode ? [{
661
- debugName: "searchTerm"
662
- }] : []));
663
- _menu = inject(Menu, {
664
- optional: true
618
+ wrap = input(true, {
619
+ ...(ngDevMode ? {
620
+ debugName: "wrap"
621
+ } : {}),
622
+ transform: booleanAttribute
665
623
  });
666
- _menuBar = inject(MenuBar, {
667
- optional: true
624
+ typeaheadDelay = input(500, ...(ngDevMode ? [{
625
+ debugName: "typeaheadDelay"
626
+ }] : []));
627
+ disabled = input(false, {
628
+ ...(ngDevMode ? {
629
+ debugName: "disabled"
630
+ } : {}),
631
+ transform: booleanAttribute
668
632
  });
669
- parent = this._menu ?? this._menuBar;
670
- submenu = input(undefined, ...(ngDevMode ? [{
671
- debugName: "submenu"
633
+ parent = signal(undefined, ...(ngDevMode ? [{
634
+ debugName: "parent"
672
635
  }] : []));
673
- active = computed(() => this._pattern.active(), ...(ngDevMode ? [{
674
- debugName: "active"
636
+ _pattern;
637
+ _itemPatterns = () => this._items().map(i => i._pattern);
638
+ visible = computed(() => this._pattern.visible(), ...(ngDevMode ? [{
639
+ debugName: "visible"
675
640
  }] : []));
676
- expanded = computed(() => this._pattern.expanded(), ...(ngDevMode ? [{
677
- debugName: "expanded"
641
+ tabIndex = computed(() => this._pattern.tabIndex(), ...(ngDevMode ? [{
642
+ debugName: "tabIndex"
678
643
  }] : []));
679
- hasPopup = computed(() => this._pattern.hasPopup(), ...(ngDevMode ? [{
680
- debugName: "hasPopup"
644
+ onSelect = output();
645
+ expansionDelay = input(100, ...(ngDevMode ? [{
646
+ debugName: "expansionDelay"
681
647
  }] : []));
682
- _pattern = new MenuItemPattern({
683
- id: this.id,
684
- value: this.value,
685
- element: computed(() => this._elementRef.nativeElement),
686
- disabled: this.disabled,
687
- searchTerm: this.searchTerm,
688
- parent: computed(() => this.parent?._pattern),
689
- submenu: computed(() => this.submenu()?._pattern)
690
- });
691
648
  constructor() {
692
- effect(() => this.submenu()?.parent.set(this));
693
- }
694
- open() {
695
- this._pattern.open({
696
- first: true
649
+ this._pattern = new MenuPattern({
650
+ ...this,
651
+ parent: computed(() => this.parent()?._pattern),
652
+ items: this._itemPatterns,
653
+ multi: () => false,
654
+ softDisabled: () => true,
655
+ focusMode: () => 'roving',
656
+ orientation: () => 'vertical',
657
+ selectionMode: () => 'explicit',
658
+ activeItem: signal(undefined),
659
+ element: computed(() => this._elementRef.nativeElement),
660
+ onSelect: value => this.onSelect.emit(value)
661
+ });
662
+ afterRenderEffect(() => {
663
+ const parent = this.parent();
664
+ if (parent instanceof MenuItem && parent.parent instanceof MenuBar) {
665
+ this._deferredContentAware?.contentVisible.set(true);
666
+ } else {
667
+ this._deferredContentAware?.contentVisible.set(this._pattern.visible() || !!this.parent()?._pattern.hasBeenFocused());
668
+ }
669
+ });
670
+ afterRenderEffect(() => {
671
+ if (this._pattern.visible()) {
672
+ const activeItem = untracked(() => this._pattern.inputs.activeItem());
673
+ this._pattern.listBehavior.goto(activeItem);
674
+ }
675
+ });
676
+ afterRenderEffect(() => {
677
+ if (!this._pattern.hasBeenFocused() && !this._pattern.hasBeenHovered() && this._items().length) {
678
+ untracked(() => this._pattern.setDefaultState());
679
+ }
697
680
  });
698
681
  }
699
682
  close() {
@@ -701,18 +684,18 @@ class MenuItem {
701
684
  }
702
685
  static ɵfac = i0.ɵɵngDeclareFactory({
703
686
  minVersion: "12.0.0",
704
- version: "21.0.0",
687
+ version: "21.0.3",
705
688
  ngImport: i0,
706
- type: MenuItem,
689
+ type: Menu,
707
690
  deps: [],
708
691
  target: i0.ɵɵFactoryTarget.Directive
709
692
  });
710
693
  static ɵdir = i0.ɵɵngDeclareDirective({
711
- minVersion: "17.1.0",
712
- version: "21.0.0",
713
- type: MenuItem,
694
+ minVersion: "17.2.0",
695
+ version: "21.0.3",
696
+ type: Menu,
714
697
  isStandalone: true,
715
- selector: "[ngMenuItem]",
698
+ selector: "[ngMenu]",
716
699
  inputs: {
717
700
  id: {
718
701
  classPropertyName: "id",
@@ -721,82 +704,119 @@ class MenuItem {
721
704
  isRequired: false,
722
705
  transformFunction: null
723
706
  },
724
- value: {
725
- classPropertyName: "value",
726
- publicName: "value",
707
+ wrap: {
708
+ classPropertyName: "wrap",
709
+ publicName: "wrap",
727
710
  isSignal: true,
728
- isRequired: true,
711
+ isRequired: false,
729
712
  transformFunction: null
730
713
  },
731
- disabled: {
732
- classPropertyName: "disabled",
733
- publicName: "disabled",
714
+ typeaheadDelay: {
715
+ classPropertyName: "typeaheadDelay",
716
+ publicName: "typeaheadDelay",
734
717
  isSignal: true,
735
718
  isRequired: false,
736
719
  transformFunction: null
737
720
  },
738
- searchTerm: {
739
- classPropertyName: "searchTerm",
740
- publicName: "searchTerm",
721
+ disabled: {
722
+ classPropertyName: "disabled",
723
+ publicName: "disabled",
741
724
  isSignal: true,
742
725
  isRequired: false,
743
726
  transformFunction: null
744
727
  },
745
- submenu: {
746
- classPropertyName: "submenu",
747
- publicName: "submenu",
728
+ expansionDelay: {
729
+ classPropertyName: "expansionDelay",
730
+ publicName: "expansionDelay",
748
731
  isSignal: true,
749
732
  isRequired: false,
750
733
  transformFunction: null
751
734
  }
752
735
  },
753
736
  outputs: {
754
- searchTerm: "searchTermChange"
737
+ onSelect: "onSelect"
755
738
  },
756
739
  host: {
757
740
  attributes: {
758
- "role": "menuitem"
741
+ "role": "menu"
759
742
  },
760
743
  listeners: {
761
- "focusin": "_pattern.onFocusIn()"
744
+ "keydown": "_pattern.onKeydown($event)",
745
+ "mouseover": "_pattern.onMouseOver($event)",
746
+ "mouseout": "_pattern.onMouseOut($event)",
747
+ "focusout": "_pattern.onFocusOut($event)",
748
+ "focusin": "_pattern.onFocusIn()",
749
+ "click": "_pattern.onClick($event)"
762
750
  },
763
751
  properties: {
764
- "attr.tabindex": "_pattern.tabIndex()",
765
- "attr.data-active": "active()",
766
- "attr.aria-haspopup": "hasPopup()",
767
- "attr.aria-expanded": "expanded()",
752
+ "attr.id": "_pattern.id()",
768
753
  "attr.aria-disabled": "_pattern.disabled()",
769
- "attr.aria-controls": "_pattern.submenu()?.id()"
754
+ "attr.tabindex": "tabIndex()",
755
+ "attr.data-visible": "visible()"
770
756
  }
771
757
  },
772
- exportAs: ["ngMenuItem"],
758
+ providers: [{
759
+ provide: MENU_COMPONENT,
760
+ useExisting: Menu
761
+ }],
762
+ queries: [{
763
+ propertyName: "_allItems",
764
+ predicate: MenuItem,
765
+ descendants: true,
766
+ isSignal: true
767
+ }],
768
+ exportAs: ["ngMenu"],
769
+ hostDirectives: [{
770
+ directive: DeferredContentAware,
771
+ inputs: ["preserveContent", "preserveContent"]
772
+ }],
773
773
  ngImport: i0
774
774
  });
775
775
  }
776
776
  i0.ɵɵngDeclareClassMetadata({
777
777
  minVersion: "12.0.0",
778
- version: "21.0.0",
778
+ version: "21.0.3",
779
779
  ngImport: i0,
780
- type: MenuItem,
780
+ type: Menu,
781
781
  decorators: [{
782
782
  type: Directive,
783
783
  args: [{
784
- selector: '[ngMenuItem]',
785
- exportAs: 'ngMenuItem',
784
+ selector: '[ngMenu]',
785
+ exportAs: 'ngMenu',
786
786
  host: {
787
- 'role': 'menuitem',
788
- '(focusin)': '_pattern.onFocusIn()',
789
- '[attr.tabindex]': '_pattern.tabIndex()',
790
- '[attr.data-active]': 'active()',
791
- '[attr.aria-haspopup]': 'hasPopup()',
792
- '[attr.aria-expanded]': 'expanded()',
787
+ 'role': 'menu',
788
+ '[attr.id]': '_pattern.id()',
793
789
  '[attr.aria-disabled]': '_pattern.disabled()',
794
- '[attr.aria-controls]': '_pattern.submenu()?.id()'
795
- }
790
+ '[attr.tabindex]': 'tabIndex()',
791
+ '[attr.data-visible]': 'visible()',
792
+ '(keydown)': '_pattern.onKeydown($event)',
793
+ '(mouseover)': '_pattern.onMouseOver($event)',
794
+ '(mouseout)': '_pattern.onMouseOut($event)',
795
+ '(focusout)': '_pattern.onFocusOut($event)',
796
+ '(focusin)': '_pattern.onFocusIn()',
797
+ '(click)': '_pattern.onClick($event)'
798
+ },
799
+ hostDirectives: [{
800
+ directive: DeferredContentAware,
801
+ inputs: ['preserveContent']
802
+ }],
803
+ providers: [{
804
+ provide: MENU_COMPONENT,
805
+ useExisting: Menu
806
+ }]
796
807
  }]
797
808
  }],
798
809
  ctorParameters: () => [],
799
810
  propDecorators: {
811
+ _allItems: [{
812
+ type: i0.ContentChildren,
813
+ args: [i0.forwardRef(() => MenuItem), {
814
+ ...{
815
+ descendants: true
816
+ },
817
+ isSignal: true
818
+ }]
819
+ }],
800
820
  id: [{
801
821
  type: i0.Input,
802
822
  args: [{
@@ -805,47 +825,49 @@ i0.ɵɵngDeclareClassMetadata({
805
825
  required: false
806
826
  }]
807
827
  }],
808
- value: [{
828
+ wrap: [{
809
829
  type: i0.Input,
810
830
  args: [{
811
831
  isSignal: true,
812
- alias: "value",
813
- required: true
832
+ alias: "wrap",
833
+ required: false
814
834
  }]
815
835
  }],
816
- disabled: [{
836
+ typeaheadDelay: [{
817
837
  type: i0.Input,
818
838
  args: [{
819
839
  isSignal: true,
820
- alias: "disabled",
840
+ alias: "typeaheadDelay",
821
841
  required: false
822
842
  }]
823
843
  }],
824
- searchTerm: [{
844
+ disabled: [{
825
845
  type: i0.Input,
826
846
  args: [{
827
847
  isSignal: true,
828
- alias: "searchTerm",
848
+ alias: "disabled",
829
849
  required: false
830
850
  }]
831
- }, {
851
+ }],
852
+ onSelect: [{
832
853
  type: i0.Output,
833
- args: ["searchTermChange"]
854
+ args: ["onSelect"]
834
855
  }],
835
- submenu: [{
856
+ expansionDelay: [{
836
857
  type: i0.Input,
837
858
  args: [{
838
859
  isSignal: true,
839
- alias: "submenu",
860
+ alias: "expansionDelay",
840
861
  required: false
841
862
  }]
842
863
  }]
843
864
  }
844
865
  });
866
+
845
867
  class MenuContent {
846
868
  static ɵfac = i0.ɵɵngDeclareFactory({
847
869
  minVersion: "12.0.0",
848
- version: "21.0.0",
870
+ version: "21.0.3",
849
871
  ngImport: i0,
850
872
  type: MenuContent,
851
873
  deps: [],
@@ -853,20 +875,20 @@ class MenuContent {
853
875
  });
854
876
  static ɵdir = i0.ɵɵngDeclareDirective({
855
877
  minVersion: "14.0.0",
856
- version: "21.0.0",
878
+ version: "21.0.3",
857
879
  type: MenuContent,
858
880
  isStandalone: true,
859
881
  selector: "ng-template[ngMenuContent]",
860
882
  exportAs: ["ngMenuContent"],
861
883
  hostDirectives: [{
862
- directive: i1.DeferredContent
884
+ directive: DeferredContent
863
885
  }],
864
886
  ngImport: i0
865
887
  });
866
888
  }
867
889
  i0.ɵɵngDeclareClassMetadata({
868
890
  minVersion: "12.0.0",
869
- version: "21.0.0",
891
+ version: "21.0.3",
870
892
  ngImport: i0,
871
893
  type: MenuContent,
872
894
  decorators: [{
@@ -879,5 +901,5 @@ i0.ɵɵngDeclareClassMetadata({
879
901
  }]
880
902
  });
881
903
 
882
- export { Menu, MenuBar, MenuContent, MenuItem, MenuTrigger };
904
+ export { Menu, MenuBar, MenuContent, MenuItem, MenuTrigger, DeferredContent as ɵɵDeferredContent, DeferredContentAware as ɵɵDeferredContentAware };
883
905
  //# sourceMappingURL=menu.mjs.map