@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
@@ -2,12 +2,12 @@ import { Overlay } from '@angular/cdk/overlay';
2
2
  import { TemplatePortal } from '@angular/cdk/portal';
3
3
  import { FocusTrapFactory } from '@angular/cdk/a11y';
4
4
  import * as i0 from '@angular/core';
5
- import { inject, ViewContainerRef, DestroyRef, model, input, output, viewChild, computed, effect, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
5
+ import { inject, ViewContainerRef, DestroyRef, model, input, output, signal, computed, viewChild, effect, Component, Directive } from '@angular/core';
6
6
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import { DOCUMENT } from '@angular/common';
8
8
  import { filter } from 'rxjs/operators';
9
9
  import { ButtonComponent } from '@ojiepermana/angular-component/button';
10
- import { cn, radiusBaseValue, densityBaseValue } from '@ojiepermana/angular-component/utils';
10
+ import { cn, radiusBaseValue, densityBaseValue, uniqueId } from '@ojiepermana/angular-component/utils';
11
11
 
12
12
  /**
13
13
  * Declarative modal dialog. Renders into the body via CDK overlay when
@@ -44,6 +44,9 @@ class DialogComponent {
44
44
  ...(ngDevMode ? [{ debugName: "closeButtonLabel" }] : /* istanbul ignore next */ []));
45
45
  labelledBy = input(null, { ...(ngDevMode ? { debugName: "labelledBy" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
46
46
  describedBy = input(null, { ...(ngDevMode ? { debugName: "describedBy" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
47
+ /** ARIA role for the surface. `'dialog'` by default; `AlertDialog` sets `'alertdialog'`. */
48
+ role = input('dialog', /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "role" }] : /* istanbul ignore next */ []));
47
50
  class = input('', /* @ts-ignore */
48
51
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
49
52
  radius = input('inherit', /* @ts-ignore */
@@ -51,6 +54,36 @@ class DialogComponent {
51
54
  density = input('inherit', /* @ts-ignore */
52
55
  ...(ngDevMode ? [{ debugName: "density" }] : /* istanbul ignore next */ []));
53
56
  openedChange = output();
57
+ registeredTitleId = signal(null, /* @ts-ignore */
58
+ ...(ngDevMode ? [{ debugName: "registeredTitleId" }] : /* istanbul ignore next */ []));
59
+ registeredDescriptionId = signal(null, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "registeredDescriptionId" }] : /* istanbul ignore next */ []));
61
+ /** Explicit `aria-labelledby` wins; otherwise a projected `DialogTitle` supplies the id. */
62
+ resolvedLabelledBy = computed(() => this.labelledBy() ?? this.registeredTitleId(), /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "resolvedLabelledBy" }] : /* istanbul ignore next */ []));
64
+ /** Explicit `aria-describedby` wins; otherwise a projected `DialogDescription` supplies the id. */
65
+ resolvedDescribedBy = computed(() => this.describedBy() ?? this.registeredDescriptionId(), /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "resolvedDescribedBy" }] : /* istanbul ignore next */ []));
67
+ /** Called by a projected `DialogTitle` so default usage has an accessible name (AXE-safe). */
68
+ registerTitleId(id) {
69
+ this.registeredTitleId.set(id);
70
+ }
71
+ /** Cleared by a `DialogTitle` on destroy so a closed/reopened dialog never points at a stale id. */
72
+ unregisterTitleId(id) {
73
+ if (this.registeredTitleId() === id) {
74
+ this.registeredTitleId.set(null);
75
+ }
76
+ }
77
+ /** Called by a projected `DialogDescription`. */
78
+ registerDescriptionId(id) {
79
+ this.registeredDescriptionId.set(id);
80
+ }
81
+ /** Cleared by a `DialogDescription` on destroy. */
82
+ unregisterDescriptionId(id) {
83
+ if (this.registeredDescriptionId() === id) {
84
+ this.registeredDescriptionId.set(null);
85
+ }
86
+ }
54
87
  tpl = viewChild.required('tpl');
