@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.
- package/fesm2022/radix-ng-primitives-accordion.mjs +2 -2
- package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-calendar.mjs +109 -84
- package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-checkbox.mjs +2 -2
- package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-collapsible.mjs +1 -1
- package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-combobox.mjs +1923 -0
- package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-context-menu.mjs +1 -1
- package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-core.mjs +591 -470
- package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-cropper.mjs +287 -308
- package/fesm2022/radix-ng-primitives-cropper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-date-field.mjs +66 -15
- package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-dialog.mjs +1 -1
- package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-drawer.mjs +7 -106
- package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-editable.mjs +305 -24
- package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-field.mjs +86 -6
- package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-fieldset.mjs +1 -1
- package/fesm2022/radix-ng-primitives-fieldset.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-focus-scope.mjs +1 -1
- package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-form.mjs +207 -0
- package/fesm2022/radix-ng-primitives-form.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-input.mjs +85 -4
- package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menu.mjs +413 -5
- package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs +1 -1
- package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-meter.mjs +1 -1
- package/fesm2022/radix-ng-primitives-meter.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs +1 -1
- package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-number-field.mjs +2 -2
- package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popover.mjs +1 -1
- package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-popper.mjs +22 -5
- package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-preview-card.mjs +1 -1
- package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-progress.mjs +1 -1
- package/fesm2022/radix-ng-primitives-progress.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs +1 -1
- package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-scroll-area.mjs +923 -0
- package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-select.mjs +421 -224
- package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs +1 -1
- package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-switch.mjs +3 -2
- package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tabs.mjs +12 -3
- package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-time-field.mjs +27 -3
- package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toast.mjs +839 -0
- package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -0
- package/fesm2022/radix-ng-primitives-toggle-group.mjs +1 -1
- package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-toolbar.mjs +2 -2
- package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
- package/fesm2022/radix-ng-primitives-tooltip.mjs +11 -3
- package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
- package/package.json +18 -2
- package/schematics/ng-add/index.js +57 -0
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/schema.d.ts +1 -0
- package/schematics/ng-add/schema.json +6 -0
- package/types/radix-ng-primitives-accordion.d.ts +3 -2
- package/types/radix-ng-primitives-calendar.d.ts +38 -18
- package/types/radix-ng-primitives-checkbox.d.ts +5 -5
- package/types/radix-ng-primitives-collapsible.d.ts +2 -1
- package/types/radix-ng-primitives-combobox.d.ts +1265 -0
- package/types/radix-ng-primitives-context-menu.d.ts +3 -2
- package/types/radix-ng-primitives-core.d.ts +187 -56
- package/types/radix-ng-primitives-cropper.d.ts +89 -56
- package/types/radix-ng-primitives-date-field.d.ts +11 -5
- package/types/radix-ng-primitives-dialog.d.ts +2 -1
- package/types/radix-ng-primitives-drawer.d.ts +5 -27
- package/types/radix-ng-primitives-editable.d.ts +90 -13
- package/types/radix-ng-primitives-field.d.ts +74 -4
- package/types/radix-ng-primitives-fieldset.d.ts +3 -2
- package/types/radix-ng-primitives-focus-scope.d.ts +2 -1
- package/types/radix-ng-primitives-form.d.ts +124 -0
- package/types/radix-ng-primitives-input.d.ts +75 -5
- package/types/radix-ng-primitives-menu.d.ts +16 -4
- package/types/radix-ng-primitives-menubar.d.ts +2 -1
- package/types/radix-ng-primitives-meter.d.ts +3 -2
- package/types/radix-ng-primitives-navigation-menu.d.ts +1 -1
- package/types/radix-ng-primitives-number-field.d.ts +6 -6
- package/types/radix-ng-primitives-popover.d.ts +2 -1
- package/types/radix-ng-primitives-popper.d.ts +19 -2
- package/types/radix-ng-primitives-preview-card.d.ts +1 -1
- package/types/radix-ng-primitives-progress.d.ts +3 -2
- package/types/radix-ng-primitives-roving-focus.d.ts +4 -3
- package/types/radix-ng-primitives-scroll-area.d.ts +253 -0
- package/types/radix-ng-primitives-select.d.ts +296 -136
- package/types/radix-ng-primitives-slider.d.ts +1 -1
- package/types/radix-ng-primitives-switch.d.ts +1 -1
- package/types/radix-ng-primitives-tabs.d.ts +1 -1
- package/types/radix-ng-primitives-toast.d.ts +378 -0
- package/types/radix-ng-primitives-toggle-group.d.ts +2 -1
- package/types/radix-ng-primitives-toolbar.d.ts +3 -2
- 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:
|
|
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
|
|
448
|
-
export type { RdxDrawerRegistration, RdxDrawerRelease, RdxDrawerRootContext, RdxDrawerSnapEntry, RdxDrawerSnapPoint, RdxDrawerSnapResolveOptions, RdxDrawerSnapTarget, RdxDrawerSwipeConfig, RdxDrawerSwipeDirection
|
|
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
|
|
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 |
|
|
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<
|
|
17
|
-
activationMode: Signal<
|
|
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:
|
|
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
|
|
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<
|
|
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<
|
|
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<
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
-
}
|
|
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:
|
|
23
|
+
declare const injectFieldsetRootContext: _radix_ng_primitives_core.InjectContext<{
|
|
23
24
|
disabledState: _angular_core.Signal<boolean>;
|
|
24
|
-
}
|
|
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:
|
|
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 };
|