@letsprogram/ng-oat 0.1.4 → 0.1.6

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.6",
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';
@@ -916,13 +918,27 @@ declare class NgOatTooltipComponent {
916
918
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatTooltipComponent, "ng-oat-tooltip", never, { "text": { "alias": "text"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
917
919
  }
918
920
 
921
+ type NgOatSidebarMode = 'fixed' | 'overlay';
919
922
  /**
920
923
  * Angular component wrapper for Oat's sidebar layout.
921
924
  *
922
- * Usage:
925
+ * Supports two modes:
926
+ * - `fixed` (default): Permanent sidebar on desktop, slide-out drawer on mobile.
927
+ * - `overlay`: Slide-out drawer at all screen sizes (ideal for app shells
928
+ * that already have a toolbar with nav links).
929
+ *
930
+ * Usage (fixed — permanent desktop sidebar):
923
931
  * ```html
924
- * <ng-oat-sidebar [scrollLock]="true" (openChange)="onToggle($event)">
925
- * <aside sidebar>Navigation</aside>
932
+ * <ng-oat-sidebar>
933
+ * <aside data-sidebar>Navigation</aside>
934
+ * <main>Main content</main>
935
+ * </ng-oat-sidebar>
936
+ * ```
937
+ *
938
+ * Usage (overlay — mobile-style drawer at all sizes):
939
+ * ```html
940
+ * <ng-oat-sidebar mode="overlay">
941
+ * <aside data-sidebar>Navigation</aside>
926
942
  * <main>Main content</main>
927
943
  * </ng-oat-sidebar>
928
944
  * ```
@@ -933,22 +949,35 @@ declare class NgOatSidebarComponent {
933
949
  private destroyRef;
934
950
  private platformId;
935
951
  private doc;
936
- /** Whether scroll lock is applied on mobile when sidebar is open */
952
+ /**
953
+ * Layout mode:
954
+ * - `'fixed'` (default) — permanent sidebar on desktop, drawer on mobile.
955
+ * - `'overlay'` — always a slide-out drawer at any screen size.
956
+ */
957
+ readonly mode: _angular_core.InputSignal<NgOatSidebarMode>;
958
+ /** Whether scroll lock is applied when sidebar is open */
937
959
  readonly scrollLock: _angular_core.InputSignal<boolean>;
938
960
  readonly initialOpen: _angular_core.InputSignal<boolean>;
939
961
  readonly isOpen: _angular_core.WritableSignal<boolean>;
940
962
  readonly openChange: _angular_core.OutputEmitterRef<boolean>;
963
+ /** Whether the sidebar is in overlay mode */
964
+ readonly isOverlay: _angular_core.Signal<boolean>;
941
965
  private cleanupFns;
942
966
  constructor();
943
967
  open(): void;
944
968
  close(): void;
945
969
  toggle(): void;
970
+ /**
971
+ * Whether the sidebar should auto-close on outside click / ESC.
972
+ * In overlay mode: always. In fixed mode: only on mobile.
973
+ */
974
+ private shouldAutoClose;
946
975
  private isMobile;
947
976
  private lockScroll;
948
977
  private restoreScroll;
949
978
  private listen;
950
979
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatSidebarComponent, never>;
951
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSidebarComponent, "ng-oat-sidebar", never, { "scrollLock": { "alias": "scrollLock"; "required": false; "isSignal": true; }; "initialOpen": { "alias": "initialOpen"; "required": false; "isSignal": true; }; }, { "openChange": "openChange"; }, never, ["*"], true, never>;
980
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgOatSidebarComponent, "ng-oat-sidebar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "scrollLock": { "alias": "scrollLock"; "required": false; "isSignal": true; }; "initialOpen": { "alias": "initialOpen"; "required": false; "isSignal": true; }; }, { "openChange": "openChange"; }, never, ["*"], true, never>;
952
981
  }
953
982
 
954
983
  interface NgOatTabItem {
@@ -1109,9 +1138,10 @@ declare class NgOatFileUpload {
1109
1138
  declare class NgOatInputOtp implements FormValueControl<string> {
1110
1139
  readonly length: _angular_core.InputSignal<number>;
1111
1140
  readonly separator: _angular_core.InputSignal<number>;
1112
- readonly disabled: _angular_core.InputSignal<boolean>;
1141
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1113
1142
  readonly mask: _angular_core.InputSignal<boolean>;
1114
1143
  readonly value: _angular_core.ModelSignal<string>;
1144
+ readonly touched: _angular_core.ModelSignal<boolean>;
1115
1145
  readonly checked: undefined;
1116
1146
  private slotInputRefs;
1117
1147
  protected slots: _angular_core.Signal<string[]>;
@@ -1123,7 +1153,7 @@ declare class NgOatInputOtp implements FormValueControl<string> {
1123
1153
  private focusSlot;
1124
1154
  focus(options?: FocusOptions): void;
1125
1155
  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>;
1156
+ 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
1157
  }
1128
1158
 
1129
1159
  /**
@@ -1138,7 +1168,7 @@ declare class NgOatInputOtp implements FormValueControl<string> {
1138
1168
  */
1139
1169
  declare class NgOatSearchInput implements FormValueControl<string>, OnInit, OnDestroy {
1140
1170
  readonly placeholder: _angular_core.InputSignal<string>;
1141
- readonly disabled: _angular_core.InputSignal<boolean>;
1171
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1142
1172
  readonly shortcut: _angular_core.InputSignal<string>;
1143
1173
  readonly debounceMs: _angular_core.InputSignal<number>;
1144
1174
  readonly value: _angular_core.ModelSignal<string>;
@@ -1160,7 +1190,7 @@ declare class NgOatSearchInput implements FormValueControl<string>, OnInit, OnDe
1160
1190
  focus(options?: FocusOptions): void;
1161
1191
  private focusInput;
1162
1192
  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>;
1193
+ 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
1194
  }
1165
1195
 
1166
1196
  type NgOatSeparatorOrientation = 'horizontal' | 'vertical';
@@ -1714,7 +1744,7 @@ declare class NgOatInput implements FormValueControl<string> {
1714
1744
  private static nextId;
1715
1745
  readonly value: _angular_core.ModelSignal<string>;
1716
1746
  readonly checked: undefined;
1717
- readonly disabled: _angular_core.InputSignal<boolean>;
1747
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1718
1748
  readonly readonly: _angular_core.InputSignal<boolean>;
1719
1749
  readonly required: _angular_core.InputSignal<boolean>;
1720
1750
  readonly invalid: _angular_core.InputSignal<boolean>;
@@ -1724,16 +1754,17 @@ declare class NgOatInput implements FormValueControl<string> {
1724
1754
  readonly max: _angular_core.InputSignal<number | undefined>;
1725
1755
  readonly minLength: _angular_core.InputSignal<number | undefined>;
1726
1756
  readonly maxLength: _angular_core.InputSignal<number | undefined>;
1757
+ readonly autocomplete: _angular_core.InputSignal<string | undefined>;
1727
1758
  readonly label: _angular_core.InputSignal<string>;
1728
1759
  readonly type: _angular_core.InputSignal<NgOatInputType>;
1729
1760
  readonly placeholder: _angular_core.InputSignal<string>;
1730
1761
  readonly showErrors: _angular_core.InputSignal<boolean>;
1731
- protected inputId: _angular_core.Signal<string>;
1762
+ protected readonly inputId: string;
1732
1763
  onInput(event: Event): void;
1733
1764
  onBlur(): void;
1734
1765
  focus(options?: FocusOptions): void;
1735
1766
  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>;
1767
+ 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; }; "autocomplete": { "alias": "autocomplete"; "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
1768
  }
1738
1769
 
1739
1770
  /**
@@ -1754,7 +1785,7 @@ declare class NgOatTextarea implements FormValueControl<string> {
1754
1785
  private static nextId;
1755
1786
  readonly value: _angular_core.ModelSignal<string>;
1756
1787
  readonly checked: undefined;
1757
- readonly disabled: _angular_core.InputSignal<boolean>;
1788
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1758
1789
  readonly readonly: _angular_core.InputSignal<boolean>;
1759
1790
  readonly required: _angular_core.InputSignal<boolean>;
1760
1791
  readonly invalid: _angular_core.InputSignal<boolean>;
@@ -1766,12 +1797,12 @@ declare class NgOatTextarea implements FormValueControl<string> {
1766
1797
  readonly placeholder: _angular_core.InputSignal<string>;
1767
1798
  readonly rows: _angular_core.InputSignal<number>;
1768
1799
  readonly showErrors: _angular_core.InputSignal<boolean>;
1769
- protected textareaId: _angular_core.Signal<string>;
1800
+ protected readonly textareaId: string;
1770
1801
  onInput(event: Event): void;
1771
1802
  onBlur(): void;
1772
1803
  focus(options?: FocusOptions): void;
1773
1804
  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>;
1805
+ 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
1806
  }
1776
1807
 
1777
1808
  interface NgOatSelectOption {
@@ -1800,7 +1831,7 @@ declare class NgOatSelect implements FormValueControl<string> {
1800
1831
  private static nextId;
1801
1832
  readonly checked: undefined;
1802
1833
  readonly value: _angular_core.ModelSignal<string>;
1803
- readonly disabled: _angular_core.InputSignal<boolean>;
1834
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1804
1835
  readonly required: _angular_core.InputSignal<boolean>;
1805
1836
  readonly invalid: _angular_core.InputSignal<boolean>;
1806
1837
  readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
@@ -1809,12 +1840,12 @@ declare class NgOatSelect implements FormValueControl<string> {
1809
1840
  readonly placeholder: _angular_core.InputSignal<string>;
1810
1841
  readonly options: _angular_core.InputSignal<NgOatSelectOption[]>;
1811
1842
  readonly showErrors: _angular_core.InputSignal<boolean>;
1812
- protected selectId: _angular_core.Signal<string>;
1843
+ protected readonly selectId: string;
1813
1844
  onChange(event: Event): void;
1814
1845
  onBlur(): void;
1815
1846
  focus(options?: FocusOptions): void;
1816
1847
  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>;
1848
+ 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
1849
  }
1819
1850
 
1820
1851
  /**
@@ -1833,13 +1864,14 @@ declare class NgOatSelect implements FormValueControl<string> {
1833
1864
  */
1834
1865
  declare class NgOatCheckbox implements FormCheckboxControl {
1835
1866
  readonly checked: _angular_core.ModelSignal<boolean>;
1836
- readonly disabled: _angular_core.InputSignal<boolean>;
1867
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1868
+ readonly touched: _angular_core.ModelSignal<boolean>;
1837
1869
  /** FormCheckboxControl requires `value` to be undefined */
1838
1870
  readonly value: undefined;
1839
1871
  readonly label: _angular_core.InputSignal<string>;
1840
1872
  onChange(event: Event): void;
1841
1873
  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>;
1874
+ 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
1875
  }
1844
1876
 
1845
1877
  interface NgOatRadioOption {
@@ -1874,7 +1906,7 @@ declare class NgOatRadioGroup implements FormValueControl<string> {
1874
1906
  private static nextId;
1875
1907
  readonly value: _angular_core.ModelSignal<string>;
1876
1908
  readonly checked: undefined;
1877
- readonly disabled: _angular_core.InputSignal<boolean>;
1909
+ readonly disabled: _angular_core.ModelSignal<boolean>;
1878
1910
  readonly required: _angular_core.InputSignal<boolean>;
1879
1911
  readonly invalid: _angular_core.InputSignal<boolean>;
1880
1912
  readonly errors: _angular_core.InputSignal<readonly ValidationError.WithOptionalFieldTree[]>;
@@ -1882,29 +1914,134 @@ declare class NgOatRadioGroup implements FormValueControl<string> {
1882
1914
  readonly label: _angular_core.InputSignal<string>;
1883
1915
  readonly options: _angular_core.InputSignal<NgOatRadioOption[]>;
1884
1916
  readonly showErrors: _angular_core.InputSignal<boolean>;
1885
- protected groupName: _angular_core.Signal<string>;
1917
+ protected readonly groupName: string;
1886
1918
  onSelect(val: string): void;
1887
1919
  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>;
1920
+ 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
1921
  }
1890
1922
 
1891
1923
  /**
1892
- * Displays validation errors for a Signal Forms field.
1893
- * Shows errors only when the field has been touched and is invalid.
1924
+ * Displays validation errors for form fields.
1894
1925
  *
1895
- * Usage:
1926
+ * **Signal Forms** — pass the `FieldState` directly:
1896
1927
  * ```html
1897
- * <ng-oat-input label="Email" [formField]="myForm.email" />
1898
1928
  * <ng-oat-form-error [control]="myForm.email" />
1899
1929
  * ```
1930
+ *
1931
+ * **Reactive / Template-driven** — pass error strings and a visibility flag:
1932
+ * ```html
1933
+ * <ng-oat-form-error [errors]="['Email is required']" [show]="email.touched && email.invalid" />
1934
+ * ```
1900
1935
  */
1901
1936
  declare class NgOatFormError {
1902
- readonly control: _angular_core.InputSignal<FieldState<unknown, string | number>>;
1937
+ /** Signal Forms FieldState for automatic error display. */
1938
+ readonly control: _angular_core.InputSignal<FieldState<unknown, string | number> | undefined>;
1939
+ /** Plain error message strings — for Reactive / Template-driven forms. */
1940
+ readonly errors: _angular_core.InputSignal<string[]>;
1941
+ /** External visibility flag — for Reactive / Template-driven forms. */
1942
+ readonly show: _angular_core.InputSignal<boolean>;
1943
+ /** Unified list of error message strings. */
1944
+ protected readonly errorMessages: _angular_core.Signal<(string | undefined)[]>;
1903
1945
  protected readonly shouldShowError: _angular_core.Signal<boolean>;
1904
1946
  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>;
1947
+ 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>;
1948
+ }
1949
+
1950
+ /**
1951
+ * ControlValueAccessor adapter for ng-oat **value-type** components.
1952
+ *
1953
+ * Auto-activates when a Reactive Forms or Template-driven directive is present
1954
+ * (`formControlName`, `[formControl]`, or `[(ngModel)]`).
1955
+ *
1956
+ * Add this directive to your component's `imports` alongside the form component:
1957
+ * ```typescript
1958
+ * imports: [ReactiveFormsModule, NgOatInput, NgOatValueCva]
1959
+ * ```
1960
+ *
1961
+ * ```html
1962
+ * <ng-oat-input label="Email" formControlName="email" />
1963
+ * <ng-oat-input label="Name" [(ngModel)]="name" />
1964
+ * ```
1965
+ */
1966
+ declare class NgOatValueCva implements ControlValueAccessor {
1967
+ private readonly host;
1968
+ private onChange;
1969
+ private onTouched;
1970
+ /**
1971
+ * Listen for native `input` and `change` events that bubble from the inner
1972
+ * `<input>`, `<textarea>`, or `<select>` element up to the host component.
1973
+ */
1974
+ onHostValueChange(): void;
1975
+ /** Mark as touched when focus leaves the host element tree. */
1976
+ onHostBlur(): void;
1977
+ writeValue(val: string): void;
1978
+ registerOnChange(fn: (val: string) => void): void;
1979
+ registerOnTouched(fn: () => void): void;
1980
+ setDisabledState(isDisabled: boolean): void;
1981
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatValueCva, never>;
1982
+ 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
1983
  }
1907
1984
 
1985
+ /**
1986
+ * ControlValueAccessor adapter for ng-oat **checkbox-type** components.
1987
+ *
1988
+ * Auto-activates when a Reactive Forms or Template-driven directive is present
1989
+ * (`formControlName`, `[formControl]`, or `[(ngModel)]`).
1990
+ *
1991
+ * Add this directive to your component's `imports` alongside the form component:
1992
+ * ```typescript
1993
+ * imports: [ReactiveFormsModule, NgOatCheckbox, NgOatCheckboxCva]
1994
+ * ```
1995
+ *
1996
+ * ```html
1997
+ * <ng-oat-checkbox label="Accept terms" formControlName="accepted" />
1998
+ * <ng-oat-switch label="Alerts" [(ngModel)]="alertsOn" />
1999
+ * ```
2000
+ */
2001
+ declare class NgOatCheckboxCva implements ControlValueAccessor {
2002
+ private readonly host;
2003
+ private onChange;
2004
+ private onTouched;
2005
+ /**
2006
+ * Listen for native `change` events that bubble from the inner
2007
+ * `<input type="checkbox">` up to the host component.
2008
+ */
2009
+ onHostChange(): void;
2010
+ /** Mark as touched when focus leaves the host element tree. */
2011
+ onHostBlur(): void;
2012
+ writeValue(val: boolean): void;
2013
+ registerOnChange(fn: (val: boolean) => void): void;
2014
+ registerOnTouched(fn: () => void): void;
2015
+ setDisabledState(isDisabled: boolean): void;
2016
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgOatCheckboxCva, never>;
2017
+ 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>;
2018
+ }
2019
+
2020
+ /**
2021
+ * Host interface for ng-oat components that carry a string `value`.
2022
+ * Used by the CVA adapter directives to bridge Reactive & Template-driven forms.
2023
+ */
2024
+ interface NgOatValueHost {
2025
+ readonly value: ModelSignal<string>;
2026
+ readonly touched: ModelSignal<boolean>;
2027
+ readonly disabled: ModelSignal<boolean>;
2028
+ }
2029
+ /**
2030
+ * Host interface for ng-oat checkbox-style components that carry a boolean `checked`.
2031
+ */
2032
+ interface NgOatCheckboxHost {
2033
+ readonly checked: ModelSignal<boolean>;
2034
+ readonly touched: ModelSignal<boolean>;
2035
+ readonly disabled: ModelSignal<boolean>;
2036
+ }
2037
+ /** Injection token provided by each value-type ng-oat form component. */
2038
+ declare const NG_OAT_VALUE_HOST: InjectionToken<NgOatValueHost>;
2039
+ /** Injection token provided by each checkbox-type ng-oat form component. */
2040
+ declare const NG_OAT_CHECKBOX_HOST: InjectionToken<NgOatCheckboxHost>;
2041
+
2042
+ /** Convenience array — import both CVA adapters at once. */
2043
+ declare const NgOatFormsCva: readonly [typeof NgOatValueCva, typeof NgOatCheckboxCva];
2044
+
1908
2045
  /** Upstream Oat version this build is synced to. */
1909
2046
  declare const OAT_VERSION = "0.0.0-vendored";
1910
2047
 
@@ -1923,5 +2060,5 @@ interface TooltipPositioner {
1923
2060
  /** DI token for tooltip positioning strategy */
1924
2061
  declare const TOOLTIP_POSITIONER: InjectionToken<TooltipPositioner>;
1925
2062
 
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 };
2063
+ 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 };
2064
+ 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 };