New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@rilaykit/forms

Package Overview
Dependencies
Maintainers
1
Versions
35
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@rilaykit/forms - npm Package Compare versions

Comparing version
0.1.5
to
0.1.6
+225
-11
dist/index.d.mts
import * as react_jsx_runtime from 'react/jsx-runtime';
import { ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FormFieldConfig, FormRowEntry, FormValidationConfig, SubmitOptions, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps } from '@rilaykit/core';
import { RilayInstance, ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FieldEffects, FormFieldConfig, FormRowEntry, FormValidationConfig, SubmitOptions, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps, StandardSchema, FieldEffectContext } from '@rilaykit/core';
import * as React$1 from 'react';

@@ -31,3 +31,3 @@ import React__default from 'react';

private _validation?;
constructor(config: ril<C>);
constructor(config: RilayInstance<C> | ril<C>);
/**

@@ -95,2 +95,4 @@ * Add fields to the repeatable template

conditions?: ConditionalBehavior;
/** Field effects configuration for reactive field-to-field behaviors */
effects?: FieldEffects;
};

@@ -132,5 +134,4 @@ /**

* Adding fields:
* - Variadic: .add(fieldA, fieldB) => same row (max 3 per row)
* - Variadic: .add(fieldA, fieldB) => same row
* - Array: .add([fieldA, fieldB]) => explicit single row
* - >3 fields (variadic) => split across multiple rows automatically
*

@@ -164,3 +165,3 @@ * Output of .build(): FormConfiguration<C>

*/
constructor(config: ril<C>, formId?: string);
constructor(config: RilayInstance<C> | ril<C>, formId?: string);
/**

@@ -180,3 +181,3 @@ * Static factory to create a new form builder

*/
static create<Cm extends Record<string, any> = Record<string, never>>(config: ril<Cm>, formId?: string): form<Cm>;
static create<Cm extends Record<string, any> = Record<string, never>>(config: RilayInstance<Cm> | ril<Cm>, formId?: string): form<Cm>;
/**

@@ -210,3 +211,3 @@ * Converts a FieldConfig to a FormFieldConfig

* @returns A complete FormFieldRow configuration
* @throws Error if no fields provided or more than 3 fields specified
* @throws Error if no fields provided
*

@@ -223,4 +224,3 @@ * @internal

* - Single field: Creates a new row with one field
* - Multiple fields (≤3): Creates one row with all fields
* - Multiple fields (>3): Creates separate rows for each field
* - Multiple fields: Creates one row with all fields
* - Array with options: Explicit control over row configuration

@@ -238,3 +238,3 @@ *

*
* // Multiple fields on same row (max 3)
* // Multiple fields on same row
* builder.add(

@@ -787,2 +787,3 @@ * { type: 'text', props: { label: 'First Name' } },

_fieldConditions: Record<string, FieldConditions>;
_fieldProps: Record<string, Record<string, unknown>>;
_repeatableConfigs: Record<string, RepeatableFieldConfig>;

@@ -799,2 +800,3 @@ _repeatableOrder: Record<string, string[]>;

_setFieldConditions: (fieldId: string, conditions: FieldConditions) => void;
_setFieldProps: (fieldId: string, props: Record<string, unknown>) => void;
_updateIsValid: () => void;

@@ -852,2 +854,6 @@ _setRepeatableConfig: (id: string, config: RepeatableFieldConfig) => void;

/**
* Select dynamic props for a field - re-renders only when this field's dynamic props change
*/
declare function useFieldProps(fieldId: string): Record<string, unknown>;
/**
* Select complete field state - uses individual selectors to avoid object recreation

@@ -1072,2 +1078,210 @@ */

export { type ConditionEvaluationResult, type FieldConfig, Form, FormBody, form as FormBuilder, type FormConfigContextValue, FormField, FormProvider, type FormProviderProps, FormRow, type FormStore, FormStoreContext, type FormStoreState, FormSubmitButton, RepeatableBuilder, RepeatableField, RepeatableItem, type UseFieldActionsResult, type UseFieldConditionsLazyOptions, type UseFormActionsResult, type UseFormConditionsProps, type UseFormConditionsReturn, type UseFormMonitoringProps, type UseFormMonitoringReturn, type UseFormSubmissionWithStoreProps, type UseFormValidationWithStoreProps, type UseRepeatableFieldReturn, createFormStore, flattenRepeatableValues, form, structureFormValues, useConditionEvaluation, useConditionEvaluator, useFieldActions, useFieldConditions, useFieldConditionsLazy, useFieldConditionsWithRefresh, useFieldErrors, useFieldState, useFieldTouched, useFieldValidationState, useFieldValue, useFormActions, useFormConditions, useFormConfigContext, useFormDirty, useFormMonitoring, useFormStore, useFormStoreApi, useFormSubmissionWithStore, useFormSubmitState, useFormSubmitting, useFormValid, useFormValidationWithStore, useFormValues, useMultipleConditionEvaluation, useRepeatableField, useRepeatableKeys };
/**
* JSON schema that backends send to describe a form.
* Fully JSON-serializable — no functions, no class instances.
*
* Supports two layout formats:
* - `fields` (flat): each field gets its own row — simple and covers most cases
* - `rows` (advanced): explicit row layout with multi-field rows and repeatables
*
* Must have exactly one of `fields` or `rows`.
*/
interface FormSchema {
/** Schema version for future compatibility (defaults to 1) */
readonly version?: 1;
/** Unique form identifier */
readonly id: string;
/** Initial field values for pre-filling the form */
readonly defaultValues?: Record<string, unknown>;
/** Flat field list — each field on its own row (simple format) */
readonly fields?: FormSchemaField[];
/** Explicit row layout with multi-field rows and repeatables (advanced format) */
readonly rows?: FormSchemaRow[];
/** Form-level validation descriptors */
readonly validation?: FormSchemaValidationConfig;
/** Default submit options */
readonly submitOptions?: SubmitOptions;
}
type FormSchemaRow = FormSchemaFieldRow | FormSchemaRepeatableRow;
interface FormSchemaFieldRow {
/** Discriminant — defaults to 'fields' if absent */
readonly kind?: 'fields';
/** Row ID (auto-generated if omitted) */
readonly id?: string;
/** Fields in this row (at least one) */
readonly fields: FormSchemaField[];
/** Maximum columns for this row */
readonly maxColumns?: number;
}
interface FormSchemaRepeatableRow {
readonly kind: 'repeatable';
/** Row ID (auto-generated if omitted) */
readonly id?: string;
readonly repeatable: FormSchemaRepeatable;
}
interface FormSchemaField {
/** Unique field identifier (required — backend must know IDs) */
readonly id: string;
/** Component type — must match a registered component in ril config */
readonly type: string;
/** Component props (JSON-serializable) */
readonly props?: Record<string, unknown>;
/** Validation descriptors */
readonly validation?: FieldSchemaValidation;
/** Conditions — pass-through (already JSON-serializable ConditionConfig) */
readonly conditions?: ConditionalBehavior;
/** Effect descriptors — references to registered effect handlers */
readonly effects?: FieldSchemaEffect[];
}
interface FormSchemaRepeatable {
/** Unique repeatable group identifier */
readonly id: string;
/** Template rows for each repeatable item */
readonly rows: FormSchemaFieldRow[];
/** Minimum number of items */
readonly min?: number;
/** Maximum number of items */
readonly max?: number;
/** Default values for new items */
readonly defaultValue?: Record<string, unknown>;
/** Group-level validation */
readonly validation?: FieldSchemaValidation;
}
interface FieldSchemaValidation {
/** One or more validation descriptors */
readonly rules?: ValidationDescriptor | ValidationDescriptor[];
readonly validateOnChange?: boolean;
readonly validateOnBlur?: boolean;
readonly debounceMs?: number;
}
/**
* A validation descriptor — string shortcut or parameterized object.
*
* String shortcuts: "required", "email", "url", "number"
* Object descriptors: { type: "minLength", params: { min: 3 }, message?: "..." }
*/
type ValidationDescriptor = ValidationShortcut | ValidationDescriptorObject;
/** Zero-parameter built-in validator shortcuts */
type ValidationShortcut = 'required' | 'email' | 'url' | 'number';
interface ValidationDescriptorObject {
/** Built-in validator name or registry key */
readonly type: string;
/** Custom error message */
readonly message?: string;
/** Validator-specific parameters */
readonly params?: Record<string, unknown>;
}
/**
* Form-level validation descriptors.
* Note: string shortcuts (required, email, etc.) are meaningless at form level
* since they validate individual values. Use registry validators for cross-field logic.
*/
interface FormSchemaValidationConfig {
readonly rules?: ValidationDescriptor | ValidationDescriptor[];
readonly validateOnSubmit?: boolean;
readonly validateOnStepChange?: boolean;
}
interface FieldSchemaEffect {
readonly trigger: 'change';
/** Field ID to watch for changes */
readonly watch: string;
/** Registry key for the handler function */
readonly handler: string;
/** Parameters passed to the handler (enables handler reuse) */
readonly params?: Record<string, unknown>;
}
/**
* Registry for custom validators and effect handlers.
* Provided by the consumer alongside the ril config.
*/
interface SchemaRegistry {
/** Custom validators indexed by key */
readonly validators?: Record<string, CustomValidatorFactory>;
/** Effect handlers indexed by key */
readonly effects?: Record<string, SchemaEffectHandler>;
}
/**
* Factory that creates a StandardSchema validator from descriptor params.
* Allows parameterized custom validators.
*/
type CustomValidatorFactory = (params?: Record<string, unknown>, message?: string) => StandardSchema;
/**
* Effect handler with optional params (3rd argument).
* The fromSchema resolver curries params into a standard FieldEffectHandler.
*/
type SchemaEffectHandler = (newValue: unknown, context: FieldEffectContext, params?: Record<string, unknown>) => void | Promise<void>;
/**
* Result of fromSchema() — separates formConfig from defaultValues
* because FormConfiguration does not have a defaultValues field.
* defaultValues is a separate prop on FormProvider / Form.
*/
interface FormSchemaResult<C extends Record<string, any>> {
readonly formConfig: FormConfiguration<C>;
readonly defaultValues?: Record<string, unknown>;
}
interface SchemaIssue {
/** JSON path to the invalid element (e.g. "rows[0].fields[1].validation") */
readonly path: string;
/** Human-readable error message */
readonly message: string;
/** Error severity */
readonly severity: 'error' | 'warning';
}
/**
* Thrown when a form schema has structural errors.
* Contains a detailed list of issues with JSON paths.
*/
declare class SchemaValidationError extends Error {
readonly code: "SCHEMA_VALIDATION_ERROR";
readonly issues: SchemaIssue[];
constructor(issues: SchemaIssue[]);
}
/**
* Converts a JSON schema into a fully functional FormConfiguration.
*
* Uses the existing form builder internally — zero logic duplication.
* Resolves validation descriptors and effect references via the optional registry.
*
* @param schema - The JSON form schema (from backend or local JSON)
* @param config - The ril instance containing registered components
* @param registry - Optional registry for custom validators and effects
* @returns A FormSchemaResult with formConfig and optional defaultValues
* @throws SchemaValidationError if the schema is invalid
*
* @example
* ```typescript
* const { formConfig, defaultValues } = fromSchema(schema, rilConfig, registry);
* <Form formConfig={formConfig} defaultValues={defaultValues} onSubmit={handleSubmit} />
* ```
*/
declare function fromSchema<C extends Record<string, any>>(schema: FormSchema, config: RilayInstance<C>, registry?: SchemaRegistry): FormSchemaResult<C>;
/**
* Type guard — checks if a value conforms to the FormSchema structure.
*/
declare function isFormSchema(value: unknown): value is FormSchema;
/**
* Validates a form schema structure before processing.
* Throws SchemaValidationError with detailed issues if invalid.
*
* Only checks what the builder does NOT check:
* - Schema structure (id, fields/rows presence)
* - Component existence in ril config
* - Validator type existence (built-in or registry)
* - Parameterized validator required params
* - Effect handler existence in registry
* - Condition operator validity
*
* The builder handles: ID uniqueness, row constraints, bracket validation.
*/
declare function validateSchema<C extends Record<string, any>>(schema: FormSchema, config: RilayInstance<C>, registry?: SchemaRegistry): void;
/**
* Resolves field-level validation descriptors into a FieldValidationConfig.
*/
declare function resolveFieldValidation(validation: FieldSchemaValidation, registry?: SchemaRegistry): FieldValidationConfig;
/**
* Resolves a single validation descriptor into a StandardSchema.
*/
declare function resolveValidationDescriptor(descriptor: ValidationDescriptor, registry?: SchemaRegistry): StandardSchema;
export { type ConditionEvaluationResult, type CustomValidatorFactory, type FieldConfig, type FieldSchemaEffect, type FieldSchemaValidation, Form, FormBody, form as FormBuilder, type FormConfigContextValue, FormField, FormProvider, type FormProviderProps, FormRow, type FormSchema, type FormSchemaField, type FormSchemaFieldRow, type FormSchemaRepeatable, type FormSchemaRepeatableRow, type FormSchemaResult, type FormSchemaRow, type FormSchemaValidationConfig, type FormStore, FormStoreContext, type FormStoreState, FormSubmitButton, RepeatableBuilder, RepeatableField, RepeatableItem, type SchemaEffectHandler, type SchemaIssue, type SchemaRegistry, SchemaValidationError, type UseFieldActionsResult, type UseFieldConditionsLazyOptions, type UseFormActionsResult, type UseFormConditionsProps, type UseFormConditionsReturn, type UseFormMonitoringProps, type UseFormMonitoringReturn, type UseFormSubmissionWithStoreProps, type UseFormValidationWithStoreProps, type UseRepeatableFieldReturn, type ValidationDescriptor, type ValidationDescriptorObject, type ValidationShortcut, createFormStore, flattenRepeatableValues, form, fromSchema, isFormSchema, resolveFieldValidation, resolveValidationDescriptor, structureFormValues, useConditionEvaluation, useConditionEvaluator, useFieldActions, useFieldConditions, useFieldConditionsLazy, useFieldConditionsWithRefresh, useFieldErrors, useFieldProps, useFieldState, useFieldTouched, useFieldValidationState, useFieldValue, useFormActions, useFormConditions, useFormConfigContext, useFormDirty, useFormMonitoring, useFormStore, useFormStoreApi, useFormSubmissionWithStore, useFormSubmitState, useFormSubmitting, useFormValid, useFormValidationWithStore, useFormValues, useMultipleConditionEvaluation, useRepeatableField, useRepeatableKeys, validateSchema };
import * as react_jsx_runtime from 'react/jsx-runtime';
import { ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FormFieldConfig, FormRowEntry, FormValidationConfig, SubmitOptions, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps } from '@rilaykit/core';
import { RilayInstance, ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FieldEffects, FormFieldConfig, FormRowEntry, FormValidationConfig, SubmitOptions, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps, StandardSchema, FieldEffectContext } from '@rilaykit/core';
import * as React$1 from 'react';

@@ -31,3 +31,3 @@ import React__default from 'react';

private _validation?;
constructor(config: ril<C>);
constructor(config: RilayInstance<C> | ril<C>);
/**

@@ -95,2 +95,4 @@ * Add fields to the repeatable template

conditions?: ConditionalBehavior;
/** Field effects configuration for reactive field-to-field behaviors */
effects?: FieldEffects;
};

@@ -132,5 +134,4 @@ /**

* Adding fields:
* - Variadic: .add(fieldA, fieldB) => same row (max 3 per row)
* - Variadic: .add(fieldA, fieldB) => same row
* - Array: .add([fieldA, fieldB]) => explicit single row
* - >3 fields (variadic) => split across multiple rows automatically
*

@@ -164,3 +165,3 @@ * Output of .build(): FormConfiguration<C>

*/
constructor(config: ril<C>, formId?: string);
constructor(config: RilayInstance<C> | ril<C>, formId?: string);
/**

@@ -180,3 +181,3 @@ * Static factory to create a new form builder

*/
static create<Cm extends Record<string, any> = Record<string, never>>(config: ril<Cm>, formId?: string): form<Cm>;
static create<Cm extends Record<string, any> = Record<string, never>>(config: RilayInstance<Cm> | ril<Cm>, formId?: string): form<Cm>;
/**

@@ -210,3 +211,3 @@ * Converts a FieldConfig to a FormFieldConfig

* @returns A complete FormFieldRow configuration
* @throws Error if no fields provided or more than 3 fields specified
* @throws Error if no fields provided
*

@@ -223,4 +224,3 @@ * @internal

* - Single field: Creates a new row with one field
* - Multiple fields (≤3): Creates one row with all fields
* - Multiple fields (>3): Creates separate rows for each field
* - Multiple fields: Creates one row with all fields
* - Array with options: Explicit control over row configuration

@@ -238,3 +238,3 @@ *

*
* // Multiple fields on same row (max 3)
* // Multiple fields on same row
* builder.add(

@@ -787,2 +787,3 @@ * { type: 'text', props: { label: 'First Name' } },

_fieldConditions: Record<string, FieldConditions>;
_fieldProps: Record<string, Record<string, unknown>>;
_repeatableConfigs: Record<string, RepeatableFieldConfig>;

@@ -799,2 +800,3 @@ _repeatableOrder: Record<string, string[]>;

_setFieldConditions: (fieldId: string, conditions: FieldConditions) => void;
_setFieldProps: (fieldId: string, props: Record<string, unknown>) => void;
_updateIsValid: () => void;

@@ -852,2 +854,6 @@ _setRepeatableConfig: (id: string, config: RepeatableFieldConfig) => void;

/**
* Select dynamic props for a field - re-renders only when this field's dynamic props change
*/
declare function useFieldProps(fieldId: string): Record<string, unknown>;
/**
* Select complete field state - uses individual selectors to avoid object recreation

@@ -1072,2 +1078,210 @@ */

export { type ConditionEvaluationResult, type FieldConfig, Form, FormBody, form as FormBuilder, type FormConfigContextValue, FormField, FormProvider, type FormProviderProps, FormRow, type FormStore, FormStoreContext, type FormStoreState, FormSubmitButton, RepeatableBuilder, RepeatableField, RepeatableItem, type UseFieldActionsResult, type UseFieldConditionsLazyOptions, type UseFormActionsResult, type UseFormConditionsProps, type UseFormConditionsReturn, type UseFormMonitoringProps, type UseFormMonitoringReturn, type UseFormSubmissionWithStoreProps, type UseFormValidationWithStoreProps, type UseRepeatableFieldReturn, createFormStore, flattenRepeatableValues, form, structureFormValues, useConditionEvaluation, useConditionEvaluator, useFieldActions, useFieldConditions, useFieldConditionsLazy, useFieldConditionsWithRefresh, useFieldErrors, useFieldState, useFieldTouched, useFieldValidationState, useFieldValue, useFormActions, useFormConditions, useFormConfigContext, useFormDirty, useFormMonitoring, useFormStore, useFormStoreApi, useFormSubmissionWithStore, useFormSubmitState, useFormSubmitting, useFormValid, useFormValidationWithStore, useFormValues, useMultipleConditionEvaluation, useRepeatableField, useRepeatableKeys };
/**
* JSON schema that backends send to describe a form.
* Fully JSON-serializable — no functions, no class instances.
*
* Supports two layout formats:
* - `fields` (flat): each field gets its own row — simple and covers most cases
* - `rows` (advanced): explicit row layout with multi-field rows and repeatables
*
* Must have exactly one of `fields` or `rows`.
*/
interface FormSchema {
/** Schema version for future compatibility (defaults to 1) */
readonly version?: 1;
/** Unique form identifier */
readonly id: string;
/** Initial field values for pre-filling the form */
readonly defaultValues?: Record<string, unknown>;
/** Flat field list — each field on its own row (simple format) */
readonly fields?: FormSchemaField[];
/** Explicit row layout with multi-field rows and repeatables (advanced format) */
readonly rows?: FormSchemaRow[];
/** Form-level validation descriptors */
readonly validation?: FormSchemaValidationConfig;
/** Default submit options */
readonly submitOptions?: SubmitOptions;
}
type FormSchemaRow = FormSchemaFieldRow | FormSchemaRepeatableRow;
interface FormSchemaFieldRow {
/** Discriminant — defaults to 'fields' if absent */
readonly kind?: 'fields';
/** Row ID (auto-generated if omitted) */
readonly id?: string;
/** Fields in this row (at least one) */
readonly fields: FormSchemaField[];
/** Maximum columns for this row */
readonly maxColumns?: number;
}
interface FormSchemaRepeatableRow {
readonly kind: 'repeatable';
/** Row ID (auto-generated if omitted) */
readonly id?: string;
readonly repeatable: FormSchemaRepeatable;
}
interface FormSchemaField {
/** Unique field identifier (required — backend must know IDs) */
readonly id: string;
/** Component type — must match a registered component in ril config */
readonly type: string;
/** Component props (JSON-serializable) */
readonly props?: Record<string, unknown>;
/** Validation descriptors */
readonly validation?: FieldSchemaValidation;
/** Conditions — pass-through (already JSON-serializable ConditionConfig) */
readonly conditions?: ConditionalBehavior;
/** Effect descriptors — references to registered effect handlers */
readonly effects?: FieldSchemaEffect[];
}
interface FormSchemaRepeatable {
/** Unique repeatable group identifier */
readonly id: string;
/** Template rows for each repeatable item */
readonly rows: FormSchemaFieldRow[];
/** Minimum number of items */
readonly min?: number;
/** Maximum number of items */
readonly max?: number;
/** Default values for new items */
readonly defaultValue?: Record<string, unknown>;
/** Group-level validation */
readonly validation?: FieldSchemaValidation;
}
interface FieldSchemaValidation {
/** One or more validation descriptors */
readonly rules?: ValidationDescriptor | ValidationDescriptor[];
readonly validateOnChange?: boolean;
readonly validateOnBlur?: boolean;
readonly debounceMs?: number;
}
/**
* A validation descriptor — string shortcut or parameterized object.
*
* String shortcuts: "required", "email", "url", "number"
* Object descriptors: { type: "minLength", params: { min: 3 }, message?: "..." }
*/
type ValidationDescriptor = ValidationShortcut | ValidationDescriptorObject;
/** Zero-parameter built-in validator shortcuts */
type ValidationShortcut = 'required' | 'email' | 'url' | 'number';
interface ValidationDescriptorObject {
/** Built-in validator name or registry key */
readonly type: string;
/** Custom error message */
readonly message?: string;
/** Validator-specific parameters */
readonly params?: Record<string, unknown>;
}
/**
* Form-level validation descriptors.
* Note: string shortcuts (required, email, etc.) are meaningless at form level
* since they validate individual values. Use registry validators for cross-field logic.
*/
interface FormSchemaValidationConfig {
readonly rules?: ValidationDescriptor | ValidationDescriptor[];
readonly validateOnSubmit?: boolean;
readonly validateOnStepChange?: boolean;
}
interface FieldSchemaEffect {
readonly trigger: 'change';
/** Field ID to watch for changes */
readonly watch: string;
/** Registry key for the handler function */
readonly handler: string;
/** Parameters passed to the handler (enables handler reuse) */
readonly params?: Record<string, unknown>;
}
/**
* Registry for custom validators and effect handlers.
* Provided by the consumer alongside the ril config.
*/
interface SchemaRegistry {
/** Custom validators indexed by key */
readonly validators?: Record<string, CustomValidatorFactory>;
/** Effect handlers indexed by key */
readonly effects?: Record<string, SchemaEffectHandler>;
}
/**
* Factory that creates a StandardSchema validator from descriptor params.
* Allows parameterized custom validators.
*/
type CustomValidatorFactory = (params?: Record<string, unknown>, message?: string) => StandardSchema;
/**
* Effect handler with optional params (3rd argument).
* The fromSchema resolver curries params into a standard FieldEffectHandler.
*/
type SchemaEffectHandler = (newValue: unknown, context: FieldEffectContext, params?: Record<string, unknown>) => void | Promise<void>;
/**
* Result of fromSchema() — separates formConfig from defaultValues
* because FormConfiguration does not have a defaultValues field.
* defaultValues is a separate prop on FormProvider / Form.
*/
interface FormSchemaResult<C extends Record<string, any>> {
readonly formConfig: FormConfiguration<C>;
readonly defaultValues?: Record<string, unknown>;
}
interface SchemaIssue {
/** JSON path to the invalid element (e.g. "rows[0].fields[1].validation") */
readonly path: string;
/** Human-readable error message */
readonly message: string;
/** Error severity */
readonly severity: 'error' | 'warning';
}
/**
* Thrown when a form schema has structural errors.
* Contains a detailed list of issues with JSON paths.
*/
declare class SchemaValidationError extends Error {
readonly code: "SCHEMA_VALIDATION_ERROR";
readonly issues: SchemaIssue[];
constructor(issues: SchemaIssue[]);
}
/**
* Converts a JSON schema into a fully functional FormConfiguration.
*
* Uses the existing form builder internally — zero logic duplication.
* Resolves validation descriptors and effect references via the optional registry.
*
* @param schema - The JSON form schema (from backend or local JSON)
* @param config - The ril instance containing registered components
* @param registry - Optional registry for custom validators and effects
* @returns A FormSchemaResult with formConfig and optional defaultValues
* @throws SchemaValidationError if the schema is invalid
*
* @example
* ```typescript
* const { formConfig, defaultValues } = fromSchema(schema, rilConfig, registry);
* <Form formConfig={formConfig} defaultValues={defaultValues} onSubmit={handleSubmit} />
* ```
*/
declare function fromSchema<C extends Record<string, any>>(schema: FormSchema, config: RilayInstance<C>, registry?: SchemaRegistry): FormSchemaResult<C>;
/**
* Type guard — checks if a value conforms to the FormSchema structure.
*/
declare function isFormSchema(value: unknown): value is FormSchema;
/**
* Validates a form schema structure before processing.
* Throws SchemaValidationError with detailed issues if invalid.
*
* Only checks what the builder does NOT check:
* - Schema structure (id, fields/rows presence)
* - Component existence in ril config
* - Validator type existence (built-in or registry)
* - Parameterized validator required params
* - Effect handler existence in registry
* - Condition operator validity
*
* The builder handles: ID uniqueness, row constraints, bracket validation.
*/
declare function validateSchema<C extends Record<string, any>>(schema: FormSchema, config: RilayInstance<C>, registry?: SchemaRegistry): void;
/**
* Resolves field-level validation descriptors into a FieldValidationConfig.
*/
declare function resolveFieldValidation(validation: FieldSchemaValidation, registry?: SchemaRegistry): FieldValidationConfig;
/**
* Resolves a single validation descriptor into a StandardSchema.
*/
declare function resolveValidationDescriptor(descriptor: ValidationDescriptor, registry?: SchemaRegistry): StandardSchema;
export { type ConditionEvaluationResult, type CustomValidatorFactory, type FieldConfig, type FieldSchemaEffect, type FieldSchemaValidation, Form, FormBody, form as FormBuilder, type FormConfigContextValue, FormField, FormProvider, type FormProviderProps, FormRow, type FormSchema, type FormSchemaField, type FormSchemaFieldRow, type FormSchemaRepeatable, type FormSchemaRepeatableRow, type FormSchemaResult, type FormSchemaRow, type FormSchemaValidationConfig, type FormStore, FormStoreContext, type FormStoreState, FormSubmitButton, RepeatableBuilder, RepeatableField, RepeatableItem, type SchemaEffectHandler, type SchemaIssue, type SchemaRegistry, SchemaValidationError, type UseFieldActionsResult, type UseFieldConditionsLazyOptions, type UseFormActionsResult, type UseFormConditionsProps, type UseFormConditionsReturn, type UseFormMonitoringProps, type UseFormMonitoringReturn, type UseFormSubmissionWithStoreProps, type UseFormValidationWithStoreProps, type UseRepeatableFieldReturn, type ValidationDescriptor, type ValidationDescriptorObject, type ValidationShortcut, createFormStore, flattenRepeatableValues, form, fromSchema, isFormSchema, resolveFieldValidation, resolveValidationDescriptor, structureFormValues, useConditionEvaluation, useConditionEvaluator, useFieldActions, useFieldConditions, useFieldConditionsLazy, useFieldConditionsWithRefresh, useFieldErrors, useFieldProps, useFieldState, useFieldTouched, useFieldValidationState, useFieldValue, useFormActions, useFormConditions, useFormConfigContext, useFormDirty, useFormMonitoring, useFormStore, useFormStoreApi, useFormSubmissionWithStore, useFormSubmitState, useFormSubmitting, useFormValid, useFormValidationWithStore, useFormValues, useMultipleConditionEvaluation, useRepeatableField, useRepeatableKeys, validateSchema };
+1
-1

