@letar/forms 1.0.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +331 -0
- package/README.md +9 -9
- package/README.ru.md +389 -0
- package/analytics.js +3 -0
- package/analytics.js.map +1 -0
- package/chunk-2PSXYC3I.js +1782 -0
- package/chunk-2PSXYC3I.js.map +1 -0
- package/chunk-5D6S6EGF.js +206 -0
- package/chunk-5D6S6EGF.js.map +1 -0
- package/chunk-6E7VJAJT.js +78 -0
- package/chunk-6E7VJAJT.js.map +1 -0
- package/chunk-CGXKRCSM.js +117 -0
- package/chunk-CGXKRCSM.js.map +1 -0
- package/chunk-DQUVUMCX.js +982 -0
- package/chunk-DQUVUMCX.js.map +1 -0
- package/chunk-K3J4L26K.js +345 -0
- package/chunk-K3J4L26K.js.map +1 -0
- package/chunk-MAYUFA5K.js +822 -0
- package/chunk-MAYUFA5K.js.map +1 -0
- package/{chunk-4V6WBJ76.js → chunk-MVGXZNHP.js} +2 -2
- package/{chunk-4V6WBJ76.js.map → chunk-MVGXZNHP.js.map} +1 -1
- package/chunk-MZDTJSF7.js +299 -0
- package/chunk-MZDTJSF7.js.map +1 -0
- package/chunk-Q5EOF36Y.js +709 -0
- package/chunk-Q5EOF36Y.js.map +1 -0
- package/{chunk-7FEQFDJ7.js → chunk-R2RTCKXY.js} +2 -2
- package/{chunk-7FEQFDJ7.js.map → chunk-R2RTCKXY.js.map} +1 -1
- package/chunk-XFWLD5EO.js +1045 -0
- package/chunk-XFWLD5EO.js.map +1 -0
- package/fields/boolean.js +5 -0
- package/fields/boolean.js.map +1 -0
- package/fields/datetime.js +5 -0
- package/fields/datetime.js.map +1 -0
- package/fields/number.js +5 -0
- package/fields/number.js.map +1 -0
- package/fields/selection.js +5 -0
- package/fields/selection.js.map +1 -0
- package/fields/specialized.js +5 -0
- package/fields/specialized.js.map +1 -0
- package/fields/text.js +5 -0
- package/fields/text.js.map +1 -0
- package/hcaptcha-U4XIT3HS.js +64 -0
- package/hcaptcha-U4XIT3HS.js.map +1 -0
- package/i18n.js +1 -1
- package/index.js +3736 -4962
- package/index.js.map +1 -1
- package/offline.js +1 -1
- package/package.json +59 -4
- package/recaptcha-PKAUAY2S.js +56 -0
- package/recaptcha-PKAUAY2S.js.map +1 -0
- package/server-errors.js +3 -0
- package/server-errors.js.map +1 -0
- package/turnstile-7FXTBSLW.js +36 -0
- package/turnstile-7FXTBSLW.js.map +1 -0
- package/validators/ru.js +73 -0
- package/validators/ru.js.map +1 -0
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/context.tsx","../src/lib/form-hook.ts","../src/lib/form-group.tsx","../src/lib/form-field.tsx","../src/lib/tanstack-form-field.tsx","../src/lib/chakra-form-field.tsx","../src/lib/form-group-list.tsx","../src/lib/declarative/form-context.tsx","../src/lib/declarative/dirty-guard.tsx","../src/lib/declarative/form-fields/base/field-tooltip.tsx","../src/lib/declarative/form-fields/base/field-label.tsx","../src/lib/declarative/form-fields/base/field-utils.ts","../src/lib/declarative/constraint-hints.ts","../src/lib/declarative/zod-utils.ts","../src/lib/declarative/schema-constraints.ts","../src/lib/declarative/schema-meta.ts","../src/lib/declarative/form-fields/base/base-field.tsx","../src/lib/declarative/form-fields/base/use-resolved-field-props.ts","../src/lib/declarative/form-fields/base/create-field.tsx","../src/lib/declarative/form-fields/base/field-wrapper.tsx","../src/lib/declarative/form-fields/base/use-debounce.ts","../src/lib/declarative/form-fields/base/use-async-search.ts","../src/lib/declarative/form-fields/base/selection-field-label.tsx","../src/lib/declarative/form-fields/base/use-grouped-options.ts","../src/lib/declarative/form-fields/text/field-editable.tsx","../src/lib/declarative/form-fields/text/field-password.tsx","../src/lib/declarative/form-fields/text/field-password-strength.tsx","../src/lib/declarative/form-fields/text/image-popover.tsx","../src/lib/declarative/form-fields/text/link-popover.tsx","../src/lib/declarative/form-fields/text/toolbar-config.tsx","../src/lib/declarative/form-fields/text/field-rich-text.tsx","../src/lib/declarative/form-fields/text/field-string.tsx","../src/lib/declarative/form-fields/text/field-textarea.tsx","../src/lib/declarative/form-fields/number/field-currency.tsx","../src/lib/declarative/form-fields/number/field-number.tsx","../src/lib/declarative/form-fields/number/field-number-input.tsx","../src/lib/declarative/form-fields/number/field-percentage.tsx","../src/lib/declarative/form-fields/number/field-rating.tsx","../src/lib/declarative/form-fields/number/field-slider.tsx","../src/lib/declarative/form-fields/datetime/field-date.tsx","../src/lib/declarative/form-fields/datetime/field-date-range.tsx","../src/lib/declarative/form-fields/datetime/field-datetime-picker.tsx","../src/lib/declarative/form-fields/datetime/field-duration.tsx","../src/lib/declarative/form-fields/datetime/field-schedule.tsx","../src/lib/declarative/form-fields/datetime/field-time.tsx","../src/lib/declarative/form-fields/boolean/field-checkbox.tsx","../src/lib/declarative/form-fields/boolean/field-switch.tsx","../src/lib/declarative/form-fields/selection/field-autocomplete.tsx","../src/lib/declarative/form-fields/selection/field-checkbox-card.tsx","../src/lib/declarative/form-fields/selection/field-combobox.tsx","../src/lib/declarative/form-fields/selection/field-listbox.tsx","../src/lib/declarative/form-fields/selection/field-native-select.tsx","../src/lib/declarative/form-fields/selection/field-radio-card.tsx","../src/lib/declarative/form-fields/selection/field-radio-group.tsx","../src/lib/declarative/form-fields/selection/field-segmented-group.tsx","../src/lib/declarative/form-fields/selection/field-select.tsx","../src/lib/declarative/form-fields/selection/field-tags.tsx","../src/lib/declarative/form-fields/specialized/providers/dadata.ts","../src/lib/declarative/form-fields/specialized/field-address.tsx","../src/lib/declarative/form-fields/specialized/field-color-picker.tsx","../src/lib/declarative/form-fields/specialized/field-file-upload.tsx","../src/lib/declarative/form-fields/specialized/field-otp-input.tsx","../src/lib/declarative/form-fields/specialized/field-phone.tsx","../src/lib/declarative/form-fields/specialized/field-pin-input.tsx","../src/lib/declarative/form-fields/text/field-masked-input.tsx","../src/lib/declarative/form-fields/auto/field-auto.tsx","../src/lib/declarative/relation-field-provider.tsx","../src/lib/declarative/field-type-mapper.tsx","../src/lib/declarative/form-group/form-group-declarative.tsx","../src/lib/declarative/form-group/form-group-list-context.tsx","../src/lib/declarative/form-group/form-group-list-buttons.tsx","../src/lib/declarative/form-group/form-group-list-sortable.tsx","../src/lib/declarative/form-group/form-group-list-declarative.tsx","../src/lib/declarative/schema-traversal.ts","../src/lib/declarative/form-auto-fields.tsx","../src/lib/declarative/form-buttons/button-reset.tsx","../src/lib/declarative/form-buttons/button-submit.tsx","../src/lib/declarative/form-fields/selection/field-cascading-select.tsx","../src/lib/declarative/form-fields/specialized/field-city.tsx","../src/lib/declarative/form-debug-values.tsx","../src/lib/declarative/form-root/form-validators.ts","../src/lib/declarative/form-persistence.tsx","../src/lib/declarative/form-root/use-form-features.ts","../src/lib/declarative/form-root/form-simple.tsx","../src/lib/declarative/use-form-api.ts","../src/lib/declarative/form-root/form-loading-state.tsx","../src/lib/declarative/form-root/form-with-api.tsx","../src/lib/declarative/form-root/index.tsx","../src/lib/declarative/form-builder/form-builder.tsx","../src/lib/declarative/form-errors.tsx","../src/lib/declarative/form-from-schema.tsx","../src/lib/declarative/form-steps/form-steps-context.tsx","../src/lib/declarative/form-steps/use-step-navigation.ts","../src/lib/declarative/form-steps/use-step-persistence.ts","../src/lib/declarative/form-steps/use-step-state.ts","../src/lib/declarative/form-steps/form-steps.tsx","../src/lib/declarative/form-steps/form-steps-completed.tsx","../src/lib/declarative/form-steps/form-steps-indicator.tsx","../src/lib/declarative/form-steps/form-steps-navigation.tsx","../src/lib/declarative/form-steps/form-steps-step.tsx","../src/lib/declarative/form-when.tsx","../src/lib/declarative/lazy-component.tsx","../src/lib/declarative/create-form.tsx","../src/lib/declarative/use-field-actions.ts","../src/lib/declarative/with-ui-meta.ts","../src/lib/declarative/common-meta.ts","../src/lib/declarative/index.ts","../src/lib/contexts/create-safe-context.tsx"],"names":["jsx","createContext","useContext","ChakraFormField","fieldContext","FieldLabel","ChakraField","jsxs","ChakraTooltip","getSchemaAtPath","isRequired","Field","FieldWrapper","useState","useEffect","Fragment","HStack","useMemo","IconButton","VStack","Input","LuEyeOff","LuEye","Box","Text","useRef","useCallback","Portal","LuX","Popover","Button","LuLink","LuImage","editor","NumberInput","formatDate","memo","ScheduleContent","createListCollection","Spinner","Flex","useFilter","Combobox","formContext","List","Icon","LuUpload","PinInput","withMask","FormGroupListContext","FormGroupListItemContext","getZodType","getUIMeta","getEnumValues","content","Select","renderField","STORAGE_PREFIX","Steps","LuCheck","extractFieldNames","Children","isValidElement","Form","getNestedValue","FormGroupList","FormGroup","FormField","FormSteps"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport { createFormHookContexts } from '@tanstack/react-form'\nimport { type ReactNode, useMemo } from 'react'\n\n/**\n * Form hook contexts for the application\n *\n * These contexts and hooks are used by custom field components\n * to access form and field state without prop drilling.\n *\n * @example\n * ```tsx\n * // In a custom field component\n * import { useFieldContext, useFormContext } from '@lena/form-components'\n *\n * function TextField({ label }: { label: string }) {\n * const field = useFieldContext<string>()\n * return (\n * <label>\n * {label}\n * <input\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * </label>\n * )\n * }\n * ```\n */\nexport const { fieldContext, formContext, useFieldContext, useFormContext } = createFormHookContexts()\n\n/**\n * Typed wrapper around useFormContext.\n *\n * Solves the typing problem: standard useFormContext() does not accept a type argument,\n * so accessing typed values requires a workaround `as unknown as T`.\n * This hook does it automatically.\n *\n * @example\n * ```tsx\n * interface Settings {\n * fontSize: number\n * columns: number\n * }\n *\n * function LivePreview() {\n * const { values, form } = useTypedFormContext<Settings>()\n *\n * return (\n * <form.Subscribe selector={(s) => values(s)}>\n * {(settings) => (\n * // settings has type Settings\n * <div style={{ fontSize: settings.fontSize }}>...</div>\n * )}\n * </form.Subscribe>\n * )\n * }\n * ```\n */\nexport function useTypedFormContext<TFormData extends object>() {\n const rawForm = useFormContext()\n\n return useMemo(\n () => ({\n /**\n * Original form API from TanStack Form.\n * Use form.store for useStore subscriptions.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n form: rawForm as any,\n\n /**\n * Typed setFieldValue.\n * Use instead of form.setFieldValue for proper typing.\n */\n setFieldValue: <K extends keyof TFormData & string>(name: K, value: TFormData[K]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(rawForm.setFieldValue as any)(name, value)\n },\n\n /**\n * Typed selector for values.\n * Use inside form.Subscribe: `selector={(s) => values(s)}`\n */\n values: (state: { values: unknown }) => state.values as TFormData,\n\n /**\n * Get current form values (snapshot).\n * Note: this is not reactive! For reactive access use form.Subscribe.\n */\n getValues: () => rawForm.state.values as unknown as TFormData,\n\n /**\n * Subscribe to a specific field.\n * Returns a selector for use in form.Subscribe.\n */\n field: <K extends keyof TFormData>(name: K) => (state: { values: unknown }) => (state.values as TFormData)[name],\n }),\n [rawForm],\n )\n}\n\n/**\n * Types for TypedFormSubscribe component\n */\ninterface TypedFormSubscribeProps<TFormData extends object, TSelected> {\n /** Selector for choosing data from form state */\n selector: (values: TFormData) => TSelected\n /** Render function receiving selected data */\n children: (selected: TSelected) => ReactNode\n}\n\n/**\n * Typed Subscribe component for convenient form value subscriptions.\n *\n * @example\n * ```tsx\n * function LivePreview() {\n * const { TypedSubscribe } = useTypedFormSubscribe<Settings>()\n *\n * return (\n * <TypedSubscribe selector={(values) => values.fontSize}>\n * {(fontSize) => <div style={{ fontSize }}>...</div>}\n * </TypedSubscribe>\n * )\n * }\n * ```\n */\nexport function useTypedFormSubscribe<TFormData extends object>() {\n const form = useFormContext()\n\n const TypedSubscribe = useMemo(() => {\n return function TypedFormSubscribe<TSelected,>({\n selector,\n children,\n }: TypedFormSubscribeProps<TFormData, TSelected>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedSelector = (state: any) => selector(state.values as unknown as TFormData)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedChildren = children as any\n return <form.Subscribe selector={wrappedSelector}>{wrappedChildren}</form.Subscribe>\n }\n }, [form])\n\n return { form, TypedSubscribe }\n}\n","'use client'\n\nimport { createFormHook, type FieldApi, type FormApi } from '@tanstack/react-form'\nimport { fieldContext, formContext } from './context'\n\n/**\n * Base field components for forms\n * Can be extended in individual applications\n */\nconst fieldComponents = {}\n\n/**\n * Base form components\n * Can be extended in individual applications\n */\nconst formComponents = {}\n\n/**\n * Creates a form hook for a specific application\n *\n * useAppForm provides a preconfigured form hook with:\n * - Pre-configured field and form contexts\n * - Access to form.AppField and form.AppForm for custom components\n *\n * @example\n * ```tsx\n * import { useAppForm } from '@lena/form-components'\n *\n * function MyForm() {\n * const form = useAppForm({\n * defaultValues: {\n * email: '',\n * name: '',\n * },\n * onSubmit: async ({ value }) => {\n * await submitToServer(value)\n * },\n * })\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); form.handleSubmit() }}>\n * <form.Field\n * name=\"email\"\n * children={(field) => (\n * <input\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * />\n * )}\n * />\n * <button type=\"submit\">Submit</button>\n * </form>\n * )\n * }\n * ```\n */\nexport const { useAppForm, withForm } = createFormHook({\n fieldContext,\n formContext,\n fieldComponents,\n formComponents,\n})\n\n// Re-export types for convenience\nexport type { FieldApi, FormApi }\n","'use client'\n\nimport { createContext, useContext, type ReactNode } from 'react'\n\n/**\n * Context value providing form field naming information\n */\nexport interface FormGroupContextValue {\n /** Original name prop passed to this FormGroup */\n originalName: string\n /** Full dotted path including all parent FormGroup names */\n name: string\n}\n\nconst FormGroupContext = createContext<FormGroupContextValue | null>(null)\n\nexport interface FormGroupProps {\n /** Field name for this group. Will be concatenated with parent names using dot notation */\n name: string\n children: ReactNode\n}\n\n/**\n * FormGroup component for building nested form field names\n *\n * @example\n * ```tsx\n * <FormGroup name=\"user\">\n * <FormGroup name=\"address\">\n * <FormGroup name=\"street\">\n * // useFormGroup() returns { originalName: 'street', name: 'user.address.street' }\n * </FormGroup>\n * </FormGroup>\n * </FormGroup>\n * ```\n */\nexport function FormGroup({ name, children }: FormGroupProps) {\n const parentContext = useContext(FormGroupContext)\n\n const contextValue: FormGroupContextValue = {\n originalName: name,\n name: parentContext ? `${parentContext.name}.${name}` : name,\n }\n\n return <FormGroupContext.Provider value={contextValue}>{children}</FormGroupContext.Provider>\n}\n\n/**\n * Hook to access current FormGroup context\n *\n * @returns FormGroup context value with originalName and full dotted path name,\n * or null if not inside a FormGroup\n *\n * @example\n * ```tsx\n * function MyField() {\n * const formGroup = useFormGroup();\n * const fieldName = formGroup?.name || 'defaultName';\n * return <input name={fieldName} />;\n * }\n * ```\n */\nexport function useFormGroup(): FormGroupContextValue | null {\n return useContext(FormGroupContext)\n}\n","'use client'\n\nimport { createContext, useContext, type ReactNode } from 'react'\nimport { useFormGroup } from './form-group'\n\n/**\n * Context value for FormField\n */\nexport interface FormFieldContextValue {\n /** Original name prop passed to this FormField */\n originalName: string\n /** Full dotted path including all parent FormGroup/FormField names */\n name: string\n}\n\nconst FormFieldContext = createContext<FormFieldContextValue | null>(null)\n\nexport interface FormFieldProps {\n /** Field name. Will be concatenated with parent FormGroup names using dot notation */\n name: string\n /**\n * Either React elements or a render function receiving field naming info.\n * If function: receives { originalName, name } as parameter\n * If elements: can use useFormField() hook to access field naming info\n */\n children: ReactNode | ((props: FormFieldContextValue) => ReactNode)\n}\n\n/**\n * FormField component for building form field names\n *\n * Uses FormGroup context to build dotted path names.\n * Supports two usage patterns:\n * 1. Render prop: Pass a function to receive field naming info directly\n * 2. Context: Pass regular elements that use useFormField() hook\n *\n * @example\n * ```tsx\n * // Render prop pattern\n * <FormField name=\"email\">\n * {({ name }) => <Input name={name} />}\n * </FormField>\n *\n * // Context pattern with hook\n * <FormField name=\"email\">\n * <MyCustomInput /> // uses useFormField() internally\n * </FormField>\n *\n * // Inside FormGroup\n * <FormGroup name=\"user\">\n * <FormField name=\"email\">\n * {({ name }) => <Input name={name} />} // name=\"user.email\"\n * </FormField>\n * </FormGroup>\n * ```\n */\nexport function FormField({ name, children }: FormFieldProps) {\n const formGroupContext = useFormGroup()\n\n const contextValue: FormFieldContextValue = {\n originalName: name,\n name: formGroupContext ? `${formGroupContext.name}.${name}` : name,\n }\n\n const content = typeof children === 'function' ? children(contextValue) : children\n\n return <FormFieldContext.Provider value={contextValue}>{content}</FormFieldContext.Provider>\n}\n\n/**\n * Hook to access current FormField context\n *\n * @returns FormField context value with originalName and full dotted path name,\n * or null if not inside a FormField\n *\n * @example\n * ```tsx\n * function MyInput() {\n * const formField = useFormField();\n * return <input name={formField?.name} />;\n * }\n * ```\n */\nexport function useFormField(): FormFieldContextValue | null {\n return useContext(FormFieldContext)\n}\n","'use client'\n\nimport { type AnyFieldApi } from '@tanstack/react-form'\nimport { createContext, useContext, type ReactNode } from 'react'\nimport { useFormGroup } from './form-group'\n\n/**\n * Context value for TanStackFormField\n * Provides both naming info and TanStack Form field API\n */\nexport interface TanStackFormFieldContextValue {\n /** Original name prop passed to this field */\n originalName: string\n /** Full dotted path including all parent FormGroup names */\n name: string\n /** TanStack Form field API */\n field: AnyFieldApi\n}\n\nconst TanStackFormFieldContext = createContext<TanStackFormFieldContextValue | null>(null)\n\nexport interface TanStackFormFieldProps {\n /** Field name. Will be concatenated with parent FormGroup names using dot notation */\n name: string\n /** TanStack Form field API from form.Field or useField */\n field: AnyFieldApi\n /**\n * Either React elements or a render function receiving field info.\n * If function: receives { originalName, name, field } as parameter\n * If elements: can use useTanStackFormField() hook to access field info\n */\n children: ReactNode | ((props: TanStackFormFieldContextValue) => ReactNode)\n}\n\n/**\n * TanStackFormField component integrating TanStack Form with FormGroup context\n *\n * Combines TanStack Form's field API with FormGroup's dotted naming for\n * building complex nested form structures.\n *\n * @example\n * ```tsx\n * // Direct usage with form.Field\n * <form.Field name=\"email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * {({ field: f, name }) => (\n * <Input\n * name={name}\n * value={f.state.value}\n * onChange={(e) => f.handleChange(e.target.value)}\n * />\n * )}\n * </TanStackFormField>\n * )}\n * </form.Field>\n *\n * // Inside FormGroup\n * <FormGroup name=\"user\">\n * <form.Field name=\"user.email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * <ChakraTextField /> // uses useTanStackFormField() internally\n * </TanStackFormField>\n * )}\n * </form.Field>\n * </FormGroup>\n * ```\n */\nexport function TanStackFormField({ name, field, children }: TanStackFormFieldProps) {\n const formGroupContext = useFormGroup()\n\n const contextValue: TanStackFormFieldContextValue = {\n originalName: name,\n name: formGroupContext ? `${formGroupContext.name}.${name}` : name,\n field,\n }\n\n const content = typeof children === 'function' ? children(contextValue) : children\n\n return <TanStackFormFieldContext.Provider value={contextValue}>{content}</TanStackFormFieldContext.Provider>\n}\n\n/**\n * Hook to access current TanStackFormField context\n *\n * @returns TanStackFormField context value with originalName, full dotted path name,\n * and TanStack Form field API, or null if not inside a TanStackFormField\n *\n * @example\n * ```tsx\n * function MyInput() {\n * const ctx = useTanStackFormField();\n * if (!ctx) return null;\n *\n * const { field, name } = ctx;\n * return (\n * <input\n * name={name}\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * );\n * }\n * ```\n */\nexport function useTanStackFormField(): TanStackFormFieldContextValue | null {\n return useContext(TanStackFormFieldContext)\n}\n","'use client'\n\nimport { Field as ChakraField } from '@chakra-ui/react'\nimport { forwardRef, type ReactNode } from 'react'\nimport { useTanStackFormField } from './tanstack-form-field'\n\nexport interface ChakraFormFieldProps extends Omit<ChakraField.RootProps, 'label' | 'invalid'> {\n /** Field label text */\n label?: ReactNode\n /** Helper text below the field */\n helperText?: ReactNode\n /** Override error text (by default uses TanStack Form errors) */\n errorText?: ReactNode\n /** Text for optional field */\n optionalText?: ReactNode\n /** Show required field indicator */\n required?: boolean\n /** Override invalid state (by default uses TanStack Form errors) */\n invalid?: boolean\n /** Children elements — the form input element itself */\n children: ReactNode\n}\n\n/**\n * ChakraFormField - Chakra UI v3 field with TanStack Form integration\n *\n * Automatically displays validation errors from TanStack Form field API.\n * Must be used inside a TanStackFormField component.\n *\n * @example\n * ```tsx\n * <form.Field name=\"email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * <ChakraFormField label=\"Email\" helperText=\"Your work email\" required>\n * <Input\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * </ChakraFormField>\n * </TanStackFormField>\n * )}\n * </form.Field>\n * ```\n */\nexport const ChakraFormField = forwardRef<HTMLDivElement, ChakraFormFieldProps>(function ChakraFormField(props, ref) {\n const { label, children, helperText, errorText, optionalText, required, invalid, ...rest } = props\n\n const fieldContext = useTanStackFormField()\n\n // Get errors from TanStack Form field\n const fieldErrors = fieldContext?.field.state.meta.errors\n const hasErrors = fieldErrors && fieldErrors.length > 0\n const isInvalid = invalid ?? hasErrors\n\n // Format error messages\n const errorMessages = errorText\n ?? (hasErrors\n ? fieldErrors\n .map((e: unknown) => (typeof e === 'string' ? e : ((e as { message?: string }).message ?? String(e))))\n .join(', ')\n : undefined)\n\n // Workaround: Chakra UI Field types do not include children in Next.js 16 production build\n const FieldLabel = ChakraField.Label as React.FC<{ children: ReactNode }>\n const FieldHelperText = ChakraField.HelperText as React.FC<{ children: ReactNode }>\n const FieldErrorText = ChakraField.ErrorText as React.FC<{ children: ReactNode }>\n\n return (\n <ChakraField.Root ref={ref} invalid={isInvalid} required={required} {...rest}>\n {label && (\n <FieldLabel>\n {label}\n <ChakraField.RequiredIndicator fallback={optionalText} />\n </FieldLabel>\n )}\n {children}\n {helperText && !isInvalid && <FieldHelperText>{helperText}</FieldHelperText>}\n {isInvalid && errorMessages && <FieldErrorText>{errorMessages}</FieldErrorText>}\n </ChakraField.Root>\n )\n})\n","'use client'\n\nimport { type AnyFieldApi } from '@tanstack/react-form'\nimport { createContext, useContext, type ReactNode } from 'react'\nimport { FormGroup } from './form-group'\n\n/**\n * Context value for FormGroupList array operations\n */\nexport interface FormGroupListContextValue<TItem = unknown> {\n /** Array field API for add/remove operations */\n pushValue: (value: TItem) => void\n removeValue: (index: number) => void\n moveValue: (from: number, to: number) => void\n swapValues: (indexA: number, indexB: number) => void\n insertValue: (index: number, value: TItem) => void\n replaceValue: (index: number, value: TItem) => void\n /** Current array values */\n values: TItem[]\n /** Number of items in the array */\n length: number\n}\n\n/**\n * Context value for FormGroupListItem\n */\nexport interface FormGroupListItemContextValue {\n /** Index of this item in the array */\n index: number\n /** Remove this item from the array */\n remove: () => void\n /** Whether this is the first item */\n isFirst: boolean\n /** Whether this is the last item */\n isLast: boolean\n /** Move this item up (swap with previous) */\n moveUp: () => void\n /** Move this item down (swap with next) */\n moveDown: () => void\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FormGroupListContext = createContext<FormGroupListContextValue<any> | null>(null)\nconst FormGroupListItemContext = createContext<FormGroupListItemContextValue | null>(null)\n\nexport interface FormGroupListProps<TItem = unknown> {\n /** Field name for this array group */\n name: string\n /** TanStack Form field API with mode=\"array\" */\n field: AnyFieldApi\n /**\n * Render function for array items.\n * Receives item, index, and array field operations.\n */\n children: (items: TItem[], ctx: FormGroupListContextValue<TItem>) => ReactNode\n /** Content to show when array is empty */\n emptyContent?: ReactNode\n}\n\n/**\n * FormGroupList - Component for managing array fields with TanStack Form\n *\n * Provides array operations (add, remove, move, swap) and integrates with\n * FormGroup for nested field naming.\n *\n * @example\n * ```tsx\n * <form.Field name=\"phones\" mode=\"array\">\n * {(phonesField) => (\n * <FormGroupList name=\"phones\" field={phonesField} emptyContent=\"No phones added\">\n * {(items, { pushValue }) => (\n * <>\n * {items.map((_, index) => (\n * <FormGroupListItem key={index} index={index}>\n * {({ remove }) => (\n * <FormGroup name={String(index)}>\n * <form.Field name={`phones[${index}].number`}>\n * {(field) => <Input value={field.state.value} onChange={(e) => field.handleChange(e.target.value)} />}\n * </form.Field>\n * <Button onClick={remove}>Remove</Button>\n * </FormGroup>\n * )}\n * </FormGroupListItem>\n * ))}\n * <Button onClick={() => pushValue({ number: '' })}>Add Phone</Button>\n * </>\n * )}\n * </FormGroupList>\n * )}\n * </form.Field>\n * ```\n */\nexport function FormGroupList<TItem = unknown>({ name, field, children, emptyContent }: FormGroupListProps<TItem>) {\n const values = ((field.state.value as unknown[]) ?? []) as TItem[]\n\n const contextValue: FormGroupListContextValue<TItem> = {\n pushValue: (value: TItem) => field.pushValue(value),\n removeValue: (index: number) => field.removeValue(index),\n moveValue: (from: number, to: number) => field.moveValue(from, to),\n swapValues: (indexA: number, indexB: number) => field.swapValues(indexA, indexB),\n insertValue: (index: number, value: TItem) => field.insertValue(index, value),\n replaceValue: (index: number, value: TItem) => field.replaceValue(index, value),\n values,\n length: values.length,\n }\n\n const content = values.length === 0 && emptyContent ? emptyContent : children(values, contextValue)\n\n return (\n <FormGroup name={name}>\n <FormGroupListContext.Provider value={contextValue}>{content}</FormGroupListContext.Provider>\n </FormGroup>\n )\n}\n\nexport interface FormGroupListItemProps {\n /** Index of this item in the array */\n index: number\n /**\n * Render function receiving item context with remove and move operations\n */\n children: ReactNode | ((ctx: FormGroupListItemContextValue) => ReactNode)\n}\n\n/**\n * FormGroupListItem - Wrapper for individual array items\n *\n * Provides item-specific operations (remove, move up/down) and\n * creates a FormGroup with the item index as name.\n *\n * @example\n * ```tsx\n * <FormGroupListItem index={index}>\n * {({ remove, moveUp, moveDown, isFirst, isLast }) => (\n * <HStack>\n * <Input />\n * <Button onClick={moveUp} disabled={isFirst}>Up</Button>\n * <Button onClick={moveDown} disabled={isLast}>Down</Button>\n * <Button onClick={remove}>Remove</Button>\n * </HStack>\n * )}\n * </FormGroupListItem>\n * ```\n */\nexport function FormGroupListItem({ index, children }: FormGroupListItemProps) {\n const listContext = useFormGroupList()\n\n if (!listContext) {\n throw new Error('FormGroupListItem must be used inside FormGroupList')\n }\n\n const itemContext: FormGroupListItemContextValue = {\n index,\n remove: () => listContext.removeValue(index),\n isFirst: index === 0,\n isLast: index === listContext.length - 1,\n moveUp: () => {\n if (index > 0) {\n listContext.swapValues(index, index - 1)\n }\n },\n moveDown: () => {\n if (index < listContext.length - 1) {\n listContext.swapValues(index, index + 1)\n }\n },\n }\n\n const content = typeof children === 'function' ? children(itemContext) : children\n\n return (\n <FormGroup name={String(index)}>\n <FormGroupListItemContext.Provider value={itemContext}>{content}</FormGroupListItemContext.Provider>\n </FormGroup>\n )\n}\n\n/**\n * Hook to access FormGroupList context with array operations\n *\n * @returns FormGroupList context with pushValue, removeValue, etc.\n * or null if not inside a FormGroupList\n */\nexport function useFormGroupList<TItem = unknown>(): FormGroupListContextValue<TItem> | null {\n return useContext(FormGroupListContext)\n}\n\n/**\n * Hook to access FormGroupListItem context with item operations\n *\n * @returns FormGroupListItem context with remove, moveUp, moveDown, etc.\n * or null if not inside a FormGroupListItem\n */\nexport function useFormGroupListItem(): FormGroupListItemContextValue | null {\n return useContext(FormGroupListItemContext)\n}\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { DeclarativeFormContextValue } from './types'\n\n/**\n * Context for declarative form API\n * Provides access to form instance and primitive array index\n */\nexport const DeclarativeFormContext = createContext<DeclarativeFormContextValue | null>(null)\n\n/**\n * Hook to access declarative form context\n * @throws Error if used outside of Form component\n */\nexport function useDeclarativeForm(): DeclarativeFormContextValue {\n const context = useContext(DeclarativeFormContext)\n if (!context) {\n throw new Error('useDeclarativeForm must be used inside a Form component')\n }\n return context\n}\n\n/**\n * Hook to access declarative form context (nullable)\n * @returns Context or null if outside Form\n */\nexport function useDeclarativeFormOptional(): DeclarativeFormContextValue | null {\n return useContext(DeclarativeFormContext)\n}\n","'use client'\n\nimport { useRouter } from 'next/navigation'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\n/**\n * Props for DirtyGuard component\n */\nexport interface DirtyGuardProps {\n /**\n * Message to show in browser's native beforeunload dialog\n * Note: Most modern browsers ignore custom messages and show their own\n */\n message?: string\n /**\n * Title for the confirmation dialog\n * @default \"Unsaved changes\"\n */\n dialogTitle?: string\n /**\n * Description for the confirmation dialog\n * @default \"You have unsaved changes. Are you sure you want to leave this page?\"\n */\n dialogDescription?: string\n /**\n * Text for the confirm button\n * @default \"Leave\"\n */\n confirmText?: string\n /**\n * Text for the cancel button\n * @default \"Stay\"\n */\n cancelText?: string\n /**\n * Whether to enable the guard (default: true)\n * Can be used to conditionally disable the guard\n */\n enabled?: boolean\n /**\n * Callback when user attempts to leave with unsaved changes\n * Return false to allow navigation without confirmation\n */\n onBlock?: () => boolean | void\n}\n\n/**\n * Form.DirtyGuard - Prevent accidental navigation when form has unsaved changes\n *\n * Shows browser's native confirmation dialog when user tries to:\n * - Close the tab/window\n * - Refresh the page\n *\n * Shows custom dialog for in-app navigation:\n * - Clicking on Next.js Link components\n * - Clicking on anchor tags with internal hrefs\n *\n * @example Basic usage\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.DirtyGuard />\n * <Form.Field.String name=\"title\" />\n * <Form.Button.Submit />\n * </Form>\n * ```\n *\n * @example With custom messages\n * ```tsx\n * <Form.DirtyGuard\n * dialogTitle=\"Leaving?\"\n * dialogDescription=\"Data will be lost!\"\n * confirmText=\"Yes, leave\"\n * cancelText=\"No, stay\"\n * />\n * ```\n */\nexport function DirtyGuard({\n message = 'You have unsaved changes. Are you sure you want to leave?',\n dialogTitle = 'Unsaved changes',\n dialogDescription = 'You have unsaved changes. Are you sure you want to leave this page?',\n confirmText = 'Leave',\n cancelText = 'Stay',\n enabled = true,\n onBlock,\n}: DirtyGuardProps): ReactElement | null {\n const { form } = useDeclarativeForm()\n const router = useRouter()\n const [showDialog, setShowDialog] = useState(false)\n const pendingHref = useRef<string | null>(null)\n\n // Check isDirty\n const checkIsDirty = useCallback(() => {\n const state = form.state\n return state.isDirty\n }, [form])\n\n // Handler for beforeunload (tab close, refresh)\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n const handleBeforeUnload = (event: BeforeUnloadEvent): string | undefined => {\n if (checkIsDirty()) {\n const shouldBlock = onBlock?.()\n if (shouldBlock === false) {\n return undefined\n }\n\n event.preventDefault()\n event.returnValue = message\n return message\n }\n return undefined\n }\n\n window.addEventListener('beforeunload', handleBeforeUnload)\n return () => window.removeEventListener('beforeunload', handleBeforeUnload)\n }, [enabled, message, onBlock, checkIsDirty])\n\n // Intercept clicks on internal links\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n const handleClick = (event: MouseEvent) => {\n // Check if form is dirty\n if (!checkIsDirty()) {\n return\n }\n\n // Find closest anchor or element with data-href\n const target = event.target as HTMLElement\n const anchor = target.closest('a')\n\n if (!anchor) {\n return\n }\n\n const href = anchor.getAttribute('href')\n if (!href) {\n return\n }\n\n // Skip external links and special protocols\n if (\n href.startsWith('http://') ||\n href.startsWith('https://') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#')\n ) {\n return\n }\n\n // Skip if target=\"_blank\"\n if (anchor.target === '_blank') {\n return\n }\n\n // Skip if Ctrl/Cmd is held (open in new tab)\n if (event.ctrlKey || event.metaKey) {\n return\n }\n\n // Call onBlock callback\n const shouldBlock = onBlock?.()\n if (shouldBlock === false) {\n return\n }\n\n // Prevent navigation and show dialog\n event.preventDefault()\n event.stopPropagation()\n pendingHref.current = href\n setShowDialog(true)\n }\n\n // Use capture to intercept before Next.js\n document.addEventListener('click', handleClick, { capture: true })\n return () => document.removeEventListener('click', handleClick, { capture: true })\n }, [enabled, onBlock, checkIsDirty])\n\n // Confirm navigation\n const handleConfirm = useCallback(() => {\n setShowDialog(false)\n if (pendingHref.current) {\n // Reset dirty state before navigation to avoid re-triggering\n form.reset()\n router.push(pendingHref.current)\n pendingHref.current = null\n }\n }, [form, router])\n\n // Cancel navigation\n const handleCancel = useCallback(() => {\n setShowDialog(false)\n pendingHref.current = null\n }, [])\n\n // Render confirmation dialog\n if (!showDialog) {\n return null\n }\n\n // Simple inline dialog (no dependency on Chakra Dialog)\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n }}\n onClick={handleCancel}\n >\n <div\n style={{\n backgroundColor: 'var(--chakra-colors-bg-panel, white)',\n borderRadius: '12px',\n padding: '24px',\n maxWidth: '400px',\n width: '90%',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2\n style={{\n margin: '0 0 8px 0',\n fontSize: '1.125rem',\n fontWeight: 600,\n color: 'var(--chakra-colors-fg, inherit)',\n }}\n >\n {dialogTitle}\n </h2>\n <p\n style={{\n margin: '0 0 24px 0',\n fontSize: '0.875rem',\n color: 'var(--chakra-colors-fg-muted, #666)',\n }}\n >\n {dialogDescription}\n </p>\n <div\n style={{\n display: 'flex',\n gap: '12px',\n justifyContent: 'flex-end',\n }}\n >\n <button\n onClick={handleCancel}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: '1px solid var(--chakra-colors-border, #e2e8f0)',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n }}\n >\n {cancelText}\n </button>\n <button\n onClick={handleConfirm}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'var(--chakra-colors-red-500, #e53e3e)',\n color: 'white',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n }}\n >\n {confirmText}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { Box, Tooltip as ChakraTooltip, Circle, Portal, Text, VStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { LuCircleHelp } from 'react-icons/lu'\nimport type { FieldTooltipMeta } from '../../types'\n\nexport type FieldTooltipProps = FieldTooltipMeta\n\n/**\n * Tooltip component for form fields.\n * Shows a \"?\" icon with a popup hint on hover.\n *\n * @example\n * ```tsx\n * <FieldTooltip\n * description=\"Specify the brand of your training car\"\n * example=\"Hyundai, Kia, Volkswagen\"\n * impact=\"Students often search for instructor by car brand\"\n * />\n * ```\n */\nexport function FieldTooltip({ title, description, example, impact }: FieldTooltipProps): ReactElement {\n return (\n <ChakraTooltip.Root openDelay={200} positioning={{ placement: 'top' }}>\n <ChakraTooltip.Trigger asChild>\n <Circle\n size=\"5\"\n cursor=\"help\"\n color=\"fg.muted\"\n _hover={{ color: 'colorPalette.fg' }}\n transition=\"color 0.2s\"\n display=\"inline-flex\"\n >\n <LuCircleHelp size={16} />\n </Circle>\n </ChakraTooltip.Trigger>\n <Portal>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content>\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n <VStack align=\"start\" gap={2} maxW=\"280px\" p={1}>\n {title && (\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {title}\n </Text>\n )}\n <Text fontSize=\"sm\">{description}</Text>\n {example && (\n <Box bg=\"bg.emphasized\" px={2} py={1} borderRadius=\"md\" w=\"full\">\n <Text fontSize=\"xs\" color=\"fg.muted\">\n Example:\n </Text>\n <Text fontSize=\"sm\" fontStyle=\"italic\">\n "{example}"\n </Text>\n </Box>\n )}\n {impact && (\n <Text fontSize=\"xs\" color=\"green.fg\">\n {impact}\n </Text>\n )}\n </VStack>\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n )\n}\n","'use client'\n\nimport { Field, HStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { FieldTooltipMeta } from '../../types'\nimport { FieldTooltip } from './field-tooltip'\n\nexport interface FieldLabelProps {\n /** Label text (can be ReactNode for complex labels with links) */\n label?: ReactNode\n /** Tooltip for hint next to label */\n tooltip?: FieldTooltipMeta\n /** Show required field indicator */\n required?: boolean\n}\n\n/**\n * Label component for form fields with tooltip support.\n *\n * If tooltip is provided, renders HStack with label and hint icon.\n * Otherwise renders a simple Field.Label.\n *\n * @example\n * ```tsx\n * // Simple label\n * <FieldLabel label=\"Title\" required />\n *\n * // Label with tooltip\n * <FieldLabel\n * label=\"Car Brand\"\n * tooltip={{ description: 'Specify the brand', example: 'Hyundai' }}\n * required\n * />\n * ```\n */\nexport function FieldLabel({ label, tooltip, required }: FieldLabelProps): ReactElement | null {\n if (!label) {\n return null\n }\n\n return (\n <Field.Label>\n {tooltip ? (\n <HStack gap={1}>\n <span>{label}</span>\n <FieldTooltip {...tooltip} />\n </HStack>\n ) : (\n label\n )}\n {required && <Field.RequiredIndicator />}\n </Field.Label>\n )\n}\n","'use client'\n\nimport type { ValidationError } from '@tanstack/react-form'\n\n/**\n * Formats validation errors into a string for display\n *\n * Handles various error formats:\n * - Strings (returned as-is)\n * - Objects with `message` (StandardSchemaV1Issue, ZodIssue)\n * - Objects with `issues` array (ZodError)\n * - Nested error structures\n *\n * @example\n * ```tsx\n * const errors = field.state.meta.errors\n * {hasFieldErrors(errors) && (\n * <Field.ErrorText>{formatFieldErrors(errors)}</Field.ErrorText>\n * )}\n * ```\n */\nexport function formatFieldErrors(errors: ValidationError[]): string {\n return errors\n .map((e) => extractErrorMessage(e))\n .filter(Boolean)\n .join(', ')\n}\n\n/**\n * Extracts error message from various formats\n *\n * @internal\n */\nfunction extractErrorMessage(e: ValidationError): string {\n // String error\n if (typeof e === 'string') {\n return e\n }\n\n // Null/undefined\n if (e === null || e === undefined) {\n return ''\n }\n\n // Object with error\n if (typeof e === 'object') {\n // Array of errors (Zod issues from superRefine, array of strings etc.)\n if (Array.isArray(e)) {\n return e\n .map((item: unknown) => {\n // Element with message (ZodIssue)\n if (typeof item === 'object' && item && 'message' in item) {\n return (item as { message: string }).message\n }\n // String\n if (typeof item === 'string') {\n return item\n }\n return ''\n })\n .filter(Boolean)\n .join(', ')\n }\n\n // Standard format: { message: string }\n if ('message' in e && typeof e.message === 'string') {\n return e.message\n }\n\n // Zod format with issues array: { issues: Array<{ message: string }> }\n if ('issues' in e && Array.isArray(e.issues)) {\n return e.issues\n .map((issue: unknown) => {\n if (typeof issue === 'object' && issue && 'message' in issue) {\n return (issue as { message: string }).message\n }\n return ''\n })\n .filter(Boolean)\n .join(', ')\n }\n\n // Zod flat errors: { fieldErrors: Record<string, string[]> }\n if ('fieldErrors' in e && typeof e.fieldErrors === 'object' && e.fieldErrors) {\n const fieldErrors = e.fieldErrors as Record<string, string[]>\n return Object.values(fieldErrors).flat().filter(Boolean).join(', ')\n }\n\n // Zod format errors: { _errors: string[] }\n if ('_errors' in e && Array.isArray(e._errors)) {\n return (e._errors as string[]).filter(Boolean).join(', ')\n }\n\n // Fallback: try JSON.stringify for debugging\n // This is better than [object Object], can detect unknown formats\n try {\n const json = JSON.stringify(e)\n // If JSON is too long or empty object, don't show\n if (json === '{}' || json.length > 200) {\n return ''\n }\n // Log in dev mode for debugging unknown formats\n if (process.env.NODE_ENV === 'development') {\n console.warn('[form-components] Unknown error format:', e)\n }\n return json\n } catch {\n return ''\n }\n }\n\n // Other types (number, boolean) — unlikely, but handled\n return String(e)\n}\n\n/**\n * Checks for the presence of validation errors\n *\n * @example\n * ```tsx\n * const errors = field.state.meta.errors\n * const hasError = hasFieldErrors(errors)\n * ```\n */\nexport function hasFieldErrors(errors: ValidationError[] | undefined): errors is ValidationError[] {\n return Boolean(errors && errors.length > 0)\n}\n\n/**\n * Interface for useFieldErrors result\n */\nexport interface FieldErrorsResult {\n /** Validation errors */\n errors: ValidationError[]\n /** Whether there are errors */\n hasError: boolean\n /** Formatted error message */\n errorMessage: string\n}\n\n/**\n * Extracts error information from field API\n *\n * Simplifies error retrieval in manual Field components\n * that do not use the createField factory.\n *\n * @example\n * ```tsx\n * <form.Field name={fullPath}>\n * {(field: AnyFieldApi) => {\n * const { hasError, errorMessage } = getFieldErrors(field)\n * return (\n * <Field.Root invalid={hasError}>\n * ...\n * <FieldError hasError={hasError} errorMessage={errorMessage} />\n * </Field.Root>\n * )\n * }}\n * </form.Field>\n * ```\n */\nexport function getFieldErrors(field: { state: { meta: { errors?: ValidationError[] } } }): FieldErrorsResult {\n const errors = field.state.meta.errors ?? []\n const hasError = hasFieldErrors(errors)\n const errorMessage = hasError ? formatFieldErrors(errors) : ''\n return { errors, hasError, errorMessage }\n}\n","'use client'\n\nimport type {\n ZodArrayConstraints,\n ZodConstraints,\n ZodDateConstraints,\n ZodNumberConstraints,\n ZodStringConstraints,\n} from './schema-constraints'\n\n// =============================================================================\n// Translation types\n// =============================================================================\n\n/**\n * String templates for constraint hints.\n * Placeholders: {n}, {min}, {max}, {chars}, {items}, {suffix}\n */\nexport type ConstraintHintTranslations = {\n string_exact: string\n string_range: string\n string_max: string\n string_min: string\n number_range: string\n number_max: string\n number_min: string\n number_integer: string\n number_integer_suffix: string\n date_range: string\n date_after: string\n date_before: string\n array_exact: string\n array_range: string\n array_max: string\n array_min: string\n}\n\n// =============================================================================\n// Built-in translations (en, ru)\n// =============================================================================\n\nconst EN_TRANSLATIONS: ConstraintHintTranslations = {\n string_exact: 'Exactly {n} {chars}',\n string_range: 'From {min} to {max} characters',\n string_max: 'Maximum {n} {chars}',\n string_min: 'Minimum {n} {chars}',\n number_range: 'From {min} to {max}{suffix}',\n number_max: 'Maximum {max}{suffix}',\n number_min: 'Minimum {min}{suffix}',\n number_integer: 'Integer',\n number_integer_suffix: ' (integer)',\n date_range: 'From {min} to {max}',\n date_after: 'Not before {min}',\n date_before: 'Not after {max}',\n array_exact: 'Exactly {n} {items}',\n array_range: 'From {min} to {max} items',\n array_max: 'Maximum {n} {items}',\n array_min: 'Minimum {n} {items}',\n}\n\nconst RU_TRANSLATIONS: ConstraintHintTranslations = {\n string_exact: 'Ровно {n} {chars}',\n string_range: 'От {min} до {max} символов',\n string_max: 'Максимум {n} {chars}',\n string_min: 'Минимум {n} {chars}',\n number_range: 'От {min} до {max}{suffix}',\n number_max: 'Максимум {max}{suffix}',\n number_min: 'Минимум {min}{suffix}',\n number_integer: 'Целое число',\n number_integer_suffix: ' (целое)',\n date_range: 'С {min} по {max}',\n date_after: 'Не ранее {min}',\n date_before: 'Не позднее {max}',\n array_exact: 'Ровно {n} {items}',\n array_range: 'От {min} до {max} элементов',\n array_max: 'Максимум {n} {items}',\n array_min: 'Минимум {n} {items}',\n}\n\nconst BUILTIN_TRANSLATIONS: Record<string, ConstraintHintTranslations> = {\n en: EN_TRANSLATIONS,\n ru: RU_TRANSLATIONS,\n}\n\n// =============================================================================\n// Pluralization via Intl.PluralRules\n// =============================================================================\n\ntype PluralForms = { one: string; few?: string; many?: string; other: string }\n\nconst CHAR_PLURALS: Record<string, PluralForms> = {\n en: { one: 'character', other: 'characters' },\n ru: { one: 'символ', few: 'символа', many: 'символов', other: 'символов' },\n}\n\nconst ITEM_PLURALS: Record<string, PluralForms> = {\n en: { one: 'item', other: 'items' },\n ru: { one: 'элемент', few: 'элемента', many: 'элементов', other: 'элементов' },\n}\n\nfunction pluralizeWord(n: number, locale: string, plurals: Record<string, PluralForms>): string {\n const lang = locale.split('-')[0]!\n const forms = plurals[lang] ?? plurals.en!\n const rule = new Intl.PluralRules(locale).select(n)\n return (forms as Record<string, string>)[rule] ?? forms.other\n}\n\n// =============================================================================\n// Formatting via Intl\n// =============================================================================\n\nfunction formatNumber(n: number, locale: string): string {\n if (Number.isInteger(n)) {\n return new Intl.NumberFormat(locale).format(n)\n }\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(n)\n}\n\nfunction formatDate(dateStr: string, locale: string): string {\n try {\n const date = new Date(dateStr)\n return new Intl.DateTimeFormat(locale, {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(date)\n } catch {\n return dateStr\n }\n}\n\n// =============================================================================\n// Template engine\n// =============================================================================\n\nfunction template(str: string, vars: Record<string, string | number>): string {\n return str.replace(/\\{(\\w+)\\}/g, (_, key) => String(vars[key] ?? ''))\n}\n\n// =============================================================================\n// Translation resolution\n// =============================================================================\n\nfunction getTranslations(locale: string, custom?: Partial<ConstraintHintTranslations>): ConstraintHintTranslations {\n const lang = locale.split('-')[0]!\n const base = BUILTIN_TRANSLATIONS[lang] ?? BUILTIN_TRANSLATIONS[locale] ?? EN_TRANSLATIONS\n if (custom) {\n return { ...base, ...custom }\n }\n return base\n}\n\n// =============================================================================\n// Main API\n// =============================================================================\n\n/**\n * Generates a human-readable hint from constraints.\n *\n * Supports i18n via locale parameter (en, ru built-in).\n * For other languages, pass customTranslations.\n *\n * @param constraints - constraints from Zod schema\n * @param locale - locale (default 'en')\n * @param customTranslations - custom string templates\n *\n * @example\n * ```tsx\n * generateConstraintHint(constraints) // → \"Minimum 2 characters\"\n * generateConstraintHint(constraints, 'ru') // -> \"Минимум 2 символа\"\n * ```\n */\nexport function generateConstraintHint(\n constraints: ZodConstraints | undefined,\n locale: string = 'en',\n customTranslations?: Partial<ConstraintHintTranslations>\n): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n const t = getTranslations(locale, customTranslations)\n\n switch (constraints.schemaType) {\n case 'string':\n return generateStringHint(constraints.string, locale, t)\n case 'number':\n return generateNumberHint(constraints.number, locale, t)\n case 'date':\n return generateDateHint(constraints.date, locale, t)\n case 'array':\n return generateArrayHint(constraints.array, locale, t)\n default:\n return undefined\n }\n}\n\n// =============================================================================\n// Type-specific generators\n// =============================================================================\n\nfunction generateStringHint(\n constraints: ZodStringConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { minLength, maxLength, inputType } = constraints\n\n // Special types - only maxLength\n if (inputType === 'email' || inputType === 'url') {\n if (maxLength) {\n return template(t.string_max, { n: maxLength, chars: pluralizeWord(maxLength, locale, CHAR_PLURALS) })\n }\n return undefined\n }\n\n if (minLength !== undefined && maxLength !== undefined) {\n if (minLength === maxLength) {\n return template(t.string_exact, { n: minLength, chars: pluralizeWord(minLength, locale, CHAR_PLURALS) })\n }\n return template(t.string_range, { min: minLength, max: maxLength })\n }\n\n if (maxLength !== undefined) {\n return template(t.string_max, { n: maxLength, chars: pluralizeWord(maxLength, locale, CHAR_PLURALS) })\n }\n\n if (minLength !== undefined) {\n return template(t.string_min, { n: minLength, chars: pluralizeWord(minLength, locale, CHAR_PLURALS) })\n }\n\n return undefined\n}\n\nfunction generateNumberHint(\n constraints: ZodNumberConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { min, max, isInteger } = constraints\n const suffix = isInteger ? t.number_integer_suffix : ''\n\n if (min !== undefined && max !== undefined) {\n return template(t.number_range, { min: formatNumber(min, locale), max: formatNumber(max, locale), suffix })\n }\n\n if (max !== undefined) {\n return template(t.number_max, { max: formatNumber(max, locale), suffix })\n }\n\n if (min !== undefined) {\n return template(t.number_min, { min: formatNumber(min, locale), suffix })\n }\n\n if (isInteger) {\n return t.number_integer\n }\n\n return undefined\n}\n\nfunction generateDateHint(\n constraints: ZodDateConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { min, max } = constraints\n\n if (min && max) {\n return template(t.date_range, { min: formatDate(min, locale), max: formatDate(max, locale) })\n }\n\n if (min) {\n return template(t.date_after, { min: formatDate(min, locale) })\n }\n\n if (max) {\n return template(t.date_before, { max: formatDate(max, locale) })\n }\n\n return undefined\n}\n\nfunction generateArrayHint(\n constraints: ZodArrayConstraints | undefined,\n locale: string,\n t: ConstraintHintTranslations\n): string | undefined {\n if (!constraints) return undefined\n\n const { minItems, maxItems } = constraints\n\n if (minItems !== undefined && maxItems !== undefined) {\n if (minItems === maxItems) {\n return template(t.array_exact, { n: minItems, items: pluralizeWord(minItems, locale, ITEM_PLURALS) })\n }\n return template(t.array_range, { min: minItems, max: maxItems })\n }\n\n if (maxItems !== undefined) {\n return template(t.array_max, { n: maxItems, items: pluralizeWord(maxItems, locale, ITEM_PLURALS) })\n }\n\n if (minItems !== undefined) {\n return template(t.array_min, { n: minItems, items: pluralizeWord(minItems, locale, ITEM_PLURALS) })\n }\n\n return undefined\n}\n","/**\n * Utilities for working with Zod v4 schemaми\n *\n * Общие features для разворачивания обёрток схемы\n * (optional, nullable, default) и получения базовой схемы.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Result разворачивания схемы с инformцией об обязательности\n */\nexport interface UnwrapResult {\n /** Развёрнутая schema (без optional/nullable/default обёрток) */\n schema: any\n /** Является the field обязательным (false if было optional/nullable) */\n required: boolean\n}\n\n/**\n * Разворачивает обёртки optional/nullable/default и returns базовую схему\n *\n * Supports как Zod v4 (inner), так и возможные различия в API.\n *\n * @example\n * ```ts\n * const innerSchema = unwrapSchema(z.string().optional())\n * // innerSchema will z.string()\n * ```\n */\nexport function unwrapSchema(schema: any): any {\n if (!schema?._zod?.def) {\n return schema\n }\n\n const type = schema._zod.def.type\n\n // Разворачиваем wrapper-typeы\n // Zod v4 uses inner или innerType depending on версии\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n const inner = schema._zod.def.inner ?? schema._zod.def.innerType\n if (inner) {\n return unwrapSchema(inner)\n }\n }\n\n return schema\n}\n\n/**\n * Разворачивает схему и returns инformцию об обязательности поля\n *\n * В отличие от `unwrapSchema`, also отслеживает была ли schema optional/nullable.\n *\n * @example\n * ```ts\n * const { schema, required } = unwrapSchemaWithRequired(z.string().optional())\n * // schema = z.string()\n * // required = false\n * ```\n */\nexport function unwrapSchemaWithRequired(schema: any): UnwrapResult {\n if (!schema?._zod?.def) {\n return { schema, required: true }\n }\n\n const type = schema._zod.def.type\n\n // Разворачиваем обёртки, чтобы получить внутреннюю схему\n if (type === 'optional' || type === 'nullable') {\n const inner = schema._zod.def.inner ?? schema._zod.def.innerType\n if (inner) {\n const result = unwrapSchemaWithRequired(inner)\n return { schema: result.schema, required: false } // optional/nullable = НЕ обязательно\n }\n }\n\n if (type === 'default') {\n // default() делает field необязательным для HTML form — value подставится automatically\n const inner = schema._zod.def.inner ?? schema._zod.def.innerType\n if (inner) {\n const result = unwrapSchemaWithRequired(inner)\n return { schema: result.schema, required: false }\n }\n }\n\n return { schema, required: true }\n}\n\n/**\n * Получает type Zod схемы\n */\nexport function getZodType(schema: any): string | undefined {\n return schema?._zod?.def?.type\n}\n\n/**\n * Checks, is ли schema optional\n */\nexport function isOptionalSchema(schema: any): boolean {\n const type = getZodType(schema)\n return type === 'optional' || type === 'nullable'\n}\n\n/**\n * Checks, имеет ли schema default value\n */\nexport function hasDefaultValue(schema: any): boolean {\n return getZodType(schema) === 'default'\n}\n","'use client'\n\nimport { unwrapSchema } from './zod-utils'\n\n/**\n * Constraint extraction from Zod v4 schemas for automatic form field configuration\n *\n * Supports:\n * - Strings: minLength, maxLength, email, url, regex\n * - Numbers: min, max, step (int, multipleOf), positive/negative\n * - Dates: min, max\n * - Arrays: minItems, maxItems\n *\n * Zod v4 structure:\n * - Checks are stored in `schema._zod.def.checks[]`\n * - Each check has `_zod.def` with type and parameters\n */\n\n// =============================================================================\n// Constraint types\n// =============================================================================\n\n/** Constraints for string fields */\nexport interface ZodStringConstraints {\n minLength?: number\n maxLength?: number\n /** Automatically input type based on Zod checks (email, url) */\n inputType?: 'text' | 'email' | 'url' | 'tel'\n /** HTML5 pattern from regex */\n pattern?: string\n}\n\n/** Constraints for number fields */\nexport interface ZodNumberConstraints {\n min?: number\n max?: number\n step?: number\n isInteger?: boolean\n}\n\n/** Constraints for date fields */\nexport interface ZodDateConstraints {\n /** Minimum date in YYYY-MM-DD format */\n min?: string\n /** Maximum date in YYYY-MM-DD format */\n max?: string\n}\n\n/** Constraints for arrays */\nexport interface ZodArrayConstraints {\n minItems?: number\n maxItems?: number\n}\n\n/** Result of constraint extraction from schema */\nexport interface ZodConstraints {\n string?: ZodStringConstraints\n number?: ZodNumberConstraints\n date?: ZodDateConstraints\n array?: ZodArrayConstraints\n /** Schema type to determine which constraints to apply */\n schemaType?: 'string' | 'number' | 'date' | 'array' | 'boolean' | 'enum' | 'unknown'\n}\n\n// =============================================================================\n// Main function\n// =============================================================================\n\n/**\n * Extracts constraints from Zod schema by field path\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * title: z.string().min(2).max(100),\n * rating: z.number().min(1).max(10),\n * birthday: z.date().min(new Date('1900-01-01')),\n * tags: z.array(z.string()).max(5),\n * })\n *\n * getZodConstraints(schema, 'title')\n * // { schemaType: 'string', string: { minLength: 2, maxLength: 100 } }\n *\n * getZodConstraints(schema, 'rating')\n * // { schemaType: 'number', number: { min: 1, max: 10 } }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getZodConstraints(schema: any, path: string): ZodConstraints {\n if (!schema) {\n return { schemaType: 'unknown' }\n }\n\n const fieldSchema = getSchemaAtPath(schema, path)\n if (!fieldSchema) {\n return { schemaType: 'unknown' }\n }\n\n const def = fieldSchema._zod?.def\n if (!def) {\n return { schemaType: 'unknown' }\n }\n\n const type = def.type\n const checks = def.checks || []\n\n switch (type) {\n case 'string':\n return {\n schemaType: 'string',\n string: extractStringConstraints(checks),\n }\n\n case 'number':\n return {\n schemaType: 'number',\n number: extractNumberConstraints(checks),\n }\n\n case 'date':\n return {\n schemaType: 'date',\n date: extractDateConstraints(checks),\n }\n\n case 'array':\n return {\n schemaType: 'array',\n array: extractArrayConstraints(checks),\n }\n\n case 'boolean':\n return { schemaType: 'boolean' }\n\n case 'enum':\n return { schemaType: 'enum' }\n\n default:\n return { schemaType: 'unknown' }\n }\n}\n\n// =============================================================================\n// Constraint extraction by types (Zod v4 structure)\n// =============================================================================\n\n/**\n * Handler type for a check\n * Receives constraints object and checkDef, modifies constraints\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CheckHandler<T> = (constraints: T, checkDef: any) => void\n\n/**\n * Generic function to extract constraints from Zod checks\n *\n * The handler pattern avoids duplicating iteration logic.\n * Each type (string, number, date, array) defines its own handlers.\n *\n * @param checks - Array of Zod checks from schema\n * @param handlers - Object with handlers for each check type\n * @returns Constraints object populated by handlers\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractConstraints<T extends object>(checks: any[], handlers: Record<string, CheckHandler<T>>): T {\n const constraints = {} as T\n\n for (const check of checks) {\n const checkDef = check._zod?.def\n if (!checkDef) {\n continue\n }\n\n const handler = handlers[checkDef.check]\n if (handler) {\n handler(constraints, checkDef)\n }\n }\n\n return constraints\n}\n\n// =============================================================================\n// Handlers for string constraints\n// =============================================================================\n\nconst stringConstraintHandlers: Record<string, CheckHandler<ZodStringConstraints>> = {\n min_length: (c, def) => {\n c.minLength = def.minimum\n },\n max_length: (c, def) => {\n c.maxLength = def.maximum\n },\n length_equals: (c, def) => {\n // Exact length = both min and max\n c.minLength = def.length\n c.maxLength = def.length\n },\n string_format: (c, def) => {\n // email(), url() and other formats\n if (def.format === 'email') {\n c.inputType = 'email'\n } else if (def.format === 'url') {\n c.inputType = 'url'\n } else if (def.format === 'regex' && def.pattern?.source) {\n c.pattern = def.pattern.source\n }\n },\n}\n\n/**\n * Extracts constraints from string checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractStringConstraints(checks: any[]): ZodStringConstraints {\n return extractConstraints(checks, stringConstraintHandlers)\n}\n\n// =============================================================================\n// Handlers for number constraints\n// =============================================================================\n\nconst numberConstraintHandlers: Record<string, CheckHandler<ZodNumberConstraints>> = {\n greater_than: (c, def) => {\n // min() creates inclusive: true, gt() creates inclusive: false\n c.min = def.value\n },\n less_than: (c, def) => {\n // max() creates inclusive: true, lt() creates inclusive: false\n c.max = def.value\n },\n number_format: (c, def) => {\n // int() creates format: 'safeint'\n if (def.format === 'safeint') {\n c.isInteger = true\n c.step = 1\n }\n },\n multiple_of: (c, def) => {\n c.step = def.value\n },\n}\n\n/**\n * Extracts constraints from number checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractNumberConstraints(checks: any[]): ZodNumberConstraints {\n return extractConstraints(checks, numberConstraintHandlers)\n}\n\n// =============================================================================\n// Handlers for date constraints\n// =============================================================================\n\nconst dateConstraintHandlers: Record<string, CheckHandler<ZodDateConstraints>> = {\n greater_than: (c, def) => {\n // min() for dates\n if (def.value) {\n c.min = formatDateToISO(def.value)\n }\n },\n less_than: (c, def) => {\n // max() for dates\n if (def.value) {\n c.max = formatDateToISO(def.value)\n }\n },\n}\n\n/**\n * Extracts constraints from date checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractDateConstraints(checks: any[]): ZodDateConstraints {\n return extractConstraints(checks, dateConstraintHandlers)\n}\n\n// =============================================================================\n// Handlers for array constraints\n// =============================================================================\n\nconst arrayConstraintHandlers: Record<string, CheckHandler<ZodArrayConstraints>> = {\n min_length: (c, def) => {\n c.minItems = def.minimum\n },\n max_length: (c, def) => {\n c.maxItems = def.maximum\n },\n length: (c, def) => {\n c.minItems = def.length\n c.maxItems = def.length\n },\n}\n\n/**\n * Extracts constraints from array checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractArrayConstraints(checks: any[]): ZodArrayConstraints {\n return extractConstraints(checks, arrayConstraintHandlers)\n}\n\n// =============================================================================\n// Helper functions\n// =============================================================================\n\n/**\n * Navigate to schema by path (reuses logic from schema-meta.ts)\n * Supports nested objects, arrays, optional/nullable\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSchemaAtPath(schema: any, path: string): any {\n if (!schema || !path) {\n return schema\n }\n\n const parts = path.split('.')\n let current = schema\n\n for (const part of parts) {\n current = unwrapSchema(current)\n\n if (!current) {\n return undefined\n }\n\n // Skip numeric indices (for arrays we use element schema)\n if (/^\\d+$/.test(part)) {\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Navigate into object shape\n if (current._zod?.def?.type === 'object') {\n const shape = current._zod.def.shape\n if (shape && part in shape) {\n current = shape[part]\n } else {\n return undefined\n }\n } else {\n return undefined\n }\n }\n\n return unwrapSchema(current)\n}\n\n/**\n * Formats a date to YYYY-MM-DD string for HTML input[type=\"date\"]\n * Accepts Date, ISO string or timestamp\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction formatDateToISO(value: any): string {\n let date: Date\n\n if (value instanceof Date) {\n date = value\n } else if (typeof value === 'string') {\n date = new Date(value)\n } else if (typeof value === 'number') {\n date = new Date(value)\n } else {\n return ''\n }\n\n if (isNaN(date.getTime())) {\n return ''\n }\n\n const year = date.getFullYear()\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${year}-${month}-${day}`\n}\n","'use client'\n\nimport type { FieldUIMeta } from './types'\nimport { unwrapSchemaWithRequired } from './zod-utils'\n\n/**\n * Result анализа схемы поля\n */\nexport interface FieldSchemaInfo {\n /** UI metadata из .meta({ ui: {...} }) */\n ui?: FieldUIMeta\n /** Обязательно the field (не optional/nullable) */\n required: boolean\n}\n\n/**\n * Extracts UI metadata и статус обязательности from Zod schema по пути поля\n *\n * Supports вложенные пути вроде \"info.base.rating\" и пути arrayов вроде \"components.0.title\"\n *\n * @example\n * ```tsx\n * const schema = z.object({\n * title: z.string().meta({ ui: { title: 'Название' } }), // обязательно\n * subtitle: z.string().optional(), // optional\n * })\n *\n * getFieldMeta(schema, 'title') // { ui: { title: 'Название' }, required: true }\n * getFieldMeta(schema, 'subtitle') // { ui: undefined, required: false }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getFieldMeta(schema: any, path: string): FieldSchemaInfo {\n if (!schema) {\n return { required: false }\n }\n\n const result = getSchemaAtPath(schema, path)\n if (!result.schema) {\n return { required: false }\n }\n\n // Zod v4: meta is stored in globalRegistry, accessed via .meta() method\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const fieldSchema = result.schema as any\n const meta = typeof fieldSchema?.meta === 'function' ? fieldSchema.meta() : undefined\n\n return {\n ui: meta?.ui as FieldUIMeta | undefined,\n required: result.required,\n }\n}\n\ninterface SchemaPathResult {\n /** Схема поля ДО финального unwrap (для извлечения мета) */\n schema: unknown\n /** Обязательность поля after анализа всей цепочки */\n required: boolean\n}\n\n/**\n * Разворачивает wrapper-typeы схемы (effects, pipeline, transform) до базовой схемы\n * Сохраняет optional/nullable обёртки для корректного определения required\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction unwrapToBaseSchema(schema: any): any {\n if (!schema?._zod?.def) {\n return schema\n }\n\n const type = schema._zod.def.type\n\n // Zod v4: effects (от superRefine, refine) имеют inner схему\n if (type === 'effects' || type === 'transform' || type === 'preprocess') {\n const inner = schema._zod.def.inner ?? schema._zod.def.schema\n if (inner) {\n return unwrapToBaseSchema(inner)\n }\n }\n\n // Zod v4: pipeline (от pipe) имеет in и out схемы\n if (type === 'pipeline') {\n const inner = schema._zod.def.in\n if (inner) {\n return unwrapToBaseSchema(inner)\n }\n }\n\n return schema\n}\n\n/**\n * Навигация к схеме по заданному пути\n * Обрабатывает objectы, arrayы и обёртки optional/nullable/effects/pipeline\n * Returns и схему, и статус обязательности\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSchemaAtPath(schema: any, path: string): SchemaPathResult {\n if (!schema || !path) {\n return { schema, required: true }\n }\n\n const parts = path.split('.')\n let current = schema\n let isRequired = true\n\n for (const part of parts) {\n // Сначала разворачиваем effects/pipeline/transform до базовой схемы\n current = unwrapToBaseSchema(current)\n\n const unwrapped = unwrapSchemaWithRequired(current)\n current = unwrapped.schema\n // Отслеживаем, встретили ли optional/nullable\n if (!unwrapped.required) {\n isRequired = false\n }\n\n if (!current) {\n return { schema: undefined, required: false }\n }\n\n // Снова разворачиваем after unwrap (effects могут быть inside optional)\n current = unwrapToBaseSchema(current)\n\n // Пропускаем numberвые индексы (elementы arrayа используют схему elementа)\n if (/^\\d+$/.test(part)) {\n // For arrays get element schema\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Transitionим в shape objectа\n if (current._zod?.def?.type === 'object') {\n const shape = current._zod.def.shape\n if (shape && part in shape) {\n current = shape[part]\n } else {\n return { schema: undefined, required: false }\n }\n } else {\n return { schema: undefined, required: false }\n }\n }\n\n // Разворачиваем only effects/pipeline, сохраняя default/optional для мета\n current = unwrapToBaseSchema(current)\n\n // Определяем required based on typeа обёртки, но возвращаем схему ДО unwrap\n // чтобы can было получить мета из .meta()\n const finalUnwrap = unwrapSchemaWithRequired(current)\n\n return {\n // Возвращаем схему ДО unwrap — на ней can быть мета (.default().meta())\n schema: current,\n required: isRequired && finalUnwrap.required,\n }\n}\n","'use client'\n\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport { getZodConstraints, type ZodConstraints } from '../../schema-constraints'\nimport { getFieldMeta } from '../../schema-meta'\nimport type { FieldUIMeta } from '../../types'\n\n/**\n * Hook to get full field path, form instance, UI meta, required status, and constraints for declarative fields\n *\n * Handles both regular fields and primitive array fields (without name)\n */\nexport function useDeclarativeField(name?: string): {\n form: ReturnType<typeof useDeclarativeForm>['form']\n fullPath: string\n name: string\n meta: FieldUIMeta | undefined\n /** Whether field is required (from Zod schema - not optional/nullable) */\n required: boolean\n /** Global disabled state from Form */\n formDisabled: boolean\n /** Global readOnly state from Form */\n formReadOnly: boolean\n /** Automatic constraints from Zod schema (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n} {\n const { form, schema, primitiveArrayIndex, disabled, readOnly } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full path\n let fullPath: string\n\n if (name) {\n // Regular field with name\n fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n } else if (parentGroup) {\n // Primitive array: FormGroup already includes the index in path (e.g., \"tags.0\")\n fullPath = parentGroup.name\n } else {\n throw new Error('Field must have a name prop or be inside Form.Group.List for primitive arrays')\n }\n\n // Extract UI metadata and required status from schema\n const schemaInfo = getFieldMeta(schema, fullPath)\n\n // Extract constraints from schema (min, max, minLength, maxLength, etc.)\n const constraints = getZodConstraints(schema, fullPath)\n\n return {\n form,\n fullPath,\n name: name ?? String(primitiveArrayIndex),\n meta: schemaInfo.ui,\n required: schemaInfo.required,\n formDisabled: disabled ?? false,\n formReadOnly: readOnly ?? false,\n constraints,\n }\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\nimport { getLocalizedValue, useFormI18n, useLocalizedOptions } from '../../../i18n'\nimport { generateConstraintHint } from '../../constraint-hints'\nimport type { ZodConstraints } from '../../schema-constraints'\nimport type { BaseFieldProps, FieldOptionMeta, FieldTooltipMeta } from '../../types'\nimport { useDeclarativeField } from './base-field'\n\n/**\n * Resolves all field props considering schema and form-level settings\n *\n * Priority:\n * 1. Component props (highest)\n * 2. Zod schema meta (ui: { title, placeholder, description, tooltip })\n * 3. Automatically generated hint from constraints (if helperText not set)\n * 4. Form-level settings (disabled, readOnly)\n *\n * @example\n * ```tsx\n * function FieldString({ name, label, placeholder, helperText, required, disabled, readOnly, tooltip }: StringFieldProps) {\n * const {\n * form, fullPath,\n * label: resolvedLabel,\n * placeholder: resolvedPlaceholder,\n * helperText: resolvedHelperText,\n * required: resolvedRequired,\n * disabled: resolvedDisabled,\n * readOnly: resolvedReadOnly,\n * tooltip: resolvedTooltip,\n * constraints,\n * } = useResolvedFieldProps(name, { label, placeholder, helperText, required, disabled, readOnly, tooltip })\n * // ...\n * }\n * ```\n */\nexport function useResolvedFieldProps(\n name: string | undefined,\n props: BaseFieldProps\n): {\n form: ReturnType<typeof useDeclarativeField>['form']\n fullPath: string\n label: ReactNode\n placeholder: string | undefined\n helperText: ReactNode\n tooltip: FieldTooltipMeta | undefined\n required: boolean | undefined\n disabled: boolean | undefined\n readOnly: boolean | undefined\n /** Automatic constraints from Zod schema (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n /** Options for select fields (from meta.options with i18n translations) */\n options: FieldOptionMeta[] | undefined\n} {\n const {\n form,\n fullPath,\n meta,\n required: schemaRequired,\n formDisabled,\n formReadOnly,\n constraints,\n } = useDeclarativeField(name)\n\n // Get i18n context (can be null)\n const i18n = useFormI18n()\n const i18nKey = meta?.i18nKey\n\n // Resolve translated values\n // Priority: props > i18n translation > meta fallback\n const resolvedTitle = getLocalizedValue(i18n, i18nKey, 'title', meta?.title)\n const resolvedPlaceholder = getLocalizedValue(i18n, i18nKey, 'placeholder', meta?.placeholder)\n const resolvedDescription = getLocalizedValue(i18n, i18nKey, 'description', meta?.description)\n\n // Automatic hint from constraints (if helperText not explicitly set)\n // Priority: props.helperText > i18n description > meta.description > auto-generated hint\n const autoHint = generateConstraintHint(constraints, i18n?.locale ?? 'en')\n const helperText = props.helperText ?? resolvedDescription ?? autoHint\n\n // Localize options from meta (for select/enum fields)\n const localizedOptions = useLocalizedOptions(meta?.options)\n\n return {\n form,\n fullPath,\n // Props override i18n override schema meta\n label: props.label ?? resolvedTitle,\n placeholder: props.placeholder ?? resolvedPlaceholder,\n helperText,\n // Tooltip from props or schema meta\n tooltip: (props.tooltip ?? meta?.tooltip) as FieldTooltipMeta | undefined,\n // Required from schema or prop\n required: props.required ?? schemaRequired,\n // Form-level + local props (local wins)\n disabled: props.disabled ?? formDisabled,\n readOnly: props.readOnly ?? formReadOnly,\n // Constraints for additional component configuration\n constraints,\n // Options with i18n translations\n options: localizedOptions,\n }\n}\n","'use client'\n\nimport { Field } from '@chakra-ui/react'\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { ZodConstraints } from '../../schema-constraints'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { FieldLabel } from './field-label'\nimport { formatFieldErrors, hasFieldErrors } from './field-utils'\nimport { useResolvedFieldProps } from './use-resolved-field-props'\n\n/**\n * Resolved props after applying schema meta and form-level settings\n */\nexport interface ResolvedFieldProps {\n /** Label (from props or schema meta) */\n label: ReactNode\n /** Placeholder */\n placeholder: string | undefined\n /** Helper text below field (can be automatically generated from constraints) */\n helperText: ReactNode\n /** Tooltip with icon */\n tooltip: FieldTooltipMeta | undefined\n /** Required field (from props or schema) */\n required: boolean | undefined\n /** Field disabled (from props or form-level) */\n disabled: boolean | undefined\n /** Read only (from props or form-level) */\n readOnly: boolean | undefined\n /** Automatic constraints from Zod schema (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n /** Options for select fields (from meta.options with i18n translations) */\n options: Array<{ value: string | number; label: string; disabled?: boolean; i18nKey?: string }> | undefined\n}\n\n/**\n * Props passed to the render function\n */\nexport interface FieldRenderProps<TValue = unknown, TState = Record<string, never>> {\n /** TanStack Form field API */\n field: AnyFieldApi\n /** Typed field value */\n value: TValue\n /** Full path to the field (for example, \"user.address.city\") */\n fullPath: string\n /** Resolved props (label, placeholder, etc.) */\n resolved: ResolvedFieldProps\n /** Whether there are validation errors */\n hasError: boolean\n /** Formatted error message */\n errorMessage: string\n /** Local component state (from useFieldState) */\n fieldState: TState\n}\n\n/**\n * Render function for createField\n *\n * Receives field API, resolved props, local state and must return full JSX\n * including Field.Root wrapper and error display.\n */\nexport type FieldRenderFn<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>> = (\n props: FieldRenderProps<TValue, TState> & { componentProps: Omit<P, keyof BaseFieldProps> }\n) => ReactElement\n\n/**\n * Options for createField\n *\n * @template P - Component props type (extends BaseFieldProps)\n * @template TValue - Field value type\n * @template TState - Local state type (from useFieldState)\n */\nexport interface CreateFieldOptions<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>> {\n /** Name for React DevTools */\n displayName: string\n\n /**\n * Hook for local component state\n *\n * Called at the top level of the component, BEFORE form.Field.\n * Can use useState, useEffect, useCallback, useMemo and other hooks.\n *\n * @param props - Component props (without BaseFieldProps)\n * @param resolved - Resolved props (label, placeholder, etc.)\n * @returns State object that will be passed to render as fieldState\n *\n * @example\n * ```tsx\n * useFieldState: (props) => {\n * const [visible, setVisible] = useState(props.defaultVisible ?? false)\n * return { visible, toggle: () => setVisible((v) => !v) }\n * }\n * ```\n */\n useFieldState?: (componentProps: Omit<P, keyof BaseFieldProps>, resolved: ResolvedFieldProps) => TState\n\n /** Render function (full control over JSX) */\n render: FieldRenderFn<P, TValue, TState>\n}\n\n/**\n * Factory function for creating Field components with minimal boilerplate\n *\n * Automatically:\n * - Resolves props from schema meta and form-level settings\n * - Creates form.Field wrapper\n * - Computes hasError and errorMessage\n * - Calls useFieldState for local state (if provided)\n *\n * @example Simple field (Input, Textarea)\n * ```tsx\n * export const FieldString = createField<StringFieldProps, string>({\n * displayName: 'FieldString',\n * render: ({ field, resolved, hasError, errorMessage }) => (\n * <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage}>\n * <Input\n * value={field.state.value ?? ''}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * </FieldWrapper>\n * ),\n * })\n * ```\n *\n * @example Field with local state (Password with toggle)\n * ```tsx\n * export const FieldPassword = createField<PasswordFieldProps, string, { visible: boolean; toggle: () => void }>({\n * displayName: 'FieldPassword',\n * useFieldState: (props) => {\n * const [visible, setVisible] = useState(props.defaultVisible ?? false)\n * return { visible, toggle: () => setVisible((v) => !v) }\n * },\n * render: ({ field, resolved, hasError, errorMessage, fieldState }) => (\n * <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage}>\n * <InputGroup endElement={<IconButton onClick={fieldState.toggle}>...</IconButton>}>\n * <Input type={fieldState.visible ? 'text' : 'password'} ... />\n * </InputGroup>\n * </FieldWrapper>\n * ),\n * })\n * ```\n *\n * @example Checkbox with custom label\n * ```tsx\n * export const FieldCheckbox = createField<CheckboxFieldProps, boolean>({\n * displayName: 'FieldCheckbox',\n * render: ({ field, resolved, hasError, errorMessage, componentProps }) => (\n * <Field.Root invalid={hasError} required={resolved.required} disabled={resolved.disabled}>\n * <Checkbox.Root\n * checked={!!field.state.value}\n * onCheckedChange={(e) => field.handleChange(!!e.checked)}\n * colorPalette={componentProps.colorPalette}\n * >\n * <Checkbox.HiddenInput onBlur={field.handleBlur} />\n * <Checkbox.Control />\n * {resolved.label && <Checkbox.Label>{resolved.label}</Checkbox.Label>}\n * </Checkbox.Root>\n * <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n * </Field.Root>\n * ),\n * })\n * ```\n */\nexport function createField<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>>(\n options: CreateFieldOptions<P, TValue, TState>\n): (props: P) => ReactElement {\n const { displayName, render } = options\n // Use no-op hook by default so the call is always unconditional\n const useFieldState = options.useFieldState ?? (() => ({}) as TState)\n\n function FieldComponent(props: P): ReactElement {\n const { name, label, placeholder, helperText, required, disabled, readOnly, tooltip, ...componentProps } = props\n\n const { form, fullPath, ...resolvedRest } = useResolvedFieldProps(name, {\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n tooltip,\n })\n\n const resolved: ResolvedFieldProps = {\n label: resolvedRest.label,\n placeholder: resolvedRest.placeholder,\n helperText: resolvedRest.helperText,\n tooltip: resolvedRest.tooltip,\n required: resolvedRest.required,\n disabled: resolvedRest.disabled,\n readOnly: resolvedRest.readOnly,\n constraints: resolvedRest.constraints,\n options: resolvedRest.options,\n }\n\n // Call useFieldState at the top level (before form.Field)\n // This allows using hooks inside useFieldState\n const fieldState = useFieldState(componentProps as Omit<P, keyof BaseFieldProps>, resolved)\n\n return (\n <form.Field name={fullPath}>\n {(field: AnyFieldApi) => {\n const errors = field.state.meta.errors\n const isTouched = field.state.meta.isTouched\n // Show errors only if field was touched (after blur or programmatic validation)\n const hasError = isTouched && hasFieldErrors(errors)\n const errorMessage = hasError ? formatFieldErrors(errors) : ''\n\n return render({\n field,\n value: field.state.value as TValue,\n fullPath,\n resolved,\n hasError,\n errorMessage,\n fieldState,\n componentProps: componentProps as Omit<P, keyof BaseFieldProps>,\n })\n }}\n </form.Field>\n )\n }\n\n FieldComponent.displayName = displayName\n return FieldComponent\n}\n\n/**\n * Component for displaying errors or hints\n *\n * Helper component for use inside createField render functions.\n * Shows error if present, otherwise helperText.\n *\n * @example\n * ```tsx\n * <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n * ```\n */\nexport function FieldError({\n hasError,\n errorMessage,\n helperText,\n}: {\n hasError: boolean\n errorMessage: string\n helperText: ReactNode\n}): ReactElement | null {\n if (hasError) {\n return <Field.ErrorText>{errorMessage}</Field.ErrorText>\n }\n if (helperText) {\n return <Field.HelperText>{helperText}</Field.HelperText>\n }\n return null\n}\n\n// Re-export for convenience\nexport { FieldLabel }\n","'use client'\n\nimport { Field } from '@chakra-ui/react'\nimport { memo, type ReactElement, type ReactNode } from 'react'\nimport type { ResolvedFieldProps } from './create-field'\nimport { FieldError } from './create-field'\nimport { FieldLabel } from './field-label'\n\nexport interface FieldWrapperProps {\n /** Resolved props from createField */\n resolved: ResolvedFieldProps\n /** Whether there are validation errors */\n hasError: boolean\n /** Formatted error message */\n errorMessage: string\n /** Full path for data-field-name attribute */\n fullPath: string\n /** Field content (Input, Textarea, etc.) */\n children: ReactNode\n}\n\n/**\n * Standard wrapper for simple fields\n *\n * Provides:\n * - Field.Root with invalid/required/disabled/readOnly props\n * - FieldLabel with support for tooltip\n * - FieldError with fallback to helperText\n *\n * Use inside createField render functions for simple Input-like fields\n * with standard layout: Label → Control → Error/Helper\n *\n * @example\n * ```tsx\n * export const FieldString = createField<StringFieldProps, string>({\n * displayName: 'FieldString',\n * render: ({ field, fullPath, resolved, hasError, errorMessage }) => (\n * <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n * <Input\n * value={field.state.value ?? ''}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * placeholder={resolved.placeholder}\n * data-field-name={fullPath}\n * />\n * </FieldWrapper>\n * ),\n * })\n * ```\n */\nexport const FieldWrapper = memo(function FieldWrapper({\n resolved,\n hasError,\n errorMessage,\n children,\n}: FieldWrapperProps): ReactElement {\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n {children}\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n})\n","'use client'\n\nimport { useEffect, useState } from 'react'\n\n/**\n * Hook for debouncing a value\n *\n * Delays value update by the specified time.\n * Useful for search fields, autocomplete and other cases\n * when you need to limit request frequency.\n *\n * @param value - Value to debounce\n * @param delay - Delay in milliseconds (default 300)\n * @returns Debounced value\n *\n * @example\n * ```tsx\n * const [inputValue, setInputValue] = useState('')\n * const debouncedValue = useDebounce(inputValue, 300)\n *\n * useEffect(() => {\n * // Executes only when user stops typing\n * searchAPI(debouncedValue)\n * }, [debouncedValue])\n * ```\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debouncedValue\n}\n","'use client'\n\nimport { useState } from 'react'\nimport { useDebounce } from './use-debounce'\n\n/**\n * Async request result (compatible with TanStack Query and ZenStack hooks)\n */\nexport interface AsyncQueryResult<TData = unknown> {\n data?: TData[]\n isLoading?: boolean\n error?: Error | null\n}\n\n/**\n * Async request function for loading options\n * @param search - Search string (empty if request not started)\n */\nexport type AsyncQueryFn<TData = unknown> = (search: string) => AsyncQueryResult<TData>\n\n/**\n * Options for useAsyncSearch\n */\nexport interface UseAsyncSearchOptions<TData = unknown> {\n /**\n * Async request function (returns { data, isLoading, error })\n */\n useQuery?: AsyncQueryFn<TData>\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounce?: number\n\n /**\n * Minimum characters to start searching\n * @default 1\n */\n minChars?: number\n\n /**\n * Initial input value\n * @default ''\n */\n initialValue?: string\n}\n\n/**\n * Result useAsyncSearch\n */\nexport interface UseAsyncSearchResult<TData = unknown> {\n /** Current value input */\n inputValue: string\n\n /** Function for changing input value */\n setInputValue: (value: string) => void\n\n /** Debounced value for query */\n debouncedSearch: string\n\n /** Whether the request should be triggered (enough characters) */\n shouldQuery: boolean\n\n /** Whether loading is in progress */\n isLoading: boolean\n\n /** Request result (data array) */\n data: TData[] | undefined\n\n /** Error request */\n error: Error | null | undefined\n}\n\n/**\n * Hook for async search with debounce\n *\n * Combines common input management, debounce and async request logic\n * for Combobox and Autocomplete components.\n *\n * @example Usage with ZenStack hook\n * ```tsx\n * const {\n * inputValue,\n * setInputValue,\n * shouldQuery,\n * isLoading,\n * data,\n * } = useAsyncSearch({\n * useQuery: (search) => useFindManyUser({\n * where: { name: { contains: search, mode: 'insensitive' } },\n * take: 20,\n * }),\n * debounce: 300,\n * minChars: 2,\n * })\n * ```\n *\n * @example Usage for local filtering\n * ```tsx\n * const { inputValue, setInputValue, debouncedSearch } = useAsyncSearch({\n * debounce: 200,\n * minChars: 1,\n * })\n *\n * const filteredOptions = useMemo(() => {\n * return options.filter(opt => opt.label.includes(debouncedSearch))\n * }, [options, debouncedSearch])\n * ```\n */\nexport function useAsyncSearch<TData = unknown>(\n options: UseAsyncSearchOptions<TData> = {}\n): UseAsyncSearchResult<TData> {\n const { useQuery, debounce = 300, minChars = 1, initialValue = '' } = options\n\n // State input\n const [inputValue, setInputValue] = useState(initialValue)\n\n // Debounced value for query\n const debouncedSearch = useDebounce(inputValue, debounce)\n\n // Should the request be triggered?\n const shouldQuery = debouncedSearch.length >= minChars\n\n // Call useQuery (if provided)\n // Pass empty string if we shouldn't query, so the hook is always called\n const queryResult = useQuery?.(shouldQuery ? debouncedSearch : '')\n\n // Extract results\n const { data, isLoading = false, error } = queryResult ?? {}\n\n return {\n inputValue,\n setInputValue,\n debouncedSearch,\n shouldQuery,\n isLoading,\n data,\n error,\n }\n}\n","'use client'\n\nimport { Field, HStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { FieldTooltipMeta } from '../../types'\nimport { FieldTooltip } from './field-tooltip'\n\n/**\n * Props for SelectionFieldLabel\n */\nexport interface SelectionFieldLabelProps {\n /** Label text */\n label: ReactNode\n /** Data for tooltip hint */\n tooltip?: FieldTooltipMeta\n /** Show required field indicator */\n required?: boolean\n}\n\n/**\n * Unified label for selection fields (Select, Combobox, Listbox, Autocomplete).\n * Avoids duplicating the HStack + FieldTooltip pattern across 12+ files.\n *\n * @example\n * ```tsx\n * <Select.Label>\n * <SelectionFieldLabel\n * label={resolved.label}\n * tooltip={resolved.tooltip}\n * required={resolved.required}\n * />\n * </Select.Label>\n * ```\n */\nexport function SelectionFieldLabel({ label, tooltip, required }: SelectionFieldLabelProps): ReactElement {\n return (\n <>\n {tooltip ? (\n <HStack gap={1}>\n <span>{label}</span>\n <FieldTooltip {...tooltip} />\n </HStack>\n ) : (\n label\n )}\n {required && <Field.RequiredIndicator />}\n </>\n )\n}\n","'use client'\n\nimport { createListCollection } from '@chakra-ui/react'\nimport type { ReactNode } from 'react'\nimport { useMemo } from 'react'\nimport type { GroupableOption } from '../../types'\n\n/**\n * Result of useGroupedOptions hook\n */\nexport interface GroupedOptionsResult<T = string> {\n /** Collection for Chakra components (Select, Combobox, Listbox) */\n collection: ReturnType<typeof createListCollection<GroupableOption<T>>>\n /** Map groups with options (null if no grouping) */\n groups: Map<string, GroupableOption<T>[]> | null\n}\n\n/**\n * Function to get label from an option\n * Used for itemToString in collection and text rendering\n *\n * @example\n * ```tsx\n * // In collection itemToString\n * createListCollection({ items, itemToString: getOptionLabel })\n *\n * // In rendering\n * <Select.ItemText>{getOptionLabel(option)}</Select.ItemText>\n * ```\n */\nexport function getOptionLabel<T>(item: { label?: string | ReactNode; value: T }): string {\n return typeof item.label === 'string' ? item.label : String(item.value)\n}\n\n/**\n * Hook for creating a collection with optional grouping\n *\n * Encapsulates common logic:\n * - Creating Chakra ListCollection from options\n * - Determining group presence\n * - Grouping options into a Map for rendering\n *\n * @example Usage in Listbox\n * ```tsx\n * const { collection, groups } = useGroupedOptions(options)\n *\n * return (\n * <Listbox.Root collection={collection}>\n * {groups\n * ? Array.from(groups.entries()).map(([name, opts]) => (\n * <Listbox.ItemGroup key={name}>\n * <Listbox.ItemGroupLabel>{name}</Listbox.ItemGroupLabel>\n * {opts.map(opt => <Listbox.Item key={opt.value} item={opt} />)}\n * </Listbox.ItemGroup>\n * ))\n * : options.map(opt => <Listbox.Item key={opt.value} item={opt} />)\n * }\n * </Listbox.Root>\n * )\n * ```\n */\nexport function useGroupedOptions<T = string>(options: GroupableOption<T>[]): GroupedOptionsResult<T> {\n // Create collection with optional grouping\n const collection = useMemo(() => {\n const hasGroups = options.some((opt) => opt.group)\n\n return createListCollection({\n items: options,\n itemToString: getOptionLabel,\n itemToValue: (item) => item.value as string,\n isItemDisabled: (item: GroupableOption<T>) => item.disabled ?? false,\n ...(hasGroups && {\n groupBy: (item: GroupableOption<T>) => item.group ?? '',\n }),\n })\n }, [options])\n\n // Check for groups and create Map\n const groups = useMemo(() => {\n const hasGroups = options.some((opt) => opt.group)\n if (!hasGroups) {\n return null\n }\n\n const groupMap = new Map<string, GroupableOption<T>[]>()\n for (const opt of options) {\n const group = opt.group ?? ''\n const existing = groupMap.get(group) ?? []\n groupMap.set(group, [...existing, opt])\n }\n return groupMap\n }, [options])\n\n return { collection, groups }\n}\n","'use client'\n\nimport { Editable, Field, IconButton } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { BaseFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Props for Editable field\n */\nexport interface EditableFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Placeholder when empty */\n placeholder?: string\n /** Use textarea for multiline editing (by default: false) */\n multiline?: boolean\n /** Activation mode (by default: click) */\n activationMode?: 'click' | 'dblclick' | 'focus' | 'none'\n /** Show control buttons (edit, cancel, save) (by default: false) */\n showControls?: boolean\n /** Automatically resize textarea (only for multiline=true) (by default: true) */\n autoResize?: boolean\n /** Custom edit icon */\n editIcon?: ReactNode\n /** Custom cancel icon */\n cancelIcon?: ReactNode\n /** Custom submit icon */\n submitIcon?: ReactNode\n /** Save on blur (by default: true) */\n submitOnBlur?: boolean\n}\n\n/**\n * Form.Field.Editable - Inline editable text\n *\n * Renders text that can be clicked for inline editing.\n * Supports single-line input and multiline textarea.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Editable\n * name=\"title\"\n * label=\"Title\"\n * placeholder=\"Click to add title\"\n * />\n * ```\n *\n * @example Multiline\n * ```tsx\n * <Form.Field.Editable\n * name=\"description\"\n * multiline\n * placeholder=\"Click to add description...\"\n * />\n * ```\n *\n * @example With control buttons\n * ```tsx\n * <Form.Field.Editable\n * name=\"name\"\n * showControls\n * activationMode=\"dblclick\"\n * />\n * ```\n */\nexport const FieldEditable = createField<EditableFieldProps, string>({\n displayName: 'FieldEditable',\n\n render: ({ field, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n multiline = false,\n activationMode = 'click',\n showControls = false,\n editIcon,\n cancelIcon,\n submitIcon,\n submitOnBlur = true,\n } = componentProps\n\n const currentValue = (field.state.value as string) || ''\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <Editable.Root\n value={currentValue}\n onValueChange={(details) => field.handleChange(details.value)}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n placeholder={resolved.placeholder ?? 'Click to edit'}\n activationMode={activationMode}\n submitMode={submitOnBlur ? 'blur' : 'enter'}\n >\n <Editable.Preview\n minH={multiline ? '48px' : undefined}\n alignItems={multiline ? 'flex-start' : undefined}\n width=\"full\"\n />\n\n {multiline ? <Editable.Textarea /> : <Editable.Input />}\n\n {showControls && (\n <Editable.Control>\n <Editable.EditTrigger asChild>\n <IconButton variant=\"ghost\" size=\"xs\">\n {editIcon ?? '✏️'}\n </IconButton>\n </Editable.EditTrigger>\n <Editable.CancelTrigger asChild>\n <IconButton variant=\"outline\" size=\"xs\">\n {cancelIcon ?? '✕'}\n </IconButton>\n </Editable.CancelTrigger>\n <Editable.SubmitTrigger asChild>\n <IconButton variant=\"outline\" size=\"xs\">\n {submitIcon ?? '✓'}\n </IconButton>\n </Editable.SubmitTrigger>\n </Editable.Control>\n )}\n </Editable.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { IconButton, Input, InputGroup } from '@chakra-ui/react'\nimport { type ReactElement, useState } from 'react'\nimport { LuEye, LuEyeOff } from 'react-icons/lu'\nimport type { PasswordFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * State for toggling password visibility\n */\ninterface PasswordFieldState {\n /** Whether password is visible */\n visible: boolean\n /** Toggle visibility */\n toggle: () => void\n}\n\n/**\n * Form.Field.Password - Password input field with visibility toggle\n *\n * Renders a password input field with a show/hide button.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Password name=\"password\" label=\"Password\" />\n * ```\n *\n * @example With visible password by default\n * ```tsx\n * <Form.Field.Password name=\"password\" label=\"Password\" defaultVisible />\n * ```\n */\nexport const FieldPassword = createField<PasswordFieldProps, string, PasswordFieldState>({\n displayName: 'FieldPassword',\n\n useFieldState: (props) => {\n const [visible, setVisible] = useState(props.defaultVisible ?? false)\n return {\n visible,\n toggle: () => setVisible((v) => !v),\n }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <InputGroup\n endElement={\n <IconButton\n tabIndex={-1}\n me=\"-2\"\n aspectRatio=\"square\"\n size=\"sm\"\n variant=\"ghost\"\n height=\"calc(100% - {spacing.2})\"\n aria-label=\"Toggle password visibility\"\n disabled={resolved.disabled}\n onPointerDown={(e) => {\n if (resolved.disabled) {\n return\n }\n if (e.button !== 0) {\n return\n }\n e.preventDefault()\n fieldState.toggle()\n }}\n >\n {fieldState.visible ? <LuEyeOff /> : <LuEye />}\n </IconButton>\n }\n >\n <Input\n type={fieldState.visible ? 'text' : 'password'}\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n maxLength={componentProps.maxLength}\n autoComplete={componentProps.autoComplete}\n data-field-name={fullPath}\n />\n </InputGroup>\n </FieldWrapper>\n ),\n})\n","'use client'\n\nimport { Box, Field, HStack, IconButton, Input, List, Progress, Text, VStack } from '@chakra-ui/react'\nimport { type ReactElement, useState } from 'react'\nimport { LuCheck, LuEye, LuEyeOff, LuX } from 'react-icons/lu'\nimport type { PasswordRequirement, PasswordStrengthFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Default password requirements\n */\nconst DEFAULT_REQUIREMENTS: PasswordRequirement[] = ['minLength:8', 'uppercase', 'lowercase', 'number', 'special']\n\n/**\n * Requirement descriptions\n */\nconst REQUIREMENT_LABELS: Record<PasswordRequirement, string> = {\n 'minLength:8': 'Minimum 8 characters',\n uppercase: 'At least one uppercase letter',\n lowercase: 'At least one lowercase letter',\n number: 'At least one digit',\n special: 'At least one special character (!@#$%^&*)',\n}\n\n/**\n * Checks if password meets a requirement\n */\nfunction checkRequirement(password: string, requirement: PasswordRequirement): boolean {\n switch (requirement) {\n case 'minLength:8':\n return password.length >= 8\n case 'uppercase':\n return /[A-Z]/.test(password)\n case 'lowercase':\n return /[a-z]/.test(password)\n case 'number':\n return /[0-9]/.test(password)\n case 'special':\n return /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)\n default:\n return false\n }\n}\n\n/**\n * Computes password strength (0-100)\n */\nfunction calculateStrength(password: string, requirements: PasswordRequirement[]): number {\n if (!password) {\n return 0\n }\n\n const metCount = requirements.filter((req) => checkRequirement(password, req)).length\n return Math.round((metCount / requirements.length) * 100)\n}\n\n/**\n * Gets description and color for password strength\n */\nfunction getStrengthInfo(strength: number): { label: string; colorPalette: string } {\n if (strength < 25) {\n return { label: 'Weak', colorPalette: 'red' }\n }\n if (strength < 50) {\n return { label: 'Medium', colorPalette: 'orange' }\n }\n if (strength < 75) {\n return { label: 'Good', colorPalette: 'yellow' }\n }\n return { label: 'Strong', colorPalette: 'green' }\n}\n\n/**\n * State for password field with strength indicator\n */\ninterface PasswordStrengthFieldState {\n /** Password visibility */\n visible: boolean\n /** Toggle visibility */\n toggle: () => void\n}\n\n/**\n * Form.Field.PasswordStrength - Password with strength indicator\n *\n * Renders a password field with a visual strength indicator and requirements checklist.\n *\n * @example With default requirements\n * ```tsx\n * <Form.Field.PasswordStrength name=\"password\" label=\"Password\" showRequirements />\n * ```\n *\n * @example With custom requirements\n * ```tsx\n * <Form.Field.PasswordStrength\n * name=\"password\"\n * requirements={['minLength:8', 'uppercase', 'number']}\n * showRequirements\n * />\n * ```\n */\nexport const FieldPasswordStrength = createField<PasswordStrengthFieldProps, string, PasswordStrengthFieldState>({\n displayName: 'FieldPasswordStrength',\n\n useFieldState: (props) => {\n const [visible, setVisible] = useState(props.defaultVisible ?? false)\n return { visible, toggle: () => setVisible((v) => !v) }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { requirements = DEFAULT_REQUIREMENTS, showRequirements = true } = componentProps\n const { visible, toggle } = fieldState\n\n const value = (field.state.value as string) ?? ''\n const strength = calculateStrength(value, requirements)\n const { label: strengthLabel, colorPalette } = getStrengthInfo(strength)\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <VStack gap={2} align=\"stretch\" width=\"100%\">\n <HStack>\n <Input\n type={visible ? 'text' : 'password'}\n value={value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder ?? 'Enter password'}\n data-field-name={fullPath}\n flex={1}\n />\n <IconButton\n aria-label={visible ? 'Hide password' : 'Show password'}\n onClick={toggle}\n variant=\"ghost\"\n size=\"sm\"\n >\n {visible ? <LuEyeOff /> : <LuEye />}\n </IconButton>\n </HStack>\n\n {value && (\n <Box>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n Strength\n </Text>\n <Text fontSize=\"xs\" fontWeight=\"medium\" color={`${colorPalette}.600`}>\n {strengthLabel}\n </Text>\n </HStack>\n <Progress.Root value={strength} colorPalette={colorPalette} size=\"xs\">\n <Progress.Track>\n <Progress.Range />\n </Progress.Track>\n </Progress.Root>\n </Box>\n )}\n\n {showRequirements && value && (\n <List.Root fontSize=\"sm\" gap={1}>\n {requirements.map((req) => {\n const met = checkRequirement(value, req)\n return (\n <List.Item key={req} display=\"flex\" alignItems=\"center\" gap={2}>\n <Box color={met ? 'green.500' : 'gray.400'}>{met ? <LuCheck size={14} /> : <LuX size={14} />}</Box>\n <Text color={met ? 'fg.default' : 'fg.muted'}>{REQUIREMENT_LABELS[req]}</Text>\n </List.Item>\n )\n })}\n </List.Root>\n )}\n </VStack>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport {\n Box,\n Button,\n Center,\n HStack,\n Icon,\n IconButton,\n Image,\n Popover,\n Portal,\n Spinner,\n Text,\n VStack,\n} from '@chakra-ui/react'\nimport type { Editor } from '@tiptap/react'\nimport { type ReactElement, useCallback, useRef, useState } from 'react'\nimport { LuImage, LuUpload, LuX } from 'react-icons/lu'\n\n/**\n * Image upload configuration\n */\nexport interface ImageUploadConfig {\n /** URL endpoint for upload */\n endpoint: string\n /** Категория изображения (для upload API) */\n category?: string\n /** Maximum file size in bytes (by default: 10MB) */\n maxSize?: number\n /** Разрешённые MIME typeы (by default: ['image/*']) */\n acceptTypes?: string[]\n}\n\n/**\n * Props для ImagePopover\n */\ninterface ImagePopoverProps {\n editor: Editor\n config: ImageUploadConfig\n disabled?: boolean\n}\n\n/** Loading states */\ntype UploadState = 'idle' | 'uploading' | 'error'\n\n/**\n * Component для loading и вставки изображений в RichText редактор\n *\n * Использует Popover с drag-n-drop зоной и кнопкой выбора fileа.\n * После успешной loading вставляет изображение в редактор.\n */\nexport function ImagePopover({ editor, config, disabled }: ImagePopoverProps): ReactElement {\n const [isOpen, setIsOpen] = useState(false)\n const [uploadState, setUploadState] = useState<UploadState>('idle')\n const [errorMessage, setErrorMessage] = useState<string | null>(null)\n const [previewUrl, setPreviewUrl] = useState<string | null>(null)\n const [isDragging, setIsDragging] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const maxSize = config.maxSize ?? 10 * 1024 * 1024 // 10MB by default\n const acceptTypes = config.acceptTypes ?? ['image/*']\n\n /**\n * File upload на сервер\n */\n const handleUpload = useCallback(\n async (file: File) => {\n // Проверка typeа fileа\n if (!file.type.startsWith('image/')) {\n setErrorMessage('File must be an image')\n setUploadState('error')\n return\n }\n\n // Проверка sizeа\n if (file.size > maxSize) {\n const maxSizeMB = (maxSize / 1024 / 1024).toFixed(0)\n setErrorMessage(`Size fileа не must превышать ${maxSizeMB}MB`)\n setUploadState('error')\n return\n }\n\n // Создаём preview\n const preview = URL.createObjectURL(file)\n setPreviewUrl(preview)\n setUploadState('uploading')\n setErrorMessage(null)\n\n try {\n const formData = new FormData()\n formData.append('file', file)\n if (config.category) {\n formData.append('category', config.category)\n }\n\n const response = await fetch(config.endpoint, {\n method: 'POST',\n body: formData,\n })\n\n const result = await response.json()\n\n if (!response.ok) {\n throw new Error(result.error || 'Upload error')\n }\n\n if (result.url) {\n // Insert image into editor\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(editor.chain().focus() as any).setImage({ src: result.url }).run()\n handleClose()\n } else {\n throw new Error('Image URL not received')\n }\n } catch (err) {\n setErrorMessage(err instanceof Error ? err.message : 'Upload error')\n setUploadState('error')\n } finally {\n // Clean up preview URL\n if (preview) {\n URL.revokeObjectURL(preview)\n }\n }\n },\n [editor, config, maxSize]\n )\n\n /**\n * Handle file selection via input\n */\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n handleUpload(file)\n }\n // Reset input for re-selecting the same file\n e.target.value = ''\n },\n [handleUpload]\n )\n\n /**\n * Handle drop event\n */\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n\n const file = e.dataTransfer.files[0]\n if (file) {\n handleUpload(file)\n }\n },\n [handleUpload]\n )\n\n /**\n * Close popover and reset state\n */\n const handleClose = useCallback(() => {\n setIsOpen(false)\n setUploadState('idle')\n setErrorMessage(null)\n setPreviewUrl(null)\n setIsDragging(false)\n }, [])\n\n /**\n * Повторная попытка after ошибки\n */\n const handleRetry = useCallback(() => {\n setUploadState('idle')\n setErrorMessage(null)\n setPreviewUrl(null)\n }, [])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={(details) => setIsOpen(details.open)}>\n <Popover.Trigger asChild>\n <IconButton\n aria-label=\"Insert image\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n >\n <LuImage />\n </IconButton>\n </Popover.Trigger>\n\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"320px\">\n <Popover.Arrow>\n <Popover.ArrowTip />\n </Popover.Arrow>\n <Popover.Body p={3}>\n {/* State: idle - зона loading */}\n {uploadState === 'idle' && (\n <VStack gap={3} align=\"stretch\">\n <Box\n p={6}\n borderWidth=\"2px\"\n borderStyle=\"dashed\"\n borderColor={isDragging ? 'colorPalette.500' : 'border'}\n borderRadius=\"md\"\n bg={isDragging ? 'colorPalette.50' : 'bg.subtle'}\n transition=\"all 0.2s\"\n cursor=\"pointer\"\n _hover={{ borderColor: 'colorPalette.400' }}\n onDragOver={(e) => {\n e.preventDefault()\n setIsDragging(true)\n }}\n onDragLeave={(e) => {\n e.preventDefault()\n setIsDragging(false)\n }}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <Center>\n <VStack gap={2}>\n <Icon fontSize=\"2xl\" color=\"fg.muted\">\n <LuUpload />\n </Icon>\n <Text fontSize=\"sm\" fontWeight=\"medium\" textAlign=\"center\">\n Drag image here\n </Text>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n or click to select\n </Text>\n </VStack>\n </Center>\n </Box>\n\n <Text fontSize=\"xs\" color=\"fg.muted\" textAlign=\"center\">\n PNG, JPG, WEBP up to {(maxSize / 1024 / 1024).toFixed(0)}MB\n </Text>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptTypes.join(',')}\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n />\n\n <HStack justify=\"flex-end\">\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Cancel\n </Button>\n </HStack>\n </VStack>\n )}\n\n {/* State: uploading - uploading */}\n {uploadState === 'uploading' && (\n <VStack gap={3} align=\"stretch\">\n {previewUrl && (\n <Box borderRadius=\"md\" overflow=\"hidden\" bg=\"bg.subtle\">\n <Image src={previewUrl} alt=\"Preview\" maxH=\"150px\" w=\"100%\" objectFit=\"contain\" />\n </Box>\n )}\n <Center py={2}>\n <HStack gap={2}>\n <Spinner size=\"sm\" color=\"colorPalette.500\" />\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Loading...\n </Text>\n </HStack>\n </Center>\n </VStack>\n )}\n\n {/* State: error - error */}\n {uploadState === 'error' && (\n <VStack gap={3} align=\"stretch\">\n {previewUrl && (\n <Box borderRadius=\"md\" overflow=\"hidden\" bg=\"bg.subtle\" position=\"relative\">\n <Image src={previewUrl} alt=\"Preview\" maxH=\"150px\" w=\"100%\" objectFit=\"contain\" opacity={0.5} />\n <Center position=\"absolute\" inset={0} bg=\"blackAlpha.500\" borderRadius=\"md\">\n <Icon color=\"red.400\" fontSize=\"2xl\">\n <LuX />\n </Icon>\n </Center>\n </Box>\n )}\n <Text fontSize=\"sm\" color=\"red.400\" textAlign=\"center\">\n {errorMessage}\n </Text>\n <HStack justify=\"center\" gap={2}>\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Cancel\n </Button>\n <Button size=\"sm\" colorPalette=\"brand\" onClick={handleRetry}>\n Try again\n </Button>\n </HStack>\n </VStack>\n )}\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )\n}\n","'use client'\n\nimport { Box, Button, HStack, IconButton, Input, Popover, Portal, VStack } from '@chakra-ui/react'\nimport type { Editor } from '@tiptap/react'\nimport { useCallback, useState, type ReactElement } from 'react'\nimport { LuLink, LuUnlink } from 'react-icons/lu'\n\n/**\n * Props для LinkPopover\n */\ninterface LinkPopoverProps {\n editor: Editor\n disabled?: boolean\n}\n\n/**\n * Component для добавления/удаления ссылок в RichText редакторе\n *\n * Использует Popover instead of window.prompt для лучшего UX и тестируемости.\n */\nexport function LinkPopover({ editor, disabled }: LinkPopoverProps): ReactElement {\n const [url, setUrl] = useState('')\n const [isOpen, setIsOpen] = useState(false)\n\n const isActive = editor.isActive('link')\n\n const handleOpen = useCallback(() => {\n if (isActive) {\n // Если link активна — удаляем её\n editor.chain().focus().unsetLink().run()\n } else {\n // Получаем текущий URL if present\n const currentUrl = editor.getAttributes('link').href ?? ''\n setUrl(currentUrl)\n setIsOpen(true)\n }\n }, [editor, isActive])\n\n const handleClose = useCallback(() => {\n setIsOpen(false)\n setUrl('')\n }, [])\n\n const handleSubmit = useCallback(() => {\n if (url) {\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }\n handleClose()\n }, [editor, url, handleClose])\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run()\n handleClose()\n }, [editor, handleClose])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleSubmit()\n } else if (e.key === 'Escape') {\n handleClose()\n }\n },\n [handleSubmit, handleClose]\n )\n\n return (\n <Popover.Root open={isOpen} onOpenChange={(details) => setIsOpen(details.open)}>\n <Popover.Trigger asChild>\n <IconButton\n aria-label={isActive ? 'Remove ссылку' : 'Add ссылку'}\n size=\"sm\"\n variant={isActive ? 'solid' : 'ghost'}\n colorPalette={isActive ? 'brand' : undefined}\n onClick={handleOpen}\n disabled={disabled}\n >\n {isActive ? <LuUnlink /> : <LuLink />}\n </IconButton>\n </Popover.Trigger>\n\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"300px\">\n <Popover.Arrow>\n <Popover.ArrowTip />\n </Popover.Arrow>\n <Popover.Body p={3}>\n <VStack gap={3} align=\"stretch\">\n <Box>\n <Input\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n size=\"sm\"\n autoFocus\n />\n </Box>\n <HStack gap={2} justify=\"flex-end\">\n {editor.isActive('link') && (\n <Button size=\"sm\" variant=\"ghost\" colorPalette=\"red\" onClick={handleRemove}>\n Remove\n </Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Cancel\n </Button>\n <Button size=\"sm\" colorPalette=\"brand\" onClick={handleSubmit} disabled={!url.trim()}>\n Apply\n </Button>\n </HStack>\n </VStack>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )\n}\n","'use client'\n\nimport type { useEditor } from '@tiptap/react'\nimport type { ReactNode } from 'react'\nimport {\n LuBold,\n LuCode,\n LuHeading1,\n LuHeading2,\n LuHeading3,\n LuImage,\n LuItalic,\n LuLink,\n LuList,\n LuListOrdered,\n LuQuote,\n LuRedo,\n LuStrikethrough,\n LuUnderline,\n LuUndo,\n} from 'react-icons/lu'\n\n/**\n * Доступные кнопки toolbar\n */\nexport type ToolbarButton =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'link'\n | 'image'\n | 'undo'\n | 'redo'\n\n/**\n * Buttons тулбара by default\n */\nexport const DEFAULT_TOOLBAR_BUTTONS: ToolbarButton[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'heading1',\n 'heading2',\n 'heading3',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'link',\n 'undo',\n 'redo',\n]\n\n/**\n * Конфигурация кнопки toolbar\n */\nexport interface ToolbarButtonConfig {\n icon: ReactNode\n label: string\n action: (editor: ReturnType<typeof useEditor>) => void\n isActive?: (editor: ReturnType<typeof useEditor>) => boolean\n}\n\n/**\n * Конфигурация всех кнопок тулбара\n */\nexport const TOOLBAR_CONFIG: Record<ToolbarButton, ToolbarButtonConfig> = {\n bold: {\n icon: <LuBold />,\n label: 'Bold',\n action: (editor) => editor?.chain().focus().toggleBold().run(),\n isActive: (editor) => editor?.isActive('bold') ?? false,\n },\n italic: {\n icon: <LuItalic />,\n label: 'Italic',\n action: (editor) => editor?.chain().focus().toggleItalic().run(),\n isActive: (editor) => editor?.isActive('italic') ?? false,\n },\n underline: {\n icon: <LuUnderline />,\n label: 'Подчёркнутый',\n action: (editor) => editor?.chain().focus().toggleUnderline().run(),\n isActive: (editor) => editor?.isActive('underline') ?? false,\n },\n strike: {\n icon: <LuStrikethrough />,\n label: 'Strikethrough',\n action: (editor) => editor?.chain().focus().toggleStrike().run(),\n isActive: (editor) => editor?.isActive('strike') ?? false,\n },\n code: {\n icon: <LuCode />,\n label: 'Код',\n action: (editor) => editor?.chain().focus().toggleCode().run(),\n isActive: (editor) => editor?.isActive('code') ?? false,\n },\n heading1: {\n icon: <LuHeading1 />,\n label: 'Заголовок 1',\n action: (editor) => editor?.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: (editor) => editor?.isActive('heading', { level: 1 }) ?? false,\n },\n heading2: {\n icon: <LuHeading2 />,\n label: 'Заголовок 2',\n action: (editor) => editor?.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (editor) => editor?.isActive('heading', { level: 2 }) ?? false,\n },\n heading3: {\n icon: <LuHeading3 />,\n label: 'Заголовок 3',\n action: (editor) => editor?.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: (editor) => editor?.isActive('heading', { level: 3 }) ?? false,\n },\n bulletList: {\n icon: <LuList />,\n label: 'Bullet list',\n action: (editor) => editor?.chain().focus().toggleBulletList().run(),\n isActive: (editor) => editor?.isActive('bulletList') ?? false,\n },\n orderedList: {\n icon: <LuListOrdered />,\n label: 'Ordered list',\n action: (editor) => editor?.chain().focus().toggleOrderedList().run(),\n isActive: (editor) => editor?.isActive('orderedList') ?? false,\n },\n blockquote: {\n icon: <LuQuote />,\n label: 'Quote',\n action: (editor) => editor?.chain().focus().toggleBlockquote().run(),\n isActive: (editor) => editor?.isActive('blockquote') ?? false,\n },\n link: {\n icon: <LuLink />,\n label: 'Ссылка',\n action: (editor) => {\n if (editor?.isActive('link')) {\n editor.chain().focus().unsetLink().run()\n } else {\n const url = window.prompt('URL')\n if (url) {\n editor?.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }\n }\n },\n isActive: (editor) => editor?.isActive('link') ?? false,\n },\n undo: {\n icon: <LuUndo />,\n label: 'Undo',\n action: (editor) => editor?.chain().focus().undo().run(),\n },\n redo: {\n icon: <LuRedo />,\n label: 'Redo',\n action: (editor) => editor?.chain().focus().redo().run(),\n },\n // Кнопка image processesся отдельно через ImagePopover (аналогично link)\n image: {\n icon: <LuImage />,\n label: 'Insert image',\n action: () => {\n // Action handled via ImagePopover\n },\n },\n}\n","'use client'\n\nimport { Box, Field, HStack, IconButton } from '@chakra-ui/react'\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport TiptapImage from '@tiptap/extension-image'\nimport { Link } from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport Underline from '@tiptap/extension-underline'\nimport { type Content, EditorContent, useEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport { type ReactElement, useEffect, useMemo } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { FieldError, FieldLabel, getFieldErrors, useResolvedFieldProps } from '../base'\nimport { ImagePopover, type ImageUploadConfig } from './image-popover'\nimport { LinkPopover } from './link-popover'\nimport { DEFAULT_TOOLBAR_BUTTONS, TOOLBAR_CONFIG, type ToolbarButton } from './toolbar-config'\n\n/**\n * Safe JSON parsing with fallback to empty document\n * Prevents crash on invalid JSON\n */\nfunction safeParseJSON(value: string): Content {\n try {\n return JSON.parse(value) as Content\n } catch {\n console.warn('RichText: Invalid JSON content, using empty document')\n return ''\n }\n}\n\n/**\n * Props for RichText field\n */\nexport interface RichTextFieldProps extends BaseFieldProps {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Minimum editor height (by default: 150px) */\n minHeight?: string | number\n /** Maximum editor height (includes scroll) */\n maxHeight?: string | number\n /** Show toolbar (by default: true) */\n showToolbar?: boolean\n /** Toolbar buttons (by default: all) */\n toolbarButtons?: ToolbarButton[]\n /** Output format: 'html' or 'json' (by default: 'html') */\n outputFormat?: 'html' | 'json'\n /** Image upload configuration (optional) */\n imageUpload?: ImageUploadConfig\n}\n\n// Re-export type for convenience\nexport type { ImageUploadConfig }\n\n/**\n * Form.Field.RichText - WYSIWYG rich text editor\n *\n * Renders Tiptap-based editor with toolbar\n * and automatic form integration.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.RichText name=\"content\" label=\"Content\" />\n * ```\n *\n * @example With custom height\n * ```tsx\n * <Form.Field.RichText\n * name=\"description\"\n * label=\"Description\"\n * minHeight=\"200px\"\n * maxHeight=\"400px\"\n * />\n * ```\n *\n * @example With limited toolbar\n * ```tsx\n * <Form.Field.RichText\n * name=\"comment\"\n * label=\"Comment\"\n * toolbarButtons={['bold', 'italic', 'link']}\n * />\n * ```\n *\n * @example JSON output (for database storage)\n * ```tsx\n * <Form.Field.RichText\n * name=\"article\"\n * label=\"Article\"\n * outputFormat=\"json\"\n * />\n * ```\n */\nexport function FieldRichText({\n name,\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n tooltip,\n minHeight = '150px',\n maxHeight,\n showToolbar = true,\n toolbarButtons = DEFAULT_TOOLBAR_BUTTONS,\n outputFormat = 'html',\n imageUpload,\n}: RichTextFieldProps): ReactElement {\n const {\n form,\n fullPath,\n label: resolvedLabel,\n placeholder: resolvedPlaceholder,\n helperText: resolvedHelperText,\n tooltip: resolvedTooltip,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, placeholder, helperText, required, disabled, readOnly, tooltip })\n\n return (\n <form.Field name={fullPath}>\n {(field: AnyFieldApi) => {\n const { hasError, errorMessage } = getFieldErrors(field)\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolvedRequired}\n disabled={resolvedDisabled}\n readOnly={resolvedReadOnly}\n >\n <FieldLabel label={resolvedLabel} tooltip={resolvedTooltip} required={resolvedRequired} />\n <RichTextEditor\n value={field.state.value as string}\n onChange={(value) => field.handleChange(value)}\n onBlur={field.handleBlur}\n placeholder={resolvedPlaceholder}\n minHeight={minHeight}\n maxHeight={maxHeight}\n showToolbar={showToolbar}\n toolbarButtons={toolbarButtons}\n outputFormat={outputFormat}\n disabled={disabled}\n readOnly={readOnly}\n hasError={hasError}\n fieldName={fullPath}\n imageUpload={imageUpload}\n />\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolvedHelperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n\n/**\n * Props for internal editor component\n */\ninterface RichTextEditorProps {\n value: string\n onChange: (value: string) => void\n onBlur: () => void\n placeholder?: string\n minHeight: string | number\n maxHeight?: string | number\n showToolbar: boolean\n toolbarButtons: ToolbarButton[]\n outputFormat: 'html' | 'json'\n disabled?: boolean\n readOnly?: boolean\n hasError?: boolean\n fieldName: string\n imageUpload?: ImageUploadConfig\n}\n\n/**\n * Internal Tiptap editor component\n */\nfunction RichTextEditor({\n value,\n onChange,\n onBlur,\n placeholder,\n minHeight,\n maxHeight,\n showToolbar,\n toolbarButtons,\n outputFormat,\n disabled,\n readOnly,\n hasError,\n fieldName,\n imageUpload,\n}: RichTextEditorProps) {\n // Build extensions dynamically\n const extensions = useMemo(() => {\n // Base extensions\n const baseExtensions = [\n StarterKit,\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n rel: 'noopener noreferrer',\n target: '_blank',\n },\n }),\n Placeholder.configure({\n placeholder: placeholder ?? 'Start typing...',\n }),\n // Add Image extension only if imageUpload is configured\n ...(imageUpload\n ? [\n TiptapImage.configure({\n inline: false,\n allowBase64: false,\n HTMLAttributes: {\n class: 'richtext-image',\n },\n }),\n ]\n : []),\n ]\n\n return baseExtensions\n }, [placeholder, imageUpload])\n\n const editor = useEditor({\n // Cast needed: minor @tiptap/core version drift (e.g. 3.20.0 vs 3.20.1) causes nominal type mismatch\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- @tiptap/core version incompatibility\n extensions: extensions as any[],\n content: outputFormat === 'json' && value ? safeParseJSON(value) : value || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor }) => {\n if (outputFormat === 'json') {\n onChange(JSON.stringify(editor.getJSON()))\n } else {\n onChange(editor.getHTML())\n }\n },\n onBlur: () => {\n onBlur()\n },\n immediatelyRender: false,\n })\n\n // Synchronize external value changes\n useEffect(() => {\n if (!editor) {\n return\n }\n\n const currentContent = outputFormat === 'json' ? JSON.stringify(editor.getJSON()) : editor.getHTML()\n\n // Update only if content changed (avoid cursor jump)\n if (value !== currentContent) {\n const content = outputFormat === 'json' && value ? safeParseJSON(value) : value || ''\n editor.commands.setContent(content, { emitUpdate: false })\n }\n }, [editor, value, outputFormat])\n\n // Update editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!disabled && !readOnly)\n }\n }, [editor, disabled, readOnly])\n\n if (!editor) {\n return null\n }\n\n return (\n <Box\n borderWidth=\"1px\"\n borderRadius=\"md\"\n borderColor={hasError ? 'border.error' : 'border'}\n overflow=\"hidden\"\n data-field-name={fieldName}\n _focusWithin={{\n borderColor: hasError ? 'border.error' : 'colorPalette.500',\n boxShadow: hasError\n ? '0 0 0 1px var(--chakra-colors-border-error)'\n : '0 0 0 1px var(--chakra-colors-colorPalette-500)',\n }}\n >\n {showToolbar && !readOnly && (\n <HStack p={1} gap={0.5} borderBottomWidth=\"1px\" borderColor=\"border\" bg=\"bg.subtle\" flexWrap=\"wrap\">\n {toolbarButtons.map((button) => {\n // Special handling for link — use Popover instead of window.prompt\n if (button === 'link') {\n return <LinkPopover key={button} editor={editor} disabled={disabled} />\n }\n\n // Special handling for image — use ImagePopover with upload\n if (button === 'image') {\n // Show button only if imageUpload is configured\n if (!imageUpload) {\n return null\n }\n return <ImagePopover key={button} editor={editor} config={imageUpload} disabled={disabled} />\n }\n\n const config = TOOLBAR_CONFIG[button]\n const isActive = config.isActive?.(editor) ?? false\n\n return (\n <IconButton\n key={button}\n aria-label={config.label}\n size=\"sm\"\n variant={isActive ? 'solid' : 'ghost'}\n colorPalette={isActive ? 'brand' : undefined}\n onClick={() => config.action(editor)}\n disabled={disabled}\n >\n {config.icon}\n </IconButton>\n )\n })}\n </HStack>\n )}\n <Box\n minHeight={minHeight}\n maxHeight={maxHeight}\n overflowY={maxHeight ? 'auto' : undefined}\n p={3}\n css={{\n '& .tiptap': {\n outline: 'none',\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\n },\n '& .tiptap p.is-editor-empty:first-child::before': {\n color: 'var(--chakra-colors-fg-muted)',\n content: 'attr(data-placeholder)',\n float: 'left',\n height: 0,\n pointerEvents: 'none',\n },\n '& .tiptap h1': {\n fontSize: '2xl',\n fontWeight: 'bold',\n marginTop: '1em',\n marginBottom: '0.5em',\n },\n '& .tiptap h2': {\n fontSize: 'xl',\n fontWeight: 'bold',\n marginTop: '1em',\n marginBottom: '0.5em',\n },\n '& .tiptap h3': {\n fontSize: 'lg',\n fontWeight: 'semibold',\n marginTop: '1em',\n marginBottom: '0.5em',\n },\n '& .tiptap ul, & .tiptap ol': {\n paddingLeft: '1.5em',\n marginTop: '0.5em',\n marginBottom: '0.5em',\n },\n '& .tiptap blockquote': {\n borderLeft: '3px solid var(--chakra-colors-border)',\n paddingLeft: '1em',\n marginLeft: 0,\n marginTop: '0.5em',\n marginBottom: '0.5em',\n fontStyle: 'italic',\n color: 'var(--chakra-colors-fg-muted)',\n },\n '& .tiptap code': {\n backgroundColor: 'var(--chakra-colors-bg-subtle)',\n borderRadius: '3px',\n padding: '0.2em 0.4em',\n fontFamily: 'mono',\n fontSize: '0.9em',\n },\n '& .tiptap a': {\n color: 'var(--chakra-colors-colorPalette-500)',\n textDecoration: 'underline',\n cursor: 'pointer',\n },\n '& .tiptap p': {\n marginTop: '0.25em',\n marginBottom: '0.25em',\n },\n '& .tiptap img, & .tiptap .richtext-image': {\n maxWidth: '100%',\n height: 'auto',\n borderRadius: '4px',\n marginTop: '0.5em',\n marginBottom: '0.5em',\n },\n }}\n >\n <EditorContent editor={editor} />\n </Box>\n </Box>\n )\n}\n","'use client'\n\nimport { Input } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { StringFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.String - String input field\n *\n * Renders a Chakra Input with automatic form integration and error display.\n *\n * Automatically extracts from Zod schema:\n * - `type` from `z.string().email()` → type=\"email\", `z.string().url()` → type=\"url\"\n * - `maxLength` from `z.string().max(100)` → maxLength={100}\n * - `minLength` from `z.string().min(2)` → minLength={2}\n * - `pattern` from `z.string().regex(/.../)` → pattern=\"...\"\n * - `helperText` automatically generated from constraints (\"Maximum 100 characters\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example\n * ```tsx\n * <Form.Field.String name=\"title\" label=\"Title\" required />\n * ```\n *\n * @example With automatic constraints from Zod\n * ```tsx\n * // In schema: z.object({ email: z.string().email().max(255) })\n * <Form.Field.String name=\"email\" />\n * // Automatically: type=\"email\", maxLength={255}\n * ```\n *\n * @example In primitive array (no name)\n * ```tsx\n * <Form.Group.List name=\"tags\">\n * <Form.Field.String placeholder=\"Tag\" />\n * </Form.Group.List>\n * ```\n */\n/**\n * Automatic inputMode based on field type for mobile keyboards\n */\nfunction getInputModeFromType(type: string): StringFieldProps['inputMode'] {\n switch (type) {\n case 'email':\n return 'email'\n case 'tel':\n return 'tel'\n case 'url':\n return 'url'\n default:\n return 'text'\n }\n}\n\nexport const FieldString = createField<StringFieldProps, string>({\n displayName: 'FieldString',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { constraints } = resolved\n\n // Props take priority over constraints\n const type = componentProps.type ?? constraints.string?.inputType ?? 'text'\n const maxLength = componentProps.maxLength ?? constraints.string?.maxLength\n const minLength = componentProps.minLength ?? constraints.string?.minLength\n const pattern = componentProps.pattern ?? constraints.string?.pattern\n // inputMode: explicit prop > auto from type\n const inputMode = componentProps.inputMode ?? getInputModeFromType(type)\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Input\n type={type}\n inputMode={inputMode}\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n maxLength={maxLength}\n minLength={minLength}\n pattern={pattern}\n autoComplete={componentProps.autoComplete}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Textarea } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { TextareaFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Textarea - Multiline text input field\n *\n * Renders a Chakra Textarea with automatic form integration and error display.\n *\n * Automatically extracts from Zod schema:\n * - `maxLength` from `z.string().max(500)` → maxLength={500}\n * - `helperText` automatically is generated from constraints (\"Maximum 500 characters\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example\n * ```tsx\n * <Form.Field.Textarea name=\"description\" label=\"Description\" rows={4} />\n * ```\n *\n * @example With automatic constraints from Zod\n * ```tsx\n * // In schema: z.object({ bio: z.string().max(500) })\n * <Form.Field.Textarea name=\"bio\" label=\"Bio\" autoresize />\n * // Automatically: maxLength={500} helperText=\"Maximum 500 characters\"\n * ```\n */\nexport const FieldTextarea = createField<TextareaFieldProps, string>({\n displayName: 'FieldTextarea',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { constraints } = resolved\n\n // Props take priority over constraints\n const maxLength = componentProps.maxLength ?? constraints.string?.maxLength\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Textarea\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLTextAreaElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n rows={componentProps.rows}\n autoresize={componentProps.autoresize}\n resize={componentProps.resize ?? 'vertical'}\n maxLength={maxLength}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { NumberInput } from '@chakra-ui/react'\nimport { type ReactElement, useMemo } from 'react'\nimport type { CurrencyFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Currency - Currency input field\n *\n * Renders NumberInput with currency formatting (symbol and decimal part).\n *\n * @example Russian rubles (by default)\n * ```tsx\n * <Form.Field.Currency name=\"price\" label=\"Price\" />\n * ```\n *\n * @example US Dollars\n * ```tsx\n * <Form.Field.Currency name=\"amount\" label=\"Amount\" currency=\"USD\" />\n * ```\n *\n * @example Euro with currency code\n * ```tsx\n * <Form.Field.Currency\n * name=\"total\"\n * label=\"Total\"\n * currency=\"EUR\"\n * currencyDisplay=\"code\"\n * />\n * ```\n */\n/** Currency field state */\ninterface CurrencyFieldState {\n /** Memoized format options */\n formatOptions: Intl.NumberFormatOptions\n}\n\nexport const FieldCurrency = createField<CurrencyFieldProps, number | undefined, CurrencyFieldState>({\n displayName: 'FieldCurrency',\n\n useFieldState: (props) => {\n const { currency = 'RUB', currencyDisplay = 'symbol', decimalScale = 2 } = props\n\n // Memoize formatOptions at component top level\n const formatOptions = useMemo(\n () => ({\n style: 'currency' as const,\n currency,\n currencyDisplay,\n minimumFractionDigits: decimalScale,\n maximumFractionDigits: decimalScale,\n }),\n [currency, currencyDisplay, decimalScale]\n )\n\n return { formatOptions }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const value = field.state.value as number | undefined\n\n const { min, max, step = 0.01, size } = componentProps\n\n const { formatOptions } = fieldState\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <NumberInput.Root\n value={value?.toString() ?? ''}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n field.handleChange(Number.isNaN(num) ? undefined : num)\n }}\n onBlur={field.handleBlur}\n min={min}\n max={max}\n step={step}\n formatOptions={formatOptions}\n clampValueOnBlur\n size={size}\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input placeholder={resolved.placeholder} data-field-name={fullPath} />\n </NumberInput.Root>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { NumberInput } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { NumberFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Number - Number input field\n *\n * Renders a Chakra NumberInput with automatic form integration and error display.\n *\n * Automatically extracts from Zod schema:\n * - `min` from `z.number().min(1)` → min={1}\n * - `max` from `z.number().max(100)` → max={100}\n * - `step` from `z.number().int()` → step={1}, or `z.number().multipleOf(0.5)` → step={0.5}\n * - `helperText` automatically generated from constraints (\"From 1 to 100\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example\n * ```tsx\n * <Form.Field.Number name=\"portions\" label=\"Portions\" />\n * // With z.number().min(1).max(100) automatically: min={1} max={100} helperText=\"From 1 to 100\"\n * ```\n */\nexport const FieldNumber = createField<NumberFieldProps, number | undefined>({\n displayName: 'FieldNumber',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const value = field.state.value as number | undefined\n const { constraints } = resolved\n\n // Props take priority over constraints\n const min = componentProps.min ?? constraints.number?.min\n const max = componentProps.max ?? constraints.number?.max\n const step = componentProps.step ?? constraints.number?.step\n\n // For optional fields do not pass min/max to NumberInput when value is empty,\n // otherwise Chakra will show invalid state for empty value\n const isOptional = resolved.required === false\n const isEmpty = value === undefined || value === null\n const shouldApplyMinMax = !isOptional || !isEmpty\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <NumberInput.Root\n value={value?.toString() ?? ''}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n field.handleChange(Number.isNaN(num) ? undefined : num)\n }}\n onBlur={field.handleBlur}\n min={shouldApplyMinMax ? min : undefined}\n max={shouldApplyMinMax ? max : undefined}\n step={step}\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input placeholder={resolved.placeholder} data-field-name={fullPath} inputMode=\"decimal\" />\n </NumberInput.Root>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { NumberInput } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { NumberInputFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.NumberInput - Number field with extended options\n *\n * Extends base Number field with formatting, mouse wheel support, etc.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.NumberInput name=\"quantity\" label=\"Quantity\" min={1} max={100} />\n * ```\n *\n * @example With currency formatting\n * ```tsx\n * <Form.Field.NumberInput\n * name=\"price\"\n * label=\"Price\"\n * formatOptions={{ style: 'currency', currency: 'RUB' }}\n * />\n * ```\n *\n * @example With mouse wheel\n * ```tsx\n * <Form.Field.NumberInput name=\"count\" allowMouseWheel />\n * ```\n */\nexport const FieldNumberInput = createField<NumberInputFieldProps, number | undefined>({\n displayName: 'FieldNumberInput',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const value = field.state.value as number | undefined\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <NumberInput.Root\n value={value?.toString() ?? ''}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n field.handleChange(Number.isNaN(num) ? undefined : num)\n }}\n onBlur={field.handleBlur}\n min={componentProps.min}\n max={componentProps.max}\n step={componentProps.step}\n formatOptions={componentProps.formatOptions}\n allowMouseWheel={componentProps.allowMouseWheel}\n clampValueOnBlur={componentProps.clampValueOnBlur ?? true}\n spinOnPress={componentProps.spinOnPress ?? true}\n size={componentProps.size}\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input placeholder={resolved.placeholder} data-field-name={fullPath} inputMode=\"decimal\" />\n </NumberInput.Root>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { NumberInput } from '@chakra-ui/react'\nimport { type ReactElement, useMemo } from 'react'\nimport type { PercentageFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Percentage - Percentage input field\n *\n * Renders NumberInput with percentage formatting and % symbol.\n * Value is stored as-is (50 = 50%), not as decimal fraction (0.5).\n *\n * @example Basic usage (0-100%)\n * ```tsx\n * <Form.Field.Percentage name=\"discount\" label=\"Discount\" />\n * ```\n *\n * @example With custom range\n * ```tsx\n * <Form.Field.Percentage name=\"margin\" label=\"Margin\" min={0} max={50} />\n * ```\n *\n * @example With decimals\n * ```tsx\n * <Form.Field.Percentage name=\"rate\" label=\"Rate\" decimalScale={2} step={0.1} />\n * ```\n */\n/** Percentage field state */\ninterface PercentageFieldState {\n /** Memoized format options */\n formatOptions: Intl.NumberFormatOptions\n}\n\nexport const FieldPercentage = createField<PercentageFieldProps, number | undefined, PercentageFieldState>({\n displayName: 'FieldPercentage',\n\n useFieldState: (props) => {\n const { decimalScale = 0 } = props\n\n // Use 'unit' style with percent to store whole numbers (50 = 50%)\n // Chakra's 'percent' style expects decimals (0.5 = 50%)\n const formatOptions = useMemo(\n () => ({\n style: 'unit' as const,\n unit: 'percent',\n unitDisplay: 'short' as const,\n minimumFractionDigits: decimalScale,\n maximumFractionDigits: decimalScale,\n }),\n [decimalScale]\n )\n\n return { formatOptions }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const value = field.state.value as number | undefined\n\n const { min = 0, max = 100, step = 1, size } = componentProps\n\n const { formatOptions } = fieldState\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <NumberInput.Root\n value={value?.toString() ?? ''}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n field.handleChange(Number.isNaN(num) ? undefined : num)\n }}\n onBlur={field.handleBlur}\n min={min}\n max={max}\n step={step}\n formatOptions={formatOptions}\n clampValueOnBlur\n size={size}\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input placeholder={resolved.placeholder} data-field-name={fullPath} />\n </NumberInput.Root>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Field, HStack, RatingGroup } from '@chakra-ui/react'\nimport type React from 'react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { BaseFieldProps } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Props for Rating field\n */\nexport interface RatingFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Number of rating elements (by default: 5) */\n count?: number\n /** Allow half values (by default: false) */\n allowHalf?: boolean\n /** Size: xs, sm, md, lg (by default: md) */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Color palette (by default: gray) */\n colorPalette?: 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink'\n /** Custom icon (by default: star) */\n icon?: ReactNode\n /** Callback on value change */\n onValueChange?: (value: number) => void\n}\n\n/**\n * Form.Field.Rating - Star rating input field\n *\n * Renders Chakra RatingGroup with automatic form integration.\n * Form value is stored as number.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Rating name=\"rating\" label=\"Rating\" />\n * ```\n *\n * @example With custom count and color\n * ```tsx\n * <Form.Field.Rating\n * name=\"quality\"\n * label=\"Quality\"\n * count={10}\n * colorPalette=\"orange\"\n * />\n * ```\n *\n * @example With half values\n * ```tsx\n * <Form.Field.Rating\n * name=\"score\"\n * label=\"Score\"\n * allowHalf\n * size=\"lg\"\n * />\n * ```\n */\nexport const FieldRating = createField<RatingFieldProps, number>({\n displayName: 'FieldRating',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { count = 5, allowHalf = false, size = 'md', colorPalette, icon, onValueChange } = componentProps\n\n const value = (field.state.value as number) ?? 0\n\n const handleValueChange = (details: { value: number }) => {\n field.handleChange(details.value)\n onValueChange?.(details.value)\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <RatingGroup.Root\n value={value}\n onValueChange={handleValueChange}\n count={count}\n allowHalf={allowHalf}\n size={size}\n colorPalette={colorPalette}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n data-field-name={fullPath}\n >\n {resolved.label && (\n <RatingGroup.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </RatingGroup.Label>\n )}\n <RatingGroup.HiddenInput onBlur={field.handleBlur} />\n <RatingGroup.Control>\n {Array.from({ length: count }).map((_, index) => (\n <RatingGroup.Item key={index} index={index + 1}>\n <RatingGroup.ItemIndicator icon={icon as React.ReactElement | undefined} />\n </RatingGroup.Item>\n ))}\n </RatingGroup.Control>\n </RatingGroup.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Field, For, HStack, Slider } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Slider mark definition\n */\nexport interface SliderMark {\n /** Value on the scale */\n value: number\n /** Mark text */\n label?: ReactNode\n}\n\n/**\n * Props for Slider field\n */\nexport interface SliderFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Minimum value (by default: 0) */\n min?: number\n /** Maximum value (by default: 100) */\n max?: number\n /** Step (by default: 1) */\n step?: number\n /** Show current value next to label */\n showValue?: boolean\n /** Orientation (by default: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Size (by default: md) */\n size?: 'sm' | 'md' | 'lg'\n /** Variant (by default: outline) */\n variant?: 'outline' | 'solid'\n /** Color palette */\n colorPalette?: 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink'\n /** Marks on slider track */\n marks?: (number | SliderMark)[]\n /** Fill origin point (by default: start) */\n origin?: 'start' | 'center' | 'end'\n /** Callback on value change */\n onValueChange?: (value: number) => void\n /** Callback when drag ends */\n onValueChangeEnd?: (value: number) => void\n}\n\n/**\n * Form.Field.Slider - Slider field\n *\n * Renders Chakra Slider with automatic form integration.\n * Form value is stored as number.\n *\n * Automatically extracts from Zod schema:\n * - `min` from `z.number().min(1)` → min={1}\n * - `max` from `z.number().max(100)` → max={100}\n * - `step` from `z.number().int()` → step={1}, or `z.number().multipleOf(0.5)` → step={0.5}\n * - `helperText` automatically is generated from constraints (\"From 1 to 100\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Slider name=\"volume\" label=\"Volume\" />\n * ```\n *\n * @example With automatic constraints from Zod\n * ```tsx\n * // In schema: z.object({ rating: z.number().min(1).max(10) })\n * <Form.Field.Slider name=\"rating\" label=\"Rating\" showValue />\n * // Automatically: min={1} max={10} helperText=\"From 1 to 10\"\n * ```\n *\n * @example With marks\n * ```tsx\n * <Form.Field.Slider\n * name=\"rating\"\n * label=\"Rating\"\n * min={0}\n * max={100}\n * marks={[0, 25, 50, 75, 100]}\n * />\n * ```\n */\nexport const FieldSlider = createField<SliderFieldProps, number>({\n displayName: 'FieldSlider',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { constraints } = resolved\n\n // Props take priority over constraints, then defaults\n const min = componentProps.min ?? constraints.number?.min ?? 0\n const max = componentProps.max ?? constraints.number?.max ?? 100\n const step = componentProps.step ?? constraints.number?.step ?? 1\n\n const {\n showValue,\n orientation = 'horizontal',\n size = 'md',\n variant = 'outline',\n colorPalette,\n marks,\n origin,\n onValueChange,\n onValueChangeEnd,\n } = componentProps\n\n // Normalize marks to array of objects\n const normalizedMarks = marks?.map((mark) => (typeof mark === 'number' ? { value: mark, label: undefined } : mark))\n\n // Convert number to array for Slider\n const numValue = (field.state.value as number) ?? min\n const arrayValue = [numValue]\n\n const handleValueChange = (details: { value: number[] }) => {\n const newValue = details.value[0] ?? min\n field.handleChange(newValue)\n onValueChange?.(newValue)\n }\n\n const handleValueChangeEnd = (details: { value: number[] }) => {\n const newValue = details.value[0] ?? min\n onValueChangeEnd?.(newValue)\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Slider.Root\n value={arrayValue}\n onValueChange={handleValueChange}\n onValueChangeEnd={handleValueChangeEnd}\n min={min}\n max={max}\n step={step}\n orientation={orientation}\n size={size}\n variant={variant}\n colorPalette={colorPalette}\n origin={origin}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n invalid={hasError}\n thumbAlignment=\"center\"\n onBlur={field.handleBlur}\n data-field-name={fullPath}\n >\n {resolved.label && !showValue && (\n <Slider.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </Slider.Label>\n )}\n {resolved.label && showValue && (\n <HStack justify=\"space-between\">\n <Slider.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </Slider.Label>\n <Slider.ValueText />\n </HStack>\n )}\n <Slider.Control>\n <Slider.Track>\n <Slider.Range />\n </Slider.Track>\n <For each={arrayValue}>\n {(_, index) => (\n <Slider.Thumb key={index} index={index}>\n <Slider.HiddenInput />\n </Slider.Thumb>\n )}\n </For>\n {normalizedMarks && normalizedMarks.length > 0 && (\n <Slider.MarkerGroup>\n {normalizedMarks.map((mark, index) => (\n <Slider.Marker key={index} value={mark.value}>\n <Slider.MarkerIndicator />\n {mark.label}\n </Slider.Marker>\n ))}\n </Slider.MarkerGroup>\n )}\n </Slider.Control>\n </Slider.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Input } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { DateFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Date - Date input field\n *\n * Renders a native date input with automatic form integration and error display.\n *\n * Automatically extracts from Zod schema:\n * - `min` from `z.date().min(new Date('2024-01-01'))` → min=\"2024-01-01\"\n * - `max` from `z.date().max(new Date('2024-12-31'))` → max=\"2024-12-31\"\n * - `helperText` automatically is generated from constraints (\"From Jan 1, 2024 to Dec 31, 2024\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example\n * ```tsx\n * <Form.Field.Date name=\"birthDate\" label=\"Date of Birth\" />\n * ```\n *\n * @example With automatic constraints from Zod\n * ```tsx\n * // In schema: z.object({ eventDate: z.date().min(new Date('2024-01-01')).max(new Date('2024-12-31')) })\n * <Form.Field.Date name=\"eventDate\" label=\"Event Date\" />\n * // Automatically: min=\"2024-01-01\", max=\"2024-12-31\"\n * ```\n */\nexport const FieldDate = createField<DateFieldProps, string | Date>({\n displayName: 'FieldDate',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { constraints } = resolved\n\n // Handle Date objects by converting to YYYY-MM-DD string\n const rawValue = field.state.value\n let stringValue = ''\n if (rawValue instanceof Date) {\n stringValue = rawValue.toISOString().split('T')[0]\n } else if (typeof rawValue === 'string') {\n stringValue = rawValue\n }\n\n // Props take priority over constraints\n const min = componentProps.min ?? constraints.date?.min\n const max = componentProps.max ?? constraints.date?.max\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Input\n type=\"date\"\n value={stringValue}\n onChange={(e) => field.handleChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n min={min}\n max={max}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Box, Button, Field, Flex, HStack, Input, Menu, Portal } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { LuCalendar, LuChevronDown } from 'react-icons/lu'\nimport type { BaseFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Date range value type\n */\nexport interface DateRangeValue {\n start: string\n end: string\n}\n\n/**\n * Preset types for quick date range selection\n */\nexport type DateRangePreset = 'today' | 'yesterday' | 'thisWeek' | 'lastWeek' | 'thisMonth' | 'lastMonth' | 'thisYear'\n\n/**\n * Props for Form.Field.DateRange\n */\nexport interface DateRangeFieldProps extends BaseFieldProps {\n /** Label for start date */\n startLabel?: string\n /** Label for end date */\n endLabel?: string\n /** Placeholder for start date */\n startPlaceholder?: string\n /** Placeholder for end date */\n endPlaceholder?: string\n /** Minimum date (format YYYY-MM-DD) */\n min?: string\n /** Maximum date (format YYYY-MM-DD) */\n max?: string\n /** Enable preset buttons */\n presets?: DateRangePreset[]\n /** Date fields orientation */\n orientation?: 'horizontal' | 'vertical'\n /** Size */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n}\n\n/**\n * Get date range for preset\n */\nfunction getPresetRange(preset: DateRangePreset): DateRangeValue {\n const today = new Date()\n const formatDate = (d: Date) => d.toISOString().split('T')[0]\n\n switch (preset) {\n case 'today':\n return { start: formatDate(today), end: formatDate(today) }\n case 'yesterday': {\n const yesterday = new Date(today)\n yesterday.setDate(today.getDate() - 1)\n return { start: formatDate(yesterday), end: formatDate(yesterday) }\n }\n case 'thisWeek': {\n const startOfWeek = new Date(today)\n startOfWeek.setDate(today.getDate() - today.getDay() + 1) // Monday\n const endOfWeek = new Date(startOfWeek)\n endOfWeek.setDate(startOfWeek.getDate() + 6) // Sunday\n return { start: formatDate(startOfWeek), end: formatDate(endOfWeek) }\n }\n case 'lastWeek': {\n const startOfLastWeek = new Date(today)\n startOfLastWeek.setDate(today.getDate() - today.getDay() - 6) // Last Monday\n const endOfLastWeek = new Date(startOfLastWeek)\n endOfLastWeek.setDate(startOfLastWeek.getDate() + 6) // Last Sunday\n return { start: formatDate(startOfLastWeek), end: formatDate(endOfLastWeek) }\n }\n case 'thisMonth': {\n const startOfMonth = new Date(today.getFullYear(), today.getMonth(), 1)\n const endOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0)\n return { start: formatDate(startOfMonth), end: formatDate(endOfMonth) }\n }\n case 'lastMonth': {\n const startOfLastMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1)\n const endOfLastMonth = new Date(today.getFullYear(), today.getMonth(), 0)\n return { start: formatDate(startOfLastMonth), end: formatDate(endOfLastMonth) }\n }\n case 'thisYear': {\n const startOfYear = new Date(today.getFullYear(), 0, 1)\n const endOfYear = new Date(today.getFullYear(), 11, 31)\n return { start: formatDate(startOfYear), end: formatDate(endOfYear) }\n }\n }\n}\n\n/**\n * Get label for preset\n */\nfunction getPresetLabel(preset: DateRangePreset): string {\n switch (preset) {\n case 'today':\n return 'Today'\n case 'yesterday':\n return 'Yesterday'\n case 'thisWeek':\n return 'This week'\n case 'lastWeek':\n return 'Last week'\n case 'thisMonth':\n return 'This month'\n case 'lastMonth':\n return 'Last month'\n case 'thisYear':\n return 'This year'\n }\n}\n\n/**\n * Form.Field.DateRange - Date range selection with two fields\n *\n * Renders two date fields for range selection with optional presets.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.DateRange name=\"period\" label=\"Period\" />\n * ```\n *\n * @example With presets\n * ```tsx\n * <Form.Field.DateRange\n * name=\"period\"\n * label=\"Period\"\n * startLabel=\"From\"\n * endLabel=\"To\"\n * presets={['today', 'thisWeek', 'thisMonth']}\n * />\n * ```\n *\n * @example Vertical orientation\n * ```tsx\n * <Form.Field.DateRange\n * name=\"period\"\n * orientation=\"vertical\"\n * />\n * ```\n */\nexport const FieldDateRange = createField<DateRangeFieldProps, DateRangeValue>({\n displayName: 'FieldDateRange',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n startLabel = 'Start',\n endLabel = 'End',\n startPlaceholder,\n endPlaceholder,\n min,\n max,\n presets,\n orientation = 'horizontal',\n size = 'md',\n } = componentProps\n\n const value = (field.state.value as DateRangeValue) ?? { start: '', end: '' }\n\n const handleStartChange = (newStart: string) => {\n field.handleChange({ ...value, start: newStart })\n }\n\n const handleEndChange = (newEnd: string) => {\n field.handleChange({ ...value, end: newEnd })\n }\n\n const handlePreset = (preset: DateRangePreset) => {\n field.handleChange(getPresetRange(preset))\n }\n\n const Container = orientation === 'horizontal' ? HStack : Box\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <Flex gap={2} direction={orientation === 'horizontal' ? 'row' : 'column'} align=\"stretch\" width=\"full\">\n <Container gap={2} flex={1} alignItems=\"flex-end\">\n {/* Start date */}\n <Box flex={1}>\n <Field.Root disabled={resolved.disabled} readOnly={resolved.readOnly}>\n <Field.Label fontSize=\"sm\" color=\"fg.muted\">\n {startLabel}\n </Field.Label>\n <Input\n type=\"date\"\n value={value.start}\n onChange={(e) => handleStartChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={startPlaceholder}\n min={min}\n max={value.end || max}\n size={size}\n data-field-name={`${fullPath}.start`}\n />\n </Field.Root>\n </Box>\n\n {/* End date */}\n <Box flex={1}>\n <Field.Root disabled={resolved.disabled} readOnly={resolved.readOnly}>\n <Field.Label fontSize=\"sm\" color=\"fg.muted\">\n {endLabel}\n </Field.Label>\n <Input\n type=\"date\"\n value={value.end}\n onChange={(e) => handleEndChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={endPlaceholder}\n min={value.start || min}\n max={max}\n size={size}\n data-field-name={`${fullPath}.end`}\n />\n </Field.Root>\n </Box>\n </Container>\n\n {/* Presets menu */}\n {presets && presets.length > 0 && !resolved.readOnly && (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Button variant=\"outline\" size={size} disabled={resolved.disabled}>\n <LuCalendar />\n Presets\n <LuChevronDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {presets.map((preset) => (\n <Menu.Item key={preset} value={preset} onClick={() => handlePreset(preset)}>\n {getPresetLabel(preset)}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n )}\n </Flex>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Field, HStack, Input } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { DateTimePickerFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Parses a datetime string into separate date and time parts\n */\nfunction parseDateTime(value: string | undefined): { date: string; time: string } {\n if (!value) {\n return { date: '', time: '' }\n }\n\n // Handle ISO format: 2024-01-15T14:30:00\n const match = value.match(/^(\\d{4}-\\d{2}-\\d{2})(?:T(\\d{2}:\\d{2}))?/)\n if (match) {\n return { date: match[1], time: match[2] || '' }\n }\n\n return { date: '', time: '' }\n}\n\n/**\n * Combines date and time into an ISO datetime string\n */\nfunction combineDateTime(date: string, time: string): string {\n if (!date) {\n return ''\n }\n if (!time) {\n return date\n }\n return `${date}T${time}:00`\n}\n\n/**\n * Form.Field.DateTimePicker - Combined date and time picker\n *\n * Renders date and time fields that produce an ISO datetime string.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.DateTimePicker name=\"appointmentAt\" label=\"Appointment\" />\n * ```\n *\n * @example With min/max constraints\n * ```tsx\n * <Form.Field.DateTimePicker\n * name=\"eventAt\"\n * minDateTime={new Date()}\n * maxDateTime=\"2025-12-31T23:59\"\n * />\n * ```\n */\nexport const FieldDateTimePicker = createField<DateTimePickerFieldProps, string>({\n displayName: 'FieldDateTimePicker',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { minDateTime, maxDateTime, timeStep = 15 } = componentProps\n\n // Convert Date to string if needed\n const minDateTimeStr = minDateTime instanceof Date\n ? minDateTime.toISOString().slice(0, 16)\n : minDateTime?.slice(0, 16)\n const maxDateTimeStr = maxDateTime instanceof Date\n ? maxDateTime.toISOString().slice(0, 16)\n : maxDateTime?.slice(0, 16)\n\n const minDate = minDateTimeStr?.slice(0, 10)\n const maxDate = maxDateTimeStr?.slice(0, 10)\n\n const value = field.state.value as string | undefined\n const { date, time } = parseDateTime(value)\n\n const handleDateChange = (newDate: string) => {\n const combined = combineDateTime(newDate, time)\n field.handleChange(combined || undefined)\n }\n\n const handleTimeChange = (newTime: string) => {\n const combined = combineDateTime(date, newTime)\n field.handleChange(combined || undefined)\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <HStack gap={2}>\n <Input\n type=\"date\"\n value={date}\n onChange={(e) => handleDateChange(e.target.value)}\n onBlur={field.handleBlur}\n min={minDate}\n max={maxDate}\n data-field-name={`${fullPath}-date`}\n flex={1}\n />\n <Input\n type=\"time\"\n value={time}\n onChange={(e) => handleTimeChange(e.target.value)}\n onBlur={field.handleBlur}\n step={timeStep * 60}\n data-field-name={`${fullPath}-time`}\n width=\"150px\"\n />\n </HStack>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Field, HStack, NumberInput, Text } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { DurationFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Converts minutes to HH:MM format\n */\nfunction minutesToHHMM(minutes: number): { hours: number; mins: number } {\n return {\n hours: Math.floor(minutes / 60),\n mins: minutes % 60,\n }\n}\n\n/**\n * Converts HH:MM to minutes\n */\nfunction hhmmToMinutes(hours: number, mins: number): number {\n return hours * 60 + mins\n}\n\n/**\n * Form.Field.Duration - Duration input field\n *\n * Renders duration field with hours and minutes or minutes only.\n * Value is stored as total number of minutes.\n *\n * @example HH:MM format (by default)\n * ```tsx\n * <Form.Field.Duration name=\"duration\" label=\"Duration\" />\n * ```\n *\n * @example Minutes only\n * ```tsx\n * <Form.Field.Duration name=\"duration\" format=\"minutes\" />\n * ```\n *\n * @example With min/max constraints\n * ```tsx\n * <Form.Field.Duration name=\"duration\" min={30} max={240} step={15} />\n * ```\n */\nexport const FieldDuration = createField<DurationFieldProps, number>({\n displayName: 'FieldDuration',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { format = 'HH:MM', min = 0, max = 1440, step = 15 } = componentProps\n\n const value = (field.state.value as number) ?? 0\n const { hours, mins } = minutesToHHMM(value)\n\n const handleHoursChange = (newHours: number) => {\n const newValue = hhmmToMinutes(newHours, mins)\n const clampedValue = Math.max(min, Math.min(max, newValue))\n field.handleChange(clampedValue)\n }\n\n const handleMinsChange = (newMins: number) => {\n const newValue = hhmmToMinutes(hours, newMins)\n const clampedValue = Math.max(min, Math.min(max, newValue))\n field.handleChange(clampedValue)\n }\n\n const handleMinutesChange = (newValue: number) => {\n const clampedValue = Math.max(min, Math.min(max, newValue))\n field.handleChange(clampedValue)\n }\n\n // Minutes only format\n if (format === 'minutes') {\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <NumberInput.Root\n value={value.toString()}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n if (!Number.isNaN(num)) {\n handleMinutesChange(num)\n }\n }}\n onBlur={field.handleBlur}\n min={min}\n max={max}\n step={step}\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input placeholder={resolved.placeholder ?? 'min'} data-field-name={fullPath} />\n </NumberInput.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n }\n\n // HH:MM format\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <HStack gap={2}>\n <NumberInput.Root\n value={hours.toString()}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n if (!Number.isNaN(num)) {\n handleHoursChange(num)\n }\n }}\n onBlur={field.handleBlur}\n min={0}\n max={Math.floor(max / 60)}\n width=\"80px\"\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input data-field-name={`${fullPath}-hours`} />\n </NumberInput.Root>\n <Text fontWeight=\"bold\">:</Text>\n <NumberInput.Root\n value={mins.toString().padStart(2, '0')}\n onValueChange={(details: { valueAsNumber: number }) => {\n const num = details.valueAsNumber\n if (!Number.isNaN(num)) {\n handleMinsChange(num)\n }\n }}\n onBlur={field.handleBlur}\n min={0}\n max={59}\n step={step}\n width=\"80px\"\n >\n <NumberInput.Control>\n <NumberInput.IncrementTrigger />\n <NumberInput.DecrementTrigger />\n </NumberInput.Control>\n <NumberInput.Input data-field-name={`${fullPath}-mins`} />\n </NumberInput.Root>\n </HStack>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Box, Button, Field, HStack, Input, Stack, Text } from '@chakra-ui/react'\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport { memo, useCallback, useMemo, type ReactElement, type ReactNode } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { FieldError, FieldLabel, getFieldErrors, useResolvedFieldProps } from '../base'\n\n/**\n * Time slot\n */\nexport interface TimeSlot {\n open: string\n close: string\n}\n\n/**\n * Day schedule (null = day off)\n */\nexport type DaySchedule = TimeSlot | null\n\n/**\n * Weekly schedule\n */\nexport interface WeeklySchedule {\n monday: DaySchedule\n tuesday: DaySchedule\n wednesday: DaySchedule\n thursday: DaySchedule\n friday: DaySchedule\n saturday: DaySchedule\n sunday: DaySchedule\n}\n\n/**\n * Day of week\n */\nexport type DayOfWeek = keyof WeeklySchedule\n\n/**\n * Days configuration\n */\nconst DAYS_OF_WEEK: DayOfWeek[] = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']\n\nconst DEFAULT_DAY_NAMES: Record<DayOfWeek, string> = {\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n sunday: 'Sunday',\n}\n\nconst DEFAULT_WORKING_HOURS: WeeklySchedule = {\n monday: { open: '09:00', close: '18:00' },\n tuesday: { open: '09:00', close: '18:00' },\n wednesday: { open: '09:00', close: '18:00' },\n thursday: { open: '09:00', close: '18:00' },\n friday: { open: '09:00', close: '18:00' },\n saturday: null,\n sunday: null,\n}\n\n/**\n * Constants for custom switch styling\n * Native checkbox used instead of Chakra Switch for RHF compatibility\n */\nconst SWITCH_STYLES = {\n /** Switch track width */\n trackWidth: '36px',\n /** Switch track height */\n trackHeight: '20px',\n /** Round indicator (thumb) size */\n thumbSize: '16px',\n /** Thumb offset from edge (2px each side for centering in 20px track) */\n thumbOffset: '2px',\n /** Thumb position in enabled state (trackWidth - thumbSize - thumbOffset = 36 - 16 - 2 = 18) */\n thumbEnabledLeft: '18px',\n} as const\n\n/**\n * Checks that end time is after start time\n */\nfunction isValidTimeRange(open: string, close: string): boolean {\n const [openH, openM] = open.split(':').map(Number)\n const [closeH, closeM] = close.split(':').map(Number)\n const openMinutes = openH * 60 + openM\n const closeMinutes = closeH * 60 + closeM\n return closeMinutes > openMinutes\n}\n\n/**\n * Internal component for rendering the schedule.\n * Extracted separately to comply with React hooks rules.\n */\ninterface ScheduleContentProps {\n field: AnyFieldApi\n schedule: WeeklySchedule\n defaultSchedule: WeeklySchedule\n days: DayOfWeek[]\n mergedDayNames: Record<DayOfWeek, string>\n showCopyToWeekdays: boolean\n offLabel: string\n copyToWeekdaysLabel: string\n defaultOpenTime: string\n defaultCloseTime: string\n disabled?: boolean\n readOnly?: boolean\n resolvedLabel?: ReactNode\n resolvedHelperText?: ReactNode\n resolvedRequired?: boolean\n resolvedTooltip?: FieldTooltipMeta\n fullPath: string\n}\n\nconst ScheduleContent = memo(function ScheduleContent({\n field,\n schedule,\n days,\n mergedDayNames,\n showCopyToWeekdays,\n offLabel,\n copyToWeekdaysLabel,\n defaultOpenTime,\n defaultCloseTime,\n disabled,\n readOnly,\n resolvedLabel,\n resolvedHelperText,\n resolvedRequired,\n resolvedTooltip,\n fullPath,\n}: ScheduleContentProps) {\n const { hasError, errorMessage } = getFieldErrors(field)\n\n // Check for invalid time ranges\n const invalidDays = useMemo(() => {\n const invalid: DayOfWeek[] = []\n for (const day of days) {\n const daySchedule = schedule[day]\n if (daySchedule && !isValidTimeRange(daySchedule.open, daySchedule.close)) {\n invalid.push(day)\n }\n }\n return invalid\n }, [schedule, days])\n\n const handleDayToggle = useCallback(\n (day: DayOfWeek, enabled: boolean) => {\n const newSchedule = {\n ...schedule,\n [day]: enabled ? { open: defaultOpenTime, close: defaultCloseTime } : null,\n }\n field.handleChange(newSchedule)\n },\n [schedule, field, defaultOpenTime, defaultCloseTime]\n )\n\n const handleTimeChange = useCallback(\n (day: DayOfWeek, timeField: 'open' | 'close', value: string) => {\n const current = schedule[day]\n if (!current) {\n return\n }\n const newSchedule = {\n ...schedule,\n [day]: { ...current, [timeField]: value },\n }\n field.handleChange(newSchedule)\n },\n [schedule, field]\n )\n\n const handleCopyToWeekdays = useCallback(() => {\n const mondaySchedule = schedule.monday\n if (!mondaySchedule) {\n return\n }\n const newSchedule = {\n ...schedule,\n monday: mondaySchedule,\n tuesday: mondaySchedule,\n wednesday: mondaySchedule,\n thursday: mondaySchedule,\n friday: mondaySchedule,\n }\n field.handleChange(newSchedule)\n }, [schedule, field])\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolvedRequired}\n disabled={disabled}\n readOnly={readOnly}\n data-field-name={fullPath}\n >\n <FieldLabel label={resolvedLabel} tooltip={resolvedTooltip} required={resolvedRequired} />\n\n <Stack gap={3}>\n {/* Warning about invalid ranges */}\n {invalidDays.length > 0 && (\n <Box p={3} bg=\"red.50\" borderWidth=\"1px\" borderColor=\"red.200\" borderRadius=\"md\">\n <Text color=\"red.600\" fontSize=\"sm\" fontWeight=\"medium\">\n End time must be after start time: {invalidDays.map((d) => mergedDayNames[d]).join(', ')}\n </Text>\n </Box>\n )}\n\n {/* Quick actions */}\n {showCopyToWeekdays && days.includes('monday') && (\n <HStack gap={2} flexWrap=\"wrap\">\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Quick actions:\n </Text>\n <Button\n type=\"button\"\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"blue\"\n onClick={handleCopyToWeekdays}\n disabled={disabled || readOnly || !schedule.monday}\n >\n {copyToWeekdaysLabel}\n </Button>\n </HStack>\n )}\n\n {/* Day list */}\n {days.map((day) => {\n const daySchedule = schedule[day]\n const isEnabled = daySchedule !== null && daySchedule !== undefined\n const dayHasError = invalidDays.includes(day)\n\n return (\n <Box\n key={day}\n data-day={day}\n p={3}\n bg={dayHasError ? 'red.50' : isEnabled ? 'bg.panel' : 'bg.muted'}\n borderRadius=\"md\"\n borderWidth={dayHasError ? '2px' : '1px'}\n borderColor={dayHasError ? 'red.300' : 'border.muted'}\n >\n <HStack justify=\"space-between\" flexWrap=\"wrap\" gap={3}>\n {/* Day and toggle */}\n <HStack gap={3} minW=\"140px\">\n {/* Native checkbox styled as switch */}\n <Box\n as=\"label\"\n display=\"inline-flex\"\n alignItems=\"center\"\n cursor={disabled || readOnly ? 'not-allowed' : 'pointer'}\n position=\"relative\"\n opacity={disabled || readOnly ? 0.4 : 1}\n >\n <input\n type=\"checkbox\"\n checked={isEnabled}\n onChange={(e) => handleDayToggle(day, e.target.checked)}\n disabled={disabled || readOnly}\n data-switch={day}\n style={{\n position: 'absolute',\n opacity: 0,\n width: 0,\n height: 0,\n }}\n />\n <Box\n w={SWITCH_STYLES.trackWidth}\n h={SWITCH_STYLES.trackHeight}\n bg={isEnabled ? 'green.500' : 'gray.300'}\n borderRadius=\"full\"\n position=\"relative\"\n transition=\"background 0.2s\"\n >\n <Box\n position=\"absolute\"\n top={SWITCH_STYLES.thumbOffset}\n left={isEnabled ? SWITCH_STYLES.thumbEnabledLeft : SWITCH_STYLES.thumbOffset}\n w={SWITCH_STYLES.thumbSize}\n h={SWITCH_STYLES.thumbSize}\n bg=\"white\"\n borderRadius=\"full\"\n transition=\"left 0.2s\"\n boxShadow=\"sm\"\n />\n </Box>\n </Box>\n <Text fontWeight=\"medium\" color={isEnabled ? 'fg' : 'fg.muted'}>\n {mergedDayNames[day]}\n </Text>\n </HStack>\n\n {/* Time fields */}\n {isEnabled ? (\n <HStack gap={2}>\n <Input\n type=\"time\"\n size=\"sm\"\n width=\"120px\"\n value={daySchedule?.open || defaultOpenTime}\n onChange={(e) => handleTimeChange(day, 'open', e.target.value)}\n disabled={disabled || readOnly}\n />\n <Text color=\"fg.muted\">—</Text>\n <Input\n type=\"time\"\n size=\"sm\"\n width=\"120px\"\n value={daySchedule?.close || defaultCloseTime}\n onChange={(e) => handleTimeChange(day, 'close', e.target.value)}\n disabled={disabled || readOnly}\n />\n </HStack>\n ) : (\n <Text fontSize=\"sm\" color=\"fg.muted\">\n {offLabel}\n </Text>\n )}\n </HStack>\n </Box>\n )\n })}\n </Stack>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolvedHelperText} />\n </Field.Root>\n )\n})\n\n/**\n * Props for Schedule field\n */\nexport interface ScheduleFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n\n /**\n * Custom day names (for localization)\n */\n dayNames?: Partial<Record<DayOfWeek, string>>\n\n /**\n * Default schedule when empty\n */\n defaultSchedule?: WeeklySchedule\n\n /**\n * Days to display (subset of all days)\n * @default all days\n */\n days?: DayOfWeek[]\n\n /**\n * Show \"copy to weekdays\" button\n * @default true\n */\n showCopyToWeekdays?: boolean\n\n /**\n * Text for \"day off\" state\n * @default 'Day off'\n */\n offLabel?: string\n\n /**\n * Copy to weekdays button text\n * @default 'Copy Mon to weekdays'\n */\n copyToWeekdaysLabel?: string\n\n /**\n * Default opening time when enabling a day\n */\n defaultOpenTime?: string\n\n /**\n * Default closing time when enabling a day\n */\n defaultCloseTime?: string\n}\n\n/**\n * Form.Field.Schedule - Weekly schedule editor\n *\n * Renders working hours schedule editor with toggles\n * and time fields for each day of the week.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Schedule\n * name=\"workingHours\"\n * label=\"Working hours\"\n * />\n * ```\n *\n * @example With custom day names\n * ```tsx\n * <Form.Field.Schedule\n * name=\"schedule\"\n * dayNames={{\n * monday: 'Mon',\n * tuesday: 'Tue',\n * // ...\n * }}\n * offLabel=\"Day off\"\n * copyToWeekdaysLabel=\"Copy Mon to weekdays\"\n * />\n * ```\n *\n * @example Weekdays only\n * ```tsx\n * <Form.Field.Schedule\n * name=\"hours\"\n * days={['monday', 'tuesday', 'wednesday', 'thursday', 'friday']}\n * />\n * ```\n */\nexport function FieldSchedule({\n name,\n label,\n helperText,\n required,\n disabled,\n readOnly,\n tooltip,\n dayNames = {},\n defaultSchedule = DEFAULT_WORKING_HOURS,\n days = DAYS_OF_WEEK,\n showCopyToWeekdays = true,\n offLabel = 'Day off',\n copyToWeekdaysLabel = 'Copy Mon to weekdays',\n defaultOpenTime = '09:00',\n defaultCloseTime = '18:00',\n}: ScheduleFieldProps): ReactElement {\n const {\n form,\n fullPath,\n label: resolvedLabel,\n helperText: resolvedHelperText,\n tooltip: resolvedTooltip,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, helperText, required, disabled, readOnly, tooltip })\n\n // Merge day names\n const mergedDayNames = { ...DEFAULT_DAY_NAMES, ...dayNames }\n\n return (\n <form.Field name={fullPath}>\n {(field: AnyFieldApi) => {\n const schedule: WeeklySchedule = (field.state.value as WeeklySchedule) || defaultSchedule\n\n return (\n <ScheduleContent\n field={field}\n schedule={schedule}\n defaultSchedule={defaultSchedule}\n days={days}\n mergedDayNames={mergedDayNames}\n showCopyToWeekdays={showCopyToWeekdays}\n offLabel={offLabel}\n copyToWeekdaysLabel={copyToWeekdaysLabel}\n defaultOpenTime={defaultOpenTime}\n defaultCloseTime={defaultCloseTime}\n disabled={resolvedDisabled}\n readOnly={resolvedReadOnly}\n resolvedLabel={resolvedLabel}\n resolvedHelperText={resolvedHelperText}\n resolvedRequired={resolvedRequired}\n resolvedTooltip={resolvedTooltip}\n fullPath={fullPath}\n />\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport { Input } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { TimeFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Time - Time input field\n *\n * Renders a native time input with automatic form integration and error display.\n *\n * @example\n * ```tsx\n * <Form.Field.Time name=\"startTime\" label=\"Start Time\" />\n * ```\n *\n * @example With step (seconds)\n * ```tsx\n * <Form.Field.Time name=\"duration\" label=\"Duration\" step={60} />\n * ```\n */\nexport const FieldTime = createField<TimeFieldProps, string>({\n displayName: 'FieldTime',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Input\n type=\"time\"\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n min={componentProps.min}\n max={componentProps.max}\n step={componentProps.step}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n ),\n})\n","'use client'\n\nimport { Checkbox, Field, HStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { CheckboxFieldProps } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Form.Field.Checkbox - Boolean checkbox field\n *\n * Renders a Chakra Checkbox with automatic form integration and error display.\n *\n * @example\n * ```tsx\n * <Form.Field.Checkbox name=\"active\" label=\"Active\" />\n * ```\n *\n * @example With color palette\n * ```tsx\n * <Form.Field.Checkbox name=\"terms\" label=\"Accept terms\" colorPalette=\"green\" />\n * ```\n */\nexport const FieldCheckbox = createField<CheckboxFieldProps, boolean>({\n displayName: 'FieldCheckbox',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Checkbox.Root\n checked={!!field.state.value}\n onCheckedChange={(e) => field.handleChange(!!e.checked)}\n colorPalette={componentProps.colorPalette ?? 'brand'}\n size={componentProps.size ?? 'md'}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n data-field-name={fullPath}\n >\n <Checkbox.HiddenInput onBlur={field.handleBlur} />\n <Checkbox.Control />\n {resolved.label && (\n <Checkbox.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </Checkbox.Label>\n )}\n </Checkbox.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n ),\n})\n","'use client'\n\nimport { Field, HStack, Switch } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { SwitchFieldProps } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Form.Field.Switch - Boolean switch/toggle field\n *\n * Renders a Chakra Switch with automatic form integration and error display.\n *\n * @example\n * ```tsx\n * <Form.Field.Switch name=\"notifications\" label=\"Enable notifications\" />\n * ```\n *\n * @example With color palette and size\n * ```tsx\n * <Form.Field.Switch name=\"darkMode\" label=\"Dark mode\" colorPalette=\"purple\" size=\"lg\" />\n * ```\n */\nexport const FieldSwitch = createField<SwitchFieldProps, boolean>({\n displayName: 'FieldSwitch',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Switch.Root\n checked={!!field.state.value}\n onCheckedChange={(e) => field.handleChange(e.checked)}\n colorPalette={componentProps.colorPalette ?? 'brand'}\n size={componentProps.size ?? 'md'}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n data-field-name={fullPath}\n >\n <Switch.HiddenInput onBlur={field.handleBlur} />\n <Switch.Control>\n <Switch.Thumb />\n </Switch.Control>\n {resolved.label && (\n <Switch.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n </Switch.Label>\n )}\n </Switch.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n ),\n})\n","'use client'\n\nimport { Combobox, createListCollection, Field, Portal, Spinner, useFilter } from '@chakra-ui/react'\nimport { useMemo, type ReactElement } from 'react'\nimport type { BaseFieldProps, FieldSize } from '../../types'\nimport { createField, FieldError, SelectionFieldLabel, useAsyncSearch, type AsyncQueryFn } from '../base'\n\n/**\n * Props for Form.Field.Autocomplete\n */\nexport interface AutocompleteFieldProps<TData = unknown> extends BaseFieldProps {\n /**\n * Static suggestions for autocomplete\n */\n suggestions?: string[]\n\n /**\n * Async function for loading suggestions\n * Should return { data, isLoading, error } similar to TanStack Query\n *\n * @example\n * ```tsx\n * useQuery={(search) => useFindManyCity({\n * where: { name: { contains: search, mode: 'insensitive' } },\n * take: 10,\n * })}\n * ```\n */\n useQuery?: AsyncQueryFn<TData>\n\n /**\n * Get label from data element\n * Required when using useQuery\n */\n getLabel?: (item: TData) => string\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounce?: number\n\n /**\n * Minimum characters to trigger suggestions\n * @default 1\n */\n minChars?: number\n\n /**\n * Component size\n * @default 'md'\n */\n size?: FieldSize\n\n /**\n * Visual variant\n * @default 'outline'\n */\n variant?: 'outline' | 'subtle' | 'flushed'\n\n /**\n * Message for empty result\n * @default \"No suggestions\"\n */\n emptyMessage?: string\n\n /**\n * Message on loading\n * @default \"Loading...\"\n */\n loadingMessage?: string\n}\n\n/**\n * Suggestion element\n */\ninterface AutocompleteItem {\n label: string\n value: string\n}\n\n/** State type for useFieldState */\ninterface AutocompleteFieldState {\n inputValue: string\n setInputValue: (value: string) => void\n isLoading: boolean\n suggestions: AutocompleteItem[]\n collection: ReturnType<typeof createListCollection<AutocompleteItem>>\n}\n\n/**\n * Form.Field.Autocomplete - Text input with suggestions\n *\n * Simplified version of Combobox that always allows custom values.\n * Ideal for city names, products or any free text input with suggestions.\n *\n * @example Static suggestions\n * ```tsx\n * <Form.Field.Autocomplete\n * name=\"city\"\n * label=\"City\"\n * suggestions={['Moscow', 'Saint Petersburg', 'Kazan', 'Novosibirsk']}\n * />\n * ```\n *\n * @example Async suggestions with ZenStack\n * ```tsx\n * <Form.Field.Autocomplete\n * name=\"product\"\n * label=\"Product\"\n * useQuery={(search) => useFindManyProduct({\n * where: { name: { contains: search, mode: 'insensitive' } },\n * take: 10,\n * })}\n * getLabel={(p) => p.name}\n * debounce={300}\n * minChars={2}\n * />\n * ```\n */\nexport const FieldAutocomplete = createField<AutocompleteFieldProps, string, AutocompleteFieldState>({\n displayName: 'FieldAutocomplete',\n useFieldState: (componentProps: Omit<AutocompleteFieldProps, keyof BaseFieldProps>): AutocompleteFieldState => {\n // Async search with debounce via shared hook\n const {\n inputValue,\n setInputValue,\n isLoading,\n data: queryData,\n } = useAsyncSearch({\n useQuery: componentProps.useQuery,\n debounce: componentProps.debounce ?? 300,\n minChars: componentProps.minChars ?? 1,\n })\n\n // Filter for static suggestions\n const { contains } = useFilter({ sensitivity: 'base' })\n\n // Build suggestions list\n const suggestions = useMemo((): AutocompleteItem[] => {\n if (componentProps.suggestions) {\n // Filtering static suggestions by input value\n const filtered = inputValue\n ? componentProps.suggestions.filter((s) => contains(s, inputValue))\n : componentProps.suggestions.slice(0, 10) // First 10 when input is empty\n return filtered.map((s) => ({ label: s, value: s }))\n }\n\n if (queryData && componentProps.getLabel) {\n const getLabel = componentProps.getLabel\n return (queryData as unknown[]).map((item) => {\n const itemLabel = getLabel(item)\n return { label: itemLabel, value: itemLabel }\n })\n }\n\n return []\n }, [componentProps.suggestions, queryData, componentProps.getLabel, inputValue, contains])\n\n // Create collection\n const collection = useMemo(() => {\n return createListCollection({\n items: suggestions,\n itemToString: (item) => item.label,\n itemToValue: (item) => item.value,\n })\n }, [suggestions])\n\n return {\n inputValue,\n setInputValue,\n isLoading,\n suggestions,\n collection,\n }\n },\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const currentValue = (field.state.value as string) ?? ''\n const minChars = componentProps.minChars ?? 1\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Combobox.Root\n collection={fieldState.collection}\n size={componentProps.size ?? 'md'}\n variant={componentProps.variant ?? 'outline'}\n value={currentValue ? [currentValue] : []}\n inputValue={fieldState.inputValue}\n onInputValueChange={(details) => {\n fieldState.setInputValue(details.inputValue)\n // Always update field value (allowCustomValue behavior)\n field.handleChange(details.inputValue)\n }}\n onValueChange={(details) => {\n const newValue = details.value[0] ?? ''\n fieldState.setInputValue(newValue)\n field.handleChange(newValue)\n }}\n onInteractOutside={() => field.handleBlur()}\n disabled={resolved.disabled}\n allowCustomValue\n openOnClick\n data-field-name={fullPath}\n >\n {resolved.label && (\n <Combobox.Label>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </Combobox.Label>\n )}\n\n <Combobox.Control>\n <Combobox.Input placeholder={resolved.placeholder ?? 'Start typing...'} />\n <Combobox.IndicatorGroup>\n {fieldState.isLoading && <Spinner size=\"xs\" />}\n <Combobox.Trigger />\n </Combobox.IndicatorGroup>\n </Combobox.Control>\n\n <Portal>\n <Combobox.Positioner>\n <Combobox.Content>\n {/* Loading state */}\n {fieldState.isLoading && fieldState.suggestions.length === 0 && (\n <Combobox.Empty>{componentProps.loadingMessage ?? 'Loading...'}</Combobox.Empty>\n )}\n\n {/* Empty result */}\n {!fieldState.isLoading &&\n fieldState.suggestions.length === 0 &&\n fieldState.inputValue.length >= minChars && (\n <Combobox.Empty>{componentProps.emptyMessage ?? 'No suggestions'}</Combobox.Empty>\n )}\n\n {/* Hint about minimum characters */}\n {!fieldState.isLoading &&\n fieldState.suggestions.length === 0 &&\n fieldState.inputValue.length < minChars &&\n fieldState.inputValue.length > 0 && (\n <Combobox.Empty>Enter at least {minChars} characters</Combobox.Empty>\n )}\n\n {/* Suggestions */}\n {fieldState.suggestions.map((item) => (\n <Combobox.Item item={item} key={item.value}>\n <Combobox.ItemText>{item.label}</Combobox.ItemText>\n <Combobox.ItemIndicator />\n </Combobox.Item>\n ))}\n </Combobox.Content>\n </Combobox.Positioner>\n </Portal>\n </Combobox.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { CheckboxCard, CheckboxGroup, Fieldset, Flex } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, FieldSizeWithoutXs, FieldTooltipMeta, RichOption } from '../../types'\nimport { createField, SelectionFieldLabel } from '../base'\n\n/**\n * Props for CheckboxCard field\n */\nexport interface CheckboxCardFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Options for cards */\n options: RichOption<T>[]\n /** Size (by default: md) */\n size?: FieldSizeWithoutXs\n /** Visual variant (by default: outline) */\n variant?: 'surface' | 'subtle' | 'outline' | 'solid'\n /** Color palette */\n colorPalette?: string\n /** Content alignment (by default: start) */\n align?: 'start' | 'end' | 'center'\n /** Orientation (by default: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Gap between cards (by default: 2) */\n gap?: number | string\n}\n\n/**\n * Form.Field.CheckboxCard - Multiple selection as cards\n *\n * Renders a group of checkbox cards for selecting multiple options.\n * Each card can have a label, description and icon.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.CheckboxCard\n * name=\"features\"\n * label=\"Select features\"\n * options={[\n * { label: 'TypeScript', value: 'ts', description: 'Type safety' },\n * { label: 'ESLint', value: 'eslint', description: 'Code quality' },\n * { label: 'Prettier', value: 'prettier', description: 'Formatting' },\n * ]}\n * />\n * ```\n *\n * @example With icons\n * ```tsx\n * <Form.Field.CheckboxCard\n * name=\"permissions\"\n * options={[\n * { label: 'Admin', value: 'admin', icon: <ShieldIcon /> },\n * { label: 'User', value: 'user', icon: <UserIcon /> },\n * ]}\n * align=\"center\"\n * />\n * ```\n */\nexport const FieldCheckboxCard = createField<CheckboxCardFieldProps, string[]>({\n displayName: 'FieldCheckboxCard',\n render: ({ field, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n // Value always array for checkbox cards\n const currentValue = field.state.value as string[] | undefined\n const valueArray: string[] = currentValue ?? []\n\n return (\n <Fieldset.Root invalid={hasError} disabled={resolved.disabled}>\n <CheckboxGroup\n value={valueArray}\n onValueChange={(value) => field.handleChange(value)}\n disabled={resolved.disabled}\n invalid={hasError}\n >\n {resolved.label && (\n <Fieldset.Legend mb={2}>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </Fieldset.Legend>\n )}\n\n <Flex\n gap={componentProps.gap ?? 2}\n direction={(componentProps.orientation ?? 'horizontal') === 'vertical' ? 'column' : 'row'}\n wrap={(componentProps.orientation ?? 'horizontal') === 'horizontal' ? 'wrap' : undefined}\n >\n {componentProps.options.map((opt) => (\n <CheckboxCard.Root\n key={opt.value}\n value={opt.value}\n size={componentProps.size ?? 'md'}\n variant={componentProps.variant ?? 'outline'}\n colorPalette={componentProps.colorPalette}\n align={componentProps.align ?? 'start'}\n disabled={opt.disabled}\n >\n <CheckboxCard.HiddenInput />\n <CheckboxCard.Control>\n <CheckboxCard.Content>\n {opt.icon}\n <CheckboxCard.Label>{opt.label}</CheckboxCard.Label>\n {opt.description && <CheckboxCard.Description>{opt.description}</CheckboxCard.Description>}\n </CheckboxCard.Content>\n <CheckboxCard.Indicator />\n </CheckboxCard.Control>\n </CheckboxCard.Root>\n ))}\n </Flex>\n </CheckboxGroup>\n\n {hasError ? (\n <Fieldset.ErrorText>{errorMessage}</Fieldset.ErrorText>\n ) : (\n resolved.helperText && <Fieldset.HelperText>{resolved.helperText}</Fieldset.HelperText>\n )}\n </Fieldset.Root>\n )\n },\n})\n","'use client'\n\nimport { Combobox, Field, Portal, Spinner, useFilter } from '@chakra-ui/react'\nimport { useMemo, type ReactElement, type ReactNode } from 'react'\nimport type { BaseFieldProps, FieldSize, GroupableOption } from '../../types'\nimport {\n createField,\n FieldError,\n getOptionLabel,\n SelectionFieldLabel,\n useAsyncSearch,\n useGroupedOptions,\n type AsyncQueryFn,\n type GroupedOptionsResult,\n type ResolvedFieldProps,\n} from '../base'\n\n/**\n * Props for Form.Field.Combobox\n */\nexport interface ComboboxFieldProps<T = string, TData = unknown> extends BaseFieldProps {\n /**\n * Static options (mutually exclusive with useQuery)\n */\n options?: GroupableOption<T>[]\n\n /**\n * Async function for loading options\n * Should return { data, isLoading, error } similar to TanStack Query\n *\n * @example\n * ```tsx\n * useQuery={(search) => useFindManyUser({\n * where: { name: { contains: search, mode: 'insensitive' } },\n * take: 20,\n * })}\n * ```\n */\n useQuery?: AsyncQueryFn<TData>\n\n /**\n * Get label from data element\n * Required when using useQuery\n */\n getLabel?: (item: TData) => ReactNode\n\n /**\n * Get value from data element\n * Required when using useQuery\n */\n getValue?: (item: TData) => T\n\n /**\n * Get group key from data element\n * Optional, for grouping results\n */\n getGroup?: (item: TData) => string | undefined\n\n /**\n * Check if element is disabled\n */\n getDisabled?: (item: TData) => boolean\n\n /**\n * Debounce delay in milliseconds\n * @default 300\n */\n debounce?: number\n\n /**\n * Minimum characters to trigger search\n * @default 1\n */\n minChars?: number\n\n /**\n * Show clear button\n * Auto-determined from schema if not specified\n */\n clearable?: boolean\n\n /**\n * Allow custom values not from the list\n * @default false\n */\n allowCustomValue?: boolean\n\n /**\n * Component size\n */\n size?: FieldSize\n\n /**\n * Visual variant\n */\n variant?: 'outline' | 'subtle' | 'flushed'\n\n /**\n * Message for empty result\n * @default \"Nothing found\"\n */\n emptyMessage?: string\n\n /**\n * Message on loading\n * @default \"Loading...\"\n */\n loadingMessage?: string\n}\n\n/** State type for useFieldState */\ninterface ComboboxFieldState extends GroupedOptionsResult {\n inputValue: string\n setInputValue: (value: string) => void\n isLoading: boolean\n options: GroupableOption[]\n resolvedClearable: boolean\n}\n\n/**\n * Form.Field.Combobox - Async search select with debounce and grouping\n *\n * Supports both static options and async loading via TanStack Query hooks.\n *\n * @example Static options\n * ```tsx\n * <Form.Field.Combobox\n * name=\"framework\"\n * label=\"Framework\"\n * options={[\n * { label: 'React', value: 'react' },\n * { label: 'Vue', value: 'vue', group: 'Frontend' },\n * ]}\n * />\n * ```\n *\n * @example Async with ZenStack hooks\n * ```tsx\n * <Form.Field.Combobox\n * name=\"userId\"\n * label=\"User\"\n * useQuery={(search) => useFindManyUser({\n * where: { name: { contains: search, mode: 'insensitive' } },\n * take: 20,\n * })}\n * getLabel={(user) => user.name}\n * getValue={(user) => user.id}\n * getGroup={(user) => user.role}\n * debounce={300}\n * minChars={2}\n * />\n * ```\n */\nexport const FieldCombobox = createField<ComboboxFieldProps, string, ComboboxFieldState>({\n displayName: 'FieldCombobox',\n useFieldState: (\n componentProps: Omit<ComboboxFieldProps, keyof BaseFieldProps>,\n resolved: ResolvedFieldProps\n ): ComboboxFieldState => {\n // Async search with debounce via shared hook\n const {\n inputValue,\n setInputValue,\n isLoading,\n data: queryData,\n } = useAsyncSearch({\n useQuery: componentProps.useQuery,\n debounce: componentProps.debounce ?? 300,\n minChars: componentProps.minChars ?? 1,\n })\n\n // Filter for static options\n const { contains } = useFilter({ sensitivity: 'base' })\n\n // Build options from static or async source\n const options = useMemo((): GroupableOption[] => {\n if (componentProps.options) {\n // Filtering static options by input value\n if (!inputValue) {\n return componentProps.options\n }\n return componentProps.options.filter((opt) => {\n return contains(getOptionLabel(opt), inputValue)\n })\n }\n\n if (queryData && componentProps.getLabel && componentProps.getValue) {\n const getLabel = componentProps.getLabel\n const getValue = componentProps.getValue\n return (queryData as unknown[]).map((item) => ({\n label: getLabel(item),\n value: getValue(item),\n group: componentProps.getGroup?.(item),\n disabled: componentProps.getDisabled?.(item),\n }))\n }\n\n return []\n }, [\n componentProps.options,\n queryData,\n componentProps.getLabel,\n componentProps.getValue,\n componentProps.getGroup,\n componentProps.getDisabled,\n inputValue,\n contains,\n ])\n\n // Create collection with grouping via shared hook\n const { collection, groups } = useGroupedOptions(options)\n\n // Auto-determine clearable\n const resolvedClearable = componentProps.clearable ?? !resolved.required\n\n return {\n inputValue,\n setInputValue,\n isLoading,\n options,\n collection,\n groups,\n resolvedClearable,\n }\n },\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const currentValue = field.state.value as string | undefined\n const minChars = componentProps.minChars ?? 1\n\n return (\n <Field.Root invalid={hasError} required={resolved.required} disabled={resolved.disabled}>\n <Combobox.Root\n collection={fieldState.collection}\n size={componentProps.size ?? 'md'}\n variant={componentProps.variant ?? 'outline'}\n value={currentValue ? [currentValue] : []}\n inputValue={fieldState.inputValue}\n onInputValueChange={(details) => fieldState.setInputValue(details.inputValue)}\n onValueChange={(details) => {\n const newValue = details.value[0] as string | undefined\n field.handleChange(newValue ?? '')\n }}\n onInteractOutside={() => field.handleBlur()}\n disabled={resolved.disabled}\n allowCustomValue={componentProps.allowCustomValue ?? false}\n openOnClick\n data-field-name={fullPath}\n >\n {resolved.label && (\n <Combobox.Label>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </Combobox.Label>\n )}\n\n <Combobox.Control>\n <Combobox.Input placeholder={resolved.placeholder ?? 'Search...'} />\n <Combobox.IndicatorGroup>\n {fieldState.isLoading && <Spinner size=\"xs\" />}\n {fieldState.resolvedClearable && <Combobox.ClearTrigger />}\n <Combobox.Trigger />\n </Combobox.IndicatorGroup>\n </Combobox.Control>\n\n <Portal>\n <Combobox.Positioner>\n <Combobox.Content>\n {/* Loading state */}\n {fieldState.isLoading && fieldState.options.length === 0 && (\n <Combobox.Empty>{componentProps.loadingMessage ?? 'Loading...'}</Combobox.Empty>\n )}\n\n {/* Empty result */}\n {!fieldState.isLoading &&\n fieldState.options.length === 0 &&\n fieldState.inputValue.length >= minChars && (\n <Combobox.Empty>{componentProps.emptyMessage ?? 'Nothing found'}</Combobox.Empty>\n )}\n\n {/* Hint about minimum characters */}\n {!fieldState.isLoading &&\n fieldState.options.length === 0 &&\n fieldState.inputValue.length < minChars &&\n fieldState.inputValue.length > 0 && (\n <Combobox.Empty>Enter at least {minChars} characters</Combobox.Empty>\n )}\n\n {/* Grouped options */}\n {fieldState.groups\n ? Array.from(fieldState.groups.entries()).map(([groupName, groupOptions]) => (\n <Combobox.ItemGroup key={groupName}>\n {groupName && <Combobox.ItemGroupLabel>{groupName}</Combobox.ItemGroupLabel>}\n {groupOptions.map((opt) => (\n <Combobox.Item item={opt} key={opt.value}>\n <Combobox.ItemText>{getOptionLabel(opt)}</Combobox.ItemText>\n <Combobox.ItemIndicator />\n </Combobox.Item>\n ))}\n </Combobox.ItemGroup>\n ))\n : /* Flat options */\n fieldState.options.map((opt) => (\n <Combobox.Item item={opt} key={opt.value}>\n <Combobox.ItemText>{getOptionLabel(opt)}</Combobox.ItemText>\n <Combobox.ItemIndicator />\n </Combobox.Item>\n ))}\n </Combobox.Content>\n </Combobox.Positioner>\n </Portal>\n </Combobox.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Field, Listbox } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, FieldSizeWithoutXs, GroupableOption } from '../../types'\nimport {\n createField,\n FieldError,\n getOptionLabel,\n SelectionFieldLabel,\n useGroupedOptions,\n type GroupedOptionsResult,\n} from '../base'\n\n/**\n * Props for Listbox field\n */\nexport interface ListboxFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Options for listbox */\n options: GroupableOption<T>[]\n /**\n * Selection mode\n * - `single`: Single selection (by default)\n * - `multiple`: Multiple selection\n */\n selectionMode?: 'single' | 'multiple'\n /** Size */\n size?: FieldSizeWithoutXs\n /** Visual variant */\n variant?: 'subtle' | 'solid' | 'plain'\n /** Color palette */\n colorPalette?: string\n /** Element orientation (by default: vertical) */\n orientation?: 'horizontal' | 'vertical'\n /** Maximum height for scrolling */\n maxHeight?: string | number\n}\n\n/** State type for useFieldState */\ntype ListboxFieldState = GroupedOptionsResult\n\n/**\n * Form.Field.Listbox - Selection list with visible options\n *\n * Unlike Select/Combobox which use dropdown, Listbox shows\n * all options directly in the form. Well suited for short lists (2-8 elements)\n * where all options should be visible.\n *\n * @example Single selection\n * ```tsx\n * <Form.Field.Listbox\n * name=\"framework\"\n * label=\"Framework\"\n * options={[\n * { label: 'React', value: 'react' },\n * { label: 'Vue', value: 'vue' },\n * { label: 'Angular', value: 'angular' },\n * ]}\n * />\n * ```\n *\n * @example Multiple selection\n * ```tsx\n * <Form.Field.Listbox\n * name=\"features\"\n * label=\"Features\"\n * selectionMode=\"multiple\"\n * options={[\n * { label: 'TypeScript', value: 'ts' },\n * { label: 'Testing', value: 'test' },\n * { label: 'Linting', value: 'lint' },\n * ]}\n * />\n * ```\n *\n * @example With groups\n * ```tsx\n * <Form.Field.Listbox\n * name=\"language\"\n * options={[\n * { label: 'TypeScript', value: 'ts', group: 'Frontend' },\n * { label: 'Python', value: 'py', group: 'Backend' },\n * ]}\n * />\n * ```\n */\nexport const FieldListbox = createField<ListboxFieldProps, string | string[], ListboxFieldState>({\n displayName: 'FieldListbox',\n useFieldState: (componentProps): ListboxFieldState => {\n // Use shared hook for grouping options\n return useGroupedOptions(componentProps.options)\n },\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n // Handle single vs multiple values\n const currentValue = field.state.value as string | string[] | undefined\n const valueArray: string[] = Array.isArray(currentValue) ? currentValue : currentValue ? [currentValue] : []\n const selectionMode = componentProps.selectionMode ?? 'single'\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <Listbox.Root\n collection={fieldState.collection}\n selectionMode={selectionMode}\n orientation={componentProps.orientation ?? 'vertical'}\n variant={componentProps.variant ?? 'subtle'}\n colorPalette={componentProps.colorPalette}\n value={valueArray}\n onValueChange={(details) => {\n if (selectionMode === 'single') {\n // Single mode: save single value or empty string\n const newValue = details.value[0] as string | undefined\n field.handleChange(newValue ?? '')\n } else {\n // Multiple mode: save array\n field.handleChange(details.value)\n }\n }}\n disabled={resolved.disabled}\n data-field-name={fullPath}\n >\n {resolved.label && (\n <Listbox.Label fontSize={componentProps.size ?? 'md'}>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </Listbox.Label>\n )}\n\n <Listbox.Content maxH={componentProps.maxHeight}>\n {fieldState.groups\n ? /* Grouped options */\n Array.from(fieldState.groups.entries()).map(([groupName, groupOptions]) => (\n <Listbox.ItemGroup key={groupName}>\n {groupName && <Listbox.ItemGroupLabel>{groupName}</Listbox.ItemGroupLabel>}\n {groupOptions.map((opt) => (\n <Listbox.Item item={opt} key={opt.value}>\n <Listbox.ItemText>{getOptionLabel(opt)}</Listbox.ItemText>\n <Listbox.ItemIndicator />\n </Listbox.Item>\n ))}\n </Listbox.ItemGroup>\n ))\n : /* Flat options */\n componentProps.options.map((opt) => (\n <Listbox.Item item={opt} key={opt.value}>\n <Listbox.ItemText>{getOptionLabel(opt)}</Listbox.ItemText>\n <Listbox.ItemIndicator />\n </Listbox.Item>\n ))}\n </Listbox.Content>\n </Listbox.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { NativeSelect } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, NativeSelectOption } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n// Re-export for backward compatibility\nexport type { NativeSelectOption } from '../../types'\n\nexport interface NativeSelectFieldProps<T = string> extends BaseFieldProps {\n options: NativeSelectOption<T>[]\n}\n\n/**\n * Form.Field.NativeSelect - Native browser select dropdown\n *\n * Renders a Chakra NativeSelect with automatic form integration and error display.\n * Uses native browser select for best mobile UX (shows system picker on iOS/Android).\n *\n * @example\n * ```tsx\n * <Form.Field.NativeSelect\n * name=\"type\"\n * label=\"Type\"\n * options={[\n * { title: 'Option 1', value: 'opt1' },\n * { title: 'Option 2', value: 'opt2' },\n * ]}\n * />\n * ```\n */\nexport const FieldNativeSelect = createField<NativeSelectFieldProps, string>({\n displayName: 'FieldNativeSelect',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <NativeSelect.Root>\n <NativeSelect.Field\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLSelectElement).value)}\n onBlur={field.handleBlur}\n data-field-name={fullPath}\n >\n {resolved.placeholder && (\n <option value=\"\" disabled>\n {resolved.placeholder}\n </option>\n )}\n {componentProps.options.map((opt, idx) => (\n <option key={idx} value={opt.value}>\n {typeof opt.title === 'string' ? opt.title : opt.value}\n </option>\n ))}\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </FieldWrapper>\n ),\n})\n","'use client'\n\nimport { Field, RadioCard } from '@chakra-ui/react'\nimport { useCallback, type KeyboardEvent, type ReactElement } from 'react'\nimport type { BaseFieldProps, FieldSizeWithoutXs, FieldTooltipMeta, RichOption } from '../../types'\nimport { createField, FieldError, SelectionFieldLabel } from '../base'\n\n/**\n * Props for RadioCard field\n */\nexport interface RadioCardFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Options for cards */\n options: RichOption<T>[]\n /** Size (by default: md) */\n size?: FieldSizeWithoutXs\n /** Visual variant (by default: outline) */\n variant?: 'surface' | 'subtle' | 'outline' | 'solid'\n /** Color palette */\n colorPalette?: string\n /** Content alignment (by default: start) */\n align?: 'start' | 'end' | 'center'\n /** Orientation (by default: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Gap between cards (by default: 2) */\n gap?: number | string\n /** Enable enhanced keyboard navigation with cycling (by default: false) */\n keyboardNavigation?: boolean\n}\n\n/** State type for useFieldState */\ninterface RadioCardFieldState {\n enabledOptions: RichOption[]\n handleKeyDown: (\n e: KeyboardEvent<HTMLDivElement>,\n currentValue: string | undefined,\n handleChange: (value: string) => void\n ) => void\n}\n\n/**\n * Form.Field.RadioCard - Single selection as cards\n *\n * Renders a group of radio cards for selecting one option.\n * Each card can have a label, description and icon.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.RadioCard\n * name=\"plan\"\n * label=\"Select plan\"\n * options={[\n * { label: 'Free', value: 'free', description: 'Basic features' },\n * { label: 'Pro', value: 'pro', description: 'All features' },\n * { label: 'Enterprise', value: 'enterprise', description: 'Customization' },\n * ]}\n * />\n * ```\n *\n * @example With icons\n * ```tsx\n * <Form.Field.RadioCard\n * name=\"role\"\n * options={[\n * { label: 'Admin', value: 'admin', icon: <ShieldIcon /> },\n * { label: 'User', value: 'user', icon: <UserIcon /> },\n * ]}\n * align=\"center\"\n * />\n * ```\n */\nexport const FieldRadioCard = createField<RadioCardFieldProps, string, RadioCardFieldState>({\n displayName: 'FieldRadioCard',\n useFieldState: (componentProps): RadioCardFieldState => {\n // Get only enabled options for keyboard navigation\n const enabledOptions = componentProps.options.filter((opt) => !opt.disabled)\n\n // Handle keyboard navigation with cycling\n const handleKeyDown = useCallback(\n (\n e: KeyboardEvent<HTMLDivElement>,\n currentValue: string | undefined,\n handleChange: (value: string) => void\n ): void => {\n if (!componentProps.keyboardNavigation || enabledOptions.length === 0) {\n return\n }\n\n const isHorizontal = (componentProps.orientation ?? 'horizontal') === 'horizontal'\n const prevKey = isHorizontal ? 'ArrowLeft' : 'ArrowUp'\n const nextKey = isHorizontal ? 'ArrowRight' : 'ArrowDown'\n\n if (e.key !== prevKey && e.key !== nextKey) {\n return\n }\n\n e.preventDefault()\n\n const currentIndex = currentValue ? enabledOptions.findIndex((opt) => opt.value === currentValue) : -1\n\n let newIndex: number\n\n if (e.key === nextKey) {\n // Forward (cycle to first if at end)\n newIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % enabledOptions.length\n } else {\n // Back (cycle to last if at beginning)\n newIndex =\n currentIndex === -1\n ? enabledOptions.length - 1\n : (currentIndex - 1 + enabledOptions.length) % enabledOptions.length\n }\n\n handleChange(enabledOptions[newIndex].value)\n },\n [componentProps.keyboardNavigation, enabledOptions, componentProps.orientation]\n )\n\n return { enabledOptions, handleKeyDown }\n },\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const currentValue = field.state.value as string | undefined\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <RadioCard.Root\n value={currentValue ?? ''}\n onValueChange={(details) => field.handleChange(details.value)}\n onKeyDown={\n componentProps.keyboardNavigation\n ? (e) => fieldState.handleKeyDown(e, currentValue, field.handleChange)\n : undefined\n }\n disabled={resolved.disabled}\n name={fullPath}\n size={componentProps.size ?? 'md'}\n variant={componentProps.variant ?? 'outline'}\n colorPalette={componentProps.colorPalette}\n align={componentProps.align ?? 'start'}\n orientation={componentProps.orientation ?? 'horizontal'}\n gap={componentProps.gap ?? 2}\n >\n {resolved.label && (\n <RadioCard.Label>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </RadioCard.Label>\n )}\n\n {componentProps.options.map((opt) => (\n <RadioCard.Item key={opt.value} value={opt.value} disabled={opt.disabled}>\n <RadioCard.ItemHiddenInput />\n <RadioCard.ItemControl>\n <RadioCard.ItemContent>\n {opt.icon}\n <RadioCard.ItemText>{opt.label}</RadioCard.ItemText>\n {opt.description && <RadioCard.ItemDescription>{opt.description}</RadioCard.ItemDescription>}\n </RadioCard.ItemContent>\n <RadioCard.ItemIndicator />\n </RadioCard.ItemControl>\n </RadioCard.Item>\n ))}\n </RadioCard.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Field, RadioGroup } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, BaseOption, FieldSize } from '../../types'\nimport { createField, FieldError, FieldLabel, getOptionLabel } from '../base'\n\n/**\n * Props for RadioGroup field\n */\nexport interface RadioGroupFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Options for radio group */\n options: BaseOption<T>[]\n /** Orientation (by default: vertical) */\n orientation?: 'horizontal' | 'vertical'\n /** Size */\n size?: FieldSize\n /** Visual variant */\n variant?: 'outline' | 'subtle' | 'solid'\n /** Color palette */\n colorPalette?: string\n}\n\n/**\n * Form.Field.RadioGroup - Radio button group for single selection\n *\n * Renders a radio button group for mutually exclusive options.\n * Use Select for long lists, RadioGroup for short ones (2-5 options).\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.RadioGroup\n * name=\"size\"\n * label=\"Size\"\n * options={[\n * { label: 'Small', value: 'sm' },\n * { label: 'Medium', value: 'md' },\n * { label: 'Large', value: 'lg' },\n * ]}\n * />\n * ```\n *\n * @example Horizontal layout\n * ```tsx\n * <Form.Field.RadioGroup\n * name=\"priority\"\n * orientation=\"horizontal\"\n * options={[\n * { label: 'Low', value: 'low' },\n * { label: 'Medium', value: 'medium' },\n * { label: 'High', value: 'high' },\n * ]}\n * />\n * ```\n */\nexport const FieldRadioGroup = createField<RadioGroupFieldProps, string>({\n displayName: 'FieldRadioGroup',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <RadioGroup.Root\n value={(field.state.value as string) ?? undefined}\n onValueChange={(details) => field.handleChange(details.value)}\n orientation={componentProps.orientation ?? 'vertical'}\n size={componentProps.size ?? 'md'}\n variant={componentProps.variant ?? 'solid'}\n colorPalette={componentProps.colorPalette ?? 'brand'}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n data-field-name={fullPath}\n display=\"flex\"\n flexDirection={componentProps.orientation === 'horizontal' ? 'row' : 'column'}\n gap={componentProps.orientation === 'horizontal' ? 4 : 2}\n flexWrap=\"wrap\"\n >\n {componentProps.options.map((opt) => (\n <RadioGroup.Item key={opt.value} value={opt.value} disabled={opt.disabled}>\n <RadioGroup.ItemHiddenInput onBlur={field.handleBlur} />\n <RadioGroup.ItemIndicator />\n <RadioGroup.ItemText>{getOptionLabel(opt)}</RadioGroup.ItemText>\n </RadioGroup.Item>\n ))}\n </RadioGroup.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n ),\n})\n","'use client'\n\nimport { Field, SegmentGroup } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, BaseOption, FieldSize } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Props for SegmentedGroup field\n */\nexport interface SegmentedGroupFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Options for segmented control */\n options: BaseOption<T>[]\n /** Size (by default: md) */\n size?: FieldSize\n /** Orientation (by default: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Color palette */\n colorPalette?: string\n}\n\n/**\n * Form.Field.SegmentedGroup - Segmented control for single selection\n *\n * Renders a segmented control for selecting one option from a set.\n * Similar to radio buttons but styled as connected segments.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.SegmentedGroup\n * name=\"size\"\n * label=\"Size\"\n * options={[\n * { label: 'S', value: 'sm' },\n * { label: 'M', value: 'md' },\n * { label: 'L', value: 'lg' },\n * ]}\n * />\n * ```\n *\n * @example Different sizes\n * ```tsx\n * <Form.Field.SegmentedGroup\n * name=\"billing\"\n * options={[\n * { label: 'Monthly', value: 'monthly' },\n * { label: 'Yearly', value: 'yearly' },\n * ]}\n * size=\"sm\"\n * />\n * ```\n */\nexport const FieldSegmentedGroup = createField<SegmentedGroupFieldProps, string>({\n displayName: 'FieldSegmentedGroup',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <SegmentGroup.Root\n value={(field.state.value as string) ?? ''}\n onValueChange={(details) => field.handleChange(details.value)}\n disabled={resolved.disabled}\n name={fullPath}\n size={componentProps.size ?? 'md'}\n orientation={componentProps.orientation ?? 'horizontal'}\n colorPalette={componentProps.colorPalette}\n >\n <SegmentGroup.Indicator />\n {componentProps.options.map((opt) => (\n <SegmentGroup.Item key={opt.value} value={opt.value} disabled={opt.disabled}>\n <SegmentGroup.ItemText>{opt.label}</SegmentGroup.ItemText>\n <SegmentGroup.ItemHiddenInput />\n </SegmentGroup.Item>\n ))}\n </SegmentGroup.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n ),\n})\n","'use client'\n\nimport { createListCollection, Field, Portal, Select } from '@chakra-ui/react'\nimport { type ReactElement, useMemo } from 'react'\nimport type { BaseFieldProps, BaseOption, FieldSize } from '../../types'\nimport { createField, FieldError, getOptionLabel, type ResolvedFieldProps, SelectionFieldLabel } from '../base'\n\n/** Normalized option (value is always string for Chakra) */\ninterface NormalizedOption {\n label: React.ReactNode\n value: string\n disabled?: boolean\n}\n\n/**\n * Props for Select field\n */\nexport interface SelectFieldProps extends BaseFieldProps {\n /** Options for selection (string or number values). If not specified, taken from schema meta */\n options?: BaseOption<string | number>[]\n /** Value type: 'string' (by default) or 'number' */\n valueType?: 'string' | 'number'\n /** Show clear button (auto-determined: true if optional, false if required) */\n clearable?: boolean\n /** Size */\n size?: FieldSize\n /** Visual variant */\n variant?: 'outline' | 'subtle'\n}\n\n/** State type for useFieldState */\ninterface SelectFieldState {\n collection: ReturnType<typeof createListCollection<NormalizedOption>>\n normalizedOptions: NormalizedOption[]\n resolvedClearable: boolean\n}\n\n/**\n * Form.Field.Select - Styled Chakra Select dropdown\n *\n * Styled select component with customizable appearance,\n * animations and advanced features (search, clear, custom rendering).\n *\n * For simple cases or better mobile UX use Form.Field.NativeSelect.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Select\n * name=\"framework\"\n * label=\"Framework\"\n * options={[\n * { label: 'React', value: 'react' },\n * { label: 'Vue', value: 'vue' },\n * { label: 'Angular', value: 'angular', disabled: true },\n * ]}\n * clearable\n * />\n * ```\n */\nexport const FieldSelect = createField<SelectFieldProps, string | number, SelectFieldState>({\n displayName: 'FieldSelect',\n useFieldState: (\n componentProps: Omit<SelectFieldProps, keyof BaseFieldProps>,\n resolved: ResolvedFieldProps\n ): SelectFieldState => {\n // Options: props take priority, fallback to schema meta\n const sourceOptions = componentProps.options ?? resolved.options ?? []\n\n // Normalize options — value always string for Chakra\n const normalizedOptions: NormalizedOption[] = useMemo(\n () =>\n sourceOptions.map((opt) => ({\n label: opt.label,\n value: String(opt.value),\n disabled: opt.disabled,\n })),\n [sourceOptions]\n )\n\n // Create collection from normalized options\n const collection = useMemo(\n () =>\n createListCollection({\n items: normalizedOptions,\n itemToString: getOptionLabel,\n itemToValue: (item) => item.value,\n }),\n [normalizedOptions]\n )\n\n // Auto-determine clearable: show clear button if field is optional\n const resolvedClearable = componentProps.clearable ?? !resolved.required\n\n return { collection, normalizedOptions, resolvedClearable }\n },\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n // Convert current value to string for Chakra\n const currentValue = field.state.value\n const stringValue = currentValue !== null && currentValue !== undefined ? String(currentValue) : undefined\n\n return (\n <Field.Root invalid={hasError} required={resolved.required} disabled={resolved.disabled}>\n <Select.Root\n collection={fieldState.collection}\n size={componentProps.size ?? 'md'}\n variant={componentProps.variant ?? 'outline'}\n value={stringValue ? [stringValue] : []}\n onValueChange={(details) => {\n const newStringValue = details.value[0] as string | undefined\n // Convert back to needed type\n if (componentProps.valueType === 'number') {\n field.handleChange(newStringValue ? Number(newStringValue) : 0)\n } else {\n field.handleChange(newStringValue ?? '')\n }\n }}\n onInteractOutside={() => field.handleBlur()}\n disabled={resolved.disabled}\n data-field-name={fullPath}\n >\n <Select.HiddenSelect />\n {resolved.label && (\n <Select.Label>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </Select.Label>\n )}\n <Select.Control>\n <Select.Trigger>\n <Select.ValueText placeholder={resolved.placeholder} />\n </Select.Trigger>\n <Select.IndicatorGroup>\n {fieldState.resolvedClearable && <Select.ClearTrigger />}\n <Select.Indicator />\n </Select.IndicatorGroup>\n </Select.Control>\n <Portal>\n <Select.Positioner>\n <Select.Content>\n {fieldState.normalizedOptions.map((opt) => (\n <Select.Item item={opt} key={opt.value}>\n {getOptionLabel(opt)}\n <Select.ItemIndicator />\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Positioner>\n </Portal>\n </Select.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Field, TagsInput } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { createField, FieldError, SelectionFieldLabel } from '../base'\n\n/**\n * Props for Form.Field.Tags\n */\nexport interface TagsFieldProps extends BaseFieldProps {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Maximum number of tags */\n maxTags?: number\n /** Minimum length of each tag (by default: 1) */\n minTagLength?: number\n /** Custom delimiter (regex or string). Default: Enter */\n delimiter?: RegExp | string\n /** Add tags on blur (by default: false) */\n addOnBlur?: boolean\n /** Add tags on paste (by default: true) */\n addOnPaste?: boolean\n /** Allow editing tags on click (by default: false) */\n editable?: boolean\n /** Show clear button (by default: false) */\n clearable?: boolean\n /** Size (by default: md) */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Visual variant (by default: outline) */\n variant?: 'outline' | 'subtle' | 'flushed'\n /** Color palette for tags */\n colorPalette?: string\n}\n\n/**\n * Form.Field.Tags - Tags input field\n *\n * Renders input for adding/removing string tags.\n * Integrates with Chakra UI TagsInput component.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Tags name=\"tags\" label=\"Tags\" placeholder=\"Add tag...\" />\n * ```\n *\n * @example With constraints\n * ```tsx\n * <Form.Field.Tags\n * name=\"categories\"\n * label=\"Categories\"\n * maxTags={5}\n * minTagLength={2}\n * helperText=\"Up to 5 categories\"\n * />\n * ```\n *\n * @example With custom delimiter\n * ```tsx\n * <Form.Field.Tags\n * name=\"emails\"\n * label=\"Email addresses\"\n * delimiter={/[;,\\s]/}\n * addOnPaste\n * />\n * ```\n *\n * @example Editable tags\n * ```tsx\n * <Form.Field.Tags\n * name=\"tags\"\n * label=\"Tags\"\n * editable\n * clearable\n * />\n * ```\n */\nexport const FieldTags = createField<TagsFieldProps, string[]>({\n displayName: 'FieldTags',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n maxTags,\n minTagLength = 1,\n delimiter,\n addOnBlur = false,\n addOnPaste = true,\n editable = false,\n clearable = false,\n size = 'md',\n variant = 'outline',\n colorPalette,\n } = componentProps\n\n const value = (field.state.value as string[]) ?? []\n\n const handleValueChange = (details: { value: string[] }) => {\n field.handleChange(details.value)\n }\n\n const validateTag = (details: { inputValue: string }) => {\n return details.inputValue.length >= minTagLength\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <TagsInput.Root\n value={value}\n onValueChange={handleValueChange}\n max={maxTags}\n validate={validateTag}\n delimiter={delimiter}\n blurBehavior={addOnBlur ? 'add' : undefined}\n addOnPaste={addOnPaste}\n editable={editable}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n size={size}\n variant={variant}\n colorPalette={colorPalette}\n data-field-name={fullPath}\n >\n {resolved.label && (\n <TagsInput.Label>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </TagsInput.Label>\n )}\n\n <TagsInput.Control>\n <TagsInput.Items />\n <TagsInput.Input placeholder={resolved.placeholder} onBlur={field.handleBlur} />\n {clearable && <TagsInput.ClearTrigger />}\n </TagsInput.Control>\n\n <TagsInput.HiddenInput />\n </TagsInput.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","import type { AddressProvider, AddressSuggestion, SuggestionOptions } from './types'\n\nconst DADATA_URL = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address'\n\ninterface DaDataConfig {\n /** DaData API token */\n token: string\n /** Custom API base URL (default: DaData production) */\n baseUrl?: string\n}\n\n/**\n * Create a DaData address provider (Russia).\n *\n * @example\n * ```typescript\n * import { createDaDataProvider } from '@letar/forms'\n *\n * const dadata = createDaDataProvider({ token: process.env.DADATA_TOKEN })\n *\n * <Form.Field.Address name=\"address\" provider={dadata} />\n * ```\n */\nexport function createDaDataProvider(config: DaDataConfig): AddressProvider {\n const { token, baseUrl = DADATA_URL } = config\n\n return {\n async getSuggestions(query: string, options?: SuggestionOptions): Promise<AddressSuggestion[]> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const body: Record<string, any> = {\n query,\n count: options?.count ?? 10,\n }\n\n // DaData-specific: from_bound/to_bound for city-level restriction\n if (options?.bounds) {\n if (options.bounds.from) body.from_bound = { value: options.bounds.from }\n if (options.bounds.to) body.to_bound = { value: options.bounds.to }\n }\n\n // DaData-specific: locations filter\n if (options?.filters) {\n body.locations = [options.filters]\n }\n\n const response = await fetch(baseUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Token ${token}`,\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n return []\n }\n\n const data = await response.json()\n const suggestions = data.suggestions ?? []\n\n return suggestions.map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (s: any): AddressSuggestion => ({\n label: s.value,\n value: s.value,\n data: s.data,\n }),\n )\n },\n }\n}\n","'use client'\n\nimport { Box, Field, Input, List, Spinner, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeFormOptional } from '../../form-context'\nimport type { AddressFieldProps, AddressValue } from '../../types'\nimport { createField, FieldError, FieldLabel, useDebounce } from '../base'\nimport { createDaDataProvider } from './providers'\nimport type { AddressProvider, AddressSuggestion } from './providers'\n\n/**\n * Resolve address provider from props, context, or token fallback.\n */\nfunction useAddressProvider(\n propProvider?: AddressProvider,\n token?: string,\n): AddressProvider | null {\n const formContext = useDeclarativeFormOptional()\n\n // Priority: prop > createForm context > token fallback\n if (propProvider) return propProvider\n if (formContext?.addressProvider) return formContext.addressProvider\n if (token) return createDaDataProvider({ token })\n return null\n}\n\n/**\n * State for address field\n */\ninterface AddressFieldState {\n inputValue: string\n setInputValue: (value: string) => void\n suggestions: AddressSuggestion[]\n setSuggestions: (suggestions: AddressSuggestion[]) => void\n isLoading: boolean\n setIsLoading: (loading: boolean) => void\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n containerRef: React.RefObject<HTMLDivElement | null>\n debouncedQuery: string\n fetchSuggestions: (query: string) => Promise<void>\n initializedRef: React.RefObject<boolean>\n}\n\n/**\n * Form.Field.Address — address input with autocomplete suggestions.\n *\n * Supports pluggable address providers. DaData (Russia) is built-in;\n * pass any `AddressProvider` for other geocoding services.\n *\n * @example With provider (recommended)\n * ```tsx\n * const dadata = createDaDataProvider({ token: '...' })\n * <Form.Field.Address name=\"address\" provider={dadata} />\n * ```\n *\n * @example With token (backward compatible, auto-creates DaData provider)\n * ```tsx\n * <Form.Field.Address name=\"address\" token=\"dadata-token\" />\n * ```\n *\n * @example Return only string value\n * ```tsx\n * <Form.Field.Address name=\"address\" provider={dadata} valueOnly />\n * ```\n */\nexport const FieldAddress = createField<AddressFieldProps, AddressValue | string, AddressFieldState>({\n displayName: 'FieldAddress',\n\n useFieldState: (props) => {\n const { provider: propProvider, token, minChars = 3, debounceMs = 300, locations } = props\n const provider = useAddressProvider(propProvider, token)\n\n const [inputValue, setInputValue] = useState('')\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isOpen, setIsOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const initializedRef = useRef(false)\n\n const debouncedQuery = useDebounce(inputValue, debounceMs)\n\n // Fetch suggestions from provider\n const fetchSuggestions = useCallback(\n async (query: string) => {\n if (query.length < minChars || !provider) {\n setSuggestions([])\n return\n }\n\n setIsLoading(true)\n try {\n const results = await provider.getSuggestions(query, {\n count: 10,\n filters: locations ? Object.assign({}, ...locations) : undefined,\n })\n setSuggestions(results)\n setIsOpen(true)\n } catch (error) {\n console.error('Error loading address suggestions:', error)\n setSuggestions([])\n } finally {\n setIsLoading(false)\n }\n },\n [provider, minChars, locations],\n )\n\n // Load on debounced query change\n useEffect(() => {\n if (debouncedQuery) {\n fetchSuggestions(debouncedQuery)\n } else {\n setSuggestions([])\n setIsOpen(false)\n }\n }, [debouncedQuery, fetchSuggestions])\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n return {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n setIsLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n debouncedQuery,\n fetchSuggestions,\n initializedRef,\n }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { valueOnly = false } = componentProps\n const {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n initializedRef,\n } = fieldState\n\n const fieldValue = field.state.value as AddressValue | string | undefined\n\n // Initialize input value from field (only on first render)\n if (!initializedRef.current && fieldValue) {\n const displayValue = typeof fieldValue === 'string' ? fieldValue : fieldValue.value\n if (displayValue && displayValue !== inputValue) {\n setInputValue(displayValue)\n }\n initializedRef.current = true\n }\n\n // Handler for suggestion selection\n const handleSelect = (suggestion: AddressSuggestion) => {\n setInputValue(suggestion.value)\n setIsOpen(false)\n setSuggestions([])\n\n if (valueOnly) {\n field.handleChange(suggestion.value)\n } else {\n const addressValue: AddressValue = {\n value: suggestion.value,\n data: suggestion.data,\n }\n field.handleChange(addressValue)\n }\n }\n\n // Keyboard navigation handler\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isOpen || suggestions.length === 0) {\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex < suggestions.length - 1 ? highlightedIndex + 1 : 0)\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex > 0 ? highlightedIndex - 1 : suggestions.length - 1)\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0) {\n handleSelect(suggestions[highlightedIndex])\n }\n break\n case 'Escape':\n setIsOpen(false)\n break\n }\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <Box ref={containerRef} position=\"relative\" width=\"100%\">\n <Input\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n setHighlightedIndex(-1)\n }}\n onFocus={() => {\n if (suggestions.length > 0) {\n setIsOpen(true)\n }\n }}\n onBlur={field.handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={resolved.placeholder ?? 'Start typing address...'}\n data-field-name={fullPath}\n />\n {isLoading && (\n <Box position=\"absolute\" right={3} top=\"50%\" transform=\"translateY(-50%)\">\n <Spinner size=\"sm\" />\n </Box>\n )}\n {isOpen && suggestions.length > 0 && (\n <List.Root\n position=\"absolute\"\n zIndex={10}\n width=\"100%\"\n bg=\"bg.panel\"\n borderWidth=\"1px\"\n borderRadius=\"md\"\n shadow=\"md\"\n maxH=\"200px\"\n overflowY=\"auto\"\n mt={1}\n >\n {suggestions.map((suggestion, index) => (\n <List.Item\n key={suggestion.value + index}\n px={3}\n py={2}\n cursor=\"pointer\"\n bg={highlightedIndex === index ? 'bg.muted' : undefined}\n _hover={{ bg: 'bg.muted' }}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n <Text fontSize=\"sm\">{suggestion.label}</Text>\n </List.Item>\n ))}\n </List.Root>\n )}\n </Box>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { ColorPicker, Field, HStack, parseColor, Portal } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Props for ColorPicker field\n */\nexport interface ColorPickerFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Color palette for quick selection */\n swatches?: string[]\n /** Size (by default: md) */\n size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n /** Show area picker (saturation/brightness) (by default: true) */\n showArea?: boolean\n /** Show eyedropper button (by default: true) */\n showEyeDropper?: boolean\n /** Show hue/alpha sliders (by default: true) */\n showSliders?: boolean\n /** Show hex input (by default: true) */\n showInput?: boolean\n}\n\n/**\n * Default palette\n */\nconst defaultSwatches = [\n '#000000',\n '#4A5568',\n '#F56565',\n '#ED64A6',\n '#9F7AEA',\n '#6B46C1',\n '#4299E1',\n '#0BC5EA',\n '#38B2AC',\n '#48BB78',\n '#ECC94B',\n '#DD6B20',\n]\n\n/**\n * Form.Field.ColorPicker - Color selection with picker\n *\n * Renders color picker with optional palette, area picker,\n * sliders and hex input.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"color\"\n * label=\"Select color\"\n * />\n * ```\n *\n * @example With custom palette\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"brandColor\"\n * label=\"Brand color\"\n * swatches={['#FF0000', '#00FF00', '#0000FF']}\n * />\n * ```\n *\n * @example Minimal (palette only)\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"accent\"\n * showArea={false}\n * showSliders={false}\n * showInput={false}\n * swatches={['#FF0000', '#00FF00', '#0000FF', '#FFFF00']}\n * />\n * ```\n */\nexport const FieldColorPicker = createField<ColorPickerFieldProps, string>({\n displayName: 'FieldColorPicker',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n swatches = defaultSwatches,\n size = 'md',\n showArea = true,\n showEyeDropper = true,\n showSliders = true,\n showInput = true,\n } = componentProps\n\n const currentValue = (field.state.value as string) || '#000000'\n\n // Parse color safely\n let parsedColor\n try {\n parsedColor = parseColor(currentValue)\n } catch {\n parsedColor = parseColor('#000000')\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <ColorPicker.Root\n value={parsedColor}\n onValueChange={(details) => {\n // Use valueAsString which is already in correct format\n field.handleChange(details.valueAsString)\n }}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n size={size}\n >\n <ColorPicker.HiddenInput name={fullPath} />\n\n {resolved.label && (\n <ColorPicker.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n {resolved.required && <Field.RequiredIndicator />}\n </ColorPicker.Label>\n )}\n\n <ColorPicker.Control>\n {showInput && <ColorPicker.ChannelInput channel=\"hex\" />}\n <ColorPicker.Trigger />\n </ColorPicker.Control>\n\n <Portal>\n <ColorPicker.Positioner>\n <ColorPicker.Content>\n {showArea && <ColorPicker.Area />}\n\n {(showEyeDropper || showSliders) && (\n <HStack>\n {showEyeDropper && <ColorPicker.EyeDropper size=\"xs\" variant=\"outline\" />}\n {showSliders && <ColorPicker.Sliders />}\n </HStack>\n )}\n\n {swatches.length > 0 && (\n <ColorPicker.SwatchGroup>\n {swatches.map((swatch) => (\n <ColorPicker.SwatchTrigger key={swatch} value={swatch}>\n <ColorPicker.Swatch value={swatch} boxSize=\"4.5\" />\n </ColorPicker.SwatchTrigger>\n ))}\n </ColorPicker.SwatchGroup>\n )}\n </ColorPicker.Content>\n </ColorPicker.Positioner>\n </Portal>\n </ColorPicker.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport {\n Box,\n Button,\n Field,\n FileUpload,\n Float,\n HStack,\n Icon,\n IconButton,\n Input,\n Text,\n useFileUploadContext,\n} from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { LuFile, LuUpload, LuX } from 'react-icons/lu'\nimport type { FieldTooltipMeta } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Props for FileUpload field\n */\nexport interface FileUploadFieldProps {\n /** Field name */\n name?: string\n /** Field label */\n label?: string\n /** Helper text below the field */\n helperText?: string\n /** Required field */\n required?: boolean\n /** Disabled field */\n disabled?: boolean\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n\n /**\n * Accepted file types\n * @example \"image/*\"\n * @example [\"image/png\", \"image/jpeg\"]\n * @example \".pdf,.doc,.docx\"\n */\n accept?: string | string[]\n /** Maximum file size in bytes */\n maxFileSize?: number\n /** Maximum number of files (by default: 1) */\n maxFiles?: number\n /**\n * Display variant\n * - 'button': Simple trigger button\n * - 'dropzone': Drag & drop zone\n * - 'input': Input-like appearance\n */\n variant?: 'button' | 'dropzone' | 'input'\n /** Show file sizes in list */\n showSize?: boolean\n /** Allow removing files from list */\n clearable?: boolean\n /** Dropzone label text */\n dropzoneLabel?: ReactNode\n /** Dropzone description */\n dropzoneDescription?: ReactNode\n /** Button text (for 'button' variant) */\n buttonText?: ReactNode\n}\n\n/**\n * File list with image previews\n */\nfunction FileImageList({ clearable }: { clearable?: boolean }) {\n const fileUpload = useFileUploadContext()\n\n if (fileUpload.acceptedFiles.length === 0) {\n return null\n }\n\n return (\n <HStack wrap=\"wrap\" gap=\"3\" mt=\"2\">\n {fileUpload.acceptedFiles.map((file) => (\n <FileUpload.Item key={file.name} file={file} p=\"2\" width=\"auto\" pos=\"relative\">\n {clearable && (\n <Float placement=\"top-end\">\n <FileUpload.ItemDeleteTrigger asChild>\n <IconButton size=\"2xs\" variant=\"solid\" colorPalette=\"red\" rounded=\"full\">\n <LuX />\n </IconButton>\n </FileUpload.ItemDeleteTrigger>\n </Float>\n )}\n <FileUpload.ItemPreview type=\"image/*\" asChild>\n <FileUpload.ItemPreviewImage boxSize=\"16\" rounded=\"md\" objectFit=\"cover\" />\n </FileUpload.ItemPreview>\n <FileUpload.ItemPreview type=\".*\" asChild>\n <Icon fontSize=\"4xl\" color=\"fg.muted\">\n <LuFile />\n </Icon>\n </FileUpload.ItemPreview>\n </FileUpload.Item>\n ))}\n </HStack>\n )\n}\n\n/**\n * Standard file list (non-images)\n */\nfunction FileList({ showSize, clearable }: { showSize?: boolean; clearable?: boolean }) {\n const fileUpload = useFileUploadContext()\n\n if (fileUpload.acceptedFiles.length === 0) {\n return null\n }\n\n return (\n <FileUpload.ItemGroup mt=\"2\">\n {fileUpload.acceptedFiles.map((file) => (\n <FileUpload.Item key={file.name} file={file}>\n <FileUpload.ItemPreview asChild>\n <Icon fontSize=\"lg\" color=\"fg.muted\">\n <LuFile />\n </Icon>\n </FileUpload.ItemPreview>\n\n {showSize ? (\n <FileUpload.ItemContent>\n <FileUpload.ItemName />\n <FileUpload.ItemSizeText />\n </FileUpload.ItemContent>\n ) : (\n <FileUpload.ItemName flex=\"1\" />\n )}\n\n {clearable && (\n <FileUpload.ItemDeleteTrigger asChild>\n <IconButton variant=\"ghost\" color=\"fg.muted\" size=\"xs\">\n <LuX />\n </IconButton>\n </FileUpload.ItemDeleteTrigger>\n )}\n </FileUpload.Item>\n ))}\n </FileUpload.ItemGroup>\n )\n}\n\n/**\n * Form.Field.FileUpload - File upload field with multiple variants\n *\n * Supports uploading single or multiple files with drag & drop,\n * file preview and automatic form integration.\n *\n * @example Button variant (by default)\n * ```tsx\n * <Form.Field.FileUpload name=\"avatar\" label=\"Avatar\" accept=\"image/*\" />\n * ```\n *\n * @example Dropzone variant\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"documents\"\n * label=\"Documents\"\n * variant=\"dropzone\"\n * maxFiles={5}\n * accept=\".pdf,.doc,.docx\"\n * dropzoneLabel=\"Drop files here\"\n * dropzoneDescription=\"PDF, DOC up to 10MB\"\n * />\n * ```\n *\n * @example Input variant\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"file\"\n * label=\"Select file\"\n * variant=\"input\"\n * placeholder=\"Select file...\"\n * />\n * ```\n *\n * @example Multiple images with preview\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"gallery\"\n * label=\"Gallery\"\n * variant=\"dropzone\"\n * accept=\"image/*\"\n * maxFiles={10}\n * showSize\n * clearable\n * />\n * ```\n */\nexport const FieldFileUpload = createField<FileUploadFieldProps, File[]>({\n displayName: 'FieldFileUpload',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n accept,\n maxFileSize,\n maxFiles = 1,\n variant = 'button',\n showSize = false,\n clearable = true,\n dropzoneLabel = 'Drag and drop files here',\n dropzoneDescription,\n buttonText = 'Upload file',\n } = componentProps\n\n const placeholder = resolved.placeholder ?? 'Select file(s)'\n\n // Normalize accept to array for Chakra\n const normalizedAccept = accept\n ? typeof accept === 'string'\n ? accept.split(',').map((s) => s.trim())\n : accept\n : undefined\n\n // Check if working with images for preview\n const isImageUpload = normalizedAccept?.some((type) => type.startsWith('image/') || type === 'image/*')\n\n return (\n <Field.Root invalid={hasError} required={resolved.required} disabled={resolved.disabled}>\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <FileUpload.Root\n maxFiles={maxFiles}\n maxFileSize={maxFileSize}\n accept={normalizedAccept}\n disabled={resolved.disabled}\n onFileChange={(details) => {\n field.handleChange(details.acceptedFiles)\n }}\n data-field-name={fullPath}\n >\n <FileUpload.HiddenInput onBlur={field.handleBlur} />\n\n {variant === 'button' && (\n <>\n <FileUpload.Trigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <LuUpload />\n {buttonText}\n </Button>\n </FileUpload.Trigger>\n {isImageUpload ? (\n <FileImageList clearable={clearable} />\n ) : (\n <FileList showSize={showSize} clearable={clearable} />\n )}\n </>\n )}\n\n {variant === 'dropzone' && (\n <>\n <FileUpload.Dropzone>\n <Icon size=\"md\" color=\"fg.muted\">\n <LuUpload />\n </Icon>\n <FileUpload.DropzoneContent>\n <Box>{dropzoneLabel}</Box>\n {dropzoneDescription && <Text color=\"fg.muted\">{dropzoneDescription}</Text>}\n </FileUpload.DropzoneContent>\n </FileUpload.Dropzone>\n {isImageUpload ? (\n <FileImageList clearable={clearable} />\n ) : (\n <FileList showSize={showSize} clearable={clearable} />\n )}\n </>\n )}\n\n {variant === 'input' && (\n <Input asChild>\n <FileUpload.Trigger>\n <FileUpload.Context>\n {({ acceptedFiles }) => {\n if (acceptedFiles.length === 1) {\n return <span>{acceptedFiles[0].name}</span>\n }\n if (acceptedFiles.length > 1) {\n return <span>{acceptedFiles.length} files</span>\n }\n return <Text color=\"fg.subtle\">{placeholder}</Text>\n }}\n </FileUpload.Context>\n </FileUpload.Trigger>\n </Input>\n )}\n </FileUpload.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Box, Button, HStack, PinInput, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useState } from 'react'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { DeclarativeFormContextValue, OTPInputFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * State for OTP field with timer\n */\ninterface OTPFieldState {\n /** Seconds counter until retry is available */\n countdown: number\n /** Whether resend is in progress */\n isResending: boolean\n /** Resend handler */\n handleResend: () => Promise<void>\n /** Formatted countdown (MM:SS) */\n formatCountdown: (seconds: number) => string\n /** Context declarative form for auto-submit */\n formContext: DeclarativeFormContextValue\n}\n\n/**\n * Form.Field.OTPInput - OTP input field with resend timer\n *\n * Renders a PIN input for OTP verification with optional resend functionality.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.OTPInput name=\"code\" label=\"Confirmation Code\" />\n * ```\n *\n * @example With resend\n * ```tsx\n * <Form.Field.OTPInput\n * name=\"code\"\n * length={6}\n * resendTimeout={60}\n * onResend={async () => { await sendCode() }}\n * autoSubmit\n * />\n * ```\n *\n * @example Alphanumeric input\n * ```tsx\n * <Form.Field.OTPInput name=\"code\" type=\"alphanumeric\" />\n * ```\n */\nexport const FieldOTPInput = createField<OTPInputFieldProps, string, OTPFieldState>({\n displayName: 'FieldOTPInput',\n\n useFieldState: (props) => {\n const [countdown, setCountdown] = useState(0)\n const [isResending, setIsResending] = useState(false)\n\n // Countdown timer effect\n useEffect(() => {\n if (countdown <= 0) {\n return\n }\n\n const timer = setInterval(() => {\n setCountdown((prev) => prev - 1)\n }, 1000)\n\n return () => clearInterval(timer)\n }, [countdown])\n\n const handleResend = useCallback(async () => {\n if (!props.onResend || countdown > 0) {\n return\n }\n\n setIsResending(true)\n try {\n await props.onResend()\n setCountdown(props.resendTimeout ?? 60)\n } finally {\n setIsResending(false)\n }\n }, [props.onResend, countdown, props.resendTimeout])\n\n // Format countdown as MM:SS\n const formatCountdown = (seconds: number): string => {\n const mins = Math.floor(seconds / 60)\n const secs = seconds % 60\n return `${mins}:${secs.toString().padStart(2, '0')}`\n }\n\n // Form context for auto-submit (hook called at top level)\n const formContext = useDeclarativeForm()\n\n return { countdown, isResending, handleResend, formatCountdown, formContext }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { length = 6, autoSubmit = false, type = 'numeric', mask = false, onResend } = componentProps\n const { countdown, isResending, handleResend, formatCountdown, formContext } = fieldState\n\n const value = (field.state.value as string) ?? ''\n\n const handleValueComplete = (details: { value: string[]; valueAsString: string }) => {\n field.handleChange(details.valueAsString)\n\n // Auto-submit when filled\n if (autoSubmit && details.valueAsString.length === length) {\n formContext.form.handleSubmit()\n }\n }\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Box>\n <PinInput.Root\n value={value.split('')}\n onValueComplete={handleValueComplete}\n onValueChange={(details) => field.handleChange(details.valueAsString)}\n count={length}\n type={type}\n mask={mask}\n otp\n >\n <PinInput.Control>\n <HStack gap={2}>\n {Array.from({ length }).map((_, index) => (\n <PinInput.Input key={index} index={index} data-field-name={index === 0 ? fullPath : undefined} />\n ))}\n </HStack>\n </PinInput.Control>\n <PinInput.HiddenInput />\n </PinInput.Root>\n\n {onResend && (\n <HStack mt={3} justify=\"center\">\n {countdown > 0 ? (\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Redo in {formatCountdown(countdown)}\n </Text>\n ) : (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResend} disabled={isResending} loading={isResending}>\n Submit again\n </Button>\n )}\n </HStack>\n )}\n </Box>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Field, Group, Input, Text } from '@chakra-ui/react'\nimport { useCallback, type ReactElement } from 'react'\nimport { withMask } from 'use-mask-input'\nimport type { PhoneCountry, PhoneFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Phone masks by country\n */\nconst PHONE_MASKS: Record<PhoneCountry, string | string[]> = {\n RU: '+7 (999) 999-99-99',\n US: '+1 (999) 999-9999',\n UK: '+44 9999 999999',\n DE: '+49 999 99999999',\n FR: '+33 9 99 99 99 99',\n IT: '+39 999 999 9999',\n ES: '+34 999 99 99 99',\n CN: '+86 999 9999 9999',\n JP: '+81 99 9999 9999',\n KR: '+82 99 9999 9999',\n BY: '+375 (99) 999-99-99',\n KZ: '+7 (999) 999-99-99',\n UA: '+380 (99) 999-99-99',\n}\n\n/**\n * Country flags\n */\nconst COUNTRY_FLAGS: Record<PhoneCountry, string> = {\n RU: '🇷🇺',\n US: '🇺🇸',\n UK: '🇬🇧',\n DE: '🇩🇪',\n FR: '🇫🇷',\n IT: '🇮🇹',\n ES: '🇪🇸',\n CN: '🇨🇳',\n JP: '🇯🇵',\n KR: '🇰🇷',\n BY: '🇧🇾',\n KZ: '🇰🇿',\n UA: '🇺🇦',\n}\n\n/**\n * State for phone field\n */\ninterface PhoneFieldState {\n /** Ref callback for applying mask */\n maskRef: (element: HTMLInputElement | null) => void\n}\n\n/**\n * Form.Field.Phone - Phone input with country mask\n *\n * Renders phone field with automatic mask based on country.\n *\n * @example Russian phone (by default)\n * ```tsx\n * <Form.Field.Phone name=\"phone\" label=\"Phone\" />\n * ```\n *\n * @example US phone with flag\n * ```tsx\n * <Form.Field.Phone name=\"phone\" country=\"US\" showFlag />\n * ```\n *\n * @example Return value without mask\n * ```tsx\n * <Form.Field.Phone name=\"phone\" autoUnmask />\n * ```\n */\nexport const FieldPhone = createField<PhoneFieldProps, string, PhoneFieldState>({\n displayName: 'FieldPhone',\n\n useFieldState: (props) => {\n const { country = 'RU', autoUnmask = false } = props\n const mask = PHONE_MASKS[country]\n\n // Create ref callback for applying mask\n const maskRef = useCallback(\n (element: HTMLInputElement | null) => {\n if (element && mask) {\n const maskCallback = withMask(mask, {\n showMaskOnFocus: true,\n clearIncomplete: true,\n autoUnmask,\n })\n maskCallback(element)\n }\n },\n [mask, autoUnmask]\n )\n\n return { maskRef }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { country = 'RU', showFlag = false } = componentProps\n const flag = COUNTRY_FLAGS[country]\n const mask = PHONE_MASKS[country]\n\n const value = (field.state.value as string) ?? ''\n const resolvedPlaceholder = resolved.placeholder ?? mask?.toString().replace(/9/g, '_')\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <Group attached>\n {showFlag && (\n <Text px={3} display=\"flex\" alignItems=\"center\" bg=\"bg.muted\" borderWidth=\"1px\" borderRightWidth=\"0\">\n {flag}\n </Text>\n )}\n <Input\n ref={fieldState.maskRef}\n value={value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={resolvedPlaceholder}\n data-field-name={fullPath}\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel\"\n />\n </Group>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { PinInput } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Props for PinInput field\n */\nexport interface PinInputFieldProps extends BaseFieldProps {\n /** Number of input boxes (default: 4) */\n count?: number\n /** Mask as password */\n mask?: boolean\n /** Enable OTP autofill */\n otp?: boolean\n /** Type input: numeric, alphanumeric, alphabetic (by default: numeric) */\n type?: 'numeric' | 'alphanumeric' | 'alphabetic'\n /** Size: 2xs, xs, sm, md, lg, xl, 2xl (by default: md) */\n size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n /** Variant: outline, subtle, flushed (default: outline) */\n variant?: 'outline' | 'subtle' | 'flushed'\n /** Attach inputs together (no gap) */\n attached?: boolean\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n}\n\n/**\n * Form.Field.PinInput - PIN/OTP code input field\n *\n * Renders a series of single-character inputs for PIN codes, OTP etc.\n * Form value is stored as a string (e.g., \"1234\").\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.PinInput name=\"pin\" label=\"Enter PIN\" />\n * ```\n *\n * @example OTP with 6 digits\n * ```tsx\n * <Form.Field.PinInput\n * name=\"otp\"\n * label=\"Confirmation Code\"\n * count={6}\n * otp\n * onComplete={(code) => verifyCode(code)}\n * />\n * ```\n *\n * @example Masked as password\n * ```tsx\n * <Form.Field.PinInput name=\"secret\" mask count={6} />\n * ```\n */\nexport const FieldPinInput = createField<PinInputFieldProps, string>({\n displayName: 'FieldPinInput',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n count = 4,\n mask,\n otp,\n type = 'numeric',\n size = 'md',\n variant = 'outline',\n attached,\n onComplete,\n } = componentProps\n\n // Convert string to array for PinInput\n const stringValue = (field.state.value as string) ?? ''\n const arrayValue = stringValue.split('').slice(0, count)\n // Pad with empty strings up to count\n while (arrayValue.length < count) {\n arrayValue.push('')\n }\n\n const handleValueChange = (details: { value: string[] }) => {\n // Convert array back to string\n const newValue = details.value.join('')\n field.handleChange(newValue)\n }\n\n const handleValueComplete = (details: { value: string[] }) => {\n const completeValue = details.value.join('')\n onComplete?.(completeValue)\n }\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <PinInput.Root\n value={arrayValue}\n onValueChange={handleValueChange}\n onValueComplete={handleValueComplete}\n placeholder={resolved.placeholder}\n mask={mask}\n otp={otp}\n type={type}\n size={size}\n variant={variant}\n attached={attached}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n invalid={hasError}\n count={count}\n onBlur={field.handleBlur}\n data-field-name={fullPath}\n >\n <PinInput.HiddenInput />\n <PinInput.Control>\n {Array.from({ length: count }).map((_, index) => (\n <PinInput.Input key={index} index={index} />\n ))}\n </PinInput.Control>\n </PinInput.Root>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Input } from '@chakra-ui/react'\nimport { useCallback, type ReactElement } from 'react'\nimport { withMask } from 'use-mask-input'\nimport type { MaskedInputFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * State for masked field\n */\ninterface MaskedInputFieldState {\n /** Ref callback for applying mask */\n maskRef: (element: HTMLInputElement | null) => void\n}\n\n/**\n * Form.Field.MaskedInput - Masked input field\n *\n * Renders masked input using the use-mask-input library.\n *\n * Mask characters:\n * - 9: digit\n * - a: letter\n * - *: letter or digit\n *\n * @example Passport mask\n * ```tsx\n * <Form.Field.MaskedInput name=\"passport\" label=\"Passport\" mask=\"99 99 999999\" />\n * ```\n *\n * @example Multiple masks (adapts to input)\n * ```tsx\n * <Form.Field.MaskedInput name=\"phone\" mask={['9999-9999', '99999-9999']} />\n * ```\n *\n * @example With custom placeholder character\n * ```tsx\n * <Form.Field.MaskedInput name=\"date\" mask=\"99/99/9999\" placeholderChar=\"#\" />\n * ```\n */\nexport const FieldMaskedInput = createField<MaskedInputFieldProps, string, MaskedInputFieldState>({\n displayName: 'FieldMaskedInput',\n\n useFieldState: (props) => {\n const {\n mask,\n placeholderChar = '_',\n showMaskOnFocus = true,\n showMaskOnHover = false,\n clearIncomplete = false,\n autoUnmask = false,\n } = props\n\n // Create ref callback for applying mask\n const maskRef = useCallback(\n (element: HTMLInputElement | null) => {\n if (element && mask) {\n const maskCallback = withMask(mask, {\n placeholder: placeholderChar,\n showMaskOnFocus,\n showMaskOnHover,\n clearIncomplete,\n autoUnmask,\n })\n maskCallback(element)\n }\n },\n [mask, placeholderChar, showMaskOnFocus, showMaskOnHover, clearIncomplete, autoUnmask]\n )\n\n return { maskRef }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, fieldState }): ReactElement => (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Input\n ref={fieldState.maskRef}\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n ),\n})\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { renderFieldByType } from '../../field-type-mapper'\nimport { useDeclarativeForm } from '../../form-context'\nimport { getZodConstraints } from '../../schema-constraints'\nimport type { BaseFieldProps } from '../../types'\nimport type { FieldUIMeta } from '../../types/meta-types'\nimport { FieldCheckbox } from '../boolean/field-checkbox'\nimport { FieldSwitch } from '../boolean/field-switch'\nimport { FieldDate } from '../datetime/field-date'\nimport { FieldNumber } from '../number/field-number'\nimport { FieldNativeSelect } from '../selection/field-native-select'\nimport { FieldString } from '../text/field-string'\nimport { FieldTextarea } from '../text/field-textarea'\n\n/**\n * Auto-detection configuration for field type\n */\nexport interface AutoFieldConfig {\n /**\n * Prefer Switch over Checkbox for boolean\n * @default false\n */\n booleanAsSwitch?: boolean\n /**\n * Use Textarea for long strings (based on maxLength in schema)\n * @default true\n */\n useTextareaForLongStrings?: boolean\n /**\n * Length threshold for using Textarea\n * @default 200\n */\n textareaThreshold?: number\n}\n\n/**\n * Props for AutoField\n */\nexport interface AutoFieldProps extends BaseFieldProps {\n /** Auto-detection configuration */\n config?: AutoFieldConfig\n}\n\n/**\n * Extract Zod type from schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getZodType(schema: any): string | undefined {\n if (!schema?._zod?.def) {\n return undefined\n }\n\n const type = schema._zod.def.type\n\n // Unwrap wrapper types\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n return getZodType(schema._zod.def.inner)\n }\n\n return type\n}\n\n/**\n * Get enum values from Zod schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getEnumValues(schema: any): string[] | undefined {\n if (!schema?._zod?.def) {\n return undefined\n }\n\n const type = schema._zod.def.type\n\n // Unwrap wrapper types\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n return getEnumValues(schema._zod.def.inner)\n }\n\n if (type === 'enum') {\n return schema._zod.def.values\n }\n\n if (type === 'literal') {\n const value = schema._zod.def.value\n return typeof value === 'string' ? [value] : undefined\n }\n\n return undefined\n}\n\n/**\n * Get maxLength from Zod checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getMaxLength(schema: any): number | undefined {\n if (!schema?._zod?.def?.checks) {\n return undefined\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maxCheck = schema._zod.def.checks.find((c: any) => c.kind === 'max_length' || c.kind === 'max')\n return maxCheck?.value\n}\n\n/**\n * Get UI meta from Zod schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getUIMeta(schema: any): FieldUIMeta | undefined {\n if (!schema?.meta) {\n return undefined\n }\n\n try {\n const meta = schema.meta()\n return meta?.ui as FieldUIMeta | undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Navigate to schema by path\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSchemaAtPath(schema: any, path: string): any {\n if (!schema || !path) {\n return schema\n }\n\n const parts = path.split('.')\n let current = schema\n\n for (const part of parts) {\n // Unwrap wrapper types\n while (current?._zod?.def?.type && ['optional', 'nullable', 'default'].includes(current._zod.def.type)) {\n current = current._zod.def.inner\n }\n\n if (!current) {\n return undefined\n }\n\n // Skip numeric indices\n if (/^\\d+$/.test(part)) {\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Navigate into object\n if (current._zod?.def?.type === 'object') {\n const shape = current._zod.def.shape\n if (shape && part in shape) {\n current = shape[part]\n } else {\n return undefined\n }\n } else {\n return undefined\n }\n }\n\n return current\n}\n\n/**\n * Convert camelCase to readable label\n * @example \"firstName\" → \"First Name\"\n * @example \"createdAt\" → \"Created At\"\n */\nexport function camelCaseToLabel(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1') // Add space before capitals\n .replace(/^./, (s) => s.toUpperCase()) // Capitalize first letter\n .trim()\n}\n\n/**\n * Form.Field.Auto - Auto-detection of field type from Zod schema\n *\n * Automatically selects appropriate field component based on Zod schema type:\n * - string → FieldString (or FieldTextarea for long strings)\n * - number/bigint/int/float → FieldNumber\n * - boolean → FieldCheckbox (or FieldSwitch)\n * - date → FieldDate\n * - enum → FieldNativeSelect\n *\n * If label is not specified, it is generated from field name (camelCase → \"Readable Label\").\n *\n * @example Basic usage\n * ```tsx\n * const schema = z.object({\n * firstName: z.string(),\n * age: z.number(),\n * isActive: z.boolean(),\n * role: z.enum(['admin', 'user', 'guest']),\n * createdAt: z.date(),\n * })\n *\n * <Form schema={schema} initialValue={...} onSubmit={...}>\n * <Form.Field.Auto name=\"firstName\" /> // → FieldString, label=\"First Name\"\n * <Form.Field.Auto name=\"age\" /> // → FieldNumber, label=\"Age\"\n * <Form.Field.Auto name=\"isActive\" /> // → FieldCheckbox, label=\"Is Active\"\n * <Form.Field.Auto name=\"role\" /> // → FieldNativeSelect with options\n * <Form.Field.Auto name=\"createdAt\" /> // → FieldDate\n * </Form>\n * ```\n *\n * @example With configuration\n * ```tsx\n * <Form.Field.Auto\n * name=\"isActive\"\n * config={{ booleanAsSwitch: true }}\n * />\n * ```\n *\n * @example With explicit fieldType in meta\n * ```tsx\n * const schema = z.object({\n * bio: z.string().meta({ ui: { title: 'Biography', fieldType: 'richText' } }),\n * })\n *\n * <Form.Field.Auto name=\"bio\" /> // → FieldRichText (from meta.fieldType)\n * ```\n */\nexport function FieldAuto({ name, config, ...baseProps }: AutoFieldProps): ReactElement {\n const { schema } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n if (!name) {\n throw new Error('Form.Field.Auto requires a name prop')\n }\n\n // Build full path\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Get field schema\n const fieldSchema = getSchemaAtPath(schema, fullPath)\n const zodType = getZodType(fieldSchema)\n const enumValues = getEnumValues(fieldSchema)\n const maxLength = getMaxLength(fieldSchema)\n const uiMeta = getUIMeta(fieldSchema)\n\n // Auto-label if not specified\n const label = baseProps.label ?? uiMeta?.title ?? camelCaseToLabel(name)\n\n // If explicit fieldType in meta — use renderFieldByType\n if (uiMeta?.fieldType) {\n const constraints = getZodConstraints(schema, fullPath)\n return renderFieldByType(uiMeta.fieldType, {\n name,\n label,\n placeholder: baseProps.placeholder ?? uiMeta.placeholder,\n helperText: baseProps.helperText ?? uiMeta.description,\n required: baseProps.required,\n disabled: baseProps.disabled,\n readOnly: baseProps.readOnly,\n enumValues,\n constraints,\n fieldProps: uiMeta.fieldProps,\n })\n }\n\n // Configuration with defaults\n const { booleanAsSwitch = false, useTextareaForLongStrings = true, textareaThreshold = 200 } = config ?? {}\n\n // Determine component by schema type (fallback)\n switch (zodType) {\n case 'string':\n // Check, Textarea is needed\n if (useTextareaForLongStrings && maxLength && maxLength > textareaThreshold) {\n return <FieldTextarea name={name} label={label} {...baseProps} />\n }\n return <FieldString name={name} label={label} {...baseProps} />\n\n case 'number':\n case 'bigint':\n case 'int':\n case 'float':\n return <FieldNumber name={name} label={label} {...baseProps} />\n\n case 'boolean':\n if (booleanAsSwitch) {\n return <FieldSwitch name={name} label={label} {...baseProps} />\n }\n return <FieldCheckbox name={name} label={label} {...baseProps} />\n\n case 'date':\n return <FieldDate name={name} label={label} {...baseProps} />\n\n case 'enum':\n if (enumValues) {\n // NativeSelectOption uses title instead of label\n const options = enumValues.map((value) => ({\n title: camelCaseToLabel(value),\n value,\n }))\n return <FieldNativeSelect name={name} label={label} options={options} {...baseProps} />\n }\n return <FieldString name={name} label={label} {...baseProps} />\n\n default:\n // Fallback to String\n return <FieldString name={name} label={label} {...baseProps} />\n }\n}\n\nFieldAuto.displayName = 'FieldAuto'\n","'use client'\n\nimport { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react'\n\n/**\n * Option for selection field\n */\nexport interface RelationOption {\n /** Value (usually ID) */\n value: string\n /** Display text */\n label: string\n /** Description (optional) */\n description?: string\n}\n\n/**\n * Loading state relation\n */\nexport interface RelationState {\n /** Options for selection */\n options: RelationOption[]\n /** Loading in progress */\n isLoading: boolean\n /** Error loading */\n error: Error | null\n}\n\n/**\n * Data loading hook result\n */\nexport interface QueryHookResult<TData = unknown> {\n data?: TData[] | null\n isLoading: boolean\n error?: Error | null\n}\n\n/**\n * Relation loading configuration\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface RelationConfig<TData = any, TArgs = any> {\n /** Model name (must match model in relationMeta) */\n model: string\n /**\n * React hook for loading data (must return { data, isLoading, error })\n * @example useFindManyCategory\n */\n useQuery: (args?: TArgs) => QueryHookResult<TData>\n /** Field to display as label */\n labelField: string\n /** Field for value (by default 'id') */\n valueField?: string\n /** Field for description (optional) */\n descriptionField?: string\n /** Arguments for useQuery (filters, sorting) */\n queryArgs?: TArgs\n}\n\n/**\n * RelationFieldProvider context value\n */\nexport interface RelationFieldContextValue {\n /** Get options for model */\n getOptions: (model: string) => RelationOption[]\n /** Get state loading for model */\n getState: (model: string) => RelationState\n /** All loaded relations */\n relations: Record<string, RelationState>\n}\n\nconst RelationFieldContext = createContext<RelationFieldContextValue | null>(null)\n\n/**\n * Hook for getting RelationFieldProvider context\n */\nexport function useRelationFieldContext(): RelationFieldContextValue | null {\n return useContext(RelationFieldContext)\n}\n\n/**\n * Hook for getting options of a specific model\n * @param model - model name\n * @returns options and loading state\n */\nexport function useRelationOptions(model: string): RelationState {\n const context = useRelationFieldContext()\n\n if (!context) {\n return {\n options: [],\n isLoading: false,\n error: null,\n }\n }\n\n return context.getState(model)\n}\n\n/**\n * Loader component for a single relation\n * Called inside the provider, follows hooks rules\n */\nfunction RelationLoader<TData>({\n config,\n onLoaded,\n}: {\n config: RelationConfig<TData>\n onLoaded: (model: string, state: RelationState) => void\n}) {\n const { model, useQuery, labelField, valueField = 'id', descriptionField, queryArgs } = config\n\n // Call the data loading hook\n const { data, isLoading, error } = useQuery(queryArgs)\n\n // Transform data into options on change\n useEffect(() => {\n if (isLoading) {\n onLoaded(model, { options: [], isLoading: true, error: null })\n return\n }\n\n if (error) {\n onLoaded(model, { options: [], isLoading: false, error: error as Error })\n return\n }\n\n const options: RelationOption[] = (data ?? []).map((item) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const record = item as Record<string, any>\n return {\n value: String(record[valueField] ?? ''),\n label: String(record[labelField] ?? ''),\n description: descriptionField ? String(record[descriptionField] ?? '') : undefined,\n }\n })\n\n onLoaded(model, { options, isLoading: false, error: null })\n }, [data, isLoading, error, model, labelField, valueField, descriptionField, onLoaded])\n\n // Component renders nothing\n return null\n}\n\n/**\n * Provider for auto-loading relation field options\n *\n * Allows automatically loading options for fields with `relationMeta()`,\n * integrating with ZenStack hooks.\n *\n * @example Basic usage\n * ```tsx\n * import { useFindManyCategory, useFindManyTag } from '@/generated/hooks'\n *\n * <RelationFieldProvider\n * relations={[\n * { model: 'Category', useQuery: useFindManyCategory, labelField: 'name' },\n * { model: 'Tag', useQuery: useFindManyTag, labelField: 'title' },\n * ]}\n * >\n * <Form schema={ProductFormSchema} ...>\n * <Form.AutoFields />\n * </Form>\n * </RelationFieldProvider>\n * ```\n *\n * @example With filtering and sorting\n * ```tsx\n * <RelationFieldProvider\n * relations={[\n * {\n * model: 'Category',\n * useQuery: useFindManyCategory,\n * labelField: 'name',\n * queryArgs: {\n * where: { isActive: true },\n * orderBy: { name: 'asc' },\n * },\n * },\n * ]}\n * >\n * ```\n *\n * @example With description for RadioCard/CheckboxCard\n * ```tsx\n * <RelationFieldProvider\n * relations={[\n * {\n * model: 'Plan',\n * useQuery: useFindManyPlan,\n * labelField: 'name',\n * descriptionField: 'features',\n * },\n * ]}\n * >\n * ```\n */\nexport function RelationFieldProvider({\n relations,\n children,\n}: {\n /** Relation loading configurations */\n relations: RelationConfig[]\n children: ReactNode\n}) {\n // State of all loaded relations\n const [relationsState, setRelationsState] = useState<Record<string, RelationState>>({})\n\n // Callback for updating relation state\n const handleLoaded = useMemo(\n () => (model: string, state: RelationState) => {\n setRelationsState((prev) => {\n // Check if data has changed\n const prevState = prev[model]\n if (\n prevState &&\n prevState.isLoading === state.isLoading &&\n prevState.error === state.error &&\n JSON.stringify(prevState.options) === JSON.stringify(state.options)\n ) {\n return prev // No changes\n }\n return { ...prev, [model]: state }\n })\n },\n []\n )\n\n // Context value\n const contextValue = useMemo<RelationFieldContextValue>(\n () => ({\n getOptions: (model: string) => relationsState[model]?.options ?? [],\n getState: (model: string) =>\n relationsState[model] ?? {\n options: [],\n isLoading: false,\n error: null,\n },\n relations: relationsState,\n }),\n [relationsState]\n )\n\n return (\n <RelationFieldContext.Provider value={contextValue}>\n {/* Render loaders for each relation */}\n {relations.map((config) => (\n <RelationLoader key={config.model} config={config} onLoaded={handleLoaded} />\n ))}\n {children}\n </RelationFieldContext.Provider>\n )\n}\n\n/**\n * HOC for wrapping a component with RelationFieldProvider\n *\n * @example\n * ```tsx\n * const ProductFormWithRelations = withRelations(ProductForm, [\n * { model: 'Category', useQuery: useFindManyCategory, labelField: 'name' },\n * ])\n * ```\n */\nexport function withRelations<P extends object>(\n Component: React.ComponentType<P>,\n relations: RelationConfig[]\n): React.FC<P> {\n const WrappedComponent = (props: P) => (\n <RelationFieldProvider relations={relations}>\n <Component {...props} />\n </RelationFieldProvider>\n )\n\n WrappedComponent.displayName = `withRelations(${Component.displayName ?? Component.name ?? 'Component'})`\n\n return WrappedComponent\n}\n","'use client'\n\nimport type { ReactElement, ReactNode } from 'react'\nimport type { ZodConstraints } from './schema-constraints'\nimport type { SchemaFieldInfo } from './schema-traversal'\nimport type { FieldComponentType } from './types/meta-types'\n\n// Import all Field components\nimport { FieldEditable } from './form-fields/text/field-editable'\nimport { FieldPassword } from './form-fields/text/field-password'\nimport { FieldPasswordStrength } from './form-fields/text/field-password-strength'\nimport { FieldRichText } from './form-fields/text/field-rich-text'\nimport { FieldString } from './form-fields/text/field-string'\nimport { FieldTextarea } from './form-fields/text/field-textarea'\n\nimport { FieldCurrency } from './form-fields/number/field-currency'\nimport { FieldNumber } from './form-fields/number/field-number'\nimport { FieldNumberInput } from './form-fields/number/field-number-input'\nimport { FieldPercentage } from './form-fields/number/field-percentage'\nimport { FieldRating } from './form-fields/number/field-rating'\nimport { FieldSlider } from './form-fields/number/field-slider'\n\nimport { FieldDate } from './form-fields/datetime/field-date'\nimport { FieldDateRange } from './form-fields/datetime/field-date-range'\nimport { FieldDateTimePicker } from './form-fields/datetime/field-datetime-picker'\nimport { FieldDuration } from './form-fields/datetime/field-duration'\nimport { FieldSchedule } from './form-fields/datetime/field-schedule'\nimport { FieldTime } from './form-fields/datetime/field-time'\n\nimport { FieldCheckbox } from './form-fields/boolean/field-checkbox'\nimport { FieldSwitch } from './form-fields/boolean/field-switch'\n\nimport { FieldAutocomplete } from './form-fields/selection/field-autocomplete'\nimport { FieldCheckboxCard } from './form-fields/selection/field-checkbox-card'\nimport { FieldCombobox } from './form-fields/selection/field-combobox'\nimport { FieldListbox } from './form-fields/selection/field-listbox'\nimport { FieldNativeSelect } from './form-fields/selection/field-native-select'\nimport { FieldRadioCard } from './form-fields/selection/field-radio-card'\nimport { FieldRadioGroup } from './form-fields/selection/field-radio-group'\nimport { FieldSegmentedGroup } from './form-fields/selection/field-segmented-group'\nimport { FieldSelect } from './form-fields/selection/field-select'\nimport { FieldTags } from './form-fields/selection/field-tags'\n\nimport { FieldAddress } from './form-fields/specialized/field-address'\nimport { FieldColorPicker } from './form-fields/specialized/field-color-picker'\nimport { FieldFileUpload } from './form-fields/specialized/field-file-upload'\nimport { FieldOTPInput } from './form-fields/specialized/field-otp-input'\nimport { FieldPhone } from './form-fields/specialized/field-phone'\nimport { FieldPinInput } from './form-fields/specialized/field-pin-input'\nimport { FieldMaskedInput } from './form-fields/text/field-masked-input'\n\nimport { camelCaseToLabel } from './form-fields/auto/field-auto'\nimport { type RelationOption, useRelationFieldContext } from './relation-field-provider'\n\n/**\n * Relation configuration in fieldProps\n */\nexport interface RelationFieldConfig {\n /** Model name (must match model in RelationFieldProvider) */\n model: string\n /** Field to display as label */\n labelField: string\n /** Field for value (default 'id') */\n valueField?: string\n}\n\n/**\n * Props for field rendering\n */\nexport interface FieldRenderProps {\n /** Field name */\n name: string\n /** Label (if not specified, generated from name) */\n label?: ReactNode\n /** Placeholder */\n placeholder?: string\n /** Helper text */\n helperText?: ReactNode\n /** Required field */\n required?: boolean\n /** Disabled */\n disabled?: boolean\n /** Read only */\n readOnly?: boolean\n /** Enum values for select/radio */\n enumValues?: string[]\n /** Constraints from schema */\n constraints?: ZodConstraints\n /** Additional props from fieldProps */\n fieldProps?: Record<string, unknown>\n /**\n * Options from RelationFieldProvider (if field has relation config)\n * Set automatically via SchemaFieldWithRelations\n */\n relationOptions?: RelationOption[]\n}\n\n/**\n * Determine component type based on:\n * 1. Explicit fieldType from meta (priority)\n * 2. Zod type (fallback)\n */\nexport function resolveFieldType(field: SchemaFieldInfo): FieldComponentType {\n // Priority: explicit fieldType from meta\n if (field.ui?.fieldType) {\n return field.ui.fieldType\n }\n\n // Fallback to Zod type\n switch (field.zodType) {\n case 'string':\n // Check email/url via constraints\n if (field.constraints?.string?.inputType === 'email') {\n return 'string'\n }\n if (field.constraints?.string?.inputType === 'url') {\n return 'string'\n }\n // Check long string -> textarea\n if (field.constraints?.string?.maxLength && field.constraints.string.maxLength > 200) {\n return 'textarea'\n }\n return 'string'\n\n case 'number':\n case 'bigint':\n case 'int':\n case 'float':\n return 'number'\n\n case 'boolean':\n return 'checkbox'\n\n case 'date':\n return 'date'\n\n case 'enum':\n case 'literal':\n return 'nativeSelect'\n\n case 'array':\n // Primitive arrays -> tags\n if (field.element?.zodType === 'string') {\n return 'tags'\n }\n // Object arrays are handled separately\n return 'string' // fallback\n\n default:\n return 'string'\n }\n}\n\n/**\n * Option type for selection components\n */\ninterface SelectOptionResolved {\n value: string\n label: string\n description?: string\n}\n\n/**\n * Option type for NativeSelect (uses title instead of label)\n */\ninterface NativeSelectOptionResolved {\n value: string\n title: string\n description?: string\n}\n\n/**\n * Get options for a selection field considering relationOptions\n * Priority: fieldProps.options > relationOptions > enumValues\n */\nfunction resolveSelectOptions(\n fieldProps: Record<string, unknown>,\n relationOptions?: RelationOption[],\n enumValues?: string[]\n): SelectOptionResolved[] | undefined {\n // 1. Explicit options in fieldProps (highest priority)\n if (fieldProps.options && Array.isArray(fieldProps.options)) {\n return fieldProps.options as SelectOptionResolved[]\n }\n\n // 2. Options from RelationFieldProvider\n if (relationOptions && relationOptions.length > 0) {\n return relationOptions.map((opt) => ({\n value: opt.value,\n label: opt.label,\n description: opt.description,\n }))\n }\n\n // 3. Enum values (fallback)\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((v) => ({ label: camelCaseToLabel(v), value: v }))\n }\n\n return undefined\n}\n\n/**\n * Get options for NativeSelect (uses title instead of label)\n */\nfunction resolveNativeSelectOptions(\n fieldProps: Record<string, unknown>,\n relationOptions?: RelationOption[],\n enumValues?: string[]\n): NativeSelectOptionResolved[] | undefined {\n // 1. Explicit options in fieldProps (highest priority)\n if (fieldProps.options && Array.isArray(fieldProps.options)) {\n return fieldProps.options as NativeSelectOptionResolved[]\n }\n\n // 2. Options from RelationFieldProvider\n if (relationOptions && relationOptions.length > 0) {\n return relationOptions.map((opt) => ({\n value: opt.value,\n title: opt.label,\n description: opt.description,\n }))\n }\n\n // 3. Enum values (fallback)\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((v) => ({ title: camelCaseToLabel(v), value: v }))\n }\n\n return undefined\n}\n\n/**\n * Render a field component by type\n */\nexport function renderFieldByType(type: FieldComponentType, props: FieldRenderProps): ReactElement {\n const {\n name,\n label: labelProp,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n enumValues,\n constraints,\n fieldProps = {},\n relationOptions,\n } = props\n\n // Generate label if not specified\n const label = labelProp ?? camelCaseToLabel(name)\n\n // Base props for all fields\n const baseProps = {\n name,\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n }\n\n // Apply constraints to props\n const stringConstraints = constraints?.string || {}\n const numberConstraints = constraints?.number || {}\n\n // Pre-compute options for selection fields\n const selectOptions = resolveSelectOptions(fieldProps, relationOptions, enumValues)\n const nativeSelectOptions = resolveNativeSelectOptions(fieldProps, relationOptions, enumValues)\n\n switch (type) {\n // Text fields\n case 'string':\n return (\n <FieldString\n key={name}\n {...baseProps}\n type={stringConstraints.inputType}\n maxLength={stringConstraints.maxLength}\n minLength={stringConstraints.minLength}\n pattern={stringConstraints.pattern}\n {...fieldProps}\n />\n )\n case 'textarea':\n return <FieldTextarea key={name} {...baseProps} maxLength={stringConstraints.maxLength} {...fieldProps} />\n case 'password':\n return <FieldPassword key={name} {...baseProps} {...fieldProps} />\n case 'passwordStrength':\n return <FieldPasswordStrength key={name} {...baseProps} {...fieldProps} />\n case 'editable':\n return <FieldEditable key={name} {...baseProps} {...fieldProps} />\n case 'richText':\n return <FieldRichText key={name} {...baseProps} {...fieldProps} />\n\n // Number fields\n case 'number':\n return (\n <FieldNumber\n key={name}\n {...baseProps}\n min={numberConstraints.min}\n max={numberConstraints.max}\n step={numberConstraints.step}\n {...fieldProps}\n />\n )\n case 'numberInput':\n return (\n <FieldNumberInput\n key={name}\n {...baseProps}\n min={numberConstraints.min}\n max={numberConstraints.max}\n step={numberConstraints.step}\n {...fieldProps}\n />\n )\n case 'slider':\n return (\n <FieldSlider\n key={name}\n {...baseProps}\n min={numberConstraints.min}\n max={numberConstraints.max}\n step={numberConstraints.step}\n {...fieldProps}\n />\n )\n case 'rating':\n return <FieldRating key={name} {...baseProps} {...fieldProps} />\n case 'currency':\n return <FieldCurrency key={name} {...baseProps} {...fieldProps} />\n case 'percentage':\n return <FieldPercentage key={name} {...baseProps} {...fieldProps} />\n\n // Date and time\n case 'date':\n return (\n <FieldDate\n key={name}\n {...baseProps}\n min={constraints?.date?.min}\n max={constraints?.date?.max}\n {...fieldProps}\n />\n )\n case 'time':\n return <FieldTime key={name} {...baseProps} {...fieldProps} />\n case 'dateRange':\n return <FieldDateRange key={name} {...baseProps} {...fieldProps} />\n case 'dateTimePicker':\n return <FieldDateTimePicker key={name} {...baseProps} {...fieldProps} />\n case 'duration':\n return <FieldDuration key={name} {...baseProps} {...fieldProps} />\n case 'schedule':\n return <FieldSchedule key={name} {...baseProps} {...fieldProps} />\n\n // Boolean fields\n case 'checkbox':\n return <FieldCheckbox key={name} {...baseProps} {...fieldProps} />\n case 'switch':\n return <FieldSwitch key={name} {...baseProps} {...fieldProps} />\n\n // Selection from list\n // Options resolved with priority: fieldProps.options > relationOptions > enumValues\n case 'select':\n return <FieldSelect key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'nativeSelect':\n return <FieldNativeSelect key={name} {...baseProps} options={nativeSelectOptions ?? []} {...fieldProps} />\n case 'combobox':\n return <FieldCombobox key={name} {...baseProps} {...fieldProps} />\n case 'autocomplete':\n return <FieldAutocomplete key={name} {...baseProps} {...fieldProps} />\n case 'listbox':\n return <FieldListbox key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'radioGroup':\n return <FieldRadioGroup key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'radioCard':\n return <FieldRadioCard key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'segmentedGroup':\n return <FieldSegmentedGroup key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'checkboxCard':\n return <FieldCheckboxCard key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'tags':\n return <FieldTags key={name} {...baseProps} {...fieldProps} />\n\n // Specialized fields\n case 'phone':\n return <FieldPhone key={name} {...baseProps} {...fieldProps} />\n case 'address': {\n // FieldAddress requires token from fieldProps\n const token = fieldProps.token as string | undefined\n if (!token) {\n console.warn(`Form.Field.Address \"${name}\" requires token in fieldProps`)\n }\n return <FieldAddress key={name} {...baseProps} token={token ?? ''} {...fieldProps} />\n }\n case 'pinInput':\n return <FieldPinInput key={name} {...baseProps} {...fieldProps} />\n case 'otpInput':\n return <FieldOTPInput key={name} {...baseProps} {...fieldProps} />\n case 'colorPicker':\n return <FieldColorPicker key={name} {...baseProps} {...fieldProps} />\n case 'fileUpload': {\n // FieldFileUpload requires label and helperText as string\n const labelStr = typeof label === 'string' ? label : String(label ?? '')\n const helperStr = typeof helperText === 'string' ? helperText : undefined\n return (\n <FieldFileUpload\n key={name}\n {...baseProps}\n label={labelStr || undefined}\n helperText={helperStr}\n {...fieldProps}\n />\n )\n }\n case 'maskedInput':\n return <FieldMaskedInput key={name} {...baseProps} {...fieldProps} />\n\n default:\n // Fallback to string\n return <FieldString key={name} {...baseProps} {...fieldProps} />\n }\n}\n\n/**\n * Render a field from SchemaFieldInfo\n * @param field - field information from schema\n * @param relationOptions - options from RelationFieldProvider (if available)\n */\nexport function renderSchemaField(field: SchemaFieldInfo, relationOptions?: RelationOption[]): ReactElement {\n const fieldType = resolveFieldType(field)\n\n return renderFieldByType(fieldType, {\n name: field.name,\n label: field.ui?.title,\n placeholder: field.ui?.placeholder,\n helperText: field.ui?.description,\n required: field.required,\n enumValues: field.enumValues,\n constraints: field.constraints,\n fieldProps: field.ui?.fieldProps,\n relationOptions,\n })\n}\n\n/**\n * Component for rendering a field with auto-loading relation options\n *\n * Uses RelationFieldProvider context for automatic loading of\n * options for fields with `relationMeta()`.\n *\n * @example\n * ```tsx\n * <RelationFieldProvider relations={[{ model: 'Category', useQuery: useFindManyCategory, labelField: 'name' }]}>\n * <SchemaFieldWithRelations field={categoryField} />\n * </RelationFieldProvider>\n * ```\n */\nexport function SchemaFieldWithRelations({ field }: { field: SchemaFieldInfo }): ReactElement {\n const relationContext = useRelationFieldContext()\n\n // Check if relation config exists in fieldProps\n const relationConfig = field.ui?.fieldProps?.relation as RelationFieldConfig | undefined\n\n // If relation config and context exist - get options\n let relationOptions: RelationOption[] | undefined\n if (relationConfig && relationContext) {\n const state = relationContext.getState(relationConfig.model)\n if (!state.isLoading && state.options.length > 0) {\n relationOptions = state.options\n }\n }\n\n return renderSchemaField(field, relationOptions)\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport { FormGroup } from '../../form-group'\nimport type { FormGroupDeclarativeProps } from '../types'\n\n/**\n * Form.Group - Creates a namespace for nested fields\n *\n * Wraps children in a FormGroup to build hierarchical field paths.\n * Nested groups create dot-notation paths (e.g., \"info.base.type\").\n *\n * @example\n * ```tsx\n * // Creates path: info.base.type\n * <Form.Group name=\"info\">\n * <Form.Group name=\"base\">\n * <Form.Field.String name=\"type\" />\n * </Form.Group>\n * </Form.Group>\n * ```\n */\nexport function FormGroupDeclarative({ name, children }: FormGroupDeclarativeProps): ReactElement {\n return <FormGroup name={name}>{children}</FormGroup>\n}\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { FormGroupListContextValue, FormGroupListItemContextValue } from '../types'\n\n/**\n * Context for Form.Group.List operations (add items)\n */\nexport const FormGroupListContext = createContext<FormGroupListContextValue | null>(null)\n\n/**\n * Context for Form.Group.List item operations (remove item)\n */\nexport const FormGroupListItemContext = createContext<FormGroupListItemContextValue | null>(null)\n\n/**\n * Hook to access Form.Group.List context\n * @throws Error if used outside of Form.Group.List\n */\nexport function useFormGroupListContext(): FormGroupListContextValue {\n const context = useContext(FormGroupListContext)\n if (!context) {\n throw new Error('useFormGroupListContext must be used inside Form.Group.List')\n }\n return context\n}\n\n/**\n * Hook to access Form.Group.List item context\n * @throws Error if used outside of Form.Group.List item\n */\nexport function useFormGroupListItemContext(): FormGroupListItemContextValue {\n const context = useContext(FormGroupListItemContext)\n if (!context) {\n throw new Error('useFormGroupListItemContext must be used inside Form.Group.List item')\n }\n return context\n}\n","'use client'\n\nimport { Button, IconButton } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useFormGroupListContext, useFormGroupListItemContext } from './form-group-list-context'\n\nexport interface ListButtonAddProps {\n /** Button text (default: \"+\") */\n children?: ReactNode\n /** Default value for new item (default: empty object or empty string) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultValue?: any\n /** Принудительно отkeyить кнопку (дополнительно к автоматическому maxItems) */\n disabled?: boolean\n}\n\n/**\n * Form.Group.List.Button.Add - Add new item to array\n *\n * Must be used inside Form.Group.List (typically in wrapper)\n *\n * Automatically отkeyается при достижении maxItems from Zod schema\n * (z.array().max(5) → button отkeyится при 5 elementах)\n *\n * @example\n * ```tsx\n * <Form.Group.List\n * name=\"items\"\n * wrapper={({ children }) => (\n * <VStack>\n * {children}\n * <Form.Group.List.Button.Add defaultValue={{ title: '' }}>\n * Add Item\n * </Form.Group.List.Button.Add>\n * </VStack>\n * )}\n * >\n * ...\n * </Form.Group.List>\n * ```\n */\nexport function ListButtonAdd({ children, defaultValue = {}, disabled }: ListButtonAddProps): ReactElement {\n const { pushValue, canAdd } = useFormGroupListContext()\n\n // Кнопка отkeyена if canAdd = false (достигнут maxItems) или disabled prop\n const isDisabled = disabled || !canAdd\n\n const handleAdd = () => {\n if (!isDisabled) {\n pushValue(defaultValue)\n }\n }\n\n if (children) {\n return (\n <Button type=\"button\" onClick={handleAdd} variant=\"outline\" size=\"sm\" disabled={isDisabled}>\n {children}\n </Button>\n )\n }\n\n return (\n <IconButton\n type=\"button\"\n onClick={handleAdd}\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Add item\"\n disabled={isDisabled}\n >\n +\n </IconButton>\n )\n}\n\nexport interface ListButtonRemoveProps {\n /** Button text (default: \"x\") */\n children?: ReactNode\n /** Принудительно отkeyить кнопку (дополнительно к автоматическому minItems) */\n disabled?: boolean\n}\n\n/**\n * Form.Group.List.Button.Remove - Remove current item from array\n *\n * Must be used inside Form.Group.List item (children)\n *\n * Automatically отkeyается при достижении minItems from Zod schema\n * (z.array().min(1) → button отkeyится при 1 elementе)\n *\n * @example\n * ```tsx\n * <Form.Group.List name=\"items\">\n * <HStack>\n * <Form.Field.String name=\"title\" />\n * <Form.Group.List.Button.Remove />\n * </HStack>\n * </Form.Group.List>\n * ```\n */\nexport function ListButtonRemove({ children, disabled }: ListButtonRemoveProps): ReactElement {\n const { remove } = useFormGroupListItemContext()\n const { canRemove } = useFormGroupListContext()\n\n // Кнопка отkeyена if canRemove = false (достигнут minItems) или disabled prop\n const isDisabled = disabled || !canRemove\n\n const handleRemove = () => {\n if (!isDisabled) {\n remove()\n }\n }\n\n if (children) {\n return (\n <Button type=\"button\" onClick={handleRemove} variant=\"outline\" size=\"sm\" colorPalette=\"red\" disabled={isDisabled}>\n {children}\n </Button>\n )\n }\n\n return (\n <IconButton\n type=\"button\"\n onClick={handleRemove}\n variant=\"outline\"\n size=\"sm\"\n colorPalette=\"red\"\n aria-label=\"Remove item\"\n disabled={isDisabled}\n >\n x\n </IconButton>\n )\n}\n","'use client'\n\nimport { Box, IconButton } from '@chakra-ui/react'\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { createContext, type CSSProperties, type ReactElement, type ReactNode, useContext } from 'react'\n\n/**\n * Context for drag handle - allows children to access drag listeners\n */\ninterface SortableItemContextValue {\n /** Attributes for the drag handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes: any\n /** Listeners for the drag handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n listeners: any\n /** Whether item is being dragged */\n isDragging: boolean\n}\n\nconst SortableItemContext = createContext<SortableItemContextValue | null>(null)\n\n/**\n * Hook to access sortable item context (for drag handle)\n */\nexport function useSortableItemContext(): SortableItemContextValue | null {\n return useContext(SortableItemContext)\n}\n\n/**\n * Props for SortableWrapper\n */\nexport interface SortableWrapperProps {\n /** Array of unique IDs for sortable items */\n items: string[]\n /** Callback when drag ends - receives old and new indices */\n onReorder: (oldIndex: number, newIndex: number) => void\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * Wrapper that provides DnD context for sortable list\n *\n * @example\n * ```tsx\n * <SortableWrapper items={['id-1', 'id-2']} onReorder={handleReorder}>\n * {items.map(item => (\n * <SortableItem key={item.id} id={item.id}>\n * <ItemContent />\n * </SortableItem>\n * ))}\n * </SortableWrapper>\n * ```\n */\nexport function SortableWrapper({ items, onReorder, children }: SortableWrapperProps): ReactElement {\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // Require 8px movement before drag starts\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (over && active.id !== over.id) {\n const oldIndex = items.indexOf(String(active.id))\n const newIndex = items.indexOf(String(over.id))\n\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(oldIndex, newIndex)\n }\n }\n }\n\n return (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {children}\n </SortableContext>\n </DndContext>\n )\n}\n\n/**\n * Props for SortableItem\n */\nexport interface SortableItemProps {\n /** Unique ID for this item */\n id: string\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * Individual sortable item wrapper\n *\n * Provides drag handle context to children via useSortableItemContext()\n *\n * @example\n * ```tsx\n * <SortableItem id=\"item-1\">\n * <DragHandle />\n * <Form.Field.String name=\"title\" />\n * </SortableItem>\n * ```\n */\nexport function SortableItem({ id, children }: SortableItemProps): ReactElement {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id })\n\n const style: CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n position: 'relative',\n }\n\n const contextValue: SortableItemContextValue = {\n attributes,\n listeners,\n isDragging,\n }\n\n return (\n <SortableItemContext.Provider value={contextValue}>\n <Box ref={setNodeRef} style={style}>\n {children}\n </Box>\n </SortableItemContext.Provider>\n )\n}\n\n/**\n * Props for DragHandle\n */\nexport interface DragHandleProps {\n /** Custom children (default: grip icon) */\n children?: ReactNode\n}\n\n/**\n * Drag handle component for sortable items\n *\n * Must be used inside SortableItem. Click and drag this to reorder.\n *\n * @example\n * ```tsx\n * <SortableItem id=\"item-1\">\n * <HStack>\n * <DragHandle />\n * <Form.Field.String name=\"title\" />\n * </HStack>\n * </SortableItem>\n * ```\n */\nexport function DragHandle({ children }: DragHandleProps): ReactElement | null {\n const context = useSortableItemContext()\n\n if (!context) {\n return null\n }\n\n const { attributes, listeners, isDragging } = context\n\n return (\n <IconButton\n {...attributes}\n {...listeners}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n cursor={isDragging ? 'grabbing' : 'grab'}\n aria-label=\"Drag to reorder\"\n _hover={{ bg: 'gray.100' }}\n _dark={{ _hover: { bg: 'gray.700' } }}\n >\n {children || '⋮⋮'}\n </IconButton>\n )\n}\n","'use client'\n\nimport { Fragment, type ReactElement, type ReactNode } from 'react'\nimport { FormGroup, useFormGroup } from '../../form-group'\nimport { DeclarativeFormContext, useDeclarativeForm } from '../form-context'\nimport { getZodConstraints } from '../schema-constraints'\nimport type {\n DeclarativeFormContextValue,\n FormGroupListContextValue,\n FormGroupListDeclarativeProps,\n FormGroupListItemContextValue,\n} from '../types'\nimport { FormGroupListContext, FormGroupListItemContext } from './form-group-list-context'\nimport { SortableItem, SortableWrapper } from './form-group-list-sortable'\n\n/**\n * Form.Group.List - Automatically iterates over array fields\n *\n * For object arrays: children are cloned for each element with FormGroup index\n * For primitive arrays: children without name get direct array index access\n *\n * Automatically extracts from Zod schema:\n * - `maxItems` from `z.array().max(5)` — disables Add button when limit is reached\n * - `minItems` from `z.array().min(1)` — disables Remove button when below minimum\n * - `helperText` hint \"Maximum 5 items\" (via Form.Group.List wrapper)\n *\n * Props always take priority over automatic values from the schema.\n *\n * @example Object array with auto constraints from Zod\n * ```tsx\n * // In schema: z.object({ tags: z.array(z.string()).min(1).max(5) })\n * <Form.Group.List\n * name=\"tags\"\n * wrapper={({ children }) => (\n * <VStack>\n * {children}\n * <Form.Group.List.Button.Add />\n * {/* Add button is automatically disabled at 5 items *\\/}\n * </VStack>\n * )}\n * >\n * <HStack>\n * <Form.Field.String />\n * <Form.Group.List.Button.Remove />\n * {/* Remove button is automatically disabled at 1 item *\\/}\n * </HStack>\n * </Form.Group.List>\n * ```\n */\nexport function FormGroupListDeclarative({\n name,\n children,\n emptyContent,\n wrapper,\n sortable = false,\n maxItems: maxItemsProp,\n minItems: minItemsProp,\n}: FormGroupListDeclarativeProps): ReactElement {\n const { form, schema } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full path from parent groups\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Extract constraints for the array\n const constraints = getZodConstraints(schema, fullPath)\n\n // Props take priority over constraints\n const maxItems = maxItemsProp ?? constraints.array?.maxItems\n const minItems = minItemsProp ?? constraints.array?.minItems\n\n // Use form.Field with mode=\"array\" for reactive array state\n return (\n <form.Field name={fullPath} mode=\"array\">\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(arrayField: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arrayValue = (arrayField.state.value as any[] | undefined) ?? []\n\n // Compute canAdd and canRemove based on constraints\n const canAdd = maxItems === undefined || arrayValue.length < maxItems\n const canRemove = minItems === undefined || arrayValue.length > minItems\n\n // List context for Add button - use arrayField methods\n const listContextValue: FormGroupListContextValue = {\n fullPath,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pushValue: (value: any) => arrayField.pushValue(value),\n length: arrayValue.length,\n maxItems,\n minItems,\n canAdd,\n canRemove,\n }\n\n // Handle drag end for sortable\n const handleReorder = (oldIndex: number, newIndex: number) => {\n arrayField.moveValue(oldIndex, newIndex)\n }\n\n // Generate IDs for sortable items\n const sortableIds = arrayValue.map((_, index) => `${fullPath}-${index}`)\n\n // Render single item\n const renderItem = (index: number): ReactNode => {\n // Form context with primitiveArrayIndex\n const formContextValue: DeclarativeFormContextValue = {\n form,\n schema,\n primitiveArrayIndex: index,\n }\n\n // Item context for Remove button - use arrayField.removeValue\n const itemContextValue: FormGroupListItemContextValue = {\n index,\n remove: () => arrayField.removeValue(index),\n }\n\n const itemContent = (\n <DeclarativeFormContext.Provider value={formContextValue}>\n <FormGroupListItemContext.Provider value={itemContextValue}>\n <FormGroup name={String(index)}>{children}</FormGroup>\n </FormGroupListItemContext.Provider>\n </DeclarativeFormContext.Provider>\n )\n\n // Wrap in SortableItem if sortable\n if (sortable) {\n return (\n <SortableItem key={sortableIds[index]} id={sortableIds[index]}>\n {itemContent}\n </SortableItem>\n )\n }\n\n return <Fragment key={index}>{itemContent}</Fragment>\n }\n\n // Render all items\n const renderItems = (): ReactNode => {\n if (arrayValue.length === 0 && emptyContent) {\n return emptyContent\n }\n\n const items = arrayValue.map((_, index) => renderItem(index))\n\n // Wrap in SortableWrapper if sortable\n if (sortable) {\n return (\n <SortableWrapper items={sortableIds} onReorder={handleReorder}>\n {items}\n </SortableWrapper>\n )\n }\n\n return items\n }\n\n // Wrap everything in FormGroup for path building\n const content = wrapper ? wrapper({ children: renderItems() }) : renderItems()\n\n return (\n <FormGroupListContext.Provider value={listContextValue}>\n <FormGroup name={name}>\n {/* Fragment needed when wrapper returns array */}\n <Fragment>{content}</Fragment>\n </FormGroup>\n </FormGroupListContext.Provider>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport type { ZodConstraints } from './schema-constraints'\nimport { getZodConstraints } from './schema-constraints'\nimport type { FieldUIMeta } from './types/meta-types'\nimport { unwrapSchema } from './zod-utils'\n\n/**\n * Schema field information for form auto-generation\n */\nexport interface SchemaFieldInfo {\n /** Full path to the field (e.g. \"user.address.city\") */\n path: string\n /** Field name (last path segment) */\n name: string\n /** Zod type: string, number, boolean, date, enum, object, array */\n zodType: string\n /** UI metadata from .meta({ ui: {...} }) */\n ui?: FieldUIMeta\n /** Required field (not optional/nullable) */\n required: boolean\n /** Constraints (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n /** Nested fields for object type */\n children?: SchemaFieldInfo[]\n /** Element information for array type */\n element?: SchemaFieldInfo\n /** Enum values for enum type */\n enumValues?: string[]\n}\n\n/**\n * Get Zod type from schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getZodType(schema: any): string {\n const unwrapped = unwrapSchema(schema)\n return unwrapped?._zod?.def?.type ?? 'unknown'\n}\n\n/**\n * Check if the field is required (not optional/nullable)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isRequired(schema: any): boolean {\n if (!schema?._zod?.def) {\n return true\n }\n\n const type = schema._zod.def.type\n if (type === 'optional' || type === 'nullable') {\n return false\n }\n if (type === 'default') {\n // default always has a value, considered not required for UI\n return false\n }\n\n return true\n}\n\n/**\n * Get UI metadata from schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getUIMeta(schema: any): FieldUIMeta | undefined {\n if (!schema?.meta) {\n return undefined\n }\n\n try {\n const meta = schema.meta()\n return meta?.ui as FieldUIMeta | undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Get enum values from schema\n * In Zod v4 we use schema.enum or schema.def.entries\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getEnumValues(schema: any): string[] | undefined {\n const unwrapped = unwrapSchema(schema)\n if (!unwrapped?._zod?.def) {\n return undefined\n }\n\n const type = unwrapped._zod.def.type\n\n if (type === 'enum') {\n // Zod v4: use .enum for getting values\n // schema.enum returns object { value: \"value\", ... }\n if (unwrapped.enum && typeof unwrapped.enum === 'object') {\n return Object.values(unwrapped.enum) as string[]\n }\n // Fallback to internal structure (for compatibility)\n if (unwrapped._zod.def.values) {\n return unwrapped._zod.def.values\n }\n // Zod v4 also has def.entries\n if (unwrapped._zod.def.entries) {\n return Object.values(unwrapped._zod.def.entries) as string[]\n }\n return undefined\n }\n\n if (type === 'literal') {\n const value = unwrapped._zod.def.value\n return typeof value === 'string' ? [value] : undefined\n }\n\n return undefined\n}\n\n// =============================================================================\n// Circular reference protection\n// =============================================================================\n\n/** Maximum recursion depth for infinite loop protection */\nconst MAX_TRAVERSAL_DEPTH = 20\n\n/**\n * Schema traversal context\n * Stores visited schemas and current depth for cycle protection\n */\ninterface TraversalContext {\n /** Set of visited schemas (for cycle detection) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n visited: WeakSet<any>\n /** Current recursion depth */\n depth: number\n}\n\n/**\n * Create a new traversal context\n */\nfunction createTraversalContext(): TraversalContext {\n return {\n visited: new WeakSet(),\n depth: 0,\n }\n}\n\n/**\n * Check if traversal can continue\n * Returns false if schema was already visited or maximum depth is reached\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction canTraverse(schema: any, ctx: TraversalContext): boolean {\n // Depth check\n if (ctx.depth >= MAX_TRAVERSAL_DEPTH) {\n console.warn(`schema-traversal: Maximum depth (${MAX_TRAVERSAL_DEPTH}) exceeded, stopping recursion`)\n return false\n }\n\n // Circular reference check\n if (schema && typeof schema === 'object' && ctx.visited.has(schema)) {\n console.warn('schema-traversal: Circular reference detected, stopping recursion')\n return false\n }\n\n return true\n}\n\n/**\n * Mark schema as visited\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction markVisited(schema: any, ctx: TraversalContext): void {\n if (schema && typeof schema === 'object') {\n ctx.visited.add(schema)\n }\n}\n\n// =============================================================================\n// Schema traversal functions\n// =============================================================================\n\n/**\n * Analyze an array element\n */\n\nfunction analyzeArrayElement(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod internal schema type\n elementSchema: any,\n parentPath: string,\n ctx: TraversalContext\n): SchemaFieldInfo | undefined {\n if (!canTraverse(elementSchema, ctx)) {\n return undefined\n }\n markVisited(elementSchema, ctx)\n\n const unwrapped = unwrapSchema(elementSchema)\n const zodType = getZodType(unwrapped)\n // For array elements the path is parent path + [*]\n const path = `${parentPath}[*]`\n\n const fieldInfo: SchemaFieldInfo = {\n path,\n name: '*',\n zodType,\n ui: getUIMeta(elementSchema),\n required: isRequired(elementSchema),\n constraints: {}, // Constraints for elements are determined separately\n }\n\n // If element is an object, recursively traverse its fields\n if (zodType === 'object' && unwrapped._zod?.def?.shape) {\n const children = traverseSchemaShape(unwrapped._zod.def.shape, path, { ...ctx, depth: ctx.depth + 1 })\n if (children.length > 0) {\n fieldInfo.children = children\n }\n }\n\n // If element is an enum\n if (zodType === 'enum' || zodType === 'literal') {\n fieldInfo.enumValues = getEnumValues(elementSchema)\n }\n\n return fieldInfo\n}\n\n/**\n * Traverse object shape and return field information\n */\n\nfunction traverseSchemaShape(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod internal shape type\n shape: Record<string, any>,\n parentPath = '',\n ctx: TraversalContext = createTraversalContext()\n): SchemaFieldInfo[] {\n const fields: SchemaFieldInfo[] = []\n\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n if (!canTraverse(fieldSchema, ctx)) {\n continue\n }\n markVisited(fieldSchema, ctx)\n\n const path = parentPath ? `${parentPath}.${fieldName}` : fieldName\n const unwrapped = unwrapSchema(fieldSchema)\n const zodType = getZodType(fieldSchema)\n\n const fieldInfo: SchemaFieldInfo = {\n path,\n name: fieldName,\n zodType,\n ui: getUIMeta(fieldSchema),\n required: isRequired(fieldSchema),\n constraints: getZodConstraints(fieldSchema, ''),\n }\n\n // Handle nested objects\n if (zodType === 'object' && unwrapped._zod?.def?.shape) {\n const children = traverseSchemaShape(unwrapped._zod.def.shape, path, { ...ctx, depth: ctx.depth + 1 })\n if (children.length > 0) {\n fieldInfo.children = children\n }\n }\n\n // Handle arrays\n if (zodType === 'array' && unwrapped._zod?.def?.element) {\n const element = analyzeArrayElement(unwrapped._zod.def.element, path, { ...ctx, depth: ctx.depth + 1 })\n if (element) {\n fieldInfo.element = element\n }\n }\n\n // Handle enum\n if (zodType === 'enum' || zodType === 'literal') {\n fieldInfo.enumValues = getEnumValues(fieldSchema)\n }\n\n fields.push(fieldInfo)\n }\n\n return fields\n}\n\n/**\n * Traverse Zod schema and return information about all fields\n *\n * @example\n * ```ts\n * const schema = z.object({\n * firstName: z.string().meta({ ui: { title: 'Name' } }),\n * address: z.object({\n * city: z.string(),\n * zip: z.string(),\n * }),\n * tags: z.array(z.string()),\n * })\n *\n * const fields = traverseSchema(schema)\n * // [\n * // { path: 'firstName', zodType: 'string', ui: { title: 'Name' }, ... },\n * // { path: 'address', zodType: 'object', children: [...] },\n * // { path: 'tags', zodType: 'array', element: { zodType: 'string' } },\n * // ]\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function traverseSchema(schema: any): SchemaFieldInfo[] {\n if (!schema?._zod?.def) {\n return []\n }\n\n const unwrapped = unwrapSchema(schema)\n const type = unwrapped._zod?.def?.type\n\n // Only support object at the top level\n if (type !== 'object' || !unwrapped._zod?.def?.shape) {\n return []\n }\n\n return traverseSchemaShape(unwrapped._zod.def.shape)\n}\n\n/**\n * Get flat list of all field paths (for include/exclude filtering)\n */\nexport function getFieldPaths(fields: SchemaFieldInfo[], recursive = true): string[] {\n const paths: string[] = []\n\n for (const field of fields) {\n paths.push(field.path)\n\n if (recursive && field.children) {\n paths.push(...getFieldPaths(field.children, recursive))\n }\n }\n\n return paths\n}\n\n/**\n * Filter fields by include/exclude\n */\nexport function filterFields(\n fields: SchemaFieldInfo[],\n options: { include?: string[]; exclude?: string[] }\n): SchemaFieldInfo[] {\n const { include, exclude } = options\n\n return fields.filter((field) => {\n // Check by field name for top-level filtering\n if (include && !include.includes(field.name)) {\n return false\n }\n if (exclude && exclude.includes(field.name)) {\n return false\n }\n return true\n })\n}\n","'use client'\n\nimport { VStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { Fragment } from 'react'\nimport { resolveFieldType, SchemaFieldWithRelations } from './field-type-mapper'\nimport { useDeclarativeForm } from './form-context'\nimport { FormGroupDeclarative } from './form-group/form-group-declarative'\nimport { ListButtonAdd, ListButtonRemove } from './form-group/form-group-list-buttons'\nimport { FormGroupListDeclarative } from './form-group/form-group-list-declarative'\nimport { filterFields, type SchemaFieldInfo, traverseSchema } from './schema-traversal'\n\n/**\n * Props for Form.AutoFields\n */\nexport interface AutoFieldsProps {\n /**\n * Include only specified fields (by name)\n * @example include={['firstName', 'lastName']}\n */\n include?: string[]\n /**\n * Exclude specified fields (by name)\n * @example exclude={['id', 'createdAt']}\n */\n exclude?: string[]\n /**\n * Recursively generate nested objects\n * @default true\n */\n recursive?: boolean\n /**\n * Custom wrapper for each field\n * @example fieldWrapper={({ name, children }) => <Box key={name} mb={4}>{children}</Box>}\n */\n fieldWrapper?: (props: { name: string; children: ReactNode }) => ReactElement\n}\n\n/**\n * Render a field or group based on SchemaFieldInfo\n */\nfunction renderField(\n field: SchemaFieldInfo,\n recursive: boolean,\n fieldWrapper?: (props: { name: string; children: ReactNode }) => ReactElement\n): ReactElement {\n const { name, zodType, ui } = field\n\n // Handle nested objects\n if (zodType === 'object' && field.children && recursive) {\n const content = (\n <FormGroupDeclarative key={name} name={name}>\n {field.children.map((child) => renderField(child, recursive, fieldWrapper))}\n </FormGroupDeclarative>\n )\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n\n // Handle object arrays\n if (zodType === 'array' && field.element?.zodType === 'object' && field.element.children) {\n const elementChildren = field.element.children\n const content = (\n <FormGroupListDeclarative\n key={name}\n name={name}\n emptyContent={<EmptyArrayContent label={ui?.title ?? name} />}\n wrapper={({ children }) => (\n <VStack align=\"stretch\" gap={2}>\n {children}\n <ListButtonAdd defaultValue={createDefaultValue(elementChildren)}>Add</ListButtonAdd>\n </VStack>\n )}\n >\n <VStack align=\"stretch\" gap={2} p={2} borderWidth={1} borderRadius=\"md\">\n {elementChildren.map((child) => renderField(child, recursive, fieldWrapper))}\n <ListButtonRemove>Remove</ListButtonRemove>\n </VStack>\n </FormGroupListDeclarative>\n )\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n\n // Handle primitive arrays -> Tags\n if (zodType === 'array' && field.element?.zodType === 'string') {\n const fieldType = resolveFieldType(field)\n if (fieldType === 'tags') {\n const content = <SchemaFieldWithRelations key={name} field={field} />\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n }\n\n // Regular field (with relation options support from RelationFieldProvider)\n const content = <SchemaFieldWithRelations key={name} field={field} />\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n}\n\n/**\n * Component for empty array\n */\nfunction EmptyArrayContent({ label }: { label: string }): ReactElement {\n return (\n <VStack py={4} color=\"fg.muted\">\n No items in "{label}"\n </VStack>\n )\n}\n\n/**\n * Create default value for an object array element\n */\nfunction createDefaultValue(children: SchemaFieldInfo[]): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n for (const child of children) {\n switch (child.zodType) {\n case 'string':\n result[child.name] = ''\n break\n case 'number':\n case 'int':\n case 'float':\n case 'bigint':\n result[child.name] = 0\n break\n case 'boolean':\n result[child.name] = false\n break\n case 'array':\n result[child.name] = []\n break\n case 'object':\n if (child.children) {\n result[child.name] = createDefaultValue(child.children)\n } else {\n result[child.name] = {}\n }\n break\n default:\n result[child.name] = undefined\n }\n }\n\n return result\n}\n\n/**\n * Form.AutoFields — automatic field generation from Zod schema\n *\n * The component reads the Zod schema from Form context and automatically generates\n * fields based on schema types and metadata.\n *\n * @example All fields\n * ```tsx\n * <Form schema={Schema} initialValue={data} onSubmit={save}>\n * <Form.AutoFields />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example With filtering\n * ```tsx\n * <Form schema={Schema} initialValue={data} onSubmit={save}>\n * <HStack>\n * <Form.AutoFields include={['firstName', 'lastName']} />\n * </HStack>\n * <Form.AutoFields exclude={['firstName', 'lastName']} />\n * <Form.Button.Submit />\n * </Form>\n * ```\n *\n * @example With custom wrapper\n * ```tsx\n * <Form.AutoFields fieldWrapper={({ name, children }) => (\n * <Box key={name} mb={4}>{children}</Box>\n * )} />\n * ```\n */\nexport function FormAutoFields({ include, exclude, recursive = true, fieldWrapper }: AutoFieldsProps): ReactElement {\n const { schema } = useDeclarativeForm()\n\n if (!schema) {\n throw new Error('Form.AutoFields requires schema prop on Form component')\n }\n\n // Traverse schema and get field information\n const allFields = traverseSchema(schema)\n\n // Filter fields\n const fields = filterFields(allFields, { include, exclude })\n\n return <Fragment>{fields.map((field) => renderField(field, recursive, fieldWrapper))}</Fragment>\n}\n\nFormAutoFields.displayName = 'FormAutoFields'\n","'use client'\n\nimport { Button } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useDeclarativeForm } from '../form-context'\n\n/**\n * Props for Reset button\n */\nexport interface ResetButtonProps {\n /** Button text (default: \"Reset\") */\n children?: ReactNode\n /** Whether button is disabled */\n disabled?: boolean\n /** Button variant (default: outline) */\n variant?: 'solid' | 'outline' | 'ghost' | 'plain'\n /** Button color palette */\n colorPalette?: string\n /** Callback after form is reset */\n onReset?: () => void\n}\n\n/**\n * Form.Button.Reset - Reset button to restore form to initial values\n *\n * Resets all form fields to their initial (default) values.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Button.Reset />\n * ```\n *\n * @example With custom text and callback\n * ```tsx\n * <Form.Button.Reset onReset={() => console.log('Form reset!')}>\n * Clear Form\n * </Form.Button.Reset>\n * ```\n *\n * @example Styled variant\n * ```tsx\n * <Form.Button.Reset variant=\"ghost\" colorPalette=\"red\">\n * Discard Changes\n * </Form.Button.Reset>\n * ```\n */\nexport function ButtonReset({\n children = 'Reset',\n disabled,\n variant = 'outline',\n colorPalette,\n onReset,\n}: ResetButtonProps): ReactElement {\n const { form } = useDeclarativeForm()\n\n const handleClick = () => {\n form.reset()\n onReset?.()\n }\n\n return (\n <form.Subscribe selector={(state: { canSubmit: boolean; isSubmitting: boolean }) => state.isSubmitting}>\n {(isSubmitting: boolean) => (\n <Button\n type=\"button\"\n variant={variant}\n colorPalette={colorPalette}\n disabled={disabled || isSubmitting}\n onClick={handleClick}\n >\n {children}\n </Button>\n )}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { Button } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport type { SubmitButtonProps } from '../types'\n\n/**\n * Form.Button.Submit - Submit button with automatic loading state\n *\n * Automatically shows loading spinner when form is submitting.\n *\n * @example\n * ```tsx\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * ```\n *\n * @example With styling\n * ```tsx\n * <Form.Button.Submit colorPalette=\"brand\" size=\"lg\">\n * Save Changes\n * </Form.Button.Submit>\n * ```\n */\nexport function ButtonSubmit({\n children = 'Submit',\n disabled,\n colorPalette,\n size,\n variant,\n width,\n}: SubmitButtonProps): ReactElement {\n const { form } = useDeclarativeForm()\n\n return (\n <form.Subscribe selector={(state: { isSubmitting: boolean }) => state.isSubmitting}>\n {(isSubmitting: boolean) => (\n <Button\n type=\"submit\"\n loading={isSubmitting}\n disabled={disabled || isSubmitting}\n colorPalette={colorPalette}\n size={size}\n variant={variant}\n width={width}\n >\n {children}\n </Button>\n )}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { createListCollection, Field, Portal, Select, Spinner } from '@chakra-ui/react'\nimport { type ReactElement, useEffect, useMemo, useRef, useState } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { BaseFieldProps, BaseOption, FieldSize } from '../../types'\nimport { FieldError, getFieldErrors, getOptionLabel, type ResolvedFieldProps, SelectionFieldLabel } from '../base'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/**\n * Options loading result\n */\nexport interface CascadingSelectLoadResult<T = string> {\n /** Loaded options */\n options: BaseOption<T>[]\n}\n\n/**\n * Props for CascadingSelect field\n */\nexport interface CascadingSelectFieldProps<TParent = string, TValue = string> extends BaseFieldProps {\n /**\n * Parent field name that this select depends on\n * @example \"country\" - load cities on country change\n */\n dependsOn: string\n /**\n * Function to load options when parent field changes\n * @param parentValue - Current value of the parent field\n * @returns Promise with options array or object with options\n */\n loadOptions: (\n parentValue: TParent | undefined\n ) => Promise<BaseOption<TValue>[]> | Promise<CascadingSelectLoadResult<TValue>>\n /**\n * Initial options (shown before parent value is selected)\n * @default []\n */\n initialOptions?: BaseOption<TValue>[]\n /**\n * Automatically clear value when parent changes\n * @default true\n */\n clearOnParentChange?: boolean\n /**\n * Disable field while parent is empty\n * @default true\n */\n disableWhenParentEmpty?: boolean\n /**\n * Show clear button (auto-determined: true if optional, false if required)\n */\n clearable?: boolean\n /**\n * Component size\n */\n size?: FieldSize\n /**\n * Visual variant\n */\n variant?: 'outline' | 'subtle'\n /**\n * Placeholder when parent value is empty\n */\n placeholderWhenDisabled?: string\n}\n\n/**\n * Internal component for rendering Select with loaded options\n */\ninterface CascadingSelectContentProps<TParent, TValue> {\n parentValue: TParent | undefined\n form: ReturnType<typeof useDeclarativeForm>['form']\n fullPath: string\n resolved: ResolvedFieldProps\n loadOptions: CascadingSelectFieldProps<TParent, TValue>['loadOptions']\n initialOptions: BaseOption<TValue>[]\n clearOnParentChange: boolean\n disableWhenParentEmpty: boolean\n clearable?: boolean\n size: FieldSize\n variant: 'outline' | 'subtle'\n placeholderWhenDisabled?: string\n}\n\nfunction CascadingSelectContent<TParent = string, TValue = string>({\n parentValue,\n form,\n fullPath,\n resolved,\n loadOptions,\n initialOptions,\n clearOnParentChange,\n disableWhenParentEmpty,\n clearable,\n size,\n variant,\n placeholderWhenDisabled,\n}: CascadingSelectContentProps<TParent, TValue>): ReactElement {\n // Options state and loading\n const [options, setOptions] = useState<BaseOption<TValue>[]>(initialOptions)\n const [isLoading, setIsLoading] = useState(false)\n\n // Ref for tracking previous parent value\n const prevParentValueRef = useRef<TParent | undefined>(parentValue)\n\n // Ref for stable loadOptions reference (avoid infinite loops with inline functions)\n const loadOptionsRef = useRef(loadOptions)\n loadOptionsRef.current = loadOptions\n\n // Effect for loading options when parentValue changes\n useEffect(() => {\n // Loading function\n const doLoad = async () => {\n if (parentValue === undefined || parentValue === null || parentValue === '') {\n setOptions(initialOptions)\n return\n }\n\n setIsLoading(true)\n try {\n const result = await loadOptionsRef.current(parentValue)\n // Support both formats: array or object with options\n const newOptions = Array.isArray(result) ? result : result.options\n setOptions(newOptions)\n } catch (error) {\n console.error('Error loading cascading select options:', error)\n setOptions([])\n } finally {\n setIsLoading(false)\n }\n }\n\n void doLoad()\n }, [parentValue, initialOptions])\n\n // Effect for clearing value when parent changes\n useEffect(() => {\n if (clearOnParentChange && prevParentValueRef.current !== parentValue) {\n // Clear field value if parent changed (not on first render)\n if (prevParentValueRef.current !== undefined) {\n form.setFieldValue(fullPath, '' as unknown)\n }\n prevParentValueRef.current = parentValue\n }\n }, [parentValue, clearOnParentChange, form, fullPath])\n\n // Determine if the field should be disabled\n const isParentEmpty = parentValue === undefined || parentValue === null || parentValue === ''\n const isDisabled = resolved.disabled || (disableWhenParentEmpty && isParentEmpty)\n\n // Determine placeholder\n const effectivePlaceholder = isParentEmpty && placeholderWhenDisabled ? placeholderWhenDisabled : resolved.placeholder\n\n // Auto-determine clearable\n const resolvedClearable = clearable ?? !resolved.required\n\n // Create collection from options\n const collection = useMemo(\n () =>\n createListCollection({\n items: options,\n itemToString: getOptionLabel,\n itemToValue: (item) => item.value as string,\n }),\n [options]\n )\n\n return (\n <form.Field name={fullPath}>\n {(field: {\n state: { value: unknown; meta: { errors?: unknown[] } }\n handleChange: (v: unknown) => void\n handleBlur: () => void\n }) => {\n const { hasError, errorMessage } = getFieldErrors(field)\n const currentValue = field.state.value as string | undefined\n\n return (\n <Field.Root invalid={hasError} required={resolved.required} disabled={isDisabled}>\n <Select.Root\n collection={collection}\n size={size}\n variant={variant}\n value={currentValue ? [currentValue] : []}\n onValueChange={(details) => {\n const newValue = details.value[0] as string | undefined\n field.handleChange(newValue ?? '')\n }}\n onInteractOutside={() => field.handleBlur()}\n disabled={isDisabled}\n data-field-name={fullPath}\n >\n <Select.HiddenSelect />\n {resolved.label && (\n <Select.Label>\n <SelectionFieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n </Select.Label>\n )}\n <Select.Control>\n <Select.Trigger>\n <Select.ValueText placeholder={effectivePlaceholder} />\n </Select.Trigger>\n <Select.IndicatorGroup>\n {isLoading && <Spinner size=\"xs\" />}\n {resolvedClearable && !isLoading && <Select.ClearTrigger />}\n <Select.Indicator />\n </Select.IndicatorGroup>\n </Select.Control>\n <Portal>\n <Select.Positioner>\n <Select.Content>\n {options.map((opt) => (\n <Select.Item item={opt} key={opt.value as string}>\n {getOptionLabel(opt)}\n <Select.ItemIndicator />\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Positioner>\n </Portal>\n </Select.Root>\n <FieldError hasError={!!hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n\n/**\n * Form.Field.CascadingSelect - Cascading select depending on another field\n *\n * Loads options dynamically based on another field's value.\n * Useful for linked lists like Country -> City, Category -> Subcategory.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Select\n * name=\"country\"\n * label=\"Country\"\n * options={countries}\n * />\n * <Form.Field.CascadingSelect\n * name=\"city\"\n * label=\"City\"\n * dependsOn=\"country\"\n * loadOptions={async (countryCode) => {\n * if (!countryCode) return []\n * const cities = await fetchCities(countryCode)\n * return cities.map(c => ({ label: c.name, value: c.id }))\n * }}\n * placeholderWhenDisabled=\"Select country first\"\n * />\n * ```\n *\n * @example Nested fields\n * ```tsx\n * <Form.Field.CascadingSelect\n * name=\"address.region\"\n * label=\"Region\"\n * dependsOn=\"address.country\"\n * loadOptions={loadRegions}\n * />\n * ```\n */\nexport function FieldCascadingSelect<TParent = string, TValue = string>(\n props: CascadingSelectFieldProps<TParent, TValue>\n): ReactElement {\n const {\n name,\n dependsOn,\n loadOptions,\n initialOptions = [],\n clearOnParentChange = true,\n disableWhenParentEmpty = true,\n clearable,\n size = 'md',\n variant = 'outline',\n placeholderWhenDisabled,\n ...baseProps\n } = props\n\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n const { form: _formFromProps, fullPath, ...resolvedRest } = useResolvedFieldProps(name, baseProps)\n\n const resolved: ResolvedFieldProps = {\n label: resolvedRest.label,\n placeholder: resolvedRest.placeholder,\n helperText: resolvedRest.helperText,\n tooltip: resolvedRest.tooltip,\n required: resolvedRest.required,\n disabled: resolvedRest.disabled,\n readOnly: resolvedRest.readOnly,\n constraints: resolvedRest.constraints,\n options: resolvedRest.options,\n }\n\n // Build full path to parent field\n const fullDependsOnPath = parentGroup ? `${parentGroup.name}.${dependsOn}` : dependsOn\n\n // Create selector for parent field value (inline, like in FormWhen)\n const parentSelector = (state: { values: Record<string, unknown> }): TParent | undefined => {\n const parts = fullDependsOnPath.split('.')\n let value: unknown = state.values\n for (const part of parts) {\n if (value && typeof value === 'object') {\n value = (value as Record<string, unknown>)[part]\n } else {\n value = undefined\n break\n }\n }\n return value as TParent | undefined\n }\n\n // Use form.Subscribe to subscribe to parent field changes\n return (\n <form.Subscribe selector={parentSelector}>\n {(parentValue: TParent | undefined) => (\n <CascadingSelectContent\n parentValue={parentValue}\n form={form}\n fullPath={fullPath}\n resolved={resolved}\n loadOptions={loadOptions}\n initialOptions={initialOptions as BaseOption<TValue>[]}\n clearOnParentChange={clearOnParentChange}\n disableWhenParentEmpty={disableWhenParentEmpty}\n clearable={clearable}\n size={size}\n variant={variant}\n placeholderWhenDisabled={placeholderWhenDisabled}\n />\n )}\n </form.Subscribe>\n )\n}\n\nFieldCascadingSelect.displayName = 'FieldCascadingSelect'\n","'use client'\n\nimport { Box, Field, Input, List, Spinner, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeFormOptional } from '../../form-context'\nimport type { CityFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel, useDebounce } from '../base'\nimport { createDaDataProvider } from './providers'\nimport type { AddressProvider, AddressSuggestion } from './providers'\n\n/**\n * Resolve address provider from props, context, token, or env fallback.\n */\nfunction useCityProvider(\n propProvider?: AddressProvider,\n token?: string,\n): AddressProvider | null {\n const formContext = useDeclarativeFormOptional()\n\n // Priority: prop > createForm context > token > env\n if (propProvider) return propProvider\n if (formContext?.addressProvider) return formContext.addressProvider\n if (token) return createDaDataProvider({ token })\n\n // Backward compatible: try env variable\n const envKey = typeof window !== 'undefined' ? process.env.NEXT_PUBLIC_DADATA_API_KEY : ''\n if (envKey) return createDaDataProvider({ token: envKey })\n\n return null\n}\n\n/**\n * City field state\n */\ninterface CityFieldState {\n inputValue: string\n setInputValue: (value: string) => void\n suggestions: AddressSuggestion[]\n setSuggestions: (suggestions: AddressSuggestion[]) => void\n isLoading: boolean\n setIsLoading: (loading: boolean) => void\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n containerRef: React.RefObject<HTMLDivElement | null>\n debouncedQuery: string\n}\n\n/**\n * Form.Field.City — city selection with autocomplete suggestions.\n *\n * Supports pluggable address providers. DaData (Russia) is built-in;\n * pass any `AddressProvider` for other geocoding services.\n * Uses bounds to restrict suggestions to city/settlement level.\n *\n * @example With provider (recommended)\n * ```tsx\n * <Form.Field.City name=\"city\" label=\"City\" provider={dadata} />\n * ```\n *\n * @example With token (backward compatible)\n * ```tsx\n * <Form.Field.City name=\"city\" token=\"your-token\" />\n * ```\n *\n * @example Auto-detect from env (NEXT_PUBLIC_DADATA_API_KEY)\n * ```tsx\n * <Form.Field.City name=\"city\" label=\"City\" />\n * ```\n */\nexport const FieldCity = createField<CityFieldProps, string, CityFieldState>({\n displayName: 'FieldCity',\n\n useFieldState: (props) => {\n const { provider: propProvider, token, minChars = 2, debounceMs = 300 } = props\n const provider = useCityProvider(propProvider, token)\n\n const [inputValue, setInputValue] = useState('')\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isOpen, setIsOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const debouncedQuery = useDebounce(inputValue, debounceMs)\n // Flag: just selected city, skip next fetch\n const justSelectedRef = useRef(false)\n // Flag: inputValue already initialized from field value\n const initializedRef = useRef(false)\n\n // Fetch city suggestions from provider\n const fetchSuggestions = useCallback(\n async (query: string) => {\n if (query.length < minChars || !provider) {\n setSuggestions([])\n return\n }\n\n setIsLoading(true)\n try {\n const results = await provider.getSuggestions(query, {\n count: 7,\n bounds: { from: 'city', to: 'settlement' },\n })\n setSuggestions(results)\n setIsOpen(results.length > 0)\n } catch (error) {\n console.error('Error loading city suggestions:', error)\n setSuggestions([])\n } finally {\n setIsLoading(false)\n }\n },\n [provider, minChars],\n )\n\n // Load on debounced query change\n useEffect(() => {\n if (justSelectedRef.current) {\n justSelectedRef.current = false\n return\n }\n\n if (debouncedQuery) {\n fetchSuggestions(debouncedQuery)\n } else {\n setSuggestions([])\n setIsOpen(false)\n }\n }, [debouncedQuery, fetchSuggestions])\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n return {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n setIsLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n debouncedQuery,\n justSelectedRef,\n initializedRef,\n } as CityFieldState & { justSelectedRef: React.RefObject<boolean>; initializedRef: React.RefObject<boolean> }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, fieldState }): ReactElement => {\n const {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n } = fieldState\n const { justSelectedRef, initializedRef } = fieldState as CityFieldState & {\n justSelectedRef: React.RefObject<boolean>\n initializedRef: React.RefObject<boolean>\n }\n\n const fieldValue = field.state.value as string | undefined\n\n // Initialize input value from field (once, without useEffect)\n if (!initializedRef.current && fieldValue && fieldValue !== inputValue) {\n initializedRef.current = true\n setInputValue(fieldValue)\n }\n\n // Handler for city selection\n const handleSelect = (suggestion: AddressSuggestion) => {\n // Extract city name from provider data, fallback to suggestion value\n const cityName = (suggestion.data?.city as string)\n || (suggestion.data?.settlement as string)\n || suggestion.value\n justSelectedRef.current = true\n setInputValue(cityName)\n setIsOpen(false)\n setSuggestions([])\n field.handleChange(cityName)\n }\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isOpen || suggestions.length === 0) {\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex < suggestions.length - 1 ? highlightedIndex + 1 : 0)\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex > 0 ? highlightedIndex - 1 : suggestions.length - 1)\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0) {\n handleSelect(suggestions[highlightedIndex])\n }\n break\n case 'Escape':\n setIsOpen(false)\n break\n }\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <Box ref={containerRef} position=\"relative\" width=\"100%\">\n <Input\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n setHighlightedIndex(-1)\n // If user erases text, update form value\n if (!e.target.value) {\n field.handleChange('')\n }\n }}\n onFocus={() => {\n if (suggestions.length > 0) {\n setIsOpen(true)\n }\n }}\n onBlur={() => {\n // If user typed without selecting from suggestions — save as is\n if (inputValue && inputValue !== (field.state.value as string)) {\n field.handleChange(inputValue)\n }\n field.handleBlur()\n }}\n onKeyDown={handleKeyDown}\n placeholder={resolved.placeholder ?? 'Enter city'}\n data-field-name={fullPath}\n />\n {isLoading && (\n <Box position=\"absolute\" right={3} top=\"50%\" transform=\"translateY(-50%)\">\n <Spinner size=\"sm\" />\n </Box>\n )}\n {isOpen && suggestions.length > 0 && (\n <List.Root\n position=\"absolute\"\n zIndex={10}\n width=\"100%\"\n bg=\"bg.panel\"\n borderWidth=\"1px\"\n borderRadius=\"md\"\n shadow=\"md\"\n maxH=\"250px\"\n overflowY=\"auto\"\n mt={1}\n listStyle=\"none\"\n >\n {suggestions.map((suggestion, index) => (\n <List.Item\n key={`${suggestion.value}-${index}`}\n px={3}\n py={2}\n cursor=\"pointer\"\n bg={highlightedIndex === index ? 'bg.muted' : undefined}\n _hover={{ bg: 'bg.muted' }}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n <Text fontSize=\"sm\">{suggestion.label}</Text>\n </List.Item>\n ))}\n </List.Root>\n )}\n </Box>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Box, Heading } from '@chakra-ui/react'\nimport JsonView from '@uiw/react-json-view'\nimport { githubDarkTheme } from '@uiw/react-json-view/githubDark'\nimport { githubLightTheme } from '@uiw/react-json-view/githubLight'\nimport type { ReactElement } from 'react'\nimport { useEffect, useState } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\nexport interface FormDebugValuesProps {\n /** Block title */\n title?: string\n /** Tree expansion depth (by default 2) */\n collapsed?: number\n /** Show in production (by default false) */\n showInProduction?: boolean\n}\n\n/** Detect dark theme via data-attribute (next-themes) or media query */\nfunction useIsDarkMode(): boolean {\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n // next-themes sets class or data-theme on <html>\n const check = () => {\n const html = document.documentElement\n const isDarkNow = html.classList.contains('dark')\n || html.getAttribute('data-theme') === 'dark'\n || html.style.colorScheme === 'dark'\n setIsDark(isDarkNow)\n }\n\n check()\n\n // Observe changes on <html>\n const observer = new MutationObserver(check)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'style'],\n })\n\n return () => observer.disconnect()\n }, [])\n\n return isDark\n}\n\n/**\n * Form.DebugValues — interactive JSON inspector for form values\n *\n * Automatically switches between dark and light theme.\n * Hidden in production by default. Use `showInProduction` for debugging in production.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" />\n * <Form.DebugValues />\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nexport function FormDebugValues({\n title = 'Form Values',\n collapsed = 2,\n showInProduction = false,\n}: FormDebugValuesProps): ReactElement | null {\n const { form } = useDeclarativeForm()\n const isDark = useIsDarkMode()\n\n // Hide in production unless specified otherwise\n if (process.env.NODE_ENV === 'production' && !showInProduction) {\n return null\n }\n\n const jsonTheme = isDark ? githubDarkTheme : githubLightTheme\n\n return (\n <form.Subscribe selector={(state: { values: unknown }) => state.values}>\n {(values: unknown) => (\n <Box\n borderWidth=\"1px\"\n borderColor=\"border.muted\"\n borderRadius=\"md\"\n p={3}\n mt={4}\n fontSize=\"sm\"\n fontFamily=\"mono\"\n bg=\"bg.subtle\"\n >\n {title && (\n <Heading size=\"xs\" mb={2} color=\"fg.muted\">\n {title}\n </Heading>\n )}\n <JsonView\n value={values as object}\n collapsed={collapsed}\n displayDataTypes={false}\n style={{ ...jsonTheme, backgroundColor: 'transparent' }}\n />\n </Box>\n )}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport type { ValidateOn } from '../types'\n\n/**\n * Строит object validators для TanStack Form based on validateOn prop.\n *\n * @param schema - Zod schema for validation\n * @param validateOn - режим(ы) валидации ('change' | 'blur' | 'submit' | 'mount')\n * @returns object validators для useAppForm или undefined if schema не указана\n *\n * @example\n * // Валидация on change (by default)\n * buildValidators(MySchema) // { onChange: MySchema }\n *\n * // Валидация при blur\n * buildValidators(MySchema, 'blur') // { onBlur: MySchema }\n *\n * // Множественные режимы\n * buildValidators(MySchema, ['change', 'blur']) // { onChange: MySchema, onBlur: MySchema }\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildValidators(schema: any, validateOn?: ValidateOn | ValidateOn[]): Record<string, any> | undefined {\n if (!schema) {\n return undefined\n }\n\n // По умолчанию — validation на onChange\n if (!validateOn) {\n return { onChange: schema }\n }\n\n // Нормализуем в array\n const modes = Array.isArray(validateOn) ? validateOn : [validateOn]\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validators: Record<string, any> = {}\n\n for (const mode of modes) {\n switch (mode) {\n case 'change':\n validators.onChange = schema\n break\n case 'blur':\n validators.onBlur = schema\n break\n case 'submit':\n validators.onSubmit = schema\n break\n case 'mount':\n validators.onMount = schema\n break\n }\n }\n\n return Object.keys(validators).length > 0 ? validators : undefined\n}\n","'use client'\n\nimport { Button, CloseButton, Dialog, Portal, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * Form persistence configuration\n */\nexport interface FormPersistenceConfig {\n /**\n * Unique key for localStorage\n * Must be unique per form to avoid conflicts\n */\n key: string\n\n /**\n * Debounce delay in milliseconds for saving\n * @default 500\n */\n debounceMs?: number\n\n /**\n * Draft time-to-live in milliseconds (TTL)\n * After TTL expires the draft is considered stale and automatically removed\n * @example 24 * 60 * 60 * 1000 // 24 hours\n * @default undefined — no time limit\n */\n ttl?: number\n\n /**\n * Dialog title\n * @default 'Restore saved data?'\n */\n dialogTitle?: string\n\n /**\n * Dialog description\n * @default 'You have unsaved changes from a previous session.'\n */\n dialogDescription?: string\n\n /**\n * Restore button text\n * @default 'Restore'\n */\n restoreButtonText?: string\n\n /**\n * Discard button text\n * @default 'Start fresh'\n */\n discardButtonText?: string\n\n /**\n * Clear draft button text (for ClearDraftButton)\n * @default 'Clear draft'\n */\n clearDraftButtonText?: string\n}\n\n/**\n * Storage format for localStorage data (with metadata)\n * @internal\n */\ninterface StoredData<TData> {\n /** Saved form data */\n data: TData\n /** Save timestamp */\n savedAt: number\n /** Format version (for future migration) */\n version: 1\n}\n\n/**\n * Result of useFormPersistence hook\n */\nexport interface FormPersistenceResult<TData> {\n /**\n * Whether saved data exists\n */\n hasSavedData: boolean\n\n /**\n * Saved data (if any)\n */\n savedData: TData | null\n\n /**\n * Draft save timestamp\n * Used for displaying \"Draft from 15:30\"\n */\n savedAt: number | null\n\n /**\n * Whether restore dialog is open\n */\n isDialogOpen: boolean\n\n /**\n * Whether user chose to restore\n */\n shouldRestore: boolean\n\n /**\n * Save current form values to localStorage\n */\n saveValues: (values: TData) => void\n\n /**\n * Clear saved data from localStorage\n */\n clearSavedData: () => void\n\n /**\n * Accept and restore saved data\n */\n acceptRestore: () => TData | null\n\n /**\n * Reject restore and start fresh\n */\n rejectRestore: () => void\n\n /**\n * Close dialog without action\n */\n closeDialog: () => void\n\n /**\n * Mark restore as complete (called after form.reset)\n */\n markRestoreComplete: () => void\n\n /**\n * Dialog component for rendering\n */\n RestoreDialog: () => ReactElement | null\n\n /**\n * Clear draft button component\n * Shown only when saved data exists\n */\n ClearDraftButton: () => ReactElement | null\n}\n\nconst STORAGE_PREFIX = 'form-persistence:'\n\n/**\n * Hook for persisting form data in localStorage\n *\n * Automatically saves form state and shows a dialog\n * to restore saved data when the form loads.\n *\n * @example\n * ```tsx\n * const persistence = useFormPersistence<MyFormData>({\n * key: 'my-form',\n * debounceMs: 500,\n * })\n *\n * // In form onSubmit:\n * const handleSubmit = (data) => {\n * await saveToServer(data)\n * persistence.clearSavedData() // Clear on success\n * }\n *\n * // Subscribe to form changes:\n * useEffect(() => {\n * return form.store.subscribe(() => {\n * persistence.saveValues(form.state.values)\n * })\n * }, [])\n * ```\n */\nexport function useFormPersistence<TData extends object>(config: FormPersistenceConfig): FormPersistenceResult<TData> {\n const {\n key,\n debounceMs = 500,\n ttl,\n dialogTitle = 'Restore saved data?',\n dialogDescription = 'You have unsaved changes from a previous session.',\n restoreButtonText = 'Restore',\n discardButtonText = 'Start fresh',\n clearDraftButtonText = 'Clear draft',\n } = config\n\n const storageKey = `${STORAGE_PREFIX}${key}`\n\n // State\n const [savedData, setSavedData] = useState<TData | null>(null)\n const [savedAt, setSavedAt] = useState<number | null>(null)\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n const [hasSavedData, setHasSavedData] = useState(false)\n const [shouldRestore, setShouldRestore] = useState(false)\n\n // Refs for debounce\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Load saved data on mount\n useEffect(() => {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n const stored = localStorage.getItem(storageKey)\n if (stored) {\n const parsed = JSON.parse(stored) as TData | StoredData<TData>\n\n // Check data format (new with version or old without)\n let data: TData\n let timestamp: number\n\n if (parsed && typeof parsed === 'object' && 'version' in parsed && parsed.version === 1) {\n // New format with metadata\n const storedData = parsed as StoredData<TData>\n data = storedData.data\n timestamp = storedData.savedAt\n\n // Check TTL\n if (ttl !== undefined) {\n const age = Date.now() - timestamp\n if (age > ttl) {\n // Data expired — remove\n localStorage.removeItem(storageKey)\n return\n }\n }\n } else {\n // Old format (for backward compatibility)\n data = parsed as TData\n timestamp = Date.now() // Unknown exact time, use current\n }\n\n setSavedData(data)\n setSavedAt(timestamp)\n setHasSavedData(true)\n setIsDialogOpen(true)\n }\n } catch {\n // Invalid JSON or localStorage error — ignore\n localStorage.removeItem(storageKey)\n }\n }, [storageKey, ttl])\n\n // Save values (with debounce)\n const saveValues = useCallback(\n (values: TData) => {\n // Don't save while restore dialog is still showing\n if (isDialogOpen) {\n return\n }\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // Set new deferred save\n debounceTimerRef.current = setTimeout(() => {\n try {\n const now = Date.now()\n const storedData: StoredData<TData> = {\n data: values,\n savedAt: now,\n version: 1,\n }\n localStorage.setItem(storageKey, JSON.stringify(storedData))\n setSavedAt(now)\n setHasSavedData(true)\n } catch {\n // localStorage may be full or disabled\n }\n }, debounceMs)\n },\n [storageKey, debounceMs, isDialogOpen]\n )\n\n // Clear saved data\n const clearSavedData = useCallback(() => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // Ignore errors\n }\n setSavedData(null)\n setSavedAt(null)\n setHasSavedData(false)\n }, [storageKey])\n\n // Accept restore\n const acceptRestore = useCallback(() => {\n setShouldRestore(true)\n setIsDialogOpen(false)\n // Keep savedData so the caller can use it\n return savedData\n }, [savedData])\n\n // Mark restore as complete (called after form.reset)\n const markRestoreComplete = useCallback(() => {\n setShouldRestore(false)\n clearSavedData()\n }, [clearSavedData])\n\n // Reject restore\n const rejectRestore = useCallback(() => {\n clearSavedData()\n setIsDialogOpen(false)\n }, [clearSavedData])\n\n // Close dialog\n const closeDialog = useCallback(() => {\n setIsDialogOpen(false)\n }, [])\n\n // Dialog component\n const RestoreDialog = useCallback((): ReactElement | null => {\n if (!hasSavedData) {\n return null\n }\n\n return (\n <Dialog.Root\n open={isDialogOpen}\n onOpenChange={(details) => {\n if (!details.open) {\n closeDialog()\n }\n }}\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>{dialogTitle}</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Text>{dialogDescription}</Text>\n </Dialog.Body>\n <Dialog.Footer gap={3}>\n <Button variant=\"outline\" onClick={rejectRestore}>\n {discardButtonText}\n </Button>\n <Button colorPalette=\"blue\" onClick={() => acceptRestore()}>\n {restoreButtonText}\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" onClick={rejectRestore} />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n )\n }, [\n hasSavedData,\n isDialogOpen,\n dialogTitle,\n dialogDescription,\n restoreButtonText,\n discardButtonText,\n closeDialog,\n rejectRestore,\n acceptRestore,\n ])\n\n // Clear draft button component\n const ClearDraftButton = useCallback((): ReactElement | null => {\n // Don't show if no saved data or restore dialog is open\n if (!hasSavedData || isDialogOpen) {\n return null\n }\n\n return (\n <Button variant=\"ghost\" size=\"sm\" colorPalette=\"red\" onClick={clearSavedData}>\n {clearDraftButtonText}\n </Button>\n )\n }, [hasSavedData, isDialogOpen, clearSavedData, clearDraftButtonText])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [])\n\n return {\n hasSavedData,\n savedData,\n savedAt,\n isDialogOpen,\n shouldRestore,\n saveValues,\n clearSavedData,\n acceptRestore,\n rejectRestore,\n closeDialog,\n markRestoreComplete,\n RestoreDialog,\n ClearDraftButton,\n }\n}\n\n/**\n * Props for FormWithPersistence component\n */\nexport interface FormPersistenceProps {\n /**\n * Persistence configuration\n */\n persistence?: FormPersistenceConfig\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useOfflineForm, type FormOfflineConfig } from '../../offline'\nimport { useFormPersistence, type FormPersistenceConfig } from '../form-persistence'\nimport type { FormOfflineState } from '../types'\n\n/**\n * Конфигурация для хука useFormFeatures\n */\nexport interface UseFormFeaturesConfig<TData extends object> {\n /** Конфигурация persistence (сохранение данных в localStorage) */\n persistence?: FormPersistenceConfig\n /** Конфигурация offline-режима */\n offline?: FormOfflineConfig\n /** Function for online submission (called on submit) */\n onlineSubmit: (value: TData) => Promise<void>\n}\n\n/**\n * Result хука useFormFeatures\n */\nexport interface UseFormFeaturesResult<TData extends object> {\n /** Вkeyена ли persistence */\n isPersistenceEnabled: boolean\n /** Вkeyён ли offline-режим */\n isOfflineEnabled: boolean\n /** Result persistence хука */\n persistenceResult: ReturnType<typeof useFormPersistence<TData>>\n /** Result offline хука */\n offlineForm: ReturnType<typeof useOfflineForm<TData>>\n /** State offline для contextа form */\n offlineState: FormOfflineState | undefined\n /** Handler submit with support for offline and persistence */\n handleSubmit: (value: TData) => Promise<void>\n /** Подписка на изменения form для persistence */\n subscribeToFormChanges: (form: {\n store: { subscribe: (fn: () => void) => { unsubscribe: () => void } | (() => void) }\n state: { values: unknown }\n }) => () => void\n /** Восстановление данных из persistence */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n restoreFormData: (form: { setFieldValue: (key: string, value: any) => void }) => void\n}\n\n/**\n * Hook, объединяющий логику persistence и offline для форм.\n * Устраняет дублирование between FormSimple и FormWithApi.\n *\n * @example\n * const features = useFormFeatures({\n * persistence: { key: 'my-form' },\n * offline: { actionType: 'FORM_SUBMIT' },\n * onlineSubmit: async (value) => {\n * await saveData(value)\n * }\n * })\n */\nexport function useFormFeatures<TData extends object>({\n persistence,\n offline,\n onlineSubmit,\n}: UseFormFeaturesConfig<TData>): UseFormFeaturesResult<TData> {\n const isPersistenceEnabled = !!persistence\n const isOfflineEnabled = !!offline\n\n // Hook persistence (if не вkeyён — используем disabled key)\n const persistenceResult = useFormPersistence<TData>(persistence ?? { key: '__disabled__' })\n\n // Wrapper для онлайн-отправки с очисткой persistence\n const offlineOnlineSubmit = useCallback(\n async (value: TData) => {\n try {\n await onlineSubmit(value)\n // Clear persistence on successful submit\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n return { success: true }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Error отправки' }\n }\n },\n [onlineSubmit, isPersistenceEnabled, persistenceResult]\n )\n\n // Hook offline (if вkeyён)\n const offlineForm = useOfflineForm<TData>({\n actionType: offline?.actionType ?? 'FORM_SUBMIT',\n onlineSubmit: offlineOnlineSubmit,\n onSuccess: () => {\n offline?.onSynced?.()\n // Очищаем persistence при успешной синхронизации\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n },\n onQueued: offline?.onQueued,\n onError: offline?.onSyncError,\n })\n\n // State offline для contextа form\n const offlineState: FormOfflineState | undefined = isOfflineEnabled\n ? {\n isOffline: offlineForm.isOffline,\n pendingCount: offlineForm.pendingCount,\n isProcessing: offlineForm.isProcessing,\n clearPersistence: isPersistenceEnabled ? persistenceResult.clearSavedData : undefined,\n }\n : undefined\n\n // Handler submit\n const handleSubmit = useCallback(\n async (value: TData): Promise<void> => {\n if (isOfflineEnabled) {\n // Use offline-aware submit\n await offlineForm.submit(value)\n } else {\n // Direct submit\n await onlineSubmit(value)\n // Clear persistence on success\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n }\n },\n [isOfflineEnabled, offlineForm, onlineSubmit, isPersistenceEnabled, persistenceResult]\n )\n\n // Подписка на изменения form для persistence\n const subscribeToFormChanges = useCallback(\n (form: {\n store: { subscribe: (fn: () => void) => { unsubscribe: () => void } | (() => void) }\n state: { values: unknown }\n }) => {\n if (!isPersistenceEnabled) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {}\n }\n\n const subscription = form.store.subscribe(() => {\n const values = form.state.values as TData\n persistenceResult.saveValues(values)\n })\n\n // Совместимость: @tanstack/store 0.9+ returns Subscription, ранние — () => void\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n },\n [isPersistenceEnabled, persistenceResult]\n )\n\n // Восстановление данных из persistence\n const restoreFormData = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (form: { setFieldValue: (key: string, value: any) => void }) => {\n if (!isPersistenceEnabled || !persistenceResult.shouldRestore || !persistenceResult.savedData) {\n return\n }\n\n // Применяем сохранённые значения\n const dataToRestore = persistenceResult.savedData as Record<string, unknown>\n for (const [key, value] of Object.entries(dataToRestore)) {\n form.setFieldValue(key, value)\n }\n\n // Отмечаем восстановление как завершённое after тика\n setTimeout(() => {\n persistenceResult.markRestoreComplete()\n }, 0)\n },\n [isPersistenceEnabled, persistenceResult]\n )\n\n return {\n isPersistenceEnabled,\n isOfflineEnabled,\n persistenceResult,\n offlineForm,\n offlineState,\n handleSubmit,\n subscribeToFormChanges,\n restoreFormData,\n }\n}\n","'use client'\n\nimport { type ReactElement, type ReactNode, useEffect, useMemo } from 'react'\nimport { useAppForm } from '../../form-hook'\nimport type { FormOfflineConfig } from '../../offline'\nimport { DeclarativeFormContext } from '../form-context'\nimport { FormDebugValues } from '../form-debug-values'\nimport type { FormPersistenceConfig } from '../form-persistence'\nimport type { DeclarativeFormContextValue, FormMiddleware, ValidateOn } from '../types'\nimport { buildValidators } from './form-validators'\nimport { useFormFeatures } from './use-form-features'\n\n/**\n * Props for FormSimple component\n */\nexport interface FormSimpleProps<TData extends object> {\n /** Initial form values */\n initialValue: TData\n /** Form submit handler */\n onSubmit: (data: TData) => void | Promise<void>\n /** Zod schema for validation */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Persistence configuration (localStorage) */\n persistence?: FormPersistenceConfig\n /** Offline mode configuration */\n offline?: FormOfflineConfig\n /** Validation mode(s) */\n validateOn?: ValidateOn | ValidateOn[]\n /** Disable all form fields */\n disabled?: boolean\n /** Read-only mode for all fields */\n readOnly?: boolean\n /** JSON value inspector: true = dev only, 'force' = also in production */\n debug?: boolean | 'force'\n /** Middleware for form event handling */\n middleware?: FormMiddleware<TData>\n /** Address suggestion provider for Form.Field.Address and Form.Field.City */\n addressProvider?: import('../form-fields/specialized/providers').AddressProvider\n /** Form content */\n children: ReactNode\n}\n\n/**\n * Simple form without API integration.\n * Used when a form with local data is needed.\n *\n * @example\n * <FormSimple\n * initialValue={{ name: '', email: '' }}\n * onSubmit={handleSubmit}\n * schema={UserSchema}\n * >\n * <Form.Field.String name=\"name\" label=\"Name\" />\n * <Form.Field.String name=\"email\" label=\"Email\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </FormSimple>\n */\nexport function FormSimple<TData extends object>({\n initialValue,\n onSubmit,\n schema,\n persistence,\n offline,\n validateOn,\n disabled,\n readOnly,\n debug,\n middleware,\n addressProvider,\n children,\n}: FormSimpleProps<TData>): ReactElement {\n // Use shared hook for persistence and offline\n const features = useFormFeatures<TData>({\n persistence,\n offline,\n onlineSubmit: async (value) => {\n await onSubmit(value)\n },\n })\n\n // Initialize form\n const form = useAppForm({\n defaultValues: initialValue,\n validators: buildValidators(schema, validateOn),\n onSubmit: async ({ value, formApi }) => {\n let dataToSubmit = value as TData\n\n // Apply beforeSubmit middleware\n if (middleware?.beforeSubmit) {\n const transformed = await middleware.beforeSubmit(dataToSubmit)\n if (transformed === undefined) {\n // Cancel submit\n return\n }\n dataToSubmit = transformed\n }\n\n try {\n await features.handleSubmit(dataToSubmit)\n\n // Call afterSuccess middleware\n if (middleware?.afterSuccess) {\n await middleware.afterSuccess(dataToSubmit)\n }\n\n // Reset form with current values to clear dirty state\n formApi.reset(dataToSubmit)\n } catch (error) {\n // Call onError middleware\n if (middleware?.onError) {\n await middleware.onError(error instanceof Error ? error : new Error(String(error)))\n }\n throw error\n }\n },\n })\n\n // Subscribe to changes for persistence\n useEffect(() => {\n return features.subscribeToFormChanges(form)\n }, [form, features])\n\n // Restore data from persistence\n useEffect(() => {\n if (\n !features.isPersistenceEnabled\n || !features.persistenceResult.shouldRestore\n || !features.persistenceResult.savedData\n ) {\n return\n }\n features.restoreFormData(form)\n }, [\n form,\n features,\n features.isPersistenceEnabled,\n features.persistenceResult.shouldRestore,\n features.persistenceResult.savedData,\n ])\n\n // Memoize context value to prevent unnecessary re-renders\n const contextValue = useMemo<DeclarativeFormContextValue>(\n () => ({\n form,\n schema,\n offlineState: features.offlineState,\n disabled,\n readOnly,\n addressProvider,\n }),\n [form, schema, features.offlineState, disabled, readOnly, addressProvider],\n )\n\n return (\n <DeclarativeFormContext.Provider value={contextValue}>\n {/* Data restore dialog */}\n {features.isPersistenceEnabled && <features.persistenceResult.RestoreDialog />}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n >\n {children}\n {debug && <FormDebugValues showInProduction={debug === 'force'} />}\n </form>\n </DeclarativeFormContext.Provider>\n )\n}\n","'use client'\n\nimport { useCallback, useMemo } from 'react'\nimport type { FormApiConfig, FormApiResult } from './types'\n\n/**\n * Hook for integrating ZenStack hooks with Form component\n *\n * Handles:\n * - Data fetching via query hook (only in edit mode)\n * - Create/update mutations\n * - Loading and pending states\n *\n * @example\n * ```tsx\n * const formApi = useFormApi({\n * id: 'abc123',\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * })\n *\n * // formApi.isEditMode - true if id provided\n * // formApi.data - loaded data\n * // formApi.submit(values) - calls create or update mutation\n * ```\n */\nexport function useFormApi<TData extends object>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config: FormApiConfig<TData, any>\n): FormApiResult<TData> {\n const isEditMode = !!config.id\n\n // Call query hook (always, but disabled in create mode)\n const queryResult = config.query.hook(\n {\n where: { id: config.id ?? '' },\n include: config.query.include,\n },\n { enabled: isEditMode }\n )\n\n // Call mutation hooks (always, hooks rules)\n const createMutation = config.mutations.create()\n const updateMutation = config.mutations.update()\n\n // Submit handler\n const submit = useCallback(\n async (values: TData) => {\n const mode = isEditMode ? 'update' : 'create'\n\n // Transform data if transformer provided, otherwise use raw values\n const data = config.transformData ? config.transformData(values, mode) : values\n\n if (isEditMode && config.id) {\n await updateMutation.mutateAsync({\n where: { id: config.id },\n data,\n })\n } else {\n await createMutation.mutateAsync({\n data,\n })\n }\n },\n [isEditMode, config.id, config.transformData, createMutation, updateMutation]\n )\n\n // Get mutation error (whichever one was used)\n const mutationError = isEditMode ? updateMutation.error : createMutation.error\n\n // ZenStack hooks may return data directly or wrapped in { data, meta }\n // Check if data is wrapped\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rawData = queryResult.data as any\n const actualData = rawData?.data !== undefined ? rawData.data : rawData\n\n return useMemo(\n () => ({\n isEditMode,\n isLoading: isEditMode ? queryResult.isLoading : false,\n isMutating: createMutation.isPending || updateMutation.isPending,\n data: actualData,\n error: queryResult.error,\n mutationError,\n submit,\n }),\n [\n isEditMode,\n queryResult.isLoading,\n actualData,\n queryResult.error,\n createMutation.isPending,\n updateMutation.isPending,\n mutationError,\n submit,\n ]\n )\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\n\n/**\n * Loading state for API-integrated forms.\n * Displayed while data is loading in edit mode.\n * Does not render children to avoid context errors in Field components.\n */\nexport function FormLoadingState(): ReactElement {\n return (\n <div style={{ opacity: 0.5, padding: '1rem' }}>\n <p>Loading form data...</p>\n </div>\n )\n}\n","'use client'\n\nimport { type ReactElement, type ReactNode, useEffect } from 'react'\nimport { useAppForm } from '../../form-hook'\nimport type { FormOfflineConfig } from '../../offline'\nimport { DeclarativeFormContext } from '../form-context'\nimport { FormDebugValues } from '../form-debug-values'\nimport type { FormPersistenceConfig } from '../form-persistence'\nimport type { DeclarativeFormContextValue, FormApiConfig, FormMiddleware, ValidateOn } from '../types'\nimport { useFormApi } from '../use-form-api'\nimport { FormLoadingState } from './form-loading-state'\nimport { buildValidators } from './form-validators'\nimport { useFormFeatures } from './use-form-features'\n\n/**\n * Props for FormWithApi component\n */\nexport interface FormWithApiProps<TData extends object> {\n /** API configuration (ZenStack) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: FormApiConfig<TData, any>\n /** Initial values (fallback while data is loading) */\n initialValue?: TData\n /** Additional handler after successful submission */\n onSubmit?: (data: TData) => void | Promise<void>\n /** Zod schema for validation */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Persistence configuration (localStorage) */\n persistence?: FormPersistenceConfig\n /** Offline mode configuration */\n offline?: FormOfflineConfig\n /** Validation mode(s) */\n validateOn?: ValidateOn | ValidateOn[]\n /** Disable all form fields */\n disabled?: boolean\n /** Read-only mode for all fields */\n readOnly?: boolean\n /** JSON value inspector: true = dev only, 'force' = also in production */\n debug?: boolean | 'force'\n /** Middleware for form event handling */\n middleware?: FormMiddleware<TData>\n /** Address suggestion provider for Form.Field.Address and Form.Field.City */\n addressProvider?: import('../form-fields/specialized/providers').AddressProvider\n /** Form content */\n children: ReactNode\n}\n\n/**\n * Form with ZenStack API integration.\n * Automatically loads data in edit mode,\n * uses create/update mutations for saving.\n *\n * @example\n * <FormWithApi\n * api={{\n * id: 'abc123', // empty = create, filled = edit\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * }}\n * schema={RecipeSchema}\n * onSubmit={(data) => console.log('Saved:', data)}\n * >\n * <Form.Field.String name=\"title\" label=\"Title\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </FormWithApi>\n */\nexport function FormWithApi<TData extends object>({\n api,\n initialValue,\n onSubmit,\n schema,\n persistence,\n offline,\n validateOn,\n disabled,\n readOnly,\n debug,\n middleware,\n addressProvider,\n children,\n}: FormWithApiProps<TData>): ReactElement {\n // Hook for API operations\n const formApi = useFormApi(api)\n\n // Use shared hook for persistence and offline\n const features = useFormFeatures<TData>({\n persistence,\n offline,\n onlineSubmit: async (value) => {\n // Call API mutation\n await formApi.submit(value)\n // Call user callback\n await onSubmit?.(value)\n },\n })\n\n // Determine initial values:\n // - Edit mode: use loaded data (or initialValue as fallback)\n // - Create mode: use initialValue (or empty object)\n const defaultValues = formApi.isEditMode\n ? (formApi.data ?? initialValue ?? ({} as TData))\n : (initialValue ?? ({} as TData))\n\n // Initialize form\n const form = useAppForm({\n defaultValues,\n validators: buildValidators(schema, validateOn),\n onSubmit: async ({ value, formApi: tanstackFormApi }) => {\n let dataToSubmit = value as TData\n\n // Apply beforeSubmit middleware\n if (middleware?.beforeSubmit) {\n const transformed = await middleware.beforeSubmit(dataToSubmit)\n if (transformed === undefined) {\n // Cancel submit\n return\n }\n dataToSubmit = transformed\n }\n\n try {\n await features.handleSubmit(dataToSubmit)\n\n // Call afterSuccess middleware\n if (middleware?.afterSuccess) {\n await middleware.afterSuccess(dataToSubmit)\n }\n\n // Reset form with current values to clear dirty state\n tanstackFormApi.reset(dataToSubmit)\n } catch (error) {\n // Call onError middleware\n if (middleware?.onError) {\n await middleware.onError(error instanceof Error ? error : new Error(String(error)))\n }\n throw error\n }\n },\n })\n\n // Subscribe to changes for persistence\n useEffect(() => {\n return features.subscribeToFormChanges(form)\n }, [form, features])\n\n // Restore data from persistence\n useEffect(() => {\n if (\n !features.isPersistenceEnabled\n || !features.persistenceResult.shouldRestore\n || !features.persistenceResult.savedData\n ) {\n return\n }\n features.restoreFormData(form)\n }, [\n form,\n features,\n features.isPersistenceEnabled,\n features.persistenceResult.shouldRestore,\n features.persistenceResult.savedData,\n ])\n\n // Data loading flag (edit mode)\n const dataLoaded = formApi.isEditMode && formApi.data && !formApi.isLoading\n\n // Build context value\n const contextValue: DeclarativeFormContextValue = {\n form,\n schema,\n // Export API state for components that need it\n apiState: {\n isEditMode: formApi.isEditMode,\n isLoading: formApi.isLoading,\n isMutating: formApi.isMutating,\n error: formApi.error,\n mutationError: formApi.mutationError,\n },\n offlineState: features.offlineState,\n disabled,\n readOnly,\n addressProvider,\n }\n\n // Show loading state in edit mode\n if (formApi.isLoading) {\n return <FormLoadingState />\n }\n\n return (\n <DeclarativeFormContext.Provider value={contextValue} key={dataLoaded ? 'loaded' : 'initial'}>\n {/* Data restore dialog */}\n {features.isPersistenceEnabled && <features.persistenceResult.RestoreDialog />}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n >\n {children}\n {debug && <FormDebugValues showInProduction={debug === 'force'} />}\n </form>\n </DeclarativeFormContext.Provider>\n )\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport type { FormPropsWithApi } from '../types'\nimport type { FormComponent } from './form-compound-types'\nimport { FormSimple } from './form-simple'\nimport { FormWithApi } from './form-with-api'\n\n// Re-export types for external use\nexport type {\n FormButtonComponents,\n FormComponent,\n FormFieldComponents,\n FormGroupComponent,\n FormGroupListComponent,\n FormStepsComponent,\n ListButtonComponents,\n} from './form-compound-types'\n\n// Re-export subcomponents\nexport { FormLoadingState } from './form-loading-state'\nexport { FormSimple, type FormSimpleProps } from './form-simple'\nexport { buildValidators } from './form-validators'\nexport { FormWithApi, type FormWithApiProps } from './form-with-api'\nexport { useFormFeatures, type UseFormFeaturesConfig, type UseFormFeaturesResult } from './use-form-features'\n\n/**\n * Root component for declarative forms.\n *\n * Supports two modes:\n * 1. **Simple mode** — provide initialValue and onSubmit\n * 2. **API mode** — provide api for automatic ZenStack integration\n *\n * @example Simple mode\n * ```tsx\n * <Form initialValue={{ title: '', count: 0 }} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" label=\"Title\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example API mode (ZenStack)\n * ```tsx\n * <Form\n * api={{\n * id: 'abc123', // empty = create, filled = edit\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * }}\n * schema={RecipeSchema}\n * onSubmit={(data) => console.log('Saved:', data)}\n * >\n * <Form.Field.String name=\"title\" />\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nfunction FormRoot<TData extends object>({\n api,\n initialValue,\n onSubmit,\n schema,\n persistence,\n offline,\n validateOn,\n disabled,\n readOnly,\n debug,\n children,\n}: FormPropsWithApi<TData>): ReactElement {\n // If api is provided — use FormWithApi, otherwise — simple form\n if (api) {\n return (\n <FormWithApi\n api={api}\n initialValue={initialValue}\n onSubmit={onSubmit}\n schema={schema}\n persistence={persistence}\n offline={offline}\n validateOn={validateOn}\n disabled={disabled}\n readOnly={readOnly}\n debug={debug}\n >\n {children}\n </FormWithApi>\n )\n }\n\n // Simple mode — initialValue is required\n if (!initialValue) {\n throw new Error('Form requires either api prop or initialValue prop')\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const noopSubmit = () => {}\n\n return (\n <FormSimple\n initialValue={initialValue}\n onSubmit={onSubmit ?? noopSubmit}\n schema={schema}\n persistence={persistence}\n offline={offline}\n validateOn={validateOn}\n disabled={disabled}\n readOnly={readOnly}\n debug={debug}\n >\n {children}\n </FormSimple>\n )\n}\n\n/**\n * Form as compound component.\n * Subcomponents (Field, Group, Button, Steps, etc.) are added in declarative/index.ts\n */\nexport const Form = FormRoot as unknown as FormComponent\n","'use client'\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { ButtonSubmit } from '../form-buttons'\nimport {\n FieldAuto,\n FieldCheckbox,\n FieldCurrency,\n FieldDate,\n FieldNativeSelect,\n FieldNumber,\n FieldPassword,\n FieldPercentage,\n FieldPhone,\n FieldRating,\n FieldSelect,\n FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTextarea,\n camelCaseToLabel,\n} from '../form-fields'\nimport { Form } from '../form-root'\nimport type { FormMiddleware, ValidateOn } from '../types'\nimport type { BaseOption } from '../types/option-types'\nimport type { FieldSize } from '../types/size-types'\n\n// =============================================================================\n// Field Config Types\n// =============================================================================\n\n/**\n * Base field configuration\n */\ninterface BaseFieldConfig {\n /** Field name (key in form data) */\n name: string\n /** Field label (if not specified, generated from name) */\n label?: string\n /** Placeholder */\n placeholder?: string\n /** Helper text below field */\n helperText?: string\n /** Required field */\n required?: boolean\n /** Disabled */\n disabled?: boolean\n /** Size */\n size?: FieldSize\n}\n\n/**\n * Text field configuration\n */\ninterface StringFieldConfig extends BaseFieldConfig {\n type: 'string'\n /** Maximum length */\n maxLength?: number\n}\n\n/**\n * Multiline field configuration\n */\ninterface TextareaFieldConfig extends BaseFieldConfig {\n type: 'textarea'\n /** Number of rows */\n rows?: number\n}\n\n/**\n * Number field configuration\n */\ninterface NumberFieldConfig extends BaseFieldConfig {\n type: 'number'\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step */\n step?: number\n}\n\n/**\n * Currency field configuration\n */\ninterface CurrencyFieldConfig extends BaseFieldConfig {\n type: 'currency'\n /** Currency code (by default 'RUB') */\n currency?: string\n}\n\n/**\n * Percentage field configuration\n */\ninterface PercentageFieldConfig extends BaseFieldConfig {\n type: 'percentage'\n}\n\n/**\n * Slider configuration\n */\ninterface SliderFieldConfig extends BaseFieldConfig {\n type: 'slider'\n min?: number\n max?: number\n step?: number\n}\n\n/**\n * Rating configuration\n */\ninterface RatingFieldConfig extends BaseFieldConfig {\n type: 'rating'\n /** Maximum value (by default 5) */\n max?: number\n}\n\n/**\n * Checkbox configuration\n */\ninterface CheckboxFieldConfig extends BaseFieldConfig {\n type: 'checkbox'\n}\n\n/**\n * Switch configuration\n */\ninterface SwitchFieldConfig extends BaseFieldConfig {\n type: 'switch'\n}\n\n/**\n * Select configuration\n */\ninterface SelectFieldConfig extends BaseFieldConfig {\n type: 'select'\n /** Options for selection */\n options: BaseOption[]\n /** Use NativeSelect */\n native?: boolean\n}\n\n/**\n * Date configuration\n */\ninterface DateFieldConfig extends BaseFieldConfig {\n type: 'date'\n}\n\n/**\n * Password configuration\n */\ninterface PasswordFieldConfig extends BaseFieldConfig {\n type: 'password'\n}\n\n/**\n * Phone configuration\n */\ninterface PhoneFieldConfig extends BaseFieldConfig {\n type: 'phone'\n}\n\n/**\n * Auto-field configuration (type determined from schema)\n */\ninterface AutoFieldConfig extends BaseFieldConfig {\n type: 'auto'\n}\n\n/**\n * Union type of field configuration\n */\nexport type FieldConfig =\n | StringFieldConfig\n | TextareaFieldConfig\n | NumberFieldConfig\n | CurrencyFieldConfig\n | PercentageFieldConfig\n | SliderFieldConfig\n | RatingFieldConfig\n | CheckboxFieldConfig\n | SwitchFieldConfig\n | SelectFieldConfig\n | DateFieldConfig\n | PasswordFieldConfig\n | PhoneFieldConfig\n | AutoFieldConfig\n\n// =============================================================================\n// Form Builder Config\n// =============================================================================\n\n/**\n * Form section for grouping fields\n */\nexport interface FormBuilderSection {\n /** Section title */\n title?: string\n /** Section description */\n description?: string\n /** Fields in section */\n fields: FieldConfig[]\n}\n\n/**\n * Form configuration for FormBuilder\n */\nexport interface FormBuilderConfig {\n /** Form fields (simple list) */\n fields?: FieldConfig[]\n /** Form sections (for grouping) */\n sections?: FormBuilderSection[]\n}\n\n// =============================================================================\n// Form Builder Props\n// =============================================================================\n\n/**\n * Props for FormBuilder\n */\nexport interface FormBuilderProps<TData extends object> {\n /** Form configuration */\n config: FormBuilderConfig\n /** Initial values */\n initialValue: TData\n /** Submit handler */\n onSubmit: (data: TData) => void | Promise<void>\n /** Zod schema for validation */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Validation mode */\n validateOn?: ValidateOn | ValidateOn[]\n /** Middleware */\n middleware?: FormMiddleware<TData>\n /** Disable all fields */\n disabled?: boolean\n /** Read only */\n readOnly?: boolean\n /** Submit button text */\n submitLabel?: string\n /** Additional content after fields */\n children?: ReactNode\n}\n\n// =============================================================================\n// Field Renderer\n// =============================================================================\n\n/**\n * Extracts base props from configuration\n */\nfunction getBaseProps(config: FieldConfig) {\n return {\n placeholder: config.placeholder,\n helperText: config.helperText,\n required: config.required,\n disabled: config.disabled,\n }\n}\n\n/**\n * Renders field by configuration\n */\nfunction renderField(config: FieldConfig): ReactElement {\n const { name, label } = config\n const resolvedLabel = label ?? camelCaseToLabel(name)\n const baseProps = getBaseProps(config)\n\n switch (config.type) {\n case 'string':\n return <FieldString key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'textarea':\n return <FieldTextarea key={name} name={name} label={resolvedLabel} rows={config.rows} {...baseProps} />\n\n case 'number':\n return (\n <FieldNumber key={name} name={name} label={resolvedLabel} min={config.min} max={config.max} {...baseProps} />\n )\n\n case 'currency':\n return <FieldCurrency key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'percentage':\n return <FieldPercentage key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'slider':\n return (\n <FieldSlider\n key={name}\n name={name}\n label={resolvedLabel}\n min={config.min}\n max={config.max}\n step={config.step}\n {...baseProps}\n />\n )\n\n case 'rating':\n return <FieldRating key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'checkbox':\n return <FieldCheckbox key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'switch':\n return <FieldSwitch key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'select':\n if (config.native) {\n // NativeSelect uses title instead of label\n const nativeOptions = config.options.map((opt) => ({\n title: opt.label,\n value: opt.value,\n }))\n return <FieldNativeSelect key={name} name={name} label={resolvedLabel} options={nativeOptions} {...baseProps} />\n }\n return <FieldSelect key={name} name={name} label={resolvedLabel} options={config.options} {...baseProps} />\n\n case 'date':\n return <FieldDate key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'password':\n return <FieldPassword key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'phone':\n return <FieldPhone key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'auto':\n return <FieldAuto key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n default:\n return <FieldString key={name} name={name} label={resolvedLabel} {...baseProps} />\n }\n}\n\n// =============================================================================\n// Form Builder Component\n// =============================================================================\n\n/**\n * Form.Builder - Form generation from JSON configuration\n *\n * Allows creating forms declaratively via configuration object\n * instead of writing JSX.\n *\n * @example Simple form\n * ```tsx\n * const config = {\n * fields: [\n * { type: 'string', name: 'firstName', label: 'Name' },\n * { type: 'string', name: 'lastName', label: 'Last Name' },\n * { type: 'string', name: 'email', label: 'Email', placeholder: 'email@example.com' },\n * { type: 'number', name: 'age', label: 'Age', min: 0, max: 120 },\n * { type: 'select', name: 'role', label: 'Role', options: [\n * { label: 'User', value: 'user' },\n * { label: 'Administrator', value: 'admin' },\n * ]},\n * ]\n * }\n *\n * <Form.Builder\n * config={config}\n * initialValue={{ firstName: '', lastName: '', email: '', age: 18, role: 'user' }}\n * onSubmit={handleSubmit}\n * />\n * ```\n *\n * @example With sections\n * ```tsx\n * const config = {\n * sections: [\n * {\n * title: 'Personal data',\n * fields: [\n * { type: 'string', name: 'firstName' },\n * { type: 'string', name: 'lastName' },\n * ]\n * },\n * {\n * title: 'Contacts',\n * fields: [\n * { type: 'string', name: 'email' },\n * { type: 'phone', name: 'phone' },\n * ]\n * },\n * ]\n * }\n *\n * <Form.Builder config={config} ... />\n * ```\n *\n * @example With auto-fields (type determined from Zod schema)\n * ```tsx\n * const config = {\n * fields: [\n * { type: 'auto', name: 'firstName' },\n * { type: 'auto', name: 'age' },\n * { type: 'auto', name: 'isActive' },\n * ]\n * }\n *\n * <Form.Builder config={config} schema={UserSchema} ... />\n * ```\n */\nexport function FormBuilder<TData extends object>({\n config,\n initialValue,\n onSubmit,\n schema,\n validateOn,\n middleware,\n disabled,\n readOnly,\n submitLabel = 'Save',\n children,\n}: FormBuilderProps<TData>): ReactElement {\n return (\n <Form\n initialValue={initialValue}\n onSubmit={onSubmit}\n schema={schema}\n validateOn={validateOn}\n middleware={middleware}\n disabled={disabled}\n readOnly={readOnly}\n >\n {/* Simple field list */}\n {config.fields?.map((fieldConfig) => renderField(fieldConfig))}\n\n {/* Sections with fields */}\n {config.sections?.map((section, sectionIndex) => (\n <div key={sectionIndex}>\n {section.title && <h3>{section.title}</h3>}\n {section.description && <p>{section.description}</p>}\n {section.fields.map((fieldConfig) => renderField(fieldConfig))}\n </div>\n ))}\n\n {/* Additional content */}\n {children}\n\n {/* Submit button */}\n <ButtonSubmit>{submitLabel}</ButtonSubmit>\n </Form>\n )\n}\n\nFormBuilder.displayName = 'FormBuilder'\n","'use client'\n\nimport { Alert, Box, List, Text } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\ninterface FormErrorsProps {\n /** Section title ошибок */\n title?: ReactNode\n /** Show errors before first submit attempt (by default false) */\n showBeforeSubmit?: boolean\n}\n\ninterface ZodIssue {\n message: string\n code?: string\n path?: string[]\n expected?: string\n}\n\ntype FieldErrors = Record<string, ZodIssue[]>\n\n/**\n * Extracts all error messages from TanStack Form + Zod structure\n * Format: { \"field.path\": [{ message: \"...\", code: \"...\", path: [...] }] }\n */\nfunction extractAllErrors(errors: unknown[]): string[] {\n const messages: string[] = []\n\n for (const error of errors) {\n if (!error) {\n continue\n }\n\n if (typeof error === 'string') {\n const trimmed = error.trim()\n if (trimmed) {\n messages.push(trimmed)\n }\n continue\n }\n\n if (typeof error === 'object') {\n // Process field errors object: { \"field.path\": [{ message: \"...\" }] }\n const fieldErrors = error as FieldErrors\n for (const [fieldPath, issues] of Object.entries(fieldErrors)) {\n if (Array.isArray(issues)) {\n for (const issue of issues) {\n if (issue.message) {\n messages.push(`${fieldPath}: ${issue.message}`)\n }\n }\n }\n }\n }\n }\n\n return messages\n}\n\n/**\n * Form.Errors - Displays all form validation errors\n *\n * Shows summary of all validation errors across all fields.\n * Only renders when errors are present.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" />\n * <Form.Errors />\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nexport function FormErrors({\n title = 'Please fix the following errors:',\n showBeforeSubmit = false,\n}: FormErrorsProps): ReactElement | null {\n const { form, apiState } = useDeclarativeForm()\n\n // Extract server error message if available\n const serverError = apiState?.mutationError\n // Some libraries (e.g., ZenStack) add info to Error\n const errorInfo = serverError && 'info' in serverError ? (serverError as { info?: { message?: string } }).info : null\n const serverErrorMessage = serverError ? serverError.message || errorInfo?.message || 'Server error' : null\n\n return (\n <form.Subscribe\n selector={(state: { errors: unknown[]; submissionAttempts: number }) => ({\n errors: state.errors,\n submissionAttempts: state.submissionAttempts,\n })}\n >\n {({ errors, submissionAttempts }: { errors: unknown[]; submissionAttempts: number }) => {\n // Do not show validation errors before first submit attempt (unless specified otherwise)\n const showValidationErrors = showBeforeSubmit || submissionAttempts > 0\n const validErrors = showValidationErrors ? extractAllErrors(errors) : []\n const hasErrors = validErrors.length > 0 || serverErrorMessage\n\n if (!hasErrors) {\n return null\n }\n\n return (\n <Alert.Root status=\"error\">\n <Alert.Indicator />\n <Box>\n <Alert.Title>{title}</Alert.Title>\n <Alert.Description>\n <List.Root>\n {serverErrorMessage && (\n <List.Item>\n <Text fontWeight=\"bold\">{serverErrorMessage}</Text>\n </List.Item>\n )}\n {validErrors.map((error, index) => (\n <List.Item key={index}>\n <Text>{error}</Text>\n </List.Item>\n ))}\n </List.Root>\n </Alert.Description>\n </Box>\n </Alert.Root>\n )\n }}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { HStack, VStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { FormOfflineConfig } from '../offline'\nimport { FormAutoFields } from './form-auto-fields'\nimport { ButtonReset } from './form-buttons/button-reset'\nimport { ButtonSubmit } from './form-buttons/button-submit'\nimport type { FormPersistenceConfig } from './form-persistence'\nimport { FormSimple } from './form-root'\nimport type { FormMiddleware, ValidateOn } from './types'\n\n/**\n * Props for Form.FromSchema\n */\nexport interface FormFromSchemaProps<TData extends object> {\n /**\n * Zod schema (required)\n * Used for validation and auto-generation of fields\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: any\n /**\n * Initial values form\n */\n initialValue: TData\n /**\n * Submit handler form\n */\n onSubmit: (data: TData) => void | Promise<void>\n /**\n * Submit button text\n * @default 'Save'\n */\n submitLabel?: ReactNode\n /**\n * Show reset button\n * @default false\n */\n showReset?: boolean\n /**\n * Reset button text\n * @default 'Reset'\n */\n resetLabel?: ReactNode\n /**\n * Exclude fields from auto-generation\n * @example exclude={['id', 'createdAt', 'updatedAt']}\n */\n exclude?: string[]\n /**\n * Validation mode\n */\n validateOn?: ValidateOn | ValidateOn[]\n /**\n * Middleware for processing form events\n */\n middleware?: FormMiddleware<TData>\n /**\n * Globally disable all fields\n */\n disabled?: boolean\n /**\n * Global read-only mode\n */\n readOnly?: boolean\n /**\n * localStorage persistence configuration\n */\n persistence?: FormPersistenceConfig\n /**\n * Offline mode configuration\n */\n offline?: FormOfflineConfig\n /**\n * JSON value inspector: true = dev only, 'force' = also in production\n */\n debug?: boolean | 'force'\n /**\n * Additional content before buttons\n */\n beforeButtons?: ReactNode\n /**\n * Additional content after buttons\n */\n afterButtons?: ReactNode\n /**\n * Gap between fields\n * @default 4\n */\n gap?: number\n}\n\n/**\n * Form.FromSchema — fully automatic form generation from Zod schema\n *\n * Creates a form with automatically generated fields based on\n * Zod schema types and metadata.\n *\n * @example Basic usage\n * ```tsx\n * const UserSchema = z.object({\n * firstName: z.string().meta({ ui: { title: 'Name' } }),\n * lastName: z.string().meta({ ui: { title: 'Last Name' } }),\n * email: z.string().email().meta({ ui: { title: 'Email' } }),\n * bio: z.string().meta({ ui: { title: 'About', fieldType: 'textarea' } }),\n * })\n *\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={{ firstName: '', lastName: '', email: '', bio: '' }}\n * onSubmit={saveUser}\n * submitLabel=\"Create User\"\n * />\n * ```\n *\n * @example With field exclusion and reset button\n * ```tsx\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={userData}\n * onSubmit={updateUser}\n * exclude={['id', 'createdAt']}\n * showReset\n * submitLabel=\"Update\"\n * resetLabel=\"Undo changes\"\n * />\n * ```\n *\n * @example With middleware and validation\n * ```tsx\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={data}\n * onSubmit={save}\n * validateOn=\"blur\"\n * middleware={{\n * afterSuccess: () => toaster.success({ title: 'Saved!' }),\n * onError: (e) => toaster.error({ title: e.message }),\n * }}\n * />\n * ```\n */\nexport function FormFromSchema<TData extends object>({\n schema,\n initialValue,\n onSubmit,\n submitLabel = 'Save',\n showReset = false,\n resetLabel = 'Reset',\n exclude,\n validateOn,\n middleware,\n disabled,\n readOnly,\n debug,\n persistence,\n offline,\n beforeButtons,\n afterButtons,\n gap = 4,\n}: FormFromSchemaProps<TData>): ReactElement {\n return (\n <FormSimple\n schema={schema}\n initialValue={initialValue}\n onSubmit={onSubmit}\n validateOn={validateOn}\n middleware={middleware}\n disabled={disabled}\n readOnly={readOnly}\n debug={debug}\n persistence={persistence}\n offline={offline}\n >\n <VStack align=\"stretch\" gap={gap}>\n {/* Automatically generated fields */}\n <FormAutoFields exclude={exclude} />\n\n {/* Additional content before buttons */}\n {beforeButtons}\n\n {/* Buttons */}\n <HStack justify=\"flex-end\" gap={2}>\n {showReset && <ButtonReset variant=\"outline\">{resetLabel}</ButtonReset>}\n <ButtonSubmit>{submitLabel}</ButtonSubmit>\n </HStack>\n\n {/* Additional content after buttons */}\n {afterButtons}\n </VStack>\n </FormSimple>\n )\n}\n\nFormFromSchema.displayName = 'FormFromSchema'\n","'use client'\n\nimport { createContext, type ReactNode, useContext } from 'react'\n\n/**\n * Information about a single step\n */\nexport interface StepInfo {\n /** Step index (0-based) */\n index: number\n /** Step title */\n title: string\n /** Optional description */\n description?: string\n /** Optional icon */\n icon?: ReactNode\n /** Field names in this step (for validation) */\n fieldNames: string[]\n /** Callback when entering the step */\n onEnter?: () => void\n /** Callback when leaving the step (can cancel transition) */\n onLeave?: (direction: StepDirection) => Promise<boolean> | boolean\n}\n\n/** Animation direction */\nexport type StepDirection = 'forward' | 'backward'\n\n/**\n * Context value for Form.Steps\n */\nexport interface FormStepsContextValue {\n /** Current step index (0-based) */\n currentStep: number\n /** Total number of steps */\n stepCount: number\n /** Registered steps info */\n steps: StepInfo[]\n /** Go to next step */\n goToNext: () => Promise<boolean>\n /** Go to previous step */\n goToPrev: () => void\n /** Go to specific step */\n goToStep: (step: number) => void\n /** Skip to end (completed state) without validation */\n skipToEnd: () => void\n /** Trigger form submission programmatically */\n triggerSubmit: () => void\n /** Check if can go to next step */\n canGoNext: boolean\n /** Check if can go to previous step */\n canGoPrev: boolean\n /** Whether all steps are completed */\n isCompleted: boolean\n /** Whether we're on the last step */\n isLastStep: boolean\n /** Whether we're on the first step */\n isFirstStep: boolean\n /** Register a step */\n registerStep: (step: StepInfo) => void\n /** Unregister a step */\n unregisterStep: (index: number) => void\n /** Validate fields on current step before navigation */\n validateOnNext: boolean\n /** Linear mode (must complete steps in order) */\n linear: boolean\n /** Orientation */\n orientation: 'horizontal' | 'vertical'\n /** Size */\n size: 'xs' | 'sm' | 'md' | 'lg'\n /** Variant */\n variant: 'solid' | 'subtle'\n /** Color palette */\n colorPalette: string\n /** Whether transition animations are enabled */\n animated: boolean\n /** Animation duration in seconds */\n animationDuration: number\n /** Direction of the last transition (for animation) */\n direction: StepDirection\n /** Hidden fields (excluded from validation via Form.When) */\n hiddenFields: Set<string>\n /** Hide fields from validation (called from Form.When when hiding) */\n hideFieldsFromValidation: (fieldNames: string[]) => void\n /** Show fields for validation (called from Form.When when showing) */\n showFieldsForValidation: (fieldNames: string[]) => void\n /** Callback on successful step completion */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /** Clear step persistence (call after successful submission) */\n clearStepPersistence: () => void\n}\n\nexport const FormStepsContext = createContext<FormStepsContextValue | null>(null)\n\n/**\n * Hook to access Form.Steps context\n * @throws Error if used outside of Form.Steps\n */\nexport function useFormStepsContext(): FormStepsContextValue {\n const context = useContext(FormStepsContext)\n if (!context) {\n throw new Error('useFormStepsContext must be used inside Form.Steps')\n }\n return context\n}\n","'use client'\n\nimport type { AnyFormApi } from '@tanstack/react-form'\nimport { useCallback, useRef, useState } from 'react'\nimport type { StepDirection, StepInfo } from './form-steps-context'\n\n/**\n * Parameters for useStepNavigation hook\n */\nexport interface UseStepNavigationParams {\n /** TanStack Form API */\n form: AnyFormApi\n /** Current step index */\n currentStep: number\n /** Total number of steps */\n stepCount: number\n /** Sorted steps */\n sortedSteps: StepInfo[]\n /** Hidden fields (excluded from validation) */\n hiddenFields: Set<string>\n /** Externally controlled step */\n controlledStep?: number\n /** Callback on step change */\n onStepChange?: (step: number) => void\n /** Callback on step completion */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /** Validate when navigating to next step */\n validateOnNext?: boolean\n /** Setter for internal step state */\n setInternalStep: (step: number) => void\n}\n\n/**\n * Result of useStepNavigation hook\n */\nexport interface UseStepNavigationResult {\n /** Transition direction (for animation) */\n direction: StepDirection\n /** Go to next step (with validation) */\n goToNext: () => Promise<boolean>\n /** Go to previous step */\n goToPrev: () => Promise<void>\n /** Go to specific step */\n goToStep: (step: number) => void\n /** Skip to end (without validation) */\n skipToEnd: () => void\n /** Trigger form submission */\n triggerSubmit: () => void\n /** Validate current step */\n validateCurrentStep: () => Promise<boolean>\n}\n\n/**\n * Hook for navigating between form steps\n *\n * Manages:\n * - Transitions between steps\n * - Validation before transition\n * - Animation direction\n * - Step callbacks (onEnter, onLeave)\n *\n * IMPORTANT: All callbacks use refs for unstable values (sortedSteps, stepCount,\n * currentStep, hiddenFields, onStepChange, onStepComplete). This prevents callback\n * recreation on each step registration, which caused an infinite loop:\n * registerStep -> new sortedSteps/stepCount -> new callbacks -> new contextValue ->\n * re-render -> re-registration -> infinite loop.\n */\nexport function useStepNavigation({\n form,\n currentStep,\n stepCount,\n sortedSteps,\n hiddenFields,\n controlledStep,\n onStepChange,\n onStepComplete,\n validateOnNext = true,\n setInternalStep,\n}: UseStepNavigationParams): UseStepNavigationResult {\n // Animation direction (for slide effect)\n const [direction, setDirection] = useState<StepDirection>('forward')\n\n // All unstable values via refs — callbacks are NEVER recreated\n const sortedStepsRef = useRef(sortedSteps)\n sortedStepsRef.current = sortedSteps\n\n const stepCountRef = useRef(stepCount)\n stepCountRef.current = stepCount\n\n const currentStepRef = useRef(currentStep)\n currentStepRef.current = currentStep\n\n const hiddenFieldsRef = useRef(hiddenFields)\n hiddenFieldsRef.current = hiddenFields\n\n const onStepChangeRef = useRef(onStepChange)\n onStepChangeRef.current = onStepChange\n\n const onStepCompleteRef = useRef(onStepComplete)\n onStepCompleteRef.current = onStepComplete\n\n const controlledStepRef = useRef(controlledStep)\n controlledStepRef.current = controlledStep\n\n const validateOnNextRef = useRef(validateOnNext)\n validateOnNextRef.current = validateOnNext\n\n // Validate current step fields (excluding hidden fields)\n\n const validateCurrentStep = useCallback(async (): Promise<boolean> => {\n if (!validateOnNextRef.current) {\n return true\n }\n\n const currentStepInfo = sortedStepsRef.current[currentStepRef.current]\n if (!currentStepInfo || currentStepInfo.fieldNames.length === 0) {\n return true\n }\n\n // Filter hidden fields — they should not be validated\n const visibleFieldNames = currentStepInfo.fieldNames.filter((name) => !hiddenFieldsRef.current.has(name))\n\n if (visibleFieldNames.length === 0) {\n return true\n }\n\n // Mark fields as touched to show errors\n for (const fieldName of visibleFieldNames) {\n form.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n // Validate each visible field on the current step\n for (const fieldName of visibleFieldNames) {\n await form.validateField(fieldName, 'change')\n }\n\n // Check for errors\n const state = form.store.state\n for (const fieldName of visibleFieldNames) {\n const fieldMeta = state.fieldMeta[fieldName]\n if (fieldMeta?.errors && fieldMeta.errors.length > 0) {\n return false\n }\n }\n\n return true\n }, [form])\n\n // Go to next step\n\n const goToNext = useCallback(async (): Promise<boolean> => {\n const isValid = await validateCurrentStep()\n if (!isValid) {\n return false\n }\n\n const step = currentStepRef.current\n const currentStepInfo = sortedStepsRef.current[step]\n\n // Call onLeave callback if exists (can cancel transition)\n if (currentStepInfo?.onLeave) {\n const canLeave = await currentStepInfo.onLeave('forward')\n if (!canLeave) {\n return false\n }\n }\n\n // Call onStepComplete callback\n if (onStepCompleteRef.current) {\n await onStepCompleteRef.current(step, form.state.values)\n }\n\n const nextStep = step + 1\n if (nextStep < stepCountRef.current) {\n setDirection('forward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(nextStep)\n }\n onStepChangeRef.current?.(nextStep)\n\n // Call onEnter callback of next step\n const nextStepInfo = sortedStepsRef.current[nextStep]\n if (nextStepInfo?.onEnter) {\n nextStepInfo.onEnter()\n }\n\n return true\n }\n return false\n }, [form, validateCurrentStep, setInternalStep])\n\n // Go to previous step\n\n const goToPrev = useCallback(async () => {\n const step = currentStepRef.current\n const prevStep = step - 1\n if (prevStep >= 0) {\n const currentStepInfo = sortedStepsRef.current[step]\n\n // Call onLeave callback if exists (can cancel transition)\n if (currentStepInfo?.onLeave) {\n const canLeave = await currentStepInfo.onLeave('backward')\n if (!canLeave) {\n return\n }\n }\n\n setDirection('backward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(prevStep)\n }\n onStepChangeRef.current?.(prevStep)\n\n // Call onEnter callback of previous step\n const prevStepInfo = sortedStepsRef.current[prevStep]\n if (prevStepInfo?.onEnter) {\n prevStepInfo.onEnter()\n }\n }\n }, [setInternalStep])\n\n // Go to specific step\n\n const goToStep = useCallback(\n (step: number) => {\n if (step >= 0 && step < stepCountRef.current) {\n setDirection(step > currentStepRef.current ? 'forward' : 'backward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(step)\n }\n onStepChangeRef.current?.(step)\n }\n },\n [setInternalStep]\n )\n\n // Skip to end (without validation)\n\n const skipToEnd = useCallback(() => {\n const count = stepCountRef.current\n setDirection('forward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(count) // Past last step — completed state\n }\n onStepChangeRef.current?.(count)\n }, [setInternalStep])\n\n // Programmatic form submission\n const triggerSubmit = useCallback(() => {\n form.handleSubmit()\n }, [form])\n\n return {\n direction,\n goToNext,\n goToPrev,\n goToStep,\n skipToEnd,\n triggerSubmit,\n validateCurrentStep,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef } from 'react'\n\nconst STORAGE_PREFIX = 'form-steps:'\n\n/**\n * Form step persistence configuration\n */\nexport interface StepPersistenceConfig {\n /**\n * Unique key for localStorage\n * Must be unique per form\n */\n key: string\n\n /**\n * Debounce delay for saving in milliseconds\n * @default 300\n */\n debounceMs?: number\n}\n\n/**\n * Result of useStepPersistence hook\n */\nexport interface UseStepPersistenceResult {\n /** Get persisted step from localStorage */\n getPersistedStep: () => number | null\n /** Clear persisted step */\n clearPersistence: () => void\n}\n\n/**\n * Hook for persisting current step in localStorage\n *\n * Saves and restores the current step index automatically.\n * Uses debounce to optimize writes.\n *\n * @example\n * ```tsx\n * const { getPersistedStep, clearPersistence } = useStepPersistence(\n * currentStep,\n * { key: 'my-form', debounceMs: 300 }\n * )\n * ```\n */\nexport function useStepPersistence(currentStep: number, config?: StepPersistenceConfig): UseStepPersistenceResult {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n // Use ref for config — prevents useEffect restart\n // on every render due to object reference change\n const configRef = useRef(config)\n configRef.current = config\n\n // Get persisted step on mount\n const getPersistedStep = useCallback((): number | null => {\n const cfg = configRef.current\n if (!cfg || typeof window === 'undefined') {\n return null\n }\n try {\n const stored = localStorage.getItem(`${STORAGE_PREFIX}${cfg.key}`)\n if (stored) {\n const parsed = parseInt(stored, 10)\n if (!isNaN(parsed) && parsed >= 0) {\n return parsed\n }\n }\n } catch {\n // Invalid or localStorage error — ignore\n }\n return null\n }, [])\n\n // Save step with debounce — depends only on currentStep\n useEffect(() => {\n const cfg = configRef.current\n if (!cfg || typeof window === 'undefined') {\n return\n }\n\n const debounceMs = cfg.debounceMs ?? 300\n\n // Cancel previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // Debounced save\n debounceTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${cfg.key}`, String(currentStep))\n } catch {\n // localStorage may be full or disabled\n }\n }, debounceMs)\n\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [currentStep])\n\n // Clear persistence (call after successful form submission)\n const clearPersistence = useCallback(() => {\n const cfg = configRef.current\n if (!cfg || typeof window === 'undefined') {\n return\n }\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n try {\n localStorage.removeItem(`${STORAGE_PREFIX}${cfg.key}`)\n } catch {\n // Ignore errors\n }\n }, [])\n\n return { getPersistedStep, clearPersistence }\n}\n","'use client'\n\nimport { useCallback, useMemo, useState } from 'react'\nimport type { StepInfo } from './form-steps-context'\n\n/**\n * Result of useStepState hook\n */\nexport interface UseStepStateResult {\n /** Registered steps, sorted by index */\n sortedSteps: StepInfo[]\n /** Number of steps */\n stepCount: number\n /** Register a step */\n registerStep: (step: StepInfo) => void\n /** Unregister a step */\n unregisterStep: (index: number) => void\n /** Hidden fields (excluded from validation) */\n hiddenFields: Set<string>\n /** Hide fields from validation */\n hideFieldsFromValidation: (fieldNames: string[]) => void\n /** Show fields for validation */\n showFieldsForValidation: (fieldNames: string[]) => void\n}\n\n/**\n * Hook for managing step state\n *\n * Manages:\n * - Step registration/unregistration\n * - Sorting steps by index\n * - Hidden fields (for Form.When integration)\n *\n * @example\n * ```tsx\n * const {\n * sortedSteps,\n * stepCount,\n * registerStep,\n * unregisterStep,\n * hiddenFields,\n * hideFieldsFromValidation,\n * showFieldsForValidation\n * } = useStepState()\n * ```\n */\nexport function useStepState(): UseStepStateResult {\n // Registered steps\n const [steps, setSteps] = useState<StepInfo[]>([])\n\n // Hidden fields (excluded from validation via Form.When)\n const [hiddenFields, setHiddenFields] = useState<Set<string>>(new Set())\n\n // Sort steps by index\n const sortedSteps = useMemo(() => [...steps].sort((a, b) => a.index - b.index), [steps])\n\n const stepCount = sortedSteps.length\n\n // Register step (with change detection — prevents unnecessary re-renders)\n const registerStep = useCallback((step: StepInfo) => {\n setSteps((prev) => {\n const existing = prev.findIndex((s) => s.index === step.index)\n if (existing >= 0) {\n const old = prev[existing]\n // Compare significant fields — if unchanged, don't update state\n if (\n old.title === step.title &&\n old.description === step.description &&\n old.fieldNames.length === step.fieldNames.length &&\n old.fieldNames.every((f, i) => f === step.fieldNames[i])\n ) {\n return prev // No changes — return the same object\n }\n const next = [...prev]\n next[existing] = step\n return next\n }\n return [...prev, step]\n })\n }, [])\n\n // Unregister step\n const unregisterStep = useCallback((index: number) => {\n setSteps((prev) => prev.filter((s) => s.index !== index))\n }, [])\n\n // Hide fields from validation (called from Form.When when hiding)\n const hideFieldsFromValidation = useCallback((fieldNames: string[]) => {\n setHiddenFields((prev) => {\n const next = new Set(prev)\n for (const name of fieldNames) {\n next.add(name)\n }\n return next\n })\n }, [])\n\n // Show fields for validation (called from Form.When when showing)\n const showFieldsForValidation = useCallback((fieldNames: string[]) => {\n setHiddenFields((prev) => {\n const next = new Set(prev)\n for (const name of fieldNames) {\n next.delete(name)\n }\n return next\n })\n }, [])\n\n return {\n sortedSteps,\n stepCount,\n registerStep,\n unregisterStep,\n hiddenFields,\n hideFieldsFromValidation,\n showFieldsForValidation,\n }\n}\n","'use client'\n\nimport { Steps } from '@chakra-ui/react'\nimport { type ReactNode, useCallback, useMemo, useRef, useState } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport { FormStepsContext, type FormStepsContextValue } from './form-steps-context'\nimport { useStepNavigation } from './use-step-navigation'\nimport { type StepPersistenceConfig, useStepPersistence } from './use-step-persistence'\nimport { useStepState } from './use-step-state'\n\nexport type { StepPersistenceConfig }\n\nexport interface FormStepsProps {\n /** Form.Steps content (Step, Indicator, Navigation, CompletedContent) */\n children: ReactNode\n /** Initial step index (0-based) */\n defaultStep?: number\n /** Controlled step index */\n step?: number\n /** Callback when step changes */\n onStepChange?: (step: number) => void\n /** Whether to validate current step fields before moving to next */\n validateOnNext?: boolean\n /** Linear mode - must complete steps in order (no skipping) */\n linear?: boolean\n /** Orientation */\n orientation?: 'horizontal' | 'vertical'\n /** Size */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Variant */\n variant?: 'solid' | 'subtle'\n /** Color palette */\n colorPalette?: string\n /** Enable slide animations when transitioning between steps */\n animated?: boolean\n /** Animation duration in seconds (default 0.3) */\n animationDuration?: number\n /** Callback on successful step completion (called after validation, before transition) */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /**\n * Enable localStorage persistence for step progress.\n * Saves and restores the current step index automatically.\n *\n * @example\n * ```tsx\n * <Form.Steps\n * stepPersistence={{\n * key: 'instructor-onboarding',\n * debounceMs: 500,\n * }}\n * >\n * ```\n */\n stepPersistence?: StepPersistenceConfig\n}\n\n/**\n * Form.Steps - Multi-step form container\n *\n * Wraps Chakra UI Steps with form validation integration.\n * Validates fields on current step before allowing navigation to next step.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.Steps>\n * <Form.Steps.Indicator />\n *\n * <Form.Steps.Step title=\"Personal\">\n * <Form.Field.String name=\"firstName\" label=\"First Name\" />\n * <Form.Field.String name=\"lastName\" label=\"Last Name\" />\n * </Form.Steps.Step>\n *\n * <Form.Steps.Step title=\"Contact\">\n * <Form.Field.String name=\"email\" label=\"Email\" />\n * </Form.Steps.Step>\n *\n * <Form.Steps.CompletedContent>\n * All done! Review your data.\n * </Form.Steps.CompletedContent>\n *\n * <Form.Steps.Navigation />\n * </Form.Steps>\n * </Form>\n * ```\n */\nexport function FormSteps({\n children,\n defaultStep = 0,\n step: controlledStep,\n onStepChange,\n validateOnNext = true,\n linear = false,\n orientation = 'horizontal',\n size = 'md',\n variant = 'solid',\n colorPalette = 'brand',\n animated = false,\n animationDuration = 0.3,\n onStepComplete,\n stepPersistence,\n}: FormStepsProps) {\n const { form } = useDeclarativeForm()\n\n // Persistence hook\n const { getPersistedStep, clearPersistence } = useStepPersistence(0, stepPersistence)\n\n // Step state (uses persisted value if available)\n const [internalStep, setInternalStep] = useState(() => {\n const persisted = getPersistedStep()\n return persisted ?? defaultStep\n })\n const currentStep = controlledStep ?? internalStep\n\n // Step state hook (step registration, hidden fields)\n const {\n sortedSteps,\n stepCount,\n registerStep,\n unregisterStep,\n hiddenFields,\n hideFieldsFromValidation,\n showFieldsForValidation,\n } = useStepState()\n\n // Persistence: save step changes\n useStepPersistence(currentStep, stepPersistence)\n\n // Navigation hook\n const { direction, goToNext, goToPrev, goToStep, skipToEnd, triggerSubmit } = useStepNavigation({\n form,\n currentStep,\n stepCount,\n sortedSteps,\n hiddenFields,\n controlledStep,\n onStepChange,\n onStepComplete,\n validateOnNext,\n setInternalStep,\n })\n\n // Refs for unstable values — prevents contextValue recreation\n // on each step registration (sortedSteps and hiddenFields change on registration)\n const sortedStepsRef = useRef(sortedSteps)\n sortedStepsRef.current = sortedSteps\n\n const hiddenFieldsRef = useRef(hiddenFields)\n hiddenFieldsRef.current = hiddenFields\n\n const onStepCompleteRef = useRef(onStepComplete)\n onStepCompleteRef.current = onStepComplete\n\n // Context value — depends only on stable values\n // sortedSteps, hiddenFields and onStepComplete via refs\n const contextValue: FormStepsContextValue = useMemo(\n () => ({\n currentStep,\n stepCount,\n // Getter for steps — returns current value via ref\n get steps() {\n return sortedStepsRef.current\n },\n goToNext,\n goToPrev,\n goToStep,\n skipToEnd,\n triggerSubmit,\n canGoNext: currentStep < stepCount - 1,\n canGoPrev: currentStep > 0,\n isCompleted: currentStep >= stepCount,\n isLastStep: currentStep === stepCount - 1,\n isFirstStep: currentStep === 0,\n registerStep,\n unregisterStep,\n validateOnNext,\n linear,\n orientation,\n size,\n variant,\n colorPalette,\n animated,\n animationDuration,\n direction,\n get hiddenFields() {\n return hiddenFieldsRef.current\n },\n hideFieldsFromValidation,\n showFieldsForValidation,\n get onStepComplete() {\n return onStepCompleteRef.current\n },\n clearStepPersistence: clearPersistence,\n }),\n // IMPORTANT: sortedSteps, hiddenFields, onStepComplete NOT in deps —\n // accessed via refs/getters, prevents infinite loop\n\n [\n currentStep,\n stepCount,\n goToNext,\n goToPrev,\n goToStep,\n skipToEnd,\n triggerSubmit,\n clearPersistence,\n registerStep,\n unregisterStep,\n validateOnNext,\n linear,\n orientation,\n size,\n variant,\n colorPalette,\n animated,\n animationDuration,\n direction,\n hideFieldsFromValidation,\n showFieldsForValidation,\n ]\n )\n\n // Handle step change from Chakra Steps\n const handleStepChange = useCallback(\n (details: { step: number }) => {\n // In linear mode, only allow going to previous steps or next if valid\n if (linear && details.step > currentStep) {\n // Don't allow skipping - must use goToNext which validates\n return\n }\n goToStep(details.step)\n },\n [linear, currentStep, goToStep]\n )\n\n return (\n <FormStepsContext.Provider value={contextValue}>\n <Steps.Root\n step={currentStep}\n onStepChange={handleStepChange}\n count={stepCount}\n orientation={orientation}\n size={size}\n variant={variant}\n colorPalette={colorPalette}\n linear={linear}\n >\n {children}\n </Steps.Root>\n </FormStepsContext.Provider>\n )\n}\n","'use client'\n\nimport { Steps } from '@chakra-ui/react'\nimport type { ReactNode } from 'react'\n\nexport interface FormStepsCompletedContentProps {\n /** Content to show when all steps are completed */\n children: ReactNode\n}\n\n/**\n * Form.Steps.CompletedContent - Content shown after all steps are completed\n *\n * This content is displayed when the user has gone past the last step.\n * Useful for showing a summary or confirmation message.\n *\n * @example\n * ```tsx\n * <Form.Steps.CompletedContent>\n * <Text>All steps complete! Review your data below.</Text>\n * <FormSummary />\n * </Form.Steps.CompletedContent>\n * ```\n */\nexport function FormStepsCompletedContent({ children }: FormStepsCompletedContentProps) {\n return <Steps.CompletedContent>{children}</Steps.CompletedContent>\n}\n\nFormStepsCompletedContent.displayName = 'FormStepsCompletedContent'\n","'use client'\n\nimport { Box, Steps } from '@chakra-ui/react'\nimport { LuCheck } from 'react-icons/lu'\nimport { useFormStepsContext } from './form-steps-context'\n\nexport interface FormStepsIndicatorProps {\n /** Custom completed icon (default: check mark) */\n completedIcon?: React.ReactNode\n /** Show step descriptions in indicator */\n showDescriptions?: boolean\n /** Allow clicking on steps to navigate (disabled in linear mode) */\n clickable?: boolean\n}\n\n/**\n * Form.Steps.Indicator - Step progress indicator\n *\n * Displays a horizontal or vertical stepper showing progress through form steps.\n * Automatically reads step information from registered Form.Steps.Step components.\n *\n * @example\n * ```tsx\n * <Form.Steps>\n * <Form.Steps.Indicator showDescriptions />\n * ...\n * </Form.Steps>\n * ```\n */\nexport function FormStepsIndicator({\n completedIcon = <LuCheck />,\n showDescriptions = false,\n clickable = true,\n}: FormStepsIndicatorProps) {\n const { steps, linear } = useFormStepsContext()\n\n // In linear mode, clicking is disabled\n const isClickable = clickable && !linear\n\n return (\n <Steps.List>\n {steps.map((step) => (\n <Steps.Item key={step.index} index={step.index}>\n {isClickable ? (\n <Steps.Trigger>\n <Steps.Indicator>\n <Steps.Status complete={completedIcon} incomplete={step.icon || <Steps.Number />} />\n </Steps.Indicator>\n {showDescriptions && step.description ? (\n <Box>\n <Steps.Title>{step.title}</Steps.Title>\n <Steps.Description>{step.description}</Steps.Description>\n </Box>\n ) : (\n <Steps.Title>{step.title}</Steps.Title>\n )}\n </Steps.Trigger>\n ) : (\n <>\n <Steps.Indicator>\n <Steps.Status complete={completedIcon} incomplete={step.icon || <Steps.Number />} />\n </Steps.Indicator>\n {showDescriptions && step.description ? (\n <Box>\n <Steps.Title>{step.title}</Steps.Title>\n <Steps.Description>{step.description}</Steps.Description>\n </Box>\n ) : (\n <Steps.Title>{step.title}</Steps.Title>\n )}\n </>\n )}\n <Steps.Separator />\n </Steps.Item>\n ))}\n </Steps.List>\n )\n}\n\nFormStepsIndicator.displayName = 'FormStepsIndicator'\n","'use client'\n\nimport { Button, ButtonGroup, type ButtonProps } from '@chakra-ui/react'\nimport { type ReactNode, useCallback, useState } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport { useFormStepsContext } from './form-steps-context'\n\nexport interface FormStepsNavigationProps {\n /** Label for previous button */\n prevLabel?: ReactNode\n /** Label for next button */\n nextLabel?: ReactNode\n /** Label for submit button (shown on last step) */\n submitLabel?: ReactNode\n /** Label for skip button */\n skipLabel?: ReactNode\n /** Show previous button */\n showPrev?: boolean\n /** Show next/submit button */\n showNext?: boolean\n /** Show skip button (allows skipping all steps to end) */\n showSkip?: boolean\n /** Button size */\n size?: ButtonProps['size']\n /** Button variant for prev button */\n prevVariant?: ButtonProps['variant']\n /** Button variant for next/submit button */\n nextVariant?: ButtonProps['variant']\n /** Button variant for skip button */\n skipVariant?: ButtonProps['variant']\n /** Color palette for buttons */\n colorPalette?: string\n /** Gap between buttons */\n gap?: number | string\n /** Callback after successful step change */\n onStepChange?: (step: number) => void\n /** Callback when form is submitted */\n onSubmit?: () => void\n /** Callback when skip is clicked (if returns false, skip is cancelled) */\n onSkip?: () => Promise<boolean> | boolean | void\n}\n\n/**\n * Form.Steps.Navigation - Navigation buttons for multi-step form\n *\n * Provides Previous/Next buttons with automatic validation.\n * On the last step, shows Submit button instead of Next.\n *\n * @example\n * ```tsx\n * <Form.Steps.Navigation\n * prevLabel=\"Back\"\n * nextLabel=\"Continue\"\n * submitLabel=\"Create Account\"\n * />\n * ```\n */\nexport function FormStepsNavigation({\n prevLabel = 'Back',\n nextLabel = 'Next',\n submitLabel = 'Submit',\n skipLabel = 'Skip',\n showPrev = true,\n showNext = true,\n showSkip = false,\n size = 'md',\n prevVariant = 'outline',\n nextVariant = 'solid',\n skipVariant = 'ghost',\n colorPalette = 'brand',\n gap = 2,\n onStepChange,\n onSubmit,\n onSkip,\n}: FormStepsNavigationProps) {\n const { form } = useDeclarativeForm()\n const { goToNext, goToPrev, skipToEnd, isFirstStep, isLastStep, canGoPrev, currentStep } = useFormStepsContext()\n\n const [isNavigating, setIsNavigating] = useState(false)\n const [isSkipping, setIsSkipping] = useState(false)\n const [isSubmittingForm, setIsSubmittingForm] = useState(false)\n\n // Handle next button click\n const handleNext = useCallback(async () => {\n setIsNavigating(true)\n try {\n const success = await goToNext()\n if (success) {\n onStepChange?.(currentStep + 1)\n }\n } finally {\n setIsNavigating(false)\n }\n }, [goToNext, currentStep, onStepChange])\n\n // Handle prev button click\n const handlePrev = useCallback(() => {\n goToPrev()\n onStepChange?.(currentStep - 1)\n }, [goToPrev, currentStep, onStepChange])\n\n // Handle submit - trigger form submission with double-click protection\n const handleSubmit = useCallback(async () => {\n if (isSubmittingForm) {\n return\n }\n setIsSubmittingForm(true)\n try {\n onSubmit?.()\n await form.handleSubmit()\n } finally {\n setIsSubmittingForm(false)\n }\n }, [form, onSubmit, isSubmittingForm])\n\n // Handle skip button click\n const handleSkip = useCallback(async () => {\n setIsSkipping(true)\n try {\n // Call onSkip callback if provided\n if (onSkip) {\n const result = await onSkip()\n // If onSkip returns false, cancel skip\n if (result === false) {\n return\n }\n }\n skipToEnd()\n } finally {\n setIsSkipping(false)\n }\n }, [onSkip, skipToEnd])\n\n return (\n <ButtonGroup gap={gap}>\n {showPrev && (\n <Button\n variant={prevVariant}\n size={size}\n onClick={handlePrev}\n disabled={isFirstStep || !canGoPrev || isNavigating || isSkipping}\n colorPalette={colorPalette}\n >\n {prevLabel}\n </Button>\n )}\n\n {showSkip && (\n <Button\n variant={skipVariant}\n size={size}\n onClick={handleSkip}\n loading={isSkipping}\n disabled={isNavigating}\n colorPalette={colorPalette}\n >\n {skipLabel}\n </Button>\n )}\n\n {showNext &&\n (isLastStep ? (\n <Button\n type=\"submit\"\n variant={nextVariant}\n size={size}\n colorPalette={colorPalette}\n onClick={handleSubmit}\n loading={isSubmittingForm}\n disabled={isSubmittingForm || isNavigating || isSkipping}\n >\n {submitLabel}\n </Button>\n ) : (\n <Button\n variant={nextVariant}\n size={size}\n onClick={handleNext}\n loading={isNavigating}\n colorPalette={colorPalette}\n >\n {nextLabel}\n </Button>\n ))}\n </ButtonGroup>\n )\n}\n\nFormStepsNavigation.displayName = 'FormStepsNavigation'\n","'use client'\n\nimport { Steps } from '@chakra-ui/react'\nimport { AnimatePresence, motion, type Variants } from 'framer-motion'\nimport { Children, isValidElement, type ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport { FormGroupDeclarative } from '../form-group/form-group-declarative'\nimport { type StepInfo, useFormStepsContext } from './form-steps-context'\n\n/**\n * Step display condition\n */\nexport interface StepWhenCondition<TValue = unknown> {\n /** Field to watch */\n field: string\n /** Show step when value equals */\n is?: TValue\n /** Show step when value is NOT equal */\n isNot?: TValue\n /** Show step when value is in array */\n in?: TValue[]\n /** Show step when value is NOT in array */\n notIn?: TValue[]\n /** Custom condition function */\n condition?: (value: TValue) => boolean\n}\n\nexport interface FormStepsStepProps {\n /** Step title shown in indicator */\n title: string\n /** Optional description shown in indicator */\n description?: string\n /** Optional icon for the step */\n icon?: ReactNode\n /** Step content (form fields) */\n children: ReactNode\n /** Callback when entering the step */\n onEnter?: () => void\n /** Callback when leaving the step (can cancel transition by returning false) */\n onLeave?: (direction: 'forward' | 'backward') => Promise<boolean> | boolean\n /** Step display condition (step is shown only if condition is true) */\n when?: StepWhenCondition\n /**\n * Segment name for automatic Form.Group wrapping.\n * When provided, all fields inside this step will be automatically\n * namespaced under this segment (e.g., segment=\"profile\" makes\n * name=\"firstName\" resolve to \"profile.firstName\").\n *\n * @example\n * ```tsx\n * <Form.Steps.Step title=\"Profile\" segment=\"profile\">\n * <Form.Field.String name=\"firstName\" /> // resolves to profile.firstName\n * <Form.Field.String name=\"lastName\" /> // resolves to profile.lastName\n * </Form.Steps.Step>\n * ```\n */\n segment?: string\n}\n\n/**\n * Extract field names from children recursively\n * Looks for components with 'name' prop\n */\nfunction extractFieldNames(children: ReactNode, parentPath = ''): string[] {\n const names: string[] = []\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return\n }\n\n const props = child.props as Record<string, unknown>\n\n // Check if this is a field component with name prop\n if (typeof props.name === 'string') {\n const fullName = parentPath ? `${parentPath}.${props.name}` : props.name\n names.push(fullName)\n }\n\n // Check for Form.Group - it creates a namespace\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'FormGroupDeclarative' && typeof props.name === 'string') {\n const groupPath = parentPath ? `${parentPath}.${props.name}` : props.name\n if (props.children) {\n names.push(...extractFieldNames(props.children as ReactNode, groupPath))\n }\n } // Recurse into children (but not into Form.Group.List - arrays are handled differently)\n else if (props.children && displayName !== 'FormGroupListDeclarative') {\n names.push(...extractFieldNames(props.children as ReactNode, parentPath))\n }\n })\n\n return names\n}\n\n/** Offset for slide animation in pixels */\nconst SLIDE_OFFSET = 50\n\n/**\n * Evaluates the when condition value\n */\nfunction evaluateWhenCondition(when: StepWhenCondition | undefined, fieldValue: unknown): boolean {\n if (!when) {\n return true // No condition — always show\n }\n\n if (when.condition !== undefined) {\n return when.condition(fieldValue)\n }\n if (when.is !== undefined) {\n return fieldValue === when.is\n }\n if (when.isNot !== undefined) {\n return fieldValue !== when.isNot\n }\n if (when.in !== undefined) {\n return when.in.includes(fieldValue as never)\n }\n if (when.notIn !== undefined) {\n return !when.notIn.includes(fieldValue as never)\n }\n\n // Default — truthy check\n return Boolean(fieldValue)\n}\n\n/**\n * Gets nested field value by dot-notation path\n */\nfunction getNestedValue(values: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let value: unknown = values\n for (const part of parts) {\n if (value && typeof value === 'object') {\n value = (value as Record<string, unknown>)[part]\n } else {\n return undefined\n }\n }\n return value\n}\n\n/**\n * Form.Steps.Step - Individual step content\n *\n * Registers itself with Form.Steps and provides content for that step.\n * Field names are automatically extracted for validation.\n * Supports slide animations when Form.Steps has `animated` prop.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Steps.Step title=\"Personal Info\" description=\"Your details\">\n * <Form.Field.String name=\"firstName\" label=\"First Name\" />\n * <Form.Field.String name=\"lastName\" label=\"Last Name\" />\n * </Form.Steps.Step>\n * ```\n *\n * @example Conditional step (shown only for a specific role)\n * ```tsx\n * <Form.Steps.Step\n * title=\"Company Info\"\n * when={{ field: 'type', is: 'company' }}\n * >\n * <Form.Field.String name=\"companyName\" label=\"Company Name\" />\n * </Form.Steps.Step>\n * ```\n */\nexport function FormStepsStep({\n title,\n description,\n icon,\n children,\n onEnter,\n onLeave,\n when,\n segment,\n}: FormStepsStepProps) {\n const { form } = useDeclarativeForm()\n const { registerStep, unregisterStep, steps, currentStep, animated, animationDuration, direction } =\n useFormStepsContext()\n\n // Wrap children in FormGroupDeclarative if segment is provided\n const wrappedChildren = segment ? <FormGroupDeclarative name={segment}>{children}</FormGroupDeclarative> : children\n\n // Parent path for field extraction (accounts for segment)\n const fieldExtractionPath = segment ?? ''\n\n // Track step visibility based on when condition\n const [isVisible, setIsVisible] = useState(() => {\n if (!when) {\n return true\n }\n const fieldValue = getNestedValue(form.state.values as Record<string, unknown>, when.field)\n return evaluateWhenCondition(when, fieldValue)\n })\n\n // Calculate index based on render order\n // We use a ref to track the registered index\n const indexRef = useRef<number>(-1)\n const wasVisibleRef = useRef(isVisible)\n\n // Subscribe to when field changes\n useEffect(() => {\n if (!when) {\n return\n }\n\n const subscription = form.store.subscribe(() => {\n const fieldValue = getNestedValue(form.state.values as Record<string, unknown>, when.field)\n const newIsVisible = evaluateWhenCondition(when, fieldValue)\n if (newIsVisible !== wasVisibleRef.current) {\n wasVisibleRef.current = newIsVisible\n setIsVisible(newIsVisible)\n }\n })\n\n // TanStack Store v0.9+ returns an object { unsubscribe }, not a function\n return () => subscription.unsubscribe()\n }, [form, when])\n\n // Assign index on mount (only if step is visible)\n // IMPORTANT: steps must NOT be in dependency array — otherwise infinite loop!\n // registerStep updates steps, which would trigger the effect again.\n // Use stepsRef to access current value without dependency.\n const stepsRef = useRef(steps)\n stepsRef.current = steps\n\n useEffect(() => {\n if (!isVisible) {\n // Step is hidden — don't register\n if (indexRef.current >= 0) {\n unregisterStep(indexRef.current)\n indexRef.current = -1\n }\n return\n }\n\n // Find next available index (use ref to avoid dependency on steps)\n const existingIndices = stepsRef.current.map((s) => s.index)\n let nextIndex = 0\n while (existingIndices.includes(nextIndex)) {\n nextIndex++\n }\n\n // If index already assigned — use it\n if (indexRef.current < 0) {\n indexRef.current = nextIndex\n }\n\n // IMPORTANT: fieldNames are extracted ONCE on mount\n // children NOT included in deps — they change every render\n const fieldNames = extractFieldNames(children, fieldExtractionPath)\n\n const stepInfo: StepInfo = {\n index: indexRef.current,\n title,\n description,\n icon,\n fieldNames,\n onEnter,\n onLeave,\n }\n\n registerStep(stepInfo)\n\n return () => {\n if (indexRef.current >= 0) {\n unregisterStep(indexRef.current)\n }\n }\n // IMPORTANT: steps, children and icon intentionally NOT included — cause infinite loop\n // icon — JSX element, recreated every render\n }, [description, registerStep, title, unregisterStep, onEnter, onLeave, isVisible, fieldExtractionPath])\n\n // Extract fieldNames and memoize their string representation\n // for use in dependency array instead of children\n const fieldNamesRef = useRef<string[]>([])\n const currentFieldNames = useMemo(\n () => extractFieldNames(children, fieldExtractionPath),\n // Use segment path as proxy to determine when structure may change\n // children NOT included — they change every render\n\n [fieldExtractionPath]\n )\n\n // Update ref only if fieldNames actually changed\n const fieldNamesChanged =\n currentFieldNames.length !== fieldNamesRef.current.length ||\n currentFieldNames.some((name, i) => name !== fieldNamesRef.current[i])\n if (fieldNamesChanged) {\n fieldNamesRef.current = currentFieldNames\n }\n\n // Update step info if props change (but keep same index)\n // IMPORTANT: children and icon NOT included in deps — they change every render and cause infinite loop\n // icon — JSX element, recreated on every render\n const iconRef = useRef(icon)\n iconRef.current = icon\n\n useEffect(() => {\n if (indexRef.current >= 0 && isVisible) {\n const stepInfo: StepInfo = {\n index: indexRef.current,\n title,\n description,\n icon: iconRef.current,\n fieldNames: fieldNamesRef.current,\n onEnter,\n onLeave,\n }\n registerStep(stepInfo)\n }\n }, [title, description, registerStep, onEnter, onLeave, isVisible, fieldExtractionPath])\n\n const index = indexRef.current\n\n // Animation variants for slide effect\n const slideVariants: Variants = useMemo(\n () => ({\n // Initial state: element appears from the appropriate side\n initial: {\n opacity: 0,\n x: direction === 'forward' ? SLIDE_OFFSET : -SLIDE_OFFSET,\n },\n // Final state: element in place\n animate: {\n opacity: 1,\n x: 0,\n },\n // Exit state: element leaves to the opposite side\n exit: {\n opacity: 0,\n x: direction === 'forward' ? -SLIDE_OFFSET : SLIDE_OFFSET,\n },\n }),\n [direction]\n )\n\n // Step hidden via when condition — don't render\n if (!isVisible) {\n return null\n }\n\n // Don't render until we have a valid index\n if (index < 0) {\n return null\n }\n\n // Check if this step is the current one\n const isActive = index === currentStep\n\n // If animations are disabled — render regular Steps.Content\n if (!animated) {\n return <Steps.Content index={index}>{wrappedChildren}</Steps.Content>\n }\n\n // With animations — wrap in AnimatePresence + motion.div\n return (\n <Steps.Content index={index}>\n <AnimatePresence mode=\"wait\" initial={false}>\n {isActive && (\n <motion.div\n key={`step-${index}`}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={slideVariants}\n transition={{\n duration: animationDuration,\n ease: 'easeInOut',\n }}\n >\n {wrappedChildren}\n </motion.div>\n )}\n </AnimatePresence>\n </Steps.Content>\n )\n}\n\nFormStepsStep.displayName = 'FormStepsStep'\n","'use client'\n\nimport { Children, isValidElement, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useFormGroup } from '../form-group'\nimport { useDeclarativeForm } from './form-context'\nimport { FormStepsContext } from './form-steps/form-steps-context'\n\n/**\n * Extract field names from children recursively (for step validation integration)\n */\nfunction extractFieldNames(children: ReactNode, parentPath = ''): string[] {\n const names: string[] = []\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return\n }\n\n const props = child.props as Record<string, unknown>\n\n // Check if component has a name prop\n if (typeof props.name === 'string') {\n const fullName = parentPath ? `${parentPath}.${props.name}` : props.name\n names.push(fullName)\n }\n\n // Check for Form.Group — it creates a namespace\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'FormGroupDeclarative' && typeof props.name === 'string') {\n const groupPath = parentPath ? `${parentPath}.${props.name}` : props.name\n if (props.children) {\n names.push(...extractFieldNames(props.children as ReactNode, groupPath))\n }\n } // Recurse into children (except Form.Group.List — arrays are handled separately)\n else if (props.children && displayName !== 'FormGroupListDeclarative') {\n names.push(...extractFieldNames(props.children as ReactNode, parentPath))\n }\n })\n\n return names\n}\n\n/**\n * Props for Form.When conditional rendering component\n */\nexport interface FormWhenProps<TValue = unknown> {\n /** Field name to watch (relative to current group context) */\n field: string\n /** Render children when field value equals this value */\n is?: TValue\n /** Render children when field value is NOT equal to this value */\n isNot?: TValue\n /** Render children when field value is in this array */\n in?: TValue[]\n /** Render children when field value is NOT in this array */\n notIn?: TValue[]\n /** Custom condition function */\n condition?: (value: TValue) => boolean\n /** Content to render when condition is true */\n children: ReactNode\n /** Content to render when condition is false (optional) */\n fallback?: ReactNode\n}\n\n/**\n * Form.When - Conditional field rendering based on other field values\n *\n * Renders children only when the specified field matches the condition.\n * Uses form.Subscribe for optimal performance (only re-renders when watched field changes).\n *\n * @example With exact value match\n * ```tsx\n * <Form.Field.Select name=\"type\" options={['individual', 'company']} />\n *\n * <Form.When field=\"type\" is=\"company\">\n * <Form.Field.String name=\"companyName\" label=\"Company Name\" />\n * <Form.Field.String name=\"inn\" label=\"INN\" />\n * </Form.When>\n * ```\n *\n * @example With negation\n * ```tsx\n * <Form.When field=\"hasDiscount\" isNot={true}>\n * <Form.Field.Number name=\"fullPrice\" label=\"Full Price\" />\n * </Form.When>\n * ```\n *\n * @example With array of values\n * ```tsx\n * <Form.When field=\"role\" in={['admin', 'moderator']}>\n * <Form.Field.Checkbox name=\"canDelete\" label=\"Can delete users\" />\n * </Form.When>\n * ```\n *\n * @example With custom condition\n * ```tsx\n * <Form.When field=\"age\" condition={(age) => age >= 18}>\n * <Form.Field.Checkbox name=\"adultContent\" label=\"Show adult content\" />\n * </Form.When>\n * ```\n *\n * @example With fallback content\n * ```tsx\n * <Form.When field=\"isPremium\" is={true} fallback={<Text>Upgrade to premium</Text>}>\n * <Form.Field.Select name=\"premiumTheme\" options={themes} />\n * </Form.When>\n * ```\n *\n * @example Nested in Form.Group\n * ```tsx\n * <Form.Group name=\"settings\">\n * <Form.Field.Switch name=\"notifications\" label=\"Enable notifications\" />\n * <Form.When field=\"notifications\" is={true}>\n * <Form.Field.Select name=\"frequency\" options={frequencies} />\n * </Form.When>\n * </Form.Group>\n * ```\n */\n/**\n * Internal component for handling field show/hide\n * Integrates with FormStepsContext to exclude hidden fields from validation\n */\nfunction FormWhenContent({\n shouldRender,\n children,\n fallback,\n parentPath,\n}: {\n shouldRender: boolean\n children: ReactNode\n fallback: ReactNode\n parentPath: string\n}): ReactNode {\n const stepsContext = useContext(FormStepsContext)\n const prevShouldRender = useRef<boolean | null>(null)\n\n // Memoize field names — recalculate only when children change\n const fieldNames = useMemo(() => extractFieldNames(children, parentPath), [children, parentPath])\n\n // Single useEffect for managing field visibility in validation\n useEffect(() => {\n // No steps context or fields — nothing to do\n if (!stepsContext || fieldNames.length === 0) {\n return\n }\n\n const isFirstMount = prevShouldRender.current === null\n\n if (isFirstMount) {\n // First mount: if hidden — immediately exclude from validation\n if (!shouldRender) {\n stepsContext.hideFieldsFromValidation(fieldNames)\n }\n } else if (shouldRender && !prevShouldRender.current) {\n // Fields became visible — show for validation\n stepsContext.showFieldsForValidation(fieldNames)\n } else if (!shouldRender && prevShouldRender.current) {\n // Fields became hidden — exclude from validation\n stepsContext.hideFieldsFromValidation(fieldNames)\n }\n\n prevShouldRender.current = shouldRender\n\n // Cleanup: on unmount restore fields back\n return () => {\n if (!shouldRender && fieldNames.length > 0) {\n stepsContext.showFieldsForValidation(fieldNames)\n }\n }\n }, [shouldRender, stepsContext, fieldNames])\n\n return shouldRender ? children : fallback\n}\n\nexport function FormWhen<TValue = unknown>({\n field,\n is,\n isNot,\n in: inArray,\n notIn,\n condition,\n children,\n fallback = null,\n}: FormWhenProps<TValue>): ReactNode {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full field path\n const fullPath = parentGroup ? `${parentGroup.name}.${field}` : field\n\n // Parent path for extracting field names\n const parentPath = parentGroup?.name ?? ''\n\n // Create selector function for the field value\n const selector = (state: { values: Record<string, unknown> }): TValue => {\n // Navigate to nested value using dot notation\n const parts = fullPath.split('.')\n let value: unknown = state.values\n for (const part of parts) {\n if (value && typeof value === 'object') {\n value = (value as Record<string, unknown>)[part]\n } else {\n value = undefined\n break\n }\n }\n return value as TValue\n }\n\n return (\n <form.Subscribe selector={selector}>\n {(value: TValue) => {\n let shouldRender = false\n\n if (condition !== undefined) {\n // Custom condition function\n shouldRender = condition(value)\n } else if (is !== undefined) {\n // Exact match\n shouldRender = value === is\n } else if (isNot !== undefined) {\n // Negation\n shouldRender = value !== isNot\n } else if (inArray !== undefined) {\n // Value in array\n shouldRender = inArray.includes(value)\n } else if (notIn !== undefined) {\n // Value not in array\n shouldRender = !notIn.includes(value)\n } else {\n // Default: render if truthy\n shouldRender = Boolean(value)\n }\n\n return (\n <FormWhenContent shouldRender={shouldRender} fallback={fallback} parentPath={parentPath}>\n {children}\n </FormWhenContent>\n )\n }}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { Skeleton } from '@chakra-ui/react'\nimport type { ComponentType } from 'react'\nimport { lazy, Suspense } from 'react'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyComponent = ComponentType<any>\n\ntype LazyImportFn<T> = () => Promise<{ default: T } | T>\n\n/**\n * Creates ленивый component с встроенным Suspense и Skeleton fallback\n *\n * Supports как default export, так и named export (object модуля)\n *\n * @example\n * ```tsx\n * const LazySelect = createLazyComponent(\n * () => import('./select-type').then(m => m.SelectType),\n * '40px'\n * )\n *\n * // Использование\n * <LazySelect name=\"type\" label=\"Type\" />\n * ```\n */\nexport function createLazyComponent<T extends AnyComponent>(\n importFn: LazyImportFn<T>,\n fallbackHeight = '40px'\n): ComponentType<React.ComponentProps<T>> {\n const LazyComponent = lazy(async () => {\n const module = await importFn()\n // Поддержка default и named exports\n if (module && typeof module === 'object' && 'default' in module) {\n return module as { default: T }\n }\n // Если вернули сам component (named export)\n return { default: module as T }\n })\n\n // Wrapper с Suspense\n function LazyWrapper(props: React.ComponentProps<T>) {\n return (\n <Suspense fallback={<Skeleton height={fallbackHeight} borderRadius=\"md\" />}>\n <LazyComponent {...props} />\n </Suspense>\n )\n }\n\n LazyWrapper.displayName = `Lazy(${importFn.name || 'Component'})`\n\n return LazyWrapper\n}\n\n/**\n * Преобразует object с функциями динамического импорта в object с lazy компоненthereи\n *\n * @example\n * ```tsx\n * const lazySelects = createLazyComponents({\n * Type: () => import('./select-type').then(m => m.SelectType),\n * Status: () => import('./select-status').then(m => m.SelectStatus),\n * })\n *\n * // Result:\n * lazySelects.Type // LazyWrapper с встроенным Suspense\n * lazySelects.Status // LazyWrapper с встроенным Suspense\n * ```\n */\nexport function createLazyComponents<T extends Record<string, LazyImportFn<AnyComponent>>>(\n imports: T,\n fallbackHeight = '40px'\n): { [K in keyof T]: AnyComponent } {\n return Object.entries(imports).reduce(\n (acc, [name, importFn]) => ({\n ...acc,\n [name]: createLazyComponent(importFn, fallbackHeight),\n }),\n {} as { [K in keyof T]: AnyComponent }\n )\n}\n\n/** Type for lazy import function */\nexport type LazyComponentImport<T extends AnyComponent = AnyComponent> = LazyImportFn<T>\n","'use client'\n\nimport type { ComponentType, ReactElement, ReactNode } from 'react'\nimport type { AutoFieldsProps } from './form-auto-fields'\nimport type { ResetButtonProps } from './form-buttons'\nimport type {\n AutocompleteFieldProps,\n CheckboxCardFieldProps,\n ColorPickerFieldProps,\n ComboboxFieldProps,\n DateRangeFieldProps,\n EditableFieldProps,\n FileUploadFieldProps,\n ListboxFieldProps,\n NativeSelectFieldProps,\n PinInputFieldProps,\n RadioCardFieldProps,\n RadioGroupFieldProps,\n RatingFieldProps,\n RichTextFieldProps,\n ScheduleFieldProps,\n SegmentedGroupFieldProps,\n SelectFieldProps,\n SliderFieldProps,\n TagsFieldProps,\n} from './form-fields'\nimport type { FormFromSchemaProps } from './form-from-schema'\nimport type {\n FormStepsIndicatorProps,\n FormStepsNavigationProps,\n FormStepsProps,\n FormStepsStepProps,\n} from './form-steps'\nimport { Form } from './index'\nimport { createLazyComponents, type LazyComponentImport } from './lazy-component'\nimport type {\n AddressFieldProps,\n CheckboxFieldProps,\n CurrencyFieldProps,\n DateFieldProps,\n DateTimePickerFieldProps,\n DurationFieldProps,\n FormGroupListDeclarativeProps,\n FormPropsWithApi,\n MaskedInputFieldProps,\n NumberFieldProps,\n NumberInputFieldProps,\n OTPInputFieldProps,\n PasswordFieldProps,\n PasswordStrengthFieldProps,\n PercentageFieldProps,\n PhoneFieldProps,\n StringFieldProps,\n SubmitButtonProps,\n SwitchFieldProps,\n TextareaFieldProps,\n TimeFieldProps,\n} from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyComponent = ComponentType<any>\n\ninterface CreateFormOptions {\n /** Extra field components to add to Form.Field */\n extraFields?: Record<string, AnyComponent>\n /** Extra button components to add to Form.Button */\n extraButtons?: Record<string, AnyComponent>\n /** Extra select components to add to Form.Select (synchronous) */\n extraSelects?: Record<string, AnyComponent>\n /** Extra combobox components to add to Form.Combobox (synchronous) */\n extraComboboxes?: Record<string, AnyComponent>\n /** Extra listbox components to add to Form.Listbox (synchronous) */\n extraListboxes?: Record<string, AnyComponent>\n /**\n * Default address suggestion provider for Form.Field.Address and Form.Field.City.\n * Set once here instead of passing `provider` prop to every field.\n *\n * @example\n * ```tsx\n * import { createForm, createDaDataProvider } from '@letar/forms'\n *\n * const AppForm = createForm({\n * addressProvider: createDaDataProvider({ token: process.env.DADATA_TOKEN }),\n * })\n *\n * <AppForm.Field.Address name=\"address\" />\n * <AppForm.Field.City name=\"city\" />\n * ```\n */\n addressProvider?: import('./form-fields/specialized/providers').AddressProvider\n\n /**\n * Lazy Select components — loaded only at render time\n *\n * @example\n * ```tsx\n * lazySelects: {\n * Type: () => import('./selects/select-type').then(m => m.SelectType),\n * Status: () => import('./selects/select-status').then(m => m.SelectStatus),\n * }\n * ```\n */\n lazySelects?: Record<string, LazyComponentImport>\n\n /**\n * Lazy Combobox components — loaded only at render time\n *\n * @example\n * ```tsx\n * lazyComboboxes: {\n * User: () => import('./comboboxes/combobox-user').then(m => m.ComboboxUser),\n * }\n * ```\n */\n lazyComboboxes?: Record<string, LazyComponentImport>\n\n /**\n * Lazy Listbox components — loaded only at render time\n *\n * @example\n * ```tsx\n * lazyListboxes: {\n * Tags: () => import('./listboxes/listbox-tags').then(m => m.ListboxTags),\n * }\n * ```\n */\n lazyListboxes?: Record<string, LazyComponentImport>\n}\n\ninterface ListButton {\n Add: AnyComponent\n Remove: AnyComponent\n DragHandle: AnyComponent\n}\n\ninterface ExtendedFormGroupList {\n (props: FormGroupListDeclarativeProps): ReactElement\n Button: ListButton\n}\n\ninterface ExtendedFormGroup {\n (props: { name: string; children: ReactNode }): ReactElement\n List: ExtendedFormGroupList\n}\n\ninterface ExtendedFormField {\n String: (props: StringFieldProps) => ReactElement\n Number: (props: NumberFieldProps) => ReactElement\n NumberInput: (props: NumberInputFieldProps) => ReactElement\n Currency: (props: CurrencyFieldProps) => ReactElement\n Percentage: (props: PercentageFieldProps) => ReactElement\n MaskedInput: (props: MaskedInputFieldProps) => ReactElement\n Phone: (props: PhoneFieldProps) => ReactElement\n Address: (props: AddressFieldProps) => ReactElement\n Textarea: (props: TextareaFieldProps) => ReactElement\n Date: (props: DateFieldProps) => ReactElement\n DateRange: (props: DateRangeFieldProps) => ReactElement\n DateTimePicker: (props: DateTimePickerFieldProps) => ReactElement\n Time: (props: TimeFieldProps) => ReactElement\n Duration: (props: DurationFieldProps) => ReactElement\n Password: (props: PasswordFieldProps) => ReactElement\n PasswordStrength: (props: PasswordStrengthFieldProps) => ReactElement\n PinInput: (props: PinInputFieldProps) => ReactElement\n OTPInput: (props: OTPInputFieldProps) => ReactElement\n Slider: (props: SliderFieldProps) => ReactElement\n Select: (props: SelectFieldProps) => ReactElement\n NativeSelect: <T extends string>(props: NativeSelectFieldProps<T>) => ReactElement\n Combobox: <T extends string, TData = unknown>(props: ComboboxFieldProps<T, TData>) => ReactElement\n Autocomplete: <TData = unknown>(props: AutocompleteFieldProps<TData>) => ReactElement\n Listbox: <T extends string>(props: ListboxFieldProps<T>) => ReactElement\n RadioGroup: <T extends string>(props: RadioGroupFieldProps<T>) => ReactElement\n RadioCard: <T extends string>(props: RadioCardFieldProps<T>) => ReactElement\n Rating: (props: RatingFieldProps) => ReactElement\n SegmentedGroup: <T extends string>(props: SegmentedGroupFieldProps<T>) => ReactElement\n Checkbox: (props: CheckboxFieldProps) => ReactElement\n CheckboxCard: <T extends string>(props: CheckboxCardFieldProps<T>) => ReactElement\n Switch: (props: SwitchFieldProps) => ReactElement\n ColorPicker: (props: ColorPickerFieldProps) => ReactElement\n Editable: (props: EditableFieldProps) => ReactElement\n Schedule: (props: ScheduleFieldProps) => ReactElement\n FileUpload: (props: FileUploadFieldProps) => ReactElement\n RichText: (props: RichTextFieldProps) => ReactElement\n Tags: (props: TagsFieldProps) => ReactElement\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormButton {\n Submit: (props: SubmitButtonProps) => ReactElement\n Reset: (props: ResetButtonProps) => ReactElement\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormSelect {\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormCombobox {\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormListbox {\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormSteps {\n (props: FormStepsProps): ReactElement\n Step: (props: FormStepsStepProps) => ReactElement\n Indicator: (props: FormStepsIndicatorProps) => ReactElement\n Navigation: (props: FormStepsNavigationProps) => ReactElement\n CompletedContent: (props: { children: ReactNode }) => ReactElement\n}\n\nexport interface ExtendedForm {\n <TData extends object>(props: FormPropsWithApi<TData>): ReactElement\n Group: ExtendedFormGroup\n Field: ExtendedFormField\n Button: ExtendedFormButton\n Select: ExtendedFormSelect\n Combobox: ExtendedFormCombobox\n Listbox: ExtendedFormListbox\n Errors: (props: { title?: ReactNode }) => ReactElement | null\n DirtyGuard: (props: {\n message?: string\n dialogTitle?: string\n dialogDescription?: string\n confirmText?: string\n cancelText?: string\n enabled?: boolean\n onBlock?: () => boolean | void\n }) => ReactElement | null\n When: <TValue = unknown>(props: {\n field: string\n is?: TValue\n isNot?: TValue\n in?: TValue[]\n notIn?: TValue[]\n condition?: (value: TValue) => boolean\n children: ReactNode\n fallback?: ReactNode\n }) => ReactNode\n Steps: ExtendedFormSteps\n AutoFields: (props: AutoFieldsProps) => ReactElement\n FromSchema: <TData extends object>(props: FormFromSchemaProps<TData>) => ReactElement\n}\n\n/**\n * Create an extended Form component with app-specific fields\n *\n * @example\n * ```tsx\n * // In your app\n * import { createForm } from '@lena/form-components'\n * import { SelectType } from './select-type'\n * import { ComboboxInstructor } from './combobox-instructor'\n * import { ListboxLicenseCategories } from './listbox-license-categories'\n *\n * export const AppForm = createForm({\n * extraSelects: { Type: SelectType },\n * extraComboboxes: { Instructor: ComboboxInstructor },\n * extraListboxes: { LicenseCategories: ListboxLicenseCategories },\n * })\n *\n * // Usage\n * <AppForm initialValue={data} onSubmit={save}>\n * <AppForm.Select.Type name=\"type\" />\n * <AppForm.Combobox.Instructor name=\"instructorId\" />\n * <AppForm.Listbox.LicenseCategories name=\"categories\" />\n * <AppForm.Field.String name=\"title\" />\n * <AppForm.Button.Submit />\n * </AppForm>\n * ```\n */\nexport function createForm(options: CreateFormOptions = {}): ExtendedForm {\n const {\n extraFields = {},\n extraButtons = {},\n extraSelects = {},\n extraComboboxes = {},\n extraListboxes = {},\n lazySelects = {},\n lazyComboboxes = {},\n lazyListboxes = {},\n addressProvider,\n } = options\n\n // Create lazy wrappers for components\n const lazySelectComponents = createLazyComponents(lazySelects)\n const lazyComboboxComponents = createLazyComponents(lazyComboboxes)\n const lazyListboxComponents = createLazyComponents(lazyListboxes)\n\n const ExtendedField = {\n ...Form.Field,\n ...extraFields,\n }\n\n const ExtendedButton = {\n ...Form.Button,\n ...extraButtons,\n }\n\n // Merge synchronous and lazy components\n const ExtendedSelect = {\n ...extraSelects,\n ...lazySelectComponents,\n }\n\n const ExtendedCombobox = {\n ...extraComboboxes,\n ...lazyComboboxComponents,\n }\n\n const ExtendedListbox = {\n ...extraListboxes,\n ...lazyListboxComponents,\n }\n\n const ExtendedForm = Object.assign(\n // Root component\n function ExtendedFormRoot<TData extends object>(props: FormPropsWithApi<TData>) {\n // Inject addressProvider from createForm if not set on Form props\n const mergedProps = addressProvider && !props.addressProvider\n ? { ...props, addressProvider }\n : props\n return Form(mergedProps)\n },\n {\n Group: Form.Group,\n Field: ExtendedField,\n Button: ExtendedButton,\n Select: ExtendedSelect,\n Combobox: ExtendedCombobox,\n Listbox: ExtendedListbox,\n Errors: Form.Errors,\n DebugValues: Form.DebugValues,\n DirtyGuard: Form.DirtyGuard,\n When: Form.When,\n Steps: Form.Steps,\n AutoFields: Form.AutoFields,\n FromSchema: Form.FromSchema,\n },\n )\n\n return ExtendedForm as ExtendedForm\n}\n","'use client'\n\nimport { useCallback, useSyncExternalStore } from 'react'\nimport { useFormGroup } from '../form-group'\nimport { useDeclarativeForm } from './form-context'\n\n// Stable fallback for fieldMeta — prevents infinite loop in useSyncExternalStore.\n// If creating a new object in getSnapshot each time, Object.is comparison returns false,\n// and React will infinitely re-render the component.\nconst EMPTY_FIELD_META = Object.freeze({ errors: [], isTouched: false })\n\n/**\n * Result type for useFieldActions hook\n */\nexport interface FieldActionsResult<TValue = unknown> {\n /** Current field value */\n value: TValue\n /** Set field value */\n onChange: (value: TValue) => void\n /** Set field error */\n setError: (error: string) => void\n /** Clear field error */\n clearError: () => void\n /** Trigger field validation */\n validate: () => Promise<void>\n /** Whether field is touched */\n isTouched: boolean\n /** Whether field has errors */\n hasError: boolean\n /** Current field errors (array) */\n errors: string[]\n}\n\n/**\n * Hook for imperative field actions.\n *\n * Useful for custom field actions like geolocation detection,\n * async value fetching, or programmatic field manipulation.\n *\n * @param fieldName - Field name (relative to current group context)\n * @returns Field actions object with value, onChange, setError, etc.\n *\n * @example Basic usage with geolocation\n * ```tsx\n * function CityField() {\n * const { value, onChange, setError } = useFieldActions('city')\n *\n * const handleDetect = async () => {\n * const result = await detectLocation()\n * if (result.error) {\n * setError(result.error)\n * } else {\n * onChange(result.city)\n * }\n * }\n *\n * return (\n * <HStack>\n * <Form.Field.String name=\"city\" label=\"City\" />\n * <Button onClick={handleDetect}>\n * <LuMapPin />\n * </Button>\n * </HStack>\n * )\n * }\n * ```\n *\n * @example Async value fetching\n * ```tsx\n * function CompanyField() {\n * const { onChange, setError } = useFieldActions('company')\n * const [isLoading, setIsLoading] = useState(false)\n *\n * const handleLookup = async (inn: string) => {\n * setIsLoading(true)\n * try {\n * const company = await lookupByInn(inn)\n * onChange(company.name)\n * } catch (e) {\n * setError('Company not found')\n * } finally {\n * setIsLoading(false)\n * }\n * }\n *\n * return <Button onClick={() => handleLookup('1234567890')} loading={isLoading}>Lookup</Button>\n * }\n * ```\n */\nexport function useFieldActions<TValue = unknown>(fieldName: string): FieldActionsResult<TValue> {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full field path\n const fullPath = parentGroup ? `${parentGroup.name}.${fieldName}` : fieldName\n\n // Get nested value from form state\n const getNestedValue = useCallback(\n (values: Record<string, unknown>): TValue => {\n const parts = fullPath.split('.')\n let result: unknown = values\n for (const part of parts) {\n if (result && typeof result === 'object') {\n result = (result as Record<string, unknown>)[part]\n } else {\n return undefined as TValue\n }\n }\n return result as TValue\n },\n [fullPath]\n )\n\n // Подписка на store — выносим useCallback ДО useSyncExternalStore\n // (React 19 запрещает вызов хуков inside аргументов других хуков)\n // TanStack Store v0.9+ returns { unsubscribe }, а не функцию\n const subscribe = useCallback(\n (callback: () => void) => {\n const subscription = form.store.subscribe(callback)\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n },\n [form]\n )\n\n const getValueSnapshot = useCallback(\n () => getNestedValue(form.state.values as Record<string, unknown>),\n [form, getNestedValue]\n )\n\n const getMetaSnapshot = useCallback(() => {\n const meta = form.store.state.fieldMeta[fullPath]\n return meta || EMPTY_FIELD_META\n }, [form, fullPath])\n\n // Subscribe to field value changes\n const value = useSyncExternalStore(subscribe, getValueSnapshot, getValueSnapshot)\n\n // Get field meta (errors, touched, etc.)\n const fieldMeta = useSyncExternalStore(subscribe, getMetaSnapshot, getMetaSnapshot)\n\n // Set field value\n const onChange = useCallback(\n (newValue: TValue) => {\n form.setFieldValue(fullPath, newValue)\n },\n [form, fullPath]\n )\n\n // Set field error\n const setError = useCallback(\n (error: string) => {\n form.setFieldMeta(fullPath, (prev: Record<string, unknown>) => ({\n ...prev,\n errors: [error],\n }))\n },\n [form, fullPath]\n )\n\n // Clear field error\n const clearError = useCallback(() => {\n form.setFieldMeta(fullPath, (prev: Record<string, unknown>) => ({\n ...prev,\n errors: [],\n }))\n }, [form, fullPath])\n\n // Trigger field validation\n const validate = useCallback(async () => {\n await form.validateField(fullPath, 'change')\n }, [form, fullPath])\n\n const errors = (fieldMeta.errors as string[]) || []\n\n return {\n value,\n onChange,\n setError,\n clearError,\n validate,\n isTouched: Boolean(fieldMeta.isTouched),\n hasError: errors.length > 0,\n errors,\n }\n}\n","'use client'\n\nimport { z } from 'zod/v4'\nimport type { FieldUIMeta } from './types/meta-types'\nimport { unwrapSchema } from './zod-utils'\n\n/**\n * UI metadata configuration for flat schemas (top-level fields only)\n */\nexport type UIMetaConfig<T extends z.ZodRawShape> = {\n [K in keyof T]?: FieldUIMeta\n}\n\n/** Mutable type for creating a new shape */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MutableShape = { [key: string]: any }\n\n/**\n * UI metadata configuration with nested object support\n * For nested objects, use _meta for the group's own metadata\n */\nexport type DeepUIMetaConfig<T extends z.ZodRawShape> = {\n [K in keyof T]?: FieldUIMeta | ({ _meta?: FieldUIMeta } & Record<string, FieldUIMeta | unknown>)\n}\n\n/**\n * Check if a schema is a ZodObject\n */\nfunction isZodObject(schema: unknown): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (schema as any)?._zod?.def?.type === 'object'\n}\n\n/**\n * Check if the configuration contains nested settings\n */\nfunction hasNestedConfig(config: unknown): boolean {\n if (typeof config !== 'object' || config === null) {\n return false\n }\n\n // If _meta exists — this is definitely a nested configuration\n if ('_meta' in config) {\n return true\n }\n\n // Check for nested objects with title/fieldType\n // Exclude standard FieldUIMeta fields\n const fieldUIMetaKeys = ['title', 'description', 'placeholder', 'tooltip', 'fieldType', 'fieldProps']\n\n for (const [key, value] of Object.entries(config)) {\n // Skip standard FieldUIMeta fields\n if (fieldUIMetaKeys.includes(key)) {\n continue\n }\n\n // If the value is an object with title/fieldType/description, it's a nested configuration\n if (typeof value === 'object' && value !== null) {\n if ('title' in value || 'fieldType' in value || 'description' in value) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Enrich ZenStack/Zod schema with UI metadata\n *\n * Adds .meta({ ui: {...} }) to schema fields based on configuration.\n * Works only with top-level fields.\n *\n * @example Basic usage\n * ```ts\n * import { ProductCreateInputSchema } from '@/generated/zod/objects/ProductCreateInput.schema'\n *\n * const ProductFormSchema = withUIMeta(ProductCreateInputSchema, {\n * name: { title: 'Name', placeholder: 'Enter name' },\n * price: { title: 'Price', fieldType: 'currency', fieldProps: { currency: 'RUB' } },\n * isActive: { title: 'Active', fieldType: 'switch' },\n * })\n * ```\n *\n * @example With enum fields\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * role: {\n * title: 'Role',\n * fieldType: 'radioCard',\n * fieldProps: {\n * options: [\n * { value: 'ADMIN', label: 'Administrator' },\n * { value: 'USER', label: 'User' },\n * ],\n * },\n * },\n * })\n * ```\n *\n * @param schema Zod object schema\n * @param config UI metadata configuration for fields\n * @returns New schema with added metadata\n */\nexport function withUIMeta<T extends z.ZodRawShape>(schema: z.ZodObject<T>, config: UIMetaConfig<T>): z.ZodObject<T> {\n const shape = schema.shape\n const newShape: MutableShape = {}\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const meta = config[key as keyof T]\n if (meta) {\n // Add .meta({ ui: {...} }) to field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newShape[key] = (fieldSchema as any).meta({ ui: meta })\n } else {\n newShape[key] = fieldSchema\n }\n }\n\n // Preserve strict/passthrough mode if it was set\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const unknownKeys = (schema as any)._zod?.def?.unknownKeys\n if (unknownKeys === 'strict') {\n return z.object(newShape).strict() as z.ZodObject<T>\n }\n if (unknownKeys === 'passthrough') {\n return z.object(newShape).passthrough() as z.ZodObject<T>\n }\n\n return z.object(newShape) as z.ZodObject<T>\n}\n\n/**\n * Enrich ZenStack/Zod schema with UI metadata with nested object support\n *\n * Extended version of withUIMeta that recursively processes nested objects.\n * Use the `_meta` key for nested group metadata.\n *\n * @example With nested objects\n * ```ts\n * const UserFormSchema = withUIMetaDeep(UserCreateInputSchema, {\n * firstName: { title: 'First Name' },\n * lastName: { title: 'Last Name' },\n * address: {\n * _meta: { title: 'Shipping Address' }, // meta for the group\n * country: { title: 'Country', fieldType: 'select' },\n * city: { title: 'City' },\n * street: { title: 'Street' },\n * },\n * })\n * ```\n *\n * @example Deep nesting\n * ```ts\n * const OrderFormSchema = withUIMetaDeep(OrderCreateInputSchema, {\n * orderNumber: { title: 'Order Number' },\n * user: {\n * _meta: { title: 'Customer Data' },\n * firstName: { title: 'First Name' },\n * address: {\n * _meta: { title: 'Address' },\n * city: { title: 'City' },\n * },\n * },\n * })\n * ```\n *\n * @param schema Zod object schema\n * @param config UI metadata configuration (can be nested)\n * @returns New schema with added metadata\n */\nexport function withUIMetaDeep<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n config: DeepUIMetaConfig<T>\n): z.ZodObject<T> {\n const shape = schema.shape\n const newShape: MutableShape = {}\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const fieldConfig = config[key as keyof T]\n\n if (!fieldConfig) {\n newShape[key] = fieldSchema\n continue\n }\n\n // Get unwrapped schema to check type\n const unwrapped = unwrapSchema(fieldSchema)\n\n // Check if this is a nested object or a regular field\n if (isZodObject(unwrapped) && hasNestedConfig(fieldConfig)) {\n // This is a nested object with field configuration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { _meta, ...nestedConfig } = fieldConfig as { _meta?: FieldUIMeta } & Record<string, any>\n\n // Recursively process nested object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let nestedSchema = withUIMetaDeep(unwrapped as any, nestedConfig)\n\n // Apply _meta to the field itself (for group label)\n if (_meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nestedSchema = (nestedSchema as any).meta({ ui: _meta })\n }\n\n // Restore wrappers (optional, nullable, default)\n newShape[key] = rewrapSchema(fieldSchema, nestedSchema)\n } else {\n // Regular field — just add meta\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newShape[key] = (fieldSchema as any).meta({ ui: fieldConfig as FieldUIMeta })\n }\n }\n\n // Preserve strict/passthrough mode if it was set\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const unknownKeys = (schema as any)._zod?.def?.unknownKeys\n if (unknownKeys === 'strict') {\n return z.object(newShape).strict() as z.ZodObject<T>\n }\n if (unknownKeys === 'passthrough') {\n return z.object(newShape).passthrough() as z.ZodObject<T>\n }\n\n return z.object(newShape) as z.ZodObject<T>\n}\n\n/**\n * Restore wrappers (optional, nullable, default) around a new inner schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction rewrapSchema(original: any, newInner: any): any {\n if (!original?._zod?.def) {\n return newInner\n }\n\n const type = original._zod.def.type\n\n if (type === 'optional') {\n return rewrapSchema(original._zod.def.inner, newInner).optional()\n }\n if (type === 'nullable') {\n return rewrapSchema(original._zod.def.inner, newInner).nullable()\n }\n if (type === 'default') {\n const defaultValue = original._zod.def.defaultValue\n return rewrapSchema(original._zod.def.inner, newInner).default(defaultValue)\n }\n\n return newInner\n}\n","'use client'\n\nimport type { FieldComponentType, FieldUIMeta } from './types/meta-types'\n\n/**\n * Ready-made presets for system fields (id, createdAt, updatedAt)\n *\n * @example\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * ...commonMeta, // Adds id, createdAt, updatedAt\n * name: { title: 'Name' },\n * })\n * ```\n */\nexport const commonMeta: Record<string, FieldUIMeta> = {\n id: {\n title: 'ID',\n fieldType: 'string',\n fieldProps: { disabled: true },\n },\n createdAt: {\n title: 'Created',\n fieldType: 'date',\n fieldProps: { readOnly: true },\n },\n updatedAt: {\n title: 'Updated',\n fieldType: 'date',\n fieldProps: { readOnly: true },\n },\n}\n\n/**\n * Field types for selection from a list (enum/select)\n */\nexport type SelectionFieldType = Extract<\n FieldComponentType,\n 'select' | 'nativeSelect' | 'radioGroup' | 'radioCard' | 'segmentedGroup' | 'checkboxCard' | 'listbox'\n>\n\n/**\n * Helper for creating UI metadata for relation fields\n *\n * @example\n * ```ts\n * const OrderFormSchema = withUIMeta(OrderCreateInputSchema, {\n * categoryId: relationMeta({\n * title: 'Category',\n * model: 'Category',\n * labelField: 'name',\n * }),\n * })\n * ```\n *\n * @example With custom field type\n * ```ts\n * categoryId: relationMeta({\n * title: 'Category',\n * model: 'Category',\n * labelField: 'name',\n * fieldType: 'combobox',\n * })\n * ```\n */\nexport function relationMeta(config: {\n /** Field title */\n title: string\n /** Related model name */\n model: string\n /** Field to display as label */\n labelField: string\n /** Field for value (default 'id') */\n valueField?: string\n /** Component type for display (default 'select') */\n fieldType?: SelectionFieldType\n /** Additional props */\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n return {\n title: config.title,\n fieldType: config.fieldType ?? 'select',\n fieldProps: {\n relation: {\n model: config.model,\n labelField: config.labelField,\n valueField: config.valueField ?? 'id',\n },\n ...config.fieldProps,\n },\n }\n}\n\n/**\n * Helper for creating UI metadata for enum fields with custom labels\n *\n * @example Simple usage\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * role: enumMeta({\n * title: 'Role',\n * labels: {\n * ADMIN: 'Administrator',\n * MANAGER: 'Manager',\n * USER: 'User',\n * GUEST: 'Guest',\n * },\n * }),\n * })\n * ```\n *\n * @example With custom field type\n * ```ts\n * role: enumMeta({\n * title: 'Role',\n * fieldType: 'radioCard',\n * labels: { ADMIN: 'Administrator', USER: 'User' },\n * })\n * ```\n *\n * @example With descriptions for each option\n * ```ts\n * priority: enumMeta({\n * title: 'Priority',\n * fieldType: 'radioCard',\n * options: [\n * { value: 'LOW', label: 'Low', description: 'Do it sometime' },\n * { value: 'HIGH', label: 'High', description: 'Urgent!' },\n * ],\n * })\n * ```\n */\nexport function enumMeta<T extends string>(\n config:\n | {\n /** Field title */\n title: string\n /** Component type for display (default nativeSelect) */\n fieldType?: SelectionFieldType\n /** Mapping of enum values to custom labels */\n labels: Record<T, string>\n /** Field description */\n description?: string\n /** Additional props */\n fieldProps?: Record<string, unknown>\n }\n | {\n /** Field title */\n title: string\n /** Component type for display (default nativeSelect) */\n fieldType?: SelectionFieldType\n /** Full options with value, label and optional description */\n options: Array<{ value: T; label: string; description?: string }>\n /** Field description */\n description?: string\n /** Additional props */\n fieldProps?: Record<string, unknown>\n }\n): FieldUIMeta {\n // Determine options from labels or directly\n let options: Array<{ value: string; label: string; description?: string }>\n\n if ('labels' in config) {\n options = Object.entries(config.labels).map(([value, label]) => ({\n value,\n label: label as string,\n }))\n } else {\n options = config.options\n }\n\n return {\n title: config.title,\n description: config.description,\n fieldType: config.fieldType ?? 'nativeSelect',\n fieldProps: {\n options,\n ...config.fieldProps,\n },\n }\n}\n\n/**\n * Helper for creating UI metadata for text fields\n *\n * @example\n * ```ts\n * name: textMeta({ title: 'Name', placeholder: 'Enter name' })\n * bio: textMeta({ title: 'About', fieldType: 'richText' })\n * ```\n */\nexport function textMeta(config: {\n title: string\n placeholder?: string\n description?: string\n fieldType?: 'string' | 'textarea' | 'richText' | 'password' | 'passwordStrength' | 'editable'\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n return {\n title: config.title,\n placeholder: config.placeholder,\n description: config.description,\n fieldType: config.fieldType ?? 'string',\n fieldProps: config.fieldProps,\n }\n}\n\n/**\n * Helper for creating UI metadata for number fields\n *\n * @example\n * ```ts\n * age: numberMeta({ title: 'Age', min: 0, max: 120 })\n * price: numberMeta({ title: 'Price', fieldType: 'currency', currency: 'RUB' })\n * rating: numberMeta({ title: 'Rating', fieldType: 'rating', count: 5 })\n * ```\n */\nexport function numberMeta(config: {\n title: string\n description?: string\n fieldType?: 'number' | 'numberInput' | 'slider' | 'rating' | 'currency' | 'percentage'\n min?: number\n max?: number\n step?: number\n currency?: string\n count?: number // for rating\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n const { title, description, fieldType, min, max, step, currency, count, fieldProps = {} } = config\n\n return {\n title,\n description,\n fieldType: fieldType ?? 'number',\n fieldProps: {\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...(step !== undefined && { step }),\n ...(currency && { currency }),\n ...(count !== undefined && { count }),\n ...fieldProps,\n },\n }\n}\n\n/**\n * Helper for creating UI metadata for boolean fields\n *\n * @example\n * ```ts\n * isActive: booleanMeta({ title: 'Active', fieldType: 'switch' })\n * newsletter: booleanMeta({ title: 'Newsletter', description: 'Receive news' })\n * ```\n */\nexport function booleanMeta(config: {\n title: string\n description?: string\n fieldType?: 'checkbox' | 'switch'\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n return {\n title: config.title,\n description: config.description,\n fieldType: config.fieldType ?? 'checkbox',\n fieldProps: config.fieldProps,\n }\n}\n\n/**\n * Helper for creating UI metadata for date/time fields\n *\n * @example\n * ```ts\n * birthDate: dateMeta({ title: 'Date of birth' })\n * appointment: dateMeta({ title: 'Appointment', fieldType: 'dateTimePicker' })\n * duration: dateMeta({ title: 'Duration', fieldType: 'duration', min: 15, max: 480 })\n * ```\n */\nexport function dateMeta(config: {\n title: string\n description?: string\n fieldType?: 'date' | 'time' | 'dateRange' | 'dateTimePicker' | 'duration' | 'schedule'\n min?: number | string | Date\n max?: number | string | Date\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n const { title, description, fieldType, min, max, fieldProps = {} } = config\n\n return {\n title,\n description,\n fieldType: fieldType ?? 'date',\n fieldProps: {\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...fieldProps,\n },\n }\n}\n","'use client'\n\nimport { FormOfflineIndicator, FormSyncStatus } from '../offline'\nimport { DirtyGuard } from './dirty-guard'\nimport { FormAutoFields } from './form-auto-fields'\nimport { FormBuilder } from './form-builder'\nimport { ButtonReset, ButtonSubmit } from './form-buttons'\nimport { FormDebugValues } from './form-debug-values'\nimport { FormErrors } from './form-errors'\nimport {\n FieldAddress,\n FieldAuto,\n FieldAutocomplete,\n FieldCascadingSelect,\n FieldCheckbox,\n FieldCheckboxCard,\n FieldCity,\n FieldColorPicker,\n FieldCombobox,\n FieldCurrency,\n FieldDate,\n FieldDateRange,\n FieldDateTimePicker,\n FieldDuration,\n FieldEditable,\n FieldFileUpload,\n FieldListbox,\n FieldMaskedInput,\n FieldNativeSelect,\n FieldNumber,\n FieldNumberInput,\n FieldOTPInput,\n FieldPassword,\n FieldPasswordStrength,\n FieldPercentage,\n FieldPhone,\n FieldPinInput,\n FieldRadioCard,\n FieldRadioGroup,\n FieldRating,\n FieldRichText,\n FieldSchedule,\n FieldSegmentedGroup,\n FieldSelect,\n FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTags,\n FieldTextarea,\n FieldTime,\n} from './form-fields'\nimport { FormFromSchema } from './form-from-schema'\nimport { FormGroupDeclarative } from './form-group/form-group-declarative'\nimport { ListButtonAdd, ListButtonRemove } from './form-group/form-group-list-buttons'\nimport { FormGroupListDeclarative } from './form-group/form-group-list-declarative'\nimport { DragHandle } from './form-group/form-group-list-sortable'\nimport { Form as FormRoot } from './form-root'\nimport {\n FormSteps as FormStepsRoot,\n FormStepsCompletedContent,\n FormStepsIndicator,\n FormStepsNavigation,\n FormStepsStep,\n} from './form-steps'\nimport { FormWhen } from './form-when'\n\n// List buttons compound component\nconst ListButton = {\n Add: ListButtonAdd,\n Remove: ListButtonRemove,\n DragHandle: DragHandle,\n}\n\n// FormGroupList with Button subcomponent\nconst FormGroupList = Object.assign(FormGroupListDeclarative, {\n Button: ListButton,\n})\n\n// Build compound component\nconst FormGroup = Object.assign(FormGroupDeclarative, {\n List: FormGroupList,\n})\n\nconst FormField = {\n // Auto field (DX improvement)\n Auto: FieldAuto,\n // Text fields\n String: FieldString,\n Textarea: FieldTextarea,\n Password: FieldPassword,\n PasswordStrength: FieldPasswordStrength,\n MaskedInput: FieldMaskedInput,\n Editable: FieldEditable,\n RichText: FieldRichText,\n // Number fields\n Number: FieldNumber,\n NumberInput: FieldNumberInput,\n Currency: FieldCurrency,\n Percentage: FieldPercentage,\n Slider: FieldSlider,\n Rating: FieldRating,\n // Date/Time fields\n Date: FieldDate,\n DateRange: FieldDateRange,\n DateTimePicker: FieldDateTimePicker,\n Time: FieldTime,\n Duration: FieldDuration,\n Schedule: FieldSchedule,\n // Boolean fields\n Checkbox: FieldCheckbox,\n CheckboxCard: FieldCheckboxCard,\n Switch: FieldSwitch,\n // Selection fields\n Select: FieldSelect,\n NativeSelect: FieldNativeSelect,\n CascadingSelect: FieldCascadingSelect,\n Combobox: FieldCombobox,\n Autocomplete: FieldAutocomplete,\n Listbox: FieldListbox,\n RadioGroup: FieldRadioGroup,\n RadioCard: FieldRadioCard,\n SegmentedGroup: FieldSegmentedGroup,\n Tags: FieldTags,\n // Specialized fields\n Phone: FieldPhone,\n Address: FieldAddress,\n City: FieldCity,\n PinInput: FieldPinInput,\n OTPInput: FieldOTPInput,\n ColorPicker: FieldColorPicker,\n FileUpload: FieldFileUpload,\n}\n\nconst FormButton = {\n Submit: ButtonSubmit,\n Reset: ButtonReset,\n}\n\n// Form.Steps compound component\nconst FormSteps = Object.assign(FormStepsRoot, {\n Step: FormStepsStep,\n Indicator: FormStepsIndicator,\n Navigation: FormStepsNavigation,\n CompletedContent: FormStepsCompletedContent,\n})\n\n/**\n * Declarative Form compound component\n *\n * Provides a minimal-boilerplate API for building forms with automatic\n * field path resolution, array iteration, and Chakra UI integration.\n *\n * @example\n * ```tsx\n * <Form initialValue={{ title: '', portions: 1 }} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" label=\"Title\" />\n * <Form.Field.Number name=\"portions\" label=\"Portions\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example With nested groups and arrays\n * ```tsx\n * <Form initialValue={recipe} onSubmit={handleSubmit}>\n * <Form.Group.List name=\"components\">\n * <Form.Field.String name=\"title\" />\n * <Form.Field.Number name=\"weightGrams\" />\n * </Form.Group.List>\n * <Form.Group name=\"info\">\n * <Form.Group name=\"base\">\n * <Form.Field.Number name=\"rating\" />\n * </Form.Group>\n * </Form.Group>\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nimport type { FormComponent } from './form-root'\n\nexport const Form = Object.assign(FormRoot, {\n Group: FormGroup,\n Field: FormField,\n Button: FormButton,\n Errors: FormErrors,\n DebugValues: FormDebugValues,\n DirtyGuard: DirtyGuard,\n When: FormWhen,\n Steps: FormSteps,\n Builder: FormBuilder,\n // Schema-based generation\n AutoFields: FormAutoFields,\n FromSchema: FormFromSchema,\n // Offline support\n OfflineIndicator: FormOfflineIndicator,\n SyncStatus: FormSyncStatus,\n}) as unknown as FormComponent\n\n// Export types\nexport type {\n AddressFieldProps,\n AddressValue,\n BaseFieldProps,\n CheckboxFieldProps,\n CityFieldProps,\n CurrencyFieldProps,\n DaDataSuggestion,\n DateFieldProps,\n DateTimePickerFieldProps,\n DeclarativeFormContextValue,\n DurationFieldProps,\n FieldTooltipMeta,\n FieldUIMeta,\n FormApiConfig,\n FormApiResult,\n FormApiState,\n FormGroupDeclarativeProps,\n FormGroupListContextValue,\n FormGroupListDeclarativeProps,\n FormGroupListItemContextValue,\n FormGroupListWrapperProps,\n FormOfflineState,\n FormProps,\n FormPropsWithApi,\n MaskedInputFieldProps,\n NumberFieldProps,\n NumberInputFieldProps,\n NumberInputFormatOptions,\n OTPInputFieldProps,\n PasswordFieldProps,\n PasswordRequirement,\n PasswordStrengthFieldProps,\n PercentageFieldProps,\n PhoneCountry,\n PhoneFieldProps,\n StringFieldProps,\n SubmitButtonProps,\n SwitchFieldProps,\n TextareaFieldProps,\n TimeFieldProps,\n UseCreateHook,\n UseQueryHook,\n UseUpdateHook,\n} from './types'\n\n// Export context hooks\nexport { DeclarativeFormContext, useDeclarativeForm, useDeclarativeFormOptional } from './form-context'\nexport {\n FormGroupListContext,\n FormGroupListItemContext,\n useFormGroupListContext,\n useFormGroupListItemContext,\n} from './form-group/form-group-list-context'\n\n// Export individual components for extension\nexport { ButtonReset, ButtonSubmit, type ResetButtonProps } from './form-buttons'\nexport { FormDebugValues, type FormDebugValuesProps } from './form-debug-values'\nexport { FormErrors } from './form-errors'\nexport {\n type AutocompleteFieldProps,\n type AutoFieldConfig,\n type AutoFieldProps,\n camelCaseToLabel,\n type CascadingSelectFieldProps,\n type CascadingSelectLoadResult,\n type CheckboxCardFieldProps,\n type CheckboxCardOption,\n type ColorPickerFieldProps,\n type ComboboxFieldProps,\n type ComboboxOption,\n type DateRangeFieldProps,\n type DateRangePreset,\n type DateRangeValue,\n type DayOfWeek,\n type DaySchedule,\n type EditableFieldProps,\n FieldAddress,\n FieldAuto,\n FieldAutocomplete,\n FieldCascadingSelect,\n FieldCheckbox,\n FieldCheckboxCard,\n FieldCity,\n FieldColorPicker,\n FieldCombobox,\n FieldCurrency,\n FieldDate,\n FieldDateRange,\n FieldDateTimePicker,\n FieldDuration,\n FieldEditable,\n FieldFileUpload,\n FieldListbox,\n FieldMaskedInput,\n FieldNativeSelect,\n FieldNumber,\n FieldNumberInput,\n FieldOTPInput,\n FieldPassword,\n FieldPasswordStrength,\n FieldPercentage,\n FieldPhone,\n FieldPinInput,\n FieldRadioCard,\n FieldRadioGroup,\n FieldRating,\n FieldRichText,\n FieldSchedule,\n FieldSegmentedGroup,\n FieldSelect,\n FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTags,\n FieldTextarea,\n FieldTime,\n type FileUploadFieldProps,\n type ListboxFieldProps,\n type ListboxOption,\n type NativeSelectFieldProps,\n type NativeSelectOption,\n type PinInputFieldProps,\n type RadioCardFieldProps,\n type RadioCardOption,\n type RadioGroupFieldProps,\n type RadioOption,\n type RatingFieldProps,\n type RichTextFieldProps,\n type ScheduleFieldProps,\n type SegmentedGroupFieldProps,\n type SegmentedGroupOption,\n type SelectFieldProps,\n type SelectOption,\n type SliderFieldProps,\n type SliderMark,\n type TagsFieldProps,\n type TimeSlot,\n type ToolbarButton,\n useDeclarativeField,\n type WeeklySchedule,\n} from './form-fields'\nexport { FormGroupDeclarative } from './form-group/form-group-declarative'\nexport { ListButtonAdd, ListButtonRemove } from './form-group/form-group-list-buttons'\nexport { FormGroupListDeclarative } from './form-group/form-group-list-declarative'\nexport {\n DragHandle,\n SortableItem,\n SortableWrapper,\n useSortableItemContext,\n} from './form-group/form-group-list-sortable'\n\n// Factory for app-specific forms\nexport { createForm, type ExtendedForm } from './create-form'\n\n// Lazy component helpers (for lazy loading form components)\nexport { createLazyComponent, createLazyComponents, type LazyComponentImport } from './lazy-component'\n\n// API integration hook\nexport { useFormApi } from './use-form-api'\n\n// Persistence hook and types\nexport { type FormPersistenceConfig, type FormPersistenceResult, useFormPersistence } from './form-persistence'\n\n// DirtyGuard component\nexport { DirtyGuard, type DirtyGuardProps } from './dirty-guard'\n\n// Conditional rendering\nexport { FormWhen, type FormWhenProps } from './form-when'\n\n// Multi-step forms\nexport {\n FormSteps as FormStepsRoot,\n FormStepsCompletedContent,\n type FormStepsCompletedContentProps,\n FormStepsContext,\n type FormStepsContextValue,\n FormStepsIndicator,\n type FormStepsIndicatorProps,\n FormStepsNavigation,\n type FormStepsNavigationProps,\n type FormStepsProps,\n FormStepsStep,\n type FormStepsStepProps,\n type StepInfo,\n useFormStepsContext,\n} from './form-steps'\n\n// Field actions hook\nexport { type FieldActionsResult, useFieldActions } from './use-field-actions'\n\n// Field UI components\nexport { FieldLabel, type FieldLabelProps } from './form-fields/base/field-label'\nexport { FieldTooltip, type FieldTooltipProps } from './form-fields/base/field-tooltip'\n\n// Form Builder (JSON-based form generation)\nexport {\n type FieldConfig,\n FormBuilder,\n type FormBuilderConfig,\n type FormBuilderProps,\n type FormBuilderSection,\n} from './form-builder'\n\n// Schema constraints (auto-extraction from Zod)\nexport {\n getZodConstraints,\n type ZodArrayConstraints,\n type ZodConstraints,\n type ZodDateConstraints,\n type ZodNumberConstraints,\n type ZodStringConstraints,\n} from './schema-constraints'\n\n// Field constraints hook\nexport { useFieldConstraints, type UseFieldConstraintsResult } from './use-field-constraints'\n\n// Constraint hints (auto-generated helperText)\nexport { generateConstraintHint } from './constraint-hints'\n\n// Schema traversal (for form generation from Zod schema)\nexport { filterFields, getFieldPaths, type SchemaFieldInfo, traverseSchema } from './schema-traversal'\n\n// Field type mapper (for mapping field types to components)\nexport {\n type FieldRenderProps,\n type RelationFieldConfig,\n renderFieldByType,\n renderSchemaField,\n resolveFieldType,\n SchemaFieldWithRelations,\n} from './field-type-mapper'\n\n// Auto-generated fields from schema\nexport { type AutoFieldsProps, FormAutoFields } from './form-auto-fields'\n\n// Complete form from schema\nexport { FormFromSchema, type FormFromSchemaProps } from './form-from-schema'\n\n// FieldComponentType for schema metadata\nexport type { FieldComponentType } from './types/meta-types'\n\n// withUIMeta - enrich Zod schemas with UI metadata (ZenStack integration)\nexport { type DeepUIMetaConfig, type UIMetaConfig, withUIMeta, withUIMetaDeep } from './with-ui-meta'\n\n// Common meta helpers (for use with withUIMeta)\nexport {\n booleanMeta,\n commonMeta,\n dateMeta,\n enumMeta,\n numberMeta,\n relationMeta,\n type SelectionFieldType,\n textMeta,\n} from './common-meta'\n\n// Relation field provider (auto-loading relation options)\nexport {\n type QueryHookResult,\n type RelationConfig,\n type RelationFieldContextValue,\n RelationFieldProvider,\n type RelationOption,\n type RelationState,\n useRelationFieldContext,\n useRelationOptions,\n withRelations,\n} from './relation-field-provider'\n\n// Async search hook (for Combobox, Autocomplete)\nexport {\n type AsyncQueryFn,\n type AsyncQueryResult,\n useAsyncSearch,\n type UseAsyncSearchOptions,\n type UseAsyncSearchResult,\n useDebounce,\n} from './form-fields/base'\n\n// Address providers (pluggable geocoding)\nexport {\n type AddressProvider,\n type AddressSuggestion,\n createDaDataProvider,\n type SuggestionOptions,\n} from './form-fields/specialized/providers'\n","'use client'\n\nimport { createContext, useContext, type Context, type Provider } from 'react'\n\n/**\n * Результат создания безопасного контекста.\n * Содержит контекст, провайдер и два хука для доступа.\n */\nexport interface SafeContextResult<T> {\n /** React Context объект */\n Context: Context<T | null>\n /** Provider компонент */\n Provider: Provider<T | null>\n /**\n * Хук для обязательного доступа к контексту.\n * Выбрасывает ошибку, если используется вне Provider.\n */\n useContext: () => T\n /**\n * Хук для опционального доступа к контексту.\n * Возвращает null, если используется вне Provider.\n */\n useContextOptional: () => T | null\n}\n\n/**\n * Создаёт типобезопасный React Context с хуками для доступа.\n *\n * Устраняет boilerplate код при создании контекстов:\n * - Автоматически создаёт Context с дефолтным значением null\n * - Создаёт обязательный хук с понятным сообщением об ошибке\n * - Создаёт опциональный хук для случаев, когда контекст может отсутствовать\n *\n * @param contextName - Имя контекста для сообщений об ошибках\n *\n * @example\n * // Создание контекста\n * interface UserContextValue {\n * name: string\n * email: string\n * }\n *\n * export const {\n * Context: UserContext,\n * Provider: UserProvider,\n * useContext: useUser,\n * useContextOptional: useUserOptional,\n * } = createSafeContext<UserContextValue>('User')\n *\n * // Использование\n * function UserProfile() {\n * const user = useUser() // Выбросит ошибку, если вне Provider\n * return <div>{user.name}</div>\n * }\n *\n * function OptionalUserDisplay() {\n * const user = useUserOptional() // Вернёт null, если вне Provider\n * if (!user) return null\n * return <div>{user.name}</div>\n * }\n */\nexport function createSafeContext<T>(contextName: string): SafeContextResult<T> {\n const Context = createContext<T | null>(null)\n Context.displayName = contextName\n\n function useSafeContext(): T {\n const value = useContext(Context)\n if (value === null) {\n throw new Error(`use${contextName} должен использоваться внутри ${contextName}Provider`)\n }\n return value\n }\n\n function useSafeContextOptional(): T | null {\n return useContext(Context)\n }\n\n return {\n Context,\n Provider: Context.Provider,\n useContext: useSafeContext,\n useContextOptional: useSafeContextOptional,\n }\n}\n\n/**\n * Создаёт контекст для именованных групп (с fullPath).\n * Используется для Form.Group, Form.Field и подобных компонентов.\n */\nexport interface NamedGroupContextValue {\n /** Полный путь к группе (например: \"user.address\" или \"items.0\") */\n fullPath: string\n}\n\n/**\n * Создаёт контекст для компонентов с именованными группами.\n * Специализированная версия createSafeContext для групповых контекстов.\n *\n * @param contextName - Имя контекста\n *\n * @example\n * const {\n * Context: FormGroupContext,\n * useContext: useFormGroup,\n * } = createNamedGroupContext('FormGroup')\n */\nexport function createNamedGroupContext(contextName: string): SafeContextResult<NamedGroupContextValue> {\n return createSafeContext<NamedGroupContextValue>(contextName)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/context.tsx","../src/lib/form-hook.ts","../src/lib/form-field.tsx","../src/lib/tanstack-form-field.tsx","../src/lib/chakra-form-field.tsx","../src/lib/form-group-list.tsx","../src/lib/captcha/captcha-context.tsx","../src/lib/captcha/types.ts","../src/lib/captcha/captcha-field.tsx","../src/lib/declarative/dirty-guard.tsx","../src/lib/declarative/form-fields/auto/field-auto.tsx","../src/lib/declarative/relation-field-provider.tsx","../src/lib/declarative/field-type-mapper.tsx","../src/lib/declarative/form-group/form-group-declarative.tsx","../src/lib/declarative/form-group/form-group-list-context.tsx","../src/lib/declarative/form-group/form-group-list-buttons.tsx","../src/lib/declarative/form-group/form-group-list-sortable.tsx","../src/lib/declarative/form-group/form-group-list-declarative.tsx","../src/lib/declarative/schema-traversal.ts","../src/lib/declarative/form-auto-fields.tsx","../src/lib/declarative/form-buttons/button-reset.tsx","../src/lib/declarative/form-buttons/button-submit.tsx","../src/lib/declarative/form-fields/selection/field-image-choice.tsx","../src/lib/declarative/form-fields/selection/field-likert.tsx","../src/lib/declarative/form-fields/selection/field-matrix-choice.tsx","../src/lib/declarative/form-fields/selection/field-yes-no.tsx","../src/lib/declarative/form-fields/utility/use-computed-value.ts","../src/lib/declarative/form-fields/utility/field-calculated.tsx","../src/lib/declarative/form-fields/utility/field-hidden.tsx","../src/lib/declarative/form-debug-values.tsx","../src/lib/declarative/security/honeypot.tsx","../src/lib/declarative/security/rate-limiter.ts","../src/lib/declarative/form-root/form-validators.ts","../src/lib/declarative/form-root/use-field-change-listeners.ts","../src/lib/declarative/form-persistence.tsx","../src/lib/declarative/form-root/use-form-features.ts","../src/lib/declarative/form-root/form-simple.tsx","../src/lib/declarative/use-form-api.ts","../src/lib/declarative/form-root/form-loading-state.tsx","../src/lib/declarative/form-root/form-with-api.tsx","../src/lib/declarative/form-root/index.tsx","../src/lib/declarative/form-builder/form-builder.tsx","../src/lib/declarative/form-divider.tsx","../src/lib/declarative/form-errors.tsx","../src/lib/declarative/form-fields/document/document-field-base.tsx","../src/lib/declarative/form-fields/document/field-bank-account.tsx","../src/lib/declarative/form-fields/document/field-bik.tsx","../src/lib/declarative/form-fields/document/field-inn.tsx","../src/lib/declarative/form-fields/document/field-kpp.tsx","../src/lib/declarative/form-fields/document/field-ogrn.tsx","../src/lib/declarative/form-fields/document/field-passport.tsx","../src/lib/declarative/form-fields/document/field-snils.tsx","../src/lib/declarative/form-fields/table/use-table-columns.ts","../src/lib/declarative/form-fields/table/field-data-grid.tsx","../src/lib/declarative/form-fields/table/table-editor-context.tsx","../src/lib/declarative/form-fields/table/table-utils.ts","../src/lib/declarative/form-fields/table/table-footer.tsx","../src/lib/declarative/form-fields/table/table-header.tsx","../src/lib/declarative/form-fields/table/table-mobile-view.tsx","../src/lib/declarative/form-fields/table/table-cell.tsx","../src/lib/declarative/form-fields/table/table-row.tsx","../src/lib/declarative/form-fields/table/table-toolbar.tsx","../src/lib/declarative/form-fields/table/use-table-navigation.ts","../src/lib/declarative/form-fields/table/field-table-editor.tsx","../src/lib/declarative/form-from-schema.tsx","../src/lib/declarative/form-info-block.tsx","../src/lib/declarative/form-steps/form-steps-context.tsx","../src/lib/declarative/form-steps/use-step-navigation.ts","../src/lib/declarative/form-steps/use-step-persistence.ts","../src/lib/declarative/form-steps/use-step-state.ts","../src/lib/declarative/form-steps/form-steps.tsx","../src/lib/declarative/form-steps/form-steps-completed.tsx","../src/lib/declarative/form-steps/form-steps-indicator.tsx","../src/lib/declarative/form-steps/form-steps-navigation.tsx","../src/lib/declarative/form-steps/form-steps-step.tsx","../src/lib/declarative/form-watch.tsx","../src/lib/declarative/form-when.tsx","../src/lib/declarative/templates/form-from-template.tsx","../src/lib/declarative/templates/templates.tsx","../src/lib/declarative/lazy-component.tsx","../src/lib/declarative/create-form.tsx","../src/lib/declarative/use-field-actions.ts","../src/lib/declarative/with-ui-meta.ts","../src/lib/declarative/common-meta.ts","../src/lib/declarative/conversational/use-conversational-state.ts","../src/lib/declarative/conversational/conversational-mode.tsx","../src/lib/declarative/form-autosave.ts","../src/lib/declarative/form-autosave-indicator.tsx","../src/lib/declarative/index.ts","../src/lib/contexts/create-safe-context.tsx","../src/lib/captcha/verify.ts","../src/lib/history/history-controls.tsx","../src/lib/history/use-form-history.ts","../src/lib/declarative/form-readonly-view.tsx","../src/lib/declarative/form-skeleton.tsx","../src/lib/declarative/form-comparison.tsx","../src/lib/declarative/form-depends-on.tsx"],"names":["jsx","createContext","useContext","ChakraFormField","fieldContext","FieldLabel","ChakraField","useState","useCallback","jsxs","useEffect","useMemo","FormGroupListContext","FormGroupListItemContext","IconButton","getZodType","getUIMeta","getEnumValues","content","Fragment","Button","Box","Field","Text","VStack","HStack","useRef","attempts","getNestedValue","renderField","Flex","LuLandmark","LuFileText","table","Checkbox","cellKey","Input","Table","Alert","STORAGE_PREFIX","Steps","useSyncExternalStore","extractFieldNames","Children","isValidElement","Form","lazy","Suspense","z","FormGroupList","FormGroup","FormField","FormSteps","Separator","Skeleton","humanizeKey","formatValue"],"mappings":"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","file":"index.js","sourcesContent":["'use client'\n\nimport { createFormHookContexts } from '@tanstack/react-form'\nimport { type ReactNode, useMemo } from 'react'\n\n/**\n * Form hook contexts for the application\n *\n * These contexts and hooks are used by custom field components\n * to access form and field state without prop drilling.\n *\n * @example\n * ```tsx\n * // In a custom field component\n * import { useFieldContext, useFormContext } from '@lena/form-components'\n *\n * function TextField({ label }: { label: string }) {\n * const field = useFieldContext<string>()\n * return (\n * <label>\n * {label}\n * <input\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * </label>\n * )\n * }\n * ```\n */\nexport const { fieldContext, formContext, useFieldContext, useFormContext } = createFormHookContexts()\n\n/**\n * Typed wrapper around useFormContext.\n *\n * Solves the typing problem: standard useFormContext() does not accept a type argument,\n * so accessing typed values requires a workaround `as unknown as T`.\n * This hook does it automatically.\n *\n * @example\n * ```tsx\n * interface Settings {\n * fontSize: number\n * columns: number\n * }\n *\n * function LivePreview() {\n * const { values, form } = useTypedFormContext<Settings>()\n *\n * return (\n * <form.Subscribe selector={(s) => values(s)}>\n * {(settings) => (\n * // settings has type Settings\n * <div style={{ fontSize: settings.fontSize }}>...</div>\n * )}\n * </form.Subscribe>\n * )\n * }\n * ```\n */\nexport function useTypedFormContext<TFormData extends object>() {\n const rawForm = useFormContext()\n\n return useMemo(\n () => ({\n /**\n * Original form API from TanStack Form.\n * Use form.store for useStore subscriptions.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n form: rawForm as any,\n\n /**\n * Typed setFieldValue.\n * Use instead of form.setFieldValue for proper typing.\n */\n setFieldValue: <K extends keyof TFormData & string>(name: K, value: TFormData[K]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(rawForm.setFieldValue as any)(name, value)\n },\n\n /**\n * Typed selector for values.\n * Use inside form.Subscribe: `selector={(s) => values(s)}`\n */\n values: (state: { values: unknown }) => state.values as TFormData,\n\n /**\n * Get current form values (snapshot).\n * Note: this is not reactive! For reactive access use form.Subscribe.\n */\n getValues: () => rawForm.state.values as unknown as TFormData,\n\n /**\n * Subscribe to a specific field.\n * Returns a selector for use in form.Subscribe.\n */\n field:\n <K extends keyof TFormData>(name: K) =>\n (state: { values: unknown }) =>\n (state.values as TFormData)[name],\n }),\n [rawForm]\n )\n}\n\n/**\n * Types for TypedFormSubscribe component\n */\ninterface TypedFormSubscribeProps<TFormData extends object, TSelected> {\n /** Selector for choosing data from form state */\n selector: (values: TFormData) => TSelected\n /** Render function receiving selected data */\n children: (selected: TSelected) => ReactNode\n}\n\n/**\n * Typed Subscribe component for convenient form value subscriptions.\n *\n * @example\n * ```tsx\n * function LivePreview() {\n * const { TypedSubscribe } = useTypedFormSubscribe<Settings>()\n *\n * return (\n * <TypedSubscribe selector={(values) => values.fontSize}>\n * {(fontSize) => <div style={{ fontSize }}>...</div>}\n * </TypedSubscribe>\n * )\n * }\n * ```\n */\nexport function useTypedFormSubscribe<TFormData extends object>() {\n const form = useFormContext()\n\n const TypedSubscribe = useMemo(() => {\n return function TypedFormSubscribe<TSelected>({\n selector,\n children,\n }: TypedFormSubscribeProps<TFormData, TSelected>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedSelector = (state: any) => selector(state.values as unknown as TFormData)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrappedChildren = children as any\n return <form.Subscribe selector={wrappedSelector}>{wrappedChildren}</form.Subscribe>\n }\n }, [form])\n\n return { form, TypedSubscribe }\n}\n","'use client'\n\nimport { createFormHook, type FieldApi, type FormApi } from '@tanstack/react-form'\nimport { fieldContext, formContext } from './context'\n\n/**\n * Base field components for forms\n * Can be extended in individual applications\n */\nconst fieldComponents = {}\n\n/**\n * Base form components\n * Can be extended in individual applications\n */\nconst formComponents = {}\n\n/**\n * Creates a form hook for a specific application\n *\n * useAppForm provides a preconfigured form hook with:\n * - Pre-configured field and form contexts\n * - Access to form.AppField and form.AppForm for custom components\n *\n * @example\n * ```tsx\n * import { useAppForm } from '@lena/form-components'\n *\n * function MyForm() {\n * const form = useAppForm({\n * defaultValues: {\n * email: '',\n * name: '',\n * },\n * onSubmit: async ({ value }) => {\n * await submitToServer(value)\n * },\n * })\n *\n * return (\n * <form onSubmit={(e) => { e.preventDefault(); form.handleSubmit() }}>\n * <form.Field\n * name=\"email\"\n * children={(field) => (\n * <input\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * />\n * )}\n * />\n * <button type=\"submit\">Submit</button>\n * </form>\n * )\n * }\n * ```\n */\nexport const { useAppForm, withForm } = createFormHook({\n fieldContext,\n formContext,\n fieldComponents,\n formComponents,\n})\n\n// Re-export types for convenience\nexport type { FieldApi, FormApi }\n","'use client'\n\nimport { createContext, type ReactNode, useContext } from 'react'\nimport { useFormGroup } from './form-group'\n\n/**\n * Context value for FormField\n */\nexport interface FormFieldContextValue {\n /** Original name prop passed to this FormField */\n originalName: string\n /** Full dotted path including all parent FormGroup/FormField names */\n name: string\n}\n\nconst FormFieldContext = createContext<FormFieldContextValue | null>(null)\n\nexport interface FormFieldProps {\n /** Field name. Will be concatenated with parent FormGroup names using dot notation */\n name: string\n /**\n * Either React elements or a render function receiving field naming info.\n * If function: receives { originalName, name } as parameter\n * If elements: can use useFormField() hook to access field naming info\n */\n children: ReactNode | ((props: FormFieldContextValue) => ReactNode)\n}\n\n/**\n * FormField component for building form field names\n *\n * Uses FormGroup context to build dotted path names.\n * Supports two usage patterns:\n * 1. Render prop: Pass a function to receive field naming info directly\n * 2. Context: Pass regular elements that use useFormField() hook\n *\n * @example\n * ```tsx\n * // Render prop pattern\n * <FormField name=\"email\">\n * {({ name }) => <Input name={name} />}\n * </FormField>\n *\n * // Context pattern with hook\n * <FormField name=\"email\">\n * <MyCustomInput /> // uses useFormField() internally\n * </FormField>\n *\n * // Inside FormGroup\n * <FormGroup name=\"user\">\n * <FormField name=\"email\">\n * {({ name }) => <Input name={name} />} // name=\"user.email\"\n * </FormField>\n * </FormGroup>\n * ```\n */\nexport function FormField({ name, children }: FormFieldProps) {\n const formGroupContext = useFormGroup()\n\n const contextValue: FormFieldContextValue = {\n originalName: name,\n name: formGroupContext ? `${formGroupContext.name}.${name}` : name,\n }\n\n const content = typeof children === 'function' ? children(contextValue) : children\n\n return <FormFieldContext.Provider value={contextValue}>{content}</FormFieldContext.Provider>\n}\n\n/**\n * Hook to access current FormField context\n *\n * @returns FormField context value with originalName and full dotted path name,\n * or null if not inside a FormField\n *\n * @example\n * ```tsx\n * function MyInput() {\n * const formField = useFormField();\n * return <input name={formField?.name} />;\n * }\n * ```\n */\nexport function useFormField(): FormFieldContextValue | null {\n return useContext(FormFieldContext)\n}\n","'use client'\n\nimport { type AnyFieldApi } from '@tanstack/react-form'\nimport { createContext, type ReactNode, useContext } from 'react'\nimport { useFormGroup } from './form-group'\n\n/**\n * Context value for TanStackFormField\n * Provides both naming info and TanStack Form field API\n */\nexport interface TanStackFormFieldContextValue {\n /** Original name prop passed to this field */\n originalName: string\n /** Full dotted path including all parent FormGroup names */\n name: string\n /** TanStack Form field API */\n field: AnyFieldApi\n}\n\nconst TanStackFormFieldContext = createContext<TanStackFormFieldContextValue | null>(null)\n\nexport interface TanStackFormFieldProps {\n /** Field name. Will be concatenated with parent FormGroup names using dot notation */\n name: string\n /** TanStack Form field API from form.Field or useField */\n field: AnyFieldApi\n /**\n * Either React elements or a render function receiving field info.\n * If function: receives { originalName, name, field } as parameter\n * If elements: can use useTanStackFormField() hook to access field info\n */\n children: ReactNode | ((props: TanStackFormFieldContextValue) => ReactNode)\n}\n\n/**\n * TanStackFormField component integrating TanStack Form with FormGroup context\n *\n * Combines TanStack Form's field API with FormGroup's dotted naming for\n * building complex nested form structures.\n *\n * @example\n * ```tsx\n * // Direct usage with form.Field\n * <form.Field name=\"email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * {({ field: f, name }) => (\n * <Input\n * name={name}\n * value={f.state.value}\n * onChange={(e) => f.handleChange(e.target.value)}\n * />\n * )}\n * </TanStackFormField>\n * )}\n * </form.Field>\n *\n * // Inside FormGroup\n * <FormGroup name=\"user\">\n * <form.Field name=\"user.email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * <ChakraTextField /> // uses useTanStackFormField() internally\n * </TanStackFormField>\n * )}\n * </form.Field>\n * </FormGroup>\n * ```\n */\nexport function TanStackFormField({ name, field, children }: TanStackFormFieldProps) {\n const formGroupContext = useFormGroup()\n\n const contextValue: TanStackFormFieldContextValue = {\n originalName: name,\n name: formGroupContext ? `${formGroupContext.name}.${name}` : name,\n field,\n }\n\n const content = typeof children === 'function' ? children(contextValue) : children\n\n return <TanStackFormFieldContext.Provider value={contextValue}>{content}</TanStackFormFieldContext.Provider>\n}\n\n/**\n * Hook to access current TanStackFormField context\n *\n * @returns TanStackFormField context value with originalName, full dotted path name,\n * and TanStack Form field API, or null if not inside a TanStackFormField\n *\n * @example\n * ```tsx\n * function MyInput() {\n * const ctx = useTanStackFormField();\n * if (!ctx) return null;\n *\n * const { field, name } = ctx;\n * return (\n * <input\n * name={name}\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * );\n * }\n * ```\n */\nexport function useTanStackFormField(): TanStackFormFieldContextValue | null {\n return useContext(TanStackFormFieldContext)\n}\n","'use client'\n\nimport { Field as ChakraField } from '@chakra-ui/react'\nimport { forwardRef, type ReactNode } from 'react'\nimport { useTanStackFormField } from './tanstack-form-field'\n\nexport interface ChakraFormFieldProps extends Omit<ChakraField.RootProps, 'label' | 'invalid'> {\n /** Field label text */\n label?: ReactNode\n /** Helper text below the field */\n helperText?: ReactNode\n /** Override error text (by default uses TanStack Form errors) */\n errorText?: ReactNode\n /** Text for optional field */\n optionalText?: ReactNode\n /** Show required field indicator */\n required?: boolean\n /** Override invalid state (by default uses TanStack Form errors) */\n invalid?: boolean\n /** Children elements — the form input element itself */\n children: ReactNode\n}\n\n/**\n * ChakraFormField - Chakra UI v3 field with TanStack Form integration\n *\n * Automatically displays validation errors from TanStack Form field API.\n * Must be used inside a TanStackFormField component.\n *\n * @example\n * ```tsx\n * <form.Field name=\"email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * <ChakraFormField label=\"Email\" helperText=\"Your work email\" required>\n * <Input\n * value={field.state.value}\n * onChange={(e) => field.handleChange(e.target.value)}\n * onBlur={field.handleBlur}\n * />\n * </ChakraFormField>\n * </TanStackFormField>\n * )}\n * </form.Field>\n * ```\n */\nexport const ChakraFormField = forwardRef<HTMLDivElement, ChakraFormFieldProps>(function ChakraFormField(props, ref) {\n const { label, children, helperText, errorText, optionalText, required, invalid, ...rest } = props\n\n const fieldContext = useTanStackFormField()\n\n // Get errors from TanStack Form field\n const fieldErrors = fieldContext?.field.state.meta.errors\n const hasErrors = fieldErrors && fieldErrors.length > 0\n const isInvalid = invalid ?? hasErrors\n\n // Format error messages\n const errorMessages =\n errorText ??\n (hasErrors\n ? fieldErrors\n .map((e: unknown) => (typeof e === 'string' ? e : ((e as { message?: string }).message ?? String(e))))\n .join(', ')\n : undefined)\n\n // Workaround: Chakra UI Field types do not include children in Next.js 16 production build\n const FieldLabel = ChakraField.Label as React.FC<{ children: ReactNode }>\n const FieldHelperText = ChakraField.HelperText as React.FC<{ children: ReactNode }>\n const FieldErrorText = ChakraField.ErrorText as React.FC<{ children: ReactNode }>\n\n return (\n <ChakraField.Root ref={ref} invalid={isInvalid} required={required} {...rest}>\n {label && (\n <FieldLabel>\n {label}\n <ChakraField.RequiredIndicator fallback={optionalText} />\n </FieldLabel>\n )}\n {children}\n {helperText && !isInvalid && <FieldHelperText>{helperText}</FieldHelperText>}\n {isInvalid && errorMessages && <FieldErrorText>{errorMessages}</FieldErrorText>}\n </ChakraField.Root>\n )\n})\n","'use client'\n\nimport { type AnyFieldApi } from '@tanstack/react-form'\nimport { createContext, type ReactNode, useContext } from 'react'\nimport { FormGroup } from './form-group'\n\n/**\n * Context value for FormGroupList array operations\n */\nexport interface FormGroupListContextValue<TItem = unknown> {\n /** Array field API for add/remove operations */\n pushValue: (value: TItem) => void\n removeValue: (index: number) => void\n moveValue: (from: number, to: number) => void\n swapValues: (indexA: number, indexB: number) => void\n insertValue: (index: number, value: TItem) => void\n replaceValue: (index: number, value: TItem) => void\n /** Current array values */\n values: TItem[]\n /** Number of items in the array */\n length: number\n}\n\n/**\n * Context value for FormGroupListItem\n */\nexport interface FormGroupListItemContextValue {\n /** Index of this item in the array */\n index: number\n /** Remove this item from the array */\n remove: () => void\n /** Whether this is the first item */\n isFirst: boolean\n /** Whether this is the last item */\n isLast: boolean\n /** Move this item up (swap with previous) */\n moveUp: () => void\n /** Move this item down (swap with next) */\n moveDown: () => void\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FormGroupListContext = createContext<FormGroupListContextValue<any> | null>(null)\nconst FormGroupListItemContext = createContext<FormGroupListItemContextValue | null>(null)\n\nexport interface FormGroupListProps<TItem = unknown> {\n /** Field name for this array group */\n name: string\n /** TanStack Form field API with mode=\"array\" */\n field: AnyFieldApi\n /**\n * Render function for array items.\n * Receives item, index, and array field operations.\n */\n children: (items: TItem[], ctx: FormGroupListContextValue<TItem>) => ReactNode\n /** Content to show when array is empty */\n emptyContent?: ReactNode\n}\n\n/**\n * FormGroupList - Component for managing array fields with TanStack Form\n *\n * Provides array operations (add, remove, move, swap) and integrates with\n * FormGroup for nested field naming.\n *\n * @example\n * ```tsx\n * <form.Field name=\"phones\" mode=\"array\">\n * {(phonesField) => (\n * <FormGroupList name=\"phones\" field={phonesField} emptyContent=\"No phones added\">\n * {(items, { pushValue }) => (\n * <>\n * {items.map((_, index) => (\n * <FormGroupListItem key={index} index={index}>\n * {({ remove }) => (\n * <FormGroup name={String(index)}>\n * <form.Field name={`phones[${index}].number`}>\n * {(field) => <Input value={field.state.value} onChange={(e) => field.handleChange(e.target.value)} />}\n * </form.Field>\n * <Button onClick={remove}>Remove</Button>\n * </FormGroup>\n * )}\n * </FormGroupListItem>\n * ))}\n * <Button onClick={() => pushValue({ number: '' })}>Add Phone</Button>\n * </>\n * )}\n * </FormGroupList>\n * )}\n * </form.Field>\n * ```\n */\nexport function FormGroupList<TItem = unknown>({ name, field, children, emptyContent }: FormGroupListProps<TItem>) {\n const values = ((field.state.value as unknown[]) ?? []) as TItem[]\n\n const contextValue: FormGroupListContextValue<TItem> = {\n pushValue: (value: TItem) => field.pushValue(value),\n removeValue: (index: number) => field.removeValue(index),\n moveValue: (from: number, to: number) => field.moveValue(from, to),\n swapValues: (indexA: number, indexB: number) => field.swapValues(indexA, indexB),\n insertValue: (index: number, value: TItem) => field.insertValue(index, value),\n replaceValue: (index: number, value: TItem) => field.replaceValue(index, value),\n values,\n length: values.length,\n }\n\n const content = values.length === 0 && emptyContent ? emptyContent : children(values, contextValue)\n\n return (\n <FormGroup name={name}>\n <FormGroupListContext.Provider value={contextValue}>{content}</FormGroupListContext.Provider>\n </FormGroup>\n )\n}\n\nexport interface FormGroupListItemProps {\n /** Index of this item in the array */\n index: number\n /**\n * Render function receiving item context with remove and move operations\n */\n children: ReactNode | ((ctx: FormGroupListItemContextValue) => ReactNode)\n}\n\n/**\n * FormGroupListItem - Wrapper for individual array items\n *\n * Provides item-specific operations (remove, move up/down) and\n * creates a FormGroup with the item index as name.\n *\n * @example\n * ```tsx\n * <FormGroupListItem index={index}>\n * {({ remove, moveUp, moveDown, isFirst, isLast }) => (\n * <HStack>\n * <Input />\n * <Button onClick={moveUp} disabled={isFirst}>Up</Button>\n * <Button onClick={moveDown} disabled={isLast}>Down</Button>\n * <Button onClick={remove}>Remove</Button>\n * </HStack>\n * )}\n * </FormGroupListItem>\n * ```\n */\nexport function FormGroupListItem({ index, children }: FormGroupListItemProps) {\n const listContext = useFormGroupList()\n\n if (!listContext) {\n throw new Error('FormGroupListItem must be used inside FormGroupList')\n }\n\n const itemContext: FormGroupListItemContextValue = {\n index,\n remove: () => listContext.removeValue(index),\n isFirst: index === 0,\n isLast: index === listContext.length - 1,\n moveUp: () => {\n if (index > 0) {\n listContext.swapValues(index, index - 1)\n }\n },\n moveDown: () => {\n if (index < listContext.length - 1) {\n listContext.swapValues(index, index + 1)\n }\n },\n }\n\n const content = typeof children === 'function' ? children(itemContext) : children\n\n return (\n <FormGroup name={String(index)}>\n <FormGroupListItemContext.Provider value={itemContext}>{content}</FormGroupListItemContext.Provider>\n </FormGroup>\n )\n}\n\n/**\n * Hook to access FormGroupList context with array operations\n *\n * @returns FormGroupList context with pushValue, removeValue, etc.\n * or null if not inside a FormGroupList\n */\nexport function useFormGroupList<TItem = unknown>(): FormGroupListContextValue<TItem> | null {\n return useContext(FormGroupListContext)\n}\n\n/**\n * Hook to access FormGroupListItem context with item operations\n *\n * @returns FormGroupListItem context with remove, moveUp, moveDown, etc.\n * or null if not inside a FormGroupListItem\n */\nexport function useFormGroupListItem(): FormGroupListItemContextValue | null {\n return useContext(FormGroupListItemContext)\n}\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { CaptchaConfig } from './types'\n\n/**\n * Контекст для передачи конфигурации CAPTCHA через createForm.\n * Позволяет Form.Captcha без пропсов использовать дефолтные настройки.\n */\nexport const CaptchaContext = createContext<CaptchaConfig | undefined>(undefined)\n\n/** Хук для доступа к конфигурации CAPTCHA из контекста */\nexport function useCaptchaConfig(): CaptchaConfig | undefined {\n return useContext(CaptchaContext)\n}\n","/** Поддерживаемые провайдеры CAPTCHA */\nexport type CaptchaProvider = 'turnstile' | 'recaptcha' | 'hcaptcha'\n\n/** Тема виджета CAPTCHA */\nexport type CaptchaTheme = 'auto' | 'light' | 'dark'\n\n/** Размер виджета CAPTCHA */\nexport type CaptchaSize = 'normal' | 'compact' | 'invisible'\n\n/** Конфигурация CAPTCHA на уровне createForm */\nexport interface CaptchaConfig {\n /** Провайдер CAPTCHA */\n provider: CaptchaProvider\n /** Публичный siteKey провайдера */\n siteKey: string\n /** Тема виджета (по умолчанию: 'auto') */\n theme?: CaptchaTheme\n /** Размер виджета (по умолчанию: 'normal') */\n size?: CaptchaSize\n /** Язык виджета (ISO 639-1, напр. 'ru') */\n language?: string\n}\n\n/** Пропсы компонента Form.Captcha */\nexport interface CaptchaFieldProps {\n /** Провайдер (переопределяет createForm) */\n provider?: CaptchaProvider\n /** Публичный siteKey (переопределяет createForm) */\n siteKey?: string\n /** Тема виджета */\n theme?: CaptchaTheme\n /** Размер виджета */\n size?: CaptchaSize\n /** Язык виджета */\n language?: string\n /** Callback при успешной верификации */\n onSuccess?: (token: string) => void\n /** Callback при ошибке верификации */\n onError?: (error: unknown) => void\n /** Callback при истечении токена */\n onExpire?: () => void\n}\n\n/** Результат серверной верификации */\nexport interface CaptchaVerifyResult {\n /** Успешна ли верификация */\n success: boolean\n /** Коды ошибок (если есть) */\n errorCodes?: string[]\n /** Hostname с которого пришёл запрос */\n hostname?: string\n /** Timestamp верификации */\n challengeTs?: string\n}\n\n/** Опции серверной верификации */\nexport interface CaptchaVerifyOptions {\n /** Провайдер CAPTCHA */\n provider: CaptchaProvider\n /** Секретный ключ провайдера (ТОЛЬКО на сервере!) */\n secretKey: string\n /** IP адрес пользователя (опционально, для reCAPTCHA) */\n remoteIp?: string\n}\n\n/** Имя скрытого поля для токена CAPTCHA */\nexport const CAPTCHA_TOKEN_FIELD = '__captchaToken' as const\n","'use client'\n\nimport { lazy, Suspense, useCallback, useState } from 'react'\nimport { useDeclarativeFormOptional } from '../declarative/form-context'\nimport { useCaptchaConfig } from './captcha-context'\nimport type { CaptchaFieldProps, CaptchaProvider } from './types'\nimport { CAPTCHA_TOKEN_FIELD } from './types'\n\n// Провайдеры загружаются лениво — только нужный\nconst providers: Record<CaptchaProvider, ReturnType<typeof lazy>> = {\n turnstile: lazy(() => import('./providers/turnstile').then((m) => ({ default: m.TurnstileProvider }))),\n recaptcha: lazy(() => import('./providers/recaptcha').then((m) => ({ default: m.RecaptchaProvider }))),\n hcaptcha: lazy(() => import('./providers/hcaptcha').then((m) => ({ default: m.HcaptchaProvider }))),\n}\n\n/**\n * Компонент CAPTCHA для декларативных форм.\n *\n * Рендерит виджет выбранного провайдера и сохраняет токен\n * в скрытое поле формы `__captchaToken`.\n *\n * @example С пропсами\n * ```tsx\n * <Form.Captcha\n * provider=\"turnstile\"\n * siteKey={process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY!}\n * theme=\"auto\"\n * />\n * ```\n *\n * @example Через createForm (без пропсов)\n * ```tsx\n * const AppForm = createForm({\n * captcha: { provider: 'turnstile', siteKey: '...' },\n * })\n * <AppForm.Captcha />\n * ```\n */\nexport function CaptchaField(props: CaptchaFieldProps) {\n const config = useCaptchaConfig()\n const formCtx = useDeclarativeFormOptional()\n\n // Мерж пропсов: component props > createForm config\n const provider = props.provider ?? config?.provider\n const siteKey = props.siteKey ?? config?.siteKey\n const theme = props.theme ?? config?.theme ?? 'auto'\n const size = props.size ?? config?.size ?? 'normal'\n const language = props.language ?? config?.language\n\n const [, setToken] = useState<string | null>(null)\n\n // Все хуки ОБЯЗАНЫ быть до условных return (rules of hooks)\n const handleSuccess = useCallback(\n (captchaToken: string) => {\n setToken(captchaToken)\n\n // Сохраняем токен в поле формы если доступен контекст\n if (formCtx?.form) {\n formCtx.form.setFieldValue(CAPTCHA_TOKEN_FIELD, captchaToken)\n }\n\n props.onSuccess?.(captchaToken)\n },\n [formCtx, props.onSuccess],\n )\n\n const handleError = useCallback(\n (error: unknown) => {\n setToken(null)\n if (formCtx?.form) {\n formCtx.form.setFieldValue(CAPTCHA_TOKEN_FIELD, '')\n }\n props.onError?.(error)\n },\n [formCtx, props.onError],\n )\n\n const handleExpire = useCallback(() => {\n setToken(null)\n if (formCtx?.form) {\n formCtx.form.setFieldValue(CAPTCHA_TOKEN_FIELD, '')\n }\n props.onExpire?.()\n }, [formCtx, props.onExpire])\n\n // Условные return ПОСЛЕ всех хуков\n if (!provider || !siteKey) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(\n '[Form.Captcha] provider и siteKey обязательны. '\n + 'Передайте через пропсы или настройте captcha в createForm().',\n )\n }\n return null\n }\n\n const ProviderComponent = providers[provider]\n if (!ProviderComponent) {\n console.error(`[Form.Captcha] Неизвестный провайдер: ${provider}`)\n return null\n }\n\n return (\n <Suspense fallback={<div style={{ height: 65, width: 300 }} />}>\n <ProviderComponent\n siteKey={siteKey}\n theme={theme}\n size={size}\n language={language}\n onSuccess={handleSuccess}\n onError={handleError}\n onExpire={handleExpire}\n />\n </Suspense>\n )\n}\n","'use client'\n\nimport { useRouter } from 'next/navigation'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\n/**\n * Props for DirtyGuard component\n */\nexport interface DirtyGuardProps {\n /**\n * Message to show in browser's native beforeunload dialog\n * Note: Most modern browsers ignore custom messages and show their own\n */\n message?: string\n /**\n * Title for the confirmation dialog\n * @default \"Unsaved changes\"\n */\n dialogTitle?: string\n /**\n * Description for the confirmation dialog\n * @default \"You have unsaved changes. Are you sure you want to leave this page?\"\n */\n dialogDescription?: string\n /**\n * Text for the confirm button\n * @default \"Leave\"\n */\n confirmText?: string\n /**\n * Text for the cancel button\n * @default \"Stay\"\n */\n cancelText?: string\n /**\n * Whether to enable the guard (default: true)\n * Can be used to conditionally disable the guard\n */\n enabled?: boolean\n /**\n * Callback when user attempts to leave with unsaved changes\n * Return false to allow navigation without confirmation\n */\n onBlock?: () => boolean | void\n}\n\n/**\n * Form.DirtyGuard - Prevent accidental navigation when form has unsaved changes\n *\n * Shows browser's native confirmation dialog when user tries to:\n * - Close the tab/window\n * - Refresh the page\n *\n * Shows custom dialog for in-app navigation:\n * - Clicking on Next.js Link components\n * - Clicking on anchor tags with internal hrefs\n *\n * @example Basic usage\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.DirtyGuard />\n * <Form.Field.String name=\"title\" />\n * <Form.Button.Submit />\n * </Form>\n * ```\n *\n * @example With custom messages\n * ```tsx\n * <Form.DirtyGuard\n * dialogTitle=\"Leaving?\"\n * dialogDescription=\"Data will be lost!\"\n * confirmText=\"Yes, leave\"\n * cancelText=\"No, stay\"\n * />\n * ```\n */\nexport function DirtyGuard({\n message = 'You have unsaved changes. Are you sure you want to leave?',\n dialogTitle = 'Unsaved changes',\n dialogDescription = 'You have unsaved changes. Are you sure you want to leave this page?',\n confirmText = 'Leave',\n cancelText = 'Stay',\n enabled = true,\n onBlock,\n}: DirtyGuardProps): ReactElement | null {\n const { form } = useDeclarativeForm()\n const router = useRouter()\n const [showDialog, setShowDialog] = useState(false)\n const pendingHref = useRef<string | null>(null)\n\n // Check isDirty\n const checkIsDirty = useCallback(() => {\n const state = form.state\n return state.isDirty\n }, [form])\n\n // Handler for beforeunload (tab close, refresh)\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n const handleBeforeUnload = (event: BeforeUnloadEvent): string | undefined => {\n if (checkIsDirty()) {\n const shouldBlock = onBlock?.()\n if (shouldBlock === false) {\n return undefined\n }\n\n event.preventDefault()\n event.returnValue = message\n return message\n }\n return undefined\n }\n\n window.addEventListener('beforeunload', handleBeforeUnload)\n return () => window.removeEventListener('beforeunload', handleBeforeUnload)\n }, [enabled, message, onBlock, checkIsDirty])\n\n // Intercept clicks on internal links\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n const handleClick = (event: MouseEvent) => {\n // Check if form is dirty\n if (!checkIsDirty()) {\n return\n }\n\n // Find closest anchor or element with data-href\n const target = event.target as HTMLElement\n const anchor = target.closest('a')\n\n if (!anchor) {\n return\n }\n\n const href = anchor.getAttribute('href')\n if (!href) {\n return\n }\n\n // Skip external links and special protocols\n if (\n href.startsWith('http://') ||\n href.startsWith('https://') ||\n href.startsWith('mailto:') ||\n href.startsWith('tel:') ||\n href.startsWith('#')\n ) {\n return\n }\n\n // Skip if target=\"_blank\"\n if (anchor.target === '_blank') {\n return\n }\n\n // Skip if Ctrl/Cmd is held (open in new tab)\n if (event.ctrlKey || event.metaKey) {\n return\n }\n\n // Call onBlock callback\n const shouldBlock = onBlock?.()\n if (shouldBlock === false) {\n return\n }\n\n // Prevent navigation and show dialog\n event.preventDefault()\n event.stopPropagation()\n pendingHref.current = href\n setShowDialog(true)\n }\n\n // Use capture to intercept before Next.js\n document.addEventListener('click', handleClick, { capture: true })\n return () => document.removeEventListener('click', handleClick, { capture: true })\n }, [enabled, onBlock, checkIsDirty])\n\n // Confirm navigation\n const handleConfirm = useCallback(() => {\n setShowDialog(false)\n if (pendingHref.current) {\n // Reset dirty state before navigation to avoid re-triggering\n form.reset()\n router.push(pendingHref.current)\n pendingHref.current = null\n }\n }, [form, router])\n\n // Cancel navigation\n const handleCancel = useCallback(() => {\n setShowDialog(false)\n pendingHref.current = null\n }, [])\n\n // Render confirmation dialog\n if (!showDialog) {\n return null\n }\n\n // Simple inline dialog (no dependency on Chakra Dialog)\n return (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n }}\n onClick={handleCancel}\n >\n <div\n style={{\n backgroundColor: 'var(--chakra-colors-bg-panel, white)',\n borderRadius: '12px',\n padding: '24px',\n maxWidth: '400px',\n width: '90%',\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.25)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2\n style={{\n margin: '0 0 8px 0',\n fontSize: '1.125rem',\n fontWeight: 600,\n color: 'var(--chakra-colors-fg, inherit)',\n }}\n >\n {dialogTitle}\n </h2>\n <p\n style={{\n margin: '0 0 24px 0',\n fontSize: '0.875rem',\n color: 'var(--chakra-colors-fg-muted, #666)',\n }}\n >\n {dialogDescription}\n </p>\n <div\n style={{\n display: 'flex',\n gap: '12px',\n justifyContent: 'flex-end',\n }}\n >\n <button\n onClick={handleCancel}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: '1px solid var(--chakra-colors-border, #e2e8f0)',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n }}\n >\n {cancelText}\n </button>\n <button\n onClick={handleConfirm}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'var(--chakra-colors-red-500, #e53e3e)',\n color: 'white',\n cursor: 'pointer',\n fontSize: '0.875rem',\n fontWeight: 500,\n }}\n >\n {confirmText}\n </button>\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { renderFieldByType } from '../../field-type-mapper'\nimport { useDeclarativeForm } from '../../form-context'\nimport { getZodConstraints } from '../../schema-constraints'\nimport type { BaseFieldProps } from '../../types'\nimport type { FieldUIMeta } from '../../types/meta-types'\nimport { FieldCheckbox } from '../boolean/field-checkbox'\nimport { FieldSwitch } from '../boolean/field-switch'\nimport { FieldDate } from '../datetime/field-date'\nimport { FieldNumber } from '../number/field-number'\nimport { FieldNativeSelect } from '../selection/field-native-select'\nimport { FieldString } from '../text/field-string'\nimport { FieldTextarea } from '../text/field-textarea'\n\n/**\n * Auto-detection configuration for field type\n */\nexport interface AutoFieldConfig {\n /**\n * Prefer Switch over Checkbox for boolean\n * @default false\n */\n booleanAsSwitch?: boolean\n /**\n * Use Textarea for long strings (based on maxLength in schema)\n * @default true\n */\n useTextareaForLongStrings?: boolean\n /**\n * Length threshold for using Textarea\n * @default 200\n */\n textareaThreshold?: number\n}\n\n/**\n * Props for AutoField\n */\nexport interface AutoFieldProps extends BaseFieldProps {\n /** Auto-detection configuration */\n config?: AutoFieldConfig\n}\n\n/**\n * Extract Zod type from schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getZodType(schema: any): string | undefined {\n if (!schema?._zod?.def) {\n return undefined\n }\n\n const type = schema._zod.def.type\n\n // Unwrap wrapper types\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n return getZodType(schema._zod.def.inner)\n }\n\n return type\n}\n\n/**\n * Get enum values from Zod schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getEnumValues(schema: any): string[] | undefined {\n if (!schema?._zod?.def) {\n return undefined\n }\n\n const type = schema._zod.def.type\n\n // Unwrap wrapper types\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n return getEnumValues(schema._zod.def.inner)\n }\n\n if (type === 'enum') {\n return schema._zod.def.values\n }\n\n if (type === 'literal') {\n const value = schema._zod.def.value\n return typeof value === 'string' ? [value] : undefined\n }\n\n return undefined\n}\n\n/**\n * Get maxLength from Zod checks\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getMaxLength(schema: any): number | undefined {\n if (!schema?._zod?.def?.checks) {\n return undefined\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maxCheck = schema._zod.def.checks.find((c: any) => c.kind === 'max_length' || c.kind === 'max')\n return maxCheck?.value\n}\n\n/**\n * Get UI meta from Zod schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getUIMeta(schema: any): FieldUIMeta | undefined {\n if (!schema?.meta) {\n return undefined\n }\n\n try {\n const meta = schema.meta()\n return meta?.ui as FieldUIMeta | undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Navigate to schema by path\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSchemaAtPath(schema: any, path: string): any {\n if (!schema || !path) {\n return schema\n }\n\n const parts = path.split('.')\n let current = schema\n\n for (const part of parts) {\n // Unwrap wrapper types\n while (current?._zod?.def?.type && ['optional', 'nullable', 'default'].includes(current._zod.def.type)) {\n current = current._zod.def.inner\n }\n\n if (!current) {\n return undefined\n }\n\n // Skip numeric indices\n if (/^\\d+$/.test(part)) {\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Navigate into object\n if (current._zod?.def?.type === 'object') {\n const shape = current._zod.def.shape\n if (shape && part in shape) {\n current = shape[part]\n } else {\n return undefined\n }\n } else {\n return undefined\n }\n }\n\n return current\n}\n\n/**\n * Convert camelCase to readable label\n * @example \"firstName\" → \"First Name\"\n * @example \"createdAt\" → \"Created At\"\n */\nexport function camelCaseToLabel(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1') // Add space before capitals\n .replace(/^./, (s) => s.toUpperCase()) // Capitalize first letter\n .trim()\n}\n\n/**\n * Form.Field.Auto - Auto-detection of field type from Zod schema\n *\n * Automatically selects appropriate field component based on Zod schema type:\n * - string → FieldString (or FieldTextarea for long strings)\n * - number/bigint/int/float → FieldNumber\n * - boolean → FieldCheckbox (or FieldSwitch)\n * - date → FieldDate\n * - enum → FieldNativeSelect\n *\n * If label is not specified, it is generated from field name (camelCase → \"Readable Label\").\n *\n * @example Basic usage\n * ```tsx\n * const schema = z.object({\n * firstName: z.string(),\n * age: z.number(),\n * isActive: z.boolean(),\n * role: z.enum(['admin', 'user', 'guest']),\n * createdAt: z.date(),\n * })\n *\n * <Form schema={schema} initialValue={...} onSubmit={...}>\n * <Form.Field.Auto name=\"firstName\" /> // → FieldString, label=\"First Name\"\n * <Form.Field.Auto name=\"age\" /> // → FieldNumber, label=\"Age\"\n * <Form.Field.Auto name=\"isActive\" /> // → FieldCheckbox, label=\"Is Active\"\n * <Form.Field.Auto name=\"role\" /> // → FieldNativeSelect with options\n * <Form.Field.Auto name=\"createdAt\" /> // → FieldDate\n * </Form>\n * ```\n *\n * @example With configuration\n * ```tsx\n * <Form.Field.Auto\n * name=\"isActive\"\n * config={{ booleanAsSwitch: true }}\n * />\n * ```\n *\n * @example With explicit fieldType in meta\n * ```tsx\n * const schema = z.object({\n * bio: z.string().meta({ ui: { title: 'Biography', fieldType: 'richText' } }),\n * })\n *\n * <Form.Field.Auto name=\"bio\" /> // → FieldRichText (from meta.fieldType)\n * ```\n */\nexport function FieldAuto({ name, config, ...baseProps }: AutoFieldProps): ReactElement {\n const { schema } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n if (!name) {\n throw new Error('Form.Field.Auto requires a name prop')\n }\n\n // Build full path\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Get field schema\n const fieldSchema = getSchemaAtPath(schema, fullPath)\n const zodType = getZodType(fieldSchema)\n const enumValues = getEnumValues(fieldSchema)\n const maxLength = getMaxLength(fieldSchema)\n const uiMeta = getUIMeta(fieldSchema)\n\n // Auto-label if not specified\n const label = baseProps.label ?? uiMeta?.title ?? camelCaseToLabel(name)\n\n // If explicit fieldType in meta — use renderFieldByType\n if (uiMeta?.fieldType) {\n const constraints = getZodConstraints(schema, fullPath)\n return renderFieldByType(uiMeta.fieldType, {\n name,\n label,\n placeholder: baseProps.placeholder ?? uiMeta.placeholder,\n helperText: baseProps.helperText ?? uiMeta.description,\n required: baseProps.required,\n disabled: baseProps.disabled,\n readOnly: baseProps.readOnly,\n enumValues,\n constraints,\n fieldProps: uiMeta.fieldProps,\n })\n }\n\n // Configuration with defaults\n const { booleanAsSwitch = false, useTextareaForLongStrings = true, textareaThreshold = 200 } = config ?? {}\n\n // Determine component by schema type (fallback)\n switch (zodType) {\n case 'string':\n // Check, Textarea is needed\n if (useTextareaForLongStrings && maxLength && maxLength > textareaThreshold) {\n return <FieldTextarea name={name} label={label} {...baseProps} />\n }\n return <FieldString name={name} label={label} {...baseProps} />\n\n case 'number':\n case 'bigint':\n case 'int':\n case 'float':\n return <FieldNumber name={name} label={label} {...baseProps} />\n\n case 'boolean':\n if (booleanAsSwitch) {\n return <FieldSwitch name={name} label={label} {...baseProps} />\n }\n return <FieldCheckbox name={name} label={label} {...baseProps} />\n\n case 'date':\n return <FieldDate name={name} label={label} {...baseProps} />\n\n case 'enum':\n if (enumValues) {\n // NativeSelectOption uses title instead of label\n const options = enumValues.map((value) => ({\n title: camelCaseToLabel(value),\n value,\n }))\n return <FieldNativeSelect name={name} label={label} options={options} {...baseProps} />\n }\n return <FieldString name={name} label={label} {...baseProps} />\n\n default:\n // Fallback to String\n return <FieldString name={name} label={label} {...baseProps} />\n }\n}\n\nFieldAuto.displayName = 'FieldAuto'\n","'use client'\n\nimport { createContext, type ReactNode, useContext, useEffect, useMemo, useState } from 'react'\n\n/**\n * Option for selection field\n */\nexport interface RelationOption {\n /** Value (usually ID) */\n value: string\n /** Display text */\n label: string\n /** Description (optional) */\n description?: string\n}\n\n/**\n * Loading state relation\n */\nexport interface RelationState {\n /** Options for selection */\n options: RelationOption[]\n /** Loading in progress */\n isLoading: boolean\n /** Error loading */\n error: Error | null\n}\n\n/**\n * Data loading hook result\n */\nexport interface QueryHookResult<TData = unknown> {\n data?: TData[] | null\n isLoading: boolean\n error?: Error | null\n}\n\n/**\n * Relation loading configuration\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface RelationConfig<TData = any, TArgs = any> {\n /** Model name (must match model in relationMeta) */\n model: string\n /**\n * React hook for loading data (must return { data, isLoading, error })\n * @example useFindManyCategory\n */\n useQuery: (args?: TArgs) => QueryHookResult<TData>\n /** Field to display as label */\n labelField: string\n /** Field for value (by default 'id') */\n valueField?: string\n /** Field for description (optional) */\n descriptionField?: string\n /** Arguments for useQuery (filters, sorting) */\n queryArgs?: TArgs\n}\n\n/**\n * RelationFieldProvider context value\n */\nexport interface RelationFieldContextValue {\n /** Get options for model */\n getOptions: (model: string) => RelationOption[]\n /** Get state loading for model */\n getState: (model: string) => RelationState\n /** All loaded relations */\n relations: Record<string, RelationState>\n}\n\nconst RelationFieldContext = createContext<RelationFieldContextValue | null>(null)\n\n/**\n * Hook for getting RelationFieldProvider context\n */\nexport function useRelationFieldContext(): RelationFieldContextValue | null {\n return useContext(RelationFieldContext)\n}\n\n/**\n * Hook for getting options of a specific model\n * @param model - model name\n * @returns options and loading state\n */\nexport function useRelationOptions(model: string): RelationState {\n const context = useRelationFieldContext()\n\n if (!context) {\n return {\n options: [],\n isLoading: false,\n error: null,\n }\n }\n\n return context.getState(model)\n}\n\n/**\n * Loader component for a single relation\n * Called inside the provider, follows hooks rules\n */\nfunction RelationLoader<TData>({\n config,\n onLoaded,\n}: {\n config: RelationConfig<TData>\n onLoaded: (model: string, state: RelationState) => void\n}) {\n const { model, useQuery, labelField, valueField = 'id', descriptionField, queryArgs } = config\n\n // Call the data loading hook\n const { data, isLoading, error } = useQuery(queryArgs)\n\n // Transform data into options on change\n useEffect(() => {\n if (isLoading) {\n onLoaded(model, { options: [], isLoading: true, error: null })\n return\n }\n\n if (error) {\n onLoaded(model, { options: [], isLoading: false, error: error as Error })\n return\n }\n\n const options: RelationOption[] = (data ?? []).map((item) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const record = item as Record<string, any>\n return {\n value: String(record[valueField] ?? ''),\n label: String(record[labelField] ?? ''),\n description: descriptionField ? String(record[descriptionField] ?? '') : undefined,\n }\n })\n\n onLoaded(model, { options, isLoading: false, error: null })\n }, [data, isLoading, error, model, labelField, valueField, descriptionField, onLoaded])\n\n // Component renders nothing\n return null\n}\n\n/**\n * Provider for auto-loading relation field options\n *\n * Allows automatically loading options for fields with `relationMeta()`,\n * integrating with ZenStack hooks.\n *\n * @example Basic usage\n * ```tsx\n * import { useFindManyCategory, useFindManyTag } from '@/generated/hooks'\n *\n * <RelationFieldProvider\n * relations={[\n * { model: 'Category', useQuery: useFindManyCategory, labelField: 'name' },\n * { model: 'Tag', useQuery: useFindManyTag, labelField: 'title' },\n * ]}\n * >\n * <Form schema={ProductFormSchema} ...>\n * <Form.AutoFields />\n * </Form>\n * </RelationFieldProvider>\n * ```\n *\n * @example With filtering and sorting\n * ```tsx\n * <RelationFieldProvider\n * relations={[\n * {\n * model: 'Category',\n * useQuery: useFindManyCategory,\n * labelField: 'name',\n * queryArgs: {\n * where: { isActive: true },\n * orderBy: { name: 'asc' },\n * },\n * },\n * ]}\n * >\n * ```\n *\n * @example With description for RadioCard/CheckboxCard\n * ```tsx\n * <RelationFieldProvider\n * relations={[\n * {\n * model: 'Plan',\n * useQuery: useFindManyPlan,\n * labelField: 'name',\n * descriptionField: 'features',\n * },\n * ]}\n * >\n * ```\n */\nexport function RelationFieldProvider({\n relations,\n children,\n}: {\n /** Relation loading configurations */\n relations: RelationConfig[]\n children: ReactNode\n}) {\n // State of all loaded relations\n const [relationsState, setRelationsState] = useState<Record<string, RelationState>>({})\n\n // Callback for updating relation state\n const handleLoaded = useMemo(\n () => (model: string, state: RelationState) => {\n setRelationsState((prev) => {\n // Check if data has changed\n const prevState = prev[model]\n if (\n prevState &&\n prevState.isLoading === state.isLoading &&\n prevState.error === state.error &&\n JSON.stringify(prevState.options) === JSON.stringify(state.options)\n ) {\n return prev // No changes\n }\n return { ...prev, [model]: state }\n })\n },\n []\n )\n\n // Context value\n const contextValue = useMemo<RelationFieldContextValue>(\n () => ({\n getOptions: (model: string) => relationsState[model]?.options ?? [],\n getState: (model: string) =>\n relationsState[model] ?? {\n options: [],\n isLoading: false,\n error: null,\n },\n relations: relationsState,\n }),\n [relationsState]\n )\n\n return (\n <RelationFieldContext.Provider value={contextValue}>\n {/* Render loaders for each relation */}\n {relations.map((config) => (\n <RelationLoader key={config.model} config={config} onLoaded={handleLoaded} />\n ))}\n {children}\n </RelationFieldContext.Provider>\n )\n}\n\n/**\n * HOC for wrapping a component with RelationFieldProvider\n *\n * @example\n * ```tsx\n * const ProductFormWithRelations = withRelations(ProductForm, [\n * { model: 'Category', useQuery: useFindManyCategory, labelField: 'name' },\n * ])\n * ```\n */\nexport function withRelations<P extends object>(\n Component: React.ComponentType<P>,\n relations: RelationConfig[]\n): React.FC<P> {\n const WrappedComponent = (props: P) => (\n <RelationFieldProvider relations={relations}>\n <Component {...props} />\n </RelationFieldProvider>\n )\n\n WrappedComponent.displayName = `withRelations(${Component.displayName ?? Component.name ?? 'Component'})`\n\n return WrappedComponent\n}\n","'use client'\n\nimport type { ReactElement, ReactNode } from 'react'\nimport type { ZodConstraints } from './schema-constraints'\nimport type { SchemaFieldInfo } from './schema-traversal'\nimport type { FieldComponentType } from './types/meta-types'\n\n// Import all Field components\nimport { FieldEditable } from './form-fields/text/field-editable'\nimport { FieldPassword } from './form-fields/text/field-password'\nimport { FieldPasswordStrength } from './form-fields/text/field-password-strength'\nimport { FieldRichText } from './form-fields/text/field-rich-text'\nimport { FieldString } from './form-fields/text/field-string'\nimport { FieldTextarea } from './form-fields/text/field-textarea'\n\nimport { FieldCurrency } from './form-fields/number/field-currency'\nimport { FieldNumber } from './form-fields/number/field-number'\nimport { FieldNumberInput } from './form-fields/number/field-number-input'\nimport { FieldPercentage } from './form-fields/number/field-percentage'\nimport { FieldRating } from './form-fields/number/field-rating'\nimport { FieldSlider } from './form-fields/number/field-slider'\n\nimport { FieldDate } from './form-fields/datetime/field-date'\nimport { FieldDateRange } from './form-fields/datetime/field-date-range'\nimport { FieldDateTimePicker } from './form-fields/datetime/field-datetime-picker'\nimport { FieldDuration } from './form-fields/datetime/field-duration'\nimport { FieldSchedule } from './form-fields/datetime/field-schedule'\nimport { FieldTime } from './form-fields/datetime/field-time'\n\nimport { FieldCheckbox } from './form-fields/boolean/field-checkbox'\nimport { FieldSwitch } from './form-fields/boolean/field-switch'\n\nimport { FieldAutocomplete } from './form-fields/selection/field-autocomplete'\nimport { FieldCheckboxCard } from './form-fields/selection/field-checkbox-card'\nimport { FieldCombobox } from './form-fields/selection/field-combobox'\nimport { FieldListbox } from './form-fields/selection/field-listbox'\nimport { FieldNativeSelect } from './form-fields/selection/field-native-select'\nimport { FieldRadioCard } from './form-fields/selection/field-radio-card'\nimport { FieldRadioGroup } from './form-fields/selection/field-radio-group'\nimport { FieldSegmentedGroup } from './form-fields/selection/field-segmented-group'\nimport { FieldSelect } from './form-fields/selection/field-select'\nimport { FieldTags } from './form-fields/selection/field-tags'\n\nimport { FieldAddress } from './form-fields/specialized/field-address'\nimport { FieldColorPicker } from './form-fields/specialized/field-color-picker'\nimport { FieldFileUpload } from './form-fields/specialized/field-file-upload'\nimport { FieldOTPInput } from './form-fields/specialized/field-otp-input'\nimport { FieldPhone } from './form-fields/specialized/field-phone'\nimport { FieldPinInput } from './form-fields/specialized/field-pin-input'\nimport { FieldMaskedInput } from './form-fields/text/field-masked-input'\n\nimport { camelCaseToLabel } from './form-fields/auto/field-auto'\nimport { type RelationOption, useRelationFieldContext } from './relation-field-provider'\n\n/**\n * Relation configuration in fieldProps\n */\nexport interface RelationFieldConfig {\n /** Model name (must match model in RelationFieldProvider) */\n model: string\n /** Field to display as label */\n labelField: string\n /** Field for value (default 'id') */\n valueField?: string\n}\n\n/**\n * Props for field rendering\n */\nexport interface FieldRenderProps {\n /** Field name */\n name: string\n /** Label (if not specified, generated from name) */\n label?: ReactNode\n /** Placeholder */\n placeholder?: string\n /** Helper text */\n helperText?: ReactNode\n /** Required field */\n required?: boolean\n /** Disabled */\n disabled?: boolean\n /** Read only */\n readOnly?: boolean\n /** Enum values for select/radio */\n enumValues?: string[]\n /** Constraints from schema */\n constraints?: ZodConstraints\n /** Additional props from fieldProps */\n fieldProps?: Record<string, unknown>\n /**\n * Options from RelationFieldProvider (if field has relation config)\n * Set automatically via SchemaFieldWithRelations\n */\n relationOptions?: RelationOption[]\n}\n\n/**\n * Determine component type based on:\n * 1. Explicit fieldType from meta (priority)\n * 2. Zod type (fallback)\n */\nexport function resolveFieldType(field: SchemaFieldInfo): FieldComponentType {\n // Priority: explicit fieldType from meta\n if (field.ui?.fieldType) {\n return field.ui.fieldType\n }\n\n // Fallback to Zod type\n switch (field.zodType) {\n case 'string':\n // Check email/url via constraints\n if (field.constraints?.string?.inputType === 'email') {\n return 'string'\n }\n if (field.constraints?.string?.inputType === 'url') {\n return 'string'\n }\n // Check long string -> textarea\n if (field.constraints?.string?.maxLength && field.constraints.string.maxLength > 200) {\n return 'textarea'\n }\n return 'string'\n\n case 'number':\n case 'bigint':\n case 'int':\n case 'float':\n return 'number'\n\n case 'boolean':\n return 'checkbox'\n\n case 'date':\n return 'date'\n\n case 'enum':\n case 'literal':\n return 'nativeSelect'\n\n case 'array':\n // Primitive arrays -> tags\n if (field.element?.zodType === 'string') {\n return 'tags'\n }\n // Object arrays are handled separately\n return 'string' // fallback\n\n default:\n return 'string'\n }\n}\n\n/**\n * Option type for selection components\n */\ninterface SelectOptionResolved {\n value: string\n label: string\n description?: string\n}\n\n/**\n * Option type for NativeSelect (uses title instead of label)\n */\ninterface NativeSelectOptionResolved {\n value: string\n title: string\n description?: string\n}\n\n/**\n * Get options for a selection field considering relationOptions\n * Priority: fieldProps.options > relationOptions > enumValues\n */\nfunction resolveSelectOptions(\n fieldProps: Record<string, unknown>,\n relationOptions?: RelationOption[],\n enumValues?: string[]\n): SelectOptionResolved[] | undefined {\n // 1. Explicit options in fieldProps (highest priority)\n if (fieldProps.options && Array.isArray(fieldProps.options)) {\n return fieldProps.options as SelectOptionResolved[]\n }\n\n // 2. Options from RelationFieldProvider\n if (relationOptions && relationOptions.length > 0) {\n return relationOptions.map((opt) => ({\n value: opt.value,\n label: opt.label,\n description: opt.description,\n }))\n }\n\n // 3. Enum values (fallback)\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((v) => ({ label: camelCaseToLabel(v), value: v }))\n }\n\n return undefined\n}\n\n/**\n * Get options for NativeSelect (uses title instead of label)\n */\nfunction resolveNativeSelectOptions(\n fieldProps: Record<string, unknown>,\n relationOptions?: RelationOption[],\n enumValues?: string[]\n): NativeSelectOptionResolved[] | undefined {\n // 1. Explicit options in fieldProps (highest priority)\n if (fieldProps.options && Array.isArray(fieldProps.options)) {\n return fieldProps.options as NativeSelectOptionResolved[]\n }\n\n // 2. Options from RelationFieldProvider\n if (relationOptions && relationOptions.length > 0) {\n return relationOptions.map((opt) => ({\n value: opt.value,\n title: opt.label,\n description: opt.description,\n }))\n }\n\n // 3. Enum values (fallback)\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((v) => ({ title: camelCaseToLabel(v), value: v }))\n }\n\n return undefined\n}\n\n/**\n * Render a field component by type\n */\nexport function renderFieldByType(type: FieldComponentType, props: FieldRenderProps): ReactElement {\n const {\n name,\n label: labelProp,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n enumValues,\n constraints,\n fieldProps = {},\n relationOptions,\n } = props\n\n // Generate label if not specified\n const label = labelProp ?? camelCaseToLabel(name)\n\n // Base props for all fields\n const baseProps = {\n name,\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n }\n\n // Apply constraints to props\n const stringConstraints = constraints?.string || {}\n const numberConstraints = constraints?.number || {}\n\n // Pre-compute options for selection fields\n const selectOptions = resolveSelectOptions(fieldProps, relationOptions, enumValues)\n const nativeSelectOptions = resolveNativeSelectOptions(fieldProps, relationOptions, enumValues)\n\n switch (type) {\n // Text fields\n case 'string':\n return (\n <FieldString\n key={name}\n {...baseProps}\n type={stringConstraints.inputType}\n maxLength={stringConstraints.maxLength}\n minLength={stringConstraints.minLength}\n pattern={stringConstraints.pattern}\n {...fieldProps}\n />\n )\n case 'textarea':\n return <FieldTextarea key={name} {...baseProps} maxLength={stringConstraints.maxLength} {...fieldProps} />\n case 'password':\n return <FieldPassword key={name} {...baseProps} {...fieldProps} />\n case 'passwordStrength':\n return <FieldPasswordStrength key={name} {...baseProps} {...fieldProps} />\n case 'editable':\n return <FieldEditable key={name} {...baseProps} {...fieldProps} />\n case 'richText':\n return <FieldRichText key={name} {...baseProps} {...fieldProps} />\n\n // Number fields\n case 'number':\n return (\n <FieldNumber\n key={name}\n {...baseProps}\n min={numberConstraints.min}\n max={numberConstraints.max}\n step={numberConstraints.step}\n {...fieldProps}\n />\n )\n case 'numberInput':\n return (\n <FieldNumberInput\n key={name}\n {...baseProps}\n min={numberConstraints.min}\n max={numberConstraints.max}\n step={numberConstraints.step}\n {...fieldProps}\n />\n )\n case 'slider':\n return (\n <FieldSlider\n key={name}\n {...baseProps}\n min={numberConstraints.min}\n max={numberConstraints.max}\n step={numberConstraints.step}\n {...fieldProps}\n />\n )\n case 'rating':\n return <FieldRating key={name} {...baseProps} {...fieldProps} />\n case 'currency':\n return <FieldCurrency key={name} {...baseProps} {...fieldProps} />\n case 'percentage':\n return <FieldPercentage key={name} {...baseProps} {...fieldProps} />\n\n // Date and time\n case 'date':\n return (\n <FieldDate\n key={name}\n {...baseProps}\n min={constraints?.date?.min}\n max={constraints?.date?.max}\n {...fieldProps}\n />\n )\n case 'time':\n return <FieldTime key={name} {...baseProps} {...fieldProps} />\n case 'dateRange':\n return <FieldDateRange key={name} {...baseProps} {...fieldProps} />\n case 'dateTimePicker':\n return <FieldDateTimePicker key={name} {...baseProps} {...fieldProps} />\n case 'duration':\n return <FieldDuration key={name} {...baseProps} {...fieldProps} />\n case 'schedule':\n return <FieldSchedule key={name} {...baseProps} {...fieldProps} />\n\n // Boolean fields\n case 'checkbox':\n return <FieldCheckbox key={name} {...baseProps} {...fieldProps} />\n case 'switch':\n return <FieldSwitch key={name} {...baseProps} {...fieldProps} />\n\n // Selection from list\n // Options resolved with priority: fieldProps.options > relationOptions > enumValues\n case 'select':\n return <FieldSelect key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'nativeSelect':\n return <FieldNativeSelect key={name} {...baseProps} options={nativeSelectOptions ?? []} {...fieldProps} />\n case 'combobox':\n return <FieldCombobox key={name} {...baseProps} {...fieldProps} />\n case 'autocomplete':\n return <FieldAutocomplete key={name} {...baseProps} {...fieldProps} />\n case 'listbox':\n return <FieldListbox key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'radioGroup':\n return <FieldRadioGroup key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'radioCard':\n return <FieldRadioCard key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'segmentedGroup':\n return <FieldSegmentedGroup key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'checkboxCard':\n return <FieldCheckboxCard key={name} {...baseProps} options={selectOptions ?? []} {...fieldProps} />\n case 'tags':\n return <FieldTags key={name} {...baseProps} {...fieldProps} />\n\n // Specialized fields\n case 'phone':\n return <FieldPhone key={name} {...baseProps} {...fieldProps} />\n case 'address': {\n // FieldAddress requires token from fieldProps\n const token = fieldProps.token as string | undefined\n if (!token) {\n console.warn(`Form.Field.Address \"${name}\" requires token in fieldProps`)\n }\n return <FieldAddress key={name} {...baseProps} token={token ?? ''} {...fieldProps} />\n }\n case 'pinInput':\n return <FieldPinInput key={name} {...baseProps} {...fieldProps} />\n case 'otpInput':\n return <FieldOTPInput key={name} {...baseProps} {...fieldProps} />\n case 'colorPicker':\n return <FieldColorPicker key={name} {...baseProps} {...fieldProps} />\n case 'fileUpload': {\n // FieldFileUpload requires label and helperText as string\n const labelStr = typeof label === 'string' ? label : String(label ?? '')\n const helperStr = typeof helperText === 'string' ? helperText : undefined\n return (\n <FieldFileUpload\n key={name}\n {...baseProps}\n label={labelStr || undefined}\n helperText={helperStr}\n {...fieldProps}\n />\n )\n }\n case 'maskedInput':\n return <FieldMaskedInput key={name} {...baseProps} {...fieldProps} />\n\n default:\n // Fallback to string\n return <FieldString key={name} {...baseProps} {...fieldProps} />\n }\n}\n\n/**\n * Render a field from SchemaFieldInfo\n * @param field - field information from schema\n * @param relationOptions - options from RelationFieldProvider (if available)\n */\nexport function renderSchemaField(field: SchemaFieldInfo, relationOptions?: RelationOption[]): ReactElement {\n const fieldType = resolveFieldType(field)\n\n return renderFieldByType(fieldType, {\n name: field.name,\n label: field.ui?.title,\n placeholder: field.ui?.placeholder,\n helperText: field.ui?.description,\n required: field.required,\n enumValues: field.enumValues,\n constraints: field.constraints,\n fieldProps: field.ui?.fieldProps,\n relationOptions,\n })\n}\n\n/**\n * Component for rendering a field with auto-loading relation options\n *\n * Uses RelationFieldProvider context for automatic loading of\n * options for fields with `relationMeta()`.\n *\n * @example\n * ```tsx\n * <RelationFieldProvider relations={[{ model: 'Category', useQuery: useFindManyCategory, labelField: 'name' }]}>\n * <SchemaFieldWithRelations field={categoryField} />\n * </RelationFieldProvider>\n * ```\n */\nexport function SchemaFieldWithRelations({ field }: { field: SchemaFieldInfo }): ReactElement {\n const relationContext = useRelationFieldContext()\n\n // Check if relation config exists in fieldProps\n const relationConfig = field.ui?.fieldProps?.relation as RelationFieldConfig | undefined\n\n // If relation config and context exist - get options\n let relationOptions: RelationOption[] | undefined\n if (relationConfig && relationContext) {\n const state = relationContext.getState(relationConfig.model)\n if (!state.isLoading && state.options.length > 0) {\n relationOptions = state.options\n }\n }\n\n return renderSchemaField(field, relationOptions)\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport { FormGroup } from '../../form-group'\nimport type { FormGroupDeclarativeProps } from '../types'\n\n/**\n * Form.Group - Creates a namespace for nested fields\n *\n * Wraps children in a FormGroup to build hierarchical field paths.\n * Nested groups create dot-notation paths (e.g., \"info.base.type\").\n *\n * @example\n * ```tsx\n * // Creates path: info.base.type\n * <Form.Group name=\"info\">\n * <Form.Group name=\"base\">\n * <Form.Field.String name=\"type\" />\n * </Form.Group>\n * </Form.Group>\n * ```\n */\nexport function FormGroupDeclarative({ name, children }: FormGroupDeclarativeProps): ReactElement {\n return <FormGroup name={name}>{children}</FormGroup>\n}\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { FormGroupListContextValue, FormGroupListItemContextValue } from '../types'\n\n/**\n * Context for Form.Group.List operations (add items)\n */\nexport const FormGroupListContext = createContext<FormGroupListContextValue | null>(null)\n\n/**\n * Context for Form.Group.List item operations (remove item)\n */\nexport const FormGroupListItemContext = createContext<FormGroupListItemContextValue | null>(null)\n\n/**\n * Hook to access Form.Group.List context\n * @throws Error if used outside of Form.Group.List\n */\nexport function useFormGroupListContext(): FormGroupListContextValue {\n const context = useContext(FormGroupListContext)\n if (!context) {\n throw new Error('useFormGroupListContext must be used inside Form.Group.List')\n }\n return context\n}\n\n/**\n * Hook to access Form.Group.List item context\n * @throws Error if used outside of Form.Group.List item\n */\nexport function useFormGroupListItemContext(): FormGroupListItemContextValue {\n const context = useContext(FormGroupListItemContext)\n if (!context) {\n throw new Error('useFormGroupListItemContext must be used inside Form.Group.List item')\n }\n return context\n}\n","'use client'\n\nimport { Button, IconButton } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useFormGroupListContext, useFormGroupListItemContext } from './form-group-list-context'\n\nexport interface ListButtonAddProps {\n /** Button text (default: \"+\") */\n children?: ReactNode\n /** Default value for new item (default: empty object or empty string) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultValue?: any\n /** Принудительно отkeyить кнопку (дополнительно к автоматическому maxItems) */\n disabled?: boolean\n}\n\n/**\n * Form.Group.List.Button.Add - Add new item to array\n *\n * Must be used inside Form.Group.List (typically in wrapper)\n *\n * Automatically отkeyается при достижении maxItems from Zod schema\n * (z.array().max(5) → button отkeyится при 5 elementах)\n *\n * @example\n * ```tsx\n * <Form.Group.List\n * name=\"items\"\n * wrapper={({ children }) => (\n * <VStack>\n * {children}\n * <Form.Group.List.Button.Add defaultValue={{ title: '' }}>\n * Add Item\n * </Form.Group.List.Button.Add>\n * </VStack>\n * )}\n * >\n * ...\n * </Form.Group.List>\n * ```\n */\nexport function ListButtonAdd({ children, defaultValue = {}, disabled }: ListButtonAddProps): ReactElement {\n const { pushValue, canAdd } = useFormGroupListContext()\n\n // Кнопка отkeyена if canAdd = false (достигнут maxItems) или disabled prop\n const isDisabled = disabled || !canAdd\n\n const handleAdd = () => {\n if (!isDisabled) {\n pushValue(defaultValue)\n }\n }\n\n if (children) {\n return (\n <Button type=\"button\" onClick={handleAdd} variant=\"outline\" size=\"sm\" disabled={isDisabled}>\n {children}\n </Button>\n )\n }\n\n return (\n <IconButton\n type=\"button\"\n onClick={handleAdd}\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Add item\"\n disabled={isDisabled}\n >\n +\n </IconButton>\n )\n}\n\nexport interface ListButtonRemoveProps {\n /** Button text (default: \"x\") */\n children?: ReactNode\n /** Принудительно отkeyить кнопку (дополнительно к автоматическому minItems) */\n disabled?: boolean\n}\n\n/**\n * Form.Group.List.Button.Remove - Remove current item from array\n *\n * Must be used inside Form.Group.List item (children)\n *\n * Automatically отkeyается при достижении minItems from Zod schema\n * (z.array().min(1) → button отkeyится при 1 elementе)\n *\n * @example\n * ```tsx\n * <Form.Group.List name=\"items\">\n * <HStack>\n * <Form.Field.String name=\"title\" />\n * <Form.Group.List.Button.Remove />\n * </HStack>\n * </Form.Group.List>\n * ```\n */\nexport function ListButtonRemove({ children, disabled }: ListButtonRemoveProps): ReactElement {\n const { remove } = useFormGroupListItemContext()\n const { canRemove } = useFormGroupListContext()\n\n // Кнопка отkeyена if canRemove = false (достигнут minItems) или disabled prop\n const isDisabled = disabled || !canRemove\n\n const handleRemove = () => {\n if (!isDisabled) {\n remove()\n }\n }\n\n if (children) {\n return (\n <Button type=\"button\" onClick={handleRemove} variant=\"outline\" size=\"sm\" colorPalette=\"red\" disabled={isDisabled}>\n {children}\n </Button>\n )\n }\n\n return (\n <IconButton\n type=\"button\"\n onClick={handleRemove}\n variant=\"outline\"\n size=\"sm\"\n colorPalette=\"red\"\n aria-label=\"Remove item\"\n disabled={isDisabled}\n >\n x\n </IconButton>\n )\n}\n","'use client'\n\nimport { Box, IconButton } from '@chakra-ui/react'\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { createContext, type CSSProperties, type ReactElement, type ReactNode, useContext } from 'react'\n\n/**\n * Context for drag handle - allows children to access drag listeners\n */\ninterface SortableItemContextValue {\n /** Attributes for the drag handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attributes: any\n /** Listeners for the drag handle */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n listeners: any\n /** Whether item is being dragged */\n isDragging: boolean\n}\n\nconst SortableItemContext = createContext<SortableItemContextValue | null>(null)\n\n/**\n * Hook to access sortable item context (for drag handle)\n */\nexport function useSortableItemContext(): SortableItemContextValue | null {\n return useContext(SortableItemContext)\n}\n\n/**\n * Props for SortableWrapper\n */\nexport interface SortableWrapperProps {\n /** Array of unique IDs for sortable items */\n items: string[]\n /** Callback when drag ends - receives old and new indices */\n onReorder: (oldIndex: number, newIndex: number) => void\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * Wrapper that provides DnD context for sortable list\n *\n * @example\n * ```tsx\n * <SortableWrapper items={['id-1', 'id-2']} onReorder={handleReorder}>\n * {items.map(item => (\n * <SortableItem key={item.id} id={item.id}>\n * <ItemContent />\n * </SortableItem>\n * ))}\n * </SortableWrapper>\n * ```\n */\nexport function SortableWrapper({ items, onReorder, children }: SortableWrapperProps): ReactElement {\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // Require 8px movement before drag starts\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n )\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n\n if (over && active.id !== over.id) {\n const oldIndex = items.indexOf(String(active.id))\n const newIndex = items.indexOf(String(over.id))\n\n if (oldIndex !== -1 && newIndex !== -1) {\n onReorder(oldIndex, newIndex)\n }\n }\n }\n\n return (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {children}\n </SortableContext>\n </DndContext>\n )\n}\n\n/**\n * Props for SortableItem\n */\nexport interface SortableItemProps {\n /** Unique ID for this item */\n id: string\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * Individual sortable item wrapper\n *\n * Provides drag handle context to children via useSortableItemContext()\n *\n * @example\n * ```tsx\n * <SortableItem id=\"item-1\">\n * <DragHandle />\n * <Form.Field.String name=\"title\" />\n * </SortableItem>\n * ```\n */\nexport function SortableItem({ id, children }: SortableItemProps): ReactElement {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id })\n\n const style: CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n position: 'relative',\n }\n\n const contextValue: SortableItemContextValue = {\n attributes,\n listeners,\n isDragging,\n }\n\n return (\n <SortableItemContext.Provider value={contextValue}>\n <Box ref={setNodeRef} style={style}>\n {children}\n </Box>\n </SortableItemContext.Provider>\n )\n}\n\n/**\n * Props for DragHandle\n */\nexport interface DragHandleProps {\n /** Custom children (default: grip icon) */\n children?: ReactNode\n}\n\n/**\n * Drag handle component for sortable items\n *\n * Must be used inside SortableItem. Click and drag this to reorder.\n *\n * @example\n * ```tsx\n * <SortableItem id=\"item-1\">\n * <HStack>\n * <DragHandle />\n * <Form.Field.String name=\"title\" />\n * </HStack>\n * </SortableItem>\n * ```\n */\nexport function DragHandle({ children }: DragHandleProps): ReactElement | null {\n const context = useSortableItemContext()\n\n if (!context) {\n return null\n }\n\n const { attributes, listeners, isDragging } = context\n\n return (\n <IconButton\n {...attributes}\n {...listeners}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n cursor={isDragging ? 'grabbing' : 'grab'}\n aria-label=\"Drag to reorder\"\n _hover={{ bg: 'gray.100' }}\n _dark={{ _hover: { bg: 'gray.700' } }}\n >\n {children || '⋮⋮'}\n </IconButton>\n )\n}\n","'use client'\n\nimport { Fragment, type ReactElement, type ReactNode } from 'react'\nimport { FormGroup, useFormGroup } from '../../form-group'\nimport { DeclarativeFormContext, useDeclarativeForm } from '../form-context'\nimport { getZodConstraints } from '../schema-constraints'\nimport type {\n DeclarativeFormContextValue,\n FormGroupListContextValue,\n FormGroupListDeclarativeProps,\n FormGroupListItemContextValue,\n} from '../types'\nimport { FormGroupListContext, FormGroupListItemContext } from './form-group-list-context'\nimport { SortableItem, SortableWrapper } from './form-group-list-sortable'\n\n/**\n * Form.Group.List - Automatically iterates over array fields\n *\n * For object arrays: children are cloned for each element with FormGroup index\n * For primitive arrays: children without name get direct array index access\n *\n * Automatically extracts from Zod schema:\n * - `maxItems` from `z.array().max(5)` — disables Add button when limit is reached\n * - `minItems` from `z.array().min(1)` — disables Remove button when below minimum\n * - `helperText` hint \"Maximum 5 items\" (via Form.Group.List wrapper)\n *\n * Props always take priority over automatic values from the schema.\n *\n * @example Object array with auto constraints from Zod\n * ```tsx\n * // In schema: z.object({ tags: z.array(z.string()).min(1).max(5) })\n * <Form.Group.List\n * name=\"tags\"\n * wrapper={({ children }) => (\n * <VStack>\n * {children}\n * <Form.Group.List.Button.Add />\n * {/* Add button is automatically disabled at 5 items *\\/}\n * </VStack>\n * )}\n * >\n * <HStack>\n * <Form.Field.String />\n * <Form.Group.List.Button.Remove />\n * {/* Remove button is automatically disabled at 1 item *\\/}\n * </HStack>\n * </Form.Group.List>\n * ```\n */\nexport function FormGroupListDeclarative({\n name,\n children,\n emptyContent,\n wrapper,\n sortable = false,\n maxItems: maxItemsProp,\n minItems: minItemsProp,\n}: FormGroupListDeclarativeProps): ReactElement {\n const { form, schema } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full path from parent groups\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Extract constraints for the array\n const constraints = getZodConstraints(schema, fullPath)\n\n // Props take priority over constraints\n const maxItems = maxItemsProp ?? constraints.array?.maxItems\n const minItems = minItemsProp ?? constraints.array?.minItems\n\n // Use form.Field with mode=\"array\" for reactive array state\n return (\n <form.Field name={fullPath} mode=\"array\">\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(arrayField: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const arrayValue = (arrayField.state.value as any[] | undefined) ?? []\n\n // Compute canAdd and canRemove based on constraints\n const canAdd = maxItems === undefined || arrayValue.length < maxItems\n const canRemove = minItems === undefined || arrayValue.length > minItems\n\n // List context for Add button - use arrayField methods\n const listContextValue: FormGroupListContextValue = {\n fullPath,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pushValue: (value: any) => arrayField.pushValue(value),\n length: arrayValue.length,\n maxItems,\n minItems,\n canAdd,\n canRemove,\n }\n\n // Handle drag end for sortable\n const handleReorder = (oldIndex: number, newIndex: number) => {\n arrayField.moveValue(oldIndex, newIndex)\n }\n\n // Generate IDs for sortable items\n const sortableIds = arrayValue.map((_, index) => `${fullPath}-${index}`)\n\n // Render single item\n const renderItem = (index: number): ReactNode => {\n // Form context with primitiveArrayIndex\n const formContextValue: DeclarativeFormContextValue = {\n form,\n schema,\n primitiveArrayIndex: index,\n }\n\n // Item context for Remove button - use arrayField.removeValue\n const itemContextValue: FormGroupListItemContextValue = {\n index,\n remove: () => arrayField.removeValue(index),\n }\n\n const itemContent = (\n <DeclarativeFormContext.Provider value={formContextValue}>\n <FormGroupListItemContext.Provider value={itemContextValue}>\n <FormGroup name={String(index)}>{children}</FormGroup>\n </FormGroupListItemContext.Provider>\n </DeclarativeFormContext.Provider>\n )\n\n // Wrap in SortableItem if sortable\n if (sortable) {\n return (\n <SortableItem key={sortableIds[index]} id={sortableIds[index]}>\n {itemContent}\n </SortableItem>\n )\n }\n\n return <Fragment key={index}>{itemContent}</Fragment>\n }\n\n // Render all items\n const renderItems = (): ReactNode => {\n if (arrayValue.length === 0 && emptyContent) {\n return emptyContent\n }\n\n const items = arrayValue.map((_, index) => renderItem(index))\n\n // Wrap in SortableWrapper if sortable\n if (sortable) {\n return (\n <SortableWrapper items={sortableIds} onReorder={handleReorder}>\n {items}\n </SortableWrapper>\n )\n }\n\n return items\n }\n\n // Wrap everything in FormGroup for path building\n const content = wrapper ? wrapper({ children: renderItems() }) : renderItems()\n\n return (\n <FormGroupListContext.Provider value={listContextValue}>\n <FormGroup name={name}>\n {/* Fragment needed when wrapper returns array */}\n <Fragment>{content}</Fragment>\n </FormGroup>\n </FormGroupListContext.Provider>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport type { ZodConstraints } from './schema-constraints'\nimport { getZodConstraints } from './schema-constraints'\nimport type { FieldUIMeta } from './types/meta-types'\nimport { unwrapSchema } from './zod-utils'\n\n/**\n * Schema field information for form auto-generation\n */\nexport interface SchemaFieldInfo {\n /** Full path to the field (e.g. \"user.address.city\") */\n path: string\n /** Field name (last path segment) */\n name: string\n /** Zod type: string, number, boolean, date, enum, object, array */\n zodType: string\n /** UI metadata from .meta({ ui: {...} }) */\n ui?: FieldUIMeta\n /** Required field (not optional/nullable) */\n required: boolean\n /** Constraints (min, max, minLength, maxLength etc.) */\n constraints: ZodConstraints\n /** Nested fields for object type */\n children?: SchemaFieldInfo[]\n /** Element information for array type */\n element?: SchemaFieldInfo\n /** Enum values for enum type */\n enumValues?: string[]\n}\n\n/**\n * Get Zod type from schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getZodType(schema: any): string {\n const unwrapped = unwrapSchema(schema)\n return unwrapped?._zod?.def?.type ?? 'unknown'\n}\n\n/**\n * Check if the field is required (not optional/nullable)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isRequired(schema: any): boolean {\n if (!schema?._zod?.def) {\n return true\n }\n\n const type = schema._zod.def.type\n if (type === 'optional' || type === 'nullable') {\n return false\n }\n if (type === 'default') {\n // default always has a value, considered not required for UI\n return false\n }\n\n return true\n}\n\n/**\n * Get UI metadata from schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getUIMeta(schema: any): FieldUIMeta | undefined {\n if (!schema?.meta) {\n return undefined\n }\n\n try {\n const meta = schema.meta()\n return meta?.ui as FieldUIMeta | undefined\n } catch {\n return undefined\n }\n}\n\n/**\n * Get enum values from schema\n * In Zod v4 we use schema.enum or schema.def.entries\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getEnumValues(schema: any): string[] | undefined {\n const unwrapped = unwrapSchema(schema)\n if (!unwrapped?._zod?.def) {\n return undefined\n }\n\n const type = unwrapped._zod.def.type\n\n if (type === 'enum') {\n // Zod v4: use .enum for getting values\n // schema.enum returns object { value: \"value\", ... }\n if (unwrapped.enum && typeof unwrapped.enum === 'object') {\n return Object.values(unwrapped.enum) as string[]\n }\n // Fallback to internal structure (for compatibility)\n if (unwrapped._zod.def.values) {\n return unwrapped._zod.def.values\n }\n // Zod v4 also has def.entries\n if (unwrapped._zod.def.entries) {\n return Object.values(unwrapped._zod.def.entries) as string[]\n }\n return undefined\n }\n\n if (type === 'literal') {\n const value = unwrapped._zod.def.value\n return typeof value === 'string' ? [value] : undefined\n }\n\n return undefined\n}\n\n// =============================================================================\n// Circular reference protection\n// =============================================================================\n\n/** Maximum recursion depth for infinite loop protection */\nconst MAX_TRAVERSAL_DEPTH = 20\n\n/**\n * Schema traversal context\n * Stores visited schemas and current depth for cycle protection\n */\ninterface TraversalContext {\n /** Set of visited schemas (for cycle detection) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n visited: WeakSet<any>\n /** Current recursion depth */\n depth: number\n}\n\n/**\n * Create a new traversal context\n */\nfunction createTraversalContext(): TraversalContext {\n return {\n visited: new WeakSet(),\n depth: 0,\n }\n}\n\n/**\n * Check if traversal can continue\n * Returns false if schema was already visited or maximum depth is reached\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction canTraverse(schema: any, ctx: TraversalContext): boolean {\n // Depth check\n if (ctx.depth >= MAX_TRAVERSAL_DEPTH) {\n console.warn(`schema-traversal: Maximum depth (${MAX_TRAVERSAL_DEPTH}) exceeded, stopping recursion`)\n return false\n }\n\n // Circular reference check\n if (schema && typeof schema === 'object' && ctx.visited.has(schema)) {\n console.warn('schema-traversal: Circular reference detected, stopping recursion')\n return false\n }\n\n return true\n}\n\n/**\n * Mark schema as visited\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction markVisited(schema: any, ctx: TraversalContext): void {\n if (schema && typeof schema === 'object') {\n ctx.visited.add(schema)\n }\n}\n\n// =============================================================================\n// Schema traversal functions\n// =============================================================================\n\n/**\n * Analyze an array element\n */\n\nfunction analyzeArrayElement(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod internal schema type\n elementSchema: any,\n parentPath: string,\n ctx: TraversalContext\n): SchemaFieldInfo | undefined {\n if (!canTraverse(elementSchema, ctx)) {\n return undefined\n }\n markVisited(elementSchema, ctx)\n\n const unwrapped = unwrapSchema(elementSchema)\n const zodType = getZodType(unwrapped)\n // For array elements the path is parent path + [*]\n const path = `${parentPath}[*]`\n\n const fieldInfo: SchemaFieldInfo = {\n path,\n name: '*',\n zodType,\n ui: getUIMeta(elementSchema),\n required: isRequired(elementSchema),\n constraints: {}, // Constraints for elements are determined separately\n }\n\n // If element is an object, recursively traverse its fields\n if (zodType === 'object' && unwrapped._zod?.def?.shape) {\n const children = traverseSchemaShape(unwrapped._zod.def.shape, path, { ...ctx, depth: ctx.depth + 1 })\n if (children.length > 0) {\n fieldInfo.children = children\n }\n }\n\n // If element is an enum\n if (zodType === 'enum' || zodType === 'literal') {\n fieldInfo.enumValues = getEnumValues(elementSchema)\n }\n\n return fieldInfo\n}\n\n/**\n * Traverse object shape and return field information\n */\n\nfunction traverseSchemaShape(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod internal shape type\n shape: Record<string, any>,\n parentPath = '',\n ctx: TraversalContext = createTraversalContext()\n): SchemaFieldInfo[] {\n const fields: SchemaFieldInfo[] = []\n\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n if (!canTraverse(fieldSchema, ctx)) {\n continue\n }\n markVisited(fieldSchema, ctx)\n\n const path = parentPath ? `${parentPath}.${fieldName}` : fieldName\n const unwrapped = unwrapSchema(fieldSchema)\n const zodType = getZodType(fieldSchema)\n\n const fieldInfo: SchemaFieldInfo = {\n path,\n name: fieldName,\n zodType,\n ui: getUIMeta(fieldSchema),\n required: isRequired(fieldSchema),\n constraints: getZodConstraints(fieldSchema, ''),\n }\n\n // Handle nested objects\n if (zodType === 'object' && unwrapped._zod?.def?.shape) {\n const children = traverseSchemaShape(unwrapped._zod.def.shape, path, { ...ctx, depth: ctx.depth + 1 })\n if (children.length > 0) {\n fieldInfo.children = children\n }\n }\n\n // Handle arrays\n if (zodType === 'array' && unwrapped._zod?.def?.element) {\n const element = analyzeArrayElement(unwrapped._zod.def.element, path, { ...ctx, depth: ctx.depth + 1 })\n if (element) {\n fieldInfo.element = element\n }\n }\n\n // Handle enum\n if (zodType === 'enum' || zodType === 'literal') {\n fieldInfo.enumValues = getEnumValues(fieldSchema)\n }\n\n fields.push(fieldInfo)\n }\n\n return fields\n}\n\n/**\n * Traverse Zod schema and return information about all fields\n *\n * @example\n * ```ts\n * const schema = z.object({\n * firstName: z.string().meta({ ui: { title: 'Name' } }),\n * address: z.object({\n * city: z.string(),\n * zip: z.string(),\n * }),\n * tags: z.array(z.string()),\n * })\n *\n * const fields = traverseSchema(schema)\n * // [\n * // { path: 'firstName', zodType: 'string', ui: { title: 'Name' }, ... },\n * // { path: 'address', zodType: 'object', children: [...] },\n * // { path: 'tags', zodType: 'array', element: { zodType: 'string' } },\n * // ]\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function traverseSchema(schema: any): SchemaFieldInfo[] {\n if (!schema?._zod?.def) {\n return []\n }\n\n const unwrapped = unwrapSchema(schema)\n const type = unwrapped._zod?.def?.type\n\n // Only support object at the top level\n if (type !== 'object' || !unwrapped._zod?.def?.shape) {\n return []\n }\n\n return traverseSchemaShape(unwrapped._zod.def.shape)\n}\n\n/**\n * Get flat list of all field paths (for include/exclude filtering)\n */\nexport function getFieldPaths(fields: SchemaFieldInfo[], recursive = true): string[] {\n const paths: string[] = []\n\n for (const field of fields) {\n paths.push(field.path)\n\n if (recursive && field.children) {\n paths.push(...getFieldPaths(field.children, recursive))\n }\n }\n\n return paths\n}\n\n/**\n * Filter fields by include/exclude\n */\nexport function filterFields(\n fields: SchemaFieldInfo[],\n options: { include?: string[]; exclude?: string[] }\n): SchemaFieldInfo[] {\n const { include, exclude } = options\n\n return fields.filter((field) => {\n // Check by field name for top-level filtering\n if (include && !include.includes(field.name)) {\n return false\n }\n if (exclude && exclude.includes(field.name)) {\n return false\n }\n return true\n })\n}\n","'use client'\n\nimport { VStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { Fragment } from 'react'\nimport { resolveFieldType, SchemaFieldWithRelations } from './field-type-mapper'\nimport { useDeclarativeForm } from './form-context'\nimport { FormGroupDeclarative } from './form-group/form-group-declarative'\nimport { ListButtonAdd, ListButtonRemove } from './form-group/form-group-list-buttons'\nimport { FormGroupListDeclarative } from './form-group/form-group-list-declarative'\nimport { filterFields, type SchemaFieldInfo, traverseSchema } from './schema-traversal'\n\n/**\n * Props for Form.AutoFields\n */\nexport interface AutoFieldsProps {\n /**\n * Include only specified fields (by name)\n * @example include={['firstName', 'lastName']}\n */\n include?: string[]\n /**\n * Exclude specified fields (by name)\n * @example exclude={['id', 'createdAt']}\n */\n exclude?: string[]\n /**\n * Recursively generate nested objects\n * @default true\n */\n recursive?: boolean\n /**\n * Custom wrapper for each field\n * @example fieldWrapper={({ name, children }) => <Box key={name} mb={4}>{children}</Box>}\n */\n fieldWrapper?: (props: { name: string; children: ReactNode }) => ReactElement\n}\n\n/**\n * Render a field or group based on SchemaFieldInfo\n */\nfunction renderField(\n field: SchemaFieldInfo,\n recursive: boolean,\n fieldWrapper?: (props: { name: string; children: ReactNode }) => ReactElement\n): ReactElement {\n const { name, zodType, ui } = field\n\n // Handle nested objects\n if (zodType === 'object' && field.children && recursive) {\n const content = (\n <FormGroupDeclarative key={name} name={name}>\n {field.children.map((child) => renderField(child, recursive, fieldWrapper))}\n </FormGroupDeclarative>\n )\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n\n // Handle object arrays\n if (zodType === 'array' && field.element?.zodType === 'object' && field.element.children) {\n const elementChildren = field.element.children\n const content = (\n <FormGroupListDeclarative\n key={name}\n name={name}\n emptyContent={<EmptyArrayContent label={ui?.title ?? name} />}\n wrapper={({ children }) => (\n <VStack align=\"stretch\" gap={2}>\n {children}\n <ListButtonAdd defaultValue={createDefaultValue(elementChildren)}>Add</ListButtonAdd>\n </VStack>\n )}\n >\n <VStack align=\"stretch\" gap={2} p={2} borderWidth={1} borderRadius=\"md\">\n {elementChildren.map((child) => renderField(child, recursive, fieldWrapper))}\n <ListButtonRemove>Remove</ListButtonRemove>\n </VStack>\n </FormGroupListDeclarative>\n )\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n\n // Handle primitive arrays -> Tags\n if (zodType === 'array' && field.element?.zodType === 'string') {\n const fieldType = resolveFieldType(field)\n if (fieldType === 'tags') {\n const content = <SchemaFieldWithRelations key={name} field={field} />\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n }\n\n // Regular field (with relation options support from RelationFieldProvider)\n const content = <SchemaFieldWithRelations key={name} field={field} />\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n}\n\n/**\n * Component for empty array\n */\nfunction EmptyArrayContent({ label }: { label: string }): ReactElement {\n return (\n <VStack py={4} color=\"fg.muted\">\n No items in "{label}"\n </VStack>\n )\n}\n\n/**\n * Create default value for an object array element\n */\nfunction createDefaultValue(children: SchemaFieldInfo[]): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n\n for (const child of children) {\n switch (child.zodType) {\n case 'string':\n result[child.name] = ''\n break\n case 'number':\n case 'int':\n case 'float':\n case 'bigint':\n result[child.name] = 0\n break\n case 'boolean':\n result[child.name] = false\n break\n case 'array':\n result[child.name] = []\n break\n case 'object':\n if (child.children) {\n result[child.name] = createDefaultValue(child.children)\n } else {\n result[child.name] = {}\n }\n break\n default:\n result[child.name] = undefined\n }\n }\n\n return result\n}\n\n/**\n * Form.AutoFields — automatic field generation from Zod schema\n *\n * The component reads the Zod schema from Form context and automatically generates\n * fields based on schema types and metadata.\n *\n * @example All fields\n * ```tsx\n * <Form schema={Schema} initialValue={data} onSubmit={save}>\n * <Form.AutoFields />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example With filtering\n * ```tsx\n * <Form schema={Schema} initialValue={data} onSubmit={save}>\n * <HStack>\n * <Form.AutoFields include={['firstName', 'lastName']} />\n * </HStack>\n * <Form.AutoFields exclude={['firstName', 'lastName']} />\n * <Form.Button.Submit />\n * </Form>\n * ```\n *\n * @example With custom wrapper\n * ```tsx\n * <Form.AutoFields fieldWrapper={({ name, children }) => (\n * <Box key={name} mb={4}>{children}</Box>\n * )} />\n * ```\n */\nexport function FormAutoFields({ include, exclude, recursive = true, fieldWrapper }: AutoFieldsProps): ReactElement {\n const { schema } = useDeclarativeForm()\n\n if (!schema) {\n throw new Error('Form.AutoFields requires schema prop on Form component')\n }\n\n // Traverse schema and get field information\n const allFields = traverseSchema(schema)\n\n // Filter fields\n const fields = filterFields(allFields, { include, exclude })\n\n return <Fragment>{fields.map((field) => renderField(field, recursive, fieldWrapper))}</Fragment>\n}\n\nFormAutoFields.displayName = 'FormAutoFields'\n","'use client'\n\nimport { Button } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useDeclarativeForm } from '../form-context'\n\n/**\n * Props for Reset button\n */\nexport interface ResetButtonProps {\n /** Button text (default: \"Reset\") */\n children?: ReactNode\n /** Whether button is disabled */\n disabled?: boolean\n /** Button variant (default: outline) */\n variant?: 'solid' | 'outline' | 'ghost' | 'plain'\n /** Button color palette */\n colorPalette?: string\n /** Callback after form is reset */\n onReset?: () => void\n}\n\n/**\n * Form.Button.Reset - Reset button to restore form to initial values\n *\n * Resets all form fields to their initial (default) values.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Button.Reset />\n * ```\n *\n * @example With custom text and callback\n * ```tsx\n * <Form.Button.Reset onReset={() => console.log('Form reset!')}>\n * Clear Form\n * </Form.Button.Reset>\n * ```\n *\n * @example Styled variant\n * ```tsx\n * <Form.Button.Reset variant=\"ghost\" colorPalette=\"red\">\n * Discard Changes\n * </Form.Button.Reset>\n * ```\n */\nexport function ButtonReset({\n children = 'Reset',\n disabled,\n variant = 'outline',\n colorPalette,\n onReset,\n}: ResetButtonProps): ReactElement {\n const { form } = useDeclarativeForm()\n\n const handleClick = () => {\n form.reset()\n onReset?.()\n }\n\n return (\n <form.Subscribe selector={(state: { canSubmit: boolean; isSubmitting: boolean }) => state.isSubmitting}>\n {(isSubmitting: boolean) => (\n <Button\n type=\"button\"\n variant={variant}\n colorPalette={colorPalette}\n disabled={disabled || isSubmitting}\n onClick={handleClick}\n >\n {children}\n </Button>\n )}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { Button } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport type { SubmitButtonProps } from '../types'\n\n/**\n * Form.Button.Submit - Submit button with automatic loading state\n *\n * Automatically shows loading spinner when form is submitting.\n *\n * @example\n * ```tsx\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * ```\n *\n * @example With styling\n * ```tsx\n * <Form.Button.Submit colorPalette=\"brand\" size=\"lg\">\n * Save Changes\n * </Form.Button.Submit>\n * ```\n */\nexport function ButtonSubmit({\n children = 'Submit',\n loadingText,\n disabled,\n colorPalette,\n size,\n variant,\n width,\n}: SubmitButtonProps): ReactElement {\n const { form } = useDeclarativeForm()\n\n return (\n <form.Subscribe selector={(state: { isSubmitting: boolean }) => state.isSubmitting}>\n {(isSubmitting: boolean) => (\n <Button\n type=\"submit\"\n loading={isSubmitting}\n loadingText={loadingText}\n disabled={disabled || isSubmitting}\n colorPalette={colorPalette}\n size={size}\n variant={variant}\n width={width}\n >\n {children}\n </Button>\n )}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { Box, Field, Image, SimpleGrid, Text } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { BaseFieldProps } from '../../types'\nimport { FieldError, FieldLabel } from '../base'\nimport { formatFieldErrors, hasFieldErrors } from '../base/field-utils'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/** Опция для ImageChoice */\nexport interface ImageChoiceOption {\n value: string\n label: string\n image: string\n /** Описание под label */\n description?: string\n}\n\n/** Props для Form.Field.ImageChoice */\nexport interface ImageChoiceFieldProps extends BaseFieldProps {\n /** Опции с картинками */\n options: ImageChoiceOption[]\n /** Количество колонок (responsive: base=1, sm=2, md=columns) */\n columns?: number\n /** Множественный выбор */\n multiple?: boolean\n}\n\n/**\n * Form.Field.ImageChoice — выбор из картинок.\n *\n * Grid карточек с изображениями для визуального выбора (стили, продукты, категории).\n *\n * @example\n * ```tsx\n * <Form.Field.ImageChoice\n * name=\"style\"\n * options={[\n * { value: 'modern', label: 'Современный', image: '/styles/modern.jpg' },\n * { value: 'classic', label: 'Классический', image: '/styles/classic.jpg' },\n * ]}\n * columns={3}\n * />\n * ```\n */\nexport function FieldImageChoice({\n name,\n label,\n helperText,\n required,\n disabled,\n readOnly,\n options,\n columns = 3,\n multiple = false,\n}: ImageChoiceFieldProps): ReactElement {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n const {\n fullPath,\n label: resolvedLabel,\n helperText: resolvedHelperText,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, helperText, required, disabled, readOnly })\n\n return (\n <form.Field name={fullPath}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(field: any) => {\n const errors = field.state.meta.errors\n const hasError = hasFieldErrors(errors)\n const value = field.state.value\n\n const isSelected = (optValue: string): boolean => {\n if (multiple) {\n return Array.isArray(value) && value.includes(optValue)\n }\n return value === optValue\n }\n\n const handleSelect = (optValue: string) => {\n if (resolvedDisabled || resolvedReadOnly) return\n\n if (multiple) {\n const current = Array.isArray(value) ? value : []\n const next = current.includes(optValue)\n ? current.filter((v: string) => v !== optValue)\n : [...current, optValue]\n field.handleChange(next)\n } else {\n field.handleChange(optValue)\n }\n }\n\n return (\n <Field.Root invalid={hasError}>\n {resolvedLabel && <FieldLabel label={resolvedLabel} required={resolvedRequired} />}\n\n <SimpleGrid columns={{ base: 1, sm: 2, md: columns }} gap={3}>\n {options.map((opt) => {\n const selected = isSelected(opt.value)\n return (\n <Box\n key={opt.value}\n borderWidth=\"2px\"\n borderColor={selected ? 'blue.500' : 'border'}\n borderRadius=\"lg\"\n overflow=\"hidden\"\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => handleSelect(opt.value)}\n transition=\"all 0.2s\"\n _hover={resolvedDisabled ? undefined : { borderColor: 'blue.400', shadow: 'md' }}\n opacity={resolvedDisabled ? 0.5 : 1}\n position=\"relative\"\n >\n <Image\n src={opt.image}\n alt={opt.label}\n w=\"100%\"\n h=\"120px\"\n objectFit=\"cover\"\n />\n {/* Галочка выбора */}\n {selected && (\n <Box\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n bg=\"blue.500\"\n color=\"white\"\n borderRadius=\"full\"\n w=\"24px\"\n h=\"24px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n fontSize=\"sm\"\n fontWeight=\"bold\"\n >\n ✓\n </Box>\n )}\n <Box p={2}>\n <Text fontSize=\"sm\" fontWeight=\"medium\">{opt.label}</Text>\n {opt.description && <Text fontSize=\"xs\" color=\"fg.muted\">{opt.description}</Text>}\n </Box>\n </Box>\n )\n })}\n </SimpleGrid>\n\n <FieldError hasError={hasError} errorMessage={formatFieldErrors(errors)} helperText={resolvedHelperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport { Box, Field, Flex, HStack, Text } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { BaseFieldProps } from '../../types'\nimport { FieldError, FieldLabel } from '../base'\nimport { formatFieldErrors, hasFieldErrors } from '../base/field-utils'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/** Props для Form.Field.Likert */\nexport interface LikertFieldProps extends BaseFieldProps {\n /** Текстовые якоря (на каждой точке или только по краям) */\n anchors: string[]\n /** Показывать номера */\n showNumbers?: boolean\n /** Размер шкалы (количество точек) — определяется из anchors.length */\n}\n\n/**\n * Form.Field.Likert — шкала Лайкерта (согласия).\n *\n * 5 или 7 точек с текстовыми якорями. Стандарт для опросников.\n *\n * @example\n * ```tsx\n * <Form.Field.Likert\n * name=\"experience\"\n * label=\"Как вы оцениваете опыт?\"\n * anchors={['Совсем не согласен', 'Не согласен', 'Нейтрально', 'Согласен', 'Полностью согласен']}\n * showNumbers={true}\n * />\n * ```\n *\n * **Значение:** `number` (1-based индекс выбранной точки)\n */\nexport function FieldLikert({\n name,\n label,\n helperText,\n required,\n disabled,\n readOnly,\n anchors,\n showNumbers = false,\n}: LikertFieldProps): ReactElement {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n const {\n fullPath,\n label: resolvedLabel,\n helperText: resolvedHelperText,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, helperText, required, disabled, readOnly })\n\n const points = anchors.length\n\n return (\n <form.Field name={fullPath}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(field: any) => {\n const errors = field.state.meta.errors\n const hasError = hasFieldErrors(errors)\n const value = field.state.value as number | undefined\n\n const handleSelect = (point: number) => {\n if (resolvedDisabled || resolvedReadOnly) return\n field.handleChange(point)\n }\n\n return (\n <Field.Root invalid={hasError}>\n {resolvedLabel && <FieldLabel label={resolvedLabel} required={resolvedRequired} />}\n\n {/* Десктопный вид — горизонтальная шкала */}\n <Box display={{ base: 'none', md: 'block' }}>\n <Flex justify=\"space-between\" align=\"center\" py={2}>\n {anchors.map((anchor, i) => {\n const point = i + 1\n const isSelected = value === point\n return (\n <Flex\n key={point}\n direction=\"column\"\n align=\"center\"\n gap={1}\n flex={1}\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => handleSelect(point)}\n opacity={resolvedDisabled ? 0.5 : 1}\n >\n {showNumbers && <Text fontSize=\"xs\" color=\"fg.muted\">{point}</Text>}\n <Box\n w=\"32px\"\n h=\"32px\"\n borderRadius=\"full\"\n borderWidth=\"2px\"\n borderColor={isSelected ? 'blue.500' : 'border'}\n bg={isSelected ? 'blue.500' : 'transparent'}\n transition=\"all 0.15s\"\n _hover={resolvedDisabled ? undefined : { borderColor: 'blue.400', transform: 'scale(1.1)' }}\n />\n <Text\n fontSize=\"xs\"\n textAlign=\"center\"\n color={isSelected ? 'blue.600' : 'fg.muted'}\n fontWeight={isSelected ? 'medium' : 'normal'}\n maxW=\"80px\"\n >\n {anchor}\n </Text>\n </Flex>\n )\n })}\n </Flex>\n {/* Линия под точками */}\n <Box h=\"2px\" bg=\"border\" mt=\"-28px\" mb=\"24px\" mx=\"16px\" borderRadius=\"full\" />\n </Box>\n\n {/* Мобильный вид — вертикальная шкала */}\n <Box display={{ base: 'block', md: 'none' }}>\n {anchors.map((anchor, i) => {\n const point = i + 1\n const isSelected = value === point\n return (\n <HStack\n key={point}\n p={2}\n borderRadius=\"md\"\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => handleSelect(point)}\n bg={isSelected ? 'blue.50' : 'transparent'}\n _dark={isSelected ? { bg: 'blue.900/20' } : undefined}\n _hover={resolvedDisabled ? undefined : { bg: 'bg.subtle' }}\n gap={3}\n >\n <Box\n w=\"24px\"\n h=\"24px\"\n borderRadius=\"full\"\n borderWidth=\"2px\"\n borderColor={isSelected ? 'blue.500' : 'border'}\n bg={isSelected ? 'blue.500' : 'transparent'}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color={isSelected ? 'blue.600' : 'fg'}>\n {showNumbers && `${point}. `}\n {anchor}\n </Text>\n </HStack>\n )\n })}\n </Box>\n\n <FieldError hasError={hasError} errorMessage={formatFieldErrors(errors)} helperText={resolvedHelperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport { Box, Checkbox, Circle, Field, RadioGroup, Table, Text, VStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { BaseFieldProps } from '../../types'\nimport { FieldError, FieldLabel } from '../base'\nimport { formatFieldErrors, hasFieldErrors } from '../base/field-utils'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/** Строка матрицы (вопрос) */\nexport interface MatrixRow {\n value: string\n label: string\n}\n\n/** Колонка матрицы (вариант ответа) */\nexport interface MatrixColumn {\n value: string\n label: string\n}\n\n/** Props для Form.Field.MatrixChoice */\nexport interface MatrixChoiceFieldProps extends BaseFieldProps {\n /** Строки матрицы (вопросы) */\n rows: MatrixRow[]\n /** Колонки матрицы (варианты ответа) */\n columns: MatrixColumn[]\n /** Вариант: radio (одиночный), checkbox (множественный), rating (звёзды) */\n variant?: 'radio' | 'checkbox' | 'rating'\n}\n\n/**\n * Form.Field.MatrixChoice — матричный выбор для опросников.\n *\n * Таблица \"вопрос × вариант ответа\" — стандарт в Google Forms и SurveyMonkey.\n *\n * @example\n * ```tsx\n * <Form.Field.MatrixChoice\n * name=\"satisfaction\"\n * rows={[\n * { value: 'speed', label: 'Скорость доставки' },\n * { value: 'quality', label: 'Качество товара' },\n * ]}\n * columns={[\n * { value: '1', label: 'Плохо' },\n * { value: '3', label: 'Нормально' },\n * { value: '5', label: 'Отлично' },\n * ]}\n * variant=\"radio\"\n * />\n * ```\n *\n * **Значение:** `Record<string, string | string[]>` — `{ speed: '4', quality: '5' }`\n */\nexport function FieldMatrixChoice({\n name,\n label,\n helperText,\n required,\n disabled,\n readOnly,\n rows,\n columns,\n variant = 'radio',\n}: MatrixChoiceFieldProps): ReactElement {\n const { form } = useDeclarativeForm()\n const {\n fullPath,\n label: resolvedLabel,\n helperText: resolvedHelperText,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, helperText, required, disabled, readOnly })\n\n return (\n <form.Field name={fullPath}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(field: any) => {\n const errors = field.state.meta.errors\n const hasError = hasFieldErrors(errors)\n const value: Record<string, string | string[]> = field.state.value ?? {}\n\n /** Установить значение для строки */\n const setRowValue = (rowValue: string, colValue: string) => {\n if (resolvedDisabled || resolvedReadOnly) return\n\n if (variant === 'checkbox') {\n // Множественный выбор — toggle в массиве\n const current = (value[rowValue] as string[] | undefined) ?? []\n const next = current.includes(colValue)\n ? current.filter((v) => v !== colValue)\n : [...current, colValue]\n field.handleChange({ ...value, [rowValue]: next })\n } else {\n // Radio/Rating — одиночный выбор\n field.handleChange({ ...value, [rowValue]: colValue })\n }\n }\n\n /** Проверить выбрано ли значение */\n const isSelected = (rowValue: string, colValue: string): boolean => {\n const rowVal = value[rowValue]\n if (variant === 'checkbox') {\n return Array.isArray(rowVal) && rowVal.includes(colValue)\n }\n return rowVal === colValue\n }\n\n // Мобильный вид — карточки вместо таблицы\n const mobileView = (\n <VStack gap={4} align=\"stretch\" display={{ base: 'flex', md: 'none' }}>\n {rows.map((row) => (\n <Box key={row.value} p={3} borderWidth=\"1px\" borderRadius=\"md\">\n <Text fontWeight=\"medium\" mb={2}>{row.label}</Text>\n {variant === 'checkbox'\n ? (\n <VStack align=\"start\" gap={1}>\n {columns.map((col) => (\n <Checkbox.Root\n key={col.value}\n checked={isSelected(row.value, col.value)}\n onCheckedChange={() => setRowValue(row.value, col.value)}\n disabled={!!resolvedDisabled}\n size=\"sm\"\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label>{col.label}</Checkbox.Label>\n </Checkbox.Root>\n ))}\n </VStack>\n )\n : (\n <RadioGroup.Root\n value={String(value[row.value] ?? '')}\n onValueChange={(details) => {\n if (details.value) setRowValue(row.value, details.value)\n }}\n disabled={!!resolvedDisabled}\n size=\"sm\"\n >\n <VStack align=\"start\" gap={1}>\n {columns.map((col) => (\n <RadioGroup.Item key={col.value} value={col.value}>\n <RadioGroup.ItemHiddenInput />\n <RadioGroup.ItemIndicator />\n <RadioGroup.ItemText>{col.label}</RadioGroup.ItemText>\n </RadioGroup.Item>\n ))}\n </VStack>\n </RadioGroup.Root>\n )}\n </Box>\n ))}\n </VStack>\n )\n\n // Десктопный вид — таблица с keyboard навигацией\n const handleMatrixKeyDown = (e: React.KeyboardEvent) => {\n const target = e.target as HTMLElement\n const cell = target.closest('[data-matrix-row][data-matrix-col]') as HTMLElement | null\n if (!cell) return\n\n const currentRow = cell.dataset.matrixRow!\n const currentCol = cell.dataset.matrixCol!\n const rowIdx = rows.findIndex((r) => r.value === currentRow)\n const colIdx = columns.findIndex((c) => c.value === currentCol)\n\n let nextRowIdx = rowIdx\n let nextColIdx = colIdx\n\n switch (e.key) {\n case 'ArrowRight':\n nextColIdx = Math.min(colIdx + 1, columns.length - 1)\n break\n case 'ArrowLeft':\n nextColIdx = Math.max(colIdx - 1, 0)\n break\n case 'ArrowDown':\n nextRowIdx = Math.min(rowIdx + 1, rows.length - 1)\n break\n case 'ArrowUp':\n nextRowIdx = Math.max(rowIdx - 1, 0)\n break\n case ' ':\n case 'Enter':\n e.preventDefault()\n setRowValue(rows[rowIdx].value, columns[colIdx].value)\n return\n default:\n return\n }\n\n e.preventDefault()\n const nextCell = document.querySelector(\n `[data-matrix-row=\"${rows[nextRowIdx].value}\"][data-matrix-col=\"${columns[nextColIdx].value}\"]`,\n ) as HTMLElement | null\n nextCell?.focus()\n }\n\n const desktopView = (\n <Box display={{ base: 'none', md: 'block' }} overflowX=\"auto\">\n <Table.Root size=\"sm\" variant=\"outline\" onKeyDown={handleMatrixKeyDown}>\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeader w=\"40%\" />\n {columns.map((col) => (\n <Table.ColumnHeader key={col.value} textAlign=\"center\">\n {col.label}\n </Table.ColumnHeader>\n ))}\n </Table.Row>\n </Table.Header>\n <Table.Body>\n {rows.map((row) => {\n // Подсветка незаполненной строки при required\n const rowValue = value[row.value]\n const isRowEmpty = variant === 'checkbox'\n ? (!Array.isArray(rowValue) || rowValue.length === 0)\n : !rowValue\n const showRowError = resolvedRequired && hasError && isRowEmpty\n\n return (\n <Table.Row\n key={row.value}\n _hover={{ bg: 'bg.subtle' }}\n bg={showRowError ? 'red.50' : undefined}\n _dark={showRowError ? { bg: 'red.900/10' } : undefined}\n >\n <Table.Cell fontWeight=\"medium\" color={showRowError ? 'red.500' : undefined}>\n {row.label}\n </Table.Cell>\n {columns.map((col) => (\n <Table.Cell\n key={col.value}\n textAlign=\"center\"\n data-matrix-row={row.value}\n data-matrix-col={col.value}\n tabIndex={0}\n role=\"gridcell\"\n >\n {variant === 'checkbox'\n ? (\n <Checkbox.Root\n checked={isSelected(row.value, col.value)}\n onCheckedChange={() => setRowValue(row.value, col.value)}\n disabled={!!resolvedDisabled}\n size=\"sm\"\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n )\n : variant === 'rating'\n ? (\n <Box\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => setRowValue(row.value, col.value)}\n fontSize=\"lg\"\n color={isSelected(row.value, col.value) ? 'yellow.400' : 'gray.300'}\n _hover={resolvedDisabled ? undefined : { color: 'yellow.400' }}\n >\n ★\n </Box>\n )\n : (\n <Circle\n size=\"18px\"\n borderWidth=\"2px\"\n borderColor={isSelected(row.value, col.value) ? 'blue.500' : 'border'}\n bg={isSelected(row.value, col.value) ? 'blue.500' : 'transparent'}\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => setRowValue(row.value, col.value)}\n transition=\"all 0.15s\"\n _hover={resolvedDisabled ? undefined : { borderColor: 'blue.400' }}\n aria-checked={isSelected(row.value, col.value)}\n role=\"radio\"\n >\n {isSelected(row.value, col.value) && <Circle size=\"8px\" bg=\"white\" />}\n </Circle>\n )}\n </Table.Cell>\n ))}\n </Table.Row>\n )\n })}\n </Table.Body>\n </Table.Root>\n </Box>\n )\n\n return (\n <Field.Root invalid={hasError}>\n {resolvedLabel && <FieldLabel label={resolvedLabel} required={resolvedRequired} />}\n {desktopView}\n {mobileView}\n <FieldError hasError={hasError} errorMessage={formatFieldErrors(errors)} helperText={resolvedHelperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport { Box, Field, HStack, Text } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { BaseFieldProps } from '../../types'\nimport { FieldError, FieldLabel } from '../base'\nimport { formatFieldErrors, hasFieldErrors } from '../base/field-utils'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/** Props для Form.Field.YesNo */\nexport interface YesNoFieldProps extends BaseFieldProps {\n /** Текст кнопки \"Да\" */\n yesLabel?: string\n /** Текст кнопки \"Нет\" */\n noLabel?: string\n /** Визуальный вариант */\n variant?: 'buttons' | 'thumbs' | 'emoji'\n}\n\n/** Контент для разных вариантов */\nconst VARIANT_CONTENT = {\n buttons: { yes: null, no: null },\n thumbs: { yes: '👍', no: '👎' },\n emoji: { yes: '😊', no: '😞' },\n}\n\n/**\n * Form.Field.YesNo — поле да/нет с большими кнопками.\n *\n * Два кликабельных блока для бинарного выбора. Подходит для согласий,\n * подтверждений, простых опросов.\n *\n * @example\n * ```tsx\n * <Form.Field.YesNo\n * name=\"agree\"\n * label=\"Вы согласны с условиями?\"\n * yesLabel=\"Да, согласен\"\n * noLabel=\"Нет, отказываюсь\"\n * variant=\"buttons\"\n * />\n * ```\n *\n * **Значение:** `boolean`\n */\nexport function FieldYesNo({\n name,\n label,\n helperText,\n required,\n disabled,\n readOnly,\n yesLabel = 'Да',\n noLabel = 'Нет',\n variant = 'buttons',\n}: YesNoFieldProps): ReactElement {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n const {\n fullPath,\n label: resolvedLabel,\n helperText: resolvedHelperText,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, helperText, required, disabled, readOnly })\n\n const icons = VARIANT_CONTENT[variant]\n\n return (\n <form.Field name={fullPath}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(field: any) => {\n const errors = field.state.meta.errors\n const hasError = hasFieldErrors(errors)\n const value = field.state.value as boolean | undefined\n\n const handleSelect = (val: boolean) => {\n if (resolvedDisabled || resolvedReadOnly) return\n field.handleChange(val)\n }\n\n return (\n <Field.Root invalid={hasError}>\n {resolvedLabel && <FieldLabel label={resolvedLabel} required={resolvedRequired} />}\n\n <HStack gap={3}>\n {/* Кнопка \"Да\" */}\n <Box\n flex={1}\n p={4}\n borderWidth=\"2px\"\n borderColor={value === true ? 'green.500' : 'border'}\n borderRadius=\"lg\"\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => handleSelect(true)}\n bg={value === true ? 'green.50' : 'transparent'}\n _dark={value === true ? { bg: 'green.900/20' } : undefined}\n _hover={resolvedDisabled ? undefined : { borderColor: 'green.400', shadow: 'sm' }}\n transition=\"all 0.2s\"\n textAlign=\"center\"\n opacity={resolvedDisabled ? 0.5 : 1}\n role=\"radio\"\n aria-checked={value === true}\n >\n {icons.yes && <Text fontSize=\"2xl\" mb={1}>{icons.yes}</Text>}\n <Text fontWeight=\"medium\" color={value === true ? 'green.600' : 'fg'}>\n {yesLabel}\n </Text>\n </Box>\n\n {/* Кнопка \"Нет\" */}\n <Box\n flex={1}\n p={4}\n borderWidth=\"2px\"\n borderColor={value === false ? 'red.500' : 'border'}\n borderRadius=\"lg\"\n cursor={resolvedDisabled ? 'default' : 'pointer'}\n onClick={() => handleSelect(false)}\n bg={value === false ? 'red.50' : 'transparent'}\n _dark={value === false ? { bg: 'red.900/20' } : undefined}\n _hover={resolvedDisabled ? undefined : { borderColor: 'red.400', shadow: 'sm' }}\n transition=\"all 0.2s\"\n textAlign=\"center\"\n opacity={resolvedDisabled ? 0.5 : 1}\n role=\"radio\"\n aria-checked={value === false}\n >\n {icons.no && <Text fontSize=\"2xl\" mb={1}>{icons.no}</Text>}\n <Text fontWeight=\"medium\" color={value === false ? 'red.600' : 'fg'}>\n {noLabel}\n </Text>\n </Box>\n </HStack>\n\n <FieldError hasError={hasError} errorMessage={formatFieldErrors(errors)} helperText={resolvedHelperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport { useCallback, useRef, useSyncExternalStore } from 'react'\nimport { useDebounce } from '../base/use-debounce'\n\n/**\n * Множество полей, которые сейчас вычисляются.\n * Используется для защиты от циклических зависимостей.\n */\nconst computingFields = new Set<string>()\n\n/**\n * Получить вложенное значение из объекта по dot-path.\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let result: unknown = obj\n for (const part of parts) {\n if (result && typeof result === 'object') {\n result = (result as Record<string, unknown>)[part]\n } else {\n return undefined\n }\n }\n return result\n}\n\n/**\n * Создать снапшот значений зависимых полей для сравнения.\n */\nfunction getDepsSnapshot(values: Record<string, unknown>, deps: string[]): unknown[] {\n return deps.map((dep) => getNestedValue(values, dep))\n}\n\n/**\n * Сравнить два снапшота зависимостей поэлементно.\n */\nfunction areDepsEqual(a: unknown[], b: unknown[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) return false\n }\n return true\n}\n\ninterface UseComputedValueOptions {\n /** TanStack Form instance */\n form: {\n store: { subscribe: (cb: () => void) => (() => void) | { unsubscribe: () => void } }\n state: { values: unknown }\n }\n /** Функция вычисления значения */\n compute: (values: Record<string, unknown>) => unknown\n /** Список зависимых полей для оптимизации (без — пересчёт при любом изменении) */\n deps?: string[]\n /** Дебаунс вычислений в мс (0 = без дебаунса) */\n debounce?: number\n /** Полный путь поля (для детекции циклов) */\n fieldPath: string\n}\n\n/**\n * Хук реактивного вычисления значения на основе других полей формы.\n *\n * Подписывается на form.store и пересчитывает значение при изменении\n * зависимых полей (или всех, если deps не указаны).\n *\n * @returns Вычисленное значение (с опциональным дебаунсом)\n */\nexport function useComputedValue({\n form,\n compute,\n deps,\n debounce: debounceMs = 0,\n fieldPath,\n}: UseComputedValueOptions): unknown {\n // Предыдущий снапшот зависимостей\n const prevDepsRef = useRef<unknown[] | null>(null)\n // Кэш результата (чтобы useSyncExternalStore не рендерил лишний раз)\n const cachedResultRef = useRef<unknown>(undefined)\n\n // Подписка на store\n const subscribe = useCallback(\n (callback: () => void) => {\n const subscription = form.store.subscribe(callback)\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n },\n [form]\n )\n\n // Снапшот: вычисляем значение\n const getSnapshot = useCallback(() => {\n const values = form.state.values as Record<string, unknown>\n\n // Если указаны deps — проверяем изменились ли зависимости\n if (deps && deps.length > 0) {\n const currentDeps = getDepsSnapshot(values, deps)\n if (prevDepsRef.current && areDepsEqual(prevDepsRef.current, currentDeps)) {\n return cachedResultRef.current\n }\n prevDepsRef.current = currentDeps\n }\n\n // Защита от циклических вычислений\n if (computingFields.has(fieldPath)) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(\n `[Form.Field.Calculated] Обнаружена циклическая зависимость: поле \"${fieldPath}\" ` +\n `уже вычисляется. Текущая цепочка: ${[...computingFields].join(' → ')} → ${fieldPath}`\n )\n }\n return cachedResultRef.current\n }\n\n try {\n computingFields.add(fieldPath)\n const result = compute(values)\n cachedResultRef.current = result\n return result\n } finally {\n computingFields.delete(fieldPath)\n }\n }, [form, compute, deps, fieldPath])\n\n const rawValue = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n // Дебаунс (если > 0)\n const debouncedValue = useDebounce(rawValue, debounceMs)\n\n return debounceMs > 0 ? debouncedValue : rawValue\n}\n","'use client'\n\nimport { Text } from '@chakra-ui/react'\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport type { ReactElement } from 'react'\nimport { useEffect } from 'react'\nimport { FieldWrapper } from '../base/field-wrapper'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\nimport { useComputedValue } from './use-computed-value'\n\n/**\n * Props для Form.Field.Calculated\n */\nexport interface CalculatedFieldProps {\n /** Имя поля в форме */\n name?: string\n /** Label поля */\n label?: string\n /** Функция вычисления значения из всех значений формы */\n compute: (values: Record<string, unknown>) => unknown\n /** Форматирование отображаемого значения */\n format?: (value: unknown) => string\n /** Список зависимых полей для оптимизации пересчёта */\n deps?: string[]\n /** Дебаунс вычислений в мс (по умолчанию 0) */\n debounce?: number\n /** Скрытый режим — вычисляет без отображения (как Hidden) */\n hidden?: boolean\n /** Helper text */\n helperText?: string\n}\n\n/**\n * Внутренний компонент синхронизации вычисленного значения с form state\n */\nfunction CalculatedFieldInner({\n field,\n computedValue,\n format,\n hidden,\n}: {\n field: AnyFieldApi\n computedValue: unknown\n format?: (value: unknown) => string\n hidden?: boolean\n}) {\n // Синхронизация вычисленного значения в form state\n useEffect(() => {\n if (!Object.is(field.state.value, computedValue)) {\n field.handleChange(computedValue)\n }\n }, [computedValue, field])\n\n if (hidden) return null\n\n const displayValue = format ? format(computedValue) : String(computedValue ?? '')\n\n return (\n <Text fontSize=\"md\" fontWeight=\"medium\" py=\"2\" data-testid=\"calculated-value\">\n {displayValue}\n </Text>\n )\n}\n\n/**\n * Form.Field.Calculated — вычисляемое поле формы\n *\n * Автоматически пересчитывает значение при изменении зависимых полей.\n * Значение readonly — пользователь не может редактировать вручную.\n * Вычисленное значение сохраняется в form state и отправляется при submit.\n *\n * @example Калькулятор стоимости\n * ```tsx\n * <Form initialValue={{ price: 100, qty: 2, total: 0 }} onSubmit={save}>\n * <Form.Field.Number name=\"price\" label=\"Цена\" />\n * <Form.Field.Number name=\"qty\" label=\"Количество\" />\n * <Form.Field.Calculated\n * name=\"total\"\n * label=\"Итого\"\n * compute={(v) => (v.price as number) * (v.qty as number)}\n * format={(v) => `${Number(v).toLocaleString()} ₽`}\n * deps={['price', 'qty']}\n * />\n * </Form>\n * ```\n *\n * @example Скрытый режим (вычисление без отображения)\n * ```tsx\n * <Form.Field.Calculated\n * name=\"total\"\n * compute={(v) => (v.price as number) * (v.qty as number)}\n * hidden\n * />\n * ```\n */\nexport function FieldCalculated({\n name,\n label,\n compute,\n format,\n deps,\n debounce = 0,\n hidden,\n helperText,\n}: CalculatedFieldProps): ReactElement | null {\n const { form, fullPath, ...resolved } = useResolvedFieldProps(name, {\n label,\n helperText,\n readOnly: true,\n })\n\n // Реактивное вычисление значения\n const computedValue = useComputedValue({\n form,\n compute,\n deps,\n debounce,\n fieldPath: fullPath,\n })\n\n if (hidden) {\n return (\n <form.Field name={fullPath}>\n {(field: AnyFieldApi) => <CalculatedFieldInner field={field} computedValue={computedValue} hidden />}\n </form.Field>\n )\n }\n\n return (\n <form.Field name={fullPath}>\n {(field: AnyFieldApi) => (\n <FieldWrapper resolved={resolved} hasError={false} errorMessage=\"\" fullPath={fullPath}>\n <CalculatedFieldInner field={field} computedValue={computedValue} format={format} />\n </FieldWrapper>\n )}\n </form.Field>\n )\n}\n\nFieldCalculated.displayName = 'FieldCalculated'\n","'use client'\n\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport type { ReactElement } from 'react'\nimport { useEffect } from 'react'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/**\n * Props для Form.Field.Hidden\n */\nexport interface HiddenFieldProps {\n /** Имя поля в форме */\n name?: string\n /** Значение для установки (обновляется при изменении prop) */\n value?: unknown\n}\n\n/**\n * Синхронизация внешнего value с form state\n */\nfunction HiddenFieldInner({ field, value }: { field: AnyFieldApi; value?: unknown }) {\n useEffect(() => {\n if (value !== undefined && !Object.is(field.state.value, value)) {\n field.handleChange(value)\n }\n }, [value, field])\n\n return null\n}\n\n/**\n * Form.Field.Hidden — скрытое поле формы\n *\n * Не рендерится в DOM, но участвует в form state.\n * Полезно для передачи UTM-меток, referral кодов, внутренних ID.\n *\n * @example\n * ```tsx\n * <Form.Field.Hidden name=\"utm_source\" value={searchParams.get('utm_source')} />\n * <Form.Field.Hidden name=\"referralCode\" value=\"ABC123\" />\n * ```\n */\nexport function FieldHidden({ name, value }: HiddenFieldProps): ReactElement | null {\n const { form, fullPath } = useResolvedFieldProps(name, {})\n\n return (\n <form.Field name={fullPath}>{(field: AnyFieldApi) => <HiddenFieldInner field={field} value={value} />}</form.Field>\n )\n}\n\nFieldHidden.displayName = 'FieldHidden'\n","'use client'\n\nimport { Box, Heading } from '@chakra-ui/react'\nimport JsonView from '@uiw/react-json-view'\nimport { githubDarkTheme } from '@uiw/react-json-view/githubDark'\nimport { githubLightTheme } from '@uiw/react-json-view/githubLight'\nimport type { ReactElement } from 'react'\nimport { useEffect, useState } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\nexport interface FormDebugValuesProps {\n /** Block title */\n title?: string\n /** Tree expansion depth (by default 2) */\n collapsed?: number\n /** Show in production (by default false) */\n showInProduction?: boolean\n}\n\n/** Detect dark theme via data-attribute (next-themes) or media query */\nfunction useIsDarkMode(): boolean {\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n // next-themes sets class or data-theme on <html>\n const check = () => {\n const html = document.documentElement\n const isDarkNow =\n html.classList.contains('dark') ||\n html.getAttribute('data-theme') === 'dark' ||\n html.style.colorScheme === 'dark'\n setIsDark(isDarkNow)\n }\n\n check()\n\n // Observe changes on <html>\n const observer = new MutationObserver(check)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'style'],\n })\n\n return () => observer.disconnect()\n }, [])\n\n return isDark\n}\n\n/**\n * Form.DebugValues — interactive JSON inspector for form values\n *\n * Automatically switches between dark and light theme.\n * Hidden in production by default. Use `showInProduction` for debugging in production.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" />\n * <Form.DebugValues />\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nexport function FormDebugValues({\n title = 'Form Values',\n collapsed = 2,\n showInProduction = false,\n}: FormDebugValuesProps): ReactElement | null {\n const { form } = useDeclarativeForm()\n const isDark = useIsDarkMode()\n\n // Hide in production unless specified otherwise\n if (process.env.NODE_ENV === 'production' && !showInProduction) {\n return null\n }\n\n const jsonTheme = isDark ? githubDarkTheme : githubLightTheme\n\n return (\n <form.Subscribe selector={(state: { values: unknown }) => state.values}>\n {(values: unknown) => (\n <Box\n borderWidth=\"1px\"\n borderColor=\"border.muted\"\n borderRadius=\"md\"\n p={3}\n mt={4}\n fontSize=\"sm\"\n fontFamily=\"mono\"\n bg=\"bg.subtle\"\n >\n {title && (\n <Heading size=\"xs\" mb={2} color=\"fg.muted\">\n {title}\n </Heading>\n )}\n <JsonView\n value={values as object}\n collapsed={collapsed}\n displayDataTypes={false}\n style={{ ...jsonTheme, backgroundColor: 'transparent' }}\n />\n </Box>\n )}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { useCallback, useId, useRef } from 'react'\n\n/**\n * Компонент-ловушка для ботов.\n * Рендерит скрытое поле, невидимое для людей.\n * Боты заполняют все поля — если это поле заполнено, submit блокируется.\n */\nexport function HoneypotField(): React.ReactElement {\n const id = useId()\n // Рандомный суффикс для затруднения обхода\n const nameRef = useRef(`hp_${id.replace(/:/g, '')}_${Math.random().toString(36).slice(2, 6)}`)\n\n return (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n left: '-9999px',\n width: 0,\n height: 0,\n overflow: 'hidden',\n opacity: 0,\n pointerEvents: 'none',\n tabIndex: -1,\n }}\n >\n <label htmlFor={nameRef.current}>\n {/* Лейбл для SEO/доступности — скрыт от пользователя */}\n Leave this field empty\n </label>\n <input type=\"text\" id={nameRef.current} name={nameRef.current} autoComplete=\"off\" tabIndex={-1} />\n </div>\n )\n}\n\n/**\n * Хук для проверки honeypot поля.\n * Возвращает функцию isBot() — true если поле заполнено (бот).\n */\nexport function useHoneypotCheck(enabled: boolean | undefined): {\n /** Проверить, заполнено ли honeypot поле (= бот) */\n isBot: () => boolean\n} {\n const checkBot = useCallback((): boolean => {\n if (!enabled) return false\n\n // Ищем все скрытые honeypot-поля формы\n const honeypotInputs = document.querySelectorAll<HTMLInputElement>('input[name^=\"hp_\"][tabindex=\"-1\"]')\n\n for (const input of honeypotInputs) {\n if (input.value.trim() !== '') {\n return true // Бот заполнил поле\n }\n }\n\n return false\n }, [enabled])\n\n return { isBot: checkBot }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * Конфигурация клиентского rate limiting\n */\nexport interface RateLimitConfig {\n /** Максимальное количество submit за окно (по умолчанию: 3) */\n maxSubmits: number\n /** Размер окна в миллисекундах (по умолчанию: 60000 = 1 минута) */\n windowMs: number\n}\n\n/**\n * Состояние rate limiter\n */\nexport interface RateLimitState {\n /** Submit заблокирован (лимит исчерпан) */\n isBlocked: boolean\n /** Оставшиеся попытки */\n remaining: number\n /** Секунд до разблокировки (0 если не заблокирован) */\n secondsLeft: number\n /** Зарегистрировать попытку submit */\n recordAttempt: () => boolean\n /** Сбросить счётчик */\n reset: () => void\n}\n\nconst STORAGE_KEY_PREFIX = 'form-rate-limit:'\n\n/**\n * Хук клиентского rate limiting для формы.\n * Хранит счётчик попыток в sessionStorage.\n * Graceful degradation — если sessionStorage недоступен, submit всегда разрешён.\n */\nexport function useRateLimit(config: RateLimitConfig | undefined, formId?: string): RateLimitState | null {\n const [secondsLeft, setSecondsLeft] = useState(0)\n const [isBlocked, setIsBlocked] = useState(false)\n // Счётчик для триггера re-render при recordAttempt\n const [attemptVersion, setAttemptVersion] = useState(0)\n const timerRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Стабильный ключ хранилища\n const storageKey = `${STORAGE_KEY_PREFIX}${formId ?? 'default'}`\n\n // Получить timestamps попыток из sessionStorage\n const getAttempts = useCallback((): number[] => {\n if (!config) return []\n try {\n const raw = sessionStorage.getItem(storageKey)\n if (!raw) return []\n const attempts = JSON.parse(raw) as number[]\n const now = Date.now()\n // Отфильтровать устаревшие\n return attempts.filter((ts) => now - ts < config.windowMs)\n } catch {\n return []\n }\n }, [config, storageKey])\n\n // Сохранить timestamps\n const saveAttempts = useCallback(\n (attempts: number[]) => {\n try {\n sessionStorage.setItem(storageKey, JSON.stringify(attempts))\n } catch {\n // sessionStorage недоступен — graceful degradation\n }\n },\n [storageKey]\n )\n\n // Запустить таймер обратного отсчёта\n const startCountdown = useCallback(\n (blockUntil: number) => {\n if (timerRef.current) clearInterval(timerRef.current)\n\n const updateTimer = () => {\n const remaining = Math.ceil((blockUntil - Date.now()) / 1000)\n if (remaining <= 0) {\n setIsBlocked(false)\n setSecondsLeft(0)\n if (timerRef.current) clearInterval(timerRef.current)\n timerRef.current = null\n // Очистить устаревшие записи\n saveAttempts(getAttempts())\n } else {\n setSecondsLeft(remaining)\n }\n }\n\n updateTimer()\n timerRef.current = setInterval(updateTimer, 1000)\n },\n [getAttempts, saveAttempts]\n )\n\n // Зарегистрировать попытку — возвращает true если разрешено\n const recordAttempt = useCallback((): boolean => {\n if (!config) return true\n\n const attempts = getAttempts()\n if (attempts.length >= config.maxSubmits) {\n // Заблокировать\n setIsBlocked(true)\n const oldestAttempt = Math.min(...attempts)\n const blockUntil = oldestAttempt + config.windowMs\n startCountdown(blockUntil)\n return false\n }\n\n // Записать попытку\n attempts.push(Date.now())\n saveAttempts(attempts)\n setAttemptVersion((v) => v + 1) // Триггер re-render для обновления remaining\n return true\n }, [config, getAttempts, saveAttempts, startCountdown])\n\n // Сброс\n const reset = useCallback(() => {\n try {\n sessionStorage.removeItem(storageKey)\n } catch {\n // Ignore\n }\n setIsBlocked(false)\n setSecondsLeft(0)\n if (timerRef.current) {\n clearInterval(timerRef.current)\n timerRef.current = null\n }\n }, [storageKey])\n\n // Очистка таймера при unmount\n useEffect(() => {\n return () => {\n if (timerRef.current) clearInterval(timerRef.current)\n }\n }, [])\n\n // Проверить блокировку при монтировании\n useEffect(() => {\n if (!config) return\n const attempts = getAttempts()\n if (attempts.length >= config.maxSubmits) {\n setIsBlocked(true)\n const oldestAttempt = Math.min(...attempts)\n const blockUntil = oldestAttempt + config.windowMs\n if (blockUntil > Date.now()) {\n startCountdown(blockUntil)\n }\n }\n }, [config, getAttempts, startCountdown])\n\n if (!config) return null\n\n const attempts = getAttempts()\n\n return {\n isBlocked,\n remaining: Math.max(0, config.maxSubmits - attempts.length),\n secondsLeft,\n recordAttempt,\n reset,\n }\n}\n","'use client'\n\nimport type { ValidateOn } from '../types'\n\n/**\n * Строит object validators для TanStack Form based on validateOn prop.\n *\n * @param schema - Zod schema for validation\n * @param validateOn - режим(ы) валидации ('change' | 'blur' | 'submit' | 'mount')\n * @returns object validators для useAppForm или undefined if schema не указана\n *\n * @example\n * // Валидация on change (by default)\n * buildValidators(MySchema) // { onChange: MySchema }\n *\n * // Валидация при blur\n * buildValidators(MySchema, 'blur') // { onBlur: MySchema }\n *\n * // Множественные режимы\n * buildValidators(MySchema, ['change', 'blur']) // { onChange: MySchema, onBlur: MySchema }\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function buildValidators(schema: any, validateOn?: ValidateOn | ValidateOn[]): Record<string, any> | undefined {\n if (!schema) {\n return undefined\n }\n\n // По умолчанию — validation на onChange\n if (!validateOn) {\n return { onChange: schema }\n }\n\n // Нормализуем в array\n const modes = Array.isArray(validateOn) ? validateOn : [validateOn]\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const validators: Record<string, any> = {}\n\n for (const mode of modes) {\n switch (mode) {\n case 'change':\n validators.onChange = schema\n break\n case 'blur':\n validators.onBlur = schema\n break\n case 'submit':\n validators.onSubmit = schema\n break\n case 'mount':\n validators.onMount = schema\n break\n }\n }\n\n return Object.keys(validators).length > 0 ? validators : undefined\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\nimport type { AppFormApi, FieldChangeApi, OnFieldChangeMap } from '../types'\n\n/**\n * Получить вложенное значение из объекта по dot-path.\n * Пример: getNestedValue({ a: { b: 1 } }, 'a.b') → 1\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let result: unknown = obj\n for (const part of parts) {\n if (result && typeof result === 'object') {\n result = (result as Record<string, unknown>)[part]\n } else {\n return undefined\n }\n }\n return result\n}\n\n/**\n * Хук для подписки на изменения конкретных полей формы.\n *\n * Использует `form.store.subscribe()` для отслеживания изменений и вызывает\n * соответствующий callback когда значение поля изменилось (сравнение через `Object.is`).\n *\n * @param form - TanStack Form API instance\n * @param onFieldChange - Маппинг поле → callback при изменении\n *\n * @example\n * ```tsx\n * useFieldChangeListeners(form, {\n * name: (value, { setFieldValue }) => {\n * setFieldValue('slug', transliterate(String(value)))\n * },\n * })\n * ```\n */\nexport function useFieldChangeListeners(form: AppFormApi, onFieldChange?: OnFieldChangeMap): void {\n // Храним актуальную версию callbacks в ref,\n // чтобы не переподписываться при inline-объектах\n const callbacksRef = useRef(onFieldChange)\n callbacksRef.current = onFieldChange\n\n // Предыдущие значения отслеживаемых полей\n const prevValuesRef = useRef<Record<string, unknown>>({})\n\n // Стабильный FieldChangeApi\n const fieldChangeApi = useMemo<FieldChangeApi>(\n () => ({\n setFieldValue: (name: string, value: unknown) => {\n form.setFieldValue(name, value)\n },\n getFieldValue: (name: string) => {\n return getNestedValue(form.state.values as Record<string, unknown>, name)\n },\n getValues: () => {\n return form.state.values as Record<string, unknown>\n },\n }),\n [form]\n )\n\n // Инициализация начальных значений отслеживаемых полей\n const initPrevValues = useCallback(() => {\n const callbacks = callbacksRef.current\n if (!callbacks) return\n\n const values = form.state.values as Record<string, unknown>\n const snapshot: Record<string, unknown> = {}\n for (const key of Object.keys(callbacks)) {\n snapshot[key] = getNestedValue(values, key)\n }\n prevValuesRef.current = snapshot\n }, [form])\n\n useEffect(() => {\n // Инициализируем snapshot при монтировании\n initPrevValues()\n\n const subscription = form.store.subscribe(() => {\n const callbacks = callbacksRef.current\n if (!callbacks) return\n\n const values = form.state.values as Record<string, unknown>\n const prev = prevValuesRef.current\n\n for (const key of Object.keys(callbacks)) {\n const currentValue = getNestedValue(values, key)\n if (!Object.is(prev[key], currentValue)) {\n prev[key] = currentValue\n callbacks[key](currentValue, fieldChangeApi)\n }\n }\n })\n\n // Совместимость: @tanstack/store 0.9+ returns Subscription, ранние — () => void\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n }, [form, fieldChangeApi, initPrevValues])\n}\n","'use client'\n\nimport { Button, CloseButton, Dialog, Portal, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * Form persistence configuration\n */\nexport interface FormPersistenceConfig {\n /**\n * Unique key for localStorage\n * Must be unique per form to avoid conflicts\n */\n key: string\n\n /**\n * Debounce delay in milliseconds for saving\n * @default 500\n */\n debounceMs?: number\n\n /**\n * Draft time-to-live in milliseconds (TTL)\n * After TTL expires the draft is considered stale and automatically removed\n * @example 24 * 60 * 60 * 1000 // 24 hours\n * @default undefined — no time limit\n */\n ttl?: number\n\n /**\n * Dialog title\n * @default 'Restore saved data?'\n */\n dialogTitle?: string\n\n /**\n * Dialog description\n * @default 'You have unsaved changes from a previous session.'\n */\n dialogDescription?: string\n\n /**\n * Restore button text\n * @default 'Restore'\n */\n restoreButtonText?: string\n\n /**\n * Discard button text\n * @default 'Start fresh'\n */\n discardButtonText?: string\n\n /**\n * Clear draft button text (for ClearDraftButton)\n * @default 'Clear draft'\n */\n clearDraftButtonText?: string\n}\n\n/**\n * Storage format for localStorage data (with metadata)\n * @internal\n */\ninterface StoredData<TData> {\n /** Saved form data */\n data: TData\n /** Save timestamp */\n savedAt: number\n /** Format version (for future migration) */\n version: 1\n}\n\n/**\n * Result of useFormPersistence hook\n */\nexport interface FormPersistenceResult<TData> {\n /**\n * Whether saved data exists\n */\n hasSavedData: boolean\n\n /**\n * Saved data (if any)\n */\n savedData: TData | null\n\n /**\n * Draft save timestamp\n * Used for displaying \"Draft from 15:30\"\n */\n savedAt: number | null\n\n /**\n * Whether restore dialog is open\n */\n isDialogOpen: boolean\n\n /**\n * Whether user chose to restore\n */\n shouldRestore: boolean\n\n /**\n * Save current form values to localStorage\n */\n saveValues: (values: TData) => void\n\n /**\n * Clear saved data from localStorage\n */\n clearSavedData: () => void\n\n /**\n * Accept and restore saved data\n */\n acceptRestore: () => TData | null\n\n /**\n * Reject restore and start fresh\n */\n rejectRestore: () => void\n\n /**\n * Close dialog without action\n */\n closeDialog: () => void\n\n /**\n * Mark restore as complete (called after form.reset)\n */\n markRestoreComplete: () => void\n\n /**\n * Dialog component for rendering\n */\n RestoreDialog: () => ReactElement | null\n\n /**\n * Clear draft button component\n * Shown only when saved data exists\n */\n ClearDraftButton: () => ReactElement | null\n}\n\nconst STORAGE_PREFIX = 'form-persistence:'\n\n/**\n * Hook for persisting form data in localStorage\n *\n * Automatically saves form state and shows a dialog\n * to restore saved data when the form loads.\n *\n * @example\n * ```tsx\n * const persistence = useFormPersistence<MyFormData>({\n * key: 'my-form',\n * debounceMs: 500,\n * })\n *\n * // In form onSubmit:\n * const handleSubmit = (data) => {\n * await saveToServer(data)\n * persistence.clearSavedData() // Clear on success\n * }\n *\n * // Subscribe to form changes:\n * useEffect(() => {\n * return form.store.subscribe(() => {\n * persistence.saveValues(form.state.values)\n * })\n * }, [])\n * ```\n */\nexport function useFormPersistence<TData extends object>(config: FormPersistenceConfig): FormPersistenceResult<TData> {\n const {\n key,\n debounceMs = 500,\n ttl,\n dialogTitle = 'Restore saved data?',\n dialogDescription = 'You have unsaved changes from a previous session.',\n restoreButtonText = 'Restore',\n discardButtonText = 'Start fresh',\n clearDraftButtonText = 'Clear draft',\n } = config\n\n const storageKey = `${STORAGE_PREFIX}${key}`\n\n // State\n const [savedData, setSavedData] = useState<TData | null>(null)\n const [savedAt, setSavedAt] = useState<number | null>(null)\n const [isDialogOpen, setIsDialogOpen] = useState(false)\n const [hasSavedData, setHasSavedData] = useState(false)\n const [shouldRestore, setShouldRestore] = useState(false)\n\n // Refs for debounce\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Load saved data on mount\n useEffect(() => {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n const stored = localStorage.getItem(storageKey)\n if (stored) {\n const parsed = JSON.parse(stored) as TData | StoredData<TData>\n\n // Check data format (new with version or old without)\n let data: TData\n let timestamp: number\n\n if (parsed && typeof parsed === 'object' && 'version' in parsed && parsed.version === 1) {\n // New format with metadata\n const storedData = parsed as StoredData<TData>\n data = storedData.data\n timestamp = storedData.savedAt\n\n // Check TTL\n if (ttl !== undefined) {\n const age = Date.now() - timestamp\n if (age > ttl) {\n // Data expired — remove\n localStorage.removeItem(storageKey)\n return\n }\n }\n } else {\n // Old format (for backward compatibility)\n data = parsed as TData\n timestamp = Date.now() // Unknown exact time, use current\n }\n\n setSavedData(data)\n setSavedAt(timestamp)\n setHasSavedData(true)\n setIsDialogOpen(true)\n }\n } catch {\n // Invalid JSON or localStorage error — ignore\n localStorage.removeItem(storageKey)\n }\n }, [storageKey, ttl])\n\n // Save values (with debounce)\n const saveValues = useCallback(\n (values: TData) => {\n // Don't save while restore dialog is still showing\n if (isDialogOpen) {\n return\n }\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // Set new deferred save\n debounceTimerRef.current = setTimeout(() => {\n try {\n const now = Date.now()\n const storedData: StoredData<TData> = {\n data: values,\n savedAt: now,\n version: 1,\n }\n localStorage.setItem(storageKey, JSON.stringify(storedData))\n setSavedAt(now)\n setHasSavedData(true)\n } catch {\n // localStorage may be full or disabled\n }\n }, debounceMs)\n },\n [storageKey, debounceMs, isDialogOpen]\n )\n\n // Clear saved data\n const clearSavedData = useCallback(() => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // Ignore errors\n }\n setSavedData(null)\n setSavedAt(null)\n setHasSavedData(false)\n }, [storageKey])\n\n // Accept restore\n const acceptRestore = useCallback(() => {\n setShouldRestore(true)\n setIsDialogOpen(false)\n // Keep savedData so the caller can use it\n return savedData\n }, [savedData])\n\n // Mark restore as complete (called after form.reset)\n const markRestoreComplete = useCallback(() => {\n setShouldRestore(false)\n clearSavedData()\n }, [clearSavedData])\n\n // Reject restore\n const rejectRestore = useCallback(() => {\n clearSavedData()\n setIsDialogOpen(false)\n }, [clearSavedData])\n\n // Close dialog\n const closeDialog = useCallback(() => {\n setIsDialogOpen(false)\n }, [])\n\n // Dialog component\n const RestoreDialog = useCallback((): ReactElement | null => {\n if (!hasSavedData) {\n return null\n }\n\n return (\n <Dialog.Root\n open={isDialogOpen}\n onOpenChange={(details) => {\n if (!details.open) {\n closeDialog()\n }\n }}\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>{dialogTitle}</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Text>{dialogDescription}</Text>\n </Dialog.Body>\n <Dialog.Footer gap={3}>\n <Button variant=\"outline\" onClick={rejectRestore}>\n {discardButtonText}\n </Button>\n <Button colorPalette=\"blue\" onClick={() => acceptRestore()}>\n {restoreButtonText}\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" onClick={rejectRestore} />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n )\n }, [\n hasSavedData,\n isDialogOpen,\n dialogTitle,\n dialogDescription,\n restoreButtonText,\n discardButtonText,\n closeDialog,\n rejectRestore,\n acceptRestore,\n ])\n\n // Clear draft button component\n const ClearDraftButton = useCallback((): ReactElement | null => {\n // Don't show if no saved data or restore dialog is open\n if (!hasSavedData || isDialogOpen) {\n return null\n }\n\n return (\n <Button variant=\"ghost\" size=\"sm\" colorPalette=\"red\" onClick={clearSavedData}>\n {clearDraftButtonText}\n </Button>\n )\n }, [hasSavedData, isDialogOpen, clearSavedData, clearDraftButtonText])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [])\n\n return {\n hasSavedData,\n savedData,\n savedAt,\n isDialogOpen,\n shouldRestore,\n saveValues,\n clearSavedData,\n acceptRestore,\n rejectRestore,\n closeDialog,\n markRestoreComplete,\n RestoreDialog,\n ClearDraftButton,\n }\n}\n\n/**\n * Props for FormWithPersistence component\n */\nexport interface FormPersistenceProps {\n /**\n * Persistence configuration\n */\n persistence?: FormPersistenceConfig\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { type FormOfflineConfig, useOfflineForm } from '../../offline'\nimport { type FormPersistenceConfig, useFormPersistence } from '../form-persistence'\nimport type { FormOfflineState } from '../types'\n\n/**\n * Конфигурация для хука useFormFeatures\n */\nexport interface UseFormFeaturesConfig<TData extends object> {\n /** Конфигурация persistence (сохранение данных в localStorage) */\n persistence?: FormPersistenceConfig\n /** Конфигурация offline-режима */\n offline?: FormOfflineConfig\n /** Function for online submission (called on submit) */\n onlineSubmit: (value: TData) => Promise<void>\n}\n\n/**\n * Result хука useFormFeatures\n */\nexport interface UseFormFeaturesResult<TData extends object> {\n /** Вkeyена ли persistence */\n isPersistenceEnabled: boolean\n /** Вkeyён ли offline-режим */\n isOfflineEnabled: boolean\n /** Result persistence хука */\n persistenceResult: ReturnType<typeof useFormPersistence<TData>>\n /** Result offline хука */\n offlineForm: ReturnType<typeof useOfflineForm<TData>>\n /** State offline для contextа form */\n offlineState: FormOfflineState | undefined\n /** Handler submit with support for offline and persistence */\n handleSubmit: (value: TData) => Promise<void>\n /** Подписка на изменения form для persistence */\n subscribeToFormChanges: (form: {\n store: { subscribe: (fn: () => void) => { unsubscribe: () => void } | (() => void) }\n state: { values: unknown }\n }) => () => void\n /** Восстановление данных из persistence */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n restoreFormData: (form: { setFieldValue: (key: string, value: any) => void }) => void\n}\n\n/**\n * Hook, объединяющий логику persistence и offline для форм.\n * Устраняет дублирование between FormSimple и FormWithApi.\n *\n * @example\n * const features = useFormFeatures({\n * persistence: { key: 'my-form' },\n * offline: { actionType: 'FORM_SUBMIT' },\n * onlineSubmit: async (value) => {\n * await saveData(value)\n * }\n * })\n */\nexport function useFormFeatures<TData extends object>({\n persistence,\n offline,\n onlineSubmit,\n}: UseFormFeaturesConfig<TData>): UseFormFeaturesResult<TData> {\n const isPersistenceEnabled = !!persistence\n const isOfflineEnabled = !!offline\n\n // Hook persistence (if не вkeyён — используем disabled key)\n const persistenceResult = useFormPersistence<TData>(persistence ?? { key: '__disabled__' })\n\n // Wrapper для онлайн-отправки с очисткой persistence\n const offlineOnlineSubmit = useCallback(\n async (value: TData) => {\n try {\n await onlineSubmit(value)\n // Clear persistence on successful submit\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n return { success: true }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Error отправки' }\n }\n },\n [onlineSubmit, isPersistenceEnabled, persistenceResult]\n )\n\n // Hook offline (if вkeyён)\n const offlineForm = useOfflineForm<TData>({\n actionType: offline?.actionType ?? 'FORM_SUBMIT',\n onlineSubmit: offlineOnlineSubmit,\n onSuccess: () => {\n offline?.onSynced?.()\n // Очищаем persistence при успешной синхронизации\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n },\n onQueued: offline?.onQueued,\n onError: offline?.onSyncError,\n })\n\n // State offline для contextа form\n const offlineState: FormOfflineState | undefined = isOfflineEnabled\n ? {\n isOffline: offlineForm.isOffline,\n pendingCount: offlineForm.pendingCount,\n isProcessing: offlineForm.isProcessing,\n clearPersistence: isPersistenceEnabled ? persistenceResult.clearSavedData : undefined,\n }\n : undefined\n\n // Handler submit\n const handleSubmit = useCallback(\n async (value: TData): Promise<void> => {\n if (isOfflineEnabled) {\n // Use offline-aware submit\n await offlineForm.submit(value)\n } else {\n // Direct submit\n await onlineSubmit(value)\n // Clear persistence on success\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n }\n },\n [isOfflineEnabled, offlineForm, onlineSubmit, isPersistenceEnabled, persistenceResult]\n )\n\n // Подписка на изменения form для persistence\n const subscribeToFormChanges = useCallback(\n (form: {\n store: { subscribe: (fn: () => void) => { unsubscribe: () => void } | (() => void) }\n state: { values: unknown }\n }) => {\n if (!isPersistenceEnabled) {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n return () => {}\n }\n\n const subscription = form.store.subscribe(() => {\n const values = form.state.values as TData\n persistenceResult.saveValues(values)\n })\n\n // Совместимость: @tanstack/store 0.9+ returns Subscription, ранние — () => void\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n },\n [isPersistenceEnabled, persistenceResult]\n )\n\n // Восстановление данных из persistence\n const restoreFormData = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (form: { setFieldValue: (key: string, value: any) => void }) => {\n if (!isPersistenceEnabled || !persistenceResult.shouldRestore || !persistenceResult.savedData) {\n return\n }\n\n // Применяем сохранённые значения\n const dataToRestore = persistenceResult.savedData as Record<string, unknown>\n for (const [key, value] of Object.entries(dataToRestore)) {\n form.setFieldValue(key, value)\n }\n\n // Отмечаем восстановление как завершённое after тика\n setTimeout(() => {\n persistenceResult.markRestoreComplete()\n }, 0)\n },\n [isPersistenceEnabled, persistenceResult]\n )\n\n return {\n isPersistenceEnabled,\n isOfflineEnabled,\n persistenceResult,\n offlineForm,\n offlineState,\n handleSubmit,\n subscribeToFormChanges,\n restoreFormData,\n }\n}\n","'use client'\n\nimport { type ReactElement, type ReactNode, useEffect, useMemo } from 'react'\nimport { useAppForm } from '../../form-hook'\nimport type { FormOfflineConfig } from '../../offline'\nimport { DeclarativeFormContext } from '../form-context'\nimport { FormDebugValues } from '../form-debug-values'\nimport type { FormPersistenceConfig } from '../form-persistence'\nimport { HoneypotField, useHoneypotCheck } from '../security/honeypot'\nimport type { RateLimitConfig } from '../security/rate-limiter'\nimport { useRateLimit } from '../security/rate-limiter'\nimport type { DeclarativeFormContextValue, FormMiddleware, OnFieldChangeMap, ValidateOn } from '../types'\nimport { buildValidators } from './form-validators'\nimport { useFieldChangeListeners } from './use-field-change-listeners'\nimport { useFormFeatures } from './use-form-features'\n\n/**\n * Props for FormSimple component\n */\nexport interface FormSimpleProps<TData extends object> {\n /** Initial form values */\n initialValue: TData\n /** Form submit handler */\n onSubmit: (data: TData) => void | Promise<void>\n /** Zod schema for validation */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Persistence configuration (localStorage) */\n persistence?: FormPersistenceConfig\n /** Offline mode configuration */\n offline?: FormOfflineConfig\n /** Validation mode(s) */\n validateOn?: ValidateOn | ValidateOn[]\n /** Disable all form fields */\n disabled?: boolean\n /** Read-only mode for all fields */\n readOnly?: boolean\n /** JSON value inspector: true = dev only, 'force' = also in production */\n debug?: boolean | 'force'\n /** Middleware for form event handling */\n middleware?: FormMiddleware<TData>\n /** Address suggestion provider for Form.Field.Address and Form.Field.City */\n addressProvider?: import('../form-fields/specialized/providers').AddressProvider\n /** Реактивные побочные эффекты при изменении полей */\n onFieldChange?: OnFieldChangeMap\n /** Honeypot-ловушка для ботов */\n honeypot?: boolean\n /** Клиентский rate limiting */\n rateLimit?: RateLimitConfig\n /** Form content */\n children: ReactNode\n}\n\n/**\n * Simple form without API integration.\n * Used when a form with local data is needed.\n *\n * @example\n * <FormSimple\n * initialValue={{ name: '', email: '' }}\n * onSubmit={handleSubmit}\n * schema={UserSchema}\n * >\n * <Form.Field.String name=\"name\" label=\"Name\" />\n * <Form.Field.String name=\"email\" label=\"Email\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </FormSimple>\n */\nexport function FormSimple<TData extends object>({\n initialValue,\n onSubmit,\n schema,\n persistence,\n offline,\n validateOn,\n disabled,\n readOnly,\n debug,\n middleware,\n addressProvider,\n onFieldChange,\n honeypot,\n rateLimit,\n children,\n}: FormSimpleProps<TData>): ReactElement {\n // Honeypot — проверка бота при submit\n const { isBot } = useHoneypotCheck(honeypot)\n\n // Rate limiting — ограничение попыток submit\n const rateLimitState = useRateLimit(rateLimit)\n\n // Use shared hook for persistence and offline\n const features = useFormFeatures<TData>({\n persistence,\n offline,\n onlineSubmit: async (value) => {\n await onSubmit(value)\n },\n })\n\n // Initialize form\n const form = useAppForm({\n defaultValues: initialValue,\n validators: buildValidators(schema, validateOn),\n onSubmit: async ({ value, formApi }) => {\n // Honeypot — блокировка ботов\n if (isBot()) return\n\n // Rate limiting — проверка лимита\n if (rateLimitState && !rateLimitState.recordAttempt()) return\n\n let dataToSubmit = value as TData\n\n // Apply beforeSubmit middleware\n if (middleware?.beforeSubmit) {\n const transformed = await middleware.beforeSubmit(dataToSubmit)\n if (transformed === undefined) {\n // Cancel submit\n return\n }\n dataToSubmit = transformed\n }\n\n try {\n await features.handleSubmit(dataToSubmit)\n\n // Call afterSuccess middleware\n if (middleware?.afterSuccess) {\n await middleware.afterSuccess(dataToSubmit)\n }\n\n // Reset form with current values to clear dirty state\n formApi.reset(dataToSubmit)\n } catch (error) {\n // Call onError middleware\n if (middleware?.onError) {\n await middleware.onError(error instanceof Error ? error : new Error(String(error)))\n }\n throw error\n }\n },\n })\n\n // Подписка на изменения полей (onFieldChange)\n useFieldChangeListeners(form, onFieldChange)\n\n // Subscribe to changes for persistence\n useEffect(() => {\n return features.subscribeToFormChanges(form)\n }, [form, features])\n\n // Restore data from persistence\n useEffect(() => {\n if (\n !features.isPersistenceEnabled ||\n !features.persistenceResult.shouldRestore ||\n !features.persistenceResult.savedData\n ) {\n return\n }\n features.restoreFormData(form)\n }, [\n form,\n features,\n features.isPersistenceEnabled,\n features.persistenceResult.shouldRestore,\n features.persistenceResult.savedData,\n ])\n\n // Memoize context value to prevent unnecessary re-renders\n const contextValue = useMemo<DeclarativeFormContextValue>(\n () => ({\n form,\n schema,\n offlineState: features.offlineState,\n disabled,\n readOnly,\n addressProvider,\n }),\n [form, schema, features.offlineState, disabled, readOnly, addressProvider]\n )\n\n return (\n <DeclarativeFormContext.Provider value={contextValue}>\n {/* Data restore dialog */}\n {features.isPersistenceEnabled && <features.persistenceResult.RestoreDialog />}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n >\n {honeypot && <HoneypotField />}\n {rateLimitState?.isBlocked && (\n <div role=\"alert\" style={{ color: 'var(--chakra-colors-fg-error, #e53e3e)', marginBottom: '1rem' }}>\n Too many attempts. Try again in {rateLimitState.secondsLeft}s.\n </div>\n )}\n {children}\n {debug && <FormDebugValues showInProduction={debug === 'force'} />}\n </form>\n </DeclarativeFormContext.Provider>\n )\n}\n","'use client'\n\nimport { useCallback, useMemo } from 'react'\nimport type { FormApiConfig, FormApiResult } from './types'\n\n/**\n * Hook for integrating ZenStack hooks with Form component\n *\n * Handles:\n * - Data fetching via query hook (only in edit mode)\n * - Create/update mutations\n * - Loading and pending states\n *\n * @example\n * ```tsx\n * const formApi = useFormApi({\n * id: 'abc123',\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * })\n *\n * // formApi.isEditMode - true if id provided\n * // formApi.data - loaded data\n * // formApi.submit(values) - calls create or update mutation\n * ```\n */\nexport function useFormApi<TData extends object>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n config: FormApiConfig<TData, any>\n): FormApiResult<TData> {\n const isEditMode = !!config.id\n\n // Call query hook (always, but disabled in create mode)\n const queryResult = config.query.hook(\n {\n where: { id: config.id ?? '' },\n include: config.query.include,\n },\n { enabled: isEditMode }\n )\n\n // Call mutation hooks (always, hooks rules)\n const createMutation = config.mutations.create()\n const updateMutation = config.mutations.update()\n\n // Submit handler\n const submit = useCallback(\n async (values: TData) => {\n const mode = isEditMode ? 'update' : 'create'\n\n // Transform data if transformer provided, otherwise use raw values\n const data = config.transformData ? config.transformData(values, mode) : values\n\n if (isEditMode && config.id) {\n await updateMutation.mutateAsync({\n where: { id: config.id },\n data,\n })\n } else {\n await createMutation.mutateAsync({\n data,\n })\n }\n },\n [isEditMode, config.id, config.transformData, createMutation, updateMutation]\n )\n\n // Get mutation error (whichever one was used)\n const mutationError = isEditMode ? updateMutation.error : createMutation.error\n\n // ZenStack hooks may return data directly or wrapped in { data, meta }\n // Check if data is wrapped\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rawData = queryResult.data as any\n const actualData = rawData?.data !== undefined ? rawData.data : rawData\n\n return useMemo(\n () => ({\n isEditMode,\n isLoading: isEditMode ? queryResult.isLoading : false,\n isMutating: createMutation.isPending || updateMutation.isPending,\n data: actualData,\n error: queryResult.error,\n mutationError,\n submit,\n }),\n [\n isEditMode,\n queryResult.isLoading,\n actualData,\n queryResult.error,\n createMutation.isPending,\n updateMutation.isPending,\n mutationError,\n submit,\n ]\n )\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\n\n/**\n * Loading state for API-integrated forms.\n * Displayed while data is loading in edit mode.\n * Does not render children to avoid context errors in Field components.\n */\nexport function FormLoadingState(): ReactElement {\n return (\n <div style={{ opacity: 0.5, padding: '1rem' }}>\n <p>Loading form data...</p>\n </div>\n )\n}\n","'use client'\n\nimport { type ReactElement, type ReactNode, useEffect } from 'react'\nimport { useAppForm } from '../../form-hook'\nimport type { FormOfflineConfig } from '../../offline'\nimport { DeclarativeFormContext } from '../form-context'\nimport { FormDebugValues } from '../form-debug-values'\nimport type { FormPersistenceConfig } from '../form-persistence'\nimport { HoneypotField, useHoneypotCheck } from '../security/honeypot'\nimport type { RateLimitConfig } from '../security/rate-limiter'\nimport { useRateLimit } from '../security/rate-limiter'\nimport type { DeclarativeFormContextValue, FormApiConfig, FormMiddleware, OnFieldChangeMap, ValidateOn } from '../types'\nimport { useFormApi } from '../use-form-api'\nimport { FormLoadingState } from './form-loading-state'\nimport { buildValidators } from './form-validators'\nimport { useFieldChangeListeners } from './use-field-change-listeners'\nimport { useFormFeatures } from './use-form-features'\n\n/**\n * Props for FormWithApi component\n */\nexport interface FormWithApiProps<TData extends object> {\n /** API configuration (ZenStack) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: FormApiConfig<TData, any>\n /** Initial values (fallback while data is loading) */\n initialValue?: TData\n /** Additional handler after successful submission */\n onSubmit?: (data: TData) => void | Promise<void>\n /** Zod schema for validation */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Persistence configuration (localStorage) */\n persistence?: FormPersistenceConfig\n /** Offline mode configuration */\n offline?: FormOfflineConfig\n /** Validation mode(s) */\n validateOn?: ValidateOn | ValidateOn[]\n /** Disable all form fields */\n disabled?: boolean\n /** Read-only mode for all fields */\n readOnly?: boolean\n /** JSON value inspector: true = dev only, 'force' = also in production */\n debug?: boolean | 'force'\n /** Middleware for form event handling */\n middleware?: FormMiddleware<TData>\n /** Address suggestion provider for Form.Field.Address and Form.Field.City */\n addressProvider?: import('../form-fields/specialized/providers').AddressProvider\n /** Реактивные побочные эффекты при изменении полей */\n onFieldChange?: OnFieldChangeMap\n /** Honeypot-ловушка для ботов */\n honeypot?: boolean\n /** Клиентский rate limiting */\n rateLimit?: RateLimitConfig\n /** Form content */\n children: ReactNode\n}\n\n/**\n * Form with ZenStack API integration.\n * Automatically loads data in edit mode,\n * uses create/update mutations for saving.\n *\n * @example\n * <FormWithApi\n * api={{\n * id: 'abc123', // empty = create, filled = edit\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * }}\n * schema={RecipeSchema}\n * onSubmit={(data) => console.log('Saved:', data)}\n * >\n * <Form.Field.String name=\"title\" label=\"Title\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </FormWithApi>\n */\nexport function FormWithApi<TData extends object>({\n api,\n initialValue,\n onSubmit,\n schema,\n persistence,\n offline,\n validateOn,\n disabled,\n readOnly,\n debug,\n middleware,\n addressProvider,\n onFieldChange,\n honeypot,\n rateLimit,\n children,\n}: FormWithApiProps<TData>): ReactElement {\n // Honeypot — проверка бота при submit\n const { isBot } = useHoneypotCheck(honeypot)\n\n // Rate limiting — ограничение попыток submit\n const rateLimitState = useRateLimit(rateLimit)\n\n // Hook for API operations\n const formApi = useFormApi(api)\n\n // Use shared hook for persistence and offline\n const features = useFormFeatures<TData>({\n persistence,\n offline,\n onlineSubmit: async (value) => {\n // Call API mutation\n await formApi.submit(value)\n // Call user callback\n await onSubmit?.(value)\n },\n })\n\n // Determine initial values:\n // - Edit mode: use loaded data (or initialValue as fallback)\n // - Create mode: use initialValue (or empty object)\n const defaultValues = formApi.isEditMode\n ? (formApi.data ?? initialValue ?? ({} as TData))\n : (initialValue ?? ({} as TData))\n\n // Initialize form\n const form = useAppForm({\n defaultValues,\n validators: buildValidators(schema, validateOn),\n onSubmit: async ({ value, formApi: tanstackFormApi }) => {\n // Honeypot — блокировка ботов\n if (isBot()) return\n\n // Rate limiting — проверка лимита\n if (rateLimitState && !rateLimitState.recordAttempt()) return\n\n let dataToSubmit = value as TData\n\n // Apply beforeSubmit middleware\n if (middleware?.beforeSubmit) {\n const transformed = await middleware.beforeSubmit(dataToSubmit)\n if (transformed === undefined) {\n // Cancel submit\n return\n }\n dataToSubmit = transformed\n }\n\n try {\n await features.handleSubmit(dataToSubmit)\n\n // Call afterSuccess middleware\n if (middleware?.afterSuccess) {\n await middleware.afterSuccess(dataToSubmit)\n }\n\n // Reset form with current values to clear dirty state\n tanstackFormApi.reset(dataToSubmit)\n } catch (error) {\n // Call onError middleware\n if (middleware?.onError) {\n await middleware.onError(error instanceof Error ? error : new Error(String(error)))\n }\n throw error\n }\n },\n })\n\n // Подписка на изменения полей (onFieldChange)\n useFieldChangeListeners(form, onFieldChange)\n\n // Subscribe to changes for persistence\n useEffect(() => {\n return features.subscribeToFormChanges(form)\n }, [form, features])\n\n // Restore data from persistence\n useEffect(() => {\n if (\n !features.isPersistenceEnabled ||\n !features.persistenceResult.shouldRestore ||\n !features.persistenceResult.savedData\n ) {\n return\n }\n features.restoreFormData(form)\n }, [\n form,\n features,\n features.isPersistenceEnabled,\n features.persistenceResult.shouldRestore,\n features.persistenceResult.savedData,\n ])\n\n // Data loading flag (edit mode)\n const dataLoaded = formApi.isEditMode && formApi.data && !formApi.isLoading\n\n // Build context value\n const contextValue: DeclarativeFormContextValue = {\n form,\n schema,\n // Export API state for components that need it\n apiState: {\n isEditMode: formApi.isEditMode,\n isLoading: formApi.isLoading,\n isMutating: formApi.isMutating,\n error: formApi.error,\n mutationError: formApi.mutationError,\n },\n offlineState: features.offlineState,\n disabled,\n readOnly,\n addressProvider,\n }\n\n // Show loading state in edit mode\n if (formApi.isLoading) {\n return <FormLoadingState />\n }\n\n return (\n <DeclarativeFormContext.Provider value={contextValue} key={dataLoaded ? 'loaded' : 'initial'}>\n {/* Data restore dialog */}\n {features.isPersistenceEnabled && <features.persistenceResult.RestoreDialog />}\n <form\n onSubmit={(e) => {\n e.preventDefault()\n e.stopPropagation()\n form.handleSubmit()\n }}\n >\n {honeypot && <HoneypotField />}\n {rateLimitState?.isBlocked && (\n <div role=\"alert\" style={{ color: 'var(--chakra-colors-fg-error, #e53e3e)', marginBottom: '1rem' }}>\n Too many attempts. Try again in {rateLimitState.secondsLeft}s.\n </div>\n )}\n {children}\n {debug && <FormDebugValues showInProduction={debug === 'force'} />}\n </form>\n </DeclarativeFormContext.Provider>\n )\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport type { FormPropsWithApi } from '../types'\nimport type { FormComponent } from './form-compound-types'\nimport { FormSimple } from './form-simple'\nimport { FormWithApi } from './form-with-api'\n\n// Re-export types for external use\nexport type {\n FormButtonComponents,\n FormComponent,\n FormFieldComponents,\n FormGroupComponent,\n FormGroupListComponent,\n FormStepsComponent,\n ListButtonComponents,\n} from './form-compound-types'\n\n// Re-export subcomponents\nexport { FormLoadingState } from './form-loading-state'\nexport { FormSimple, type FormSimpleProps } from './form-simple'\nexport { buildValidators } from './form-validators'\nexport { FormWithApi, type FormWithApiProps } from './form-with-api'\nexport { useFieldChangeListeners } from './use-field-change-listeners'\nexport { useFormFeatures, type UseFormFeaturesConfig, type UseFormFeaturesResult } from './use-form-features'\n\n/**\n * Root component for declarative forms.\n *\n * Supports two modes:\n * 1. **Simple mode** — provide initialValue and onSubmit\n * 2. **API mode** — provide api for automatic ZenStack integration\n *\n * @example Simple mode\n * ```tsx\n * <Form initialValue={{ title: '', count: 0 }} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" label=\"Title\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example API mode (ZenStack)\n * ```tsx\n * <Form\n * api={{\n * id: 'abc123', // empty = create, filled = edit\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * }}\n * schema={RecipeSchema}\n * onSubmit={(data) => console.log('Saved:', data)}\n * >\n * <Form.Field.String name=\"title\" />\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nfunction FormRoot<TData extends object>({\n api,\n initialValue,\n onSubmit,\n schema,\n persistence,\n offline,\n validateOn,\n disabled,\n readOnly,\n debug,\n middleware,\n addressProvider,\n onFieldChange,\n honeypot,\n rateLimit,\n children,\n}: FormPropsWithApi<TData>): ReactElement {\n // If api is provided — use FormWithApi, otherwise — simple form\n if (api) {\n return (\n <FormWithApi\n api={api}\n initialValue={initialValue}\n onSubmit={onSubmit}\n schema={schema}\n persistence={persistence}\n offline={offline}\n validateOn={validateOn}\n disabled={disabled}\n readOnly={readOnly}\n debug={debug}\n middleware={middleware}\n addressProvider={addressProvider}\n onFieldChange={onFieldChange}\n honeypot={honeypot}\n rateLimit={rateLimit}\n >\n {children}\n </FormWithApi>\n )\n }\n\n // Simple mode — initialValue is required\n if (!initialValue) {\n throw new Error('Form requires either api prop or initialValue prop')\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n const noopSubmit = () => {}\n\n return (\n <FormSimple\n initialValue={initialValue}\n onSubmit={onSubmit ?? noopSubmit}\n schema={schema}\n persistence={persistence}\n offline={offline}\n validateOn={validateOn}\n disabled={disabled}\n readOnly={readOnly}\n debug={debug}\n middleware={middleware}\n addressProvider={addressProvider}\n onFieldChange={onFieldChange}\n honeypot={honeypot}\n rateLimit={rateLimit}\n >\n {children}\n </FormSimple>\n )\n}\n\n/**\n * Form as compound component.\n * Subcomponents (Field, Group, Button, Steps, etc.) are added in declarative/index.ts\n */\nexport const Form = FormRoot as unknown as FormComponent\n","'use client'\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { ButtonSubmit } from '../form-buttons'\nimport {\n camelCaseToLabel,\n FieldAuto,\n FieldCheckbox,\n FieldCurrency,\n FieldDate,\n FieldNativeSelect,\n FieldNumber,\n FieldPassword,\n FieldPercentage,\n FieldPhone,\n FieldRating,\n FieldSelect,\n FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTextarea,\n} from '../form-fields'\nimport { Form } from '../form-root'\nimport type { FormMiddleware, ValidateOn } from '../types'\nimport type { BaseOption } from '../types/option-types'\nimport type { FieldSize } from '../types/size-types'\n\n// =============================================================================\n// Field Config Types\n// =============================================================================\n\n/**\n * Base field configuration\n */\ninterface BaseFieldConfig {\n /** Field name (key in form data) */\n name: string\n /** Field label (if not specified, generated from name) */\n label?: string\n /** Placeholder */\n placeholder?: string\n /** Helper text below field */\n helperText?: string\n /** Required field */\n required?: boolean\n /** Disabled */\n disabled?: boolean\n /** Size */\n size?: FieldSize\n}\n\n/**\n * Text field configuration\n */\ninterface StringFieldConfig extends BaseFieldConfig {\n type: 'string'\n /** Maximum length */\n maxLength?: number\n}\n\n/**\n * Multiline field configuration\n */\ninterface TextareaFieldConfig extends BaseFieldConfig {\n type: 'textarea'\n /** Number of rows */\n rows?: number\n}\n\n/**\n * Number field configuration\n */\ninterface NumberFieldConfig extends BaseFieldConfig {\n type: 'number'\n /** Minimum value */\n min?: number\n /** Maximum value */\n max?: number\n /** Step */\n step?: number\n}\n\n/**\n * Currency field configuration\n */\ninterface CurrencyFieldConfig extends BaseFieldConfig {\n type: 'currency'\n /** Currency code (by default 'RUB') */\n currency?: string\n}\n\n/**\n * Percentage field configuration\n */\ninterface PercentageFieldConfig extends BaseFieldConfig {\n type: 'percentage'\n}\n\n/**\n * Slider configuration\n */\ninterface SliderFieldConfig extends BaseFieldConfig {\n type: 'slider'\n min?: number\n max?: number\n step?: number\n}\n\n/**\n * Rating configuration\n */\ninterface RatingFieldConfig extends BaseFieldConfig {\n type: 'rating'\n /** Maximum value (by default 5) */\n max?: number\n}\n\n/**\n * Checkbox configuration\n */\ninterface CheckboxFieldConfig extends BaseFieldConfig {\n type: 'checkbox'\n}\n\n/**\n * Switch configuration\n */\ninterface SwitchFieldConfig extends BaseFieldConfig {\n type: 'switch'\n}\n\n/**\n * Select configuration\n */\ninterface SelectFieldConfig extends BaseFieldConfig {\n type: 'select'\n /** Options for selection */\n options: BaseOption[]\n /** Use NativeSelect */\n native?: boolean\n}\n\n/**\n * Date configuration\n */\ninterface DateFieldConfig extends BaseFieldConfig {\n type: 'date'\n}\n\n/**\n * Password configuration\n */\ninterface PasswordFieldConfig extends BaseFieldConfig {\n type: 'password'\n}\n\n/**\n * Phone configuration\n */\ninterface PhoneFieldConfig extends BaseFieldConfig {\n type: 'phone'\n}\n\n/**\n * Auto-field configuration (type determined from schema)\n */\ninterface AutoFieldConfig extends BaseFieldConfig {\n type: 'auto'\n}\n\n/**\n * Union type of field configuration\n */\nexport type FieldConfig =\n | StringFieldConfig\n | TextareaFieldConfig\n | NumberFieldConfig\n | CurrencyFieldConfig\n | PercentageFieldConfig\n | SliderFieldConfig\n | RatingFieldConfig\n | CheckboxFieldConfig\n | SwitchFieldConfig\n | SelectFieldConfig\n | DateFieldConfig\n | PasswordFieldConfig\n | PhoneFieldConfig\n | AutoFieldConfig\n\n// =============================================================================\n// Form Builder Config\n// =============================================================================\n\n/**\n * Form section for grouping fields\n */\nexport interface FormBuilderSection {\n /** Section title */\n title?: string\n /** Section description */\n description?: string\n /** Fields in section */\n fields: FieldConfig[]\n}\n\n/**\n * Form configuration for FormBuilder\n */\nexport interface FormBuilderConfig {\n /** Form fields (simple list) */\n fields?: FieldConfig[]\n /** Form sections (for grouping) */\n sections?: FormBuilderSection[]\n}\n\n// =============================================================================\n// Form Builder Props\n// =============================================================================\n\n/**\n * Props for FormBuilder\n */\nexport interface FormBuilderProps<TData extends object> {\n /** Form configuration */\n config: FormBuilderConfig\n /** Initial values */\n initialValue: TData\n /** Submit handler */\n onSubmit: (data: TData) => void | Promise<void>\n /** Zod schema for validation */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Validation mode */\n validateOn?: ValidateOn | ValidateOn[]\n /** Middleware */\n middleware?: FormMiddleware<TData>\n /** Disable all fields */\n disabled?: boolean\n /** Read only */\n readOnly?: boolean\n /** Submit button text */\n submitLabel?: string\n /** Additional content after fields */\n children?: ReactNode\n}\n\n// =============================================================================\n// Field Renderer\n// =============================================================================\n\n/**\n * Extracts base props from configuration\n */\nfunction getBaseProps(config: FieldConfig) {\n return {\n placeholder: config.placeholder,\n helperText: config.helperText,\n required: config.required,\n disabled: config.disabled,\n }\n}\n\n/**\n * Renders field by configuration\n */\nfunction renderField(config: FieldConfig): ReactElement {\n const { name, label } = config\n const resolvedLabel = label ?? camelCaseToLabel(name)\n const baseProps = getBaseProps(config)\n\n switch (config.type) {\n case 'string':\n return <FieldString key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'textarea':\n return <FieldTextarea key={name} name={name} label={resolvedLabel} rows={config.rows} {...baseProps} />\n\n case 'number':\n return (\n <FieldNumber key={name} name={name} label={resolvedLabel} min={config.min} max={config.max} {...baseProps} />\n )\n\n case 'currency':\n return <FieldCurrency key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'percentage':\n return <FieldPercentage key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'slider':\n return (\n <FieldSlider\n key={name}\n name={name}\n label={resolvedLabel}\n min={config.min}\n max={config.max}\n step={config.step}\n {...baseProps}\n />\n )\n\n case 'rating':\n return <FieldRating key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'checkbox':\n return <FieldCheckbox key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'switch':\n return <FieldSwitch key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'select':\n if (config.native) {\n // NativeSelect uses title instead of label\n const nativeOptions = config.options.map((opt) => ({\n title: opt.label,\n value: opt.value,\n }))\n return <FieldNativeSelect key={name} name={name} label={resolvedLabel} options={nativeOptions} {...baseProps} />\n }\n return <FieldSelect key={name} name={name} label={resolvedLabel} options={config.options} {...baseProps} />\n\n case 'date':\n return <FieldDate key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'password':\n return <FieldPassword key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'phone':\n return <FieldPhone key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n case 'auto':\n return <FieldAuto key={name} name={name} label={resolvedLabel} {...baseProps} />\n\n default:\n return <FieldString key={name} name={name} label={resolvedLabel} {...baseProps} />\n }\n}\n\n// =============================================================================\n// Form Builder Component\n// =============================================================================\n\n/**\n * Form.Builder - Form generation from JSON configuration\n *\n * Allows creating forms declaratively via configuration object\n * instead of writing JSX.\n *\n * @example Simple form\n * ```tsx\n * const config = {\n * fields: [\n * { type: 'string', name: 'firstName', label: 'Name' },\n * { type: 'string', name: 'lastName', label: 'Last Name' },\n * { type: 'string', name: 'email', label: 'Email', placeholder: 'email@example.com' },\n * { type: 'number', name: 'age', label: 'Age', min: 0, max: 120 },\n * { type: 'select', name: 'role', label: 'Role', options: [\n * { label: 'User', value: 'user' },\n * { label: 'Administrator', value: 'admin' },\n * ]},\n * ]\n * }\n *\n * <Form.Builder\n * config={config}\n * initialValue={{ firstName: '', lastName: '', email: '', age: 18, role: 'user' }}\n * onSubmit={handleSubmit}\n * />\n * ```\n *\n * @example With sections\n * ```tsx\n * const config = {\n * sections: [\n * {\n * title: 'Personal data',\n * fields: [\n * { type: 'string', name: 'firstName' },\n * { type: 'string', name: 'lastName' },\n * ]\n * },\n * {\n * title: 'Contacts',\n * fields: [\n * { type: 'string', name: 'email' },\n * { type: 'phone', name: 'phone' },\n * ]\n * },\n * ]\n * }\n *\n * <Form.Builder config={config} ... />\n * ```\n *\n * @example With auto-fields (type determined from Zod schema)\n * ```tsx\n * const config = {\n * fields: [\n * { type: 'auto', name: 'firstName' },\n * { type: 'auto', name: 'age' },\n * { type: 'auto', name: 'isActive' },\n * ]\n * }\n *\n * <Form.Builder config={config} schema={UserSchema} ... />\n * ```\n */\nexport function FormBuilder<TData extends object>({\n config,\n initialValue,\n onSubmit,\n schema,\n validateOn,\n middleware,\n disabled,\n readOnly,\n submitLabel = 'Save',\n children,\n}: FormBuilderProps<TData>): ReactElement {\n return (\n <Form\n initialValue={initialValue}\n onSubmit={onSubmit}\n schema={schema}\n validateOn={validateOn}\n middleware={middleware}\n disabled={disabled}\n readOnly={readOnly}\n >\n {/* Simple field list */}\n {config.fields?.map((fieldConfig) => renderField(fieldConfig))}\n\n {/* Sections with fields */}\n {config.sections?.map((section, sectionIndex) => (\n <div key={sectionIndex}>\n {section.title && <h3>{section.title}</h3>}\n {section.description && <p>{section.description}</p>}\n {section.fields.map((fieldConfig) => renderField(fieldConfig))}\n </div>\n ))}\n\n {/* Additional content */}\n {children}\n\n {/* Submit button */}\n <ButtonSubmit>{submitLabel}</ButtonSubmit>\n </Form>\n )\n}\n\nFormBuilder.displayName = 'FormBuilder'\n","'use client'\n\nimport { Box, Flex, Separator, Text } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\n\n/**\n * Props для Form.Divider\n */\nexport interface FormDividerProps {\n /** Текстовая метка на разделителе */\n label?: ReactNode\n /** Иконка перед меткой */\n icon?: ReactNode\n /** Стиль линии */\n variant?: 'solid' | 'dashed' | 'dotted'\n /** Размер (толщина линии) */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Цветовая палитра */\n colorPalette?: string\n}\n\n/**\n * Form.Divider — разделитель секций формы\n *\n * Горизонтальная линия с опциональным текстом и иконкой.\n * На базе Chakra UI Separator.\n *\n * @example Простой разделитель\n * ```tsx\n * <Form.Field.String name=\"firstName\" />\n * <Form.Divider />\n * <Form.Field.String name=\"email\" />\n * ```\n *\n * @example С меткой\n * ```tsx\n * <Form.Divider label=\"Контактная информация\" />\n * ```\n *\n * @example С иконкой\n * ```tsx\n * import { LuPhone } from 'react-icons/lu'\n * <Form.Divider label=\"Телефоны\" icon={<LuPhone />} />\n * ```\n */\nexport function FormDivider({\n label,\n icon,\n variant = 'solid',\n size = 'xs',\n colorPalette = 'gray',\n}: FormDividerProps): ReactElement {\n // Простой разделитель без метки\n if (!label && !icon) {\n return <Separator variant={variant} size={size} colorPalette={colorPalette} my={3} />\n }\n\n // Разделитель с меткой (линия — текст — линия)\n return (\n <Flex align=\"center\" gap={3} my={3}>\n <Separator flex=\"1\" variant={variant} size={size} colorPalette={colorPalette} />\n <Flex align=\"center\" gap={1.5} flexShrink={0}>\n {icon && <Box color=\"fg.muted\">{icon}</Box>}\n <Text fontSize=\"sm\" color=\"fg.muted\" fontWeight=\"medium\" whiteSpace=\"nowrap\">\n {label}\n </Text>\n </Flex>\n <Separator flex=\"1\" variant={variant} size={size} colorPalette={colorPalette} />\n </Flex>\n )\n}\n","'use client'\n\nimport { Alert, Box, List, Text } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\ninterface FormErrorsProps {\n /** Section title ошибок */\n title?: ReactNode\n /** Show errors before first submit attempt (by default false) */\n showBeforeSubmit?: boolean\n}\n\ninterface ZodIssue {\n message: string\n code?: string\n path?: string[]\n expected?: string\n}\n\ntype FieldErrors = Record<string, ZodIssue[]>\n\n/**\n * Extracts all error messages from TanStack Form + Zod structure\n * Format: { \"field.path\": [{ message: \"...\", code: \"...\", path: [...] }] }\n */\nfunction extractAllErrors(errors: unknown[]): string[] {\n const messages: string[] = []\n\n for (const error of errors) {\n if (!error) {\n continue\n }\n\n if (typeof error === 'string') {\n const trimmed = error.trim()\n if (trimmed) {\n messages.push(trimmed)\n }\n continue\n }\n\n if (typeof error === 'object') {\n // Process field errors object: { \"field.path\": [{ message: \"...\" }] }\n const fieldErrors = error as FieldErrors\n for (const [fieldPath, issues] of Object.entries(fieldErrors)) {\n if (Array.isArray(issues)) {\n for (const issue of issues) {\n if (issue.message) {\n messages.push(`${fieldPath}: ${issue.message}`)\n }\n }\n }\n }\n }\n }\n\n return messages\n}\n\n/**\n * Form.Errors - Displays all form validation errors\n *\n * Shows summary of all validation errors across all fields.\n * Only renders when errors are present.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" />\n * <Form.Errors />\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nexport function FormErrors({\n title = 'Please fix the following errors:',\n showBeforeSubmit = false,\n}: FormErrorsProps): ReactElement | null {\n const { form, apiState } = useDeclarativeForm()\n\n // Extract server error message if available\n const serverError = apiState?.mutationError\n // Some libraries (e.g., ZenStack) add info to Error\n const errorInfo = serverError && 'info' in serverError ? (serverError as { info?: { message?: string } }).info : null\n const serverErrorMessage = serverError ? serverError.message || errorInfo?.message || 'Server error' : null\n\n return (\n <form.Subscribe\n selector={(state: { errors: unknown[]; submissionAttempts: number }) => ({\n errors: state.errors,\n submissionAttempts: state.submissionAttempts,\n })}\n >\n {({ errors, submissionAttempts }: { errors: unknown[]; submissionAttempts: number }) => {\n // Do not show validation errors before first submit attempt (unless specified otherwise)\n const showValidationErrors = showBeforeSubmit || submissionAttempts > 0\n const validErrors = showValidationErrors ? extractAllErrors(errors) : []\n const hasErrors = validErrors.length > 0 || serverErrorMessage\n\n if (!hasErrors) {\n return null\n }\n\n return (\n <Alert.Root status=\"error\">\n <Alert.Indicator />\n <Box>\n <Alert.Title>{title}</Alert.Title>\n <Alert.Description>\n <List.Root>\n {serverErrorMessage && (\n <List.Item>\n <Text fontWeight=\"bold\">{serverErrorMessage}</Text>\n </List.Item>\n )}\n {validErrors.map((error, index) => (\n <List.Item key={index}>\n <Text>{error}</Text>\n </List.Item>\n ))}\n </List.Root>\n </Alert.Description>\n </Box>\n </Alert.Root>\n )\n }}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport { Field, Icon, Input, InputGroup } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport { useCallback } from 'react'\nimport { withMask } from 'use-mask-input'\nimport type { FieldTooltipMeta } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Базовые пропсы для документных полей.\n */\nexport interface DocumentFieldProps {\n /** Имя поля */\n name?: string\n /** Лейбл */\n label?: string\n /** Подсказка */\n helperText?: string\n /** Обязательное */\n required?: boolean\n /** Отключено */\n disabled?: boolean\n /** Tooltip */\n tooltip?: FieldTooltipMeta\n}\n\n/**\n * Конфигурация для createDocumentField — фабрика документных полей.\n */\nexport interface DocumentFieldConfig {\n /** Имя для React DevTools */\n displayName: string\n /** Маска ввода (use-mask-input синтаксис: 9=цифра, a=буква, *=любой) */\n mask: string\n /** Placeholder с примером */\n placeholder: string\n /** Иконка слева */\n icon: ReactNode\n /** Функция валидации значения (возвращает сообщение об ошибке или undefined) */\n validate?: (value: string) => string | undefined\n}\n\n/**\n * Фабрика для создания document-полей с маской + иконкой + валидацией.\n *\n * Все документные поля (ИНН, ОГРН, БИК и т.д.) используют одинаковую структуру:\n * - InputGroup с иконкой слева\n * - Маска ввода через use-mask-input\n * - Realtime валидация\n */\nexport function createDocumentField(config: DocumentFieldConfig) {\n return createField<DocumentFieldProps, string>({\n displayName: config.displayName,\n\n render: ({ field, resolved, hasError, errorMessage }): ReactElement => {\n // Маска через ref callback\n const maskRef = useCallback((element: HTMLInputElement | null) => {\n if (!element) return\n withMask(config.mask, {\n showMaskOnFocus: false,\n clearIncomplete: true,\n autoUnmask: false,\n })(element)\n }, [])\n\n // Дополнительная валидация (контрольная сумма)\n const customError = config.validate ? config.validate(String(field.state.value ?? '')) : undefined\n const showError = hasError || !!customError\n const displayError = customError ?? errorMessage\n\n return (\n <Field.Root invalid={showError} required={resolved.required} disabled={resolved.disabled}>\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <InputGroup startElement={<Icon color=\"fg.muted\">{config.icon}</Icon>}>\n <Input\n ref={maskRef}\n value={String(field.state.value ?? '')}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={config.placeholder}\n />\n </InputGroup>\n\n <FieldError hasError={showError} errorMessage={displayError} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n })\n}\n","'use client'\n\nimport { LuLandmark } from 'react-icons/lu'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.BankAccount — поле расчётного счёта (20 цифр) */\nexport const FieldBankAccount = createDocumentField({\n displayName: 'FieldBankAccount',\n mask: '99999999999999999999',\n placeholder: '40702810038000000001',\n icon: <LuLandmark />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined\n if (digits.length !== 20) return 'Расчётный счёт должен содержать 20 цифр'\n return undefined\n },\n})\n\n/** Form.Document.CorrAccount — поле корр. счёта (20 цифр, начинается с 301) */\nexport const FieldCorrAccount = createDocumentField({\n displayName: 'FieldCorrAccount',\n mask: '99999999999999999999',\n placeholder: '30101810400000000225',\n icon: <LuLandmark />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined\n if (digits.length !== 20) return 'Корр. счёт должен содержать 20 цифр'\n if (!digits.startsWith('301')) return 'Корр. счёт должен начинаться с \"301\"'\n return undefined\n },\n})\n","'use client'\n\nimport { LuLandmark } from 'react-icons/lu'\nimport { validateBik } from '../../../validators/ru/bik'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.BIK — поле ввода БИК (9 цифр) */\nexport const FieldBIK = createDocumentField({\n displayName: 'FieldBIK',\n mask: '999999999',\n placeholder: '044525225',\n icon: <LuLandmark />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined\n if (digits.length !== 9) return 'БИК должен содержать 9 цифр'\n return validateBik(digits) ? undefined : 'БИК должен начинаться с \"04\"'\n },\n})\n","'use client'\n\nimport { LuFileText } from 'react-icons/lu'\nimport { validateInn10, validateInn12 } from '../../../validators/ru/inn'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.INN — поле ввода ИНН (10 или 12 цифр) */\nexport const FieldINN = createDocumentField({\n displayName: 'FieldINN',\n mask: '999999999999', // 12 цифр максимум\n placeholder: '7707083893',\n icon: <LuFileText />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined // Пустое — пропускаем (required проверит Zod)\n if (digits.length === 10) {\n return validateInn10(digits) ? undefined : 'Неверная контрольная сумма ИНН'\n }\n if (digits.length === 12) {\n return validateInn12(digits) ? undefined : 'Неверная контрольная сумма ИНН'\n }\n return 'ИНН должен содержать 10 или 12 цифр'\n },\n})\n","'use client'\n\nimport { LuFileText } from 'react-icons/lu'\nimport { validateKpp } from '../../../validators/ru/kpp'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.KPP — поле ввода КПП (9 символов) */\nexport const FieldKPP = createDocumentField({\n displayName: 'FieldKPP',\n mask: '*********', // 9 символов (цифры или буквы)\n placeholder: '770701001',\n icon: <LuFileText />,\n validate: (value) => {\n const clean = value.replace(/[\\s-]/g, '').toUpperCase()\n if (!clean) return undefined\n if (clean.length !== 9) return 'КПП должен содержать 9 символов'\n return validateKpp(clean) ? undefined : 'Неверный формат КПП'\n },\n})\n","'use client'\n\nimport { LuFileText } from 'react-icons/lu'\nimport { validateOgrn } from '../../../validators/ru/ogrn'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.OGRN — поле ввода ОГРН (13 цифр) */\nexport const FieldOGRN = createDocumentField({\n displayName: 'FieldOGRN',\n mask: '9999999999999',\n placeholder: '1027700132195',\n icon: <LuFileText />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined\n if (digits.length !== 13) return 'ОГРН должен содержать 13 цифр'\n return validateOgrn(digits) ? undefined : 'Неверная контрольная сумма ОГРН'\n },\n})\n","'use client'\n\nimport { LuBookOpen } from 'react-icons/lu'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.Passport — поле паспорта (XX XX XXXXXX) */\nexport const FieldPassport = createDocumentField({\n displayName: 'FieldPassport',\n mask: '99 99 999999',\n placeholder: '45 06 123456',\n icon: <LuBookOpen />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined\n if (digits.length !== 10) return 'Паспорт: серия (4 цифры) + номер (6 цифр)'\n return undefined\n },\n})\n","'use client'\n\nimport { LuShield } from 'react-icons/lu'\nimport { validateSnils } from '../../../validators/ru/snils'\nimport { createDocumentField } from './document-field-base'\n\n/** Form.Document.SNILS — поле СНИЛС (XXX-XXX-XXX YY) */\nexport const FieldSNILS = createDocumentField({\n displayName: 'FieldSNILS',\n mask: '999-999-999 99',\n placeholder: '123-456-789 00',\n icon: <LuShield />,\n validate: (value) => {\n const digits = value.replace(/\\D/g, '')\n if (!digits) return undefined\n if (digits.length !== 11) return 'СНИЛС должен содержать 11 цифр'\n return validateSnils(digits) ? undefined : 'Неверная контрольная сумма СНИЛС'\n },\n})\n","'use client'\n\nimport { useMemo } from 'react'\nimport { type SchemaFieldInfo, traverseSchema } from '../../schema-traversal'\nimport type { CellFieldType, ResolvedColumn, TableColumnDef } from './table-types'\n\n/**\n * Маппинг zodType → CellFieldType\n */\nfunction mapZodType(zodType: string): CellFieldType {\n switch (zodType) {\n case 'string':\n return 'string'\n case 'number':\n case 'bigint':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'date':\n return 'date'\n case 'enum':\n case 'literal':\n return 'enum'\n default:\n return 'unknown'\n }\n}\n\n/**\n * Получить SchemaFieldInfo[] из массива array-поля.\n * Извлекает shape элемента массива из schema.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getArrayElementFields(schema: any, arrayPath: string): SchemaFieldInfo[] {\n // Обходим всю схему и ищем поле по пути\n const allFields = traverseSchema(schema)\n const field = findFieldByPath(allFields, arrayPath)\n\n if (field?.zodType === 'array' && field.element?.children) {\n return field.element.children\n }\n\n return []\n}\n\n/**\n * Найти поле по dot-path в дереве SchemaFieldInfo\n */\nfunction findFieldByPath(fields: SchemaFieldInfo[], path: string): SchemaFieldInfo | undefined {\n const parts = path.split('.')\n\n let current = fields\n for (let i = 0; i < parts.length; i++) {\n const found = current.find((f) => f.name === parts[i])\n if (!found) return undefined\n\n if (i === parts.length - 1) return found\n\n if (found.children) {\n current = found.children\n } else {\n return undefined\n }\n }\n\n return undefined\n}\n\n/**\n * Создать ResolvedColumn из SchemaFieldInfo (авто-колонка)\n */\nfunction fieldInfoToColumn(info: SchemaFieldInfo): ResolvedColumn {\n return {\n name: info.name,\n label: info.ui?.title ?? camelToTitle(info.name),\n width: 'auto',\n align: mapZodType(info.zodType) === 'number' ? 'right' : 'left',\n fieldType: mapZodType(info.zodType),\n readOnly: false,\n required: info.required,\n enumValues: info.enumValues,\n placeholder: info.ui?.placeholder,\n }\n}\n\n/**\n * Мерж пользовательских TableColumnDef с авто-колонками из schema\n */\nfunction mergeColumns(userColumns: TableColumnDef[], schemaColumns: ResolvedColumn[]): ResolvedColumn[] {\n return userColumns\n .filter((col) => !col.hidden)\n .map((col) => {\n // Ищем соответствующую авто-колонку\n const schemaCol = schemaColumns.find((sc) => sc.name === col.name)\n\n // Вычисляемая колонка — не из schema\n if (col.computed) {\n return {\n name: col.name,\n label: col.label ?? camelToTitle(col.name),\n width: col.width ?? 'auto',\n align: col.align ?? 'right',\n fieldType: 'number' as CellFieldType,\n computed: col.computed,\n format: col.format,\n readOnly: true,\n required: false,\n }\n }\n\n return {\n name: col.name,\n label: col.label ?? schemaCol?.label ?? camelToTitle(col.name),\n width: col.width ?? schemaCol?.width ?? 'auto',\n align: col.align ?? schemaCol?.align ?? 'left',\n fieldType: schemaCol?.fieldType ?? 'string',\n readOnly: col.readOnly ?? schemaCol?.readOnly ?? false,\n required: schemaCol?.required ?? false,\n enumValues: schemaCol?.enumValues,\n placeholder: schemaCol?.placeholder,\n format: col.format,\n }\n })\n}\n\n/**\n * camelCase → Title Case\n */\nfunction camelToTitle(str: string): string {\n return str\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (s) => s.toUpperCase())\n .trim()\n}\n\n// Для экспорта в тестах\nexport { camelToTitle, fieldInfoToColumn, getArrayElementFields, mapZodType, mergeColumns }\n\n/**\n * Хук для резолва колонок таблицы из schema и/или пользовательских определений.\n *\n * @param schema - Zod schema формы (верхнего уровня)\n * @param arrayPath - Полный путь к array-полю (например \"items\" или \"order.items\")\n * @param userColumns - Пользовательские определения колонок (опционально)\n * @returns Массив ResolvedColumn\n */\nexport function useTableColumns(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: any,\n arrayPath: string,\n userColumns?: TableColumnDef[]\n): ResolvedColumn[] {\n return useMemo(() => {\n // Извлекаем поля элемента массива из schema\n const schemaFields = getArrayElementFields(schema, arrayPath)\n const autoColumns = schemaFields.map(fieldInfoToColumn)\n\n // Если пользователь не задал колонки — возвращаем авто\n if (!userColumns || userColumns.length === 0) {\n return autoColumns\n }\n\n // Мержим пользовательские с авто\n return mergeColumns(userColumns, autoColumns)\n }, [schema, arrayPath, userColumns])\n}\n","'use client'\n\nimport { Box, Button, Checkbox, Field, HStack, Input, Table, Text } from '@chakra-ui/react'\nimport {\n type ColumnDef,\n type ColumnFiltersState,\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport { type ReactElement, useMemo, useRef, useState } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport { useTableColumns } from './use-table-columns'\n\n/** Определение колонки DataGrid */\nexport interface DataGridColumnDef {\n /** Имя поля */\n name: string\n /** Заголовок */\n label?: string\n /** Ширина */\n width?: string\n /** Редактируемая */\n editable?: boolean\n /** Тип фильтра */\n filter?: 'text' | 'range' | 'select' | 'date'\n /** Выравнивание */\n align?: 'left' | 'center' | 'right'\n}\n\n/** Props для Form.Field.DataGrid */\nexport interface DataGridFieldProps {\n /** Имя array-поля */\n name: string\n /** Лейбл */\n label?: string\n /** Колонки */\n columns: DataGridColumnDef[]\n /** Строк на страницу */\n pageSize?: number\n /** Включить выбор строк */\n rowSelection?: boolean\n /** Callback при сохранении строки */\n onRowSave?: (row: Record<string, unknown>, index: number) => Promise<void>\n /** Виртуализация для 1000+ строк (отключает пагинацию) */\n virtualized?: boolean\n /** Высота виртуализированного контейнера */\n virtualHeight?: string\n /** Включить resize колонок */\n columnResizing?: boolean\n /** Размер */\n size?: 'sm' | 'md' | 'lg'\n /** Helper text */\n helperText?: string\n /** Disabled */\n disabled?: boolean\n}\n\n/**\n * Form.Field.DataGrid — редактируемая таблица данных на TanStack Table.\n *\n * Для работы с большими объёмами данных: пагинация, сортировка, фильтрация, inline editing.\n *\n * @example\n * ```tsx\n * <Form.Field.DataGrid\n * name=\"employees\"\n * columns={[\n * { name: 'name', editable: true, filter: 'text' },\n * { name: 'salary', editable: true, filter: 'range' },\n * { name: 'department', editable: true, filter: 'select' },\n * ]}\n * pageSize={20}\n * rowSelection\n * />\n * ```\n */\nexport function FieldDataGrid({\n name,\n label,\n columns: columnDefs,\n pageSize = 20,\n rowSelection = false,\n onRowSave,\n virtualized = false,\n virtualHeight = '500px',\n columnResizing = false,\n size = 'sm',\n helperText,\n disabled = false,\n}: DataGridFieldProps): ReactElement {\n const { form, schema } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Резолв колонок из schema\n const resolvedCols = useTableColumns(schema, fullPath)\n\n // Состояние TanStack Table\n const [sorting, setSorting] = useState<SortingState>([])\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n const [columnOrder, setColumnOrder] = useState<string[]>([])\n const [rowSelectionState, setRowSelectionState] = useState<Record<string, boolean>>({})\n const [editingCell, setEditingCell] = useState<{ row: number; col: string } | null>(null)\n // Трекинг изменённых ячеек для diff highlighting\n const [modifiedCells, setModifiedCells] = useState<Set<string>>(new Set())\n\n return (\n <form.Field name={fullPath} mode=\"array\">\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(arrayField: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = (arrayField.state.value as Record<string, unknown>[] | undefined) ?? []\n\n // Собираем TanStack Table колонки\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tableColumns: ColumnDef<Record<string, unknown>, any>[] = useMemo(() => {\n const cols: ColumnDef<Record<string, unknown>>[] = []\n\n // Чекбокс выбора\n if (rowSelection) {\n cols.push({\n id: 'select',\n header: ({ table }) => (\n <Checkbox.Root\n checked={table.getIsAllPageRowsSelected()\n ? true\n : table.getIsSomePageRowsSelected()\n ? 'indeterminate'\n : false}\n onCheckedChange={() => table.toggleAllPageRowsSelected()}\n size=\"sm\"\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n ),\n cell: ({ row }) => (\n <Checkbox.Root\n checked={row.getIsSelected()}\n onCheckedChange={() => row.toggleSelected()}\n size=\"sm\"\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n ),\n size: 40,\n enableSorting: false,\n enableColumnFilter: false,\n })\n }\n\n // Колонки данных\n for (const colDef of columnDefs) {\n const resolved = resolvedCols.find((r) => r.name === colDef.name)\n cols.push({\n id: colDef.name,\n accessorKey: colDef.name,\n header: () => colDef.label ?? resolved?.label ?? colDef.name,\n cell: ({ row, getValue }) => {\n const rowIndex = row.index\n const value = getValue()\n const isEditing = editingCell?.row === rowIndex && editingCell?.col === colDef.name\n\n if (isEditing && colDef.editable !== false) {\n return (\n <EditableCell\n value={value}\n fieldType={resolved?.fieldType ?? 'string'}\n onSave={(newValue) => {\n // Обновляем в форме\n const fieldPath = `${fullPath}[${rowIndex}].${colDef.name}`\n form.setFieldValue(fieldPath, newValue)\n setEditingCell(null)\n\n // Diff highlighting — пометить ячейку как изменённую\n const cellKey = `${rowIndex}:${colDef.name}`\n setModifiedCells((prev) => new Set(prev).add(cellKey))\n\n // Row-level save callback\n if (onRowSave) {\n const updatedRow = { ...data[rowIndex], [colDef.name]: newValue }\n onRowSave(updatedRow, rowIndex)\n }\n }}\n onCancel={() => setEditingCell(null)}\n />\n )\n }\n\n // Diff highlighting — фон для изменённых ячеек\n const cellKey = `${rowIndex}:${colDef.name}`\n const isModified = modifiedCells.has(cellKey)\n\n return (\n <Text\n cursor={colDef.editable !== false && !disabled ? 'pointer' : 'default'}\n onClick={() => {\n if (colDef.editable !== false && !disabled) {\n setEditingCell({ row: rowIndex, col: colDef.name })\n }\n }}\n textAlign={colDef.align}\n bg={isModified ? 'yellow.100' : undefined}\n _dark={isModified ? { bg: 'yellow.900/20' } : undefined}\n _hover={colDef.editable !== false && !disabled\n ? { bg: isModified ? 'yellow.200' : 'bg.subtle' }\n : undefined}\n px={1}\n borderRadius=\"sm\"\n transition=\"background 0.3s\"\n >\n {value != null ? String(value) : '—'}\n </Text>\n )\n },\n size: colDef.width ? parseInt(colDef.width) : undefined,\n enableColumnFilter: !!colDef.filter,\n enableSorting: true,\n })\n }\n\n return cols\n }, [columnDefs, resolvedCols, editingCell, disabled, fullPath, form, data, onRowSave, rowSelection])\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n state: {\n sorting,\n columnFilters,\n rowSelection: rowSelectionState,\n ...(columnOrder.length > 0 ? { columnOrder } : {}),\n },\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnOrderChange: setColumnOrder,\n onRowSelectionChange: setRowSelectionState,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n // Пагинация отключается при виртуализации\n ...(virtualized ? {} : { getPaginationRowModel: getPaginationRowModel() }),\n initialState: virtualized ? {} : { pagination: { pageSize } },\n enableRowSelection: rowSelection,\n enableColumnResizing: columnResizing,\n columnResizeMode: 'onChange',\n })\n\n // Виртуализация\n const tableContainerRef = useRef<HTMLDivElement>(null)\n const { rows: tableRows } = table.getRowModel()\n const rowVirtualizer = useVirtualizer({\n count: tableRows.length,\n getScrollElement: () => tableContainerRef.current,\n estimateSize: () => size === 'sm' ? 36 : size === 'md' ? 44 : 52,\n overscan: 10,\n enabled: virtualized,\n })\n\n return (\n <Field.Root>\n {label && <Field.Label>{label}</Field.Label>}\n\n {/* Фильтры */}\n {columnDefs.some((c) => c.filter) && (\n <HStack gap={2} mb={2} flexWrap=\"wrap\">\n {columnDefs.filter((c) => c.filter).map((colDef) => {\n const column = table.getColumn(colDef.name)\n if (!column) return null\n return (\n <Input\n key={colDef.name}\n size=\"xs\"\n placeholder={`Фильтр: ${colDef.label ?? colDef.name}`}\n value={(column.getFilterValue() as string) ?? ''}\n onChange={(e) => column.setFilterValue(e.target.value || undefined)}\n maxW=\"200px\"\n />\n )\n })}\n </HStack>\n )}\n\n {/* Таблица */}\n <Box\n ref={virtualized ? tableContainerRef : undefined}\n overflowX=\"auto\"\n overflowY={virtualized ? 'auto' : undefined}\n maxH={virtualized ? virtualHeight : undefined}\n borderWidth=\"1px\"\n borderRadius=\"md\"\n >\n <Table.Root size={size} interactive variant=\"outline\">\n <Table.Header>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.Row key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <Table.ColumnHeader\n key={header.id}\n cursor={header.column.getCanSort() ? 'pointer' : 'default'}\n onClick={header.column.getToggleSortingHandler()}\n userSelect=\"none\"\n w={columnResizing ? `${header.getSize()}px` : undefined}\n position=\"relative\"\n draggable={header.column.id !== 'select'}\n onDragStart={(e) => {\n e.dataTransfer.setData('text/plain', header.column.id)\n e.dataTransfer.effectAllowed = 'move'\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault()\n const fromId = e.dataTransfer.getData('text/plain')\n const toId = header.column.id\n if (fromId === toId) return\n const currentOrder = columnOrder.length > 0\n ? columnOrder\n : table.getAllLeafColumns().map((c) => c.id)\n const fromIdx = currentOrder.indexOf(fromId)\n const toIdx = currentOrder.indexOf(toId)\n if (fromIdx === -1 || toIdx === -1) return\n const next = [...currentOrder]\n next.splice(fromIdx, 1)\n next.splice(toIdx, 0, fromId)\n setColumnOrder(next)\n }}\n >\n <HStack gap={1}>\n <Text>{flexRender(header.column.columnDef.header, header.getContext())}</Text>\n {header.column.getIsSorted() === 'asc' && <Text fontSize=\"xs\">↑</Text>}\n {header.column.getIsSorted() === 'desc' && <Text fontSize=\"xs\">↓</Text>}\n </HStack>\n {/* Resize handle */}\n {columnResizing && (\n <Box\n position=\"absolute\"\n right=\"0\"\n top=\"0\"\n bottom=\"0\"\n w=\"4px\"\n cursor=\"col-resize\"\n userSelect=\"none\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n bg={header.column.getIsResizing() ? 'blue.500' : 'transparent'}\n _hover={{ bg: 'blue.300' }}\n />\n )}\n </Table.ColumnHeader>\n ))}\n </Table.Row>\n ))}\n </Table.Header>\n\n <Table.Body>\n {tableRows.length === 0\n ? (\n <Table.Row>\n <Table.Cell colSpan={tableColumns.length} textAlign=\"center\" py={8}>\n <Text color=\"fg.muted\">Нет данных</Text>\n </Table.Cell>\n </Table.Row>\n )\n : virtualized\n ? (\n <>\n {/* Spacer для виртуализации */}\n {rowVirtualizer.getVirtualItems().length > 0 && (\n <Table.Row style={{ height: `${rowVirtualizer.getVirtualItems()[0]?.start ?? 0}px` }}>\n <Table.Cell colSpan={tableColumns.length} p=\"0\" />\n </Table.Row>\n )}\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const row = tableRows[virtualRow.index]\n return (\n <Table.Row\n key={row.id}\n bg={row.getIsSelected() ? 'blue.50' : undefined}\n _dark={row.getIsSelected() ? { bg: 'blue.900/20' } : undefined}\n style={{ height: `${virtualRow.size}px` }}\n >\n {row.getVisibleCells().map((cell) => (\n <Table.Cell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ))}\n </Table.Row>\n )\n })}\n {/* Bottom spacer */}\n <Table.Row\n style={{\n height: `${\n rowVirtualizer.getTotalSize() - (rowVirtualizer.getVirtualItems().at(-1)?.end ?? 0)\n }px`,\n }}\n >\n <Table.Cell colSpan={tableColumns.length} p=\"0\" />\n </Table.Row>\n </>\n )\n : (\n tableRows.map((row) => (\n <Table.Row\n key={row.id}\n bg={row.getIsSelected() ? 'blue.50' : undefined}\n _dark={row.getIsSelected() ? { bg: 'blue.900/20' } : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <Table.Cell key={cell.id}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Table.Cell>\n ))}\n </Table.Row>\n ))\n )}\n </Table.Body>\n </Table.Root>\n </Box>\n\n {/* Пагинация + CSV export */}\n <HStack justify=\"space-between\" py={2}>\n <HStack gap={2}>\n {!virtualized && (\n <>\n <Button\n size=\"xs\"\n variant=\"outline\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n ← Назад\n </Button>\n <Button\n size=\"xs\"\n variant=\"outline\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n Далее →\n </Button>\n </>\n )}\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => {\n // Экспорт CSV\n const headers = columnDefs.map((c) => c.label ?? c.name).join(',')\n const csvRows = data.map((row) =>\n columnDefs.map((c) => {\n const val = row[c.name]\n const str = String(val ?? '')\n return str.includes(',') ? `\"${str}\"` : str\n }).join(',')\n )\n const csv = [headers, ...csvRows].join('\\n')\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `${name}-export.csv`\n a.click()\n URL.revokeObjectURL(url)\n }}\n >\n ↓ CSV\n </Button>\n </HStack>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n {virtualized\n ? `${data.length} записей`\n : `Страница ${\n table.getState().pagination.pageIndex + 1\n } из ${table.getPageCount()} (${data.length} записей)`}\n </Text>\n </HStack>\n\n {/* Bulk actions */}\n {rowSelection && Object.keys(rowSelectionState).length > 0 && (\n <HStack gap={2}>\n <Button\n size=\"xs\"\n colorPalette=\"red\"\n variant=\"ghost\"\n onClick={() => {\n const indices = Object.keys(rowSelectionState)\n .filter((k) => rowSelectionState[k])\n .map(Number)\n .sort((a, b) => b - a)\n for (const idx of indices) {\n arrayField.removeValue(idx)\n }\n setRowSelectionState({})\n }}\n disabled={disabled}\n >\n Удалить выбранные ({Object.values(rowSelectionState).filter(Boolean).length})\n </Button>\n </HStack>\n )}\n\n {helperText && <Field.HelperText>{helperText}</Field.HelperText>}\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n\n/** Ячейка в режиме редактирования */\nfunction EditableCell({\n value,\n fieldType,\n onSave,\n onCancel,\n}: {\n value: unknown\n fieldType: string\n onSave: (value: unknown) => void\n onCancel: () => void\n}) {\n const [localValue, setLocalValue] = useState(String(value ?? ''))\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n const coerced = fieldType === 'number' ? Number(localValue) || 0 : localValue\n onSave(coerced)\n }\n if (e.key === 'Escape') {\n onCancel()\n }\n }\n\n return (\n <Input\n size=\"xs\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={() => {\n const coerced = fieldType === 'number' ? Number(localValue) || 0 : localValue\n onSave(coerced)\n }}\n onKeyDown={handleKeyDown}\n type={fieldType === 'number' ? 'number' : 'text'}\n autoFocus\n borderRadius=\"0\"\n />\n )\n}\n","'use client'\n\nimport { createContext, useContext } from 'react'\nimport type { TableEditorContextValue } from './table-types'\n\n/**\n * Контекст TableEditor — передаёт состояние таблицы потомкам.\n */\nexport const TableEditorContext = createContext<TableEditorContextValue | null>(null)\n\n/**\n * Хук доступа к контексту TableEditor.\n * Бросает ошибку если используется вне TableEditor.\n */\nexport function useTableEditorContext(): TableEditorContextValue {\n const ctx = useContext(TableEditorContext)\n if (!ctx) {\n throw new Error('useTableEditorContext must be used inside <Form.Field.TableEditor>')\n }\n return ctx\n}\n","'use client'\n\nimport type { ResolvedColumn } from './table-types'\n\n/**\n * Форматировать значение ячейки для отображения.\n */\nexport function formatCellValue(value: unknown, column: ResolvedColumn): string {\n if (value === null || value === undefined || value === '') return ''\n\n // Вычисляемая колонка с кастомным форматом\n if (column.format) {\n return column.format(value)\n }\n\n if (column.fieldType === 'boolean') {\n return value ? '✓' : '✗'\n }\n\n if (column.fieldType === 'date' && value instanceof Date) {\n return value.toLocaleDateString()\n }\n\n if (column.fieldType === 'number' && typeof value === 'number') {\n return value.toLocaleString()\n }\n\n return String(value)\n}\n\n/**\n * Создать дефолтную строку на основе колонок.\n */\nexport function getDefaultRow(columns: ResolvedColumn[]): Record<string, unknown> {\n const row: Record<string, unknown> = {}\n\n for (const col of columns) {\n if (col.computed) continue // вычисляемые не в данных\n\n switch (col.fieldType) {\n case 'string':\n row[col.name] = ''\n break\n case 'number':\n row[col.name] = 0\n break\n case 'boolean':\n row[col.name] = false\n break\n case 'date':\n row[col.name] = ''\n break\n case 'enum':\n row[col.name] = col.enumValues?.[0] ?? ''\n break\n default:\n row[col.name] = ''\n }\n }\n\n return row\n}\n\n/**\n * Привести строковое значение из clipboard к правильному типу.\n */\nexport function coerceValue(raw: string, column: ResolvedColumn): unknown {\n const trimmed = raw.trim()\n\n switch (column.fieldType) {\n case 'number': {\n // Поддержка запятых как десятичного разделителя\n const normalized = trimmed.replace(',', '.').replace(/\\s/g, '')\n const num = Number(normalized)\n return Number.isNaN(num) ? 0 : num\n }\n case 'boolean':\n return ['true', '1', 'да', 'yes', '✓'].includes(trimmed.toLowerCase())\n case 'date':\n return trimmed\n default:\n return trimmed\n }\n}\n\n/**\n * Парсинг TSV (Tab-Separated Values) из буфера обмена.\n * Excel и Google Sheets копируют данные в этом формате.\n */\nexport function parseTSV(text: string): string[][] {\n return text\n .split('\\n')\n .map((line) => line.split('\\t'))\n .filter((row) => row.some((cell) => cell.trim() !== ''))\n}\n\n/**\n * Собрать TSV из данных таблицы (для копирования).\n */\nexport function buildTSV(\n rows: Record<string, unknown>[],\n columns: ResolvedColumn[],\n selectedIndices?: Set<number>\n): string {\n // Заголовки\n const headers = columns.map((c) => c.label).join('\\t')\n\n // Строки\n const dataRows = rows\n .filter((_, i) => !selectedIndices || selectedIndices.has(i))\n .map((row) =>\n columns\n .map((col) => {\n if (col.computed) return String(col.computed(row) ?? '')\n return String(row[col.name] ?? '')\n })\n .join('\\t')\n )\n\n return [headers, ...dataRows].join('\\n')\n}\n\n/**\n * Вычислить агрегатное значение по колонке.\n */\nexport function computeAggregate(\n rows: Record<string, unknown>[],\n columnName: string,\n type: 'sum' | 'avg' | 'count' | 'min' | 'max',\n computeFn?: (row: Record<string, unknown>) => unknown\n): number {\n const values = rows\n .map((row) => {\n const raw = computeFn ? computeFn(row) : row[columnName]\n return typeof raw === 'number' ? raw : Number(raw)\n })\n .filter((v) => !Number.isNaN(v))\n\n if (values.length === 0) return 0\n\n switch (type) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0)\n case 'avg':\n return values.reduce((a, b) => a + b, 0) / values.length\n case 'count':\n return values.length\n case 'min':\n return Math.min(...values)\n case 'max':\n return Math.max(...values)\n }\n}\n","'use client'\n\nimport { Table, Text } from '@chakra-ui/react'\nimport { useTableEditorContext } from './table-editor-context'\nimport type { TableFooterDef } from './table-types'\nimport { computeAggregate } from './table-utils'\n\ninterface TableFooterProps {\n /** Определения агрегатов */\n footerDefs: TableFooterDef[]\n /** Показывается ли чекбокс/drag handle */\n selectable?: boolean\n sortable?: boolean\n}\n\n/**\n * Footer таблицы с агрегатными значениями (SUM, AVG, COUNT, MIN, MAX).\n */\nexport function TableEditorFooter({ footerDefs, selectable, sortable }: TableFooterProps) {\n const { columns, rows, readOnly } = useTableEditorContext()\n\n if (footerDefs.length === 0 || rows.length === 0) return null\n\n // Собираем маппинг columnName → aggregate result\n const aggregates = new Map<string, { value: number; def: TableFooterDef }>()\n for (const def of footerDefs) {\n // Ищем computed-функцию для вычисляемых колонок\n const col = columns.find((c) => c.name === def.column)\n const value = computeAggregate(rows, def.column, def.aggregate, col?.computed)\n aggregates.set(def.column, { value, def })\n }\n\n return (\n <Table.Footer>\n <Table.Row fontWeight=\"bold\">\n {/* Пустые ячейки для drag handle и чекбокса */}\n {sortable && !readOnly && <Table.Cell />}\n {selectable && !readOnly && <Table.Cell />}\n\n {/* Ячейки данных */}\n {columns.map((col) => {\n const agg = aggregates.get(col.name)\n return (\n <Table.Cell key={col.name} textAlign={col.align}>\n {agg ? (\n <Text>\n {agg.def.label && (\n <Text as=\"span\" color=\"fg.muted\" mr=\"1\">\n {agg.def.label}\n </Text>\n )}\n {agg.def.format ? agg.def.format(agg.value) : agg.value.toLocaleString()}\n </Text>\n ) : null}\n </Table.Cell>\n )\n })}\n\n {/* Пустая ячейка для действий */}\n {!readOnly && <Table.Cell />}\n </Table.Row>\n </Table.Footer>\n )\n}\n","'use client'\n\nimport { Checkbox, Table } from '@chakra-ui/react'\nimport { useTableEditorContext } from './table-editor-context'\n\n/**\n * Заголовок таблицы TableEditor.\n * Отображает названия колонок + опциональный select-all чекбокс.\n */\nexport function TableEditorHeader({ selectable, sortable }: { selectable?: boolean; sortable?: boolean }) {\n const { columns, rows, selectedRows, toggleSelectAll, readOnly } = useTableEditorContext()\n\n const allSelected = rows.length > 0 && selectedRows.size === rows.length\n const someSelected = selectedRows.size > 0 && !allSelected\n\n return (\n <Table.Header>\n <Table.Row>\n {/* Drag handle колонка */}\n {sortable && !readOnly && <Table.ColumnHeader w=\"40px\" />}\n\n {/* Чекбокс select-all */}\n {selectable && !readOnly && (\n <Table.ColumnHeader w=\"40px\" textAlign=\"center\">\n <Checkbox.Root\n checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n onCheckedChange={() => toggleSelectAll()}\n size=\"sm\"\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n </Table.ColumnHeader>\n )}\n\n {/* Колонки данных */}\n {columns.map((col) => (\n <Table.ColumnHeader key={col.name} w={col.width} textAlign={col.align}>\n {col.label}\n {col.required && <span style={{ color: 'var(--chakra-colors-red-500)', marginLeft: '2px' }}>*</span>}\n </Table.ColumnHeader>\n ))}\n\n {/* Колонка действий (удаление) */}\n {!readOnly && <Table.ColumnHeader w=\"40px\" />}\n </Table.Row>\n </Table.Header>\n )\n}\n","'use client'\n\nimport { Box, Button, HStack, IconButton, Text, VStack } from '@chakra-ui/react'\nimport { useTableEditorContext } from './table-editor-context'\nimport { formatCellValue } from './table-utils'\n\n/**\n * Мобильный вид TableEditor — карточки вместо таблицы.\n * Отображается на base/sm breakpoints.\n */\nexport function TableMobileView() {\n const { columns, rows, addRow, removeRow, canAdd, canRemove, readOnly, disabled } = useTableEditorContext()\n\n return (\n <VStack gap={3} align=\"stretch\">\n {rows.length === 0\n ? (\n <Text color=\"fg.muted\" textAlign=\"center\" py={6}>\n Нет данных\n </Text>\n )\n : (\n rows.map((rowData, rowIndex) => (\n <Box key={rowIndex} p={3} borderWidth=\"1px\" borderRadius=\"md\" position=\"relative\">\n {/* Номер строки + удаление */}\n <HStack justify=\"space-between\" mb={2}>\n <Text fontSize=\"xs\" color=\"fg.muted\" fontWeight=\"bold\">\n #{rowIndex + 1}\n </Text>\n {!readOnly && (\n <IconButton\n aria-label=\"Удалить\"\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"red\"\n onClick={() => removeRow(rowIndex)}\n disabled={!canRemove || disabled}\n >\n ✕\n </IconButton>\n )}\n </HStack>\n\n {/* Поля как label: value */}\n <VStack gap={1} align=\"stretch\">\n {columns.map((col) => {\n const value = col.computed ? col.computed(rowData) : rowData[col.name]\n return (\n <HStack key={col.name} justify=\"space-between\" fontSize=\"sm\">\n <Text color=\"fg.muted\" fontWeight=\"medium\" minW=\"80px\">\n {col.label}\n </Text>\n <Text textAlign=\"right\">{formatCellValue(value, col) || '—'}</Text>\n </HStack>\n )\n })}\n </VStack>\n </Box>\n ))\n )}\n\n {!readOnly && (\n <Button size=\"sm\" variant=\"outline\" onClick={addRow} disabled={!canAdd || disabled}>\n + Добавить\n </Button>\n )}\n </VStack>\n )\n}\n","'use client'\n\nimport { Input, NativeSelect, Table } from '@chakra-ui/react'\nimport { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeForm } from '../../form-context'\nimport { formatFieldErrors, hasFieldErrors } from '../base/field-utils'\nimport { useTableEditorContext } from './table-editor-context'\nimport type { ResolvedColumn } from './table-types'\nimport { formatCellValue } from './table-utils'\n\ninterface TableCellProps {\n /** Индекс строки */\n rowIndex: number\n /** Индекс колонки */\n colIndex: number\n /** Описание колонки */\n column: ResolvedColumn\n /** Значение строки целиком (для computed) */\n rowData: Record<string, unknown>\n}\n\n/**\n * Ячейка таблицы с переключением display/edit.\n * Клик → inline editing, Escape → выход, Tab → следующая ячейка.\n */\nexport function TableCell({ rowIndex, colIndex, column, rowData }: TableCellProps) {\n const { form } = useDeclarativeForm()\n const { navigation, setEditingCell, setFocusedCell, fullPath, disabled, readOnly } = useTableEditorContext()\n const inputRef = useRef<HTMLInputElement | HTMLSelectElement>(null)\n const cellRef = useRef<HTMLTableCellElement>(null)\n\n const isEditing = navigation.editingCell?.row === rowIndex && navigation.editingCell?.col === colIndex\n\n const isComputed = !!column.computed\n const isReadOnly = readOnly || column.readOnly || isComputed || disabled\n\n // Путь к значению ячейки в форме\n const fieldPath = `${fullPath}[${rowIndex}].${column.name}`\n\n // Хуки ДО условного return (rules of hooks)\n const startEdit = useCallback(() => {\n if (isReadOnly) return\n setEditingCell({ row: rowIndex, col: colIndex })\n }, [isReadOnly, setEditingCell, rowIndex, colIndex])\n\n const handleCellKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (isReadOnly) return\n if (e.key === 'Enter' || e.key === 'F2') {\n e.preventDefault()\n startEdit()\n }\n },\n [isReadOnly, startEdit]\n )\n\n // Вычисляемое значение — ранний return после хуков\n if (isComputed) {\n const computedValue = column.computed!(rowData)\n return (\n <Table.Cell textAlign={column.align} data-row={rowIndex} data-col={colIndex} ref={cellRef}>\n {formatCellValue(computedValue, column)}\n </Table.Cell>\n )\n }\n\n return (\n <form.Field name={fieldPath}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(field: any) => {\n const errors = field.state.meta.errors\n const hasError = hasFieldErrors(errors)\n const value = field.state.value\n\n if (isEditing) {\n return (\n <EditingCell\n ref={inputRef}\n column={column}\n value={value}\n hasError={hasError}\n errors={errors}\n onBlur={(newValue) => {\n field.handleChange(newValue)\n setEditingCell(null)\n }}\n onChange={(newValue) => field.handleChange(newValue)}\n rowIndex={rowIndex}\n colIndex={colIndex}\n />\n )\n }\n\n return (\n <Table.Cell\n ref={cellRef}\n textAlign={column.align}\n data-row={rowIndex}\n data-col={colIndex}\n tabIndex={isReadOnly ? undefined : 0}\n cursor={isReadOnly ? 'default' : 'pointer'}\n onClick={startEdit}\n onKeyDown={handleCellKeyDown}\n onFocus={() => setFocusedCell({ row: rowIndex, col: colIndex })}\n borderColor={hasError ? 'red.500' : undefined}\n borderWidth={hasError ? '1px' : undefined}\n title={hasError ? formatFieldErrors(errors) : undefined}\n _hover={isReadOnly ? undefined : { bg: 'bg.subtle' }}\n >\n {formatCellValue(value, column) || <span style={{ opacity: 0.4 }}>{column.placeholder ?? '—'}</span>}\n </Table.Cell>\n )\n }}\n </form.Field>\n )\n}\n\n/**\n * Ячейка в режиме редактирования\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction EditingCell({\n column,\n value,\n hasError,\n errors,\n onBlur,\n onChange,\n rowIndex,\n colIndex,\n ref,\n}: {\n column: ResolvedColumn\n value: unknown\n hasError: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errors: any\n onBlur: (value: unknown) => void\n onChange: (value: unknown) => void\n rowIndex: number\n colIndex: number\n ref: React.RefObject<HTMLInputElement | HTMLSelectElement | null>\n}) {\n const { setEditingCell } = useTableEditorContext()\n const [localValue, setLocalValue] = useState(String(value ?? ''))\n\n // Автофокус при входе в режим редактирования\n useEffect(() => {\n const el = ref.current\n if (el) {\n el.focus()\n if ('select' in el) {\n ;(el as HTMLInputElement).select()\n }\n }\n }, [ref])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n setEditingCell(null)\n }\n if (e.key === 'Tab' || e.key === 'Enter') {\n // Пусть всплывает — обработается use-table-navigation\n }\n },\n [setEditingCell]\n )\n\n // Enum → NativeSelect\n if (column.fieldType === 'enum' && column.enumValues) {\n return (\n <Table.Cell data-row={rowIndex} data-col={colIndex} p=\"0\">\n <NativeSelect.Root size=\"sm\">\n <NativeSelect.Field\n ref={ref as React.RefObject<HTMLSelectElement>}\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value)}\n onBlur={() => onBlur(value)}\n onKeyDown={handleKeyDown}\n borderColor={hasError ? 'red.500' : undefined}\n >\n <option value=\"\">—</option>\n {column.enumValues.map((v) => (\n <option key={v} value={v}>\n {v}\n </option>\n ))}\n </NativeSelect.Field>\n </NativeSelect.Root>\n </Table.Cell>\n )\n }\n\n // Boolean → чекбокс напрямую (слишком простой для отдельного компонента)\n if (column.fieldType === 'boolean') {\n return (\n <Table.Cell data-row={rowIndex} data-col={colIndex} textAlign=\"center\" p=\"0\">\n <input\n ref={ref as React.RefObject<HTMLInputElement>}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => {\n onChange(e.target.checked)\n onBlur(e.target.checked)\n }}\n onKeyDown={handleKeyDown}\n />\n </Table.Cell>\n )\n }\n\n // Число или строка → Input\n const inputType = column.fieldType === 'number' ? 'number' : 'text'\n\n return (\n <Table.Cell data-row={rowIndex} data-col={colIndex} p=\"0\">\n <Input\n ref={ref as React.RefObject<HTMLInputElement>}\n size=\"sm\"\n type={inputType}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={() => {\n const coerced = column.fieldType === 'number' ? Number(localValue) || 0 : localValue\n onBlur(coerced)\n }}\n onKeyDown={handleKeyDown}\n textAlign={column.align}\n borderColor={hasError ? 'red.500' : undefined}\n borderRadius=\"0\"\n title={hasError ? formatFieldErrors(errors) : undefined}\n />\n </Table.Cell>\n )\n}\n","'use client'\n\nimport { Checkbox, IconButton, Table } from '@chakra-ui/react'\nimport { TableCell } from './table-cell'\nimport { useTableEditorContext } from './table-editor-context'\n\ninterface TableRowProps {\n /** Индекс строки */\n rowIndex: number\n /** Данные строки */\n rowData: Record<string, unknown>\n /** Показывать чекбокс выбора */\n selectable?: boolean\n /** Показывать drag handle */\n sortable?: boolean\n}\n\n/**\n * Строка таблицы TableEditor.\n * Содержит ячейки, чекбокс выбора и кнопку удаления.\n */\nexport function TableEditorRow({ rowIndex, rowData, selectable, sortable }: TableRowProps) {\n const { columns, removeRow, canRemove, selectedRows, toggleRowSelection, readOnly, disabled } =\n useTableEditorContext()\n\n const isSelected = selectedRows.has(rowIndex)\n\n return (\n <Table.Row\n data-row-index={rowIndex}\n bg={isSelected ? 'blue.50' : undefined}\n _dark={isSelected ? { bg: 'blue.900/20' } : undefined}\n >\n {/* Drag handle */}\n {sortable && !readOnly && (\n <Table.Cell w=\"40px\" cursor=\"grab\" textAlign=\"center\" color=\"fg.muted\">\n ⠿\n </Table.Cell>\n )}\n\n {/* Чекбокс выбора */}\n {selectable && !readOnly && (\n <Table.Cell w=\"40px\" textAlign=\"center\">\n <Checkbox.Root checked={isSelected} onCheckedChange={() => toggleRowSelection(rowIndex)} size=\"sm\">\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n </Table.Cell>\n )}\n\n {/* Ячейки данных */}\n {columns.map((col, colIndex) => (\n <TableCell key={col.name} rowIndex={rowIndex} colIndex={colIndex} column={col} rowData={rowData} />\n ))}\n\n {/* Кнопка удаления */}\n {!readOnly && (\n <Table.Cell w=\"40px\" textAlign=\"center\">\n <IconButton\n aria-label=\"Удалить строку\"\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"red\"\n onClick={() => removeRow(rowIndex)}\n disabled={!canRemove || disabled}\n >\n ✕\n </IconButton>\n </Table.Cell>\n )}\n </Table.Row>\n )\n}\n","'use client'\n\nimport { Button, HStack, Text } from '@chakra-ui/react'\nimport type { ReactNode } from 'react'\nimport { useTableEditorContext } from './table-editor-context'\n\ninterface TableToolbarProps {\n /** Текст кнопки добавления */\n addLabel?: string\n /** Кастомные действия */\n actions?: ReactNode\n}\n\n/**\n * Панель управления таблицей: кнопка добавления + bulk delete + счётчик.\n */\nexport function TableEditorToolbar({ addLabel = 'Добавить строку', actions }: TableToolbarProps) {\n const { rows, canAdd, addRow, selectedRows, removeRow, readOnly, disabled } = useTableEditorContext()\n\n // Массовое удаление выбранных строк\n const handleBulkDelete = () => {\n // Удаляем с конца чтобы не сбивать индексы\n const indices = [...selectedRows].sort((a, b) => b - a)\n for (const idx of indices) {\n removeRow(idx)\n }\n }\n\n return (\n <HStack justify=\"space-between\" py=\"2\">\n <HStack gap=\"2\">\n {!readOnly && (\n <Button size=\"sm\" variant=\"outline\" onClick={addRow} disabled={!canAdd || disabled}>\n + {addLabel}\n </Button>\n )}\n\n {!readOnly && selectedRows.size > 0 && (\n <Button size=\"sm\" variant=\"ghost\" colorPalette=\"red\" onClick={handleBulkDelete} disabled={disabled}>\n Удалить выбранные ({selectedRows.size})\n </Button>\n )}\n\n {actions}\n </HStack>\n\n <Text fontSize=\"sm\" color=\"fg.muted\">\n {rows.length} {rows.length === 1 ? 'строка' : rows.length < 5 ? 'строки' : 'строк'}\n </Text>\n </HStack>\n )\n}\n","'use client'\n\nimport { type KeyboardEvent, useCallback, useRef } from 'react'\nimport type { CellCoord, ResolvedColumn } from './table-types'\n\ninterface UseTableNavigationOptions {\n /** Разрешённые колонки */\n columns: ResolvedColumn[]\n /** Количество строк */\n rowCount: number\n /** Текущая редактируемая ячейка */\n editingCell: CellCoord | null\n /** Установить редактируемую ячейку */\n setEditingCell: (cell: CellCoord | null) => void\n /** Добавить новую строку */\n addRow: () => void\n /** Можно ли добавить строку */\n canAdd: boolean\n /** ReadOnly */\n readOnly: boolean\n}\n\n/**\n * Индексы редактируемых колонок (исключая computed и readOnly).\n */\nfunction getEditableColIndices(columns: ResolvedColumn[]): number[] {\n return columns.map((col, i) => (!col.computed && !col.readOnly ? i : -1)).filter((i) => i !== -1)\n}\n\n/**\n * Хук навигации по таблице: Tab, Shift+Tab, Enter, Escape, стрелки.\n *\n * Привязывается к onKeyDown контейнера таблицы.\n * Ячейки используют data-row и data-col атрибуты для DOM-фокусировки.\n */\nexport function useTableNavigation({\n columns,\n rowCount,\n editingCell,\n setEditingCell,\n addRow,\n canAdd,\n readOnly,\n}: UseTableNavigationOptions) {\n const containerRef = useRef<HTMLDivElement>(null)\n const editableIndices = getEditableColIndices(columns)\n\n /**\n * Сфокусировать ячейку в DOM (найти по data-атрибутам).\n */\n const focusCell = useCallback((row: number, col: number) => {\n const container = containerRef.current\n if (!container) return\n\n // Ищем input/select внутри ячейки\n const cell = container.querySelector(`[data-row=\"${row}\"][data-col=\"${col}\"]`)\n if (cell instanceof HTMLElement) {\n const input = cell.querySelector('input, select') as HTMLElement | null\n if (input) {\n input.focus()\n } else {\n cell.focus()\n }\n }\n }, [])\n\n /**\n * Перейти к следующей редактируемой ячейке.\n */\n const moveToNext = useCallback(\n (currentRow: number, currentCol: number, reverse = false) => {\n if (readOnly || editableIndices.length === 0) return\n\n const currentEditIdx = editableIndices.indexOf(currentCol)\n if (currentEditIdx === -1) return\n\n if (!reverse) {\n // Вперёд\n if (currentEditIdx < editableIndices.length - 1) {\n // Следующая колонка в строке\n const nextCol = editableIndices[currentEditIdx + 1]\n setEditingCell({ row: currentRow, col: nextCol })\n requestAnimationFrame(() => focusCell(currentRow, nextCol))\n } else if (currentRow < rowCount - 1) {\n // Первая колонка следующей строки\n const nextCol = editableIndices[0]\n setEditingCell({ row: currentRow + 1, col: nextCol })\n requestAnimationFrame(() => focusCell(currentRow + 1, nextCol))\n } else if (canAdd) {\n // Последняя ячейка последней строки — добавить новую\n addRow()\n const nextCol = editableIndices[0]\n requestAnimationFrame(() => {\n setEditingCell({ row: currentRow + 1, col: nextCol })\n requestAnimationFrame(() => focusCell(currentRow + 1, nextCol))\n })\n }\n } else {\n // Назад\n if (currentEditIdx > 0) {\n const prevCol = editableIndices[currentEditIdx - 1]\n setEditingCell({ row: currentRow, col: prevCol })\n requestAnimationFrame(() => focusCell(currentRow, prevCol))\n } else if (currentRow > 0) {\n const prevCol = editableIndices[editableIndices.length - 1]\n setEditingCell({ row: currentRow - 1, col: prevCol })\n requestAnimationFrame(() => focusCell(currentRow - 1, prevCol))\n }\n }\n },\n [readOnly, editableIndices, rowCount, canAdd, addRow, setEditingCell, focusCell]\n )\n\n /**\n * Обработчик onKeyDown на контейнере таблицы.\n */\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!editingCell) return\n\n const { row, col } = editingCell\n\n switch (e.key) {\n case 'Tab':\n e.preventDefault()\n setEditingCell(null) // выход из текущей ячейки\n requestAnimationFrame(() => moveToNext(row, col, e.shiftKey))\n break\n\n case 'Enter':\n e.preventDefault()\n setEditingCell(null)\n requestAnimationFrame(() => moveToNext(row, col, false))\n break\n\n case 'Escape':\n e.preventDefault()\n setEditingCell(null)\n requestAnimationFrame(() => focusCell(row, col))\n break\n\n case 'ArrowUp':\n if (row > 0) {\n e.preventDefault()\n setEditingCell(null)\n setEditingCell({ row: row - 1, col })\n requestAnimationFrame(() => focusCell(row - 1, col))\n }\n break\n\n case 'ArrowDown':\n if (row < rowCount - 1) {\n e.preventDefault()\n setEditingCell(null)\n setEditingCell({ row: row + 1, col })\n requestAnimationFrame(() => focusCell(row + 1, col))\n }\n break\n }\n },\n [editingCell, setEditingCell, moveToNext, focusCell, rowCount]\n )\n\n return { containerRef, handleKeyDown, focusCell }\n}\n","'use client'\n\nimport { Box, Field, Table, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useState } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport { SortableItem, SortableWrapper } from '../../form-group/form-group-list-sortable'\nimport { getZodConstraints } from '../../schema-constraints'\nimport { TableEditorContext } from './table-editor-context'\nimport { TableEditorFooter } from './table-footer'\nimport { TableEditorHeader } from './table-header'\nimport { TableMobileView } from './table-mobile-view'\nimport { TableEditorRow } from './table-row'\nimport { TableEditorToolbar } from './table-toolbar'\nimport type { CellCoord, TableEditorContextValue, TableEditorFieldProps, TableNavigationState } from './table-types'\nimport { coerceValue, getDefaultRow, parseTSV } from './table-utils'\nimport { useTableColumns } from './use-table-columns'\nimport { useTableNavigation } from './use-table-navigation'\n\n/**\n * Form.Field.TableEditor — инлайн-редактируемая таблица для array-полей.\n *\n * Концептуально это FormGroupList с табличным UI вместо карточного.\n * Каждая ячейка привязана к form.Field → автоматическая per-cell Zod валидация.\n *\n * @example Авто-колонки из schema\n * ```tsx\n * <Form.Field.TableEditor name=\"items\" />\n * ```\n *\n * @example Кастомные колонки с computed\n * ```tsx\n * <Form.Field.TableEditor\n * name=\"items\"\n * columns={[\n * { name: 'product', width: '40%' },\n * { name: 'qty', width: '15%', align: 'right' },\n * { name: 'price', width: '15%', align: 'right' },\n * { name: 'total', computed: (row) => row.qty * row.price, label: 'Итого' },\n * ]}\n * addLabel=\"Добавить товар\"\n * sortable={true}\n * footer={[{ column: 'total', aggregate: 'sum', label: 'Итого:' }]}\n * />\n * ```\n */\nexport function FieldTableEditor({\n name,\n label,\n columns: columnDefs,\n addLabel,\n sortable = false,\n selectable = false,\n footer,\n maxRows: maxRowsProp,\n minRows: minRowsProp,\n clipboard = true,\n emptyText = 'Нет данных. Нажмите \"Добавить строку\"',\n size = 'sm',\n striped = false,\n toolbarActions,\n helperText,\n disabled = false,\n readOnly = false,\n}: TableEditorFieldProps): ReactElement {\n const { form, schema } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Полный путь к array-полю\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Резолв колонок из schema и/или пользовательских определений\n const columns = useTableColumns(schema, fullPath, columnDefs)\n\n // Ограничения из schema (min/max items)\n const constraints = getZodConstraints(schema, fullPath)\n const maxRows = maxRowsProp ?? constraints.array?.maxItems\n const minRows = minRowsProp ?? constraints.array?.minItems\n\n // Навигация\n const [navigation, setNavigation] = useState<TableNavigationState>({\n editingCell: null,\n focusedCell: null,\n })\n\n // Выбранные строки\n const [selectedRows, setSelectedRows] = useState<Set<number>>(new Set())\n\n const setEditingCell = useCallback((cell: CellCoord | null) => {\n setNavigation((prev) => ({ ...prev, editingCell: cell }))\n }, [])\n\n const setFocusedCell = useCallback((cell: CellCoord | null) => {\n setNavigation((prev) => ({ ...prev, focusedCell: cell }))\n }, [])\n\n const toggleRowSelection = useCallback((index: number) => {\n setSelectedRows((prev) => {\n const next = new Set(prev)\n if (next.has(index)) {\n next.delete(index)\n } else {\n next.add(index)\n }\n return next\n })\n }, [])\n\n // Стейт для addRow (будет определён внутри render callback)\n // Хук навигации вызываем здесь, передаём addRow через ref\n const addRowRef = { current: () => {} }\n const rowCountRef = { current: 0 }\n const canAddRef = { current: false }\n\n const { containerRef, handleKeyDown } = useTableNavigation({\n columns,\n rowCount: rowCountRef.current,\n editingCell: navigation.editingCell,\n setEditingCell,\n addRow: () => addRowRef.current(),\n canAdd: canAddRef.current,\n readOnly,\n })\n\n return (\n <form.Field name={fullPath} mode=\"array\">\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {(arrayField: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rows = (arrayField.state.value as Record<string, unknown>[] | undefined) ?? []\n\n const canAdd = maxRows === undefined || rows.length < maxRows\n const canRemove = minRows === undefined || rows.length > minRows\n\n // Обновляем refs для навигации\n rowCountRef.current = rows.length\n canAddRef.current = canAdd\n\n const addRow = () => {\n if (!canAdd) return\n arrayField.pushValue(getDefaultRow(columns))\n }\n addRowRef.current = addRow\n\n const removeRow = (index: number) => {\n if (!canRemove) return\n arrayField.removeValue(index)\n // Очищаем selection для удалённых индексов\n setSelectedRows((prev) => {\n const next = new Set<number>()\n for (const i of prev) {\n if (i < index) next.add(i)\n else if (i > index) next.add(i - 1)\n }\n return next\n })\n }\n\n const moveRow = (from: number, to: number) => {\n arrayField.moveValue(from, to)\n }\n\n const toggleSelectAll = () => {\n if (selectedRows.size === rows.length) {\n setSelectedRows(new Set())\n } else {\n setSelectedRows(new Set(rows.map((_, i) => i)))\n }\n }\n\n const contextValue: TableEditorContextValue = {\n columns,\n rows,\n fullPath,\n canAdd,\n canRemove,\n addRow,\n removeRow,\n moveRow,\n navigation,\n setEditingCell,\n setFocusedCell,\n selectedRows,\n toggleRowSelection,\n toggleSelectAll,\n disabled,\n readOnly,\n size,\n }\n\n return (\n <TableEditorContext.Provider value={contextValue}>\n <Field.Root>\n {label && <Field.Label>{label}</Field.Label>}\n\n {/* Мобильный вид — карточки */}\n <Box display={{ base: 'block', md: 'none' }}>\n <TableMobileView />\n </Box>\n\n {/* Десктопный вид — таблица */}\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <Box\n ref={containerRef as any}\n display={{ base: 'none', md: 'block' }}\n overflowX=\"auto\"\n borderWidth=\"1px\"\n borderRadius=\"md\"\n onKeyDown={handleKeyDown}\n onPaste={clipboard\n ? (e) => {\n // Не перехватываем paste внутри input\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') return\n if (disabled || readOnly || !canAdd) return\n // Парсинг TSV из clipboard (Excel/Sheets)\n const text = e.clipboardData?.getData('text/plain')\n if (!text) return\n const parsed = parseTSV(text)\n if (parsed.length === 0) return\n e.preventDefault()\n const editableCols = columns.filter((col) => !col.computed && !col.readOnly)\n for (const rawRow of parsed) {\n if (maxRows !== undefined && rows.length >= maxRows) break\n const row: Record<string, unknown> = {}\n for (let i = 0; i < editableCols.length && i < rawRow.length; i++) {\n row[editableCols[i].name] = coerceValue(rawRow[i], editableCols[i])\n }\n arrayField.pushValue(row)\n }\n }\n : undefined}\n >\n <Table.Root size={size} striped={striped} interactive variant=\"outline\">\n <TableEditorHeader selectable={selectable} sortable={sortable} />\n\n <Table.Body>\n {rows.length === 0\n ? (\n <Table.Row>\n <Table.Cell\n colSpan={columns.length\n + (selectable && !readOnly ? 1 : 0)\n + (sortable && !readOnly ? 1 : 0)\n + (!readOnly ? 1 : 0)}\n textAlign=\"center\"\n py=\"8\"\n >\n <Text color=\"fg.muted\">{emptyText}</Text>\n </Table.Cell>\n </Table.Row>\n )\n : sortable && !readOnly\n ? (\n <SortableWrapper\n items={rows.map((_, i) => `${fullPath}-${i}`)}\n onReorder={(oldIdx, newIdx) => moveRow(oldIdx, newIdx)}\n >\n {rows.map((rowData, rowIndex) => (\n <SortableItem key={`${fullPath}-${rowIndex}`} id={`${fullPath}-${rowIndex}`}>\n <TableEditorRow\n rowIndex={rowIndex}\n rowData={rowData}\n selectable={selectable}\n sortable={sortable}\n />\n </SortableItem>\n ))}\n </SortableWrapper>\n )\n : (\n rows.map((rowData, rowIndex) => (\n <TableEditorRow\n key={rowIndex}\n rowIndex={rowIndex}\n rowData={rowData}\n selectable={selectable}\n sortable={sortable}\n />\n ))\n )}\n </Table.Body>\n\n {footer && footer.length > 0 && (\n <TableEditorFooter footerDefs={footer} selectable={selectable} sortable={sortable} />\n )}\n </Table.Root>\n </Box>\n\n <TableEditorToolbar addLabel={addLabel} actions={toolbarActions} />\n\n {helperText && <Field.HelperText>{helperText}</Field.HelperText>}\n </Field.Root>\n </TableEditorContext.Provider>\n )\n }}\n </form.Field>\n )\n}\n","'use client'\n\nimport { HStack, VStack } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { FormOfflineConfig } from '../offline'\nimport { FormAutoFields } from './form-auto-fields'\nimport { ButtonReset } from './form-buttons/button-reset'\nimport { ButtonSubmit } from './form-buttons/button-submit'\nimport type { FormPersistenceConfig } from './form-persistence'\nimport { FormSimple } from './form-root'\nimport type { FormMiddleware, ValidateOn } from './types'\n\n/**\n * Props for Form.FromSchema\n */\nexport interface FormFromSchemaProps<TData extends object> {\n /**\n * Zod schema (required)\n * Used for validation and auto-generation of fields\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: any\n /**\n * Initial values form\n */\n initialValue: TData\n /**\n * Submit handler form\n */\n onSubmit: (data: TData) => void | Promise<void>\n /**\n * Submit button text\n * @default 'Save'\n */\n submitLabel?: ReactNode\n /**\n * Show reset button\n * @default false\n */\n showReset?: boolean\n /**\n * Reset button text\n * @default 'Reset'\n */\n resetLabel?: ReactNode\n /**\n * Exclude fields from auto-generation\n * @example exclude={['id', 'createdAt', 'updatedAt']}\n */\n exclude?: string[]\n /**\n * Validation mode\n */\n validateOn?: ValidateOn | ValidateOn[]\n /**\n * Middleware for processing form events\n */\n middleware?: FormMiddleware<TData>\n /**\n * Globally disable all fields\n */\n disabled?: boolean\n /**\n * Global read-only mode\n */\n readOnly?: boolean\n /**\n * localStorage persistence configuration\n */\n persistence?: FormPersistenceConfig\n /**\n * Offline mode configuration\n */\n offline?: FormOfflineConfig\n /**\n * JSON value inspector: true = dev only, 'force' = also in production\n */\n debug?: boolean | 'force'\n /**\n * Additional content before buttons\n */\n beforeButtons?: ReactNode\n /**\n * Additional content after buttons\n */\n afterButtons?: ReactNode\n /**\n * Gap between fields\n * @default 4\n */\n gap?: number\n}\n\n/**\n * Form.FromSchema — fully automatic form generation from Zod schema\n *\n * Creates a form with automatically generated fields based on\n * Zod schema types and metadata.\n *\n * @example Basic usage\n * ```tsx\n * const UserSchema = z.object({\n * firstName: z.string().meta({ ui: { title: 'Name' } }),\n * lastName: z.string().meta({ ui: { title: 'Last Name' } }),\n * email: z.string().email().meta({ ui: { title: 'Email' } }),\n * bio: z.string().meta({ ui: { title: 'About', fieldType: 'textarea' } }),\n * })\n *\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={{ firstName: '', lastName: '', email: '', bio: '' }}\n * onSubmit={saveUser}\n * submitLabel=\"Create User\"\n * />\n * ```\n *\n * @example With field exclusion and reset button\n * ```tsx\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={userData}\n * onSubmit={updateUser}\n * exclude={['id', 'createdAt']}\n * showReset\n * submitLabel=\"Update\"\n * resetLabel=\"Undo changes\"\n * />\n * ```\n *\n * @example With middleware and validation\n * ```tsx\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={data}\n * onSubmit={save}\n * validateOn=\"blur\"\n * middleware={{\n * afterSuccess: () => toaster.success({ title: 'Saved!' }),\n * onError: (e) => toaster.error({ title: e.message }),\n * }}\n * />\n * ```\n */\nexport function FormFromSchema<TData extends object>({\n schema,\n initialValue,\n onSubmit,\n submitLabel = 'Save',\n showReset = false,\n resetLabel = 'Reset',\n exclude,\n validateOn,\n middleware,\n disabled,\n readOnly,\n debug,\n persistence,\n offline,\n beforeButtons,\n afterButtons,\n gap = 4,\n}: FormFromSchemaProps<TData>): ReactElement {\n return (\n <FormSimple\n schema={schema}\n initialValue={initialValue}\n onSubmit={onSubmit}\n validateOn={validateOn}\n middleware={middleware}\n disabled={disabled}\n readOnly={readOnly}\n debug={debug}\n persistence={persistence}\n offline={offline}\n >\n <VStack align=\"stretch\" gap={gap}>\n {/* Automatically generated fields */}\n <FormAutoFields exclude={exclude} />\n\n {/* Additional content before buttons */}\n {beforeButtons}\n\n {/* Buttons */}\n <HStack justify=\"flex-end\" gap={2}>\n {showReset && <ButtonReset variant=\"outline\">{resetLabel}</ButtonReset>}\n <ButtonSubmit>{submitLabel}</ButtonSubmit>\n </HStack>\n\n {/* Additional content after buttons */}\n {afterButtons}\n </VStack>\n </FormSimple>\n )\n}\n\nFormFromSchema.displayName = 'FormFromSchema'\n","'use client'\n\nimport { Alert, Box } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\n\n/**\n * Props для Form.InfoBlock\n */\nexport interface FormInfoBlockProps {\n /** Вариант блока (определяет цвет и иконку) */\n variant?: 'info' | 'warning' | 'error' | 'success' | 'tip'\n /** Заголовок блока */\n title?: ReactNode\n /** Содержимое блока */\n children: ReactNode\n /** Визуальный стиль Alert (Chakra variant) */\n appearance?: 'subtle' | 'surface' | 'outline' | 'solid'\n /** Размер */\n size?: 'sm' | 'md' | 'lg'\n}\n\n/** Маппинг variant → Chakra Alert status */\nconst STATUS_MAP: Record<string, 'info' | 'warning' | 'error' | 'success'> = {\n info: 'info',\n warning: 'warning',\n error: 'error',\n success: 'success',\n tip: 'info',\n}\n\n/** Маппинг variant → цветовая палитра */\nconst COLOR_MAP: Record<string, string> = {\n info: 'blue',\n warning: 'orange',\n error: 'red',\n success: 'green',\n tip: 'teal',\n}\n\n/**\n * Form.InfoBlock — информационный блок внутри формы\n *\n * Показывает info/warning/error/success/tip сообщения.\n * На базе Chakra UI Alert.\n *\n * @example\n * ```tsx\n * <Form.InfoBlock variant=\"info\" title=\"Важно\">\n * Заполните все поля для получения скидки 10%.\n * </Form.InfoBlock>\n * ```\n *\n * @example Условное отображение\n * ```tsx\n * <Form.When field=\"type\" is=\"company\">\n * <Form.InfoBlock variant=\"warning\">\n * Для компаний требуется ИНН и КПП.\n * </Form.InfoBlock>\n * </Form.When>\n * ```\n */\nexport function FormInfoBlock({\n variant = 'info',\n title,\n children,\n appearance = 'subtle',\n size = 'md',\n}: FormInfoBlockProps): ReactElement {\n const status = STATUS_MAP[variant] ?? 'info'\n const colorPalette = COLOR_MAP[variant] ?? 'blue'\n\n return (\n <Alert.Root status={status} variant={appearance} size={size} colorPalette={colorPalette}>\n <Alert.Indicator />\n {title ? (\n <Box>\n <Alert.Title>{title}</Alert.Title>\n <Alert.Description>{children}</Alert.Description>\n </Box>\n ) : (\n <Alert.Description>{children}</Alert.Description>\n )}\n </Alert.Root>\n )\n}\n","'use client'\n\nimport { createContext, type ReactNode, type RefObject, useContext } from 'react'\n\n/**\n * Information about a single step\n */\nexport interface StepInfo {\n /** Step index (0-based) */\n index: number\n /** Step title */\n title: string\n /** Optional description */\n description?: string\n /** Optional icon */\n icon?: ReactNode\n /** Field names in this step (for validation) */\n fieldNames: string[]\n /** Callback when entering the step */\n onEnter?: () => void\n /** Callback when leaving the step (can cancel transition) */\n onLeave?: (direction: StepDirection) => Promise<boolean> | boolean\n}\n\n/** Animation direction */\nexport type StepDirection = 'forward' | 'backward'\n\n/**\n * Context value for Form.Steps\n */\nexport interface FormStepsContextValue {\n /** Current step index (0-based) */\n currentStep: number\n /** Total number of steps */\n stepCount: number\n /** Registered steps info */\n steps: StepInfo[]\n /** Go to next step */\n goToNext: () => Promise<boolean>\n /** Go to previous step */\n goToPrev: () => void\n /** Go to specific step */\n goToStep: (step: number) => void\n /** Skip to end (completed state) without validation */\n skipToEnd: () => void\n /** Trigger form submission programmatically */\n triggerSubmit: () => void\n /** Check if can go to next step */\n canGoNext: boolean\n /** Check if can go to previous step */\n canGoPrev: boolean\n /** Whether all steps are completed */\n isCompleted: boolean\n /** Whether we're on the last step */\n isLastStep: boolean\n /** Whether we're on the first step */\n isFirstStep: boolean\n /** Register a step */\n registerStep: (step: StepInfo) => void\n /** Unregister a step */\n unregisterStep: (index: number) => void\n /** Shared mutable ref для атомарного назначения уникальных индексов шагам */\n claimedIndicesRef: RefObject<Set<number>>\n /** Validate fields on current step before navigation */\n validateOnNext: boolean\n /** Linear mode (must complete steps in order) */\n linear: boolean\n /** Orientation */\n orientation: 'horizontal' | 'vertical'\n /** Size */\n size: 'xs' | 'sm' | 'md' | 'lg'\n /** Variant */\n variant: 'solid' | 'subtle'\n /** Color palette */\n colorPalette: string\n /** Whether transition animations are enabled */\n animated: boolean\n /** Animation duration in seconds */\n animationDuration: number\n /** Direction of the last transition (for animation) */\n direction: StepDirection\n /** Hidden fields (excluded from validation via Form.When) */\n hiddenFields: Set<string>\n /** Hide fields from validation (called from Form.When when hiding) */\n hideFieldsFromValidation: (fieldNames: string[]) => void\n /** Show fields for validation (called from Form.When when showing) */\n showFieldsForValidation: (fieldNames: string[]) => void\n /** Callback on successful step completion */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /** Clear step persistence (call after successful submission) */\n clearStepPersistence: () => void\n}\n\nexport const FormStepsContext = createContext<FormStepsContextValue | null>(null)\n\n/**\n * Hook to access Form.Steps context\n * @throws Error if used outside of Form.Steps\n */\nexport function useFormStepsContext(): FormStepsContextValue {\n const context = useContext(FormStepsContext)\n if (!context) {\n throw new Error('useFormStepsContext must be used inside Form.Steps')\n }\n return context\n}\n","'use client'\n\nimport type { AnyFormApi } from '@tanstack/react-form'\nimport { useCallback, useRef, useState } from 'react'\nimport type { StepDirection, StepInfo } from './form-steps-context'\n\n/**\n * Parameters for useStepNavigation hook\n */\nexport interface UseStepNavigationParams {\n /** TanStack Form API */\n form: AnyFormApi\n /** Current step index */\n currentStep: number\n /** Total number of steps */\n stepCount: number\n /** Sorted steps */\n sortedSteps: StepInfo[]\n /** Hidden fields (excluded from validation) */\n hiddenFields: Set<string>\n /** Externally controlled step */\n controlledStep?: number\n /** Callback on step change */\n onStepChange?: (step: number) => void\n /** Callback on step completion */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /** Validate when navigating to next step */\n validateOnNext?: boolean\n /** Setter for internal step state */\n setInternalStep: (step: number) => void\n}\n\n/**\n * Result of useStepNavigation hook\n */\nexport interface UseStepNavigationResult {\n /** Transition direction (for animation) */\n direction: StepDirection\n /** Go to next step (with validation) */\n goToNext: () => Promise<boolean>\n /** Go to previous step */\n goToPrev: () => Promise<void>\n /** Go to specific step */\n goToStep: (step: number) => void\n /** Skip to end (without validation) */\n skipToEnd: () => void\n /** Trigger form submission */\n triggerSubmit: () => void\n /** Validate current step */\n validateCurrentStep: () => Promise<boolean>\n}\n\n/**\n * Hook for navigating between form steps\n *\n * Manages:\n * - Transitions between steps\n * - Validation before transition\n * - Animation direction\n * - Step callbacks (onEnter, onLeave)\n *\n * IMPORTANT: All callbacks use refs for unstable values (sortedSteps, stepCount,\n * currentStep, hiddenFields, onStepChange, onStepComplete). This prevents callback\n * recreation on each step registration, which caused an infinite loop:\n * registerStep -> new sortedSteps/stepCount -> new callbacks -> new contextValue ->\n * re-render -> re-registration -> infinite loop.\n */\nexport function useStepNavigation({\n form,\n currentStep,\n stepCount,\n sortedSteps,\n hiddenFields,\n controlledStep,\n onStepChange,\n onStepComplete,\n validateOnNext = true,\n setInternalStep,\n}: UseStepNavigationParams): UseStepNavigationResult {\n // Animation direction (for slide effect)\n const [direction, setDirection] = useState<StepDirection>('forward')\n\n // All unstable values via refs — callbacks are NEVER recreated\n const sortedStepsRef = useRef(sortedSteps)\n sortedStepsRef.current = sortedSteps\n\n const stepCountRef = useRef(stepCount)\n stepCountRef.current = stepCount\n\n const currentStepRef = useRef(currentStep)\n currentStepRef.current = currentStep\n\n const hiddenFieldsRef = useRef(hiddenFields)\n hiddenFieldsRef.current = hiddenFields\n\n const onStepChangeRef = useRef(onStepChange)\n onStepChangeRef.current = onStepChange\n\n const onStepCompleteRef = useRef(onStepComplete)\n onStepCompleteRef.current = onStepComplete\n\n const controlledStepRef = useRef(controlledStep)\n controlledStepRef.current = controlledStep\n\n const validateOnNextRef = useRef(validateOnNext)\n validateOnNextRef.current = validateOnNext\n\n // Validate current step fields (excluding hidden fields)\n\n const validateCurrentStep = useCallback(async (): Promise<boolean> => {\n if (!validateOnNextRef.current) {\n return true\n }\n\n const currentStepInfo = sortedStepsRef.current[currentStepRef.current]\n if (!currentStepInfo || currentStepInfo.fieldNames.length === 0) {\n return true\n }\n\n // Filter hidden fields — they should not be validated\n const visibleFieldNames = currentStepInfo.fieldNames.filter((name) => !hiddenFieldsRef.current.has(name))\n\n if (visibleFieldNames.length === 0) {\n return true\n }\n\n // Mark fields as touched to show errors\n for (const fieldName of visibleFieldNames) {\n form.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n // Validate each visible field on the current step\n for (const fieldName of visibleFieldNames) {\n await form.validateField(fieldName, 'change')\n }\n\n // Check for errors\n const state = form.store.state\n for (const fieldName of visibleFieldNames) {\n const fieldMeta = state.fieldMeta[fieldName]\n if (fieldMeta?.errors && fieldMeta.errors.length > 0) {\n return false\n }\n }\n\n return true\n }, [form])\n\n // Go to next step\n\n const goToNext = useCallback(async (): Promise<boolean> => {\n const isValid = await validateCurrentStep()\n if (!isValid) {\n return false\n }\n\n const step = currentStepRef.current\n const currentStepInfo = sortedStepsRef.current[step]\n\n // Call onLeave callback if exists (can cancel transition)\n if (currentStepInfo?.onLeave) {\n const canLeave = await currentStepInfo.onLeave('forward')\n if (!canLeave) {\n return false\n }\n }\n\n // Call onStepComplete callback\n if (onStepCompleteRef.current) {\n await onStepCompleteRef.current(step, form.state.values)\n }\n\n const nextStep = step + 1\n if (nextStep < stepCountRef.current) {\n setDirection('forward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(nextStep)\n }\n onStepChangeRef.current?.(nextStep)\n\n // Call onEnter callback of next step\n const nextStepInfo = sortedStepsRef.current[nextStep]\n if (nextStepInfo?.onEnter) {\n nextStepInfo.onEnter()\n }\n\n return true\n }\n return false\n }, [form, validateCurrentStep, setInternalStep])\n\n // Go to previous step\n\n const goToPrev = useCallback(async () => {\n const step = currentStepRef.current\n const prevStep = step - 1\n if (prevStep >= 0) {\n const currentStepInfo = sortedStepsRef.current[step]\n\n // Call onLeave callback if exists (can cancel transition)\n if (currentStepInfo?.onLeave) {\n const canLeave = await currentStepInfo.onLeave('backward')\n if (!canLeave) {\n return\n }\n }\n\n setDirection('backward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(prevStep)\n }\n onStepChangeRef.current?.(prevStep)\n\n // Call onEnter callback of previous step\n const prevStepInfo = sortedStepsRef.current[prevStep]\n if (prevStepInfo?.onEnter) {\n prevStepInfo.onEnter()\n }\n }\n }, [setInternalStep])\n\n // Go to specific step\n\n const goToStep = useCallback(\n (step: number) => {\n if (step >= 0 && step < stepCountRef.current) {\n setDirection(step > currentStepRef.current ? 'forward' : 'backward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(step)\n }\n onStepChangeRef.current?.(step)\n }\n },\n [setInternalStep]\n )\n\n // Skip to end (without validation)\n\n const skipToEnd = useCallback(() => {\n const count = stepCountRef.current\n setDirection('forward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(count) // Past last step — completed state\n }\n onStepChangeRef.current?.(count)\n }, [setInternalStep])\n\n // Programmatic form submission\n const triggerSubmit = useCallback(() => {\n form.handleSubmit()\n }, [form])\n\n return {\n direction,\n goToNext,\n goToPrev,\n goToStep,\n skipToEnd,\n triggerSubmit,\n validateCurrentStep,\n }\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef } from 'react'\n\nconst STORAGE_PREFIX = 'form-steps:'\n\n/**\n * Form step persistence configuration\n */\nexport interface StepPersistenceConfig {\n /**\n * Unique key for localStorage\n * Must be unique per form\n */\n key: string\n\n /**\n * Debounce delay for saving in milliseconds\n * @default 300\n */\n debounceMs?: number\n}\n\n/**\n * Result of useStepPersistence hook\n */\nexport interface UseStepPersistenceResult {\n /** Get persisted step from localStorage */\n getPersistedStep: () => number | null\n /** Clear persisted step */\n clearPersistence: () => void\n}\n\n/**\n * Hook for persisting current step in localStorage\n *\n * Saves and restores the current step index automatically.\n * Uses debounce to optimize writes.\n *\n * @example\n * ```tsx\n * const { getPersistedStep, clearPersistence } = useStepPersistence(\n * currentStep,\n * { key: 'my-form', debounceMs: 300 }\n * )\n * ```\n */\nexport function useStepPersistence(currentStep: number, config?: StepPersistenceConfig): UseStepPersistenceResult {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n // Use ref for config — prevents useEffect restart\n // on every render due to object reference change\n const configRef = useRef(config)\n configRef.current = config\n\n // Get persisted step on mount\n const getPersistedStep = useCallback((): number | null => {\n const cfg = configRef.current\n if (!cfg || typeof window === 'undefined') {\n return null\n }\n try {\n const stored = localStorage.getItem(`${STORAGE_PREFIX}${cfg.key}`)\n if (stored) {\n const parsed = parseInt(stored, 10)\n if (!isNaN(parsed) && parsed >= 0) {\n return parsed\n }\n }\n } catch {\n // Invalid or localStorage error — ignore\n }\n return null\n }, [])\n\n // Save step with debounce — depends only on currentStep\n useEffect(() => {\n const cfg = configRef.current\n if (!cfg || typeof window === 'undefined') {\n return\n }\n\n const debounceMs = cfg.debounceMs ?? 300\n\n // Cancel previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // Debounced save\n debounceTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${cfg.key}`, String(currentStep))\n } catch {\n // localStorage may be full or disabled\n }\n }, debounceMs)\n\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [currentStep])\n\n // Clear persistence (call after successful form submission)\n const clearPersistence = useCallback(() => {\n const cfg = configRef.current\n if (!cfg || typeof window === 'undefined') {\n return\n }\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n try {\n localStorage.removeItem(`${STORAGE_PREFIX}${cfg.key}`)\n } catch {\n // Ignore errors\n }\n }, [])\n\n return { getPersistedStep, clearPersistence }\n}\n","'use client'\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport type { StepInfo } from './form-steps-context'\n\n/**\n * Result of useStepState hook\n */\nexport interface UseStepStateResult {\n /** Registered steps, sorted by index */\n sortedSteps: StepInfo[]\n /** Number of steps */\n stepCount: number\n /** Register a step */\n registerStep: (step: StepInfo) => void\n /** Unregister a step */\n unregisterStep: (index: number) => void\n /** Shared mutable ref для атомарного назначения уникальных индексов шагам */\n claimedIndicesRef: React.RefObject<Set<number>>\n /** Hidden fields (excluded from validation) */\n hiddenFields: Set<string>\n /** Hide fields from validation */\n hideFieldsFromValidation: (fieldNames: string[]) => void\n /** Show fields for validation */\n showFieldsForValidation: (fieldNames: string[]) => void\n}\n\n/**\n * Hook for managing step state\n *\n * Manages:\n * - Step registration/unregistration\n * - Sorting steps by index\n * - Hidden fields (for Form.When integration)\n *\n * @example\n * ```tsx\n * const {\n * sortedSteps,\n * stepCount,\n * registerStep,\n * unregisterStep,\n * hiddenFields,\n * hideFieldsFromValidation,\n * showFieldsForValidation\n * } = useStepState()\n * ```\n */\nexport function useStepState(): UseStepStateResult {\n // Registered steps\n const [steps, setSteps] = useState<StepInfo[]>([])\n\n // Shared mutable ref для атомарного назначения индексов шагам.\n // Решает race condition: useEffect-ы всех Step запускаются последовательно\n // в одном коммите, но state (steps) ещё не обновлён. Ref мутируется\n // синхронно — каждый следующий Step видит уже занятые индексы.\n const claimedIndicesRef = useRef<Set<number>>(new Set())\n\n // Hidden fields (excluded from validation via Form.When)\n const [hiddenFields, setHiddenFields] = useState<Set<string>>(new Set())\n\n // Sort steps by index\n const sortedSteps = useMemo(() => [...steps].sort((a, b) => a.index - b.index), [steps])\n\n const stepCount = sortedSteps.length\n\n // Register step (with change detection — prevents unnecessary re-renders)\n const registerStep = useCallback((step: StepInfo) => {\n setSteps((prev) => {\n const existing = prev.findIndex((s) => s.index === step.index)\n if (existing >= 0) {\n const old = prev[existing]\n // Compare significant fields — if unchanged, don't update state\n if (\n old.title === step.title &&\n old.description === step.description &&\n old.fieldNames.length === step.fieldNames.length &&\n old.fieldNames.every((f, i) => f === step.fieldNames[i])\n ) {\n return prev // No changes — return the same object\n }\n const next = [...prev]\n next[existing] = step\n return next\n }\n return [...prev, step]\n })\n }, [])\n\n // Unregister step\n const unregisterStep = useCallback((index: number) => {\n claimedIndicesRef.current.delete(index)\n setSteps((prev) => prev.filter((s) => s.index !== index))\n }, [])\n\n // Hide fields from validation (called from Form.When when hiding)\n const hideFieldsFromValidation = useCallback((fieldNames: string[]) => {\n setHiddenFields((prev) => {\n const next = new Set(prev)\n for (const name of fieldNames) {\n next.add(name)\n }\n return next\n })\n }, [])\n\n // Show fields for validation (called from Form.When when showing)\n const showFieldsForValidation = useCallback((fieldNames: string[]) => {\n setHiddenFields((prev) => {\n const next = new Set(prev)\n for (const name of fieldNames) {\n next.delete(name)\n }\n return next\n })\n }, [])\n\n return {\n sortedSteps,\n stepCount,\n registerStep,\n unregisterStep,\n claimedIndicesRef,\n hiddenFields,\n hideFieldsFromValidation,\n showFieldsForValidation,\n }\n}\n","'use client'\n\nimport { Steps } from '@chakra-ui/react'\nimport { type ReactNode, useCallback, useMemo, useRef, useState } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport { FormStepsContext, type FormStepsContextValue } from './form-steps-context'\nimport { useStepNavigation } from './use-step-navigation'\nimport { type StepPersistenceConfig, useStepPersistence } from './use-step-persistence'\nimport { useStepState } from './use-step-state'\n\nexport type { StepPersistenceConfig }\n\nexport interface FormStepsProps {\n /** Form.Steps content (Step, Indicator, Navigation, CompletedContent) */\n children: ReactNode\n /** Initial step index (0-based) */\n defaultStep?: number\n /** Controlled step index */\n step?: number\n /** Callback when step changes */\n onStepChange?: (step: number) => void\n /** Whether to validate current step fields before moving to next */\n validateOnNext?: boolean\n /** Linear mode - must complete steps in order (no skipping) */\n linear?: boolean\n /** Orientation */\n orientation?: 'horizontal' | 'vertical'\n /** Size */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Variant */\n variant?: 'solid' | 'subtle'\n /** Color palette */\n colorPalette?: string\n /** Enable slide animations when transitioning between steps */\n animated?: boolean\n /** Animation duration in seconds (default 0.3) */\n animationDuration?: number\n /** Callback on successful step completion (called after validation, before transition) */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /**\n * Enable localStorage persistence for step progress.\n * Saves and restores the current step index automatically.\n *\n * @example\n * ```tsx\n * <Form.Steps\n * stepPersistence={{\n * key: 'instructor-onboarding',\n * debounceMs: 500,\n * }}\n * >\n * ```\n */\n stepPersistence?: StepPersistenceConfig\n}\n\n/**\n * Form.Steps - Multi-step form container\n *\n * Wraps Chakra UI Steps with form validation integration.\n * Validates fields on current step before allowing navigation to next step.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <Form.Steps>\n * <Form.Steps.Indicator />\n *\n * <Form.Steps.Step title=\"Personal\">\n * <Form.Field.String name=\"firstName\" label=\"First Name\" />\n * <Form.Field.String name=\"lastName\" label=\"Last Name\" />\n * </Form.Steps.Step>\n *\n * <Form.Steps.Step title=\"Contact\">\n * <Form.Field.String name=\"email\" label=\"Email\" />\n * </Form.Steps.Step>\n *\n * <Form.Steps.CompletedContent>\n * All done! Review your data.\n * </Form.Steps.CompletedContent>\n *\n * <Form.Steps.Navigation />\n * </Form.Steps>\n * </Form>\n * ```\n */\nexport function FormSteps({\n children,\n defaultStep = 0,\n step: controlledStep,\n onStepChange,\n validateOnNext = true,\n linear = false,\n orientation = 'horizontal',\n size = 'md',\n variant = 'solid',\n colorPalette = 'brand',\n animated = false,\n animationDuration = 0.3,\n onStepComplete,\n stepPersistence,\n}: FormStepsProps) {\n const { form } = useDeclarativeForm()\n\n // Persistence hook\n const { getPersistedStep, clearPersistence } = useStepPersistence(0, stepPersistence)\n\n // Step state (uses persisted value if available)\n const [internalStep, setInternalStep] = useState(() => {\n const persisted = getPersistedStep()\n return persisted ?? defaultStep\n })\n const currentStep = controlledStep ?? internalStep\n\n // Step state hook (step registration, hidden fields)\n const {\n sortedSteps,\n stepCount,\n registerStep,\n unregisterStep,\n claimedIndicesRef,\n hiddenFields,\n hideFieldsFromValidation,\n showFieldsForValidation,\n } = useStepState()\n\n // Persistence: save step changes\n useStepPersistence(currentStep, stepPersistence)\n\n // Navigation hook\n const { direction, goToNext, goToPrev, goToStep, skipToEnd, triggerSubmit } = useStepNavigation({\n form,\n currentStep,\n stepCount,\n sortedSteps,\n hiddenFields,\n controlledStep,\n onStepChange,\n onStepComplete,\n validateOnNext,\n setInternalStep,\n })\n\n // Refs for unstable values — prevents contextValue recreation\n // on each step registration (sortedSteps and hiddenFields change on registration)\n const sortedStepsRef = useRef(sortedSteps)\n sortedStepsRef.current = sortedSteps\n\n const hiddenFieldsRef = useRef(hiddenFields)\n hiddenFieldsRef.current = hiddenFields\n\n const onStepCompleteRef = useRef(onStepComplete)\n onStepCompleteRef.current = onStepComplete\n\n // Context value — depends only on stable values\n // sortedSteps, hiddenFields and onStepComplete via refs\n const contextValue: FormStepsContextValue = useMemo(\n () => ({\n currentStep,\n stepCount,\n // Getter for steps — returns current value via ref\n get steps() {\n return sortedStepsRef.current\n },\n goToNext,\n goToPrev,\n goToStep,\n skipToEnd,\n triggerSubmit,\n canGoNext: currentStep < stepCount - 1,\n canGoPrev: currentStep > 0,\n isCompleted: currentStep >= stepCount,\n isLastStep: currentStep === stepCount - 1,\n isFirstStep: currentStep === 0,\n registerStep,\n unregisterStep,\n claimedIndicesRef,\n validateOnNext,\n linear,\n orientation,\n size,\n variant,\n colorPalette,\n animated,\n animationDuration,\n direction,\n get hiddenFields() {\n return hiddenFieldsRef.current\n },\n hideFieldsFromValidation,\n showFieldsForValidation,\n get onStepComplete() {\n return onStepCompleteRef.current\n },\n clearStepPersistence: clearPersistence,\n }),\n // IMPORTANT: sortedSteps, hiddenFields, onStepComplete NOT in deps —\n // accessed via refs/getters, prevents infinite loop\n\n [\n currentStep,\n stepCount,\n goToNext,\n goToPrev,\n goToStep,\n skipToEnd,\n triggerSubmit,\n clearPersistence,\n registerStep,\n unregisterStep,\n validateOnNext,\n linear,\n orientation,\n size,\n variant,\n colorPalette,\n animated,\n animationDuration,\n direction,\n hideFieldsFromValidation,\n showFieldsForValidation,\n ]\n )\n\n // Handle step change from Chakra Steps\n const handleStepChange = useCallback(\n (details: { step: number }) => {\n // In linear mode, only allow going to previous steps or next if valid\n if (linear && details.step > currentStep) {\n // Don't allow skipping - must use goToNext which validates\n return\n }\n goToStep(details.step)\n },\n [linear, currentStep, goToStep]\n )\n\n return (\n <FormStepsContext.Provider value={contextValue}>\n <Steps.Root\n step={currentStep}\n onStepChange={handleStepChange}\n count={stepCount}\n orientation={orientation}\n size={size}\n variant={variant}\n colorPalette={colorPalette}\n linear={linear}\n >\n {children}\n </Steps.Root>\n </FormStepsContext.Provider>\n )\n}\n","'use client'\n\nimport { Steps } from '@chakra-ui/react'\nimport type { ReactNode } from 'react'\n\nexport interface FormStepsCompletedContentProps {\n /** Content to show when all steps are completed */\n children: ReactNode\n}\n\n/**\n * Form.Steps.CompletedContent - Content shown after all steps are completed\n *\n * This content is displayed when the user has gone past the last step.\n * Useful for showing a summary or confirmation message.\n *\n * @example\n * ```tsx\n * <Form.Steps.CompletedContent>\n * <Text>All steps complete! Review your data below.</Text>\n * <FormSummary />\n * </Form.Steps.CompletedContent>\n * ```\n */\nexport function FormStepsCompletedContent({ children }: FormStepsCompletedContentProps) {\n return <Steps.CompletedContent>{children}</Steps.CompletedContent>\n}\n\nFormStepsCompletedContent.displayName = 'FormStepsCompletedContent'\n","'use client'\n\nimport { Box, Steps } from '@chakra-ui/react'\nimport { LuCheck } from 'react-icons/lu'\nimport { useFormStepsContext } from './form-steps-context'\n\nexport interface FormStepsIndicatorProps {\n /** Custom completed icon (default: check mark) */\n completedIcon?: React.ReactNode\n /** Show step descriptions in indicator */\n showDescriptions?: boolean\n /** Allow clicking on steps to navigate (disabled in linear mode) */\n clickable?: boolean\n}\n\n/**\n * Form.Steps.Indicator - Step progress indicator\n *\n * Displays a horizontal or vertical stepper showing progress through form steps.\n * Automatically reads step information from registered Form.Steps.Step components.\n *\n * @example\n * ```tsx\n * <Form.Steps>\n * <Form.Steps.Indicator showDescriptions />\n * ...\n * </Form.Steps>\n * ```\n */\nexport function FormStepsIndicator({\n completedIcon = <LuCheck />,\n showDescriptions = false,\n clickable = true,\n}: FormStepsIndicatorProps) {\n const { steps, linear } = useFormStepsContext()\n\n // In linear mode, clicking is disabled\n const isClickable = clickable && !linear\n\n return (\n <Steps.List>\n {steps.map((step) => (\n <Steps.Item key={step.index} index={step.index}>\n {isClickable ? (\n <Steps.Trigger>\n <Steps.Indicator>\n <Steps.Status complete={completedIcon} incomplete={step.icon || <Steps.Number />} />\n </Steps.Indicator>\n {showDescriptions && step.description ? (\n <Box>\n <Steps.Title>{step.title}</Steps.Title>\n <Steps.Description>{step.description}</Steps.Description>\n </Box>\n ) : (\n <Steps.Title>{step.title}</Steps.Title>\n )}\n </Steps.Trigger>\n ) : (\n <>\n <Steps.Indicator>\n <Steps.Status complete={completedIcon} incomplete={step.icon || <Steps.Number />} />\n </Steps.Indicator>\n {showDescriptions && step.description ? (\n <Box>\n <Steps.Title>{step.title}</Steps.Title>\n <Steps.Description>{step.description}</Steps.Description>\n </Box>\n ) : (\n <Steps.Title>{step.title}</Steps.Title>\n )}\n </>\n )}\n <Steps.Separator />\n </Steps.Item>\n ))}\n </Steps.List>\n )\n}\n\nFormStepsIndicator.displayName = 'FormStepsIndicator'\n","'use client'\n\nimport { Button, ButtonGroup, type ButtonProps } from '@chakra-ui/react'\nimport { type ReactNode, useCallback, useState } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport { useFormStepsContext } from './form-steps-context'\n\nexport interface FormStepsNavigationProps {\n /** Label for previous button */\n prevLabel?: ReactNode\n /** Label for next button */\n nextLabel?: ReactNode\n /** Label for submit button (shown on last step) */\n submitLabel?: ReactNode\n /** Label for skip button */\n skipLabel?: ReactNode\n /** Show previous button */\n showPrev?: boolean\n /** Show next/submit button */\n showNext?: boolean\n /** Show skip button (allows skipping all steps to end) */\n showSkip?: boolean\n /** Button size */\n size?: ButtonProps['size']\n /** Button variant for prev button */\n prevVariant?: ButtonProps['variant']\n /** Button variant for next/submit button */\n nextVariant?: ButtonProps['variant']\n /** Button variant for skip button */\n skipVariant?: ButtonProps['variant']\n /** Color palette for buttons */\n colorPalette?: string\n /** Gap between buttons */\n gap?: number | string\n /** Callback after successful step change */\n onStepChange?: (step: number) => void\n /** Callback when form is submitted */\n onSubmit?: () => void\n /** Callback when skip is clicked (if returns false, skip is cancelled) */\n onSkip?: () => Promise<boolean> | boolean | void\n}\n\n/**\n * Form.Steps.Navigation - Navigation buttons for multi-step form\n *\n * Provides Previous/Next buttons with automatic validation.\n * On the last step, shows Submit button instead of Next.\n *\n * @example\n * ```tsx\n * <Form.Steps.Navigation\n * prevLabel=\"Back\"\n * nextLabel=\"Continue\"\n * submitLabel=\"Create Account\"\n * />\n * ```\n */\nexport function FormStepsNavigation({\n prevLabel = 'Back',\n nextLabel = 'Next',\n submitLabel = 'Submit',\n skipLabel = 'Skip',\n showPrev = true,\n showNext = true,\n showSkip = false,\n size = 'md',\n prevVariant = 'outline',\n nextVariant = 'solid',\n skipVariant = 'ghost',\n colorPalette = 'brand',\n gap = 2,\n onStepChange,\n onSubmit,\n onSkip,\n}: FormStepsNavigationProps) {\n const { form } = useDeclarativeForm()\n const { goToNext, goToPrev, skipToEnd, isFirstStep, isLastStep, canGoPrev, currentStep } = useFormStepsContext()\n\n const [isNavigating, setIsNavigating] = useState(false)\n const [isSkipping, setIsSkipping] = useState(false)\n const [isSubmittingForm, setIsSubmittingForm] = useState(false)\n\n // Handle next button click\n const handleNext = useCallback(async () => {\n setIsNavigating(true)\n try {\n const success = await goToNext()\n if (success) {\n onStepChange?.(currentStep + 1)\n }\n } finally {\n setIsNavigating(false)\n }\n }, [goToNext, currentStep, onStepChange])\n\n // Handle prev button click\n const handlePrev = useCallback(() => {\n goToPrev()\n onStepChange?.(currentStep - 1)\n }, [goToPrev, currentStep, onStepChange])\n\n // Handle submit - trigger form submission with double-click protection\n const handleSubmit = useCallback(async () => {\n if (isSubmittingForm) {\n return\n }\n setIsSubmittingForm(true)\n try {\n onSubmit?.()\n await form.handleSubmit()\n } finally {\n setIsSubmittingForm(false)\n }\n }, [form, onSubmit, isSubmittingForm])\n\n // Handle skip button click\n const handleSkip = useCallback(async () => {\n setIsSkipping(true)\n try {\n // Call onSkip callback if provided\n if (onSkip) {\n const result = await onSkip()\n // If onSkip returns false, cancel skip\n if (result === false) {\n return\n }\n }\n skipToEnd()\n } finally {\n setIsSkipping(false)\n }\n }, [onSkip, skipToEnd])\n\n return (\n <ButtonGroup gap={gap}>\n {showPrev && (\n <Button\n variant={prevVariant}\n size={size}\n onClick={handlePrev}\n disabled={isFirstStep || !canGoPrev || isNavigating || isSkipping}\n colorPalette={colorPalette}\n >\n {prevLabel}\n </Button>\n )}\n\n {showSkip && (\n <Button\n variant={skipVariant}\n size={size}\n onClick={handleSkip}\n loading={isSkipping}\n disabled={isNavigating}\n colorPalette={colorPalette}\n >\n {skipLabel}\n </Button>\n )}\n\n {showNext &&\n (isLastStep ? (\n <Button\n type=\"submit\"\n variant={nextVariant}\n size={size}\n colorPalette={colorPalette}\n onClick={handleSubmit}\n loading={isSubmittingForm}\n disabled={isSubmittingForm || isNavigating || isSkipping}\n >\n {submitLabel}\n </Button>\n ) : (\n <Button\n variant={nextVariant}\n size={size}\n onClick={handleNext}\n loading={isNavigating}\n colorPalette={colorPalette}\n >\n {nextLabel}\n </Button>\n ))}\n </ButtonGroup>\n )\n}\n\nFormStepsNavigation.displayName = 'FormStepsNavigation'\n","'use client'\n\nimport { Steps } from '@chakra-ui/react'\nimport { AnimatePresence, motion, type Variants } from 'framer-motion'\nimport { Children, isValidElement, type ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { useDeclarativeForm } from '../form-context'\nimport { FormGroupDeclarative } from '../form-group/form-group-declarative'\nimport { type StepInfo, useFormStepsContext } from './form-steps-context'\n\n/**\n * Step display condition\n */\nexport interface StepWhenCondition<TValue = unknown> {\n /** Field to watch */\n field: string\n /** Show step when value equals */\n is?: TValue\n /** Show step when value is NOT equal */\n isNot?: TValue\n /** Show step when value is in array */\n in?: TValue[]\n /** Show step when value is NOT in array */\n notIn?: TValue[]\n /** Custom condition function */\n condition?: (value: TValue) => boolean\n}\n\nexport interface FormStepsStepProps {\n /** Step title shown in indicator */\n title: string\n /** Optional description shown in indicator */\n description?: string\n /** Optional icon for the step */\n icon?: ReactNode\n /** Step content (form fields) */\n children: ReactNode\n /** Callback when entering the step */\n onEnter?: () => void\n /** Callback when leaving the step (can cancel transition by returning false) */\n onLeave?: (direction: 'forward' | 'backward') => Promise<boolean> | boolean\n /** Step display condition (step is shown only if condition is true) */\n when?: StepWhenCondition\n /**\n * Segment name for automatic Form.Group wrapping.\n * When provided, all fields inside this step will be automatically\n * namespaced under this segment (e.g., segment=\"profile\" makes\n * name=\"firstName\" resolve to \"profile.firstName\").\n *\n * @example\n * ```tsx\n * <Form.Steps.Step title=\"Profile\" segment=\"profile\">\n * <Form.Field.String name=\"firstName\" /> // resolves to profile.firstName\n * <Form.Field.String name=\"lastName\" /> // resolves to profile.lastName\n * </Form.Steps.Step>\n * ```\n */\n segment?: string\n}\n\n/**\n * Extract field names from children recursively\n * Looks for components with 'name' prop\n */\nfunction extractFieldNames(children: ReactNode, parentPath = ''): string[] {\n const names: string[] = []\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return\n }\n\n const props = child.props as Record<string, unknown>\n\n // Check if this is a field component with name prop\n if (typeof props.name === 'string') {\n const fullName = parentPath ? `${parentPath}.${props.name}` : props.name\n names.push(fullName)\n }\n\n // Check for Form.Group - it creates a namespace\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'FormGroupDeclarative' && typeof props.name === 'string') {\n const groupPath = parentPath ? `${parentPath}.${props.name}` : props.name\n if (props.children) {\n names.push(...extractFieldNames(props.children as ReactNode, groupPath))\n }\n } // Recurse into children (but not into Form.Group.List - arrays are handled differently)\n else if (props.children && displayName !== 'FormGroupListDeclarative') {\n names.push(...extractFieldNames(props.children as ReactNode, parentPath))\n }\n })\n\n return names\n}\n\n/** Offset for slide animation in pixels */\nconst SLIDE_OFFSET = 50\n\n/**\n * Evaluates the when condition value\n */\nfunction evaluateWhenCondition(when: StepWhenCondition | undefined, fieldValue: unknown): boolean {\n if (!when) {\n return true // No condition — always show\n }\n\n if (when.condition !== undefined) {\n return when.condition(fieldValue)\n }\n if (when.is !== undefined) {\n return fieldValue === when.is\n }\n if (when.isNot !== undefined) {\n return fieldValue !== when.isNot\n }\n if (when.in !== undefined) {\n return when.in.includes(fieldValue as never)\n }\n if (when.notIn !== undefined) {\n return !when.notIn.includes(fieldValue as never)\n }\n\n // Default — truthy check\n return Boolean(fieldValue)\n}\n\n/**\n * Gets nested field value by dot-notation path\n */\nfunction getNestedValue(values: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let value: unknown = values\n for (const part of parts) {\n if (value && typeof value === 'object') {\n value = (value as Record<string, unknown>)[part]\n } else {\n return undefined\n }\n }\n return value\n}\n\n/**\n * Form.Steps.Step - Individual step content\n *\n * Registers itself with Form.Steps and provides content for that step.\n * Field names are automatically extracted for validation.\n * Supports slide animations when Form.Steps has `animated` prop.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Steps.Step title=\"Personal Info\" description=\"Your details\">\n * <Form.Field.String name=\"firstName\" label=\"First Name\" />\n * <Form.Field.String name=\"lastName\" label=\"Last Name\" />\n * </Form.Steps.Step>\n * ```\n *\n * @example Conditional step (shown only for a specific role)\n * ```tsx\n * <Form.Steps.Step\n * title=\"Company Info\"\n * when={{ field: 'type', is: 'company' }}\n * >\n * <Form.Field.String name=\"companyName\" label=\"Company Name\" />\n * </Form.Steps.Step>\n * ```\n */\nexport function FormStepsStep({\n title,\n description,\n icon,\n children,\n onEnter,\n onLeave,\n when,\n segment,\n}: FormStepsStepProps) {\n const { form } = useDeclarativeForm()\n const { registerStep, unregisterStep, claimedIndicesRef, currentStep, animated, animationDuration, direction } =\n useFormStepsContext()\n\n // Wrap children in FormGroupDeclarative if segment is provided\n const wrappedChildren = segment ? <FormGroupDeclarative name={segment}>{children}</FormGroupDeclarative> : children\n\n // Parent path for field extraction (accounts for segment)\n const fieldExtractionPath = segment ?? ''\n\n // Track step visibility based on when condition\n const [isVisible, setIsVisible] = useState(() => {\n if (!when) {\n return true\n }\n const fieldValue = getNestedValue(form.state.values as Record<string, unknown>, when.field)\n return evaluateWhenCondition(when, fieldValue)\n })\n\n // Calculate index based on render order\n // We use a ref to track the registered index\n const indexRef = useRef<number>(-1)\n const wasVisibleRef = useRef(isVisible)\n\n // Subscribe to when field changes\n useEffect(() => {\n if (!when) {\n return\n }\n\n const subscription = form.store.subscribe(() => {\n const fieldValue = getNestedValue(form.state.values as Record<string, unknown>, when.field)\n const newIsVisible = evaluateWhenCondition(when, fieldValue)\n if (newIsVisible !== wasVisibleRef.current) {\n wasVisibleRef.current = newIsVisible\n setIsVisible(newIsVisible)\n }\n })\n\n // TanStack Store v0.9+ returns an object { unsubscribe }, not a function\n return () => subscription.unsubscribe()\n }, [form, when])\n\n // Назначение индекса и регистрация шага.\n // Используем claimedIndicesRef (shared mutable Set) вместо stepsRef —\n // это решает race condition, когда все useEffect-ы видели пустой stepsRef\n // и все шаги получали index=0.\n // Ref мутируется синхронно внутри effect-фазы — каждый следующий Step\n // видит уже занятые индексы предыдущих.\n useEffect(() => {\n if (!isVisible) {\n // Шаг скрыт — снимаем регистрацию\n if (indexRef.current >= 0) {\n unregisterStep(indexRef.current)\n indexRef.current = -1\n }\n return\n }\n\n // Занимаем следующий свободный индекс через shared ref\n if (indexRef.current < 0) {\n const claimed = claimedIndicesRef.current\n let nextIndex = 0\n while (claimed.has(nextIndex)) {\n nextIndex++\n }\n indexRef.current = nextIndex\n claimed.add(nextIndex)\n }\n\n // IMPORTANT: fieldNames извлекаются ОДИН раз при mount\n // children НЕ включены в deps — они меняются каждый рендер\n const fieldNames = extractFieldNames(children, fieldExtractionPath)\n\n const stepInfo: StepInfo = {\n index: indexRef.current,\n title,\n description,\n icon,\n fieldNames,\n onEnter,\n onLeave,\n }\n\n registerStep(stepInfo)\n\n return () => {\n if (indexRef.current >= 0) {\n unregisterStep(indexRef.current)\n // unregisterStep уже удаляет из claimedIndicesRef\n indexRef.current = -1\n }\n }\n // IMPORTANT: children и icon намеренно НЕ включены — вызывают infinite loop\n // icon — JSX элемент, пересоздаётся каждый рендер\n }, [\n description,\n registerStep,\n title,\n unregisterStep,\n onEnter,\n onLeave,\n isVisible,\n fieldExtractionPath,\n claimedIndicesRef,\n ])\n\n // Extract fieldNames and memoize their string representation\n // for use in dependency array instead of children\n const fieldNamesRef = useRef<string[]>([])\n const currentFieldNames = useMemo(\n () => extractFieldNames(children, fieldExtractionPath),\n // Use segment path as proxy to determine when structure may change\n // children NOT included — they change every render\n\n [fieldExtractionPath]\n )\n\n // Update ref only if fieldNames actually changed\n const fieldNamesChanged =\n currentFieldNames.length !== fieldNamesRef.current.length ||\n currentFieldNames.some((name, i) => name !== fieldNamesRef.current[i])\n if (fieldNamesChanged) {\n fieldNamesRef.current = currentFieldNames\n }\n\n // Update step info if props change (but keep same index)\n // IMPORTANT: children and icon NOT included in deps — they change every render and cause infinite loop\n // icon — JSX element, recreated on every render\n const iconRef = useRef(icon)\n iconRef.current = icon\n\n useEffect(() => {\n if (indexRef.current >= 0 && isVisible) {\n const stepInfo: StepInfo = {\n index: indexRef.current,\n title,\n description,\n icon: iconRef.current,\n fieldNames: fieldNamesRef.current,\n onEnter,\n onLeave,\n }\n registerStep(stepInfo)\n }\n }, [title, description, registerStep, onEnter, onLeave, isVisible, fieldExtractionPath])\n\n const index = indexRef.current\n\n // Animation variants for slide effect\n const slideVariants: Variants = useMemo(\n () => ({\n // Initial state: element appears from the appropriate side\n initial: {\n opacity: 0,\n x: direction === 'forward' ? SLIDE_OFFSET : -SLIDE_OFFSET,\n },\n // Final state: element in place\n animate: {\n opacity: 1,\n x: 0,\n },\n // Exit state: element leaves to the opposite side\n exit: {\n opacity: 0,\n x: direction === 'forward' ? -SLIDE_OFFSET : SLIDE_OFFSET,\n },\n }),\n [direction]\n )\n\n // Step hidden via when condition — don't render\n if (!isVisible) {\n return null\n }\n\n // Don't render until we have a valid index\n if (index < 0) {\n return null\n }\n\n // Check if this step is the current one\n const isActive = index === currentStep\n\n // If animations are disabled — render regular Steps.Content\n if (!animated) {\n return <Steps.Content index={index}>{wrappedChildren}</Steps.Content>\n }\n\n // With animations — wrap in AnimatePresence + motion.div\n return (\n <Steps.Content index={index}>\n <AnimatePresence mode=\"wait\" initial={false}>\n {isActive && (\n <motion.div\n key={`step-${index}`}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n variants={slideVariants}\n transition={{\n duration: animationDuration,\n ease: 'easeInOut',\n }}\n >\n {wrappedChildren}\n </motion.div>\n )}\n </AnimatePresence>\n </Steps.Content>\n )\n}\n\nFormStepsStep.displayName = 'FormStepsStep'\n","'use client'\n\nimport { type ReactElement, useCallback, useEffect, useMemo, useRef, useSyncExternalStore } from 'react'\nimport { useFormGroup } from '../form-group'\nimport { useDeclarativeForm } from './form-context'\nimport type { FieldChangeApi } from './types'\n\n/**\n * Props для компонента Form.Watch\n */\nexport interface FormWatchProps {\n /** Имя поля для отслеживания (относительно текущей группы) */\n field: string\n /** Callback при изменении значения поля */\n onChange: (value: unknown, api: FieldChangeApi) => void\n}\n\n/**\n * Получить вложенное значение из объекта по dot-path.\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.')\n let result: unknown = obj\n for (const part of parts) {\n if (result && typeof result === 'object') {\n result = (result as Record<string, unknown>)[part]\n } else {\n return undefined\n }\n }\n return result\n}\n\n/**\n * Renderless компонент для отслеживания изменений поля внутри формы.\n *\n * Учитывает контекст FormGroup — если вложен в Group, путь резолвится\n * относительно группы (как у обычных полей).\n *\n * @example\n * ```tsx\n * <Form initialValue={{ name: '', slug: '' }} onSubmit={save}>\n * <Form.Field.String name=\"name\" label=\"Название\" />\n * <Form.Field.String name=\"slug\" label=\"Slug\" />\n * <Form.Watch\n * field=\"name\"\n * onChange={(value, { setFieldValue }) => {\n * setFieldValue('slug', transliterate(String(value)))\n * }}\n * />\n * <Form.Button.Submit>Сохранить</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example Внутри группы\n * ```tsx\n * <Form.Group name=\"address\">\n * <Form.Field.String name=\"country\" />\n * <Form.Field.String name=\"currency\" />\n * <Form.Watch\n * field=\"country\"\n * onChange={(value, { setFieldValue }) => {\n * setFieldValue('address.currency', getCurrency(String(value)))\n * }}\n * />\n * </Form.Group>\n * ```\n */\nexport function FormWatch({ field, onChange }: FormWatchProps): ReactElement | null {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Полный путь с учётом группы\n const fullPath = parentGroup ? `${parentGroup.name}.${field}` : field\n\n // Ref для актуального callback (избегаем переподписки)\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n // Подписка на store\n const subscribe = useCallback(\n (callback: () => void) => {\n const subscription = form.store.subscribe(callback)\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n },\n [form]\n )\n\n const getValueSnapshot = useCallback(\n () => getNestedValue(form.state.values as Record<string, unknown>, fullPath),\n [form, fullPath]\n )\n\n // Подписка на значение поля\n const value = useSyncExternalStore(subscribe, getValueSnapshot, getValueSnapshot)\n\n // Стабильный FieldChangeApi\n const fieldChangeApi = useMemo<FieldChangeApi>(\n () => ({\n setFieldValue: (name: string, val: unknown) => {\n form.setFieldValue(name, val)\n },\n getFieldValue: (name: string) => {\n return getNestedValue(form.state.values as Record<string, unknown>, name)\n },\n getValues: () => {\n return form.state.values as Record<string, unknown>\n },\n }),\n [form]\n )\n\n // Предыдущее значение для детекции изменений\n const prevValueRef = useRef(value)\n const isFirstRender = useRef(true)\n\n useEffect(() => {\n // Пропускаем первый рендер — начальное значение не является \"изменением\"\n if (isFirstRender.current) {\n isFirstRender.current = false\n prevValueRef.current = value\n return\n }\n\n if (!Object.is(prevValueRef.current, value)) {\n prevValueRef.current = value\n onChangeRef.current(value, fieldChangeApi)\n }\n }, [value, fieldChangeApi])\n\n return null\n}\n","'use client'\n\nimport { Children, isValidElement, type ReactNode, useContext, useEffect, useMemo, useRef } from 'react'\nimport { useFormGroup } from '../form-group'\nimport { useDeclarativeForm } from './form-context'\nimport { FormStepsContext } from './form-steps/form-steps-context'\n\n/**\n * Extract field names from children recursively (for step validation integration)\n */\nfunction extractFieldNames(children: ReactNode, parentPath = ''): string[] {\n const names: string[] = []\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return\n }\n\n const props = child.props as Record<string, unknown>\n\n // Check if component has a name prop\n if (typeof props.name === 'string') {\n const fullName = parentPath ? `${parentPath}.${props.name}` : props.name\n names.push(fullName)\n }\n\n // Check for Form.Group — it creates a namespace\n const displayName = (child.type as { displayName?: string })?.displayName\n if (displayName === 'FormGroupDeclarative' && typeof props.name === 'string') {\n const groupPath = parentPath ? `${parentPath}.${props.name}` : props.name\n if (props.children) {\n names.push(...extractFieldNames(props.children as ReactNode, groupPath))\n }\n } // Recurse into children (except Form.Group.List — arrays are handled separately)\n else if (props.children && displayName !== 'FormGroupListDeclarative') {\n names.push(...extractFieldNames(props.children as ReactNode, parentPath))\n }\n })\n\n return names\n}\n\n/**\n * Props for Form.When conditional rendering component\n */\nexport interface FormWhenProps<TValue = unknown> {\n /** Field name to watch (relative to current group context) */\n field: string\n /** Render children when field value equals this value */\n is?: TValue\n /** Render children when field value is NOT equal to this value */\n isNot?: TValue\n /** Render children when field value is in this array */\n in?: TValue[]\n /** Render children when field value is NOT in this array */\n notIn?: TValue[]\n /** Custom condition function */\n condition?: (value: TValue) => boolean\n /** Content to render when condition is true */\n children: ReactNode\n /** Content to render when condition is false (optional) */\n fallback?: ReactNode\n}\n\n/**\n * Form.When - Conditional field rendering based on other field values\n *\n * Renders children only when the specified field matches the condition.\n * Uses form.Subscribe for optimal performance (only re-renders when watched field changes).\n *\n * @example With exact value match\n * ```tsx\n * <Form.Field.Select name=\"type\" options={['individual', 'company']} />\n *\n * <Form.When field=\"type\" is=\"company\">\n * <Form.Field.String name=\"companyName\" label=\"Company Name\" />\n * <Form.Field.String name=\"inn\" label=\"INN\" />\n * </Form.When>\n * ```\n *\n * @example With negation\n * ```tsx\n * <Form.When field=\"hasDiscount\" isNot={true}>\n * <Form.Field.Number name=\"fullPrice\" label=\"Full Price\" />\n * </Form.When>\n * ```\n *\n * @example With array of values\n * ```tsx\n * <Form.When field=\"role\" in={['admin', 'moderator']}>\n * <Form.Field.Checkbox name=\"canDelete\" label=\"Can delete users\" />\n * </Form.When>\n * ```\n *\n * @example With custom condition\n * ```tsx\n * <Form.When field=\"age\" condition={(age) => age >= 18}>\n * <Form.Field.Checkbox name=\"adultContent\" label=\"Show adult content\" />\n * </Form.When>\n * ```\n *\n * @example With fallback content\n * ```tsx\n * <Form.When field=\"isPremium\" is={true} fallback={<Text>Upgrade to premium</Text>}>\n * <Form.Field.Select name=\"premiumTheme\" options={themes} />\n * </Form.When>\n * ```\n *\n * @example Nested in Form.Group\n * ```tsx\n * <Form.Group name=\"settings\">\n * <Form.Field.Switch name=\"notifications\" label=\"Enable notifications\" />\n * <Form.When field=\"notifications\" is={true}>\n * <Form.Field.Select name=\"frequency\" options={frequencies} />\n * </Form.When>\n * </Form.Group>\n * ```\n */\n/**\n * Internal component for handling field show/hide\n * Integrates with FormStepsContext to exclude hidden fields from validation\n */\nfunction FormWhenContent({\n shouldRender,\n children,\n fallback,\n parentPath,\n}: {\n shouldRender: boolean\n children: ReactNode\n fallback: ReactNode\n parentPath: string\n}): ReactNode {\n const stepsContext = useContext(FormStepsContext)\n const prevShouldRender = useRef<boolean | null>(null)\n\n // Memoize field names — recalculate only when children change\n const fieldNames = useMemo(() => extractFieldNames(children, parentPath), [children, parentPath])\n\n // Single useEffect for managing field visibility in validation\n useEffect(() => {\n // No steps context or fields — nothing to do\n if (!stepsContext || fieldNames.length === 0) {\n return\n }\n\n const isFirstMount = prevShouldRender.current === null\n\n if (isFirstMount) {\n // First mount: if hidden — immediately exclude from validation\n if (!shouldRender) {\n stepsContext.hideFieldsFromValidation(fieldNames)\n }\n } else if (shouldRender && !prevShouldRender.current) {\n // Fields became visible — show for validation\n stepsContext.showFieldsForValidation(fieldNames)\n } else if (!shouldRender && prevShouldRender.current) {\n // Fields became hidden — exclude from validation\n stepsContext.hideFieldsFromValidation(fieldNames)\n }\n\n prevShouldRender.current = shouldRender\n\n // Cleanup: on unmount restore fields back\n return () => {\n if (!shouldRender && fieldNames.length > 0) {\n stepsContext.showFieldsForValidation(fieldNames)\n }\n }\n }, [shouldRender, stepsContext, fieldNames])\n\n return shouldRender ? children : fallback\n}\n\nexport function FormWhen<TValue = unknown>({\n field,\n is,\n isNot,\n in: inArray,\n notIn,\n condition,\n children,\n fallback = null,\n}: FormWhenProps<TValue>): ReactNode {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full field path\n const fullPath = parentGroup ? `${parentGroup.name}.${field}` : field\n\n // Parent path for extracting field names\n const parentPath = parentGroup?.name ?? ''\n\n // Create selector function for the field value\n const selector = (state: { values: Record<string, unknown> }): TValue => {\n // Navigate to nested value using dot notation\n const parts = fullPath.split('.')\n let value: unknown = state.values\n for (const part of parts) {\n if (value && typeof value === 'object') {\n value = (value as Record<string, unknown>)[part]\n } else {\n value = undefined\n break\n }\n }\n return value as TValue\n }\n\n return (\n <form.Subscribe selector={selector}>\n {(value: TValue) => {\n let shouldRender = false\n\n if (condition !== undefined) {\n // Custom condition function\n shouldRender = condition(value)\n } else if (is !== undefined) {\n // Exact match\n shouldRender = value === is\n } else if (isNot !== undefined) {\n // Negation\n shouldRender = value !== isNot\n } else if (inArray !== undefined) {\n // Value in array\n shouldRender = inArray.includes(value)\n } else if (notIn !== undefined) {\n // Value not in array\n shouldRender = !notIn.includes(value)\n } else {\n // Default: render if truthy\n shouldRender = Boolean(value)\n }\n\n return (\n <FormWhenContent shouldRender={shouldRender} fallback={fallback} parentPath={parentPath}>\n {children}\n </FormWhenContent>\n )\n }}\n </form.Subscribe>\n )\n}\n","'use client'\n\nimport type { ReactElement } from 'react'\nimport { Form } from '../index'\nimport type { FormFromTemplateProps } from './template-types'\n\n/**\n * Form.FromTemplate — автоматическая генерация формы из шаблона.\n *\n * Использует Form.FromSchema внутри для автоматического рендеринга полей.\n *\n * @example\n * ```tsx\n * import { templates } from '@letar/forms/templates'\n *\n * <Form.FromTemplate\n * template={templates.contactForm}\n * onSubmit={handleSubmit}\n * submitLabel=\"Отправить\"\n * />\n * ```\n *\n * @example С override\n * ```tsx\n * <Form.FromTemplate\n * template={templates.registerForm}\n * override={{ exclude: ['confirmPassword'] }}\n * onSubmit={handleSubmit}\n * />\n * ```\n */\nexport function FormFromTemplate<T extends Record<string, unknown>>({\n template,\n onSubmit,\n initialValue,\n override,\n submitLabel = 'Отправить',\n debug = false,\n}: FormFromTemplateProps<T>): ReactElement {\n const mergedInitialValue = initialValue\n ? { ...template.defaultValues, ...initialValue }\n : template.defaultValues\n\n return (\n <Form.FromSchema\n schema={template.schema}\n initialValue={mergedInitialValue}\n onSubmit={onSubmit}\n exclude={override?.exclude}\n debug={debug}\n submitLabel={submitLabel}\n />\n )\n}\n","'use client'\n\nimport { z } from 'zod/v4'\nimport type { FormTemplate } from './template-types'\n\n// ============================================================================\n// Auth шаблоны\n// ============================================================================\n\nconst loginSchema = z.object({\n email: z.email('Некорректный email'),\n password: z.string().min(6, 'Минимум 6 символов'),\n}).strip()\n\nexport const loginForm: FormTemplate = {\n name: 'loginForm',\n title: 'Вход',\n description: 'Форма входа: email + пароль',\n category: 'auth',\n schema: loginSchema,\n defaultValues: { email: '', password: '' },\n renderFields: () => null, // Рендеринг через FormFromTemplate\n}\n\nconst registerSchema = z.object({\n name: z.string().min(2, 'Минимум 2 символа'),\n email: z.email('Некорректный email'),\n password: z.string().min(8, 'Минимум 8 символов'),\n confirmPassword: z.string(),\n}).strip().refine((d) => d.password === d.confirmPassword, {\n message: 'Пароли не совпадают',\n path: ['confirmPassword'],\n})\n\nexport const registerForm: FormTemplate = {\n name: 'registerForm',\n title: 'Регистрация',\n description: 'Форма регистрации: имя, email, пароль, подтверждение',\n category: 'auth',\n schema: registerSchema,\n defaultValues: { name: '', email: '', password: '', confirmPassword: '' },\n renderFields: () => null,\n}\n\nconst forgotPasswordSchema = z.object({\n email: z.email('Некорректный email'),\n}).strip()\n\nexport const forgotPasswordForm: FormTemplate = {\n name: 'forgotPasswordForm',\n title: 'Восстановление пароля',\n description: 'Форма восстановления пароля: email',\n category: 'auth',\n schema: forgotPasswordSchema,\n defaultValues: { email: '' },\n renderFields: () => null,\n}\n\n// ============================================================================\n// Feedback шаблоны\n// ============================================================================\n\nconst contactSchema = z.object({\n name: z.string().min(2, 'Введите имя'),\n email: z.email('Некорректный email'),\n phone: z.string().optional(),\n message: z.string().min(10, 'Минимум 10 символов'),\n}).strip()\n\nexport const contactForm: FormTemplate = {\n name: 'contactForm',\n title: 'Контактная форма',\n description: 'Обратная связь: имя, email, телефон, сообщение',\n category: 'feedback',\n schema: contactSchema,\n defaultValues: { name: '', email: '', phone: '', message: '' },\n renderFields: () => null,\n}\n\nconst feedbackSchema = z.object({\n rating: z.number().min(1).max(5),\n category: z.string().min(1, 'Выберите категорию'),\n message: z.string().min(5, 'Опишите подробнее'),\n email: z.email().optional(),\n}).strip()\n\nexport const feedbackForm: FormTemplate = {\n name: 'feedbackForm',\n title: 'Отзыв',\n description: 'Форма отзыва: рейтинг, категория, сообщение',\n category: 'feedback',\n schema: feedbackSchema,\n defaultValues: { rating: 0, category: '', message: '', email: '' },\n renderFields: () => null,\n}\n\n// ============================================================================\n// Survey шаблоны\n// ============================================================================\n\nconst npsSchema = z.object({\n score: z.number().min(0).max(10),\n reason: z.string().optional(),\n email: z.email().optional(),\n}).strip()\n\nexport const npsForm: FormTemplate = {\n name: 'npsForm',\n title: 'NPS-опрос',\n description: 'Net Promoter Score: оценка 0-10, причина, email',\n category: 'survey',\n schema: npsSchema,\n defaultValues: { score: 0, reason: '', email: '' },\n renderFields: () => null,\n}\n\n// ============================================================================\n// Business шаблоны\n// ============================================================================\n\nconst companyRegistrationSchema = z.object({\n inn: z.string().min(10, 'Введите ИНН'),\n kpp: z.string().optional(),\n ogrn: z.string().optional(),\n name: z.string().min(2, 'Введите название'),\n address: z.string().min(5, 'Введите адрес'),\n bik: z.string().optional(),\n account: z.string().optional(),\n corrAccount: z.string().optional(),\n}).strip()\n\nexport const companyRegistrationForm: FormTemplate = {\n name: 'companyRegistration',\n title: 'Регистрация компании',\n description: 'Реквизиты: ИНН, КПП, ОГРН, название, адрес, банковские реквизиты',\n category: 'business',\n schema: companyRegistrationSchema,\n defaultValues: { inn: '', kpp: '', ogrn: '', name: '', address: '', bik: '', account: '', corrAccount: '' },\n renderFields: () => null,\n}\n\n// ============================================================================\n// E-commerce шаблоны\n// ============================================================================\n\nconst orderItemSchema = z.object({\n product: z.string().min(1),\n qty: z.number().min(1),\n price: z.number().min(0),\n})\n\nconst orderSchema = z.object({\n customer: z.string().min(2, 'Введите имя'),\n email: z.email('Некорректный email'),\n phone: z.string().optional(),\n address: z.string().min(5, 'Введите адрес'),\n items: z.array(orderItemSchema).min(1, 'Добавьте хотя бы один товар'),\n comment: z.string().optional(),\n}).strip()\n\nexport const orderForm: FormTemplate = {\n name: 'orderForm',\n title: 'Заказ',\n description: 'Оформление заказа: клиент, адрес, товары',\n category: 'ecommerce',\n schema: orderSchema,\n defaultValues: {\n customer: '',\n email: '',\n phone: '',\n address: '',\n items: [{ product: '', qty: 1, price: 0 }],\n comment: '',\n },\n renderFields: () => null,\n}\n\n// ============================================================================\n// Profile шаблоны\n// ============================================================================\n\nconst profileSchema = z.object({\n firstName: z.string().min(2, 'Введите имя'),\n lastName: z.string().min(2, 'Введите фамилию'),\n email: z.email('Некорректный email'),\n phone: z.string().optional(),\n}).strip()\n\nexport const profileForm: FormTemplate = {\n name: 'profileForm',\n title: 'Профиль',\n description: 'Личные данные: имя, фамилия, email, телефон',\n category: 'profile',\n schema: profileSchema,\n defaultValues: { firstName: '', lastName: '', email: '', phone: '' },\n renderFields: () => null,\n}\n\n// ============================================================================\n// Address шаблоны\n// ============================================================================\n\nconst addressSchema = z.object({\n country: z.string().min(1, 'Выберите страну'),\n city: z.string().min(2, 'Введите город'),\n street: z.string().min(3, 'Введите улицу'),\n building: z.string().min(1, 'Введите дом'),\n apartment: z.string().optional(),\n zip: z.string().optional(),\n}).strip()\n\nexport const addressForm: FormTemplate = {\n name: 'addressForm',\n title: 'Адрес',\n description: 'Адрес доставки: страна, город, улица, дом, квартира, индекс',\n category: 'address',\n schema: addressSchema,\n defaultValues: { country: '', city: '', street: '', building: '', apartment: '', zip: '' },\n renderFields: () => null,\n}\n\n// ============================================================================\n// Все шаблоны\n// ============================================================================\n\nexport const templates = {\n loginForm,\n registerForm,\n forgotPasswordForm,\n contactForm,\n feedbackForm,\n npsForm,\n companyRegistration: companyRegistrationForm,\n orderForm,\n profileForm,\n addressForm,\n} as const\n","'use client'\n\nimport { Skeleton } from '@chakra-ui/react'\nimport type { ComponentType } from 'react'\nimport { lazy, Suspense } from 'react'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyComponent = ComponentType<any>\n\ntype LazyImportFn<T> = () => Promise<{ default: T } | T>\n\n/**\n * Creates ленивый component с встроенным Suspense и Skeleton fallback\n *\n * Supports как default export, так и named export (object модуля)\n *\n * @example\n * ```tsx\n * const LazySelect = createLazyComponent(\n * () => import('./select-type').then(m => m.SelectType),\n * '40px'\n * )\n *\n * // Использование\n * <LazySelect name=\"type\" label=\"Type\" />\n * ```\n */\nexport function createLazyComponent<T extends AnyComponent>(\n importFn: LazyImportFn<T>,\n fallbackHeight = '40px'\n): ComponentType<React.ComponentProps<T>> {\n const LazyComponent = lazy(async () => {\n const module = await importFn()\n // Поддержка default и named exports\n if (module && typeof module === 'object' && 'default' in module) {\n return module as { default: T }\n }\n // Если вернули сам component (named export)\n return { default: module as T }\n })\n\n // Wrapper с Suspense\n function LazyWrapper(props: React.ComponentProps<T>) {\n return (\n <Suspense fallback={<Skeleton height={fallbackHeight} borderRadius=\"md\" />}>\n <LazyComponent {...props} />\n </Suspense>\n )\n }\n\n LazyWrapper.displayName = `Lazy(${importFn.name || 'Component'})`\n\n return LazyWrapper\n}\n\n/**\n * Преобразует object с функциями динамического импорта в object с lazy компоненthereи\n *\n * @example\n * ```tsx\n * const lazySelects = createLazyComponents({\n * Type: () => import('./select-type').then(m => m.SelectType),\n * Status: () => import('./select-status').then(m => m.SelectStatus),\n * })\n *\n * // Result:\n * lazySelects.Type // LazyWrapper с встроенным Suspense\n * lazySelects.Status // LazyWrapper с встроенным Suspense\n * ```\n */\nexport function createLazyComponents<T extends Record<string, LazyImportFn<AnyComponent>>>(\n imports: T,\n fallbackHeight = '40px'\n): { [K in keyof T]: AnyComponent } {\n return Object.entries(imports).reduce(\n (acc, [name, importFn]) => ({\n ...acc,\n [name]: createLazyComponent(importFn, fallbackHeight),\n }),\n {} as { [K in keyof T]: AnyComponent }\n )\n}\n\n/** Type for lazy import function */\nexport type LazyComponentImport<T extends AnyComponent = AnyComponent> = LazyImportFn<T>\n","'use client'\n\nimport type { ComponentType, ReactElement, ReactNode } from 'react'\nimport { CaptchaContext } from '../captcha/captcha-context'\nimport { CaptchaField } from '../captcha/captcha-field'\nimport type { CaptchaConfig, CaptchaFieldProps } from '../captcha/types'\nimport type { AutoFieldsProps } from './form-auto-fields'\nimport type { ResetButtonProps } from './form-buttons'\nimport type {\n AutocompleteFieldProps,\n CheckboxCardFieldProps,\n ColorPickerFieldProps,\n ComboboxFieldProps,\n DateRangeFieldProps,\n EditableFieldProps,\n FileUploadFieldProps,\n ImageChoiceFieldProps,\n LikertFieldProps,\n ListboxFieldProps,\n MatrixChoiceFieldProps,\n NativeSelectFieldProps,\n PinInputFieldProps,\n RadioCardFieldProps,\n RadioGroupFieldProps,\n RatingFieldProps,\n RichTextFieldProps,\n ScheduleFieldProps,\n SegmentedGroupFieldProps,\n SelectFieldProps,\n SliderFieldProps,\n TagsFieldProps,\n YesNoFieldProps,\n} from './form-fields'\nimport type { CreditCardFieldProps } from './form-fields/specialized/credit-card'\nimport type { DataGridFieldProps, TableEditorFieldProps } from './form-fields/table'\nimport type { FormFromSchemaProps } from './form-from-schema'\nimport type {\n FormStepsIndicatorProps,\n FormStepsNavigationProps,\n FormStepsProps,\n FormStepsStepProps,\n} from './form-steps'\nimport { Form } from './index'\nimport { createLazyComponents, type LazyComponentImport } from './lazy-component'\nimport type {\n AddressFieldProps,\n CheckboxFieldProps,\n CurrencyFieldProps,\n DateFieldProps,\n DateTimePickerFieldProps,\n DurationFieldProps,\n FormGroupListDeclarativeProps,\n FormPropsWithApi,\n MaskedInputFieldProps,\n NumberFieldProps,\n NumberInputFieldProps,\n OTPInputFieldProps,\n PasswordFieldProps,\n PasswordStrengthFieldProps,\n PercentageFieldProps,\n PhoneFieldProps,\n StringFieldProps,\n SubmitButtonProps,\n SwitchFieldProps,\n TextareaFieldProps,\n TimeFieldProps,\n} from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyComponent = ComponentType<any>\n\ninterface CreateFormOptions {\n /** Extra field components to add to Form.Field */\n extraFields?: Record<string, AnyComponent>\n /** Extra button components to add to Form.Button */\n extraButtons?: Record<string, AnyComponent>\n /** Extra select components to add to Form.Select (synchronous) */\n extraSelects?: Record<string, AnyComponent>\n /** Extra combobox components to add to Form.Combobox (synchronous) */\n extraComboboxes?: Record<string, AnyComponent>\n /** Extra listbox components to add to Form.Listbox (synchronous) */\n extraListboxes?: Record<string, AnyComponent>\n /**\n * Default address suggestion provider for Form.Field.Address and Form.Field.City.\n * Set once here instead of passing `provider` prop to every field.\n *\n * @example\n * ```tsx\n * import { createForm, createDaDataProvider } from '@letar/forms'\n *\n * const AppForm = createForm({\n * addressProvider: createDaDataProvider({ token: process.env.DADATA_TOKEN }),\n * })\n *\n * <AppForm.Field.Address name=\"address\" />\n * <AppForm.Field.City name=\"city\" />\n * ```\n */\n addressProvider?: import('./form-fields/specialized/providers').AddressProvider\n\n /**\n * Lazy Select components — loaded only at render time\n *\n * @example\n * ```tsx\n * lazySelects: {\n * Type: () => import('./selects/select-type').then(m => m.SelectType),\n * Status: () => import('./selects/select-status').then(m => m.SelectStatus),\n * }\n * ```\n */\n lazySelects?: Record<string, LazyComponentImport>\n\n /**\n * Lazy Combobox components — loaded only at render time\n *\n * @example\n * ```tsx\n * lazyComboboxes: {\n * User: () => import('./comboboxes/combobox-user').then(m => m.ComboboxUser),\n * }\n * ```\n */\n lazyComboboxes?: Record<string, LazyComponentImport>\n\n /**\n * Настройки CAPTCHA по умолчанию для всех форм приложения.\n * Можно переопределить на уровне конкретной формы через пропсы <Form.Captcha>.\n *\n * @example\n * ```tsx\n * const AppForm = createForm({\n * captcha: {\n * provider: 'turnstile',\n * siteKey: process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY!,\n * theme: 'auto',\n * },\n * })\n *\n * // <AppForm.Captcha /> без пропсов использует настройки из createForm\n * ```\n */\n captcha?: CaptchaConfig\n\n /**\n * Lazy Listbox components — loaded only at render time\n *\n * @example\n * ```tsx\n * lazyListboxes: {\n * Tags: () => import('./listboxes/listbox-tags').then(m => m.ListboxTags),\n * }\n * ```\n */\n lazyListboxes?: Record<string, LazyComponentImport>\n}\n\ninterface ListButton {\n Add: AnyComponent\n Remove: AnyComponent\n DragHandle: AnyComponent\n}\n\ninterface ExtendedFormGroupList {\n (props: FormGroupListDeclarativeProps): ReactElement\n Button: ListButton\n}\n\ninterface ExtendedFormGroup {\n (props: { name: string; children: ReactNode }): ReactElement\n List: ExtendedFormGroupList\n}\n\ninterface ExtendedFormField {\n String: (props: StringFieldProps) => ReactElement\n Number: (props: NumberFieldProps) => ReactElement\n NumberInput: (props: NumberInputFieldProps) => ReactElement\n Currency: (props: CurrencyFieldProps) => ReactElement\n Percentage: (props: PercentageFieldProps) => ReactElement\n MaskedInput: (props: MaskedInputFieldProps) => ReactElement\n Phone: (props: PhoneFieldProps) => ReactElement\n Address: (props: AddressFieldProps) => ReactElement\n Textarea: (props: TextareaFieldProps) => ReactElement\n Date: (props: DateFieldProps) => ReactElement\n DateRange: (props: DateRangeFieldProps) => ReactElement\n DateTimePicker: (props: DateTimePickerFieldProps) => ReactElement\n Time: (props: TimeFieldProps) => ReactElement\n Duration: (props: DurationFieldProps) => ReactElement\n Password: (props: PasswordFieldProps) => ReactElement\n PasswordStrength: (props: PasswordStrengthFieldProps) => ReactElement\n PinInput: (props: PinInputFieldProps) => ReactElement\n OTPInput: (props: OTPInputFieldProps) => ReactElement\n Slider: (props: SliderFieldProps) => ReactElement\n Select: (props: SelectFieldProps) => ReactElement\n NativeSelect: <T extends string>(props: NativeSelectFieldProps<T>) => ReactElement\n Combobox: <T extends string, TData = unknown>(props: ComboboxFieldProps<T, TData>) => ReactElement\n Autocomplete: <TData = unknown>(props: AutocompleteFieldProps<TData>) => ReactElement\n Listbox: <T extends string>(props: ListboxFieldProps<T>) => ReactElement\n RadioGroup: <T extends string>(props: RadioGroupFieldProps<T>) => ReactElement\n RadioCard: <T extends string>(props: RadioCardFieldProps<T>) => ReactElement\n Rating: (props: RatingFieldProps) => ReactElement\n SegmentedGroup: <T extends string>(props: SegmentedGroupFieldProps<T>) => ReactElement\n Checkbox: (props: CheckboxFieldProps) => ReactElement\n CheckboxCard: <T extends string>(props: CheckboxCardFieldProps<T>) => ReactElement\n Switch: (props: SwitchFieldProps) => ReactElement\n ColorPicker: (props: ColorPickerFieldProps) => ReactElement\n Editable: (props: EditableFieldProps) => ReactElement\n Schedule: (props: ScheduleFieldProps) => ReactElement\n FileUpload: (props: FileUploadFieldProps) => ReactElement\n RichText: (props: RichTextFieldProps) => ReactElement\n Tags: (props: TagsFieldProps) => ReactElement\n MatrixChoice: (props: MatrixChoiceFieldProps) => ReactElement\n ImageChoice: (props: ImageChoiceFieldProps) => ReactElement\n Likert: (props: LikertFieldProps) => ReactElement\n YesNo: (props: YesNoFieldProps) => ReactElement\n TableEditor: (props: TableEditorFieldProps) => ReactElement\n DataGrid: (props: DataGridFieldProps) => ReactElement\n CreditCard: (props: CreditCardFieldProps) => ReactElement\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormButton {\n Submit: (props: SubmitButtonProps) => ReactElement\n Reset: (props: ResetButtonProps) => ReactElement\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormSelect {\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormCombobox {\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormListbox {\n [key: string]: AnyComponent\n}\n\ninterface ExtendedFormSteps {\n (props: FormStepsProps): ReactElement\n Step: (props: FormStepsStepProps) => ReactElement\n Indicator: (props: FormStepsIndicatorProps) => ReactElement\n Navigation: (props: FormStepsNavigationProps) => ReactElement\n CompletedContent: (props: { children: ReactNode }) => ReactElement\n}\n\nexport interface ExtendedForm {\n <TData extends object>(props: FormPropsWithApi<TData>): ReactElement\n Group: ExtendedFormGroup\n Field: ExtendedFormField\n Button: ExtendedFormButton\n Select: ExtendedFormSelect\n Combobox: ExtendedFormCombobox\n Listbox: ExtendedFormListbox\n Errors: (props: { title?: ReactNode }) => ReactElement | null\n DirtyGuard: (props: {\n message?: string\n dialogTitle?: string\n dialogDescription?: string\n confirmText?: string\n cancelText?: string\n enabled?: boolean\n onBlock?: () => boolean | void\n }) => ReactElement | null\n When: <TValue = unknown>(props: {\n field: string\n is?: TValue\n isNot?: TValue\n in?: TValue[]\n notIn?: TValue[]\n condition?: (value: TValue) => boolean\n children: ReactNode\n fallback?: ReactNode\n }) => ReactNode\n Steps: ExtendedFormSteps\n Captcha: (props: CaptchaFieldProps) => ReactElement | null\n AutoFields: (props: AutoFieldsProps) => ReactElement\n FromSchema: <TData extends object>(props: FormFromSchemaProps<TData>) => ReactElement\n}\n\n/**\n * Create an extended Form component with app-specific fields\n *\n * @example\n * ```tsx\n * // In your app\n * import { createForm } from '@lena/form-components'\n * import { SelectType } from './select-type'\n * import { ComboboxInstructor } from './combobox-instructor'\n * import { ListboxLicenseCategories } from './listbox-license-categories'\n *\n * export const AppForm = createForm({\n * extraSelects: { Type: SelectType },\n * extraComboboxes: { Instructor: ComboboxInstructor },\n * extraListboxes: { LicenseCategories: ListboxLicenseCategories },\n * })\n *\n * // Usage\n * <AppForm initialValue={data} onSubmit={save}>\n * <AppForm.Select.Type name=\"type\" />\n * <AppForm.Combobox.Instructor name=\"instructorId\" />\n * <AppForm.Listbox.LicenseCategories name=\"categories\" />\n * <AppForm.Field.String name=\"title\" />\n * <AppForm.Button.Submit />\n * </AppForm>\n * ```\n */\nexport function createForm(options: CreateFormOptions = {}): ExtendedForm {\n const {\n extraFields = {},\n extraButtons = {},\n extraSelects = {},\n extraComboboxes = {},\n extraListboxes = {},\n lazySelects = {},\n lazyComboboxes = {},\n lazyListboxes = {},\n addressProvider,\n captcha,\n } = options\n\n // Create lazy wrappers for components\n const lazySelectComponents = createLazyComponents(lazySelects)\n const lazyComboboxComponents = createLazyComponents(lazyComboboxes)\n const lazyListboxComponents = createLazyComponents(lazyListboxes)\n\n const ExtendedField = {\n ...Form.Field,\n ...extraFields,\n }\n\n const ExtendedButton = {\n ...Form.Button,\n ...extraButtons,\n }\n\n // Merge synchronous and lazy components\n const ExtendedSelect = {\n ...extraSelects,\n ...lazySelectComponents,\n }\n\n const ExtendedCombobox = {\n ...extraComboboxes,\n ...lazyComboboxComponents,\n }\n\n const ExtendedListbox = {\n ...extraListboxes,\n ...lazyListboxComponents,\n }\n\n const ExtendedForm = Object.assign(\n // Root component — оборачивает в CaptchaContext если captcha задан\n function ExtendedFormRoot<TData extends object>(props: FormPropsWithApi<TData>) {\n // Inject addressProvider from createForm if not set on Form props\n const mergedProps = addressProvider && !props.addressProvider ? { ...props, addressProvider } : props\n const formElement = Form(mergedProps)\n\n // Оборачиваем в CaptchaContext если captcha конфиг задан\n if (captcha) {\n return <CaptchaContext value={captcha}>{formElement}</CaptchaContext>\n }\n\n return formElement\n },\n {\n Group: Form.Group,\n Field: ExtendedField,\n Button: ExtendedButton,\n Select: ExtendedSelect,\n Combobox: ExtendedCombobox,\n Listbox: ExtendedListbox,\n Errors: Form.Errors,\n DebugValues: Form.DebugValues,\n DirtyGuard: Form.DirtyGuard,\n Captcha: CaptchaField,\n When: Form.When,\n Steps: Form.Steps,\n AutoFields: Form.AutoFields,\n FromSchema: Form.FromSchema,\n }\n )\n\n return ExtendedForm as ExtendedForm\n}\n","'use client'\n\nimport { useCallback, useSyncExternalStore } from 'react'\nimport { useFormGroup } from '../form-group'\nimport { useDeclarativeForm } from './form-context'\n\n// Stable fallback for fieldMeta — prevents infinite loop in useSyncExternalStore.\n// If creating a new object in getSnapshot each time, Object.is comparison returns false,\n// and React will infinitely re-render the component.\nconst EMPTY_FIELD_META = Object.freeze({ errors: [], isTouched: false })\n\n/**\n * Result type for useFieldActions hook\n */\nexport interface FieldActionsResult<TValue = unknown> {\n /** Current field value */\n value: TValue\n /** Set field value */\n onChange: (value: TValue) => void\n /** Set field error */\n setError: (error: string) => void\n /** Clear field error */\n clearError: () => void\n /** Trigger field validation */\n validate: () => Promise<void>\n /** Whether field is touched */\n isTouched: boolean\n /** Whether field has errors */\n hasError: boolean\n /** Current field errors (array) */\n errors: string[]\n}\n\n/**\n * Hook for imperative field actions.\n *\n * Useful for custom field actions like geolocation detection,\n * async value fetching, or programmatic field manipulation.\n *\n * @param fieldName - Field name (relative to current group context)\n * @returns Field actions object with value, onChange, setError, etc.\n *\n * @example Basic usage with geolocation\n * ```tsx\n * function CityField() {\n * const { value, onChange, setError } = useFieldActions('city')\n *\n * const handleDetect = async () => {\n * const result = await detectLocation()\n * if (result.error) {\n * setError(result.error)\n * } else {\n * onChange(result.city)\n * }\n * }\n *\n * return (\n * <HStack>\n * <Form.Field.String name=\"city\" label=\"City\" />\n * <Button onClick={handleDetect}>\n * <LuMapPin />\n * </Button>\n * </HStack>\n * )\n * }\n * ```\n *\n * @example Async value fetching\n * ```tsx\n * function CompanyField() {\n * const { onChange, setError } = useFieldActions('company')\n * const [isLoading, setIsLoading] = useState(false)\n *\n * const handleLookup = async (inn: string) => {\n * setIsLoading(true)\n * try {\n * const company = await lookupByInn(inn)\n * onChange(company.name)\n * } catch (e) {\n * setError('Company not found')\n * } finally {\n * setIsLoading(false)\n * }\n * }\n *\n * return <Button onClick={() => handleLookup('1234567890')} loading={isLoading}>Lookup</Button>\n * }\n * ```\n */\nexport function useFieldActions<TValue = unknown>(fieldName: string): FieldActionsResult<TValue> {\n const { form } = useDeclarativeForm()\n const parentGroup = useFormGroup()\n\n // Build full field path\n const fullPath = parentGroup ? `${parentGroup.name}.${fieldName}` : fieldName\n\n // Get nested value from form state\n const getNestedValue = useCallback(\n (values: Record<string, unknown>): TValue => {\n const parts = fullPath.split('.')\n let result: unknown = values\n for (const part of parts) {\n if (result && typeof result === 'object') {\n result = (result as Record<string, unknown>)[part]\n } else {\n return undefined as TValue\n }\n }\n return result as TValue\n },\n [fullPath]\n )\n\n // Подписка на store — выносим useCallback ДО useSyncExternalStore\n // (React 19 запрещает вызов хуков inside аргументов других хуков)\n // TanStack Store v0.9+ returns { unsubscribe }, а не функцию\n const subscribe = useCallback(\n (callback: () => void) => {\n const subscription = form.store.subscribe(callback)\n if (typeof subscription === 'function') {\n return subscription\n }\n return () => subscription.unsubscribe()\n },\n [form]\n )\n\n const getValueSnapshot = useCallback(\n () => getNestedValue(form.state.values as Record<string, unknown>),\n [form, getNestedValue]\n )\n\n const getMetaSnapshot = useCallback(() => {\n const meta = form.store.state.fieldMeta[fullPath]\n return meta || EMPTY_FIELD_META\n }, [form, fullPath])\n\n // Subscribe to field value changes\n const value = useSyncExternalStore(subscribe, getValueSnapshot, getValueSnapshot)\n\n // Get field meta (errors, touched, etc.)\n const fieldMeta = useSyncExternalStore(subscribe, getMetaSnapshot, getMetaSnapshot)\n\n // Set field value\n const onChange = useCallback(\n (newValue: TValue) => {\n form.setFieldValue(fullPath, newValue)\n },\n [form, fullPath]\n )\n\n // Set field error\n const setError = useCallback(\n (error: string) => {\n form.setFieldMeta(fullPath, (prev: Record<string, unknown>) => ({\n ...prev,\n errors: [error],\n }))\n },\n [form, fullPath]\n )\n\n // Clear field error\n const clearError = useCallback(() => {\n form.setFieldMeta(fullPath, (prev: Record<string, unknown>) => ({\n ...prev,\n errors: [],\n }))\n }, [form, fullPath])\n\n // Trigger field validation\n const validate = useCallback(async () => {\n await form.validateField(fullPath, 'change')\n }, [form, fullPath])\n\n const errors = (fieldMeta.errors as string[]) || []\n\n return {\n value,\n onChange,\n setError,\n clearError,\n validate,\n isTouched: Boolean(fieldMeta.isTouched),\n hasError: errors.length > 0,\n errors,\n }\n}\n","'use client'\n\nimport { z } from 'zod/v4'\nimport type { FieldUIMeta } from './types/meta-types'\nimport { unwrapSchema } from './zod-utils'\n\n/**\n * UI metadata configuration for flat schemas (top-level fields only)\n */\nexport type UIMetaConfig<T extends z.ZodRawShape> = {\n [K in keyof T]?: FieldUIMeta\n}\n\n/** Mutable type for creating a new shape */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MutableShape = { [key: string]: any }\n\n/**\n * UI metadata configuration with nested object support\n * For nested objects, use _meta for the group's own metadata\n */\nexport type DeepUIMetaConfig<T extends z.ZodRawShape> = {\n [K in keyof T]?: FieldUIMeta | ({ _meta?: FieldUIMeta } & Record<string, FieldUIMeta | unknown>)\n}\n\n/**\n * Check if a schema is a ZodObject\n */\nfunction isZodObject(schema: unknown): boolean {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (schema as any)?._zod?.def?.type === 'object'\n}\n\n/**\n * Check if the configuration contains nested settings\n */\nfunction hasNestedConfig(config: unknown): boolean {\n if (typeof config !== 'object' || config === null) {\n return false\n }\n\n // If _meta exists — this is definitely a nested configuration\n if ('_meta' in config) {\n return true\n }\n\n // Check for nested objects with title/fieldType\n // Exclude standard FieldUIMeta fields\n const fieldUIMetaKeys = ['title', 'description', 'placeholder', 'tooltip', 'fieldType', 'fieldProps']\n\n for (const [key, value] of Object.entries(config)) {\n // Skip standard FieldUIMeta fields\n if (fieldUIMetaKeys.includes(key)) {\n continue\n }\n\n // If the value is an object with title/fieldType/description, it's a nested configuration\n if (typeof value === 'object' && value !== null) {\n if ('title' in value || 'fieldType' in value || 'description' in value) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Enrich ZenStack/Zod schema with UI metadata\n *\n * Adds .meta({ ui: {...} }) to schema fields based on configuration.\n * Works only with top-level fields.\n *\n * @example Basic usage\n * ```ts\n * import { ProductCreateInputSchema } from '@/generated/zod/objects/ProductCreateInput.schema'\n *\n * const ProductFormSchema = withUIMeta(ProductCreateInputSchema, {\n * name: { title: 'Name', placeholder: 'Enter name' },\n * price: { title: 'Price', fieldType: 'currency', fieldProps: { currency: 'RUB' } },\n * isActive: { title: 'Active', fieldType: 'switch' },\n * })\n * ```\n *\n * @example With enum fields\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * role: {\n * title: 'Role',\n * fieldType: 'radioCard',\n * fieldProps: {\n * options: [\n * { value: 'ADMIN', label: 'Administrator' },\n * { value: 'USER', label: 'User' },\n * ],\n * },\n * },\n * })\n * ```\n *\n * @param schema Zod object schema\n * @param config UI metadata configuration for fields\n * @returns New schema with added metadata\n */\nexport function withUIMeta<T extends z.ZodRawShape>(schema: z.ZodObject<T>, config: UIMetaConfig<T>): z.ZodObject<T> {\n const shape = schema.shape\n const newShape: MutableShape = {}\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const meta = config[key as keyof T]\n if (meta) {\n // Add .meta({ ui: {...} }) to field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newShape[key] = (fieldSchema as any).meta({ ui: meta })\n } else {\n newShape[key] = fieldSchema\n }\n }\n\n // Preserve strict/passthrough mode if it was set\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const unknownKeys = (schema as any)._zod?.def?.unknownKeys\n if (unknownKeys === 'strict') {\n return z.object(newShape).strict() as z.ZodObject<T>\n }\n if (unknownKeys === 'passthrough') {\n return z.object(newShape).passthrough() as z.ZodObject<T>\n }\n\n return z.object(newShape) as z.ZodObject<T>\n}\n\n/**\n * Enrich ZenStack/Zod schema with UI metadata with nested object support\n *\n * Extended version of withUIMeta that recursively processes nested objects.\n * Use the `_meta` key for nested group metadata.\n *\n * @example With nested objects\n * ```ts\n * const UserFormSchema = withUIMetaDeep(UserCreateInputSchema, {\n * firstName: { title: 'First Name' },\n * lastName: { title: 'Last Name' },\n * address: {\n * _meta: { title: 'Shipping Address' }, // meta for the group\n * country: { title: 'Country', fieldType: 'select' },\n * city: { title: 'City' },\n * street: { title: 'Street' },\n * },\n * })\n * ```\n *\n * @example Deep nesting\n * ```ts\n * const OrderFormSchema = withUIMetaDeep(OrderCreateInputSchema, {\n * orderNumber: { title: 'Order Number' },\n * user: {\n * _meta: { title: 'Customer Data' },\n * firstName: { title: 'First Name' },\n * address: {\n * _meta: { title: 'Address' },\n * city: { title: 'City' },\n * },\n * },\n * })\n * ```\n *\n * @param schema Zod object schema\n * @param config UI metadata configuration (can be nested)\n * @returns New schema with added metadata\n */\nexport function withUIMetaDeep<T extends z.ZodRawShape>(\n schema: z.ZodObject<T>,\n config: DeepUIMetaConfig<T>\n): z.ZodObject<T> {\n const shape = schema.shape\n const newShape: MutableShape = {}\n\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const fieldConfig = config[key as keyof T]\n\n if (!fieldConfig) {\n newShape[key] = fieldSchema\n continue\n }\n\n // Get unwrapped schema to check type\n const unwrapped = unwrapSchema(fieldSchema)\n\n // Check if this is a nested object or a regular field\n if (isZodObject(unwrapped) && hasNestedConfig(fieldConfig)) {\n // This is a nested object with field configuration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { _meta, ...nestedConfig } = fieldConfig as { _meta?: FieldUIMeta } & Record<string, any>\n\n // Recursively process nested object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let nestedSchema = withUIMetaDeep(unwrapped as any, nestedConfig)\n\n // Apply _meta to the field itself (for group label)\n if (_meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nestedSchema = (nestedSchema as any).meta({ ui: _meta })\n }\n\n // Restore wrappers (optional, nullable, default)\n newShape[key] = rewrapSchema(fieldSchema, nestedSchema)\n } else {\n // Regular field — just add meta\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newShape[key] = (fieldSchema as any).meta({ ui: fieldConfig as FieldUIMeta })\n }\n }\n\n // Preserve strict/passthrough mode if it was set\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const unknownKeys = (schema as any)._zod?.def?.unknownKeys\n if (unknownKeys === 'strict') {\n return z.object(newShape).strict() as z.ZodObject<T>\n }\n if (unknownKeys === 'passthrough') {\n return z.object(newShape).passthrough() as z.ZodObject<T>\n }\n\n return z.object(newShape) as z.ZodObject<T>\n}\n\n/**\n * Restore wrappers (optional, nullable, default) around a new inner schema\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction rewrapSchema(original: any, newInner: any): any {\n if (!original?._zod?.def) {\n return newInner\n }\n\n const type = original._zod.def.type\n\n if (type === 'optional') {\n return rewrapSchema(original._zod.def.inner, newInner).optional()\n }\n if (type === 'nullable') {\n return rewrapSchema(original._zod.def.inner, newInner).nullable()\n }\n if (type === 'default') {\n const defaultValue = original._zod.def.defaultValue\n return rewrapSchema(original._zod.def.inner, newInner).default(defaultValue)\n }\n\n return newInner\n}\n","'use client'\n\nimport type { FieldComponentType, FieldUIMeta } from './types/meta-types'\n\n/**\n * Ready-made presets for system fields (id, createdAt, updatedAt)\n *\n * @example\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * ...commonMeta, // Adds id, createdAt, updatedAt\n * name: { title: 'Name' },\n * })\n * ```\n */\nexport const commonMeta: Record<string, FieldUIMeta> = {\n id: {\n title: 'ID',\n fieldType: 'string',\n fieldProps: { disabled: true },\n },\n createdAt: {\n title: 'Created',\n fieldType: 'date',\n fieldProps: { readOnly: true },\n },\n updatedAt: {\n title: 'Updated',\n fieldType: 'date',\n fieldProps: { readOnly: true },\n },\n}\n\n/**\n * Field types for selection from a list (enum/select)\n */\nexport type SelectionFieldType = Extract<\n FieldComponentType,\n 'select' | 'nativeSelect' | 'radioGroup' | 'radioCard' | 'segmentedGroup' | 'checkboxCard' | 'listbox'\n>\n\n/**\n * Helper for creating UI metadata for relation fields\n *\n * @example\n * ```ts\n * const OrderFormSchema = withUIMeta(OrderCreateInputSchema, {\n * categoryId: relationMeta({\n * title: 'Category',\n * model: 'Category',\n * labelField: 'name',\n * }),\n * })\n * ```\n *\n * @example With custom field type\n * ```ts\n * categoryId: relationMeta({\n * title: 'Category',\n * model: 'Category',\n * labelField: 'name',\n * fieldType: 'combobox',\n * })\n * ```\n */\nexport function relationMeta(config: {\n /** Field title */\n title: string\n /** Related model name */\n model: string\n /** Field to display as label */\n labelField: string\n /** Field for value (default 'id') */\n valueField?: string\n /** Component type for display (default 'select') */\n fieldType?: SelectionFieldType\n /** Additional props */\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n return {\n title: config.title,\n fieldType: config.fieldType ?? 'select',\n fieldProps: {\n relation: {\n model: config.model,\n labelField: config.labelField,\n valueField: config.valueField ?? 'id',\n },\n ...config.fieldProps,\n },\n }\n}\n\n/**\n * Helper for creating UI metadata for enum fields with custom labels\n *\n * @example Simple usage\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * role: enumMeta({\n * title: 'Role',\n * labels: {\n * ADMIN: 'Administrator',\n * MANAGER: 'Manager',\n * USER: 'User',\n * GUEST: 'Guest',\n * },\n * }),\n * })\n * ```\n *\n * @example With custom field type\n * ```ts\n * role: enumMeta({\n * title: 'Role',\n * fieldType: 'radioCard',\n * labels: { ADMIN: 'Administrator', USER: 'User' },\n * })\n * ```\n *\n * @example With descriptions for each option\n * ```ts\n * priority: enumMeta({\n * title: 'Priority',\n * fieldType: 'radioCard',\n * options: [\n * { value: 'LOW', label: 'Low', description: 'Do it sometime' },\n * { value: 'HIGH', label: 'High', description: 'Urgent!' },\n * ],\n * })\n * ```\n */\nexport function enumMeta<T extends string>(\n config:\n | {\n /** Field title */\n title: string\n /** Component type for display (default nativeSelect) */\n fieldType?: SelectionFieldType\n /** Mapping of enum values to custom labels */\n labels: Record<T, string>\n /** Field description */\n description?: string\n /** Additional props */\n fieldProps?: Record<string, unknown>\n }\n | {\n /** Field title */\n title: string\n /** Component type for display (default nativeSelect) */\n fieldType?: SelectionFieldType\n /** Full options with value, label and optional description */\n options: Array<{ value: T; label: string; description?: string }>\n /** Field description */\n description?: string\n /** Additional props */\n fieldProps?: Record<string, unknown>\n }\n): FieldUIMeta {\n // Determine options from labels or directly\n let options: Array<{ value: string; label: string; description?: string }>\n\n if ('labels' in config) {\n options = Object.entries(config.labels).map(([value, label]) => ({\n value,\n label: label as string,\n }))\n } else {\n options = config.options\n }\n\n return {\n title: config.title,\n description: config.description,\n fieldType: config.fieldType ?? 'nativeSelect',\n fieldProps: {\n options,\n ...config.fieldProps,\n },\n }\n}\n\n/**\n * Helper for creating UI metadata for text fields\n *\n * @example\n * ```ts\n * name: textMeta({ title: 'Name', placeholder: 'Enter name' })\n * bio: textMeta({ title: 'About', fieldType: 'richText' })\n * ```\n */\nexport function textMeta(config: {\n title: string\n placeholder?: string\n description?: string\n fieldType?: 'string' | 'textarea' | 'richText' | 'password' | 'passwordStrength' | 'editable'\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n return {\n title: config.title,\n placeholder: config.placeholder,\n description: config.description,\n fieldType: config.fieldType ?? 'string',\n fieldProps: config.fieldProps,\n }\n}\n\n/**\n * Helper for creating UI metadata for number fields\n *\n * @example\n * ```ts\n * age: numberMeta({ title: 'Age', min: 0, max: 120 })\n * price: numberMeta({ title: 'Price', fieldType: 'currency', currency: 'RUB' })\n * rating: numberMeta({ title: 'Rating', fieldType: 'rating', count: 5 })\n * ```\n */\nexport function numberMeta(config: {\n title: string\n description?: string\n fieldType?: 'number' | 'numberInput' | 'slider' | 'rating' | 'currency' | 'percentage'\n min?: number\n max?: number\n step?: number\n currency?: string\n count?: number // for rating\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n const { title, description, fieldType, min, max, step, currency, count, fieldProps = {} } = config\n\n return {\n title,\n description,\n fieldType: fieldType ?? 'number',\n fieldProps: {\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...(step !== undefined && { step }),\n ...(currency && { currency }),\n ...(count !== undefined && { count }),\n ...fieldProps,\n },\n }\n}\n\n/**\n * Helper for creating UI metadata for boolean fields\n *\n * @example\n * ```ts\n * isActive: booleanMeta({ title: 'Active', fieldType: 'switch' })\n * newsletter: booleanMeta({ title: 'Newsletter', description: 'Receive news' })\n * ```\n */\nexport function booleanMeta(config: {\n title: string\n description?: string\n fieldType?: 'checkbox' | 'switch'\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n return {\n title: config.title,\n description: config.description,\n fieldType: config.fieldType ?? 'checkbox',\n fieldProps: config.fieldProps,\n }\n}\n\n/**\n * Helper for creating UI metadata for date/time fields\n *\n * @example\n * ```ts\n * birthDate: dateMeta({ title: 'Date of birth' })\n * appointment: dateMeta({ title: 'Appointment', fieldType: 'dateTimePicker' })\n * duration: dateMeta({ title: 'Duration', fieldType: 'duration', min: 15, max: 480 })\n * ```\n */\nexport function dateMeta(config: {\n title: string\n description?: string\n fieldType?: 'date' | 'time' | 'dateRange' | 'dateTimePicker' | 'duration' | 'schedule'\n min?: number | string | Date\n max?: number | string | Date\n fieldProps?: Record<string, unknown>\n}): FieldUIMeta {\n const { title, description, fieldType, min, max, fieldProps = {} } = config\n\n return {\n title,\n description,\n fieldType: fieldType ?? 'date',\n fieldProps: {\n ...(min !== undefined && { min }),\n ...(max !== undefined && { max }),\n ...fieldProps,\n },\n }\n}\n","'use client'\n\nimport { useCallback, useState } from 'react'\n\n/**\n * Состояние conversational mode.\n */\nexport interface ConversationalState {\n /** Текущий индекс поля */\n currentIndex: number\n /** Общее количество полей */\n totalFields: number\n /** Перейти к следующему */\n next: () => void\n /** Перейти к предыдущему */\n prev: () => void\n /** Перейти к конкретному */\n goTo: (index: number) => void\n /** На первом поле */\n isFirst: boolean\n /** На последнем поле */\n isLast: boolean\n /** Завершён (прошёл все поля) */\n isCompleted: boolean\n /** Прогресс (0-1) */\n progress: number\n}\n\n/**\n * Хук состояния для conversational mode.\n */\nexport function useConversationalState(totalFields: number): ConversationalState {\n const [currentIndex, setCurrentIndex] = useState(0)\n const [isCompleted, setIsCompleted] = useState(false)\n\n const next = useCallback(() => {\n if (currentIndex < totalFields - 1) {\n setCurrentIndex((i) => i + 1)\n } else {\n setIsCompleted(true)\n }\n }, [currentIndex, totalFields])\n\n const prev = useCallback(() => {\n if (currentIndex > 0) {\n setCurrentIndex((i) => i - 1)\n }\n }, [currentIndex])\n\n const goTo = useCallback((index: number) => {\n if (index >= 0 && index < totalFields) {\n setCurrentIndex(index)\n setIsCompleted(false)\n }\n }, [totalFields])\n\n return {\n currentIndex,\n totalFields,\n next,\n prev,\n goTo,\n isFirst: currentIndex === 0,\n isLast: currentIndex === totalFields - 1,\n isCompleted,\n progress: totalFields > 0 ? (currentIndex + 1) / totalFields : 0,\n }\n}\n","'use client'\n\nimport { Box, Button, Flex, HStack, Progress, Text, VStack } from '@chakra-ui/react'\nimport { Children, type KeyboardEvent, type ReactElement, type ReactNode, useCallback, useRef } from 'react'\nimport { useConversationalState } from './use-conversational-state'\n\n/** Props для ConversationalMode */\nexport interface ConversationalModeProps {\n /** Дочерние элементы — поля формы (каждый ребёнок = один шаг) */\n children: ReactNode\n /** Welcome screen перед первым полем */\n welcomeScreen?: ReactNode\n /** Thank you screen после последнего поля */\n completedScreen?: ReactNode\n /** Текст кнопки далее */\n nextLabel?: string\n /** Текст кнопки назад */\n prevLabel?: string\n /** Текст кнопки отправки (на последнем шаге) */\n submitLabel?: string\n /** Показывать номер вопроса */\n showQuestionNumber?: boolean\n /** Показывать progress bar */\n showProgress?: boolean\n /** Callback при завершении */\n onComplete?: () => void\n}\n\n/**\n * Conversational Mode — Typeform-стиль.\n *\n * Одно поле за раз, Enter → следующее, стрелки для навигации.\n * Оборачивает дочерние элементы формы в пошаговый UI.\n *\n * @example\n * ```tsx\n * <Form initialValue={data} onSubmit={handleSubmit}>\n * <ConversationalMode\n * showProgress\n * showQuestionNumber\n * completedScreen={<Text>Спасибо!</Text>}\n * >\n * <Form.Field.String name=\"name\" label=\"Как вас зовут?\" />\n * <Form.Field.String name=\"email\" label=\"Ваш email?\" />\n * <Form.Field.YesNo name=\"subscribe\" label=\"Подписаться?\" />\n * </ConversationalMode>\n * </Form>\n * ```\n */\nexport function ConversationalMode({\n children,\n welcomeScreen,\n completedScreen,\n nextLabel = 'Далее',\n prevLabel = 'Назад',\n submitLabel = 'Отправить',\n showQuestionNumber = true,\n showProgress = true,\n onComplete,\n}: ConversationalModeProps): ReactElement {\n const childArray = Children.toArray(children)\n const state = useConversationalState(childArray.length)\n const containerRef = useRef<HTMLDivElement>(null)\n\n /** Обработка клавиш */\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n // Enter без Shift → следующее поле (кроме textarea)\n const target = e.target as HTMLElement\n if (target.tagName === 'TEXTAREA') return\n e.preventDefault()\n if (state.isLast) {\n onComplete?.()\n } else {\n state.next()\n }\n }\n if (e.key === 'ArrowUp' && e.altKey) {\n e.preventDefault()\n state.prev()\n }\n if (e.key === 'ArrowDown' && e.altKey) {\n e.preventDefault()\n state.next()\n }\n },\n [state, onComplete],\n )\n\n // Завершённое состояние\n if (state.isCompleted) {\n return (\n <VStack minH=\"300px\" justify=\"center\" align=\"center\" gap={4} py={12}>\n {completedScreen ?? <Text fontSize=\"lg\">Готово!</Text>}\n </VStack>\n )\n }\n\n const currentChild = childArray[state.currentIndex]\n\n return (\n <VStack gap={6} align=\"stretch\" ref={containerRef} onKeyDown={handleKeyDown}>\n {/* Progress bar */}\n {showProgress && (\n <Progress.Root value={state.progress * 100} size=\"xs\" colorPalette=\"blue\">\n <Progress.Track>\n <Progress.Range />\n </Progress.Track>\n </Progress.Root>\n )}\n\n {/* Номер вопроса */}\n {showQuestionNumber && (\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Вопрос {state.currentIndex + 1} из {state.totalFields}\n </Text>\n )}\n\n {/* Текущее поле с анимацией */}\n <Box\n key={state.currentIndex}\n minH=\"150px\"\n py={4}\n css={{\n animation: 'fadeInUp 0.3s ease-out',\n '@keyframes fadeInUp': {\n from: { opacity: 0, transform: 'translateY(20px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n },\n }}\n >\n {currentChild}\n </Box>\n\n {/* Навигация */}\n <Flex justify=\"space-between\" pt={2}>\n <Button\n variant=\"ghost\"\n onClick={state.prev}\n disabled={state.isFirst}\n size=\"sm\"\n >\n ← {prevLabel}\n </Button>\n <HStack gap={2}>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n Enter ↵\n </Text>\n {state.isLast\n ? (\n <Button colorPalette=\"blue\" onClick={onComplete} size=\"sm\">\n {submitLabel}\n </Button>\n )\n : (\n <Button colorPalette=\"blue\" onClick={state.next} size=\"sm\">\n {nextLabel} →\n </Button>\n )}\n </HStack>\n </Flex>\n </VStack>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\n/**\n * Конфигурация серверного автосохранения.\n */\nexport interface FormAutosaveConfig {\n /** URL endpoint для сохранения (POST/PUT) */\n endpoint: string\n /** Интервал автосохранения (мс, по умолчанию 5000) */\n interval?: number\n /** Debounce: минимальный интервал между запросами (мс, по умолчанию 1000) */\n debounce?: number\n /** ID черновика (для восстановления) */\n draftId?: string\n /** HTTP метод (по умолчанию POST) */\n method?: 'POST' | 'PUT' | 'PATCH'\n /** Дополнительные headers */\n headers?: Record<string, string>\n /** Callback при успешном сохранении */\n onSave?: (response: unknown) => void\n /** Callback при ошибке */\n onError?: (error: Error) => void\n}\n\n/**\n * Состояние автосохранения.\n */\nexport type AutosaveStatus = 'idle' | 'saving' | 'saved' | 'error'\n\n/**\n * Результат хука useFormAutosave.\n */\nexport interface UseFormAutosaveResult {\n /** Текущий статус */\n status: AutosaveStatus\n /** Время последнего сохранения */\n lastSavedAt: Date | null\n /** Текст ошибки */\n error: string | null\n /** Принудительно сохранить сейчас */\n saveNow: () => Promise<void>\n /** Загрузить черновик с сервера */\n loadDraft: () => Promise<Record<string, unknown> | null>\n}\n\n/**\n * Хук серверного автосохранения формы.\n *\n * Периодически отправляет данные формы на сервер с debounce.\n * Поддерживает восстановление черновиков и fallback на localStorage.\n *\n * @example\n * ```tsx\n * const autosave = useFormAutosave(form, {\n * endpoint: '/api/drafts',\n * draftId: 'application-123',\n * interval: 5000,\n * })\n * ```\n */\nexport function useFormAutosave(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n form: any,\n config: FormAutosaveConfig,\n): UseFormAutosaveResult {\n const {\n endpoint,\n interval = 5000,\n debounce = 1000,\n draftId,\n method = 'POST',\n headers = {},\n onSave,\n onError,\n } = config\n\n const [status, setStatus] = useState<AutosaveStatus>('idle')\n const [lastSavedAt, setLastSavedAt] = useState<Date | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n const lastSavedDataRef = useRef<string>('')\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n /** Отправить данные на сервер */\n const save = useCallback(\n async (data: unknown) => {\n const serialized = JSON.stringify(data)\n\n // Не сохраняем если данные не изменились\n if (serialized === lastSavedDataRef.current) return\n\n // Fallback на localStorage если нет сети\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n if (draftId) {\n try {\n localStorage.setItem(`autosave:${draftId}`, serialized)\n } catch { /* квота localStorage */ }\n }\n return\n }\n\n setStatus('saving')\n setError(null)\n\n try {\n const url = draftId ? `${endpoint}?draftId=${encodeURIComponent(draftId)}` : endpoint\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: serialized,\n })\n\n if (!response.ok) {\n throw new Error(`Autosave failed: ${response.status}`)\n }\n\n const result = await response.json().catch(() => null)\n lastSavedDataRef.current = serialized\n setStatus('saved')\n setLastSavedAt(new Date())\n onSave?.(result)\n\n // Очищаем localStorage fallback при успешном сохранении\n if (draftId) {\n try {\n localStorage.removeItem(`autosave:${draftId}`)\n } catch { /* игнорируем */ }\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Ошибка сохранения'\n setStatus('error')\n setError(errorMsg)\n onError?.(err instanceof Error ? err : new Error(errorMsg))\n\n // Fallback на localStorage при ошибке сети\n if (draftId) {\n try {\n localStorage.setItem(`autosave:${draftId}`, serialized)\n } catch { /* квота localStorage */ }\n }\n }\n },\n [endpoint, method, headers, draftId, onSave, onError],\n )\n\n /** Принудительное сохранение */\n const saveNow = useCallback(async () => {\n const values = form.state.values\n await save(values)\n }, [form, save])\n\n /** Загрузить черновик с сервера */\n const loadDraft = useCallback(async (): Promise<Record<string, unknown> | null> => {\n if (!draftId) return null\n\n // Сначала пробуем сервер\n if (typeof navigator === 'undefined' || navigator.onLine) {\n try {\n const url = `${endpoint}?draftId=${encodeURIComponent(draftId)}`\n const response = await fetch(url)\n if (response.ok) {\n const data = await response.json()\n return data as Record<string, unknown>\n }\n } catch { /* fallback на localStorage */ }\n }\n\n // Fallback на localStorage\n try {\n const stored = localStorage.getItem(`autosave:${draftId}`)\n if (stored) return JSON.parse(stored) as Record<string, unknown>\n } catch { /* ничего */ }\n\n return null\n }, [endpoint, draftId])\n\n /** Периодическое автосохранение */\n useEffect(() => {\n const tick = () => {\n // Debounce: не сохраняем чаще чем debounce мс\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n const values = form.state.values\n save(values)\n }, debounce)\n }\n\n timerRef.current = setInterval(tick, interval)\n\n return () => {\n if (timerRef.current) clearInterval(timerRef.current)\n if (debounceRef.current) clearTimeout(debounceRef.current)\n }\n }, [form, save, interval, debounce])\n\n return { status, lastSavedAt, error, saveNow, loadDraft }\n}\n","'use client'\n\nimport { HStack, Spinner, Text } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { AutosaveStatus } from './form-autosave'\n\n/** Props для AutosaveIndicator */\nexport interface AutosaveIndicatorProps {\n /** Статус автосохранения */\n status: AutosaveStatus\n /** Время последнего сохранения */\n lastSavedAt: Date | null\n /** Текст ошибки */\n error: string | null\n /** Кастомные тексты */\n labels?: {\n idle?: string\n saving?: string\n saved?: string\n error?: string\n }\n}\n\n/**\n * Индикатор статуса автосохранения.\n *\n * @example\n * ```tsx\n * const autosave = useFormAutosave(form, config)\n * <AutosaveIndicator status={autosave.status} lastSavedAt={autosave.lastSavedAt} error={autosave.error} />\n * ```\n */\nexport function AutosaveIndicator({\n status,\n lastSavedAt,\n error,\n labels,\n}: AutosaveIndicatorProps): ReactElement | null {\n if (status === 'idle') return null\n\n const defaultLabels = {\n idle: '',\n saving: 'Сохраняю...',\n saved: 'Сохранено',\n error: 'Ошибка сохранения',\n }\n const l = { ...defaultLabels, ...labels }\n\n return (\n <HStack gap={2} fontSize=\"xs\" color=\"fg.muted\">\n {status === 'saving' && (\n <>\n <Spinner size=\"xs\" />\n <Text>{l.saving}</Text>\n </>\n )}\n {status === 'saved' && (\n <Text color=\"green.500\">\n ✓ {l.saved}\n {lastSavedAt && ` (${lastSavedAt.toLocaleTimeString()})`}\n </Text>\n )}\n {status === 'error' && (\n <Text color=\"red.500\">\n ✕ {l.error}: {error}\n </Text>\n )}\n </HStack>\n )\n}\n","'use client'\n\nimport { CaptchaField } from '../captcha'\nimport { FormOfflineIndicator, FormSyncStatus } from '../offline'\nimport { DirtyGuard } from './dirty-guard'\nimport { FormAutoFields } from './form-auto-fields'\nimport { FormBuilder } from './form-builder'\nimport { ButtonReset, ButtonSubmit } from './form-buttons'\nimport { FormDebugValues } from './form-debug-values'\nimport { FormDivider } from './form-divider'\nimport { FormErrors } from './form-errors'\nimport {\n FieldAddress,\n FieldAuto,\n FieldAutocomplete,\n FieldCalculated,\n FieldCascadingSelect,\n FieldCheckbox,\n FieldCheckboxCard,\n FieldCity,\n FieldColorPicker,\n FieldCombobox,\n FieldCurrency,\n FieldDate,\n FieldDateRange,\n FieldDateTimePicker,\n FieldDuration,\n FieldEditable,\n FieldFileUpload,\n FieldHidden,\n FieldImageChoice,\n FieldLikert,\n FieldListbox,\n FieldMaskedInput,\n FieldMatrixChoice,\n FieldNativeSelect,\n FieldNumber,\n FieldNumberInput,\n FieldOTPInput,\n FieldPassword,\n FieldPasswordStrength,\n FieldPercentage,\n FieldPhone,\n FieldPinInput,\n FieldRadioCard,\n FieldRadioGroup,\n FieldRating,\n FieldRichText,\n FieldSchedule,\n FieldSegmentedGroup,\n FieldSelect,\n FieldSignature,\n FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTags,\n FieldTextarea,\n FieldTime,\n FieldYesNo,\n} from './form-fields'\nimport {\n FieldBankAccount,\n FieldBIK,\n FieldCorrAccount,\n FieldINN,\n FieldKPP,\n FieldOGRN,\n FieldPassport,\n FieldSNILS,\n} from './form-fields/document'\nimport { CreditCardField } from './form-fields/specialized/credit-card'\nimport { FieldDataGrid, FieldTableEditor } from './form-fields/table'\nimport { FormFromSchema } from './form-from-schema'\nimport { FormGroupDeclarative } from './form-group/form-group-declarative'\nimport { ListButtonAdd, ListButtonRemove } from './form-group/form-group-list-buttons'\nimport { FormGroupListDeclarative } from './form-group/form-group-list-declarative'\nimport { DragHandle } from './form-group/form-group-list-sortable'\nimport { FormInfoBlock } from './form-info-block'\nimport { Form as FormRoot } from './form-root'\nimport {\n FormStepsCompletedContent,\n FormStepsIndicator,\n FormStepsNavigation,\n FormSteps as FormStepsRoot,\n FormStepsStep,\n} from './form-steps'\nimport { FormWatch } from './form-watch'\nimport { FormWhen } from './form-when'\nimport { FormFromTemplate } from './templates'\n\n// List buttons compound component\nconst ListButton = {\n Add: ListButtonAdd,\n Remove: ListButtonRemove,\n DragHandle: DragHandle,\n}\n\n// FormGroupList with Button subcomponent\nconst FormGroupList = Object.assign(FormGroupListDeclarative, {\n Button: ListButton,\n})\n\n// Build compound component\nconst FormGroup = Object.assign(FormGroupDeclarative, {\n List: FormGroupList,\n})\n\nconst FormField = {\n // Auto field (DX improvement)\n Auto: FieldAuto,\n // Text fields\n String: FieldString,\n Textarea: FieldTextarea,\n Password: FieldPassword,\n PasswordStrength: FieldPasswordStrength,\n MaskedInput: FieldMaskedInput,\n Editable: FieldEditable,\n RichText: FieldRichText,\n // Number fields\n Number: FieldNumber,\n NumberInput: FieldNumberInput,\n Currency: FieldCurrency,\n Percentage: FieldPercentage,\n Slider: FieldSlider,\n Rating: FieldRating,\n // Date/Time fields\n Date: FieldDate,\n DateRange: FieldDateRange,\n DateTimePicker: FieldDateTimePicker,\n Time: FieldTime,\n Duration: FieldDuration,\n Schedule: FieldSchedule,\n // Boolean fields\n Checkbox: FieldCheckbox,\n CheckboxCard: FieldCheckboxCard,\n Switch: FieldSwitch,\n // Selection fields\n Select: FieldSelect,\n NativeSelect: FieldNativeSelect,\n CascadingSelect: FieldCascadingSelect,\n Combobox: FieldCombobox,\n Autocomplete: FieldAutocomplete,\n Listbox: FieldListbox,\n RadioGroup: FieldRadioGroup,\n RadioCard: FieldRadioCard,\n SegmentedGroup: FieldSegmentedGroup,\n Tags: FieldTags,\n // Specialized fields\n Phone: FieldPhone,\n Address: FieldAddress,\n City: FieldCity,\n PinInput: FieldPinInput,\n OTPInput: FieldOTPInput,\n ColorPicker: FieldColorPicker,\n FileUpload: FieldFileUpload,\n Signature: FieldSignature,\n // Поля для опросников\n MatrixChoice: FieldMatrixChoice,\n ImageChoice: FieldImageChoice,\n Likert: FieldLikert,\n YesNo: FieldYesNo,\n // Утилитарные поля\n Hidden: FieldHidden,\n Calculated: FieldCalculated,\n // Табличные редакторы\n TableEditor: FieldTableEditor,\n DataGrid: FieldDataGrid,\n // Банковская карта\n CreditCard: CreditCardField,\n}\n\nconst FormDocument = {\n INN: FieldINN,\n KPP: FieldKPP,\n OGRN: FieldOGRN,\n BIK: FieldBIK,\n BankAccount: FieldBankAccount,\n CorrAccount: FieldCorrAccount,\n SNILS: FieldSNILS,\n Passport: FieldPassport,\n}\n\nconst FormButton = {\n Submit: ButtonSubmit,\n Reset: ButtonReset,\n}\n\n// Form.Steps compound component\nconst FormSteps = Object.assign(FormStepsRoot, {\n Step: FormStepsStep,\n Indicator: FormStepsIndicator,\n Navigation: FormStepsNavigation,\n CompletedContent: FormStepsCompletedContent,\n})\n\n/**\n * Declarative Form compound component\n *\n * Provides a minimal-boilerplate API for building forms with automatic\n * field path resolution, array iteration, and Chakra UI integration.\n *\n * @example\n * ```tsx\n * <Form initialValue={{ title: '', portions: 1 }} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" label=\"Title\" />\n * <Form.Field.Number name=\"portions\" label=\"Portions\" />\n * <Form.Button.Submit>Save</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example With nested groups and arrays\n * ```tsx\n * <Form initialValue={recipe} onSubmit={handleSubmit}>\n * <Form.Group.List name=\"components\">\n * <Form.Field.String name=\"title\" />\n * <Form.Field.Number name=\"weightGrams\" />\n * </Form.Group.List>\n * <Form.Group name=\"info\">\n * <Form.Group name=\"base\">\n * <Form.Field.Number name=\"rating\" />\n * </Form.Group>\n * </Form.Group>\n * <Form.Button.Submit />\n * </Form>\n * ```\n */\nimport type { FormComponent } from './form-root'\n\nexport const Form = Object.assign(FormRoot, {\n Group: FormGroup,\n Field: FormField,\n Button: FormButton,\n Errors: FormErrors,\n DebugValues: FormDebugValues,\n DirtyGuard: DirtyGuard,\n InfoBlock: FormInfoBlock,\n Divider: FormDivider,\n Watch: FormWatch,\n When: FormWhen,\n Steps: FormSteps,\n Builder: FormBuilder,\n // Schema-based generation\n AutoFields: FormAutoFields,\n FromSchema: FormFromSchema,\n FromTemplate: FormFromTemplate,\n // Offline support\n OfflineIndicator: FormOfflineIndicator,\n SyncStatus: FormSyncStatus,\n // Russian documents (ИНН, ОГРН, БИК, СНИЛС, паспорт)\n Document: FormDocument,\n // CAPTCHA (Turnstile / reCAPTCHA / hCaptcha)\n Captcha: CaptchaField,\n}) as unknown as FormComponent\n\n// Export types\nexport type {\n AddressFieldProps,\n AddressValue,\n BaseFieldProps,\n CheckboxFieldProps,\n CityFieldProps,\n CurrencyFieldProps,\n DaDataSuggestion,\n DateFieldProps,\n DateTimePickerFieldProps,\n DeclarativeFormContextValue,\n DurationFieldProps,\n FieldChangeApi,\n FieldTooltipMeta,\n FieldUIMeta,\n FormApiConfig,\n FormApiResult,\n FormApiState,\n FormGroupDeclarativeProps,\n FormGroupListContextValue,\n FormGroupListDeclarativeProps,\n FormGroupListItemContextValue,\n FormGroupListWrapperProps,\n FormOfflineState,\n FormProps,\n FormPropsWithApi,\n MaskedInputFieldProps,\n NumberFieldProps,\n NumberInputFieldProps,\n NumberInputFormatOptions,\n OnFieldChangeMap,\n OTPInputFieldProps,\n PasswordFieldProps,\n PasswordRequirement,\n PasswordStrengthFieldProps,\n PercentageFieldProps,\n PhoneCountry,\n PhoneFieldProps,\n StringFieldProps,\n SubmitButtonProps,\n SwitchFieldProps,\n TextareaFieldProps,\n TimeFieldProps,\n UseCreateHook,\n UseQueryHook,\n UseUpdateHook,\n} from './types'\n\n// Export context hooks\nexport { DeclarativeFormContext, useDeclarativeForm, useDeclarativeFormOptional } from './form-context'\nexport {\n FormGroupListContext,\n FormGroupListItemContext,\n useFormGroupListContext,\n useFormGroupListItemContext,\n} from './form-group/form-group-list-context'\n\n// Export individual components for extension\nexport { ButtonReset, ButtonSubmit, type ResetButtonProps } from './form-buttons'\nexport { FormDebugValues, type FormDebugValuesProps } from './form-debug-values'\nexport { FormErrors } from './form-errors'\nexport {\n camelCaseToLabel,\n FieldAddress,\n FieldAuto,\n FieldAutocomplete,\n FieldCascadingSelect,\n FieldCheckbox,\n FieldCheckboxCard,\n FieldCity,\n FieldColorPicker,\n FieldCombobox,\n FieldCurrency,\n FieldDate,\n FieldDateRange,\n FieldDateTimePicker,\n FieldDuration,\n FieldEditable,\n FieldFileUpload,\n FieldListbox,\n FieldMaskedInput,\n FieldNativeSelect,\n FieldNumber,\n FieldNumberInput,\n FieldOTPInput,\n FieldPassword,\n FieldPasswordStrength,\n FieldPercentage,\n FieldPhone,\n FieldPinInput,\n FieldRadioCard,\n FieldRadioGroup,\n FieldRating,\n FieldRichText,\n FieldSchedule,\n FieldSegmentedGroup,\n FieldSelect,\n FieldSignature,\n FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTags,\n FieldTextarea,\n FieldTime,\n useDeclarativeField,\n type AutocompleteFieldProps,\n type AutoFieldConfig,\n type AutoFieldProps,\n type CalculatedFieldProps,\n type CascadingSelectFieldProps,\n type CascadingSelectLoadResult,\n type CheckboxCardFieldProps,\n type CheckboxCardOption,\n type ColorPickerFieldProps,\n type ComboboxFieldProps,\n type ComboboxOption,\n type DateRangeFieldProps,\n type DateRangePreset,\n type DateRangeValue,\n type DayOfWeek,\n type DaySchedule,\n type EditableFieldProps,\n type FileUploadFieldProps,\n type ListboxFieldProps,\n type ListboxOption,\n type NativeSelectFieldProps,\n type NativeSelectOption,\n type PinInputFieldProps,\n type RadioCardFieldProps,\n type RadioCardOption,\n type RadioGroupFieldProps,\n type RadioOption,\n type RatingFieldProps,\n type RichTextFieldProps,\n type ScheduleFieldProps,\n type SegmentedGroupFieldProps,\n type SegmentedGroupOption,\n type SelectFieldProps,\n type SelectOption,\n type SignatureFieldProps,\n type SliderFieldProps,\n type SliderMark,\n type TagsFieldProps,\n type TimeSlot,\n type ToolbarButton,\n type WeeklySchedule,\n} from './form-fields'\nexport { FormGroupDeclarative } from './form-group/form-group-declarative'\nexport { ListButtonAdd, ListButtonRemove } from './form-group/form-group-list-buttons'\nexport { FormGroupListDeclarative } from './form-group/form-group-list-declarative'\nexport {\n DragHandle,\n SortableItem,\n SortableWrapper,\n useSortableItemContext,\n} from './form-group/form-group-list-sortable'\n\n// Factory for app-specific forms\nexport { createForm, type ExtendedForm } from './create-form'\n\n// Lazy component helpers (for lazy loading form components)\nexport { createLazyComponent, createLazyComponents, type LazyComponentImport } from './lazy-component'\n\n// API integration hook\nexport { useFormApi } from './use-form-api'\n\n// Persistence hook and types\nexport { useFormPersistence, type FormPersistenceConfig, type FormPersistenceResult } from './form-persistence'\n\n// DirtyGuard component\nexport { DirtyGuard, type DirtyGuardProps } from './dirty-guard'\n\n// Утилитарные компоненты формы\nexport { FormDivider, type FormDividerProps } from './form-divider'\nexport { FormInfoBlock, type FormInfoBlockProps } from './form-info-block'\n\n// Hidden field\nexport { FieldHidden, type HiddenFieldProps } from './form-fields'\n\n// Calculated field\nexport { FieldCalculated } from './form-fields'\n\n// Field change watcher\nexport { FormWatch, type FormWatchProps } from './form-watch'\n\n// Conditional rendering\nexport { FormWhen, type FormWhenProps } from './form-when'\n\n// Multi-step forms\nexport {\n FormStepsCompletedContent,\n FormStepsContext,\n FormStepsIndicator,\n FormStepsNavigation,\n FormSteps as FormStepsRoot,\n FormStepsStep,\n useFormStepsContext,\n type FormStepsCompletedContentProps,\n type FormStepsContextValue,\n type FormStepsIndicatorProps,\n type FormStepsNavigationProps,\n type FormStepsProps,\n type FormStepsStepProps,\n type StepInfo,\n} from './form-steps'\n\n// Field actions hook\nexport { useFieldActions, type FieldActionsResult } from './use-field-actions'\n\n// Field UI components\nexport { FieldLabel, type FieldLabelProps } from './form-fields/base/field-label'\nexport { FieldTooltip, type FieldTooltipProps } from './form-fields/base/field-tooltip'\n\n// Form Builder (JSON-based form generation)\nexport {\n FormBuilder,\n type FieldConfig,\n type FormBuilderConfig,\n type FormBuilderProps,\n type FormBuilderSection,\n} from './form-builder'\n\n// Schema constraints (auto-extraction from Zod)\nexport {\n getZodConstraints,\n type ZodArrayConstraints,\n type ZodConstraints,\n type ZodDateConstraints,\n type ZodNumberConstraints,\n type ZodStringConstraints,\n} from './schema-constraints'\n\n// Field constraints hook\nexport { useFieldConstraints, type UseFieldConstraintsResult } from './use-field-constraints'\n\n// Constraint hints (auto-generated helperText)\nexport { generateConstraintHint } from './constraint-hints'\n\n// Schema traversal (for form generation from Zod schema)\nexport { filterFields, getFieldPaths, traverseSchema, type SchemaFieldInfo } from './schema-traversal'\n\n// Field type mapper (for mapping field types to components)\nexport {\n renderFieldByType,\n renderSchemaField,\n resolveFieldType,\n SchemaFieldWithRelations,\n type FieldRenderProps,\n type RelationFieldConfig,\n} from './field-type-mapper'\n\n// Auto-generated fields from schema\nexport { FormAutoFields, type AutoFieldsProps } from './form-auto-fields'\n\n// Complete form from schema\nexport { FormFromSchema, type FormFromSchemaProps } from './form-from-schema'\n\n// FieldComponentType for schema metadata\nexport type { FieldComponentType } from './types/meta-types'\n\n// withUIMeta - enrich Zod schemas with UI metadata (ZenStack integration)\nexport { withUIMeta, withUIMetaDeep, type DeepUIMetaConfig, type UIMetaConfig } from './with-ui-meta'\n\n// Common meta helpers (for use with withUIMeta)\nexport {\n booleanMeta,\n commonMeta,\n dateMeta,\n enumMeta,\n numberMeta,\n relationMeta,\n textMeta,\n type SelectionFieldType,\n} from './common-meta'\n\n// Relation field provider (auto-loading relation options)\nexport {\n RelationFieldProvider,\n useRelationFieldContext,\n useRelationOptions,\n withRelations,\n type QueryHookResult,\n type RelationConfig,\n type RelationFieldContextValue,\n type RelationOption,\n type RelationState,\n} from './relation-field-provider'\n\n// Async search hook (for Combobox, Autocomplete)\nexport {\n useAsyncSearch,\n useDebounce,\n type AsyncQueryFn,\n type AsyncQueryResult,\n type UseAsyncSearchOptions,\n type UseAsyncSearchResult,\n} from './form-fields/base'\n\n// Address providers (pluggable geocoding)\nexport {\n createDaDataProvider,\n type AddressProvider,\n type AddressSuggestion,\n type SuggestionOptions,\n} from './form-fields/specialized/providers'\n\n// Security utilities\nexport {\n HoneypotField,\n parseFileSize,\n processFileWithSecurity,\n sanitizeFileName,\n useHoneypotCheck,\n useRateLimit,\n validateMimeType,\n} from './security'\nexport type { FileSecurityConfig, FileSecurityResult, RateLimitConfig, RateLimitState } from './security'\n\n// TableEditor & DataGrid\nexport { FieldDataGrid, FieldTableEditor, TableEditorContext, useTableEditorContext } from './form-fields/table'\nexport type {\n CellCoord,\n CellFieldType,\n DataGridColumnDef,\n DataGridFieldProps,\n ResolvedColumn,\n TableColumnDef,\n TableEditorContextValue,\n TableEditorFieldProps,\n TableFooterDef,\n TableNavigationState,\n} from './form-fields/table'\n\n// Conversational Mode (Typeform-стиль)\nexport {\n ConversationalMode,\n useConversationalState,\n type ConversationalModeProps,\n type ConversationalState,\n} from './conversational'\n\n// Autosave (серверное автосохранение)\nexport { useFormAutosave } from './form-autosave'\nexport type { AutosaveStatus, FormAutosaveConfig, UseFormAutosaveResult } from './form-autosave'\nexport { AutosaveIndicator, type AutosaveIndicatorProps } from './form-autosave-indicator'\n\n// Form Templates (готовые шаблоны форм)\nexport { FormFromTemplate, templates } from './templates'\nexport type { FormFromTemplateProps, FormTemplate } from './templates'\n\n// Russian document fields (Form.Document.*)\nexport {\n createDocumentField,\n FieldBankAccount,\n FieldBIK,\n FieldCorrAccount,\n FieldINN,\n FieldKPP,\n FieldOGRN,\n FieldPassport,\n FieldSNILS,\n} from './form-fields/document'\nexport type { DocumentFieldConfig, DocumentFieldProps } from './form-fields/document'\n","'use client'\n\nimport { type Context, createContext, type Provider, useContext } from 'react'\n\n/**\n * Результат создания безопасного контекста.\n * Содержит контекст, провайдер и два хука для доступа.\n */\nexport interface SafeContextResult<T> {\n /** React Context объект */\n Context: Context<T | null>\n /** Provider компонент */\n Provider: Provider<T | null>\n /**\n * Хук для обязательного доступа к контексту.\n * Выбрасывает ошибку, если используется вне Provider.\n */\n useContext: () => T\n /**\n * Хук для опционального доступа к контексту.\n * Возвращает null, если используется вне Provider.\n */\n useContextOptional: () => T | null\n}\n\n/**\n * Создаёт типобезопасный React Context с хуками для доступа.\n *\n * Устраняет boilerplate код при создании контекстов:\n * - Автоматически создаёт Context с дефолтным значением null\n * - Создаёт обязательный хук с понятным сообщением об ошибке\n * - Создаёт опциональный хук для случаев, когда контекст может отсутствовать\n *\n * @param contextName - Имя контекста для сообщений об ошибках\n *\n * @example\n * // Создание контекста\n * interface UserContextValue {\n * name: string\n * email: string\n * }\n *\n * export const {\n * Context: UserContext,\n * Provider: UserProvider,\n * useContext: useUser,\n * useContextOptional: useUserOptional,\n * } = createSafeContext<UserContextValue>('User')\n *\n * // Использование\n * function UserProfile() {\n * const user = useUser() // Выбросит ошибку, если вне Provider\n * return <div>{user.name}</div>\n * }\n *\n * function OptionalUserDisplay() {\n * const user = useUserOptional() // Вернёт null, если вне Provider\n * if (!user) return null\n * return <div>{user.name}</div>\n * }\n */\nexport function createSafeContext<T>(contextName: string): SafeContextResult<T> {\n const Context = createContext<T | null>(null)\n Context.displayName = contextName\n\n function useSafeContext(): T {\n const value = useContext(Context)\n if (value === null) {\n throw new Error(`use${contextName} должен использоваться внутри ${contextName}Provider`)\n }\n return value\n }\n\n function useSafeContextOptional(): T | null {\n return useContext(Context)\n }\n\n return {\n Context,\n Provider: Context.Provider,\n useContext: useSafeContext,\n useContextOptional: useSafeContextOptional,\n }\n}\n\n/**\n * Создаёт контекст для именованных групп (с fullPath).\n * Используется для Form.Group, Form.Field и подобных компонентов.\n */\nexport interface NamedGroupContextValue {\n /** Полный путь к группе (например: \"user.address\" или \"items.0\") */\n fullPath: string\n}\n\n/**\n * Создаёт контекст для компонентов с именованными группами.\n * Специализированная версия createSafeContext для групповых контекстов.\n *\n * @param contextName - Имя контекста\n *\n * @example\n * const {\n * Context: FormGroupContext,\n * useContext: useFormGroup,\n * } = createNamedGroupContext('FormGroup')\n */\nexport function createNamedGroupContext(contextName: string): SafeContextResult<NamedGroupContextValue> {\n return createSafeContext<NamedGroupContextValue>(contextName)\n}\n","/**\n * Серверная верификация CAPTCHA токена.\n *\n * ⚠️ ТОЛЬКО для серверного кода (Server Actions, API routes).\n * Секретный ключ НИКОГДА не должен попадать на клиент.\n *\n * @example В Server Action\n * ```typescript\n * 'use server'\n * import { verifyCaptcha } from '@lena/form-components/captcha/server'\n *\n * export async function submitForm(data: FormData) {\n * const result = await verifyCaptcha(data.__captchaToken, {\n * provider: 'turnstile',\n * secretKey: process.env.TURNSTILE_SECRET_KEY!,\n * })\n * if (!result.success) {\n * throw new Error('Верификация CAPTCHA не пройдена')\n * }\n * // ... обработка формы\n * }\n * ```\n */\n\nimport type { CaptchaProvider, CaptchaVerifyOptions, CaptchaVerifyResult } from './types'\n\n/** URL-ы для серверной верификации по провайдерам */\nconst VERIFY_URLS: Record<CaptchaProvider, string> = {\n turnstile: 'https://challenges.cloudflare.com/turnstile/v0/siteverify',\n recaptcha: 'https://www.google.com/recaptcha/api/siteverify',\n hcaptcha: 'https://api.hcaptcha.com/siteverify',\n}\n\n/**\n * Верифицирует токен CAPTCHA на сервере.\n *\n * @param token - Токен, полученный от клиентского виджета CAPTCHA\n * @param options - Настройки провайдера (provider, secretKey)\n * @returns Результат верификации\n */\nexport async function verifyCaptcha(\n token: string | undefined | null,\n options: CaptchaVerifyOptions\n): Promise<CaptchaVerifyResult> {\n if (!token) {\n return { success: false, errorCodes: ['missing-input-response'] }\n }\n\n const { provider, secretKey, remoteIp } = options\n const url = VERIFY_URLS[provider]\n\n if (!url) {\n return { success: false, errorCodes: ['unknown-provider'] }\n }\n\n const body = new URLSearchParams({\n secret: secretKey,\n response: token,\n ...(remoteIp ? { remoteip: remoteIp } : {}),\n })\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n })\n\n if (!response.ok) {\n return { success: false, errorCodes: ['network-error'] }\n }\n\n const data = await response.json()\n\n // Все три провайдера возвращают { success: boolean, ... }\n return {\n success: Boolean(data.success),\n errorCodes: data['error-codes'] ?? data.errorCodes,\n hostname: data.hostname,\n challengeTs: data.challenge_ts ?? data.challengeTs,\n }\n}\n","'use client'\n\nimport { HStack, IconButton, Text } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { UseFormHistoryResult } from './types'\n\nexport interface HistoryControlsProps {\n /** Результат useFormHistory */\n history: UseFormHistoryResult\n /** Показать счётчик (N/M) */\n showCounter?: boolean\n /** Размер кнопок */\n size?: 'xs' | 'sm' | 'md'\n}\n\n/**\n * Form.History.Controls — визуальные кнопки Undo/Redo.\n *\n * @example\n * ```tsx\n * const historyApi = useFormHistory(form)\n * <HistoryControls history={historyApi} />\n * ```\n */\nexport function HistoryControls({\n history,\n showCounter = true,\n size = 'sm',\n}: HistoryControlsProps): ReactElement {\n return (\n <HStack gap={1}>\n <IconButton\n aria-label=\"Undo (Ctrl+Z)\"\n size={size}\n variant=\"ghost\"\n disabled={!history.canUndo}\n onClick={history.undo}\n title=\"Отменить (Ctrl+Z)\"\n >\n ↩\n </IconButton>\n <IconButton\n aria-label=\"Redo (Ctrl+Y)\"\n size={size}\n variant=\"ghost\"\n disabled={!history.canRedo}\n onClick={history.redo}\n title=\"Повторить (Ctrl+Y)\"\n >\n ↪\n </IconButton>\n {showCounter && (\n <Text fontSize=\"xs\" color=\"fg.muted\" minW=\"40px\" textAlign=\"center\">\n {history.currentIndex + 1}/{history.historyLength}\n </Text>\n )}\n </HStack>\n )\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { FormHistoryConfig, HistoryEntry, UseFormHistoryResult } from './types'\n\n/**\n * useFormHistory — Undo/Redo для форм.\n *\n * Подписывается на изменения TanStack Form store,\n * записывает снапшоты с debounce, поддерживает keyboard shortcuts.\n *\n * @example\n * ```tsx\n * const { undo, redo, canUndo, canRedo } = useFormHistory(form, {\n * maxHistory: 50,\n * debounceMs: 500,\n * keyboard: true,\n * })\n * ```\n */\nexport function useFormHistory<T>(\n form: {\n state: { values: T }\n store: { subscribe: (cb: () => void) => () => void }\n setFieldValue: (field: string, value: unknown) => void\n reset: () => void\n },\n config?: FormHistoryConfig,\n): UseFormHistoryResult<T> {\n const {\n maxHistory = 50,\n debounceMs = 500,\n persist = false,\n persistKey = 'form-history',\n keyboard = true,\n } = config ?? {}\n\n const [history, setHistory] = useState<HistoryEntry<T>[]>(() => {\n // Восстановление из sessionStorage\n if (persist && typeof window !== 'undefined') {\n try {\n const saved = sessionStorage.getItem(persistKey)\n if (saved) return JSON.parse(saved)\n } catch { /* игнорируем ошибки парсинга */ }\n }\n return [{ values: form.state.values, timestamp: Date.now() }]\n })\n\n const [currentIndex, setCurrentIndex] = useState(() => {\n if (persist && typeof window !== 'undefined') {\n try {\n const saved = sessionStorage.getItem(`${persistKey}-index`)\n if (saved) return parseInt(saved, 10)\n } catch { /* игнорируем */ }\n }\n return 0\n })\n\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const isUndoRedoRef = useRef(false)\n\n // Записать новый снапшот в историю\n const pushSnapshot = useCallback((values: T) => {\n setHistory((prev) => {\n // Обрезаем \"будущее\" при ветвлении\n const base = prev.slice(0, currentIndex + 1)\n const entry: HistoryEntry<T> = { values: structuredClone(values), timestamp: Date.now() }\n const next = [...base, entry]\n // Ограничиваем размер\n const trimmed = next.length > maxHistory ? next.slice(next.length - maxHistory) : next\n return trimmed\n })\n setCurrentIndex((prev) => {\n const newIndex = Math.min(prev + 1, maxHistory - 1)\n return newIndex\n })\n }, [currentIndex, maxHistory])\n\n // Подписка на изменения формы с debounce\n useEffect(() => {\n const unsub = form.store.subscribe(() => {\n if (isUndoRedoRef.current) return // Не записываем изменения от undo/redo\n\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n pushSnapshot(form.state.values)\n }, debounceMs)\n })\n\n return () => {\n unsub()\n if (debounceRef.current) clearTimeout(debounceRef.current)\n }\n }, [form.store, form.state.values, debounceMs, pushSnapshot])\n\n // Persist в sessionStorage\n useEffect(() => {\n if (!persist) return\n try {\n sessionStorage.setItem(persistKey, JSON.stringify(history))\n sessionStorage.setItem(`${persistKey}-index`, String(currentIndex))\n } catch { /* sessionStorage может быть полон */ }\n }, [history, currentIndex, persist, persistKey])\n\n // Применить снапшот из истории к форме\n const applySnapshot = useCallback((entry: HistoryEntry<T>) => {\n isUndoRedoRef.current = true\n const values = entry.values as Record<string, unknown>\n for (const [key, value] of Object.entries(values)) {\n form.setFieldValue(key, value)\n }\n // Сбросить флаг после микротаска (чтобы subscribe не сработал)\n setTimeout(() => { isUndoRedoRef.current = false }, 0)\n }, [form])\n\n const undo = useCallback(() => {\n if (currentIndex <= 0) return\n const newIndex = currentIndex - 1\n setCurrentIndex(newIndex)\n applySnapshot(history[newIndex])\n }, [currentIndex, history, applySnapshot])\n\n const redo = useCallback(() => {\n if (currentIndex >= history.length - 1) return\n const newIndex = currentIndex + 1\n setCurrentIndex(newIndex)\n applySnapshot(history[newIndex])\n }, [currentIndex, history, applySnapshot])\n\n const clear = useCallback(() => {\n const initial: HistoryEntry<T> = { values: form.state.values, timestamp: Date.now() }\n setHistory([initial])\n setCurrentIndex(0)\n if (persist) {\n try {\n sessionStorage.removeItem(persistKey)\n sessionStorage.removeItem(`${persistKey}-index`)\n } catch { /* игнорируем */ }\n }\n }, [form.state.values, persist, persistKey])\n\n // Keyboard shortcuts\n useEffect(() => {\n if (!keyboard || typeof window === 'undefined') return\n\n const handler = (e: KeyboardEvent) => {\n const isCtrl = e.ctrlKey || e.metaKey\n if (!isCtrl) return\n\n if (e.key === 'z' && !e.shiftKey) {\n e.preventDefault()\n undo()\n } else if ((e.key === 'z' && e.shiftKey) || e.key === 'y') {\n e.preventDefault()\n redo()\n }\n }\n\n window.addEventListener('keydown', handler)\n return () => window.removeEventListener('keydown', handler)\n }, [keyboard, undo, redo])\n\n return {\n undo,\n redo,\n canUndo: currentIndex > 0,\n canRedo: currentIndex < history.length - 1,\n currentIndex,\n historyLength: history.length,\n clear,\n history,\n }\n}\n","'use client'\n\nimport { Box, HStack, Separator, Text, VStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\n\nexport interface FormReadOnlyViewProps<T extends Record<string, unknown> = Record<string, unknown>> {\n /** Данные для отображения */\n data: T\n /** Zod-схема для извлечения labels из .meta({ ui: { title } }) */\n schema?: { _def?: { shape?: () => Record<string, { _def?: { meta?: { ui?: { title?: string } } } }> } }\n /** Кастомные labels для полей */\n labels?: Record<string, string>\n /** Поля для исключения */\n exclude?: string[]\n /** Поля для включения (если указано — только они) */\n include?: string[]\n /** Форматтеры значений */\n formatters?: Record<string, (value: unknown) => string>\n /** Компактный режим (одна строка на поле) */\n compact?: boolean\n}\n\n/**\n * Form.ReadOnlyView — отображение данных формы в режиме чтения.\n * Автоматически извлекает labels из Zod .meta({ ui: { title } }).\n */\nexport function FormReadOnlyView<T extends Record<string, unknown>>({\n data,\n schema,\n labels = {},\n exclude = [],\n include,\n formatters = {},\n compact = false,\n}: FormReadOnlyViewProps<T>): ReactElement {\n // Извлекаем labels из схемы\n const schemaLabels: Record<string, string> = {}\n if (schema?._def?.shape) {\n try {\n const shape = schema._def.shape()\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const title = fieldSchema?._def?.meta?.ui?.title\n if (title) schemaLabels[key] = title\n }\n } catch {}\n }\n\n const entries = Object.entries(data).filter(([key]) => {\n if (exclude.includes(key)) return false\n if (include && !include.includes(key)) return false\n return true\n })\n\n return (\n <VStack gap={compact ? 2 : 4} align=\"stretch\">\n {entries.map(([key, value], index) => {\n const label = labels[key] ?? schemaLabels[key] ?? humanizeKey(key)\n const formatter = formatters[key]\n const displayValue = formatter ? formatter(value) : formatValue(value)\n\n return compact ? (\n <HStack key={key} justify=\"space-between\" fontSize=\"sm\">\n <Text color=\"fg.muted\" fontWeight=\"medium\">{label}</Text>\n <Text>{displayValue}</Text>\n </HStack>\n ) : (\n <Box key={key}>\n <Text fontSize=\"xs\" color=\"fg.muted\" fontWeight=\"medium\" mb={1}>{label}</Text>\n <Text fontSize=\"sm\">{displayValue}</Text>\n {index < entries.length - 1 && <Separator mt={3} />}\n </Box>\n )\n })}\n </VStack>\n )\n}\n\nfunction humanizeKey(key: string): string {\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/[_-]/g, ' ')\n .trim()\n .replace(/^\\w/, (c) => c.toUpperCase())\n}\n\nfunction formatValue(value: unknown): string {\n if (value == null) return '—'\n if (typeof value === 'boolean') return value ? 'Да' : 'Нет'\n if (value instanceof Date) return value.toLocaleDateString('ru-RU')\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n","'use client'\n\nimport { Box, Skeleton, VStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\n\nexport interface FormSkeletonProps {\n /** Количество полей (или Zod-схема для автодетекта) */\n fields?: number | { _def?: { shape?: () => Record<string, unknown> } }\n /** Показать скелетон кнопки submit */\n showSubmit?: boolean\n /** Высота каждого поля */\n fieldHeight?: string\n /** Расстояние между полями */\n gap?: number\n}\n\n/**\n * Form.Skeleton — loading state для формы.\n * Показывает скелетоны полей пока загружаются данные.\n */\nexport function FormSkeleton({\n fields = 5,\n showSubmit = true,\n fieldHeight = '60px',\n gap = 4,\n}: FormSkeletonProps): ReactElement {\n // Определяем количество полей\n let fieldCount: number\n if (typeof fields === 'number') {\n fieldCount = fields\n } else if (fields?._def?.shape) {\n try {\n fieldCount = Object.keys(fields._def.shape()).length\n } catch {\n fieldCount = 5\n }\n } else {\n fieldCount = 5\n }\n\n return (\n <VStack gap={gap} align=\"stretch\">\n {Array.from({ length: fieldCount }, (_, i) => (\n <Box key={i}>\n {/* Label скелетон */}\n <Skeleton height=\"14px\" width={`${60 + Math.random() * 40}%`} mb={2} />\n {/* Input скелетон */}\n <Skeleton height={fieldHeight} borderRadius=\"md\" />\n </Box>\n ))}\n {showSubmit && (\n <Box pt={2}>\n <Skeleton height=\"40px\" width=\"140px\" borderRadius=\"md\" />\n </Box>\n )}\n </VStack>\n )\n}\n","'use client'\n\nimport { Box, HStack, Separator, Text, VStack } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\n\nexport interface FormComparisonProps<T extends Record<string, unknown> = Record<string, unknown>> {\n /** Оригинальные данные (до изменений) */\n original: T\n /** Текущие данные (после изменений) */\n current: T\n /** Zod-схема для labels из .meta({ ui: { title } }) */\n schema?: { _def?: { shape?: () => Record<string, { _def?: { meta?: { ui?: { title?: string } } } }> } }\n /** Кастомные labels */\n labels?: Record<string, string>\n /** Показывать только изменённые поля */\n onlyChanged?: boolean\n /** Поля для исключения */\n exclude?: string[]\n}\n\n/**\n * Form.Comparison — diff-view формы (было → стало).\n * Подсвечивает изменённые поля жёлтым фоном.\n */\nexport function FormComparison<T extends Record<string, unknown>>({\n original,\n current,\n schema,\n labels = {},\n onlyChanged = false,\n exclude = [],\n}: FormComparisonProps<T>): ReactElement {\n // Извлекаем labels из схемы\n const schemaLabels: Record<string, string> = {}\n if (schema?._def?.shape) {\n try {\n const shape = schema._def.shape()\n for (const [key, fieldSchema] of Object.entries(shape)) {\n const title = fieldSchema?._def?.meta?.ui?.title\n if (title) schemaLabels[key] = title\n }\n } catch {}\n }\n\n const allKeys = [...new Set([...Object.keys(original), ...Object.keys(current)])]\n .filter((key) => !exclude.includes(key))\n\n const entries = allKeys\n .map((key) => ({\n key,\n label: labels[key] ?? schemaLabels[key] ?? humanizeKey(key),\n oldValue: original[key],\n newValue: current[key],\n changed: JSON.stringify(original[key]) !== JSON.stringify(current[key]),\n }))\n .filter((entry) => !onlyChanged || entry.changed)\n\n if (entries.length === 0) {\n return <Text color=\"fg.muted\" fontSize=\"sm\">Нет изменений</Text>\n }\n\n return (\n <VStack gap={3} align=\"stretch\">\n {entries.map((entry, index) => (\n <Box\n key={entry.key}\n p={3}\n borderRadius=\"md\"\n bg={entry.changed ? 'yellow.50' : 'transparent'}\n _dark={entry.changed ? { bg: 'yellow.900/20' } : {}}\n >\n <Text fontSize=\"xs\" color=\"fg.muted\" fontWeight=\"medium\" mb={1}>\n {entry.label}\n {entry.changed && <Text as=\"span\" color=\"orange.500\" ml={1}>●</Text>}\n </Text>\n {entry.changed ? (\n <HStack gap={4} fontSize=\"sm\">\n <Box flex={1}>\n <Text fontSize=\"xs\" color=\"red.500\" mb={0.5}>Было:</Text>\n <Text textDecoration=\"line-through\" color=\"fg.muted\">{formatValue(entry.oldValue)}</Text>\n </Box>\n <Box flex={1}>\n <Text fontSize=\"xs\" color=\"green.500\" mb={0.5}>Стало:</Text>\n <Text fontWeight=\"medium\">{formatValue(entry.newValue)}</Text>\n </Box>\n </HStack>\n ) : (\n <Text fontSize=\"sm\">{formatValue(entry.newValue)}</Text>\n )}\n {index < entries.length - 1 && <Separator mt={2} />}\n </Box>\n ))}\n </VStack>\n )\n}\n\nfunction humanizeKey(key: string): string {\n return key.replace(/([A-Z])/g, ' $1').replace(/[_-]/g, ' ').trim().replace(/^\\w/, (c) => c.toUpperCase())\n}\n\nfunction formatValue(value: unknown): string {\n if (value == null) return '—'\n if (typeof value === 'boolean') return value ? 'Да' : 'Нет'\n if (value instanceof Date) return value.toLocaleDateString('ru-RU')\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'object') return JSON.stringify(value)\n return String(value)\n}\n","'use client'\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { useDeclarativeForm } from './form-context'\n\nexport interface FormDependsOnProps {\n /** Поле от которого зависит валидация/рендеринг */\n field: string\n /** Маппинг значений поля → children */\n cases: Record<string, ReactNode>\n /** Fallback если значение не совпадает ни с одним case */\n fallback?: ReactNode\n}\n\n/**\n * Form.DependsOn — каскадный рендеринг по значению поля.\n *\n * Расширение Form.When для множественных вариантов.\n * Вместо нескольких Form.When с одним полем — один DependsOn с cases.\n *\n * @example\n * ```tsx\n * <Form.DependsOn\n * field=\"paymentMethod\"\n * cases={{\n * card: <Form.Field.CreditCard name=\"card\" />,\n * bank: <Form.Field.String name=\"iban\" label=\"IBAN\" />,\n * cash: <Text>Оплата наличными при получении</Text>,\n * }}\n * />\n * ```\n */\nexport function FormDependsOn({ field, cases, fallback }: FormDependsOnProps): ReactElement | null {\n const { form } = useDeclarativeForm()\n\n return (\n <form.Subscribe selector={(state: { values: Record<string, unknown> }) => state.values[field]}>\n {(value: unknown) => {\n const key = String(value ?? '')\n const content = cases[key]\n\n if (content !== undefined) {\n return <>{content}</>\n }\n\n if (fallback !== undefined) {\n return <>{fallback}</>\n }\n\n return null\n }}\n </form.Subscribe>\n )\n}\n"]}
|