55
88
  overlayRef = null;
56
89
  focusTrap = null;
@@ -117,17 +150,18 @@ class DialogComponent {
117
150
  this.requestClose();
118
151
  }
119
152
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
120
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DialogComponent, isStandalone: true, selector: "Dialog", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdropClick: { classPropertyName: "closeOnBackdropClick", publicName: "closeOnBackdropClick", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, closeButtonLabel: { classPropertyName: "closeButtonLabel", publicName: "closeButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, labelledBy: { classPropertyName: "labelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, describedBy: { classPropertyName: "describedBy", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", openedChange: "openedChange" }, viewQueries: [{ propertyName: "tpl", first: true, predicate: ["tpl"], descendants: true, isSignal: true }], ngImport: i0, template: `
153
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: DialogComponent, isStandalone: true, selector: "Dialog", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, closeOnEscape: { classPropertyName: "closeOnEscape", publicName: "closeOnEscape", isSignal: true, isRequired: false, transformFunction: null }, closeOnBackdropClick: { classPropertyName: "closeOnBackdropClick", publicName: "closeOnBackdropClick", isSignal: true, isRequired: false, transformFunction: null }, showCloseButton: { classPropertyName: "showCloseButton", publicName: "showCloseButton", isSignal: true, isRequired: false, transformFunction: null }, closeButtonLabel: { classPropertyName: "closeButtonLabel", publicName: "closeButtonLabel", isSignal: true, isRequired: false, transformFunction: null }, labelledBy: { classPropertyName: "labelledBy", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, describedBy: { classPropertyName: "describedBy", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", openedChange: "openedChange" }, viewQueries: [{ propertyName: "tpl", first: true, predicate: ["tpl"], descendants: true, isSignal: true }], ngImport: i0, template: `
121
154
  <ng-template #tpl>
122
155
  <div
123
156
  class="dialog-surface"
124
- role="dialog"
157
+ [attr.role]="role()"
125
158
  aria-modal="true"
126
- [attr.aria-labelledby]="labelledBy()"
127
- [attr.aria-describedby]="describedBy()"
159
+ [attr.aria-labelledby]="resolvedLabelledBy()"
160
+ [attr.aria-describedby]="resolvedDescribedBy()"
128
161
  [class]="surfaceClasses()"
129
162
  [style.--radius-base]="radiusBase()"
130
- [style.--spacing-base]="densityBase()">
163
+ [style.--spacing-base]="densityBase()"
164
+ >
131
165
  @if (showCloseButton()) {
132
166
  <button
133
167
  type="button"
@@ -136,7 +170,8 @@ class DialogComponent {
136
170
  size="icon-sm"
137
171
  class="dialog-close-button absolute right-4 top-4 h-8 w-8 rounded-md p-0 text-muted-foreground opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring"
138
172
  [attr.aria-label]="closeButtonLabel()"
139
- (click)="close()">
173
+ (click)="close()"
174
+ >
140
175
  <span aria-hidden="true">X</span>
141
176
  <span class="sr-only">{{ closeButtonLabel() }}</span>
142
177
  </button>
@@ -144,25 +179,25 @@ class DialogComponent {
144
179
  <ng-content />
145
180
  </div>
146
181
  </ng-template>
147
- `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[Button], a[Button]", inputs: ["variant", "size", "class", "radius", "density"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
182
+ `, isInline: true, dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[Button], a[Button]", inputs: ["variant", "size", "class", "radius", "density"] }] });
148
183
  }
149
184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogComponent, decorators: [{
150
185
  type: Component,
151
186
  args: [{
152
187
  selector: 'Dialog',
153
- changeDetection: ChangeDetectionStrategy.OnPush,
154
188
  imports: [ButtonComponent],
155
189
  template: `
156
190
  <ng-template #tpl>
157
191
  <div
158
192
  class="dialog-surface"
159
- role="dialog"
193
+ [attr.role]="role()"
160
194
  aria-modal="true"
161
- [attr.aria-labelledby]="labelledBy()"
162
- [attr.aria-describedby]="describedBy()"
195
+ [attr.aria-labelledby]="resolvedLabelledBy()"
196
+ [attr.aria-describedby]="resolvedDescribedBy()"
163
197
  [class]="surfaceClasses()"
164
198
  [style.--radius-base]="radiusBase()"
165
- [style.--spacing-base]="densityBase()">
199
+ [style.--spacing-base]="densityBase()"
200
+ >
166
201
  @if (showCloseButton()) {
167
202
  <button
168
203
  type="button"
@@ -171,7 +206,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
171
206
  size="icon-sm"
172
207
  class="dialog-close-button absolute right-4 top-4 h-8 w-8 rounded-md p-0 text-muted-foreground opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-2 focus-visible:ring-ring"
173
208
  [attr.aria-label]="closeButtonLabel()"
174
- (click)="close()">
209
+ (click)="close()"
210
+ >
175
211
  <span aria-hidden="true">X</span>
176
212
  <span class="sr-only">{{ closeButtonLabel() }}</span>
177
213
  </button>
@@ -181,7 +217,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
181
217
  </ng-template>
182
218
  `,
183
219
  }]
184
- }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], closeOnBackdropClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdropClick", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }], closeButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButtonLabel", required: false }] }], labelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], describedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], radius: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }], tpl: [{ type: i0.ViewChild, args: ['tpl', { isSignal: true }] }] } });
220
+ }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], closeOnEscape: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEscape", required: false }] }], closeOnBackdropClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdropClick", required: false }] }], showCloseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCloseButton", required: false }] }], closeButtonLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeButtonLabel", required: false }] }], labelledBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], describedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], radius: [{ type: i0.Input, args: [{ isSignal: true, alias: "radius", required: false }] }], density: [{ type: i0.Input, args: [{ isSignal: true, alias: "density", required: false }] }], openedChange: [{ type: i0.Output, args: ["openedChange"] }], tpl: [{ type: i0.ViewChild, args: ['tpl', { isSignal: true }] }] } });
185
221
 
