@ojiepermana/angular-component 22.0.44 → 22.0.46

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 (65) hide show
  1. package/fesm2022/ojiepermana-angular-component-accordion.mjs +9 -11
  2. package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs +100 -32
  3. package/fesm2022/ojiepermana-angular-component-alert.mjs +5 -9
  4. package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs +2 -3
  5. package/fesm2022/ojiepermana-angular-component-avatar.mjs +7 -13
  6. package/fesm2022/ojiepermana-angular-component-badge.mjs +2 -3
  7. package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs +16 -19
  8. package/fesm2022/ojiepermana-angular-component-button-group.mjs +4 -7
  9. package/fesm2022/ojiepermana-angular-component-button.mjs +2 -3
  10. package/fesm2022/ojiepermana-angular-component-calendar.mjs +7 -5
  11. package/fesm2022/ojiepermana-angular-component-card.mjs +8 -15
  12. package/fesm2022/ojiepermana-angular-component-carousel.mjs +15 -18
  13. package/fesm2022/ojiepermana-angular-component-checkbox.mjs +40 -11
  14. package/fesm2022/ojiepermana-angular-component-collapsible.mjs +8 -6
  15. package/fesm2022/ojiepermana-angular-component-combobox.mjs +36 -16
  16. package/fesm2022/ojiepermana-angular-component-command.mjs +25 -21
  17. package/fesm2022/ojiepermana-angular-component-composer.mjs +15 -18
  18. package/fesm2022/ojiepermana-angular-component-date-picker.mjs +36 -11
  19. package/fesm2022/ojiepermana-angular-component-dialog.mjs +85 -30
  20. package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs +31 -26
  21. package/fesm2022/ojiepermana-angular-component-editor.mjs +37 -28
  22. package/fesm2022/ojiepermana-angular-component-empty.mjs +7 -13
  23. package/fesm2022/ojiepermana-angular-component-form.mjs +32 -24
  24. package/fesm2022/ojiepermana-angular-component-hover-card.mjs +2 -3
  25. package/fesm2022/ojiepermana-angular-component-icon.mjs +51 -6
  26. package/fesm2022/ojiepermana-angular-component-input-group.mjs +17 -15
  27. package/fesm2022/ojiepermana-angular-component-input-otp.mjs +15 -14
  28. package/fesm2022/ojiepermana-angular-component-input.mjs +2 -3
  29. package/fesm2022/ojiepermana-angular-component-item.mjs +11 -21
  30. package/fesm2022/ojiepermana-angular-component-kanban.mjs +27 -26
  31. package/fesm2022/ojiepermana-angular-component-kbd.mjs +3 -5
  32. package/fesm2022/ojiepermana-angular-component-label.mjs +2 -3
  33. package/fesm2022/ojiepermana-angular-component-menubar.mjs +6 -6
  34. package/fesm2022/ojiepermana-angular-component-native-select.mjs +3 -3
  35. package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs +25 -12
  36. package/fesm2022/ojiepermana-angular-component-pagination.mjs +22 -13
  37. package/fesm2022/ojiepermana-angular-component-pillbox.mjs +70 -36
  38. package/fesm2022/ojiepermana-angular-component-progress.mjs +7 -5
  39. package/fesm2022/ojiepermana-angular-component-radio.mjs +21 -10
  40. package/fesm2022/ojiepermana-angular-component-resizable.mjs +22 -11
  41. package/fesm2022/ojiepermana-angular-component-scroll-area.mjs +8 -6
  42. package/fesm2022/ojiepermana-angular-component-select.mjs +29 -17
  43. package/fesm2022/ojiepermana-angular-component-separator.mjs +2 -3
  44. package/fesm2022/ojiepermana-angular-component-sheet.mjs +89 -30
  45. package/fesm2022/ojiepermana-angular-component-skeleton.mjs +2 -3
  46. package/fesm2022/ojiepermana-angular-component-slider.mjs +25 -13
  47. package/fesm2022/ojiepermana-angular-component-spinner.mjs +6 -5
  48. package/fesm2022/ojiepermana-angular-component-switch.mjs +17 -8
  49. package/fesm2022/ojiepermana-angular-component-table.mjs +9 -17
  50. package/fesm2022/ojiepermana-angular-component-tabs.mjs +5 -9
  51. package/fesm2022/ojiepermana-angular-component-textarea.mjs +2 -3
  52. package/fesm2022/ojiepermana-angular-component-timeline.mjs +22 -17
  53. package/fesm2022/ojiepermana-angular-component-toggle-group.mjs +12 -6
  54. package/fesm2022/ojiepermana-angular-component-toggle.mjs +2 -3
  55. package/fesm2022/ojiepermana-angular-component-tooltip.mjs +7 -6
  56. package/package.json +10 -1
  57. package/types/ojiepermana-angular-component-alert-dialog.d.ts +42 -3
  58. package/types/ojiepermana-angular-component-combobox.d.ts +4 -1
  59. package/types/ojiepermana-angular-component-command.d.ts +7 -2
  60. package/types/ojiepermana-angular-component-dialog.d.ts +33 -3
  61. package/types/ojiepermana-angular-component-form.d.ts +9 -0
  62. package/types/ojiepermana-angular-component-icon.d.ts +48 -1
  63. package/types/ojiepermana-angular-component-radio.d.ts +4 -1
  64. package/types/ojiepermana-angular-component-sheet.d.ts +33 -3
  65. package/types/ojiepermana-angular-component-timeline.d.ts +2 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, booleanAttribute, computed, ChangeDetectionStrategy, Component, inject } from '@angular/core';
