@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,6 +1,6 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { input, booleanAttribute, output, computed, ChangeDetectionStrategy, Component, inject, ElementRef, signal, SecurityContext, forwardRef } from '@angular/core';
3
+ import { input, booleanAttribute, output, computed, Component, inject, ElementRef, signal, SecurityContext, forwardRef } from '@angular/core';
4
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
  import { DomSanitizer } from '@angular/platform-browser';
6
6
  import { cn } from '@ojiepermana/angular-component/utils';
@@ -135,17 +135,17 @@ class EditorComponent {
135
135
  data-slot="editor-shell"
136
136
  [class]="shellClasses()"
137
137
  [attr.data-disabled]="disabled() ? 'true' : null"
138
- [attr.aria-invalid]="invalid() ? 'true' : null">
138
+ [attr.aria-invalid]="invalid() ? 'true' : null"
139
+ >
139
140
  <ng-content select="EditorToolbar" />
140
141
  <ng-content select="EditorContent" />
141
142
  </div>
142
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
143
+ `, isInline: true });
143
144
  }
144
145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorComponent, decorators: [{
145
146
  type: Component,
146
147
  args: [{
147
148
  selector: 'Editor',
148
- changeDetection: ChangeDetectionStrategy.OnPush,
149
149
  host: {
150
150
  '[class]': 'classes()',
151
151
  '[attr.data-slot]': '"editor"',
@@ -159,7 +159,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
159
159
  data-slot="editor-shell"
160
160
  [class]="shellClasses()"
161
161
  [attr.data-disabled]="disabled() ? 'true' : null"
162
- [attr.aria-invalid]="invalid() ? 'true' : null">
162
+ [attr.aria-invalid]="invalid() ? 'true' : null"
163
+ >
163
164
  <ng-content select="EditorToolbar" />
164
165
  <ng-content select="EditorContent" />
165
166
  </div>
@@ -206,7 +207,8 @@ class EditorToolbarComponent {
206
207
  [class]="selectClasses"
207
208
  [disabled]="disabled()"
208
209
  aria-label="Text style"
209
- (change)="handleSelect($event)">
210
+ (change)="handleSelect($event)"
211
+ >
210
212
  <option value="paragraph">Text</option>
211
213
  <option value="heading-1">Heading 1</option>
212
214
  <option value="heading-2">Heading 2</option>
@@ -218,7 +220,8 @@ class EditorToolbarComponent {
218
220
  [class]="selectClasses"
219
221
  [disabled]="disabled()"
220
222
  aria-label="Text alignment"
221
- (change)="handleSelect($event)">
223
+ (change)="handleSelect($event)"
224
+ >
222
225
  <option value="align-left">Left</option>
223
226
  <option value="align-center">Center</option>
224
227
  <option value="align-right">Right</option>
@@ -229,7 +232,8 @@ class EditorToolbarComponent {
229
232
  data-slot="editor-separator"
230
233
  class="mx-1 h-6 w-px shrink-0 bg-border"
231
234
  role="separator"
232
- aria-orientation="vertical"></span>
235
+ aria-orientation="vertical"
236
+ ></span>
233
237
  }
234
238
  @case ('spacer') {
235
239
  <span data-slot="editor-spacer" class="min-w-2 flex-1"></span>
@@ -243,7 +247,8 @@ class EditorToolbarComponent {
243
247
  [attr.aria-label]="part.ariaLabel"
244
248
  [attr.title]="part.ariaLabel"
245
249
  (mousedown)="preserveSelection($event)"
246
- (click)="execute(part.command, $event)">
250
+ (click)="execute(part.command, $event)"
251
+ >
247
252
  @if (part.command === 'undo') {
248
253
  <svg
249
254
  aria-hidden="true"
@@ -253,7 +258,8 @@ class EditorToolbarComponent {
253
258
  stroke="currentColor"
254
259
  stroke-width="1.75"
255
260
  stroke-linecap="round"
256
- stroke-linejoin="round">
261
+ stroke-linejoin="round"
262
+ >
257
263
  <path d="M9 14 4 9l5-5" />
258
264
  <path d="M4 9h10a6 6 0 0 1 0 12h-2" />
259
265
  </svg>
@@ -266,7 +272,8 @@ class EditorToolbarComponent {
266
272
  stroke="currentColor"
267
273
  stroke-width="1.75"
268
274
  stroke-linecap="round"
269
- stroke-linejoin="round">
275
+ stroke-linejoin="round"
276
+ >
270
277
  <path d="m15 14 5-5-5-5" />
271
278
  <path d="M20 9H10a6 6 0 0 0 0 12h2" />
272
279
  </svg>
@@ -278,13 +285,12 @@ class EditorToolbarComponent {
278
285
  }
279
286
  }
280
287
  <ng-content />
281
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
288
+ `, isInline: true });
282
289
  }