186
222
  class DialogCloseDirective {
187
223
  dialog = inject(DialogComponent);
@@ -207,64 +243,84 @@ class DialogHeaderComponent {
207
243
  classes = computed(() => cn('flex flex-col gap-1.5 text-center sm:text-left', this.class()), /* @ts-ignore */
208
244
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
209
245
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
210
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogHeaderComponent, isStandalone: true, selector: "DialogHeader", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
246
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogHeaderComponent, isStandalone: true, selector: "DialogHeader", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
211
247
  }
212
248
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogHeaderComponent, decorators: [{
213
249
  type: Component,
214
250
  args: [{
215
251
  selector: 'DialogHeader',
216
- changeDetection: ChangeDetectionStrategy.OnPush,
217
252
  host: { '[class]': 'classes()' },
218
253
  template: `<ng-content />`,
219
254
  }]
220
255
  }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
221
256
  class DialogTitleComponent {
257
+ /** Explicit id override; when omitted a document-unique id is generated. */
258
+ id = input(null, /* @ts-ignore */
259
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
222
260
  class = input('', /* @ts-ignore */
223
261
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
262
+ autoId = uniqueId('dialog-title');
263
+ dialog = inject(DialogComponent, { optional: true });
264
+ /** The id rendered on the element, used by the parent dialog for aria-labelledby. */
265
+ resolvedId = computed(() => this.id() ?? this.autoId, /* @ts-ignore */
266
+ ...(ngDevMode ? [{ debugName: "resolvedId" }] : /* istanbul ignore next */ []));
224
267
  classes = computed(() => cn('text-lg font-semibold leading-none tracking-tight', this.class()), /* @ts-ignore */
225
268
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
269
+ constructor() {
270
+ effect(() => this.dialog?.registerTitleId(this.resolvedId()));
271
+ inject(DestroyRef).onDestroy(() => this.dialog?.unregisterTitleId(this.resolvedId()));
272
+ }
226
273
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
227
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogTitleComponent, isStandalone: true, selector: "DialogTitle, h2[DialogTitle]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
274
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogTitleComponent, isStandalone: true, selector: "DialogTitle, h2[DialogTitle]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "resolvedId()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
228
275
  }
229
276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogTitleComponent, decorators: [{
230
277
  type: Component,
231
278
  args: [{
232
279
  selector: 'DialogTitle, h2[DialogTitle]',
233
- changeDetection: ChangeDetectionStrategy.OnPush,
234
- host: { '[class]': 'classes()' },
280
+ host: { '[class]': 'classes()', '[attr.id]': 'resolvedId()' },
235
281
  template: `<ng-content />`,
236
282
  }]
237
- }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
283
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
238
284
  class DialogDescriptionComponent {
285
+ /** Explicit id override; when omitted a document-unique id is generated. */
286
+ id = input(null, /* @ts-ignore */
287
+ ...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
239
288
  class = input('', /* @ts-ignore */
240
289
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
290
+ autoId = uniqueId('dialog-description');
291
+ dialog = inject(DialogComponent, { optional: true });
292
+ /** The id rendered on the element, used by the parent dialog for aria-describedby. */
293
+ resolvedId = computed(() => this.id() ?? this.autoId, /* @ts-ignore */
294
+ ...(ngDevMode ? [{ debugName: "resolvedId" }] : /* istanbul ignore next */ []));
241
295
  classes = computed(() => cn('text-sm text-muted-foreground', this.class()), /* @ts-ignore */
242
296
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
297
+ constructor() {
298
+ effect(() => this.dialog?.registerDescriptionId(this.resolvedId()));
299
+ inject(DestroyRef).onDestroy(() => this.dialog?.unregisterDescriptionId(this.resolvedId()));
300
+ }
243
301
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
244
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogDescriptionComponent, isStandalone: true, selector: "DialogDescription, p[DialogDescription]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
302
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogDescriptionComponent, isStandalone: true, selector: "DialogDescription, p[DialogDescription]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "resolvedId()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
245
303
  }
246
304
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogDescriptionComponent, decorators: [{
247
305
  type: Component,
248
306
  args: [{
249
307
  selector: 'DialogDescription, p[DialogDescription]',
250
- changeDetection: ChangeDetectionStrategy.OnPush,
251
- host: { '[class]': 'classes()' },
308
+ host: { '[class]': 'classes()', '[attr.id]': 'resolvedId()' },
252
309
  template: `<ng-content />`,
253
310
  }]
254
- }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
311
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
255
312
  class DialogContentComponent {
256
313
  class = input('', /* @ts-ignore */
257
314
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
258
315
  classes = computed(() => cn('grid gap-4', this.class()), /* @ts-ignore */
259
316
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
260
317
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
261
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogContentComponent, isStandalone: true, selector: "DialogContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
318
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogContentComponent, isStandalone: true, selector: "DialogContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
262
319
  }
263
320
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogContentComponent, decorators: [{
264
321
  type: Component,
265
322
  args: [{
266
323
  selector: 'DialogContent',
267
- changeDetection: ChangeDetectionStrategy.OnPush,
268
324
  host: { '[class]': 'classes()' },
269
325
  template: `<ng-content />`,
270
326
  }]
@@ -275,13 +331,12 @@ class DialogFooterComponent {
275
331
  classes = computed(() => cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end sm:gap-2', this.class()), /* @ts-ignore */
276
332
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
277
333
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
278
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogFooterComponent, isStandalone: true, selector: "DialogFooter", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
334
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: DialogFooterComponent, isStandalone: true, selector: "DialogFooter", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
279
335
  }
280
336
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: DialogFooterComponent, decorators: [{
281
337
  type: Component,
282
338
  args: [{
283
339
  selector: 'DialogFooter',
284
- changeDetection: ChangeDetectionStrategy.OnPush,
285
340
  host: { '[class]': 'classes()' },
286
341
  template: `<ng-content />`,
287
342
  }]
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, output, Directive, computed, ChangeDetectionStrategy, Component, model, forwardRef, ContentChildren, TemplateRef, ViewContainerRef, DestroyRef, signal } from '@angular/core';
2
+ import { inject, ElementRef, input, output, Directive, computed, Component, model, forwardRef, ContentChildren, TemplateRef, ViewContainerRef, DestroyRef, signal } from '@angular/core';
3
3
  import { cn, radiusBaseValue, densityBaseValue, connectedPositionFor, oppositeSide } from '@ojiepermana/angular-component/utils';
4
4
  import { FocusKeyManager } from '@angular/cdk/a11y';
5
5
  import { Overlay } from '@angular/cdk/overlay';
@@ -50,13 +50,12 @@ class MenuGroupComponent {
50
50
  classes = computed(() => cn('block', this.class()), /* @ts-ignore */
51
51
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
52
52
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
53
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuGroupComponent, isStandalone: true, selector: "MenuGroup", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "\"group\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
53
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuGroupComponent, isStandalone: true, selector: "MenuGroup", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "\"group\"" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
54
54
  }
55
55
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuGroupComponent, decorators: [{
56
56
  type: Component,
57
57
  args: [{
58
58
  selector: 'MenuGroup',
59
- changeDetection: ChangeDetectionStrategy.OnPush,
60
59
  host: {
61
60
  '[class]': 'classes()',
62
61
  '[attr.role]': '"group"',
@@ -85,14 +84,17 @@ class MenuRadioGroupComponent extends MenuRadioGroupBase {
85
84
  this.value.set(value);
86
85
  }
87
86
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuRadioGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
88
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuRadioGroupComponent, isStandalone: true, selector: "MenuRadioGroup", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class": "classes()", "attr.role": "\"group\"" } }, providers: [{ provide: MenuRadioGroupBase, useExisting: forwardRef(() => MenuRadioGroupComponent) }], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
87
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuRadioGroupComponent, isStandalone: true, selector: "MenuRadioGroup", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class": "classes()", "attr.role": "\"group\"" } }, providers: [
88
+ { provide: MenuRadioGroupBase, useExisting: forwardRef(() => MenuRadioGroupComponent) },
89
+ ], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true });
89
90
  }
90
91
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuRadioGroupComponent, decorators: [{
91
92
  type: Component,
92
93
  args: [{
93
94
  selector: 'MenuRadioGroup',
94
- changeDetection: ChangeDetectionStrategy.OnPush,
95
- providers: [{ provide: MenuRadioGroupBase, useExisting: forwardRef(() => MenuRadioGroupComponent) }],
95
+ providers: [
96
+ { provide: MenuRadioGroupBase, useExisting: forwardRef(() => MenuRadioGroupComponent) },
97
+ ],
96
98
  host: {
97
99
  '[class]': 'classes()',
98
100
  '[attr.role]': '"group"',
@@ -107,13 +109,12 @@ class MenuItemComponent extends MenuFocusableItem {
107
109
  this.emitSelection(e);
108
110
  }
109
111
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
110
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: MenuItemComponent, isStandalone: true, selector: "MenuItem, button[MenuItem]", host: { attributes: { "tabindex": "-1" }, listeners: { "click": "handleClick($any($event))", "keydown.enter": "handleClick($any($event))", "keydown.space": "handleClick($any($event))" }, properties: { "class": "classes()", "attr.role": "\"menuitem\"", "attr.aria-disabled": "disabled ? \"true\" : null", "attr.data-inset": "inset() ? \"true\" : null", "attr.data-variant": "variant()" } }, providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuItemComponent) }], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
112
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: MenuItemComponent, isStandalone: true, selector: "MenuItem, button[MenuItem]", host: { attributes: { "tabindex": "-1" }, listeners: { "click": "handleClick($any($event))", "keydown.enter": "handleClick($any($event))", "keydown.space": "handleClick($any($event))" }, properties: { "class": "classes()", "attr.role": "\"menuitem\"", "attr.aria-disabled": "disabled ? \"true\" : null", "attr.data-inset": "inset() ? \"true\" : null", "attr.data-variant": "variant()" } }, providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuItemComponent) }], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true });
111
113
  }
112
114
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuItemComponent, decorators: [{
113
115
  type: Component,
114
116
  args: [{
115
117
  selector: 'MenuItem, button[MenuItem]',
116
- changeDetection: ChangeDetectionStrategy.OnPush,
117
118
  providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuItemComponent) }],
118
119
  host: {
119
120
  '[class]': 'classes()',
@@ -141,7 +142,9 @@ class MenuCheckboxItemComponent extends MenuFocusableItem {
141
142
  this.checked.set(!this.checked());
142
143
  }
143
144
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuCheckboxItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
144
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: MenuCheckboxItemComponent, isStandalone: true, selector: "MenuCheckboxItem, button[MenuCheckboxItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "toggle($any($event))", "keydown.enter": "toggle($any($event))", "keydown.space": "toggle($any($event))" }, properties: { "class": "classes()", "attr.role": "\"menuitemcheckbox\"", "attr.aria-disabled": "disabled ? \"true\" : null", "attr.aria-checked": "checked()", "attr.data-state": "checked() ? \"checked\" : \"unchecked\"", "attr.data-variant": "variant()" } }, providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuCheckboxItemComponent) }], usesInheritance: true, ngImport: i0, template: `
145
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: MenuCheckboxItemComponent, isStandalone: true, selector: "MenuCheckboxItem, button[MenuCheckboxItem]", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { checked: "checkedChange" }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "toggle($any($event))", "keydown.enter": "toggle($any($event))", "keydown.space": "toggle($any($event))" }, properties: { "class": "classes()", "attr.role": "\"menuitemcheckbox\"", "attr.aria-disabled": "disabled ? \"true\" : null", "attr.aria-checked": "checked()", "attr.data-state": "checked() ? \"checked\" : \"unchecked\"", "attr.data-variant": "variant()" } }, providers: [
146
+ { provide: MenuFocusableItem, useExisting: forwardRef(() => MenuCheckboxItemComponent) },
147
+ ], usesInheritance: true, ngImport: i0, template: `
145
148
  <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
146
149
  @if (checked()) {
147
150
  <svg
@@ -152,20 +155,22 @@ class MenuCheckboxItemComponent extends MenuFocusableItem {
152
155
  stroke="currentColor"
153
156
  stroke-width="2"
154
157
  stroke-linecap="round"
155
- stroke-linejoin="round">
158
+ stroke-linejoin="round"
159
+ >
156
160
  <polyline points="20 6 9 17 4 12" />
157
161
  </svg>
158
162
  }
159
163
  </span>
160
164
  <ng-content />
161
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
165
+ `, isInline: true });
162
166
  }
163
167
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuCheckboxItemComponent, decorators: [{
164
168
  type: Component,
165
169
  args: [{
166
170
  selector: 'MenuCheckboxItem, button[MenuCheckboxItem]',
167
- changeDetection: ChangeDetectionStrategy.OnPush,
168
- providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuCheckboxItemComponent) }],
171
+ providers: [
172
+ { provide: MenuFocusableItem, useExisting: forwardRef(() => MenuCheckboxItemComponent) },
173
+ ],
169
174
  host: {
170
175
  '[class]': 'classes()',
171
176
  '[attr.role]': '"menuitemcheckbox"',
@@ -189,7 +194,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
189
194
  stroke="currentColor"
190
195
  stroke-width="2"
191
196
  stroke-linecap="round"
192
- stroke-linejoin="round">
197
+ stroke-linejoin="round"
198
+ >
193
199
  <polyline points="20 6 9 17 4 12" />
194
200
  </svg>
195
201
  }
@@ -213,21 +219,24 @@ class MenuRadioItemComponent extends MenuFocusableItem {
213
219
  this.group.select(this.value());
214
220
  }
215
221
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuRadioItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
216
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: MenuRadioItemComponent, isStandalone: true, selector: "MenuRadioItem, button[MenuRadioItem]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "select($any($event))", "keydown.enter": "select($any($event))", "keydown.space": "select($any($event))" }, properties: { "class": "classes()", "attr.role": "\"menuitemradio\"", "attr.aria-disabled": "disabled ? \"true\" : null", "attr.aria-checked": "checked()", "attr.data-state": "checked() ? \"checked\" : \"unchecked\"", "attr.data-variant": "variant()" } }, providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuRadioItemComponent) }], usesInheritance: true, ngImport: i0, template: `
222
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: MenuRadioItemComponent, isStandalone: true, selector: "MenuRadioItem, button[MenuRadioItem]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, host: { attributes: { "tabindex": "-1" }, listeners: { "click": "select($any($event))", "keydown.enter": "select($any($event))", "keydown.space": "select($any($event))" }, properties: { "class": "classes()", "attr.role": "\"menuitemradio\"", "attr.aria-disabled": "disabled ? \"true\" : null", "attr.aria-checked": "checked()", "attr.data-state": "checked() ? \"checked\" : \"unchecked\"", "attr.data-variant": "variant()" } }, providers: [
223
+ { provide: MenuFocusableItem, useExisting: forwardRef(() => MenuRadioItemComponent) },
224
+ ], usesInheritance: true, ngImport: i0, template: `
217
225
  <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
218
226
  @if (checked()) {
219
227
  <span aria-hidden="true" class="h-2 w-2 rounded-full bg-current"></span>
220
228
  }
221
229
  </span>
222
230
  <ng-content />
223
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
231
+ `, isInline: true });
224
232
  }
225
233
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuRadioItemComponent, decorators: [{
226
234
  type: Component,
227
235
  args: [{
228
236
  selector: 'MenuRadioItem, button[MenuRadioItem]',
229
- changeDetection: ChangeDetectionStrategy.OnPush,
230
- providers: [{ provide: MenuFocusableItem, useExisting: forwardRef(() => MenuRadioItemComponent) }],
237
+ providers: [
238
+ { provide: MenuFocusableItem, useExisting: forwardRef(() => MenuRadioItemComponent) },
239
+ ],
231
240
  host: {
232
241
  '[class]': 'classes()',
233
242
  '[attr.role]': '"menuitemradio"',
@@ -256,13 +265,12 @@ class MenuSeparatorComponent {
256
265
  classes = computed(() => cn('-mx-1 my-1 block h-px bg-border', this.class()), /* @ts-ignore */
257
266
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
258
267
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
259
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuSeparatorComponent, isStandalone: true, selector: "MenuSeparator", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "\"separator\"", "attr.aria-orientation": "\"horizontal\"" } }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
268
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuSeparatorComponent, isStandalone: true, selector: "MenuSeparator", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.role": "\"separator\"", "attr.aria-orientation": "\"horizontal\"" } }, ngImport: i0, template: '', isInline: true });
260
269
  }
261
270
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuSeparatorComponent, decorators: [{
262
271
  type: Component,
263
272
  args: [{
264
273
  selector: 'MenuSeparator',
265
- changeDetection: ChangeDetectionStrategy.OnPush,
266
274
  host: {
267
275
  '[class]': 'classes()',
268
276
  '[attr.role]': '"separator"',
@@ -279,13 +287,12 @@ class MenuLabelComponent {
279
287
  classes = computed(() => cn('px-2 py-1.5 text-sm font-semibold text-foreground', this.inset() ? 'pl-8' : '', this.class()), /* @ts-ignore */
280
288
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
281
289
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
282
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuLabelComponent, isStandalone: true, selector: "MenuLabel", inputs: { inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
290
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuLabelComponent, isStandalone: true, selector: "MenuLabel", inputs: { inset: { classPropertyName: "inset", publicName: "inset", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
283
291
  }
284
292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuLabelComponent, decorators: [{
285
293
  type: Component,
286
294
  args: [{
287
295
  selector: 'MenuLabel',
288
- changeDetection: ChangeDetectionStrategy.OnPush,
289
296
  host: { '[class]': 'classes()' },
290
297
  template: `<ng-content />`,
291
298
  }]
@@ -296,13 +303,12 @@ class MenuShortcutComponent {
296
303
  classes = computed(() => cn('ml-auto text-xs tracking-widest text-muted-foreground', this.class()), /* @ts-ignore */
297
304
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
298
305
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuShortcutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
299
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuShortcutComponent, isStandalone: true, selector: "MenuShortcut, span[MenuShortcut]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
306
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuShortcutComponent, isStandalone: true, selector: "MenuShortcut, span[MenuShortcut]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
300
307
  }
301
308
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuShortcutComponent, decorators: [{
302
309
  type: Component,
303
310
  args: [{
304
311
  selector: 'MenuShortcut, span[MenuShortcut]',
305
- changeDetection: ChangeDetectionStrategy.OnPush,
306
312
  host: { '[class]': 'classes()' },
307
313
  template: `<ng-content />`,
308
314
  }]
@@ -354,13 +360,12 @@ class MenuSurfaceComponent {
354
360
  this.closeRequested.emit();
355
361
  }
356
362
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuSurfaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
357
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuSurfaceComponent, isStandalone: true, selector: "MenuSurface", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeRequested: "closeRequested" }, host: { attributes: { "tabindex": "-1" }, listeners: { "keydown.arrowDown": "onArrow($any($event), 1)", "keydown.arrowUp": "onArrow($any($event), -1)", "keydown.home": "onHome($any($event))", "keydown.end": "onEnd($any($event))", "keydown.tab": "onTab($any($event))" }, properties: { "class": "classes()", "style.--radius-base": "radiusBase()", "style.--spacing-base": "densityBase()", "attr.role": "\"menu\"" } }, queries: [{ propertyName: "items", predicate: MenuFocusableItem, descendants: true }], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
363
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: MenuSurfaceComponent, isStandalone: true, selector: "MenuSurface", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, density: { classPropertyName: "density", publicName: "density", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeRequested: "closeRequested" }, host: { attributes: { "tabindex": "-1" }, listeners: { "keydown.arrowDown": "onArrow($any($event), 1)", "keydown.arrowUp": "onArrow($any($event), -1)", "keydown.home": "onHome($any($event))", "keydown.end": "onEnd($any($event))", "keydown.tab": "onTab($any($event))" }, properties: { "class": "classes()", "style.--radius-base": "radiusBase()", "style.--spacing-base": "densityBase()", "attr.role": "\"menu\"" } }, queries: [{ propertyName: "items", predicate: MenuFocusableItem, descendants: true }], ngImport: i0, template: `<ng-content />`, isInline: true });
358
364
  }
359
365
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: MenuSurfaceComponent, decorators: [{
360
366
  type: Component,
361
367
  args: [{
362
368
  selector: 'MenuSurface',
363
- changeDetection: ChangeDetectionStrategy.OnPush,
364
369
  host: {
365
370
  '[class]': 'classes()',
366
371
  '[style.--radius-base]': 'radiusBase()',