Skip to content

Commit a2519f7

Browse files
tjshiuok7sai
andauthored
refactor(aria/combobox) Add examples (angular#32857)
* refactor(aria/combobox): alt approach WIP * refactor(aria/combobox): add grid and datepicker simple-combobox examples * refactor(aria/combobox): change grid tabIndex input to tabbable boolean * refactor(aria/combobox): refine grid state reset logic with dual-axis clamping and add tests * refactor(aria/tree): slight improvements to tree example * refactor(multiple): add comprehensive simple-combobox examples and refine behavior - Adds new examples for simple-combobox: auto-select, highlight, disabled, readonly, and dialog popups. - Refactors existing datepicker and grid examples for better interaction patterns. - Introduces alwaysExpanded input to SimpleCombobox for persistent popup states. - Refines selection behavior in ListboxPattern when followFocus is enabled. - Cleans up unused inline-suggestion examples and console logs. * refactor(multiple): add tabbable input to listbox and tree patterns - Introduces a 'tabbable' input to Listbox and Tree to control whether the widget or its items are in the tab order. - Updates ListFocus and Tree behaviors to respect the 'tabbable' signal, defaulting tabIndex to -1 when false. - Updates simple-combobox examples to set [tabbable]="false" on internal widgets to ensure correct focus behavior. - Includes unit tests for the new tabbable behavior in ListFocus and Tree. * refactor(multiple): add simple-combobox unit tests and refine interaction logic - Adds extensive unit tests for SimpleCombobox across Listbox, Tree, and Grid implementations. - Refines aria-autocomplete calculation to exclude dialog-type popups, as they do not support autocomplete behavior. - Switches SimpleCombobox from pointerdown to click for popup triggering to improve interaction consistency. - Fixes ListFocus to properly focus the host element when using activedescendant mode. - Updates GridPattern to prevent resetting its default active state once a user has already interacted with it. - Moves alwaysExpanded initialization to ngOnInit in the public Combobox component for better lifecycle management. - Improves simple-combobox-highlight example to handle disabled states. * build(multiple): update goldens * test: use mutation observer for more reliable simple-combobox tests * refactor(aria/combobox): use computed signal for simple-combobox expanded state * refactor(aria/combobox): use input signal for active descendant tracking * refactor(multiple): replace tabbable with tabIndex in aria components * refactor(multiple): avoid focusing list element in activedescendant mode * refactor(multiple): use output for grid cell activation Replaced manual clicks with an activated output on GridCell and updated examples. Also cleaned up an unused input that snuck in from a bad rebase. * refactor(aria/combobox): split files to avoid circular dependencies --------- Co-authored-by: Cheng-Hsuan Tsai <webcat@google.com>
1 parent fccc2ef commit a2519f7

73 files changed

Lines changed: 5472 additions & 34 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

goldens/aria/grid/index.api.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import * as _angular_cdk_bidi from '@angular/cdk/bidi';
88
import * as _angular_core from '@angular/core';
99
import { ElementRef } from '@angular/core';
10+
import { EventEmitter } from '@angular/core';
1011
import { Signal } from '@angular/core';
1112

1213
// @public
1314
export class Grid {
1415
constructor();
16+
readonly activeDescendant: Signal<string | undefined>;
1517
readonly colWrap: _angular_core.InputSignal<"continuous" | "loop" | "nowrap">;
1618
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1719
readonly element: HTMLElement;
@@ -20,18 +22,21 @@ export class Grid {
2022
readonly multi: _angular_core.InputSignalWithTransform<boolean, unknown>;
2123
readonly _pattern: GridPattern;
2224
readonly rowWrap: _angular_core.InputSignal<"continuous" | "loop" | "nowrap">;
25+
scrollActiveCellIntoView(options?: ScrollIntoViewOptions): void;
2326
readonly selectionMode: _angular_core.InputSignal<"follow" | "explicit">;
2427
readonly softDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
28+
readonly tabIndex: _angular_core.InputSignalWithTransform<number | undefined, string | number | undefined>;
2529
readonly textDirection: _angular_core.WritableSignal<_angular_cdk_bidi.Direction>;
2630
// (undocumented)
27-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Grid, "[ngGrid]", ["ngGrid"], { "enableSelection": { "alias": "enableSelection"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "focusMode": { "alias": "focusMode"; "required": false; "isSignal": true; }; "rowWrap": { "alias": "rowWrap"; "required": false; "isSignal": true; }; "colWrap": { "alias": "colWrap"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; }, {}, ["_rows"], never, true, never>;
31+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Grid, "[ngGrid]", ["ngGrid"], { "enableSelection": { "alias": "enableSelection"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "focusMode": { "alias": "focusMode"; "required": false; "isSignal": true; }; "rowWrap": { "alias": "rowWrap"; "required": false; "isSignal": true; }; "colWrap": { "alias": "colWrap"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; }, {}, ["_rows"], never, true, never>;
2832
// (undocumented)
2933
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Grid, never>;
3034
}
3135

3236
// @public
3337
export class GridCell {
3438
constructor();
39+
readonly activated: EventEmitter<KeyboardEvent>;
3540
readonly active: Signal<boolean>;
3641
readonly colIndex: _angular_core.InputSignal<number | undefined>;
3742
readonly colSpan: _angular_core.InputSignal<number>;
@@ -48,7 +53,7 @@ export class GridCell {
4853
readonly tabindex: _angular_core.InputSignal<number | undefined>;
4954
readonly textDirection: _angular_core.WritableSignal<_angular_cdk_bidi.Direction>;
5055
// (undocumented)
51-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<GridCell, "[ngGridCell]", ["ngGridCell"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "rowSpan": { "alias": "rowSpan"; "required": false; "isSignal": true; }; "colSpan": { "alias": "colSpan"; "required": false; "isSignal": true; }; "rowIndex": { "alias": "rowIndex"; "required": false; "isSignal": true; }; "colIndex": { "alias": "colIndex"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "tabindex": { "alias": "tabindex"; "required": false; "isSignal": true; }; }, { "selected": "selectedChange"; }, ["_widget"], never, true, never>;
56+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<GridCell, "[ngGridCell]", ["ngGridCell"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "rowSpan": { "alias": "rowSpan"; "required": false; "isSignal": true; }; "colSpan": { "alias": "colSpan"; "required": false; "isSignal": true; }; "rowIndex": { "alias": "rowIndex"; "required": false; "isSignal": true; }; "colIndex": { "alias": "colIndex"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "tabindex": { "alias": "tabindex"; "required": false; "isSignal": true; }; }, { "activated": "activated"; "selected": "selectedChange"; }, ["_widget"], never, true, never>;
5257
// (undocumented)
5358
static ɵfac: _angular_core.ɵɵFactoryDeclaration<GridCell, never>;
5459
}

goldens/aria/listbox/index.api.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@
66

77
import * as _angular_cdk_bidi from '@angular/cdk/bidi';
88
import * as _angular_core from '@angular/core';
9+
import { Signal } from '@angular/core';
910

1011
// @public
1112
export class Listbox<V> {
1213
constructor();
14+
readonly activeDescendant: Signal<string | undefined>;
1315
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1416
readonly element: HTMLElement;
1517
readonly focusMode: _angular_core.InputSignal<"roving" | "activedescendant">;
1618
gotoFirst(): void;
1719
readonly id: _angular_core.InputSignal<string>;
18-
protected readonly items: _angular_core.Signal<OptionPattern<V>[]>;
20+
protected readonly items: Signal<OptionPattern<V>[]>;
1921
readonly multi: _angular_core.InputSignalWithTransform<boolean, unknown>;
2022
readonly orientation: _angular_core.InputSignal<"vertical" | "horizontal">;
2123
readonly _pattern: ListboxPattern<V>;
@@ -24,12 +26,13 @@ export class Listbox<V> {
2426
scrollActiveItemIntoView(options?: ScrollIntoViewOptions): void;
2527
readonly selectionMode: _angular_core.InputSignal<"follow" | "explicit">;
2628
readonly softDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
27-
protected readonly textDirection: _angular_core.Signal<_angular_cdk_bidi.Direction>;
29+
readonly tabIndex: _angular_core.InputSignalWithTransform<number | undefined, string | number | undefined>;
30+
protected readonly textDirection: Signal<_angular_cdk_bidi.Direction>;
2831
readonly typeaheadDelay: _angular_core.InputSignal<number>;
2932
readonly value: _angular_core.ModelSignal<V[]>;
3033
readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
3134
// (undocumented)
32-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Listbox<any>, "[ngListbox]", ["ngListbox"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "focusMode": { "alias": "focusMode"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "typeaheadDelay": { "alias": "typeaheadDelay"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["_options"], never, true, [{ directive: typeof ComboboxPopup; inputs: {}; outputs: {}; }]>;
35+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Listbox<any>, "[ngListbox]", ["ngListbox"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "focusMode": { "alias": "focusMode"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "typeaheadDelay": { "alias": "typeaheadDelay"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, ["_options"], never, true, [{ directive: typeof ComboboxPopup; inputs: {}; outputs: {}; }]>;
3336
// (undocumented)
3437
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Listbox<any>, never>;
3538
}

goldens/aria/private/index.api.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ export interface GridCellInputs extends GridCell {
300300
colIndex: SignalLike<number | undefined>;
301301
getWidget: (e: Element | null) => GridCellWidgetPattern | undefined;
302302
grid: SignalLike<GridPattern>;
303+
onActivate?: (event: KeyboardEvent) => void;
303304
row: SignalLike<GridRowPattern>;
304305
rowIndex: SignalLike<number | undefined>;
305306
widget: SignalLike<GridCellWidgetPattern | undefined>;
@@ -663,6 +664,68 @@ export function signal<T>(initialValue: T): WritableSignalLike<T>;
663664
// @public (undocumented)
664665
export type SignalLike<T> = () => T;
665666

667+
// @public
668+
export interface SimpleComboboxInputs extends ExpansionItem {
669+
alwaysExpanded: SignalLike<boolean>;
670+
disabled: SignalLike<boolean>;
671+
element: SignalLike<HTMLElement>;
672+
inlineSuggestion: SignalLike<string | undefined>;
673+
popup: SignalLike<SimpleComboboxPopupPattern | undefined>;
674+
value: WritableSignalLike<string>;
675+
}
676+
677+
// @public
678+
export class SimpleComboboxPattern {
679+
constructor(inputs: SimpleComboboxInputs);
680+
readonly activeDescendant: _angular_core.Signal<string | undefined>;
681+
readonly autocomplete: _angular_core.Signal<"none" | "inline" | "list" | "both">;
682+
click: _angular_core.Signal<ClickEventManager<PointerEvent>>;
683+
closePopupOnBlurEffect(): void;
684+
readonly disabled: () => boolean;
685+
readonly element: () => HTMLElement;
686+
highlightEffect(): void;
687+
readonly inlineSuggestion: () => string | undefined;
688+
// (undocumented)
689+
readonly inputs: SimpleComboboxInputs;
690+
readonly isDeleting: _angular_core.WritableSignal<boolean>;
691+
readonly isEditable: _angular_core.Signal<boolean>;
692+
readonly isExpanded: _angular_core.Signal<boolean>;
693+
readonly isFocused: _angular_core.WritableSignal<boolean>;
694+
readonly keyboardEventRelay: _angular_core.WritableSignal<KeyboardEvent | undefined>;
695+
keyboardEventRelayEffect(): void;
696+
keydown: _angular_core.Signal<KeyboardEventManager<KeyboardEvent>>;
697+
onClick(event: PointerEvent): void;
698+
onFocusin(): void;
699+
onFocusout(event: FocusEvent): void;
700+
onInput(event: Event): void;
701+
onKeydown(event: KeyboardEvent): void;
702+
readonly popupId: _angular_core.Signal<string | undefined>;
703+
readonly popupType: _angular_core.Signal<"listbox" | "tree" | "grid" | "dialog" | undefined>;
704+
readonly value: WritableSignalLike<string>;
705+
}
706+
707+
// @public
708+
export interface SimpleComboboxPopupInputs {
709+
activeDescendant: SignalLike<string | undefined>;
710+
controlTarget: SignalLike<HTMLElement | undefined>;
711+
popupId: SignalLike<string | undefined>;
712+
popupType: SignalLike<'listbox' | 'tree' | 'grid' | 'dialog'>;
713+
}
714+
715+
// @public
716+
export class SimpleComboboxPopupPattern {
717+
constructor(inputs: SimpleComboboxPopupInputs);
718+
readonly activeDescendant: () => string | undefined;
719+
readonly controlTarget: () => HTMLElement | undefined;
720+
// (undocumented)
721+
readonly inputs: SimpleComboboxPopupInputs;
722+
readonly isFocused: _angular_core.WritableSignal<boolean>;
723+
onFocusin(): void;
724+
onFocusout(event: FocusEvent): void;
725+
readonly popupId: () => string | undefined;
726+
readonly popupType: () => "listbox" | "tree" | "grid" | "dialog";
727+
}
728+
666729
// @public
667730
export function sortDirectives(a: HasElement, b: HasElement): 1 | -1;
668731

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
## API Report File for "@angular/aria_simple-combobox"
2+
3+
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4+
5+
```ts
6+
7+
import * as _angular_core from '@angular/core';
8+
import { DeferredContentAware } from '@angular/aria/private';
9+
import * as i1 from '@angular/aria/private';
10+
import { OnDestroy } from '@angular/core';
11+
import { OnInit } from '@angular/core';
12+
import { SimpleComboboxPattern } from '@angular/aria/private';
13+
import { SimpleComboboxPopupPattern } from '@angular/aria/private';
14+
15+
// @public
16+
export class Combobox extends DeferredContentAware implements OnInit {
17+
constructor();
18+
readonly alwaysExpanded: _angular_core.InputSignalWithTransform<boolean, unknown>;
19+
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
20+
readonly element: HTMLElement;
21+
readonly expanded: _angular_core.ModelSignal<boolean>;
22+
readonly inlineSuggestion: _angular_core.InputSignal<string | undefined>;
23+
// (undocumented)
24+
ngOnInit(): void;
25+
readonly _pattern: SimpleComboboxPattern;
26+
readonly _popup: _angular_core.WritableSignal<ComboboxPopup | undefined>;
27+
_registerPopup(popup: ComboboxPopup): void;
28+
_unregisterPopup(): void;
29+
readonly value: _angular_core.ModelSignal<string>;
30+
// (undocumented)
31+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Combobox, "[ngCombobox]", ["ngCombobox"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "alwaysExpanded": { "alias": "alwaysExpanded"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "inlineSuggestion": { "alias": "inlineSuggestion"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; "value": "valueChange"; }, never, never, true, never>;
32+
// (undocumented)
33+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Combobox, never>;
34+
}
35+
36+
// @public
37+
export class ComboboxPopup implements OnInit, OnDestroy {
38+
readonly activeDescendant: _angular_core.Signal<string | undefined>;
39+
readonly combobox: _angular_core.InputSignal<Combobox>;
40+
readonly controlTarget: _angular_core.Signal<HTMLElement | undefined>;
41+
// (undocumented)
42+
ngOnDestroy(): void;
43+
// (undocumented)
44+
ngOnInit(): void;
45+
readonly _pattern: SimpleComboboxPopupPattern;
46+
readonly popupId: _angular_core.Signal<string | undefined>;
47+
readonly popupType: _angular_core.InputSignal<"listbox" | "tree" | "grid" | "dialog">;
48+
_registerWidget(widget: ComboboxWidget): void;
49+
_unregisterWidget(): void;
50+
readonly _widget: _angular_core.WritableSignal<ComboboxWidget | undefined>;
51+
// (undocumented)
52+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxPopup, "ng-template[ngComboboxPopup]", ["ngComboboxPopup"], { "combobox": { "alias": "combobox"; "required": true; "isSignal": true; }; "popupType": { "alias": "popupType"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.DeferredContent; inputs: {}; outputs: {}; }]>;
53+
// (undocumented)
54+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxPopup, never>;
55+
}
56+
57+
// @public
58+
export class ComboboxWidget implements OnInit, OnDestroy {
59+
constructor();
60+
readonly activeDescendant: _angular_core.InputSignal<string | undefined>;
61+
readonly element: HTMLElement;
62+
// (undocumented)
63+
ngOnDestroy(): void;
64+
// (undocumented)
65+
ngOnInit(): void;
66+
onFocusin(): void;
67+
onFocusout(event: FocusEvent): void;
68+
readonly popupId: _angular_core.WritableSignal<string | undefined>;
69+
// (undocumented)
70+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ComboboxWidget, "[ngComboboxWidget]", ["ngComboboxWidget"], { "activeDescendant": { "alias": "activeDescendant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
71+
// (undocumented)
72+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxWidget, never>;
73+
}
74+
75+
// (No @packageDocumentation comment for this package)
76+
77+
```

goldens/aria/tree/index.api.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { Signal } from '@angular/core';
1313
// @public
1414
export class Tree<V> {
1515
constructor();
16+
readonly activeDescendant: Signal<string | undefined>;
1617
readonly currentType: _angular_core.InputSignal<"page" | "step" | "location" | "date" | "time" | "true" | "false">;
1718
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1819
readonly element: HTMLElement;
@@ -28,14 +29,15 @@ export class Tree<V> {
2829
scrollActiveItemIntoView(options?: ScrollIntoViewOptions): void;
2930
readonly selectionMode: _angular_core.InputSignal<"follow" | "explicit">;
3031
readonly softDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
32+
readonly tabIndex: _angular_core.InputSignalWithTransform<number | undefined, string | number | undefined>;
3133
readonly textDirection: _angular_core.WritableSignal<_angular_cdk_bidi.Direction>;
3234
readonly typeaheadDelay: _angular_core.InputSignal<number>;
3335
// (undocumented)
3436
_unregister(child: TreeItem<V>): void;
3537
readonly value: _angular_core.ModelSignal<V[]>;
3638
readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
3739
// (undocumented)
38-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Tree<any>, "[ngTree]", ["ngTree"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "focusMode": { "alias": "focusMode"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "typeaheadDelay": { "alias": "typeaheadDelay"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "nav": { "alias": "nav"; "required": false; "isSignal": true; }; "currentType": { "alias": "currentType"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, [{ directive: typeof ComboboxPopup; inputs: {}; outputs: {}; }]>;
40+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Tree<any>, "[ngTree]", ["ngTree"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "focusMode": { "alias": "focusMode"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "typeaheadDelay": { "alias": "typeaheadDelay"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "nav": { "alias": "nav"; "required": false; "isSignal": true; }; "currentType": { "alias": "currentType"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, [{ directive: typeof ComboboxPopup; inputs: {}; outputs: {}; }]>;
3941
// (undocumented)
4042
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Tree<any>, never>;
4143
}

0 commit comments

Comments
 (0)