283
290
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorToolbarComponent, decorators: [{
284
291
  type: Component,
285
292
  args: [{
286
293
  selector: 'EditorToolbar',
287
- changeDetection: ChangeDetectionStrategy.OnPush,
288
294
  host: {
289
295
  '[class]': 'classes()',
290
296
  '[attr.data-slot]': '"editor-toolbar"',
@@ -300,7 +306,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
300
306
  [class]="selectClasses"
301
307
  [disabled]="disabled()"
302
308
  aria-label="Text style"
303
- (change)="handleSelect($event)">
309
+ (change)="handleSelect($event)"
310
+ >
304
311
  <option value="paragraph">Text</option>
305
312
  <option value="heading-1">Heading 1</option>
306
313
  <option value="heading-2">Heading 2</option>
@@ -312,7 +319,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
312
319
  [class]="selectClasses"
313
320
  [disabled]="disabled()"
314
321
  aria-label="Text alignment"
315
- (change)="handleSelect($event)">
322
+ (change)="handleSelect($event)"
323
+ >
316
324
  <option value="align-left">Left</option>
317
325
  <option value="align-center">Center</option>
318
326
  <option value="align-right">Right</option>
@@ -323,7 +331,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
323
331
  data-slot="editor-separator"
324
332
  class="mx-1 h-6 w-px shrink-0 bg-border"
325
333
  role="separator"
326
- aria-orientation="vertical"></span>
334
+ aria-orientation="vertical"
335
+ ></span>
327
336
  }
328
337
  @case ('spacer') {
329
338
  <span data-slot="editor-spacer" class="min-w-2 flex-1"></span>
@@ -337,7 +346,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
337
346
  [attr.aria-label]="part.ariaLabel"
338
347
  [attr.title]="part.ariaLabel"
339
348
  (mousedown)="preserveSelection($event)"
340
- (click)="execute(part.command, $event)">
349
+ (click)="execute(part.command, $event)"
350
+ >
341
351
  @if (part.command === 'undo') {
342
352
  <svg
343
353
  aria-hidden="true"
@@ -347,7 +357,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
347
357
  stroke="currentColor"
348
358
  stroke-width="1.75"
349
359
  stroke-linecap="round"
350
- stroke-linejoin="round">
360
+ stroke-linejoin="round"
361
+ >
351
362
  <path d="M9 14 4 9l5-5" />
352
363
  <path d="M4 9h10a6 6 0 0 1 0 12h-2" />
353
364
  </svg>
@@ -360,7 +371,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
360
371
  stroke="currentColor"
361
372
  stroke-width="1.75"
362
373
  stroke-linecap="round"
363
- stroke-linejoin="round">
374
+ stroke-linejoin="round"
375
+ >
364
376
  <path d="m15 14 5-5-5-5" />
365
377
  <path d="M20 9H10a6 6 0 0 0 0 12h2" />
366
378
  </svg>
@@ -399,13 +411,12 @@ class EditorButtonComponent {
399
411
  }
400
412
  preserveSelection = preserveEditorSelection;
401
413
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
402
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EditorButtonComponent, isStandalone: true, selector: "button[EditorButton]", inputs: { command: { classPropertyName: "command", publicName: "command", isSignal: true, isRequired: false, transformFunction: null }, pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "mousedown": "preserveSelection($event)", "click": "handleClick($event)" }, properties: { "class": "classes()", "attr.data-slot": "\"editor-button\"", "attr.title": "tooltip() || null", "attr.aria-pressed": "pressed() === null ? null : pressed()", "disabled": "disabled() || null" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
414
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EditorButtonComponent, isStandalone: true, selector: "button[EditorButton]", inputs: { command: { classPropertyName: "command", publicName: "command", isSignal: true, isRequired: false, transformFunction: null }, pressed: { classPropertyName: "pressed", publicName: "pressed", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, tooltip: { classPropertyName: "tooltip", publicName: "tooltip", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "mousedown": "preserveSelection($event)", "click": "handleClick($event)" }, properties: { "class": "classes()", "attr.data-slot": "\"editor-button\"", "attr.title": "tooltip() || null", "attr.aria-pressed": "pressed() === null ? null : pressed()", "disabled": "disabled() || null" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
403
415
  }
404
416
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorButtonComponent, decorators: [{
405
417
  type: Component,
406
418
  args: [{
407
419
  selector: 'button[EditorButton]',
408
- changeDetection: ChangeDetectionStrategy.OnPush,
409
420
  host: {
410
421
  '[class]': 'classes()',
411
422
  '[attr.data-slot]': '"editor-button"',
@@ -425,13 +436,12 @@ class EditorSeparatorComponent {
425
436
  classes = computed(() => cn('mx-1 h-6 w-px shrink-0 bg-border', this.class()), /* @ts-ignore */
426
437
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
427
438
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
428
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EditorSeparatorComponent, isStandalone: true, selector: "EditorSeparator", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "separator", "aria-orientation": "vertical" }, properties: { "class": "classes()", "attr.data-slot": "\"editor-separator\"" } }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
439
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EditorSeparatorComponent, isStandalone: true, selector: "EditorSeparator", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "separator", "aria-orientation": "vertical" }, properties: { "class": "classes()", "attr.data-slot": "\"editor-separator\"" } }, ngImport: i0, template: '', isInline: true });
429
440
  }
430
441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorSeparatorComponent, decorators: [{
431
442
  type: Component,
432
443
  args: [{
433
444
  selector: 'EditorSeparator',
434
- changeDetection: ChangeDetectionStrategy.OnPush,
435
445
  host: {
436
446
  '[class]': 'classes()',
437
447
  '[attr.data-slot]': '"editor-separator"',
@@ -447,13 +457,12 @@ class EditorSpacerComponent {
447
457
  classes = computed(() => cn('min-w-2 flex-1', this.class()), /* @ts-ignore */
448
458
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
449
459
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorSpacerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
450
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EditorSpacerComponent, isStandalone: true, selector: "EditorSpacer", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"editor-spacer\"" } }, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
460
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EditorSpacerComponent, isStandalone: true, selector: "EditorSpacer", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-slot": "\"editor-spacer\"" } }, ngImport: i0, template: '', isInline: true });
451
461
  }
452
462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorSpacerComponent, decorators: [{
453
463
  type: Component,
454
464
  args: [{
455
465
  selector: 'EditorSpacer',
456
- changeDetection: ChangeDetectionStrategy.OnPush,
457
466
  host: {
458
467
  '[class]': 'classes()',
459
468
  '[attr.data-slot]': '"editor-spacer"',
@@ -494,7 +503,8 @@ class EditorContentComponent {
494
503
  this.editor?.unregisterContent(this);
495
504
  }
496
505
  writeValue(value) {
497
- this.el.nativeElement.innerHTML = this.sanitizer.sanitize(SecurityContext.HTML, value ?? '') ?? '';
506
+ this.el.nativeElement.innerHTML =
507
+ this.sanitizer.sanitize(SecurityContext.HTML, value ?? '') ?? '';
498
508
  // Read back after assignment: the browser normalizes markup, so the
499
509
  // DOM-normalized form is the canonical value for change comparisons.
500
510
  this.lastKnownValue = this.el.nativeElement.innerHTML;
@@ -637,13 +647,12 @@ class EditorContentComponent {
637
647
  useExisting: forwardRef(() => EditorContentComponent),
638
648
  multi: true,
639
649
  },
640
- ], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
650
+ ], ngImport: i0, template: `<ng-content />`, isInline: true });
641
651
  }
642
652
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EditorContentComponent, decorators: [{
643
653
  type: Component,
644
654
  args: [{
645
655
  selector: 'EditorContent',
646
- changeDetection: ChangeDetectionStrategy.OnPush,
647
656
  providers: [
648
657
  {
649
658
  provide: NG_VALUE_ACCESSOR,
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { 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
 
@@ -25,13 +25,12 @@ class EmptyComponent {
25
25
  classes = computed(() => cn(emptyVariants(), this.class()), /* @ts-ignore */
26
26
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
27
27
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
28
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyComponent, isStandalone: true, selector: "Empty", 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 });
28
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyComponent, isStandalone: true, selector: "Empty", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
29
29
  }
30
30
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyComponent, decorators: [{
31
31
  type: Component,
32
32
  args: [{
33
33
  selector: 'Empty',
34
- changeDetection: ChangeDetectionStrategy.OnPush,
35
34
  host: {
36
35
  '[class]': 'classes()',
37
36
  },
@@ -44,13 +43,12 @@ class EmptyHeaderComponent {
44
43
  classes = computed(() => cn('flex w-full max-w-xl flex-col items-center gap-3 text-center', this.class()), /* @ts-ignore */
45
44
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
46
45
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyHeaderComponent, isStandalone: true, selector: "EmptyHeader", 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 });
46
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyHeaderComponent, isStandalone: true, selector: "EmptyHeader", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
48
47
  }
49
48
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyHeaderComponent, decorators: [{
50
49
  type: Component,
51
50
  args: [{
52
51
  selector: 'EmptyHeader',
53
- changeDetection: ChangeDetectionStrategy.OnPush,
54
52
  host: {
55
53
  '[class]': 'classes()',
56
54
  },
@@ -65,13 +63,12 @@ class EmptyMediaComponent {
65
63
  classes = computed(() => cn(emptyMediaVariants({ variant: this.variant() }), this.class()), /* @ts-ignore */
66
64
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
67
65
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyMediaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
68
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyMediaComponent, isStandalone: true, selector: "EmptyMedia", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-variant": "variant()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
66
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyMediaComponent, isStandalone: true, selector: "EmptyMedia", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-variant": "variant()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
69
67
  }
70
68
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyMediaComponent, decorators: [{
71
69
  type: Component,
72
70
  args: [{
73
71
  selector: 'EmptyMedia',
74
- changeDetection: ChangeDetectionStrategy.OnPush,
75
72
  host: {
76
73
  '[class]': 'classes()',
77
74
  '[attr.data-variant]': 'variant()',
@@ -85,13 +82,12 @@ class EmptyTitleComponent {
85
82
  classes = computed(() => cn('block text-xl font-semibold tracking-tight text-foreground sm:text-2xl', this.class()), /* @ts-ignore */
86
83
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
87
84
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
88
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyTitleComponent, isStandalone: true, selector: "EmptyTitle", 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 });
85
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyTitleComponent, isStandalone: true, selector: "EmptyTitle", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
89
86
  }
90
87
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyTitleComponent, decorators: [{
91
88
  type: Component,
92
89
  args: [{
93
90
  selector: 'EmptyTitle',
94
- changeDetection: ChangeDetectionStrategy.OnPush,
95
91
  host: {
96
92
  '[class]': 'classes()',
97
93
  },
@@ -104,13 +100,12 @@ class EmptyDescriptionComponent {
104
100
  classes = computed(() => cn('block max-w-lg text-sm leading-6 text-muted-foreground', this.class()), /* @ts-ignore */
105
101
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
106
102
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
107
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyDescriptionComponent, isStandalone: true, selector: "EmptyDescription", 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 });
103
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyDescriptionComponent, isStandalone: true, selector: "EmptyDescription", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
108
104
  }
109
105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyDescriptionComponent, decorators: [{
110
106
  type: Component,
111
107
  args: [{
112
108
  selector: 'EmptyDescription',
113
- changeDetection: ChangeDetectionStrategy.OnPush,
114
109
  host: {
115
110
  '[class]': 'classes()',
116
111
  },
@@ -123,13 +118,12 @@ class EmptyContentComponent {
123
118
  classes = computed(() => cn('flex w-full flex-col items-center justify-center gap-3', this.class()), /* @ts-ignore */
124
119
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
125
120
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
126
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyContentComponent, isStandalone: true, selector: "EmptyContent", 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 });
121
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: EmptyContentComponent, isStandalone: true, selector: "EmptyContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
127
122
  }
128
123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: EmptyContentComponent, decorators: [{
129
124
  type: Component,
130
125
  args: [{
131
126
  selector: 'EmptyContent',
132
- changeDetection: ChangeDetectionStrategy.OnPush,
133
127
  host: {
134
128
  '[class]': 'classes()',
135
129
  },
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, computed, effect, Injectable, inject, input, booleanAttribute, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
2
+ import { signal, computed, effect, Injectable, inject, input, booleanAttribute, Component, Directive } from '@angular/core';
3
3
  import { uniqueId, cn } from '@ojiepermana/angular-component/utils';
4
4
  import { NgControl } from '@angular/forms';
5
5
 
@@ -9,16 +9,26 @@ import { NgControl } from '@angular/forms';
9
9
  */
10
10
  class FormFieldContext {
11
11
  controlId = uniqueId('FormField');
12
+ labelId = `${this.controlId}-label`;
12
13
  descriptionId = `${this.controlId}-description`;
13
14
  messageId = `${this.controlId}-message`;
14
15
  control = signal(null, /* @ts-ignore */
15
16
  ...(ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []));
16
17
  manualInvalid = signal(false, /* @ts-ignore */
17
18
  ...(ngDevMode ? [{ debugName: "manualInvalid" }] : /* istanbul ignore next */ []));
19
+ hasLabel = signal(false, /* @ts-ignore */
20
+ ...(ngDevMode ? [{ debugName: "hasLabel" }] : /* istanbul ignore next */ []));
18
21
  hasDescription = signal(false, /* @ts-ignore */
19
22
  ...(ngDevMode ? [{ debugName: "hasDescription" }] : /* istanbul ignore next */ []));
20
23
  hasMessage = signal(false, /* @ts-ignore */
21
24
  ...(ngDevMode ? [{ debugName: "hasMessage" }] : /* istanbul ignore next */ []));
25
+ /**
26
+ * `aria-labelledby` for the control. `<FormLabel>` renders as a custom element,
27
+ * so the native `for`/`id` pairing does not associate it — point the control at
28
+ * the label's id explicitly so it has an accessible name (axe `select-name`/`label`).
29
+ */
30
+ labelledBy = computed(() => (this.hasLabel() ? this.labelId : null), /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "labelledBy" }] : /* istanbul ignore next */ []));
22
32
  statusTick = signal(0, /* @ts-ignore */
23
33
  ...(ngDevMode ? [{ debugName: "statusTick" }] : /* istanbul ignore next */ []));
24
34
  invalid = computed(() => {
@@ -83,13 +93,12 @@ class FormFieldComponent {
83
93
  effect(() => this.ctx.manualInvalid.set(this.invalid()));
84
94
  }
85
95
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
86
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormFieldComponent, isStandalone: true, selector: "FormField", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-orientation": "orientation()", "attr.data-invalid": "ctx.invalid() ? \"\" : null", "attr.role": "\"group\"" } }, providers: [FormFieldContext], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
96
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormFieldComponent, isStandalone: true, selector: "FormField", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-orientation": "orientation()", "attr.data-invalid": "ctx.invalid() ? \"\" : null", "attr.role": "\"group\"" } }, providers: [FormFieldContext], ngImport: i0, template: `<ng-content />`, isInline: true });
87
97
  }
88
98
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormFieldComponent, decorators: [{
89
99
  type: Component,
90
100
  args: [{
91
101
  selector: 'FormField',
92
- changeDetection: ChangeDetectionStrategy.OnPush,
93
102
  providers: [FormFieldContext],
94
103
  host: {
95
104
  '[class]': 'classes()',
@@ -107,13 +116,12 @@ class FormFieldsetComponent {
107
116
  classes = computed(() => cn('block min-w-0 border-0 p-0 m-0', 'grid gap-4', this.class()), /* @ts-ignore */
108
117
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
109
118
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormFieldsetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
110
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormFieldsetComponent, isStandalone: true, selector: "FormFieldset, fieldset[FormFieldset]", 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 });
119
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormFieldsetComponent, isStandalone: true, selector: "FormFieldset, fieldset[FormFieldset]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
111
120
  }
112
121
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormFieldsetComponent, decorators: [{
113
122
  type: Component,
114
123
  args: [{
115
124
  selector: 'FormFieldset, fieldset[FormFieldset]',
116
- changeDetection: ChangeDetectionStrategy.OnPush,
117
125
  host: {
118
126
  '[class]': 'classes()',
119
127
  },
@@ -126,16 +134,17 @@ class FormLegendComponent {
126
134
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
127
135
  variant = input('legend', /* @ts-ignore */
128
136
  ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
129
- classes = computed(() => cn('block min-w-0 text-foreground', this.variant() === 'label' ? 'text-sm font-medium leading-none' : 'text-sm font-semibold leading-none', this.class()), /* @ts-ignore */
137
+ classes = computed(() => cn('block min-w-0 text-foreground', this.variant() === 'label'
138
+ ? 'text-sm font-medium leading-none'
139
+ : 'text-sm font-semibold leading-none', this.class()), /* @ts-ignore */
130
140
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
131
141
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormLegendComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
132
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormLegendComponent, isStandalone: true, selector: "FormLegend, legend[FormLegend]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
142
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormLegendComponent, isStandalone: true, selector: "FormLegend, legend[FormLegend]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
133
143
  }
134
144
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormLegendComponent, decorators: [{
135
145
  type: Component,
136
146
  args: [{
137
147
  selector: 'FormLegend, legend[FormLegend]',
138
- changeDetection: ChangeDetectionStrategy.OnPush,
139
148
  host: {
140
149
  '[class]': 'classes()',
141
150
  },
@@ -149,13 +158,12 @@ class FormGroupComponent {
149
158
  classes = computed(() => cn('block min-w-0', 'grid gap-6', this.class()), /* @ts-ignore */
150
159
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
151
160
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
152
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormGroupComponent, isStandalone: true, selector: "FormGroup", 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 });
161
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormGroupComponent, isStandalone: true, selector: "FormGroup", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
153
162
  }
154
163
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormGroupComponent, decorators: [{
155
164
  type: Component,
156
165
  args: [{
157
166
  selector: 'FormGroup',
158
- changeDetection: ChangeDetectionStrategy.OnPush,
159
167
  host: {
160
168
  '[class]': 'classes()',
161
169
  },
@@ -169,13 +177,12 @@ class FormSeparatorComponent {
169
177
  classes = computed(() => cn('block min-w-0', 'flex items-center gap-3 text-xs font-medium uppercase tracking-[0.24em] text-muted-foreground', 'before:h-px before:flex-1 before:bg-border after:h-px after:flex-1 after:bg-border', this.class()), /* @ts-ignore */
170
178
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
171
179
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormSeparatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
172
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormSeparatorComponent, isStandalone: true, selector: "FormSeparator", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<span class="shrink-0"><ng-content /></span>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormSeparatorComponent, isStandalone: true, selector: "FormSeparator", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<span class="shrink-0"><ng-content /></span>`, isInline: true });
173
181
  }
174
182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormSeparatorComponent, decorators: [{
175
183
  type: Component,
176
184
  args: [{
177
185
  selector: 'FormSeparator',
178
- changeDetection: ChangeDetectionStrategy.OnPush,
179
186
  host: {
180
187
  '[class]': 'classes()',
181
188
  },
@@ -189,13 +196,12 @@ class FormContentComponent {
189
196
  classes = computed(() => cn('block min-w-0 flex-1', 'grid gap-1.5', this.class()), /* @ts-ignore */
190
197
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
191
198
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
192
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormContentComponent, isStandalone: true, selector: "FormContent", 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 });
199
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormContentComponent, isStandalone: true, selector: "FormContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
193
200
  }
194
201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormContentComponent, decorators: [{
195
202
  type: Component,
196
203
  args: [{
197
204
  selector: 'FormContent',
198
- changeDetection: ChangeDetectionStrategy.OnPush,
199
205
  host: {
200
206
  '[class]': 'classes()',
201
207
  },
@@ -209,13 +215,12 @@ class FormTitleComponent {
209
215
  classes = computed(() => cn('block text-sm font-medium leading-none text-foreground', this.class()), /* @ts-ignore */
210
216
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
211
217
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
212
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormTitleComponent, isStandalone: true, selector: "FormTitle", 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 });
218
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormTitleComponent, isStandalone: true, selector: "FormTitle", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
213
219
  }
214
220
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormTitleComponent, decorators: [{
215
221
  type: Component,
216
222
  args: [{
217
223
  selector: 'FormTitle',
218
- changeDetection: ChangeDetectionStrategy.OnPush,
219
224
  host: {
220
225
  '[class]': 'classes()',
221
226
  },
@@ -227,23 +232,27 @@ class FormLabelComponent {
227
232
  ctx = inject(FormFieldContext);
228
233
  class = input('', /* @ts-ignore */
229
234
  ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
235
+ constructor() {
236
+ // Let the control reference this label via aria-labelledby.
237
+ this.ctx.hasLabel.set(true);
238
+ }
230
239
  classes = computed(() => cn('text-sm font-medium leading-none', this.ctx.invalid() ? 'text-destructive' : 'text-foreground', 'peer-disabled:cursor-not-allowed peer-disabled:opacity-70', this.class()), /* @ts-ignore */
231
240
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
232
241
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormLabelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
233
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormLabelComponent, isStandalone: true, selector: "FormLabel, label[FormLabel]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.for": "ctx.controlId" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
242
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormLabelComponent, isStandalone: true, selector: "FormLabel, label[FormLabel]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "ctx.labelId", "attr.for": "ctx.controlId" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
234
243
  }
235
244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormLabelComponent, decorators: [{
236
245
  type: Component,
237
246
  args: [{
238
247
  selector: 'FormLabel, label[FormLabel]',
239
- changeDetection: ChangeDetectionStrategy.OnPush,
240
248
  host: {
241
249
  '[class]': 'classes()',
250
+ '[attr.id]': 'ctx.labelId',
242
251
  '[attr.for]': 'ctx.controlId',
243
252
  },
244
253
  template: `<ng-content />`,
245
254
  }]
246
- }], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
255
+ }], ctorParameters: () => [], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
247
256
 
248
257
  class FormDescriptionComponent {
249
258
  ctx = inject(FormFieldContext, { optional: true });
@@ -260,13 +269,12 @@ class FormDescriptionComponent {
260
269
  this.ctx?.hasDescription.set(false);
261
270
  }
262
271
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormDescriptionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
263
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormDescriptionComponent, isStandalone: true, selector: "FormDescription, p[FormDescription]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "descriptionId()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
272
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: FormDescriptionComponent, isStandalone: true, selector: "FormDescription, p[FormDescription]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "descriptionId()" } }, ngImport: i0, template: `<ng-content />`, isInline: true });
264
273
  }
265
274
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormDescriptionComponent, decorators: [{
266
275
  type: Component,
267
276
  args: [{
268
277
  selector: 'FormDescription, p[FormDescription]',
269
- changeDetection: ChangeDetectionStrategy.OnPush,
270
278
  host: {
271
279
  '[class]': 'classes()',
272
280
  '[attr.id]': 'descriptionId()',
@@ -298,13 +306,12 @@ class FormMessageComponent {
298
306
  @if (show()) {
299
307
  <ng-content>{{ ctx.firstError() }}</ng-content>
300
308
  }
301
- `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
309
+ `, isInline: true });
302
310
  }
303
311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormMessageComponent, decorators: [{
304
312
  type: Component,
305
313
  args: [{
306
314
  selector: 'FormMessage, p[FormMessage]',
307
- changeDetection: ChangeDetectionStrategy.OnPush,
308
315
  host: {
309
316
  '[class]': 'classes()',
310
317
  '[attr.id]': 'ctx.messageId',
@@ -342,7 +349,7 @@ class FormControlDirective {
342
349
  }
343
350
  }
344
351
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormControlDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
345
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: FormControlDirective, isStandalone: true, selector: "[FormControl]", host: { properties: { "attr.id": "ctx.controlId", "attr.aria-describedby": "ctx.describedBy()", "attr.aria-invalid": "ctx.invalid() ? \"true\" : null" } }, ngImport: i0 });
352
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: FormControlDirective, isStandalone: true, selector: "[FormControl]", host: { properties: { "attr.id": "ctx.controlId", "attr.aria-labelledby": "ctx.labelledBy()", "attr.aria-describedby": "ctx.describedBy()", "attr.aria-invalid": "ctx.invalid() ? \"true\" : null" } }, ngImport: i0 });
346
353
  }
347
354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: FormControlDirective, decorators: [{
348
355
  type: Directive,
@@ -350,6 +357,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
350
357
  selector: '[FormControl]',
351
358
  host: {
352
359
  '[attr.id]': 'ctx.controlId',
360
+ '[attr.aria-labelledby]': 'ctx.labelledBy()',
353
361
  '[attr.aria-describedby]': 'ctx.describedBy()',
354
362
  '[attr.aria-invalid]': 'ctx.invalid() ? "true" : null',
355
363
  },
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, input, forwardRef, ChangeDetectionStrategy, Component, inject, TemplateRef, Directive, ViewContainerRef, ElementRef, DestroyRef, output, signal } from '@angular/core';
2
+ import { InjectionToken, input, forwardRef, Component, inject, TemplateRef, Directive, ViewContainerRef, ElementRef, DestroyRef, output, signal } from '@angular/core';
3
3
  import { Overlay } from '@angular/cdk/overlay';
4
4
  import { TemplatePortal } from '@angular/cdk/portal';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -18,13 +18,12 @@ class HoverCardComponent {
18
18
  closeDelay = input(100, /* @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: HoverCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
21
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: HoverCardComponent, isStandalone: true, selector: "HoverCard", 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: HOVER_CARD_DEFAULTS, useExisting: forwardRef(() => HoverCardComponent) }], 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: HoverCardComponent, isStandalone: true, selector: "HoverCard", 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: HOVER_CARD_DEFAULTS, useExisting: forwardRef(() => HoverCardComponent) }], ngImport: i0, template: '<ng-content />', isInline: true });
22
22
  }
23
23
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: HoverCardComponent, decorators: [{
24
24
  type: Component,
25
25
  args: [{
26
26
  selector: 'HoverCard',
27
- changeDetection: ChangeDetectionStrategy.OnPush,
28
27
  providers: [{ provide: HOVER_CARD_DEFAULTS, useExisting: forwardRef(() => HoverCardComponent) }],
29
28
  host: {
30
29
  class: 'contents',