@@ -1,1 +0,1 @@

'use strict';var Mt=require('react'),core=require('@rilaykit/core'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Mt__default=/*#__PURE__*/_interopDefault(Mt);var W=class{constructor(e){this.innerForm=new T(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let t=this.innerForm.getRows(),i=this.innerForm.getFields();if(t.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let o of i)if(o.id.includes("[")||o.id.includes("]"))throw new Error(`Repeatable template field ID "${o.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:t.map(o=>({...o,kind:"fields"})),allFields:i,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var T=class r{constructor(e,t){this.rows=[];this.idGenerator=new core.IdGenerator;this.config=e,this.formId=t||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,t){return new r(e,t)}createFormField(e){let t=this.config.getComponent(e.type);if(!t)throw new Error(`No component found with type "${e.type}"`);let i;return (t.validation||e.validation)&&(i={validateOnChange:e.validation?.validateOnChange??t.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??t.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??t.validation?.debounceMs,validate:(()=>{let o=t.validation?.validate,s=e.validation?.validate;if(!o)return s;if(!s)return o;let a=Array.isArray(o)?o:[o],n=Array.isArray(s)?s:[s];return [...a,...n]})()}),{id:e.id||this.idGenerator.next("field"),componentId:t.id,props:{...t.defaultProps,...e.props},validation:i,conditions:e.conditions}}createRow(e){if(e.length===0)throw new Error("At least one field is required");if(e.length>3)throw new Error("Maximum 3 fields per row");let t=e.map(i=>this.createFormField(i));return {kind:"fields",id:this.idGenerator.next("row"),fields:t,maxColumns:e.length}}add(...e){let t,i=false;if(e.length===1&&Array.isArray(e[0])?(t=e[0],i=true):t=e,t.length===0)throw new Error("At least one field is required");if(i&&t.length>3)throw new Error("Maximum 3 fields per row");if(t.length===1){let o=this.createRow(t);return this.rows.push(o),this}if(t.length<=3){let o=this.createRow(t);return this.rows.push(o),this}for(let o of t){let s=this.createRow([o]);this.rows.push(s);}return this}addSeparateRows(e){for(let t of e)this.add(t);return this}addRepeatable(e,t){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let i=new W(this.config),o=t(i);if(o._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let s=o._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:s};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);return Object.assign(i,{...t,props:{...i.props,...t.props}}),this}findField(e){for(let t of this.rows)if(t.kind==="fields"){let i=t.fields.find(o=>o.id===e);if(i)return i}else {let i=t.repeatable.allFields.find(o=>o.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>t.kind==="repeatable"?t:{...t,fields:t.fields.filter(i=>i.id!==e)}).filter(t=>t.kind==="repeatable"||t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}setSubmitOptions(e){return this._submitOptions=e,this}addFieldValidation(e,t){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.validation,...t};return this.updateField(e,{validation:o})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.conditions,...t};return this.updateField(e,{conditions:o})}clone(e){let t=new r(this.config,e||`${this.formId}-clone`);return t.rows=core.deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=this.rows.filter(n=>n.kind==="repeatable"),o=i.flatMap(n=>n.repeatable.allFields),s=[...t.map(n=>n.id),...o.map(n=>n.id)];try{core.ensureUnique(s,"field");}catch(n){e.push(n instanceof Error?n.message:String(n));}let a=i.map(n=>n.repeatable.id);try{core.ensureUnique(a,"repeatable");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of t)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for field "${n.id}"`);for(let n of o)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for repeatable template field "${n.id}"`);for(let n of this.rows)n.kind==="fields"&&(n.fields.length>3&&e.push(`Row "${n.id}" has ${n.fields.length} fields, maximum is 3`),n.fields.length===0&&e.push(`Row "${n.id}" is empty`));for(let n of t)(n.id.includes("[")||n.id.includes("]"))&&e.push(`Field ID "${n.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let n of a)(n.includes("[")||n.includes("]"))&&e.push(`Repeatable ID "${n}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let t=this.rows.filter(o=>o.kind==="repeatable"),i=t.length>0?Object.fromEntries(t.map(o=>[o.repeatable.id,o.repeatable])):void 0;return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),repeatableFields:i,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation,submitOptions:this._submitOptions}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(t=>t.kind?t:{...t,kind:"fields"})),this}getStats(){let e=this.getFields(),t=this.rows.filter(s=>s.kind==="fields"),i=this.rows.filter(s=>s.kind==="repeatable"),o=t.map(s=>s.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:t.length>0?e.length/t.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0,totalRepeatables:i.length,totalRepeatableFields:i.reduce((s,a)=>s+a.repeatable.allFields.length,0)}}};function tr(r,e={},t={}){return Mt.useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:r.visible?i(r.visible):t.visible??true,disabled:r.disabled?i(r.disabled):t.disabled??false,required:r.required?i(r.required):t.required??false,readonly:r.readonly?i(r.readonly):t.readonly??false}},[r,e,t])}function Te(r,e={}){return Mt.useMemo(()=>{let t={};for(let[i,o]of Object.entries(r))if(t[i]={visible:true,disabled:false,required:false,readonly:false},o){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(n){return console.warn(`Error evaluating condition for field ${i}:`,n),false}};t[i]={visible:o.visible?s(o.visible):true,disabled:o.disabled?s(o.disabled):false,required:o.required?s(o.required):false,readonly:o.readonly?s(o.readonly):false};}return t},[r,e])}var nt=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function V(r,e,t){return `${r}[${e}].${t}`}function L(r){let e=nt.exec(r);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function re(r,e,t){let i={},o=new Set;for(let[s,a]of Object.entries(t)){if(!e[s])continue;let n=e[s],f=[];for(let p of a){let m={};for(let c of n.allFields){let l=V(s,p,c.id);l in r&&(m[c.id]=r[l],o.add(l));}f.push(m);}i[s]=f;}for(let[s,a]of Object.entries(r))!o.has(s)&&!L(s)&&(i[s]=a);return i}function oe(r,e){let t={},i={},o={};for(let[s,a]of Object.entries(r))if(e[s]&&Array.isArray(a)){let n=[],f=0;for(let p of a){let m=`k${f}`;n.push(m);for(let[c,l]of Object.entries(p))t[V(s,m,c)]=l;f++;}i[s]=n,o[s]=f;}else t[s]=a;return {values:t,order:i,nextKeys:o}}function ue(r={}){return zustand.createStore()(middleware.subscribeWithSelector((e,t)=>({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...r},_fieldConditions:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(i,o)=>{e(s=>({values:{...s.values,[i]:o},isDirty:true}));},_setTouched:i=>{e(o=>({touched:{...o.touched,[i]:true}}));},_setErrors:(i,o)=>{e(s=>{let a={...s.errors,[i]:o},n=o.length>0?"invalid":"valid";return {errors:a,validationStates:{...s.validationStates,[i]:n}}}),t()._updateIsValid();},_clearErrors:i=>{e(o=>{let s={...o.errors};return delete s[i],{errors:s,validationStates:{...o.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,o)=>{e(s=>({validationStates:{...s.validationStates,[i]:o}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let o=i??t()._defaultValues;e({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(i,o)=>{e(s=>({_fieldConditions:{...s._fieldConditions,[i]:o}}));},_updateIsValid:()=>{let i=t(),o=Object.values(i.errors).some(a=>a&&a.length>0),s=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!o&&!s});},_setRepeatableConfig:(i,o)=>{e(s=>({_repeatableConfigs:{...s._repeatableConfigs,[i]:o}}));},_appendRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return null;let n=s._repeatableOrder[i]??[];if(a.max!==void 0&&n.length>=a.max)return null;let f=s._repeatableNextKey[i]??0,p=`k${f}`,m=o??a.defaultValue??{},c={...s.values};for(let l of a.allFields){let d=V(i,p,l.id);c[d]=m[l.id]??void 0;}return e({values:c,isDirty:true,_repeatableOrder:{...s._repeatableOrder,[i]:[...n,p]},_repeatableNextKey:{...s._repeatableNextKey,[i]:f+1}}),p},_removeRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return false;let n=s._repeatableOrder[i]??[];if(a.min!==void 0&&n.length<=a.min||!n.includes(o))return false;let f=n.filter(F=>F!==o),p={...s.values},m={...s.errors},c={...s.validationStates},l={...s.touched},d={...s._fieldConditions};for(let F of a.allFields){let g=V(i,o,F.id);delete p[g],delete m[g],delete c[g],delete l[g],delete d[g];}return e({values:p,errors:m,validationStates:c,touched:l,isDirty:true,_fieldConditions:d,_repeatableOrder:{...s._repeatableOrder,[i]:f}}),t()._updateIsValid(),true},_moveRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableOrder[i];if(!n||o<0||o>=n.length||s<0||s>=n.length||o===s)return;let f=[...n],[p]=f.splice(o,1);f.splice(s,0,p),e({_repeatableOrder:{...a._repeatableOrder,[i]:f}});},_insertRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableConfigs[i];if(!n)return null;let f=a._repeatableOrder[i]??[];if(n.max!==void 0&&f.length>=n.max)return null;let p=a._repeatableNextKey[i]??0,m=`k${p}`,c=s??n.defaultValue??{},l={...a.values};for(let g of n.allFields){let u=V(i,m,g.id);l[u]=c[g.id]??void 0;}let d=[...f],F=Math.max(0,Math.min(o,d.length));return d.splice(F,0,m),e({values:l,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[i]:d},_repeatableNextKey:{...a._repeatableNextKey,[i]:p+1}}),m}})))}var ie=Mt.createContext(null);function S(){let r=Mt.useContext(ie);if(!r)throw new Error("useFormStore must be used within a FormProvider");return r}var De=[];function ce(r){let e=S();return zustand.useStore(e,t=>t.values[r])}function ut(r){let e=S();return zustand.useStore(e,t=>t.errors[r]??De)}function ct(r){let e=S();return zustand.useStore(e,t=>t.touched[r]??false)}function mt(r){let e=S();return zustand.useStore(e,t=>t.validationStates[r]??"idle")}var ft={visible:true,disabled:false,required:false,readonly:false};function U(r){let e=S();return zustand.useStore(e,t=>t._fieldConditions[r]??ft)}function me(r){let e=S(),t=zustand.useStore(e,n=>n.values[r]),i=zustand.useStore(e,n=>n.errors[r]??De),o=zustand.useStore(e,n=>n.validationStates[r]??"idle"),s=zustand.useStore(e,n=>n.touched[r]??false),a=zustand.useStore(e,n=>n._defaultValues[r]);return {value:t,errors:i,validationState:o,touched:s,dirty:t!==a}}function pt(){let r=S();return zustand.useStore(r,e=>e.isSubmitting)}function Ft(){let r=S();return zustand.useStore(r,e=>e.isValid)}function gt(){let r=S();return zustand.useStore(r,e=>e.isDirty)}function bt(){let r=S();return zustand.useStore(r,e=>e.values)}function fe(){let r=S(),e=zustand.useStore(r,o=>o.isSubmitting),t=zustand.useStore(r,o=>o.isValid),i=zustand.useStore(r,o=>o.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}var Ct=[];function pe(r){let e=S();return zustand.useStore(e,t=>t._repeatableOrder[r]??Ct)}function Fe(r){let e=S();return {setValue:t=>e.getState()._setValue(r,t),setTouched:()=>e.getState()._setTouched(r),setErrors:t=>e.getState()._setErrors(r,t),clearErrors:()=>e.getState()._clearErrors(r),setValidationState:t=>e.getState()._setValidationState(r,t)}}function Rt(){let r=S();return {setValue:(e,t)=>r.getState()._setValue(e,t),setTouched:e=>r.getState()._setTouched(e),setErrors:(e,t)=>r.getState()._setErrors(e,t),setSubmitting:e=>r.getState()._setSubmitting(e),reset:e=>r.getState()._reset(e),setFieldConditions:(e,t)=>r.getState()._setFieldConditions(e,t)}}function H(){return S()}var Ae={visible:true,disabled:false,required:false,readonly:false};function Ke(r){try{return JSON.stringify(r)}catch{return String(Date.now())}}function ne(r,e){if(r)try{return typeof r=="object"&&"build"in r?core.evaluateCondition(r.build(),e):core.evaluateCondition(r,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function be(r,e){if(!r)return Ae;let t=ne(r.visible,e),i=ne(r.disabled,e),o=ne(r.required,e),s=ne(r.readonly,e);return {visible:t??true,disabled:i??false,required:o??false,readonly:s??false}}function pr(r,e={}){let{conditions:t,skip:i=false}=e,o=H(),s=U(r),a=Mt.useRef(null);if(i||!t)return s;let n=o.getState().values,f=Ke(n);if(a.current?.valuesHash===f)return a.current.result;let p=be(t,n);return a.current={result:p,valuesHash:f},p}function Fr(){let r=H(),e=Mt.useRef(new Map),t=Mt.useRef("");return Mt.useMemo(()=>function(o,s){if(!s)return Ae;let a=r.getState().values,n=Ke(a);t.current!==n&&(e.current.clear(),t.current=n);let f=e.current.get(o);if(f)return f.result;let p=be(s,a);return e.current.set(o,{result:p,valuesHash:n}),p},[r])}function gr(r,e){let t=H(),i=U(r),o=Mt.useMemo(()=>()=>{if(!e)return i;let s=t.getState().values;return be(e,s)},[t,e,i]);return {conditions:i,refresh:o}}function Y(r,e,t,i){let o={};return r.visible&&(o.visible=G(r.visible,e,t,i)),r.disabled&&(o.disabled=G(r.disabled,e,t,i)),r.required&&(o.required=G(r.required,e,t,i)),r.readonly&&(o.readonly=G(r.readonly,e,t,i)),o}function G(r,e,t,i){let o=r.field&&i.has(r.field)?`${e}[${t}].${r.field}`:r.field,s=r.conditions?.map(a=>G(a,e,t,i));return {...r,field:o,conditions:s}}function Ie({formConfig:r,formValues:e,repeatableOrder:t}){let i=Mt.useMemo(()=>{let c={};for(let l of r.allFields)l.conditions&&(c[l.id]=l.conditions);if(t&&r.repeatableFields)for(let[l,d]of Object.entries(r.repeatableFields)){let F=t[l]??[];if(F.length===0)continue;let g=new Set(d.allFields.map(u=>u.id));for(let u of F)for(let C of d.allFields){if(!C.conditions)continue;let b=V(l,u,C.id);c[b]=Y(C.conditions,l,u,g);}}return c},[r.allFields,r.repeatableFields,t]),o=Mt.useMemo(()=>Object.keys(i).length>0,[i]),s=Te(o?i:{},o?e:{}),a=Mt.useCallback(c=>s[c],[s]),n=Mt.useCallback(c=>{let l=s[c];return l?l.visible:true},[s]),f=Mt.useCallback(c=>{let l=s[c];return l?l.disabled:false},[s]),p=Mt.useCallback(c=>{let l=s[c];return l?l.required:false},[s]),m=Mt.useCallback(c=>{let l=s[c];return l?l.readonly:false},[s]);return Mt.useMemo(()=>({fieldConditions:s,hasConditionalFields:o,getFieldCondition:a,isFieldVisible:n,isFieldDisabled:f,isFieldRequired:p,isFieldReadonly:m}),[s,o,a,n,f,p,m])}function vt(r){return typeof r=="object"&&r!==null&&"preventDefault"in r}function $e({store:r,onSubmit:e,validateForm:t,defaultSubmitOptions:i}){let o=Mt.useRef(e);o.current=e;let s=Mt.useRef(i);return s.current=i,{submit:Mt.useCallback(async n=>{let f={};vt(n)?n.preventDefault():n&&(f=n);let p={...s.current,...f},m=r.getState();if(m.isSubmitting)return false;m._setSubmitting(true);try{if(p.force){let u=r.getState(),b=Object.keys(u._repeatableConfigs).length>0?re(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return o.current&&await o.current(b),m._setSubmitting(!1),!0}let c=await t();if(!c.isValid&&!p.skipInvalid)return m._setSubmitting(!1),!1;let l=r.getState(),d=l.values;if(p.skipInvalid&&!c.isValid){let u=new Set(Object.entries(l.errors).filter(([,C])=>C.length>0).map(([C])=>C));d=Object.fromEntries(Object.entries(d).filter(([C])=>!u.has(C)));}let g=Object.keys(l._repeatableConfigs).length>0?re(d,l._repeatableConfigs,l._repeatableOrder):d;return o.current&&await o.current(g),m._setSubmitting(!1),!0}catch(c){return m._setSubmitting(false),console.error("Form submission error:",c),false}},[r,t])}}function se(){return {isValid:true,errors:[]}}function He({formConfig:r,store:e,conditionsHelpers:t}){let i=Mt.useRef(r),o=Mt.useRef(t);i.current=r,o.current=t;let s=Mt.useCallback(async(n,f)=>{let p=i.current.allFields.find(d=>d.id===n);if(!p){let d=L(n);if(d&&i.current.repeatableFields){let F=i.current.repeatableFields[d.repeatableId];if(F){let g=F.allFields.find(u=>u.id===d.fieldId);g&&(p={...g,id:n});}}}let m=e.getState();if(!p)return se();if(!o.current.isFieldVisible(n))return m._setErrors(n,[]),m._setValidationState(n,"valid"),se();if(!p.validation||!core.hasUnifiedValidation(p.validation)){let d=o.current.isFieldRequired(n),F=f!==void 0?f:m.values[n];if(d&&core.isEmptyValue(F)){let g={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return m._setErrors(n,g.errors),m._setValidationState(n,"invalid"),g}return m._setErrors(n,[]),m._setValidationState(n,"valid"),se()}let c=f!==void 0?f:m.values[n],l=core.createValidationContext({fieldId:n,formId:i.current.id,allFormData:{...m.values,[n]:c}});m._setValidationState(n,"validating");try{let d=await core.validateWithUnifiedConfig(p.validation,c,l);if(o.current.isFieldRequired(n)&&core.isEmptyValue(c)&&!d.errors.some(u=>u.code==="REQUIRED"||u.message.toLowerCase().includes("required"))){let u={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return m._setErrors(n,u.errors),m._setValidationState(n,"invalid"),u}return m._setErrors(n,d.errors),m._setValidationState(n,d.isValid?"valid":"invalid"),d}catch(d){let F={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return m._setErrors(n,F.errors),m._setValidationState(n,"invalid"),F}},[e]),a=Mt.useCallback(async()=>{let n=e.getState(),f=i.current.allFields.filter(u=>{if(!o.current.isFieldVisible(u.id))return false;let b=u.validation&&core.hasUnifiedValidation(u.validation),k=o.current.isFieldRequired(u.id);return b||k}),p=i.current.allFields.filter(u=>!o.current.isFieldVisible(u.id));for(let u of p)n._setErrors(u.id,[]),n._setValidationState(u.id,"valid");let m=await Promise.all(f.map(u=>s(u.id))),c=m.some(u=>!u.isValid),l=i.current.repeatableFields??{},d=[];for(let[u,C]of Object.entries(l)){let b=n._repeatableOrder[u]??[];for(let k of b)for(let P of C.allFields){let O=V(u,k,P.id);if(!o.current.isFieldVisible(O)){n._setErrors(O,[]),n._setValidationState(O,"valid");continue}let D=await s(O);d.push(D);}C.min!==void 0&&b.length<C.min&&d.push({isValid:false,errors:[{message:`At least ${C.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:u}]});}let F=d.some(u=>!u.isValid);c=c||F;let g=se();if(i.current.validation&&core.hasUnifiedValidation(i.current.validation)){let u=Object.keys(n.values).reduce((b,k)=>(o.current.isFieldVisible(k)&&(b[k]=n.values[k]),b),{}),C=core.createValidationContext({formId:i.current.id,allFormData:u});try{g=await core.validateFormWithUnifiedConfig(i.current.validation,u,C);}catch(b){g={isValid:false,errors:[{message:b instanceof Error?b.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!c&&g.isValid,errors:[...m.flatMap(u=>u.errors),...d.flatMap(u=>u.errors),...g.errors]}},[e,s]);return {validateField:s,validateForm:a}}function ve(r){let e=S(),{formConfig:t}=E(),i=pe(r),o=t.repeatableFields?.[r],s=Mt.useMemo(()=>o?new Set(o.allFields.map(l=>l.id)):new Set,[o]),a=Mt.useMemo(()=>o?i.map((l,d)=>{let F=o.allFields.map(u=>{let C=V(r,l,u.id),b=u.conditions?Y(u.conditions,r,l,s):void 0;return {...u,id:C,conditions:b}}),g=o.rows.map(u=>({...u,fields:u.fields.map(C=>{let b=V(r,l,C.id),k=C.conditions?Y(C.conditions,r,l,s):void 0;return {...C,id:b,conditions:k}})}));return {key:l,index:d,rows:g,allFields:F}}):[],[r,i,o,s]),n=Mt.useMemo(()=>o?o.max===void 0?true:i.length<o.max:false,[o,i.length]),f=Mt.useMemo(()=>{if(!o)return false;let l=o.min??0;return i.length>l},[o,i.length]),p=Mt.useCallback(l=>{e.getState()._appendRepeatableItem(r,l);},[e,r]),m=Mt.useCallback(l=>{e.getState()._removeRepeatableItem(r,l);},[e,r]),c=Mt.useCallback((l,d)=>{e.getState()._moveRepeatableItem(r,l,d);},[e,r]);return {items:a,append:p,remove:m,move:c,canAdd:n,canRemove:f,count:i.length}}function xt({formConfig:r,enabled:e=true}){let t=core.getGlobalMonitor(),i=Mt.useRef(null),o=Mt.useRef(0),s=Mt.useRef(0);Mt.useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=Mt.useCallback(l=>{if(!t||!e)return;o.current++;let d={formId:r.id,fieldCount:r.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:l||o.current};t.track("component_render",`form_${r.id}`,{formId:r.id,fieldCount:r.allFields.length,renderCount:o.current},d,"low");},[t,e,r.id,r.allFields.length]),n=Mt.useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_validation_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:F?.duration||0,validationErrors:l,renderCount:o.current};t.track("form_validation",`form_${r.id}`,{formId:r.id,validationErrors:l,fieldCount:d||r.allFields.length},g,l>0?"medium":"low");},[t,e,r.id,r.allFields.length]),f=Mt.useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_submission_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:0,validationErrors:l?0:1,renderCount:o.current};t.track("form_submission",`form_${r.id}`,{formId:r.id,success:l,fieldCount:d||r.allFields.length,fieldChanges:s.current},g,l?"low":"high");},[t,e,r.id,r.allFields.length]),p=Mt.useCallback((l,d)=>{!t||!e||(s.current++,t.track("component_update",`field_${l}`,{formId:r.id,fieldId:l,componentType:d,changeCount:s.current},void 0,"low"));},[t,e,r.id]),m=Mt.useCallback(l=>{!i.current||!e||i.current.start(l,{formId:r.id,renderCount:o.current});},[e,r.id]),c=Mt.useCallback(l=>{if(!i.current||!e)return null;let d=i.current.end(l);return d?{...d,formId:r.id,fieldCount:r.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,r.id,r.allFields.length]);return {trackFormRender:a,trackFormValidation:n,trackFormSubmission:f,trackFieldChange:p,startPerformanceTracking:m,endPerformanceTracking:c}}var ze=Mt.createContext(null);function E(){let r=Mt.useContext(ze);if(!r)throw new Error("useFormConfigContext must be used within a FormProvider");return r}function _e({children:r,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:o,className:s}){let[a]=Mt.useState(()=>{let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(v=>Array.isArray(t[v]))){let v=oe(t,x);R=v.values,h=v.order,y=v.nextKeys;}for(let[v,B]of Object.entries(x))if(!h[v]){let Z=B.min??0,K=[],I=y[v]??0;for(let N=0;N<Z;N++){let j=`k${I}`;K.push(j);for(let ee of B.allFields){let rt=V(v,j,ee.id);R[rt]=B.defaultValue?.[ee.id]??void 0;}I++;}h[v]=K,y[v]=I;}let M=ue(R),_=M.getState();for(let[v,B]of Object.entries(x))_._setRepeatableConfig(v,B);return M.setState({_repeatableOrder:h,_repeatableNextKey:y}),M}),n=Mt.useRef(e.id),f=Mt.useRef(o);f.current=o,Mt.useEffect(()=>f.current?a.subscribe(R=>R.values,(R,h)=>{for(let y of Object.keys(R))R[y]!==h[y]&&f.current?.(y,R[y],R);}):void 0,[a]),Mt.useEffect(()=>{if(n.current!==e.id){n.current=e.id;let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(_=>Array.isArray(t[_]))){let _=oe(t,x);R=_.values,h=_.order,y=_.nextKeys;}for(let[_,v]of Object.entries(x))if(!h[_]){let B=v.min??0,Z=[],K=y[_]??0;for(let I=0;I<B;I++){let N=`k${K}`;Z.push(N);for(let j of v.allFields){let ee=V(_,N,j.id);R[ee]=v.defaultValue?.[j.id]??void 0;}K++;}h[_]=Z,y[_]=K;}a.getState()._reset(R);let M=a.getState();for(let[_,v]of Object.entries(x))M._setRepeatableConfig(_,v);a.setState({_repeatableOrder:h,_repeatableNextKey:y});}},[e.id,e.repeatableFields,a,t]);let[p,m]=Mt.useState(()=>a.getState().values);Mt.useEffect(()=>a.subscribe(R=>R.values,R=>m(R)),[a]);let[c,l]=Mt.useState(()=>a.getState()._repeatableOrder);Mt.useEffect(()=>a.subscribe(R=>R._repeatableOrder,R=>l(R)),[a]);let{fieldConditions:d,hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}=Ie({formConfig:e,formValues:p,repeatableOrder:c});Mt.useEffect(()=>{for(let[x,R]of Object.entries(d)){let h={visible:R.visible,disabled:R.disabled,required:R.required,readonly:R.readonly};a.getState()._setFieldConditions(x,h);}},[d,a]);let P=Mt.useMemo(()=>({hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}),[F,g,u,C,b,k]),{validateField:O,validateForm:D}=He({formConfig:e,store:a,conditionsHelpers:P}),{submit:q}=$e({store:a,onSubmit:i,validateForm:D,defaultSubmitOptions:e.submitOptions}),X=Mt.useMemo(()=>({formConfig:e,conditionsHelpers:P,validateField:O,validateForm:D,submit:q}),[e,P,O,D,q]);return jsxRuntime.jsx(ie.Provider,{value:a,children:jsxRuntime.jsx(ze.Provider,{value:X,children:jsxRuntime.jsx("form",{onSubmit:q,className:s,noValidate:true,children:r})})})}function Ot({formConfig:r,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s}){let a=Mt.useMemo(()=>r instanceof T?r.build():r,[r]);return jsxRuntime.jsx(_e,{formConfig:a,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s})}var Q=Mt__default.default.memo(function({fieldId:e,fieldConfig:t,disabled:i=false,customProps:o={},className:s,forceVisible:a=false}){let{formConfig:n,validateField:f,conditionsHelpers:p}=E(),m=ce(e),c=me(e),l=U(e),{setValue:d,setTouched:F}=Fe(e),g=Mt.useMemo(()=>{if(t)return t;let h=n.allFields.find(A=>A.id===e);if(h)return h;let y=L(e);if(y&&n.repeatableFields){let A=n.repeatableFields[y.repeatableId];if(A){let M=A.allFields.find(_=>_.id===y.fieldId);if(M)return {...M,id:e}}}},[t,n.allFields,n.repeatableFields,e]);if(!g)throw new Error(`Field with ID "${e}" not found`);let u=n.config.getComponent(g.componentId);if(!u)throw new Error(`Component with ID "${g.componentId}" not found`);let C=c.validationState==="validating",b=Mt.useMemo(()=>({isVisible:a||l.visible,isFieldDisabled:i||l.disabled,isFieldRequired:l.required||p.isFieldRequired(e),isFieldReadonly:l.readonly}),[a,i,l,p,e]),k=Mt.useCallback(async h=>{d(h),(g.validation?.validateOnChange||c.touched)&&await f(e,h);},[e,d,f,g.validation?.validateOnChange,c.touched]),P=Mt.useCallback(async()=>{c.touched||F(),g.validation?.validateOnBlur!==false&&await f(e);},[e,c.touched,F,f,g.validation?.validateOnBlur]),O=Mt.useMemo(()=>({...u.defaultProps??{},...g.props,...o,disabled:b.isFieldDisabled,required:b.isFieldRequired,readOnly:b.isFieldReadonly}),[u.defaultProps,g.props,o,b.isFieldDisabled,b.isFieldRequired,b.isFieldReadonly]),D=Mt.useMemo(()=>({id:e,props:O,value:m,onChange:k,onBlur:P,disabled:b.isFieldDisabled,error:c.errors,isValidating:C,touched:c.touched}),[e,O,m,k,P,b.isFieldDisabled,c.errors,C,c.touched]);if(!b.isVisible)return null;let q=u.renderer(D),X=n.renderConfig?.fieldRenderer,x=u.useFieldRenderer!==false,R=X&&x?X({children:q,id:e,...O,error:c.errors,isValidating:C,touched:c.touched}):q;return jsxRuntime.jsx("div",{className:s,"data-field-id":e,"data-field-type":u.type,"data-field-visible":b.isVisible,"data-field-disabled":b.isFieldDisabled,"data-field-required":b.isFieldRequired,"data-field-readonly":b.isFieldReadonly,children:R})});var Xe=Mt__default.default.memo(function({row:e,className:t,...i}){let{formConfig:o,conditionsHelpers:s}=E(),a=Mt.useMemo(()=>e.fields.filter(p=>s.isFieldVisible(p.id)),[e.fields,s]),n=Mt.useMemo(()=>a.map(p=>jsxRuntime.jsx(Q,{fieldId:p.id},p.id)),[a]),f=Mt.useMemo(()=>({row:e,children:n,className:t}),[e,n,t]);return a.length===0?null:jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormRow",renderer:o.renderConfig?.rowRenderer,props:f,...i,children:n})}),de=Xe;var ke=Mt__default.default.memo(function({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p}){let{formConfig:m}=E(),c=Mt.useMemo(()=>new Map(e.allFields.map(F=>[F.id,F])),[e.allFields]),l=Mt.useMemo(()=>e.rows.map(F=>jsxRuntime.jsx(de,{row:F,children:F.fields.map(g=>jsxRuntime.jsx(Q,{fieldId:g.id,fieldConfig:c.get(g.id)},g.id))},F.id)),[e.rows,c]),d=m.renderConfig?.repeatableItemRenderer;return d?d({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p,children:l}):jsxRuntime.jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":t,children:l})});var Ee=Mt__default.default.memo(function({repeatableId:e,repeatableConfig:t,className:i}){let{formConfig:o}=E(),{items:s,append:a,remove:n,move:f,canAdd:p,canRemove:m}=ve(e),c=Mt.useMemo(()=>s.map((d,F)=>jsxRuntime.jsx(ke,{item:d,index:F,total:s.length,canRemove:m,canMoveUp:F>0,canMoveDown:F<s.length-1,onRemove:()=>n(d.key),onMoveUp:()=>f(F,F-1),onMoveDown:()=>f(F,F+1)},d.key)),[s,m,n,f]),l=o.renderConfig?.repeatableRenderer;return l?l({repeatableId:e,items:s,canAdd:p,canRemove:m,onAdd:()=>a(),min:t.min,max:t.max,children:c}):jsxRuntime.jsxs("div",{className:i,"data-repeatable-id":e,children:[c,p&&jsxRuntime.jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var Nt=Mt__default.default.memo(function({className:e,...t}){let{formConfig:i}=E(),o=Mt.useMemo(()=>i.rows.map(a=>a.kind==="repeatable"?jsxRuntime.jsx(Ee,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsxRuntime.jsx(de,{row:a},a.id)),[i.rows]),s=Mt.useMemo(()=>({formConfig:i,children:o,className:e}),[i,o,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:s,...t,children:o})});var Ht=Mt__default.default.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:o,submit:s}=E(),{isSubmitting:a}=fe(),n=Mt.useMemo(()=>({isSubmitting:t??a,onSubmit:s,className:e}),[t,a,s,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormSubmitButton",renderer:o.renderConfig?.submitButtonRenderer,props:n,...i})});exports.Form=Ot;exports.FormBody=Nt;exports.FormBuilder=T;exports.FormField=Q;exports.FormProvider=_e;exports.FormRow=Xe;exports.FormStoreContext=ie;exports.FormSubmitButton=Ht;exports.RepeatableBuilder=W;exports.RepeatableField=Ee;exports.RepeatableItem=ke;exports.createFormStore=ue;exports.flattenRepeatableValues=oe;exports.form=T;exports.structureFormValues=re;exports.useConditionEvaluation=tr;exports.useConditionEvaluator=Fr;exports.useFieldActions=Fe;exports.useFieldConditions=U;exports.useFieldConditionsLazy=pr;exports.useFieldConditionsWithRefresh=gr;exports.useFieldErrors=ut;exports.useFieldState=me;exports.useFieldTouched=ct;exports.useFieldValidationState=mt;exports.useFieldValue=ce;exports.useFormActions=Rt;exports.useFormConditions=Ie;exports.useFormConfigContext=E;exports.useFormDirty=gt;exports.useFormMonitoring=xt;exports.useFormStore=S;exports.useFormStoreApi=H;exports.useFormSubmissionWithStore=$e;exports.useFormSubmitState=fe;exports.useFormSubmitting=pt;exports.useFormValid=Ft;exports.useFormValidationWithStore=He;exports.useFormValues=bt;exports.useMultipleConditionEvaluation=Te;exports.useRepeatableField=ve;exports.useRepeatableKeys=pe;
'use strict';var zt=require('react'),core=require('@rilaykit/core'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var zt__default=/*#__PURE__*/_interopDefault(zt);var G=class{constructor(e){this.innerForm=new P(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let r=this.innerForm.getRows(),o=this.innerForm.getFields();if(r.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let i of o)if(i.id.includes("[")||i.id.includes("]"))throw new Error(`Repeatable template field ID "${i.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:r.map(i=>({...i,kind:"fields"})),allFields:o,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var P=class t{constructor(e,r){this.rows=[];this.idGenerator=new core.IdGenerator;this.config=e,this.formId=r||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,r){return new t(e,r)}createFormField(e){let r=this.config.getComponent(e.type);if(!r)throw new Error(`No component found with type "${e.type}"`);let o;return (r.validation||e.validation)&&(o={validateOnChange:e.validation?.validateOnChange??r.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??r.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??r.validation?.debounceMs,validate:(()=>{let i=r.validation?.validate,n=e.validation?.validate;if(!i)return n;if(!n)return i;let a=Array.isArray(i)?i:[i],s=Array.isArray(n)?n:[n];return [...a,...s]})()}),{id:e.id||this.idGenerator.next("field"),componentId:r.id,props:{...r.defaultProps,...e.props},validation:o,conditions:e.conditions,effects:e.effects}}createRow(e){if(e.length===0)throw new Error("At least one field is required");let r=e.map(o=>this.createFormField(o));return {kind:"fields",id:this.idGenerator.next("row"),fields:r,maxColumns:e.length}}add(...e){let r=e.length===1&&Array.isArray(e[0])?e[0]:e;if(r.length===0)throw new Error("At least one field is required");let o=this.createRow(r);return this.rows.push(o),this}addSeparateRows(e){for(let r of e)this.add(r);return this}addRepeatable(e,r){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let o=new G(this.config),i=r(o);if(i._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let n=i._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:n};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,r){let o=this.findField(e);if(!o)throw new Error(`Field with ID "${e}" not found`);return Object.assign(o,{...r,props:{...o.props,...r.props}}),this}findField(e){for(let r of this.rows)if(r.kind==="fields"){let o=r.fields.find(i=>i.id===e);if(o)return o}else {let o=r.repeatable.allFields.find(i=>i.id===e);if(o)return o}return null}removeField(e){return this.rows=this.rows.map(r=>r.kind==="repeatable"?r:{...r,fields:r.fields.filter(o=>o.id!==e)}).filter(r=>r.kind==="repeatable"||r.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}setSubmitOptions(e){return this._submitOptions=e,this}addFieldValidation(e,r){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let o=this.findField(e);if(!o)throw new Error(`Field with ID "${e}" not found`);let i={...o.validation,...r};return this.updateField(e,{validation:i})}addFieldConditions(e,r){let o=this.findField(e);if(!o)throw new Error(`Field with ID "${e}" not found`);let i={...o.conditions,...r};return this.updateField(e,{conditions:i})}clone(e){let r=new t(this.config,e||`${this.formId}-clone`);return r.rows=core.deepClone(this.rows),r}validate(){let e=[],r=this.getFields(),o=this.rows.filter(s=>s.kind==="repeatable"),i=o.flatMap(s=>s.repeatable.allFields),n=[...r.map(s=>s.id),...i.map(s=>s.id)];try{core.ensureUnique(n,"field");}catch(s){e.push(s instanceof Error?s.message:String(s));}let a=o.map(s=>s.repeatable.id);try{core.ensureUnique(a,"repeatable");}catch(s){e.push(s instanceof Error?s.message:String(s));}for(let s of r)this.config.hasComponent(s.componentId)||e.push(`Component "${s.componentId}" not found for field "${s.id}"`);for(let s of i)this.config.hasComponent(s.componentId)||e.push(`Component "${s.componentId}" not found for repeatable template field "${s.id}"`);for(let s of this.rows)s.kind==="fields"&&s.fields.length===0&&e.push(`Row "${s.id}" is empty`);for(let s of r)(s.id.includes("[")||s.id.includes("]"))&&e.push(`Field ID "${s.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let s of a)(s.includes("[")||s.includes("]"))&&e.push(`Repeatable ID "${s}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let r=this.rows.filter(a=>a.kind==="repeatable"),o=r.length>0?Object.fromEntries(r.map(a=>[a.repeatable.id,a.repeatable])):void 0,i=this.getFields(),n={};for(let a of i)if(a.effects)for(let s of a.effects){let l=s.watchFieldId;n[l]||(n[l]=[]),n[l].push(s);}if(o){for(let a of Object.values(o))for(let s of a.allFields)if(s.effects)for(let l of s.effects)n[l.watchFieldId]||(n[l.watchFieldId]=[]),n[l.watchFieldId].push(l);}return {id:this.formId,rows:[...this.rows],allFields:i,repeatableFields:o,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation,submitOptions:this._submitOptions,effectsMap:Object.keys(n).length>0?n:void 0}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(r=>r.kind?r:{...r,kind:"fields"})),this}getStats(){let e=this.getFields(),r=this.rows.filter(n=>n.kind==="fields"),o=this.rows.filter(n=>n.kind==="repeatable"),i=r.map(n=>n.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:r.length>0?e.length/r.length:0,maxFieldsInRow:i.length>0?Math.max(...i):0,minFieldsInRow:i.length>0?Math.min(...i):0,totalRepeatables:o.length,totalRepeatableFields:o.reduce((n,a)=>n+a.repeatable.allFields.length,0)}}};var oe=class{constructor({effectsMap:e,store:r}){this.unsubscribe=null;this.abortControllers=new Map;this.processingFields=new Set;this.cascadeDepth=0;this.stopped=false;this.effectsMap=e,this.store=r;}start(){this.stopped=false,this.unsubscribe=this.store.subscribe(e=>e.values,(e,r)=>{if(!this.stopped)for(let o of Object.keys(e))e[o]!==r[o]&&this.executeEffectsForField(o,e[o]);});}runInitialEffects(){if(this.stopped)return;let e=this.store.getState().values;for(let r of Object.keys(this.effectsMap)){let o=e[r];o!==void 0&&this.executeEffectsForField(r,o);}}stop(){this.stopped=true,this.unsubscribe?.(),this.unsubscribe=null;for(let e of this.abortControllers.values())e.abort();this.abortControllers.clear(),this.processingFields.clear(),this.cascadeDepth=0;}executeEffectsForField(e,r){let o=this.effectsMap[e];if(!o||o.length===0)return;if(this.cascadeDepth>=10){console.warn(`[EffectEngine] Max cascade depth (10) reached for field "${e}". Stopping cascade.`);return}if(this.processingFields.has(e)){console.warn(`[EffectEngine] Cycle detected: field "${e}" is already being processed. Skipping.`);return}let i=this.abortControllers.get(e);i&&i.abort();let n=new AbortController;this.abortControllers.set(e,n);let a={setValue:(s,l)=>{n.signal.aborted||this.stopped||this.store.getState()._setValue(s,l);},setProps:(s,l)=>{n.signal.aborted||this.stopped||this.store.getState()._setFieldProps(s,l);},getValues:()=>this.store.getState().values,getFieldValue:s=>this.store.getState().values[s]};this.processingFields.add(e),this.cascadeDepth++;try{let s=[];for(let l of o){if(n.signal.aborted||this.stopped)break;try{let c=l.handler(r,a);c instanceof Promise&&s.push(c.catch(p=>{p?.name!=="AbortError"&&console.warn(`[EffectEngine] Async effect error for field "${e}":`,p);}));}catch(c){console.warn(`[EffectEngine] Sync effect error for field "${e}":`,c);}}s.length>0?Promise.allSettled(s).then(()=>{this.abortControllers.get(e)===n&&this.abortControllers.delete(e);}):this.abortControllers.delete(e);}finally{this.processingFields.delete(e),this.cascadeDepth--;}}};function qr(t,e={},r={}){return zt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let o=i=>{try{return i&&typeof i=="object"&&"build"in i?core.evaluateCondition(i.build(),e):core.evaluateCondition(i,e)}catch(n){return console.warn("Error evaluating condition:",n),false}};return {visible:t.visible?o(t.visible):r.visible??true,disabled:t.disabled?o(t.disabled):r.disabled??false,required:t.required?o(t.required):r.required??false,readonly:t.readonly?o(t.readonly):r.readonly??false}},[t,e,r])}function Le(t,e={}){return zt.useMemo(()=>{let r={};for(let[o,i]of Object.entries(t))if(r[o]={visible:true,disabled:false,required:false,readonly:false},i){let n=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(s){return console.warn(`Error evaluating condition for field ${o}:`,s),false}};r[o]={visible:i.visible?n(i.visible):true,disabled:i.disabled?n(i.disabled):false,required:i.required?n(i.required):false,readonly:i.readonly?n(i.readonly):false};}return r},[t,e])}var vt=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function k(t,e,r){return `${t}[${e}].${r}`}function Y(t){let e=vt.exec(t);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function ne(t,e,r){let o={},i=new Set;for(let[n,a]of Object.entries(r)){if(!e[n])continue;let s=e[n],l=[];for(let c of a){let p={};for(let m of s.allFields){let d=k(n,c,m.id);d in t&&(p[m.id]=t[d],i.add(d));}l.push(p);}o[n]=l;}for(let[n,a]of Object.entries(t))!i.has(n)&&!Y(n)&&(o[n]=a);return o}function se(t,e){let r={},o={},i={};for(let[n,a]of Object.entries(t))if(e[n]&&Array.isArray(a)){let s=[],l=0;for(let c of a){let p=`k${l}`;s.push(p);for(let[m,d]of Object.entries(c))r[k(n,p,m)]=d;l++;}o[n]=s,i[n]=l;}else r[n]=a;return {values:r,order:o,nextKeys:i}}function me(t={}){return zustand.createStore()(middleware.subscribeWithSelector((e,r)=>({values:{...t},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...t},_fieldConditions:{},_fieldProps:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(o,i)=>{e(n=>({values:{...n.values,[o]:i},isDirty:true}));},_setTouched:o=>{e(i=>({touched:{...i.touched,[o]:true}}));},_setErrors:(o,i)=>{e(n=>{let a={...n.errors,[o]:i},s=i.length>0?"invalid":"valid";return {errors:a,validationStates:{...n.validationStates,[o]:s}}}),r()._updateIsValid();},_clearErrors:o=>{e(i=>{let n={...i.errors};return delete n[o],{errors:n,validationStates:{...i.validationStates,[o]:"idle"}}}),r()._updateIsValid();},_setValidationState:(o,i)=>{e(n=>({validationStates:{...n.validationStates,[o]:i}}));},_setSubmitting:o=>{e({isSubmitting:o});},_reset:o=>{let i=o??r()._defaultValues;e({values:{...i},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_fieldProps:{},_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(o,i)=>{e(n=>({_fieldConditions:{...n._fieldConditions,[o]:i}}));},_setFieldProps:(o,i)=>{e(n=>({_fieldProps:{...n._fieldProps,[o]:{...n._fieldProps[o]??{},...i}}}));},_updateIsValid:()=>{let o=r(),i=Object.values(o.errors).some(a=>a&&a.length>0),n=Object.values(o.validationStates).some(a=>a==="invalid");e({isValid:!i&&!n});},_setRepeatableConfig:(o,i)=>{e(n=>({_repeatableConfigs:{...n._repeatableConfigs,[o]:i}}));},_appendRepeatableItem:(o,i)=>{let n=r(),a=n._repeatableConfigs[o];if(!a)return null;let s=n._repeatableOrder[o]??[];if(a.max!==void 0&&s.length>=a.max)return null;let l=n._repeatableNextKey[o]??0,c=`k${l}`,p=i??a.defaultValue??{},m={...n.values};for(let d of a.allFields){let f=k(o,c,d.id);m[f]=p[d.id]??void 0;}return e({values:m,isDirty:true,_repeatableOrder:{...n._repeatableOrder,[o]:[...s,c]},_repeatableNextKey:{...n._repeatableNextKey,[o]:l+1}}),c},_removeRepeatableItem:(o,i)=>{let n=r(),a=n._repeatableConfigs[o];if(!a)return false;let s=n._repeatableOrder[o]??[];if(a.min!==void 0&&s.length<=a.min||!s.includes(i))return false;let l=s.filter(g=>g!==i),c={...n.values},p={...n.errors},m={...n.validationStates},d={...n.touched},f={...n._fieldConditions};for(let g of a.allFields){let F=k(o,i,g.id);delete c[F],delete p[F],delete m[F],delete d[F],delete f[F];}return e({values:c,errors:p,validationStates:m,touched:d,isDirty:true,_fieldConditions:f,_repeatableOrder:{...n._repeatableOrder,[o]:l}}),r()._updateIsValid(),true},_moveRepeatableItem:(o,i,n)=>{let a=r(),s=a._repeatableOrder[o];if(!s||i<0||i>=s.length||n<0||n>=s.length||i===n)return;let l=[...s],[c]=l.splice(i,1);l.splice(n,0,c),e({_repeatableOrder:{...a._repeatableOrder,[o]:l}});},_insertRepeatableItem:(o,i,n)=>{let a=r(),s=a._repeatableConfigs[o];if(!s)return null;let l=a._repeatableOrder[o]??[];if(s.max!==void 0&&l.length>=s.max)return null;let c=a._repeatableNextKey[o]??0,p=`k${c}`,m=n??s.defaultValue??{},d={...a.values};for(let F of s.allFields){let u=k(o,p,F.id);d[u]=m[F.id]??void 0;}let f=[...l],g=Math.max(0,Math.min(i,f.length));return f.splice(g,0,p),e({values:d,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[o]:f},_repeatableNextKey:{...a._repeatableNextKey,[o]:c+1}}),p}})))}var ae=zt.createContext(null);function x(){let t=zt.useContext(ae);if(!t)throw new Error("useFormStore must be used within a FormProvider");return t}var He=[];function pe(t){let e=x();return zustand.useStore(e,r=>r.values[t])}function Vt(t){let e=x();return zustand.useStore(e,r=>r.errors[t]??He)}function _t(t){let e=x();return zustand.useStore(e,r=>r.touched[t]??false)}function kt(t){let e=x();return zustand.useStore(e,r=>r.validationStates[t]??"idle")}var Et={visible:true,disabled:false,required:false,readonly:false};function U(t){let e=x();return zustand.useStore(e,r=>r._fieldConditions[t]??Et)}var Ot={};function ge(t){let e=x();return zustand.useStore(e,r=>r._fieldProps[t]??Ot)}function Fe(t){let e=x(),r=zustand.useStore(e,s=>s.values[t]),o=zustand.useStore(e,s=>s.errors[t]??He),i=zustand.useStore(e,s=>s.validationStates[t]??"idle"),n=zustand.useStore(e,s=>s.touched[t]??false),a=zustand.useStore(e,s=>s._defaultValues[t]);return {value:r,errors:o,validationState:i,touched:n,dirty:r!==a}}function Pt(){let t=x();return zustand.useStore(t,e=>e.isSubmitting)}function $t(){let t=x();return zustand.useStore(t,e=>e.isValid)}function Dt(){let t=x();return zustand.useStore(t,e=>e.isDirty)}function Mt(){let t=x();return zustand.useStore(t,e=>e.values)}function he(){let t=x(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isValid),o=zustand.useStore(t,i=>i.isDirty);return {isSubmitting:e,isValid:r,isDirty:o}}var At=[];function be(t){let e=x();return zustand.useStore(e,r=>r._repeatableOrder[t]??At)}function ye(t){let e=x();return {setValue:r=>e.getState()._setValue(t,r),setTouched:()=>e.getState()._setTouched(t),setErrors:r=>e.getState()._setErrors(t,r),clearErrors:()=>e.getState()._clearErrors(t),setValidationState:r=>e.getState()._setValidationState(t,r)}}function It(){let t=x();return {setValue:(e,r)=>t.getState()._setValue(e,r),setTouched:e=>t.getState()._setTouched(e),setErrors:(e,r)=>t.getState()._setErrors(e,r),setSubmitting:e=>t.getState()._setSubmitting(e),reset:e=>t.getState()._reset(e),setFieldConditions:(e,r)=>t.getState()._setFieldConditions(e,r)}}function z(){return x()}var Ye={visible:true,disabled:false,required:false,readonly:false};function ze(t){try{return JSON.stringify(t)}catch{return String(Date.now())}}function le(t,e){if(t)try{return typeof t=="object"&&"build"in t?core.evaluateCondition(t.build(),e):core.evaluateCondition(t,e)}catch(r){console.warn("Error evaluating condition:",r);return}}function ve(t,e){if(!t)return Ye;let r=le(t.visible,e),o=le(t.disabled,e),i=le(t.required,e),n=le(t.readonly,e);return {visible:r??true,disabled:o??false,required:i??false,readonly:n??false}}function Qr(t,e={}){let{conditions:r,skip:o=false}=e,i=z(),n=U(t),a=zt.useRef(null);if(o||!r)return n;let s=i.getState().values,l=ze(s);if(a.current?.valuesHash===l)return a.current.result;let c=ve(r,s);return a.current={result:c,valuesHash:l},c}function Zr(){let t=z(),e=zt.useRef(new Map),r=zt.useRef("");return zt.useMemo(()=>function(i,n){if(!n)return Ye;let a=t.getState().values,s=ze(a);r.current!==s&&(e.current.clear(),r.current=s);let l=e.current.get(i);if(l)return l.result;let c=ve(n,a);return e.current.set(i,{result:c,valuesHash:s}),c},[t])}function eo(t,e){let r=z(),o=U(t),i=zt.useMemo(()=>()=>{if(!e)return o;let n=r.getState().values;return ve(e,n)},[r,e,o]);return {conditions:o,refresh:i}}function J(t,e,r,o){let i={};return t.visible&&(i.visible=X(t.visible,e,r,o)),t.disabled&&(i.disabled=X(t.disabled,e,r,o)),t.required&&(i.required=X(t.required,e,r,o)),t.readonly&&(i.readonly=X(t.readonly,e,r,o)),i}function X(t,e,r,o){let i=t.field&&o.has(t.field)?`${e}[${r}].${t.field}`:t.field,n=t.conditions?.map(a=>X(a,e,r,o));return {...t,field:i,conditions:n}}function Xe({formConfig:t,formValues:e,repeatableOrder:r}){let o=zt.useMemo(()=>{let m={};for(let d of t.allFields)d.conditions&&(m[d.id]=d.conditions);if(r&&t.repeatableFields)for(let[d,f]of Object.entries(t.repeatableFields)){let g=r[d]??[];if(g.length===0)continue;let F=new Set(f.allFields.map(u=>u.id));for(let u of g)for(let h of f.allFields){if(!h.conditions)continue;let R=k(d,u,h.id);m[R]=J(h.conditions,d,u,F);}}return m},[t.allFields,t.repeatableFields,r]),i=zt.useMemo(()=>Object.keys(o).length>0,[o]),n=Le(i?o:{},i?e:{}),a=zt.useCallback(m=>n[m],[n]),s=zt.useCallback(m=>{let d=n[m];return d?d.visible:true},[n]),l=zt.useCallback(m=>{let d=n[m];return d?d.disabled:false},[n]),c=zt.useCallback(m=>{let d=n[m];return d?d.required:false},[n]),p=zt.useCallback(m=>{let d=n[m];return d?d.readonly:false},[n]);return zt.useMemo(()=>({fieldConditions:n,hasConditionalFields:i,getFieldCondition:a,isFieldVisible:s,isFieldDisabled:l,isFieldRequired:c,isFieldReadonly:p}),[n,i,a,s,l,c,p])}function Bt(t){return typeof t=="object"&&t!==null&&"preventDefault"in t}function Qe({store:t,onSubmit:e,validateForm:r,defaultSubmitOptions:o}){let i=zt.useRef(e);i.current=e;let n=zt.useRef(o);return n.current=o,{submit:zt.useCallback(async s=>{let l={};Bt(s)?s.preventDefault():s&&(l=s);let c={...n.current,...l},p=t.getState();if(p.isSubmitting)return false;p._setSubmitting(true);try{if(c.force){let u=t.getState(),R=Object.keys(u._repeatableConfigs).length>0?ne(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return i.current&&await i.current(R),p._setSubmitting(!1),!0}let m=await r();if(!m.isValid&&!c.skipInvalid)return p._setSubmitting(!1),!1;let d=t.getState(),f=d.values;if(c.skipInvalid&&!m.isValid){let u=new Set(Object.entries(d.errors).filter(([,h])=>h.length>0).map(([h])=>h));f=Object.fromEntries(Object.entries(f).filter(([h])=>!u.has(h)));}let F=Object.keys(d._repeatableConfigs).length>0?ne(f,d._repeatableConfigs,d._repeatableOrder):f;return i.current&&await i.current(F),p._setSubmitting(!1),!0}catch(m){return p._setSubmitting(false),console.error("Form submission error:",m),false}},[t,r])}}function de(){return {isValid:true,errors:[]}}function ot({formConfig:t,store:e,conditionsHelpers:r}){let o=zt.useRef(t),i=zt.useRef(r);o.current=t,i.current=r;let n=zt.useCallback(async(s,l)=>{let c=o.current.allFields.find(f=>f.id===s);if(!c){let f=Y(s);if(f&&o.current.repeatableFields){let g=o.current.repeatableFields[f.repeatableId];if(g){let F=g.allFields.find(u=>u.id===f.fieldId);F&&(c={...F,id:s});}}}let p=e.getState();if(!c)return de();if(!i.current.isFieldVisible(s))return p._setErrors(s,[]),p._setValidationState(s,"valid"),de();if(!c.validation||!core.hasUnifiedValidation(c.validation)){let f=i.current.isFieldRequired(s),g=l!==void 0?l:p.values[s];if(f&&core.isEmptyValue(g)){let F={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return p._setErrors(s,F.errors),p._setValidationState(s,"invalid"),F}return p._setErrors(s,[]),p._setValidationState(s,"valid"),de()}let m=l!==void 0?l:p.values[s],d=core.createValidationContext({fieldId:s,formId:o.current.id,allFormData:{...p.values,[s]:m}});p._setValidationState(s,"validating");try{let f=await core.validateWithUnifiedConfig(c.validation,m,d);if(i.current.isFieldRequired(s)&&core.isEmptyValue(m)&&!f.errors.some(u=>u.code==="REQUIRED"||u.message.toLowerCase().includes("required"))){let u={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...f.errors]};return p._setErrors(s,u.errors),p._setValidationState(s,"invalid"),u}return p._setErrors(s,f.errors),p._setValidationState(s,f.isValid?"valid":"invalid"),f}catch(f){let g={isValid:false,errors:[{message:f instanceof Error?f.message:"Validation failed",code:"VALIDATION_ERROR"}]};return p._setErrors(s,g.errors),p._setValidationState(s,"invalid"),g}},[e]),a=zt.useCallback(async()=>{let s=e.getState(),l=o.current.allFields.filter(u=>{if(!i.current.isFieldVisible(u.id))return false;let R=u.validation&&core.hasUnifiedValidation(u.validation),y=i.current.isFieldRequired(u.id);return R||y}),c=o.current.allFields.filter(u=>!i.current.isFieldVisible(u.id));for(let u of c)s._setErrors(u.id,[]),s._setValidationState(u.id,"valid");let p=await Promise.all(l.map(u=>n(u.id))),m=p.some(u=>!u.isValid),d=o.current.repeatableFields??{},f=[];for(let[u,h]of Object.entries(d)){let R=s._repeatableOrder[u]??[];for(let y of R)for(let M of h.allFields){let O=k(u,y,M.id);if(!i.current.isFieldVisible(O)){s._setErrors(O,[]),s._setValidationState(O,"valid");continue}let $=await n(O);f.push($);}h.min!==void 0&&R.length<h.min&&f.push({isValid:false,errors:[{message:`At least ${h.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:u}]});}let g=f.some(u=>!u.isValid);m=m||g;let F=de();if(o.current.validation&&core.hasUnifiedValidation(o.current.validation)){let u=Object.keys(s.values).reduce((R,y)=>(i.current.isFieldVisible(y)&&(R[y]=s.values[y]),R),{}),h=core.createValidationContext({formId:o.current.id,allFormData:u});try{F=await core.validateFormWithUnifiedConfig(o.current.validation,u,h);}catch(R){F={isValid:false,errors:[{message:R instanceof Error?R.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!m&&F.isValid,errors:[...p.flatMap(u=>u.errors),...f.flatMap(u=>u.errors),...F.errors]}},[e,n]);return {validateField:n,validateForm:a}}function xe(t){let e=x(),{formConfig:r}=E(),o=be(t),i=r.repeatableFields?.[t],n=zt.useMemo(()=>i?new Set(i.allFields.map(d=>d.id)):new Set,[i]),a=zt.useMemo(()=>i?o.map((d,f)=>{let g=i.allFields.map(u=>{let h=k(t,d,u.id),R=u.conditions?J(u.conditions,t,d,n):void 0;return {...u,id:h,conditions:R}}),F=i.rows.map(u=>({...u,fields:u.fields.map(h=>{let R=k(t,d,h.id),y=h.conditions?J(h.conditions,t,d,n):void 0;return {...h,id:R,conditions:y}})}));return {key:d,index:f,rows:F,allFields:g}}):[],[t,o,i,n]),s=zt.useMemo(()=>i?i.max===void 0?true:o.length<i.max:false,[i,o.length]),l=zt.useMemo(()=>{if(!i)return false;let d=i.min??0;return o.length>d},[i,o.length]),c=zt.useCallback(d=>{e.getState()._appendRepeatableItem(t,d);},[e,t]),p=zt.useCallback(d=>{e.getState()._removeRepeatableItem(t,d);},[e,t]),m=zt.useCallback((d,f)=>{e.getState()._moveRepeatableItem(t,d,f);},[e,t]);return {items:a,append:c,remove:p,move:m,canAdd:s,canRemove:l,count:o.length}}function jt({formConfig:t,enabled:e=true}){let r=core.getGlobalMonitor(),o=zt.useRef(null),i=zt.useRef(0),n=zt.useRef(0);zt.useEffect(()=>{r&&e&&(o.current=r.getProfiler());},[r,e]);let a=zt.useCallback(d=>{if(!r||!e)return;i.current++;let f={formId:t.id,fieldCount:t.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:d||i.current};r.track("component_render",`form_${t.id}`,{formId:t.id,fieldCount:t.allFields.length,renderCount:i.current},f,"low");},[r,e,t.id,t.allFields.length]),s=zt.useCallback((d,f)=>{if(!r||!e)return;let g=o.current?.getMetrics(`form_validation_${t.id}`),F={formId:t.id,fieldCount:f||t.allFields.length,timestamp:Date.now(),duration:g?.duration||0,renderDuration:0,validationDuration:g?.duration||0,validationErrors:d,renderCount:i.current};r.track("form_validation",`form_${t.id}`,{formId:t.id,validationErrors:d,fieldCount:f||t.allFields.length},F,d>0?"medium":"low");},[r,e,t.id,t.allFields.length]),l=zt.useCallback((d,f)=>{if(!r||!e)return;let g=o.current?.getMetrics(`form_submission_${t.id}`),F={formId:t.id,fieldCount:f||t.allFields.length,timestamp:Date.now(),duration:g?.duration||0,renderDuration:0,validationDuration:0,validationErrors:d?0:1,renderCount:i.current};r.track("form_submission",`form_${t.id}`,{formId:t.id,success:d,fieldCount:f||t.allFields.length,fieldChanges:n.current},F,d?"low":"high");},[r,e,t.id,t.allFields.length]),c=zt.useCallback((d,f)=>{!r||!e||(n.current++,r.track("component_update",`field_${d}`,{formId:t.id,fieldId:d,componentType:f,changeCount:n.current},void 0,"low"));},[r,e,t.id]),p=zt.useCallback(d=>{!o.current||!e||o.current.start(d,{formId:t.id,renderCount:i.current});},[e,t.id]),m=zt.useCallback(d=>{if(!o.current||!e)return null;let f=o.current.end(d);return f?{...f,formId:t.id,fieldCount:t.allFields.length,renderDuration:f.duration,validationDuration:0,validationErrors:0}:null},[e,t.id,t.allFields.length]);return {trackFormRender:a,trackFormValidation:s,trackFormSubmission:l,trackFieldChange:c,startPerformanceTracking:p,endPerformanceTracking:m}}var nt=zt.createContext(null);function E(){let t=zt.useContext(nt);if(!t)throw new Error("useFormConfigContext must be used within a FormProvider");return t}function Oe({children:t,formConfig:e,defaultValues:r={},onSubmit:o,onFieldChange:i,className:n}){let[a]=zt.useState(()=>{let v=e.repeatableFields??{},b={...r},C={},V={};if(Object.keys(v).some(S=>Array.isArray(r[S]))){let S=se(r,v);b=S.values,C=S.order,V=S.nextKeys;}for(let[S,A]of Object.entries(v))if(!C[S]){let te=A.min??0,B=[],q=V[S]??0;for(let H=0;H<te;H++){let W=`k${q}`;B.push(W);for(let re of A.allFields){let bt=k(S,W,re.id);b[bt]=A.defaultValue?.[re.id]??void 0;}q++;}C[S]=B,V[S]=q;}let D=me(b),_=D.getState();for(let[S,A]of Object.entries(v))_._setRepeatableConfig(S,A);return D.setState({_repeatableOrder:C,_repeatableNextKey:V}),D}),s=zt.useRef(null);zt.useEffect(()=>{if(s.current?.stop(),s.current=null,e.effectsMap&&Object.keys(e.effectsMap).length>0){let v=new oe({effectsMap:e.effectsMap,store:a});v.start(),v.runInitialEffects(),s.current=v;}return ()=>{s.current?.stop(),s.current=null;}},[e.effectsMap,a]);let l=zt.useRef(e.id),c=zt.useRef(i);c.current=i,zt.useEffect(()=>c.current?a.subscribe(b=>b.values,(b,C)=>{for(let V of Object.keys(b))b[V]!==C[V]&&c.current?.(V,b[V],b);}):void 0,[a]),zt.useEffect(()=>{if(l.current!==e.id){l.current=e.id;let v=e.repeatableFields??{},b={...r},C={},V={};if(Object.keys(v).some(_=>Array.isArray(r[_]))){let _=se(r,v);b=_.values,C=_.order,V=_.nextKeys;}for(let[_,S]of Object.entries(v))if(!C[_]){let A=S.min??0,te=[],B=V[_]??0;for(let q=0;q<A;q++){let H=`k${B}`;te.push(H);for(let W of S.allFields){let re=k(_,H,W.id);b[re]=S.defaultValue?.[W.id]??void 0;}B++;}C[_]=te,V[_]=B;}a.getState()._reset(b);let D=a.getState();for(let[_,S]of Object.entries(v))D._setRepeatableConfig(_,S);a.setState({_repeatableOrder:C,_repeatableNextKey:V});}},[e.id,e.repeatableFields,a,r]);let[p,m]=zt.useState(()=>a.getState().values);zt.useEffect(()=>a.subscribe(b=>b.values,b=>m(b)),[a]);let[d,f]=zt.useState(()=>a.getState()._repeatableOrder);zt.useEffect(()=>a.subscribe(b=>b._repeatableOrder,b=>f(b)),[a]);let{fieldConditions:g,hasConditionalFields:F,getFieldCondition:u,isFieldVisible:h,isFieldDisabled:R,isFieldRequired:y,isFieldReadonly:M}=Xe({formConfig:e,formValues:p,repeatableOrder:d});zt.useEffect(()=>{for(let[v,b]of Object.entries(g)){let C={visible:b.visible,disabled:b.disabled,required:b.required,readonly:b.readonly};a.getState()._setFieldConditions(v,C);}},[g,a]);let O=zt.useMemo(()=>({hasConditionalFields:F,getFieldCondition:u,isFieldVisible:h,isFieldDisabled:R,isFieldRequired:y,isFieldReadonly:M}),[F,u,h,R,y,M]),{validateField:$,validateForm:L}=ot({formConfig:e,store:a,conditionsHelpers:O}),{submit:I}=Qe({store:a,onSubmit:o,validateForm:L,defaultSubmitOptions:e.submitOptions}),ee=zt.useMemo(()=>({formConfig:e,conditionsHelpers:O,validateField:$,validateForm:L,submit:I}),[e,O,$,L,I]);return jsxRuntime.jsx(ae.Provider,{value:a,children:jsxRuntime.jsx(nt.Provider,{value:ee,children:jsxRuntime.jsx("form",{onSubmit:I,className:n,noValidate:true,children:t})})})}function Gt({formConfig:t,defaultValues:e,onSubmit:r,onFieldChange:o,className:i,children:n}){let a=zt.useMemo(()=>t instanceof P?t.build():t,[t]);return jsxRuntime.jsx(Oe,{formConfig:a,defaultValues:e,onSubmit:r,onFieldChange:o,className:i,children:n})}var Z=zt__default.default.memo(function({fieldId:e,fieldConfig:r,disabled:o=false,customProps:i={},className:n,forceVisible:a=false}){let{formConfig:s,validateField:l,conditionsHelpers:c}=E(),p=pe(e),m=Fe(e),d=U(e),f=ge(e),{setValue:g,setTouched:F}=ye(e),u=zt.useMemo(()=>{if(r)return r;let C=s.allFields.find(T=>T.id===e);if(C)return C;let V=Y(e);if(V&&s.repeatableFields){let T=s.repeatableFields[V.repeatableId];if(T){let D=T.allFields.find(_=>_.id===V.fieldId);if(D)return {...D,id:e}}}},[r,s.allFields,s.repeatableFields,e]);if(!u)throw new Error(`Field with ID "${e}" not found`);let h=s.config.getComponent(u.componentId);if(!h)throw new Error(`Component with ID "${u.componentId}" not found`);let R=m.validationState==="validating",y=zt.useMemo(()=>({isVisible:a||d.visible,isFieldDisabled:o||d.disabled,isFieldRequired:d.required||c.isFieldRequired(e),isFieldReadonly:d.readonly}),[a,o,d,c,e]),M=zt.useCallback(async C=>{g(C),(u.validation?.validateOnChange||m.touched)&&await l(e,C);},[e,g,l,u.validation?.validateOnChange,m.touched]),O=zt.useCallback(async()=>{m.touched||F(),u.validation?.validateOnBlur!==false&&await l(e);},[e,m.touched,F,l,u.validation?.validateOnBlur]),$=zt.useMemo(()=>({...h.defaultProps??{},...u.props,...f,...i,disabled:y.isFieldDisabled,required:y.isFieldRequired,readOnly:y.isFieldReadonly}),[h.defaultProps,u.props,f,i,y.isFieldDisabled,y.isFieldRequired,y.isFieldReadonly]),L=zt.useMemo(()=>({id:e,props:$,value:p,onChange:M,onBlur:O,disabled:y.isFieldDisabled,error:m.errors,isValidating:R,touched:m.touched}),[e,$,p,M,O,y.isFieldDisabled,m.errors,R,m.touched]);if(!y.isVisible)return null;let I=h.renderer(L),ee=s.renderConfig?.fieldRenderer,v=h.useFieldRenderer!==false,b=ee&&v?ee({children:I,id:e,...$,error:m.errors,isValidating:R,touched:m.touched}):I;return jsxRuntime.jsx("div",{className:n,"data-field-id":e,"data-field-type":h.type,"data-field-visible":y.isVisible,"data-field-disabled":y.isFieldDisabled,"data-field-required":y.isFieldRequired,"data-field-readonly":y.isFieldReadonly,children:b})});var lt=zt__default.default.memo(function({row:e,className:r,...o}){let{formConfig:i,conditionsHelpers:n}=E(),a=zt.useMemo(()=>e.fields.filter(c=>n.isFieldVisible(c.id)),[e.fields,n]),s=zt.useMemo(()=>a.map(c=>jsxRuntime.jsx(Z,{fieldId:c.id},c.id)),[a]),l=zt.useMemo(()=>({row:e,children:s,className:r}),[e,s,r]);return a.length===0?null:jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormRow",renderer:i.renderConfig?.rowRenderer,props:l,...o,children:s})}),fe=lt;var De=zt__default.default.memo(function({item:e,index:r,total:o,canRemove:i,canMoveUp:n,canMoveDown:a,onRemove:s,onMoveUp:l,onMoveDown:c}){let{formConfig:p}=E(),m=zt.useMemo(()=>new Map(e.allFields.map(g=>[g.id,g])),[e.allFields]),d=zt.useMemo(()=>e.rows.map(g=>jsxRuntime.jsx(fe,{row:g,children:g.fields.map(F=>jsxRuntime.jsx(Z,{fieldId:F.id,fieldConfig:m.get(F.id)},F.id))},g.id)),[e.rows,m]),f=p.renderConfig?.repeatableItemRenderer;return f?f({item:e,index:r,total:o,canRemove:i,canMoveUp:n,canMoveDown:a,onRemove:s,onMoveUp:l,onMoveDown:c,children:d}):jsxRuntime.jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":r,children:d})});var Me=zt__default.default.memo(function({repeatableId:e,repeatableConfig:r,className:o}){let{formConfig:i}=E(),{items:n,append:a,remove:s,move:l,canAdd:c,canRemove:p}=xe(e),m=zt.useMemo(()=>n.map((f,g)=>jsxRuntime.jsx(De,{item:f,index:g,total:n.length,canRemove:p,canMoveUp:g>0,canMoveDown:g<n.length-1,onRemove:()=>s(f.key),onMoveUp:()=>l(g,g-1),onMoveDown:()=>l(g,g+1)},f.key)),[n,p,s,l]),d=i.renderConfig?.repeatableRenderer;return d?d({repeatableId:e,items:n,canAdd:c,canRemove:p,onAdd:()=>a(),min:r.min,max:r.max,children:m}):jsxRuntime.jsxs("div",{className:o,"data-repeatable-id":e,children:[m,c&&jsxRuntime.jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var nr=zt__default.default.memo(function({className:e,...r}){let{formConfig:o}=E(),i=zt.useMemo(()=>o.rows.map(a=>a.kind==="repeatable"?jsxRuntime.jsx(Me,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsxRuntime.jsx(fe,{row:a},a.id)),[o.rows]),n=zt.useMemo(()=>({formConfig:o,children:i,className:e}),[o,i,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormBody",renderer:o.renderConfig?.bodyRenderer,props:n,...r,children:i})});var dr=zt__default.default.memo(function({className:e,isSubmitting:r,...o}){let{formConfig:i,submit:n}=E(),{isSubmitting:a}=he(),s=zt.useMemo(()=>({isSubmitting:r??a,onSubmit:n,className:e}),[r,a,n,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormSubmitButton",renderer:i.renderConfig?.submitButtonRenderer,props:s,...o})});var j=class extends Error{constructor(r){let i=r.filter(n=>n.severity==="error").map(n=>`[${n.path}] ${n.message}`).join("; ");super(`Invalid form schema: ${i}`);this.code="SCHEMA_VALIDATION_ERROR";this.name="SchemaValidationError",this.issues=r;}};var Ie=new Set(["required","email","url","number"]),Te={minLength:["min"],maxLength:["max"],min:["min"],max:["max"],pattern:["pattern"]},pt=new Set([...Ie,...Object.keys(Te)]),vr=new Set(["equals","notEquals","greaterThan","lessThan","greaterThanOrEqual","lessThanOrEqual","contains","notContains","in","notIn","matches","exists","notExists"]);function Cr(t,e,r){gt(t,e,r);let o=kr(t),i=P.create(e,t.id);for(let a of o)if(ht(a)){let s=a.repeatable;i.addRepeatable(s.id,l=>{for(let c of s.rows){let p=ft(c.fields,r);l.add(...p);}return s.min!==void 0&&l.min(s.min),s.max!==void 0&&l.max(s.max),s.defaultValue&&l.defaultValue(s.defaultValue),s.validation&&l.validation(Ue(s.validation,r)),l});}else {let l=ft(a.fields,r);i.add(...l);}return t.validation&&i.setValidation(Er(t.validation,r)),t.submitOptions&&i.setSubmitOptions(t.submitOptions),{formConfig:i.build(),defaultValues:t.defaultValues}}function Sr(t){if(typeof t!="object"||t===null)return false;let e=t;if(typeof e.id!="string"||e.id.length===0)return false;let r=Array.isArray(e.fields),o=Array.isArray(e.rows);return !(!r&&!o||r&&o||e.version!==void 0&&e.version!==1)}function gt(t,e,r){let o=[];(!t.id||typeof t.id!="string")&&o.push({path:"id",message:'Form schema must have a non-empty "id"',severity:"error"}),t.version!==void 0&&t.version!==1&&o.push({path:"version",message:`Unsupported schema version "${t.version}". Only version 1 is supported.`,severity:"error"});let i=Array.isArray(t.fields),n=Array.isArray(t.rows);if(!i&&!n&&o.push({path:"",message:'Form schema must have either "fields" or "rows"',severity:"error"}),i&&n&&o.push({path:"",message:'Form schema cannot have both "fields" and "rows". Use one or the other.',severity:"error"}),i&&t.fields){t.fields.length===0&&o.push({path:"fields",message:"Fields array must not be empty",severity:"error"});for(let s=0;s<t.fields.length;s++)Be(t.fields[s],`fields[${s}]`,e,r,o);}if(n&&t.rows){t.rows.length===0&&o.push({path:"rows",message:"Rows array must not be empty",severity:"error"});for(let s=0;s<t.rows.length;s++)wr(t.rows[s],`rows[${s}]`,e,r,o);}if(t.validation?.rules&&qe(t.validation.rules,"validation.rules",r,o),o.filter(s=>s.severity==="error").length>0)throw new j(o)}function wr(t,e,r,o,i){if(ht(t))xr(t,e,r,o,i);else {let n=t;if(!Array.isArray(n.fields)||n.fields.length===0){i.push({path:`${e}.fields`,message:"Row must have at least one field",severity:"error"});return}for(let a=0;a<n.fields.length;a++)Be(n.fields[a],`${e}.fields[${a}]`,r,o,i);}}function xr(t,e,r,o,i){let n=t.repeatable,a=`${e}.repeatable`;if(!n||typeof n!="object"){i.push({path:a,message:'Repeatable row must have a "repeatable" object',severity:"error"});return}if((!n.id||typeof n.id!="string")&&i.push({path:`${a}.id`,message:'Repeatable must have a non-empty "id"',severity:"error"}),n.min!==void 0&&n.min<0&&i.push({path:`${a}.min`,message:`Repeatable "${n.id}": min cannot be negative (${n.min})`,severity:"error"}),n.max!==void 0&&n.max<0&&i.push({path:`${a}.max`,message:`Repeatable "${n.id}": max cannot be negative (${n.max})`,severity:"error"}),n.min!==void 0&&n.max!==void 0&&n.min>n.max&&i.push({path:a,message:`Repeatable "${n.id}": min (${n.min}) cannot be greater than max (${n.max})`,severity:"error"}),!Array.isArray(n.rows)||n.rows.length===0){i.push({path:`${a}.rows`,message:"Repeatable must have at least one row",severity:"error"});return}for(let s=0;s<n.rows.length;s++){let l=n.rows[s];if(!Array.isArray(l.fields)||l.fields.length===0){i.push({path:`${a}.rows[${s}].fields`,message:"Repeatable row must have at least one field",severity:"error"});continue}for(let c=0;c<l.fields.length;c++)Be(l.fields[c],`${a}.rows[${s}].fields[${c}]`,r,o,i);}n.validation?.rules&&qe(n.validation.rules,`${a}.validation.rules`,o,i);}function Be(t,e,r,o,i){if((!t.id||typeof t.id!="string")&&i.push({path:`${e}.id`,message:'Field must have a non-empty "id"',severity:"error"}),!t.type||typeof t.type!="string"?i.push({path:`${e}.type`,message:'Field must have a non-empty "type"',severity:"error"}):r.hasComponent(t.type)||i.push({path:`${e}.type`,message:`Unknown component type "${t.type}". Must be registered in ril config.`,severity:"error"}),t.validation?.rules&&qe(t.validation.rules,`${e}.validation.rules`,o,i),t.effects)for(let n=0;n<t.effects.length;n++)Vr(t.effects[n],`${e}.effects[${n}]`,o,i);t.conditions&&_r(t.conditions,e,i);}function qe(t,e,r,o){let i=Array.isArray(t)?t:[t];for(let n=0;n<i.length;n++){let a=i[n],s=Array.isArray(t)?`${e}[${n}]`:e;if(typeof a=="string")Ie.has(a)||o.push({path:s,message:`Unknown validation shortcut "${a}". Valid shortcuts: ${[...Ie].join(", ")}`,severity:"error"});else if(typeof a=="object"&&a!==null){let{type:l,params:c}=a;if(!l||typeof l!="string"){o.push({path:`${s}.type`,message:'Validation descriptor must have a "type"',severity:"error"});continue}if(Te[l]){let p=Te[l];for(let m of p)(!c||c[m]===void 0)&&o.push({path:`${s}.params.${m}`,message:`Validator "${l}" requires param "${m}"`,severity:"error"});if(l==="pattern"&&c?.pattern!==void 0)try{new RegExp(c.pattern);}catch{o.push({path:`${s}.params.pattern`,message:`Invalid regex pattern: "${c.pattern}"`,severity:"error"});}}else pt.has(l)||r?.validators?.[l]||o.push({path:s,message:`Unknown validator type "${l}". Not a built-in and not found in registry.`,severity:"error"});}else o.push({path:s,message:"Validation descriptor must be a string or object",severity:"error"});}}function Vr(t,e,r,o){(!t.watch||typeof t.watch!="string")&&o.push({path:`${e}.watch`,message:'Effect must have a non-empty "watch" field ID',severity:"error"}),!t.handler||typeof t.handler!="string"?o.push({path:`${e}.handler`,message:'Effect must have a non-empty "handler" registry key',severity:"error"}):r?.effects?.[t.handler]||o.push({path:`${e}.handler`,message:`Effect handler "${t.handler}" not found in registry`,severity:"error"});}function _r(t,e,r){let o=["visible","disabled","required","readonly"];for(let i of o)t[i]&&Ft(t[i],`${e}.conditions.${i}`,r);}function Ft(t,e,r){if(t.conditions&&t.conditions.length>0){for(let o=0;o<t.conditions.length;o++)Ft(t.conditions[o],`${e}.conditions[${o}]`,r);return}(!t.field||typeof t.field!="string")&&r.push({path:`${e}.field`,message:'Leaf condition must have a non-empty "field"',severity:"warning"}),t.operator&&!vr.has(t.operator)&&r.push({path:`${e}.operator`,message:`Invalid condition operator "${t.operator}"`,severity:"error"});}function kr(t){return t.rows?t.rows:t.fields?t.fields.map(e=>({kind:"fields",fields:[e]})):[]}function ht(t){return t.kind==="repeatable"}function ft(t,e){return t.map(r=>{let o={id:r.id,type:r.type,props:r.props};return r.validation&&(o.validation=Ue(r.validation,e)),r.conditions&&(o.conditions=r.conditions),r.effects&&r.effects.length>0&&(o.effects=Or(r.effects,e)),o})}function Ue(t,e){let r={validateOnChange:t.validateOnChange,validateOnBlur:t.validateOnBlur,debounceMs:t.debounceMs};if(t.rules){let i=(Array.isArray(t.rules)?t.rules:[t.rules]).map(n=>Ke(n,e));r.validate=i.length===1?i[0]:i;}return r}function Er(t,e){let r={validateOnSubmit:t.validateOnSubmit,validateOnStepChange:t.validateOnStepChange};if(t.rules){let i=(Array.isArray(t.rules)?t.rules:[t.rules]).map(n=>Ke(n,e));r.validate=i.length===1?i[0]:i;}return r}function Ke(t,e){if(typeof t=="string")return mt(t);let{type:r,params:o,message:i}=t;if(pt.has(r))return mt(r,o,i);if(e?.validators?.[r])return e.validators[r](o,i);throw new Error(`Unknown validator type: "${r}"`)}function mt(t,e,r){switch(t){case "required":return core.required(r);case "email":return core.email(r);case "url":return core.url(r);case "number":return core.number(r);case "minLength":return core.minLength(e?.min,r);case "maxLength":return core.maxLength(e?.max,r);case "min":return core.min(e?.min,r);case "max":return core.max(e?.max,r);case "pattern":try{let o=new RegExp(e?.pattern);return core.pattern(o,r)}catch{throw new j([{path:"validation.rules",message:`Invalid regex pattern: "${e?.pattern}"`,severity:"error"}])}default:throw new Error(`Unknown built-in validator: "${t}"`)}}function Or(t,e){return t.map(r=>{let o=e?.effects?.[r.handler];if(!o)throw new Error(`Effect handler "${r.handler}" not found in registry`);let i=r.params;return core.onChange(r.watch,(n,a)=>o(n,a,i))})}exports.Form=Gt;exports.FormBody=nr;exports.FormBuilder=P;exports.FormField=Z;exports.FormProvider=Oe;exports.FormRow=lt;exports.FormStoreContext=ae;exports.FormSubmitButton=dr;exports.RepeatableBuilder=G;exports.RepeatableField=Me;exports.RepeatableItem=De;exports.SchemaValidationError=j;exports.createFormStore=me;exports.flattenRepeatableValues=se;exports.form=P;exports.fromSchema=Cr;exports.isFormSchema=Sr;exports.resolveFieldValidation=Ue;exports.resolveValidationDescriptor=Ke;exports.structureFormValues=ne;exports.useConditionEvaluation=qr;exports.useConditionEvaluator=Zr;exports.useFieldActions=ye;exports.useFieldConditions=U;exports.useFieldConditionsLazy=Qr;exports.useFieldConditionsWithRefresh=eo;exports.useFieldErrors=Vt;exports.useFieldProps=ge;exports.useFieldState=Fe;exports.useFieldTouched=_t;exports.useFieldValidationState=kt;exports.useFieldValue=pe;exports.useFormActions=It;exports.useFormConditions=Xe;exports.useFormConfigContext=E;exports.useFormDirty=Dt;exports.useFormMonitoring=jt;exports.useFormStore=x;exports.useFormStoreApi=z;exports.useFormSubmissionWithStore=Qe;exports.useFormSubmitState=he;exports.useFormSubmitting=Pt;exports.useFormValid=$t;exports.useFormValidationWithStore=ot;exports.useFormValues=Mt;exports.useMultipleConditionEvaluation=Le;exports.useRepeatableField=xe;exports.useRepeatableKeys=be;exports.validateSchema=gt;

@@ -1,1 +0,1 @@

import Mt,{createContext,useMemo,useCallback,useContext,useRef,useEffect,useState}from'react';import {ComponentRendererWrapper,IdGenerator,deepClone,ensureUnique,hasUnifiedValidation,isEmptyValue,createValidationContext,validateWithUnifiedConfig,validateFormWithUnifiedConfig,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {useStore,createStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx,jsxs}from'react/jsx-runtime';var W=class{constructor(e){this.innerForm=new T(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let t=this.innerForm.getRows(),i=this.innerForm.getFields();if(t.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let o of i)if(o.id.includes("[")||o.id.includes("]"))throw new Error(`Repeatable template field ID "${o.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:t.map(o=>({...o,kind:"fields"})),allFields:i,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var T=class r{constructor(e,t){this.rows=[];this.idGenerator=new IdGenerator;this.config=e,this.formId=t||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,t){return new r(e,t)}createFormField(e){let t=this.config.getComponent(e.type);if(!t)throw new Error(`No component found with type "${e.type}"`);let i;return (t.validation||e.validation)&&(i={validateOnChange:e.validation?.validateOnChange??t.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??t.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??t.validation?.debounceMs,validate:(()=>{let o=t.validation?.validate,s=e.validation?.validate;if(!o)return s;if(!s)return o;let a=Array.isArray(o)?o:[o],n=Array.isArray(s)?s:[s];return [...a,...n]})()}),{id:e.id||this.idGenerator.next("field"),componentId:t.id,props:{...t.defaultProps,...e.props},validation:i,conditions:e.conditions}}createRow(e){if(e.length===0)throw new Error("At least one field is required");if(e.length>3)throw new Error("Maximum 3 fields per row");let t=e.map(i=>this.createFormField(i));return {kind:"fields",id:this.idGenerator.next("row"),fields:t,maxColumns:e.length}}add(...e){let t,i=false;if(e.length===1&&Array.isArray(e[0])?(t=e[0],i=true):t=e,t.length===0)throw new Error("At least one field is required");if(i&&t.length>3)throw new Error("Maximum 3 fields per row");if(t.length===1){let o=this.createRow(t);return this.rows.push(o),this}if(t.length<=3){let o=this.createRow(t);return this.rows.push(o),this}for(let o of t){let s=this.createRow([o]);this.rows.push(s);}return this}addSeparateRows(e){for(let t of e)this.add(t);return this}addRepeatable(e,t){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let i=new W(this.config),o=t(i);if(o._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let s=o._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:s};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);return Object.assign(i,{...t,props:{...i.props,...t.props}}),this}findField(e){for(let t of this.rows)if(t.kind==="fields"){let i=t.fields.find(o=>o.id===e);if(i)return i}else {let i=t.repeatable.allFields.find(o=>o.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>t.kind==="repeatable"?t:{...t,fields:t.fields.filter(i=>i.id!==e)}).filter(t=>t.kind==="repeatable"||t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}setSubmitOptions(e){return this._submitOptions=e,this}addFieldValidation(e,t){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.validation,...t};return this.updateField(e,{validation:o})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.conditions,...t};return this.updateField(e,{conditions:o})}clone(e){let t=new r(this.config,e||`${this.formId}-clone`);return t.rows=deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=this.rows.filter(n=>n.kind==="repeatable"),o=i.flatMap(n=>n.repeatable.allFields),s=[...t.map(n=>n.id),...o.map(n=>n.id)];try{ensureUnique(s,"field");}catch(n){e.push(n instanceof Error?n.message:String(n));}let a=i.map(n=>n.repeatable.id);try{ensureUnique(a,"repeatable");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of t)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for field "${n.id}"`);for(let n of o)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for repeatable template field "${n.id}"`);for(let n of this.rows)n.kind==="fields"&&(n.fields.length>3&&e.push(`Row "${n.id}" has ${n.fields.length} fields, maximum is 3`),n.fields.length===0&&e.push(`Row "${n.id}" is empty`));for(let n of t)(n.id.includes("[")||n.id.includes("]"))&&e.push(`Field ID "${n.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let n of a)(n.includes("[")||n.includes("]"))&&e.push(`Repeatable ID "${n}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let t=this.rows.filter(o=>o.kind==="repeatable"),i=t.length>0?Object.fromEntries(t.map(o=>[o.repeatable.id,o.repeatable])):void 0;return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),repeatableFields:i,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation,submitOptions:this._submitOptions}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(t=>t.kind?t:{...t,kind:"fields"})),this}getStats(){let e=this.getFields(),t=this.rows.filter(s=>s.kind==="fields"),i=this.rows.filter(s=>s.kind==="repeatable"),o=t.map(s=>s.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:t.length>0?e.length/t.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0,totalRepeatables:i.length,totalRepeatableFields:i.reduce((s,a)=>s+a.repeatable.allFields.length,0)}}};function tr(r,e={},t={}){return useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:r.visible?i(r.visible):t.visible??true,disabled:r.disabled?i(r.disabled):t.disabled??false,required:r.required?i(r.required):t.required??false,readonly:r.readonly?i(r.readonly):t.readonly??false}},[r,e,t])}function Te(r,e={}){return useMemo(()=>{let t={};for(let[i,o]of Object.entries(r))if(t[i]={visible:true,disabled:false,required:false,readonly:false},o){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(n){return console.warn(`Error evaluating condition for field ${i}:`,n),false}};t[i]={visible:o.visible?s(o.visible):true,disabled:o.disabled?s(o.disabled):false,required:o.required?s(o.required):false,readonly:o.readonly?s(o.readonly):false};}return t},[r,e])}var nt=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function V(r,e,t){return `${r}[${e}].${t}`}function L(r){let e=nt.exec(r);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function re(r,e,t){let i={},o=new Set;for(let[s,a]of Object.entries(t)){if(!e[s])continue;let n=e[s],f=[];for(let p of a){let m={};for(let c of n.allFields){let l=V(s,p,c.id);l in r&&(m[c.id]=r[l],o.add(l));}f.push(m);}i[s]=f;}for(let[s,a]of Object.entries(r))!o.has(s)&&!L(s)&&(i[s]=a);return i}function oe(r,e){let t={},i={},o={};for(let[s,a]of Object.entries(r))if(e[s]&&Array.isArray(a)){let n=[],f=0;for(let p of a){let m=`k${f}`;n.push(m);for(let[c,l]of Object.entries(p))t[V(s,m,c)]=l;f++;}i[s]=n,o[s]=f;}else t[s]=a;return {values:t,order:i,nextKeys:o}}function ue(r={}){return createStore()(subscribeWithSelector((e,t)=>({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...r},_fieldConditions:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(i,o)=>{e(s=>({values:{...s.values,[i]:o},isDirty:true}));},_setTouched:i=>{e(o=>({touched:{...o.touched,[i]:true}}));},_setErrors:(i,o)=>{e(s=>{let a={...s.errors,[i]:o},n=o.length>0?"invalid":"valid";return {errors:a,validationStates:{...s.validationStates,[i]:n}}}),t()._updateIsValid();},_clearErrors:i=>{e(o=>{let s={...o.errors};return delete s[i],{errors:s,validationStates:{...o.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,o)=>{e(s=>({validationStates:{...s.validationStates,[i]:o}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let o=i??t()._defaultValues;e({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(i,o)=>{e(s=>({_fieldConditions:{...s._fieldConditions,[i]:o}}));},_updateIsValid:()=>{let i=t(),o=Object.values(i.errors).some(a=>a&&a.length>0),s=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!o&&!s});},_setRepeatableConfig:(i,o)=>{e(s=>({_repeatableConfigs:{...s._repeatableConfigs,[i]:o}}));},_appendRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return null;let n=s._repeatableOrder[i]??[];if(a.max!==void 0&&n.length>=a.max)return null;let f=s._repeatableNextKey[i]??0,p=`k${f}`,m=o??a.defaultValue??{},c={...s.values};for(let l of a.allFields){let d=V(i,p,l.id);c[d]=m[l.id]??void 0;}return e({values:c,isDirty:true,_repeatableOrder:{...s._repeatableOrder,[i]:[...n,p]},_repeatableNextKey:{...s._repeatableNextKey,[i]:f+1}}),p},_removeRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return false;let n=s._repeatableOrder[i]??[];if(a.min!==void 0&&n.length<=a.min||!n.includes(o))return false;let f=n.filter(F=>F!==o),p={...s.values},m={...s.errors},c={...s.validationStates},l={...s.touched},d={...s._fieldConditions};for(let F of a.allFields){let g=V(i,o,F.id);delete p[g],delete m[g],delete c[g],delete l[g],delete d[g];}return e({values:p,errors:m,validationStates:c,touched:l,isDirty:true,_fieldConditions:d,_repeatableOrder:{...s._repeatableOrder,[i]:f}}),t()._updateIsValid(),true},_moveRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableOrder[i];if(!n||o<0||o>=n.length||s<0||s>=n.length||o===s)return;let f=[...n],[p]=f.splice(o,1);f.splice(s,0,p),e({_repeatableOrder:{...a._repeatableOrder,[i]:f}});},_insertRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableConfigs[i];if(!n)return null;let f=a._repeatableOrder[i]??[];if(n.max!==void 0&&f.length>=n.max)return null;let p=a._repeatableNextKey[i]??0,m=`k${p}`,c=s??n.defaultValue??{},l={...a.values};for(let g of n.allFields){let u=V(i,m,g.id);l[u]=c[g.id]??void 0;}let d=[...f],F=Math.max(0,Math.min(o,d.length));return d.splice(F,0,m),e({values:l,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[i]:d},_repeatableNextKey:{...a._repeatableNextKey,[i]:p+1}}),m}})))}var ie=createContext(null);function S(){let r=useContext(ie);if(!r)throw new Error("useFormStore must be used within a FormProvider");return r}var De=[];function ce(r){let e=S();return useStore(e,t=>t.values[r])}function ut(r){let e=S();return useStore(e,t=>t.errors[r]??De)}function ct(r){let e=S();return useStore(e,t=>t.touched[r]??false)}function mt(r){let e=S();return useStore(e,t=>t.validationStates[r]??"idle")}var ft={visible:true,disabled:false,required:false,readonly:false};function U(r){let e=S();return useStore(e,t=>t._fieldConditions[r]??ft)}function me(r){let e=S(),t=useStore(e,n=>n.values[r]),i=useStore(e,n=>n.errors[r]??De),o=useStore(e,n=>n.validationStates[r]??"idle"),s=useStore(e,n=>n.touched[r]??false),a=useStore(e,n=>n._defaultValues[r]);return {value:t,errors:i,validationState:o,touched:s,dirty:t!==a}}function pt(){let r=S();return useStore(r,e=>e.isSubmitting)}function Ft(){let r=S();return useStore(r,e=>e.isValid)}function gt(){let r=S();return useStore(r,e=>e.isDirty)}function bt(){let r=S();return useStore(r,e=>e.values)}function fe(){let r=S(),e=useStore(r,o=>o.isSubmitting),t=useStore(r,o=>o.isValid),i=useStore(r,o=>o.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}var Ct=[];function pe(r){let e=S();return useStore(e,t=>t._repeatableOrder[r]??Ct)}function Fe(r){let e=S();return {setValue:t=>e.getState()._setValue(r,t),setTouched:()=>e.getState()._setTouched(r),setErrors:t=>e.getState()._setErrors(r,t),clearErrors:()=>e.getState()._clearErrors(r),setValidationState:t=>e.getState()._setValidationState(r,t)}}function Rt(){let r=S();return {setValue:(e,t)=>r.getState()._setValue(e,t),setTouched:e=>r.getState()._setTouched(e),setErrors:(e,t)=>r.getState()._setErrors(e,t),setSubmitting:e=>r.getState()._setSubmitting(e),reset:e=>r.getState()._reset(e),setFieldConditions:(e,t)=>r.getState()._setFieldConditions(e,t)}}function H(){return S()}var Ae={visible:true,disabled:false,required:false,readonly:false};function Ke(r){try{return JSON.stringify(r)}catch{return String(Date.now())}}function ne(r,e){if(r)try{return typeof r=="object"&&"build"in r?evaluateCondition(r.build(),e):evaluateCondition(r,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function be(r,e){if(!r)return Ae;let t=ne(r.visible,e),i=ne(r.disabled,e),o=ne(r.required,e),s=ne(r.readonly,e);return {visible:t??true,disabled:i??false,required:o??false,readonly:s??false}}function pr(r,e={}){let{conditions:t,skip:i=false}=e,o=H(),s=U(r),a=useRef(null);if(i||!t)return s;let n=o.getState().values,f=Ke(n);if(a.current?.valuesHash===f)return a.current.result;let p=be(t,n);return a.current={result:p,valuesHash:f},p}function Fr(){let r=H(),e=useRef(new Map),t=useRef("");return useMemo(()=>function(o,s){if(!s)return Ae;let a=r.getState().values,n=Ke(a);t.current!==n&&(e.current.clear(),t.current=n);let f=e.current.get(o);if(f)return f.result;let p=be(s,a);return e.current.set(o,{result:p,valuesHash:n}),p},[r])}function gr(r,e){let t=H(),i=U(r),o=useMemo(()=>()=>{if(!e)return i;let s=t.getState().values;return be(e,s)},[t,e,i]);return {conditions:i,refresh:o}}function Y(r,e,t,i){let o={};return r.visible&&(o.visible=G(r.visible,e,t,i)),r.disabled&&(o.disabled=G(r.disabled,e,t,i)),r.required&&(o.required=G(r.required,e,t,i)),r.readonly&&(o.readonly=G(r.readonly,e,t,i)),o}function G(r,e,t,i){let o=r.field&&i.has(r.field)?`${e}[${t}].${r.field}`:r.field,s=r.conditions?.map(a=>G(a,e,t,i));return {...r,field:o,conditions:s}}function Ie({formConfig:r,formValues:e,repeatableOrder:t}){let i=useMemo(()=>{let c={};for(let l of r.allFields)l.conditions&&(c[l.id]=l.conditions);if(t&&r.repeatableFields)for(let[l,d]of Object.entries(r.repeatableFields)){let F=t[l]??[];if(F.length===0)continue;let g=new Set(d.allFields.map(u=>u.id));for(let u of F)for(let C of d.allFields){if(!C.conditions)continue;let b=V(l,u,C.id);c[b]=Y(C.conditions,l,u,g);}}return c},[r.allFields,r.repeatableFields,t]),o=useMemo(()=>Object.keys(i).length>0,[i]),s=Te(o?i:{},o?e:{}),a=useCallback(c=>s[c],[s]),n=useCallback(c=>{let l=s[c];return l?l.visible:true},[s]),f=useCallback(c=>{let l=s[c];return l?l.disabled:false},[s]),p=useCallback(c=>{let l=s[c];return l?l.required:false},[s]),m=useCallback(c=>{let l=s[c];return l?l.readonly:false},[s]);return useMemo(()=>({fieldConditions:s,hasConditionalFields:o,getFieldCondition:a,isFieldVisible:n,isFieldDisabled:f,isFieldRequired:p,isFieldReadonly:m}),[s,o,a,n,f,p,m])}function vt(r){return typeof r=="object"&&r!==null&&"preventDefault"in r}function $e({store:r,onSubmit:e,validateForm:t,defaultSubmitOptions:i}){let o=useRef(e);o.current=e;let s=useRef(i);return s.current=i,{submit:useCallback(async n=>{let f={};vt(n)?n.preventDefault():n&&(f=n);let p={...s.current,...f},m=r.getState();if(m.isSubmitting)return false;m._setSubmitting(true);try{if(p.force){let u=r.getState(),b=Object.keys(u._repeatableConfigs).length>0?re(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return o.current&&await o.current(b),m._setSubmitting(!1),!0}let c=await t();if(!c.isValid&&!p.skipInvalid)return m._setSubmitting(!1),!1;let l=r.getState(),d=l.values;if(p.skipInvalid&&!c.isValid){let u=new Set(Object.entries(l.errors).filter(([,C])=>C.length>0).map(([C])=>C));d=Object.fromEntries(Object.entries(d).filter(([C])=>!u.has(C)));}let g=Object.keys(l._repeatableConfigs).length>0?re(d,l._repeatableConfigs,l._repeatableOrder):d;return o.current&&await o.current(g),m._setSubmitting(!1),!0}catch(c){return m._setSubmitting(false),console.error("Form submission error:",c),false}},[r,t])}}function se(){return {isValid:true,errors:[]}}function He({formConfig:r,store:e,conditionsHelpers:t}){let i=useRef(r),o=useRef(t);i.current=r,o.current=t;let s=useCallback(async(n,f)=>{let p=i.current.allFields.find(d=>d.id===n);if(!p){let d=L(n);if(d&&i.current.repeatableFields){let F=i.current.repeatableFields[d.repeatableId];if(F){let g=F.allFields.find(u=>u.id===d.fieldId);g&&(p={...g,id:n});}}}let m=e.getState();if(!p)return se();if(!o.current.isFieldVisible(n))return m._setErrors(n,[]),m._setValidationState(n,"valid"),se();if(!p.validation||!hasUnifiedValidation(p.validation)){let d=o.current.isFieldRequired(n),F=f!==void 0?f:m.values[n];if(d&&isEmptyValue(F)){let g={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return m._setErrors(n,g.errors),m._setValidationState(n,"invalid"),g}return m._setErrors(n,[]),m._setValidationState(n,"valid"),se()}let c=f!==void 0?f:m.values[n],l=createValidationContext({fieldId:n,formId:i.current.id,allFormData:{...m.values,[n]:c}});m._setValidationState(n,"validating");try{let d=await validateWithUnifiedConfig(p.validation,c,l);if(o.current.isFieldRequired(n)&&isEmptyValue(c)&&!d.errors.some(u=>u.code==="REQUIRED"||u.message.toLowerCase().includes("required"))){let u={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return m._setErrors(n,u.errors),m._setValidationState(n,"invalid"),u}return m._setErrors(n,d.errors),m._setValidationState(n,d.isValid?"valid":"invalid"),d}catch(d){let F={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return m._setErrors(n,F.errors),m._setValidationState(n,"invalid"),F}},[e]),a=useCallback(async()=>{let n=e.getState(),f=i.current.allFields.filter(u=>{if(!o.current.isFieldVisible(u.id))return false;let b=u.validation&&hasUnifiedValidation(u.validation),k=o.current.isFieldRequired(u.id);return b||k}),p=i.current.allFields.filter(u=>!o.current.isFieldVisible(u.id));for(let u of p)n._setErrors(u.id,[]),n._setValidationState(u.id,"valid");let m=await Promise.all(f.map(u=>s(u.id))),c=m.some(u=>!u.isValid),l=i.current.repeatableFields??{},d=[];for(let[u,C]of Object.entries(l)){let b=n._repeatableOrder[u]??[];for(let k of b)for(let P of C.allFields){let O=V(u,k,P.id);if(!o.current.isFieldVisible(O)){n._setErrors(O,[]),n._setValidationState(O,"valid");continue}let D=await s(O);d.push(D);}C.min!==void 0&&b.length<C.min&&d.push({isValid:false,errors:[{message:`At least ${C.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:u}]});}let F=d.some(u=>!u.isValid);c=c||F;let g=se();if(i.current.validation&&hasUnifiedValidation(i.current.validation)){let u=Object.keys(n.values).reduce((b,k)=>(o.current.isFieldVisible(k)&&(b[k]=n.values[k]),b),{}),C=createValidationContext({formId:i.current.id,allFormData:u});try{g=await validateFormWithUnifiedConfig(i.current.validation,u,C);}catch(b){g={isValid:false,errors:[{message:b instanceof Error?b.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!c&&g.isValid,errors:[...m.flatMap(u=>u.errors),...d.flatMap(u=>u.errors),...g.errors]}},[e,s]);return {validateField:s,validateForm:a}}function ve(r){let e=S(),{formConfig:t}=E(),i=pe(r),o=t.repeatableFields?.[r],s=useMemo(()=>o?new Set(o.allFields.map(l=>l.id)):new Set,[o]),a=useMemo(()=>o?i.map((l,d)=>{let F=o.allFields.map(u=>{let C=V(r,l,u.id),b=u.conditions?Y(u.conditions,r,l,s):void 0;return {...u,id:C,conditions:b}}),g=o.rows.map(u=>({...u,fields:u.fields.map(C=>{let b=V(r,l,C.id),k=C.conditions?Y(C.conditions,r,l,s):void 0;return {...C,id:b,conditions:k}})}));return {key:l,index:d,rows:g,allFields:F}}):[],[r,i,o,s]),n=useMemo(()=>o?o.max===void 0?true:i.length<o.max:false,[o,i.length]),f=useMemo(()=>{if(!o)return false;let l=o.min??0;return i.length>l},[o,i.length]),p=useCallback(l=>{e.getState()._appendRepeatableItem(r,l);},[e,r]),m=useCallback(l=>{e.getState()._removeRepeatableItem(r,l);},[e,r]),c=useCallback((l,d)=>{e.getState()._moveRepeatableItem(r,l,d);},[e,r]);return {items:a,append:p,remove:m,move:c,canAdd:n,canRemove:f,count:i.length}}function xt({formConfig:r,enabled:e=true}){let t=getGlobalMonitor(),i=useRef(null),o=useRef(0),s=useRef(0);useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=useCallback(l=>{if(!t||!e)return;o.current++;let d={formId:r.id,fieldCount:r.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:l||o.current};t.track("component_render",`form_${r.id}`,{formId:r.id,fieldCount:r.allFields.length,renderCount:o.current},d,"low");},[t,e,r.id,r.allFields.length]),n=useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_validation_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:F?.duration||0,validationErrors:l,renderCount:o.current};t.track("form_validation",`form_${r.id}`,{formId:r.id,validationErrors:l,fieldCount:d||r.allFields.length},g,l>0?"medium":"low");},[t,e,r.id,r.allFields.length]),f=useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_submission_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:0,validationErrors:l?0:1,renderCount:o.current};t.track("form_submission",`form_${r.id}`,{formId:r.id,success:l,fieldCount:d||r.allFields.length,fieldChanges:s.current},g,l?"low":"high");},[t,e,r.id,r.allFields.length]),p=useCallback((l,d)=>{!t||!e||(s.current++,t.track("component_update",`field_${l}`,{formId:r.id,fieldId:l,componentType:d,changeCount:s.current},void 0,"low"));},[t,e,r.id]),m=useCallback(l=>{!i.current||!e||i.current.start(l,{formId:r.id,renderCount:o.current});},[e,r.id]),c=useCallback(l=>{if(!i.current||!e)return null;let d=i.current.end(l);return d?{...d,formId:r.id,fieldCount:r.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,r.id,r.allFields.length]);return {trackFormRender:a,trackFormValidation:n,trackFormSubmission:f,trackFieldChange:p,startPerformanceTracking:m,endPerformanceTracking:c}}var ze=createContext(null);function E(){let r=useContext(ze);if(!r)throw new Error("useFormConfigContext must be used within a FormProvider");return r}function _e({children:r,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:o,className:s}){let[a]=useState(()=>{let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(v=>Array.isArray(t[v]))){let v=oe(t,x);R=v.values,h=v.order,y=v.nextKeys;}for(let[v,B]of Object.entries(x))if(!h[v]){let Z=B.min??0,K=[],I=y[v]??0;for(let N=0;N<Z;N++){let j=`k${I}`;K.push(j);for(let ee of B.allFields){let rt=V(v,j,ee.id);R[rt]=B.defaultValue?.[ee.id]??void 0;}I++;}h[v]=K,y[v]=I;}let M=ue(R),_=M.getState();for(let[v,B]of Object.entries(x))_._setRepeatableConfig(v,B);return M.setState({_repeatableOrder:h,_repeatableNextKey:y}),M}),n=useRef(e.id),f=useRef(o);f.current=o,useEffect(()=>f.current?a.subscribe(R=>R.values,(R,h)=>{for(let y of Object.keys(R))R[y]!==h[y]&&f.current?.(y,R[y],R);}):void 0,[a]),useEffect(()=>{if(n.current!==e.id){n.current=e.id;let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(_=>Array.isArray(t[_]))){let _=oe(t,x);R=_.values,h=_.order,y=_.nextKeys;}for(let[_,v]of Object.entries(x))if(!h[_]){let B=v.min??0,Z=[],K=y[_]??0;for(let I=0;I<B;I++){let N=`k${K}`;Z.push(N);for(let j of v.allFields){let ee=V(_,N,j.id);R[ee]=v.defaultValue?.[j.id]??void 0;}K++;}h[_]=Z,y[_]=K;}a.getState()._reset(R);let M=a.getState();for(let[_,v]of Object.entries(x))M._setRepeatableConfig(_,v);a.setState({_repeatableOrder:h,_repeatableNextKey:y});}},[e.id,e.repeatableFields,a,t]);let[p,m]=useState(()=>a.getState().values);useEffect(()=>a.subscribe(R=>R.values,R=>m(R)),[a]);let[c,l]=useState(()=>a.getState()._repeatableOrder);useEffect(()=>a.subscribe(R=>R._repeatableOrder,R=>l(R)),[a]);let{fieldConditions:d,hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}=Ie({formConfig:e,formValues:p,repeatableOrder:c});useEffect(()=>{for(let[x,R]of Object.entries(d)){let h={visible:R.visible,disabled:R.disabled,required:R.required,readonly:R.readonly};a.getState()._setFieldConditions(x,h);}},[d,a]);let P=useMemo(()=>({hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}),[F,g,u,C,b,k]),{validateField:O,validateForm:D}=He({formConfig:e,store:a,conditionsHelpers:P}),{submit:q}=$e({store:a,onSubmit:i,validateForm:D,defaultSubmitOptions:e.submitOptions}),X=useMemo(()=>({formConfig:e,conditionsHelpers:P,validateField:O,validateForm:D,submit:q}),[e,P,O,D,q]);return jsx(ie.Provider,{value:a,children:jsx(ze.Provider,{value:X,children:jsx("form",{onSubmit:q,className:s,noValidate:true,children:r})})})}function Ot({formConfig:r,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s}){let a=useMemo(()=>r instanceof T?r.build():r,[r]);return jsx(_e,{formConfig:a,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s})}var Q=Mt.memo(function({fieldId:e,fieldConfig:t,disabled:i=false,customProps:o={},className:s,forceVisible:a=false}){let{formConfig:n,validateField:f,conditionsHelpers:p}=E(),m=ce(e),c=me(e),l=U(e),{setValue:d,setTouched:F}=Fe(e),g=useMemo(()=>{if(t)return t;let h=n.allFields.find(A=>A.id===e);if(h)return h;let y=L(e);if(y&&n.repeatableFields){let A=n.repeatableFields[y.repeatableId];if(A){let M=A.allFields.find(_=>_.id===y.fieldId);if(M)return {...M,id:e}}}},[t,n.allFields,n.repeatableFields,e]);if(!g)throw new Error(`Field with ID "${e}" not found`);let u=n.config.getComponent(g.componentId);if(!u)throw new Error(`Component with ID "${g.componentId}" not found`);let C=c.validationState==="validating",b=useMemo(()=>({isVisible:a||l.visible,isFieldDisabled:i||l.disabled,isFieldRequired:l.required||p.isFieldRequired(e),isFieldReadonly:l.readonly}),[a,i,l,p,e]),k=useCallback(async h=>{d(h),(g.validation?.validateOnChange||c.touched)&&await f(e,h);},[e,d,f,g.validation?.validateOnChange,c.touched]),P=useCallback(async()=>{c.touched||F(),g.validation?.validateOnBlur!==false&&await f(e);},[e,c.touched,F,f,g.validation?.validateOnBlur]),O=useMemo(()=>({...u.defaultProps??{},...g.props,...o,disabled:b.isFieldDisabled,required:b.isFieldRequired,readOnly:b.isFieldReadonly}),[u.defaultProps,g.props,o,b.isFieldDisabled,b.isFieldRequired,b.isFieldReadonly]),D=useMemo(()=>({id:e,props:O,value:m,onChange:k,onBlur:P,disabled:b.isFieldDisabled,error:c.errors,isValidating:C,touched:c.touched}),[e,O,m,k,P,b.isFieldDisabled,c.errors,C,c.touched]);if(!b.isVisible)return null;let q=u.renderer(D),X=n.renderConfig?.fieldRenderer,x=u.useFieldRenderer!==false,R=X&&x?X({children:q,id:e,...O,error:c.errors,isValidating:C,touched:c.touched}):q;return jsx("div",{className:s,"data-field-id":e,"data-field-type":u.type,"data-field-visible":b.isVisible,"data-field-disabled":b.isFieldDisabled,"data-field-required":b.isFieldRequired,"data-field-readonly":b.isFieldReadonly,children:R})});var Xe=Mt.memo(function({row:e,className:t,...i}){let{formConfig:o,conditionsHelpers:s}=E(),a=useMemo(()=>e.fields.filter(p=>s.isFieldVisible(p.id)),[e.fields,s]),n=useMemo(()=>a.map(p=>jsx(Q,{fieldId:p.id},p.id)),[a]),f=useMemo(()=>({row:e,children:n,className:t}),[e,n,t]);return a.length===0?null:jsx(ComponentRendererWrapper,{name:"FormRow",renderer:o.renderConfig?.rowRenderer,props:f,...i,children:n})}),de=Xe;var ke=Mt.memo(function({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p}){let{formConfig:m}=E(),c=useMemo(()=>new Map(e.allFields.map(F=>[F.id,F])),[e.allFields]),l=useMemo(()=>e.rows.map(F=>jsx(de,{row:F,children:F.fields.map(g=>jsx(Q,{fieldId:g.id,fieldConfig:c.get(g.id)},g.id))},F.id)),[e.rows,c]),d=m.renderConfig?.repeatableItemRenderer;return d?d({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p,children:l}):jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":t,children:l})});var Ee=Mt.memo(function({repeatableId:e,repeatableConfig:t,className:i}){let{formConfig:o}=E(),{items:s,append:a,remove:n,move:f,canAdd:p,canRemove:m}=ve(e),c=useMemo(()=>s.map((d,F)=>jsx(ke,{item:d,index:F,total:s.length,canRemove:m,canMoveUp:F>0,canMoveDown:F<s.length-1,onRemove:()=>n(d.key),onMoveUp:()=>f(F,F-1),onMoveDown:()=>f(F,F+1)},d.key)),[s,m,n,f]),l=o.renderConfig?.repeatableRenderer;return l?l({repeatableId:e,items:s,canAdd:p,canRemove:m,onAdd:()=>a(),min:t.min,max:t.max,children:c}):jsxs("div",{className:i,"data-repeatable-id":e,children:[c,p&&jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var Nt=Mt.memo(function({className:e,...t}){let{formConfig:i}=E(),o=useMemo(()=>i.rows.map(a=>a.kind==="repeatable"?jsx(Ee,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsx(de,{row:a},a.id)),[i.rows]),s=useMemo(()=>({formConfig:i,children:o,className:e}),[i,o,e]);return jsx(ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:s,...t,children:o})});var Ht=Mt.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:o,submit:s}=E(),{isSubmitting:a}=fe(),n=useMemo(()=>({isSubmitting:t??a,onSubmit:s,className:e}),[t,a,s,e]);return jsx(ComponentRendererWrapper,{name:"FormSubmitButton",renderer:o.renderConfig?.submitButtonRenderer,props:n,...i})});export{Ot as Form,Nt as FormBody,T as FormBuilder,Q as FormField,_e as FormProvider,Xe as FormRow,ie as FormStoreContext,Ht as FormSubmitButton,W as RepeatableBuilder,Ee as RepeatableField,ke as RepeatableItem,ue as createFormStore,oe as flattenRepeatableValues,T as form,re as structureFormValues,tr as useConditionEvaluation,Fr as useConditionEvaluator,Fe as useFieldActions,U as useFieldConditions,pr as useFieldConditionsLazy,gr as useFieldConditionsWithRefresh,ut as useFieldErrors,me as useFieldState,ct as useFieldTouched,mt as useFieldValidationState,ce as useFieldValue,Rt as useFormActions,Ie as useFormConditions,E as useFormConfigContext,gt as useFormDirty,xt as useFormMonitoring,S as useFormStore,H as useFormStoreApi,$e as useFormSubmissionWithStore,fe as useFormSubmitState,pt as useFormSubmitting,Ft as useFormValid,He as useFormValidationWithStore,bt as useFormValues,Te as useMultipleConditionEvaluation,ve as useRepeatableField,pe as useRepeatableKeys};
import zt,{createContext,useMemo,useCallback,useContext,useRef,useEffect,useState}from'react';import {ComponentRendererWrapper,IdGenerator,deepClone,ensureUnique,hasUnifiedValidation,isEmptyValue,createValidationContext,validateWithUnifiedConfig,validateFormWithUnifiedConfig,getGlobalMonitor,pattern,max,min,maxLength,minLength,number,url,email,required,onChange,evaluateCondition}from'@rilaykit/core';import {useStore,createStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx,jsxs}from'react/jsx-runtime';var G=class{constructor(e){this.innerForm=new P(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let r=this.innerForm.getRows(),o=this.innerForm.getFields();if(r.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let i of o)if(i.id.includes("[")||i.id.includes("]"))throw new Error(`Repeatable template field ID "${i.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:r.map(i=>({...i,kind:"fields"})),allFields:o,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var P=class t{constructor(e,r){this.rows=[];this.idGenerator=new IdGenerator;this.config=e,this.formId=r||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,r){return new t(e,r)}createFormField(e){let r=this.config.getComponent(e.type);if(!r)throw new Error(`No component found with type "${e.type}"`);let o;return (r.validation||e.validation)&&(o={validateOnChange:e.validation?.validateOnChange??r.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??r.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??r.validation?.debounceMs,validate:(()=>{let i=r.validation?.validate,n=e.validation?.validate;if(!i)return n;if(!n)return i;let a=Array.isArray(i)?i:[i],s=Array.isArray(n)?n:[n];return [...a,...s]})()}),{id:e.id||this.idGenerator.next("field"),componentId:r.id,props:{...r.defaultProps,...e.props},validation:o,conditions:e.conditions,effects:e.effects}}createRow(e){if(e.length===0)throw new Error("At least one field is required");let r=e.map(o=>this.createFormField(o));return {kind:"fields",id:this.idGenerator.next("row"),fields:r,maxColumns:e.length}}add(...e){let r=e.length===1&&Array.isArray(e[0])?e[0]:e;if(r.length===0)throw new Error("At least one field is required");let o=this.createRow(r);return this.rows.push(o),this}addSeparateRows(e){for(let r of e)this.add(r);return this}addRepeatable(e,r){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let o=new G(this.config),i=r(o);if(i._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let n=i._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:n};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,r){let o=this.findField(e);if(!o)throw new Error(`Field with ID "${e}" not found`);return Object.assign(o,{...r,props:{...o.props,...r.props}}),this}findField(e){for(let r of this.rows)if(r.kind==="fields"){let o=r.fields.find(i=>i.id===e);if(o)return o}else {let o=r.repeatable.allFields.find(i=>i.id===e);if(o)return o}return null}removeField(e){return this.rows=this.rows.map(r=>r.kind==="repeatable"?r:{...r,fields:r.fields.filter(o=>o.id!==e)}).filter(r=>r.kind==="repeatable"||r.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}setSubmitOptions(e){return this._submitOptions=e,this}addFieldValidation(e,r){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let o=this.findField(e);if(!o)throw new Error(`Field with ID "${e}" not found`);let i={...o.validation,...r};return this.updateField(e,{validation:i})}addFieldConditions(e,r){let o=this.findField(e);if(!o)throw new Error(`Field with ID "${e}" not found`);let i={...o.conditions,...r};return this.updateField(e,{conditions:i})}clone(e){let r=new t(this.config,e||`${this.formId}-clone`);return r.rows=deepClone(this.rows),r}validate(){let e=[],r=this.getFields(),o=this.rows.filter(s=>s.kind==="repeatable"),i=o.flatMap(s=>s.repeatable.allFields),n=[...r.map(s=>s.id),...i.map(s=>s.id)];try{ensureUnique(n,"field");}catch(s){e.push(s instanceof Error?s.message:String(s));}let a=o.map(s=>s.repeatable.id);try{ensureUnique(a,"repeatable");}catch(s){e.push(s instanceof Error?s.message:String(s));}for(let s of r)this.config.hasComponent(s.componentId)||e.push(`Component "${s.componentId}" not found for field "${s.id}"`);for(let s of i)this.config.hasComponent(s.componentId)||e.push(`Component "${s.componentId}" not found for repeatable template field "${s.id}"`);for(let s of this.rows)s.kind==="fields"&&s.fields.length===0&&e.push(`Row "${s.id}" is empty`);for(let s of r)(s.id.includes("[")||s.id.includes("]"))&&e.push(`Field ID "${s.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let s of a)(s.includes("[")||s.includes("]"))&&e.push(`Repeatable ID "${s}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let r=this.rows.filter(a=>a.kind==="repeatable"),o=r.length>0?Object.fromEntries(r.map(a=>[a.repeatable.id,a.repeatable])):void 0,i=this.getFields(),n={};for(let a of i)if(a.effects)for(let s of a.effects){let l=s.watchFieldId;n[l]||(n[l]=[]),n[l].push(s);}if(o){for(let a of Object.values(o))for(let s of a.allFields)if(s.effects)for(let l of s.effects)n[l.watchFieldId]||(n[l.watchFieldId]=[]),n[l.watchFieldId].push(l);}return {id:this.formId,rows:[...this.rows],allFields:i,repeatableFields:o,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation,submitOptions:this._submitOptions,effectsMap:Object.keys(n).length>0?n:void 0}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(r=>r.kind?r:{...r,kind:"fields"})),this}getStats(){let e=this.getFields(),r=this.rows.filter(n=>n.kind==="fields"),o=this.rows.filter(n=>n.kind==="repeatable"),i=r.map(n=>n.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:r.length>0?e.length/r.length:0,maxFieldsInRow:i.length>0?Math.max(...i):0,minFieldsInRow:i.length>0?Math.min(...i):0,totalRepeatables:o.length,totalRepeatableFields:o.reduce((n,a)=>n+a.repeatable.allFields.length,0)}}};var oe=class{constructor({effectsMap:e,store:r}){this.unsubscribe=null;this.abortControllers=new Map;this.processingFields=new Set;this.cascadeDepth=0;this.stopped=false;this.effectsMap=e,this.store=r;}start(){this.stopped=false,this.unsubscribe=this.store.subscribe(e=>e.values,(e,r)=>{if(!this.stopped)for(let o of Object.keys(e))e[o]!==r[o]&&this.executeEffectsForField(o,e[o]);});}runInitialEffects(){if(this.stopped)return;let e=this.store.getState().values;for(let r of Object.keys(this.effectsMap)){let o=e[r];o!==void 0&&this.executeEffectsForField(r,o);}}stop(){this.stopped=true,this.unsubscribe?.(),this.unsubscribe=null;for(let e of this.abortControllers.values())e.abort();this.abortControllers.clear(),this.processingFields.clear(),this.cascadeDepth=0;}executeEffectsForField(e,r){let o=this.effectsMap[e];if(!o||o.length===0)return;if(this.cascadeDepth>=10){console.warn(`[EffectEngine] Max cascade depth (10) reached for field "${e}". Stopping cascade.`);return}if(this.processingFields.has(e)){console.warn(`[EffectEngine] Cycle detected: field "${e}" is already being processed. Skipping.`);return}let i=this.abortControllers.get(e);i&&i.abort();let n=new AbortController;this.abortControllers.set(e,n);let a={setValue:(s,l)=>{n.signal.aborted||this.stopped||this.store.getState()._setValue(s,l);},setProps:(s,l)=>{n.signal.aborted||this.stopped||this.store.getState()._setFieldProps(s,l);},getValues:()=>this.store.getState().values,getFieldValue:s=>this.store.getState().values[s]};this.processingFields.add(e),this.cascadeDepth++;try{let s=[];for(let l of o){if(n.signal.aborted||this.stopped)break;try{let c=l.handler(r,a);c instanceof Promise&&s.push(c.catch(p=>{p?.name!=="AbortError"&&console.warn(`[EffectEngine] Async effect error for field "${e}":`,p);}));}catch(c){console.warn(`[EffectEngine] Sync effect error for field "${e}":`,c);}}s.length>0?Promise.allSettled(s).then(()=>{this.abortControllers.get(e)===n&&this.abortControllers.delete(e);}):this.abortControllers.delete(e);}finally{this.processingFields.delete(e),this.cascadeDepth--;}}};function qr(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let o=i=>{try{return i&&typeof i=="object"&&"build"in i?evaluateCondition(i.build(),e):evaluateCondition(i,e)}catch(n){return console.warn("Error evaluating condition:",n),false}};return {visible:t.visible?o(t.visible):r.visible??true,disabled:t.disabled?o(t.disabled):r.disabled??false,required:t.required?o(t.required):r.required??false,readonly:t.readonly?o(t.readonly):r.readonly??false}},[t,e,r])}function Le(t,e={}){return useMemo(()=>{let r={};for(let[o,i]of Object.entries(t))if(r[o]={visible:true,disabled:false,required:false,readonly:false},i){let n=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(s){return console.warn(`Error evaluating condition for field ${o}:`,s),false}};r[o]={visible:i.visible?n(i.visible):true,disabled:i.disabled?n(i.disabled):false,required:i.required?n(i.required):false,readonly:i.readonly?n(i.readonly):false};}return r},[t,e])}var vt=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function k(t,e,r){return `${t}[${e}].${r}`}function Y(t){let e=vt.exec(t);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function ne(t,e,r){let o={},i=new Set;for(let[n,a]of Object.entries(r)){if(!e[n])continue;let s=e[n],l=[];for(let c of a){let p={};for(let m of s.allFields){let d=k(n,c,m.id);d in t&&(p[m.id]=t[d],i.add(d));}l.push(p);}o[n]=l;}for(let[n,a]of Object.entries(t))!i.has(n)&&!Y(n)&&(o[n]=a);return o}function se(t,e){let r={},o={},i={};for(let[n,a]of Object.entries(t))if(e[n]&&Array.isArray(a)){let s=[],l=0;for(let c of a){let p=`k${l}`;s.push(p);for(let[m,d]of Object.entries(c))r[k(n,p,m)]=d;l++;}o[n]=s,i[n]=l;}else r[n]=a;return {values:r,order:o,nextKeys:i}}function me(t={}){return createStore()(subscribeWithSelector((e,r)=>({values:{...t},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...t},_fieldConditions:{},_fieldProps:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(o,i)=>{e(n=>({values:{...n.values,[o]:i},isDirty:true}));},_setTouched:o=>{e(i=>({touched:{...i.touched,[o]:true}}));},_setErrors:(o,i)=>{e(n=>{let a={...n.errors,[o]:i},s=i.length>0?"invalid":"valid";return {errors:a,validationStates:{...n.validationStates,[o]:s}}}),r()._updateIsValid();},_clearErrors:o=>{e(i=>{let n={...i.errors};return delete n[o],{errors:n,validationStates:{...i.validationStates,[o]:"idle"}}}),r()._updateIsValid();},_setValidationState:(o,i)=>{e(n=>({validationStates:{...n.validationStates,[o]:i}}));},_setSubmitting:o=>{e({isSubmitting:o});},_reset:o=>{let i=o??r()._defaultValues;e({values:{...i},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_fieldProps:{},_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(o,i)=>{e(n=>({_fieldConditions:{...n._fieldConditions,[o]:i}}));},_setFieldProps:(o,i)=>{e(n=>({_fieldProps:{...n._fieldProps,[o]:{...n._fieldProps[o]??{},...i}}}));},_updateIsValid:()=>{let o=r(),i=Object.values(o.errors).some(a=>a&&a.length>0),n=Object.values(o.validationStates).some(a=>a==="invalid");e({isValid:!i&&!n});},_setRepeatableConfig:(o,i)=>{e(n=>({_repeatableConfigs:{...n._repeatableConfigs,[o]:i}}));},_appendRepeatableItem:(o,i)=>{let n=r(),a=n._repeatableConfigs[o];if(!a)return null;let s=n._repeatableOrder[o]??[];if(a.max!==void 0&&s.length>=a.max)return null;let l=n._repeatableNextKey[o]??0,c=`k${l}`,p=i??a.defaultValue??{},m={...n.values};for(let d of a.allFields){let f=k(o,c,d.id);m[f]=p[d.id]??void 0;}return e({values:m,isDirty:true,_repeatableOrder:{...n._repeatableOrder,[o]:[...s,c]},_repeatableNextKey:{...n._repeatableNextKey,[o]:l+1}}),c},_removeRepeatableItem:(o,i)=>{let n=r(),a=n._repeatableConfigs[o];if(!a)return false;let s=n._repeatableOrder[o]??[];if(a.min!==void 0&&s.length<=a.min||!s.includes(i))return false;let l=s.filter(g=>g!==i),c={...n.values},p={...n.errors},m={...n.validationStates},d={...n.touched},f={...n._fieldConditions};for(let g of a.allFields){let F=k(o,i,g.id);delete c[F],delete p[F],delete m[F],delete d[F],delete f[F];}return e({values:c,errors:p,validationStates:m,touched:d,isDirty:true,_fieldConditions:f,_repeatableOrder:{...n._repeatableOrder,[o]:l}}),r()._updateIsValid(),true},_moveRepeatableItem:(o,i,n)=>{let a=r(),s=a._repeatableOrder[o];if(!s||i<0||i>=s.length||n<0||n>=s.length||i===n)return;let l=[...s],[c]=l.splice(i,1);l.splice(n,0,c),e({_repeatableOrder:{...a._repeatableOrder,[o]:l}});},_insertRepeatableItem:(o,i,n)=>{let a=r(),s=a._repeatableConfigs[o];if(!s)return null;let l=a._repeatableOrder[o]??[];if(s.max!==void 0&&l.length>=s.max)return null;let c=a._repeatableNextKey[o]??0,p=`k${c}`,m=n??s.defaultValue??{},d={...a.values};for(let F of s.allFields){let u=k(o,p,F.id);d[u]=m[F.id]??void 0;}let f=[...l],g=Math.max(0,Math.min(i,f.length));return f.splice(g,0,p),e({values:d,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[o]:f},_repeatableNextKey:{...a._repeatableNextKey,[o]:c+1}}),p}})))}var ae=createContext(null);function x(){let t=useContext(ae);if(!t)throw new Error("useFormStore must be used within a FormProvider");return t}var He=[];function pe(t){let e=x();return useStore(e,r=>r.values[t])}function Vt(t){let e=x();return useStore(e,r=>r.errors[t]??He)}function _t(t){let e=x();return useStore(e,r=>r.touched[t]??false)}function kt(t){let e=x();return useStore(e,r=>r.validationStates[t]??"idle")}var Et={visible:true,disabled:false,required:false,readonly:false};function U(t){let e=x();return useStore(e,r=>r._fieldConditions[t]??Et)}var Ot={};function ge(t){let e=x();return useStore(e,r=>r._fieldProps[t]??Ot)}function Fe(t){let e=x(),r=useStore(e,s=>s.values[t]),o=useStore(e,s=>s.errors[t]??He),i=useStore(e,s=>s.validationStates[t]??"idle"),n=useStore(e,s=>s.touched[t]??false),a=useStore(e,s=>s._defaultValues[t]);return {value:r,errors:o,validationState:i,touched:n,dirty:r!==a}}function Pt(){let t=x();return useStore(t,e=>e.isSubmitting)}function $t(){let t=x();return useStore(t,e=>e.isValid)}function Dt(){let t=x();return useStore(t,e=>e.isDirty)}function Mt(){let t=x();return useStore(t,e=>e.values)}function he(){let t=x(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isValid),o=useStore(t,i=>i.isDirty);return {isSubmitting:e,isValid:r,isDirty:o}}var At=[];function be(t){let e=x();return useStore(e,r=>r._repeatableOrder[t]??At)}function ye(t){let e=x();return {setValue:r=>e.getState()._setValue(t,r),setTouched:()=>e.getState()._setTouched(t),setErrors:r=>e.getState()._setErrors(t,r),clearErrors:()=>e.getState()._clearErrors(t),setValidationState:r=>e.getState()._setValidationState(t,r)}}function It(){let t=x();return {setValue:(e,r)=>t.getState()._setValue(e,r),setTouched:e=>t.getState()._setTouched(e),setErrors:(e,r)=>t.getState()._setErrors(e,r),setSubmitting:e=>t.getState()._setSubmitting(e),reset:e=>t.getState()._reset(e),setFieldConditions:(e,r)=>t.getState()._setFieldConditions(e,r)}}function z(){return x()}var Ye={visible:true,disabled:false,required:false,readonly:false};function ze(t){try{return JSON.stringify(t)}catch{return String(Date.now())}}function le(t,e){if(t)try{return typeof t=="object"&&"build"in t?evaluateCondition(t.build(),e):evaluateCondition(t,e)}catch(r){console.warn("Error evaluating condition:",r);return}}function ve(t,e){if(!t)return Ye;let r=le(t.visible,e),o=le(t.disabled,e),i=le(t.required,e),n=le(t.readonly,e);return {visible:r??true,disabled:o??false,required:i??false,readonly:n??false}}function Qr(t,e={}){let{conditions:r,skip:o=false}=e,i=z(),n=U(t),a=useRef(null);if(o||!r)return n;let s=i.getState().values,l=ze(s);if(a.current?.valuesHash===l)return a.current.result;let c=ve(r,s);return a.current={result:c,valuesHash:l},c}function Zr(){let t=z(),e=useRef(new Map),r=useRef("");return useMemo(()=>function(i,n){if(!n)return Ye;let a=t.getState().values,s=ze(a);r.current!==s&&(e.current.clear(),r.current=s);let l=e.current.get(i);if(l)return l.result;let c=ve(n,a);return e.current.set(i,{result:c,valuesHash:s}),c},[t])}function eo(t,e){let r=z(),o=U(t),i=useMemo(()=>()=>{if(!e)return o;let n=r.getState().values;return ve(e,n)},[r,e,o]);return {conditions:o,refresh:i}}function J(t,e,r,o){let i={};return t.visible&&(i.visible=X(t.visible,e,r,o)),t.disabled&&(i.disabled=X(t.disabled,e,r,o)),t.required&&(i.required=X(t.required,e,r,o)),t.readonly&&(i.readonly=X(t.readonly,e,r,o)),i}function X(t,e,r,o){let i=t.field&&o.has(t.field)?`${e}[${r}].${t.field}`:t.field,n=t.conditions?.map(a=>X(a,e,r,o));return {...t,field:i,conditions:n}}function Xe({formConfig:t,formValues:e,repeatableOrder:r}){let o=useMemo(()=>{let m={};for(let d of t.allFields)d.conditions&&(m[d.id]=d.conditions);if(r&&t.repeatableFields)for(let[d,f]of Object.entries(t.repeatableFields)){let g=r[d]??[];if(g.length===0)continue;let F=new Set(f.allFields.map(u=>u.id));for(let u of g)for(let h of f.allFields){if(!h.conditions)continue;let R=k(d,u,h.id);m[R]=J(h.conditions,d,u,F);}}return m},[t.allFields,t.repeatableFields,r]),i=useMemo(()=>Object.keys(o).length>0,[o]),n=Le(i?o:{},i?e:{}),a=useCallback(m=>n[m],[n]),s=useCallback(m=>{let d=n[m];return d?d.visible:true},[n]),l=useCallback(m=>{let d=n[m];return d?d.disabled:false},[n]),c=useCallback(m=>{let d=n[m];return d?d.required:false},[n]),p=useCallback(m=>{let d=n[m];return d?d.readonly:false},[n]);return useMemo(()=>({fieldConditions:n,hasConditionalFields:i,getFieldCondition:a,isFieldVisible:s,isFieldDisabled:l,isFieldRequired:c,isFieldReadonly:p}),[n,i,a,s,l,c,p])}function Bt(t){return typeof t=="object"&&t!==null&&"preventDefault"in t}function Qe({store:t,onSubmit:e,validateForm:r,defaultSubmitOptions:o}){let i=useRef(e);i.current=e;let n=useRef(o);return n.current=o,{submit:useCallback(async s=>{let l={};Bt(s)?s.preventDefault():s&&(l=s);let c={...n.current,...l},p=t.getState();if(p.isSubmitting)return false;p._setSubmitting(true);try{if(c.force){let u=t.getState(),R=Object.keys(u._repeatableConfigs).length>0?ne(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return i.current&&await i.current(R),p._setSubmitting(!1),!0}let m=await r();if(!m.isValid&&!c.skipInvalid)return p._setSubmitting(!1),!1;let d=t.getState(),f=d.values;if(c.skipInvalid&&!m.isValid){let u=new Set(Object.entries(d.errors).filter(([,h])=>h.length>0).map(([h])=>h));f=Object.fromEntries(Object.entries(f).filter(([h])=>!u.has(h)));}let F=Object.keys(d._repeatableConfigs).length>0?ne(f,d._repeatableConfigs,d._repeatableOrder):f;return i.current&&await i.current(F),p._setSubmitting(!1),!0}catch(m){return p._setSubmitting(false),console.error("Form submission error:",m),false}},[t,r])}}function de(){return {isValid:true,errors:[]}}function ot({formConfig:t,store:e,conditionsHelpers:r}){let o=useRef(t),i=useRef(r);o.current=t,i.current=r;let n=useCallback(async(s,l)=>{let c=o.current.allFields.find(f=>f.id===s);if(!c){let f=Y(s);if(f&&o.current.repeatableFields){let g=o.current.repeatableFields[f.repeatableId];if(g){let F=g.allFields.find(u=>u.id===f.fieldId);F&&(c={...F,id:s});}}}let p=e.getState();if(!c)return de();if(!i.current.isFieldVisible(s))return p._setErrors(s,[]),p._setValidationState(s,"valid"),de();if(!c.validation||!hasUnifiedValidation(c.validation)){let f=i.current.isFieldRequired(s),g=l!==void 0?l:p.values[s];if(f&&isEmptyValue(g)){let F={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return p._setErrors(s,F.errors),p._setValidationState(s,"invalid"),F}return p._setErrors(s,[]),p._setValidationState(s,"valid"),de()}let m=l!==void 0?l:p.values[s],d=createValidationContext({fieldId:s,formId:o.current.id,allFormData:{...p.values,[s]:m}});p._setValidationState(s,"validating");try{let f=await validateWithUnifiedConfig(c.validation,m,d);if(i.current.isFieldRequired(s)&&isEmptyValue(m)&&!f.errors.some(u=>u.code==="REQUIRED"||u.message.toLowerCase().includes("required"))){let u={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...f.errors]};return p._setErrors(s,u.errors),p._setValidationState(s,"invalid"),u}return p._setErrors(s,f.errors),p._setValidationState(s,f.isValid?"valid":"invalid"),f}catch(f){let g={isValid:false,errors:[{message:f instanceof Error?f.message:"Validation failed",code:"VALIDATION_ERROR"}]};return p._setErrors(s,g.errors),p._setValidationState(s,"invalid"),g}},[e]),a=useCallback(async()=>{let s=e.getState(),l=o.current.allFields.filter(u=>{if(!i.current.isFieldVisible(u.id))return false;let R=u.validation&&hasUnifiedValidation(u.validation),y=i.current.isFieldRequired(u.id);return R||y}),c=o.current.allFields.filter(u=>!i.current.isFieldVisible(u.id));for(let u of c)s._setErrors(u.id,[]),s._setValidationState(u.id,"valid");let p=await Promise.all(l.map(u=>n(u.id))),m=p.some(u=>!u.isValid),d=o.current.repeatableFields??{},f=[];for(let[u,h]of Object.entries(d)){let R=s._repeatableOrder[u]??[];for(let y of R)for(let M of h.allFields){let O=k(u,y,M.id);if(!i.current.isFieldVisible(O)){s._setErrors(O,[]),s._setValidationState(O,"valid");continue}let $=await n(O);f.push($);}h.min!==void 0&&R.length<h.min&&f.push({isValid:false,errors:[{message:`At least ${h.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:u}]});}let g=f.some(u=>!u.isValid);m=m||g;let F=de();if(o.current.validation&&hasUnifiedValidation(o.current.validation)){let u=Object.keys(s.values).reduce((R,y)=>(i.current.isFieldVisible(y)&&(R[y]=s.values[y]),R),{}),h=createValidationContext({formId:o.current.id,allFormData:u});try{F=await validateFormWithUnifiedConfig(o.current.validation,u,h);}catch(R){F={isValid:false,errors:[{message:R instanceof Error?R.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!m&&F.isValid,errors:[...p.flatMap(u=>u.errors),...f.flatMap(u=>u.errors),...F.errors]}},[e,n]);return {validateField:n,validateForm:a}}function xe(t){let e=x(),{formConfig:r}=E(),o=be(t),i=r.repeatableFields?.[t],n=useMemo(()=>i?new Set(i.allFields.map(d=>d.id)):new Set,[i]),a=useMemo(()=>i?o.map((d,f)=>{let g=i.allFields.map(u=>{let h=k(t,d,u.id),R=u.conditions?J(u.conditions,t,d,n):void 0;return {...u,id:h,conditions:R}}),F=i.rows.map(u=>({...u,fields:u.fields.map(h=>{let R=k(t,d,h.id),y=h.conditions?J(h.conditions,t,d,n):void 0;return {...h,id:R,conditions:y}})}));return {key:d,index:f,rows:F,allFields:g}}):[],[t,o,i,n]),s=useMemo(()=>i?i.max===void 0?true:o.length<i.max:false,[i,o.length]),l=useMemo(()=>{if(!i)return false;let d=i.min??0;return o.length>d},[i,o.length]),c=useCallback(d=>{e.getState()._appendRepeatableItem(t,d);},[e,t]),p=useCallback(d=>{e.getState()._removeRepeatableItem(t,d);},[e,t]),m=useCallback((d,f)=>{e.getState()._moveRepeatableItem(t,d,f);},[e,t]);return {items:a,append:c,remove:p,move:m,canAdd:s,canRemove:l,count:o.length}}function jt({formConfig:t,enabled:e=true}){let r=getGlobalMonitor(),o=useRef(null),i=useRef(0),n=useRef(0);useEffect(()=>{r&&e&&(o.current=r.getProfiler());},[r,e]);let a=useCallback(d=>{if(!r||!e)return;i.current++;let f={formId:t.id,fieldCount:t.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:d||i.current};r.track("component_render",`form_${t.id}`,{formId:t.id,fieldCount:t.allFields.length,renderCount:i.current},f,"low");},[r,e,t.id,t.allFields.length]),s=useCallback((d,f)=>{if(!r||!e)return;let g=o.current?.getMetrics(`form_validation_${t.id}`),F={formId:t.id,fieldCount:f||t.allFields.length,timestamp:Date.now(),duration:g?.duration||0,renderDuration:0,validationDuration:g?.duration||0,validationErrors:d,renderCount:i.current};r.track("form_validation",`form_${t.id}`,{formId:t.id,validationErrors:d,fieldCount:f||t.allFields.length},F,d>0?"medium":"low");},[r,e,t.id,t.allFields.length]),l=useCallback((d,f)=>{if(!r||!e)return;let g=o.current?.getMetrics(`form_submission_${t.id}`),F={formId:t.id,fieldCount:f||t.allFields.length,timestamp:Date.now(),duration:g?.duration||0,renderDuration:0,validationDuration:0,validationErrors:d?0:1,renderCount:i.current};r.track("form_submission",`form_${t.id}`,{formId:t.id,success:d,fieldCount:f||t.allFields.length,fieldChanges:n.current},F,d?"low":"high");},[r,e,t.id,t.allFields.length]),c=useCallback((d,f)=>{!r||!e||(n.current++,r.track("component_update",`field_${d}`,{formId:t.id,fieldId:d,componentType:f,changeCount:n.current},void 0,"low"));},[r,e,t.id]),p=useCallback(d=>{!o.current||!e||o.current.start(d,{formId:t.id,renderCount:i.current});},[e,t.id]),m=useCallback(d=>{if(!o.current||!e)return null;let f=o.current.end(d);return f?{...f,formId:t.id,fieldCount:t.allFields.length,renderDuration:f.duration,validationDuration:0,validationErrors:0}:null},[e,t.id,t.allFields.length]);return {trackFormRender:a,trackFormValidation:s,trackFormSubmission:l,trackFieldChange:c,startPerformanceTracking:p,endPerformanceTracking:m}}var nt=createContext(null);function E(){let t=useContext(nt);if(!t)throw new Error("useFormConfigContext must be used within a FormProvider");return t}function Oe({children:t,formConfig:e,defaultValues:r={},onSubmit:o,onFieldChange:i,className:n}){let[a]=useState(()=>{let v=e.repeatableFields??{},b={...r},C={},V={};if(Object.keys(v).some(S=>Array.isArray(r[S]))){let S=se(r,v);b=S.values,C=S.order,V=S.nextKeys;}for(let[S,A]of Object.entries(v))if(!C[S]){let te=A.min??0,B=[],q=V[S]??0;for(let H=0;H<te;H++){let W=`k${q}`;B.push(W);for(let re of A.allFields){let bt=k(S,W,re.id);b[bt]=A.defaultValue?.[re.id]??void 0;}q++;}C[S]=B,V[S]=q;}let D=me(b),_=D.getState();for(let[S,A]of Object.entries(v))_._setRepeatableConfig(S,A);return D.setState({_repeatableOrder:C,_repeatableNextKey:V}),D}),s=useRef(null);useEffect(()=>{if(s.current?.stop(),s.current=null,e.effectsMap&&Object.keys(e.effectsMap).length>0){let v=new oe({effectsMap:e.effectsMap,store:a});v.start(),v.runInitialEffects(),s.current=v;}return ()=>{s.current?.stop(),s.current=null;}},[e.effectsMap,a]);let l=useRef(e.id),c=useRef(i);c.current=i,useEffect(()=>c.current?a.subscribe(b=>b.values,(b,C)=>{for(let V of Object.keys(b))b[V]!==C[V]&&c.current?.(V,b[V],b);}):void 0,[a]),useEffect(()=>{if(l.current!==e.id){l.current=e.id;let v=e.repeatableFields??{},b={...r},C={},V={};if(Object.keys(v).some(_=>Array.isArray(r[_]))){let _=se(r,v);b=_.values,C=_.order,V=_.nextKeys;}for(let[_,S]of Object.entries(v))if(!C[_]){let A=S.min??0,te=[],B=V[_]??0;for(let q=0;q<A;q++){let H=`k${B}`;te.push(H);for(let W of S.allFields){let re=k(_,H,W.id);b[re]=S.defaultValue?.[W.id]??void 0;}B++;}C[_]=te,V[_]=B;}a.getState()._reset(b);let D=a.getState();for(let[_,S]of Object.entries(v))D._setRepeatableConfig(_,S);a.setState({_repeatableOrder:C,_repeatableNextKey:V});}},[e.id,e.repeatableFields,a,r]);let[p,m]=useState(()=>a.getState().values);useEffect(()=>a.subscribe(b=>b.values,b=>m(b)),[a]);let[d,f]=useState(()=>a.getState()._repeatableOrder);useEffect(()=>a.subscribe(b=>b._repeatableOrder,b=>f(b)),[a]);let{fieldConditions:g,hasConditionalFields:F,getFieldCondition:u,isFieldVisible:h,isFieldDisabled:R,isFieldRequired:y,isFieldReadonly:M}=Xe({formConfig:e,formValues:p,repeatableOrder:d});useEffect(()=>{for(let[v,b]of Object.entries(g)){let C={visible:b.visible,disabled:b.disabled,required:b.required,readonly:b.readonly};a.getState()._setFieldConditions(v,C);}},[g,a]);let O=useMemo(()=>({hasConditionalFields:F,getFieldCondition:u,isFieldVisible:h,isFieldDisabled:R,isFieldRequired:y,isFieldReadonly:M}),[F,u,h,R,y,M]),{validateField:$,validateForm:L}=ot({formConfig:e,store:a,conditionsHelpers:O}),{submit:I}=Qe({store:a,onSubmit:o,validateForm:L,defaultSubmitOptions:e.submitOptions}),ee=useMemo(()=>({formConfig:e,conditionsHelpers:O,validateField:$,validateForm:L,submit:I}),[e,O,$,L,I]);return jsx(ae.Provider,{value:a,children:jsx(nt.Provider,{value:ee,children:jsx("form",{onSubmit:I,className:n,noValidate:true,children:t})})})}function Gt({formConfig:t,defaultValues:e,onSubmit:r,onFieldChange:o,className:i,children:n}){let a=useMemo(()=>t instanceof P?t.build():t,[t]);return jsx(Oe,{formConfig:a,defaultValues:e,onSubmit:r,onFieldChange:o,className:i,children:n})}var Z=zt.memo(function({fieldId:e,fieldConfig:r,disabled:o=false,customProps:i={},className:n,forceVisible:a=false}){let{formConfig:s,validateField:l,conditionsHelpers:c}=E(),p=pe(e),m=Fe(e),d=U(e),f=ge(e),{setValue:g,setTouched:F}=ye(e),u=useMemo(()=>{if(r)return r;let C=s.allFields.find(T=>T.id===e);if(C)return C;let V=Y(e);if(V&&s.repeatableFields){let T=s.repeatableFields[V.repeatableId];if(T){let D=T.allFields.find(_=>_.id===V.fieldId);if(D)return {...D,id:e}}}},[r,s.allFields,s.repeatableFields,e]);if(!u)throw new Error(`Field with ID "${e}" not found`);let h=s.config.getComponent(u.componentId);if(!h)throw new Error(`Component with ID "${u.componentId}" not found`);let R=m.validationState==="validating",y=useMemo(()=>({isVisible:a||d.visible,isFieldDisabled:o||d.disabled,isFieldRequired:d.required||c.isFieldRequired(e),isFieldReadonly:d.readonly}),[a,o,d,c,e]),M=useCallback(async C=>{g(C),(u.validation?.validateOnChange||m.touched)&&await l(e,C);},[e,g,l,u.validation?.validateOnChange,m.touched]),O=useCallback(async()=>{m.touched||F(),u.validation?.validateOnBlur!==false&&await l(e);},[e,m.touched,F,l,u.validation?.validateOnBlur]),$=useMemo(()=>({...h.defaultProps??{},...u.props,...f,...i,disabled:y.isFieldDisabled,required:y.isFieldRequired,readOnly:y.isFieldReadonly}),[h.defaultProps,u.props,f,i,y.isFieldDisabled,y.isFieldRequired,y.isFieldReadonly]),L=useMemo(()=>({id:e,props:$,value:p,onChange:M,onBlur:O,disabled:y.isFieldDisabled,error:m.errors,isValidating:R,touched:m.touched}),[e,$,p,M,O,y.isFieldDisabled,m.errors,R,m.touched]);if(!y.isVisible)return null;let I=h.renderer(L),ee=s.renderConfig?.fieldRenderer,v=h.useFieldRenderer!==false,b=ee&&v?ee({children:I,id:e,...$,error:m.errors,isValidating:R,touched:m.touched}):I;return jsx("div",{className:n,"data-field-id":e,"data-field-type":h.type,"data-field-visible":y.isVisible,"data-field-disabled":y.isFieldDisabled,"data-field-required":y.isFieldRequired,"data-field-readonly":y.isFieldReadonly,children:b})});var lt=zt.memo(function({row:e,className:r,...o}){let{formConfig:i,conditionsHelpers:n}=E(),a=useMemo(()=>e.fields.filter(c=>n.isFieldVisible(c.id)),[e.fields,n]),s=useMemo(()=>a.map(c=>jsx(Z,{fieldId:c.id},c.id)),[a]),l=useMemo(()=>({row:e,children:s,className:r}),[e,s,r]);return a.length===0?null:jsx(ComponentRendererWrapper,{name:"FormRow",renderer:i.renderConfig?.rowRenderer,props:l,...o,children:s})}),fe=lt;var De=zt.memo(function({item:e,index:r,total:o,canRemove:i,canMoveUp:n,canMoveDown:a,onRemove:s,onMoveUp:l,onMoveDown:c}){let{formConfig:p}=E(),m=useMemo(()=>new Map(e.allFields.map(g=>[g.id,g])),[e.allFields]),d=useMemo(()=>e.rows.map(g=>jsx(fe,{row:g,children:g.fields.map(F=>jsx(Z,{fieldId:F.id,fieldConfig:m.get(F.id)},F.id))},g.id)),[e.rows,m]),f=p.renderConfig?.repeatableItemRenderer;return f?f({item:e,index:r,total:o,canRemove:i,canMoveUp:n,canMoveDown:a,onRemove:s,onMoveUp:l,onMoveDown:c,children:d}):jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":r,children:d})});var Me=zt.memo(function({repeatableId:e,repeatableConfig:r,className:o}){let{formConfig:i}=E(),{items:n,append:a,remove:s,move:l,canAdd:c,canRemove:p}=xe(e),m=useMemo(()=>n.map((f,g)=>jsx(De,{item:f,index:g,total:n.length,canRemove:p,canMoveUp:g>0,canMoveDown:g<n.length-1,onRemove:()=>s(f.key),onMoveUp:()=>l(g,g-1),onMoveDown:()=>l(g,g+1)},f.key)),[n,p,s,l]),d=i.renderConfig?.repeatableRenderer;return d?d({repeatableId:e,items:n,canAdd:c,canRemove:p,onAdd:()=>a(),min:r.min,max:r.max,children:m}):jsxs("div",{className:o,"data-repeatable-id":e,children:[m,c&&jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var nr=zt.memo(function({className:e,...r}){let{formConfig:o}=E(),i=useMemo(()=>o.rows.map(a=>a.kind==="repeatable"?jsx(Me,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsx(fe,{row:a},a.id)),[o.rows]),n=useMemo(()=>({formConfig:o,children:i,className:e}),[o,i,e]);return jsx(ComponentRendererWrapper,{name:"FormBody",renderer:o.renderConfig?.bodyRenderer,props:n,...r,children:i})});var dr=zt.memo(function({className:e,isSubmitting:r,...o}){let{formConfig:i,submit:n}=E(),{isSubmitting:a}=he(),s=useMemo(()=>({isSubmitting:r??a,onSubmit:n,className:e}),[r,a,n,e]);return jsx(ComponentRendererWrapper,{name:"FormSubmitButton",renderer:i.renderConfig?.submitButtonRenderer,props:s,...o})});var j=class extends Error{constructor(r){let i=r.filter(n=>n.severity==="error").map(n=>`[${n.path}] ${n.message}`).join("; ");super(`Invalid form schema: ${i}`);this.code="SCHEMA_VALIDATION_ERROR";this.name="SchemaValidationError",this.issues=r;}};var Ie=new Set(["required","email","url","number"]),Te={minLength:["min"],maxLength:["max"],min:["min"],max:["max"],pattern:["pattern"]},pt=new Set([...Ie,...Object.keys(Te)]),vr=new Set(["equals","notEquals","greaterThan","lessThan","greaterThanOrEqual","lessThanOrEqual","contains","notContains","in","notIn","matches","exists","notExists"]);function Cr(t,e,r){gt(t,e,r);let o=kr(t),i=P.create(e,t.id);for(let a of o)if(ht(a)){let s=a.repeatable;i.addRepeatable(s.id,l=>{for(let c of s.rows){let p=ft(c.fields,r);l.add(...p);}return s.min!==void 0&&l.min(s.min),s.max!==void 0&&l.max(s.max),s.defaultValue&&l.defaultValue(s.defaultValue),s.validation&&l.validation(Ue(s.validation,r)),l});}else {let l=ft(a.fields,r);i.add(...l);}return t.validation&&i.setValidation(Er(t.validation,r)),t.submitOptions&&i.setSubmitOptions(t.submitOptions),{formConfig:i.build(),defaultValues:t.defaultValues}}function Sr(t){if(typeof t!="object"||t===null)return false;let e=t;if(typeof e.id!="string"||e.id.length===0)return false;let r=Array.isArray(e.fields),o=Array.isArray(e.rows);return !(!r&&!o||r&&o||e.version!==void 0&&e.version!==1)}function gt(t,e,r){let o=[];(!t.id||typeof t.id!="string")&&o.push({path:"id",message:'Form schema must have a non-empty "id"',severity:"error"}),t.version!==void 0&&t.version!==1&&o.push({path:"version",message:`Unsupported schema version "${t.version}". Only version 1 is supported.`,severity:"error"});let i=Array.isArray(t.fields),n=Array.isArray(t.rows);if(!i&&!n&&o.push({path:"",message:'Form schema must have either "fields" or "rows"',severity:"error"}),i&&n&&o.push({path:"",message:'Form schema cannot have both "fields" and "rows". Use one or the other.',severity:"error"}),i&&t.fields){t.fields.length===0&&o.push({path:"fields",message:"Fields array must not be empty",severity:"error"});for(let s=0;s<t.fields.length;s++)Be(t.fields[s],`fields[${s}]`,e,r,o);}if(n&&t.rows){t.rows.length===0&&o.push({path:"rows",message:"Rows array must not be empty",severity:"error"});for(let s=0;s<t.rows.length;s++)wr(t.rows[s],`rows[${s}]`,e,r,o);}if(t.validation?.rules&&qe(t.validation.rules,"validation.rules",r,o),o.filter(s=>s.severity==="error").length>0)throw new j(o)}function wr(t,e,r,o,i){if(ht(t))xr(t,e,r,o,i);else {let n=t;if(!Array.isArray(n.fields)||n.fields.length===0){i.push({path:`${e}.fields`,message:"Row must have at least one field",severity:"error"});return}for(let a=0;a<n.fields.length;a++)Be(n.fields[a],`${e}.fields[${a}]`,r,o,i);}}function xr(t,e,r,o,i){let n=t.repeatable,a=`${e}.repeatable`;if(!n||typeof n!="object"){i.push({path:a,message:'Repeatable row must have a "repeatable" object',severity:"error"});return}if((!n.id||typeof n.id!="string")&&i.push({path:`${a}.id`,message:'Repeatable must have a non-empty "id"',severity:"error"}),n.min!==void 0&&n.min<0&&i.push({path:`${a}.min`,message:`Repeatable "${n.id}": min cannot be negative (${n.min})`,severity:"error"}),n.max!==void 0&&n.max<0&&i.push({path:`${a}.max`,message:`Repeatable "${n.id}": max cannot be negative (${n.max})`,severity:"error"}),n.min!==void 0&&n.max!==void 0&&n.min>n.max&&i.push({path:a,message:`Repeatable "${n.id}": min (${n.min}) cannot be greater than max (${n.max})`,severity:"error"}),!Array.isArray(n.rows)||n.rows.length===0){i.push({path:`${a}.rows`,message:"Repeatable must have at least one row",severity:"error"});return}for(let s=0;s<n.rows.length;s++){let l=n.rows[s];if(!Array.isArray(l.fields)||l.fields.length===0){i.push({path:`${a}.rows[${s}].fields`,message:"Repeatable row must have at least one field",severity:"error"});continue}for(let c=0;c<l.fields.length;c++)Be(l.fields[c],`${a}.rows[${s}].fields[${c}]`,r,o,i);}n.validation?.rules&&qe(n.validation.rules,`${a}.validation.rules`,o,i);}function Be(t,e,r,o,i){if((!t.id||typeof t.id!="string")&&i.push({path:`${e}.id`,message:'Field must have a non-empty "id"',severity:"error"}),!t.type||typeof t.type!="string"?i.push({path:`${e}.type`,message:'Field must have a non-empty "type"',severity:"error"}):r.hasComponent(t.type)||i.push({path:`${e}.type`,message:`Unknown component type "${t.type}". Must be registered in ril config.`,severity:"error"}),t.validation?.rules&&qe(t.validation.rules,`${e}.validation.rules`,o,i),t.effects)for(let n=0;n<t.effects.length;n++)Vr(t.effects[n],`${e}.effects[${n}]`,o,i);t.conditions&&_r(t.conditions,e,i);}function qe(t,e,r,o){let i=Array.isArray(t)?t:[t];for(let n=0;n<i.length;n++){let a=i[n],s=Array.isArray(t)?`${e}[${n}]`:e;if(typeof a=="string")Ie.has(a)||o.push({path:s,message:`Unknown validation shortcut "${a}". Valid shortcuts: ${[...Ie].join(", ")}`,severity:"error"});else if(typeof a=="object"&&a!==null){let{type:l,params:c}=a;if(!l||typeof l!="string"){o.push({path:`${s}.type`,message:'Validation descriptor must have a "type"',severity:"error"});continue}if(Te[l]){let p=Te[l];for(let m of p)(!c||c[m]===void 0)&&o.push({path:`${s}.params.${m}`,message:`Validator "${l}" requires param "${m}"`,severity:"error"});if(l==="pattern"&&c?.pattern!==void 0)try{new RegExp(c.pattern);}catch{o.push({path:`${s}.params.pattern`,message:`Invalid regex pattern: "${c.pattern}"`,severity:"error"});}}else pt.has(l)||r?.validators?.[l]||o.push({path:s,message:`Unknown validator type "${l}". Not a built-in and not found in registry.`,severity:"error"});}else o.push({path:s,message:"Validation descriptor must be a string or object",severity:"error"});}}function Vr(t,e,r,o){(!t.watch||typeof t.watch!="string")&&o.push({path:`${e}.watch`,message:'Effect must have a non-empty "watch" field ID',severity:"error"}),!t.handler||typeof t.handler!="string"?o.push({path:`${e}.handler`,message:'Effect must have a non-empty "handler" registry key',severity:"error"}):r?.effects?.[t.handler]||o.push({path:`${e}.handler`,message:`Effect handler "${t.handler}" not found in registry`,severity:"error"});}function _r(t,e,r){let o=["visible","disabled","required","readonly"];for(let i of o)t[i]&&Ft(t[i],`${e}.conditions.${i}`,r);}function Ft(t,e,r){if(t.conditions&&t.conditions.length>0){for(let o=0;o<t.conditions.length;o++)Ft(t.conditions[o],`${e}.conditions[${o}]`,r);return}(!t.field||typeof t.field!="string")&&r.push({path:`${e}.field`,message:'Leaf condition must have a non-empty "field"',severity:"warning"}),t.operator&&!vr.has(t.operator)&&r.push({path:`${e}.operator`,message:`Invalid condition operator "${t.operator}"`,severity:"error"});}function kr(t){return t.rows?t.rows:t.fields?t.fields.map(e=>({kind:"fields",fields:[e]})):[]}function ht(t){return t.kind==="repeatable"}function ft(t,e){return t.map(r=>{let o={id:r.id,type:r.type,props:r.props};return r.validation&&(o.validation=Ue(r.validation,e)),r.conditions&&(o.conditions=r.conditions),r.effects&&r.effects.length>0&&(o.effects=Or(r.effects,e)),o})}function Ue(t,e){let r={validateOnChange:t.validateOnChange,validateOnBlur:t.validateOnBlur,debounceMs:t.debounceMs};if(t.rules){let i=(Array.isArray(t.rules)?t.rules:[t.rules]).map(n=>Ke(n,e));r.validate=i.length===1?i[0]:i;}return r}function Er(t,e){let r={validateOnSubmit:t.validateOnSubmit,validateOnStepChange:t.validateOnStepChange};if(t.rules){let i=(Array.isArray(t.rules)?t.rules:[t.rules]).map(n=>Ke(n,e));r.validate=i.length===1?i[0]:i;}return r}function Ke(t,e){if(typeof t=="string")return mt(t);let{type:r,params:o,message:i}=t;if(pt.has(r))return mt(r,o,i);if(e?.validators?.[r])return e.validators[r](o,i);throw new Error(`Unknown validator type: "${r}"`)}function mt(t,e,r){switch(t){case "required":return required(r);case "email":return email(r);case "url":return url(r);case "number":return number(r);case "minLength":return minLength(e?.min,r);case "maxLength":return maxLength(e?.max,r);case "min":return min(e?.min,r);case "max":return max(e?.max,r);case "pattern":try{let o=new RegExp(e?.pattern);return pattern(o,r)}catch{throw new j([{path:"validation.rules",message:`Invalid regex pattern: "${e?.pattern}"`,severity:"error"}])}default:throw new Error(`Unknown built-in validator: "${t}"`)}}function Or(t,e){return t.map(r=>{let o=e?.effects?.[r.handler];if(!o)throw new Error(`Effect handler "${r.handler}" not found in registry`);let i=r.params;return onChange(r.watch,(n,a)=>o(n,a,i))})}export{Gt as Form,nr as FormBody,P as FormBuilder,Z as FormField,Oe as FormProvider,lt as FormRow,ae as FormStoreContext,dr as FormSubmitButton,G as RepeatableBuilder,Me as RepeatableField,De as RepeatableItem,j as SchemaValidationError,me as createFormStore,se as flattenRepeatableValues,P as form,Cr as fromSchema,Sr as isFormSchema,Ue as resolveFieldValidation,Ke as resolveValidationDescriptor,ne as structureFormValues,qr as useConditionEvaluation,Zr as useConditionEvaluator,ye as useFieldActions,U as useFieldConditions,Qr as useFieldConditionsLazy,eo as useFieldConditionsWithRefresh,Vt as useFieldErrors,ge as useFieldProps,Fe as useFieldState,_t as useFieldTouched,kt as useFieldValidationState,pe as useFieldValue,It as useFormActions,Xe as useFormConditions,E as useFormConfigContext,Dt as useFormDirty,jt as useFormMonitoring,x as useFormStore,z as useFormStoreApi,Qe as useFormSubmissionWithStore,he as useFormSubmitState,Pt as useFormSubmitting,$t as useFormValid,ot as useFormValidationWithStore,Mt as useFormValues,Le as useMultipleConditionEvaluation,xe as useRepeatableField,be as useRepeatableKeys,gt as validateSchema};
{
"name": "@rilaykit/forms",
"version": "0.1.5",
"version": "0.1.6",
"private": false,

@@ -43,3 +43,3 @@ "description": "Form building utilities and components for RilayKit",

"zustand": "^5.0.5",
"@rilaykit/core": "0.1.5"
"@rilaykit/core": "0.1.6"
},

@@ -46,0 +46,0 @@ "peerDependencies": {

@@ -193,3 +193,3 @@ # @rilaykit/forms

| `form.create(ril, id?)` | Create a new form builder |
| `.add(...fields)` | Add fields (1-3 per row) |
| `.add(...fields)` | Add fields to the form |
| `.addSeparateRows(fields)` | Each field on its own row |

@@ -230,2 +230,14 @@ | `.updateField(id, updates)` | Update a field definition |

### Server-Driven Forms
Generate forms from JSON schemas sent by the backend — no frontend redeployment needed.
```tsx
import { fromSchema } from '@rilaykit/forms';
const { formConfig, defaultValues } = fromSchema(schema, rilConfig, registry);
```
Supports validation descriptors, conditions, effects via registry handlers, and repeatable groups. See the [Server-Driven Forms guide](https://rilay.dev/forms/server-driven-forms) for details.
## Documentation

@@ -239,2 +251,3 @@

- [Advanced Forms](https://rilay.dev/forms/advanced-forms)
- [Server-Driven Forms](https://rilay.dev/forms/server-driven-forms)
- [Form Hooks](https://rilay.dev/forms/hooks)

@@ -241,0 +254,0 @@ - [API Reference](https://rilay.dev/api)