@radix-ng/primitives 1.0.0-beta.0 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/fesm2022/radix-ng-primitives-accordion.mjs +2 -2
  2. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  3. package/fesm2022/radix-ng-primitives-calendar.mjs +109 -84
  4. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs +2 -2
  6. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  7. package/fesm2022/radix-ng-primitives-collapsible.mjs +1 -1
  8. package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
  9. package/fesm2022/radix-ng-primitives-combobox.mjs +1923 -0
  10. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -0
  11. package/fesm2022/radix-ng-primitives-context-menu.mjs +1 -1
  12. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  13. package/fesm2022/radix-ng-primitives-core.mjs +591 -470
  14. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  15. package/fesm2022/radix-ng-primitives-cropper.mjs +287 -308
  16. package/fesm2022/radix-ng-primitives-cropper.mjs.map +1 -1
  17. package/fesm2022/radix-ng-primitives-date-field.mjs +66 -15
  18. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  19. package/fesm2022/radix-ng-primitives-dialog.mjs +1 -1
  20. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  21. package/fesm2022/radix-ng-primitives-drawer.mjs +7 -106
  22. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  23. package/fesm2022/radix-ng-primitives-editable.mjs +305 -24
  24. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  25. package/fesm2022/radix-ng-primitives-field.mjs +86 -6
  26. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  27. package/fesm2022/radix-ng-primitives-fieldset.mjs +1 -1
  28. package/fesm2022/radix-ng-primitives-fieldset.mjs.map +1 -1
  29. package/fesm2022/radix-ng-primitives-focus-scope.mjs +1 -1
  30. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  31. package/fesm2022/radix-ng-primitives-form.mjs +207 -0
  32. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -0
  33. package/fesm2022/radix-ng-primitives-input.mjs +85 -4
  34. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  35. package/fesm2022/radix-ng-primitives-menu.mjs +413 -5
  36. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  37. package/fesm2022/radix-ng-primitives-menubar.mjs +1 -1
  38. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  39. package/fesm2022/radix-ng-primitives-meter.mjs +1 -1
  40. package/fesm2022/radix-ng-primitives-meter.mjs.map +1 -1
  41. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +1 -1
  42. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  43. package/fesm2022/radix-ng-primitives-number-field.mjs +2 -2
  44. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-popover.mjs +1 -1
  46. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-popper.mjs +22 -5
  48. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-preview-card.mjs +1 -1
  51. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-progress.mjs +1 -1
  53. package/fesm2022/radix-ng-primitives-progress.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-roving-focus.mjs +1 -1
  55. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-scroll-area.mjs +923 -0
  57. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -0
  58. package/fesm2022/radix-ng-primitives-select.mjs +421 -224
  59. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-slider.mjs +1 -1
  61. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  63. package/fesm2022/radix-ng-primitives-switch.mjs +3 -2
  64. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  65. package/fesm2022/radix-ng-primitives-tabs.mjs +12 -3
  66. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  67. package/fesm2022/radix-ng-primitives-time-field.mjs +27 -3
  68. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  69. package/fesm2022/radix-ng-primitives-toast.mjs +839 -0
  70. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -0
  71. package/fesm2022/radix-ng-primitives-toggle-group.mjs +1 -1
  72. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  73. package/fesm2022/radix-ng-primitives-toolbar.mjs +2 -2
  74. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  75. package/fesm2022/radix-ng-primitives-tooltip.mjs +11 -3
  76. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  77. package/package.json +18 -2
  78. package/schematics/ng-add/index.js +57 -0
  79. package/schematics/ng-add/index.js.map +1 -1
  80. package/schematics/ng-add/schema.d.ts +1 -0
  81. package/schematics/ng-add/schema.json +6 -0
  82. package/types/radix-ng-primitives-accordion.d.ts +3 -2
  83. package/types/radix-ng-primitives-calendar.d.ts +38 -18
  84. package/types/radix-ng-primitives-checkbox.d.ts +5 -5
  85. package/types/radix-ng-primitives-collapsible.d.ts +2 -1
  86. package/types/radix-ng-primitives-combobox.d.ts +1265 -0
  87. package/types/radix-ng-primitives-context-menu.d.ts +3 -2
  88. package/types/radix-ng-primitives-core.d.ts +187 -56
  89. package/types/radix-ng-primitives-cropper.d.ts +89 -56
  90. package/types/radix-ng-primitives-date-field.d.ts +11 -5
  91. package/types/radix-ng-primitives-dialog.d.ts +2 -1
  92. package/types/radix-ng-primitives-drawer.d.ts +5 -27
  93. package/types/radix-ng-primitives-editable.d.ts +90 -13
  94. package/types/radix-ng-primitives-field.d.ts +74 -4
  95. package/types/radix-ng-primitives-fieldset.d.ts +3 -2
  96. package/types/radix-ng-primitives-focus-scope.d.ts +2 -1
  97. package/types/radix-ng-primitives-form.d.ts +124 -0
  98. package/types/radix-ng-primitives-input.d.ts +75 -5
  99. package/types/radix-ng-primitives-menu.d.ts +16 -4
  100. package/types/radix-ng-primitives-menubar.d.ts +2 -1
  101. package/types/radix-ng-primitives-meter.d.ts +3 -2
  102. package/types/radix-ng-primitives-navigation-menu.d.ts +1 -1
  103. package/types/radix-ng-primitives-number-field.d.ts +6 -6
  104. package/types/radix-ng-primitives-popover.d.ts +2 -1
  105. package/types/radix-ng-primitives-popper.d.ts +19 -2
  106. package/types/radix-ng-primitives-preview-card.d.ts +1 -1
  107. package/types/radix-ng-primitives-progress.d.ts +3 -2
  108. package/types/radix-ng-primitives-roving-focus.d.ts +4 -3
  109. package/types/radix-ng-primitives-scroll-area.d.ts +253 -0
  110. package/types/radix-ng-primitives-select.d.ts +296 -136
  111. package/types/radix-ng-primitives-slider.d.ts +1 -1
  112. package/types/radix-ng-primitives-switch.d.ts +1 -1
  113. package/types/radix-ng-primitives-tabs.d.ts +1 -1
  114. package/types/radix-ng-primitives-toast.d.ts +378 -0
  115. package/types/radix-ng-primitives-toggle-group.d.ts +2 -1
  116. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  117. package/types/radix-ng-primitives-tooltip.d.ts +3 -2
