@letsprogram/ng-oat 0.1.4 → 0.1.5

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letsprogram/ng-oat",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Angular component library built on top of the Oat CSS framework — signals-first, lightweight, and accessible.",
5
5
  "license": "MIT",
6
6
  "author": "SashiKumar Yadav",
@@ -1,6 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { EnvironmentProviders, TemplateRef, ViewContainerRef, OnInit, OnDestroy, InjectionToken, AfterViewInit } from '@angular/core';
2
+ import { EnvironmentProviders, TemplateRef, ViewContainerRef, OnInit, OnDestroy, InjectionToken, AfterViewInit, ModelSignal } from '@angular/core';
3
3
  import { FormCheckboxControl, FormValueControl, ValidationError, FieldState } from '@angular/forms/signals';
4
+ import { ControlValueAccessor } from '@angular/forms';
4
5
 
5
6
  /** Configuration for provideNgOat() */
6
7
  interface NgOatOptions {
@@ -707,12 +708,13 @@ declare class NgOatSpinner {
707
708
  declare class NgOatSwitch implements FormCheckboxControl {
708
709
  readonly label: _angular_core.InputSignal<string>;
709
710
  readonly checked: _angular_core.ModelSignal<boolean>;
710
- readonly disabled: _angular_core.InputSignal<boolean>;
711
+ readonly disabled: _angular_core.ModelSignal<boolean>;
712
+ readonly touched: _angular_core.ModelSignal<boolean>;
711
713
  readonly value: undefined;
712
714
  readonly changed: _angular_core.OutputEmitterRef<boolean>;
713
715
  onInputChange(event: Event): void;
714
716
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatSwitch, never>;
715
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSwitch, "ng-oat-switch", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "changed": "changed"; }, never, never, true, never>;
717
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSwitch, "ng-oat-switch", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "disabled": "disabledChange"; "touched": "touchedChange"; "changed": "changed"; }, never, never, true, never>;
716
718
  }
717
719
 
718
720
  type NgOatSkeletonType = 'line' | 'box';
