@vectoriox/iox-ui 4.26.0 → 4.28.0

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.
@@ -0,0 +1,206 @@
1
+ /** What the visitor actually types into. Chosen by a trait; it also implies a validation rule. */
2
+ declare enum ControlType {
3
+ Text = "text",
4
+ Email = "email",
5
+ Tel = "tel",
6
+ Url = "url",
7
+ Number = "number",
8
+ Password = "password",
9
+ Textarea = "textarea",
10
+ Select = "select",
11
+ Checkbox = "checkbox",
12
+ Radio = "radio",
13
+ Date = "date",
14
+ Time = "time",
15
+ File = "file",
16
+ /** Not shown; carries a constant or a bound value (campaign, source page, …). */
17
+ Hidden = "hidden"
18
+ }
19
+ /** The v1 rule grammar. Phase 3's conditional logic reuses these same names for its conditions. */
20
+ declare enum RuleName {
21
+ Required = "required",
22
+ MinLength = "minLength",
23
+ MaxLength = "maxLength",
24
+ Min = "min",
25
+ Max = "max",
26
+ Pattern = "pattern",
27
+ /** Cross-field: this value must equal another field's (confirm email / password). */
28
+ Matches = "matches",
29
+ /** A checkbox that must be ticked — terms, consent. */
30
+ Accepted = "accepted",
31
+ FileType = "fileType",
32
+ FileSize = "fileSize"
33
+ }
34
+ /** Named regexes so an author picks "Email" rather than writing one. */
35
+ declare enum PatternPreset {
36
+ Email = "email",
37
+ Phone = "phone",
38
+ Url = "url",
39
+ Digits = "digits",
40
+ Letters = "letters",
41
+ Slug = "slug"
42
+ }
43
+ /**
44
+ * Deliberately permissive. A validator that rejects `user+tag@sub.domain.co.uk` or a real-world
45
+ * phone number is worse than one that lets a typo through: the address gets verified by sending to
46
+ * it, and a false rejection is a lost lead with no recourse.
47
+ */
48
+ declare const PATTERN_PRESETS: Readonly<Record<PatternPreset, RegExp>>;
49
+ interface ValidationRule {
50
+ name: RuleName;
51
+ /** `{ n }` for lengths/bounds · `{ preset } | { regex }` for pattern · `{ field }` for matches. */
52
+ params?: Record<string, any>;
53
+ /** Author's override. Absent → the shared message catalog supplies a translated key. */
54
+ message?: string;
55
+ }
56
+ interface FieldOption {
57
+ label: string;
58
+ value: string;
59
+ }
60
+ /** Options pulled from a data source instead of typed by hand (a Select of CMS categories). */
61
+ interface FieldOptionSource {
62
+ source: string;
63
+ sourcePath?: string;
64
+ valuePath: string;
65
+ labelPath: string;
66
+ }
67
+ interface FieldSpec {
68
+ /** The submitted key. Derived from the label, unique within the form, editable. */
69
+ name: string;
70
+ control: ControlType;
71
+ label: string;
72
+ /** Surfaced as its own switch in the panel rather than buried in the rule list. */
73
+ required?: boolean;
74
+ rules?: ValidationRule[];
75
+ options?: FieldOption[];
76
+ optionsSource?: FieldOptionSource;
77
+ defaultValue?: any;
78
+ }
79
+ /** When a field is validated, once the author has stopped deciding it per field. */
80
+ declare enum FeedbackTiming {
81
+ /** Validate on submit, then live per-field once that field has been touched or has failed. */
82
+ Smart = "smart",
83
+ Submit = "submit",
84
+ Live = "live"
85
+ }
86
+ /** What happens to a submission, in order. Card #1 (`store`) is always present. */
87
+ interface SubmitAction {
88
+ type: string;
89
+ config?: Record<string, any>;
90
+ /** `retry` (default) · `fail` · `ignore`. */
91
+ onFailure?: 'retry' | 'fail' | 'ignore';
92
+ }
93
+ interface FormSpec {
94
+ formId: string;
95
+ /** Author-facing name — the submissions inbox groups by it. */
96
+ name: string;
97
+ feedback: FeedbackTiming;
98
+ fields: FieldSpec[];
99
+ actions: SubmitAction[];
100
+ antiSpam: {
101
+ honeypot: boolean;
102
+ minFillMs: number;
103
+ turnstile?: boolean;
104
+ };
105
+ retention?: {
106
+ days: number;
107
+ };
108
+ }
109
+ /**
110
+ * The rule a control type implies with no configuration. Choosing "Email" IS choosing email
111
+ * validation — the single biggest reason the panel can stay empty and still validate well.
112
+ */
113
+ declare const IMPLIED_PATTERN: Readonly<Partial<Record<ControlType, PatternPreset>>>;
114
+ /** Controls whose value is a list rather than a scalar. */
115
+ declare const MULTI_VALUE_CONTROLS: ReadonlySet<ControlType>;
116
+
117
+ /** Namespace for every forms validation key. Keep in sync with `en.json` / `he.json`. */
118
+ declare const MESSAGE_NAMESPACE = "forms.validation";
119
+ /**
120
+ * Rule → i18n key. Params travel beside the key (`{ n: 8 }`, `{ field: 'Email' }`) so a translation
121
+ * can place the number wherever its grammar needs it, rather than having it baked into the string.
122
+ */
123
+ declare const RULE_MESSAGE_KEYS: Readonly<Record<RuleName, string>>;
124
+ /**
125
+ * A pattern failure deserves better than "Invalid format". Each preset gets its own key so the
126
+ * message can say what a valid value looks like, which is the difference between a visitor fixing
127
+ * a typo and a visitor giving up.
128
+ */
129
+ declare const PATTERN_MESSAGE_KEYS: Readonly<Record<string, string>>;
130
+ /** Form-level outcomes the visitor sees in the Error state. One designed block, five reasons. */
131
+ declare const FORM_ERROR_KEYS: Readonly<{
132
+ Network: "forms.validation.form.network";
133
+ Rejected: "forms.validation.form.rejected";
134
+ Spam: "forms.validation.form.spam";
135
+ RateLimited: "forms.validation.form.rateLimited";
136
+ Server: "forms.validation.form.server";
137
+ }>;
138
+ /** The English defaults, so a consumer that has not added the keys yet still shows real text. */
139
+ declare const DEFAULT_EN_MESSAGES: Readonly<Record<string, string>>;
140
+
141
+ interface FieldError {
142
+ /** i18n key, or the author's own override string when they set one. */
143
+ messageKey: string;
144
+ /** Interpolation values (`{ n: 8 }`, `{ field: 'Email' }`). */
145
+ params?: Record<string, any>;
146
+ }
147
+ interface FieldResult extends Partial<FieldError> {
148
+ valid: boolean;
149
+ }
150
+ interface FormResult {
151
+ valid: boolean;
152
+ /** Keyed by field name. Empty when valid. */
153
+ errors: Record<string, FieldError>;
154
+ }
155
+ /**
156
+ * Validate one field's value.
157
+ *
158
+ * Order is deliberate and is part of the contract:
159
+ * 1. `required` (or `accepted` for a checkbox) — the only rules an EMPTY value can fail.
160
+ * 2. Everything else, in the order the author arranged them, but ONLY for a non-empty value.
161
+ *
162
+ * That second point is what stops an optional "Phone" field from shouting "enter a valid phone
163
+ * number" at someone who simply left it blank — the single most common validation-UX bug.
164
+ * The FIRST failure wins: a visitor fixes one thing at a time.
165
+ */
166
+ declare function validateField(value: unknown, spec: FieldSpec, form?: Record<string, unknown>): FieldResult;
167
+ /**
168
+ * Validate a whole submission. Every field is checked (not short-circuited at the first bad one) so
169
+ * the visitor sees every problem at once instead of fixing them one reload at a time.
170
+ */
171
+ declare function validateForm(values: Record<string, unknown>, spec: FormSpec): FormResult;
172
+ /** The name of the first field with an error, in spec order — what the browser should focus. */
173
+ declare function firstInvalidField(spec: FormSpec, errors: Record<string, FieldError>): string | null;
174
+
175
+ /** The minimum a node must look like. Structural on purpose: this file knows no renderer. */
176
+ interface FormNodeLike {
177
+ type: string;
178
+ props?: Record<string, any>;
179
+ children?: FormNodeLike[];
180
+ }
181
+ declare const FORM_NODE_TYPE = "Form";
182
+ declare const FIELD_NODE_TYPE = "Field";
183
+ /** Always present, never removable — the safety net that makes "store first, deliver after" true. */
184
+ declare const STORE_ACTION: SubmitAction;
185
+ /**
186
+ * Turn a label into the key that arrives in the submitted data — `Full name` → `fullName`.
187
+ * Authors never have to invent keys (decision: auto-derive, with an editable override).
188
+ *
189
+ * Diacritics are stripped rather than dropped, so a Hebrew or accented label still yields a usable
190
+ * ASCII key instead of an empty one; a label with no usable characters falls back to `field`.
191
+ */
192
+ declare function deriveFieldName(label: string): string;
193
+ /** Make `name` unique within `taken`, appending 2, 3, … — two "Email" fields must not collide. */
194
+ declare function uniqueFieldName(name: string, taken: ReadonlySet<string>): string;
195
+ /**
196
+ * Walk a Form subtree and produce its spec.
197
+ *
198
+ * Nested forms are not collected: a Field belongs to its NEAREST ancestor Form (decision D1), so the
199
+ * walk stops at any inner Form node rather than stealing its fields.
200
+ */
201
+ declare function collectFormSpec(node: FormNodeLike | null | undefined): FormSpec | null;
202
+ /** Every Field in this subtree, in document order, not descending into a nested Form. */
203
+ declare function collectFieldNodes(nodes: readonly FormNodeLike[]): FormNodeLike[];
204
+
205
+ export { ControlType, DEFAULT_EN_MESSAGES, FIELD_NODE_TYPE, FORM_ERROR_KEYS, FORM_NODE_TYPE, FeedbackTiming, IMPLIED_PATTERN, MESSAGE_NAMESPACE, MULTI_VALUE_CONTROLS, PATTERN_MESSAGE_KEYS, PATTERN_PRESETS, PatternPreset, RULE_MESSAGE_KEYS, RuleName, STORE_ACTION, collectFieldNodes, collectFormSpec, deriveFieldName, firstInvalidField, uniqueFieldName, validateField, validateForm };
206
+ export type { FieldError, FieldOption, FieldOptionSource, FieldResult, FieldSpec, FormNodeLike, FormResult, FormSpec, SubmitAction, ValidationRule };
@@ -0,0 +1,3 @@
1
+ {
2
+ "module": "../fesm2022/vectoriox-iox-ui-forms-core.mjs"
3
+ }
package/index.d.ts CHANGED
@@ -875,9 +875,185 @@ declare class ClientGalleryComponent implements AfterViewInit, OnDestroy {
875
875
  static ɵcmp: i0.ɵɵComponentDeclaration<ClientGalleryComponent, "iox-gallery", never, { "nodeId": { "alias": "nodeId"; "required": false; }; "effect": { "alias": "effect"; "required": false; }; "autoStart": { "alias": "autoStart"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "images": { "alias": "images"; "required": false; }; "showDuration": { "alias": "showDuration"; "required": false; }; "fadeDuration": { "alias": "fadeDuration"; "required": false; }; }, {}, never, never, false, never>;
876
876
  }
877
877
 
878
+ /** Which of the form's four states the canvas / runtime is showing. */
879
+ declare enum FormRenderState {
880
+ Idle = "idle",
881
+ Submitting = "submitting",
882
+ Success = "success",
883
+ Error = "error"
884
+ }
885
+ /**
886
+ * Directive-host Form: the real `<form>` IS the host — no wrapper, no inner/outer split. Children
887
+ * (fields, layout, the submit button, and the two state blocks) render into it via `childrenHost`.
888
+ *
889
+ * Scope is ANCESTRY, not naming (decision D1): a Field belongs to its nearest ancestor Form, so
890
+ * there is no form-id to pick and nothing to mis-wire. The runtime finds its fields by walking the
891
+ * DOM it owns.
892
+ *
893
+ * `renderState` drives which children are visible. In the builder it is set by the canvas state
894
+ * switcher so an author can DESIGN the success and error blocks; at runtime the same input is
895
+ * driven by the submit lifecycle. One mechanism, two drivers — the author designs exactly what a
896
+ * visitor will see.
897
+ *
898
+ * ⚠️ `novalidate` is deliberate: the browser's native bubbles would pre-empt our own messages,
899
+ * which are styleable, translated and announced. Validation still runs — ours does it.
900
+ */
901
+ declare class IoxFormComponent {
902
+ nodeId: string;
903
+ /** Stable id the submit endpoint resolves the saved spec by. */
904
+ formId: string;
905
+ /** Author-facing name — what the submissions inbox groups by. */
906
+ name: string;
907
+ renderState: FormRenderState | string;
908
+ /**
909
+ * Emitted instead of navigating. The host (builder canvas or engine runtime) owns the transport;
910
+ * this component owns only the DOM contract, so the same component works in both renderers.
911
+ */
912
+ formSubmit: EventEmitter<Event>;
913
+ childrenHost: ViewContainerRef;
914
+ onSubmit(event: Event): void;
915
+ static ɵfac: i0.ɵɵFactoryDeclaration<IoxFormComponent, never>;
916
+ static ɵcmp: i0.ɵɵComponentDeclaration<IoxFormComponent, "form[iox-form]", never, { "nodeId": { "alias": "nodeId"; "required": false; }; "formId": { "alias": "formId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "renderState": { "alias": "renderState"; "required": false; }; }, { "formSubmit": "formSubmit"; }, never, never, false, never>;
917
+ }
918
+
919
+ /** What the visitor actually types into. Chosen by a trait; it also implies a validation rule. */
920
+ declare enum ControlType {
921
+ Text = "text",
922
+ Email = "email",
923
+ Tel = "tel",
924
+ Url = "url",
925
+ Number = "number",
926
+ Password = "password",
927
+ Textarea = "textarea",
928
+ Select = "select",
929
+ Checkbox = "checkbox",
930
+ Radio = "radio",
931
+ Date = "date",
932
+ Time = "time",
933
+ File = "file",
934
+ /** Not shown; carries a constant or a bound value (campaign, source page, …). */
935
+ Hidden = "hidden"
936
+ }
937
+ interface FieldOption {
938
+ label: string;
939
+ value: string;
940
+ }
941
+
942
+ /**
943
+ * The compound Field: label + control + help + error + required mark, as ONE node (decision D2).
944
+ *
945
+ * This is the biggest divergence from Webflow, and it is deliberate. There, a form field is four
946
+ * loose elements an author can delete — and they do delete the label, which breaks the
947
+ * `for`/`id` pairing and with it screen-reader support. Here the structure is fixed and
948
+ * accessibility is guaranteed by construction: the label can be visually hidden, never removed.
949
+ *
950
+ * The PARTS are styled through the virtual-trait mechanism (`__labelStyles`, `__errorStyles`, …)
951
+ * that already compiles `::marker` rules for List — so per-part styling invents no new concept in
952
+ * the style engine. Each part carries a stable class the compiler targets.
953
+ *
954
+ * ⚠️ Control type is a TRAIT, not a component per type (decision D4) — one component, one config,
955
+ * and choosing `email` also chooses email validation.
956
+ */
957
+ declare class IoxFieldComponent {
958
+ nodeId: string;
959
+ name: string;
960
+ label: string;
961
+ control: ControlType | string;
962
+ placeholder: string;
963
+ help: string;
964
+ required: boolean;
965
+ disabled: boolean;
966
+ labelHidden: boolean;
967
+ requiredMark: string;
968
+ rows: number;
969
+ accept: string;
970
+ options: FieldOption[];
971
+ value: any;
972
+ /** The resolved, already-translated message. Resolving the key is the host's job, not ours. */
973
+ errorText: string;
974
+ /** Design-time or runtime failure. The style compiler targets `.iox-invalid`. */
975
+ invalid: boolean;
976
+ /** Only after a successful check — never on an untouched field. */
977
+ showValid: boolean;
978
+ valueChange: EventEmitter<any>;
979
+ touched: EventEmitter<void>;
980
+ /** Stable per instance so `for`/`id` and `aria-describedby` always pair up. */
981
+ readonly controlId: string;
982
+ /** `file`, `date`, `number`… map straight through; everything else is a text input. */
983
+ get inputType(): string;
984
+ /** Help and error are BOTH announced, in that order, when both are present. */
985
+ get describedBy(): string | null;
986
+ emit(value: any): void;
987
+ touch(): void;
988
+ static ɵfac: i0.ɵɵFactoryDeclaration<IoxFieldComponent, never>;
989
+ static ɵcmp: i0.ɵɵComponentDeclaration<IoxFieldComponent, "div[iox-field]", never, { "nodeId": { "alias": "nodeId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "label": { "alias": "label"; "required": false; }; "control": { "alias": "control"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "help": { "alias": "help"; "required": false; }; "required": { "alias": "required"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "labelHidden": { "alias": "labelHidden"; "required": false; }; "requiredMark": { "alias": "requiredMark"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "accept": { "alias": "accept"; "required": false; }; "options": { "alias": "options"; "required": false; }; "value": { "alias": "value"; "required": false; }; "errorText": { "alias": "errorText"; "required": false; }; "invalid": { "alias": "invalid"; "required": false; }; "showValid": { "alias": "showValid"; "required": false; }; }, { "valueChange": "valueChange"; "touched": "touched"; }, never, never, false, never>;
990
+ }
991
+
992
+ /**
993
+ * Directive-host SubmitButton: the real `<button type="submit">` IS the host.
994
+ *
995
+ * It carries no destination configuration of its own — "what happens with the data" is an ordered
996
+ * action list on the FORM (decision D9), so there is nothing here to wire and nothing to get out of
997
+ * sync. The button owns only its own appearance and its busy state.
998
+ *
999
+ * While submitting it shows `loadingLabel` and is disabled, which is the whole double-submit
1000
+ * defence on the client side (the server's rate limit is the real one).
1001
+ */
1002
+ declare class IoxSubmitButtonComponent {
1003
+ nodeId: string;
1004
+ label: string;
1005
+ loadingLabel: string;
1006
+ disableWhileSubmitting: boolean;
1007
+ /** Driven by the form's lifecycle, not by the author. */
1008
+ submitting: boolean;
1009
+ static ɵfac: i0.ɵɵFactoryDeclaration<IoxSubmitButtonComponent, never>;
1010
+ static ɵcmp: i0.ɵɵComponentDeclaration<IoxSubmitButtonComponent, "button[iox-submit]", never, { "nodeId": { "alias": "nodeId"; "required": false; }; "label": { "alias": "label"; "required": false; }; "loadingLabel": { "alias": "loadingLabel"; "required": false; }; "disableWhileSubmitting": { "alias": "disableWhileSubmitting"; "required": false; }; "submitting": { "alias": "submitting"; "required": false; }; }, {}, never, never, false, never>;
1011
+ }
1012
+
1013
+ /**
1014
+ * The Success and Error blocks — real, fully styleable container nodes that the Form auto-creates
1015
+ * and the author cannot delete (decision D7). Hiding one is allowed; removing it is not, because
1016
+ * "the author deleted the success block and the form went quiet" is Webflow's commonest form
1017
+ * failure and we designed it out.
1018
+ *
1019
+ * ⚠️ VISIBILITY IS NOT AN INPUT. Which block shows is decided by CSS keyed on the parent form's
1020
+ * `data-iox-state` attribute (see `iox-form-states.css` / the engine's `styles.scss`):
1021
+ *
1022
+ * .iox-form-success { display: none }
1023
+ * .iox-form[data-iox-state="success"] .iox-form-success { display: block }
1024
+ *
1025
+ * That is deliberate. It means the builder's state switcher and the runtime's submit lifecycle
1026
+ * drive the SAME mechanism through one attribute, with no input plumbing down the tree and no
1027
+ * chance of the canvas and the live site disagreeing about what a visitor sees. The selector
1028
+ * out-specifies `.iox-node-{id}`, so the state machine owns visibility and the author owns
1029
+ * everything else about the block.
1030
+ */
1031
+ declare class IoxFormSuccessComponent {
1032
+ nodeId: string;
1033
+ childrenHost: ViewContainerRef;
1034
+ static ɵfac: i0.ɵɵFactoryDeclaration<IoxFormSuccessComponent, never>;
1035
+ static ɵcmp: i0.ɵɵComponentDeclaration<IoxFormSuccessComponent, "div[iox-form-success]", never, { "nodeId": { "alias": "nodeId"; "required": false; }; }, {}, never, never, false, never>;
1036
+ }
1037
+ /**
1038
+ * The Error block. One design, five reasons: the renderer writes the resolved reason text into
1039
+ * `message`, so an author designs the block once and every failure mode (network, rejected, spam,
1040
+ * rate-limited, server) renders through it.
1041
+ *
1042
+ * `role="alert"` rather than `status`: a failed submit must interrupt, because the visitor is
1043
+ * about to walk away believing they sent it.
1044
+ */
1045
+ declare class IoxFormErrorComponent {
1046
+ nodeId: string;
1047
+ /** Already-translated reason. Resolving the key is the host's job. */
1048
+ message: string;
1049
+ childrenHost: ViewContainerRef;
1050
+ static ɵfac: i0.ɵɵFactoryDeclaration<IoxFormErrorComponent, never>;
1051
+ static ɵcmp: i0.ɵɵComponentDeclaration<IoxFormErrorComponent, "div[iox-form-error]", never, { "nodeId": { "alias": "nodeId"; "required": false; }; "message": { "alias": "message"; "required": false; }; }, {}, never, never, false, never>;
1052
+ }
1053
+
878
1054
  declare class IoxBuilderComponentsModule {
879
1055
  static ɵfac: i0.ɵɵFactoryDeclaration<IoxBuilderComponentsModule, never>;
880
- static ɵmod: i0.ɵɵNgModuleDeclaration<IoxBuilderComponentsModule, [typeof BuilderImageComponent, typeof BuilderSpacerComponent, typeof CardComponent, typeof BuilderDividerComponent, typeof BuilderIconComponent, typeof BuilderLinkComponent, typeof BuilderButtonComponent, typeof BuilderHeadingComponent, typeof TextBlockComponent, typeof SectionComponent, typeof ContainerComponent, typeof LinkedContainerComponent, typeof ClientRepeaterComponent, typeof ButtonBlockComponent, typeof ClientSliderContainerComponent, typeof ClientSliderSlideComponent, typeof ClientListComponent, typeof ClientListItemComponent, typeof ClientGalleryComponent], [typeof i2.CommonModule], [typeof BuilderImageComponent, typeof BuilderSpacerComponent, typeof CardComponent, typeof BuilderDividerComponent, typeof BuilderIconComponent, typeof BuilderLinkComponent, typeof BuilderButtonComponent, typeof BuilderHeadingComponent, typeof TextBlockComponent, typeof SectionComponent, typeof ContainerComponent, typeof LinkedContainerComponent, typeof ClientRepeaterComponent, typeof ButtonBlockComponent, typeof ClientSliderContainerComponent, typeof ClientSliderSlideComponent, typeof ClientListComponent, typeof ClientListItemComponent, typeof ClientGalleryComponent]>;
1056
+ static ɵmod: i0.ɵɵNgModuleDeclaration<IoxBuilderComponentsModule, [typeof BuilderImageComponent, typeof BuilderSpacerComponent, typeof CardComponent, typeof BuilderDividerComponent, typeof BuilderIconComponent, typeof BuilderLinkComponent, typeof BuilderButtonComponent, typeof BuilderHeadingComponent, typeof TextBlockComponent, typeof SectionComponent, typeof ContainerComponent, typeof LinkedContainerComponent, typeof ClientRepeaterComponent, typeof ButtonBlockComponent, typeof ClientSliderContainerComponent, typeof ClientSliderSlideComponent, typeof ClientListComponent, typeof ClientListItemComponent, typeof ClientGalleryComponent, typeof IoxFormComponent, typeof IoxFieldComponent, typeof IoxSubmitButtonComponent, typeof IoxFormSuccessComponent, typeof IoxFormErrorComponent], [typeof i2.CommonModule], [typeof BuilderImageComponent, typeof BuilderSpacerComponent, typeof CardComponent, typeof BuilderDividerComponent, typeof BuilderIconComponent, typeof BuilderLinkComponent, typeof BuilderButtonComponent, typeof BuilderHeadingComponent, typeof TextBlockComponent, typeof SectionComponent, typeof ContainerComponent, typeof LinkedContainerComponent, typeof ClientRepeaterComponent, typeof ButtonBlockComponent, typeof ClientSliderContainerComponent, typeof ClientSliderSlideComponent, typeof ClientListComponent, typeof ClientListItemComponent, typeof ClientGalleryComponent, typeof IoxFormComponent, typeof IoxFieldComponent, typeof IoxSubmitButtonComponent, typeof IoxFormSuccessComponent, typeof IoxFormErrorComponent]>;
881
1057
  static ɵinj: i0.ɵɵInjectorDeclaration<IoxBuilderComponentsModule>;
882
1058
  }
883
1059
 
@@ -2002,5 +2178,5 @@ declare class GalleryLoop {
2002
2178
  private emit;
2003
2179
  }
2004
2180
 
2005
- export { AOSService, AnalyticsService, BREAKPOINTS, Breakpoint, BreakpointQueryKind, BuilderButtonComponent, BuilderDividerComponent, BuilderHeadingComponent, BuilderIconComponent, BuilderImageComponent, BuilderLinkComponent, BuilderSpacerComponent, ButtonBlockComponent, CMSClientInfraModule, CONTEXT_ACTION_TYPES, CardComponent, ClientGalleryComponent, ClientListComponent, ClientListItemComponent, ClientRepeaterComponent, ClientSliderContainerComponent, ClientSliderSlideComponent, ComponentInstanceRegistryService, ConsentService, ContainerComponent, ContentService, ContextStore, DEFAULT_GALLERY_SCHEDULER, DEFAULT_PAGE_TRANSITION, DEFAULT_PAGE_TRANSITION_DURATION, DEFAULT_PAGE_TRANSITION_EASING, DEFAULT_PAGE_TRANSITION_PERSPECTIVE, DEFAULT_WIDTH_BY_TYPE, DeclarationContext, ENVIRONMENT, GALLERY_EFFECTS, GALLERY_EFFECT_DESCRIPTORS, GalleryLoop, IOX_BUILDER_EVENTS, IS_PREVIEW, IoxAnimateContainer, IoxAosDirective, IoxAosModule, IoxBuilderComponentsModule, IoxComponentRegistryService, IoxPageComponent, IoxPageModule, IoxUiModule, LinkedContainerComponent, PAGE_TRANSITION_CATEGORIES, PAGE_TRANSITION_PRESETS, PIPE_DESCRIPTORS, PIPE_REGISTRY, PageScrollProvider, PrivacyModalComponent, PrivacyModalService, PrivacyModelEvent, RESERVED_ALIAS_PREFIX, SUPPRESSED_STYLE_PROPS_BY_TYPE, SWIPER_RESPONSIVE_TRAITS, SectionComponent, TRANSITION_FEELS, TextBlockComponent, VIRTUAL_TRAIT_GROUPS, VIRTUAL_TRAIT_KEYS, ViewPositionDirective, ViewPositionModule, WebSettingsService, activeActions, applyBindingPipes, applyFeel, breakpointDef, breakpointForWidth, breakpointQueryFor, buildDataSourceFilter, buildRelatedFilter, buildSwiperBreakpoints, buildTargetedStateSelector, buildTransitionTimeline, cascadeChain, clearInputOverride, clearOverride, collectContextSlotKeys, collectReferencedAliases, compileDeclarations, composeVirtualTraits, computeRelative, contextActionEffect, contextSlotKeys, countOverrides, dataSourcePlanToRequest, declaredInputNames, effectiveTransitionId, excludeSelf, feelFor, getByPath, initialSlotValues, isActionEnabled, isContextAction, isInputOverriddenAt, isOverriddenAt, isReservedAlias, isValidSlotKey, legacyEnterToTransition, matchRouteParams, mediaQueryFor, mergeSwiperBreakpoints, nearestCommonAncestorId, nodeCssId, nodeUsesContext, normalizeCollectionResult, normalizeGalleryImage, parentBreakpoint, parseUrlList, planDataSource, planResponsiveRules, referencedDataSources, referencedDataSourcesDeep, renderDefaultDeclarations, resolveContextValue, resolveDerivedInto, resolveGalleryEffect, resolveGalleryUrls, resolveInputChain, resolveInputs, resolvePageTransition, resolvePath, resolveRelativeInto, resolveRepeaterItems, resolveSiblings, resolveSingleItemId, resolveStateStyles, resolveStyleProps, resolveValueChain, rewriteViewportUnits, safeSetInput, setInputOverride, setOverride, stateNamesIn, stripSuppressedProps, styleKeyToKebab, variableAliases, variableItemsFrom, withContextSlots, wrapInBreakpointQuery, wrapInMediaQuery };
2181
+ export { AOSService, AnalyticsService, BREAKPOINTS, Breakpoint, BreakpointQueryKind, BuilderButtonComponent, BuilderDividerComponent, BuilderHeadingComponent, BuilderIconComponent, BuilderImageComponent, BuilderLinkComponent, BuilderSpacerComponent, ButtonBlockComponent, CMSClientInfraModule, CONTEXT_ACTION_TYPES, CardComponent, ClientGalleryComponent, ClientListComponent, ClientListItemComponent, ClientRepeaterComponent, ClientSliderContainerComponent, ClientSliderSlideComponent, ComponentInstanceRegistryService, ConsentService, ContainerComponent, ContentService, ContextStore, DEFAULT_GALLERY_SCHEDULER, DEFAULT_PAGE_TRANSITION, DEFAULT_PAGE_TRANSITION_DURATION, DEFAULT_PAGE_TRANSITION_EASING, DEFAULT_PAGE_TRANSITION_PERSPECTIVE, DEFAULT_WIDTH_BY_TYPE, DeclarationContext, ENVIRONMENT, FormRenderState, GALLERY_EFFECTS, GALLERY_EFFECT_DESCRIPTORS, GalleryLoop, IOX_BUILDER_EVENTS, IS_PREVIEW, IoxAnimateContainer, IoxAosDirective, IoxAosModule, IoxBuilderComponentsModule, IoxComponentRegistryService, IoxFieldComponent, IoxFormComponent, IoxFormErrorComponent, IoxFormSuccessComponent, IoxPageComponent, IoxPageModule, IoxSubmitButtonComponent, IoxUiModule, LinkedContainerComponent, PAGE_TRANSITION_CATEGORIES, PAGE_TRANSITION_PRESETS, PIPE_DESCRIPTORS, PIPE_REGISTRY, PageScrollProvider, PrivacyModalComponent, PrivacyModalService, PrivacyModelEvent, RESERVED_ALIAS_PREFIX, SUPPRESSED_STYLE_PROPS_BY_TYPE, SWIPER_RESPONSIVE_TRAITS, SectionComponent, TRANSITION_FEELS, TextBlockComponent, VIRTUAL_TRAIT_GROUPS, VIRTUAL_TRAIT_KEYS, ViewPositionDirective, ViewPositionModule, WebSettingsService, activeActions, applyBindingPipes, applyFeel, breakpointDef, breakpointForWidth, breakpointQueryFor, buildDataSourceFilter, buildRelatedFilter, buildSwiperBreakpoints, buildTargetedStateSelector, buildTransitionTimeline, cascadeChain, clearInputOverride, clearOverride, collectContextSlotKeys, collectReferencedAliases, compileDeclarations, composeVirtualTraits, computeRelative, contextActionEffect, contextSlotKeys, countOverrides, dataSourcePlanToRequest, declaredInputNames, effectiveTransitionId, excludeSelf, feelFor, getByPath, initialSlotValues, isActionEnabled, isContextAction, isInputOverriddenAt, isOverriddenAt, isReservedAlias, isValidSlotKey, legacyEnterToTransition, matchRouteParams, mediaQueryFor, mergeSwiperBreakpoints, nearestCommonAncestorId, nodeCssId, nodeUsesContext, normalizeCollectionResult, normalizeGalleryImage, parentBreakpoint, parseUrlList, planDataSource, planResponsiveRules, referencedDataSources, referencedDataSourcesDeep, renderDefaultDeclarations, resolveContextValue, resolveDerivedInto, resolveGalleryEffect, resolveGalleryUrls, resolveInputChain, resolveInputs, resolvePageTransition, resolvePath, resolveRelativeInto, resolveRepeaterItems, resolveSiblings, resolveSingleItemId, resolveStateStyles, resolveStyleProps, resolveValueChain, rewriteViewportUnits, safeSetInput, setInputOverride, setOverride, stateNamesIn, stripSuppressedProps, styleKeyToKebab, variableAliases, variableItemsFrom, withContextSlots, wrapInBreakpointQuery, wrapInMediaQuery };
2006
2182
  export type { BreakpointDef, BuildRelatedFilterOptions, ContextActionEffect, ContextActionLike, ContextItemRef, ContextSlotDefault, ContextValueSpec, ContextWriteScope, DataSourceDomain, DataSourceEndpoints, DataSourceMode, DataSourcePlan, DataSourceQueryFilter, DataSourceRequest, DataSourceRequestSpec, DataSourceRouteFilter, DataSourceSpec, GalleryBoundSource, GalleryDurations, GalleryEffect, GalleryEffectDescriptor, GalleryImage, GalleryLoopOptions, GalleryLoopScheduler, GalleryLoopState, GallerySlideState, IBuilderEventEmitter, InputMap, IoxContextSlot, IoxPipe, OverrideBreakpoint, PageTransitionCategory, PageTransitionCategoryMeta, PageTransitionOptions, PageTransitionPreset, PipeArgSpec, PipeContext, PipeDescriptor, RelativeInputs, RelativeSourceKind, RelativeSourceSpec, ResolveSiblingsOptions, ResolvedPageTransition, ResponsiveLayer, ResponsiveOverrides, ResponsiveRuleSet, RouteContext, SetContextParams, SiblingsResult, StateStyleMap, StyleMap, StyleTreeNode, SwiperBreakpointMap, ToggleableAction, TransitionFeel, TransitionPhase, TransitionTimelineInput, ValueSource, VirtualTraitGroup };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vectoriox/iox-ui",
3
- "version": "4.26.0",
3
+ "version": "4.28.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=20.0.0",
6
6
  "@angular/core": ">=20.0.0",
@@ -18,6 +18,10 @@
18
18
  ".": {
19
19
  "types": "./index.d.ts",
20
20
  "default": "./fesm2022/vectoriox-iox-ui.mjs"
21
+ },
22
+ "./forms-core": {
23
+ "types": "./forms-core/index.d.ts",
24
+ "default": "./fesm2022/vectoriox-iox-ui-forms-core.mjs"
21
25
  }
22
26
  },
23
27
  "sideEffects": false