@@ -1,6 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Signal, Provider } from '@angular/core';
3
+ import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
3
4
  import { BooleanInput } from '@radix-ng/primitives/core';
5
+ export { RdxPointerDragHandlers, usePointerDrag } from '@radix-ng/primitives/core';
4
6
  import * as i1 from '@radix-ng/primitives/dialog';
5
7
  import { RdxDialogHandle } from '@radix-ng/primitives/dialog';
6
8
  import * as _radix_ng_primitives_drawer from '@radix-ng/primitives/drawer';
@@ -183,7 +185,7 @@ interface RdxDrawerRootContext {
183
185
  /** Reports the popup's measured size (px) so the provider can expose it. */
184
186
  reportPopupHeight: (height: number) => void;
185
187
  }
186
- declare const injectRdxDrawerRootContext: (optional?: boolean) => RdxDrawerRootContext | null;
188
+ declare const injectRdxDrawerRootContext: _radix_ng_primitives_core.InjectContext<RdxDrawerRootContext>;
187
189
  declare const provideRdxDrawerRootContext: (useFactory: () => RdxDrawerRootContext) => i0.Provider;
188
190
  /**
189
191
  * Groups all parts of the drawer.
@@ -413,30 +415,6 @@ declare const RdxDrawerHandle: typeof RdxDialogHandle;
413
415
  type RdxDrawerHandle<Payload = unknown> = RdxDialogHandle<Payload>;
414
416
  declare function createRdxDrawerHandle<Payload = unknown>(): RdxDrawerHandle<Payload>;
415
417
 
416
- interface RdxPointerDragHandlers {
417
- /** Whether a press may begin a drag (e.g. enabled, not on an opt-out element, at a scroll edge). */
418
- canStart: (event: PointerEvent) => boolean;
419
- /** A drag actually began (the pointer moved past the start threshold). */
420
- onStart: (event: PointerEvent) => void;
421
- /** Pointer moved during a drag. Return `false` to end the gesture early (treated as not committed). */
422
- onMove: (event: PointerEvent) => void | boolean;
423
- /** The drag ended. `committed` is true only for a normal `pointerup`, false for cancel/lost-capture/early-stop. */
424
- onEnd: (event: PointerEvent, committed: boolean) => void;
425
- }
426
- /**
427
- * Shared pointer-drag lifecycle for the drawer gestures (popup swipe and swipe-area open).
428
- *
429
- * A press only becomes a drag once the pointer moves past {@link DRAG_THRESHOLD}; until then it is a
430
- * plain tap, so clicks on buttons inside the drawer keep working (the gesture never captures the
431
- * pointer for a tap). Once dragging, the pointer is captured so a drag that leaves the element still
432
- * completes, and `lostpointercapture` / `pointercancel` count as a non-committed end — a swallowed
433
- * `pointerup` (native context menu, OS gesture, tab switch) can never wedge the gesture. No-op
434
- * outside the browser, keeping SSR safe.
435
- *
436
- * Must be called from an injection context (a directive/component constructor).
437
- */
438
- declare function usePointerDrag(handlers: RdxPointerDragHandlers): void;
439
-
440
418
  declare const drawerImports: (typeof RdxDrawerProviderDirective)[];
441
419
  declare class RdxDrawerModule {
442
420
  static ɵfac: i0.ɵɵFactoryDeclaration<RdxDrawerModule, never>;
@@ -444,5 +422,5 @@ declare class RdxDrawerModule {
444
422
  static ɵinj: i0.ɵɵInjectorDeclaration<RdxDrawerModule>;
445
423
  }
446
424
 
447
- export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalPresence, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe, usePointerDrag };
448
- export type { RdxDrawerRegistration, RdxDrawerRelease, RdxDrawerRootContext, RdxDrawerSnapEntry, RdxDrawerSnapPoint, RdxDrawerSnapResolveOptions, RdxDrawerSnapTarget, RdxDrawerSwipeConfig, RdxDrawerSwipeDirection, RdxPointerDragHandlers };
425
+ export { RdxDrawerBackdrop, RdxDrawerClose, RdxDrawerContent, RdxDrawerDescription, RdxDrawerHandle, RdxDrawerIndent, RdxDrawerIndentBackground, RdxDrawerModule, RdxDrawerPopup, RdxDrawerPortal, RdxDrawerPortalPresence, RdxDrawerProvider, RdxDrawerProviderDirective, RdxDrawerRoot, RdxDrawerSwipeArea, RdxDrawerTitle, RdxDrawerTrigger, RdxDrawerViewport, buildSnapEntries, createRdxDrawerHandle, dismissUnitVector, drawerImports, injectRdxDrawerRootContext, provideRdxDrawerProvider, provideRdxDrawerRootContext, resolveSnapTarget, snapPointReveal, useDrawerSwipe };
426
+ export type { RdxDrawerRegistration, RdxDrawerRelease, RdxDrawerRootContext, RdxDrawerSnapEntry, RdxDrawerSnapPoint, RdxDrawerSnapResolveOptions, RdxDrawerSnapTarget, RdxDrawerSwipeConfig, RdxDrawerSwipeDirection };
@@ -1,70 +1,147 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Signal, WritableSignal } from '@angular/core';
3
+ import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
3
4
  import { BooleanInput, NumberInput } from '@radix-ng/primitives/core';
