@letar/forms 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +308 -0
  2. package/README.md +9 -9
  3. package/README.ru.md +115 -30
  4. package/analytics.js +3 -0
  5. package/analytics.js.map +1 -0
  6. package/chunk-2PSXYC3I.js +1782 -0
  7. package/chunk-2PSXYC3I.js.map +1 -0
  8. package/chunk-5D6S6EGF.js +206 -0
  9. package/chunk-5D6S6EGF.js.map +1 -0
  10. package/{chunk-6QOPSQ3Z.js → chunk-6E7VJAJT.js} +3 -3
  11. package/{chunk-6QOPSQ3Z.js.map → chunk-6E7VJAJT.js.map} +1 -1
  12. package/chunk-CGXKRCSM.js +117 -0
  13. package/chunk-CGXKRCSM.js.map +1 -0
  14. package/{chunk-M2PNAAIR.js → chunk-DQUVUMCX.js} +30 -19
  15. package/chunk-DQUVUMCX.js.map +1 -0
  16. package/chunk-K3J4L26K.js +345 -0
  17. package/chunk-K3J4L26K.js.map +1 -0
  18. package/{chunk-PJETA6YN.js → chunk-MAYUFA5K.js} +5 -4
  19. package/chunk-MAYUFA5K.js.map +1 -0
  20. package/{chunk-4V6WBJ76.js → chunk-MVGXZNHP.js} +2 -2
  21. package/{chunk-4V6WBJ76.js.map → chunk-MVGXZNHP.js.map} +1 -1
  22. package/{chunk-XKKJKYWZ.js → chunk-MZDTJSF7.js} +3 -3
  23. package/{chunk-XKKJKYWZ.js.map → chunk-MZDTJSF7.js.map} +1 -1
  24. package/{chunk-KUNT5MSU.js → chunk-Q5EOF36Y.js} +3 -3
  25. package/chunk-Q5EOF36Y.js.map +1 -0
  26. package/{chunk-7FEQFDJ7.js → chunk-R2RTCKXY.js} +2 -2
  27. package/{chunk-7FEQFDJ7.js.map → chunk-R2RTCKXY.js.map} +1 -1
  28. package/{chunk-HWVOFWAT.js → chunk-XFWLD5EO.js} +225 -26
  29. package/chunk-XFWLD5EO.js.map +1 -0
  30. package/fields/boolean.js +3 -3
  31. package/fields/datetime.js +3 -3
  32. package/fields/number.js +3 -3
  33. package/fields/selection.js +3 -3
  34. package/fields/specialized.js +3 -3
  35. package/fields/text.js +3 -3
  36. package/hcaptcha-U4XIT3HS.js +64 -0
  37. package/hcaptcha-U4XIT3HS.js.map +1 -0
  38. package/i18n.js +1 -1
  39. package/index.js +3268 -51
  40. package/index.js.map +1 -1
  41. package/offline.js +1 -1
  42. package/package.json +33 -4
  43. package/recaptcha-PKAUAY2S.js +56 -0
  44. package/recaptcha-PKAUAY2S.js.map +1 -0
  45. package/server-errors.js +3 -0
  46. package/server-errors.js.map +1 -0
  47. package/turnstile-7FXTBSLW.js +36 -0
  48. package/turnstile-7FXTBSLW.js.map +1 -0
  49. package/validators/ru.js +73 -0
  50. package/validators/ru.js.map +1 -0
  51. package/chunk-GOELIS6T.js +0 -849
  52. package/chunk-GOELIS6T.js.map +0 -1
  53. package/chunk-HWVOFWAT.js.map +0 -1
  54. package/chunk-KUNT5MSU.js.map +0 -1
  55. package/chunk-M2PNAAIR.js.map +0 -1
  56. package/chunk-PJETA6YN.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/server-errors/parsers.ts","../src/lib/server-errors/map-server-errors.ts"],"names":[],"mappings":"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","file":"chunk-5D6S6EGF.js","sourcesContent":["/**\n * Парсеры серверных ошибок различных форматов.\n * Каждый парсер принимает unknown и возвращает MappedServerErrors | null.\n * null означает \"не мой формат, передай следующему\".\n */\n\nimport type {\n ActionResultError,\n FieldErrorMap,\n MappedServerErrors,\n PrismaError,\n ZenStackError,\n ZodFlatError,\n} from './types'\n\n// --- Детекторы формата ---\n\nfunction isPrismaError(error: unknown): error is PrismaError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as PrismaError).code === 'string' &&\n (error as PrismaError).code.startsWith('P')\n )\n}\n\nfunction isZodFlatError(error: unknown): error is ZodFlatError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'fieldErrors' in error &&\n typeof (error as ZodFlatError).fieldErrors === 'object'\n )\n}\n\nfunction isZenStackError(error: unknown): error is ZenStackError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'reason' in error &&\n typeof (error as ZenStackError).reason === 'string'\n )\n}\n\nfunction isActionResultError(error: unknown): error is ActionResultError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'success' in error &&\n (error as ActionResultError).success === false &&\n 'error' in error\n )\n}\n\n// --- Встроенные сообщения по locale ---\n\nconst PRISMA_MESSAGES = {\n ru: {\n P2002: (fields: string[]) =>\n fields.length === 1 ? `${fields[0]} уже существует` : `Комбинация ${fields.join(' + ')} уже существует`,\n P2003: (field?: string) => (field ? `Связанная запись \"${field}\" не найдена` : 'Связанная запись не найдена'),\n P2025: () => 'Запись не найдена',\n P2014: () => 'Невозможно удалить — есть связанные записи',\n default: () => 'Ошибка базы данных',\n },\n en: {\n P2002: (fields: string[]) =>\n fields.length === 1 ? `${fields[0]} already exists` : `Combination of ${fields.join(' + ')} already exists`,\n P2003: (field?: string) => (field ? `Related record \"${field}\" not found` : 'Related record not found'),\n P2025: () => 'Record not found',\n P2014: () => 'Cannot delete — has related records',\n default: () => 'Database error',\n },\n} as const\n\ntype Locale = keyof typeof PRISMA_MESSAGES\n\n// --- Парсеры ---\n\n/**\n * Парсер Prisma ошибок.\n * P2002 (unique constraint) → маппит meta.target на поле формы.\n * P2003 (foreign key) → маппит meta.field_name.\n * P2025 (not found) → глобальная ошибка.\n */\nexport function parsePrismaError(\n error: unknown,\n fieldMap?: FieldErrorMap,\n locale: Locale = 'ru'\n): MappedServerErrors | null {\n if (!isPrismaError(error)) return null\n\n const msgs = PRISMA_MESSAGES[locale]\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n switch (error.code) {\n case 'P2002': {\n const targets = error.meta?.target ?? []\n // Проверяем кастомный маппинг: по имени constraint или по первому полю\n const constraintKey = targets.join('_')\n const mapped = fieldMap?.[constraintKey] ?? (targets.length === 1 ? fieldMap?.[targets[0]] : undefined)\n\n if (mapped) {\n result.fieldErrors.push({ field: mapped.field, message: mapped.message })\n } else if (targets.length > 0) {\n // Автомаппинг: первое поле target → ошибка\n result.fieldErrors.push({\n field: targets[0],\n message: msgs.P2002(targets),\n })\n } else {\n result.formErrors.push(msgs.P2002([]))\n }\n break\n }\n\n case 'P2003': {\n const field = error.meta?.field_name\n const mapped = field ? fieldMap?.[field] : undefined\n\n if (mapped) {\n result.fieldErrors.push({ field: mapped.field, message: mapped.message })\n } else if (field) {\n result.fieldErrors.push({ field, message: msgs.P2003(field) })\n } else {\n result.formErrors.push(msgs.P2003())\n }\n break\n }\n\n case 'P2025':\n result.formErrors.push(msgs.P2025())\n break\n\n case 'P2014':\n result.formErrors.push(msgs.P2014())\n break\n\n default:\n result.formErrors.push(msgs.default())\n }\n\n return result\n}\n\n/**\n * Парсер ZenStack ошибок.\n * rejected-by-policy → глобальная ошибка \"Нет доступа\".\n * db-query-error → делегируем Prisma парсеру (оборачивает Prisma ошибки).\n */\nexport function parseZenStackError(\n error: unknown,\n fieldMap?: FieldErrorMap,\n locale: Locale = 'ru'\n): MappedServerErrors | null {\n if (!isZenStackError(error)) return null\n\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n switch (error.reason) {\n case 'rejected-by-policy': {\n const message =\n locale === 'ru'\n ? error.rejectedByPolicyReason === 'cannot-read-back'\n ? 'Операция выполнена, но результат недоступен из-за ограничений доступа'\n : 'Нет доступа для выполнения этой операции'\n : error.rejectedByPolicyReason === 'cannot-read-back'\n ? 'Operation succeeded but result is not accessible due to permissions'\n : 'Access denied for this operation'\n result.formErrors.push(message)\n break\n }\n\n case 'db-query-error': {\n // ZenStack оборачивает Prisma ошибки — извлекаем код и meta\n if (error.code) {\n const prismaLike: PrismaError = {\n code: error.code,\n message: error.dbErrorMessage ?? error.message ?? '',\n meta: error.meta,\n }\n const prismaResult = parsePrismaError(prismaLike, fieldMap, locale)\n if (prismaResult) return prismaResult\n }\n result.formErrors.push(error.message ?? (locale === 'ru' ? 'Ошибка базы данных' : 'Database error'))\n break\n }\n\n case 'not-found':\n result.formErrors.push(locale === 'ru' ? 'Запись не найдена' : 'Record not found')\n break\n\n default:\n result.formErrors.push(error.message ?? (locale === 'ru' ? 'Неизвестная ошибка' : 'Unknown error'))\n }\n\n return result\n}\n\n/**\n * Парсер Zod v4 flatten формата.\n * { formErrors: string[], fieldErrors: { email: ['msg1'], name: ['msg2'] } }\n */\nexport function parseZodFlatError(error: unknown): MappedServerErrors | null {\n if (!isZodFlatError(error)) return null\n\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n // Глобальные ошибки формы\n if (Array.isArray(error.formErrors)) {\n result.formErrors.push(...error.formErrors)\n }\n\n // Ошибки по полям\n for (const [field, messages] of Object.entries(error.fieldErrors)) {\n if (Array.isArray(messages)) {\n for (const message of messages) {\n if (typeof message === 'string') {\n result.fieldErrors.push({ field, message })\n }\n }\n }\n }\n\n return result\n}\n\n/**\n * Парсер ActionResult формата (driving-school паттерн).\n * { success: false, error: string | { fieldErrors, formErrors } }\n */\nexport function parseActionResultError(error: unknown): MappedServerErrors | null {\n if (!isActionResultError(error)) return null\n\n const result: MappedServerErrors = { fieldErrors: [], formErrors: [] }\n\n if (typeof error.error === 'string') {\n // Простая строковая ошибка → глобальная\n result.formErrors.push(error.error)\n } else if (typeof error.error === 'object') {\n // Вложенный Zod flatten формат\n const zodResult = parseZodFlatError(error.error)\n if (zodResult) return zodResult\n }\n\n // Дополнительное message\n if (error.message && !result.formErrors.includes(error.message)) {\n result.formErrors.push(error.message)\n }\n\n return result\n}\n\n/**\n * Парсер для обычных Error объектов.\n * Проверяет .info (ZenStack стиль) и .cause.\n */\nexport function parseErrorObject(\n error: unknown,\n fieldMap?: FieldErrorMap,\n locale: Locale = 'ru'\n): MappedServerErrors | null {\n if (!(error instanceof Error)) return null\n\n // ZenStack-стиль: Error с .info\n const info = (error as Error & { info?: unknown }).info\n if (info) {\n const zenResult = parseZenStackError(info, fieldMap, locale)\n if (zenResult) return zenResult\n }\n\n // Error с .cause (цепочка ошибок)\n const cause = (error as Error & { cause?: unknown }).cause\n if (cause) {\n const prismaResult = parsePrismaError(cause, fieldMap, locale)\n if (prismaResult) return prismaResult\n }\n\n return { fieldErrors: [], formErrors: [error.message] }\n}\n","/**\n * mapServerErrors — автоматический маппинг серверных ошибок на поля формы.\n *\n * Поддерживает автодетект формата:\n * - Prisma P2002/P2003/P2025/P2014\n * - ZenStack rejected-by-policy / db-query-error\n * - Zod v4 flatten { fieldErrors, formErrors }\n * - ActionResult { success: false, error: ... }\n * - Error объекты с .info (ZenStack) и .cause (Prisma)\n *\n * @example\n * ```tsx\n * // В onSubmit формы\n * onSubmit={async ({ value }) => {\n * try {\n * await createUser(value)\n * } catch (error) {\n * const mapped = mapServerErrors(error, {\n * fieldMap: {\n * email: { field: 'email', message: 'Этот email уже зарегистрирован' },\n * },\n * })\n * // mapped.fieldErrors → [{ field: 'email', message: '...' }]\n * // mapped.formErrors → ['Глобальная ошибка']\n * }\n * }}\n * ```\n */\n\nimport {\n parseActionResultError,\n parseErrorObject,\n parsePrismaError,\n parseZenStackError,\n parseZodFlatError,\n} from './parsers'\nimport type { MappedServerErrors, MapServerErrorsConfig } from './types'\n\n/**\n * Маппит серверную ошибку на поля формы.\n * Автоматически определяет формат ошибки и извлекает field-level + form-level ошибки.\n *\n * @param error - Ошибка от сервера (любой формат)\n * @param config - Опциональная конфигурация маппинга\n * @returns Структура с fieldErrors и formErrors\n */\nexport function mapServerErrors(error: unknown, config?: MapServerErrorsConfig): MappedServerErrors {\n const { fieldMap, format = 'auto', defaultMessage, locale = 'ru' } = config ?? {}\n\n const fallback: MappedServerErrors = {\n fieldErrors: [],\n formErrors: [defaultMessage ?? (locale === 'ru' ? 'Произошла ошибка' : 'An error occurred')],\n }\n\n if (error == null) return fallback\n\n // Строковая ошибка → глобальная\n if (typeof error === 'string') {\n return { fieldErrors: [], formErrors: [error] }\n }\n\n // Определённый формат\n if (format !== 'auto') {\n const result = parseByFormat(error, format, fieldMap, locale)\n return result ?? fallback\n }\n\n // Автодетект: пробуем парсеры в порядке приоритета\n const parsers = [\n () => parsePrismaError(error, fieldMap, locale),\n () => parseZenStackError(error, fieldMap, locale),\n () => parseZodFlatError(error),\n () => parseActionResultError(error),\n () => parseErrorObject(error, fieldMap, locale),\n ]\n\n for (const parse of parsers) {\n const result = parse()\n if (result) return result\n }\n\n return fallback\n}\n\nfunction parseByFormat(\n error: unknown,\n format: NonNullable<MapServerErrorsConfig['format']>,\n fieldMap?: MapServerErrorsConfig['fieldMap'],\n locale: 'ru' | 'en' = 'ru'\n): MappedServerErrors | null {\n switch (format) {\n case 'prisma':\n return parsePrismaError(error, fieldMap, locale)\n case 'zenstack':\n return parseZenStackError(error, fieldMap, locale)\n case 'zod':\n return parseZodFlatError(error)\n case 'action-result':\n return parseActionResultError(error)\n default:\n return null\n }\n}\n\n/**\n * Применяет MappedServerErrors к TanStack Form инстансу.\n * Устанавливает ошибки на конкретные поля через form.setFieldMeta.\n *\n * @example\n * ```tsx\n * const mapped = mapServerErrors(error)\n * applyServerErrors(form, mapped)\n * ```\n */\nexport function applyServerErrors(\n form: {\n setFieldMeta: (field: string, updater: (prev: { errors: unknown[] }) => { errors: unknown[] }) => void\n setErrorMap: (errorMap: { onSubmit: string }) => void\n },\n mapped: MappedServerErrors\n): void {\n // Устанавливаем ошибки на поля\n for (const { field, message } of mapped.fieldErrors) {\n form.setFieldMeta(field, (prev) => ({\n ...prev,\n errors: [...prev.errors, message],\n }))\n }\n\n // Устанавливаем глобальные ошибки формы\n if (mapped.formErrors.length > 0) {\n form.setErrorMap({ onSubmit: mapped.formErrors.join('. ') })\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { createField, FieldTooltip, FieldError } from './chunk-HWVOFWAT.js';
