ngx-com 0.0.20 → 0.0.22

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.
@@ -1,8 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, InputSignal, TemplateRef, OutputEmitterRef, Signal, WritableSignal, Provider, OnDestroy } from '@angular/core';
2
+ import { InjectionToken, InputSignal, TemplateRef, OutputEmitterRef, Signal, WritableSignal, Provider, OnDestroy, ModelSignal } from '@angular/core';
3
3
  import { VariantProps } from 'class-variance-authority';
4
- import { ControlValueAccessor, Validator, ValidationErrors } from '@angular/forms';
4
+ import { ControlValueAccessor, Validator, NgControl, ValidationErrors } from '@angular/forms';
5
5
  import { IconSize } from 'ngx-com/components/icon';
6
+ import { FormFieldControl, ErrorStateMatcher, FormFieldAppearance } from 'ngx-com/components/form-field';
6
7
 
7
8
  /**
8
9
  * Calendar shared types and interfaces
@@ -1210,7 +1211,7 @@ type DatepickerPanelWidth = 'auto' | 'trigger' | `${number}px` | `${number}rem`;
1210
1211
  /** Size variants for datepicker components */
1211
1212
  type DatepickerSize = 'sm' | 'default' | 'lg';
1212
1213
  /** Visual variant for datepicker trigger */
1213
- type DatepickerVariant = 'default' | 'outline' | 'ghost' | 'filled';
1214
+ type DatepickerVariant = 'default' | 'outline' | 'ghost' | 'filled' | 'naked';
1214
1215
  /** Validation state for datepicker */
1215
1216
  type DatepickerState = 'default' | 'error' | 'success';
1216
1217
  /** Configuration for datepicker footer actions */
@@ -1347,7 +1348,7 @@ declare function generateTimePickerId(): string;
1347
1348
  /** Size variants for time picker */
1348
1349
  type TimePickerSize = 'sm' | 'default' | 'lg';
1349
1350
  /** Visual variant */
1350
- type TimePickerVariant = 'standalone' | 'embedded';
1351
+ type TimePickerVariant = 'standalone' | 'embedded' | 'naked';
1351
1352
  /** Validation state */
1352
1353
  type TimePickerState = 'default' | 'error' | 'success';
1353
1354
  /** Period for 12-hour format */
@@ -1377,15 +1378,18 @@ type TimeSegment = 'hours' | 'minutes' | 'seconds';
1377
1378
  * />