4
5
  import * as i1 from '@radix-ng/primitives/dismissable-layer';
5
- import { RdxPointerDownOutside } from '@radix-ng/primitives/dismissable-layer';
6
+ import * as _radix_ng_primitives_editable from '@radix-ng/primitives/editable';
6
7
 
8
+ type EditableActivationMode = 'focus' | 'dblclick' | 'none';
9
+ type EditableSubmitMode = 'blur' | 'enter' | 'none' | 'both';
7
10
  type EditableRootContext = {
8
11
  disabled: Signal<boolean>;
9
- value: Signal<string | null | undefined>;
12
+ value: Signal<string | undefined>;
10
13
  inputValue: WritableSignal<string | undefined>;
11
14
  placeholder: Signal<{
12
15
  edit: string;
13
16
  preview: string;
14
17
  }>;
15
18
  isEditing: Signal<boolean>;
16
- submitMode: Signal<SubmitMode>;
17
- activationMode: Signal<ActivationMode>;
19
+ submitMode: Signal<EditableSubmitMode>;
20
+ activationMode: Signal<EditableActivationMode>;
18
21
  edit: () => void;
19
22
  cancel: () => void;
20
23
  submit: () => void;
21
24
  maxLength: Signal<number | undefined>;
25
+ required: Signal<boolean>;
22
26
  startWithEditMode: Signal<boolean>;
23
27
  isEmpty: Signal<boolean>;
24
28
  readonly: Signal<boolean>;
25
29
  selectOnFocus: Signal<boolean>;
26
30
  autoResize: Signal<boolean>;
27
31
  inputRef: WritableSignal<HTMLInputElement | undefined>;
32
+ previewRef: WritableSignal<HTMLElement | undefined>;
33
+ canActivateOnFocus: () => boolean;
28
34
  };
29
- declare const injectEditableRootContext: (optional?: boolean) => EditableRootContext | null;
35
+ declare const injectEditableRootContext: _radix_ng_primitives_core.InjectContext<EditableRootContext>;
30
36
  declare const provideEditableRootContext: (useFactory: () => EditableRootContext) => _angular_core.Provider;
31
- type ActivationMode = 'focus' | 'dblclick' | 'none';
32
- type SubmitMode = 'blur' | 'enter' | 'none' | 'both';
33
37
  /**
34
38
  * @group Components
35
39
  */
