@angular/aria 21.0.0-next.8 → 21.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/_adev_assets/aria-accordion.json +373 -0
  2. package/_adev_assets/aria-combobox.json +383 -0
  3. package/_adev_assets/aria-grid.json +578 -0
  4. package/_adev_assets/aria-listbox.json +511 -0
  5. package/_adev_assets/aria-menu.json +752 -0
  6. package/_adev_assets/aria-radio-group.json +389 -0
  7. package/_adev_assets/aria-tabs.json +987 -0
  8. package/_adev_assets/aria-toolbar.json +717 -0
  9. package/_adev_assets/aria-tree.json +1067 -0
  10. package/fesm2022/_widget-chunk.mjs +827 -0
  11. package/fesm2022/_widget-chunk.mjs.map +1 -0
  12. package/fesm2022/accordion.mjs +371 -172
  13. package/fesm2022/accordion.mjs.map +1 -1
  14. package/fesm2022/aria.mjs +1 -2
  15. package/fesm2022/aria.mjs.map +1 -1
  16. package/fesm2022/combobox.mjs +304 -114
  17. package/fesm2022/combobox.mjs.map +1 -1
  18. package/fesm2022/deferred-content.mjs +89 -49
  19. package/fesm2022/deferred-content.mjs.map +1 -1
  20. package/fesm2022/grid.mjs +517 -0
  21. package/fesm2022/grid.mjs.map +1 -0
  22. package/fesm2022/listbox.mjs +384 -183
  23. package/fesm2022/listbox.mjs.map +1 -1
  24. package/fesm2022/menu.mjs +535 -0
  25. package/fesm2022/menu.mjs.map +1 -0
  26. package/fesm2022/private.mjs +2347 -0
  27. package/fesm2022/private.mjs.map +1 -0
  28. package/fesm2022/radio-group.mjs +320 -179
  29. package/fesm2022/radio-group.mjs.map +1 -1
  30. package/fesm2022/tabs.mjs +483 -274
  31. package/fesm2022/tabs.mjs.map +1 -1
  32. package/fesm2022/toolbar.mjs +330 -199
  33. package/fesm2022/toolbar.mjs.map +1 -1
  34. package/fesm2022/tree.mjs +511 -309
  35. package/fesm2022/tree.mjs.map +1 -1
  36. package/package.json +14 -6
  37. package/types/_grid-chunk.d.ts +546 -0
  38. package/types/accordion.d.ts +4 -4
  39. package/types/combobox.d.ts +18 -5
  40. package/types/deferred-content.d.ts +1 -0
  41. package/types/grid.d.ts +111 -0
  42. package/types/listbox.d.ts +6 -3
  43. package/types/menu.d.ts +158 -0
  44. package/types/{ui-patterns.d.ts → private.d.ts} +333 -133
  45. package/types/radio-group.d.ts +5 -3
  46. package/types/tabs.d.ts +4 -4
  47. package/types/toolbar.d.ts +4 -4
  48. package/types/tree.d.ts +17 -32
  49. package/fesm2022/ui-patterns.mjs +0 -2504
  50. package/fesm2022/ui-patterns.mjs.map +0 -1
@@ -4,189 +4,388 @@ import { _IdGenerator } from '@angular/cdk/a11y';
4
4
  import { Directionality } from '@angular/cdk/bidi';
5
5
  import * as i1 from '@angular/aria/deferred-content';
6
6
  import { DeferredContentAware, DeferredContent } from '@angular/aria/deferred-content';
7
- import { AccordionPanelPattern, AccordionTriggerPattern, AccordionGroupPattern } from '@angular/aria/ui-patterns';
7
+ import { AccordionPanelPattern, AccordionTriggerPattern, AccordionGroupPattern } from '@angular/aria/private';
8
8
 
9
- /**
10
- * Represents the content panel of an accordion item. It is controlled by an
11
- * associated `AccordionTrigger`.
12
- */
13
9
  class AccordionPanel {
14
- /** The DeferredContentAware host directive. */
15
- _deferredContentAware = inject(DeferredContentAware);
16
- /** A global unique identifier for the panel. */
17
- _id = inject(_IdGenerator).getId('accordion-trigger-');
18
- /** A local unique identifier for the panel, used to match with its trigger's value. */
19
- value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
20
- /** The parent accordion trigger pattern that controls this panel. This is set by AccordionGroup. */
21
- accordionTrigger = signal(undefined, ...(ngDevMode ? [{ debugName: "accordionTrigger" }] : []));
22
- /** The UI pattern instance for this panel. */
23
- pattern = new AccordionPanelPattern({
24
- id: () => this._id,
25
- value: this.value,
26
- accordionTrigger: () => this.accordionTrigger(),
10
+ _deferredContentAware = inject(DeferredContentAware);
11
+ _id = inject(_IdGenerator).getId('accordion-trigger-');
12
+ value = input.required(...(ngDevMode ? [{
13
+ debugName: "value"
14
+ }] : []));
15
+ accordionTrigger = signal(undefined, ...(ngDevMode ? [{
16
+ debugName: "accordionTrigger"
17
+ }] : []));
18
+ _pattern = new AccordionPanelPattern({
19
+ id: () => this._id,
20
+ value: this.value,
21
+ accordionTrigger: () => this.accordionTrigger()
22
+ });
23
+ constructor() {
24
+ afterRenderEffect(() => {
25
+ this._deferredContentAware.contentVisible.set(!this._pattern.hidden());
27
26
  });
28
- constructor() {
29
- // Connect the panel's hidden state to the DeferredContentAware's visibility.
30
- afterRenderEffect(() => {
31
- this._deferredContentAware.contentVisible.set(!this.pattern.hidden());
32
- });
33
- }
34
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
35
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0-next.2", type: AccordionPanel, isStandalone: true, selector: "[ngAccordionPanel]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "role": "region" }, properties: { "attr.id": "pattern.id()", "attr.aria-labelledby": "pattern.accordionTrigger()?.id()", "attr.inert": "pattern.hidden() ? true : null" }, classAttribute: "ng-accordion-panel" }, exportAs: ["ngAccordionPanel"], hostDirectives: [{ directive: i1.DeferredContentAware, inputs: ["preserveContent", "preserveContent"] }], ngImport: i0 });
27
+ }
28
+ static ɵfac = i0.ɵɵngDeclareFactory({
29
+ minVersion: "12.0.0",
30
+ version: "20.2.0-next.2",
31
+ ngImport: i0,
32
+ type: AccordionPanel,
33
+ deps: [],
34
+ target: i0.ɵɵFactoryTarget.Directive
35
+ });
36
+ static ɵdir = i0.ɵɵngDeclareDirective({
37
+ minVersion: "17.1.0",
38
+ version: "20.2.0-next.2",
39
+ type: AccordionPanel,
40
+ isStandalone: true,
41
+ selector: "[ngAccordionPanel]",
42
+ inputs: {
43
+ value: {
44
+ classPropertyName: "value",
45
+ publicName: "value",
46
+ isSignal: true,
47
+ isRequired: true,
48
+ transformFunction: null
49
+ }
50
+ },
51
+ host: {
52
+ attributes: {
53
+ "role": "region"
54
+ },
55
+ properties: {
56
+ "attr.id": "_pattern.id()",
57
+ "attr.aria-labelledby": "_pattern.accordionTrigger()?.id()",
58
+ "attr.inert": "_pattern.hidden() ? true : null"
59
+ },
60
+ classAttribute: "ng-accordion-panel"
61
+ },
62
+ exportAs: ["ngAccordionPanel"],
63
+ hostDirectives: [{
64
+ directive: i1.DeferredContentAware,
65
+ inputs: ["preserveContent", "preserveContent"]
66
+ }],
67
+ ngImport: i0
68
+ });
36
69
  }