@@ -1109,9 +1111,10 @@ declare class NgOatFileUpload {
1109
1111
  declare class NgOatInputOtp implements FormValueControl<string> {
1110
1112
  readonly length: _angular_core.InputSignal<number>;
1111
1113
  readonly separator: _angular_core.InputSignal<number>;
1112
- readonly disabled: _angular_core.InputSignal<boolean>;
1114
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1113
1115
  readonly mask: _angular_core.InputSignal<boolean>;
1114
1116
  readonly value: _angular_core.ModelSignal<string>;
1117
+ readonly touched: _angular_core.ModelSignal<boolean>;
1115
1118
  readonly checked: undefined;
1116
1119
  private slotInputRefs;
1117
1120
  protected slots: _angular_core.Signal<string[]>;
@@ -1123,7 +1126,7 @@ declare class NgOatInputOtp implements FormValueControl<string> {
1123
1126
  private focusSlot;
1124
1127
  focus(options?: FocusOptions): void;
1125
1128
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatInputOtp, never>;
1126
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatInputOtp, "ng-oat-input-otp", never, { "length": { "alias": "length"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1129
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatInputOtp, "ng-oat-input-otp", never, { "length": { "alias": "length"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "mask": { "alias": "mask"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1127
1130
  }
1128
1131
 
1129
1132
  /**
@@ -1138,7 +1141,7 @@ declare class NgOatInputOtp implements FormValueControl<string> {
1138
1141
  */
1139
1142
  declare class NgOatSearchInput implements FormValueControl<string>, OnInit, OnDestroy {
1140
1143
  readonly placeholder: _angular_core.InputSignal<string>;
1141
- readonly disabled: _angular_core.InputSignal<boolean>;
1144
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1142
1145
  readonly shortcut: _angular_core.InputSignal<string>;
1143
1146
  readonly debounceMs: _angular_core.InputSignal<number>;
1144
1147
  readonly value: _angular_core.ModelSignal<string>;
@@ -1160,7 +1163,7 @@ declare class NgOatSearchInput implements FormValueControl<string>, OnInit, OnDe
1160
1163
  focus(options?: FocusOptions): void;
1161
1164
  private focusInput;
1162
1165
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatSearchInput, never>;
1163
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSearchInput, "ng-oat-search-input", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "search": "search"; "touched": "touchedChange"; }, never, never, true, never>;
1166
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSearchInput, "ng-oat-search-input", never, { "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "shortcut": { "alias": "shortcut"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "disabled": "disabledChange"; "value": "valueChange"; "search": "search"; "touched": "touchedChange"; }, never, never, true, never>;
1164
1167
  }
1165
1168
 
1166
1169
  type NgOatSeparatorOrientation = 'horizontal' | 'vertical';
@@ -1714,7 +1717,7 @@ declare class NgOatInput implements FormValueControl<string> {
1714
1717
  private static nextId;
1715
1718
  readonly value: _angular_core.ModelSignal<string>;
1716
1719
  readonly checked: undefined;
1717
- readonly disabled: _angular_core.InputSignal<boolean>;
1720
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1718
1721
  readonly readonly: _angular_core.InputSignal<boolean>;
1719
1722
  readonly required: _angular_core.InputSignal<boolean>;
1720
1723
  readonly invalid: _angular_core.InputSignal<boolean>;
@@ -1728,12 +1731,12 @@ declare class NgOatInput implements FormValueControl<string> {
1728
1731
  readonly type: _angular_core.InputSignal<NgOatInputType>;
1729
1732
  readonly placeholder: _angular_core.InputSignal<string>;
1730
1733
  readonly showErrors: _angular_core.InputSignal<boolean>;
1731
- protected inputId: _angular_core.Signal<string>;
1734
+ protected readonly inputId: string;
1732
1735
  onInput(event: Event): void;
1733
1736
  onBlur(): void;
1734
1737
  focus(options?: FocusOptions): void;
1735
1738
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatInput, never>;
1736
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatInput, "ng-oat-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1739
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatInput, "ng-oat-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; }, never, never, true, never>;
1737
1740
  }
1738
1741
 
1739
1742
  /**
@@ -1754,7 +1757,7 @@ declare class NgOatTextarea implements FormValueControl<string> {
1754
1757
  private static nextId;
1755
1758
  readonly value: _angular_core.ModelSignal<string>;
1756
1759
  readonly checked: undefined;
1757
- readonly disabled: _angular_core.InputSignal<boolean>;
1760
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1758
1761
  readonly readonly: _angular_core.InputSignal<boolean>;
1759
1762
  readonly required: _angular_core.InputSignal<boolean>;
1760
1763
  readonly invalid: _angular_core.InputSignal<boolean>;
@@ -1766,12 +1769,12 @@ declare class NgOatTextarea implements FormValueControl<string> {
1766
1769
  readonly placeholder: _angular_core.InputSignal<string>;
1767
1770
  readonly rows: _angular_core.InputSignal<number>;
1768
1771
  readonly showErrors: _angular_core.InputSignal<boolean>;
1769
- protected textareaId: _angular_core.Signal<string>;
1772
+ protected readonly textareaId: string;
1770
1773
  onInput(event: Event): void;
1771
1774
  onBlur(): void;
1772
1775
  focus(options?: FocusOptions): void;
1773
1776
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatTextarea, never>;
1774
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatTextarea, "ng-oat-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1777
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatTextarea, "ng-oat-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; }, never, never, true, never>;
1775
1778
  }
1776
1779
 
1777
1780
  interface NgOatSelectOption {
@@ -1800,7 +1803,7 @@ declare class NgOatSelect implements FormValueControl<string> {
1800
1803
  private static nextId;
1801
1804
  readonly checked: undefined;
1802
1805
  readonly value: _angular_core.ModelSignal<string>;
1803
- readonly disabled: _angular_core.InputSignal<boolean>;
1806
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1804
1807
  readonly required: _angular_core.InputSignal<boolean>;
1805
1808
  readonly invalid: _angular_core.InputSignal<boolean>;
1806
1809
  readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
@@ -1809,12 +1812,12 @@ declare class NgOatSelect implements FormValueControl<string> {
1809
1812
  readonly placeholder: _angular_core.InputSignal<string>;
1810
1813
  readonly options: _angular_core.InputSignal<NgOatSelectOption[]>;
1811
1814
  readonly showErrors: _angular_core.InputSignal<boolean>;
1812
- protected selectId: _angular_core.Signal<string>;
1815
+ protected readonly selectId: string;
1813
1816
  onChange(event: Event): void;
1814
1817
  onBlur(): void;
1815
1818
  focus(options?: FocusOptions): void;
1816
1819
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatSelect, never>;
1817
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSelect, "ng-oat-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1820
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSelect, "ng-oat-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; }, never, never, true, never>;
1818
1821
  }
1819
1822
 
1820
1823
  /**
@@ -1833,13 +1836,14 @@ declare class NgOatSelect implements FormValueControl<string> {
1833
1836
  */
1834
1837
  declare class NgOatCheckbox implements FormCheckboxControl {
1835
1838
  readonly checked: _angular_core.ModelSignal<boolean>;
1836
- readonly disabled: _angular_core.InputSignal<boolean>;
1839
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1840
+ readonly touched: _angular_core.ModelSignal<boolean>;
1837
1841
  /** FormCheckboxControl requires `value` to be undefined */
1838
1842
  readonly value: undefined;
1839
1843
  readonly label: _angular_core.InputSignal<string>;
1840
1844
  onChange(event: Event): void;
1841
1845
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatCheckbox, never>;
1842
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatCheckbox, "ng-oat-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; }, never, never, true, never>;
1846
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatCheckbox, "ng-oat-checkbox", never, { "checked": { "alias": "checked"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "disabled": "disabledChange"; "touched": "touchedChange"; }, never, never, true, never>;
1843
1847
  }
1844
1848
 
1845
1849
  interface NgOatRadioOption {
@@ -1874,7 +1878,7 @@ declare class NgOatRadioGroup implements FormValueControl<string> {
1874
1878
  private static nextId;
1875
1879
  readonly value: _angular_core.ModelSignal<string>;
1876
1880
  readonly checked: undefined;
1877
- readonly disabled: _angular_core.InputSignal<boolean>;
1881
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1878
1882
  readonly required: _angular_core.InputSignal<boolean>;
1879
1883
  readonly invalid: _angular_core.InputSignal<boolean>;
1880
1884
  readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
@@ -1882,29 +1886,134 @@ declare class NgOatRadioGroup implements FormValueControl<string> {
1882
1886
  readonly label: _angular_core.InputSignal<string>;
1883
1887
  readonly options: _angular_core.InputSignal<NgOatRadioOption[]>;
1884
1888
  readonly showErrors: _angular_core.InputSignal<boolean>;
1885
- protected groupName: _angular_core.Signal<string>;
1889
+ protected readonly groupName: string;
1886
1890
  onSelect(val: string): void;
1887
1891
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatRadioGroup, never>;
1888
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatRadioGroup, "ng-oat-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touched": "touchedChange"; }, never, never, true, never>;
1892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatRadioGroup, "ng-oat-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": true; "isSignal": true; }; "showErrors": { "alias": "showErrors"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "touched": "touchedChange"; }, never, never, true, never>;
1889
1893
  }
1890
1894
 
1891
1895
  /**
1892
- * Displays validation errors for a Signal Forms field.
1893
- * Shows errors only when the field has been touched and is invalid.
1896
+ * Displays validation errors for form fields.
1894
1897
  *
1895
- * Usage:
1898
+ * **Signal Forms** — pass the `FieldState` directly:
1896
1899
  * ```html
1897
- * <ng-oat-input label="Email" [formField]="myForm.email" />
1898
1900
  * <ng-oat-form-error [control]="myForm.email" />
1899
1901
  * ```
1902
+ *
1903
+ * **Reactive / Template-driven** — pass error strings and a visibility flag:
1904
+ * ```html
1905
+ * <ng-oat-form-error [errors]="['Email is required']" [show]="email.touched && email.invalid" />
1906
+ * ```
1900
1907
  */
1901
1908
  declare class NgOatFormError {
1902
- readonly control: _angular_core.InputSignal<FieldState<unknown, string | number>>;
1909
+ /** Signal Forms FieldState for automatic error display. */
1910
+ readonly control: _angular_core.InputSignal<FieldState<unknown, string | number> | undefined>;
1911
+ /** Plain error message strings — for Reactive / Template-driven forms. */
1912
+ readonly errors: _angular_core.InputSignal<string[]>;
1913
+ /** External visibility flag — for Reactive / Template-driven forms. */
1914
+ readonly show: _angular_core.InputSignal<boolean>;
1915
+ /** Unified list of error message strings. */
1916
+ protected readonly errorMessages: _angular_core.Signal<(string | undefined)[]>;
1903
1917
  protected readonly shouldShowError: _angular_core.Signal<boolean>;
1904
1918
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatFormError, never>;
1905
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatFormError, "ng-oat-form-error", never, { "control": { "alias": "control"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1919
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatFormError, "ng-oat-form-error", never, { "control": { "alias": "control"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "show": { "alias": "show"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1920
+ }
1921
+
1922
+ /**
1923
+ * ControlValueAccessor adapter for ng-oat **value-type** components.
1924
+ *
1925
+ * Auto-activates when a Reactive Forms or Template-driven directive is present
1926
+ * (`formControlName`, `[formControl]`, or `[(ngModel)]`).
1927
+ *
1928
+ * Add this directive to your component's `imports` alongside the form component:
1929
+ * ```typescript
1930
+ * imports: [ReactiveFormsModule, NgOatInput, NgOatValueCva]
1931
+ * ```
1932
+ *
1933
+ * ```html
1934
+ * <ng-oat-input label="Email" formControlName="email" />
1935
+ * <ng-oat-input label="Name" [(ngModel)]="name" />
1936
+ * ```
1937
+ */
1938
+ declare class NgOatValueCva implements ControlValueAccessor {
1939
+ private readonly host;
1940
+ private onChange;
1941
+ private onTouched;
1942
+ /**
1943
+ * Listen for native `input` and `change` events that bubble from the inner
1944
+ * `<input>`, `<textarea>`, or `<select>` element up to the host component.
1945
+ */
1946
+ onHostValueChange(): void;
1947
+ /** Mark as touched when focus leaves the host element tree. */
1948
+ onHostBlur(): void;
1949
+ writeValue(val: string): void;
1950
+ registerOnChange(fn: (val: string) => void): void;
1951
+ registerOnTouched(fn: () => void): void;
1952
+ setDisabledState(isDisabled: boolean): void;
1953
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatValueCva, never>;
1954
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgOatValueCva, "ng-oat-input[formControlName],ng-oat-input[formControl],ng-oat-input[ngModel],ng-oat-textarea[formControlName],ng-oat-textarea[formControl],ng-oat-textarea[ngModel],ng-oat-select[formControlName],ng-oat-select[formControl],ng-oat-select[ngModel],ng-oat-radio-group[formControlName],ng-oat-radio-group[formControl],ng-oat-radio-group[ngModel],ng-oat-search-input[formControlName],ng-oat-search-input[formControl],ng-oat-search-input[ngModel],ng-oat-input-otp[formControlName],ng-oat-input-otp[formControl],ng-oat-input-otp[ngModel]", never, {}, {}, never, never, true, never>;
1906
1955
  }
1907
1956
 
1957
+ /**
1958
+ * ControlValueAccessor adapter for ng-oat **checkbox-type** components.
1959
+ *
1960
+ * Auto-activates when a Reactive Forms or Template-driven directive is present
1961
+ * (`formControlName`, `[formControl]`, or `[(ngModel)]`).
1962
+ *
1963
+ * Add this directive to your component's `imports` alongside the form component:
1964
+ * ```typescript
1965
+ * imports: [ReactiveFormsModule, NgOatCheckbox, NgOatCheckboxCva]
1966
+ * ```
1967
+ *
1968
+ * ```html
1969
+ * <ng-oat-checkbox label="Accept terms" formControlName="accepted" />
1970
+ * <ng-oat-switch label="Alerts" [(ngModel)]="alertsOn" />
1971
+ * ```
1972
+ */
1973
+ declare class NgOatCheckboxCva implements ControlValueAccessor {
1974
+ private readonly host;
1975
+ private onChange;
1976
+ private onTouched;
1977
+ /**
1978
+ * Listen for native `change` events that bubble from the inner
1979
+ * `<input type="checkbox">` up to the host component.
1980
+ */
1981
+ onHostChange(): void;
1982
+ /** Mark as touched when focus leaves the host element tree. */
1983
+ onHostBlur(): void;
1984
+ writeValue(val: boolean): void;
1985
+ registerOnChange(fn: (val: boolean) => void): void;
1986
+ registerOnTouched(fn: () => void): void;
1987
+ setDisabledState(isDisabled: boolean): void;
1988
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatCheckboxCva, never>;
1989
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgOatCheckboxCva, "ng-oat-checkbox[formControlName],ng-oat-checkbox[formControl],ng-oat-checkbox[ngModel],ng-oat-switch[formControlName],ng-oat-switch[formControl],ng-oat-switch[ngModel]", never, {}, {}, never, never, true, never>;
1990
+ }
1991
+
1992
+ /**
1993
+ * Host interface for ng-oat components that carry a string `value`.
1994
+ * Used by the CVA adapter directives to bridge Reactive & Template-driven forms.
1995
+ */
1996
+ interface NgOatValueHost {
1997
+ readonly value: ModelSignal<string>;
1998
+ readonly touched: ModelSignal<boolean>;
1999
+ readonly disabled: ModelSignal<boolean>;
2000
+ }
2001
+ /**
2002
+ * Host interface for ng-oat checkbox-style components that carry a boolean `checked`.
2003
+ */
2004
+ interface NgOatCheckboxHost {
2005
+ readonly checked: ModelSignal<boolean>;
2006
+ readonly touched: ModelSignal<boolean>;
2007
+ readonly disabled: ModelSignal<boolean>;
2008
+ }
2009
+ /** Injection token provided by each value-type ng-oat form component. */
2010
+ declare const NG_OAT_VALUE_HOST: InjectionToken<NgOatValueHost>;
2011
+ /** Injection token provided by each checkbox-type ng-oat form component. */
2012
+ declare const NG_OAT_CHECKBOX_HOST: InjectionToken<NgOatCheckboxHost>;
2013
+
2014
+ /** Convenience array — import both CVA adapters at once. */
2015
+ declare const NgOatFormsCva: readonly [typeof NgOatValueCva, typeof NgOatCheckboxCva];
2016
+
1908
2017
  /** Upstream Oat version this build is synced to. */
1909
2018
  declare const OAT_VERSION = "0.0.0-vendored";
1910
2019
 
@@ -1923,5 +2032,5 @@ interface TooltipPositioner {
1923
2032
  /** DI token for tooltip positioning strategy */
1924
2033
  declare const TOOLTIP_POSITIONER: InjectionToken<TooltipPositioner>;
1925
2034
 
1926
- export { NG_OAT_CHIP_GROUP, NG_OAT_TOGGLE_GROUP, NgOatAccordion, NgOatAlert, NgOatAvatar, NgOatBadge, NgOatBreadcrumb, NgOatButton, NgOatCard, NgOatCardCarousel, NgOatCardFooter, NgOatCardHeader, NgOatCarousel, NgOatCheckbox, NgOatChip, NgOatChipGroup, NgOatChipInput, NgOatDialog, NgOatDialogComponent, NgOatDropdown, NgOatDropdownComponent, NgOatFileUpload, NgOatFormError, NgOatInput, NgOatInputOtp, NgOatMeter, NgOatPagination, NgOatProgress, NgOatRadioGroup, NgOatSearchInput, NgOatSelect, NgOatSeparator, NgOatSidebar, NgOatSidebarComponent, NgOatSkeleton, NgOatSpinner, NgOatSplitButton, NgOatSwitch, NgOatTable, NgOatTabs, NgOatTabsComponent, NgOatTextarea, NgOatThemeRef, NgOatThemeSelector, NgOatThemeSelectorIcon, NgOatToast, NgOatToggle, NgOatToggleGroup, NgOatToolbar, NgOatToolbarRow, NgOatTooltip, NgOatTooltipComponent, OAT_TOKEN_MAP, OAT_VERSION, OAT_VERSION_TOKEN, TOOLTIP_POSITIONER, provideNgOat, provideNgOatTheme };
1927
- export type { NgOatAccordionItem, NgOatAlertVariant, NgOatAvatarSize, NgOatBadgeVariant, NgOatButtonSize, NgOatButtonStyle, NgOatButtonVariant, NgOatCarouselAspectRatio, NgOatCarouselOrientation, NgOatCarouselSlide, NgOatChipGroupHost, NgOatChipSize, NgOatChipVariant, NgOatInputType, NgOatOptions, NgOatProductCard, NgOatRadioOption, NgOatSelectOption, NgOatSeparatorOrientation, NgOatSkeletonType, NgOatSpinnerSize, NgOatTabItem, NgOatTableColumn, NgOatTheme, NgOatThemeConfig, NgOatThemeOption, NgOatToastOptions, NgOatToastPlacement, NgOatToastVariant, NgOatToggleGroupHost, NgOatToggleGroupSize, NgOatToggleGroupVariant, NgOatToggleSize, NgOatToggleVariant, NgOatToolbarColor, OatBreadcrumbItem, OatTokens, Placement, TooltipPositioner };
2035
+ export { NG_OAT_CHECKBOX_HOST, NG_OAT_CHIP_GROUP, NG_OAT_TOGGLE_GROUP, NG_OAT_VALUE_HOST, NgOatAccordion, NgOatAlert, NgOatAvatar, NgOatBadge, NgOatBreadcrumb, NgOatButton, NgOatCard, NgOatCardCarousel, NgOatCardFooter, NgOatCardHeader, NgOatCarousel, NgOatCheckbox, NgOatCheckboxCva, NgOatChip, NgOatChipGroup, NgOatChipInput, NgOatDialog, NgOatDialogComponent, NgOatDropdown, NgOatDropdownComponent, NgOatFileUpload, NgOatFormError, NgOatFormsCva, NgOatInput, NgOatInputOtp, NgOatMeter, NgOatPagination, NgOatProgress, NgOatRadioGroup, NgOatSearchInput, NgOatSelect, NgOatSeparator, NgOatSidebar, NgOatSidebarComponent, NgOatSkeleton, NgOatSpinner, NgOatSplitButton, NgOatSwitch, NgOatTable, NgOatTabs, NgOatTabsComponent, NgOatTextarea, NgOatThemeRef, NgOatThemeSelector, NgOatThemeSelectorIcon, NgOatToast, NgOatToggle, NgOatToggleGroup, NgOatToolbar, NgOatToolbarRow, NgOatTooltip, NgOatTooltipComponent, NgOatValueCva, OAT_TOKEN_MAP, OAT_VERSION, OAT_VERSION_TOKEN, TOOLTIP_POSITIONER, provideNgOat, provideNgOatTheme };
2036
+ export type { NgOatAccordionItem, NgOatAlertVariant, NgOatAvatarSize, NgOatBadgeVariant, NgOatButtonSize, NgOatButtonStyle, NgOatButtonVariant, NgOatCarouselAspectRatio, NgOatCarouselOrientation, NgOatCarouselSlide, NgOatCheckboxHost, NgOatChipGroupHost, NgOatChipSize, NgOatChipVariant, NgOatInputType, NgOatOptions, NgOatProductCard, NgOatRadioOption, NgOatSelectOption, NgOatSeparatorOrientation, NgOatSkeletonType, NgOatSpinnerSize, NgOatTabItem, NgOatTableColumn, NgOatTheme, NgOatThemeConfig, NgOatThemeOption, NgOatToastOptions, NgOatToastPlacement, NgOatToastVariant, NgOatToggleGroupHost, NgOatToggleGroupSize, NgOatToggleGroupVariant, NgOatToggleSize, NgOatToggleVariant, NgOatToolbarColor, NgOatValueHost, OatBreadcrumbItem, OatTokens, Placement, TooltipPositioner };