36
40
  declare class RdxEditableRoot {
37
41
  private readonly focusOutside;
38
- readonly pointerDownOutside: RdxPointerDownOutside;
42
+ private readonly pointerDownOutside;
39
43
  readonly value: _angular_core.ModelSignal<string | undefined>;
44
+ /** Uncontrolled initial value. */
45
+ readonly defaultValue: _angular_core.InputSignal<string | undefined>;
40
46
  readonly placeholder: _angular_core.InputSignal<string>;
41
47
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
42
48
  readonly readonly: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
43
49
  readonly selectOnFocus: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
44
- readonly submitMode: _angular_core.InputSignal<SubmitMode>;
50
+ readonly submitMode: _angular_core.InputSignal<EditableSubmitMode>;
45
51
  readonly maxLength: _angular_core.InputSignalWithTransform<number | undefined, NumberInput>;
46
52
  /**
47
53
  * Whether to start with the edit mode active
48
54
  */
49
55
  readonly startWithEditMode: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
50
- readonly activationMode: _angular_core.InputSignal<ActivationMode>;
56
+ readonly activationMode: _angular_core.InputSignal<EditableActivationMode>;
51
57
  readonly autoResize: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
52
58
  readonly required: _angular_core.InputSignalWithTransform<boolean, BooleanInput>;
59
+ /** Emitted when the value is committed (on submit). */
60
+ readonly onValueChange: _angular_core.OutputEmitterRef<string>;
53
61
  readonly isEmpty: Signal<boolean>;
54
- readonly $placeholder: Signal<string | {
62
+ readonly $placeholder: Signal<{
55
63
  edit: string;
56
64
  preview: string;
57
65
  }>;
66
+ /** Seeded from `startWithEditMode`; flipped imperatively by edit/submit/cancel. */
58
67
  readonly isEditing: WritableSignal<boolean>;
68
+ /** Working copy of the value while editing; reseeded whenever the committed value changes. */
59
69
  readonly inputValue: WritableSignal<string | undefined>;
60
70
  readonly inputRef: WritableSignal<HTMLInputElement | undefined>;
71
+ readonly previewRef: WritableSignal<HTMLElement | undefined>;
72
+ private restoreFocusOnExit;
73
+ /** True while focus is being restored programmatically, to avoid re-entering edit mode. */
74
+ private suppressFocusActivation;
61
75
  constructor();
76
+ canActivateOnFocus(): boolean;
62
77
  handleDismiss(): void;
63
78
  submit(): void;
64
79
  cancel(): void;
65
80
  edit(): void;
66
81
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableRoot, never>;
67
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableRoot, "[rdxEditableRoot]", ["rdxEditableRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; "isSignal": true; }; "submitMode": { "alias": "submitMode"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "startWithEditMode": { "alias": "startWithEditMode"; "required": false; "isSignal": true; }; "activationMode": { "alias": "activationMode"; "required": false; "isSignal": true; }; "autoResize": { "alias": "autoResize"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, [{ directive: typeof i1.RdxFocusOutside; inputs: {}; outputs: {}; }, { directive: typeof i1.RdxPointerDownOutside; inputs: {}; outputs: {}; }]>;
82
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableRoot, "[rdxEditableRoot]", ["rdxEditableRoot"], { "value": { "alias": "value"; "required": false; "isSignal": true; }; "defaultValue": { "alias": "defaultValue"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "selectOnFocus": { "alias": "selectOnFocus"; "required": false; "isSignal": true; }; "submitMode": { "alias": "submitMode"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "startWithEditMode": { "alias": "startWithEditMode"; "required": false; "isSignal": true; }; "activationMode": { "alias": "activationMode"; "required": false; "isSignal": true; }; "autoResize": { "alias": "autoResize"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "onValueChange": "onValueChange"; }, never, never, true, [{ directive: typeof i1.RdxFocusOutside; inputs: {}; outputs: {}; }, { directive: typeof i1.RdxPointerDownOutside; inputs: {}; outputs: {}; }]>;
68
83
  }
69
84
 
70
- export { RdxEditableRoot, injectEditableRootContext, provideEditableRootContext };
85
+ declare class RdxEditableArea {
86
+ protected readonly rootContext: _radix_ng_primitives_editable.EditableRootContext;
87
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableArea, never>;
88
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableArea, "[rdxEditableArea]", never, {}, {}, never, never, true, never>;
89
+ }
90
+
91
+ declare class RdxEditablePreview {
92
+ private readonly elementRef;
93
+ protected readonly rootContext: _radix_ng_primitives_editable.EditableRootContext;
94
+ readonly placeholder: _angular_core.Signal<string>;
95
+ constructor();
96
+ handleFocus(): void;
97
+ handleDoubleClick(): void;
98
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditablePreview, never>;
99
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditablePreview, "span[rdxEditablePreview]", ["rdxEditablePreview"], {}, {}, never, never, true, never>;
100
+ }
101
+
102
+ declare class RdxEditableInput {
103
+ private readonly inputRef;
104
+ protected readonly rootContext: _radix_ng_primitives_editable.EditableRootContext;
105
+ /** Accessible label for the input. Override to localize. */
106
+ readonly ariaLabel: _angular_core.InputSignal<string>;
107
+ readonly placeholder: _angular_core.Signal<string>;
108
+ readonly disabled: _angular_core.Signal<boolean>;
109
+ constructor();
110
+ handleInput(event: Event): void;
111
+ handleSubmitKeyDown(event: Event): void;
112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableInput, never>;
113
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableInput, "input[rdxEditableInput]", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
114
+ }
115
+
116
+ declare class RdxEditableEditTrigger {
117
+ protected readonly rootContext: _radix_ng_primitives_editable.EditableRootContext;
118
+ /** Accessible label for the trigger. Override to localize. */
119
+ readonly ariaLabel: _angular_core.InputSignal<string>;
120
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableEditTrigger, never>;
121
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableEditTrigger, "button[rdxEditableEditTrigger]", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
122
+ }
123
+
124
+ declare class RdxEditableSubmitTrigger {
125
+ protected readonly rootContext: _radix_ng_primitives_editable.EditableRootContext;
126
+ /** Accessible label for the trigger. Override to localize. */
127
+ readonly ariaLabel: _angular_core.InputSignal<string>;
128
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableSubmitTrigger, never>;
129
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableSubmitTrigger, "button[rdxEditableSubmitTrigger]", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
130
+ }
131
+
132
+ declare class RdxEditableCancelTrigger {
133
+ protected readonly rootContext: _radix_ng_primitives_editable.EditableRootContext;
134
+ /** Accessible label for the trigger. Override to localize. */
135
+ readonly ariaLabel: _angular_core.InputSignal<string>;
136
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableCancelTrigger, never>;
137
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxEditableCancelTrigger, "button[rdxEditableCancelTrigger]", never, { "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
138
+ }
139
+
140
+ declare class RdxEditableModule {
141
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxEditableModule, never>;
142
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxEditableModule, never, [typeof RdxEditableRoot, typeof RdxEditableArea, typeof RdxEditablePreview, typeof RdxEditableInput, typeof RdxEditableEditTrigger, typeof RdxEditableSubmitTrigger, typeof RdxEditableCancelTrigger], [typeof RdxEditableRoot, typeof RdxEditableArea, typeof RdxEditablePreview, typeof RdxEditableInput, typeof RdxEditableEditTrigger, typeof RdxEditableSubmitTrigger, typeof RdxEditableCancelTrigger]>;
143
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxEditableModule>;
144
+ }
145
+
146
+ export { RdxEditableArea, RdxEditableCancelTrigger, RdxEditableEditTrigger, RdxEditableInput, RdxEditableModule, RdxEditablePreview, RdxEditableRoot, RdxEditableSubmitTrigger, injectEditableRootContext, provideEditableRootContext };
147
+ export type { EditableActivationMode, EditableRootContext, EditableSubmitMode };
@@ -1,6 +1,7 @@
1
1
  import * as _radix_ng_primitives_field from '@radix-ng/primitives/field';
2
2
  import * as _angular_core from '@angular/core';
3
- import { BooleanInput } from '@radix-ng/primitives/core';
3
+ import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
4
+ import { BooleanInput, RdxValidationError } from '@radix-ng/primitives/core';
4
5
 
5
6
  /**
6
7
  * Connects a form control to the field label, description, error, and state.
@@ -10,8 +11,11 @@ import { BooleanInput } from '@radix-ng/primitives/core';
10
11
  declare class RdxFieldControl {
11
12
  protected readonly rootContext: {
12
13
  controlId: _angular_core.WritableSignal<string>;
14
+ name: _angular_core.InputSignal<string | undefined>;
13
15
  descriptionIds: _angular_core.WritableSignal<string[]>;
14
16
  errorIds: _angular_core.WritableSignal<string[]>;
17
+ messages: _angular_core.Signal<string[]>;
18
+ notifyEdited: () => void;
15
19
  invalidState: _angular_core.Signal<boolean>;
16
20
  disabledState: _angular_core.Signal<boolean>;
17
21
  requiredState: _angular_core.Signal<boolean>;
@@ -59,8 +63,11 @@ declare class RdxFieldControl {
59
63
  declare class RdxFieldDescription {
60
64
  protected readonly rootContext: {
61
65
  controlId: _angular_core.WritableSignal<string>;
66
+ name: _angular_core.InputSignal<string | undefined>;
62
67
  descriptionIds: _angular_core.WritableSignal<string[]>;
63
68
  errorIds: _angular_core.WritableSignal<string[]>;
69
+ messages: _angular_core.Signal<string[]>;
70
+ notifyEdited: () => void;
64
71
  invalidState: _angular_core.Signal<boolean>;
65
72
  disabledState: _angular_core.Signal<boolean>;
66
73
  requiredState: _angular_core.Signal<boolean>;
@@ -100,8 +107,11 @@ declare class RdxFieldDescription {
100
107
  declare class RdxFieldError {
101
108
  protected readonly rootContext: {
102
109
  controlId: _angular_core.WritableSignal<string>;
110
+ name: _angular_core.InputSignal<string | undefined>;
103
111
  descriptionIds: _angular_core.WritableSignal<string[]>;
104
112
  errorIds: _angular_core.WritableSignal<string[]>;
113
+ messages: _angular_core.Signal<string[]>;
114
+ notifyEdited: () => void;
105
115
  invalidState: _angular_core.Signal<boolean>;
106
116
  disabledState: _angular_core.Signal<boolean>;
107
117
  requiredState: _angular_core.Signal<boolean>;
@@ -127,6 +137,12 @@ declare class RdxFieldError {
127
137
  * @group Props
128
138
  */
129
139
  readonly id: _angular_core.InputSignal<string>;
140
+ /**
141
+ * The field's external messages (state provider's, then enclosing Form's), `[]` when none. Render
142
+ * them explicitly via the `exportAs` reference — the directive never injects text content itself:
143
+ * `<p rdxFieldError #err="rdxFieldError">{{ err.messages().join(' ') }}</p>`.
144
+ */
145
+ readonly messages: _angular_core.Signal<string[]>;
130
146
  constructor();
131
147
  protected readonly dataAttr: (value: boolean) => "" | undefined;
132
148
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxFieldError, never>;
@@ -141,8 +157,11 @@ declare class RdxFieldError {
141
157
  declare class RdxFieldLabel {
142
158
  protected readonly rootContext: {
143
159
  controlId: _angular_core.WritableSignal<string>;
160
+ name: _angular_core.InputSignal<string | undefined>;
144
161
  descriptionIds: _angular_core.WritableSignal<string[]>;
145
162
  errorIds: _angular_core.WritableSignal<string[]>;
163
+ messages: _angular_core.Signal<string[]>;
164
+ notifyEdited: () => void;
146
165
  invalidState: _angular_core.Signal<boolean>;
147
166
  disabledState: _angular_core.Signal<boolean>;
148
167
  requiredState: _angular_core.Signal<boolean>;
@@ -194,11 +213,23 @@ interface RdxFieldState {
194
213
  touched?: () => boolean;
195
214
  filled?: () => boolean;
196
215
  focused?: () => boolean;
216
+ /**
217
+ * Optional source of error *content* (not just the invalid boolean). When provided and non-empty
218
+ * it forces `invalidState` true, and its messages (`message ?? kind` per error) surface through
219
+ * `RdxFieldError.messages()` ahead of any enclosing Form's external messages. Uses `core`'s
220
+ * framework-free shim type so the seam stays free of `@angular/forms/signals` (ADR 0004 amendment).
221
+ */
222
+ errors?: () => RdxValidationError[];
197
223
  }
198
224
  declare const fieldRootContext: () => {
199
225
  controlId: _angular_core.WritableSignal<string>;
226
+ name: _angular_core.InputSignal<string | undefined>;
200
227
  descriptionIds: _angular_core.WritableSignal<string[]>;
201
228
  errorIds: _angular_core.WritableSignal<string[]>;
229
+ /** Combined external messages (state provider's, then enclosing Form's), for `RdxFieldError`. */
230
+ messages: _angular_core.Signal<string[]>;
231
+ /** Notify an enclosing Form that this field's control was edited (composite-control opt-in). */
232
+ notifyEdited: () => void;
202
233
  invalidState: _angular_core.Signal<boolean>;
203
234
  disabledState: _angular_core.Signal<boolean>;
204
235
  requiredState: _angular_core.Signal<boolean>;
@@ -225,10 +256,15 @@ declare const fieldRootContext: () => {
225
256
  hasStateProvider: _angular_core.Signal<boolean>;
226
257
  };
227
258
  type RdxFieldRootContext = ReturnType<typeof fieldRootContext>;
228
- declare const injectFieldRootContext: (optional?: boolean) => {
259
+ declare const injectFieldRootContext: _radix_ng_primitives_core.InjectContext<{
229
260
  controlId: _angular_core.WritableSignal<string>;
261
+ name: _angular_core.InputSignal<string | undefined>;
230
262
  descriptionIds: _angular_core.WritableSignal<string[]>;
231
263
  errorIds: _angular_core.WritableSignal<string[]>;
264
+ /** Combined external messages (state provider's, then enclosing Form's), for `RdxFieldError`. */
265
+ messages: _angular_core.Signal<string[]>;
266
+ /** Notify an enclosing Form that this field's control was edited (composite-control opt-in). */
267
+ notifyEdited: () => void;
232
268
  invalidState: _angular_core.Signal<boolean>;
233
269
  disabledState: _angular_core.Signal<boolean>;
234
270
  requiredState: _angular_core.Signal<boolean>;
@@ -253,11 +289,16 @@ declare const injectFieldRootContext: (optional?: boolean) => {
253
289
  */
254
290
  setStateProvider: (provider: RdxFieldState | null) => RdxFieldState | null;
255
291
  hasStateProvider: _angular_core.Signal<boolean>;
256
- } | null;
292
+ }>;
257
293
  declare const provideFieldRootContext: (useFactory: () => {
258
294
  controlId: _angular_core.WritableSignal<string>;
295
+ name: _angular_core.InputSignal<string | undefined>;
259
296
  descriptionIds: _angular_core.WritableSignal<string[]>;
260
297
  errorIds: _angular_core.WritableSignal<string[]>;
298
+ /** Combined external messages (state provider's, then enclosing Form's), for `RdxFieldError`. */
299
+ messages: _angular_core.Signal<string[]>;
300
+ /** Notify an enclosing Form that this field's control was edited (composite-control opt-in). */
301
+ notifyEdited: () => void;
261
302
  invalidState: _angular_core.Signal<boolean>;
262
303
  disabledState: _angular_core.Signal<boolean>;
263
304
  requiredState: _angular_core.Signal<boolean>;
@@ -336,6 +377,15 @@ declare class RdxFieldRoot {
336
377
  * @group Props
337
378
  */
338
379
  readonly focused: _angular_core.InputSignal<boolean | undefined>;
380
+ /**
381
+ * Identifies the field to an enclosing Form for external (server) error matching. Fields without a
382
+ * `name` never match external errors.
383
+ *
384
+ * @group Props
385
+ */
386
+ readonly name: _angular_core.InputSignal<string | undefined>;
387
+ /** The enclosing Form, if any. All Form-related behavior is a no-op when this is `null`. */
388
+ private readonly formContext;
339
389
  readonly controlId: _angular_core.WritableSignal<string>;
340
390
  readonly descriptionIds: _angular_core.WritableSignal<string[]>;
341
391
  readonly errorIds: _angular_core.WritableSignal<string[]>;
@@ -347,6 +397,12 @@ declare class RdxFieldRoot {
347
397
  private readonly stateProvider;
348
398
  /** Whether an external adapter currently owns field state. */
349
399
  readonly hasStateProvider: _angular_core.Signal<boolean>;
400
+ /** Error content from a registered state provider (e.g. a Signal Forms adapter). */
401
+ private readonly providerErrors;
402
+ /** External messages from the enclosing Form matched by this field's `name`. */
403
+ readonly externalErrors: _angular_core.Signal<string[]>;
404
+ /** Provider messages first (`message ?? kind`), then the Form's external messages. */
405
+ readonly messages: _angular_core.Signal<string[]>;
350
406
  readonly invalidState: _angular_core.Signal<boolean>;
351
407
  readonly disabledState: _angular_core.Signal<boolean>;
352
408
  readonly requiredState: _angular_core.Signal<boolean>;
@@ -355,6 +411,20 @@ declare class RdxFieldRoot {
355
411
  readonly filledState: _angular_core.Signal<boolean>;
356
412
  readonly focusedState: _angular_core.Signal<boolean>;
357
413
  protected readonly dataAttr: (value: boolean) => "" | undefined;
414
+ constructor();
415
+ /** Notify the enclosing Form (if any) that this field's control was edited (clear-on-edit). */
416
+ notifyEdited(): void;
417
+ /** Reset interaction state on native form reset: touched/dirty/focused → false, filled re-synced. */
418
+ resetState(): void;
419
+ /** Focus the field's control (used by the Form's first-invalid-focus on blocked submit). */
420
+ private focusControl;
421
+ private readonly host;
422
+ /**
423
+ * The field's control element, found by `controlId` but scoped to this field's own subtree — a
424
+ * duplicate or consumer-reused id elsewhere on the page can't steal focus/reset. The control
425
+ * registers its id through `setControlId`, so this matches the same element the labels point at.
426
+ */
427
+ private controlElement;
358
428
  /**
359
429
  * Register an external owner of field state, returning the previous one.
360
430
  * @ignore
@@ -366,7 +436,7 @@ declare class RdxFieldRoot {
366
436
  */
367
437
  private resolve;
368
438
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxFieldRoot, never>;
369
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxFieldRoot, "[rdxFieldRoot]", ["rdxFieldRoot"], { "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "filled": { "alias": "filled"; "required": false; "isSignal": true; }; "focused": { "alias": "focused"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
439
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxFieldRoot, "[rdxFieldRoot]", ["rdxFieldRoot"], { "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "dirty": { "alias": "dirty"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "filled": { "alias": "filled"; "required": false; "isSignal": true; }; "focused": { "alias": "focused"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
370
440
  }
371
441
 
372
442
  export { RdxFieldControl, RdxFieldDescription, RdxFieldError, RdxFieldLabel, RdxFieldRoot, injectFieldRootContext, provideFieldRootContext };
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
2
3
  import { BooleanInput } from '@radix-ng/primitives/core';
3
4
 
4
5
  /**
@@ -19,9 +20,9 @@ declare const fieldsetRootContext: () => {
19
20
  disabledState: _angular_core.Signal<boolean>;
20
21
  };
21
22
  type RdxFieldsetRootContext = ReturnType<typeof fieldsetRootContext>;
22
- declare const injectFieldsetRootContext: (optional?: boolean) => {
23
+ declare const injectFieldsetRootContext: _radix_ng_primitives_core.InjectContext<{
23
24
  disabledState: _angular_core.Signal<boolean>;
24
- } | null;
25
+ }>;
25
26
  declare const provideFieldsetRootContext: (useFactory: () => {
26
27
  disabledState: _angular_core.Signal<boolean>;
27
28
  }) => _angular_core.Provider;
@@ -1,5 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { WritableSignal, Signal, InjectionToken, Provider } from '@angular/core';
3
+ import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
3
4
  import { BooleanInput } from '@radix-ng/primitives/core';
4
5
 
5
6
  interface FocusScopeAPI {
@@ -12,7 +13,7 @@ interface FocusScopeContext {
12
13
  loop?: Signal<boolean>;
13
14
  trapped?: Signal<boolean>;
14
15
  }
15
- declare const injectFocusScopeContext: (optional?: boolean) => FocusScopeContext | null;
16
+ declare const injectFocusScopeContext: _radix_ng_primitives_core.InjectContext<FocusScopeContext>;
16
17
  declare const provideFocusScopeContext: (useFactory: () => FocusScopeContext) => _angular_core.Provider;
17
18
  /**
18
19
  * @group Components
@@ -0,0 +1,124 @@
1
+ import * as _radix_ng_primitives_core from '@radix-ng/primitives/core';
2
+ import * as _angular_core from '@angular/core';
3
+
4
+ /** A normalized external-error map: each field name maps to its message(s) in display order. */
5
+ type RdxFormErrors = Record<string, string | string[]>;
6
+ /** Payload of {@link RdxFormRoot.onFormSubmit}. */
7
+ interface RdxFormSubmitEvent {
8
+ /** The form's values serialized from `FormData` (repeated names collapse into arrays). */
9
+ values: Record<string, FormDataEntryValue | FormDataEntryValue[]>;
10
+ /** The original native submit event (already `preventDefault`-ed). */
11
+ event: SubmitEvent;
12
+ }
13
+ /**
14
+ * What a {@link RdxFieldRoot} registers with an enclosing Form. Structural `() =>` accessors keep the
15
+ * Form entry free of any import from `field` (acyclic ng-packagr graph: `field` → `form`).
16
+ */
17
+ interface RdxFormFieldRegistration {
18
+ /** The field's `name` (key external errors match against), or `undefined`. */
19
+ name: () => string | undefined;
20
+ /** The field's merged invalid state (includes external errors). */
21
+ invalid: () => boolean;
22
+ /** Whether the field is dirty. */
23
+ dirty: () => boolean;
24
+ /** Whether the field is touched. */
25
+ touched: () => boolean;
26
+ /** Focus the field's control (by its `controlId`). */
27
+ focus: () => void;
28
+ /** Reset the field's interaction state (touched/dirty/focused → false, filled re-sync). */
29
+ resetState: () => void;
30
+ }
31
+ /**
32
+ * External owner of form-level state (e.g. a future Signal Forms `[rdxSignalForm]` adapter). Mirrors
33
+ * Field's `RdxFieldState` seam one level up. Each member is optional: a provided accessor wins over the
34
+ * built-in registry/`errors`-input behavior; absent accessors leave the built-in behavior untouched.
35
+ * Kept as framework-free `() =>` accessors (no `@angular/forms/signals` dependency). See ADR 0004.
36
+ */
37
+ interface RdxFormState {
38
+ invalid?: () => boolean;
39
+ dirty?: () => boolean;
40
+ touched?: () => boolean;
41
+ submitting?: () => boolean;
42
+ /** Per-name external error source; while provided, the `errors` input + clear-on-edit are inert. */
43
+ errorsFor?: (name: string) => string[];
44
+ }
45
+ declare const formRootContext: () => {
46
+ errorsFor: (name: string | undefined) => string[];
47
+ notifyEdited: (name: string | undefined) => void;
48
+ register: (field: RdxFormFieldRegistration) => () => void;
49
+ setStateProvider: (provider: RdxFormState | null) => RdxFormState | null;
50
+ hasStateProvider: _angular_core.Signal<boolean>;
51
+ };
52
+ type RdxFormRootContext = ReturnType<typeof formRootContext>;
53
+ declare const injectFormRootContext: _radix_ng_primitives_core.InjectContext<{
54
+ errorsFor: (name: string | undefined) => string[];
55
+ notifyEdited: (name: string | undefined) => void;
56
+ register: (field: RdxFormFieldRegistration) => () => void;
57
+ setStateProvider: (provider: RdxFormState | null) => RdxFormState | null;
58
+ hasStateProvider: _angular_core.Signal<boolean>;
59
+ }>;
60
+ declare const provideFormRootContext: (useFactory: () => {
61
+ errorsFor: (name: string | undefined) => string[];
62
+ notifyEdited: (name: string | undefined) => void;
63
+ register: (field: RdxFormFieldRegistration) => () => void;
64
+ setStateProvider: (provider: RdxFormState | null) => RdxFormState | null;
65
+ hasStateProvider: _angular_core.Signal<boolean>;
66
+ }) => _angular_core.Provider;
67
+ /**
68
+ * The top of the forms layer cake: a single directive on the native `<form>` element that aggregates
69
+ * field state, maps external (server) errors onto fields by `name`, intercepts submit (values-as-object,
70
+ * focus the first invalid field), and resets field interaction state on native `reset`. It owns no
71
+ * values and runs no validation — Angular form systems (or Field inputs) remain the source of validity.
72
+ *
73
+ * @group Components
74
+ */
75
+ declare class RdxFormRoot {
76
+ private readonly form;
77
+ /** External/server validation errors keyed by `Field.Root` `name`. */
78
+ readonly errors: _angular_core.InputSignal<RdxFormErrors | null | undefined>;
79
+ /** Emits the remaining error map after a field's external error is cleared by a user edit (or reset). */
80
+ readonly onClearErrors: _angular_core.OutputEmitterRef<RdxFormErrors>;
81
+ /** Emits the serialized form values when a valid form is submitted. */
82
+ readonly onFormSubmit: _angular_core.OutputEmitterRef<RdxFormSubmitEvent>;
83
+ private readonly fields;
84
+ private readonly stateProvider;
85
+ /** Whether an external adapter currently owns form-level state. */
86
+ readonly hasStateProvider: _angular_core.Signal<boolean>;
87
+ /**
88
+ * Names whose external error has been cleared by a user edit. Reset to empty whenever a new `errors`
89
+ * object reference is assigned — the server just spoke, so everything it said is live again.
90
+ */
91
+ private readonly clearedNames;
92
+ /** The `errors` input minus cleared names, normalized to `string[]`. */
93
+ private readonly effectiveErrors;
94
+ readonly anyInvalid: _angular_core.Signal<boolean>;
95
+ readonly anyDirty: _angular_core.Signal<boolean>;
96
+ readonly anyTouched: _angular_core.Signal<boolean>;
97
+ readonly submitting: _angular_core.Signal<boolean>;
98
+ /** Resolve a boolean aggregate: a registered provider's accessor wins, else OR over the registry. */
99
+ private aggregate;
100
+ /** Resolves the external messages for a field name (provider source wins over the `errors` input). */
101
+ errorsFor(name: string | undefined): string[];
102
+ /** Clears a field's external error after a user edit, emitting the remaining map. */
103
+ notifyEdited(name: string | undefined): void;
104
+ register(field: RdxFormFieldRegistration): () => void;
105
+ /** Register (or clear with `null`) an external owner of form-level state; returns the previous one. */
106
+ setStateProvider(provider: RdxFormState | null): RdxFormState | null;
107
+ onSubmit(event: SubmitEvent): void;
108
+ onReset(): void;
109
+ private readonly resetTimers;
110
+ constructor();
111
+ private remainingErrors;
112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxFormRoot, never>;
113
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<RdxFormRoot, "form[rdxFormRoot]", ["rdxFormRoot"], { "errors": { "alias": "errors"; "required": false; "isSignal": true; }; }, { "onClearErrors": "onClearErrors"; "onFormSubmit": "onFormSubmit"; }, never, never, true, never>;
114
+ }
115
+
116
+ declare const _importsForm: (typeof RdxFormRoot)[];
117
+ declare class RdxFormModule {
118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RdxFormModule, never>;
119
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<RdxFormModule, never, [typeof RdxFormRoot], [typeof RdxFormRoot]>;
120
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<RdxFormModule>;
121
+ }
122
+
123
+ export { RdxFormModule, RdxFormRoot, _importsForm, injectFormRootContext, provideFormRootContext };
124
+ export type { RdxFormErrors, RdxFormFieldRegistration, RdxFormRootContext, RdxFormState, RdxFormSubmitEvent };