@angular/aria 21.0.0-next.9 → 21.0.0-rc.1
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.
- package/_adev_assets/aria-accordion.json +373 -0
- package/_adev_assets/aria-combobox.json +383 -0
- package/_adev_assets/aria-grid.json +647 -0
- package/_adev_assets/aria-listbox.json +511 -0
- package/_adev_assets/aria-menu.json +852 -0
- package/_adev_assets/aria-tabs.json +987 -0
- package/_adev_assets/aria-toolbar.json +696 -0
- package/_adev_assets/aria-tree.json +1071 -0
- package/fesm2022/_widget-chunk.mjs +949 -0
- package/fesm2022/_widget-chunk.mjs.map +1 -0
- package/fesm2022/accordion.mjs +372 -174
- package/fesm2022/accordion.mjs.map +1 -1
- package/fesm2022/aria.mjs +1 -2
- package/fesm2022/aria.mjs.map +1 -1
- package/fesm2022/combobox.mjs +308 -116
- package/fesm2022/combobox.mjs.map +1 -1
- package/fesm2022/grid.mjs +566 -0
- package/fesm2022/grid.mjs.map +1 -0
- package/fesm2022/listbox.mjs +384 -184
- package/fesm2022/listbox.mjs.map +1 -1
- package/fesm2022/menu.mjs +591 -0
- package/fesm2022/menu.mjs.map +1 -0
- package/fesm2022/private.mjs +2338 -0
- package/fesm2022/private.mjs.map +1 -0
- package/fesm2022/tabs.mjs +484 -276
- package/fesm2022/tabs.mjs.map +1 -1
- package/fesm2022/toolbar.mjs +366 -200
- package/fesm2022/toolbar.mjs.map +1 -1
- package/fesm2022/tree.mjs +515 -267
- package/fesm2022/tree.mjs.map +1 -1
- package/package.json +12 -12
- package/types/_grid-chunk.d.ts +608 -0
- package/types/accordion.d.ts +8 -8
- package/types/combobox.d.ts +20 -7
- package/types/grid.d.ts +120 -0
- package/types/listbox.d.ts +9 -7
- package/types/menu.d.ts +170 -0
- package/types/{ui-patterns.d.ts → private.d.ts} +555 -433
- package/types/tabs.d.ts +8 -8
- package/types/toolbar.d.ts +31 -28
- package/types/tree.d.ts +11 -9
- package/fesm2022/deferred-content.mjs +0 -60
- package/fesm2022/deferred-content.mjs.map +0 -1
- package/fesm2022/radio-group.mjs +0 -197
- package/fesm2022/radio-group.mjs.map +0 -1
- package/fesm2022/ui-patterns.mjs +0 -2504
- package/fesm2022/ui-patterns.mjs.map +0 -1
- package/types/deferred-content.d.ts +0 -38
- package/types/radio-group.d.ts +0 -82
package/types/tabs.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { Signal, OnInit, OnDestroy } from '@angular/core';
|
|
3
3
|
import * as _angular_cdk_bidi from '@angular/cdk/bidi';
|
|
4
|
-
import
|
|
5
|
-
import
|
|
4
|
+
import * as i1 from '@angular/aria/private';
|
|
5
|
+
import { TabPattern, TabPanelPattern, TabListPattern } from '@angular/aria/private';
|
|
6
6
|
|
|
7
7
|
interface HasElement {
|
|
8
8
|
element: Signal<HTMLElement>;
|
|
@@ -68,8 +68,8 @@ declare class TabList implements OnInit, OnDestroy {
|
|
|
68
68
|
readonly orientation: _angular_core.InputSignal<"vertical" | "horizontal">;
|
|
69
69
|
/** Whether focus should wrap when navigating. */
|
|
70
70
|
readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
71
|
-
/** Whether disabled items
|
|
72
|
-
readonly
|
|
71
|
+
/** Whether to allow disabled items to receive focus. */
|
|
72
|
+
readonly softDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
73
73
|
/** The focus strategy used by the tablist. */
|
|
74
74
|
readonly focusMode: _angular_core.InputSignal<"roving" | "activedescendant">;
|
|
75
75
|
/** The selection strategy used by the tablist. */
|
|
@@ -79,7 +79,7 @@ declare class TabList implements OnInit, OnDestroy {
|
|
|
79
79
|
/** The current selected tab. */
|
|
80
80
|
readonly selectedTab: _angular_core.ModelSignal<string | undefined>;
|
|
81
81
|
/** The TabList UIPattern. */
|
|
82
|
-
readonly
|
|
82
|
+
readonly _pattern: TabListPattern;
|
|
83
83
|
/** Whether the tree has received focus yet. */
|
|
84
84
|
private _hasFocused;
|
|
85
85
|
constructor();
|
|
@@ -89,7 +89,7 @@ declare class TabList implements OnInit, OnDestroy {
|
|
|
89
89
|
register(child: Tab): void;
|
|
90
90
|
deregister(child: Tab): void;
|
|
91
91
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TabList, never>;
|
|
92
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TabList, "[ngTabList]", ["ngTabList"], { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; "
|
|
92
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TabList, "[ngTabList]", ["ngTabList"], { "orientation": { "alias": "orientation"; "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; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selectedTab": { "alias": "selectedTab"; "required": false; "isSignal": true; }; }, { "selectedTab": "selectedTabChange"; }, never, never, true, never>;
|
|
93
93
|
}
|
|
94
94
|
/** A selectable tab in a TabList. */
|
|
95
95
|
declare class Tab implements HasElement, OnInit, OnDestroy {
|
|
@@ -112,7 +112,7 @@ declare class Tab implements HasElement, OnInit, OnDestroy {
|
|
|
112
112
|
/** A local unique identifier for the tab. */
|
|
113
113
|
readonly value: _angular_core.InputSignal<string>;
|
|
114
114
|
/** The Tab UIPattern. */
|
|
115
|
-
readonly
|
|
115
|
+
readonly _pattern: TabPattern;
|
|
116
116
|
ngOnInit(): void;
|
|
117
117
|
ngOnDestroy(): void;
|
|
118
118
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Tab, never>;
|
|
@@ -138,7 +138,7 @@ declare class TabPanel implements OnInit, OnDestroy {
|
|
|
138
138
|
/** A local unique identifier for the tabpanel. */
|
|
139
139
|
readonly value: _angular_core.InputSignal<string>;
|
|
140
140
|
/** The TabPanel UIPattern. */
|
|
141
|
-
readonly
|
|
141
|
+
readonly _pattern: TabPanelPattern;
|
|
142
142
|
constructor();
|
|
143
143
|
ngOnInit(): void;
|
|
144
144
|
ngOnDestroy(): void;
|
package/types/toolbar.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { Signal, OnInit, OnDestroy } from '@angular/core';
|
|
3
3
|
import * as _angular_cdk_bidi from '@angular/cdk/bidi';
|
|
4
|
-
import { ToolbarWidgetPattern,
|
|
4
|
+
import { ToolbarWidgetPattern, ToolbarPattern, SignalLike, ToolbarWidgetGroupPattern } from '@angular/aria/private';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* A toolbar widget container.
|
|
@@ -26,30 +26,30 @@ declare class Toolbar<V> {
|
|
|
26
26
|
private readonly _elementRef;
|
|
27
27
|
/** The TabList nested inside of the container. */
|
|
28
28
|
private readonly _widgets;
|
|
29
|
-
/**
|
|
29
|
+
/** Text direction. */
|
|
30
30
|
readonly textDirection: _angular_core.WritableSignal<_angular_cdk_bidi.Direction>;
|
|
31
31
|
/** Sorted UIPatterns of the child widgets */
|
|
32
|
-
readonly items: Signal<
|
|
32
|
+
readonly items: Signal<ToolbarWidgetPattern<V>[]>;
|
|
33
33
|
/** Whether the toolbar is vertically or horizontally oriented. */
|
|
34
34
|
readonly orientation: _angular_core.InputSignal<"vertical" | "horizontal">;
|
|
35
|
-
/** Whether disabled items
|
|
36
|
-
|
|
35
|
+
/** Whether to allow disabled items to receive focus. */
|
|
36
|
+
softDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
37
37
|
/** Whether the toolbar is disabled. */
|
|
38
38
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
39
39
|
/** Whether focus should wrap when navigating. */
|
|
40
40
|
readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
41
41
|
/** The toolbar UIPattern. */
|
|
42
|
-
readonly
|
|
42
|
+
readonly _pattern: ToolbarPattern<V>;
|
|
43
43
|
/** Whether the toolbar has received focus yet. */
|
|
44
|
-
private
|
|
44
|
+
private _hasBeenFocused;
|
|
45
45
|
constructor();
|
|
46
46
|
onFocus(): void;
|
|
47
|
-
register(widget: ToolbarWidget<V>
|
|
48
|
-
unregister(widget: ToolbarWidget<V>
|
|
47
|
+
register(widget: ToolbarWidget<V>): void;
|
|
48
|
+
unregister(widget: ToolbarWidget<V>): void;
|
|
49
49
|
/** Finds the toolbar item associated with a given element. */
|
|
50
50
|
private _getItem;
|
|
51
51
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Toolbar<any>, never>;
|
|
52
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Toolbar<any>, "[ngToolbar]", ["ngToolbar"], { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "
|
|
52
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Toolbar<any>, "[ngToolbar]", ["ngToolbar"], { "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "softDisabled": { "alias": "softDisabled"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "wrap": { "alias": "wrap"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* A widget within a toolbar.
|
|
@@ -65,7 +65,7 @@ declare class ToolbarWidget<V> implements OnInit, OnDestroy {
|
|
|
65
65
|
/** A unique identifier for the widget. */
|
|
66
66
|
private readonly _generatedId;
|
|
67
67
|
/** A unique identifier for the widget. */
|
|
68
|
-
readonly id:
|
|
68
|
+
readonly id: _angular_core.InputSignal<string>;
|
|
69
69
|
/** The parent Toolbar UIPattern. */
|
|
70
70
|
readonly toolbar: Signal<ToolbarPattern<any>>;
|
|
71
71
|
/** A reference to the widget element to be focused on navigation. */
|
|
@@ -74,40 +74,43 @@ declare class ToolbarWidget<V> implements OnInit, OnDestroy {
|
|
|
74
74
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
75
75
|
/** Whether the widget is 'hard' disabled, which is different from `aria-disabled`. A hard disabled widget cannot receive focus. */
|
|
76
76
|
readonly hardDisabled: Signal<boolean>;
|
|
77
|
+
/** The optional ToolbarWidgetGroup this widget belongs to. */
|
|
78
|
+
readonly _group: ToolbarWidgetGroup<any> | null;
|
|
79
|
+
/** The value associated with the widget. */
|
|
80
|
+
readonly value: _angular_core.InputSignal<V>;
|
|
81
|
+
/** Whether the widget is currently active (focused). */
|
|
82
|
+
readonly active: Signal<boolean>;
|
|
83
|
+
/** Whether the widget is selected (only relevant in a selection group). */
|
|
84
|
+
readonly selected: () => boolean;
|
|
85
|
+
readonly group: SignalLike<ToolbarWidgetGroupPattern<ToolbarWidgetPattern<V>, V> | undefined>;
|
|
77
86
|
/** The ToolbarWidget UIPattern. */
|
|
78
|
-
readonly
|
|
87
|
+
readonly _pattern: ToolbarWidgetPattern<V>;
|
|
79
88
|
ngOnInit(): void;
|
|
80
89
|
ngOnDestroy(): void;
|
|
81
90
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToolbarWidget<any>, never>;
|
|
82
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ToolbarWidget<any>, "[ngToolbarWidget]", ["ngToolbarWidget"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
91
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ToolbarWidget<any>, "[ngToolbarWidget]", ["ngToolbarWidget"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
83
92
|
}
|
|
84
93
|
/**
|
|
85
94
|
* A directive that groups toolbar widgets, used for more complex widgets like radio groups that
|
|
86
95
|
* have their own internal navigation.
|
|
87
96
|
*/
|
|
88
|
-
declare class ToolbarWidgetGroup<V>
|
|
89
|
-
/** A reference to the widget element. */
|
|
90
|
-
private readonly _elementRef;
|
|
97
|
+
declare class ToolbarWidgetGroup<V> {
|
|
91
98
|
/** The parent Toolbar. */
|
|
92
99
|
private readonly _toolbar;
|
|
93
|
-
/**
|
|
94
|
-
private readonly
|
|
95
|
-
/** A unique identifier for the widget. */
|
|
96
|
-
readonly id: Signal<string>;
|
|
100
|
+
/** The list of child widgets within the group. */
|
|
101
|
+
private readonly _widgets;
|
|
97
102
|
/** The parent Toolbar UIPattern. */
|
|
98
103
|
readonly toolbar: Signal<ToolbarPattern<any> | undefined>;
|
|
99
|
-
/** A reference to the widget element to be focused on navigation. */
|
|
100
|
-
readonly element: Signal<any>;
|
|
101
104
|
/** Whether the widget group is disabled. */
|
|
102
105
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
103
|
-
/** The
|
|
104
|
-
readonly
|
|
106
|
+
/** The list of toolbar items within the group. */
|
|
107
|
+
readonly items: () => ToolbarWidgetPattern<any>[];
|
|
108
|
+
/** Whether the group allows multiple widgets to be selected. */
|
|
109
|
+
readonly multi: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
105
110
|
/** The ToolbarWidgetGroup UIPattern. */
|
|
106
|
-
readonly
|
|
107
|
-
ngOnInit(): void;
|
|
108
|
-
ngOnDestroy(): void;
|
|
111
|
+
readonly _pattern: ToolbarWidgetGroupPattern<ToolbarWidgetPattern<V>, V>;
|
|
109
112
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToolbarWidgetGroup<any>, never>;
|
|
110
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ToolbarWidgetGroup<any>,
|
|
113
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ToolbarWidgetGroup<any>, "[ngToolbarWidgetGroup]", ["ngToolbarWidgetGroup"], { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; }, {}, ["_widgets"], never, true, never>;
|
|
111
114
|
}
|
|
112
115
|
|
|
113
116
|
export { Toolbar, ToolbarWidget, ToolbarWidgetGroup };
|
package/types/tree.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import * as _angular_cdk_bidi from '@angular/cdk/bidi';
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
3
|
import { Signal, OnInit, OnDestroy } from '@angular/core';
|
|
4
|
-
import * as i1 from '@angular/aria/
|
|
5
|
-
import { DeferredContentAware } from '@angular/aria/
|
|
6
|
-
import { TreePattern, TreeItemPattern } from '@angular/aria/ui-patterns';
|
|
4
|
+
import * as i1 from '@angular/aria/private';
|
|
5
|
+
import { TreePattern, DeferredContentAware, TreeItemPattern } from '@angular/aria/private';
|
|
7
6
|
import { ComboboxPopup } from './combobox.js';
|
|
8
7
|
|
|
9
8
|
interface HasElement {
|
|
@@ -53,8 +52,8 @@ declare class Tree<V> {
|
|
|
53
52
|
readonly focusMode: _angular_core.InputSignal<"roving" | "activedescendant">;
|
|
54
53
|
/** Whether navigation wraps. */
|
|
55
54
|
readonly wrap: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
56
|
-
/** Whether to
|
|
57
|
-
readonly
|
|
55
|
+
/** Whether to allow disabled items to receive focus. */
|
|
56
|
+
readonly softDisabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
58
57
|
/** Typeahead delay. */
|
|
59
58
|
readonly typeaheadDelay: _angular_core.InputSignal<number>;
|
|
60
59
|
/** Selected item values. */
|
|
@@ -66,15 +65,16 @@ declare class Tree<V> {
|
|
|
66
65
|
/** The aria-current type. */
|
|
67
66
|
readonly currentType: _angular_core.InputSignal<"page" | "step" | "location" | "date" | "time" | "true" | "false">;
|
|
68
67
|
/** The UI pattern for the tree. */
|
|
69
|
-
readonly
|
|
68
|
+
readonly _pattern: TreePattern<V>;
|
|
70
69
|
/** Whether the tree has received focus yet. */
|
|
71
70
|
private _hasFocused;
|
|
72
71
|
constructor();
|
|
73
72
|
onFocus(): void;
|
|
74
73
|
register(child: TreeItem<V>): void;
|
|
75
74
|
unregister(child: TreeItem<V>): void;
|
|
75
|
+
scrollActiveItemIntoView(options?: ScrollIntoViewOptions): void;
|
|
76
76
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<Tree<any>, never>;
|
|
77
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Tree<any>, "[ngTree]", ["ngTree"], { "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; }; "
|
|
77
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<Tree<any>, "[ngTree]", ["ngTree"], { "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: {}; }]>;
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
80
80
|
* A selectable and expandable Tree Item in a Tree.
|
|
@@ -94,6 +94,8 @@ declare class TreeItem<V> extends DeferredContentAware implements OnInit, OnDest
|
|
|
94
94
|
readonly parent: _angular_core.InputSignal<TreeItemGroup<V> | Tree<V>>;
|
|
95
95
|
/** Whether the tree item is disabled. */
|
|
96
96
|
readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
97
|
+
/** Whether the tree item is selectable. */
|
|
98
|
+
readonly selectable: _angular_core.InputSignal<boolean>;
|
|
97
99
|
/** Optional label for typeahead. Defaults to the element's textContent. */
|
|
98
100
|
readonly label: _angular_core.InputSignal<string | undefined>;
|
|
99
101
|
/** Search term for typeahead. */
|
|
@@ -101,14 +103,14 @@ declare class TreeItem<V> extends DeferredContentAware implements OnInit, OnDest
|
|
|
101
103
|
/** The tree root. */
|
|
102
104
|
readonly tree: Signal<Tree<V>>;
|
|
103
105
|
/** The UI pattern for this item. */
|
|
104
|
-
|
|
106
|
+
_pattern: TreeItemPattern<V>;
|
|
105
107
|
constructor();
|
|
106
108
|
ngOnInit(): void;
|
|
107
109
|
ngOnDestroy(): void;
|
|
108
110
|
register(group: TreeItemGroup<V>): void;
|
|
109
111
|
unregister(): void;
|
|
110
112
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TreeItem<any>, never>;
|
|
111
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TreeItem<any>, "[ngTreeItem]", ["ngTreeItem"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "parent": { "alias": "parent"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
113
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TreeItem<any>, "[ngTreeItem]", ["ngTreeItem"], { "value": { "alias": "value"; "required": true; "isSignal": true; }; "parent": { "alias": "parent"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
112
114
|
}
|
|
113
115
|
/**
|
|
114
116
|
* Contains children tree itmes.
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { signal, model, Directive, inject, TemplateRef, ViewContainerRef, afterRenderEffect } from '@angular/core';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* A container directive controls the visibility of its content.
|
|
6
|
-
*/
|
|
7
|
-
class DeferredContentAware {
|
|
8
|
-
contentVisible = signal(false, ...(ngDevMode ? [{ debugName: "contentVisible" }] : []));
|
|
9
|
-
preserveContent = model(false, ...(ngDevMode ? [{ debugName: "preserveContent" }] : []));
|
|
10
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: DeferredContentAware, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
11
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0-next.2", type: DeferredContentAware, isStandalone: true, inputs: { preserveContent: { classPropertyName: "preserveContent", publicName: "preserveContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { preserveContent: "preserveContentChange" }, ngImport: i0 });
|
|
12
|
-
}
|
|
13
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: DeferredContentAware, decorators: [{
|
|
14
|
-
type: Directive
|
|
15
|
-
}] });
|
|
16
|
-
/**
|
|
17
|
-
* DeferredContent loads/unloads the content based on the visibility.
|
|
18
|
-
* The visibilty signal is sent from a parent directive implements
|
|
19
|
-
* DeferredContentAware.
|
|
20
|
-
*
|
|
21
|
-
* Use this directive as a host directive. For example:
|
|
22
|
-
*
|
|
23
|
-
* ```ts
|
|
24
|
-
* @Directive({
|
|
25
|
-
* selector: 'ng-template[AccordionContent]',
|
|
26
|
-
* hostDirectives: [DeferredContent],
|
|
27
|
-
* })
|
|
28
|
-
* class AccordionContent {}
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
class DeferredContent {
|
|
32
|
-
_deferredContentAware = inject(DeferredContentAware, { optional: true });
|
|
33
|
-
_templateRef = inject(TemplateRef);
|
|
34
|
-
_viewContainerRef = inject(ViewContainerRef);
|
|
35
|
-
_isRendered = false;
|
|
36
|
-
deferredContentAware = signal(this._deferredContentAware, ...(ngDevMode ? [{ debugName: "deferredContentAware" }] : []));
|
|
37
|
-
constructor() {
|
|
38
|
-
afterRenderEffect(() => {
|
|
39
|
-
if (this.deferredContentAware()?.contentVisible()) {
|
|
40
|
-
if (this._isRendered)
|
|
41
|
-
return;
|
|
42
|
-
this._viewContainerRef.clear();
|
|
43
|
-
this._viewContainerRef.createEmbeddedView(this._templateRef);
|
|
44
|
-
this._isRendered = true;
|
|
45
|
-
}
|
|
46
|
-
else if (!this.deferredContentAware()?.preserveContent()) {
|
|
47
|
-
this._viewContainerRef.clear();
|
|
48
|
-
this._isRendered = false;
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: DeferredContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
53
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.0-next.2", type: DeferredContent, isStandalone: true, ngImport: i0 });
|
|
54
|
-
}
|
|
55
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: DeferredContent, decorators: [{
|
|
56
|
-
type: Directive
|
|
57
|
-
}], ctorParameters: () => [] });
|
|
58
|
-
|
|
59
|
-
export { DeferredContent, DeferredContentAware };
|
|
60
|
-
//# sourceMappingURL=deferred-content.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deferred-content.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/aria/deferred-content/deferred-content.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 {\n afterRenderEffect,\n Directive,\n inject,\n TemplateRef,\n signal,\n ViewContainerRef,\n model,\n} from '@angular/core';\n\n/**\n * A container directive controls the visibility of its content.\n */\n@Directive()\nexport class DeferredContentAware {\n readonly contentVisible = signal(false);\n readonly preserveContent = model(false);\n}\n\n/**\n * DeferredContent loads/unloads the content based on the visibility.\n * The visibilty signal is sent from a parent directive implements\n * DeferredContentAware.\n *\n * Use this directive as a host directive. For example:\n *\n * ```ts\n * @Directive({\n * selector: 'ng-template[AccordionContent]',\n * hostDirectives: [DeferredContent],\n * })\n * class AccordionContent {}\n * ```\n */\n@Directive()\nexport class DeferredContent {\n private readonly _deferredContentAware = inject(DeferredContentAware, {optional: true});\n private readonly _templateRef = inject(TemplateRef);\n private readonly _viewContainerRef = inject(ViewContainerRef);\n private _isRendered = false;\n\n readonly deferredContentAware = signal(this._deferredContentAware);\n\n constructor() {\n afterRenderEffect(() => {\n if (this.deferredContentAware()?.contentVisible()) {\n if (this._isRendered) return;\n this._viewContainerRef.clear();\n this._viewContainerRef.createEmbeddedView(this._templateRef);\n this._isRendered = true;\n } else if (!this.deferredContentAware()?.preserveContent()) {\n this._viewContainerRef.clear();\n this._isRendered = false;\n }\n });\n }\n}\n"],"names":[],"mappings":";;;AAkBA;;AAEG;MAEU,oBAAoB,CAAA;AACtB,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,0DAAC;AAC9B,IAAA,eAAe,GAAG,KAAK,CAAC,KAAK,2DAAC;8GAF5B,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;kGAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC;;AAMD;;;;;;;;;;;;;;AAcG;MAEU,eAAe,CAAA;IACT,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACtE,IAAA,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;AAClC,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACrD,WAAW,GAAG,KAAK;AAElB,IAAA,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,gEAAC;AAElE,IAAA,WAAA,GAAA;QACE,iBAAiB,CAAC,MAAK;YACrB,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE,cAAc,EAAE,EAAE;gBACjD,IAAI,IAAI,CAAC,WAAW;oBAAE;AACtB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;AAC5D,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;iBAClB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,eAAe,EAAE,EAAE;AAC1D,gBAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE;AAC9B,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;AAE5B,SAAC,CAAC;;8GAnBO,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;kGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;kGAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;;;"}
|
package/fesm2022/radio-group.mjs
DELETED
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ElementRef, computed, contentChildren, input, booleanAttribute, model, signal, afterRenderEffect, Directive, linkedSignal } from '@angular/core';
|
|
3
|
-
import { ToolbarRadioGroupPattern, RadioGroupPattern, RadioButtonPattern } from '@angular/aria/ui-patterns';
|
|
4
|
-
import { Directionality } from '@angular/cdk/bidi';
|
|
5
|
-
import { _IdGenerator } from '@angular/cdk/a11y';
|
|
6
|
-
import * as i1 from '@angular/aria/toolbar';
|
|
7
|
-
import { ToolbarWidgetGroup } from '@angular/aria/toolbar';
|
|
8
|
-
|
|
9
|
-
// TODO: Move mapSignal to it's own file so it can be reused across components.
|
|
10
|
-
/**
|
|
11
|
-
* Creates a new writable signal (signal V) whose value is connected to the given original
|
|
12
|
-
* writable signal (signal T) such that updating signal V updates signal T and vice-versa.
|
|
13
|
-
*
|
|
14
|
-
* This function establishes a two-way synchronization between the source signal and the new mapped
|
|
15
|
-
* signal. When the source signal changes, the mapped signal updates by applying the `transform`
|
|
16
|
-
* function. When the mapped signal is explicitly set or updated, the change is propagated back to
|
|
17
|
-
* the source signal by applying the `reverse` function.
|
|
18
|
-
*/
|
|
19
|
-
function mapSignal(originalSignal, operations) {
|
|
20
|
-
const mappedSignal = linkedSignal(() => operations.transform(originalSignal()));
|
|
21
|
-
const updateMappedSignal = mappedSignal.update;
|
|
22
|
-
const setMappedSignal = mappedSignal.set;
|
|
23
|
-
mappedSignal.set = (newValue) => {
|
|
24
|
-
setMappedSignal(newValue);
|
|
25
|
-
originalSignal.set(operations.reverse(newValue));
|
|
26
|
-
};
|
|
27
|
-
mappedSignal.update = (updateFn) => {
|
|
28
|
-
updateMappedSignal(oldValue => updateFn(oldValue));
|
|
29
|
-
originalSignal.update(oldValue => operations.reverse(updateFn(operations.transform(oldValue))));
|
|
30
|
-
};
|
|
31
|
-
return mappedSignal;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* A radio button group container.
|
|
35
|
-
*
|
|
36
|
-
* Radio groups are used to group multiple radio buttons or radio group labels so they function as
|
|
37
|
-
* a single form control. The RadioGroup is meant to be used in conjunction with RadioButton
|
|
38
|
-
* as follows:
|
|
39
|
-
*
|
|
40
|
-
* ```html
|
|
41
|
-
* <div ngRadioGroup>
|
|
42
|
-
* <div ngRadioButton value="1">Option 1</div>
|
|
43
|
-
* <div ngRadioButton value="2">Option 2</div>
|
|
44
|
-
* <div ngRadioButton value="3">Option 3</div>
|
|
45
|
-
* </div>
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
class RadioGroup {
|
|
49
|
-
/** A reference to the radio group element. */
|
|
50
|
-
_elementRef = inject(ElementRef);
|
|
51
|
-
/** A reference to the ToolbarWidgetGroup, if the radio group is in a toolbar. */
|
|
52
|
-
_toolbarWidgetGroup = inject(ToolbarWidgetGroup);
|
|
53
|
-
/** Whether the radio group is inside of a Toolbar. */
|
|
54
|
-
_hasToolbar = computed(() => !!this._toolbarWidgetGroup.toolbar(), ...(ngDevMode ? [{ debugName: "_hasToolbar" }] : []));
|
|
55
|
-
/** The RadioButtons nested inside of the RadioGroup. */
|
|
56
|
-
_radioButtons = contentChildren(RadioButton, ...(ngDevMode ? [{ debugName: "_radioButtons", descendants: true }] : [{ descendants: true }]));
|
|
57
|
-
/** A signal wrapper for directionality. */
|
|
58
|
-
textDirection = inject(Directionality).valueSignal;
|
|
59
|
-
/** The RadioButton UIPatterns of the child RadioButtons. */
|
|
60
|
-
items = computed(() => this._radioButtons().map(radio => radio.pattern), ...(ngDevMode ? [{ debugName: "items" }] : []));
|
|
61
|
-
/** Whether the radio group is vertically or horizontally oriented. */
|
|
62
|
-
orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
63
|
-
/** Whether disabled items in the group should be skipped when navigating. */
|
|
64
|
-
skipDisabled = input(true, ...(ngDevMode ? [{ debugName: "skipDisabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
65
|
-
/** The focus strategy used by the radio group. */
|
|
66
|
-
focusMode = input('roving', ...(ngDevMode ? [{ debugName: "focusMode" }] : []));
|
|
67
|
-
/** Whether the radio group is disabled. */
|
|
68
|
-
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
69
|
-
/** Whether the radio group is readonly. */
|
|
70
|
-
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
71
|
-
/** The value of the currently selected radio button. */
|
|
72
|
-
value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
73
|
-
/** The internal selection state for the radio group. */
|
|
74
|
-
_value = mapSignal(this.value, {
|
|
75
|
-
transform: value => (value !== null ? [value] : []),
|
|
76
|
-
reverse: values => (values.length === 0 ? null : values[0]),
|
|
77
|
-
});
|
|
78
|
-
/** The RadioGroup UIPattern. */
|
|
79
|
-
pattern;
|
|
80
|
-
/** Whether the radio group has received focus yet. */
|
|
81
|
-
_hasFocused = signal(false, ...(ngDevMode ? [{ debugName: "_hasFocused" }] : []));
|
|
82
|
-
constructor() {
|
|
83
|
-
const inputs = {
|
|
84
|
-
...this,
|
|
85
|
-
items: this.items,
|
|
86
|
-
value: this._value,
|
|
87
|
-
activeItem: signal(undefined),
|
|
88
|
-
textDirection: this.textDirection,
|
|
89
|
-
element: () => this._elementRef.nativeElement,
|
|
90
|
-
getItem: e => {
|
|
91
|
-
if (!(e.target instanceof HTMLElement)) {
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
const element = e.target.closest('[role="radio"]');
|
|
95
|
-
return this.items().find(i => i.element() === element);
|
|
96
|
-
},
|
|
97
|
-
toolbar: this._toolbarWidgetGroup.toolbar,
|
|
98
|
-
};
|
|
99
|
-
this.pattern = this._hasToolbar()
|
|
100
|
-
? new ToolbarRadioGroupPattern(inputs)
|
|
101
|
-
: new RadioGroupPattern(inputs);
|
|
102
|
-
if (this._hasToolbar()) {
|
|
103
|
-
this._toolbarWidgetGroup.controls.set(this.pattern);
|
|
104
|
-
}
|
|
105
|
-
afterRenderEffect(() => {
|
|
106
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
107
|
-
const violations = this.pattern.validate();
|
|
108
|
-
for (const violation of violations) {
|
|
109
|
-
console.error(violation);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
afterRenderEffect(() => {
|
|
114
|
-
if (!this._hasFocused() && !this._hasToolbar()) {
|
|
115
|
-
this.pattern.setDefaultState();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
onFocus() {
|
|
120
|
-
this._hasFocused.set(true);
|
|
121
|
-
}
|
|
122
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: RadioGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
123
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.2.0-next.2", type: RadioGroup, isStandalone: true, selector: "[ngRadioGroup]", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, skipDisabled: { classPropertyName: "skipDisabled", publicName: "skipDisabled", isSignal: true, isRequired: false, transformFunction: null }, focusMode: { classPropertyName: "focusMode", publicName: "focusMode", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "role": "radiogroup" }, listeners: { "keydown": "pattern.onKeydown($event)", "pointerdown": "pattern.onPointerdown($event)", "focusin": "onFocus()" }, properties: { "attr.tabindex": "pattern.tabindex()", "attr.aria-readonly": "pattern.readonly()", "attr.aria-disabled": "pattern.disabled()", "attr.aria-orientation": "pattern.orientation()", "attr.aria-activedescendant": "pattern.activedescendant()" }, classAttribute: "ng-radio-group" }, queries: [{ propertyName: "_radioButtons", predicate: RadioButton, descendants: true, isSignal: true }], exportAs: ["ngRadioGroup"], hostDirectives: [{ directive: i1.ToolbarWidgetGroup, inputs: ["disabled", "disabled"] }], ngImport: i0 });
|
|
124
|
-
}
|
|
125
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: RadioGroup, decorators: [{
|
|
126
|
-
type: Directive,
|
|
127
|
-
args: [{
|
|
128
|
-
selector: '[ngRadioGroup]',
|
|
129
|
-
exportAs: 'ngRadioGroup',
|
|
130
|
-
host: {
|
|
131
|
-
'role': 'radiogroup',
|
|
132
|
-
'class': 'ng-radio-group',
|
|
133
|
-
'[attr.tabindex]': 'pattern.tabindex()',
|
|
134
|
-
'[attr.aria-readonly]': 'pattern.readonly()',
|
|
135
|
-
'[attr.aria-disabled]': 'pattern.disabled()',
|
|
136
|
-
'[attr.aria-orientation]': 'pattern.orientation()',
|
|
137
|
-
'[attr.aria-activedescendant]': 'pattern.activedescendant()',
|
|
138
|
-
'(keydown)': 'pattern.onKeydown($event)',
|
|
139
|
-
'(pointerdown)': 'pattern.onPointerdown($event)',
|
|
140
|
-
'(focusin)': 'onFocus()',
|
|
141
|
-
},
|
|
142
|
-
hostDirectives: [
|
|
143
|
-
{
|
|
144
|
-
directive: ToolbarWidgetGroup,
|
|
145
|
-
inputs: ['disabled'],
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
}]
|
|
149
|
-
}], ctorParameters: () => [] });
|
|
150
|
-
/** A selectable radio button in a RadioGroup. */
|
|
151
|
-
class RadioButton {
|
|
152
|
-
/** A reference to the radio button element. */
|
|
153
|
-
_elementRef = inject(ElementRef);
|
|
154
|
-
/** The parent RadioGroup. */
|
|
155
|
-
_radioGroup = inject(RadioGroup);
|
|
156
|
-
/** A unique identifier for the radio button. */
|
|
157
|
-
_generatedId = inject(_IdGenerator).getId('ng-radio-button-');
|
|
158
|
-
/** A unique identifier for the radio button. */
|
|
159
|
-
id = computed(() => this._generatedId, ...(ngDevMode ? [{ debugName: "id" }] : []));
|
|
160
|
-
/** The value associated with the radio button. */
|
|
161
|
-
value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
162
|
-
/** The parent RadioGroup UIPattern. */
|
|
163
|
-
group = computed(() => this._radioGroup.pattern, ...(ngDevMode ? [{ debugName: "group" }] : []));
|
|
164
|
-
/** A reference to the radio button element to be focused on navigation. */
|
|
165
|
-
element = computed(() => this._elementRef.nativeElement, ...(ngDevMode ? [{ debugName: "element" }] : []));
|
|
166
|
-
/** Whether the radio button is disabled. */
|
|
167
|
-
disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
|
|
168
|
-
/** The RadioButton UIPattern. */
|
|
169
|
-
pattern = new RadioButtonPattern({
|
|
170
|
-
...this,
|
|
171
|
-
id: this.id,
|
|
172
|
-
value: this.value,
|
|
173
|
-
group: this.group,
|
|
174
|
-
element: this.element,
|
|
175
|
-
});
|
|
176
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: RadioButton, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
177
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0-next.2", type: RadioButton, isStandalone: true, selector: "[ngRadioButton]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "radio" }, properties: { "attr.data-active": "pattern.active()", "attr.tabindex": "pattern.tabindex()", "attr.aria-checked": "pattern.selected()", "attr.aria-disabled": "pattern.disabled()", "id": "pattern.id()" }, classAttribute: "ng-radio-button" }, exportAs: ["ngRadioButton"], ngImport: i0 });
|
|
178
|
-
}
|
|
179
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: RadioButton, decorators: [{
|
|
180
|
-
type: Directive,
|
|
181
|
-
args: [{
|
|
182
|
-
selector: '[ngRadioButton]',
|
|
183
|
-
exportAs: 'ngRadioButton',
|
|
184
|
-
host: {
|
|
185
|
-
'role': 'radio',
|
|
186
|
-
'class': 'ng-radio-button',
|
|
187
|
-
'[attr.data-active]': 'pattern.active()',
|
|
188
|
-
'[attr.tabindex]': 'pattern.tabindex()',
|
|
189
|
-
'[attr.aria-checked]': 'pattern.selected()',
|
|
190
|
-
'[attr.aria-disabled]': 'pattern.disabled()',
|
|
191
|
-
'[id]': 'pattern.id()',
|
|
192
|
-
},
|
|
193
|
-
}]
|
|
194
|
-
}] });
|
|
195
|
-
|
|
196
|
-
export { RadioButton, RadioGroup };
|
|
197
|
-
//# sourceMappingURL=radio-group.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"radio-group.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/aria/radio-group/radio-group.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 {\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChildren,\n Directive,\n ElementRef,\n inject,\n input,\n linkedSignal,\n model,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport {\n RadioButtonPattern,\n RadioGroupInputs,\n RadioGroupPattern,\n ToolbarRadioGroupInputs,\n ToolbarRadioGroupPattern,\n} from '@angular/aria/ui-patterns';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {ToolbarWidgetGroup} from '@angular/aria/toolbar';\n\n// TODO: Move mapSignal to it's own file so it can be reused across components.\n\n/**\n * Creates a new writable signal (signal V) whose value is connected to the given original\n * writable signal (signal T) such that updating signal V updates signal T and vice-versa.\n *\n * This function establishes a two-way synchronization between the source signal and the new mapped\n * signal. When the source signal changes, the mapped signal updates by applying the `transform`\n * function. When the mapped signal is explicitly set or updated, the change is propagated back to\n * the source signal by applying the `reverse` function.\n */\nexport function mapSignal<T, V>(\n originalSignal: WritableSignal<T>,\n operations: {\n transform: (value: T) => V;\n reverse: (value: V) => T;\n },\n) {\n const mappedSignal = linkedSignal(() => operations.transform(originalSignal()));\n const updateMappedSignal = mappedSignal.update;\n const setMappedSignal = mappedSignal.set;\n\n mappedSignal.set = (newValue: V) => {\n setMappedSignal(newValue);\n originalSignal.set(operations.reverse(newValue));\n };\n\n mappedSignal.update = (updateFn: (value: V) => V) => {\n updateMappedSignal(oldValue => updateFn(oldValue));\n originalSignal.update(oldValue => operations.reverse(updateFn(operations.transform(oldValue))));\n };\n\n return mappedSignal;\n}\n\n/**\n * A radio button group container.\n *\n * Radio groups are used to group multiple radio buttons or radio group labels so they function as\n * a single form control. The RadioGroup is meant to be used in conjunction with RadioButton\n * as follows:\n *\n * ```html\n * <div ngRadioGroup>\n * <div ngRadioButton value=\"1\">Option 1</div>\n * <div ngRadioButton value=\"2\">Option 2</div>\n * <div ngRadioButton value=\"3\">Option 3</div>\n * </div>\n * ```\n */\n@Directive({\n selector: '[ngRadioGroup]',\n exportAs: 'ngRadioGroup',\n host: {\n 'role': 'radiogroup',\n 'class': 'ng-radio-group',\n '[attr.tabindex]': 'pattern.tabindex()',\n '[attr.aria-readonly]': 'pattern.readonly()',\n '[attr.aria-disabled]': 'pattern.disabled()',\n '[attr.aria-orientation]': 'pattern.orientation()',\n '[attr.aria-activedescendant]': 'pattern.activedescendant()',\n '(keydown)': 'pattern.onKeydown($event)',\n '(pointerdown)': 'pattern.onPointerdown($event)',\n '(focusin)': 'onFocus()',\n },\n hostDirectives: [\n {\n directive: ToolbarWidgetGroup,\n inputs: ['disabled'],\n },\n ],\n})\nexport class RadioGroup<V> {\n /** A reference to the radio group element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** A reference to the ToolbarWidgetGroup, if the radio group is in a toolbar. */\n private readonly _toolbarWidgetGroup = inject(ToolbarWidgetGroup);\n\n /** Whether the radio group is inside of a Toolbar. */\n private readonly _hasToolbar = computed(() => !!this._toolbarWidgetGroup.toolbar());\n\n /** The RadioButtons nested inside of the RadioGroup. */\n private readonly _radioButtons = contentChildren(RadioButton, {descendants: true});\n\n /** A signal wrapper for directionality. */\n protected textDirection = inject(Directionality).valueSignal;\n\n /** The RadioButton UIPatterns of the child RadioButtons. */\n protected items = computed(() => this._radioButtons().map(radio => radio.pattern));\n\n /** Whether the radio group is vertically or horizontally oriented. */\n readonly orientation = input<'vertical' | 'horizontal'>('vertical');\n\n /** Whether disabled items in the group should be skipped when navigating. */\n readonly skipDisabled = input(true, {transform: booleanAttribute});\n\n /** The focus strategy used by the radio group. */\n readonly focusMode = input<'roving' | 'activedescendant'>('roving');\n\n /** Whether the radio group is disabled. */\n readonly disabled = input(false, {transform: booleanAttribute});\n\n /** Whether the radio group is readonly. */\n readonly readonly = input(false, {transform: booleanAttribute});\n\n /** The value of the currently selected radio button. */\n readonly value = model<V | null>(null);\n\n /** The internal selection state for the radio group. */\n private readonly _value = mapSignal<V | null, V[]>(this.value, {\n transform: value => (value !== null ? [value] : []),\n reverse: values => (values.length === 0 ? null : values[0]),\n });\n\n /** The RadioGroup UIPattern. */\n readonly pattern: RadioGroupPattern<V>;\n\n /** Whether the radio group has received focus yet. */\n private _hasFocused = signal(false);\n\n constructor() {\n const inputs: RadioGroupInputs<V> | ToolbarRadioGroupInputs<V> = {\n ...this,\n items: this.items,\n value: this._value,\n activeItem: signal(undefined),\n textDirection: this.textDirection,\n element: () => this._elementRef.nativeElement,\n getItem: e => {\n if (!(e.target instanceof HTMLElement)) {\n return undefined;\n }\n const element = e.target.closest('[role=\"radio\"]');\n return this.items().find(i => i.element() === element);\n },\n toolbar: this._toolbarWidgetGroup.toolbar,\n };\n\n this.pattern = this._hasToolbar()\n ? new ToolbarRadioGroupPattern<V>(inputs as ToolbarRadioGroupInputs<V>)\n : new RadioGroupPattern<V>(inputs as RadioGroupInputs<V>);\n\n if (this._hasToolbar()) {\n this._toolbarWidgetGroup.controls.set(this.pattern as ToolbarRadioGroupPattern<V>);\n }\n\n afterRenderEffect(() => {\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 afterRenderEffect(() => {\n if (!this._hasFocused() && !this._hasToolbar()) {\n this.pattern.setDefaultState();\n }\n });\n }\n\n onFocus() {\n this._hasFocused.set(true);\n }\n}\n\n/** A selectable radio button in a RadioGroup. */\n@Directive({\n selector: '[ngRadioButton]',\n exportAs: 'ngRadioButton',\n host: {\n 'role': 'radio',\n 'class': 'ng-radio-button',\n '[attr.data-active]': 'pattern.active()',\n '[attr.tabindex]': 'pattern.tabindex()',\n '[attr.aria-checked]': 'pattern.selected()',\n '[attr.aria-disabled]': 'pattern.disabled()',\n '[id]': 'pattern.id()',\n },\n})\nexport class RadioButton<V> {\n /** A reference to the radio button element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** The parent RadioGroup. */\n private readonly _radioGroup = inject(RadioGroup);\n\n /** A unique identifier for the radio button. */\n private readonly _generatedId = inject(_IdGenerator).getId('ng-radio-button-');\n\n /** A unique identifier for the radio button. */\n readonly id = computed(() => this._generatedId);\n\n /** The value associated with the radio button. */\n readonly value = input.required<V>();\n\n /** The parent RadioGroup UIPattern. */\n readonly group = computed(() => this._radioGroup.pattern);\n\n /** A reference to the radio button element to be focused on navigation. */\n element = computed(() => this._elementRef.nativeElement);\n\n /** Whether the radio button is disabled. */\n disabled = input(false, {transform: booleanAttribute});\n\n /** The RadioButton UIPattern. */\n pattern = new RadioButtonPattern<V>({\n ...this,\n id: this.id,\n value: this.value,\n group: this.group,\n element: this.element,\n });\n}\n"],"names":[],"mappings":"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"}
|