2
+ import { input, booleanAttribute, computed, Component, inject } from '@angular/core';
3
3
  import { cn } from '@ojiepermana/angular-component/utils';
4
4
 
5
5
  const TIMELINE_BASE = [
@@ -53,16 +53,17 @@ class TimelineComponent {
53
53
  ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
54
54
  class = input('', /* @ts-ignore */
55
55
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
56
- classes = computed(() => cn(TIMELINE_BASE, timelineSizeClasses[this.size()], this.horizontal() ? 'flex min-w-0 items-start gap-[var(--timeline-item-gap)] overflow-x-auto pb-1' : 'grid', this.class()), /* @ts-ignore */
56
+ classes = computed(() => cn(TIMELINE_BASE, timelineSizeClasses[this.size()], this.horizontal()
57
+ ? 'flex min-w-0 items-start gap-[var(--timeline-item-gap)] overflow-x-auto pb-1'
58
+ : 'grid', this.class()), /* @ts-ignore */
57
59
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
58
60
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineComponent, isStandalone: true, selector: "Timeline", inputs: { horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline\"", "attr.data-orientation": "horizontal() ? \"horizontal\" : \"vertical\"", "attr.data-align": "align()", "attr.data-size": "size()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineComponent, isStandalone: true, selector: "Timeline", inputs: { horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline\"", "attr.data-orientation": "horizontal() ? \"horizontal\" : \"vertical\"", "attr.data-align": "align()", "attr.data-size": "size()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
60
62
  }
61
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineComponent, decorators: [{
62
64
  type: Component,
63
65
  args: [{
64
66
  selector: 'Timeline',
65
- changeDetection: ChangeDetectionStrategy.OnPush,
66
67
  host: {
67
68
  '[class]': 'classes()',
68
69
  '[attr.data-slot]': '"timeline"',
@@ -108,13 +109,12 @@ class TimelineItemComponent {
108
109
  }, /* @ts-ignore */
109
110
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
110
111
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
111
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineItemComponent, isStandalone: true, selector: "TimelineItem", inputs: { status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-item\"", "attr.data-orientation": "orientation()", "attr.data-align": "resolvedAlign()", "attr.data-size": "resolvedSize()", "attr.data-status": "status() ?? null" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
112
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineItemComponent, isStandalone: true, selector: "TimelineItem", inputs: { status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-item\"", "attr.data-orientation": "orientation()", "attr.data-align": "resolvedAlign()", "attr.data-size": "resolvedSize()", "attr.data-status": "status() ?? null" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
112
113
  }
113
114
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineItemComponent, decorators: [{
114
115
  type: Component,
115
116
  args: [{
116
117
  selector: 'TimelineItem',
117
- changeDetection: ChangeDetectionStrategy.OnPush,
118
118
  host: {
119
119
  '[class]': 'classes()',
120
120
  '[attr.data-slot]': '"timeline-item"',
@@ -134,6 +134,7 @@ class TimelineIndicatorComponent {
134
134
  ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
135
135
  color = input(null, /* @ts-ignore */
136
136
  ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
137
+ ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
137
138
  class = input('', /* @ts-ignore */
138
139
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
139
140
  resolvedStatus = computed(() => this.status() ?? this.item?.status() ?? 'incomplete', /* @ts-ignore */
@@ -144,20 +145,25 @@ class TimelineIndicatorComponent {
144
145
  ? 'bg-background text-muted-foreground'
145
146
  : [
146
147
  'size-[var(--timeline-indicator-size)] rounded-full border text-xs font-medium shadow-sm',
147
- color ? timelineIndicatorColorClasses[color] : timelineIndicatorStatusClasses[this.resolvedStatus()],
148
+ color
149
+ ? timelineIndicatorColorClasses[color]
150
+ : timelineIndicatorStatusClasses[this.resolvedStatus()],
148
151
  ].join(' '), this.class());
149
152
  }, /* @ts-ignore */
150
153
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
151
154
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineIndicatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
152
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineIndicatorComponent, isStandalone: true, selector: "TimelineIndicator", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-indicator\"", "attr.data-variant": "variant()", "attr.data-status": "resolvedStatus()", "attr.data-color": "color() ?? null" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
155
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineIndicatorComponent, isStandalone: true, selector: "TimelineIndicator", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, status: { classPropertyName: "status", publicName: "status", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "ariaLabel() ? \"img\" : null", "attr.aria-label": "ariaLabel()", "attr.data-slot": "\"timeline-indicator\"", "attr.data-variant": "variant()", "attr.data-status": "resolvedStatus()", "attr.data-color": "color() ?? null" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
153
156
  }
154
157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineIndicatorComponent, decorators: [{
155
158
  type: Component,
156
159
  args: [{
157
160
  selector: 'TimelineIndicator',
158
- changeDetection: ChangeDetectionStrategy.OnPush,
159
161
  host: {
160
162
  '[class]': 'classes()',
163
+ // A labeled indicator is a status graphic (role="img" so aria-label is valid);
164
+ // without a label it stays a decorative marker.
165
+ '[attr.role]': 'ariaLabel() ? "img" : null',
166
+ '[attr.aria-label]': 'ariaLabel()',
161
167
  '[attr.data-slot]': '"timeline-indicator"',
162
168
  '[attr.data-variant]': 'variant()',
163
169
  '[attr.data-status]': 'resolvedStatus()',
@@ -165,21 +171,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
165
171
  },
166
172
  template: `<ng-content />`,
167
173
  }]
168
- }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
174
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
169
175
  class TimelineContentComponent {
170
176
  item = inject(TimelineItemComponent, { optional: true });
171
177
  class = input('', /* @ts-ignore */
172
178
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
173
- classes = computed(() => cn('min-w-0 text-sm leading-6 text-foreground', this.item?.orientation() === 'horizontal' ? 'row-start-2 max-w-40 text-center' : 'col-start-2 row-start-1', this.class()), /* @ts-ignore */
179
+ classes = computed(() => cn('min-w-0 text-sm leading-6 text-foreground', this.item?.orientation() === 'horizontal'
180
+ ? 'row-start-2 max-w-40 text-center'
181
+ : 'col-start-2 row-start-1', this.class()), /* @ts-ignore */
174
182
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
175
183
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
176
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineContentComponent, isStandalone: true, selector: "TimelineContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-content\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
184
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineContentComponent, isStandalone: true, selector: "TimelineContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-content\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
177
185
  }
178
186
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineContentComponent, decorators: [{
179
187
  type: Component,
180
188
  args: [{
181
189
  selector: 'TimelineContent',
182
- changeDetection: ChangeDetectionStrategy.OnPush,
183
190
  host: {
184
191
  '[class]': 'classes()',
185
192
  '[attr.data-slot]': '"timeline-content"',
@@ -194,13 +201,12 @@ class TimelineBlockComponent {
194
201
  classes = computed(() => cn('min-w-0', this.item?.orientation() === 'horizontal' ? 'row-start-2 w-full' : 'col-span-full', this.class()), /* @ts-ignore */
195
202
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
196
203
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
197
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineBlockComponent, isStandalone: true, selector: "TimelineBlock", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-block\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
204
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineBlockComponent, isStandalone: true, selector: "TimelineBlock", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-block\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
198
205
  }
199
206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineBlockComponent, decorators: [{
200
207
  type: Component,
201
208
  args: [{
202
209
  selector: 'TimelineBlock',
203
- changeDetection: ChangeDetectionStrategy.OnPush,
204
210
  host: {
205
211
  '[class]': 'classes()',
206
212
  '[attr.data-slot]': '"timeline-block"',
@@ -214,13 +220,12 @@ class TimelineSubgridComponent {
214
220
  classes = computed(() => cn('grid min-w-0 grid-cols-[var(--timeline-indicator-size)_minmax(0,1fr)] gap-x-[var(--timeline-content-gap)]', this.class()), /* @ts-ignore */
215
221
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
216
222
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineSubgridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
217
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineSubgridComponent, isStandalone: true, selector: "TimelineSubgrid", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-subgrid\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
223
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TimelineSubgridComponent, isStandalone: true, selector: "TimelineSubgrid", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"timeline-subgrid\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
218
224
  }
219
225
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TimelineSubgridComponent, decorators: [{
220
226
  type: Component,
221
227
  args: [{
222
228
  selector: 'TimelineSubgrid',
223
- changeDetection: ChangeDetectionStrategy.OnPush,
224
229
  host: {
225
230
  '[class]': 'classes()',
226
231
  '[attr.data-slot]': '"timeline-subgrid"',
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, input, model, numberAttribute, inject, ElementRef, signal, computed, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { Directive, input, model, numberAttribute, inject, ElementRef, signal, computed, forwardRef, Component } from '@angular/core';
3
3
  import { toggleVariants } from '@ojiepermana/angular-component/toggle';
4
4
  import { cn } from '@ojiepermana/angular-component/utils';
5
5
 
@@ -117,7 +117,9 @@ class ToggleGroupComponent extends ToggleGroupContextBase {
117
117
  return;
118
118
  this.focusedValue.set(value);
119
119
  if (this.type() === 'multiple') {
120
- this.values.update((current) => current.includes(value) ? current.filter((itemValue) => itemValue !== value) : [...current, value]);
120
+ this.values.update((current) => current.includes(value)
121
+ ? current.filter((itemValue) => itemValue !== value)
122
+ : [...current, value]);
121
123
  return;
122
124
  }
123
125
  this.value.set(this.value() === value ? null : value);
@@ -174,19 +176,23 @@ class ToggleGroupComponent extends ToggleGroupContextBase {
174
176
  this.registrationVersion.update((version) => version + 1);
175
177
  }
176
178
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: ToggleGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
177
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: ToggleGroupComponent, isStandalone: true, selector: "ToggleGroup", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange" }, host: { properties: { "class": "classes()", "attr.role": "\"group\"", "attr.dir": "dir() ?? null", "attr.aria-orientation": "orientation()", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-orientation": "orientation()", "attr.data-slot": "\"toggle-group\"", "attr.data-type": "type()" } }, providers: [{ provide: ToggleGroupContextBase, useExisting: forwardRef(() => ToggleGroupComponent) }], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
179
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: ToggleGroupComponent, isStandalone: true, selector: "ToggleGroup", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, values: { classPropertyName: "values", publicName: "values", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, loop: { classPropertyName: "loop", publicName: "loop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, dir: { classPropertyName: "dir", publicName: "dir", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", values: "valuesChange" }, host: { properties: { "class": "classes()", "attr.role": "\"group\"", "attr.dir": "dir() ?? null", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-orientation": "orientation()", "attr.data-slot": "\"toggle-group\"", "attr.data-type": "type()" } }, providers: [
180
+ { provide: ToggleGroupContextBase, useExisting: forwardRef(() => ToggleGroupComponent) },
181
+ ], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true });
178
182
  }
179
183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: ToggleGroupComponent, decorators: [{
180
184
  type: Component,
181
185
  args: [{
182
186
  selector: 'ToggleGroup',
183
- changeDetection: ChangeDetectionStrategy.OnPush,
184
- providers: [{ provide: ToggleGroupContextBase, useExisting: forwardRef(() => ToggleGroupComponent) }],
187
+ providers: [
188
+ { provide: ToggleGroupContextBase, useExisting: forwardRef(() => ToggleGroupComponent) },
189
+ ],
185
190
  host: {
186
191
  '[class]': 'classes()',
187
192
  '[attr.role]': '"group"',
188
193
  '[attr.dir]': 'dir() ?? null',
189
- '[attr.aria-orientation]': 'orientation()',
194
+ // aria-orientation is not allowed on role="group" (axe aria-allowed-attr);
195
+ // data-orientation below drives the visual layout instead.
190
196
  '[attr.data-disabled]': 'disabled() ? "" : null',
191
197
  '[attr.data-orientation]': 'orientation()',
192
198
  '[attr.data-slot]': '"toggle-group"',
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { model, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { model, input, computed, Component } from '@angular/core';
3
3
  import { cn } from '@ojiepermana/angular-component/utils';
4
4
  import { cva } from 'class-variance-authority';
5
5
 
@@ -52,13 +52,12 @@ class ToggleComponent {
52
52
  this.pressed.update((pressed) => !pressed);
53
53
  }
54
54
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: ToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: ToggleComponent, isStandalone: true, selector: "button[Toggle]", inputs: { pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pressed: "pressedChange" }, host: { attributes: { "type": "button" }, listeners: { "click": "toggle()" }, properties: { "class": "classes()", "attr.aria-pressed": "pressed()", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-size": "size()", "attr.data-state": "pressed() ? \"on\" : \"off\"", "attr.data-variant": "variant()", "disabled": "disabled() || null" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
55
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: ToggleComponent, isStandalone: true, selector: "button[Toggle]", inputs: { pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pressed: "pressedChange" }, host: { attributes: { "type": "button" }, listeners: { "click": "toggle()" }, properties: { "class": "classes()", "attr.aria-pressed": "pressed()", "attr.data-disabled": "disabled() ? \"\" : null", "attr.data-size": "size()", "attr.data-state": "pressed() ? \"on\" : \"off\"", "attr.data-variant": "variant()", "disabled": "disabled() || null" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
56
56
  }
57
57
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: ToggleComponent, decorators: [{
58
58
  type: Component,
59
59
  args: [{
60
60
  selector: 'button[Toggle]',
61
- changeDetection: ChangeDetectionStrategy.OnPush,
62
61
  host: {
63
62
  '[class]': 'classes()',
64
63
  type: 'button',
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, input, forwardRef, ChangeDetectionStrategy, Component, inject, TemplateRef, computed, Directive, ViewContainerRef, ElementRef, DestroyRef, output, signal, effect } from '@angular/core';
2
+ import { InjectionToken, input, forwardRef, Component, inject, TemplateRef, computed, Directive, ViewContainerRef, ElementRef, DestroyRef, output, signal, effect } from '@angular/core';
3
3
  import { radiusBaseValue, densityBaseValue, connectedPositionFor, oppositeSide, uniqueId, overlayDismissals } from '@ojiepermana/angular-component/utils';
4
4
  import { Overlay } from '@angular/cdk/overlay';
5
5
  import { TemplatePortal, ComponentPortal } from '@angular/cdk/portal';
@@ -18,13 +18,12 @@ class TooltipComponent {
18
18
  closeDelay = input(0, /* @ts-ignore */
19
19
  ...(ngDevMode ? [{ debugName: "closeDelay" }] : /* istanbul ignore next */ []));
20
20
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TooltipComponent, isStandalone: true, selector: "Tooltip", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null }, openDelay: { classPropertyName: "openDelay", publicName: "openDelay", isSignal: true, isRequired: false, transformFunction: null }, closeDelay: { classPropertyName: "closeDelay", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, providers: [{ provide: TOOLTIP_DEFAULTS, useExisting: forwardRef(() => TooltipComponent) }], ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
21
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: TooltipComponent, isStandalone: true, selector: "Tooltip", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, sideOffset: { classPropertyName: "sideOffset", publicName: "sideOffset", isSignal: true, isRequired: false, transformFunction: null }, openDelay: { classPropertyName: "openDelay", publicName: "openDelay", isSignal: true, isRequired: false, transformFunction: null }, closeDelay: { classPropertyName: "closeDelay", publicName: "closeDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, providers: [{ provide: TOOLTIP_DEFAULTS, useExisting: forwardRef(() => TooltipComponent) }], ngImport: i0, template: '<ng-content />', isInline: true });
22
22
  }
23
23
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TooltipComponent, decorators: [{
24
24
  type: Component,
25
25
  args: [{
26
26
  selector: 'Tooltip',
27
- changeDetection: ChangeDetectionStrategy.OnPush,
28
27
  providers: [{ provide: TOOLTIP_DEFAULTS, useExisting: forwardRef(() => TooltipComponent) }],
29
28
  host: {
30
29
  class: 'contents',
@@ -323,12 +322,11 @@ class TooltipTextComponent {
323
322
  text = signal('', /* @ts-ignore */
324
323
  ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
325
324
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TooltipTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
326
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: TooltipTextComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `{{ text() }}`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
325
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: TooltipTextComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: `{{ text() }}`, isInline: true });
327
326
  }
328
327
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: TooltipTextComponent, decorators: [{
329
328
  type: Component,
330
329
  args: [{
331
- changeDetection: ChangeDetectionStrategy.OnPush,
332
330
  template: `{{ text() }}`,
333
331
  }]
334
332
  }] });
@@ -377,7 +375,10 @@ class TooltipDirective {
377
375
  const positionStrategy = this.overlay
378
376
  .position()
379
377
  .flexibleConnectedTo(this.el)
380
- .withPositions([connectedPositionFor(side, 'center', 4), connectedPositionFor(oppositeSide(side), 'center', 4)])
378
+ .withPositions([
379
+ connectedPositionFor(side, 'center', 4),
380
+ connectedPositionFor(oppositeSide(side), 'center', 4),
381
+ ])
381
382
  .withPush(false)
382
383
  .withFlexibleDimensions(false);
383
384
  this.overlayRef = this.overlay.create({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ojiepermana/angular-component",
3
- "version": "22.0.44",
3
+ "version": "22.0.46",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/edsis/angular.git"
@@ -21,6 +21,15 @@
21
21
  "peerDependenciesMeta": {
22
22
  "@angular/material": {
23
23
  "optional": true
24
+ },
25
+ "@angular/forms": {
26
+ "optional": true
27
+ },
28
+ "@angular/platform-browser": {
29
+ "optional": true
30
+ },
31
+ "@angular/router": {
32
+ "optional": true
24
33
  }
25
34
  },
26
35
  "dependencies": {
@@ -3,6 +3,15 @@ import { ButtonVariant, ButtonSize } from '@ojiepermana/angular-component/button
3
3
 
4
4
  type AlertDialogSize = 'default' | 'sm';
5
5
 
6
+ /**
7
+ * Confirmation dialog with `role="alertdialog"`.
8
+ *
9
+ * For the accessible name/description to wire up automatically, project the
10
+ * matching `AlertDialogTitle` / `AlertDialogDescription` parts (they register
11
+ * their ids with this component). Plain `DialogTitle` / `DialogDescription` will
12
+ * not auto-wire here — pass `aria-labelledby` / `aria-describedby` explicitly if
13
+ * you use custom markup.
14
+ */
6
15
  declare class AlertDialogComponent {
7
16
  readonly open: _angular_core.ModelSignal<boolean>;
8
17
  readonly closeOnEscape: _angular_core.InputSignal<boolean>;
@@ -11,17 +20,33 @@ declare class AlertDialogComponent {
11
20
  readonly closeButtonLabel: _angular_core.InputSignal<string>;
12
21
  readonly labelledBy: _angular_core.InputSignal<string | null>;
13
22
  readonly describedBy: _angular_core.InputSignal<string | null>;
23
+ /** ARIA role passed to the underlying dialog surface. `'alertdialog'` by default. */
24
+ readonly role: _angular_core.InputSignal<string>;
14
25
  readonly class: _angular_core.InputSignal<string>;
15
26
  readonly radius: _angular_core.InputSignal<"sm" | "inherit" | "none" | "md" | "lg" | "xl" | "full">;
16
27
  readonly density: _angular_core.InputSignal<"inherit" | "compact" | "normal" | "relaxed" | "spacious">;
17
28
  readonly openedChange: _angular_core.OutputEmitterRef<boolean>;
18
29
  private readonly contentSize;
30
+ private readonly registeredTitleId;
31
+ private readonly registeredDescriptionId;
19
32
  readonly resolvedSize: _angular_core.Signal<AlertDialogSize>;
20
33
  protected readonly surfaceClasses: _angular_core.Signal<string>;
34
+ /** Explicit `aria-labelledby` wins; otherwise a projected `AlertDialogTitle` supplies the id. */
35
+ protected readonly resolvedLabelledBy: _angular_core.Signal<string | null>;
36
+ /** Explicit `aria-describedby` wins; otherwise a projected `AlertDialogDescription` supplies the id. */
37
+ protected readonly resolvedDescribedBy: _angular_core.Signal<string | null>;
21
38
  setContentSize(size: AlertDialogSize): void;
39
+ /** Called by a projected `AlertDialogTitle` so default usage has an accessible name (AXE-safe). */
40
+ registerTitleId(id: string | null): void;
41
+ /** Cleared by an `AlertDialogTitle` on destroy so a reopened alert never points at a stale id. */
42
+ unregisterTitleId(id: string): void;
43
+ /** Called by a projected `AlertDialogDescription`. */
44
+ registerDescriptionId(id: string | null): void;
45
+ /** Cleared by an `AlertDialogDescription` on destroy. */
46
+ unregisterDescriptionId(id: string): void;
22
47
  close(): void;
23
48
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AlertDialogComponent, never>;
24
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogComponent, "AlertDialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "labelledBy": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "describedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "openedChange": "openedChange"; }, never, ["*"], true, never>;
49
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogComponent, "AlertDialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "labelledBy": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "describedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "openedChange": "openedChange"; }, never, ["*"], true, never>;
25
50
  }
26
51
 
27
52
  declare class AlertDialogContentComponent {
@@ -40,16 +65,30 @@ declare class AlertDialogHeaderComponent {
40
65
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogHeaderComponent, "AlertDialogHeader", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
41
66
  }
42
67
  declare class AlertDialogTitleComponent {
68
+ /** Explicit id override; when omitted a document-unique id is generated. */
69
+ readonly id: _angular_core.InputSignal<string | null>;
43
70
  readonly class: _angular_core.InputSignal<string>;
71
+ private readonly autoId;
72
+ private readonly alertDialog;
73
+ /** The id rendered on the element, used by the parent alert dialog for aria-labelledby. */
74
+ readonly resolvedId: _angular_core.Signal<string>;
44
75
  protected readonly classes: _angular_core.Signal<string>;
76
+ constructor();
45
77
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AlertDialogTitleComponent, never>;
46
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogTitleComponent, "AlertDialogTitle, h2[AlertDialogTitle]", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
78
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogTitleComponent, "AlertDialogTitle, h2[AlertDialogTitle]", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
47
79
  }
48
80
  declare class AlertDialogDescriptionComponent {
81
+ /** Explicit id override; when omitted a document-unique id is generated. */
82
+ readonly id: _angular_core.InputSignal<string | null>;
49
83
  readonly class: _angular_core.InputSignal<string>;
84
+ private readonly autoId;
85
+ private readonly alertDialog;
86
+ /** The id rendered on the element, used by the parent alert dialog for aria-describedby. */
87
+ readonly resolvedId: _angular_core.Signal<string>;
50
88
  protected readonly classes: _angular_core.Signal<string>;
89
+ constructor();
51
90
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AlertDialogDescriptionComponent, never>;
52
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogDescriptionComponent, "AlertDialogDescription, p[AlertDialogDescription]", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
91
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AlertDialogDescriptionComponent, "AlertDialogDescription, p[AlertDialogDescription]", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
53
92
  }
54
93
  declare class AlertDialogMediaComponent {
55
94
  readonly class: _angular_core.InputSignal<string>;
@@ -18,6 +18,9 @@ declare class ComboboxComponent<T = unknown> implements ControlValueAccessor {
18
18
  readonly options: _angular_core.InputSignal<readonly ComboboxOption<T>[]>;
19
19
  readonly value: _angular_core.ModelSignal<T | null>;
20
20
  readonly placeholder: _angular_core.InputSignal<string>;
21
+ /** Accessible name for the combobox trigger (its text content is the value, not a name). */
22
+ readonly ariaLabel: _angular_core.InputSignal<string | null>;
23
+ readonly ariaLabelledby: _angular_core.InputSignal<string | null>;
21
24
  readonly searchPlaceholder: _angular_core.InputSignal<string>;
22
25
  readonly emptyText: _angular_core.InputSignal<string>;
23
26
  readonly disabled: _angular_core.ModelSignal<boolean>;
@@ -46,7 +49,7 @@ declare class ComboboxComponent<T = unknown> implements ControlValueAccessor {
46
49
  registerOnTouched(fn: () => void): void;
47
50
  setDisabledState(state: boolean): void;
48
51
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComboboxComponent<any>, never>;
49
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ComboboxComponent<any>, "Combobox", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; }, never, never, true, never>;
52
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ComboboxComponent<any>, "Combobox", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; }, never, never, true, never>;
50
53
  }
51
54
 
52
55
  export { ComboboxComponent };
@@ -3,6 +3,8 @@ import { model } from '@angular/core';
3
3
 
4
4
  /** Base class exposed to children for context lookup. */
5
5
  declare abstract class CommandContextBase {
6
+ /** Shared id linking the combobox input (aria-controls) to the listbox. */
7
+ readonly listboxId: string;
6
8
  abstract query: ReturnType<typeof model<string>>;
7
9
  abstract matches(text: string): boolean;
8
10
  abstract registerItem(item: CommandItemComponent): void;
@@ -48,10 +50,13 @@ declare class CommandInputComponent {
48
50
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommandInputComponent, "input[CommandInput]", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
49
51
  }
50
52
  declare class CommandListComponent {
53
+ protected readonly ctx: CommandContextBase;
51
54
  readonly class: _angular_core.InputSignal<string>;
55
+ /** Accessible name for the listbox (required on role="listbox"). */
56
+ readonly ariaLabel: _angular_core.InputSignal<string>;
52
57
  protected readonly classes: _angular_core.Signal<string>;
53
58
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommandListComponent, never>;
54
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommandListComponent, "CommandList", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
59
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CommandListComponent, "CommandList", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
55
60
  }
56
61
  declare class CommandEmptyComponent {
57
62
  protected readonly ctx: CommandComponent;
@@ -80,7 +85,7 @@ declare class CommandItemComponent {
80
85
  readonly value: _angular_core.InputSignal<string>;
81
86
  readonly disabled: _angular_core.InputSignal<boolean>;
82
87
  readonly class: _angular_core.InputSignal<string>;
83
- readonly selected: _angular_core.OutputEmitterRef<MouseEvent | KeyboardEvent>;
88
+ readonly selected: _angular_core.OutputEmitterRef<KeyboardEvent | MouseEvent>;
84
89
  readonly active: _angular_core.WritableSignal<boolean>;
85
90
  readonly visible: _angular_core.Signal<boolean>;
86
91
  protected readonly classes: _angular_core.Signal<string>;
@@ -30,10 +30,26 @@ declare class DialogComponent {
30
30
  readonly closeButtonLabel: _angular_core.InputSignal<string>;
31
31
  readonly labelledBy: _angular_core.InputSignal<string | null>;
32
32
  readonly describedBy: _angular_core.InputSignal<string | null>;
33
+ /** ARIA role for the surface. `'dialog'` by default; `AlertDialog` sets `'alertdialog'`. */
34
+ readonly role: _angular_core.InputSignal<string>;
33
35
  readonly class: _angular_core.InputSignal<string>;
34
36
  readonly radius: _angular_core.InputSignal<"inherit" | "none" | "sm" | "md" | "lg" | "xl" | "full">;
35
37
  readonly density: _angular_core.InputSignal<"inherit" | "compact" | "normal" | "relaxed" | "spacious">;
36
38
  readonly openedChange: _angular_core.OutputEmitterRef<boolean>;
39
+ private readonly registeredTitleId;
40
+ private readonly registeredDescriptionId;
41
+ /** Explicit `aria-labelledby` wins; otherwise a projected `DialogTitle` supplies the id. */
42
+ protected readonly resolvedLabelledBy: _angular_core.Signal<string | null>;
43
+ /** Explicit `aria-describedby` wins; otherwise a projected `DialogDescription` supplies the id. */
44
+ protected readonly resolvedDescribedBy: _angular_core.Signal<string | null>;
45
+ /** Called by a projected `DialogTitle` so default usage has an accessible name (AXE-safe). */
46
+ registerTitleId(id: string | null): void;
47
+ /** Cleared by a `DialogTitle` on destroy so a closed/reopened dialog never points at a stale id. */
48
+ unregisterTitleId(id: string): void;
49
+ /** Called by a projected `DialogDescription`. */
50
+ registerDescriptionId(id: string | null): void;
51
+ /** Cleared by a `DialogDescription` on destroy. */
52
+ unregisterDescriptionId(id: string): void;
37
53
  private readonly tpl;
38
54
  private overlayRef;
39
55
  private focusTrap;
@@ -47,7 +63,7 @@ declare class DialogComponent {
47
63
  private requestClose;
48
64
  close(): void;
49
65
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DialogComponent, never>;
50
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogComponent, "Dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "labelledBy": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "describedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "openedChange": "openedChange"; }, never, ["*"], true, never>;
66
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogComponent, "Dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "closeOnBackdropClick": { "alias": "closeOnBackdropClick"; "required": false; "isSignal": true; }; "showCloseButton": { "alias": "showCloseButton"; "required": false; "isSignal": true; }; "closeButtonLabel": { "alias": "closeButtonLabel"; "required": false; "isSignal": true; }; "labelledBy": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "describedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "radius": { "alias": "radius"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "openedChange": "openedChange"; }, never, ["*"], true, never>;
51
67
  }
52
68
 
53
69
  declare class DialogCloseDirective {
@@ -64,16 +80,30 @@ declare class DialogHeaderComponent {
64
80
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogHeaderComponent, "DialogHeader", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
65
81
  }
66
82
  declare class DialogTitleComponent {
83
+ /** Explicit id override; when omitted a document-unique id is generated. */
84
+ readonly id: _angular_core.InputSignal<string | null>;
67
85
  readonly class: _angular_core.InputSignal<string>;
86
+ private readonly autoId;
87
+ private readonly dialog;
88
+ /** The id rendered on the element, used by the parent dialog for aria-labelledby. */
89
+ readonly resolvedId: _angular_core.Signal<string>;
68
90
  protected readonly classes: _angular_core.Signal<string>;
91
+ constructor();
69
92
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DialogTitleComponent, never>;
70
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogTitleComponent, "DialogTitle, h2[DialogTitle]", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
93
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogTitleComponent, "DialogTitle, h2[DialogTitle]", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
71
94
  }
72
95
  declare class DialogDescriptionComponent {
96
+ /** Explicit id override; when omitted a document-unique id is generated. */
97
+ readonly id: _angular_core.InputSignal<string | null>;
73
98
  readonly class: _angular_core.InputSignal<string>;
99
+ private readonly autoId;
100
+ private readonly dialog;
101
+ /** The id rendered on the element, used by the parent dialog for aria-describedby. */
102
+ readonly resolvedId: _angular_core.Signal<string>;
74
103
  protected readonly classes: _angular_core.Signal<string>;
104
+ constructor();
75
105
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DialogDescriptionComponent, never>;
76
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogDescriptionComponent, "DialogDescription, p[DialogDescription]", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
106
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogDescriptionComponent, "DialogDescription, p[DialogDescription]", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
77
107
  }
78
108
  declare class DialogContentComponent {
79
109
  readonly class: _angular_core.InputSignal<string>;
@@ -8,12 +8,20 @@ import { AbstractControl } from '@angular/forms';
8
8
  */
9
9
  declare class FormFieldContext {
10
10
  readonly controlId: string;
11
+ readonly labelId: string;
11
12
  readonly descriptionId: string;
12
13
  readonly messageId: string;
13
14
  readonly control: _angular_core.WritableSignal<AbstractControl<any, any, any> | null>;
14
15
  readonly manualInvalid: _angular_core.WritableSignal<boolean>;
16
+ readonly hasLabel: _angular_core.WritableSignal<boolean>;
15
17
  readonly hasDescription: _angular_core.WritableSignal<boolean>;
16
18
  readonly hasMessage: _angular_core.WritableSignal<boolean>;
19
+ /**
20
+ * `aria-labelledby` for the control. `<FormLabel>` renders as a custom element,
21
+ * so the native `for`/`id` pairing does not associate it — point the control at
22
+ * the label's id explicitly so it has an accessible name (axe `select-name`/`label`).
23
+ */
24
+ readonly labelledBy: _angular_core.Signal<string | null>;
17
25
  private readonly statusTick;
18
26
  readonly invalid: _angular_core.Signal<boolean>;
19
27
  readonly firstError: _angular_core.Signal<string | null>;
@@ -84,6 +92,7 @@ declare class FormTitleComponent {
84
92
  declare class FormLabelComponent {
85
93
  protected readonly ctx: FormFieldContext;
86
94
  readonly class: _angular_core.InputSignal<string>;
95
+ constructor();
87
96
  protected readonly classes: _angular_core.Signal<string>;
88
97
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormLabelComponent, never>;
89
98
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormLabelComponent, "FormLabel, label[FormLabel]", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;