1
+ import { createField, FieldTooltip, FieldError } from './chunk-XFWLD5EO.js';
2
2
  import { Field, Checkbox, HStack, Switch } from '@chakra-ui/react';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
@@ -74,5 +74,5 @@ var FieldSwitch = createField({
74
74
  });
75
75
 
76
76
  export { FieldCheckbox, FieldSwitch };
77
- //# sourceMappingURL=chunk-6QOPSQ3Z.js.map
78
- //# sourceMappingURL=chunk-6QOPSQ3Z.js.map
77
+ //# sourceMappingURL=chunk-6E7VJAJT.js.map
78
+ //# sourceMappingURL=chunk-6E7VJAJT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/declarative/form-fields/boolean/field-checkbox.tsx","../src/lib/declarative/form-fields/boolean/field-switch.tsx"],"names":["jsxs","Field","jsx","HStack"],"mappings":"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","file":"chunk-6QOPSQ3Z.js","sourcesContent":["'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"]}
1
+ {"version":3,"sources":["../src/lib/declarative/form-fields/boolean/field-checkbox.tsx","../src/lib/declarative/form-fields/boolean/field-switch.tsx"],"names":["jsxs","Field","jsx","HStack"],"mappings":"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","file":"chunk-6E7VJAJT.js","sourcesContent":["'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"]}
@@ -0,0 +1,117 @@
1
+ import { z } from 'zod/v4';
2
+
3
+ // src/lib/validators/ru/bik.ts
4
+
5
+ // src/lib/validators/ru/checksum.ts
6
+ function extractDigits(value) {
7
+ return value.replace(/\D/g, "").split("").map(Number);
8
+ }
9
+ function weightedChecksum(digits, weights) {
10
+ const sum = weights.reduce((acc, w, i) => acc + w * digits[i], 0);
11
+ const remainder = sum % 11;
12
+ return remainder > 9 ? 0 : remainder;
13
+ }
14
+ function isDigitsOfLength(value, length) {
15
+ const digits = value.replace(/\D/g, "");
16
+ return digits.length === length && /^\d+$/.test(digits);
17
+ }
18
+ function isDigitsOfLengths(value, lengths) {
19
+ const digits = value.replace(/\D/g, "");
20
+ return lengths.includes(digits.length) && /^\d+$/.test(digits);
21
+ }
22
+
23
+ // src/lib/validators/ru/bik.ts
24
+ function validateBik(value) {
25
+ const digits = value.replace(/\D/g, "");
26
+ if (!isDigitsOfLength(digits, 9)) return false;
27
+ return digits.startsWith("04");
28
+ }
29
+ function bikSchema() {
30
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 9), { message: "\u0411\u0418\u041A \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 9 \u0446\u0438\u0444\u0440" }).refine((v) => v.startsWith("04"), { message: '\u0411\u0418\u041A \u0434\u043E\u043B\u0436\u0435\u043D \u043D\u0430\u0447\u0438\u043D\u0430\u0442\u044C\u0441\u044F \u0441 "04"' });
31
+ }
32
+ var WEIGHTS_10 = [2, 4, 10, 3, 5, 9, 4, 6, 8];
33
+ var WEIGHTS_12_1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8];
34
+ var WEIGHTS_12_2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8];
35
+ function validateInn10(value) {
36
+ const digits = extractDigits(value);
37
+ if (digits.length !== 10) return false;
38
+ const check = weightedChecksum(digits, WEIGHTS_10);
39
+ return check === digits[9];
40
+ }
41
+ function validateInn12(value) {
42
+ const digits = extractDigits(value);
43
+ if (digits.length !== 12) return false;
44
+ const check1 = weightedChecksum(digits, WEIGHTS_12_1);
45
+ const check2 = weightedChecksum(digits, WEIGHTS_12_2);
46
+ return check1 === digits[10] && check2 === digits[11];
47
+ }
48
+ function innLegalSchema() {
49
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 10), { message: "\u0418\u041D\u041D \u044E\u0440\u043B\u0438\u0446\u0430 \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 10 \u0446\u0438\u0444\u0440" }).refine(validateInn10, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0418\u041D\u041D" });
50
+ }
51
+ function innIndividualSchema() {
52
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 12), { message: "\u0418\u041D\u041D \u0444\u0438\u0437\u043B\u0438\u0446\u0430 \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 12 \u0446\u0438\u0444\u0440" }).refine(validateInn12, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0418\u041D\u041D" });
53
+ }
54
+ function innSchema() {
55
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLengths(v, [10, 12]), { message: "\u0418\u041D\u041D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 10 \u0438\u043B\u0438 12 \u0446\u0438\u0444\u0440" }).refine(
56
+ (v) => {
57
+ if (v.length === 10) return validateInn10(v);
58
+ if (v.length === 12) return validateInn12(v);
59
+ return false;
60
+ },
61
+ { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0418\u041D\u041D" }
62
+ );
63
+ }
64
+ function validateKpp(value) {
65
+ return /^\d{4}[\dA-Z]{2}\d{3}$/.test(value);
66
+ }
67
+ function kppSchema() {
68
+ return z.string().transform((v) => v.replace(/[\s-]/g, "").toUpperCase()).refine((v) => v.length === 9, { message: "\u041A\u041F\u041F \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 9 \u0441\u0438\u043C\u0432\u043E\u043B\u043E\u0432" }).refine(validateKpp, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u041A\u041F\u041F (NNNNPPXXX)" });
69
+ }
70
+ function validateOgrn(value) {
71
+ const digits = extractDigits(value);
72
+ if (digits.length !== 13) return false;
73
+ const number = Number(value.replace(/\D/g, "").slice(0, 12));
74
+ const check = number % 11;
75
+ return check % 10 === digits[12];
76
+ }
77
+ function validateOgrnip(value) {
78
+ const digits = extractDigits(value);
79
+ if (digits.length !== 15) return false;
80
+ const number = Number(value.replace(/\D/g, "").slice(0, 14));
81
+ const check = number % 13;
82
+ return check % 10 === digits[14];
83
+ }
84
+ function ogrnSchema() {
85
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 13), { message: "\u041E\u0413\u0420\u041D \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 13 \u0446\u0438\u0444\u0440" }).refine(validateOgrn, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u041E\u0413\u0420\u041D" });
86
+ }
87
+ function ogrnipSchema() {
88
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 15), { message: "\u041E\u0413\u0420\u041D\u0418\u041F \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 15 \u0446\u0438\u0444\u0440" }).refine(validateOgrnip, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u041E\u0413\u0420\u041D\u0418\u041F" });
89
+ }
90
+ function validateSnils(value) {
91
+ const digits = extractDigits(value);
92
+ if (digits.length !== 11) return false;
93
+ const number = Number(digits.slice(0, 9).join(""));
94
+ if (number <= 1001998) return true;
95
+ let sum = 0;
96
+ for (let i = 0; i < 9; i++) {
97
+ sum += digits[i] * (9 - i);
98
+ }
99
+ let checkNumber;
100
+ if (sum < 100) {
101
+ checkNumber = sum;
102
+ } else if (sum === 100 || sum === 101) {
103
+ checkNumber = 0;
104
+ } else {
105
+ checkNumber = sum % 101;
106
+ if (checkNumber === 100) checkNumber = 0;
107
+ }
108
+ const actualCheck = digits[9] * 10 + digits[10];
109
+ return checkNumber === actualCheck;
110
+ }
111
+ function snilsSchema() {
112
+ return z.string().transform((v) => v.replace(/\D/g, "")).refine((v) => isDigitsOfLength(v, 11), { message: "\u0421\u041D\u0418\u041B\u0421 \u0434\u043E\u043B\u0436\u0435\u043D \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442\u044C 11 \u0446\u0438\u0444\u0440" }).refine(validateSnils, { message: "\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0430\u044F \u0441\u0443\u043C\u043C\u0430 \u0421\u041D\u0418\u041B\u0421" });
113
+ }
114
+
115
+ export { bikSchema, innIndividualSchema, innLegalSchema, innSchema, isDigitsOfLength, kppSchema, ogrnSchema, ogrnipSchema, snilsSchema, validateBik, validateInn10, validateInn12, validateKpp, validateOgrn, validateOgrnip, validateSnils };
116
+ //# sourceMappingURL=chunk-CGXKRCSM.js.map
117
+ //# sourceMappingURL=chunk-CGXKRCSM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/validators/ru/checksum.ts","../src/lib/validators/ru/bik.ts","../src/lib/validators/ru/inn.ts","../src/lib/validators/ru/kpp.ts","../src/lib/validators/ru/ogrn.ts","../src/lib/validators/ru/snils.ts"],"names":["z"],"mappings":"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","file":"chunk-CGXKRCSM.js","sourcesContent":["/**\n * Общие функции контрольных сумм для российских документов.\n */\n\n/**\n * Извлечь массив цифр из строки (убирая всё кроме цифр).\n */\nexport function extractDigits(value: string): number[] {\n return value.replace(/\\D/g, '').split('').map(Number)\n}\n\n/**\n * Взвешенная контрольная сумма.\n * Используется в ИНН, СНИЛС.\n *\n * @param digits — массив цифр\n * @param weights — массив весов\n * @returns remainder mod 11\n */\nexport function weightedChecksum(digits: number[], weights: number[]): number {\n const sum = weights.reduce((acc, w, i) => acc + w * digits[i], 0)\n const remainder = sum % 11\n return remainder > 9 ? 0 : remainder\n}\n\n/**\n * Проверить что строка содержит только цифры заданной длины.\n */\nexport function isDigitsOfLength(value: string, length: number): boolean {\n const digits = value.replace(/\\D/g, '')\n return digits.length === length && /^\\d+$/.test(digits)\n}\n\n/**\n * Проверить что строка содержит только цифры одной из заданных длин.\n */\nexport function isDigitsOfLengths(value: string, lengths: number[]): boolean {\n const digits = value.replace(/\\D/g, '')\n return lengths.includes(digits.length) && /^\\d+$/.test(digits)\n}\n","/**\n * Валидация БИК (Банковский идентификационный код).\n *\n * 9 цифр, первые 2 = \"04\" (код России).\n */\nimport { z } from 'zod/v4'\nimport { isDigitsOfLength } from './checksum'\n\n/**\n * Проверить формат БИК.\n */\nexport function validateBik(value: string): boolean {\n const digits = value.replace(/\\D/g, '')\n if (!isDigitsOfLength(digits, 9)) return false\n return digits.startsWith('04')\n}\n\n/**\n * Zod-схема БИК (9 цифр, начинается с \"04\").\n */\nexport function bikSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 9), { message: 'БИК должен содержать 9 цифр' })\n .refine((v) => v.startsWith('04'), { message: 'БИК должен начинаться с \"04\"' })\n}\n","/**\n * Валидация ИНН (Идентификационный номер налогоплательщика).\n *\n * ИНН юрлица — 10 цифр, ИНН физлица — 12 цифр.\n * Контрольные суммы по алгоритму ФНС.\n */\nimport { z } from 'zod/v4'\nimport { extractDigits, isDigitsOfLength, isDigitsOfLengths, weightedChecksum } from './checksum'\n\n// Веса для ИНН-10 (юрлицо)\nconst WEIGHTS_10 = [2, 4, 10, 3, 5, 9, 4, 6, 8]\n\n// Веса для ИНН-12 (физлицо), два раунда\nconst WEIGHTS_12_1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]\nconst WEIGHTS_12_2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]\n\n/**\n * Проверить контрольную сумму ИНН юрлица (10 цифр).\n */\nexport function validateInn10(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 10) return false\n\n const check = weightedChecksum(digits, WEIGHTS_10)\n return check === digits[9]\n}\n\n/**\n * Проверить контрольную сумму ИНН физлица (12 цифр).\n */\nexport function validateInn12(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 12) return false\n\n const check1 = weightedChecksum(digits, WEIGHTS_12_1)\n const check2 = weightedChecksum(digits, WEIGHTS_12_2)\n\n return check1 === digits[10] && check2 === digits[11]\n}\n\n/**\n * Zod-схема ИНН юрлица (10 цифр).\n */\nexport function innLegalSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 10), { message: 'ИНН юрлица должен содержать 10 цифр' })\n .refine(validateInn10, { message: 'Неверная контрольная сумма ИНН' })\n}\n\n/**\n * Zod-схема ИНН физлица (12 цифр).\n */\nexport function innIndividualSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 12), { message: 'ИНН физлица должен содержать 12 цифр' })\n .refine(validateInn12, { message: 'Неверная контрольная сумма ИНН' })\n}\n\n/**\n * Zod-схема ИНН (10 или 12 цифр).\n */\nexport function innSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLengths(v, [10, 12]), { message: 'ИНН должен содержать 10 или 12 цифр' })\n .refine(\n (v) => {\n if (v.length === 10) return validateInn10(v)\n if (v.length === 12) return validateInn12(v)\n return false\n },\n { message: 'Неверная контрольная сумма ИНН' }\n )\n}\n","/**\n * Валидация КПП (Код причины постановки на учёт).\n *\n * 9 символов: NNNNPPXXX.\n * NNNN — код налогового органа (цифры).\n * PP — причина постановки (цифры или буквы A-Z).\n * XXX — порядковый номер (цифры).\n */\nimport { z } from 'zod/v4'\n\n/**\n * Проверить формат КПП.\n */\nexport function validateKpp(value: string): boolean {\n // 4 цифры + 2 символа (цифры или A-Z) + 3 цифры\n return /^\\d{4}[\\dA-Z]{2}\\d{3}$/.test(value)\n}\n\n/**\n * Zod-схема КПП (9 символов).\n */\nexport function kppSchema() {\n return z\n .string()\n .transform((v) => v.replace(/[\\s-]/g, '').toUpperCase())\n .refine((v) => v.length === 9, { message: 'КПП должен содержать 9 символов' })\n .refine(validateKpp, { message: 'Неверный формат КПП (NNNNPPXXX)' })\n}\n","/**\n * Валидация ОГРН и ОГРНИП.\n *\n * ОГРН — 13 цифр: первые 12 mod 11, младший разряд = 13-я цифра.\n * ОГРНИП — 15 цифр: первые 14 mod 13, младший разряд = 15-я цифра.\n */\nimport { z } from 'zod/v4'\nimport { extractDigits, isDigitsOfLength } from './checksum'\n\n/**\n * Проверить контрольную сумму ОГРН (13 цифр).\n */\nexport function validateOgrn(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 13) return false\n\n const number = Number(value.replace(/\\D/g, '').slice(0, 12))\n const check = number % 11\n return check % 10 === digits[12]\n}\n\n/**\n * Проверить контрольную сумму ОГРНИП (15 цифр).\n */\nexport function validateOgrnip(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 15) return false\n\n const number = Number(value.replace(/\\D/g, '').slice(0, 14))\n const check = number % 13\n return check % 10 === digits[14]\n}\n\n/**\n * Zod-схема ОГРН (13 цифр).\n */\nexport function ogrnSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 13), { message: 'ОГРН должен содержать 13 цифр' })\n .refine(validateOgrn, { message: 'Неверная контрольная сумма ОГРН' })\n}\n\n/**\n * Zod-схема ОГРНИП (15 цифр).\n */\nexport function ogrnipSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 15), { message: 'ОГРНИП должен содержать 15 цифр' })\n .refine(validateOgrnip, { message: 'Неверная контрольная сумма ОГРНИП' })\n}\n","/**\n * Валидация СНИЛС (Страховой номер индивидуального лицевого счёта).\n *\n * 11 цифр. Формат: XXX-XXX-XXX YY.\n * Контрольная сумма: модуль 101.\n */\nimport { z } from 'zod/v4'\nimport { extractDigits, isDigitsOfLength } from './checksum'\n\n/**\n * Проверить контрольную сумму СНИЛС.\n *\n * Алгоритм: сумма (digit[i] × (9-i)) для i=0..8, mod 101.\n * Если результат < 100 — это контрольное число.\n * Если 100 или 101 — контрольное число = 00.\n */\nexport function validateSnils(value: string): boolean {\n const digits = extractDigits(value)\n if (digits.length !== 11) return false\n\n // СНИЛС 001-001-998 и ниже — специальные номера, не проверяем\n const number = Number(digits.slice(0, 9).join(''))\n if (number <= 1001998) return true\n\n let sum = 0\n for (let i = 0; i < 9; i++) {\n sum += digits[i] * (9 - i)\n }\n\n let checkNumber: number\n if (sum < 100) {\n checkNumber = sum\n } else if (sum === 100 || sum === 101) {\n checkNumber = 0\n } else {\n checkNumber = sum % 101\n if (checkNumber === 100) checkNumber = 0\n }\n\n const actualCheck = digits[9] * 10 + digits[10]\n return checkNumber === actualCheck\n}\n\n/**\n * Zod-схема СНИЛС (11 цифр).\n */\nexport function snilsSchema() {\n return z\n .string()\n .transform((v) => v.replace(/\\D/g, ''))\n .refine((v) => isDigitsOfLength(v, 11), { message: 'СНИЛС должен содержать 11 цифр' })\n .refine(validateSnils, { message: 'Неверная контрольная сумма СНИЛС' })\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { createField, FieldLabel, FieldError, FieldWrapper, useResolvedFieldProps, getFieldErrors } from './chunk-HWVOFWAT.js';
1
+ import { createField, FieldLabel, FieldError, FieldWrapper, useResolvedFieldProps, getFieldErrors } from './chunk-XFWLD5EO.js';
2
2
  import { Field, Editable, IconButton, InputGroup, Input, VStack, HStack, Box, Text, Progress, List, Textarea, Popover, Portal, Button, Center, Icon, Image, Spinner } from '@chakra-ui/react';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
  import { useState, useCallback, useMemo, useEffect, useRef } from 'react';