1378
1379
  * ```
1379
1380
  */
1380
- declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDestroy {
1381
+ declare class ComDatepicker<D> implements ControlValueAccessor, FormFieldControl<D | null>, Validator, OnDestroy {
1381
1382
  private readonly elementRef;
1382
1383
  private readonly destroyRef;
1383
1384
  private readonly overlay;
1384
1385
  private readonly viewContainerRef;
1385
1386
  private readonly document;
1386
1387
  private readonly dateAdapter;
1387
- /** Optional NgControl for form integration. */
1388
- private readonly ngControl;
1388
+ /** NgControl bound to this datepicker (if using reactive forms). */
1389
+ readonly ngControl: NgControl | null;
1390
+ private readonly defaultErrorStateMatcher;
1391
+ private readonly parentForm;
1392
+ private readonly parentFormGroup;
1389
1393
  /** Reference to the trigger element. */
1390
1394
  private readonly triggerRef;
1391
1395
  /** Reference to the input element. */
@@ -1397,7 +1401,7 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1397
1401
  /** Unique ID for the datepicker. */
1398
1402
  private readonly datepickerId;
1399
1403
  /** Current value. */
1400
- readonly value: InputSignal<D | null>;
1404
+ readonly value: ModelSignal<D | null>;
1401
1405
  /** Minimum selectable date. */
1402
1406
  readonly min: InputSignal<D | null>;
1403
1407
  /** Maximum selectable date. */
@@ -1444,6 +1448,11 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1444
1448
  readonly ariaLabel: InputSignal<string | null>;
1445
1449
  /** ID of element describing the input. */
1446
1450
  readonly ariaDescribedBy: InputSignal<string | null>;
1451
+ /** Custom error state matcher for determining when to show errors. */
1452
+ readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined>;
1453
+ readonly touched: ModelSignal<boolean>;
1454
+ readonly invalid: InputSignal<boolean>;
1455
+ readonly sfErrors: InputSignal<readonly unknown[]>;
1447
1456
  /** Whether to show the time picker below the calendar. */
1448
1457
  readonly showTimePicker: InputSignal<boolean>;
1449
1458
  /** 12h vs 24h format for the time picker. `null` = auto-detect. */
@@ -1466,7 +1475,30 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1466
1475
  readonly calendarActiveDate: WritableSignal<D>;
1467
1476
  /** Live announcements for screen readers. */
1468
1477
  readonly liveAnnouncement: WritableSignal<string>;
1469
- /** Input element ID. */
1478
+ /** Whether the input is focused (not panel). */
1479
+ private readonly _inputFocused;
1480
+ /** IDs for aria-describedby (set by form-field). */
1481
+ private readonly _describedByIds;
1482
+ /** Form field appearance (set by form-field). */
1483
+ private readonly _appearance;
1484
+ /** Whether the datepicker is focused (input focused or panel open). Implements FormFieldControl. */
1485
+ readonly focused: Signal<boolean>;
1486
+ /** Whether the label should float. Label floats when focused or has a value. */
1487
+ readonly shouldLabelFloat: Signal<boolean>;
1488
+ /** Whether the control is in an error state. Implements FormFieldControl. */
1489
+ readonly errorState: Signal<boolean>;
1490
+ /** Structured validation errors from Signal Forms, exposed for the parent form field. */
1491
+ readonly errors: Signal<readonly unknown[] | null>;
1492
+ /** Unique ID for the control. Implements FormFieldControl. */
1493
+ readonly id: Signal<string>;
1494
+ /**
1495
+ * Effective state combining manual state with automatic error detection.
1496
+ * Manual state takes precedence over auto-detected error state.
1497
+ */
1498
+ readonly effectiveState: Signal<DatepickerState>;
1499
+ /** Combined aria-describedby from form-field and manual input. */
1500
+ readonly effectiveAriaDescribedBy: Signal<string | null>;
1501
+ /** Input element ID (alias for FormFieldControl id). */
1470
1502
  readonly inputId: Signal<string>;
1471
1503
  /** Panel element ID. */
1472
1504
  readonly panelId: Signal<string>;
@@ -1521,6 +1553,7 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1521
1553
  clear(event?: Event): void;
1522
1554
  /** Selects today's date. */
1523
1555
  selectToday(): void;
1556
+ protected onInputFocus(): void;
1524
1557
  protected onTriggerClick(): void;
1525
1558
  protected onTriggerKeydown(event: KeyboardEvent): void;
1526
1559
  protected onInputKeydown(event: KeyboardEvent): void;
@@ -1530,6 +1563,21 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1530
1563
  protected onDateSelected(date: D): void;
1531
1564
  protected onTimeChange(time: ComTimeValue | null): void;
1532
1565
  protected onActiveDateChange(date: D): void;
1566
+ /**
1567
+ * Called when the form field container is clicked.
1568
+ * Implements FormFieldControl.
1569
+ */
1570
+ onContainerClick(event: MouseEvent): void;
1571
+ /**
1572
+ * Sets the describedBy IDs from the form field.
1573
+ * Called by the parent form field component.
1574
+ */
1575
+ setDescribedByIds(ids: string): void;
1576
+ /**
1577
+ * Sets the appearance for styling.
1578
+ * Called by the parent form field component.
1579
+ */
1580
+ setAppearance(appearance: FormFieldAppearance): void;
1533
1581
  private createOverlay;
1534
1582
  private destroyOverlay;
1535
1583
  private updateValue;
@@ -1537,7 +1585,7 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1537
1585
  private isDateValid;
1538
1586
  private announce;
1539
1587
  static ɵfac: i0.ɵɵFactoryDeclaration<ComDatepicker<any>, never>;
1540
- static ɵcmp: i0.ɵɵComponentDeclaration<ComDatepicker<any>, "com-datepicker", ["comDatepicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "dateChange": "dateChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1588
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComDatepicker<any>, "com-datepicker", ["comDatepicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaDescribedBy": { "alias": "ariaDescribedBy"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "dateChange": "dateChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1541
1589
  }
1542
1590
 
1543
1591
  /**
@@ -1563,15 +1611,18 @@ declare class ComDatepicker<D> implements ControlValueAccessor, Validator, OnDes
1563
1611
  * />
1564
1612
  * ```