37
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionPanel, decorators: [{
38
- type: Directive,
39
- args: [{
40
- selector: '[ngAccordionPanel]',
41
- exportAs: 'ngAccordionPanel',
42
- hostDirectives: [
43
- {
44
- directive: DeferredContentAware,
45
- inputs: ['preserveContent'],
46
- },
47
- ],
48
- host: {
49
- 'class': 'ng-accordion-panel',
50
- 'role': 'region',
51
- '[attr.id]': 'pattern.id()',
52
- '[attr.aria-labelledby]': 'pattern.accordionTrigger()?.id()',
53
- '[attr.inert]': 'pattern.hidden() ? true : null',
54
- },
55
- }]
56
- }], ctorParameters: () => [] });
57
- /**
58
- * Represents the trigger button for an accordion item. It controls the expansion
59
- * state of an associated `AccordionPanel`.
60
- */
70
+ i0.ɵɵngDeclareClassMetadata({
71
+ minVersion: "12.0.0",
72
+ version: "20.2.0-next.2",
73
+ ngImport: i0,
74
+ type: AccordionPanel,
75
+ decorators: [{
76
+ type: Directive,
77
+ args: [{
78
+ selector: '[ngAccordionPanel]',
79
+ exportAs: 'ngAccordionPanel',
80
+ hostDirectives: [{
81
+ directive: DeferredContentAware,
82
+ inputs: ['preserveContent']
83
+ }],
84
+ host: {
85
+ 'class': 'ng-accordion-panel',
86
+ 'role': 'region',
87
+ '[attr.id]': '_pattern.id()',
88
+ '[attr.aria-labelledby]': '_pattern.accordionTrigger()?.id()',
89
+ '[attr.inert]': '_pattern.hidden() ? true : null'
90
+ }
91
+ }]
92
+ }],
93
+ ctorParameters: () => []
94
+ });
61
95
  class AccordionTrigger {
62
- /** A global unique identifier for the trigger. */
63
- _id = inject(_IdGenerator).getId('ng-accordion-trigger-');
64
- /** A reference to the trigger element. */
65
- _elementRef = inject(ElementRef);
66
- /** The parent AccordionGroup. */
67
- _accordionGroup = inject(AccordionGroup);
68
- /** A local unique identifier for the trigger, used to match with its panel's value. */
69
- value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
70
- /** Whether the trigger is disabled. */
71
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
72
- /**
73
- * Whether this trigger is completely inaccessible.
74
- *
75
- * TODO(ok7sai): Consider move this to UI patterns.
76
- */
77
- hardDisabled = computed(() => this.pattern.disabled() && this.pattern.tabindex() < 0, ...(ngDevMode ? [{ debugName: "hardDisabled" }] : []));
78
- /** The accordion panel pattern controlled by this trigger. This is set by AccordionGroup. */
79
- accordionPanel = signal(undefined, ...(ngDevMode ? [{ debugName: "accordionPanel" }] : []));
80
- /** The UI pattern instance for this trigger. */
81
- pattern = new AccordionTriggerPattern({
82
- id: () => this._id,
83
- value: this.value,
84
- disabled: this.disabled,
85
- element: () => this._elementRef.nativeElement,
86
- accordionGroup: computed(() => this._accordionGroup.pattern),
87
- accordionPanel: this.accordionPanel,
88
- });
89
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive });
90
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.2.0-next.2", type: AccordionTrigger, isStandalone: true, selector: "[ngAccordionTrigger]", 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": "button" }, listeners: { "keydown": "pattern.onKeydown($event)", "pointerdown": "pattern.onPointerdown($event)", "focusin": "pattern.onFocus($event)" }, properties: { "attr.data-active": "pattern.active()", "id": "pattern.id()", "attr.aria-expanded": "pattern.expanded()", "attr.aria-controls": "pattern.controls()", "attr.aria-disabled": "pattern.disabled()", "attr.disabled": "hardDisabled() ? true : null", "attr.tabindex": "pattern.tabindex()" }, classAttribute: "ng-accordion-trigger" }, exportAs: ["ngAccordionTrigger"], ngImport: i0 });
96
+ _id = inject(_IdGenerator).getId('ng-accordion-trigger-');
97
+ _elementRef = inject(ElementRef);
98
+ _accordionGroup = inject(AccordionGroup);
99
+ value = input.required(...(ngDevMode ? [{
100
+ debugName: "value"
101
+ }] : []));
102
+ disabled = input(false, ...(ngDevMode ? [{
103
+ debugName: "disabled",
104
+ transform: booleanAttribute
105
+ }] : [{
106
+ transform: booleanAttribute
107
+ }]));
108
+ hardDisabled = computed(() => this._pattern.disabled() && this._pattern.tabindex() < 0, ...(ngDevMode ? [{
109
+ debugName: "hardDisabled"
110
+ }] : []));
111
+ accordionPanel = signal(undefined, ...(ngDevMode ? [{
112
+ debugName: "accordionPanel"
113
+ }] : []));
114
+ _pattern = new AccordionTriggerPattern({
115
+ id: () => this._id,
116
+ value: this.value,
117
+ disabled: this.disabled,
118
+ element: () => this._elementRef.nativeElement,
119
+ accordionGroup: computed(() => this._accordionGroup._pattern),
120
+ accordionPanel: this.accordionPanel
121
+ });
122
+ static ɵfac = i0.ɵɵngDeclareFactory({
123
+ minVersion: "12.0.0",
124
+ version: "20.2.0-next.2",
125
+ ngImport: i0,
126
+ type: AccordionTrigger,
127
+ deps: [],
128
+ target: i0.ɵɵFactoryTarget.Directive
129
+ });
130
+ static ɵdir = i0.ɵɵngDeclareDirective({
131
+ minVersion: "17.1.0",
132
+ version: "20.2.0-next.2",
133
+ type: AccordionTrigger,
134
+ isStandalone: true,
135
+ selector: "[ngAccordionTrigger]",
136
+ inputs: {
137
+ value: {
138
+ classPropertyName: "value",
139
+ publicName: "value",
140
+ isSignal: true,
141
+ isRequired: true,
142
+ transformFunction: null
143
+ },
144
+ disabled: {
145
+ classPropertyName: "disabled",
146
+ publicName: "disabled",
147
+ isSignal: true,
148
+ isRequired: false,
149
+ transformFunction: null
150
+ }
151
+ },
152
+ host: {
153
+ attributes: {
154
+ "role": "button"
155
+ },
156
+ listeners: {
157
+ "keydown": "_pattern.onKeydown($event)",
158
+ "pointerdown": "_pattern.onPointerdown($event)",
159
+ "focusin": "_pattern.onFocus($event)"
160
+ },
161
+ properties: {
162
+ "attr.data-active": "_pattern.active()",
163
+ "id": "_pattern.id()",
164
+ "attr.aria-expanded": "_pattern.expanded()",
165
+ "attr.aria-controls": "_pattern.controls()",
166
+ "attr.aria-disabled": "_pattern.disabled()",
167
+ "attr.disabled": "hardDisabled() ? true : null",
168
+ "attr.tabindex": "_pattern.tabindex()"
169
+ },
170
+ classAttribute: "ng-accordion-trigger"
171
+ },
172
+ exportAs: ["ngAccordionTrigger"],
173
+ ngImport: i0
174
+ });
91
175
  }
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionTrigger, decorators: [{
93
- type: Directive,
94
- args: [{
95
- selector: '[ngAccordionTrigger]',
96
- exportAs: 'ngAccordionTrigger',
97
- host: {
98
- 'class': 'ng-accordion-trigger',
99
- '[attr.data-active]': 'pattern.active()',
100
- 'role': 'button',
101
- '[id]': 'pattern.id()',
102
- '[attr.aria-expanded]': 'pattern.expanded()',
103
- '[attr.aria-controls]': 'pattern.controls()',
104
- '[attr.aria-disabled]': 'pattern.disabled()',
105
- '[attr.disabled]': 'hardDisabled() ? true : null',
106
- '[attr.tabindex]': 'pattern.tabindex()',
107
- '(keydown)': 'pattern.onKeydown($event)',
108
- '(pointerdown)': 'pattern.onPointerdown($event)',
109
- '(focusin)': 'pattern.onFocus($event)',
110
- },
111
- }]
112
- }] });
113
- /**
114
- * Container for a group of accordion items. It manages the overall state and
115
- * interactions of the accordion, such as keyboard navigation and expansion mode.
116
- */
176
+ i0.ɵɵngDeclareClassMetadata({
177
+ minVersion: "12.0.0",
178
+ version: "20.2.0-next.2",
179
+ ngImport: i0,
180
+ type: AccordionTrigger,
181
+ decorators: [{
182
+ type: Directive,
183
+ args: [{
184
+ selector: '[ngAccordionTrigger]',
185
+ exportAs: 'ngAccordionTrigger',
186
+ host: {
187
+ 'class': 'ng-accordion-trigger',
188
+ '[attr.data-active]': '_pattern.active()',
189
+ 'role': 'button',
190
+ '[id]': '_pattern.id()',
191
+ '[attr.aria-expanded]': '_pattern.expanded()',
192
+ '[attr.aria-controls]': '_pattern.controls()',
193
+ '[attr.aria-disabled]': '_pattern.disabled()',
194
+ '[attr.disabled]': 'hardDisabled() ? true : null',
195
+ '[attr.tabindex]': '_pattern.tabindex()',
196
+ '(keydown)': '_pattern.onKeydown($event)',
197
+ '(pointerdown)': '_pattern.onPointerdown($event)',
198
+ '(focusin)': '_pattern.onFocus($event)'
199
+ }
200
+ }]
201
+ }]
202
+ });
117
203
  class AccordionGroup {
118
- /** A reference to the group element. */
119
- _elementRef = inject(ElementRef);
120
- /** The AccordionTriggers nested inside this group. */
121
- _triggers = contentChildren(AccordionTrigger, ...(ngDevMode ? [{ debugName: "_triggers", descendants: true }] : [{ descendants: true }]));
122
- /** The AccordionPanels nested inside this group. */
123
- _panels = contentChildren(AccordionPanel, ...(ngDevMode ? [{ debugName: "_panels", descendants: true }] : [{ descendants: true }]));
124
- /** The text direction (ltr or rtl). */
125
- textDirection = inject(Directionality).valueSignal;
126
- /** Whether the entire accordion group is disabled. */
127
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
128
- /** Whether multiple accordion items can be expanded simultaneously. */
129
- multiExpandable = input(true, ...(ngDevMode ? [{ debugName: "multiExpandable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
130
- /** The values of the current selected/expanded accordions. */
131
- value = model([], ...(ngDevMode ? [{ debugName: "value" }] : []));
132
- /** Whether disabled items should be skipped during keyboard navigation. */
133
- skipDisabled = input(true, ...(ngDevMode ? [{ debugName: "skipDisabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
134
- /** Whether keyboard navigation should wrap around from the last item to the first, and vice-versa. */
135
- wrap = input(false, ...(ngDevMode ? [{ debugName: "wrap", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
136
- /** The UI pattern instance for this accordion group. */
137
- pattern = new AccordionGroupPattern({
138
- ...this,
139
- // TODO(ok7sai): Consider making `activeItem` an internal state in the pattern and call
140
- // `setDefaultState` in the CDK.
141
- activeItem: signal(undefined),
142
- items: computed(() => this._triggers().map(trigger => trigger.pattern)),
143
- expandedIds: this.value,
144
- // TODO(ok7sai): Investigate whether an accordion should support horizontal mode.
145
- orientation: () => 'vertical',
146
- element: () => this._elementRef.nativeElement,
204
+ _elementRef = inject(ElementRef);
205
+ _triggers = contentChildren(AccordionTrigger, ...(ngDevMode ? [{
206
+ debugName: "_triggers",
207
+ descendants: true
208
+ }] : [{
209
+ descendants: true
210
+ }]));
211
+ _panels = contentChildren(AccordionPanel, ...(ngDevMode ? [{
212
+ debugName: "_panels",
213
+ descendants: true
214
+ }] : [{
215
+ descendants: true
216
+ }]));
217
+ textDirection = inject(Directionality).valueSignal;
218
+ disabled = input(false, ...(ngDevMode ? [{
219
+ debugName: "disabled",
220
+ transform: booleanAttribute
221
+ }] : [{
222
+ transform: booleanAttribute
223
+ }]));
224
+ multiExpandable = input(true, ...(ngDevMode ? [{
225
+ debugName: "multiExpandable",
226
+ transform: booleanAttribute
227
+ }] : [{
228
+ transform: booleanAttribute
229
+ }]));
230
+ value = model([], ...(ngDevMode ? [{
231
+ debugName: "value"
232
+ }] : []));
233
+ skipDisabled = input(true, ...(ngDevMode ? [{
234
+ debugName: "skipDisabled",
235
+ transform: booleanAttribute
236
+ }] : [{
237
+ transform: booleanAttribute
238
+ }]));
239
+ wrap = input(false, ...(ngDevMode ? [{
240
+ debugName: "wrap",
241
+ transform: booleanAttribute
242
+ }] : [{
243
+ transform: booleanAttribute
244
+ }]));
245
+ _pattern = new AccordionGroupPattern({
246
+ ...this,
247
+ activeItem: signal(undefined),
248
+ items: computed(() => this._triggers().map(trigger => trigger._pattern)),
249
+ expandedIds: this.value,
250
+ orientation: () => 'vertical',
251
+ element: () => this._elementRef.nativeElement
252
+ });
253
+ constructor() {
254
+ afterRenderEffect(() => {
255
+ const triggers = this._triggers();
256
+ const panels = this._panels();
257
+ for (const trigger of triggers) {
258
+ const panel = panels.find(p => p.value() === trigger.value());
259
+ trigger.accordionPanel.set(panel?._pattern);
260
+ if (panel) {
261
+ panel.accordionTrigger.set(trigger._pattern);
262
+ }
263
+ }
147
264
  });
148
- constructor() {
149
- // Effect to link triggers with their corresponding panels and update the group's items.
150
- afterRenderEffect(() => {
151
- const triggers = this._triggers();
152
- const panels = this._panels();
153
- for (const trigger of triggers) {
154
- const panel = panels.find(p => p.value() === trigger.value());
155
- trigger.accordionPanel.set(panel?.pattern);
156
- if (panel) {
157
- panel.accordionTrigger.set(trigger.pattern);
158
- }
159
- }
160
- });
161
- }
162
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionGroup, deps: [], target: i0.ɵɵFactoryTarget.Directive });
163
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.2.0-next.2", type: AccordionGroup, isStandalone: true, selector: "[ngAccordionGroup]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, multiExpandable: { classPropertyName: "multiExpandable", publicName: "multiExpandable", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, skipDisabled: { classPropertyName: "skipDisabled", publicName: "skipDisabled", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { classAttribute: "ng-accordion-group" }, queries: [{ propertyName: "_triggers", predicate: AccordionTrigger, descendants: true, isSignal: true }, { propertyName: "_panels", predicate: AccordionPanel, descendants: true, isSignal: true }], exportAs: ["ngAccordionGroup"], ngImport: i0 });
265
+ }
266
+ static ɵfac = i0.ɵɵngDeclareFactory({
267
+ minVersion: "12.0.0",
268
+ version: "20.2.0-next.2",
269
+ ngImport: i0,
270
+ type: AccordionGroup,
271
+ deps: [],
272
+ target: i0.ɵɵFactoryTarget.Directive
273
+ });
274
+ static ɵdir = i0.ɵɵngDeclareDirective({
275
+ minVersion: "17.2.0",
276
+ version: "20.2.0-next.2",
277
+ type: AccordionGroup,
278
+ isStandalone: true,
279
+ selector: "[ngAccordionGroup]",
280
+ inputs: {
281
+ disabled: {
282
+ classPropertyName: "disabled",
283
+ publicName: "disabled",
284
+ isSignal: true,
285
+ isRequired: false,
286
+ transformFunction: null
287
+ },
288
+ multiExpandable: {
289
+ classPropertyName: "multiExpandable",
290
+ publicName: "multiExpandable",
291
+ isSignal: true,
292
+ isRequired: false,
293
+ transformFunction: null
294
+ },
295
+ value: {
296
+ classPropertyName: "value",
297
+ publicName: "value",
298
+ isSignal: true,
299
+ isRequired: false,
300
+ transformFunction: null
301
+ },
302
+ skipDisabled: {
303
+ classPropertyName: "skipDisabled",
304
+ publicName: "skipDisabled",
305
+ isSignal: true,
306
+ isRequired: false,
307
+ transformFunction: null
308
+ },
309
+ wrap: {
310
+ classPropertyName: "wrap",
311
+ publicName: "wrap",
312
+ isSignal: true,
313
+ isRequired: false,
314
+ transformFunction: null
315
+ }
316
+ },
317
+ outputs: {
318
+ value: "valueChange"
319
+ },
320
+ host: {
321
+ classAttribute: "ng-accordion-group"
322
+ },
323
+ queries: [{
324
+ propertyName: "_triggers",
325
+ predicate: AccordionTrigger,
326
+ descendants: true,
327
+ isSignal: true
328
+ }, {
329
+ propertyName: "_panels",
330
+ predicate: AccordionPanel,
331
+ descendants: true,
332
+ isSignal: true
333
+ }],
334
+ exportAs: ["ngAccordionGroup"],
335
+ ngImport: i0
336
+ });
164
337
  }
165
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionGroup, decorators: [{
166
- type: Directive,
167
- args: [{
168
- selector: '[ngAccordionGroup]',
169
- exportAs: 'ngAccordionGroup',
170
- host: {
171
- 'class': 'ng-accordion-group',
172
- },
173
- }]
174
- }], ctorParameters: () => [] });
175
- /**
176
- * A structural directive that marks the `ng-template` to be used as the content
177
- * for a `AccordionPanel`. This content can be lazily loaded.
178
- */
338
+ i0.ɵɵngDeclareClassMetadata({
339
+ minVersion: "12.0.0",
340
+ version: "20.2.0-next.2",
341
+ ngImport: i0,
342
+ type: AccordionGroup,
343
+ decorators: [{
344
+ type: Directive,
345
+ args: [{
346
+ selector: '[ngAccordionGroup]',
347
+ exportAs: 'ngAccordionGroup',
348
+ host: {
349
+ 'class': 'ng-accordion-group'
350
+ }
351
+ }]
352
+ }],
353
+ ctorParameters: () => []
354
+ });
179
355
  class AccordionContent {
180
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
181
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.2.0-next.2", type: AccordionContent, isStandalone: true, selector: "ng-template[ngAccordionContent]", hostDirectives: [{ directive: i1.DeferredContent }], ngImport: i0 });
356
+ static ɵfac = i0.ɵɵngDeclareFactory({
357
+ minVersion: "12.0.0",
358
+ version: "20.2.0-next.2",
359
+ ngImport: i0,
360
+ type: AccordionContent,
361
+ deps: [],
362
+ target: i0.ɵɵFactoryTarget.Directive
363
+ });
364
+ static ɵdir = i0.ɵɵngDeclareDirective({
365
+ minVersion: "14.0.0",
366
+ version: "20.2.0-next.2",
367
+ type: AccordionContent,
368
+ isStandalone: true,
369
+ selector: "ng-template[ngAccordionContent]",
370
+ hostDirectives: [{
371
+ directive: i1.DeferredContent
372
+ }],
373
+ ngImport: i0
374
+ });
182
375
  }
183
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: AccordionContent, decorators: [{
184
- type: Directive,
185
- args: [{
186
- selector: 'ng-template[ngAccordionContent]',
187
- hostDirectives: [DeferredContent],
188
- }]
189
- }] });
376
+ i0.ɵɵngDeclareClassMetadata({
377
+ minVersion: "12.0.0",
378
+ version: "20.2.0-next.2",
379
+ ngImport: i0,
380
+ type: AccordionContent,
381
+ decorators: [{
382
+ type: Directive,
383
+ args: [{
384
+ selector: 'ng-template[ngAccordionContent]',
385
+ hostDirectives: [DeferredContent]
386
+ }]
387
+ }]
388
+ });
190
389
 
191
390
  export { AccordionContent, AccordionGroup, AccordionPanel, AccordionTrigger };
192
391
  //# sourceMappingURL=accordion.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"accordion.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/aria/accordion/accordion.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 Directive,\n input,\n ElementRef,\n inject,\n contentChildren,\n afterRenderEffect,\n signal,\n model,\n booleanAttribute,\n computed,\n WritableSignal,\n} from '@angular/core';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {DeferredContent, DeferredContentAware} from '@angular/aria/deferred-content';\nimport {\n AccordionGroupPattern,\n AccordionPanelPattern,\n AccordionTriggerPattern,\n} from '@angular/aria/ui-patterns';\n\n/**\n * Represents the content panel of an accordion item. It is controlled by an\n * associated `AccordionTrigger`.\n */\n@Directive({\n selector: '[ngAccordionPanel]',\n exportAs: 'ngAccordionPanel',\n hostDirectives: [\n {\n directive: DeferredContentAware,\n inputs: ['preserveContent'],\n },\n ],\n host: {\n 'class': 'ng-accordion-panel',\n 'role': 'region',\n '[attr.id]': 'pattern.id()',\n '[attr.aria-labelledby]': 'pattern.accordionTrigger()?.id()',\n '[attr.inert]': 'pattern.hidden() ? true : null',\n },\n})\nexport class AccordionPanel {\n /** The DeferredContentAware host directive. */\n private readonly _deferredContentAware = inject(DeferredContentAware);\n\n /** A global unique identifier for the panel. */\n private readonly _id = inject(_IdGenerator).getId('accordion-trigger-');\n\n /** A local unique identifier for the panel, used to match with its trigger's value. */\n value = input.required<string>();\n\n /** The parent accordion trigger pattern that controls this panel. This is set by AccordionGroup. */\n readonly accordionTrigger: WritableSignal<AccordionTriggerPattern | undefined> =\n signal(undefined);\n\n /** The UI pattern instance for this panel. */\n readonly pattern: AccordionPanelPattern = new AccordionPanelPattern({\n id: () => this._id,\n value: this.value,\n accordionTrigger: () => this.accordionTrigger(),\n });\n\n constructor() {\n // Connect the panel's hidden state to the DeferredContentAware's visibility.\n afterRenderEffect(() => {\n this._deferredContentAware.contentVisible.set(!this.pattern.hidden());\n });\n }\n}\n\n/**\n * Represents the trigger button for an accordion item. It controls the expansion\n * state of an associated `AccordionPanel`.\n */\n@Directive({\n selector: '[ngAccordionTrigger]',\n exportAs: 'ngAccordionTrigger',\n host: {\n 'class': 'ng-accordion-trigger',\n '[attr.data-active]': 'pattern.active()',\n 'role': 'button',\n '[id]': 'pattern.id()',\n '[attr.aria-expanded]': 'pattern.expanded()',\n '[attr.aria-controls]': 'pattern.controls()',\n '[attr.aria-disabled]': 'pattern.disabled()',\n '[attr.disabled]': 'hardDisabled() ? true : null',\n '[attr.tabindex]': 'pattern.tabindex()',\n '(keydown)': 'pattern.onKeydown($event)',\n '(pointerdown)': 'pattern.onPointerdown($event)',\n '(focusin)': 'pattern.onFocus($event)',\n },\n})\nexport class AccordionTrigger {\n /** A global unique identifier for the trigger. */\n private readonly _id = inject(_IdGenerator).getId('ng-accordion-trigger-');\n\n /** A reference to the trigger element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** The parent AccordionGroup. */\n private readonly _accordionGroup = inject(AccordionGroup);\n\n /** A local unique identifier for the trigger, used to match with its panel's value. */\n value = input.required<string>();\n\n /** Whether the trigger is disabled. */\n disabled = input(false, {transform: booleanAttribute});\n\n /**\n * Whether this trigger is completely inaccessible.\n *\n * TODO(ok7sai): Consider move this to UI patterns.\n */\n readonly hardDisabled = computed(() => this.pattern.disabled() && this.pattern.tabindex() < 0);\n\n /** The accordion panel pattern controlled by this trigger. This is set by AccordionGroup. */\n readonly accordionPanel: WritableSignal<AccordionPanelPattern | undefined> = signal(undefined);\n\n /** The UI pattern instance for this trigger. */\n readonly pattern: AccordionTriggerPattern = new AccordionTriggerPattern({\n id: () => this._id,\n value: this.value,\n disabled: this.disabled,\n element: () => this._elementRef.nativeElement,\n accordionGroup: computed(() => this._accordionGroup.pattern),\n accordionPanel: this.accordionPanel,\n });\n}\n\n/**\n * Container for a group of accordion items. It manages the overall state and\n * interactions of the accordion, such as keyboard navigation and expansion mode.\n */\n@Directive({\n selector: '[ngAccordionGroup]',\n exportAs: 'ngAccordionGroup',\n host: {\n 'class': 'ng-accordion-group',\n },\n})\nexport class AccordionGroup {\n /** A reference to the group element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** The AccordionTriggers nested inside this group. */\n protected readonly _triggers = contentChildren(AccordionTrigger, {descendants: true});\n\n /** The AccordionPanels nested inside this group. */\n protected readonly _panels = contentChildren(AccordionPanel, {descendants: true});\n\n /** The text direction (ltr or rtl). */\n readonly textDirection = inject(Directionality).valueSignal;\n\n /** Whether the entire accordion group is disabled. */\n disabled = input(false, {transform: booleanAttribute});\n\n /** Whether multiple accordion items can be expanded simultaneously. */\n multiExpandable = input(true, {transform: booleanAttribute});\n\n /** The values of the current selected/expanded accordions. */\n value = model<string[]>([]);\n\n /** Whether disabled items should be skipped during keyboard navigation. */\n skipDisabled = input(true, {transform: booleanAttribute});\n\n /** Whether keyboard navigation should wrap around from the last item to the first, and vice-versa. */\n wrap = input(false, {transform: booleanAttribute});\n\n /** The UI pattern instance for this accordion group. */\n readonly pattern: AccordionGroupPattern = new AccordionGroupPattern({\n ...this,\n // TODO(ok7sai): Consider making `activeItem` an internal state in the pattern and call\n // `setDefaultState` in the CDK.\n activeItem: signal(undefined),\n items: computed(() => this._triggers().map(trigger => trigger.pattern)),\n expandedIds: this.value,\n // TODO(ok7sai): Investigate whether an accordion should support horizontal mode.\n orientation: () => 'vertical',\n element: () => this._elementRef.nativeElement,\n });\n\n constructor() {\n // Effect to link triggers with their corresponding panels and update the group's items.\n afterRenderEffect(() => {\n const triggers = this._triggers();\n const panels = this._panels();\n\n for (const trigger of triggers) {\n const panel = panels.find(p => p.value() === trigger.value());\n trigger.accordionPanel.set(panel?.pattern);\n if (panel) {\n panel.accordionTrigger.set(trigger.pattern);\n }\n }\n });\n }\n}\n\n/**\n * A structural directive that marks the `ng-template` to be used as the content\n * for a `AccordionPanel`. This content can be lazily loaded.\n */\n@Directive({\n selector: 'ng-template[ngAccordionContent]',\n hostDirectives: [DeferredContent],\n})\nexport class AccordionContent {}\n"],"names":[],"mappings":";;;;;;;;AA8BA;;;AAGG;MAkBU,cAAc,CAAA;;AAER,IAAA,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,CAAC;;IAGpD,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;;AAGvE,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;;AAGvB,IAAA,gBAAgB,GACvB,MAAM,CAAC,SAAS,4DAAC;;IAGV,OAAO,GAA0B,IAAI,qBAAqB,CAAC;AAClE,QAAA,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG;QAClB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,QAAA,gBAAgB,EAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE;AAChD,KAAA,CAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,iBAAiB,CAAC,MAAK;AACrB,YAAA,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;AACvE,SAAC,CAAC;;8GAzBO,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;kGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,UAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,kCAAA,EAAA,YAAA,EAAA,gCAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;kGAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAjB1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,cAAc,EAAE;AACd,wBAAA;AACE,4BAAA,SAAS,EAAE,oBAAoB;4BAC/B,MAAM,EAAE,CAAC,iBAAiB,CAAC;AAC5B,yBAAA;AACF,qBAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA,OAAO,EAAE,oBAAoB;AAC7B,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,WAAW,EAAE,cAAc;AAC3B,wBAAA,wBAAwB,EAAE,kCAAkC;AAC5D,wBAAA,cAAc,EAAE,gCAAgC;AACjD,qBAAA;AACF,iBAAA;;AA8BD;;;AAGG;MAmBU,gBAAgB,CAAA;;IAEV,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;;AAGzD,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGhC,IAAA,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC;;AAGzD,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;;AAGhC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAG,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA5B,EAAC,SAAS,EAAE,gBAAgB,EAAC,GAAC;AAEtD;;;;AAIG;IACM,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGrF,IAAA,cAAc,GAAsD,MAAM,CAAC,SAAS,0DAAC;;IAGrF,OAAO,GAA4B,IAAI,uBAAuB,CAAC;AACtE,QAAA,EAAE,EAAE,MAAM,IAAI,CAAC,GAAG;QAClB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa;QAC7C,cAAc,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAC5D,cAAc,EAAE,IAAI,CAAC,cAAc;AACpC,KAAA,CAAC;8GAlCS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAAA,EAAA,SAAA,EAAA,2BAAA,EAAA,aAAA,EAAA,+BAAA,EAAA,SAAA,EAAA,yBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;kGAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAlB5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,IAAI,EAAE;AACJ,wBAAA,OAAO,EAAE,sBAAsB;AAC/B,wBAAA,oBAAoB,EAAE,kBAAkB;AACxC,wBAAA,MAAM,EAAE,QAAQ;AAChB,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,sBAAsB,EAAE,oBAAoB;AAC5C,wBAAA,sBAAsB,EAAE,oBAAoB;AAC5C,wBAAA,sBAAsB,EAAE,oBAAoB;AAC5C,wBAAA,iBAAiB,EAAE,8BAA8B;AACjD,wBAAA,iBAAiB,EAAE,oBAAoB;AACvC,wBAAA,WAAW,EAAE,2BAA2B;AACxC,wBAAA,eAAe,EAAE,+BAA+B;AAChD,wBAAA,WAAW,EAAE,yBAAyB;AACvC,qBAAA;AACF,iBAAA;;AAsCD;;;AAGG;MAQU,cAAc,CAAA;;AAER,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;;AAG9B,IAAA,SAAS,GAAG,eAAe,CAAC,gBAAgB,6CAAG,WAAW,EAAE,IAAI,EAAA,CAAA,GAAA,CAAlB,EAAC,WAAW,EAAE,IAAI,EAAC,GAAC;;AAGlE,IAAA,OAAO,GAAG,eAAe,CAAC,cAAc,2CAAG,WAAW,EAAE,IAAI,EAAA,CAAA,GAAA,CAAlB,EAAC,WAAW,EAAE,IAAI,EAAC,GAAC;;AAGxE,IAAA,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAG3D,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAG,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA5B,EAAC,SAAS,EAAE,gBAAgB,EAAC,GAAC;;AAGtD,IAAA,eAAe,GAAG,KAAK,CAAC,IAAI,mDAAG,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA5B,EAAC,SAAS,EAAE,gBAAgB,EAAC,GAAC;;AAG5D,IAAA,KAAK,GAAG,KAAK,CAAW,EAAE,iDAAC;;AAG3B,IAAA,YAAY,GAAG,KAAK,CAAC,IAAI,gDAAG,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA5B,EAAC,SAAS,EAAE,gBAAgB,EAAC,GAAC;;AAGzD,IAAA,IAAI,GAAG,KAAK,CAAC,KAAK,wCAAG,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA5B,EAAC,SAAS,EAAE,gBAAgB,EAAC,GAAC;;IAGzC,OAAO,GAA0B,IAAI,qBAAqB,CAAC;AAClE,QAAA,GAAG,IAAI;;;AAGP,QAAA,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC;QAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACvE,WAAW,EAAE,IAAI,CAAC,KAAK;;AAEvB,QAAA,WAAW,EAAE,MAAM,UAAU;QAC7B,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa;AAC9C,KAAA,CAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,iBAAiB,CAAC,MAAK;AACrB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE;AACjC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;AAE7B,YAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC7D,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC1C,IAAI,KAAK,EAAE;oBACT,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;;;AAGjD,SAAC,CAAC;;8GAtDO,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;kGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,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,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAKsB,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,SAAA,EAGlB,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;kGARhD,cAAc,EAAA,UAAA,EAAA,CAAA;kBAP1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,IAAI,EAAE;AACJ,wBAAA,OAAO,EAAE,oBAAoB;AAC9B,qBAAA;AACF,iBAAA;;AA2DD;;;AAGG;MAKU,gBAAgB,CAAA;8GAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;kGAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iCAAiC;oBAC3C,cAAc,EAAE,CAAC,eAAe,CAAC;AAClC,iBAAA;;;;;"}
1
+ {"version":3,"file":"accordion.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/aria/accordion/accordion.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 Directive,\n input,\n ElementRef,\n inject,\n contentChildren,\n afterRenderEffect,\n signal,\n model,\n booleanAttribute,\n computed,\n WritableSignal,\n} from '@angular/core';\nimport {_IdGenerator} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {DeferredContent, DeferredContentAware} from '@angular/aria/deferred-content';\nimport {\n AccordionGroupPattern,\n AccordionPanelPattern,\n AccordionTriggerPattern,\n} from '@angular/aria/private';\n\n/**\n * Represents the content panel of an accordion item. It is controlled by an\n * associated `AccordionTrigger`.\n */\n@Directive({\n selector: '[ngAccordionPanel]',\n exportAs: 'ngAccordionPanel',\n hostDirectives: [\n {\n directive: DeferredContentAware,\n inputs: ['preserveContent'],\n },\n ],\n host: {\n 'class': 'ng-accordion-panel',\n 'role': 'region',\n '[attr.id]': '_pattern.id()',\n '[attr.aria-labelledby]': '_pattern.accordionTrigger()?.id()',\n '[attr.inert]': '_pattern.hidden() ? true : null',\n },\n})\nexport class AccordionPanel {\n /** The DeferredContentAware host directive. */\n private readonly _deferredContentAware = inject(DeferredContentAware);\n\n /** A global unique identifier for the panel. */\n private readonly _id = inject(_IdGenerator).getId('accordion-trigger-');\n\n /** A local unique identifier for the panel, used to match with its trigger's value. */\n value = input.required<string>();\n\n /** The parent accordion trigger pattern that controls this panel. This is set by AccordionGroup. */\n readonly accordionTrigger: WritableSignal<AccordionTriggerPattern | undefined> =\n signal(undefined);\n\n /** The UI pattern instance for this panel. */\n readonly _pattern: AccordionPanelPattern = new AccordionPanelPattern({\n id: () => this._id,\n value: this.value,\n accordionTrigger: () => this.accordionTrigger(),\n });\n\n constructor() {\n // Connect the panel's hidden state to the DeferredContentAware's visibility.\n afterRenderEffect(() => {\n this._deferredContentAware.contentVisible.set(!this._pattern.hidden());\n });\n }\n}\n\n/**\n * Represents the trigger button for an accordion item. It controls the expansion\n * state of an associated `AccordionPanel`.\n */\n@Directive({\n selector: '[ngAccordionTrigger]',\n exportAs: 'ngAccordionTrigger',\n host: {\n 'class': 'ng-accordion-trigger',\n '[attr.data-active]': '_pattern.active()',\n 'role': 'button',\n '[id]': '_pattern.id()',\n '[attr.aria-expanded]': '_pattern.expanded()',\n '[attr.aria-controls]': '_pattern.controls()',\n '[attr.aria-disabled]': '_pattern.disabled()',\n '[attr.disabled]': 'hardDisabled() ? true : null',\n '[attr.tabindex]': '_pattern.tabindex()',\n '(keydown)': '_pattern.onKeydown($event)',\n '(pointerdown)': '_pattern.onPointerdown($event)',\n '(focusin)': '_pattern.onFocus($event)',\n },\n})\nexport class AccordionTrigger {\n /** A global unique identifier for the trigger. */\n private readonly _id = inject(_IdGenerator).getId('ng-accordion-trigger-');\n\n /** A reference to the trigger element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** The parent AccordionGroup. */\n private readonly _accordionGroup = inject(AccordionGroup);\n\n /** A local unique identifier for the trigger, used to match with its panel's value. */\n value = input.required<string>();\n\n /** Whether the trigger is disabled. */\n disabled = input(false, {transform: booleanAttribute});\n\n /**\n * Whether this trigger is completely inaccessible.\n *\n * TODO(ok7sai): Consider move this to UI patterns.\n */\n readonly hardDisabled = computed(() => this._pattern.disabled() && this._pattern.tabindex() < 0);\n\n /** The accordion panel pattern controlled by this trigger. This is set by AccordionGroup. */\n readonly accordionPanel: WritableSignal<AccordionPanelPattern | undefined> = signal(undefined);\n\n /** The UI pattern instance for this trigger. */\n readonly _pattern: AccordionTriggerPattern = new AccordionTriggerPattern({\n id: () => this._id,\n value: this.value,\n disabled: this.disabled,\n element: () => this._elementRef.nativeElement,\n accordionGroup: computed(() => this._accordionGroup._pattern),\n accordionPanel: this.accordionPanel,\n });\n}\n\n/**\n * Container for a group of accordion items. It manages the overall state and\n * interactions of the accordion, such as keyboard navigation and expansion mode.\n */\n@Directive({\n selector: '[ngAccordionGroup]',\n exportAs: 'ngAccordionGroup',\n host: {\n 'class': 'ng-accordion-group',\n },\n})\nexport class AccordionGroup {\n /** A reference to the group element. */\n private readonly _elementRef = inject(ElementRef);\n\n /** The AccordionTriggers nested inside this group. */\n protected readonly _triggers = contentChildren(AccordionTrigger, {descendants: true});\n\n /** The AccordionPanels nested inside this group. */\n protected readonly _panels = contentChildren(AccordionPanel, {descendants: true});\n\n /** The text direction (ltr or rtl). */\n readonly textDirection = inject(Directionality).valueSignal;\n\n /** Whether the entire accordion group is disabled. */\n disabled = input(false, {transform: booleanAttribute});\n\n /** Whether multiple accordion items can be expanded simultaneously. */\n multiExpandable = input(true, {transform: booleanAttribute});\n\n /** The values of the current selected/expanded accordions. */\n value = model<string[]>([]);\n\n /** Whether disabled items should be skipped during keyboard navigation. */\n skipDisabled = input(true, {transform: booleanAttribute});\n\n /** Whether keyboard navigation should wrap around from the last item to the first, and vice-versa. */\n wrap = input(false, {transform: booleanAttribute});\n\n /** The UI pattern instance for this accordion group. */\n readonly _pattern: AccordionGroupPattern = new AccordionGroupPattern({\n ...this,\n // TODO(ok7sai): Consider making `activeItem` an internal state in the pattern and call\n // `setDefaultState` in the CDK.\n activeItem: signal(undefined),\n items: computed(() => this._triggers().map(trigger => trigger._pattern)),\n expandedIds: this.value,\n // TODO(ok7sai): Investigate whether an accordion should support horizontal mode.\n orientation: () => 'vertical',\n element: () => this._elementRef.nativeElement,\n });\n\n constructor() {\n // Effect to link triggers with their corresponding panels and update the group's items.\n afterRenderEffect(() => {\n const triggers = this._triggers();\n const panels = this._panels();\n\n for (const trigger of triggers) {\n const panel = panels.find(p => p.value() === trigger.value());\n trigger.accordionPanel.set(panel?._pattern);\n if (panel) {\n panel.accordionTrigger.set(trigger._pattern);\n }\n }\n });\n }\n}\n\n/**\n * A structural directive that marks the `ng-template` to be used as the content\n * for a `AccordionPanel`. This content can be lazily loaded.\n */\n@Directive({\n selector: 'ng-template[ngAccordionContent]',\n hostDirectives: [DeferredContent],\n})\nexport class AccordionContent {}\n"],"names":["AccordionPanel","accordionTrigger","signal","undefined","ngDevMode","debugName","_pattern","AccordionPanelPattern","value","constructor","afterRenderEffect","_deferredContentAware","contentVisible","set","hidden","ɵfac","i0","ɵɵngDeclareFactory","minVersion","version","ngImport","type","deps","target","ɵɵFactoryTarget","Directive","decorators","args","selector","ctorParameters","input","required","disabled","transform","booleanAttribute","hardDisabled","computed","tabindex","element","_elementRef","nativeElement","accordionGroup","_accordionGroup","AccordionTrigger","ɵdir","ɵɵngDeclareDirective","isStandalone","inputs","classPropertyName","publicName","isSignal","isRequired","transformFunction","host","attributes","listeners","properties","classAttribute","exportAs","textDirection","inject","Directionality","valueSignal","wrap","AccordionGroupPattern","items","_triggers","map","trigger","triggers","AccordionContent"],"mappings":"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"}