@@ -112,7 +112,7 @@ var FieldPassword = createField({
112
112
  onBlur: field.handleBlur,
113
113
  placeholder: resolved.placeholder,
114
114
  maxLength: componentProps.maxLength,
115
- autoComplete: componentProps.autoComplete,
115
+ autoComplete: componentProps.autoComplete ?? resolved.autocomplete,
116
116
  "data-field-name": fullPath
117
117
  }
118
118
  )
@@ -879,29 +879,39 @@ function getInputModeFromType(type) {
879
879
  }
880
880
  var FieldString = createField({
881
881
  displayName: "FieldString",
882
- render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }) => {
882
+ render: ({ field, fullPath, resolved, hasError, errorMessage, isValidating, componentProps }) => {
883
883
  const { constraints } = resolved;
884
884
  const type = componentProps.type ?? constraints.string?.inputType ?? "text";
885
885
  const maxLength = componentProps.maxLength ?? constraints.string?.maxLength;
886
886
  const minLength = componentProps.minLength ?? constraints.string?.minLength;
887
887
  const pattern = componentProps.pattern ?? constraints.string?.pattern;
888
888
  const inputMode = componentProps.inputMode ?? getInputModeFromType(type);
889
- return /* @__PURE__ */ jsx(FieldWrapper, { resolved, hasError, errorMessage, fullPath, children: /* @__PURE__ */ jsx(
890
- Input,
889
+ return /* @__PURE__ */ jsx(
890
+ FieldWrapper,
891
891
  {
892
- type,
893
- inputMode,
894
- value: field.state.value ?? "",
895
- onChange: (e) => field.handleChange(e.target.value),
896
- onBlur: field.handleBlur,
897
- placeholder: resolved.placeholder,
898
- maxLength,
899
- minLength,
900
- pattern,
901
- autoComplete: componentProps.autoComplete,
902
- "data-field-name": fullPath
892
+ resolved,
893
+ hasError,
894
+ errorMessage,
895
+ isValidating,
896
+ fullPath,
897
+ children: /* @__PURE__ */ jsx(
898
+ Input,
899
+ {
900
+ type,
901
+ inputMode,
902
+ value: field.state.value ?? "",
903
+ onChange: (e) => field.handleChange(e.target.value),
904
+ onBlur: field.handleBlur,
905
+ placeholder: resolved.placeholder,
906
+ maxLength,
907
+ minLength,
908
+ pattern,
909
+ autoComplete: componentProps.autoComplete ?? resolved.autocomplete,
910
+ "data-field-name": fullPath
911
+ }
912
+ )
903
913
  }
904
- ) });
914
+ );
905
915
  }
906
916
  });