1565
1613
  */
1566
- declare class ComDateRangePicker<D> implements ControlValueAccessor, Validator, OnDestroy {
1614
+ declare class ComDateRangePicker<D> implements ControlValueAccessor, FormFieldControl<DateRangeValue<D> | null>, Validator, OnDestroy {
1567
1615
  private readonly elementRef;
1568
1616
  private readonly destroyRef;
1569
1617
  private readonly overlay;
1570
1618
  private readonly viewContainerRef;
1571
1619
  private readonly document;
1572
1620
  private readonly dateAdapter;
1573
- /** Optional NgControl for form integration. */
1574
- private readonly ngControl;
1621
+ /** NgControl bound to this date range picker (if using reactive forms). */
1622
+ readonly ngControl: NgControl | null;
1623
+ private readonly defaultErrorStateMatcher;
1624
+ private readonly parentForm;
1625
+ private readonly parentFormGroup;
1575
1626
  /** Reference to the trigger element. */
1576
1627
  private readonly triggerRef;
1577
1628
  /** Reference to the start input element. */
@@ -1585,7 +1636,7 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, Validator,
1585
1636
  /** Unique ID for the datepicker. */
1586
1637
  private readonly datepickerId;
1587
1638
  /** Current value. */
1588
- readonly value: InputSignal<DateRangeValue<D> | null>;
1639
+ readonly value: ModelSignal<DateRangeValue<D> | null>;
1589
1640
  /** Minimum selectable date. */
1590
1641
  readonly min: InputSignal<D | null>;
1591
1642
  /** Maximum selectable date. */
@@ -1634,6 +1685,11 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, Validator,
1634
1685
  readonly startAriaLabel: InputSignal<string | null>;
1635
1686
  /** Accessible label for the end input. */
1636
1687
  readonly endAriaLabel: InputSignal<string | null>;
1688
+ /** Custom error state matcher for determining when to show errors. */
1689
+ readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined>;
1690
+ readonly touched: ModelSignal<boolean>;
1691
+ readonly invalid: InputSignal<boolean>;
1692
+ readonly sfErrors: InputSignal<readonly unknown[]>;
1637
1693
  /** Whether to show time pickers below the calendar. */
1638
1694
  readonly showTimePicker: InputSignal<boolean>;
1639
1695
  /** 12h vs 24h format for the time pickers. `null` = auto-detect. */
@@ -1658,7 +1714,29 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, Validator,
1658
1714
  readonly calendarActiveDate: WritableSignal<D>;
1659
1715
  /** Live announcements for screen readers. */
1660
1716
  readonly liveAnnouncement: WritableSignal<string>;
1661
- /** Start input element ID. */
1717
+ /** Whether any input is focused. */
1718
+ private readonly _inputFocused;
1719
+ /** IDs for aria-describedby (set by form-field). */
1720
+ private readonly _describedByIds;
1721
+ /** Form field appearance (set by form-field). */
1722
+ private readonly _appearance;
1723
+ /** Whether the date range picker is focused. Implements FormFieldControl. */
1724
+ readonly focused: Signal<boolean>;
1725
+ /** Whether the label should float. */
1726
+ readonly shouldLabelFloat: Signal<boolean>;
1727
+ /** Whether the control is in an error state. Implements FormFieldControl. */
1728
+ readonly errorState: Signal<boolean>;
1729
+ /** Structured validation errors from Signal Forms. */
1730
+ readonly errors: Signal<readonly unknown[] | null>;
1731
+ /** Unique ID for the control (maps to start input). Implements FormFieldControl. */
1732
+ readonly id: Signal<string>;
1733
+ /**
1734
+ * Effective state combining manual state with automatic error detection.
1735
+ */
1736
+ readonly effectiveState: Signal<DatepickerState>;
1737
+ /** Combined aria-describedby from form-field. */
1738
+ readonly effectiveAriaDescribedBy: Signal<string | null>;
1739
+ /** Start input element ID (alias for FormFieldControl id). */
1662
1740
  readonly startInputId: Signal<string>;
1663
1741
  /** End input element ID. */
1664
1742
  readonly endInputId: Signal<string>;
@@ -1739,6 +1817,21 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, Validator,
1739
1817
  protected onActiveDateChange(date: D): void;
1740
1818
  protected onStartTimeChange(time: ComTimeValue | null): void;
1741
1819
  protected onEndTimeChange(time: ComTimeValue | null): void;
1820
+ /**
1821
+ * Called when the form field container is clicked.
1822
+ * Implements FormFieldControl.
1823
+ */
1824
+ onContainerClick(event: MouseEvent): void;
1825
+ /**
1826
+ * Sets the describedBy IDs from the form field.
1827
+ * Called by the parent form field component.
1828
+ */
1829
+ setDescribedByIds(ids: string): void;
1830
+ /**
1831
+ * Sets the appearance for styling.
1832
+ * Called by the parent form field component.
1833
+ */
1834
+ setAppearance(appearance: FormFieldAppearance): void;
1742
1835
  private createOverlay;
1743
1836
  private destroyOverlay;
1744
1837
  private updateValue;
@@ -1748,7 +1841,7 @@ declare class ComDateRangePicker<D> implements ControlValueAccessor, Validator,
1748
1841
  private formatDate;
1749
1842
  private announce;
1750
1843
  static ɵfac: i0.ɵɵFactoryDeclaration<ComDateRangePicker<any>, never>;
1751
- static ɵcmp: i0.ɵɵComponentDeclaration<ComDateRangePicker<any>, "com-date-range-picker", ["comDateRangePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "startAriaLabel": { "alias": "startAriaLabel"; "required": false; "isSignal": true; }; "endAriaLabel": { "alias": "endAriaLabel"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "rangeChange": "rangeChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1844
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComDateRangePicker<any>, "com-date-range-picker", ["comDateRangePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dateFormat": { "alias": "dateFormat"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showTodayButton": { "alias": "showTodayButton"; "required": false; "isSignal": true; }; "showFooterClearButton": { "alias": "showFooterClearButton"; "required": false; "isSignal": true; }; "keepOpen": { "alias": "keepOpen"; "required": false; "isSignal": true; }; "allowManualInput": { "alias": "allowManualInput"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "startAriaLabel": { "alias": "startAriaLabel"; "required": false; "isSignal": true; }; "endAriaLabel": { "alias": "endAriaLabel"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "showTimePicker": { "alias": "showTimePicker"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "rangeChange": "rangeChange"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1752
1845
  }
1753
1846
 
1754
1847
  /**
@@ -1845,18 +1938,21 @@ type TimepickerLabelVariants = VariantProps<typeof timepickerLabelVariants>;
1845
1938
  * <com-time-picker variant="embedded" [value]="time" (timeChange)="onTime($event)" />
1846
1939
  * ```
1847
1940
  */
1848
- declare class ComTimePicker implements ControlValueAccessor, Validator {
1941
+ declare class ComTimePicker implements ControlValueAccessor, FormFieldControl<ComTimeValue | null>, Validator {
1849
1942
  private readonly localeId;
1850
- private readonly ngControl;
1943
+ readonly ngControl: NgControl | null;
1944
+ private readonly defaultErrorStateMatcher;
1945
+ private readonly parentForm;
1946
+ private readonly parentFormGroup;
1851
1947
  private readonly timepickerId;
1852
1948
  private readonly hoursInputRef;
1853
1949
  private readonly minutesInputRef;
1854
1950
  private readonly secondsInputRef;
1855
1951
  private readonly periodButtonRef;
1856
1952
  /** Current time value. */
1857
- readonly value: InputSignal<ComTimeValue | null>;
1953
+ readonly value: ModelSignal<ComTimeValue | null>;
1858
1954
  /** Whether the time picker is disabled. */
1859
- readonly disabled: InputSignal<boolean>;
1955
+ readonly disabled: ModelSignal<boolean>;
1860
1956
  /** Whether the time picker is required. */
1861
1957
  readonly required: InputSignal<boolean>;
1862
1958
  /** Whether to show the seconds segment. */
@@ -1883,6 +1979,11 @@ declare class ComTimePicker implements ControlValueAccessor, Validator {
1883
1979
  readonly userClass: InputSignal<string>;
1884
1980
  /** Placeholder text for empty segments. */
1885
1981
  readonly placeholder: InputSignal<string>;
1982
+ /** Custom error state matcher for determining when to show errors. */
1983
+ readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined>;
1984
+ readonly touched: ModelSignal<boolean>;
1985
+ readonly invalid: InputSignal<boolean>;
1986
+ readonly sfErrors: InputSignal<readonly unknown[]>;
1886
1987
  /** Emitted when time value changes. */
1887
1988
  readonly timeChange: OutputEmitterRef<ComTimeValue | null>;
1888
1989
  /** Internal value state. */
@@ -1893,6 +1994,26 @@ declare class ComTimePicker implements ControlValueAccessor, Validator {
1893
1994
  readonly pendingDigits: WritableSignal<string>;
1894
1995
  /** Live announcements for screen readers. */
1895
1996
  readonly liveAnnouncement: WritableSignal<string>;
1997
+ /** IDs for aria-describedby (set by form-field). */
1998
+ private readonly _describedByIds;
1999
+ /** Form field appearance (set by form-field). */
2000
+ private readonly _appearance;
2001
+ /** Whether the time picker is focused. Implements FormFieldControl. */
2002
+ readonly focused: Signal<boolean>;
2003
+ /** Whether the label should float. */
2004
+ readonly shouldLabelFloat: Signal<boolean>;
2005
+ /** Whether the control is in an error state. Implements FormFieldControl. */
2006
+ readonly errorState: Signal<boolean>;
2007
+ /** Structured validation errors from Signal Forms. */
2008
+ readonly errors: Signal<readonly unknown[] | null>;
2009
+ /** Unique ID for the control (maps to hours input). Implements FormFieldControl. */
2010
+ readonly id: Signal<string>;
2011
+ /**
2012
+ * Effective state combining manual state with automatic error detection.
2013
+ */
2014
+ readonly effectiveState: Signal<TimePickerState>;
2015
+ /** Combined aria-describedby from form-field. */
2016
+ readonly effectiveAriaDescribedBy: Signal<string | null>;
1896
2017
  /** Whether to use 12-hour format. */
1897
2018
  readonly is12Hour: Signal<boolean>;
1898
2019
  /** Current period (AM/PM). */
@@ -1920,7 +2041,7 @@ declare class ComTimePicker implements ControlValueAccessor, Validator {
1920
2041
  writeValue(value: ComTimeValue | null): void;
1921
2042
  registerOnChange(fn: (value: ComTimeValue | null) => void): void;
1922
2043
  registerOnTouched(fn: () => void): void;
1923
- setDisabledState(_isDisabled: boolean): void;
2044
+ setDisabledState(isDisabled: boolean): void;
1924
2045
  validate(): ValidationErrors | null;
1925
2046
  registerOnValidatorChange(fn: () => void): void;
1926
2047
  protected onSegmentFocus(segment: TimeSegment): void;
@@ -1929,6 +2050,21 @@ declare class ComTimePicker implements ControlValueAccessor, Validator {
1929
2050
  protected onSegmentKeydown(event: KeyboardEvent, segment: TimeSegment): void;
1930
2051
  protected onPeriodKeydown(event: KeyboardEvent): void;
1931
2052
  protected togglePeriod(): void;
2053
+ /**
2054
+ * Called when the form field container is clicked.
2055
+ * Implements FormFieldControl.
2056
+ */
2057
+ onContainerClick(_event: MouseEvent): void;
2058
+ /**
2059
+ * Sets the describedBy IDs from the form field.
2060
+ * Called by the parent form field component.
2061
+ */
2062
+ setDescribedByIds(ids: string): void;
2063
+ /**
2064
+ * Sets the appearance for styling.
2065
+ * Called by the parent form field component.
2066
+ */
2067
+ setAppearance(appearance: FormFieldAppearance): void;
1932
2068
  private setPeriod;
1933
2069
  private incrementSegment;
1934
2070
  private handleDigitInput;
@@ -1939,7 +2075,7 @@ declare class ComTimePicker implements ControlValueAccessor, Validator {
1939
2075
  private focusPrevSegment;
1940
2076
  private updateValue;
1941
2077
  static ɵfac: i0.ɵɵFactoryDeclaration<ComTimePicker, never>;
1942
- static ɵcmp: i0.ɵɵComponentDeclaration<ComTimePicker, "com-time-picker", ["comTimePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "secondStep": { "alias": "secondStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, { "timeChange": "timeChange"; }, never, never, true, never>;
2078
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComTimePicker, "com-time-picker", ["comTimePicker"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showSeconds": { "alias": "showSeconds"; "required": false; "isSignal": true; }; "use12HourFormat": { "alias": "use12HourFormat"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "secondStep": { "alias": "secondStep"; "required": false; "isSignal": true; }; "minTime": { "alias": "minTime"; "required": false; "isSignal": true; }; "maxTime": { "alias": "maxTime"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "timeChange": "timeChange"; }, never, never, true, never>;
1943
2079
  }
1944
2080
 
1945
2081
  export { CALENDAR_SELECTION_STRATEGY, CalendarSelectionStrategy, CalendarViewBase, ComCalendar, ComCalendarCell, ComCalendarHeader, ComCalendarMonthView, ComCalendarMultiYearView, ComCalendarYearView, ComDateRangePicker, ComDatepicker, ComTimePicker, DATE_ADAPTER, DAYS_PER_WEEK, DateAdapter, MONTHS_PER_ROW, MultiSelectionStrategy, NativeDateAdapter, RangeSelectionStrategy, SingleSelectionStrategy, WEEKS_PER_MONTH, WeekSelectionStrategy, YEARS_PER_PAGE, YEARS_PER_ROW, calendarCellVariants, calendarCellWrapperVariants, calendarHeaderButtonVariants, calendarHeaderVariants, calendarVariants, compareTime, createCalendarCell, createDateRange, createDateRangeValue, createGrid, createTimeValue, datepickerClearVariants, datepickerDisabledVariants, datepickerFooterButtonVariants, datepickerFooterVariants, datepickerIconVariants, datepickerInputVariants, datepickerPanelVariants, datepickerRangeSeparatorVariants, datepickerTriggerVariants, generateDatepickerId, generateTimePickerId, getMultiYearStartingYear, getWeekdayHeaders, isDateDisabled, isMonthDisabled, isYearDisabled, navigateGrid, provideMultiSelectionStrategy, provideNativeDateAdapter, provideRangeSelectionStrategy, provideSingleSelectionStrategy, provideWeekSelectionStrategy, timepickerContainerVariants, timepickerDisabledVariants, timepickerLabelVariants, timepickerPeriodVariants, timepickerSectionVariants, timepickerSegmentVariants, timepickerSeparatorVariants };
@@ -85,8 +85,12 @@ declare class ComCheckbox implements ControlValueAccessor {
85
85
  readonly checked: ModelSignal<boolean>;
86
86
  readonly indeterminate: ModelSignal<boolean>;
87
87
  readonly disabled: ModelSignal<boolean>;
88
- readonly value: InputSignal<string | undefined>;
88
+ readonly htmlValue: InputSignal<string | undefined>;
89
89
  readonly name: InputSignal<string | undefined>;
90
+ readonly touched: ModelSignal<boolean>;
91
+ readonly invalid: InputSignal<boolean>;
92
+ readonly sfErrors: InputSignal<readonly unknown[]>;
93
+ readonly sfRequired: InputSignal<boolean>;
90
94
  readonly id: InputSignal<string | undefined>;
91
95
  readonly ariaLabel: InputSignal<string | null>;
92
96
  readonly ariaLabelledby: InputSignal<string | null>;
@@ -103,13 +107,14 @@ declare class ComCheckbox implements ControlValueAccessor {
103
107
  registerOnChange(fn: (value: boolean) => void): void;
104
108
  registerOnTouched(fn: () => void): void;
105
109
  setDisabledState(isDisabled: boolean): void;
110
+ protected onBlur(): void;
106
111
  protected onInputChange(event: Event): void;
107
112
  /** Focuses this checkbox's input element. */
108
113
  focus(): void;
109
114
  /** Toggles the checkbox state programmatically. */
110
115
  toggle(): void;
111
116
  static ɵfac: i0.ɵɵFactoryDeclaration<ComCheckbox, never>;
112
- static ɵcmp: i0.ɵɵComponentDeclaration<ComCheckbox, "com-checkbox", ["comCheckbox"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "indeterminate": "indeterminateChange"; "disabled": "disabledChange"; "changed": "changed"; }, never, ["*"], true, never>;
117
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComCheckbox, "com-checkbox", ["comCheckbox"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "htmlValue": { "alias": "value"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; "sfRequired": { "alias": "required"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "indeterminate": "indeterminateChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "changed": "changed"; }, never, ["*"], true, never>;
113
118
  }
114
119
 
115
120
  export { CHECKBOX_ICON_SIZES, CHECKBOX_LABEL_SIZES, ComCheckbox, checkboxBoxVariants };
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { TemplateRef, Signal, InputSignal, OutputEmitterRef, WritableSignal, OnInit } from '@angular/core';
2
+ import { TemplateRef, Signal, InputSignal, ModelSignal, OutputEmitterRef, WritableSignal, OnInit } from '@angular/core';
3
3
  import { ControlValueAccessor, NgControl } from '@angular/forms';
4
4
  import { FormFieldControl, ErrorStateMatcher, FormFieldAppearance } from 'ngx-com/components/form-field';
5
5
  import { VariantProps } from 'class-variance-authority';
@@ -473,7 +473,7 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
473
473
  /** Array of options to display. */
474
474
  readonly options: InputSignal<T[]>;
475
475
  /** Current value (single or array for multiple). */
476
- readonly value: InputSignal<T | T[] | null>;
476
+ readonly value: ModelSignal<T | T[] | null>;
477
477
  /** Placeholder text when no value is selected. */
478
478
  readonly placeholder: InputSignal<string>;
479
479
  /** Enable multi-select mode. */
@@ -518,8 +518,9 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
518
518
  readonly maxVisibleTags: InputSignal<number | null>;
519
519
  /** Custom error state matcher for determining when to show errors. */
520
520
  readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined>;
521
- /** Emitted when the value changes. */
522
- readonly valueChange: OutputEmitterRef<T | T[] | null>;
521
+ readonly touched: ModelSignal<boolean>;
522
+ readonly invalid: InputSignal<boolean>;
523
+ readonly sfErrors: InputSignal<readonly unknown[]>;
523
524
  /** Emitted when search query changes. */
524
525
  readonly searchChange: OutputEmitterRef<string>;
525
526
  /** Emitted when panel opens. */
@@ -556,6 +557,8 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
556
557
  readonly shouldLabelFloat: Signal<boolean>;
557
558
  /** Whether the control is in an error state. Implements FormFieldControl. */
558
559
  readonly errorState: Signal<boolean>;
560
+ /** Structured validation errors from Signal Forms, exposed for the parent form field. */
561
+ readonly errors: Signal<readonly unknown[] | null>;
559
562
  /** Unique ID for the control. Implements FormFieldControl. */
560
563
  readonly id: Signal<string>;
561
564
  /**
@@ -659,7 +662,7 @@ declare class ComDropdown<T> implements ControlValueAccessor, FormFieldControl<T
659
662
  private typeAhead;
660
663
  private announce;
661
664
  static ɵfac: i0.ɵɵFactoryDeclaration<ComDropdown<any>, never>;
662
- static ɵcmp: i0.ɵɵComponentDeclaration<ComDropdown<any>, "com-dropdown", ["comDropdown"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "filterWith": { "alias": "filterWith"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "searchDebounceMs": { "alias": "searchDebounceMs"; "required": false; "isSignal": true; }; "virtualScrollThreshold": { "alias": "virtualScrollThreshold"; "required": false; "isSignal": true; }; "maxVisibleTags": { "alias": "maxVisibleTags"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; }, ["optionTemplate", "selectedTemplate", "emptyTemplate", "groupTemplate", "tagTemplate"], never, true, never>;
665
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComDropdown<any>, "com-dropdown", ["comDropdown"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "displayWith": { "alias": "displayWith"; "required": false; "isSignal": true; }; "filterWith": { "alias": "filterWith"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "maxHeight": { "alias": "maxHeight"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "searchDebounceMs": { "alias": "searchDebounceMs"; "required": false; "isSignal": true; }; "virtualScrollThreshold": { "alias": "virtualScrollThreshold"; "required": false; "isSignal": true; }; "maxVisibleTags": { "alias": "maxVisibleTags"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; "searchChange": "searchChange"; "opened": "opened"; "closed": "closed"; }, ["optionTemplate", "selectedTemplate", "emptyTemplate", "groupTemplate", "tagTemplate"], never, true, never>;
663
666
  }
664
667
 
665
668
  /**
@@ -35,6 +35,8 @@ declare abstract class FormFieldControl<T = unknown> {
35
35
  abstract readonly errorState: Signal<boolean>;
36
36
  /** Unique ID for the control element. */
37
37
  abstract readonly id: Signal<string>;
38
+ /** Structured validation errors (Signal Forms path). */
39
+ readonly errors?: Signal<readonly unknown[] | null>;
38
40
  /** Called when the form field container is clicked. */
39
41
  abstract onContainerClick(event: MouseEvent): void;
40
42
  }
@@ -131,8 +133,10 @@ declare class ComHint {
131
133
  */
132
134
  declare class ComError {
133
135
  readonly id: string;
134
- /** Reference to the form control, set by the parent form field. */
136
+ /** Reference to the form control (Reactive Forms path). */
135
137
  private readonly _control;
138
+ /** Structured errors from Signal Forms. */
139
+ private readonly _signalErrors;
136
140
  /**
137
141
  * Show this error only when a specific validation error key is present.
138
142
  * If empty, the error is always shown when the control is in error state.
@@ -145,10 +149,15 @@ declare class ComError {
145
149
  */
146
150
  readonly shouldShow: Signal<boolean>;
147
151
  /**
148
- * Sets the form control reference.
152
+ * Sets the form control reference (Reactive Forms).
149
153
  * Called by the parent form field component.
150
154
  */
151
155
  setControl(control: AbstractControl | null): void;
156
+ /**
157
+ * Sets structured validation errors (Signal Forms).
158
+ * Called by the parent form field component.
159
+ */
160
+ setSignalErrors(errors: readonly unknown[]): void;
152
161
  static ɵfac: i0.ɵɵFactoryDeclaration<ComError, never>;
153
162
  static ɵdir: i0.ɵɵDirectiveDeclaration<ComError, "[comError]", ["comError"], { "match": { "alias": "match"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
154
163
  }
@@ -414,6 +423,11 @@ declare class ComInput implements FormFieldControl<string>, OnInit, DoCheck {
414
423
  readonly inputRequired: InputSignalWithTransform<boolean, unknown>;
415
424
  readonly userAriaDescribedBy: InputSignal<string>;
416
425
  readonly errorStateMatcher: InputSignal<ErrorStateMatcher | undefined>;
426
+ readonly sfInvalid: InputSignal<boolean>;
427
+ readonly sfTouched: InputSignalWithTransform<boolean, unknown>;
428
+ readonly sfErrors: InputSignal<readonly unknown[]>;
429
+ /** Whether the form system is Signal Forms (no NgControl present). */
430
+ private readonly isSignalForms;
417
431
  private readonly _focused;
418
432
  private readonly _autofilled;
419
433
  private readonly _empty;
@@ -426,6 +440,8 @@ declare class ComInput implements FormFieldControl<string>, OnInit, DoCheck {
426
440
  readonly disabled: Signal<boolean>;
427
441
  readonly required: Signal<boolean>;
428
442
  readonly errorState: Signal<boolean>;
443
+ /** Structured validation errors from Signal Forms, exposed for the parent form field. */
444
+ readonly errors: Signal<readonly unknown[] | null>;
429
445
  /** Combined aria-describedby including user-provided and form-field-generated IDs. */
430
446
  private readonly _describedByIds;
431
447
  readonly ariaDescribedBy: Signal<string>;
@@ -452,7 +468,7 @@ declare class ComInput implements FormFieldControl<string>, OnInit, DoCheck {
452
468
  /** Focus the native element. */
453
469
  focus(): void;
454
470
  static ɵfac: i0.ɵɵFactoryDeclaration<ComInput, never>;
455
- static ɵdir: i0.ɵɵDirectiveDeclaration<ComInput, "input[comInput], textarea[comInput]", ["comInput"], { "inputId": { "alias": "id"; "required": false; "isSignal": true; }; "inputDisabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "inputRequired": { "alias": "required"; "required": false; "isSignal": true; }; "userAriaDescribedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
471
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ComInput, "input[comInput], textarea[comInput]", ["comInput"], { "inputId": { "alias": "id"; "required": false; "isSignal": true; }; "inputDisabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "inputRequired": { "alias": "required"; "required": false; "isSignal": true; }; "userAriaDescribedBy": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "errorStateMatcher": { "alias": "errorStateMatcher"; "required": false; "isSignal": true; }; "sfInvalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "sfTouched": { "alias": "touched"; "required": false; "isSignal": true; }; "sfErrors": { "alias": "errors"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
456
472
  }
457
473
 
458
474
  /**