@letar/forms 1.0.0 → 1.1.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 +57 -0
- package/README.md +79 -4
- package/README.ru.md +304 -0
- package/{chunk-G3HYXHCZ.js → chunk-4V6WBJ76.js} +14 -14
- package/chunk-4V6WBJ76.js.map +1 -0
- package/chunk-6QOPSQ3Z.js +78 -0
- package/chunk-6QOPSQ3Z.js.map +1 -0
- package/{chunk-GIBNEYK3.js → chunk-7FEQFDJ7.js} +5 -4
- package/chunk-7FEQFDJ7.js.map +1 -0
- package/chunk-GOELIS6T.js +849 -0
- package/chunk-GOELIS6T.js.map +1 -0
- package/chunk-HWVOFWAT.js +846 -0
- package/chunk-HWVOFWAT.js.map +1 -0
- package/chunk-KUNT5MSU.js +709 -0
- package/chunk-KUNT5MSU.js.map +1 -0
- package/chunk-M2PNAAIR.js +971 -0
- package/chunk-M2PNAAIR.js.map +1 -0
- package/chunk-PJETA6YN.js +821 -0
- package/chunk-PJETA6YN.js.map +1 -0
- package/chunk-XKKJKYWZ.js +299 -0
- package/chunk-XKKJKYWZ.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/i18n.js +1 -1
- package/index.js +261 -4540
- package/index.js.map +1 -1
- package/offline.js +1 -1
- package/package.json +33 -2
- package/chunk-G3HYXHCZ.js.map +0 -1
- package/chunk-GIBNEYK3.js.map +0 -1
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/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-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","List","Icon","LuUpload","formContext","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 { useMemo, type ReactNode } 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 * Типизированная обёртка над useFormContext.\n *\n * Решает проблему типизации: стандартный useFormContext() не принимает type argument,\n * поэтому для доступа к типизированным values нужен workaround `as unknown as T`.\n * Этот хук делает это автоматически.\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 имеет тип 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 * Оригинальный form API из TanStack Form.\n * Используйте form.store для useStore подписок.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n form: rawForm as any,\n\n /**\n * Типизированный setFieldValue.\n * Используйте вместо form.setFieldValue для правильной типизации.\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 * Типизированный селектор для values.\n * Используйте внутри form.Subscribe: `selector={(s) => values(s)}`\n */\n values: (state: { values: unknown }) => state.values as TFormData,\n\n /**\n * Получить текущие значения формы (snapshot).\n * Внимание: это не реактивно! Для реактивного доступа используйте form.Subscribe.\n */\n getValues: () => rawForm.state.values as unknown as TFormData,\n\n /**\n * Подписаться на конкретное поле.\n * Возвращает селектор для использования в 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 * Типы для TypedFormSubscribe компонента\n */\ninterface TypedFormSubscribeProps<TFormData extends object, TSelected> {\n /** Селектор для выбора данных из состояния формы */\n selector: (values: TFormData) => TSelected\n /** Render функция, получающая выбранные данные */\n children: (selected: TSelected) => ReactNode\n}\n\n/**\n * Типизированный Subscribe компонент для удобной подписки на значения формы.\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 * Базовые компоненты полей для форм\n * Могут быть расширены в отдельных приложениях\n */\nconst fieldComponents = {}\n\n/**\n * Базовые компоненты форм\n * Могут быть расширены в отдельных приложениях\n */\nconst formComponents = {}\n\n/**\n * Создаёт хук формы для конкретного приложения\n *\n * useAppForm предоставляет преднастроенный хук формы с:\n * - Уже настроенными контекстами поля и формы\n * - Доступом к form.AppField и form.AppForm для кастомных компонентов\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// Реэкспорт типов для удобства\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 /** Текст лейбла поля */\n label?: ReactNode\n /** Вспомогательный текст под полем */\n helperText?: ReactNode\n /** Переопределение текста ошибки (по умолчанию использует ошибки TanStack Form) */\n errorText?: ReactNode\n /** Текст для необязательного поля */\n optionalText?: ReactNode\n /** Показывать индикатор обязательного поля */\n required?: boolean\n /** Переопределение состояния невалидности (по умолчанию использует ошибки TanStack Form) */\n invalid?: boolean\n /** Дочерние элементы — сам элемент ввода формы */\n children: ReactNode\n}\n\n/**\n * ChakraFormField - поле Chakra UI v3 с интеграцией TanStack Form\n *\n * Автоматически отображает ошибки валидации из API поля TanStack Form.\n * Должен использоваться внутри компонента TanStackFormField.\n *\n * @example\n * ```tsx\n * <form.Field name=\"email\">\n * {(field) => (\n * <TanStackFormField name=\"email\" field={field}>\n * <ChakraFormField label=\"Email\" helperText=\"Ваш рабочий 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 // Получаем ошибки из поля TanStack Form\n const fieldErrors = fieldContext?.field.state.meta.errors\n const hasErrors = fieldErrors && fieldErrors.length > 0\n const isInvalid = invalid ?? hasErrors\n\n // Форматируем сообщения об ошибках\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 типы не включают children в 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 { useCallback, useEffect, useRef, useState, type ReactElement } 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 \"Несохранённые изменения\"\n */\n dialogTitle?: string\n /**\n * Description for the confirmation dialog\n * @default \"У вас есть несохранённые изменения. Вы уверены, что хотите покинуть страницу?\"\n */\n dialogDescription?: string\n /**\n * Text for the confirm button\n * @default \"Покинуть\"\n */\n confirmText?: string\n /**\n * Text for the cancel button\n * @default \"Остаться\"\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=\"Уходите?\"\n * dialogDescription=\"Данные будут потеряны!\"\n * confirmText=\"Да, уйти\"\n * cancelText=\"Нет, остаться\"\n * />\n * ```\n */\nexport function DirtyGuard({\n message = 'You have unsaved changes. Are you sure you want to leave?',\n dialogTitle = 'Несохранённые изменения',\n dialogDescription = 'У вас есть несохранённые изменения. Вы уверены, что хотите покинуть страницу?',\n confirmText = 'Покинуть',\n cancelText = 'Остаться',\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 // Проверка isDirty\n const checkIsDirty = useCallback(() => {\n const state = form.state\n return state.isDirty\n }, [form])\n\n // Обработчик beforeunload (закрытие вкладки, 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 // Перехват кликов на внутренние ссылки\n useEffect(() => {\n if (!enabled) {\n return\n }\n\n const handleClick = (event: MouseEvent) => {\n // Проверяем что форма dirty\n if (!checkIsDirty()) {\n return\n }\n\n // Находим ближайший anchor или element с 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 // Пропускаем внешние ссылки и специальные протоколы\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 // Пропускаем если есть target=\"_blank\"\n if (anchor.target === '_blank') {\n return\n }\n\n // Пропускаем если зажат Ctrl/Cmd (открытие в новой вкладке)\n if (event.ctrlKey || event.metaKey) {\n return\n }\n\n // Вызываем onBlock callback\n const shouldBlock = onBlock?.()\n if (shouldBlock === false) {\n return\n }\n\n // Предотвращаем навигацию и показываем диалог\n event.preventDefault()\n event.stopPropagation()\n pendingHref.current = href\n setShowDialog(true)\n }\n\n // Используем capture чтобы перехватить до Next.js\n document.addEventListener('click', handleClick, { capture: true })\n return () => document.removeEventListener('click', handleClick, { capture: true })\n }, [enabled, onBlock, checkIsDirty])\n\n // Подтверждение навигации\n const handleConfirm = useCallback(() => {\n setShowDialog(false)\n if (pendingHref.current) {\n // Сбрасываем dirty state перед навигацией чтобы избежать повторного срабатывания\n form.reset()\n router.push(pendingHref.current)\n pendingHref.current = null\n }\n }, [form, router])\n\n // Отмена навигации\n const handleCancel = useCallback(() => {\n setShowDialog(false)\n pendingHref.current = null\n }, [])\n\n // Рендерим диалог подтверждения\n if (!showDialog) {\n return null\n }\n\n // Простой встроенный диалог (без зависимости от 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 * Компонент подсказки для полей формы.\n * Показывает иконку \"?\" с всплывающей подсказкой при наведении.\n *\n * @example\n * ```tsx\n * <FieldTooltip\n * description=\"Укажите марку вашего учебного автомобиля\"\n * example=\"Hyundai, Kia, Volkswagen\"\n * impact=\"Ученики часто ищут инструктора по марке авто\"\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 Пример:\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 (может быть ReactNode для сложных labels с ссылками) */\n label?: ReactNode\n /** Tooltip для подсказки рядом с label */\n tooltip?: FieldTooltipMeta\n /** Показать индикатор обязательного поля */\n required?: boolean\n}\n\n/**\n * Компонент label для полей формы с поддержкой tooltip.\n *\n * Если tooltip передан, рендерит HStack с label и иконкой подсказки.\n * Иначе рендерит простой Field.Label.\n *\n * @example\n * ```tsx\n * // Простой label\n * <FieldLabel label=\"Название\" required />\n *\n * // Label с tooltip\n * <FieldLabel\n * label=\"Марка автомобиля\"\n * tooltip={{ description: 'Укажите марку', 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 * Форматирует ошибки валидации в строку для отображения\n *\n * Обрабатывает различные форматы ошибок:\n * - Строки (возвращает как есть)\n * - Объекты с `message` (StandardSchemaV1Issue, ZodIssue)\n * - Объекты с `issues` массивом (ZodError)\n * - Вложенные структуры ошибок\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 * Извлекает сообщение об ошибке из различных форматов\n *\n * @internal\n */\nfunction extractErrorMessage(e: ValidationError): string {\n // Строковая ошибка\n if (typeof e === 'string') {\n return e\n }\n\n // Null/undefined\n if (e === null || e === undefined) {\n return ''\n }\n\n // Объект с ошибкой\n if (typeof e === 'object') {\n // Массив ошибок (Zod issues из superRefine, массив строк и т.д.)\n if (Array.isArray(e)) {\n return e\n .map((item: unknown) => {\n // Элемент с message (ZodIssue)\n if (typeof item === 'object' && item && 'message' in item) {\n return (item as { message: string }).message\n }\n // Строка\n if (typeof item === 'string') {\n return item\n }\n return ''\n })\n .filter(Boolean)\n .join(', ')\n }\n\n // Стандартный формат: { message: string }\n if ('message' in e && typeof e.message === 'string') {\n return e.message\n }\n\n // Zod формат с массивом issues: { 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: попробовать JSON.stringify для отладки\n // Это лучше чем [object Object], поможет обнаружить неизвестные форматы\n try {\n const json = JSON.stringify(e)\n // Если JSON слишком длинный или это пустой объект, не показываем\n if (json === '{}' || json.length > 200) {\n return ''\n }\n // Логируем в dev режиме для отладки неизвестных форматов\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 // Другие типы (число, boolean) — маловероятно, но обрабатываем\n return String(e)\n}\n\n/**\n * Проверяет наличие ошибок валидации\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 * Интерфейс для результата useFieldErrors\n */\nexport interface FieldErrorsResult {\n /** Ошибки валидации */\n errors: ValidationError[]\n /** Есть ли ошибки */\n hasError: boolean\n /** Отформатированное сообщение об ошибке */\n errorMessage: string\n}\n\n/**\n * Извлекает информацию об ошибках из field API\n *\n * Упрощает получение ошибок в ручных Field компонентах,\n * которые не используют 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 * Генерирует человекочитаемую подсказку из constraints\n *\n * Используется для автоматического helperText, если он не задан явно.\n *\n * @example\n * ```tsx\n * // В компоненте поля\n * const { constraints } = useFieldConstraints(name)\n * const autoHint = generateConstraintHint(constraints)\n * const helperText = helperTextProp ?? autoHint\n *\n * // Примеры генерации:\n * // z.number().min(1).max(10) → \"От 1 до 10\"\n * // z.string().max(100) → \"Максимум 100 символов\"\n * // z.string().min(2).max(50) → \"От 2 до 50 символов\"\n * // z.array().max(5) → \"Максимум 5 элементов\"\n * ```\n */\nexport function generateConstraintHint(constraints: ZodConstraints | undefined): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n switch (constraints.schemaType) {\n case 'string':\n return generateStringHint(constraints.string)\n case 'number':\n return generateNumberHint(constraints.number)\n case 'date':\n return generateDateHint(constraints.date)\n case 'array':\n return generateArrayHint(constraints.array)\n default:\n return undefined\n }\n}\n\n/**\n * Генерирует подсказку для строковых полей\n */\nfunction generateStringHint(constraints: ZodStringConstraints | undefined): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n const { minLength, maxLength, inputType } = constraints\n\n // Специальные типы (email, url) не требуют подсказок о длине\n if (inputType === 'email') {\n if (maxLength) {\n return `Максимум ${maxLength} символов`\n }\n return undefined\n }\n\n if (inputType === 'url') {\n if (maxLength) {\n return `Максимум ${maxLength} символов`\n }\n return undefined\n }\n\n // Обычные строки\n if (minLength !== undefined && maxLength !== undefined) {\n if (minLength === maxLength) {\n return `Ровно ${minLength} ${pluralize(minLength, 'символ', 'символа', 'символов')}`\n }\n return `От ${minLength} до ${maxLength} символов`\n }\n\n if (maxLength !== undefined) {\n return `Максимум ${maxLength} ${pluralize(maxLength, 'символ', 'символа', 'символов')}`\n }\n\n if (minLength !== undefined) {\n return `Минимум ${minLength} ${pluralize(minLength, 'символ', 'символа', 'символов')}`\n }\n\n return undefined\n}\n\n/**\n * Генерирует подсказку для числовых полей\n */\nfunction generateNumberHint(constraints: ZodNumberConstraints | undefined): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n const { min, max, isInteger } = constraints\n\n // Диапазон\n if (min !== undefined && max !== undefined) {\n const suffix = isInteger ? ' (целое)' : ''\n return `От ${formatNumber(min)} до ${formatNumber(max)}${suffix}`\n }\n\n if (max !== undefined) {\n const suffix = isInteger ? ' (целое)' : ''\n return `Максимум ${formatNumber(max)}${suffix}`\n }\n\n if (min !== undefined) {\n const suffix = isInteger ? ' (целое)' : ''\n return `Минимум ${formatNumber(min)}${suffix}`\n }\n\n if (isInteger) {\n return 'Целое число'\n }\n\n return undefined\n}\n\n/**\n * Генерирует подсказку для полей дат\n */\nfunction generateDateHint(constraints: ZodDateConstraints | undefined): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n const { min, max } = constraints\n\n if (min && max) {\n return `С ${formatDate(min)} по ${formatDate(max)}`\n }\n\n if (min) {\n return `Не ранее ${formatDate(min)}`\n }\n\n if (max) {\n return `Не позднее ${formatDate(max)}`\n }\n\n return undefined\n}\n\n/**\n * Генерирует подсказку для массивов\n */\nfunction generateArrayHint(constraints: ZodArrayConstraints | undefined): string | undefined {\n if (!constraints) {\n return undefined\n }\n\n const { minItems, maxItems } = constraints\n\n if (minItems !== undefined && maxItems !== undefined) {\n if (minItems === maxItems) {\n return `Ровно ${minItems} ${pluralize(minItems, 'элемент', 'элемента', 'элементов')}`\n }\n return `От ${minItems} до ${maxItems} элементов`\n }\n\n if (maxItems !== undefined) {\n return `Максимум ${maxItems} ${pluralize(maxItems, 'элемент', 'элемента', 'элементов')}`\n }\n\n if (minItems !== undefined) {\n return `Минимум ${minItems} ${pluralize(minItems, 'элемент', 'элемента', 'элементов')}`\n }\n\n return undefined\n}\n\n// =============================================================================\n// Вспомогательные функции форматирования\n// =============================================================================\n\n/**\n * Склонение слов по числительным (русский язык)\n * @param n - число\n * @param one - форма для 1 (символ)\n * @param few - форма для 2-4 (символа)\n * @param many - форма для 5+ (символов)\n */\nfunction pluralize(n: number, one: string, few: string, many: string): string {\n const abs = Math.abs(n)\n const mod10 = abs % 10\n const mod100 = abs % 100\n\n if (mod100 >= 11 && mod100 <= 19) {\n return many\n }\n if (mod10 === 1) {\n return one\n }\n if (mod10 >= 2 && mod10 <= 4) {\n return few\n }\n return many\n}\n\n/**\n * Форматирует число для отображения\n */\nfunction formatNumber(n: number): string {\n // Целые числа без дробной части\n if (Number.isInteger(n)) {\n return n.toLocaleString('ru-RU')\n }\n // С дробной частью\n return n.toLocaleString('ru-RU', { maximumFractionDigits: 2 })\n}\n\n/**\n * Форматирует дату YYYY-MM-DD в человекочитаемый формат\n */\nfunction formatDate(dateStr: string): string {\n try {\n const date = new Date(dateStr)\n return date.toLocaleDateString('ru-RU', {\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n })\n } catch {\n return dateStr\n }\n}\n","/**\n * Утилиты для работы с Zod v4 схемами\n *\n * Общие функции для разворачивания обёрток схемы\n * (optional, nullable, default) и получения базовой схемы.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Результат разворачивания схемы с информацией об обязательности\n */\nexport interface UnwrapResult {\n /** Развёрнутая схема (без optional/nullable/default обёрток) */\n schema: any\n /** Является ли поле обязательным (false если было optional/nullable) */\n required: boolean\n}\n\n/**\n * Разворачивает обёртки optional/nullable/default и возвращает базовую схему\n *\n * Поддерживает как Zod v4 (inner), так и возможные различия в API.\n *\n * @example\n * ```ts\n * const innerSchema = unwrapSchema(z.string().optional())\n * // innerSchema будет 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-типы\n // Zod v4 использует inner или innerType в зависимости от версии\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 * Разворачивает схему и возвращает информацию об обязательности поля\n *\n * В отличие от `unwrapSchema`, также отслеживает была ли схема 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() делает поле необязательным для HTML формы — значение подставится автоматически\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 * Получает тип Zod схемы\n */\nexport function getZodType(schema: any): string | undefined {\n return schema?._zod?.def?.type\n}\n\n/**\n * Проверяет, является ли схема optional\n */\nexport function isOptionalSchema(schema: any): boolean {\n const type = getZodType(schema)\n return type === 'optional' || type === 'nullable'\n}\n\n/**\n * Проверяет, имеет ли схема default значение\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 * Извлечение constraints из Zod v4 схем для автоматической настройки полей форм\n *\n * Поддерживает:\n * - Строки: minLength, maxLength, email, url, regex\n * - Числа: min, max, step (int, multipleOf), positive/negative\n * - Даты: min, max\n * - Массивы: minItems, maxItems\n *\n * Структура Zod v4:\n * - Checks хранятся в `schema._zod.def.checks[]`\n * - Каждый check имеет `_zod.def` с типом и параметрами\n */\n\n// =============================================================================\n// Типы constraints\n// =============================================================================\n\n/** Constraints для строковых полей */\nexport interface ZodStringConstraints {\n minLength?: number\n maxLength?: number\n /** Автоматический input type на основе Zod checks (email, url) */\n inputType?: 'text' | 'email' | 'url' | 'tel'\n /** HTML5 pattern из regex */\n pattern?: string\n}\n\n/** Constraints для числовых полей */\nexport interface ZodNumberConstraints {\n min?: number\n max?: number\n step?: number\n isInteger?: boolean\n}\n\n/** Constraints для полей дат */\nexport interface ZodDateConstraints {\n /** Минимальная дата в формате YYYY-MM-DD */\n min?: string\n /** Максимальная дата в формате YYYY-MM-DD */\n max?: string\n}\n\n/** Constraints для массивов */\nexport interface ZodArrayConstraints {\n minItems?: number\n maxItems?: number\n}\n\n/** Результат извлечения constraints из схемы */\nexport interface ZodConstraints {\n string?: ZodStringConstraints\n number?: ZodNumberConstraints\n date?: ZodDateConstraints\n array?: ZodArrayConstraints\n /** Тип схемы для определения какие constraints применять */\n schemaType?: 'string' | 'number' | 'date' | 'array' | 'boolean' | 'enum' | 'unknown'\n}\n\n// =============================================================================\n// Основная функция\n// =============================================================================\n\n/**\n * Извлекает constraints из Zod схемы по пути к полю\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// Извлечение constraints по типам (Zod v4 структура)\n// =============================================================================\n\n/**\n * Тип обработчика для check\n * Получает объект constraints и checkDef, модифицирует constraints\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype CheckHandler<T> = (constraints: T, checkDef: any) => void\n\n/**\n * Общая функция извлечения constraints из Zod checks\n *\n * Паттерн handlers позволяет избежать дублирования логики итерации.\n * Каждый тип (string, number, date, array) определяет свои handlers.\n *\n * @param checks - Массив Zod checks из схемы\n * @param handlers - Объект с обработчиками для каждого типа check\n * @returns Объект constraints заполненный обработчиками\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 для строковых 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 // Точная длина = и min и max\n c.minLength = def.length\n c.maxLength = def.length\n },\n string_format: (c, def) => {\n // email(), url() и другие форматы\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 * Извлекает constraints из строковых 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 для числовых constraints\n// =============================================================================\n\nconst numberConstraintHandlers: Record<string, CheckHandler<ZodNumberConstraints>> = {\n greater_than: (c, def) => {\n // min() создаёт inclusive: true, gt() создаёт inclusive: false\n c.min = def.value\n },\n less_than: (c, def) => {\n // max() создаёт inclusive: true, lt() создаёт inclusive: false\n c.max = def.value\n },\n number_format: (c, def) => {\n // int() создаёт 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 * Извлекает constraints из числовых 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 для constraints дат\n// =============================================================================\n\nconst dateConstraintHandlers: Record<string, CheckHandler<ZodDateConstraints>> = {\n greater_than: (c, def) => {\n // min() для дат\n if (def.value) {\n c.min = formatDateToISO(def.value)\n }\n },\n less_than: (c, def) => {\n // max() для дат\n if (def.value) {\n c.max = formatDateToISO(def.value)\n }\n },\n}\n\n/**\n * Извлекает constraints из 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 для 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 * Извлекает constraints из 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// Вспомогательные функции\n// =============================================================================\n\n/**\n * Навигация к схеме по пути (переиспользуем логику из schema-meta.ts)\n * Поддерживает вложенные объекты, массивы, 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 // Пропускаем числовые индексы (для массивов используем 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 // Навигация в 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 * Форматирует дату в строку YYYY-MM-DD для HTML input[type=\"date\"]\n * Принимает Date, ISO string или 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 * Результат анализа схемы поля\n */\nexport interface FieldSchemaInfo {\n /** UI метаданные из .meta({ ui: {...} }) */\n ui?: FieldUIMeta\n /** Обязательно ли поле (не optional/nullable) */\n required: boolean\n}\n\n/**\n * Извлекает UI метаданные и статус обязательности из Zod схемы по пути поля\n *\n * Поддерживает вложенные пути вроде \"info.base.rating\" и пути массивов вроде \"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(), // необязательно\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: мета хранится в globalRegistry, доступ через метод .meta()\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 /** Обязательность поля после анализа всей цепочки */\n required: boolean\n}\n\n/**\n * Разворачивает wrapper-типы схемы (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 * Обрабатывает объекты, массивы и обёртки optional/nullable/effects/pipeline\n * Возвращает и схему, и статус обязательности\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 // Снова разворачиваем после unwrap (effects могут быть внутри optional)\n current = unwrapToBaseSchema(current)\n\n // Пропускаем числовые индексы (элементы массива используют схему элемента)\n if (/^\\d+$/.test(part)) {\n // Для массивов получаем схему элемента\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Переходим в 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 { schema: undefined, required: false }\n }\n } else {\n return { schema: undefined, required: false }\n }\n }\n\n // Разворачиваем только effects/pipeline, сохраняя default/optional для мета\n current = unwrapToBaseSchema(current)\n\n // Определяем required на основе типа обёртки, но возвращаем схему ДО unwrap\n // чтобы можно было получить мета из .meta()\n const finalUnwrap = unwrapSchemaWithRequired(current)\n\n return {\n // Возвращаем схему ДО unwrap — на ней может быть мета (.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 /** Глобальное disabled состояние из Form */\n formDisabled: boolean\n /** Глобальное readOnly состояние из Form */\n formReadOnly: boolean\n /** Автоматические constraints из Zod схемы (min, max, minLength, maxLength и т.д.) */\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 * Резолвит все props поля с учётом схемы и form-level настроек\n *\n * Приоритет:\n * 1. Props компонента (высший)\n * 2. Zod schema meta (ui: { title, placeholder, description, tooltip })\n * 3. Автоматически сгенерированная подсказка из constraints (если helperText не задан)\n * 4. Form-level настройки (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 /** Автоматические constraints из Zod схемы (min, max, minLength, maxLength и т.д.) */\n constraints: ZodConstraints\n /** Опции для select полей (из meta.options с i18n переводами) */\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 // Получаем контекст i18n (может быть null)\n const i18n = useFormI18n()\n const i18nKey = meta?.i18nKey\n\n // Резолвим переведённые значения\n // Приоритет: props > i18n перевод > 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 // Автоматическая подсказка из constraints (если helperText не задан явно)\n // Приоритет: props.helperText > i18n description > meta.description > auto-generated hint\n const autoHint = generateConstraintHint(constraints)\n const helperText = props.helperText ?? resolvedDescription ?? autoHint\n\n // Локализуем опции из meta (для select/enum полей)\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 для дополнительной настройки компонентов\n constraints,\n // Options с i18n переводами\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 после применения schema meta и form-level настроек\n */\nexport interface ResolvedFieldProps {\n /** Label (из props или schema meta) */\n label: ReactNode\n /** Placeholder */\n placeholder: string | undefined\n /** Подсказка под полем (может быть автоматически сгенерирована из constraints) */\n helperText: ReactNode\n /** Tooltip с иконкой */\n tooltip: FieldTooltipMeta | undefined\n /** Обязательное поле (из props или schema) */\n required: boolean | undefined\n /** Поле отключено (из props или form-level) */\n disabled: boolean | undefined\n /** Только для чтения (из props или form-level) */\n readOnly: boolean | undefined\n /** Автоматические constraints из Zod схемы (min, max, minLength, maxLength и т.д.) */\n constraints: ZodConstraints\n /** Опции для select полей (из meta.options с i18n переводами) */\n options: Array<{ value: string | number; label: string; disabled?: boolean; i18nKey?: string }> | undefined\n}\n\n/**\n * Props передаваемые в render функцию\n */\nexport interface FieldRenderProps<TValue = unknown, TState = Record<string, never>> {\n /** TanStack Form field API */\n field: AnyFieldApi\n /** Типизированное значение поля */\n value: TValue\n /** Полный путь к полю (например, \"user.address.city\") */\n fullPath: string\n /** Resolved props (label, placeholder, etc.) */\n resolved: ResolvedFieldProps\n /** Есть ли ошибки валидации */\n hasError: boolean\n /** Отформатированное сообщение об ошибке */\n errorMessage: string\n /** Локальное состояние компонента (из useFieldState) */\n fieldState: TState\n}\n\n/**\n * Render функция для createField\n *\n * Получает field API, resolved props, локальное состояние и должна вернуть полный JSX\n * включая Field.Root обёртку и отображение ошибок.\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 * Опции для createField\n *\n * @template P - Тип props компонента (extends BaseFieldProps)\n * @template TValue - Тип значения поля\n * @template TState - Тип локального состояния (из useFieldState)\n */\nexport interface CreateFieldOptions<P extends BaseFieldProps, TValue = unknown, TState = Record<string, never>> {\n /** Имя для React DevTools */\n displayName: string\n\n /**\n * Хук для локального состояния компонента\n *\n * Вызывается на верхнем уровне компонента, ДО form.Field.\n * Можно использовать useState, useEffect, useCallback, useMemo и другие хуки.\n *\n * @param props - Props компонента (без BaseFieldProps)\n * @param resolved - Resolved props (label, placeholder, etc.)\n * @returns Объект состояния, который будет передан в render как 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 функция (полный контроль над JSX) */\n render: FieldRenderFn<P, TValue, TState>\n}\n\n/**\n * Factory функция для создания Field компонентов с минимальным boilerplate\n *\n * Автоматически:\n * - Резолвит props из schema meta и form-level настроек\n * - Создаёт form.Field обёртку\n * - Вычисляет hasError и errorMessage\n * - Вызывает useFieldState для локального состояния (если задан)\n *\n * @example Простое поле (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 Поле с локальным состоянием (Password с 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 с кастомным лейблом\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 // Используем no-op хук по умолчанию, чтобы вызов всегда был безусловным\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 // Вызываем useFieldState на верхнем уровне (до form.Field)\n // Это позволяет использовать хуки внутри 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 // Показываем ошибки только если поле было touched (после blur или программной валидации)\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 * Компонент для отображения ошибок или подсказки\n *\n * Вспомогательный компонент для использования внутри createField render функций.\n * Показывает ошибку если есть, иначе 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// Реэкспорт для удобства\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 из createField */\n resolved: ResolvedFieldProps\n /** Есть ли ошибки валидации */\n hasError: boolean\n /** Отформатированное сообщение об ошибке */\n errorMessage: string\n /** Полный путь для data-field-name атрибута */\n fullPath: string\n /** Содержимое поля (Input, Textarea, etc.) */\n children: ReactNode\n}\n\n/**\n * Стандартная обёртка для простых полей\n *\n * Предоставляет:\n * - Field.Root с invalid/required/disabled/readOnly props\n * - FieldLabel с поддержкой tooltip\n * - FieldError с fallback на helperText\n *\n * Используй внутри createField render функции для простых Input-подобных полей\n * со стандартным 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 * Хук для debounce значения\n *\n * Задерживает обновление значения на указанное время.\n * Полезен для поисковых полей, autocomplete и других случаев,\n * когда нужно ограничить частоту запросов.\n *\n * @param value - Значение для debounce\n * @param delay - Задержка в миллисекундах (по умолчанию 300)\n * @returns Debounced значение\n *\n * @example\n * ```tsx\n * const [inputValue, setInputValue] = useState('')\n * const debouncedValue = useDebounce(inputValue, 300)\n *\n * useEffect(() => {\n * // Выполняется только когда пользователь перестал печатать\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 запроса (совместим с TanStack Query и ZenStack хуками)\n */\nexport interface AsyncQueryResult<TData = unknown> {\n data?: TData[]\n isLoading?: boolean\n error?: Error | null\n}\n\n/**\n * Функция async запроса для загрузки опций\n * @param search - Строка поиска (пустая если запрос не нужен)\n */\nexport type AsyncQueryFn<TData = unknown> = (search: string) => AsyncQueryResult<TData>\n\n/**\n * Опции для useAsyncSearch\n */\nexport interface UseAsyncSearchOptions<TData = unknown> {\n /**\n * Async функция запроса (возвращает { data, isLoading, error })\n */\n useQuery?: AsyncQueryFn<TData>\n\n /**\n * Задержка debounce в миллисекундах\n * @default 300\n */\n debounce?: number\n\n /**\n * Минимум символов для запуска поиска\n * @default 1\n */\n minChars?: number\n\n /**\n * Начальное значение ввода\n * @default ''\n */\n initialValue?: string\n}\n\n/**\n * Результат useAsyncSearch\n */\nexport interface UseAsyncSearchResult<TData = unknown> {\n /** Текущее значение ввода */\n inputValue: string\n\n /** Функция для изменения значения ввода */\n setInputValue: (value: string) => void\n\n /** Debounced значение для запроса */\n debouncedSearch: string\n\n /** Нужно ли запускать запрос (достаточно символов) */\n shouldQuery: boolean\n\n /** Идёт ли загрузка */\n isLoading: boolean\n\n /** Результат запроса (массив данных) */\n data: TData[] | undefined\n\n /** Ошибка запроса */\n error: Error | null | undefined\n}\n\n/**\n * Хук для async поиска с debounce\n *\n * Объединяет общую логику управления вводом, debounce и async запросами\n * для компонентов Combobox и Autocomplete.\n *\n * @example Использование с ZenStack хуком\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 Использование для локальной фильтрации\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 // Состояние ввода\n const [inputValue, setInputValue] = useState(initialValue)\n\n // Debounced значение для запроса\n const debouncedSearch = useDebounce(inputValue, debounce)\n\n // Нужно ли запускать запрос?\n const shouldQuery = debouncedSearch.length >= minChars\n\n // Вызов useQuery (если передан)\n // Передаём пустую строку если не должны запрашивать, чтобы хук всегда вызывался\n const queryResult = useQuery?.(shouldQuery ? debouncedSearch : '')\n\n // Извлекаем результаты\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 для SelectionFieldLabel\n */\nexport interface SelectionFieldLabelProps {\n /** Текст label */\n label: ReactNode\n /** Данные для tooltip подсказки */\n tooltip?: FieldTooltipMeta\n /** Показывать индикатор обязательного поля */\n required?: boolean\n}\n\n/**\n * Унифицированный label для selection полей (Select, Combobox, Listbox, Autocomplete).\n * Избегает дублирования паттерна HStack + FieldTooltip в 12+ файлах.\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 * Результат хука useGroupedOptions\n */\nexport interface GroupedOptionsResult<T = string> {\n /** Коллекция для Chakra компонентов (Select, Combobox, Listbox) */\n collection: ReturnType<typeof createListCollection<GroupableOption<T>>>\n /** Map групп с опциями (null если группировки нет) */\n groups: Map<string, GroupableOption<T>[]> | null\n}\n\n/**\n * Функция получения label из опции\n * Используется для itemToString в коллекции и рендеринга текста\n *\n * @example\n * ```tsx\n * // В itemToString коллекции\n * createListCollection({ items, itemToString: getOptionLabel })\n *\n * // В рендеринге\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 * Хук для создания коллекции с опциональной группировкой\n *\n * Инкапсулирует общую логику:\n * - Создание Chakra ListCollection из опций\n * - Определение наличия групп\n * - Группировка опций в Map для рендеринга\n *\n * @example Использование в 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 // Создаём коллекцию с опциональной группировкой\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 // Проверяем наличие групп и создаём 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 для Editable поля\n */\nexport interface EditableFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Placeholder при пустом значении */\n placeholder?: string\n /** Использовать textarea для многострочного редактирования (по умолчанию: false) */\n multiline?: boolean\n /** Режим активации (по умолчанию: click) */\n activationMode?: 'click' | 'dblclick' | 'focus' | 'none'\n /** Показывать кнопки управления (редактировать, отменить, сохранить) (по умолчанию: false) */\n showControls?: boolean\n /** Автоматически менять размер textarea (только для multiline=true) (по умолчанию: true) */\n autoResize?: boolean\n /** Кастомная иконка редактирования */\n editIcon?: ReactNode\n /** Кастомная иконка отмены */\n cancelIcon?: ReactNode\n /** Кастомная иконка сохранения */\n submitIcon?: ReactNode\n /** Сохранять при blur (по умолчанию: true) */\n submitOnBlur?: boolean\n}\n\n/**\n * Form.Field.Editable - Редактируемый текст inline\n *\n * Рендерит текст, который можно кликнуть для inline редактирования.\n * Поддерживает однострочный input и многострочный textarea.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Editable\n * name=\"title\"\n * label=\"Заголовок\"\n * placeholder=\"Кликните для добавления заголовка\"\n * />\n * ```\n *\n * @example Многострочный\n * ```tsx\n * <Form.Field.Editable\n * name=\"description\"\n * multiline\n * placeholder=\"Кликните для добавления описания...\"\n * />\n * ```\n *\n * @example С кнопками управления\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 ?? 'Кликните для редактирования'}\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 { useState, type ReactElement } from 'react'\nimport { LuEye, LuEyeOff } from 'react-icons/lu'\nimport type { PasswordFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Состояние для переключения видимости пароля\n */\ninterface PasswordFieldState {\n /** Видим ли пароль */\n visible: boolean\n /** Переключить видимость */\n toggle: () => void\n}\n\n/**\n * Form.Field.Password - Поле ввода пароля с переключением видимости\n *\n * Рендерит поле ввода пароля с кнопкой показа/скрытия.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Password name=\"password\" label=\"Пароль\" />\n * ```\n *\n * @example С видимым паролем по умолчанию\n * ```tsx\n * <Form.Field.Password name=\"password\" label=\"Пароль\" 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=\"Переключить видимость пароля\"\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 { useState, type ReactElement } 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 * Требования к паролю по умолчанию\n */\nconst DEFAULT_REQUIREMENTS: PasswordRequirement[] = ['minLength:8', 'uppercase', 'lowercase', 'number', 'special']\n\n/**\n * Описания требований\n */\nconst REQUIREMENT_LABELS: Record<PasswordRequirement, string> = {\n 'minLength:8': 'Минимум 8 символов',\n uppercase: 'Минимум одна заглавная буква',\n lowercase: 'Минимум одна строчная буква',\n number: 'Минимум одна цифра',\n special: 'Минимум один специальный символ (!@#$%^&*)',\n}\n\n/**\n * Проверяет соответствие пароля требованию\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 * Вычисляет силу пароля (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 * Получает описание и цвет силы пароля\n */\nfunction getStrengthInfo(strength: number): { label: string; colorPalette: string } {\n if (strength < 25) {\n return { label: 'Слабый', colorPalette: 'red' }\n }\n if (strength < 50) {\n return { label: 'Средний', colorPalette: 'orange' }\n }\n if (strength < 75) {\n return { label: 'Хороший', colorPalette: 'yellow' }\n }\n return { label: 'Сильный', colorPalette: 'green' }\n}\n\n/**\n * Состояние для поля пароля с индикатором силы\n */\ninterface PasswordStrengthFieldState {\n /** Видимость пароля */\n visible: boolean\n /** Переключить видимость */\n toggle: () => void\n}\n\n/**\n * Form.Field.PasswordStrength - Пароль с индикатором силы\n *\n * Рендерит поле пароля с визуальным индикатором силы и чеклистом требований.\n *\n * @example С требованиями по умолчанию\n * ```tsx\n * <Form.Field.PasswordStrength name=\"password\" label=\"Пароль\" showRequirements />\n * ```\n *\n * @example С кастомными требованиями\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 ?? 'Введите пароль'}\n data-field-name={fullPath}\n flex={1}\n />\n <IconButton\n aria-label={visible ? 'Скрыть пароль' : 'Показать пароль'}\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 Сила\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 { useCallback, useRef, useState, type ReactElement } from 'react'\nimport { LuImage, LuUpload, LuX } from 'react-icons/lu'\n\n/**\n * Конфигурация загрузки изображений\n */\nexport interface ImageUploadConfig {\n /** URL endpoint для загрузки */\n endpoint: string\n /** Категория изображения (для upload API) */\n category?: string\n /** Максимальный размер файла в байтах (по умолчанию: 10MB) */\n maxSize?: number\n /** Разрешённые MIME типы (по умолчанию: ['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/** Состояния загрузки */\ntype UploadState = 'idle' | 'uploading' | 'error'\n\n/**\n * Компонент для загрузки и вставки изображений в RichText редактор\n *\n * Использует Popover с drag-n-drop зоной и кнопкой выбора файла.\n * После успешной загрузки вставляет изображение в редактор.\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 по умолчанию\n const acceptTypes = config.acceptTypes ?? ['image/*']\n\n /**\n * Загрузка файла на сервер\n */\n const handleUpload = useCallback(\n async (file: File) => {\n // Проверка типа файла\n if (!file.type.startsWith('image/')) {\n setErrorMessage('Файл должен быть изображением')\n setUploadState('error')\n return\n }\n\n // Проверка размера\n if (file.size > maxSize) {\n const maxSizeMB = (maxSize / 1024 / 1024).toFixed(0)\n setErrorMessage(`Размер файла не должен превышать ${maxSizeMB}MB`)\n setUploadState('error')\n return\n }\n\n // Создаём превью\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 || 'Ошибка загрузки')\n }\n\n if (result.url) {\n // Вставляем изображение в редактор\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('URL изображения не получен')\n }\n } catch (err) {\n setErrorMessage(err instanceof Error ? err.message : 'Ошибка загрузки')\n setUploadState('error')\n } finally {\n // Очищаем превью URL\n if (preview) {\n URL.revokeObjectURL(preview)\n }\n }\n },\n [editor, config, maxSize]\n )\n\n /**\n * Обработка выбора файла через 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 // Сбрасываем input для повторного выбора того же файла\n e.target.value = ''\n },\n [handleUpload]\n )\n\n /**\n * Обработка drop события\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 * Закрытие popover и сброс состояния\n */\n const handleClose = useCallback(() => {\n setIsOpen(false)\n setUploadState('idle')\n setErrorMessage(null)\n setPreviewUrl(null)\n setIsDragging(false)\n }, [])\n\n /**\n * Повторная попытка после ошибки\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=\"Вставить изображение\"\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 {/* Состояние: idle - зона загрузки */}\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 Перетащите изображение сюда\n </Text>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n или нажмите для выбора\n </Text>\n </VStack>\n </Center>\n </Box>\n\n <Text fontSize=\"xs\" color=\"fg.muted\" textAlign=\"center\">\n PNG, JPG, WEBP до {(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 Отмена\n </Button>\n </HStack>\n </VStack>\n )}\n\n {/* Состояние: 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=\"Превью\" 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 Загрузка...\n </Text>\n </HStack>\n </Center>\n </VStack>\n )}\n\n {/* Состояние: 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=\"Превью\" 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 Отмена\n </Button>\n <Button size=\"sm\" colorPalette=\"brand\" onClick={handleRetry}>\n Попробовать снова\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 * Компонент для добавления/удаления ссылок в RichText редакторе\n *\n * Использует Popover вместо 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 // Если ссылка активна — удаляем её\n editor.chain().focus().unsetLink().run()\n } else {\n // Получаем текущий URL если есть\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 ? 'Удалить ссылку' : 'Добавить ссылку'}\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 Удалить\n </Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Отмена\n </Button>\n <Button size=\"sm\" colorPalette=\"brand\" onClick={handleSubmit} disabled={!url.trim()}>\n Применить\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 * Доступные кнопки панели инструментов\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 * Кнопки тулбара по умолчанию\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 * Конфигурация кнопки панели инструментов\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: 'Жирный',\n action: (editor) => editor?.chain().focus().toggleBold().run(),\n isActive: (editor) => editor?.isActive('bold') ?? false,\n },\n italic: {\n icon: <LuItalic />,\n label: 'Курсив',\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: 'Зачёркнутый',\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: 'Маркированный список',\n action: (editor) => editor?.chain().focus().toggleBulletList().run(),\n isActive: (editor) => editor?.isActive('bulletList') ?? false,\n },\n orderedList: {\n icon: <LuListOrdered />,\n label: 'Нумерованный список',\n action: (editor) => editor?.chain().focus().toggleOrderedList().run(),\n isActive: (editor) => editor?.isActive('orderedList') ?? false,\n },\n blockquote: {\n icon: <LuQuote />,\n label: 'Цитата',\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: 'Отменить',\n action: (editor) => editor?.chain().focus().undo().run(),\n },\n redo: {\n icon: <LuRedo />,\n label: 'Повторить',\n action: (editor) => editor?.chain().focus().redo().run(),\n },\n // Кнопка image обрабатывается отдельно через ImagePopover (аналогично link)\n image: {\n icon: <LuImage />,\n label: 'Вставить изображение',\n action: () => {\n // Действие обрабатывается через 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 * Безопасный парсинг JSON с fallback на пустой документ\n * Предотвращает крэш при невалидном 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 для RichText поля\n */\nexport interface RichTextFieldProps extends BaseFieldProps {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n /** Минимальная высота редактора (по умолчанию: 150px) */\n minHeight?: string | number\n /** Максимальная высота редактора (включает скролл) */\n maxHeight?: string | number\n /** Показывать панель инструментов (по умолчанию: true) */\n showToolbar?: boolean\n /** Кнопки панели инструментов (по умолчанию: все) */\n toolbarButtons?: ToolbarButton[]\n /** Формат вывода: 'html' или 'json' (по умолчанию: 'html') */\n outputFormat?: 'html' | 'json'\n /** Конфигурация загрузки изображений (опционально) */\n imageUpload?: ImageUploadConfig\n}\n\n// Реэкспортируем тип для удобства использования\nexport type { ImageUploadConfig }\n\n/**\n * Form.Field.RichText - WYSIWYG редактор форматированного текста\n *\n * Рендерит редактор на базе Tiptap с панелью инструментов\n * и автоматической интеграцией с формой.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.RichText name=\"content\" label=\"Контент\" />\n * ```\n *\n * @example С кастомной высотой\n * ```tsx\n * <Form.Field.RichText\n * name=\"description\"\n * label=\"Описание\"\n * minHeight=\"200px\"\n * maxHeight=\"400px\"\n * />\n * ```\n *\n * @example С ограниченной панелью инструментов\n * ```tsx\n * <Form.Field.RichText\n * name=\"comment\"\n * label=\"Комментарий\"\n * toolbarButtons={['bold', 'italic', 'link']}\n * />\n * ```\n *\n * @example JSON вывод (для хранения в БД)\n * ```tsx\n * <Form.Field.RichText\n * name=\"article\"\n * label=\"Статья\"\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 для внутреннего компонента редактора\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 * Внутренний компонент Tiptap редактора\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 // Собираем расширения динамически\n const extensions = useMemo(() => {\n // Базовые расширения\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 ?? 'Начните вводить...',\n }),\n // Добавляем Image extension только если imageUpload настроен\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\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 // Синхронизация внешних изменений значения\n useEffect(() => {\n if (!editor) {\n return\n }\n\n const currentContent = outputFormat === 'json' ? JSON.stringify(editor.getJSON()) : editor.getHTML()\n\n // Обновлять только если контент изменился (избегаем прыжка курсора)\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 // Обновление состояния редактируемости\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 // Специальная обработка для link — используем Popover вместо window.prompt\n if (button === 'link') {\n return <LinkPopover key={button} editor={editor} disabled={disabled} />\n }\n\n // Специальная обработка для image — используем ImagePopover с загрузкой\n if (button === 'image') {\n // Показываем кнопку только если imageUpload настроен\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 * Автоматически извлекает из Zod схемы:\n * - `type` из `z.string().email()` → type=\"email\", `z.string().url()` → type=\"url\"\n * - `maxLength` из `z.string().max(100)` → maxLength={100}\n * - `minLength` из `z.string().min(2)` → minLength={2}\n * - `pattern` из `z.string().regex(/.../)` → pattern=\"...\"\n * - `helperText` автоматически генерируется из constraints (\"Максимум 100 символов\")\n *\n * Props всегда имеют приоритет над автоматическими значениями из схемы.\n *\n * @example\n * ```tsx\n * <Form.Field.String name=\"title\" label=\"Title\" required />\n * ```\n *\n * @example С автоматическими constraints из Zod\n * ```tsx\n * // В схеме: z.object({ email: z.string().email().max(255) })\n * <Form.Field.String name=\"email\" />\n * // Автоматически: 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 * Автоматический inputMode по типу поля для мобильных клавиатур\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 имеют приоритет над 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: явный prop > авто из 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 * Автоматически извлекает из Zod схемы:\n * - `maxLength` из `z.string().max(500)` → maxLength={500}\n * - `helperText` автоматически генерируется из constraints (\"Максимум 500 символов\")\n *\n * Props всегда имеют приоритет над автоматическими значениями из схемы.\n *\n * @example\n * ```tsx\n * <Form.Field.Textarea name=\"description\" label=\"Description\" rows={4} />\n * ```\n *\n * @example С автоматическими constraints из Zod\n * ```tsx\n * // В схеме: z.object({ bio: z.string().max(500) })\n * <Form.Field.Textarea name=\"bio\" label=\"Bio\" autoresize />\n * // Автоматически: maxLength={500} helperText=\"Максимум 500 символов\"\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 имеют приоритет над 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 - Поле ввода валюты\n *\n * Рендерит NumberInput с форматированием валюты (символ и дробная часть).\n *\n * @example Российские рубли (по умолчанию)\n * ```tsx\n * <Form.Field.Currency name=\"price\" label=\"Цена\" />\n * ```\n *\n * @example Доллары США\n * ```tsx\n * <Form.Field.Currency name=\"amount\" label=\"Сумма\" currency=\"USD\" />\n * ```\n *\n * @example Евро с кодом валюты\n * ```tsx\n * <Form.Field.Currency\n * name=\"total\"\n * label=\"Итого\"\n * currency=\"EUR\"\n * currencyDisplay=\"code\"\n * />\n * ```\n */\n/** Состояние поля валюты */\ninterface CurrencyFieldState {\n /** Мемоизированные опции форматирования */\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 // Мемоизируем formatOptions на верхнем уровне компонента\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 * Автоматически извлекает из Zod схемы:\n * - `min` из `z.number().min(1)` → min={1}\n * - `max` из `z.number().max(100)` → max={100}\n * - `step` из `z.number().int()` → step={1}, или `z.number().multipleOf(0.5)` → step={0.5}\n * - `helperText` автоматически генерируется из constraints (\"От 1 до 100\")\n *\n * Props всегда имеют приоритет над автоматическими значениями из схемы.\n *\n * @example\n * ```tsx\n * <Form.Field.Number name=\"portions\" label=\"Portions\" />\n * // С z.number().min(1).max(100) автоматически: min={1} max={100} helperText=\"От 1 до 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 имеют приоритет над 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 // Для опциональных полей не передаём min/max в NumberInput когда значение пустое,\n // иначе Chakra будет показывать invalid state для пустого значения\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 - Числовое поле с расширенными опциями\n *\n * Расширяет базовое Number поле форматированием, поддержкой колеса мыши и др.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.NumberInput name=\"quantity\" label=\"Количество\" min={1} max={100} />\n * ```\n *\n * @example С форматированием валюты\n * ```tsx\n * <Form.Field.NumberInput\n * name=\"price\"\n * label=\"Цена\"\n * formatOptions={{ style: 'currency', currency: 'RUB' }}\n * />\n * ```\n *\n * @example С колесом мыши\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 - Поле ввода процентов\n *\n * Рендерит NumberInput с форматированием процентов и символом %.\n * Значение хранится как есть (50 = 50%), а не как десятичная дробь (0.5).\n *\n * @example Базовое использование (0-100%)\n * ```tsx\n * <Form.Field.Percentage name=\"discount\" label=\"Скидка\" />\n * ```\n *\n * @example С кастомным диапазоном\n * ```tsx\n * <Form.Field.Percentage name=\"margin\" label=\"Маржа\" min={0} max={50} />\n * ```\n *\n * @example С десятичными\n * ```tsx\n * <Form.Field.Percentage name=\"rate\" label=\"Ставка\" decimalScale={2} step={0.1} />\n * ```\n */\n/** Состояние поля процентов */\ninterface PercentageFieldState {\n /** Мемоизированные опции форматирования */\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 // Используем 'unit' стиль с percent, чтобы хранить целые числа (50 = 50%)\n // Стиль 'percent' от Chakra ожидает десятичные (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 для Rating поля\n */\nexport interface RatingFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Количество элементов рейтинга (по умолчанию: 5) */\n count?: number\n /** Разрешить половинные значения (по умолчанию: false) */\n allowHalf?: boolean\n /** Размер: xs, sm, md, lg (по умолчанию: md) */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Цветовая палитра (по умолчанию: gray) */\n colorPalette?: 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink'\n /** Кастомная иконка (по умолчанию: звезда) */\n icon?: ReactNode\n /** Callback при изменении значения */\n onValueChange?: (value: number) => void\n}\n\n/**\n * Form.Field.Rating - Поле ввода рейтинга со звёздами\n *\n * Рендерит Chakra RatingGroup с автоматической интеграцией с формой.\n * Значение формы хранится как число.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Rating name=\"rating\" label=\"Рейтинг\" />\n * ```\n *\n * @example С кастомным количеством и цветом\n * ```tsx\n * <Form.Field.Rating\n * name=\"quality\"\n * label=\"Качество\"\n * count={10}\n * colorPalette=\"orange\"\n * />\n * ```\n *\n * @example С половинными значениями\n * ```tsx\n * <Form.Field.Rating\n * name=\"score\"\n * label=\"Оценка\"\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 * Определение метки для слайдера\n */\nexport interface SliderMark {\n /** Значение на шкале */\n value: number\n /** Текст метки */\n label?: ReactNode\n}\n\n/**\n * Props для Slider поля\n */\nexport interface SliderFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n /** Минимальное значение (по умолчанию: 0) */\n min?: number\n /** Максимальное значение (по умолчанию: 100) */\n max?: number\n /** Шаг (по умолчанию: 1) */\n step?: number\n /** Показывать текущее значение рядом с label */\n showValue?: boolean\n /** Ориентация (по умолчанию: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Размер (по умолчанию: md) */\n size?: 'sm' | 'md' | 'lg'\n /** Вариант (по умолчанию: outline) */\n variant?: 'outline' | 'solid'\n /** Цветовая палитра */\n colorPalette?: 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink'\n /** Метки на треке слайдера */\n marks?: (number | SliderMark)[]\n /** Начальная точка заливки (по умолчанию: start) */\n origin?: 'start' | 'center' | 'end'\n /** Callback при изменении значения */\n onValueChange?: (value: number) => void\n /** Callback при окончании перетаскивания */\n onValueChangeEnd?: (value: number) => void\n}\n\n/**\n * Form.Field.Slider - Поле слайдера\n *\n * Рендерит Chakra Slider с автоматической интеграцией с формой.\n * Значение формы хранится как число.\n *\n * Автоматически извлекает из Zod схемы:\n * - `min` из `z.number().min(1)` → min={1}\n * - `max` из `z.number().max(100)` → max={100}\n * - `step` из `z.number().int()` → step={1}, или `z.number().multipleOf(0.5)` → step={0.5}\n * - `helperText` автоматически генерируется из constraints (\"От 1 до 100\")\n *\n * Props всегда имеют приоритет над автоматическими значениями из схемы.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Slider name=\"volume\" label=\"Громкость\" />\n * ```\n *\n * @example С автоматическими constraints из Zod\n * ```tsx\n * // В схеме: z.object({ rating: z.number().min(1).max(10) })\n * <Form.Field.Slider name=\"rating\" label=\"Рейтинг\" showValue />\n * // Автоматически: min={1} max={10} helperText=\"От 1 до 10\"\n * ```\n *\n * @example С метками\n * ```tsx\n * <Form.Field.Slider\n * name=\"rating\"\n * label=\"Рейтинг\"\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 имеют приоритет над constraints, потом дефолты\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 // Нормализация меток в массив объектов\n const normalizedMarks = marks?.map((mark) => (typeof mark === 'number' ? { value: mark, label: undefined } : mark))\n\n // Конвертация числа в массив для 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 * Автоматически извлекает из Zod схемы:\n * - `min` из `z.date().min(new Date('2024-01-01'))` → min=\"2024-01-01\"\n * - `max` из `z.date().max(new Date('2024-12-31'))` → max=\"2024-12-31\"\n * - `helperText` автоматически генерируется из constraints (\"С 1 января 2024 г. по 31 декабря 2024 г.\")\n *\n * Props всегда имеют приоритет над автоматическими значениями из схемы.\n *\n * @example\n * ```tsx\n * <Form.Field.Date name=\"birthDate\" label=\"Date of Birth\" />\n * ```\n *\n * @example С автоматическими constraints из Zod\n * ```tsx\n * // В схеме: 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 * // Автоматически: 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 имеют приоритет над 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 * Тип значения диапазона дат\n */\nexport interface DateRangeValue {\n start: string\n end: string\n}\n\n/**\n * Типы пресетов для быстрого выбора диапазона дат\n */\nexport type DateRangePreset = 'today' | 'yesterday' | 'thisWeek' | 'lastWeek' | 'thisMonth' | 'lastMonth' | 'thisYear'\n\n/**\n * Props для Form.Field.DateRange\n */\nexport interface DateRangeFieldProps extends BaseFieldProps {\n /** Label для начальной даты */\n startLabel?: string\n /** Label для конечной даты */\n endLabel?: string\n /** Placeholder для начальной даты */\n startPlaceholder?: string\n /** Placeholder для конечной даты */\n endPlaceholder?: string\n /** Минимальная дата (формат YYYY-MM-DD) */\n min?: string\n /** Максимальная дата (формат YYYY-MM-DD) */\n max?: string\n /** Включить кнопки пресетов */\n presets?: DateRangePreset[]\n /** Ориентация полей даты */\n orientation?: 'horizontal' | 'vertical'\n /** Размер */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n}\n\n/**\n * Получить диапазон дат для пресета\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) // Понедельник\n const endOfWeek = new Date(startOfWeek)\n endOfWeek.setDate(startOfWeek.getDate() + 6) // Воскресенье\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) // Прошлый понедельник\n const endOfLastWeek = new Date(startOfLastWeek)\n endOfLastWeek.setDate(startOfLastWeek.getDate() + 6) // Прошлое воскресенье\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 * Получить label для пресета\n */\nfunction getPresetLabel(preset: DateRangePreset): string {\n switch (preset) {\n case 'today':\n return 'Сегодня'\n case 'yesterday':\n return 'Вчера'\n case 'thisWeek':\n return 'Эта неделя'\n case 'lastWeek':\n return 'Прошлая неделя'\n case 'thisMonth':\n return 'Этот месяц'\n case 'lastMonth':\n return 'Прошлый месяц'\n case 'thisYear':\n return 'Этот год'\n }\n}\n\n/**\n * Form.Field.DateRange - Выбор диапазона дат с двумя полями\n *\n * Рендерит два поля даты для выбора диапазона с опциональными пресетами.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.DateRange name=\"period\" label=\"Период\" />\n * ```\n *\n * @example С пресетами\n * ```tsx\n * <Form.Field.DateRange\n * name=\"period\"\n * label=\"Период\"\n * startLabel=\"С\"\n * endLabel=\"По\"\n * presets={['today', 'thisWeek', 'thisMonth']}\n * />\n * ```\n *\n * @example Вертикальная ориентация\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 = 'Начало',\n endLabel = 'Конец',\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 {/* Начальная дата */}\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 {/* Конечная дата */}\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 {/* Меню пресетов */}\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 Пресеты\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 * Парсит datetime строку в отдельные части даты и времени\n */\nfunction parseDateTime(value: string | undefined): { date: string; time: string } {\n if (!value) {\n return { date: '', time: '' }\n }\n\n // Обработка ISO формата: 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 * Комбинирует дату и время в ISO datetime строку\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 - Комбинированный выбор даты и времени\n *\n * Рендерит поля даты и времени, которые создают ISO datetime строку.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.DateTimePicker name=\"appointmentAt\" label=\"Запись\" />\n * ```\n *\n * @example С ограничениями min/max\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 // Конвертация Date в строку если нужно\n const minDateTimeStr =\n minDateTime instanceof Date ? minDateTime.toISOString().slice(0, 16) : minDateTime?.slice(0, 16)\n const maxDateTimeStr =\n maxDateTime instanceof Date ? maxDateTime.toISOString().slice(0, 16) : 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 * Конвертирует минуты в формат ЧЧ:ММ\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 * Конвертирует ЧЧ:ММ в минуты\n */\nfunction hhmmToMinutes(hours: number, mins: number): number {\n return hours * 60 + mins\n}\n\n/**\n * Form.Field.Duration - Поле ввода длительности\n *\n * Рендерит поле длительности с часами и минутами или только минутами.\n * Значение хранится как общее количество минут.\n *\n * @example Формат ЧЧ:ММ (по умолчанию)\n * ```tsx\n * <Form.Field.Duration name=\"duration\" label=\"Длительность\" />\n * ```\n *\n * @example Только минуты\n * ```tsx\n * <Form.Field.Duration name=\"duration\" format=\"minutes\" />\n * ```\n *\n * @example С ограничениями min/max\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 // Формат только минуты\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 ?? 'мин'} data-field-name={fullPath} />\n </NumberInput.Root>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\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 <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 * Временной слот\n */\nexport interface TimeSlot {\n open: string\n close: string\n}\n\n/**\n * Расписание на день (null = выходной)\n */\nexport type DaySchedule = TimeSlot | null\n\n/**\n * Недельное расписание\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 * День недели\n */\nexport type DayOfWeek = keyof WeeklySchedule\n\n/**\n * Конфигурация дней\n */\nconst DAYS_OF_WEEK: DayOfWeek[] = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']\n\nconst DEFAULT_DAY_NAMES: Record<DayOfWeek, string> = {\n monday: 'Понедельник',\n tuesday: 'Вторник',\n wednesday: 'Среда',\n thursday: 'Четверг',\n friday: 'Пятница',\n saturday: 'Суббота',\n 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 * Константы для стилизации кастомного switch\n * Используется нативный checkbox вместо Chakra Switch для совместимости с RHF\n */\nconst SWITCH_STYLES = {\n /** Ширина трека switch */\n trackWidth: '36px',\n /** Высота трека switch */\n trackHeight: '20px',\n /** Размер круглого индикатора (thumb) */\n thumbSize: '16px',\n /** Отступ thumb от края (2px с каждой стороны для центрирования в 20px треке) */\n thumbOffset: '2px',\n /** Позиция thumb во включённом состоянии (trackWidth - thumbSize - thumbOffset = 36 - 16 - 2 = 18) */\n thumbEnabledLeft: '18px',\n} as const\n\n/**\n * Проверяет что время окончания после времени начала\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 * Внутренний компонент для рендеринга расписания.\n * Вынесен отдельно для соблюдения правил React хуков.\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 // Проверка невалидных временных диапазонов\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 {/* Предупреждение о невалидных диапазонах */}\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 Время окончания должно быть позже времени начала: {invalidDays.map((d) => mergedDayNames[d]).join(', ')}\n </Text>\n </Box>\n )}\n\n {/* Быстрые действия */}\n {showCopyToWeekdays && days.includes('monday') && (\n <HStack gap={2} flexWrap=\"wrap\">\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Быстрые действия:\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 {/* Список дней */}\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 {/* День и переключатель */}\n <HStack gap={3} minW=\"140px\">\n {/* Нативный чекбокс стилизованный как 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 {/* Поля времени */}\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 для Schedule поля\n */\nexport interface ScheduleFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n\n /**\n * Кастомные названия дней (для локализации)\n */\n dayNames?: Partial<Record<DayOfWeek, string>>\n\n /**\n * Расписание по умолчанию при пустом значении\n */\n defaultSchedule?: WeeklySchedule\n\n /**\n * Дни для отображения (подмножество всех дней)\n * @default все дни\n */\n days?: DayOfWeek[]\n\n /**\n * Показывать кнопку \"скопировать на будни\"\n * @default true\n */\n showCopyToWeekdays?: boolean\n\n /**\n * Текст для состояния \"выходной\"\n * @default 'Выходной'\n */\n offLabel?: string\n\n /**\n * Текст кнопки копирования на будни\n * @default 'Скопировать Пн на будни'\n */\n copyToWeekdaysLabel?: string\n\n /**\n * Время открытия по умолчанию при включении дня\n */\n defaultOpenTime?: string\n\n /**\n * Время закрытия по умолчанию при включении дня\n */\n defaultCloseTime?: string\n}\n\n/**\n * Form.Field.Schedule - Редактор недельного расписания\n *\n * Рендерит редактор расписания рабочих часов с переключателями\n * и полями времени для каждого дня недели.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Schedule\n * name=\"workingHours\"\n * label=\"Рабочие часы\"\n * />\n * ```\n *\n * @example С кастомными названиями дней\n * ```tsx\n * <Form.Field.Schedule\n * name=\"schedule\"\n * dayNames={{\n * monday: 'Пн',\n * tuesday: 'Вт',\n * // ...\n * }}\n * offLabel=\"Выходной\"\n * copyToWeekdaysLabel=\"Скопировать Пн на будни\"\n * />\n * ```\n *\n * @example Только будние дни\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 = 'Выходной',\n copyToWeekdaysLabel = 'Скопировать Пн на будни',\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 // Объединение названий дней\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 для Form.Field.Autocomplete\n */\nexport interface AutocompleteFieldProps<TData = unknown> extends BaseFieldProps {\n /**\n * Статические подсказки для автодополнения\n */\n suggestions?: string[]\n\n /**\n * Async функция запроса для загрузки подсказок\n * Должна возвращать { data, isLoading, error } аналогично 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 * Получить label из элемента данных запроса\n * Обязательно при использовании useQuery\n */\n getLabel?: (item: TData) => string\n\n /**\n * Задержка debounce в миллисекундах\n * @default 300\n */\n debounce?: number\n\n /**\n * Минимум символов для показа подсказок\n * @default 1\n */\n minChars?: number\n\n /**\n * Размер компонента\n * @default 'md'\n */\n size?: FieldSize\n\n /**\n * Визуальный вариант\n * @default 'outline'\n */\n variant?: 'outline' | 'subtle' | 'flushed'\n\n /**\n * Сообщение при пустом результате\n * @default \"Нет подсказок\"\n */\n emptyMessage?: string\n\n /**\n * Сообщение при загрузке\n * @default \"Загрузка...\"\n */\n loadingMessage?: string\n}\n\n/**\n * Элемент подсказки\n */\ninterface AutocompleteItem {\n label: string\n value: string\n}\n\n/** Тип состояния для 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 - Текстовый ввод с подсказками\n *\n * Упрощённая версия Combobox, всегда допускающая кастомные значения.\n * Идеально для названий городов, продуктов или любого свободного ввода с подсказками.\n *\n * @example Статические подсказки\n * ```tsx\n * <Form.Field.Autocomplete\n * name=\"city\"\n * label=\"Город\"\n * suggestions={['Москва', 'Санкт-Петербург', 'Казань', 'Новосибирск']}\n * />\n * ```\n *\n * @example Async подсказки с ZenStack\n * ```tsx\n * <Form.Field.Autocomplete\n * name=\"product\"\n * label=\"Продукт\"\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 поиск с debounce через общий хук\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 // Фильтр для статических подсказок\n const { contains } = useFilter({ sensitivity: 'base' })\n\n // Формирование списка подсказок\n const suggestions = useMemo((): AutocompleteItem[] => {\n if (componentProps.suggestions) {\n // Фильтрация статических подсказок по значению ввода\n const filtered = inputValue\n ? componentProps.suggestions.filter((s) => contains(s, inputValue))\n : componentProps.suggestions.slice(0, 10) // Первые 10 при пустом вводе\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 // Создание коллекции\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 // Всегда обновляем значение поля (поведение allowCustomValue)\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 ?? 'Начните ввод...'} />\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 {/* Состояние загрузки */}\n {fieldState.isLoading && fieldState.suggestions.length === 0 && (\n <Combobox.Empty>{componentProps.loadingMessage ?? 'Загрузка...'}</Combobox.Empty>\n )}\n\n {/* Пустой результат */}\n {!fieldState.isLoading &&\n fieldState.suggestions.length === 0 &&\n fieldState.inputValue.length >= minChars && (\n <Combobox.Empty>{componentProps.emptyMessage ?? 'Нет подсказок'}</Combobox.Empty>\n )}\n\n {/* Подсказка о минимуме символов */}\n {!fieldState.isLoading &&\n fieldState.suggestions.length === 0 &&\n fieldState.inputValue.length < minChars &&\n fieldState.inputValue.length > 0 && (\n <Combobox.Empty>Введите минимум {minChars} символов</Combobox.Empty>\n )}\n\n {/* Подсказки */}\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 для CheckboxCard поля\n */\nexport interface CheckboxCardFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n /** Опции для карточек */\n options: RichOption<T>[]\n /** Размер (по умолчанию: md) */\n size?: FieldSizeWithoutXs\n /** Визуальный вариант (по умолчанию: outline) */\n variant?: 'surface' | 'subtle' | 'outline' | 'solid'\n /** Цветовая палитра */\n colorPalette?: string\n /** Выравнивание контента (по умолчанию: start) */\n align?: 'start' | 'end' | 'center'\n /** Ориентация (по умолчанию: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Отступ между карточками (по умолчанию: 2) */\n gap?: number | string\n}\n\n/**\n * Form.Field.CheckboxCard - Множественный выбор в виде карточек\n *\n * Рендерит группу checkbox карточек для выбора нескольких опций.\n * Каждая карточка может иметь label, описание и иконку.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.CheckboxCard\n * name=\"features\"\n * label=\"Выберите функции\"\n * options={[\n * { label: 'TypeScript', value: 'ts', description: 'Типизация' },\n * { label: 'ESLint', value: 'eslint', description: 'Качество кода' },\n * { label: 'Prettier', value: 'prettier', description: 'Форматирование' },\n * ]}\n * />\n * ```\n *\n * @example С иконками\n * ```tsx\n * <Form.Field.CheckboxCard\n * name=\"permissions\"\n * options={[\n * { label: 'Админ', value: 'admin', icon: <ShieldIcon /> },\n * { label: 'Пользователь', 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 // Значение всегда массив для checkbox карточек\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 для Form.Field.Combobox\n */\nexport interface ComboboxFieldProps<T = string, TData = unknown> extends BaseFieldProps {\n /**\n * Статические опции (взаимоисключающе с useQuery)\n */\n options?: GroupableOption<T>[]\n\n /**\n * Async функция запроса для загрузки опций\n * Должна возвращать { data, isLoading, error } аналогично 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 * Получить label из элемента данных\n * Обязательно при использовании useQuery\n */\n getLabel?: (item: TData) => ReactNode\n\n /**\n * Получить value из элемента данных\n * Обязательно при использовании useQuery\n */\n getValue?: (item: TData) => T\n\n /**\n * Получить ключ группы из элемента данных\n * Опционально, для группировки результатов\n */\n getGroup?: (item: TData) => string | undefined\n\n /**\n * Проверить, отключён ли элемент\n */\n getDisabled?: (item: TData) => boolean\n\n /**\n * Задержка debounce в миллисекундах\n * @default 300\n */\n debounce?: number\n\n /**\n * Минимум символов для запуска поиска\n * @default 1\n */\n minChars?: number\n\n /**\n * Показывать кнопку очистки\n * Автоопределяется из схемы если не указано\n */\n clearable?: boolean\n\n /**\n * Разрешить кастомные значения не из списка\n * @default false\n */\n allowCustomValue?: boolean\n\n /**\n * Размер компонента\n */\n size?: FieldSize\n\n /**\n * Визуальный вариант\n */\n variant?: 'outline' | 'subtle' | 'flushed'\n\n /**\n * Сообщение при пустом результате\n * @default \"Ничего не найдено\"\n */\n emptyMessage?: string\n\n /**\n * Сообщение при загрузке\n * @default \"Загрузка...\"\n */\n loadingMessage?: string\n}\n\n/** Тип состояния для 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 поисковый select с debounce и группировкой\n *\n * Поддерживает как статические опции, так и async загрузку через TanStack Query хуки.\n *\n * @example Статические опции\n * ```tsx\n * <Form.Field.Combobox\n * name=\"framework\"\n * label=\"Фреймворк\"\n * options={[\n * { label: 'React', value: 'react' },\n * { label: 'Vue', value: 'vue', group: 'Frontend' },\n * ]}\n * />\n * ```\n *\n * @example Async с ZenStack хуками\n * ```tsx\n * <Form.Field.Combobox\n * name=\"userId\"\n * label=\"Пользователь\"\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 поиск с debounce через общий хук\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 // Фильтр для статических опций\n const { contains } = useFilter({ sensitivity: 'base' })\n\n // Формирование опций из статического или async источника\n const options = useMemo((): GroupableOption[] => {\n if (componentProps.options) {\n // Фильтрация статических опций по значению ввода\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 // Создание коллекции с группировкой через общий хук\n const { collection, groups } = useGroupedOptions(options)\n\n // Автоопределение 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 ?? 'Поиск...'} />\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 {/* Состояние загрузки */}\n {fieldState.isLoading && fieldState.options.length === 0 && (\n <Combobox.Empty>{componentProps.loadingMessage ?? 'Загрузка...'}</Combobox.Empty>\n )}\n\n {/* Пустой результат */}\n {!fieldState.isLoading &&\n fieldState.options.length === 0 &&\n fieldState.inputValue.length >= minChars && (\n <Combobox.Empty>{componentProps.emptyMessage ?? 'Ничего не найдено'}</Combobox.Empty>\n )}\n\n {/* Подсказка о минимуме символов */}\n {!fieldState.isLoading &&\n fieldState.options.length === 0 &&\n fieldState.inputValue.length < minChars &&\n fieldState.inputValue.length > 0 && (\n <Combobox.Empty>Введите минимум {minChars} символов</Combobox.Empty>\n )}\n\n {/* Сгруппированные опции */}\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 : /* Плоские опции */\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 для Listbox поля\n */\nexport interface ListboxFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Опции для listbox */\n options: GroupableOption<T>[]\n /**\n * Режим выбора\n * - `single`: Выбор одного элемента (по умолчанию)\n * - `multiple`: Выбор нескольких элементов\n */\n selectionMode?: 'single' | 'multiple'\n /** Размер */\n size?: FieldSizeWithoutXs\n /** Визуальный вариант */\n variant?: 'subtle' | 'solid' | 'plain'\n /** Цветовая палитра */\n colorPalette?: string\n /** Ориентация элементов (по умолчанию: vertical) */\n orientation?: 'horizontal' | 'vertical'\n /** Максимальная высота для скролла */\n maxHeight?: string | number\n}\n\n/** Тип состояния для useFieldState */\ntype ListboxFieldState = GroupedOptionsResult\n\n/**\n * Form.Field.Listbox - Список выбора с видимыми опциями\n *\n * В отличие от Select/Combobox которые используют dropdown, Listbox показывает\n * все опции прямо в форме. Хорошо подходит для коротких списков (2-8 элементов)\n * где все опции должны быть видны.\n *\n * @example Единичный выбор\n * ```tsx\n * <Form.Field.Listbox\n * name=\"framework\"\n * label=\"Фреймворк\"\n * options={[\n * { label: 'React', value: 'react' },\n * { label: 'Vue', value: 'vue' },\n * { label: 'Angular', value: 'angular' },\n * ]}\n * />\n * ```\n *\n * @example Множественный выбор\n * ```tsx\n * <Form.Field.Listbox\n * name=\"features\"\n * label=\"Функции\"\n * selectionMode=\"multiple\"\n * options={[\n * { label: 'TypeScript', value: 'ts' },\n * { label: 'Тестирование', value: 'test' },\n * { label: 'Линтинг', value: 'lint' },\n * ]}\n * />\n * ```\n *\n * @example С группами\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 // Используем общий хук для группировки опций\n return useGroupedOptions(componentProps.options)\n },\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n // Обработка single vs multiple значений\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: сохраняем одно значение или пустую строку\n const newValue = details.value[0] as string | undefined\n field.handleChange(newValue ?? '')\n } else {\n // Multiple mode: сохраняем массив\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 ? /* Сгруппированные опции */\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 : /* Плоские опции */\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 для обратной совместимости\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 для RadioCard поля\n */\nexport interface RadioCardFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n /** Опции для карточек */\n options: RichOption<T>[]\n /** Размер (по умолчанию: md) */\n size?: FieldSizeWithoutXs\n /** Визуальный вариант (по умолчанию: outline) */\n variant?: 'surface' | 'subtle' | 'outline' | 'solid'\n /** Цветовая палитра */\n colorPalette?: string\n /** Выравнивание контента (по умолчанию: start) */\n align?: 'start' | 'end' | 'center'\n /** Ориентация (по умолчанию: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Отступ между карточками (по умолчанию: 2) */\n gap?: number | string\n /** Включить улучшенную навигацию клавиатурой с циклом (по умолчанию: false) */\n keyboardNavigation?: boolean\n}\n\n/** Тип состояния для 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 - Выбор одного варианта в виде карточек\n *\n * Рендерит группу radio карточек для выбора одной опции.\n * Каждая карточка может иметь label, описание и иконку.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.RadioCard\n * name=\"plan\"\n * label=\"Выберите план\"\n * options={[\n * { label: 'Бесплатный', value: 'free', description: 'Базовые функции' },\n * { label: 'Про', value: 'pro', description: 'Все функции' },\n * { label: 'Корпоративный', value: 'enterprise', description: 'Кастомизация' },\n * ]}\n * />\n * ```\n *\n * @example С иконками\n * ```tsx\n * <Form.Field.RadioCard\n * name=\"role\"\n * options={[\n * { label: 'Админ', value: 'admin', icon: <ShieldIcon /> },\n * { label: 'Пользователь', 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 // Получаем только включённые опции для навигации клавиатурой\n const enabledOptions = componentProps.options.filter((opt) => !opt.disabled)\n\n // Обработка навигации клавиатурой с циклом\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 // Вперёд (цикл к первому если в конце)\n newIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % enabledOptions.length\n } else {\n // Назад (цикл к последнему если в начале)\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 для RadioGroup поля\n */\nexport interface RadioGroupFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Опции для radio группы */\n options: BaseOption<T>[]\n /** Ориентация (по умолчанию: vertical) */\n orientation?: 'horizontal' | 'vertical'\n /** Размер */\n size?: FieldSize\n /** Визуальный вариант */\n variant?: 'outline' | 'subtle' | 'solid'\n /** Цветовая палитра */\n colorPalette?: string\n}\n\n/**\n * Form.Field.RadioGroup - Группа radio кнопок для единичного выбора\n *\n * Рендерит группу radio кнопок для взаимоисключающих опций.\n * Используй Select для длинных списков, RadioGroup для коротких (2-5 опций).\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.RadioGroup\n * name=\"size\"\n * label=\"Размер\"\n * options={[\n * { label: 'Маленький', value: 'sm' },\n * { label: 'Средний', value: 'md' },\n * { label: 'Большой', value: 'lg' },\n * ]}\n * />\n * ```\n *\n * @example Горизонтальная раскладка\n * ```tsx\n * <Form.Field.RadioGroup\n * name=\"priority\"\n * orientation=\"horizontal\"\n * options={[\n * { label: 'Низкий', value: 'low' },\n * { label: 'Средний', value: 'medium' },\n * { label: 'Высокий', 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 >\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 для SegmentedGroup поля\n */\nexport interface SegmentedGroupFieldProps<T = string> extends Omit<BaseFieldProps, 'placeholder'> {\n /** Опции для сегментированного контрола */\n options: BaseOption<T>[]\n /** Размер (по умолчанию: md) */\n size?: FieldSize\n /** Ориентация (по умолчанию: horizontal) */\n orientation?: 'horizontal' | 'vertical'\n /** Цветовая палитра */\n colorPalette?: string\n}\n\n/**\n * Form.Field.SegmentedGroup - Сегментированный контрол для единичного выбора\n *\n * Рендерит сегментированный контрол для выбора одной опции из набора.\n * Похож на radio кнопки, но стилизован как соединённые сегменты.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.SegmentedGroup\n * name=\"size\"\n * label=\"Размер\"\n * options={[\n * { label: 'S', value: 'sm' },\n * { label: 'M', value: 'md' },\n * { label: 'L', value: 'lg' },\n * ]}\n * />\n * ```\n *\n * @example Разные размеры\n * ```tsx\n * <Form.Field.SegmentedGroup\n * name=\"billing\"\n * options={[\n * { label: 'Месячная', value: 'monthly' },\n * { label: 'Годовая', 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 { useMemo, type ReactElement } from 'react'\nimport type { BaseFieldProps, BaseOption, FieldSize } from '../../types'\nimport { createField, FieldError, getOptionLabel, SelectionFieldLabel, type ResolvedFieldProps } from '../base'\n\n/** Нормализованная опция (value всегда string для Chakra) */\ninterface NormalizedOption {\n label: React.ReactNode\n value: string\n disabled?: boolean\n}\n\n/**\n * Props для Select поля\n */\nexport interface SelectFieldProps extends BaseFieldProps {\n /** Опции для выбора (string или number значения). Если не указаны — берутся из schema meta */\n options?: BaseOption<string | number>[]\n /** Тип значения: 'string' (по умолчанию) или 'number' */\n valueType?: 'string' | 'number'\n /** Показывать кнопку очистки (автоопределение: true если optional, false если required) */\n clearable?: boolean\n /** Размер */\n size?: FieldSize\n /** Визуальный вариант */\n variant?: 'outline' | 'subtle'\n}\n\n/** Тип состояния для useFieldState */\ninterface SelectFieldState {\n collection: ReturnType<typeof createListCollection<NormalizedOption>>\n normalizedOptions: NormalizedOption[]\n resolvedClearable: boolean\n}\n\n/**\n * Form.Field.Select - Стилизованный Chakra Select dropdown\n *\n * Стилизованный select компонент с кастомизируемым внешним видом,\n * анимациями и расширенными функциями (поиск, очистка, кастомный рендеринг).\n *\n * Для простых случаев или лучшего мобильного UX используй Form.Field.NativeSelect.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Select\n * name=\"framework\"\n * label=\"Фреймворк\"\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 // Опции: props имеют приоритет, fallback на schema meta\n const sourceOptions = componentProps.options ?? resolved.options ?? []\n\n // Нормализуем опции — value всегда string для 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 // Создаём коллекцию из нормализованных опций\n const collection = useMemo(\n () =>\n createListCollection({\n items: normalizedOptions,\n itemToString: getOptionLabel,\n itemToValue: (item) => item.value,\n }),\n [normalizedOptions]\n )\n\n // Автоопределение clearable: показывать кнопку очистки если поле 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 // Преобразуем текущее значение в строку для 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 // Преобразуем обратно в нужный тип\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 для Form.Field.Tags\n */\nexport interface TagsFieldProps extends BaseFieldProps {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n /** Максимальное количество тегов */\n maxTags?: number\n /** Минимальная длина каждого тега (по умолчанию: 1) */\n minTagLength?: number\n /** Кастомный разделитель (regex или строка). По умолчанию Enter */\n delimiter?: RegExp | string\n /** Добавлять теги при blur (по умолчанию: false) */\n addOnBlur?: boolean\n /** Добавлять теги при вставке (по умолчанию: true) */\n addOnPaste?: boolean\n /** Разрешить редактирование тегов по клику (по умолчанию: false) */\n editable?: boolean\n /** Показывать кнопку очистки (по умолчанию: false) */\n clearable?: boolean\n /** Размер (по умолчанию: md) */\n size?: 'xs' | 'sm' | 'md' | 'lg'\n /** Визуальный вариант (по умолчанию: outline) */\n variant?: 'outline' | 'subtle' | 'flushed'\n /** Цветовая палитра для тегов */\n colorPalette?: string\n}\n\n/**\n * Form.Field.Tags - Поле ввода тегов\n *\n * Рендерит input для добавления/удаления строковых тегов.\n * Интегрируется с Chakra UI TagsInput компонентом.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Tags name=\"tags\" label=\"Теги\" placeholder=\"Добавить тег...\" />\n * ```\n *\n * @example С ограничениями\n * ```tsx\n * <Form.Field.Tags\n * name=\"categories\"\n * label=\"Категории\"\n * maxTags={5}\n * minTagLength={2}\n * helperText=\"До 5 категорий\"\n * />\n * ```\n *\n * @example С кастомным разделителем\n * ```tsx\n * <Form.Field.Tags\n * name=\"emails\"\n * label=\"Email адреса\"\n * delimiter={/[;,\\s]/}\n * addOnPaste\n * />\n * ```\n *\n * @example Редактируемые теги\n * ```tsx\n * <Form.Field.Tags\n * name=\"tags\"\n * label=\"Теги\"\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","'use client'\n\nimport { Box, Field, Input, List, Spinner, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport type { AddressFieldProps, AddressValue, DaDataSuggestion } from '../../types'\nimport { createField, FieldError, FieldLabel, useDebounce } from '../base'\n\n/**\n * Состояние для поля адреса\n */\ninterface AddressFieldState {\n /** Текущее значение ввода */\n inputValue: string\n /** Установить значение ввода */\n setInputValue: (value: string) => void\n /** Список подсказок */\n suggestions: DaDataSuggestion[]\n /** Установить подсказки */\n setSuggestions: (suggestions: DaDataSuggestion[]) => void\n /** Индикатор загрузки */\n isLoading: boolean\n /** Установить индикатор загрузки */\n setIsLoading: (loading: boolean) => void\n /** Открыт ли выпадающий список */\n isOpen: boolean\n /** Установить состояние открытия */\n setIsOpen: (open: boolean) => void\n /** Индекс выделенного элемента */\n highlightedIndex: number\n /** Установить индекс выделенного элемента */\n setHighlightedIndex: (index: number) => void\n /** Ref контейнера */\n containerRef: React.RefObject<HTMLDivElement | null>\n /** Debounced значение запроса */\n debouncedQuery: string\n /** Функция загрузки подсказок */\n fetchSuggestions: (query: string) => Promise<void>\n /** Ref для отслеживания инициализации из field значения */\n initializedRef: React.RefObject<boolean>\n}\n\n/**\n * Form.Field.Address - Ввод адреса с подсказками DaData\n *\n * Рендерит поле адреса с автодополнением из DaData API.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Address\n * name=\"address\"\n * label=\"Адрес\"\n * token={process.env.NEXT_PUBLIC_DADATA_TOKEN}\n * />\n * ```\n *\n * @example С ограничением по локации\n * ```tsx\n * <Form.Field.Address\n * name=\"address\"\n * token={token}\n * locations={[{ city: 'Москва' }]}\n * />\n * ```\n *\n * @example Вернуть только строковое значение\n * ```tsx\n * <Form.Field.Address name=\"address\" token={token} valueOnly />\n * ```\n */\nexport const FieldAddress = createField<AddressFieldProps, AddressValue | string, AddressFieldState>({\n displayName: 'FieldAddress',\n\n useFieldState: (props) => {\n const { token, minChars = 3, debounceMs = 300, locations } = props\n\n const [inputValue, setInputValue] = useState('')\n const [suggestions, setSuggestions] = useState<DaDataSuggestion[]>([])\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 // Функция загрузки подсказок из DaData\n const fetchSuggestions = useCallback(\n async (query: string) => {\n if (query.length < minChars) {\n setSuggestions([])\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch('https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Token ${token}`,\n },\n body: JSON.stringify({\n query,\n count: 10,\n locations: locations,\n }),\n })\n\n if (response.ok) {\n const data = await response.json()\n setSuggestions(data.suggestions || [])\n setIsOpen(true)\n }\n } catch (error) {\n console.error('Ошибка загрузки DaData:', error)\n setSuggestions([])\n } finally {\n setIsLoading(false)\n }\n },\n [token, minChars, locations]\n )\n\n // Загрузка при изменении debounced запроса\n useEffect(() => {\n if (debouncedQuery) {\n fetchSuggestions(debouncedQuery)\n } else {\n setSuggestions([])\n setIsOpen(false)\n }\n }, [debouncedQuery, fetchSuggestions])\n\n // Закрытие при клике вне\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 // Инициализация значения ввода из field (только при первом рендере)\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 // Обработчик выбора подсказки\n const handleSelect = (suggestion: DaDataSuggestion) => {\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 // Обработчик клавиатурной навигации\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 ?? 'Начните вводить адрес...'}\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.value}</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 для ColorPicker поля\n */\nexport interface ColorPickerFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip для label поля */\n tooltip?: FieldTooltipMeta\n /** Палитра цветов для быстрого выбора */\n swatches?: string[]\n /** Размер (по умолчанию: md) */\n size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n /** Показывать area picker (насыщенность/яркость) (по умолчанию: true) */\n showArea?: boolean\n /** Показывать кнопку пипетки (по умолчанию: true) */\n showEyeDropper?: boolean\n /** Показывать слайдеры hue/alpha (по умолчанию: true) */\n showSliders?: boolean\n /** Показывать hex input (по умолчанию: true) */\n showInput?: boolean\n}\n\n/**\n * Палитра по умолчанию\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 - Выбор цвета с пикером\n *\n * Рендерит color picker с опциональной палитрой, area picker,\n * слайдерами и hex input.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"color\"\n * label=\"Выберите цвет\"\n * />\n * ```\n *\n * @example С кастомной палитрой\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"brandColor\"\n * label=\"Цвет бренда\"\n * swatches={['#FF0000', '#00FF00', '#0000FF']}\n * />\n * ```\n *\n * @example Минимальный (только палитра)\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 // Парсим цвет безопасно\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 // Используем valueAsString который уже в правильном формате\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 для FileUpload поля\n */\nexport interface FileUploadFieldProps {\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 * @example \"image/*\"\n * @example [\"image/png\", \"image/jpeg\"]\n * @example \".pdf,.doc,.docx\"\n */\n accept?: string | string[]\n /** Максимальный размер файла в байтах */\n maxFileSize?: number\n /** Максимальное количество файлов (по умолчанию: 1) */\n maxFiles?: number\n /**\n * Вариант отображения\n * - 'button': Простая кнопка-триггер\n * - 'dropzone': Зона drag & drop\n * - 'input': Input-подобный вид\n */\n variant?: 'button' | 'dropzone' | 'input'\n /** Показывать размер файлов в списке */\n showSize?: boolean\n /** Разрешить удаление файлов из списка */\n clearable?: boolean\n /** Текст зоны dropzone */\n dropzoneLabel?: ReactNode\n /** Описание зоны dropzone */\n dropzoneDescription?: ReactNode\n /** Текст кнопки (для варианта 'button') */\n buttonText?: ReactNode\n}\n\n/**\n * Список файлов с превью изображений\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 * Стандартный список файлов (не изображения)\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 - Поле загрузки файлов с несколькими вариантами\n *\n * Поддерживает загрузку одного или нескольких файлов с drag & drop,\n * превью файлов и автоматической интеграцией с формой.\n *\n * @example Вариант кнопки (по умолчанию)\n * ```tsx\n * <Form.Field.FileUpload name=\"avatar\" label=\"Аватар\" accept=\"image/*\" />\n * ```\n *\n * @example Вариант dropzone\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"documents\"\n * label=\"Документы\"\n * variant=\"dropzone\"\n * maxFiles={5}\n * accept=\".pdf,.doc,.docx\"\n * dropzoneLabel=\"Перетащите файлы сюда\"\n * dropzoneDescription=\"PDF, DOC до 10МБ\"\n * />\n * ```\n *\n * @example Вариант input\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"file\"\n * label=\"Выберите файл\"\n * variant=\"input\"\n * placeholder=\"Выберите файл...\"\n * />\n * ```\n *\n * @example Несколько изображений с превью\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"gallery\"\n * label=\"Галерея\"\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 = 'Перетащите файлы сюда',\n dropzoneDescription,\n buttonText = 'Загрузить файл',\n } = componentProps\n\n const placeholder = resolved.placeholder ?? 'Выберите файл(ы)'\n\n // Нормализация accept в массив для Chakra\n const normalizedAccept = accept\n ? typeof accept === 'string'\n ? accept.split(',').map((s) => s.trim())\n : accept\n : undefined\n\n // Проверка, работаем ли с изображениями для превью\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} файлов</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 * Состояние для OTP поля с таймером\n */\ninterface OTPFieldState {\n /** Счётчик секунд до возможности повторной отправки */\n countdown: number\n /** Идёт ли процесс повторной отправки */\n isResending: boolean\n /** Обработчик повторной отправки */\n handleResend: () => Promise<void>\n /** Форматированный countdown (MM:SS) */\n formatCountdown: (seconds: number) => string\n /** Контекст декларативной формы для авто-submit */\n formContext: DeclarativeFormContextValue\n}\n\n/**\n * Form.Field.OTPInput - Поле ввода OTP с таймером повторной отправки\n *\n * Рендерит PIN input для OTP верификации с опциональной функцией повторной отправки.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.OTPInput name=\"code\" label=\"Код подтверждения\" />\n * ```\n *\n * @example С повторной отправкой\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 Буквенно-цифровой ввод\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\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 // Форматирование countdown как 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 // Контекст формы для авто-submit (хук вызывается на верхнем уровне)\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 // Авто-submit когда заполнено\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 Повторить через {formatCountdown(countdown)}\n </Text>\n ) : (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResend} disabled={isResending} loading={isResending}>\n Отправить повторно\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 * Маски телефонов по странам\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 * Флаги стран\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 * Состояние для телефонного поля\n */\ninterface PhoneFieldState {\n /** Ref callback для применения маски */\n maskRef: (element: HTMLInputElement | null) => void\n}\n\n/**\n * Form.Field.Phone - Телефонный ввод с маской по стране\n *\n * Рендерит поле телефона с автоматической маской на основе страны.\n *\n * @example Русский телефон (по умолчанию)\n * ```tsx\n * <Form.Field.Phone name=\"phone\" label=\"Телефон\" />\n * ```\n *\n * @example Телефон США с флагом\n * ```tsx\n * <Form.Field.Phone name=\"phone\" country=\"US\" showFlag />\n * ```\n *\n * @example Вернуть значение без маски\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 // Создаём ref callback для применения маски\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 для PinInput поля\n */\nexport interface PinInputFieldProps extends BaseFieldProps {\n /** Количество input боксов (по умолчанию: 4) */\n count?: number\n /** Маскировать как пароль */\n mask?: boolean\n /** Включить OTP автозаполнение */\n otp?: boolean\n /** Тип ввода: numeric, alphanumeric, alphabetic (по умолчанию: numeric) */\n type?: 'numeric' | 'alphanumeric' | 'alphabetic'\n /** Размер: 2xs, xs, sm, md, lg, xl, 2xl (по умолчанию: md) */\n size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n /** Вариант: outline, subtle, flushed (по умолчанию: outline) */\n variant?: 'outline' | 'subtle' | 'flushed'\n /** Соединить inputs вместе (без gap) */\n attached?: boolean\n /** Callback когда все поля заполнены */\n onComplete?: (value: string) => void\n}\n\n/**\n * Form.Field.PinInput - Поле ввода PIN/OTP кода\n *\n * Рендерит серию single-character inputs для PIN кодов, OTP и т.д.\n * Значение формы хранится как строка (например, \"1234\").\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.PinInput name=\"pin\" label=\"Введите PIN\" />\n * ```\n *\n * @example OTP с 6 цифрами\n * ```tsx\n * <Form.Field.PinInput\n * name=\"otp\"\n * label=\"Код подтверждения\"\n * count={6}\n * otp\n * onComplete={(code) => verifyCode(code)}\n * />\n * ```\n *\n * @example Маскированный как пароль\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 // Конвертируем строку в массив для PinInput\n const stringValue = (field.state.value as string) ?? ''\n const arrayValue = stringValue.split('').slice(0, count)\n // Дополняем пустыми строками до count\n while (arrayValue.length < count) {\n arrayValue.push('')\n }\n\n const handleValueChange = (details: { value: string[] }) => {\n // Конвертируем массив обратно в строку\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 * Состояние для маскированного поля\n */\ninterface MaskedInputFieldState {\n /** Ref callback для применения маски */\n maskRef: (element: HTMLInputElement | null) => void\n}\n\n/**\n * Form.Field.MaskedInput - Поле ввода с маской\n *\n * Рендерит input с маской используя библиотеку use-mask-input.\n *\n * Символы маски:\n * - 9: цифра\n * - a: буква\n * - *: буква или цифра\n *\n * @example Маска паспорта\n * ```tsx\n * <Form.Field.MaskedInput name=\"passport\" label=\"Паспорт\" mask=\"99 99 999999\" />\n * ```\n *\n * @example Несколько масок (адаптируется к вводу)\n * ```tsx\n * <Form.Field.MaskedInput name=\"phone\" mask={['9999-9999', '99999-9999']} />\n * ```\n *\n * @example С кастомным placeholder символом\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 // Создаём ref callback для применения маски\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 * Конфигурация автоопределения типа поля\n */\nexport interface AutoFieldConfig {\n /**\n * Предпочитать Switch вместо Checkbox для boolean\n * @default false\n */\n booleanAsSwitch?: boolean\n /**\n * Использовать Textarea для длинных строк (на основе maxLength в схеме)\n * @default true\n */\n useTextareaForLongStrings?: boolean\n /**\n * Порог длины для использования Textarea\n * @default 200\n */\n textareaThreshold?: number\n}\n\n/**\n * Props для AutoField\n */\nexport interface AutoFieldProps extends BaseFieldProps {\n /** Конфигурация автоопределения */\n config?: AutoFieldConfig\n}\n\n/**\n * Извлечь Zod тип из схемы\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 // Развернуть wrapper-типы\n if (type === 'optional' || type === 'nullable' || type === 'default') {\n return getZodType(schema._zod.def.inner)\n }\n\n return type\n}\n\n/**\n * Получить enum значения из Zod схемы\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 // Развернуть wrapper-типы\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 * Получить maxLength из 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 * Получить UI meta из Zod схемы\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 * Навигировать к схеме по пути\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 // Развернуть wrapper-типы\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 // Пропустить числовые индексы\n if (/^\\d+$/.test(part)) {\n if (current._zod?.def?.type === 'array') {\n current = current._zod.def.element\n }\n continue\n }\n\n // Навигация в объект\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 * Преобразовать camelCase в читаемый 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') // Добавить пробел перед заглавными\n .replace(/^./, (s) => s.toUpperCase()) // Первую букву заглавной\n .trim()\n}\n\n/**\n * Form.Field.Auto - Автоопределение типа поля из Zod схемы\n *\n * Автоматически выбирает подходящий компонент поля на основе типа в Zod схеме:\n * - string → FieldString (или FieldTextarea для длинных строк)\n * - number/bigint/int/float → FieldNumber\n * - boolean → FieldCheckbox (или FieldSwitch)\n * - date → FieldDate\n * - enum → FieldNativeSelect\n *\n * Если label не указан, генерируется из имени поля (camelCase → \"Readable Label\").\n *\n * @example Базовое использование\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 с опциями\n * <Form.Field.Auto name=\"createdAt\" /> // → FieldDate\n * </Form>\n * ```\n *\n * @example С конфигурацией\n * ```tsx\n * <Form.Field.Auto\n * name=\"isActive\"\n * config={{ booleanAsSwitch: true }}\n * />\n * ```\n *\n * @example С явным fieldType в meta\n * ```tsx\n * const schema = z.object({\n * bio: z.string().meta({ ui: { title: 'Биография', fieldType: 'richText' } }),\n * })\n *\n * <Form.Field.Auto name=\"bio\" /> // → FieldRichText (из 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 // Построить полный путь\n const fullPath = parentGroup ? `${parentGroup.name}.${name}` : name\n\n // Получить схему поля\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 // Авто-label если не указан\n const label = baseProps.label ?? uiMeta?.title ?? camelCaseToLabel(name)\n\n // Если указан явный fieldType в meta — используем 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 // Конфигурация с дефолтами\n const { booleanAsSwitch = false, useTextareaForLongStrings = true, textareaThreshold = 200 } = config ?? {}\n\n // Определить компонент по типу схемы (fallback)\n switch (zodType) {\n case 'string':\n // Проверить, нужен ли Textarea\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 использует title вместо 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 на String\n return <FieldString name={name} label={label} {...baseProps} />\n }\n}\n\nFieldAuto.displayName = 'FieldAuto'\n","'use client'\n\nimport { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'\n\n/**\n * Опция для поля выбора\n */\nexport interface RelationOption {\n /** Значение (обычно ID) */\n value: string\n /** Отображаемый текст */\n label: string\n /** Описание (опционально) */\n description?: string\n}\n\n/**\n * Состояние загрузки relation\n */\nexport interface RelationState {\n /** Опции для выбора */\n options: RelationOption[]\n /** Идёт загрузка */\n isLoading: boolean\n /** Ошибка загрузки */\n error: Error | null\n}\n\n/**\n * Результат хука загрузки данных\n */\nexport interface QueryHookResult<TData = unknown> {\n data?: TData[] | null\n isLoading: boolean\n error?: Error | null\n}\n\n/**\n * Конфигурация relation для загрузки\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface RelationConfig<TData = any, TArgs = any> {\n /** Имя модели (должно совпадать с model в relationMeta) */\n model: string\n /**\n * React hook для загрузки данных (должен возвращать { data, isLoading, error })\n * @example useFindManyCategory\n */\n useQuery: (args?: TArgs) => QueryHookResult<TData>\n /** Поле для отображения label */\n labelField: string\n /** Поле для значения (по умолчанию 'id') */\n valueField?: string\n /** Поле для description (опционально) */\n descriptionField?: string\n /** Аргументы для useQuery (фильтры, сортировка) */\n queryArgs?: TArgs\n}\n\n/**\n * Значение контекста RelationFieldProvider\n */\nexport interface RelationFieldContextValue {\n /** Получить options для модели */\n getOptions: (model: string) => RelationOption[]\n /** Получить состояние загрузки для модели */\n getState: (model: string) => RelationState\n /** Все загруженные relation */\n relations: Record<string, RelationState>\n}\n\nconst RelationFieldContext = createContext<RelationFieldContextValue | null>(null)\n\n/**\n * Хук для получения контекста RelationFieldProvider\n */\nexport function useRelationFieldContext(): RelationFieldContextValue | null {\n return useContext(RelationFieldContext)\n}\n\n/**\n * Хук для получения options конкретной модели\n * @param model - имя модели\n * @returns options и состояние загрузки\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 * Компонент-загрузчик для одной relation\n * Вызывается внутри провайдера, соблюдает правила хуков\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 // Вызываем хук для загрузки данных\n const { data, isLoading, error } = useQuery(queryArgs)\n\n // Преобразуем данные в options при изменении\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 // Компонент не рендерит ничего\n return null\n}\n\n/**\n * Провайдер для автозагрузки options relation полей\n *\n * Позволяет автоматически загружать опции для полей с `relationMeta()`,\n * интегрируясь с ZenStack hooks.\n *\n * @example Базовое использование\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 С фильтрацией и сортировкой\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 С description для 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 для загрузки */\n relations: RelationConfig[]\n children: ReactNode\n}) {\n // Состояние всех загруженных relation\n const [relationsState, setRelationsState] = useState<Record<string, RelationState>>({})\n\n // Callback для обновления состояния relation\n const handleLoaded = useMemo(\n () => (model: string, state: RelationState) => {\n setRelationsState((prev) => {\n // Проверяем, изменились ли данные\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 // Без изменений\n }\n return { ...prev, [model]: state }\n })\n },\n []\n )\n\n // Значение контекста\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 {/* Рендерим загрузчики для каждой 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 для оборачивания компонента в 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// Импорт всех Field компонентов\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 { useRelationFieldContext, type RelationOption } from './relation-field-provider'\n\n/**\n * Конфигурация relation в fieldProps\n */\nexport interface RelationFieldConfig {\n /** Имя модели (должно совпадать с model в RelationFieldProvider) */\n model: string\n /** Поле для отображения label */\n labelField: string\n /** Поле для значения (по умолчанию 'id') */\n valueField?: string\n}\n\n/**\n * Props для рендеринга поля\n */\nexport interface FieldRenderProps {\n /** Имя поля */\n name: string\n /** Label (если не указан, генерируется из name) */\n label?: ReactNode\n /** Placeholder */\n placeholder?: string\n /** Helper text */\n helperText?: ReactNode\n /** Обязательное поле */\n required?: boolean\n /** Отключено */\n disabled?: boolean\n /** Только для чтения */\n readOnly?: boolean\n /** Enum значения для select/radio */\n enumValues?: string[]\n /** Constraints из схемы */\n constraints?: ZodConstraints\n /** Дополнительные props из fieldProps */\n fieldProps?: Record<string, unknown>\n /**\n * Options из RelationFieldProvider (если поле имеет relation config)\n * Устанавливается автоматически через SchemaFieldWithRelations\n */\n relationOptions?: RelationOption[]\n}\n\n/**\n * Определить тип компонента на основе:\n * 1. Явного fieldType из meta (приоритет)\n * 2. Zod типа (fallback)\n */\nexport function resolveFieldType(field: SchemaFieldInfo): FieldComponentType {\n // Приоритет: явный fieldType из meta\n if (field.ui?.fieldType) {\n return field.ui.fieldType\n }\n\n // Fallback на Zod тип\n switch (field.zodType) {\n case 'string':\n // Проверить email/url через constraints\n if (field.constraints?.string?.inputType === 'email') {\n return 'string'\n }\n if (field.constraints?.string?.inputType === 'url') {\n return 'string'\n }\n // Проверить длинную строку → 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 // Примитивные массивы → tags\n if (field.element?.zodType === 'string') {\n return 'tags'\n }\n // Объектные массивы обрабатываются отдельно\n return 'string' // fallback\n\n default:\n return 'string'\n }\n}\n\n/**\n * Тип опции для компонентов выбора\n */\ninterface SelectOptionResolved {\n value: string\n label: string\n description?: string\n}\n\n/**\n * Тип опции для NativeSelect (использует title вместо label)\n */\ninterface NativeSelectOptionResolved {\n value: string\n title: string\n description?: string\n}\n\n/**\n * Получить options для поля выбора с учётом relationOptions\n * Приоритет: fieldProps.options > relationOptions > enumValues\n */\nfunction resolveSelectOptions(\n fieldProps: Record<string, unknown>,\n relationOptions?: RelationOption[],\n enumValues?: string[]\n): SelectOptionResolved[] | undefined {\n // 1. Явные options в fieldProps (высший приоритет)\n if (fieldProps.options && Array.isArray(fieldProps.options)) {\n return fieldProps.options as SelectOptionResolved[]\n }\n\n // 2. Options из 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 значения (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 * Получить options для NativeSelect (использует title вместо label)\n */\nfunction resolveNativeSelectOptions(\n fieldProps: Record<string, unknown>,\n relationOptions?: RelationOption[],\n enumValues?: string[]\n): NativeSelectOptionResolved[] | undefined {\n // 1. Явные options в fieldProps (высший приоритет)\n if (fieldProps.options && Array.isArray(fieldProps.options)) {\n return fieldProps.options as NativeSelectOptionResolved[]\n }\n\n // 2. Options из 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 значения (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 * Рендерить компонент поля по типу\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 // Генерировать label если не указан\n const label = labelProp ?? camelCaseToLabel(name)\n\n // Базовые props для всех полей\n const baseProps = {\n name,\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n }\n\n // Применить constraints к props\n const stringConstraints = constraints?.string || {}\n const numberConstraints = constraints?.number || {}\n\n // Предварительно вычислить options для полей выбора\n const selectOptions = resolveSelectOptions(fieldProps, relationOptions, enumValues)\n const nativeSelectOptions = resolveNativeSelectOptions(fieldProps, relationOptions, enumValues)\n\n switch (type) {\n // Текстовые поля\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 // Числовые поля\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 // Дата и время\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 // Булевые поля\n case 'checkbox':\n return <FieldCheckbox key={name} {...baseProps} {...fieldProps} />\n case 'switch':\n return <FieldSwitch key={name} {...baseProps} {...fieldProps} />\n\n // Выбор из списка\n // Options разрешаются с приоритетом: 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 // Специализированные поля\n case 'phone':\n return <FieldPhone key={name} {...baseProps} {...fieldProps} />\n case 'address': {\n // FieldAddress требует token из 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 требует label и helperText как 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 на string\n return <FieldString key={name} {...baseProps} {...fieldProps} />\n }\n}\n\n/**\n * Рендерить поле из SchemaFieldInfo\n * @param field - информация о поле из схемы\n * @param relationOptions - опции из RelationFieldProvider (если есть)\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 * Компонент для рендеринга поля с автозагрузкой relation options\n *\n * Использует RelationFieldProvider контекст для автоматической загрузки\n * options для полей с `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 // Проверяем есть ли relation config в fieldProps\n const relationConfig = field.ui?.fieldProps?.relation as RelationFieldConfig | undefined\n\n // Если есть relation config и есть контекст — получаем 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 /** Принудительно отключить кнопку (дополнительно к автоматическому 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 * Автоматически отключается при достижении maxItems из Zod схемы\n * (z.array().max(5) → кнопка отключится при 5 элементах)\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 // Кнопка отключена если 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 /** Принудительно отключить кнопку (дополнительно к автоматическому 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 * Автоматически отключается при достижении minItems из Zod схемы\n * (z.array().min(1) → кнопка отключится при 1 элементе)\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 // Кнопка отключена если 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 * Автоматически извлекает из Zod схемы:\n * - `maxItems` из `z.array().max(5)` → отключает кнопку Add при достижении лимита\n * - `minItems` из `z.array().min(1)` → отключает кнопку Remove если элементов меньше\n * - `helperText` подсказка \"Максимум 5 элементов\" (через Form.Group.List wrapper)\n *\n * Props всегда имеют приоритет над автоматическими значениями из схемы.\n *\n * @example Object array with auto constraints from Zod\n * ```tsx\n * // В схеме: 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 автоматически отключается при 5 элементах *\\/}\n * </VStack>\n * )}\n * >\n * <HStack>\n * <Form.Field.String />\n * <Form.Group.List.Button.Remove />\n * {/* Кнопка Remove автоматически отключается при 1 элементе *\\/}\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 // Извлекаем constraints для массива\n const constraints = getZodConstraints(schema, fullPath)\n\n // Props имеют приоритет над 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 // Вычисляем canAdd и canRemove на основе 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 * Информация о поле схемы для автогенерации форм\n */\nexport interface SchemaFieldInfo {\n /** Полный путь к полю (например, \"user.address.city\") */\n path: string\n /** Имя поля (последний сегмент пути) */\n name: string\n /** Zod тип: string, number, boolean, date, enum, object, array */\n zodType: string\n /** UI метаданные из .meta({ ui: {...} }) */\n ui?: FieldUIMeta\n /** Обязательное поле (не optional/nullable) */\n required: boolean\n /** Constraints (min, max, minLength, maxLength и т.д.) */\n constraints: ZodConstraints\n /** Вложенные поля для object */\n children?: SchemaFieldInfo[]\n /** Информация об элементе для array */\n element?: SchemaFieldInfo\n /** Enum значения для enum типа */\n enumValues?: string[]\n}\n\n/**\n * Получить Zod тип из схемы\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 * Проверить, является ли поле обязательным (не 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 всегда имеет значение, считаем не обязательным для UI\n return false\n }\n\n return true\n}\n\n/**\n * Получить UI метаданные из схемы\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 * Получить enum значения из схемы\n * В Zod v4 используем schema.enum или 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: используем .enum для получения значений\n // schema.enum возвращает объект { value: \"value\", ... }\n if (unwrapped.enum && typeof unwrapped.enum === 'object') {\n return Object.values(unwrapped.enum) as string[]\n }\n // Fallback на внутреннюю структуру (для совместимости)\n if (unwrapped._zod.def.values) {\n return unwrapped._zod.def.values\n }\n // Zod v4 также имеет 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// Защита от циклических ссылок\n// =============================================================================\n\n/** Максимальная глубина рекурсии для защиты от бесконечных циклов */\nconst MAX_TRAVERSAL_DEPTH = 20\n\n/**\n * Контекст обхода схемы\n * Хранит посещённые схемы и текущую глубину для защиты от циклов\n */\ninterface TraversalContext {\n /** Set посещённых схем (для обнаружения циклов) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n visited: WeakSet<any>\n /** Текущая глубина рекурсии */\n depth: number\n}\n\n/**\n * Создать новый контекст обхода\n */\nfunction createTraversalContext(): TraversalContext {\n return {\n visited: new WeakSet(),\n depth: 0,\n }\n}\n\n/**\n * Проверить, можно ли продолжать обход\n * Возвращает false если схема уже посещена или достигнута максимальная глубина\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction canTraverse(schema: any, ctx: TraversalContext): boolean {\n // Проверка глубины\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 // Проверка циклической ссылки\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 * Отметить схему как посещённую\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// Функции обхода схемы\n// =============================================================================\n\n/**\n * Анализировать элемент массива\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 // Для элементов массива путь — это путь родителя + [*]\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 для элементов определяются отдельно\n }\n\n // Если элемент — объект, рекурсивно обходим его поля\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 // Если элемент — enum\n if (zodType === 'enum' || zodType === 'literal') {\n fieldInfo.enumValues = getEnumValues(elementSchema)\n }\n\n return fieldInfo\n}\n\n/**\n * Обойти shape объекта и вернуть информацию о полях\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 // Обработка вложенных объектов\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 // Обработка массивов\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 // Обработка 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 * Обойти Zod схему и вернуть информацию о всех полях\n *\n * @example\n * ```ts\n * const schema = z.object({\n * firstName: z.string().meta({ ui: { title: 'Имя' } }),\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: 'Имя' }, ... },\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 // Поддерживаем только object на верхнем уровне\n if (type !== 'object' || !unwrapped._zod?.def?.shape) {\n return []\n }\n\n return traverseSchemaShape(unwrapped._zod.def.shape)\n}\n\n/**\n * Получить плоский список всех путей полей (для include/exclude фильтрации)\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 * Отфильтровать поля по 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 // Проверяем по имени поля (name) для топ-левел фильтрации\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, traverseSchema, type SchemaFieldInfo } from './schema-traversal'\n\n/**\n * Props для Form.AutoFields\n */\nexport interface AutoFieldsProps {\n /**\n * Включить только указанные поля (по имени)\n * @example include={['firstName', 'lastName']}\n */\n include?: string[]\n /**\n * Исключить указанные поля (по имени)\n * @example exclude={['id', 'createdAt']}\n */\n exclude?: string[]\n /**\n * Рекурсивно генерировать вложенные объекты\n * @default true\n */\n recursive?: boolean\n /**\n * Кастомный wrapper для каждого поля\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 * Рендерить поле или группу на основе 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 // Обработка вложенных объектов\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 // Обработка массивов объектов\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)}>Добавить</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>Удалить</ListButtonRemove>\n </VStack>\n </FormGroupListDeclarative>\n )\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n }\n\n // Обработка примитивных массивов → 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 // Обычное поле (с поддержкой relation options из RelationFieldProvider)\n const content = <SchemaFieldWithRelations key={name} field={field} />\n return fieldWrapper ? fieldWrapper({ name, children: content }) : content\n}\n\n/**\n * Компонент для пустого массива\n */\nfunction EmptyArrayContent({ label }: { label: string }): ReactElement {\n return (\n <VStack py={4} color=\"fg.muted\">\n Нет элементов в "{label}"\n </VStack>\n )\n}\n\n/**\n * Создать дефолтное значение для элемента массива объектов\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 — автоматическая генерация полей из Zod схемы\n *\n * Компонент читает Zod схему из контекста Form и автоматически генерирует\n * поля на основе типов и метаданных схемы.\n *\n * @example Все поля\n * ```tsx\n * <Form schema={Schema} initialValue={data} onSubmit={save}>\n * <Form.AutoFields />\n * <Form.Button.Submit>Сохранить</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example С фильтрацией\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 С кастомным 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 требует schema prop на Form компоненте')\n }\n\n // Обойти схему и получить информацию о полях\n const allFields = traverseSchema(schema)\n\n // Отфильтровать поля\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 { useEffect, useMemo, useRef, useState, type ReactElement } from 'react'\nimport { useFormGroup } from '../../../form-group'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { BaseFieldProps, BaseOption, FieldSize } from '../../types'\nimport { FieldError, getFieldErrors, getOptionLabel, SelectionFieldLabel, type ResolvedFieldProps } from '../base'\nimport { useResolvedFieldProps } from '../base/use-resolved-field-props'\n\n/**\n * Результат загрузки опций\n */\nexport interface CascadingSelectLoadResult<T = string> {\n /** Загруженные опции */\n options: BaseOption<T>[]\n}\n\n/**\n * Props для CascadingSelect поля\n */\nexport interface CascadingSelectFieldProps<TParent = string, TValue = string> extends BaseFieldProps {\n /**\n * Имя родительского поля, от которого зависит этот select\n * @example \"country\" - загрузить города при изменении страны\n */\n dependsOn: string\n /**\n * Функция загрузки опций при изменении родительского поля\n * @param parentValue - Текущее значение родительского поля\n * @returns Promise с массивом опций или объект с опциями\n */\n loadOptions: (\n parentValue: TParent | undefined\n ) => Promise<BaseOption<TValue>[]> | Promise<CascadingSelectLoadResult<TValue>>\n /**\n * Начальные опции (показываются до выбора родительского значения)\n * @default []\n */\n initialOptions?: BaseOption<TValue>[]\n /**\n * Автоматически очищать значение при изменении родителя\n * @default true\n */\n clearOnParentChange?: boolean\n /**\n * Отключить поле пока родитель пустой\n * @default true\n */\n disableWhenParentEmpty?: boolean\n /**\n * Показывать кнопку очистки (автоопределение: true если optional, false если required)\n */\n clearable?: boolean\n /**\n * Размер компонента\n */\n size?: FieldSize\n /**\n * Визуальный вариант\n */\n variant?: 'outline' | 'subtle'\n /**\n * Placeholder для пустого родительского значения\n */\n placeholderWhenDisabled?: string\n}\n\n/**\n * Внутренний компонент для рендеринга Select с загруженными опциями\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 // Состояние опций и загрузки\n const [options, setOptions] = useState<BaseOption<TValue>[]>(initialOptions)\n const [isLoading, setIsLoading] = useState(false)\n\n // Ref для отслеживания предыдущего значения родителя\n const prevParentValueRef = useRef<TParent | undefined>(parentValue)\n\n // Ref для стабильной ссылки на loadOptions (избегаем бесконечных циклов при inline функциях)\n const loadOptionsRef = useRef(loadOptions)\n loadOptionsRef.current = loadOptions\n\n // Эффект для загрузки опций при изменении parentValue\n useEffect(() => {\n // Функция загрузки\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 // Поддержка обоих форматов: массив или объект с options\n const newOptions = Array.isArray(result) ? result : result.options\n setOptions(newOptions)\n } catch (error) {\n console.error('Ошибка загрузки опций каскадного select:', error)\n setOptions([])\n } finally {\n setIsLoading(false)\n }\n }\n\n void doLoad()\n }, [parentValue, initialOptions])\n\n // Эффект для очистки значения при изменении родителя\n useEffect(() => {\n if (clearOnParentChange && prevParentValueRef.current !== parentValue) {\n // Очищаем значение поля если родитель изменился (не при первом рендере)\n if (prevParentValueRef.current !== undefined) {\n form.setFieldValue(fullPath, '' as unknown)\n }\n prevParentValueRef.current = parentValue\n }\n }, [parentValue, clearOnParentChange, form, fullPath])\n\n // Определяем, нужно ли отключить поле\n const isParentEmpty = parentValue === undefined || parentValue === null || parentValue === ''\n const isDisabled = resolved.disabled || (disableWhenParentEmpty && isParentEmpty)\n\n // Определяем placeholder\n const effectivePlaceholder = isParentEmpty && placeholderWhenDisabled ? placeholderWhenDisabled : resolved.placeholder\n\n // Автоопределение clearable\n const resolvedClearable = clearable ?? !resolved.required\n\n // Создаём коллекцию из опций\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 - Каскадный select с зависимостью от другого поля\n *\n * Загружает опции динамически на основе значения другого поля.\n * Полезен для связанных списков типа Страна → Город, Категория → Подкатегория.\n *\n * @example Базовое использование\n * ```tsx\n * <Form.Field.Select\n * name=\"country\"\n * label=\"Страна\"\n * options={countries}\n * />\n * <Form.Field.CascadingSelect\n * name=\"city\"\n * label=\"Город\"\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=\"Сначала выберите страну\"\n * />\n * ```\n *\n * @example Вложенные поля\n * ```tsx\n * <Form.Field.CascadingSelect\n * name=\"address.region\"\n * label=\"Регион\"\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 // Строим полный путь к родительскому полю\n const fullDependsOnPath = parentGroup ? `${parentGroup.name}.${dependsOn}` : dependsOn\n\n // Создаём селектор для значения родительского поля (inline, как в 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 // Используем form.Subscribe для подписки на изменения родительского поля\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 type { BaseFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel, useDebounce } from '../base'\n\n/**\n * Пропсы для поля выбора города\n */\nexport interface CityFieldProps extends BaseFieldProps {\n /** Токен API DaData (по умолчанию: NEXT_PUBLIC_DADATA_API_KEY) */\n token?: string\n /** Минимум символов перед поиском (по умолчанию: 2) */\n minChars?: number\n /** Задержка debounce в мс (по умолчанию: 300) */\n debounceMs?: number\n}\n\n/**\n * Состояние поля города\n */\ninterface CityFieldState {\n inputValue: string\n setInputValue: (value: string) => void\n suggestions: Array<{\n value: string\n data: {\n city: string | null\n settlement: string | null\n city_fias_id: string | null\n region_with_type: string | null\n }\n }>\n setSuggestions: (suggestions: CityFieldState['suggestions']) => 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 — выбор города с подсказками DaData\n *\n * Использует DaData API с from_bound/to_bound для ограничения до уровня города/населённого пункта.\n * Возвращает строковое значение (название города).\n *\n * @example\n * ```tsx\n * <Form.Field.City name=\"city\" label=\"Город\" />\n * ```\n *\n * @example С кастомным токеном\n * ```tsx\n * <Form.Field.City name=\"city\" token=\"your-token\" />\n * ```\n */\nexport const FieldCity = createField<CityFieldProps, string, CityFieldState>({\n displayName: 'FieldCity',\n\n useFieldState: (props) => {\n const { token, minChars = 2, debounceMs = 300 } = props\n const apiKey = token || (typeof window !== 'undefined' ? process.env.NEXT_PUBLIC_DADATA_API_KEY : '') || ''\n\n const [inputValue, setInputValue] = useState('')\n const [suggestions, setSuggestions] = useState<CityFieldState['suggestions']>([])\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 // Флаг: только что выбрали город, пропустить следующий fetch\n const justSelectedRef = useRef(false)\n // Флаг: inputValue уже инициализирован из значения поля\n const initializedRef = useRef(false)\n\n // Загрузка подсказок городов из DaData\n const fetchSuggestions = useCallback(\n async (query: string) => {\n if (query.length < minChars || !apiKey) {\n setSuggestions([])\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch('https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Token ${apiKey}`,\n },\n body: JSON.stringify({\n query,\n count: 7,\n from_bound: { value: 'city' },\n to_bound: { value: 'settlement' },\n }),\n })\n\n if (response.ok) {\n const data = await response.json()\n setSuggestions(data.suggestions || [])\n setIsOpen(data.suggestions?.length > 0)\n }\n } catch (error) {\n console.error('Ошибка загрузки городов DaData:', error)\n setSuggestions([])\n } finally {\n setIsLoading(false)\n }\n },\n [apiKey, minChars]\n )\n\n // Загрузка при изменении debounced запроса\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 // Закрытие при клике вне\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 // Инициализация значения ввода из field (однократно, без useEffect)\n if (!initializedRef.current && fieldValue && fieldValue !== inputValue) {\n initializedRef.current = true\n setInputValue(fieldValue)\n }\n\n // Обработчик выбора города\n const handleSelect = (suggestion: CityFieldState['suggestions'][number]) => {\n const cityName = suggestion.data.city || suggestion.data.settlement || suggestion.value\n justSelectedRef.current = true\n setInputValue(cityName)\n setIsOpen(false)\n setSuggestions([])\n field.handleChange(cityName)\n }\n\n // Клавиатурная навигация\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 if (!e.target.value) {\n field.handleChange('')\n }\n }}\n onFocus={() => {\n if (suggestions.length > 0) {\n setIsOpen(true)\n }\n }}\n onBlur={field.handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={resolved.placeholder ?? 'Введите город'}\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.data.city_fias_id}-${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.value}</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 type { ValidateOn } from '../types'\n\n/**\n * Строит объект validators для TanStack Form на основе validateOn prop.\n *\n * @param schema - Zod схема для валидации\n * @param validateOn - режим(ы) валидации ('change' | 'blur' | 'submit' | 'mount')\n * @returns объект validators для useAppForm или undefined если схема не указана\n *\n * @example\n * // Валидация при изменении (по умолчанию)\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 // По умолчанию — валидация на onChange\n if (!validateOn) {\n return { onChange: schema }\n }\n\n // Нормализуем в массив\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 { useCallback, useEffect, useRef, useState, type ReactElement } from 'react'\n\n/**\n * Конфигурация сохранения формы\n */\nexport interface FormPersistenceConfig {\n /**\n * Уникальный ключ для localStorage\n * Должен быть уникальным для каждой формы во избежание конфликтов\n */\n key: string\n\n /**\n * Задержка debounce в миллисекундах для сохранения\n * @default 500\n */\n debounceMs?: number\n\n /**\n * Время жизни черновика в миллисекундах (TTL)\n * После истечения TTL черновик считается протухшим и автоматически удаляется\n * @example 24 * 60 * 60 * 1000 // 24 часа\n * @default undefined — без ограничения по времени\n */\n ttl?: number\n\n /**\n * Заголовок диалога\n * @default 'Восстановить сохранённые данные?'\n */\n dialogTitle?: string\n\n /**\n * Описание диалога\n * @default 'У вас есть несохранённые изменения с предыдущей сессии.'\n */\n dialogDescription?: string\n\n /**\n * Текст кнопки восстановления\n * @default 'Восстановить'\n */\n restoreButtonText?: string\n\n /**\n * Текст кнопки отмены\n * @default 'Начать заново'\n */\n discardButtonText?: string\n\n /**\n * Текст кнопки очистки черновика (для ClearDraftButton)\n * @default 'Очистить черновик'\n */\n clearDraftButtonText?: string\n}\n\n/**\n * Формат хранения данных в localStorage (с metadata)\n * @internal\n */\ninterface StoredData<TData> {\n /** Сохранённые данные формы */\n data: TData\n /** Время сохранения (timestamp) */\n savedAt: number\n /** Версия формата (для будущей миграции) */\n version: 1\n}\n\n/**\n * Результат хука useFormPersistence\n */\nexport interface FormPersistenceResult<TData> {\n /**\n * Есть ли сохранённые данные\n */\n hasSavedData: boolean\n\n /**\n * Сохранённые данные (если есть)\n */\n savedData: TData | null\n\n /**\n * Время сохранения черновика (timestamp)\n * Используется для отображения \"Черновик от 15:30\"\n */\n savedAt: number | null\n\n /**\n * Открыт ли диалог восстановления\n */\n isDialogOpen: boolean\n\n /**\n * Выбрал ли пользователь восстановление\n */\n shouldRestore: boolean\n\n /**\n * Сохранить текущие значения формы в localStorage\n */\n saveValues: (values: TData) => void\n\n /**\n * Очистить сохранённые данные из localStorage\n */\n clearSavedData: () => void\n\n /**\n * Принять и восстановить сохранённые данные\n */\n acceptRestore: () => TData | null\n\n /**\n * Отклонить восстановление и начать заново\n */\n rejectRestore: () => void\n\n /**\n * Закрыть диалог без действия\n */\n closeDialog: () => void\n\n /**\n * Отметить восстановление как завершённое (вызывается после form.reset)\n */\n markRestoreComplete: () => void\n\n /**\n * Компонент диалога для рендеринга\n */\n RestoreDialog: () => ReactElement | null\n\n /**\n * Компонент кнопки очистки черновика\n * Показывается только если есть сохранённые данные\n */\n ClearDraftButton: () => ReactElement | null\n}\n\nconst STORAGE_PREFIX = 'form-persistence:'\n\n/**\n * Хук для сохранения данных формы в localStorage\n *\n * Автоматически сохраняет состояние формы и показывает диалог\n * для восстановления сохранённых данных при загрузке формы.\n *\n * @example\n * ```tsx\n * const persistence = useFormPersistence<MyFormData>({\n * key: 'my-form',\n * debounceMs: 500,\n * })\n *\n * // В onSubmit формы:\n * const handleSubmit = (data) => {\n * await saveToServer(data)\n * persistence.clearSavedData() // Очищаем при успехе\n * }\n *\n * // Подписка на изменения формы:\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 // Состояние\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 // Рефы для debounce\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Загружаем сохранённые данные при монтировании\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 // Проверяем формат данных (новый с version или старый без)\n let data: TData\n let timestamp: number\n\n if (parsed && typeof parsed === 'object' && 'version' in parsed && parsed.version === 1) {\n // Новый формат с метаданными\n const storedData = parsed as StoredData<TData>\n data = storedData.data\n timestamp = storedData.savedAt\n\n // Проверяем TTL\n if (ttl !== undefined) {\n const age = Date.now() - timestamp\n if (age > ttl) {\n // Данные протухли — удаляем\n localStorage.removeItem(storageKey)\n return\n }\n }\n } else {\n // Старый формат (для обратной совместимости)\n data = parsed as TData\n timestamp = Date.now() // Не знаем точное время, ставим текущее\n }\n\n setSavedData(data)\n setSavedAt(timestamp)\n setHasSavedData(true)\n setIsDialogOpen(true)\n }\n } catch {\n // Невалидный JSON или ошибка localStorage — игнорируем\n localStorage.removeItem(storageKey)\n }\n }, [storageKey, ttl])\n\n // Сохраняем значения (с debounce)\n const saveValues = useCallback(\n (values: TData) => {\n // Не сохраняем, если ещё показываем диалог восстановления\n if (isDialogOpen) {\n return\n }\n\n // Очищаем предыдущий таймер\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // Устанавливаем новое отложенное сохранение\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 может быть заполнен или отключён\n }\n }, debounceMs)\n },\n [storageKey, debounceMs, isDialogOpen]\n )\n\n // Очищаем сохранённые данные\n const clearSavedData = useCallback(() => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n try {\n localStorage.removeItem(storageKey)\n } catch {\n // Игнорируем ошибки\n }\n setSavedData(null)\n setSavedAt(null)\n setHasSavedData(false)\n }, [storageKey])\n\n // Принимаем восстановление\n const acceptRestore = useCallback(() => {\n setShouldRestore(true)\n setIsDialogOpen(false)\n // Сохраняем savedData, чтобы вызывающий код мог его использовать\n return savedData\n }, [savedData])\n\n // Отмечаем восстановление как завершённое (вызывается после form.reset)\n const markRestoreComplete = useCallback(() => {\n setShouldRestore(false)\n clearSavedData()\n }, [clearSavedData])\n\n // Отклоняем восстановление\n const rejectRestore = useCallback(() => {\n clearSavedData()\n setIsDialogOpen(false)\n }, [clearSavedData])\n\n // Закрываем диалог\n const closeDialog = useCallback(() => {\n setIsDialogOpen(false)\n }, [])\n\n // Компонент диалога\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 // Компонент кнопки очистки черновика\n const ClearDraftButton = useCallback((): ReactElement | null => {\n // Не показываем, если нет сохранённых данных или открыт диалог восстановления\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 // Очистка при размонтировании\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 * Пропсы для компонента FormWithPersistence\n */\nexport interface FormPersistenceProps {\n /**\n * Конфигурация сохранения\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 /** Функция для онлайн-отправки (вызывается при submit) */\n onlineSubmit: (value: TData) => Promise<void>\n}\n\n/**\n * Результат хука useFormFeatures\n */\nexport interface UseFormFeaturesResult<TData extends object> {\n /** Включена ли persistence */\n isPersistenceEnabled: boolean\n /** Включён ли offline-режим */\n isOfflineEnabled: boolean\n /** Результат persistence хука */\n persistenceResult: ReturnType<typeof useFormPersistence<TData>>\n /** Результат offline хука */\n offlineForm: ReturnType<typeof useOfflineForm<TData>>\n /** Состояние offline для контекста формы */\n offlineState: FormOfflineState | undefined\n /** Обработчик submit с поддержкой offline и persistence */\n handleSubmit: (value: TData) => Promise<void>\n /** Подписка на изменения формы для 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 * Хук, объединяющий логику persistence и offline для форм.\n * Устраняет дублирование между 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 // Хук persistence (если не включён — используем disabled ключ)\n const persistenceResult = useFormPersistence<TData>(persistence ?? { key: '__disabled__' })\n\n // Обёртка для онлайн-отправки с очисткой persistence\n const offlineOnlineSubmit = useCallback(\n async (value: TData) => {\n try {\n await onlineSubmit(value)\n // Очищаем persistence при успешной отправке\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n return { success: true }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Ошибка отправки' }\n }\n },\n [onlineSubmit, isPersistenceEnabled, persistenceResult]\n )\n\n // Хук offline (если включён)\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 // Состояние offline для контекста формы\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 // Обработчик submit\n const handleSubmit = useCallback(\n async (value: TData): Promise<void> => {\n if (isOfflineEnabled) {\n // Используем offline-aware submit\n await offlineForm.submit(value)\n } else {\n // Прямая отправка\n await onlineSubmit(value)\n // Очищаем persistence при успехе\n if (isPersistenceEnabled) {\n persistenceResult.clearSavedData()\n }\n }\n },\n [isOfflineEnabled, offlineForm, onlineSubmit, isPersistenceEnabled, persistenceResult]\n )\n\n // Подписка на изменения формы для 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+ возвращает 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 // Отмечаем восстановление как завершённое после тика\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 { useEffect, useMemo, type ReactElement, type ReactNode } from 'react'\nimport { useAppForm } from '../../form-hook'\nimport type { FormOfflineConfig } from '../../offline'\nimport { DeclarativeFormContext } from '../form-context'\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 для FormSimple компонента\n */\nexport interface FormSimpleProps<TData extends object> {\n /** Начальные значения формы */\n initialValue: TData\n /** Обработчик отправки формы */\n onSubmit: (data: TData) => void | Promise<void>\n /** Zod схема для валидации */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Конфигурация persistence (localStorage) */\n persistence?: FormPersistenceConfig\n /** Конфигурация offline-режима */\n offline?: FormOfflineConfig\n /** Режим(ы) валидации */\n validateOn?: ValidateOn | ValidateOn[]\n /** Отключить все поля формы */\n disabled?: boolean\n /** Режим \"только чтение\" для всех полей */\n readOnly?: boolean\n /** Middleware для обработки событий формы */\n middleware?: FormMiddleware<TData>\n /** Содержимое формы */\n children: ReactNode\n}\n\n/**\n * Простая форма без API интеграции.\n * Используется когда нужна форма с локальными данными.\n *\n * @example\n * <FormSimple\n * initialValue={{ name: '', email: '' }}\n * onSubmit={handleSubmit}\n * schema={UserSchema}\n * >\n * <Form.Field.String name=\"name\" label=\"Имя\" />\n * <Form.Field.String name=\"email\" label=\"Email\" />\n * <Form.Button.Submit>Сохранить</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 middleware,\n children,\n}: FormSimpleProps<TData>): ReactElement {\n // Используем общий хук для persistence и offline\n const features = useFormFeatures<TData>({\n persistence,\n offline,\n onlineSubmit: async (value) => {\n await onSubmit(value)\n },\n })\n\n // Инициализируем форму\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 // Применяем beforeSubmit middleware\n if (middleware?.beforeSubmit) {\n const transformed = await middleware.beforeSubmit(dataToSubmit)\n if (transformed === undefined) {\n // Отмена submit\n return\n }\n dataToSubmit = transformed\n }\n\n try {\n await features.handleSubmit(dataToSubmit)\n\n // Вызываем afterSuccess middleware\n if (middleware?.afterSuccess) {\n await middleware.afterSuccess(dataToSubmit)\n }\n\n // Сбрасываем форму с текущими значениями для очистки dirty-состояния\n formApi.reset(dataToSubmit)\n } catch (error) {\n // Вызываем 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 // Подписка на изменения для persistence\n useEffect(() => {\n return features.subscribeToFormChanges(form)\n }, [form, features])\n\n // Восстановление данных из 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 // Мемоизируем значение контекста для предотвращения лишних ререндеров\n const contextValue = useMemo<DeclarativeFormContextValue>(\n () => ({\n form,\n schema,\n offlineState: features.offlineState,\n disabled,\n readOnly,\n }),\n [form, schema, features.offlineState, disabled, readOnly]\n )\n\n return (\n <DeclarativeFormContext.Provider value={contextValue}>\n {/* Диалог восстановления данных */}\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 </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 * Состояние загрузки для формы с API.\n * Отображается пока данные загружаются в режиме редактирования.\n * Не рендерит children, чтобы избежать ошибок контекста в Field компонентах.\n */\nexport function FormLoadingState(): ReactElement {\n return (\n <div style={{ opacity: 0.5, padding: '1rem' }}>\n <p>Загрузка данных формы...</p>\n </div>\n )\n}\n","'use client'\n\nimport { useEffect, type ReactElement, type ReactNode } from 'react'\nimport { useAppForm } from '../../form-hook'\nimport type { FormOfflineConfig } from '../../offline'\nimport { DeclarativeFormContext } from '../form-context'\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 для FormWithApi компонента\n */\nexport interface FormWithApiProps<TData extends object> {\n /** Конфигурация API (ZenStack) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n api: FormApiConfig<TData, any>\n /** Начальные значения (fallback пока данные загружаются) */\n initialValue?: TData\n /** Дополнительный обработчик после успешной отправки */\n onSubmit?: (data: TData) => void | Promise<void>\n /** Zod схема для валидации */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Конфигурация persistence (localStorage) */\n persistence?: FormPersistenceConfig\n /** Конфигурация offline-режима */\n offline?: FormOfflineConfig\n /** Режим(ы) валидации */\n validateOn?: ValidateOn | ValidateOn[]\n /** Отключить все поля формы */\n disabled?: boolean\n /** Режим \"только чтение\" для всех полей */\n readOnly?: boolean\n /** Middleware для обработки событий формы */\n middleware?: FormMiddleware<TData>\n /** Содержимое формы */\n children: ReactNode\n}\n\n/**\n * Форма с интеграцией ZenStack API.\n * Автоматически загружает данные в режиме редактирования,\n * использует create/update мутации для сохранения.\n *\n * @example\n * <FormWithApi\n * api={{\n * id: 'abc123', // пустой = создание, заполненный = редактирование\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * }}\n * schema={RecipeSchema}\n * onSubmit={(data) => console.log('Сохранено:', data)}\n * >\n * <Form.Field.String name=\"title\" label=\"Название\" />\n * <Form.Button.Submit>Сохранить</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 middleware,\n children,\n}: FormWithApiProps<TData>): ReactElement {\n // Хук для работы с API\n const formApi = useFormApi(api)\n\n // Используем общий хук для persistence и offline\n const features = useFormFeatures<TData>({\n persistence,\n offline,\n onlineSubmit: async (value) => {\n // Вызываем API мутацию\n await formApi.submit(value)\n // Вызываем пользовательский callback\n await onSubmit?.(value)\n },\n })\n\n // Определяем начальные значения:\n // - Режим редактирования: используем загруженные данные (или initialValue как fallback)\n // - Режим создания: используем initialValue (или пустой объект)\n const defaultValues = formApi.isEditMode\n ? (formApi.data ?? initialValue ?? ({} as TData))\n : (initialValue ?? ({} as TData))\n\n // Инициализируем форму\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 // Применяем beforeSubmit middleware\n if (middleware?.beforeSubmit) {\n const transformed = await middleware.beforeSubmit(dataToSubmit)\n if (transformed === undefined) {\n // Отмена submit\n return\n }\n dataToSubmit = transformed\n }\n\n try {\n await features.handleSubmit(dataToSubmit)\n\n // Вызываем afterSuccess middleware\n if (middleware?.afterSuccess) {\n await middleware.afterSuccess(dataToSubmit)\n }\n\n // Сбрасываем форму с текущими значениями для очистки dirty-состояния\n tanstackFormApi.reset(dataToSubmit)\n } catch (error) {\n // Вызываем 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 // Подписка на изменения для persistence\n useEffect(() => {\n return features.subscribeToFormChanges(form)\n }, [form, features])\n\n // Восстановление данных из 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 // Флаг загрузки данных (режим редактирования)\n const dataLoaded = formApi.isEditMode && formApi.data && !formApi.isLoading\n\n // Формируем значение контекста\n const contextValue: DeclarativeFormContextValue = {\n form,\n schema,\n // Экспортируем состояние API для компонентов, которым оно нужно\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 }\n\n // Показываем состояние загрузки в режиме редактирования\n if (formApi.isLoading) {\n return <FormLoadingState />\n }\n\n return (\n <DeclarativeFormContext.Provider value={contextValue} key={dataLoaded ? 'loaded' : 'initial'}>\n {/* Диалог восстановления данных */}\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 </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// Реэкспорт типов для внешнего использования\nexport type {\n FormButtonComponents,\n FormComponent,\n FormFieldComponents,\n FormGroupComponent,\n FormGroupListComponent,\n FormStepsComponent,\n ListButtonComponents,\n} from './form-compound-types'\n\n// Реэкспорт подкомпонентов\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 * Корневой компонент декларативной формы.\n *\n * Поддерживает два режима:\n * 1. **Простой режим** — укажите initialValue и onSubmit\n * 2. **API режим** — укажите api для автоматической интеграции с ZenStack\n *\n * @example Простой режим\n * ```tsx\n * <Form initialValue={{ title: '', count: 0 }} onSubmit={handleSubmit}>\n * <Form.Field.String name=\"title\" label=\"Заголовок\" />\n * <Form.Button.Submit>Сохранить</Form.Button.Submit>\n * </Form>\n * ```\n *\n * @example API режим (ZenStack)\n * ```tsx\n * <Form\n * api={{\n * id: 'abc123', // пустой = создание, заполненный = редактирование\n * query: { hook: useFindUniqueRecipe, include: { components: true } },\n * mutations: { create: useCreateRecipe, update: useUpdateRecipe },\n * }}\n * schema={RecipeSchema}\n * onSubmit={(data) => console.log('Сохранено:', 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 children,\n}: FormPropsWithApi<TData>): ReactElement {\n // Если указан api — используем FormWithApi, иначе — простую форму\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 >\n {children}\n </FormWithApi>\n )\n }\n\n // Простой режим — initialValue обязателен\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 >\n {children}\n </FormSimple>\n )\n}\n\n/**\n * Form как compound component.\n * Подкомпоненты (Field, Group, Button, Steps и т.д.) добавляются в 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 * Базовая конфигурация поля\n */\ninterface BaseFieldConfig {\n /** Имя поля (ключ в данных формы) */\n name: string\n /** Label поля (если не указан, генерируется из name) */\n label?: string\n /** Placeholder */\n placeholder?: string\n /** Подсказка под полем */\n helperText?: string\n /** Обязательное поле */\n required?: boolean\n /** Отключено */\n disabled?: boolean\n /** Размер */\n size?: FieldSize\n}\n\n/**\n * Конфигурация текстового поля\n */\ninterface StringFieldConfig extends BaseFieldConfig {\n type: 'string'\n /** Максимальная длина */\n maxLength?: number\n}\n\n/**\n * Конфигурация многострочного поля\n */\ninterface TextareaFieldConfig extends BaseFieldConfig {\n type: 'textarea'\n /** Количество строк */\n rows?: number\n}\n\n/**\n * Конфигурация числового поля\n */\ninterface NumberFieldConfig extends BaseFieldConfig {\n type: 'number'\n /** Минимальное значение */\n min?: number\n /** Максимальное значение */\n max?: number\n /** Шаг */\n step?: number\n}\n\n/**\n * Конфигурация валютного поля\n */\ninterface CurrencyFieldConfig extends BaseFieldConfig {\n type: 'currency'\n /** Код валюты (по умолчанию 'RUB') */\n currency?: string\n}\n\n/**\n * Конфигурация процентного поля\n */\ninterface PercentageFieldConfig extends BaseFieldConfig {\n type: 'percentage'\n}\n\n/**\n * Конфигурация слайдера\n */\ninterface SliderFieldConfig extends BaseFieldConfig {\n type: 'slider'\n min?: number\n max?: number\n step?: number\n}\n\n/**\n * Конфигурация рейтинга\n */\ninterface RatingFieldConfig extends BaseFieldConfig {\n type: 'rating'\n /** Максимальное значение (по умолчанию 5) */\n max?: number\n}\n\n/**\n * Конфигурация чекбокса\n */\ninterface CheckboxFieldConfig extends BaseFieldConfig {\n type: 'checkbox'\n}\n\n/**\n * Конфигурация switch\n */\ninterface SwitchFieldConfig extends BaseFieldConfig {\n type: 'switch'\n}\n\n/**\n * Конфигурация select\n */\ninterface SelectFieldConfig extends BaseFieldConfig {\n type: 'select'\n /** Опции для выбора */\n options: BaseOption[]\n /** Использовать NativeSelect */\n native?: boolean\n}\n\n/**\n * Конфигурация даты\n */\ninterface DateFieldConfig extends BaseFieldConfig {\n type: 'date'\n}\n\n/**\n * Конфигурация пароля\n */\ninterface PasswordFieldConfig extends BaseFieldConfig {\n type: 'password'\n}\n\n/**\n * Конфигурация телефона\n */\ninterface PhoneFieldConfig extends BaseFieldConfig {\n type: 'phone'\n}\n\n/**\n * Конфигурация auto-поля (тип определяется из схемы)\n */\ninterface AutoFieldConfig extends BaseFieldConfig {\n type: 'auto'\n}\n\n/**\n * Объединённый тип конфигурации поля\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 * Секция формы для группировки полей\n */\nexport interface FormBuilderSection {\n /** Заголовок секции */\n title?: string\n /** Описание секции */\n description?: string\n /** Поля в секции */\n fields: FieldConfig[]\n}\n\n/**\n * Конфигурация формы для FormBuilder\n */\nexport interface FormBuilderConfig {\n /** Поля формы (простой список) */\n fields?: FieldConfig[]\n /** Секции формы (для группировки) */\n sections?: FormBuilderSection[]\n}\n\n// =============================================================================\n// Form Builder Props\n// =============================================================================\n\n/**\n * Props для FormBuilder\n */\nexport interface FormBuilderProps<TData extends object> {\n /** Конфигурация формы */\n config: FormBuilderConfig\n /** Начальные значения */\n initialValue: TData\n /** Обработчик отправки */\n onSubmit: (data: TData) => void | Promise<void>\n /** Zod схема для валидации */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema?: any\n /** Режим валидации */\n validateOn?: ValidateOn | ValidateOn[]\n /** Middleware */\n middleware?: FormMiddleware<TData>\n /** Отключить все поля */\n disabled?: boolean\n /** Только для чтения */\n readOnly?: boolean\n /** Текст кнопки отправки */\n submitLabel?: string\n /** Дополнительный контент после полей */\n children?: ReactNode\n}\n\n// =============================================================================\n// Field Renderer\n// =============================================================================\n\n/**\n * Извлекает базовые props из конфигурации\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 * Рендерит поле по конфигурации\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 использует title вместо 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 - Генерация формы из JSON конфигурации\n *\n * Позволяет создавать формы декларативно через объект конфигурации\n * вместо написания JSX.\n *\n * @example Простая форма\n * ```tsx\n * const config = {\n * fields: [\n * { type: 'string', name: 'firstName', label: 'Имя' },\n * { type: 'string', name: 'lastName', label: 'Фамилия' },\n * { type: 'string', name: 'email', label: 'Email', placeholder: 'email@example.com' },\n * { type: 'number', name: 'age', label: 'Возраст', min: 0, max: 120 },\n * { type: 'select', name: 'role', label: 'Роль', options: [\n * { label: 'Пользователь', value: 'user' },\n * { label: 'Администратор', 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 С секциями\n * ```tsx\n * const config = {\n * sections: [\n * {\n * title: 'Личные данные',\n * fields: [\n * { type: 'string', name: 'firstName' },\n * { type: 'string', name: 'lastName' },\n * ]\n * },\n * {\n * title: 'Контакты',\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 С auto-полями (тип определяется из Zod схемы)\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 = 'Сохранить',\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 {/* Простой список полей */}\n {config.fields?.map((fieldConfig) => renderField(fieldConfig))}\n\n {/* Секции с полями */}\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 {/* Дополнительный контент */}\n {children}\n\n {/* Кнопка отправки */}\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 /** Заголовок секции ошибок */\n title?: ReactNode\n /** Показывать ошибки до первой попытки сабмита (по умолчанию 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 * Извлекает все сообщения об ошибках из структуры TanStack Form + Zod\n * Формат: { \"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 // Обрабатываем объект ошибок полей: { \"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 - Отображает все ошибки валидации формы\n *\n * Показывает сводку всех ошибок валидации по всем полям.\n * Рендерится только при наличии ошибок.\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 = 'Исправьте следующие ошибки:',\n showBeforeSubmit = false,\n}: FormErrorsProps): ReactElement | null {\n const { form, apiState } = useDeclarativeForm()\n\n // Извлекаем сообщение об ошибке сервера, если есть\n const serverError = apiState?.mutationError\n // Некоторые библиотеки (например, ZenStack) добавляют info к Error\n const errorInfo = serverError && 'info' in serverError ? (serverError as { info?: { message?: string } }).info : null\n const serverErrorMessage = serverError ? serverError.message || errorInfo?.message || 'Ошибка сервера' : 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 // Не показываем ошибки валидации до первой попытки сабмита (если не указано иное)\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 для Form.FromSchema\n */\nexport interface FormFromSchemaProps<TData extends object> {\n /**\n * Zod схема (обязательна)\n * Используется для валидации и автогенерации полей\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n schema: any\n /**\n * Начальные значения формы\n */\n initialValue: TData\n /**\n * Обработчик отправки формы\n */\n onSubmit: (data: TData) => void | Promise<void>\n /**\n * Текст кнопки отправки\n * @default 'Сохранить'\n */\n submitLabel?: ReactNode\n /**\n * Показывать кнопку сброса\n * @default false\n */\n showReset?: boolean\n /**\n * Текст кнопки сброса\n * @default 'Сбросить'\n */\n resetLabel?: ReactNode\n /**\n * Исключить поля из автогенерации\n * @example exclude={['id', 'createdAt', 'updatedAt']}\n */\n exclude?: string[]\n /**\n * Режим валидации\n */\n validateOn?: ValidateOn | ValidateOn[]\n /**\n * Middleware для обработки событий формы\n */\n middleware?: FormMiddleware<TData>\n /**\n * Глобальное отключение всех полей\n */\n disabled?: boolean\n /**\n * Глобальный режим только для чтения\n */\n readOnly?: boolean\n /**\n * Конфигурация localStorage персистенции\n */\n persistence?: FormPersistenceConfig\n /**\n * Конфигурация оффлайн режима\n */\n offline?: FormOfflineConfig\n /**\n * Дополнительный контент перед кнопками\n */\n beforeButtons?: ReactNode\n /**\n * Дополнительный контент после кнопок\n */\n afterButtons?: ReactNode\n /**\n * Gap между полями\n * @default 4\n */\n gap?: number\n}\n\n/**\n * Form.FromSchema — полностью автоматическая генерация формы из Zod схемы\n *\n * Создаёт форму с автоматически сгенерированными полями на основе\n * типов и метаданных Zod схемы.\n *\n * @example Простое использование\n * ```tsx\n * const UserSchema = z.object({\n * firstName: z.string().meta({ ui: { title: 'Имя' } }),\n * lastName: z.string().meta({ ui: { title: 'Фамилия' } }),\n * email: z.string().email().meta({ ui: { title: 'Email' } }),\n * bio: z.string().meta({ ui: { title: 'О себе', fieldType: 'textarea' } }),\n * })\n *\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={{ firstName: '', lastName: '', email: '', bio: '' }}\n * onSubmit={saveUser}\n * submitLabel=\"Создать пользователя\"\n * />\n * ```\n *\n * @example С исключением полей и кнопкой сброса\n * ```tsx\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={userData}\n * onSubmit={updateUser}\n * exclude={['id', 'createdAt']}\n * showReset\n * submitLabel=\"Обновить\"\n * resetLabel=\"Отменить изменения\"\n * />\n * ```\n *\n * @example С middleware и валидацией\n * ```tsx\n * <Form.FromSchema\n * schema={UserSchema}\n * initialValue={data}\n * onSubmit={save}\n * validateOn=\"blur\"\n * middleware={{\n * afterSuccess: () => toaster.success({ title: 'Сохранено!' }),\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 = 'Сохранить',\n showReset = false,\n resetLabel = 'Сбросить',\n exclude,\n validateOn,\n middleware,\n disabled,\n readOnly,\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 persistence={persistence}\n offline={offline}\n >\n <VStack align=\"stretch\" gap={gap}>\n {/* Автоматически сгенерированные поля */}\n <FormAutoFields exclude={exclude} />\n\n {/* Дополнительный контент перед кнопками */}\n {beforeButtons}\n\n {/* Кнопки */}\n <HStack justify=\"flex-end\" gap={2}>\n {showReset && <ButtonReset variant=\"outline\">{resetLabel}</ButtonReset>}\n <ButtonSubmit>{submitLabel}</ButtonSubmit>\n </HStack>\n\n {/* Дополнительный контент после кнопок */}\n {afterButtons}\n </VStack>\n </FormSimple>\n )\n}\n\nFormFromSchema.displayName = 'FormFromSchema'\n","'use client'\n\nimport { createContext, useContext, type ReactNode } 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 при входе на шаг */\n onEnter?: () => void\n /** Callback при уходе с шага (может отменить переход) */\n onLeave?: (direction: StepDirection) => Promise<boolean> | boolean\n}\n\n/** Направление анимации */\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 /** Включены ли анимации переходов */\n animated: boolean\n /** Длительность анимации в секундах */\n animationDuration: number\n /** Направление последнего перехода (для анимации) */\n direction: StepDirection\n /** Скрытые поля (исключаются из валидации через Form.When) */\n hiddenFields: Set<string>\n /** Скрыть поля от валидации (вызывается из Form.When при скрытии) */\n hideFieldsFromValidation: (fieldNames: string[]) => void\n /** Показать поля для валидации (вызывается из Form.When при показе) */\n showFieldsForValidation: (fieldNames: string[]) => void\n /** Callback при успешном завершении шага */\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 * Параметры хука useStepNavigation\n */\nexport interface UseStepNavigationParams {\n /** TanStack Form API */\n form: AnyFormApi\n /** Текущий индекс шага */\n currentStep: number\n /** Общее количество шагов */\n stepCount: number\n /** Отсортированные шаги */\n sortedSteps: StepInfo[]\n /** Скрытые поля (исключаются из валидации) */\n hiddenFields: Set<string>\n /** Контролируемый шаг извне */\n controlledStep?: number\n /** Callback при изменении шага */\n onStepChange?: (step: number) => void\n /** Callback при завершении шага */\n onStepComplete?: (stepIndex: number, values: unknown) => Promise<void> | void\n /** Валидировать при переходе к следующему шагу */\n validateOnNext?: boolean\n /** Setter для внутреннего состояния шага */\n setInternalStep: (step: number) => void\n}\n\n/**\n * Результат хука useStepNavigation\n */\nexport interface UseStepNavigationResult {\n /** Направление перехода (для анимации) */\n direction: StepDirection\n /** Перейти к следующему шагу (с валидацией) */\n goToNext: () => Promise<boolean>\n /** Перейти к предыдущему шагу */\n goToPrev: () => Promise<void>\n /** Перейти к конкретному шагу */\n goToStep: (step: number) => void\n /** Пропустить до конца (без валидации) */\n skipToEnd: () => void\n /** Запустить отправку формы */\n triggerSubmit: () => void\n /** Валидировать текущий шаг */\n validateCurrentStep: () => Promise<boolean>\n}\n\n/**\n * Хук для навигации между шагами формы\n *\n * Управляет:\n * - Переходами между шагами\n * - Валидацией перед переходом\n * - Направлением анимации\n * - Callbacks шагов (onEnter, onLeave)\n *\n * ВАЖНО: Все callback'и используют refs для нестабильных значений (sortedSteps, stepCount,\n * currentStep, hiddenFields, onStepChange, onStepComplete). Это предотвращает пересоздание\n * callback'ов при каждой регистрации шага, что вызывало бесконечный цикл:\n * registerStep → новый sortedSteps/stepCount → новые callback'и → новый contextValue →\n * ре-рендер → повторная регистрация → бесконечный цикл.\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 // Направление анимации (для slide эффекта)\n const [direction, setDirection] = useState<StepDirection>('forward')\n\n // Все нестабильные значения через refs — callback'и НИКОГДА не пересоздаются\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 // Валидация полей текущего шага (исключая скрытые поля)\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 // Фильтруем скрытые поля — они не должны валидироваться\n const visibleFieldNames = currentStepInfo.fieldNames.filter((name) => !hiddenFieldsRef.current.has(name))\n\n if (visibleFieldNames.length === 0) {\n return true\n }\n\n // Помечаем поля как touched для показа ошибок\n for (const fieldName of visibleFieldNames) {\n form.setFieldMeta(fieldName, (prev) => ({\n ...prev,\n isTouched: true,\n }))\n }\n\n // Валидируем каждое видимое поле текущего шага\n for (const fieldName of visibleFieldNames) {\n await form.validateField(fieldName, 'change')\n }\n\n // Проверяем наличие ошибок\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 // Переход к следующему шагу\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 // Вызываем onLeave callback если есть (может отменить переход)\n if (currentStepInfo?.onLeave) {\n const canLeave = await currentStepInfo.onLeave('forward')\n if (!canLeave) {\n return false\n }\n }\n\n // Вызываем 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 // Вызываем onEnter callback следующего шага\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 // Переход к предыдущему шагу\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 // Вызываем onLeave callback если есть (может отменить переход)\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 // Вызываем onEnter callback предыдущего шага\n const prevStepInfo = sortedStepsRef.current[prevStep]\n if (prevStepInfo?.onEnter) {\n prevStepInfo.onEnter()\n }\n }\n }, [setInternalStep])\n\n // Переход к конкретному шагу\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 // Пропустить до конца (без валидации)\n\n const skipToEnd = useCallback(() => {\n const count = stepCountRef.current\n setDirection('forward')\n if (controlledStepRef.current === undefined) {\n setInternalStep(count) // За последний шаг — состояние completed\n }\n onStepChangeRef.current?.(count)\n }, [setInternalStep])\n\n // Программный запуск отправки формы\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 * Конфигурация персистенции шага формы\n */\nexport interface StepPersistenceConfig {\n /**\n * Уникальный ключ для localStorage\n * Должен быть уникален для каждой формы\n */\n key: string\n\n /**\n * Задержка debounce для сохранения в миллисекундах\n * @default 300\n */\n debounceMs?: number\n}\n\n/**\n * Результат хука useStepPersistence\n */\nexport interface UseStepPersistenceResult {\n /** Получить сохранённый шаг из localStorage */\n getPersistedStep: () => number | null\n /** Очистить сохранённый шаг */\n clearPersistence: () => void\n}\n\n/**\n * Хук для персистенции текущего шага в localStorage\n *\n * Сохраняет и восстанавливает индекс текущего шага автоматически.\n * Использует debounce для оптимизации записи.\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 // Используем ref для config — предотвращает перезапуск useEffect\n // при каждом рендере из-за смены ссылки на объект\n const configRef = useRef(config)\n configRef.current = config\n\n // Получить сохранённый шаг при монтировании\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 или ошибка localStorage — игнорируем\n }\n return null\n }, [])\n\n // Сохранение шага с debounce — зависит только от 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 // Отменяем предыдущий таймер\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n\n // Debounced сохранение\n debounceTimerRef.current = setTimeout(() => {\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${cfg.key}`, String(currentStep))\n } catch {\n // localStorage может быть переполнен или отключён\n }\n }, debounceMs)\n\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n }\n }, [currentStep])\n\n // Очистить персистенцию (вызывать после успешной отправки формы)\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 // Игнорируем ошибки\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 * Результат хука useStepState\n */\nexport interface UseStepStateResult {\n /** Зарегистрированные шаги, отсортированные по индексу */\n sortedSteps: StepInfo[]\n /** Количество шагов */\n stepCount: number\n /** Регистрация шага */\n registerStep: (step: StepInfo) => void\n /** Удаление регистрации шага */\n unregisterStep: (index: number) => void\n /** Скрытые поля (исключаются из валидации) */\n hiddenFields: Set<string>\n /** Скрыть поля от валидации */\n hideFieldsFromValidation: (fieldNames: string[]) => void\n /** Показать поля для валидации */\n showFieldsForValidation: (fieldNames: string[]) => void\n}\n\n/**\n * Хук для управления состоянием шагов\n *\n * Управляет:\n * - Регистрацией/удалением шагов\n * - Сортировкой шагов по индексу\n * - Скрытыми полями (для Form.When интеграции)\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 // Зарегистрированные шаги\n const [steps, setSteps] = useState<StepInfo[]>([])\n\n // Скрытые поля (исключаются из валидации через Form.When)\n const [hiddenFields, setHiddenFields] = useState<Set<string>>(new Set())\n\n // Сортировка шагов по индексу\n const sortedSteps = useMemo(() => [...steps].sort((a, b) => a.index - b.index), [steps])\n\n const stepCount = sortedSteps.length\n\n // Регистрация шага (с проверкой изменений — предотвращает лишние ре-рендеры)\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 // Сравниваем значимые поля — если не изменились, не обновляем 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 // Без изменений — возвращаем тот же объект\n }\n const next = [...prev]\n next[existing] = step\n return next\n }\n return [...prev, step]\n })\n }, [])\n\n // Удаление регистрации шага\n const unregisterStep = useCallback((index: number) => {\n setSteps((prev) => prev.filter((s) => s.index !== index))\n }, [])\n\n // Скрыть поля от валидации (вызывается из Form.When при скрытии)\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 // Показать поля для валидации (вызывается из Form.When при показе)\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 /** Включить slide анимации при переходе между шагами */\n animated?: boolean\n /** Длительность анимации в секундах (по умолчанию 0.3) */\n animationDuration?: number\n /** Callback при успешном завершении шага (вызывается после валидации, перед переходом) */\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 хук\n const { getPersistedStep, clearPersistence } = useStepPersistence(0, stepPersistence)\n\n // Step state (использует сохранённое значение если доступно)\n const [internalStep, setInternalStep] = useState(() => {\n const persisted = getPersistedStep()\n return persisted ?? defaultStep\n })\n const currentStep = controlledStep ?? internalStep\n\n // Step state хук (регистрация шагов, скрытые поля)\n const {\n sortedSteps,\n stepCount,\n registerStep,\n unregisterStep,\n hiddenFields,\n hideFieldsFromValidation,\n showFieldsForValidation,\n } = useStepState()\n\n // Persistence: сохранение изменений шага\n useStepPersistence(currentStep, stepPersistence)\n\n // Navigation хук\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 для нестабильных значений — предотвращает пересоздание contextValue\n // при каждой регистрации шага (sortedSteps и hiddenFields меняются при регистрации)\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 — зависит только от стабильных значений\n // sortedSteps, hiddenFields и onStepComplete через refs\n const contextValue: FormStepsContextValue = useMemo(\n () => ({\n currentStep,\n stepCount,\n // Геттер для steps — возвращает актуальное значение через 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 // ВАЖНО: sortedSteps, hiddenFields, onStepComplete НЕ в deps —\n // доступны через refs/getters, предотвращает бесконечный цикл\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 с защитой от double-click\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 * Условие отображения шага\n */\nexport interface StepWhenCondition<TValue = unknown> {\n /** Поле для отслеживания */\n field: string\n /** Показывать шаг когда значение равно */\n is?: TValue\n /** Показывать шаг когда значение НЕ равно */\n isNot?: TValue\n /** Показывать шаг когда значение в массиве */\n in?: TValue[]\n /** Показывать шаг когда значение НЕ в массиве */\n notIn?: TValue[]\n /** Кастомная функция условия */\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 при входе на шаг */\n onEnter?: () => void\n /** Callback при уходе с шага (может отменить переход возвращая false) */\n onLeave?: (direction: 'forward' | 'backward') => Promise<boolean> | boolean\n /** Условие отображения шага (шаг показывается только если условие истинно) */\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/** Смещение для slide анимации в пикселях */\nconst SLIDE_OFFSET = 50\n\n/**\n * Вычисляет значение условия when\n */\nfunction evaluateWhenCondition(when: StepWhenCondition | undefined, fieldValue: unknown): boolean {\n if (!when) {\n return true // Нет условия — всегда показываем\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 // По умолчанию — truthy проверка\n return Boolean(fieldValue)\n}\n\n/**\n * Получает значение вложенного поля по dot-notation пути\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 (показывается только для определённой роли)\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 // Отслеживаем видимость шага на основе when условия\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 // Подписка на изменения поля when\n useEffect(() => {\n if (!when) {\n return\n }\n\n const unsubscribe = 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 return unsubscribe\n }, [form, when])\n\n // Assign index on mount (только если шаг видим)\n // ВАЖНО: steps НЕ должен быть в dependency array — иначе бесконечный цикл!\n // registerStep обновляет steps, что вызовет effect снова.\n // Используем stepsRef для доступа к актуальному значению без зависимости.\n const stepsRef = useRef(steps)\n stepsRef.current = steps\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 // Find next available index (используем ref чтобы избежать dependency на steps)\n const existingIndices = stepsRef.current.map((s) => s.index)\n let nextIndex = 0\n while (existingIndices.includes(nextIndex)) {\n nextIndex++\n }\n\n // Если индекс уже назначен — используем его\n if (indexRef.current < 0) {\n indexRef.current = nextIndex\n }\n\n // ВАЖНО: fieldNames извлекаются ОДИН РАЗ при монтировании\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 }\n }\n // ВАЖНО: steps, children и icon намеренно НЕ включены — вызывают бесконечный цикл\n // icon — JSX элемент, создаётся заново каждый рендер\n }, [description, registerStep, title, unregisterStep, onEnter, onLeave, isVisible, fieldExtractionPath])\n\n // Извлекаем fieldNames и мемоизируем их строковое представление\n // для использования в dependency array вместо children\n const fieldNamesRef = useRef<string[]>([])\n const currentFieldNames = useMemo(\n () => extractFieldNames(children, fieldExtractionPath),\n // Используем segment path как proxy для определения когда структура может измениться\n // children НЕ включаем — они меняются на каждый рендер\n\n [fieldExtractionPath]\n )\n\n // Обновляем ref только если fieldNames реально изменились\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 // ВАЖНО: children и icon НЕ включены в deps — они меняются каждый рендер и вызовут бесконечный цикл\n // icon — JSX элемент, который создаётся заново при каждом рендере\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 // Варианты анимации для slide эффекта\n const slideVariants: Variants = useMemo(\n () => ({\n // Начальное состояние: элемент появляется с нужной стороны\n initial: {\n opacity: 0,\n x: direction === 'forward' ? SLIDE_OFFSET : -SLIDE_OFFSET,\n },\n // Финальное состояние: элемент на месте\n animate: {\n opacity: 1,\n x: 0,\n },\n // Состояние выхода: элемент уходит в противоположную сторону\n exit: {\n opacity: 0,\n x: direction === 'forward' ? -SLIDE_OFFSET : SLIDE_OFFSET,\n },\n }),\n [direction]\n )\n\n // Шаг скрыт через when условие — не рендерим\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 // Проверяем, является ли этот шаг текущим\n const isActive = index === currentStep\n\n // Если анимации отключены — рендерим обычный Steps.Content\n if (!animated) {\n return <Steps.Content index={index}>{wrappedChildren}</Steps.Content>\n }\n\n // С анимациями — оборачиваем в 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 * Извлекаем имена полей из children рекурсивно (для интеграции с валидацией шагов)\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 // Проверяем наличие name prop у компонента поля\n if (typeof props.name === 'string') {\n const fullName = parentPath ? `${parentPath}.${props.name}` : props.name\n names.push(fullName)\n }\n\n // Проверяем Form.Group — он создаёт 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 } // Рекурсивно обходим children (кроме Form.Group.List — массивы обрабатываются отдельно)\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 * Внутренний компонент для обработки показа/скрытия полей\n * Интегрируется с FormStepsContext для исключения скрытых полей из валидации\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 // Мемоизируем имена полей — пересчитываем только при изменении children\n const fieldNames = useMemo(() => extractFieldNames(children, parentPath), [children, parentPath])\n\n // Единый useEffect для управления видимостью полей в валидации\n useEffect(() => {\n // Нет контекста шагов или полей — ничего не делаем\n if (!stepsContext || fieldNames.length === 0) {\n return\n }\n\n const isFirstMount = prevShouldRender.current === null\n\n if (isFirstMount) {\n // Первый mount: если скрыто — сразу исключаем из валидации\n if (!shouldRender) {\n stepsContext.hideFieldsFromValidation(fieldNames)\n }\n } else if (shouldRender && !prevShouldRender.current) {\n // Поля стали видимыми — показываем для валидации\n stepsContext.showFieldsForValidation(fieldNames)\n } else if (!shouldRender && prevShouldRender.current) {\n // Поля скрылись — исключаем из валидации\n stepsContext.hideFieldsFromValidation(fieldNames)\n }\n\n prevShouldRender.current = shouldRender\n\n // Cleanup: при размонтировании показываем поля обратно\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 * Создаёт ленивый компонент с встроенным Suspense и Skeleton fallback\n *\n * Поддерживает как default export, так и named export (объект модуля)\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=\"Тип\" />\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 // Если вернули сам компонент (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 * Преобразует объект с функциями динамического импорта в объект с lazy компонентами\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 * // Результат:\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/** Тип для функции ленивого импорта */\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 (синхронные) */\n extraSelects?: Record<string, AnyComponent>\n /** Extra combobox components to add to Form.Combobox (синхронные) */\n extraComboboxes?: Record<string, AnyComponent>\n /** Extra listbox components to add to Form.Listbox (синхронные) */\n extraListboxes?: Record<string, AnyComponent>\n\n /**\n * Ленивые Select компоненты — загружаются только при рендере\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 * Ленивые Combobox компоненты — загружаются только при рендере\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 * Ленивые Listbox компоненты — загружаются только при рендере\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 } = options\n\n // Создаём lazy-обёртки для компонентов\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 // Объединяем синхронные и lazy компоненты\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 return Form(props)\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 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// Стабильный fallback для fieldMeta — предотвращает бесконечный цикл в useSyncExternalStore.\n// Если создавать новый объект в getSnapshot каждый раз, Object.is сравнение даст false,\n// и React будет бесконечно ре-рендерить компонент.\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 запрещает вызов хуков внутри аргументов других хуков)\n const subscribe = useCallback((callback: () => void) => form.store.subscribe(callback), [form])\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 метаданных для плоской схемы (только верхний уровень)\n */\nexport type UIMetaConfig<T extends z.ZodRawShape> = {\n [K in keyof T]?: FieldUIMeta\n}\n\n/** Мутабельный тип для создания новой shape */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MutableShape = { [key: string]: any }\n\n/**\n * Конфигурация UI метаданных с поддержкой вложенных объектов\n * Для вложенных объектов используйте _meta для метаданных самой группы\n */\nexport type DeepUIMetaConfig<T extends z.ZodRawShape> = {\n [K in keyof T]?: FieldUIMeta | ({ _meta?: FieldUIMeta } & Record<string, FieldUIMeta | unknown>)\n}\n\n/**\n * Проверить, является ли схема 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 * Проверить, содержит ли конфигурация вложенные настройки\n */\nfunction hasNestedConfig(config: unknown): boolean {\n if (typeof config !== 'object' || config === null) {\n return false\n }\n\n // Если есть _meta — это точно вложенная конфигурация\n if ('_meta' in config) {\n return true\n }\n\n // Проверяем, есть ли вложенные объекты с title/fieldType\n // Исключаем стандартные поля FieldUIMeta\n const fieldUIMetaKeys = ['title', 'description', 'placeholder', 'tooltip', 'fieldType', 'fieldProps']\n\n for (const [key, value] of Object.entries(config)) {\n // Пропускаем стандартные поля FieldUIMeta\n if (fieldUIMetaKeys.includes(key)) {\n continue\n }\n\n // Если значение — объект с title/fieldType/description, это вложенная конфигурация\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 * Обогатить ZenStack/Zod схему UI метаданными\n *\n * Добавляет .meta({ ui: {...} }) к полям схемы на основе конфигурации.\n * Работает только с верхним уровнем полей.\n *\n * @example Базовое использование\n * ```ts\n * import { ProductCreateInputSchema } from '@/generated/zod/objects/ProductCreateInput.schema'\n *\n * const ProductFormSchema = withUIMeta(ProductCreateInputSchema, {\n * name: { title: 'Название', placeholder: 'Введите название' },\n * price: { title: 'Цена', fieldType: 'currency', fieldProps: { currency: 'RUB' } },\n * isActive: { title: 'Активен', fieldType: 'switch' },\n * })\n * ```\n *\n * @example С enum полями\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * role: {\n * title: 'Роль',\n * fieldType: 'radioCard',\n * fieldProps: {\n * options: [\n * { value: 'ADMIN', label: 'Администратор' },\n * { value: 'USER', label: 'Пользователь' },\n * ],\n * },\n * },\n * })\n * ```\n *\n * @param schema Zod object схема\n * @param config Конфигурация UI метаданных для полей\n * @returns Новая схема с добавленными метаданными\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 // Добавить .meta({ ui: {...} }) к полю\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 // Сохраняем strict/passthrough режим если был\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 * Обогатить ZenStack/Zod схему UI метаданными с поддержкой вложенных объектов\n *\n * Расширенная версия withUIMeta, которая рекурсивно обрабатывает вложенные объекты.\n * Для метаданных вложенной группы используйте ключ `_meta`.\n *\n * @example С вложенными объектами\n * ```ts\n * const UserFormSchema = withUIMetaDeep(UserCreateInputSchema, {\n * firstName: { title: 'Имя' },\n * lastName: { title: 'Фамилия' },\n * address: {\n * _meta: { title: 'Адрес доставки' }, // meta для группы\n * country: { title: 'Страна', fieldType: 'select' },\n * city: { title: 'Город' },\n * street: { title: 'Улица' },\n * },\n * })\n * ```\n *\n * @example Глубокая вложенность\n * ```ts\n * const OrderFormSchema = withUIMetaDeep(OrderCreateInputSchema, {\n * orderNumber: { title: 'Номер заказа' },\n * user: {\n * _meta: { title: 'Данные клиента' },\n * firstName: { title: 'Имя' },\n * address: {\n * _meta: { title: 'Адрес' },\n * city: { title: 'Город' },\n * },\n * },\n * })\n * ```\n *\n * @param schema Zod object схема\n * @param config Конфигурация UI метаданных (может быть вложенной)\n * @returns Новая схема с добавленными метаданными\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 // Получаем unwrapped схему для проверки типа\n const unwrapped = unwrapSchema(fieldSchema)\n\n // Проверяем, это вложенный объект или обычное поле\n if (isZodObject(unwrapped) && hasNestedConfig(fieldConfig)) {\n // Это вложенный объект с конфигурацией полей\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { _meta, ...nestedConfig } = fieldConfig as { _meta?: FieldUIMeta } & Record<string, any>\n\n // Рекурсивно обрабатываем вложенный объект\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let nestedSchema = withUIMetaDeep(unwrapped as any, nestedConfig)\n\n // Применяем _meta к самому полю (для 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 // Восстанавливаем wrapper'ы (optional, nullable, default)\n newShape[key] = rewrapSchema(fieldSchema, nestedSchema)\n } else {\n // Обычное поле — просто добавляем 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 // Сохраняем strict/passthrough режим если был\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 * Восстановить wrapper'ы (optional, nullable, default) вокруг новой внутренней схемы\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 * Готовые пресеты для системных полей (id, createdAt, updatedAt)\n *\n * @example\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * ...commonMeta, // Добавит id, createdAt, updatedAt\n * name: { title: 'Имя' },\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: 'Создано',\n fieldType: 'date',\n fieldProps: { readOnly: true },\n },\n updatedAt: {\n title: 'Обновлено',\n fieldType: 'date',\n fieldProps: { readOnly: true },\n },\n}\n\n/**\n * Типы полей для выбора из списка (enum/select)\n */\nexport type SelectionFieldType = Extract<\n FieldComponentType,\n 'select' | 'nativeSelect' | 'radioGroup' | 'radioCard' | 'segmentedGroup' | 'checkboxCard' | 'listbox'\n>\n\n/**\n * Хелпер для создания UI метаданных relation полей\n *\n * @example\n * ```ts\n * const OrderFormSchema = withUIMeta(OrderCreateInputSchema, {\n * categoryId: relationMeta({\n * title: 'Категория',\n * model: 'Category',\n * labelField: 'name',\n * }),\n * })\n * ```\n *\n * @example С кастомным типом поля\n * ```ts\n * categoryId: relationMeta({\n * title: 'Категория',\n * model: 'Category',\n * labelField: 'name',\n * fieldType: 'combobox',\n * })\n * ```\n */\nexport function relationMeta(config: {\n /** Заголовок поля */\n title: string\n /** Имя связанной модели */\n model: string\n /** Поле для отображения label */\n labelField: string\n /** Поле для значения (по умолчанию 'id') */\n valueField?: string\n /** Тип компонента для отображения (по умолчанию 'select') */\n fieldType?: SelectionFieldType\n /** Дополнительные 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 * Хелпер для создания UI метаданных enum полей с кастомными метками\n *\n * @example Простое использование\n * ```ts\n * const UserFormSchema = withUIMeta(UserCreateInputSchema, {\n * role: enumMeta({\n * title: 'Роль',\n * labels: {\n * ADMIN: 'Администратор',\n * MANAGER: 'Менеджер',\n * USER: 'Пользователь',\n * GUEST: 'Гость',\n * },\n * }),\n * })\n * ```\n *\n * @example С кастомным типом поля\n * ```ts\n * role: enumMeta({\n * title: 'Роль',\n * fieldType: 'radioCard',\n * labels: { ADMIN: 'Администратор', USER: 'Пользователь' },\n * })\n * ```\n *\n * @example С описаниями для каждой опции\n * ```ts\n * priority: enumMeta({\n * title: 'Приоритет',\n * fieldType: 'radioCard',\n * options: [\n * { value: 'LOW', label: 'Низкий', description: 'Сделать когда-нибудь' },\n * { value: 'HIGH', label: 'Высокий', description: 'Срочно!' },\n * ],\n * })\n * ```\n */\nexport function enumMeta<T extends string>(\n config:\n | {\n /** Заголовок поля */\n title: string\n /** Тип компонента для отображения (по умолчанию nativeSelect) */\n fieldType?: SelectionFieldType\n /** Маппинг enum значений на русские метки */\n labels: Record<T, string>\n /** Описание поля */\n description?: string\n /** Дополнительные props */\n fieldProps?: Record<string, unknown>\n }\n | {\n /** Заголовок поля */\n title: string\n /** Тип компонента для отображения (по умолчанию nativeSelect) */\n fieldType?: SelectionFieldType\n /** Полные опции с value, label и опционально description */\n options: Array<{ value: T; label: string; description?: string }>\n /** Описание поля */\n description?: string\n /** Дополнительные props */\n fieldProps?: Record<string, unknown>\n }\n): FieldUIMeta {\n // Определяем options из labels или напрямую\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 * Хелпер для создания UI метаданных текстовых полей\n *\n * @example\n * ```ts\n * name: textMeta({ title: 'Имя', placeholder: 'Введите имя' })\n * bio: textMeta({ title: 'О себе', 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 * Хелпер для создания UI метаданных числовых полей\n *\n * @example\n * ```ts\n * age: numberMeta({ title: 'Возраст', min: 0, max: 120 })\n * price: numberMeta({ title: 'Цена', fieldType: 'currency', currency: 'RUB' })\n * rating: numberMeta({ title: 'Рейтинг', 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 // для 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 * Хелпер для создания UI метаданных булевых полей\n *\n * @example\n * ```ts\n * isActive: booleanMeta({ title: 'Активен', fieldType: 'switch' })\n * newsletter: booleanMeta({ title: 'Подписка', description: 'Получать новости' })\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 * Хелпер для создания UI метаданных полей даты/времени\n *\n * @example\n * ```ts\n * birthDate: dateMeta({ title: 'Дата рождения' })\n * appointment: dateMeta({ title: 'Встреча', fieldType: 'dateTimePicker' })\n * duration: dateMeta({ title: 'Длительность', 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 { 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 FormStepsCompletedContent,\n FormStepsIndicator,\n FormStepsNavigation,\n FormSteps as FormStepsRoot,\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 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 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 { 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 FieldSlider,\n FieldString,\n FieldSwitch,\n FieldTags,\n FieldTextarea,\n FieldTime,\n useDeclarativeField,\n type AutocompleteFieldProps,\n type AutoFieldConfig,\n type AutoFieldProps,\n type CascadingSelectFieldProps,\n type CascadingSelectLoadResult,\n type CheckboxCardFieldProps,\n type CheckboxCardOption,\n type CityFieldProps,\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 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 (для ленивой загрузки компонентов форм)\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// 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","'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/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-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","useEffect","useState","useMemo","FormGroupListContext","FormGroupListItemContext","IconButton","getZodType","getUIMeta","getEnumValues","content","Fragment","Button","Box","useRef","useCallback","renderField","Text","VStack","STORAGE_PREFIX","Steps","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'\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 { 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, 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, 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 = 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"]}
|