907
917
  var FieldTextarea = createField({
@@ -920,6 +930,7 @@ var FieldTextarea = createField({
920
930
  autoresize: componentProps.autoresize,
921
931
  resize: componentProps.resize ?? "vertical",
922
932
  maxLength,
933
+ autoComplete: resolved.autocomplete,
923
934
  "data-field-name": fullPath
924
935
  }
925
936
  ) });
@@ -967,5 +978,5 @@ var FieldMaskedInput = createField({
967
978
  });
968
979
 
969
980
  export { DEFAULT_TOOLBAR_BUTTONS, FieldEditable, FieldMaskedInput, FieldPassword, FieldPasswordStrength, FieldRichText, FieldString, FieldTextarea, TOOLBAR_CONFIG };
970
- //# sourceMappingURL=chunk-M2PNAAIR.js.map
971
- //# sourceMappingURL=chunk-M2PNAAIR.js.map
981
+ //# sourceMappingURL=chunk-DQUVUMCX.js.map
982
+ //# sourceMappingURL=chunk-DQUVUMCX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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/toolbar-config.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/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/text/field-masked-input.tsx"],"names":["jsx","IconButton","useState","jsxs","Field","Input","LuEyeOff","LuEye","LuImage","VStack","Box","Text","HStack","LuX","useCallback","Popover","LuLink","Portal","Button","editor"],"mappings":"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","file":"chunk-DQUVUMCX.js","sourcesContent":["'use client'\n\nimport { Editable, Field, IconButton } from '@chakra-ui/react'\nimport type { ReactElement, ReactNode } from 'react'\nimport type { BaseFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Props for Editable field\n */\nexport interface EditableFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Placeholder when empty */\n placeholder?: string\n /** Use textarea for multiline editing (by default: false) */\n multiline?: boolean\n /** Activation mode (by default: click) */\n activationMode?: 'click' | 'dblclick' | 'focus' | 'none'\n /** Show control buttons (edit, cancel, save) (by default: false) */\n showControls?: boolean\n /** Automatically resize textarea (only for multiline=true) (by default: true) */\n autoResize?: boolean\n /** Custom edit icon */\n editIcon?: ReactNode\n /** Custom cancel icon */\n cancelIcon?: ReactNode\n /** Custom submit icon */\n submitIcon?: ReactNode\n /** Save on blur (by default: true) */\n submitOnBlur?: boolean\n}\n\n/**\n * Form.Field.Editable - Inline editable text\n *\n * Renders text that can be clicked for inline editing.\n * Supports single-line input and multiline textarea.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Editable\n * name=\"title\"\n * label=\"Title\"\n * placeholder=\"Click to add title\"\n * />\n * ```\n *\n * @example Multiline\n * ```tsx\n * <Form.Field.Editable\n * name=\"description\"\n * multiline\n * placeholder=\"Click to add description...\"\n * />\n * ```\n *\n * @example With control buttons\n * ```tsx\n * <Form.Field.Editable\n * name=\"name\"\n * showControls\n * activationMode=\"dblclick\"\n * />\n * ```\n */\nexport const FieldEditable = createField<EditableFieldProps, string>({\n displayName: 'FieldEditable',\n\n render: ({ field, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n multiline = false,\n activationMode = 'click',\n showControls = false,\n editIcon,\n cancelIcon,\n submitIcon,\n submitOnBlur = true,\n } = componentProps\n\n const currentValue = (field.state.value as string) || ''\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <Editable.Root\n value={currentValue}\n onValueChange={(details) => field.handleChange(details.value)}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n placeholder={resolved.placeholder ?? 'Click to edit'}\n activationMode={activationMode}\n submitMode={submitOnBlur ? 'blur' : 'enter'}\n >\n <Editable.Preview\n minH={multiline ? '48px' : undefined}\n alignItems={multiline ? 'flex-start' : undefined}\n width=\"full\"\n />\n\n {multiline ? <Editable.Textarea /> : <Editable.Input />}\n\n {showControls && (\n <Editable.Control>\n <Editable.EditTrigger asChild>\n <IconButton variant=\"ghost\" size=\"xs\">\n {editIcon ?? '✏️'}\n </IconButton>\n </Editable.EditTrigger>\n <Editable.CancelTrigger asChild>\n <IconButton variant=\"outline\" size=\"xs\">\n {cancelIcon ?? '✕'}\n </IconButton>\n </Editable.CancelTrigger>\n <Editable.SubmitTrigger asChild>\n <IconButton variant=\"outline\" size=\"xs\">\n {submitIcon ?? '✓'}\n </IconButton>\n </Editable.SubmitTrigger>\n </Editable.Control>\n )}\n </Editable.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { IconButton, Input, InputGroup } from '@chakra-ui/react'\nimport { type ReactElement, useState } from 'react'\nimport { LuEye, LuEyeOff } from 'react-icons/lu'\nimport type { PasswordFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * State for toggling password visibility\n */\ninterface PasswordFieldState {\n /** Whether password is visible */\n visible: boolean\n /** Toggle visibility */\n toggle: () => void\n}\n\n/**\n * Form.Field.Password - Password input field with visibility toggle\n *\n * Renders a password input field with a show/hide button.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.Password name=\"password\" label=\"Password\" />\n * ```\n *\n * @example With visible password by default\n * ```tsx\n * <Form.Field.Password name=\"password\" label=\"Password\" defaultVisible />\n * ```\n */\nexport const FieldPassword = createField<PasswordFieldProps, string, PasswordFieldState>({\n displayName: 'FieldPassword',\n\n useFieldState: (props) => {\n const [visible, setVisible] = useState(props.defaultVisible ?? false)\n return {\n visible,\n toggle: () => setVisible((v) => !v),\n }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <InputGroup\n endElement={\n <IconButton\n tabIndex={-1}\n me=\"-2\"\n aspectRatio=\"square\"\n size=\"sm\"\n variant=\"ghost\"\n height=\"calc(100% - {spacing.2})\"\n aria-label=\"Toggle password visibility\"\n disabled={resolved.disabled}\n onPointerDown={(e) => {\n if (resolved.disabled) {\n return\n }\n if (e.button !== 0) {\n return\n }\n e.preventDefault()\n fieldState.toggle()\n }}\n >\n {fieldState.visible ? <LuEyeOff /> : <LuEye />}\n </IconButton>\n }\n >\n <Input\n type={fieldState.visible ? 'text' : 'password'}\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLInputElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n maxLength={componentProps.maxLength}\n autoComplete={componentProps.autoComplete ?? resolved.autocomplete}\n data-field-name={fullPath}\n />\n </InputGroup>\n </FieldWrapper>\n ),\n})\n","'use client'\n\nimport { Box, Field, HStack, IconButton, Input, List, Progress, Text, VStack } from '@chakra-ui/react'\nimport { type ReactElement, useState } from 'react'\nimport { LuCheck, LuEye, LuEyeOff, LuX } from 'react-icons/lu'\nimport type { PasswordRequirement, PasswordStrengthFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Default password requirements\n */\nconst DEFAULT_REQUIREMENTS: PasswordRequirement[] = ['minLength:8', 'uppercase', 'lowercase', 'number', 'special']\n\n/**\n * Requirement descriptions\n */\nconst REQUIREMENT_LABELS: Record<PasswordRequirement, string> = {\n 'minLength:8': 'Minimum 8 characters',\n uppercase: 'At least one uppercase letter',\n lowercase: 'At least one lowercase letter',\n number: 'At least one digit',\n special: 'At least one special character (!@#$%^&*)',\n}\n\n/**\n * Checks if password meets a requirement\n */\nfunction checkRequirement(password: string, requirement: PasswordRequirement): boolean {\n switch (requirement) {\n case 'minLength:8':\n return password.length >= 8\n case 'uppercase':\n return /[A-Z]/.test(password)\n case 'lowercase':\n return /[a-z]/.test(password)\n case 'number':\n return /[0-9]/.test(password)\n case 'special':\n return /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/.test(password)\n default:\n return false\n }\n}\n\n/**\n * Computes password strength (0-100)\n */\nfunction calculateStrength(password: string, requirements: PasswordRequirement[]): number {\n if (!password) {\n return 0\n }\n\n const metCount = requirements.filter((req) => checkRequirement(password, req)).length\n return Math.round((metCount / requirements.length) * 100)\n}\n\n/**\n * Gets description and color for password strength\n */\nfunction getStrengthInfo(strength: number): { label: string; colorPalette: string } {\n if (strength < 25) {\n return { label: 'Weak', colorPalette: 'red' }\n }\n if (strength < 50) {\n return { label: 'Medium', colorPalette: 'orange' }\n }\n if (strength < 75) {\n return { label: 'Good', colorPalette: 'yellow' }\n }\n return { label: 'Strong', colorPalette: 'green' }\n}\n\n/**\n * State for password field with strength indicator\n */\ninterface PasswordStrengthFieldState {\n /** Password visibility */\n visible: boolean\n /** Toggle visibility */\n toggle: () => void\n}\n\n/**\n * Form.Field.PasswordStrength - Password with strength indicator\n *\n * Renders a password field with a visual strength indicator and requirements checklist.\n *\n * @example With default requirements\n * ```tsx\n * <Form.Field.PasswordStrength name=\"password\" label=\"Password\" showRequirements />\n * ```\n *\n * @example With custom requirements\n * ```tsx\n * <Form.Field.PasswordStrength\n * name=\"password\"\n * requirements={['minLength:8', 'uppercase', 'number']}\n * showRequirements\n * />\n * ```\n */\nexport const FieldPasswordStrength = createField<PasswordStrengthFieldProps, string, PasswordStrengthFieldState>({\n displayName: 'FieldPasswordStrength',\n\n useFieldState: (props) => {\n const [visible, setVisible] = useState(props.defaultVisible ?? false)\n return { visible, toggle: () => setVisible((v) => !v) }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { requirements = DEFAULT_REQUIREMENTS, showRequirements = true } = componentProps\n const { visible, toggle } = fieldState\n\n const value = (field.state.value as string) ?? ''\n const strength = calculateStrength(value, requirements)\n const { label: strengthLabel, colorPalette } = getStrengthInfo(strength)\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <VStack gap={2} align=\"stretch\" width=\"100%\">\n <HStack>\n <Input\n type={visible ? 'text' : 'password'}\n value={value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder ?? 'Enter password'}\n data-field-name={fullPath}\n flex={1}\n />\n <IconButton\n aria-label={visible ? 'Hide password' : 'Show password'}\n onClick={toggle}\n variant=\"ghost\"\n size=\"sm\"\n >\n {visible ? <LuEyeOff /> : <LuEye />}\n </IconButton>\n </HStack>\n\n {value && (\n <Box>\n <HStack justify=\"space-between\" mb={1}>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n Strength\n </Text>\n <Text fontSize=\"xs\" fontWeight=\"medium\" color={`${colorPalette}.600`}>\n {strengthLabel}\n </Text>\n </HStack>\n <Progress.Root value={strength} colorPalette={colorPalette} size=\"xs\">\n <Progress.Track>\n <Progress.Range />\n </Progress.Track>\n </Progress.Root>\n </Box>\n )}\n\n {showRequirements && value && (\n <List.Root fontSize=\"sm\" gap={1}>\n {requirements.map((req) => {\n const met = checkRequirement(value, req)\n return (\n <List.Item key={req} display=\"flex\" alignItems=\"center\" gap={2}>\n <Box color={met ? 'green.500' : 'gray.400'}>{met ? <LuCheck size={14} /> : <LuX size={14} />}</Box>\n <Text color={met ? 'fg.default' : 'fg.muted'}>{REQUIREMENT_LABELS[req]}</Text>\n </List.Item>\n )\n })}\n </List.Root>\n )}\n </VStack>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport type { useEditor } from '@tiptap/react'\nimport type { ReactNode } from 'react'\nimport {\n LuBold,\n LuCode,\n LuHeading1,\n LuHeading2,\n LuHeading3,\n LuImage,\n LuItalic,\n LuLink,\n LuList,\n LuListOrdered,\n LuQuote,\n LuRedo,\n LuStrikethrough,\n LuUnderline,\n LuUndo,\n} from 'react-icons/lu'\n\n/**\n * Доступные кнопки toolbar\n */\nexport type ToolbarButton =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'heading1'\n | 'heading2'\n | 'heading3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'link'\n | 'image'\n | 'undo'\n | 'redo'\n\n/**\n * Buttons тулбара by default\n */\nexport const DEFAULT_TOOLBAR_BUTTONS: ToolbarButton[] = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'heading1',\n 'heading2',\n 'heading3',\n 'bulletList',\n 'orderedList',\n 'blockquote',\n 'link',\n 'undo',\n 'redo',\n]\n\n/**\n * Конфигурация кнопки toolbar\n */\nexport interface ToolbarButtonConfig {\n icon: ReactNode\n label: string\n action: (editor: ReturnType<typeof useEditor>) => void\n isActive?: (editor: ReturnType<typeof useEditor>) => boolean\n}\n\n/**\n * Конфигурация всех кнопок тулбара\n */\nexport const TOOLBAR_CONFIG: Record<ToolbarButton, ToolbarButtonConfig> = {\n bold: {\n icon: <LuBold />,\n label: 'Bold',\n action: (editor) => editor?.chain().focus().toggleBold().run(),\n isActive: (editor) => editor?.isActive('bold') ?? false,\n },\n italic: {\n icon: <LuItalic />,\n label: 'Italic',\n action: (editor) => editor?.chain().focus().toggleItalic().run(),\n isActive: (editor) => editor?.isActive('italic') ?? false,\n },\n underline: {\n icon: <LuUnderline />,\n label: 'Подчёркнутый',\n action: (editor) => editor?.chain().focus().toggleUnderline().run(),\n isActive: (editor) => editor?.isActive('underline') ?? false,\n },\n strike: {\n icon: <LuStrikethrough />,\n label: 'Strikethrough',\n action: (editor) => editor?.chain().focus().toggleStrike().run(),\n isActive: (editor) => editor?.isActive('strike') ?? false,\n },\n code: {\n icon: <LuCode />,\n label: 'Код',\n action: (editor) => editor?.chain().focus().toggleCode().run(),\n isActive: (editor) => editor?.isActive('code') ?? false,\n },\n heading1: {\n icon: <LuHeading1 />,\n label: 'Заголовок 1',\n action: (editor) => editor?.chain().focus().toggleHeading({ level: 1 }).run(),\n isActive: (editor) => editor?.isActive('heading', { level: 1 }) ?? false,\n },\n heading2: {\n icon: <LuHeading2 />,\n label: 'Заголовок 2',\n action: (editor) => editor?.chain().focus().toggleHeading({ level: 2 }).run(),\n isActive: (editor) => editor?.isActive('heading', { level: 2 }) ?? false,\n },\n heading3: {\n icon: <LuHeading3 />,\n label: 'Заголовок 3',\n action: (editor) => editor?.chain().focus().toggleHeading({ level: 3 }).run(),\n isActive: (editor) => editor?.isActive('heading', { level: 3 }) ?? false,\n },\n bulletList: {\n icon: <LuList />,\n label: 'Bullet list',\n action: (editor) => editor?.chain().focus().toggleBulletList().run(),\n isActive: (editor) => editor?.isActive('bulletList') ?? false,\n },\n orderedList: {\n icon: <LuListOrdered />,\n label: 'Ordered list',\n action: (editor) => editor?.chain().focus().toggleOrderedList().run(),\n isActive: (editor) => editor?.isActive('orderedList') ?? false,\n },\n blockquote: {\n icon: <LuQuote />,\n label: 'Quote',\n action: (editor) => editor?.chain().focus().toggleBlockquote().run(),\n isActive: (editor) => editor?.isActive('blockquote') ?? false,\n },\n link: {\n icon: <LuLink />,\n label: 'Ссылка',\n action: (editor) => {\n if (editor?.isActive('link')) {\n editor.chain().focus().unsetLink().run()\n } else {\n const url = window.prompt('URL')\n if (url) {\n editor?.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }\n }\n },\n isActive: (editor) => editor?.isActive('link') ?? false,\n },\n undo: {\n icon: <LuUndo />,\n label: 'Undo',\n action: (editor) => editor?.chain().focus().undo().run(),\n },\n redo: {\n icon: <LuRedo />,\n label: 'Redo',\n action: (editor) => editor?.chain().focus().redo().run(),\n },\n // Кнопка image processesся отдельно через ImagePopover (аналогично link)\n image: {\n icon: <LuImage />,\n label: 'Insert image',\n action: () => {\n // Action handled via ImagePopover\n },\n },\n}\n","'use client'\n\nimport {\n Box,\n Button,\n Center,\n HStack,\n Icon,\n IconButton,\n Image,\n Popover,\n Portal,\n Spinner,\n Text,\n VStack,\n} from '@chakra-ui/react'\nimport type { Editor } from '@tiptap/react'\nimport { type ReactElement, useCallback, useRef, useState } from 'react'\nimport { LuImage, LuUpload, LuX } from 'react-icons/lu'\n\n/**\n * Image upload configuration\n */\nexport interface ImageUploadConfig {\n /** URL endpoint for upload */\n endpoint: string\n /** Категория изображения (для upload API) */\n category?: string\n /** Maximum file size in bytes (by default: 10MB) */\n maxSize?: number\n /** Разрешённые MIME typeы (by default: ['image/*']) */\n acceptTypes?: string[]\n}\n\n/**\n * Props для ImagePopover\n */\ninterface ImagePopoverProps {\n editor: Editor\n config: ImageUploadConfig\n disabled?: boolean\n}\n\n/** Loading states */\ntype UploadState = 'idle' | 'uploading' | 'error'\n\n/**\n * Component для loading и вставки изображений в RichText редактор\n *\n * Использует Popover с drag-n-drop зоной и кнопкой выбора fileа.\n * После успешной loading вставляет изображение в редактор.\n */\nexport function ImagePopover({ editor, config, disabled }: ImagePopoverProps): ReactElement {\n const [isOpen, setIsOpen] = useState(false)\n const [uploadState, setUploadState] = useState<UploadState>('idle')\n const [errorMessage, setErrorMessage] = useState<string | null>(null)\n const [previewUrl, setPreviewUrl] = useState<string | null>(null)\n const [isDragging, setIsDragging] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n const maxSize = config.maxSize ?? 10 * 1024 * 1024 // 10MB by default\n const acceptTypes = config.acceptTypes ?? ['image/*']\n\n /**\n * File upload на сервер\n */\n const handleUpload = useCallback(\n async (file: File) => {\n // Проверка typeа fileа\n if (!file.type.startsWith('image/')) {\n setErrorMessage('File must be an image')\n setUploadState('error')\n return\n }\n\n // Проверка sizeа\n if (file.size > maxSize) {\n const maxSizeMB = (maxSize / 1024 / 1024).toFixed(0)\n setErrorMessage(`Size fileа не must превышать ${maxSizeMB}MB`)\n setUploadState('error')\n return\n }\n\n // Создаём preview\n const preview = URL.createObjectURL(file)\n setPreviewUrl(preview)\n setUploadState('uploading')\n setErrorMessage(null)\n\n try {\n const formData = new FormData()\n formData.append('file', file)\n if (config.category) {\n formData.append('category', config.category)\n }\n\n const response = await fetch(config.endpoint, {\n method: 'POST',\n body: formData,\n })\n\n const result = await response.json()\n\n if (!response.ok) {\n throw new Error(result.error || 'Upload error')\n }\n\n if (result.url) {\n // Insert image into editor\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(editor.chain().focus() as any).setImage({ src: result.url }).run()\n handleClose()\n } else {\n throw new Error('Image URL not received')\n }\n } catch (err) {\n setErrorMessage(err instanceof Error ? err.message : 'Upload error')\n setUploadState('error')\n } finally {\n // Clean up preview URL\n if (preview) {\n URL.revokeObjectURL(preview)\n }\n }\n },\n [editor, config, maxSize]\n )\n\n /**\n * Handle file selection via input\n */\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0]\n if (file) {\n handleUpload(file)\n }\n // Reset input for re-selecting the same file\n e.target.value = ''\n },\n [handleUpload]\n )\n\n /**\n * Handle drop event\n */\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n setIsDragging(false)\n\n const file = e.dataTransfer.files[0]\n if (file) {\n handleUpload(file)\n }\n },\n [handleUpload]\n )\n\n /**\n * Close popover and reset state\n */\n const handleClose = useCallback(() => {\n setIsOpen(false)\n setUploadState('idle')\n setErrorMessage(null)\n setPreviewUrl(null)\n setIsDragging(false)\n }, [])\n\n /**\n * Повторная попытка after ошибки\n */\n const handleRetry = useCallback(() => {\n setUploadState('idle')\n setErrorMessage(null)\n setPreviewUrl(null)\n }, [])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={(details) => setIsOpen(details.open)}>\n <Popover.Trigger asChild>\n <IconButton\n aria-label=\"Insert image\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => setIsOpen(true)}\n disabled={disabled}\n >\n <LuImage />\n </IconButton>\n </Popover.Trigger>\n\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"320px\">\n <Popover.Arrow>\n <Popover.ArrowTip />\n </Popover.Arrow>\n <Popover.Body p={3}>\n {/* State: idle - зона loading */}\n {uploadState === 'idle' && (\n <VStack gap={3} align=\"stretch\">\n <Box\n p={6}\n borderWidth=\"2px\"\n borderStyle=\"dashed\"\n borderColor={isDragging ? 'colorPalette.500' : 'border'}\n borderRadius=\"md\"\n bg={isDragging ? 'colorPalette.50' : 'bg.subtle'}\n transition=\"all 0.2s\"\n cursor=\"pointer\"\n _hover={{ borderColor: 'colorPalette.400' }}\n onDragOver={(e) => {\n e.preventDefault()\n setIsDragging(true)\n }}\n onDragLeave={(e) => {\n e.preventDefault()\n setIsDragging(false)\n }}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n >\n <Center>\n <VStack gap={2}>\n <Icon fontSize=\"2xl\" color=\"fg.muted\">\n <LuUpload />\n </Icon>\n <Text fontSize=\"sm\" fontWeight=\"medium\" textAlign=\"center\">\n Drag image here\n </Text>\n <Text fontSize=\"xs\" color=\"fg.muted\">\n or click to select\n </Text>\n </VStack>\n </Center>\n </Box>\n\n <Text fontSize=\"xs\" color=\"fg.muted\" textAlign=\"center\">\n PNG, JPG, WEBP up to {(maxSize / 1024 / 1024).toFixed(0)}MB\n </Text>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={acceptTypes.join(',')}\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n />\n\n <HStack justify=\"flex-end\">\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Cancel\n </Button>\n </HStack>\n </VStack>\n )}\n\n {/* State: uploading - uploading */}\n {uploadState === 'uploading' && (\n <VStack gap={3} align=\"stretch\">\n {previewUrl && (\n <Box borderRadius=\"md\" overflow=\"hidden\" bg=\"bg.subtle\">\n <Image src={previewUrl} alt=\"Preview\" maxH=\"150px\" w=\"100%\" objectFit=\"contain\" />\n </Box>\n )}\n <Center py={2}>\n <HStack gap={2}>\n <Spinner size=\"sm\" color=\"colorPalette.500\" />\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Loading...\n </Text>\n </HStack>\n </Center>\n </VStack>\n )}\n\n {/* State: error - error */}\n {uploadState === 'error' && (\n <VStack gap={3} align=\"stretch\">\n {previewUrl && (\n <Box borderRadius=\"md\" overflow=\"hidden\" bg=\"bg.subtle\" position=\"relative\">\n <Image src={previewUrl} alt=\"Preview\" maxH=\"150px\" w=\"100%\" objectFit=\"contain\" opacity={0.5} />\n <Center position=\"absolute\" inset={0} bg=\"blackAlpha.500\" borderRadius=\"md\">\n <Icon color=\"red.400\" fontSize=\"2xl\">\n <LuX />\n </Icon>\n </Center>\n </Box>\n )}\n <Text fontSize=\"sm\" color=\"red.400\" textAlign=\"center\">\n {errorMessage}\n </Text>\n <HStack justify=\"center\" gap={2}>\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Cancel\n </Button>\n <Button size=\"sm\" colorPalette=\"brand\" onClick={handleRetry}>\n Try again\n </Button>\n </HStack>\n </VStack>\n )}\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )\n}\n","'use client'\n\nimport { Box, Button, HStack, IconButton, Input, Popover, Portal, VStack } from '@chakra-ui/react'\nimport type { Editor } from '@tiptap/react'\nimport { type ReactElement, useCallback, useState } from 'react'\nimport { LuLink, LuUnlink } from 'react-icons/lu'\n\n/**\n * Props для LinkPopover\n */\ninterface LinkPopoverProps {\n editor: Editor\n disabled?: boolean\n}\n\n/**\n * Component для добавления/удаления ссылок в RichText редакторе\n *\n * Использует Popover instead of window.prompt для лучшего UX и тестируемости.\n */\nexport function LinkPopover({ editor, disabled }: LinkPopoverProps): ReactElement {\n const [url, setUrl] = useState('')\n const [isOpen, setIsOpen] = useState(false)\n\n const isActive = editor.isActive('link')\n\n const handleOpen = useCallback(() => {\n if (isActive) {\n // Если link активна — удаляем её\n editor.chain().focus().unsetLink().run()\n } else {\n // Получаем текущий URL if present\n const currentUrl = editor.getAttributes('link').href ?? ''\n setUrl(currentUrl)\n setIsOpen(true)\n }\n }, [editor, isActive])\n\n const handleClose = useCallback(() => {\n setIsOpen(false)\n setUrl('')\n }, [])\n\n const handleSubmit = useCallback(() => {\n if (url) {\n editor.chain().focus().extendMarkRange('link').setLink({ href: url }).run()\n }\n handleClose()\n }, [editor, url, handleClose])\n\n const handleRemove = useCallback(() => {\n editor.chain().focus().unsetLink().run()\n handleClose()\n }, [editor, handleClose])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n handleSubmit()\n } else if (e.key === 'Escape') {\n handleClose()\n }\n },\n [handleSubmit, handleClose]\n )\n\n return (\n <Popover.Root open={isOpen} onOpenChange={(details) => setIsOpen(details.open)}>\n <Popover.Trigger asChild>\n <IconButton\n aria-label={isActive ? 'Remove ссылку' : 'Add ссылку'}\n size=\"sm\"\n variant={isActive ? 'solid' : 'ghost'}\n colorPalette={isActive ? 'brand' : undefined}\n onClick={handleOpen}\n disabled={disabled}\n >\n {isActive ? <LuUnlink /> : <LuLink />}\n </IconButton>\n </Popover.Trigger>\n\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"300px\">\n <Popover.Arrow>\n <Popover.ArrowTip />\n </Popover.Arrow>\n <Popover.Body p={3}>\n <VStack gap={3} align=\"stretch\">\n <Box>\n <Input\n placeholder=\"https://example.com\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={handleKeyDown}\n size=\"sm\"\n autoFocus\n />\n </Box>\n <HStack gap={2} justify=\"flex-end\">\n {editor.isActive('link') && (\n <Button size=\"sm\" variant=\"ghost\" colorPalette=\"red\" onClick={handleRemove}>\n Remove\n </Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" onClick={handleClose}>\n Cancel\n </Button>\n <Button size=\"sm\" colorPalette=\"brand\" onClick={handleSubmit} disabled={!url.trim()}>\n Apply\n </Button>\n </HStack>\n </VStack>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )\n}\n","'use client'\n\nimport { Box, Field, HStack, IconButton } from '@chakra-ui/react'\nimport type { AnyFieldApi } from '@tanstack/react-form'\nimport TiptapImage from '@tiptap/extension-image'\nimport { Link } from '@tiptap/extension-link'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport Underline from '@tiptap/extension-underline'\nimport { type Content, EditorContent, useEditor } from '@tiptap/react'\nimport StarterKit from '@tiptap/starter-kit'\nimport { type ReactElement, useEffect, useMemo } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { FieldError, FieldLabel, getFieldErrors, useResolvedFieldProps } from '../base'\nimport { ImagePopover, type ImageUploadConfig } from './image-popover'\nimport { LinkPopover } from './link-popover'\nimport { DEFAULT_TOOLBAR_BUTTONS, TOOLBAR_CONFIG, type ToolbarButton } from './toolbar-config'\n\n/**\n * Safe JSON parsing with fallback to empty document\n * Prevents crash on invalid JSON\n */\nfunction safeParseJSON(value: string): Content {\n try {\n return JSON.parse(value) as Content\n } catch {\n console.warn('RichText: Invalid JSON content, using empty document')\n return ''\n }\n}\n\n/**\n * Props for RichText field\n */\nexport interface RichTextFieldProps extends BaseFieldProps {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Minimum editor height (by default: 150px) */\n minHeight?: string | number\n /** Maximum editor height (includes scroll) */\n maxHeight?: string | number\n /** Show toolbar (by default: true) */\n showToolbar?: boolean\n /** Toolbar buttons (by default: all) */\n toolbarButtons?: ToolbarButton[]\n /** Output format: 'html' or 'json' (by default: 'html') */\n outputFormat?: 'html' | 'json'\n /** Image upload configuration (optional) */\n imageUpload?: ImageUploadConfig\n}\n\n// Re-export type for convenience\nexport type { ImageUploadConfig }\n\n/**\n * Form.Field.RichText - WYSIWYG rich text editor\n *\n * Renders Tiptap-based editor with toolbar\n * and automatic form integration.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.RichText name=\"content\" label=\"Content\" />\n * ```\n *\n * @example With custom height\n * ```tsx\n * <Form.Field.RichText\n * name=\"description\"\n * label=\"Description\"\n * minHeight=\"200px\"\n * maxHeight=\"400px\"\n * />\n * ```\n *\n * @example With limited toolbar\n * ```tsx\n * <Form.Field.RichText\n * name=\"comment\"\n * label=\"Comment\"\n * toolbarButtons={['bold', 'italic', 'link']}\n * />\n * ```\n *\n * @example JSON output (for database storage)\n * ```tsx\n * <Form.Field.RichText\n * name=\"article\"\n * label=\"Article\"\n * outputFormat=\"json\"\n * />\n * ```\n */\nexport function FieldRichText({\n name,\n label,\n placeholder,\n helperText,\n required,\n disabled,\n readOnly,\n tooltip,\n minHeight = '150px',\n maxHeight,\n showToolbar = true,\n toolbarButtons = DEFAULT_TOOLBAR_BUTTONS,\n outputFormat = 'html',\n imageUpload,\n}: RichTextFieldProps): ReactElement {\n const {\n form,\n fullPath,\n label: resolvedLabel,\n placeholder: resolvedPlaceholder,\n helperText: resolvedHelperText,\n tooltip: resolvedTooltip,\n required: resolvedRequired,\n disabled: resolvedDisabled,\n readOnly: resolvedReadOnly,\n } = useResolvedFieldProps(name, { label, placeholder, helperText, required, disabled, readOnly, tooltip })\n\n return (\n <form.Field name={fullPath}>\n {(field: AnyFieldApi) => {\n const { hasError, errorMessage } = getFieldErrors(field)\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolvedRequired}\n disabled={resolvedDisabled}\n readOnly={resolvedReadOnly}\n >\n <FieldLabel label={resolvedLabel} tooltip={resolvedTooltip} required={resolvedRequired} />\n <RichTextEditor\n value={field.state.value as string}\n onChange={(value) => field.handleChange(value)}\n onBlur={field.handleBlur}\n placeholder={resolvedPlaceholder}\n minHeight={minHeight}\n maxHeight={maxHeight}\n showToolbar={showToolbar}\n toolbarButtons={toolbarButtons}\n outputFormat={outputFormat}\n disabled={disabled}\n readOnly={readOnly}\n hasError={hasError}\n fieldName={fullPath}\n imageUpload={imageUpload}\n />\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolvedHelperText} />\n </Field.Root>\n )\n }}\n </form.Field>\n )\n}\n\n/**\n * Props for internal editor component\n */\ninterface RichTextEditorProps {\n value: string\n onChange: (value: string) => void\n onBlur: () => void\n placeholder?: string\n minHeight: string | number\n maxHeight?: string | number\n showToolbar: boolean\n toolbarButtons: ToolbarButton[]\n outputFormat: 'html' | 'json'\n disabled?: boolean\n readOnly?: boolean\n hasError?: boolean\n fieldName: string\n imageUpload?: ImageUploadConfig\n}\n\n/**\n * Internal Tiptap editor component\n */\nfunction RichTextEditor({\n value,\n onChange,\n onBlur,\n placeholder,\n minHeight,\n maxHeight,\n showToolbar,\n toolbarButtons,\n outputFormat,\n disabled,\n readOnly,\n hasError,\n fieldName,\n imageUpload,\n}: RichTextEditorProps) {\n // Build extensions dynamically\n const extensions = useMemo(() => {\n // Base extensions\n const baseExtensions = [\n StarterKit,\n Underline,\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n rel: 'noopener noreferrer',\n target: '_blank',\n },\n }),\n Placeholder.configure({\n placeholder: placeholder ?? 'Start typing...',\n }),\n // Add Image extension only if imageUpload is configured\n ...(imageUpload\n ? [\n TiptapImage.configure({\n inline: false,\n allowBase64: false,\n HTMLAttributes: {\n class: 'richtext-image',\n },\n }),\n ]\n : []),\n ]\n\n return baseExtensions\n }, [placeholder, imageUpload])\n\n const editor = useEditor({\n // Cast needed: minor @tiptap/core version drift (e.g. 3.20.0 vs 3.20.1) causes nominal type mismatch\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- @tiptap/core version incompatibility\n extensions: extensions as any[],\n content: outputFormat === 'json' && value ? safeParseJSON(value) : value || '',\n editable: !disabled && !readOnly,\n onUpdate: ({ editor }) => {\n if (outputFormat === 'json') {\n onChange(JSON.stringify(editor.getJSON()))\n } else {\n onChange(editor.getHTML())\n }\n },\n onBlur: () => {\n onBlur()\n },\n immediatelyRender: false,\n })\n\n // Synchronize external value changes\n useEffect(() => {\n if (!editor) {\n return\n }\n\n const currentContent = outputFormat === 'json' ? JSON.stringify(editor.getJSON()) : editor.getHTML()\n\n // Update only if content changed (avoid cursor jump)\n if (value !== currentContent) {\n const content = outputFormat === 'json' && value ? safeParseJSON(value) : value || ''\n editor.commands.setContent(content, { emitUpdate: false })\n }\n }, [editor, value, outputFormat])\n\n // Update editable state\n useEffect(() => {\n if (editor) {\n editor.setEditable(!disabled && !readOnly)\n }\n }, [editor, disabled, readOnly])\n\n if (!editor) {\n return null\n }\n\n return (\n <Box\n borderWidth=\"1px\"\n borderRadius=\"md\"\n borderColor={hasError ? 'border.error' : 'border'}\n overflow=\"hidden\"\n data-field-name={fieldName}\n _focusWithin={{\n borderColor: hasError ? 'border.error' : 'colorPalette.500',\n boxShadow: hasError\n ? '0 0 0 1px var(--chakra-colors-border-error)'\n : '0 0 0 1px var(--chakra-colors-colorPalette-500)',\n }}\n >\n {showToolbar && !readOnly && (\n <HStack p={1} gap={0.5} borderBottomWidth=\"1px\" borderColor=\"border\" bg=\"bg.subtle\" flexWrap=\"wrap\">\n {toolbarButtons.map((button) => {\n // Special handling for link — use Popover instead of window.prompt\n if (button === 'link') {\n return <LinkPopover key={button} editor={editor} disabled={disabled} />\n }\n\n // Special handling for image — use ImagePopover with upload\n if (button === 'image') {\n // Show button only if imageUpload is configured\n if (!imageUpload) {\n return null\n }\n return <ImagePopover key={button} editor={editor} config={imageUpload} disabled={disabled} />\n }\n\n const config = TOOLBAR_CONFIG[button]\n const isActive = config.isActive?.(editor) ?? false\n\n return (\n <IconButton\n key={button}\n aria-label={config.label}\n size=\"sm\"\n variant={isActive ? 'solid' : 'ghost'}\n colorPalette={isActive ? 'brand' : undefined}\n onClick={() => config.action(editor)}\n disabled={disabled}\n >\n {config.icon}\n </IconButton>\n )\n })}\n </HStack>\n )}\n <Box\n minHeight={minHeight}\n maxHeight={maxHeight}\n overflowY={maxHeight ? 'auto' : undefined}\n p={3}\n css={{\n '& .tiptap': {\n outline: 'none',\n minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,\n },\n '& .tiptap p.is-editor-empty:first-child::before': {\n color: 'var(--chakra-colors-fg-muted)',\n content: 'attr(data-placeholder)',\n float: 'left',\n height: 0,\n pointerEvents: 'none',\n },\n '& .tiptap h1': {\n fontSize: '2xl',\n fontWeight: 'bold',\n marginTop: '1em',\n marginBottom: '0.5em',\n },\n '& .tiptap h2': {\n fontSize: 'xl',\n fontWeight: 'bold',\n marginTop: '1em',\n marginBottom: '0.5em',\n },\n '& .tiptap h3': {\n fontSize: 'lg',\n fontWeight: 'semibold',\n marginTop: '1em',\n marginBottom: '0.5em',\n },\n '& .tiptap ul, & .tiptap ol': {\n paddingLeft: '1.5em',\n marginTop: '0.5em',\n marginBottom: '0.5em',\n },\n '& .tiptap blockquote': {\n borderLeft: '3px solid var(--chakra-colors-border)',\n paddingLeft: '1em',\n marginLeft: 0,\n marginTop: '0.5em',\n marginBottom: '0.5em',\n fontStyle: 'italic',\n color: 'var(--chakra-colors-fg-muted)',\n },\n '& .tiptap code': {\n backgroundColor: 'var(--chakra-colors-bg-subtle)',\n borderRadius: '3px',\n padding: '0.2em 0.4em',\n fontFamily: 'mono',\n fontSize: '0.9em',\n },\n '& .tiptap a': {\n color: 'var(--chakra-colors-colorPalette-500)',\n textDecoration: 'underline',\n cursor: 'pointer',\n },\n '& .tiptap p': {\n marginTop: '0.25em',\n marginBottom: '0.25em',\n },\n '& .tiptap img, & .tiptap .richtext-image': {\n maxWidth: '100%',\n height: 'auto',\n borderRadius: '4px',\n marginTop: '0.5em',\n marginBottom: '0.5em',\n },\n }}\n >\n <EditorContent editor={editor} />\n </Box>\n </Box>\n )\n}\n","'use client'\n\nimport { Input } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { StringFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.String - String input field\n *\n * Renders a Chakra Input with automatic form integration and error display.\n *\n * Automatically extracts from Zod schema:\n * - `type` from `z.string().email()` → type=\"email\", `z.string().url()` → type=\"url\"\n * - `maxLength` from `z.string().max(100)` → maxLength={100}\n * - `minLength` from `z.string().min(2)` → minLength={2}\n * - `pattern` from `z.string().regex(/.../)` → pattern=\"...\"\n * - `helperText` automatically generated from constraints (\"Maximum 100 characters\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example\n * ```tsx\n * <Form.Field.String name=\"title\" label=\"Title\" required />\n * ```\n *\n * @example With automatic constraints from Zod\n * ```tsx\n * // In schema: z.object({ email: z.string().email().max(255) })\n * <Form.Field.String name=\"email\" />\n * // Automatically: type=\"email\", maxLength={255}\n * ```\n *\n * @example In primitive array (no name)\n * ```tsx\n * <Form.Group.List name=\"tags\">\n * <Form.Field.String placeholder=\"Tag\" />\n * </Form.Group.List>\n * ```\n */\n/**\n * Automatic inputMode based on field type for mobile keyboards\n */\nfunction getInputModeFromType(type: string): StringFieldProps['inputMode'] {\n switch (type) {\n case 'email':\n return 'email'\n case 'tel':\n return 'tel'\n case 'url':\n return 'url'\n default:\n return 'text'\n }\n}\n\nexport const FieldString = createField<StringFieldProps, string>({\n displayName: 'FieldString',\n render: ({ field, fullPath, resolved, hasError, errorMessage, isValidating, componentProps }): ReactElement => {\n const { constraints } = resolved\n\n // Props take priority over constraints\n const type = componentProps.type ?? constraints.string?.inputType ?? 'text'\n const maxLength = componentProps.maxLength ?? constraints.string?.maxLength\n const minLength = componentProps.minLength ?? constraints.string?.minLength\n const pattern = componentProps.pattern ?? constraints.string?.pattern\n // inputMode: explicit prop > auto from type\n const inputMode = componentProps.inputMode ?? getInputModeFromType(type)\n\n return (\n <FieldWrapper\n resolved={resolved}\n hasError={hasError}\n errorMessage={errorMessage}\n isValidating={isValidating}\n fullPath={fullPath}\n >\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 ?? resolved.autocomplete}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Textarea } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { TextareaFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Form.Field.Textarea - Multiline text input field\n *\n * Renders a Chakra Textarea with automatic form integration and error display.\n *\n * Automatically extracts from Zod schema:\n * - `maxLength` from `z.string().max(500)` → maxLength={500}\n * - `helperText` automatically is generated from constraints (\"Maximum 500 characters\")\n *\n * Props always take priority over automatic values from schema.\n *\n * @example\n * ```tsx\n * <Form.Field.Textarea name=\"description\" label=\"Description\" rows={4} />\n * ```\n *\n * @example With automatic constraints from Zod\n * ```tsx\n * // In schema: z.object({ bio: z.string().max(500) })\n * <Form.Field.Textarea name=\"bio\" label=\"Bio\" autoresize />\n * // Automatically: maxLength={500} helperText=\"Maximum 500 characters\"\n * ```\n */\nexport const FieldTextarea = createField<TextareaFieldProps, string>({\n displayName: 'FieldTextarea',\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const { constraints } = resolved\n\n // Props take priority over constraints\n const maxLength = componentProps.maxLength ?? constraints.string?.maxLength\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Textarea\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange((e.target as HTMLTextAreaElement).value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n rows={componentProps.rows}\n autoresize={componentProps.autoresize}\n resize={componentProps.resize ?? 'vertical'}\n maxLength={maxLength}\n autoComplete={resolved.autocomplete}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Input } from '@chakra-ui/react'\nimport { type ReactElement, useCallback } from 'react'\nimport { withMask } from 'use-mask-input'\nimport type { MaskedInputFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * State for masked field\n */\ninterface MaskedInputFieldState {\n /** Ref callback for applying mask */\n maskRef: (element: HTMLInputElement | null) => void\n}\n\n/**\n * Form.Field.MaskedInput - Masked input field\n *\n * Renders masked input using the use-mask-input library.\n *\n * Mask characters:\n * - 9: digit\n * - a: letter\n * - *: letter or digit\n *\n * @example Passport mask\n * ```tsx\n * <Form.Field.MaskedInput name=\"passport\" label=\"Passport\" mask=\"99 99 999999\" />\n * ```\n *\n * @example Multiple masks (adapts to input)\n * ```tsx\n * <Form.Field.MaskedInput name=\"phone\" mask={['9999-9999', '99999-9999']} />\n * ```\n *\n * @example With custom placeholder character\n * ```tsx\n * <Form.Field.MaskedInput name=\"date\" mask=\"99/99/9999\" placeholderChar=\"#\" />\n * ```\n */\nexport const FieldMaskedInput = createField<MaskedInputFieldProps, string, MaskedInputFieldState>({\n displayName: 'FieldMaskedInput',\n\n useFieldState: (props) => {\n const {\n mask,\n placeholderChar = '_',\n showMaskOnFocus = true,\n showMaskOnHover = false,\n clearIncomplete = false,\n autoUnmask = false,\n } = props\n\n // Create ref callback for applying mask\n const maskRef = useCallback(\n (element: HTMLInputElement | null) => {\n if (element && mask) {\n const maskCallback = withMask(mask, {\n placeholder: placeholderChar,\n showMaskOnFocus,\n showMaskOnHover,\n clearIncomplete,\n autoUnmask,\n })\n maskCallback(element)\n }\n },\n [mask, placeholderChar, showMaskOnFocus, showMaskOnHover, clearIncomplete, autoUnmask]\n )\n\n return { maskRef }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, fieldState }): ReactElement => (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Input\n ref={fieldState.maskRef}\n value={(field.state.value as string) ?? ''}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={resolved.placeholder}\n data-field-name={fullPath}\n />\n </FieldWrapper>\n ),\n})\n"]}