form-father 0.8.12 → 0.8.14
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 +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented here.
|
|
4
4
|
|
|
5
|
+
## [0.8.14](https://github.com/Poliklot/form-father/compare/form-father-v0.8.13...form-father-v0.8.14) (2026-08-26)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* **deps-dev:** bump the development-dependencies group with 5 updates ([118450c](https://github.com/Poliklot/form-father/commit/118450c0c793f1bc5b6cd962dc46d5dcf84dc6a6))
|
|
11
|
+
* **deps-dev:** bump the development-dependencies group with 5 updates ([076c3dd](https://github.com/Poliklot/form-father/commit/076c3dd7d64a05c0a538dca88e6028be6eb3ff0f))
|
|
12
|
+
|
|
13
|
+
## [0.8.13](https://github.com/Poliklot/form-father/compare/form-father-v0.8.12...form-father-v0.8.13) (2026-08-17)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
* **deps-dev:** bump sass-embedded from 1.100.0 to 1.102.0 in the development-dependencies group ([a5940a0](https://github.com/Poliklot/form-father/commit/a5940a0d967fba232c37618259ba0a77f8aff2e1))
|
|
19
|
+
* **deps-dev:** bump sass-embedded in the development-dependencies group ([e23ba1e](https://github.com/Poliklot/form-father/commit/e23ba1eb8d0e670f433410ad5c786dad3a3e1d16))
|
|
20
|
+
|
|
5
21
|
## [0.8.12](https://github.com/Poliklot/form-father/compare/form-father-v0.8.11...form-father-v0.8.12) (2026-08-11)
|
|
6
22
|
|
|
7
23
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/helpers.ts","../src/validators.ts","../src/adapters.ts","../src/index.ts"],"sourcesContent":["/**\n * Возвращает форматированную дату.\n *\n * @param {string} dateValue\n * @param {string} format\n *\n * @returns {string}\n */\nfunction formatDate(dateValue: string, format: string): string {\n\tconst date = new Date(dateValue);\n\n\t/**\n\t * Добавляет ведущие нули.\n\t *\n\t * @param {number} num\n\t *\n\t * @returns {string}\n\t */\n\tconst pad = (num: number): string => num.toString().padStart(2, '0');\n\n\tconst day = pad(date.getDate());\n\tconst month = pad(date.getMonth() + 1);\n\tconst year = date.getFullYear().toString();\n\n\treturn format.replace('dd', day).replace('mm', month).replace('yyyy', year);\n}\n\n/**\n * Находит родительский элемент по заданому селектору.\n *\n * @param {HTMLElement | null} $el - Элемент, чего родителя нужно найти.\n * @param {string} selector - Селектор родителя.\n *\n * @returns {HTMLElement | null} Элемент родителя. Но если родителя с таким селектори не было найдено возвращается null.\n */\nexport function closest($el: HTMLElement | null, selector: string): HTMLElement | null {\n\tif ($el == null) return null;\n\n\tlet parent: HTMLElement | null = $el;\n\n\twhile (parent) {\n\t\tif (parent.matches(selector)) {\n\t\t\treturn parent;\n\t\t}\n\n\t\tparent = parent.parentElement;\n\t}\n\n\treturn null;\n}\n\n/** Включает блокировку скролла страницы */\nexport function blockScrollBody(): void {\n\t(window as any).lastBlockScrollPosition = window.pageYOffset;\n\tdocument.body.style.top = `${-(window as any).lastBlockScrollPosition}px`;\n\tdocument.body.classList.add('body--block-scroll');\n}\n\n/** Отменяет блокировку скролла страницы */\nexport function unblockScrollBody(): void {\n\tdocument.body.classList.remove('body--block-scroll');\n\tdocument.body.style.top = '';\n\twindow.scrollTo(0, (window as any).lastBlockScrollPosition || 0);\n}\n\n/**\n * Проверяет является ли строка валидным адресом электронной почты.\n *\n * @param {string} value - Строка, которую нужно проверить.\n *\n * @returns {boolean} Является ли строка валидным адресом электронной почты true/false.\n */\nexport function isEmailValid(value: string): boolean {\n\treturn /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{2,})$/iu.test(\n\t\tvalue,\n\t);\n}\n\nconst HTTP_PROTOCOLS = ['http:', 'https:'];\n\nfunction getNormalizedUrlString(originalUrlString: string): string {\n\tconst trimmedUrl = originalUrlString.trim();\n\tif (trimmedUrl.length === 0) return '';\n\n\tif (trimmedUrl.startsWith('//')) {\n\t\treturn `https:${trimmedUrl}`;\n\t}\n\n\treturn /^[a-z][a-z\\d+.-]*:\\/\\//i.test(trimmedUrl) ? trimmedUrl : `https://${trimmedUrl}`;\n}\n\nfunction isValidIpv4(hostname: string): boolean {\n\tconst parts = hostname.split('.');\n\tif (parts.length !== 4) return false;\n\n\treturn parts.every(part => {\n\t\tif (!/^\\d{1,3}$/.test(part)) return false;\n\t\tconst num = Number(part);\n\t\treturn num >= 0 && num <= 255;\n\t});\n}\n\nfunction isValidIpv6(hostname: string): boolean {\n\tif (!hostname.startsWith('[') || !hostname.endsWith(']')) return false;\n\n\tconst normalizedHostname = hostname.slice(1, -1);\n\treturn normalizedHostname.includes(':') && /^[\\da-f:.]+$/i.test(normalizedHostname);\n}\n\nfunction isValidDomainLabel(label: string): boolean {\n\treturn label.length > 0 && label.length <= 63 && /^[a-z\\d-]+$/i.test(label) && !label.startsWith('-') && !label.endsWith('-');\n}\n\nfunction isValidDomainHostname(hostname: string): boolean {\n\tconst labels = hostname.split('.');\n\treturn labels.length >= 2 && labels.every(isValidDomainLabel);\n}\n\nfunction isAllowedHostname(hostname: string): boolean {\n\tif (!hostname) return false;\n\n\treturn (\n\t\thostname === 'localhost' || isValidIpv4(hostname) || isValidIpv6(hostname) || isValidDomainHostname(hostname)\n\t);\n}\n\n/**\n * Проверяет является ли строка валидным url.\n *\n * @param {string} originalUrlString - Строка, которую нужно проверить.\n *\n * @returns {boolean} Является ли строка валидным url адресом true/false.\n */\nexport function isUrlValid(originalUrlString: string): boolean {\n\tconst urlString = getNormalizedUrlString(originalUrlString);\n\tif (urlString.length === 0) return false;\n\n\ttry {\n\t\tconst url = new URL(urlString);\n\t\treturn HTTP_PROTOCOLS.includes(url.protocol) && isAllowedHostname(url.hostname);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Проверяет является ли строка валидным номером телефона.\n *\n * @param {string} value - Строка, которую нужно проверить.\n *\n * @returns {boolean} Является ли строка валидным номером телефона true/false.\n */\nexport function isPhoneValid(value: string): boolean {\n\tconst numbersArray: string[] = [];\n\n\tArray.from(value).forEach(char => {\n\t\tif (!!Number(char) || Number(char) === 0) numbersArray.push(char);\n\t});\n\tif (numbersArray.length < 11 || (numbersArray.length < 12 && value[1] === '+')) return false;\n\n\treturn true;\n}\n\n/**\n * Кастомная сериализация формы в объект FormData.\n *\n * @param {HTMLElement} $element - DOM элемент для сериализации.\n *\n * @returns {FormData} Сериализованные данные формы в объекте FormData.\n */\nexport function serializeToFormData($element: HTMLElement): FormData {\n\tconst elements =\n\t\t$element.tagName === 'FORM'\n\t\t\t? Array.from(($element as HTMLFormElement).elements)\n\t\t\t: Array.from($element.querySelectorAll('input, select, textarea, button'));\n\n\tconst data = new FormData();\n\n\telements.forEach(element => {\n\t\tif (\n\t\t\t!(\n\t\t\t\telement instanceof HTMLInputElement ||\n\t\t\t\telement instanceof HTMLSelectElement ||\n\t\t\t\telement instanceof HTMLTextAreaElement ||\n\t\t\t\telement instanceof HTMLButtonElement\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!element.name || element.disabled || element.hasAttribute('data-no-serialize')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (element instanceof HTMLButtonElement) {\n\t\t\treturn;\n\t\t}\n\t\tconst { name, type } = element;\n\n\t\tif (type === 'file') {\n\t\t\tif ((element as HTMLInputElement).multiple) {\n\t\t\t\tconst files = (element as HTMLInputElement).files;\n\t\t\t\tif (files) {\n\t\t\t\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\t\t\t\t// Добавляем каждый файл с уникальным ключом\n\t\t\t\t\t\tdata.append(`${name}[${i}]`, files[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst files = (element as HTMLInputElement).files;\n\t\t\t\tif (files && files[0]) data.append(name, files[0]);\n\t\t\t}\n\t\t} else {\n\t\t\tlet value: string;\n\t\t\tif (type === 'select-one' || type === 'select-multiple') {\n\t\t\t\t// Обработка select элементов\n\t\t\t\tconst select = element as HTMLSelectElement;\n\t\t\t\tif (type === 'select-multiple') {\n\t\t\t\t\tconst selectedOptions = Array.from(select.selectedOptions).map(option => option.value);\n\t\t\t\t\tselectedOptions.forEach((val, index) => {\n\t\t\t\t\t\tdata.append(`${name}[${index}]`, val);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tvalue = select.value;\n\t\t\t\t\tif (value) data.append(name, value);\n\t\t\t\t}\n\t\t\t} else if (type === 'tel') {\n\t\t\t\tvalue = element.value\n\t\t\t\t\t.split(/[\\s()-]/)\n\t\t\t\t\t.join('')\n\t\t\t\t\t.replace(/^8/, '+7');\n\t\t\t} else if (type === 'checkbox' || type === 'radio') {\n\t\t\t\tif (!(element as HTMLInputElement).checked) return;\n\t\t\t\tvalue = element.value;\n\t\t\t} else if (type === 'date') {\n\t\t\t\tconst format = element.getAttribute('data-date-format');\n\t\t\t\tvalue = format ? formatDate(element.value, format) : element.value;\n\t\t\t} else {\n\t\t\t\tvalue = element.value;\n\t\t\t}\n\n\t\t\tif (value! && type !== 'select-one' && type !== 'select-multiple') {\n\t\t\t\tdata.append(name, value);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn data;\n}\n\n/**\n * Функция для разбора общих свойств ответа.\n *\n * @param {any} responseBody - Тело ответа.\n */\nexport function parseCommonResponseProperties(responseBody: any): void {\n\tif (Object.prototype.hasOwnProperty.call(responseBody, 'redirect-url')) {\n\t\tif (responseBody['redirect-url-delay']) {\n\t\t\tconst redirectUrlDelay: number = Number(responseBody['redirect-url-delay']);\n\t\t\tsetTimeout(() => {\n\t\t\t\twindow.location.href = responseBody['redirect-url'];\n\t\t\t}, redirectUrlDelay);\n\t\t} else {\n\t\t\twindow.location.href = responseBody['redirect-url'];\n\t\t}\n\t} else if (Object.prototype.hasOwnProperty.call(responseBody, 'reload')) {\n\t\tif (responseBody.reload === true) {\n\t\t\tif (responseBody['reload-delay']) {\n\t\t\t\tconst reloadDelay: number = Number(responseBody['reload-delay']);\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t}, reloadDelay);\n\t\t\t} else {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t}\n\t}\n\t// Не показываем тост если делается редирект или обновление страницы (чтобы небыло вспышек) - в этом случае тосты обрабытываются в ответе onResponseSuccess | onResponseUnsuccess\n\telse {\n\t\tif (Object.prototype.hasOwnProperty.call(responseBody, 'toast')) {\n\t\t\tconst toasts = responseBody['toast'];\n\t\t\tconst normalizedToasts = Array.isArray(toasts) ? toasts : [toasts];\n\n\t\t\tnormalizedToasts.forEach(toast => {\n\t\t\t\t(window as any).showToast(toast);\n\t\t\t});\n\t\t} else if (Object.prototype.hasOwnProperty.call(responseBody, 'error-toast')) {\n\t\t\t/** @deprecated */\n\t\t\t(window as any).showToast(responseBody['error-toast']);\n\t\t}\n\t}\n}\n\n/**\n * Сериализует данные формы в объект JSON.\n *\n * @param {HTMLFormElement} form - Элемент формы.\n *\n * @returns {Object} Сериализованные данные формы.\n */\nexport function serializeFormToJSON(form: HTMLFormElement): { [key: string]: any } {\n\tconst obj: { [key: string]: any } = {};\n\tconst formData = new FormData(form);\n\n\tformData.forEach((value, key) => {\n\t\tif (obj.hasOwnProperty(key)) {\n\t\t\tif (!Array.isArray(obj[key])) {\n\t\t\t\tobj[key] = [obj[key]];\n\t\t\t}\n\t\t\tobj[key].push(value);\n\t\t} else {\n\t\t\tobj[key] = value;\n\t\t}\n\t});\n\n\treturn obj;\n}\n","import { isUrlValid } from './helpers';\n\n/* ---------- types ---------- */\nexport type ValidatorEffectCtx = {\n\tvalue: string;\n\t$input: ValidatorFieldElement;\n\t$form: HTMLElement;\n\tparams?: any;\n};\n\nexport type ValidatorFieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nexport type ValidatorResult = {\n\tvalid: boolean;\n\t/** Сообщение об ошибке, если нужно переопределить дефолт */\n\tmessage?: string;\n\t/** Выполнить сайд-эффект (подсветка, иконки, тексты и т.п.) */\n\teffect?: (ctx: ValidatorEffectCtx) => void | Promise<void>;\n\t/** Остановить дальнейшие правила для поля (даже если valid=true). Полезно, если валидатор полностью «ведёт» поле. */\n\tstopOthers?: boolean;\n};\n\nexport type ValidatorFn = (\n\tvalue: string,\n\t$input: ValidatorFieldElement,\n\t$form: HTMLElement,\n\tparams?: any,\n) => boolean | ValidatorResult | Promise<boolean | ValidatorResult>;\n\ninterface Validator {\n\tfn: ValidatorFn;\n\tdefaultMessage: string;\n}\n\n/* ---------- singleton-storage на globalThis ---------- */\nconst GLOBAL_KEY = Symbol.for('FormFather.validators');\nconst validators: Map<string, Validator> =\n\t(globalThis as any)[GLOBAL_KEY] ?? ((globalThis as any)[GLOBAL_KEY] = new Map<string, Validator>());\n\n/* ---------- API ---------- */\nexport function registerValidator(\n\tname: string,\n\tfn: ValidatorFn,\n\tdefaultMessage: string,\n\t{ override = false }: { override?: boolean } = {},\n): void {\n\tif (validators.has(name) && !override) {\n\t\tconsole.warn(`[FormFather] Validator \"${name}\" already exists; pass { override: true } to replace`);\n\t\treturn;\n\t}\n\tvalidators.set(name, { fn, defaultMessage });\n}\n\nexport const getValidator = (name: string): Validator | undefined => validators.get(name);\n\nexport function getAllValidators(): Map<string, Validator> {\n\treturn new Map(validators); // копию, чтобы никто не мутировал оригинал\n}\n\n/* ---------- built-in rules ---------- */\nfunction registerBuiltinValidator(name: string, fn: ValidatorFn, defaultMessage: string): void {\n\tif (!validators.has(name)) {\n\t\tvalidators.set(name, { fn, defaultMessage });\n\t}\n}\n\nregisterBuiltinValidator(\n\t'required',\n\t(value, $input, $form) => {\n\t\tif ($input && $input.type) {\n\t\t\tif ($input.type === 'checkbox') {\n\t\t\t\treturn ($input as HTMLInputElement).checked;\n\t\t\t}\n\t\t\tif ($input.type === 'radio') {\n\t\t\t\tconst group = $form.querySelectorAll(`input[type=\"radio\"][name=\"${$input.name}\"]`);\n\t\t\t\treturn Array.from(group).some(el => (el as HTMLInputElement).checked);\n\t\t\t}\n\t\t}\n\n\t\t// fallback — если нет $input (например, в unit-тестах)\n\t\treturn value.trim().length > 0;\n\t},\n\t'Пустое значение',\n);\n\nregisterBuiltinValidator('email', v => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v), 'Неверный формат');\n\nregisterBuiltinValidator('tel', v => /^\\+7\\d{10}$/.test(v), 'Неверный формат');\n\nregisterBuiltinValidator('url', v => isUrlValid(v), 'Неверный формат');\n\nregisterBuiltinValidator('not-numbers', v => !/[0-9]/.test(v), 'Неверный формат');\n","import { registerValidator, type ValidatorFieldElement, type ValidatorResult } from './validators';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type SchemaParseResult =\n\t| { success: true; data?: unknown }\n\t| { success: false; error?: unknown; issues?: Array<{ message?: string }> };\n\nexport type SchemaLike =\n\t| {\n\t\t\tsafeParse?: (value: unknown) => MaybePromise<SchemaParseResult>;\n\t\t\tparse?: (value: unknown) => MaybePromise<unknown>;\n\t }\n\t| ((value: unknown) => MaybePromise<boolean | ValidatorResult | void>);\n\nexport type AdapterValidator = (\n\tvalue: string,\n\t$input: ValidatorFieldElement,\n\t$form: HTMLElement,\n\tparams?: any,\n) => MaybePromise<boolean | ValidatorResult>;\n\nexport interface SchemaValidatorOptions {\n\tmessage?: string | ((error: unknown) => string);\n\tmapValue?: (value: string, $input: ValidatorFieldElement, $form: HTMLElement, params?: any) => unknown;\n}\n\nexport interface RegisterSchemaValidatorOptions extends SchemaValidatorOptions {\n\toverride?: boolean;\n}\n\nexport interface RegisterFieldValidatorOptions {\n\toverride?: boolean;\n}\n\nexport interface LengthValidatorOptions {\n\tmin?: number;\n\tmax?: number;\n\ttrim?: boolean;\n\temptyIsValid?: boolean;\n}\n\nfunction readFirstIssueMessage(error: unknown): string | undefined {\n\tif (!error || typeof error !== 'object') return undefined;\n\n\tconst issues = (error as any).issues || (error as any).errors;\n\tif (Array.isArray(issues)) {\n\t\tconst firstMessage = issues.find(issue => typeof issue?.message === 'string')?.message;\n\t\tif (firstMessage) return firstMessage;\n\t}\n\n\treturn typeof (error as any).message === 'string' ? (error as any).message : undefined;\n}\n\nfunction resolveMessage(error: unknown, message?: SchemaValidatorOptions['message']): string | undefined {\n\tif (typeof message === 'function') return message(error);\n\treturn message || readFirstIssueMessage(error);\n}\n\nfunction normalizeResult(result: boolean | ValidatorResult | void, message?: string): boolean | ValidatorResult {\n\tif (typeof result === 'object' && result !== null) return result;\n\tif (result === undefined) return true;\n\treturn result ? true : { valid: false, message };\n}\n\nexport function createSchemaValidator(schema: SchemaLike, options: SchemaValidatorOptions = {}): AdapterValidator {\n\treturn async (value, $input, $form, params) => {\n\t\tconst mappedValue = options.mapValue ? options.mapValue(value, $input, $form, params) : value;\n\n\t\ttry {\n\t\t\tif (typeof schema === 'function') {\n\t\t\t\treturn normalizeResult(await schema(mappedValue), resolveMessage(undefined, options.message));\n\t\t\t}\n\n\t\t\tif (typeof schema.safeParse === 'function') {\n\t\t\t\tconst result = await schema.safeParse(mappedValue);\n\t\t\t\tif (result.success) return true;\n\t\t\t\treturn { valid: false, message: resolveMessage(result.error || result, options.message) };\n\t\t\t}\n\n\t\t\tif (typeof schema.parse === 'function') {\n\t\t\t\tawait schema.parse(mappedValue);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn { valid: false, message: resolveMessage(error, options.message) };\n\t\t}\n\n\t\treturn { valid: false, message: resolveMessage(undefined, options.message) };\n\t};\n}\n\nexport function registerSchemaValidator(\n\tname: string,\n\tschema: SchemaLike,\n\tdefaultMessage: string,\n\toptions: RegisterSchemaValidatorOptions = {},\n): void {\n\tconst { override, ...adapterOptions } = options;\n\tregisterValidator(name, createSchemaValidator(schema, adapterOptions), defaultMessage, { override });\n}\n\nexport function registerFieldValidator(\n\tname: string,\n\tpredicate: (value: string, $input: ValidatorFieldElement, $form: HTMLElement, params?: any) => MaybePromise<boolean>,\n\tdefaultMessage: string,\n\toptions: RegisterFieldValidatorOptions = {},\n): void {\n\tregisterValidator(name, createFieldValidator(predicate), defaultMessage, options);\n}\n\nexport function createFieldValidator(\n\tpredicate: (value: string, $input: ValidatorFieldElement, $form: HTMLElement, params?: any) => MaybePromise<boolean>,\n\tmessage?: string,\n): AdapterValidator {\n\treturn async (value, $input, $form, params) => {\n\t\tconst valid = await predicate(value, $input, $form, params);\n\t\treturn valid ? true : { valid: false, message };\n\t};\n}\n\nexport function createPatternValidator(pattern: RegExp, message?: string): AdapterValidator {\n\treturn createFieldValidator(value => {\n\t\tpattern.lastIndex = 0;\n\t\treturn pattern.test(value);\n\t}, message);\n}\n\nexport function createLengthValidator(options: LengthValidatorOptions, message?: string): AdapterValidator {\n\treturn createFieldValidator(value => {\n\t\tconst normalizedValue = options.trim === false ? value : value.trim();\n\t\tif (normalizedValue.length === 0 && options.emptyIsValid === true) return true;\n\t\tif (typeof options.min === 'number' && normalizedValue.length < options.min) return false;\n\t\tif (typeof options.max === 'number' && normalizedValue.length > options.max) return false;\n\t\treturn true;\n\t}, message);\n}\n","import {\n\tserializeToFormData,\n\tisEmailValid,\n\tisUrlValid,\n\tparseCommonResponseProperties,\n\tclosest,\n\tisPhoneValid,\n\tserializeFormToJSON,\n} from './helpers';\nimport { getValidator } from './validators';\n\nexport * from './validators';\nexport * from './adapters';\nexport {\n\tserializeToFormData,\n\tisEmailValid,\n\tisUrlValid,\n\tparseCommonResponseProperties,\n\tclosest,\n\tisPhoneValid,\n\tblockScrollBody,\n\tunblockScrollBody,\n\tserializeFormToJSON,\n} from './helpers';\n\n// --- shared cross-file state (singleton via globalThis) ---\nconst FORM_GLOBAL_KEY = Symbol.for('formfather.shared');\n\ntype SharedState = {\n\tdefaultParams: Partial<FormOptions>;\n\tdefaultValidationSchema?: ValidationSchema;\n};\n\nconst __shared: SharedState =\n\t// уже существует? используем его\n\t(globalThis as any)[FORM_GLOBAL_KEY] ??\n\t// иначе создаём\n\t((globalThis as any)[FORM_GLOBAL_KEY] = {\n\t\tdefaultParams: {},\n\t\tdefaultValidationSchema: undefined,\n\t});\n\nexport type ValidationRule = string | { rule: string; params?: any };\nexport type ValidationTrigger = 'submit' | 'input' | 'blur' | 'change';\nexport type ValidationErrorSource = 'client' | 'server' | 'manual';\nexport type FieldReference = string | FormFieldElement;\n\nexport const FORM_ERROR_FIELD = '_form';\n\nexport interface ValidationError {\n\tfield: string;\n\trule: string;\n\tmessage: string;\n\tsource: ValidationErrorSource;\n}\n\nexport interface SubmitResult {\n\tsuccess: boolean;\n\tresponse?: Response;\n\tresponseBody?: ResponseBody;\n\terror?: unknown;\n}\n\nexport interface FormResetOptions {\n\tclearErrors?: boolean;\n}\n\nexport interface ErrorSummaryOptions {\n\t/** Existing summary container selector. If omitted, Form Father creates `[data-form-father-summary]` in the form. */\n\tselector?: string;\n\n\t/** Heading text for the default summary renderer. */\n\ttitle?: string;\n\n\t/** Move focus to the summary after rendering. Useful for submit-time screen reader announcements. */\n\tfocus?: boolean;\n\n\t/** Custom renderer. Return an element/string or render into your own container and return nothing. */\n\trender?: (errors: ValidationError[], formInstance: Form) => HTMLElement | string | void;\n}\n\nexport interface ValidationIssue {\n\tfield?: string;\n\trule?: string;\n\tmessage: string;\n\tsource?: ValidationErrorSource;\n}\n\nexport type ValidationIssueInput =\n\t| string\n\t| ValidationIssue\n\t| ErrorResponse\n\t| Record<string, string>\n\t| Array<string | ValidationIssue | ErrorResponse>;\n\nexport interface FormValidatorContext {\n\tform: Form;\n\tformElement: HTMLFormElement;\n\tvalues: Record<string, any>;\n\terrors: ValidationError[];\n}\n\nexport type FormValidatorResult =\n\t| boolean\n\t| string\n\t| void\n\t| ValidationIssue\n\t| Array<string | ValidationIssue>;\n\nexport type FormValidator = (context: FormValidatorContext) => FormValidatorResult | Promise<FormValidatorResult>;\n\nexport type FormValidatorPredicate = (context: FormValidatorContext) => boolean | Promise<boolean>;\nexport type FormValidatorIssueFactory =\n\t| string\n\t| ValidationIssue\n\t| ((context: FormValidatorContext) => string | ValidationIssue | Promise<string | ValidationIssue>);\n\nexport type ValidationSchema = Record<\n\tstring,\n\t{\n\t\trules: ValidationRule[];\n\t\tselector?: string;\n\t\tmessages?: Record<string, string>;\n\t}\n>;\n\nfunction readFormValue(values: Record<string, any>, field: string): any {\n\treturn values[field];\n}\n\nfunction isEmptyFormValue(value: any): boolean {\n\tif (Array.isArray(value)) return value.length === 0;\n\treturn value === undefined || value === null || String(value).trim().length === 0;\n}\n\nasync function resolveFormValidatorIssue(\n\tcontext: FormValidatorContext,\n\tissue: FormValidatorIssueFactory,\n\tfallbackField?: string,\n\tfallbackRule?: string,\n): Promise<string | ValidationIssue> {\n\tconst resolvedIssue = typeof issue === 'function' ? await issue(context) : issue;\n\tif (typeof resolvedIssue === 'string') {\n\t\treturn {\n\t\t\tfield: fallbackField,\n\t\t\trule: fallbackRule,\n\t\t\tmessage: resolvedIssue,\n\t\t};\n\t}\n\n\treturn {\n\t\tfield: fallbackField,\n\t\trule: fallbackRule,\n\t\t...resolvedIssue,\n\t};\n}\n\nexport function createFormValidator(\n\tpredicate: FormValidatorPredicate,\n\tissue: FormValidatorIssueFactory,\n): FormValidator {\n\treturn async context => {\n\t\tconst valid = await predicate(context);\n\t\treturn valid ? true : resolveFormValidatorIssue(context, issue);\n\t};\n}\n\nexport function sameAsField(\n\tfield: string,\n\totherField: string,\n\tmessage: string = 'Значения не совпадают',\n\trule: string = 'same-as-field',\n): FormValidator {\n\treturn createFormValidator(\n\t\t({ values }) => readFormValue(values, field) === readFormValue(values, otherField),\n\t\t{ field, rule, message },\n\t);\n}\n\nexport function requiredIf(\n\tfield: string,\n\tcondition: FormValidatorPredicate,\n\tmessage: string = 'Поле обязательно',\n\trule: string = 'conditional-required',\n): FormValidator {\n\treturn createFormValidator(\n\t\tasync context => !(await condition(context)) || !isEmptyFormValue(readFormValue(context.values, field)),\n\t\t{ field, rule, message },\n\t);\n}\n\nexport function dateOrder(\n\tstartField: string,\n\tendField: string,\n\tmessage: string = 'Дата окончания должна быть позже даты начала',\n\trule: string = 'date-order',\n): FormValidator {\n\treturn createFormValidator(\n\t\t({ values }) => {\n\t\t\tconst start = readFormValue(values, startField);\n\t\t\tconst end = readFormValue(values, endField);\n\t\t\tif (isEmptyFormValue(start) || isEmptyFormValue(end)) return true;\n\t\t\treturn Date.parse(String(start)) <= Date.parse(String(end));\n\t\t},\n\t\t{ field: endField, rule, message },\n\t);\n}\n\ntype SubmitElement = HTMLInputElement | HTMLButtonElement;\nexport type FormFieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nlet loaderIdCounter = 0;\nlet errorIdCounter = 0;\nconst FORM_INSTANCES = new WeakMap<HTMLFormElement, Form>();\nconst ERROR_DESCRIBEDBY_ID_ATTRIBUTE = 'data-form-father-describedby-id';\nconst ADDED_DESCRIBEDBY_ID_ATTRIBUTE = 'data-form-father-added-describedby-id';\nconst ERROR_SUMMARY_ATTRIBUTE = 'data-form-father-summary';\n\n/** Параметры формы. */\nexport interface FormOptions {\n\t/**\n\t * Функция обратного вызова. Запускается, перед началом валидации формы.\n\t *\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonBeforeValidate?: (formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается, когда закончилась валидация, но не началась отправка.\n\t *\n\t * @param isValid - Статус валидации.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonAfterValidate?: (isValid: boolean, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается после неуспешной клиентской валидации.\n\t *\n\t * @param errors - Список ошибок валидации.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonValidationError?: (errors: ValidationError[], formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается перед отправкой уже валидной формы. Если вернуть `false`, отправка будет\n\t * отменена.\n\t *\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonBeforeSubmit?: (formInstance: Form) => void | boolean | Promise<void | boolean>;\n\n\t/**\n\t * Функция обратного вызова. Запускается, когда форма отправляется.\n\t *\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonSubmit?: (formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова.\n\t *\n\t * @param responseBody - Тело ответа.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonResponse?: (responseBody: ResponseBody, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается после успешного HTTP-ответа и `success: true`.\n\t *\n\t * @param responseBody - Тело ответа.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonResponseSuccess?: (responseBody: ResponseBody, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается после неуспешного HTTP-ответа или `success !== true`.\n\t *\n\t * @param responseBody - Тело ответа.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonResponseUnsuccess?: (responseBody: ResponseBody, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается при исключении во время отправки формы.\n\t *\n\t * @param error - Ошибка отправки.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonSubmitError?: (error: unknown, formInstance: Form) => void;\n\n\t/** Нужно ли показывать loader в кнопке. По умолчанию `true`. */\n\tshowLoaderButton?: boolean;\n\n\t/** Нужно ли проскроливать до первого по порядку элемента с ошибкой. По умолчанию `true`. */\n\tscrollToFirstErroredInput?: boolean;\n\n\t/** Нужно ли переводить фокус в первое ошибочное поле. По умолчанию `false`. */\n\tfocusFirstErroredInput?: boolean;\n\n\t/** Кастомный тип ошибки. */\n\tcustomTypeError?: any;\n\n\t/** Цвет лоадера. */\n\tloaderColor?: string;\n\n\t/** Нужно ли выводить данные в консоль. По умолчанию `false`. */\n\tlogging?: boolean;\n\n\t/** Селектор поля ввода данных. Таких как textarea, input, select, ... . По умолчанию `.input`. */\n\tinputSelector?: string;\n\n\t/**\n\t * Селектор поля обёртки над полем ввода, у которого реализован публичный метод `showError`. По умолчанию\n\t * `.input-primary`.\n\t */\n\tinputWrapperSelector?: string;\n\n\t/**\n\t * События, на которых нужно запускать валидацию поля. `submit` всегда обрабатывается отдельно. По умолчанию\n\t * `submit`.\n\t */\n\tvalidateOn?: ValidationTrigger | ValidationTrigger[];\n\n\t/** События, на которых нужно повторно проверять уже ошибочные поля. По умолчанию `input` и `change`. */\n\trevalidateOn?: ValidationTrigger | ValidationTrigger[];\n\n\t/** Задержка live-валидации в миллисекундах. По умолчанию `0`. */\n\tvalidationDebounce?: number;\n\n\t/** Атрибут с CSS-селектором контейнера для ошибки поля. По умолчанию `data-error-container`. */\n\terrorContainerAttribute?: string;\n\n\t/** Атрибут, куда пишется состояние поля: `validating`, `valid` или `invalid`. */\n\tvalidationStateAttribute?: string;\n\n\t/** Связывать текст ошибки с полем через `aria-describedby`. По умолчанию `true`. */\n\tariaDescribeErrors?: boolean;\n\n\t/** Префикс id для автоматически созданных элементов ошибок. */\n\terrorIdPrefix?: string;\n\n\t/** Error summary для всей формы. По умолчанию выключен; `true` включает дефолтный renderer. */\n\terrorSummary?: boolean | ErrorSummaryOptions;\n\n\t/** Следить за динамически добавленными/удалёнными полями и submit-кнопками. По умолчанию `false`. */\n\tobserveMutations?: boolean;\n\n\t/** Функция для обёртки отправляемых данных. */\n\twrapData?: (data: Record<string, any>) => Record<string, any>;\n\n\t/** Схема валидации: поле → массив правил + override-сообщения */\n\tvalidationSchema?: ValidationSchema;\n\n\t/** Валидаторы всей формы: cross-field, conditional required, date ranges и другие проверки над `getValues()`. */\n\tformValidators?: FormValidator | FormValidator[];\n}\n\nexport interface ErrorResponse {\n\tname: string;\n\t'error-msg': string;\n}\n\nexport interface ResponseBody {\n\t[key: string]: any;\n\tsuccess?: boolean;\n\terror?: boolean;\n\t'error-msg'?: string;\n\terrors?: ErrorResponse[];\n}\n\n/** Изначальная дефолтная схема. */\nconst INITIAL_DEFAULT_SCHEMA: ValidationSchema = {\n\ttel: {\n\t\tselector: 'input[type=\"tel\"]',\n\t\trules: ['tel'],\n\t},\n\temail: {\n\t\tselector: 'input[type=\"email\"]',\n\t\trules: ['email'],\n\t},\n\trequired: {\n\t\tselector: '[required]',\n\t\trules: ['required'],\n\t},\n\turl: {\n\t\tselector: 'input[type=\"url\"]',\n\t\trules: ['url'],\n\t},\n\t'not-numbers': {\n\t\tselector: 'input[data-validate=\"not-numbers\"]',\n\t\trules: ['not-numbers'],\n\t},\n};\n\n/**\n * Реализует форму отправки данных.\n *\n * @class\n */\nexport default class Form {\n\tpublic $el: HTMLFormElement;\n\tprivate options: FormOptions;\n\tprivate config: FormOptions;\n\tprivate $submits: SubmitElement[] = [];\n\tprivate waitResponse: boolean = false;\n\tprivate inputs: NodeListOf<FormFieldElement> | null = null;\n\tprivate _onSubmitHandler?: (e: Event) => void | Promise<void>;\n\tprivate _onSubmitClickHandler?: (e: Event) => void | Promise<void>;\n\tprivate fieldEventHandlers: Array<{\n\t\t$input: FormFieldElement;\n\t\tevent: Exclude<ValidationTrigger, 'submit'>;\n\t\thandler: EventListener;\n\t}> = [];\n\tprivate liveValidationTimers = new WeakMap<FormFieldElement, ReturnType<typeof setTimeout>>();\n\tprivate fieldValidationTokens = new WeakMap<FormFieldElement, number>();\n\tprivate fieldValidationTokenCounter = 0;\n\tprivate mutationObserver?: MutationObserver;\n\tprivate errors: ValidationError[] = [];\n\n\tprivate static get defaultParams(): Partial<FormOptions> {\n\t\treturn __shared.defaultParams;\n\t}\n\tprivate static set defaultParams(v: Partial<FormOptions>) {\n\t\t__shared.defaultParams = v;\n\t}\n\n\tstatic get defaultValidationSchema(): ValidationSchema {\n\t\treturn (__shared.defaultValidationSchema ??= INITIAL_DEFAULT_SCHEMA);\n\t}\n\n\tstatic set defaultValidationSchema(v: ValidationSchema) {\n\t\t__shared.defaultValidationSchema = v;\n\t}\n\n\t/**\n\t * Создать форму.\n\t *\n\t * @param {HTMLElement} $el - Элемент формы (тег form!).\n\t * @param {Object} options - Параметры формы.\n\t */\n\tconstructor($el: HTMLElement, options: FormOptions = {}) {\n\t\tthis.$el = $el as HTMLFormElement;\n\t\tthis.options = options;\n\n\t\tconst defaultConfig: FormOptions = {\n\t\t\tonSubmit: () => {},\n\t\t\tonResponse: () => {},\n\t\t\tonResponseSuccess: () => {},\n\t\t\tonResponseUnsuccess: () => {},\n\t\t\tcustomTypeError: null,\n\t\t\tloaderColor: '#fff',\n\t\t\tshowLoaderButton: true,\n\t\t\tscrollToFirstErroredInput: true,\n\t\t\tfocusFirstErroredInput: false,\n\t\t\tlogging: false,\n\t\t\tinputSelector: '.input',\n\t\t\tinputWrapperSelector: '.input-primary',\n\t\t\tvalidateOn: 'submit',\n\t\t\trevalidateOn: ['input', 'change'],\n\t\t\tvalidationDebounce: 0,\n\t\t\terrorContainerAttribute: 'data-error-container',\n\t\t\tvalidationStateAttribute: 'data-form-father-state',\n\t\t\tariaDescribeErrors: true,\n\t\t\terrorIdPrefix: 'form-father-error',\n\t\t\terrorSummary: false,\n\t\t\tobserveMutations: false,\n\t\t};\n\n\t\t/* Слияние параметров: глобальные параметры → пользовательские параметры */\n\t\tthis.config = Object.assign({}, defaultConfig, Form.defaultParams, options);\n\n\t\tif (this.$el) {\n\t\t\tthis.$submits = this.findSubmitElements();\n\t\t\tif (this.isCorrectArguments()) {\n\t\t\t\tthis.bindSubmitHandlers();\n\t\t\t\tthis.initialization();\n\t\t\t\tthis.bindFieldValidationEvents();\n\t\t\t\tthis.setupMutationObserver();\n\t\t\t\tFORM_INSTANCES.set(this.$el, this);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('Empty $el');\n\t\t}\n\t}\n\n\tpublic getOptions(): FormOptions {\n\t\treturn this.options;\n\t}\n\n\t/**\n\t * Инициализирует сразу несколько форм по CSS-селектору. Если форма уже инициализирована, её настройки обновятся.\n\t *\n\t * @param selector - CSS-селектор форм. По умолчанию `form[data-form-father]`.\n\t * @param options - Общие параметры для найденных форм.\n\t */\n\tpublic static initAll(selector: string = 'form[data-form-father]', options: FormOptions = {}): Form[] {\n\t\t/* istanbul ignore next -- SSR guard: jsdom does not allow document to be unset cleanly. */\n\t\tif (typeof document === 'undefined') return [];\n\n\t\treturn Array.from(document.querySelectorAll<HTMLFormElement>(selector))\n\t\t\t.filter($form => $form.tagName === 'FORM')\n\t\t\t.map($form => {\n\t\t\t\tconst existing = FORM_INSTANCES.get($form);\n\t\t\t\tif (existing) {\n\t\t\t\t\texisting.updateOptions(options);\n\t\t\t\t\treturn existing;\n\t\t\t\t}\n\n\t\t\t\treturn new Form($form, options);\n\t\t\t});\n\t}\n\n\t/** Обновляет настройки конкретного инстанса формы без пересоздания обработчиков вручную. */\n\tpublic updateOptions(options: Partial<FormOptions>): this {\n\t\tthis.options = { ...this.options, ...options };\n\t\tthis.config = { ...this.config, ...options };\n\t\tthis.refreshControls();\n\t\tthis.bindSubmitHandlers();\n\t\tthis.bindFieldValidationEvents();\n\t\tthis.setupMutationObserver();\n\t\treturn this;\n\t}\n\n\t/** Возвращает текущий список ошибок формы. */\n\tpublic getErrors(): ValidationError[] {\n\t\treturn this.errors.map(error => ({ ...error }));\n\t}\n\n\t/** Возвращает значения формы обычным объектом. */\n\tpublic getValues(): Record<string, any> {\n\t\treturn serializeFormToJSON(this.$el);\n\t}\n\n\tprivate normalizeValueList(value: any): string[] {\n\t\treturn Array.isArray(value) ? value.map(String) : [String(value)];\n\t}\n\n\t/** Проставляет значения полей по `name` и уведомляет UI через `input`/`change` события. */\n\tpublic setValues(values: Record<string, any>): this {\n\t\tthis.getAllFields().forEach($field => {\n\t\t\tif (!$field.name || !Object.prototype.hasOwnProperty.call(values, $field.name)) return;\n\n\t\t\tconst value = values[$field.name];\n\t\t\tif ($field instanceof HTMLInputElement && $field.type === 'file') return;\n\n\t\t\tif ($field instanceof HTMLInputElement && $field.type === 'checkbox') {\n\t\t\t\tif (typeof value === 'boolean') {\n\t\t\t\t\t$field.checked = value;\n\t\t\t\t} else {\n\t\t\t\t\t$field.checked = this.normalizeValueList(value).includes($field.value);\n\t\t\t\t}\n\t\t\t} else if ($field instanceof HTMLInputElement && $field.type === 'radio') {\n\t\t\t\t$field.checked = String(value) === $field.value;\n\t\t\t} else if ($field instanceof HTMLSelectElement && $field.multiple) {\n\t\t\t\tconst valuesList = this.normalizeValueList(value);\n\t\t\t\tArray.from($field.options).forEach(option => {\n\t\t\t\t\toption.selected = valuesList.includes(option.value);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t$field.value = value == null ? '' : String(value);\n\t\t\t}\n\n\t\t\t$field.dispatchEvent(new Event('input', { bubbles: true }));\n\t\t\t$field.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t});\n\n\t\treturn this;\n\t}\n\n\t/** Снимает все клиентские и серверные ошибки с формы, не меняя значения полей. */\n\tpublic clearErrors(): this {\n\t\tthis.errors = [];\n\t\tthis.getAllFields().forEach($field => {\n\t\t\tthis.hideError($field);\n\t\t\tthis.clearFieldValidationState($field);\n\t\t});\n\t\tthis.hideErrorForm();\n\t\tthis.hideErrorSummary();\n\t\treturn this;\n\t}\n\n\tprivate isErrorResponse(issue: unknown): issue is ErrorResponse {\n\t\treturn (\n\t\t\t!!issue &&\n\t\t\ttypeof issue === 'object' &&\n\t\t\ttypeof (issue as ErrorResponse).name === 'string' &&\n\t\t\ttypeof (issue as ErrorResponse)['error-msg'] === 'string'\n\t\t);\n\t}\n\n\tprivate normalizeValidationIssues(\n\t\tissues: ValidationIssueInput | FormValidatorResult,\n\t\tsource: ValidationErrorSource,\n\t): ValidationIssue[] {\n\t\tif (issues == null || issues === true) return [];\n\t\tif (issues === false) return [{ message: 'Некорректные данные формы', source }];\n\t\tif (typeof issues === 'string') return [{ message: issues, source }];\n\n\t\tif (Array.isArray(issues)) {\n\t\t\treturn issues.flatMap(issue => this.normalizeValidationIssues(issue, source));\n\t\t}\n\n\t\tif (this.isErrorResponse(issues)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tfield: issues.name,\n\t\t\t\t\trule: source,\n\t\t\t\t\tmessage: issues['error-msg'],\n\t\t\t\t\tsource,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\tif (typeof issues === 'object' && 'message' in issues && typeof (issues as ValidationIssue).message === 'string') {\n\t\t\treturn [{ ...(issues as ValidationIssue), source: (issues as ValidationIssue).source || source }];\n\t\t}\n\n\t\tif (typeof issues === 'object') {\n\t\t\treturn Object.entries(issues as Record<string, string>).map(([field, message]) => ({\n\t\t\t\tfield,\n\t\t\t\trule: source,\n\t\t\t\tmessage,\n\t\t\t\tsource,\n\t\t\t}));\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tprivate applyValidationIssue(issue: ValidationIssue, source: ValidationErrorSource): FormFieldElement | null {\n\t\tconst issueSource = issue.source || source;\n\t\tconst rule = issue.rule || issueSource;\n\t\tconst field = issue.field || FORM_ERROR_FIELD;\n\n\t\tif (field === FORM_ERROR_FIELD) {\n\t\t\tthis.setErrorRecord(FORM_ERROR_FIELD, rule, issue.message, issueSource);\n\t\t\tthis.showErrorForm(issue.message);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst $field = this.findFieldByName(field);\n\t\tif (!$field) {\n\t\t\tthis.setErrorRecord(field, rule, issue.message, issueSource);\n\t\t\tconsole.warn(`Не найдено поле с именем: ${field}, для вывода ошибки: ${issue.message}`);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.showFieldError($field, issue.message, issueSource, rule);\n\t\treturn $field;\n\t}\n\n\t/** Показывает несколько ошибок формы или полей: из backend map/array, `ErrorResponse[]` или form validators. */\n\tpublic setErrors(issues: ValidationIssueInput, source: ValidationErrorSource = 'server'): this {\n\t\tthis.normalizeValidationIssues(issues, source).forEach(issue => {\n\t\t\tthis.applyValidationIssue(issue, source);\n\t\t});\n\t\tthis.syncErrorSummary();\n\t\treturn this;\n\t}\n\n\tprivate async validateFormValidators(): Promise<{ ok: boolean; erroredInputs: FormFieldElement[] }> {\n\t\tconst validators = this.config.formValidators\n\t\t\t? Array.isArray(this.config.formValidators)\n\t\t\t\t? this.config.formValidators\n\t\t\t\t: [this.config.formValidators]\n\t\t\t: [];\n\t\tconst erroredInputs: FormFieldElement[] = [];\n\t\tlet ok = true;\n\n\t\tfor (const validator of validators) {\n\t\t\tconst result = await validator({\n\t\t\t\tform: this,\n\t\t\t\tformElement: this.$el,\n\t\t\t\tvalues: this.getValues(),\n\t\t\t\terrors: this.getErrors(),\n\t\t\t});\n\t\t\tconst issues = this.normalizeValidationIssues(result, 'client');\n\t\t\tif (issues.length === 0) continue;\n\n\t\t\tok = false;\n\t\t\tissues.forEach(issue => {\n\t\t\t\tconst $field = this.applyValidationIssue(issue, 'client');\n\t\t\t\tif ($field) erroredInputs.push($field);\n\t\t\t});\n\t\t}\n\n\t\treturn { ok, erroredInputs };\n\t}\n\n\t/** Сбрасывает форму через native `reset()` и опционально очищает ошибки. */\n\tpublic reset(options: FormResetOptions = {}): this {\n\t\tthis.$el.reset();\n\t\tthis.refreshControls();\n\n\t\tif (options.clearErrors !== false) {\n\t\t\tthis.clearErrors();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Обновляет параметры по умолчанию для настроек формы. Метод объединяет переданные параметры с уже существующими\n\t * параметрами по умолчанию.\n\t *\n\t * @param {Partial<FormOptions>} params - Объект, содержащий новые значения параметров. Можно передать только те\n\t * свойства, которые необходимо обновить; остальные сохранятся без изменений.\n\t */\n\tpublic static setDefaultParams(params: Partial<FormOptions>) {\n\t\tthis.defaultParams = { ...this.defaultParams, ...params };\n\t}\n\n\tprivate refreshControls(): void {\n\t\tthis.inputs = this.$el.querySelectorAll(this.config.inputSelector!) as NodeListOf<FormFieldElement>;\n\t}\n\n\tprivate findSubmitElements(): SubmitElement[] {\n\t\treturn Array.from(\n\t\t\tthis.$el.querySelectorAll('input[type=\"submit\"], input[type=\"image\"], button[type=\"submit\"], button:not([type])'),\n\t\t) as SubmitElement[];\n\t}\n\n\tprivate bindSubmitHandlers(): void {\n\t\tif (!this._onSubmitClickHandler) {\n\t\t\tthis._onSubmitClickHandler = async (e: Event) => {\n\t\t\t\tawait this.handleSubmitEvent(e);\n\t\t\t};\n\t\t}\n\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.removeEventListener('click', this._onSubmitClickHandler as EventListener);\n\t\t});\n\n\t\tthis.$submits = this.findSubmitElements();\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.addEventListener('click', this._onSubmitClickHandler as EventListener);\n\t\t});\n\t}\n\n\tprivate initialization() {\n\t\tthis.refreshControls();\n\n\t\tthis._onSubmitHandler = async (e: Event) => {\n\t\t\tawait this.handleSubmitEvent(e);\n\t\t};\n\t\tthis.$el.addEventListener('submit', this._onSubmitHandler as EventListener);\n\t}\n\n\tprivate async handleSubmitEvent(e: Event): Promise<SubmitResult | undefined> {\n\t\te.preventDefault();\n\t\tthis.config.onBeforeValidate?.(this);\n\n\t\tconst isValid = await this.validate();\n\n\t\tthis.config.onAfterValidate?.(isValid, this);\n\n\t\tif (!isValid) {\n\t\t\tthis.config.onValidationError?.(this.getErrors(), this);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: this.getErrors(),\n\t\t\t};\n\t\t}\n\n\t\treturn this.submit();\n\t}\n\n\tprivate normalizeTriggers(\n\t\tvalue: ValidationTrigger | ValidationTrigger[] | undefined,\n\t\tfallback: ValidationTrigger[],\n\t): ValidationTrigger[] {\n\t\tconst triggers = value == null ? fallback : Array.isArray(value) ? value : [value];\n\t\treturn Array.from(new Set(triggers));\n\t}\n\n\tprivate clearFieldValidationEvents(): void {\n\t\tthis.fieldEventHandlers.forEach(({ $input, event, handler }) => {\n\t\t\t$input.removeEventListener(event, handler);\n\t\t});\n\t\tthis.fieldEventHandlers = [];\n\t}\n\n\tprivate bindFieldValidationEvents(): void {\n\t\tthis.clearFieldValidationEvents();\n\n\t\tconst validateOn = this.normalizeTriggers(this.config.validateOn, ['submit']).filter(\n\t\t\t(event): event is Exclude<ValidationTrigger, 'submit'> => event !== 'submit',\n\t\t);\n\t\tconst revalidateOn = this.normalizeTriggers(this.config.revalidateOn, ['input', 'change']).filter(\n\t\t\t(event): event is Exclude<ValidationTrigger, 'submit'> => event !== 'submit',\n\t\t);\n\t\tconst events = Array.from(new Set([...validateOn, ...revalidateOn]));\n\t\tif (events.length === 0) return;\n\n\t\tconst fields = this.getAllFields();\n\t\tfields.forEach($input => {\n\t\t\tevents.forEach(event => {\n\t\t\t\tconst handler: EventListener = () => {\n\t\t\t\t\tconst shouldValidate = validateOn.includes(event) || this.hasFieldError($input);\n\t\t\t\t\tif (shouldValidate) this.scheduleFieldValidation($input);\n\t\t\t\t};\n\n\t\t\t\t$input.addEventListener(event, handler);\n\t\t\t\tthis.fieldEventHandlers.push({ $input, event, handler });\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate scheduleFieldValidation($input: FormFieldElement): void {\n\t\tconst currentTimer = this.liveValidationTimers.get($input);\n\t\tif (currentTimer) clearTimeout(currentTimer);\n\n\t\tconst delay = Math.max(0, Number(this.config.validationDebounce) || 0);\n\t\tconst run = () => {\n\t\t\tvoid this.validateField($input);\n\t\t};\n\n\t\tif (delay === 0) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setTimeout(run, delay);\n\t\tthis.liveValidationTimers.set($input, timer);\n\t}\n\n\tprivate setupMutationObserver(): void {\n\t\tthis.mutationObserver?.disconnect();\n\t\tthis.mutationObserver = undefined;\n\n\t\tif (!this.config.observeMutations || typeof MutationObserver === 'undefined') return;\n\n\t\tthis.mutationObserver = new MutationObserver(() => {\n\t\t\tthis.refreshControls();\n\t\t\tthis.bindSubmitHandlers();\n\t\t\tthis.bindFieldValidationEvents();\n\t\t});\n\t\tthis.mutationObserver.observe(this.$el, {\n\t\t\tchildList: true,\n\t\t\tsubtree: true,\n\t\t});\n\t}\n\n\tprivate getErrorContainer($input: FormFieldElement): HTMLElement | null {\n\t\tconst attrName = this.config.errorContainerAttribute || 'data-error-container';\n\t\tconst selector = $input.getAttribute(attrName);\n\t\tif (!selector) return null;\n\n\t\ttry {\n\t\t\treturn document.querySelector(selector) as HTMLElement | null;\n\t\t} catch {\n\t\t\tconsole.warn(`[FormFather] Invalid error container selector \"${selector}\"`);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate toSafeIdPart(value: string): string {\n\t\tconst normalized = value.trim().toLowerCase().replace(/[^a-z0-9_-]+/gi, '-');\n\t\tlet start = 0;\n\t\tlet end = normalized.length;\n\n\t\twhile (start < end && normalized[start] === '-') {\n\t\t\tstart += 1;\n\t\t}\n\n\t\twhile (end > start && normalized[end - 1] === '-') {\n\t\t\tend -= 1;\n\t\t}\n\n\t\treturn normalized.slice(start, end) || 'field';\n\t}\n\n\tprivate createErrorId($input: FormFieldElement): string {\n\t\tconst prefix = this.config.errorIdPrefix || 'form-father-error';\n\t\treturn `${this.toSafeIdPart(prefix)}-${this.toSafeIdPart(this.getFieldKey($input))}-${++errorIdCounter}`;\n\t}\n\n\tprivate ensureElementId($input: FormFieldElement, $error: HTMLElement): string {\n\t\tif (!$error.id) {\n\t\t\t$error.id = $input.getAttribute(ERROR_DESCRIBEDBY_ID_ATTRIBUTE) || this.createErrorId($input);\n\t\t}\n\t\treturn $error.id;\n\t}\n\n\tprivate addErrorDescription($input: FormFieldElement, $error: HTMLElement): void {\n\t\tif (!$error.hasAttribute('role')) $error.setAttribute('role', 'alert');\n\n\t\tconst errorId = this.ensureElementId($input, $error);\n\t\t$input.setAttribute(ERROR_DESCRIBEDBY_ID_ATTRIBUTE, errorId);\n\n\t\tif (this.config.ariaDescribeErrors === false) return;\n\n\t\tconst currentIds = ($input.getAttribute('aria-describedby') || '').split(/\\s+/).filter(Boolean);\n\t\tif (!currentIds.includes(errorId)) {\n\t\t\t$input.setAttribute('aria-describedby', [...currentIds, errorId].join(' '));\n\t\t\t$input.setAttribute(ADDED_DESCRIBEDBY_ID_ATTRIBUTE, errorId);\n\t\t}\n\t}\n\n\tprivate removeErrorDescription($input: FormFieldElement): void {\n\t\tconst addedId = $input.getAttribute(ADDED_DESCRIBEDBY_ID_ATTRIBUTE);\n\t\tif (addedId) {\n\t\t\tconst nextIds = ($input.getAttribute('aria-describedby') || '')\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter(id => id && id !== addedId);\n\n\t\t\tif (nextIds.length > 0) {\n\t\t\t\t$input.setAttribute('aria-describedby', nextIds.join(' '));\n\t\t\t} else {\n\t\t\t\t$input.removeAttribute('aria-describedby');\n\t\t\t}\n\t\t}\n\n\t\t$input.removeAttribute(ERROR_DESCRIBEDBY_ID_ATTRIBUTE);\n\t\t$input.removeAttribute(ADDED_DESCRIBEDBY_ID_ATTRIBUTE);\n\t}\n\n\t/**\n\t * Показывает ошибку для поля ввода.\n\t *\n\t * @param {HTMLInputElement} $input - Поле ввода.\n\t * @param {String} text - Текст ошибки.\n\t */\n\tprivate showError($input: FormFieldElement, text: string) {\n\t\t$input.setAttribute('aria-invalid', 'true');\n\n\t\tconst $errorContainer = this.getErrorContainer($input);\n\t\tif ($errorContainer) {\n\t\t\t$errorContainer.textContent = text;\n\t\t\tthis.addErrorDescription($input, $errorContainer);\n\t\t\t$errorContainer.removeAttribute('hidden');\n\t\t\treturn;\n\t\t}\n\n\t\tconst $inputWrapper = closest($input, this.config.inputWrapperSelector!);\n\t\tif (!$inputWrapper) {\n\t\t\tconsole.warn(`Не найдена обёртка для поля с именем: ${$input.name || $input.type}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst customShowError = ($inputWrapper as any).showError;\n\t\tif (typeof customShowError === 'function') {\n\t\t\tcustomShowError.call($inputWrapper, text);\n\t\t\tconst $customError = $inputWrapper.querySelector('[data-form-father-error]') as HTMLElement | null;\n\t\t\tif ($customError) this.addErrorDescription($input, $customError);\n\t\t\treturn;\n\t\t}\n\n\t\t$inputWrapper.classList.add('input__wrapper--error');\n\n\t\tlet $error = $inputWrapper.querySelector('[data-form-father-error]') as HTMLElement | null;\n\t\tif (!$error) {\n\t\t\t$error = document.createElement('div');\n\t\t\t$error.setAttribute('data-form-father-error', '');\n\t\t\t$error.setAttribute('role', 'alert');\n\t\t\t$input.insertAdjacentElement('afterend', $error);\n\t\t}\n\t\t$error.textContent = text;\n\t\tthis.addErrorDescription($input, $error);\n\t}\n\n\t/** Показывает лоадер */\n\tprivate showLoader() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.classList.add('button--loading');\n\n\t\t\tif ($submit.querySelector('.button__loader')) return;\n\n\t\t\tconst gradientId = `form-father-loader-${loaderIdCounter++}`;\n\t\t\tconst loaderSvg = `\n\t\t\t\t<svg height=\"38\" viewBox=\"0 0 38 38\" width=\"38\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t<defs>\n\t\t\t\t\t<linearGradient id=\"${gradientId}\" x1=\"8.042%\" x2=\"65.682%\" y1=\"0%\" y2=\"23.865%\">\n\t\t\t\t\t\t<stop offset=\"0%\" stop-color=\"${this.config.loaderColor}\" stop-opacity=\"0\"/>\n\t\t\t\t\t\t<stop offset=\"63.146%\" stop-color=\"${this.config.loaderColor}\" stop-opacity=\".631\"/>\n\t\t\t\t\t\t<stop offset=\"100%\" stop-color=\"${this.config.loaderColor}\"/>\n\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<g fill-rule=\"evenodd\" fill=\"none\">\n\t\t\t\t\t<g transform=\"translate(1 1)\">\n\t\t\t\t\t\t<path d=\"M36 18c0-9.94-8.06-18-18-18\" id=\"Oval-2\" stroke-width=\"5\" stroke=\"url(#${gradientId})\"></path>\n\t\t\t\t\t\t<circle cx=\"36\" cy=\"18\" fill=\"${this.config.loaderColor}\" r=\"1\"></circle>\n\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t`;\n\n\t\t\tconst $loaderEl = document.createElement('span');\n\t\t\t$loaderEl.innerHTML = loaderSvg;\n\t\t\t$loaderEl.className = 'button__loader';\n\t\t\t$submit.insertAdjacentElement('afterbegin', $loaderEl);\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\t$loaderEl.setAttribute('data-showed', '');\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Скрывает лоадер */\n\tprivate hideLoader() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.classList.remove('button--loading');\n\t\t\tconst $loader = $submit.querySelector('.button__loader') as HTMLElement | null;\n\t\t\tif ($loader) {\n\t\t\t\t$loader.classList.remove('active');\n\t\t\t\t$loader.removeAttribute('data-showed');\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t$loader.remove();\n\t\t\t\t}, 250);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Скрывает ошибку.\n\t *\n\t * @param {HTMLInputElement} $input - Поле ввода.\n\t */\n\tprivate hideError($input: FormFieldElement) {\n\t\tconst $inputWrapper = closest($input, this.config.inputWrapperSelector!) || $input.parentElement;\n\t\tconst $errorContainer = this.getErrorContainer($input);\n\n\t\t$input.removeAttribute('aria-invalid');\n\t\tthis.removeErrorDescription($input);\n\t\tif ($errorContainer) {\n\t\t\t$errorContainer.textContent = '';\n\t\t\t$errorContainer.setAttribute('hidden', '');\n\t\t}\n\t\t$inputWrapper?.querySelector('[data-form-father-error]')?.remove();\n\t\t$inputWrapper?.classList.remove('input__wrapper--error');\n\n\t\tif ($inputWrapper && $inputWrapper.classList.contains('input__wrapper')) {\n\t\t\tconst dataTypeError = $inputWrapper.getAttribute('data-type-error') || 'default';\n\n\t\t\tif (dataTypeError === 'default') {\n\t\t\t\t// Init error elements\n\t\t\t\t// const { $inputErrorIcon, $inputErrorBadge } = this.initErrorElements($inputWrapper, dataTypeError);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getErrorSummaryOptions(): ErrorSummaryOptions | null {\n\t\tif (!this.config.errorSummary) return null;\n\t\treturn this.config.errorSummary === true ? {} : this.config.errorSummary;\n\t}\n\n\tprivate getErrorSummaryContainer(options: ErrorSummaryOptions, create: boolean): HTMLElement | null {\n\t\tif (options.selector) {\n\t\t\ttry {\n\t\t\t\treturn (\n\t\t\t\t\t(this.$el.querySelector(options.selector) as HTMLElement | null) ||\n\t\t\t\t\t(document.querySelector(options.selector) as HTMLElement | null)\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tconsole.warn(`[FormFather] Invalid error summary selector \"${options.selector}\"`);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tconst existing = this.$el.querySelector(`[${ERROR_SUMMARY_ATTRIBUTE}]`) as HTMLElement | null;\n\t\tif (existing || !create) return existing;\n\n\t\tconst $summary = document.createElement('div');\n\t\t$summary.setAttribute(ERROR_SUMMARY_ATTRIBUTE, '');\n\t\tthis.$el.insertAdjacentElement('afterbegin', $summary);\n\t\treturn $summary;\n\t}\n\n\tprivate prepareErrorSummaryContainer($summary: HTMLElement): void {\n\t\t$summary.setAttribute(ERROR_SUMMARY_ATTRIBUTE, '');\n\t\tif (!$summary.hasAttribute('role')) $summary.setAttribute('role', 'alert');\n\t\tif (!$summary.hasAttribute('tabindex')) $summary.setAttribute('tabindex', '-1');\n\t\t$summary.removeAttribute('hidden');\n\t}\n\n\tprivate focusErrorSummary($summary: HTMLElement): void {\n\t\ttry {\n\t\t\t$summary.focus({ preventScroll: true });\n\t\t} catch {\n\t\t\t$summary.focus();\n\t\t}\n\t}\n\n\tprivate focusFieldFromSummary($field: FormFieldElement): void {\n\t\tif (typeof $field.scrollIntoView === 'function') {\n\t\t\t$field.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\t\t}\n\n\t\ttry {\n\t\t\t$field.focus({ preventScroll: true });\n\t\t} catch {\n\t\t\t$field.focus();\n\t\t}\n\t}\n\n\tprivate renderDefaultErrorSummary($summary: HTMLElement, errors: ValidationError[], options: ErrorSummaryOptions): void {\n\t\t$summary.textContent = '';\n\n\t\tconst $title = document.createElement('p');\n\t\t$title.setAttribute('data-form-father-summary-title', '');\n\t\t$title.textContent = options.title || 'Проверьте поля формы';\n\n\t\tconst $list = document.createElement('ul');\n\t\t$list.setAttribute('data-form-father-summary-list', '');\n\n\t\terrors.forEach(error => {\n\t\t\tconst $item = document.createElement('li');\n\t\t\tconst $field = error.field === FORM_ERROR_FIELD ? null : this.findFieldByName(error.field);\n\n\t\t\tif ($field) {\n\t\t\t\tconst $button = document.createElement('button');\n\t\t\t\t$button.type = 'button';\n\t\t\t\t$button.setAttribute('data-form-father-summary-field', error.field);\n\t\t\t\t$button.textContent = error.message;\n\t\t\t\t$button.addEventListener('click', () => this.focusFieldFromSummary($field));\n\t\t\t\t$item.appendChild($button);\n\t\t\t} else {\n\t\t\t\tconst $message = document.createElement('span');\n\t\t\t\t$message.textContent = error.message;\n\t\t\t\t$item.appendChild($message);\n\t\t\t}\n\n\t\t\t$list.appendChild($item);\n\t\t});\n\n\t\t$summary.append($title, $list);\n\t}\n\n\tprivate renderErrorSummary(errors: ValidationError[] = this.getErrors()): void {\n\t\tconst options = this.getErrorSummaryOptions();\n\t\tif (!options) return;\n\n\t\tif (errors.length === 0) {\n\t\t\tthis.hideErrorSummary();\n\t\t\treturn;\n\t\t}\n\n\t\tconst $summary = this.getErrorSummaryContainer(options, true);\n\t\tif (!$summary) return;\n\n\t\tthis.prepareErrorSummaryContainer($summary);\n\n\t\tconst rendered = options.render?.(errors.map(error => ({ ...error })), this);\n\t\tif (rendered instanceof HTMLElement) {\n\t\t\t$summary.replaceChildren(rendered);\n\t\t} else if (typeof rendered === 'string') {\n\t\t\t$summary.innerHTML = rendered;\n\t\t} else if (!options.render) {\n\t\t\tthis.renderDefaultErrorSummary($summary, errors, options);\n\t\t}\n\n\t\tif (options.focus) this.focusErrorSummary($summary);\n\t}\n\n\tprivate hideErrorSummary(): void {\n\t\tconst options = this.getErrorSummaryOptions() || {};\n\t\tconst $summary = this.getErrorSummaryContainer(options, false);\n\t\tif (!$summary) return;\n\n\t\t$summary.replaceChildren();\n\t\t$summary.setAttribute('hidden', '');\n\t}\n\n\tprivate syncErrorSummary(): void {\n\t\tif (this.errors.length === 0) {\n\t\t\tthis.hideErrorSummary();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.renderErrorSummary();\n\t}\n\n\t/**\n\t * Проскроливает до первого ошибочного поля.\n\t *\n\t * @param {HTMLElement[]} inputsList - Массив элементов с ошибкой.\n\t */\n\tprivate scrollToFirstErroredInput(inputsList: HTMLElement[]) {\n\t\tif (inputsList.length > 0) {\n\t\t\tconst allInputInFormList = Array.from(this.$el.querySelectorAll('input, textarea, select'));\n\t\t\tlet $firstInputOnForm: HTMLElement | null = null;\n\t\t\tlet minIndex = Infinity;\n\n\t\t\tinputsList.forEach($input => {\n\t\t\t\tconst findIndex = allInputInFormList.findIndex($item => $item === $input);\n\t\t\t\tif (findIndex < minIndex) {\n\t\t\t\t\tminIndex = findIndex;\n\t\t\t\t\t$firstInputOnForm = $input;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif ($firstInputOnForm) {\n\t\t\t\tconst rect = ($firstInputOnForm as HTMLElement).getBoundingClientRect();\n\t\t\t\tconst scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\t\t\t\tconst scrollTargetY = rect.top + scrollTop - window.innerHeight / 2;\n\n\t\t\t\tdocument.documentElement.setAttribute('data-now-scrolling', '');\n\n\t\t\t\twindow.scrollTo({\n\t\t\t\t\ttop: scrollTargetY,\n\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdocument.documentElement.removeAttribute('data-now-scrolling');\n\t\t\t\t}, 800);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate focusFirstErroredInput(inputsList: HTMLElement[]) {\n\t\tif (inputsList.length === 0) return;\n\n\t\tconst allInputInFormList = Array.from(this.$el.querySelectorAll('input, textarea, select'));\n\t\tconst $firstInputOnForm = inputsList\n\t\t\t.slice()\n\t\t\t.sort((a, b) => allInputInFormList.indexOf(a) - allInputInFormList.indexOf(b))[0] as HTMLElement | undefined;\n\n\t\t$firstInputOnForm?.focus?.({ preventScroll: true });\n\t}\n\n\tprivate getValidationSchema(): ValidationSchema {\n\t\treturn {\n\t\t\t...(Form.defaultValidationSchema || {}),\n\t\t\t...(this.config.validationSchema || {}),\n\t\t};\n\t}\n\n\tprivate getAllFields($block: HTMLElement = this.$el): FormFieldElement[] {\n\t\treturn Array.from($block.querySelectorAll<FormFieldElement>('input, textarea, select'));\n\t}\n\n\tprivate getFieldKey($input: FormFieldElement): string {\n\t\treturn $input.name || $input.id || $input.getAttribute('data-field') || $input.type || 'field';\n\t}\n\n\tprivate hasFieldError($input: FormFieldElement): boolean {\n\t\tconst field = this.getFieldKey($input);\n\t\treturn $input.getAttribute('aria-invalid') === 'true' || this.errors.some(error => error.field === field);\n\t}\n\n\tprivate clearFieldErrorRecord($input: FormFieldElement): void {\n\t\tconst field = this.getFieldKey($input);\n\t\tthis.errors = this.errors.filter(error => error.field !== field);\n\t}\n\n\tprivate setErrorRecord(field: string, rule: string, message: string, source: ValidationErrorSource): void {\n\t\tthis.errors.push({\n\t\t\tfield,\n\t\t\trule,\n\t\t\tmessage,\n\t\t\tsource,\n\t\t});\n\t}\n\n\tprivate getValidationStateAttribute(): string {\n\t\treturn this.config.validationStateAttribute || 'data-form-father-state';\n\t}\n\n\tprivate setFieldValidationState($input: FormFieldElement, state: 'validating' | 'valid' | 'invalid' | null): void {\n\t\tconst attr = this.getValidationStateAttribute();\n\t\tif (state) {\n\t\t\t$input.setAttribute(attr, state);\n\t\t} else {\n\t\t\t$input.removeAttribute(attr);\n\t\t}\n\t}\n\n\tprivate startFieldValidation($input: FormFieldElement): number {\n\t\tconst token = ++this.fieldValidationTokenCounter;\n\t\tthis.fieldValidationTokens.set($input, token);\n\t\t$input.setAttribute('aria-busy', 'true');\n\t\tthis.setFieldValidationState($input, 'validating');\n\t\treturn token;\n\t}\n\n\tprivate isLatestFieldValidation($input: FormFieldElement, token?: number): boolean {\n\t\treturn token == null || this.fieldValidationTokens.get($input) === token;\n\t}\n\n\tprivate finishFieldValidation($input: FormFieldElement, token: number, isValid: boolean): void {\n\t\tif (!this.isLatestFieldValidation($input, token)) return;\n\n\t\t$input.removeAttribute('aria-busy');\n\t\tthis.setFieldValidationState($input, isValid ? 'valid' : 'invalid');\n\t}\n\n\tprivate clearFieldValidationState($input: FormFieldElement): void {\n\t\tthis.fieldValidationTokens.delete($input);\n\t\t$input.removeAttribute('aria-busy');\n\t\tthis.setFieldValidationState($input, null);\n\t}\n\n\tprivate setValidationError(\n\t\t$input: FormFieldElement,\n\t\trule: string,\n\t\tmessage: string,\n\t\tsource: ValidationErrorSource,\n\t): void {\n\t\tthis.clearFieldErrorRecord($input);\n\t\tthis.setErrorRecord(this.getFieldKey($input), rule, message, source);\n\t}\n\n\tprivate resolveField(field: FieldReference): FormFieldElement | null {\n\t\tif (typeof field !== 'string') return field;\n\t\treturn this.findFieldByName(field);\n\t}\n\n\tprivate parseRuleString(ruleString: string): ValidationRule {\n\t\tconst [rule, ...params] = ruleString.split(':').map(s => s.trim());\n\t\treturn params.length > 0 ? { rule, params: params.length === 1 ? params[0] : params } : rule;\n\t}\n\n\tprivate parseValidationAttribute(value: string | null): ValidationRule[] {\n\t\treturn (value ?? '')\n\t\t\t.split(/[,\\s|]+/)\n\t\t\t.map(s => s.trim())\n\t\t\t.filter(Boolean)\n\t\t\t.map(ruleString => this.parseRuleString(ruleString));\n\t}\n\n\tprivate getRuleName(rule: ValidationRule): string {\n\t\treturn typeof rule === 'string' ? rule : rule.rule;\n\t}\n\n\tprivate getRuleIdentity(rule: ValidationRule): string {\n\t\treturn JSON.stringify(rule);\n\t}\n\n\tprivate collectRules(\n\t\t$input: FormFieldElement,\n\t\tfromSchema: ValidationRule[] = [],\n\t\tschemaKeys: Set<string> = new Set(),\n\t): ValidationRule[] {\n\t\tconst list: ValidationRule[] = [];\n\n\t\tif ($input.hasAttribute('required')) list.push('required');\n\t\tlist.push(...fromSchema);\n\n\t\tconst dataValidateRules = this.parseValidationAttribute($input.getAttribute('data-validate')).filter(rule => {\n\t\t\tconst ruleName = this.getRuleName(rule);\n\t\t\treturn getValidator(ruleName) || !schemaKeys.has(ruleName);\n\t\t});\n\t\tlist.push(...dataValidateRules);\n\t\tlist.push(...this.parseValidationAttribute($input.getAttribute('data-custom-validate')));\n\n\t\tconst filtered: ValidationRule[] = [];\n\t\tconst seen = new Set<string>();\n\t\tfor (const rule of list) {\n\t\t\tconst ruleName = this.getRuleName(rule);\n\t\t\tif (!getValidator(ruleName)) {\n\t\t\t\tconsole.warn(`[FormFather] Unknown validation rule \"${ruleName}\"`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst identity = this.getRuleIdentity(rule);\n\t\t\tif (seen.has(identity)) continue;\n\t\t\tseen.add(identity);\n\t\t\tfiltered.push(rule);\n\t\t}\n\n\t\treturn filtered;\n\t}\n\n\tprivate getRuleMessage(\n\t\t$input: FormFieldElement,\n\t\trule: string,\n\t\tmessages: Record<string, string>,\n\t\tdefaultMessage: string,\n\t\toverrideMessage?: string,\n\t): string {\n\t\tconst attrMessage = $input.getAttribute(`data-error-${rule}`);\n\t\treturn overrideMessage || attrMessage || messages[rule] || defaultMessage;\n\t}\n\n\tprivate fieldMatchesSchemaDefinition(\n\t\t$input: FormFieldElement,\n\t\tkey: string,\n\t\tdef: ValidationSchema[string],\n\t): boolean {\n\t\tif (def.selector) {\n\t\t\ttry {\n\t\t\t\treturn $input.matches(def.selector);\n\t\t\t} catch {\n\t\t\t\tconsole.warn(`[FormFather] Invalid validation selector \"${def.selector}\"`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn this.parseValidationAttribute($input.getAttribute('data-validate')).some(rule => this.getRuleName(rule) === key);\n\t}\n\n\tprivate getFieldValidationConfig(\n\t\t$input: FormFieldElement,\n\t\tschema: ValidationSchema = this.getValidationSchema(),\n\t): { rules: ValidationRule[]; messages: Record<string, string> } {\n\t\tconst rules: ValidationRule[] = [];\n\t\tconst messages: Record<string, string> = {};\n\n\t\tfor (const [key, def] of Object.entries(schema)) {\n\t\t\tif (!this.fieldMatchesSchemaDefinition($input, key, def)) continue;\n\t\t\trules.push(...def.rules);\n\t\t\tObject.assign(messages, def.messages || {});\n\t\t}\n\n\t\treturn {\n\t\t\trules: this.collectRules($input, rules, new Set(Object.keys(schema))),\n\t\t\tmessages,\n\t\t};\n\t}\n\n\tprivate getValidationFields($block: HTMLElement, schema: ValidationSchema): FormFieldElement[] {\n\t\tconst fields = new Set<FormFieldElement>();\n\t\tconst addFields = (nodeList: NodeListOf<Element>) => {\n\t\t\tArray.from(nodeList).forEach($input => {\n\t\t\t\tif (\n\t\t\t\t\t$input instanceof HTMLInputElement ||\n\t\t\t\t\t$input instanceof HTMLTextAreaElement ||\n\t\t\t\t\t$input instanceof HTMLSelectElement\n\t\t\t\t) {\n\t\t\t\t\tfields.add($input);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tfor (const [key, def] of Object.entries(schema)) {\n\t\t\tif (def.selector) {\n\t\t\t\ttry {\n\t\t\t\t\taddFields($block.querySelectorAll(def.selector));\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.warn(`[FormFather] Invalid validation selector \"${def.selector}\"`);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.getAllFields($block)\n\t\t\t\t.filter($input =>\n\t\t\t\t\tthis.parseValidationAttribute($input.getAttribute('data-validate')).some(rule => this.getRuleName(rule) === key),\n\t\t\t\t)\n\t\t\t\t.forEach($input => fields.add($input));\n\t\t}\n\n\t\taddFields($block.querySelectorAll('[required], [data-validate], [data-custom-validate]'));\n\t\treturn Array.from(fields);\n\t}\n\n\tprivate async validateInput(\n\t\t$input: FormFieldElement,\n\t\trules: ValidationRule[],\n\t\tmessages: Record<string, string> = {},\n\t\t$block: HTMLElement = this.$el,\n\t\tvalidationToken?: number,\n\t): Promise<boolean> {\n\t\tif ($input.hasAttribute('data-no-validate')) return true;\n\n\t\tconst isCheckable =\n\t\t\t$input instanceof HTMLInputElement && ($input.type === 'checkbox' || $input.type === 'radio');\n\t\tconst empty = isCheckable ? !$input.checked : $input.value.trim().length === 0;\n\t\tconst hasRequiredRule = rules.some(rule => this.getRuleName(rule) === 'required');\n\n\t\tif (empty && !hasRequiredRule) {\n\t\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\t\t\tthis.clearFieldErrorRecord($input);\n\t\t\tthis.hideError($input);\n\t\t\treturn true;\n\t\t}\n\n\t\tfor (const validationRule of rules) {\n\t\t\tconst { rule, params } =\n\t\t\t\ttypeof validationRule === 'string'\n\t\t\t\t\t? { rule: validationRule, params: undefined }\n\t\t\t\t\t: { rule: validationRule.rule, params: validationRule.params };\n\t\t\tconst validator = getValidator(rule);\n\t\t\tif (!validator) continue;\n\n\t\t\tconst raw = await validator.fn($input.value, $input, $block, params);\n\t\t\tconst isObjectResult = typeof raw === 'object' && raw !== null;\n\t\t\tconst passed = isObjectResult ? (raw as any).valid === true : !!raw;\n\n\t\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\n\t\t\tif (isObjectResult && (raw as any).effect) {\n\t\t\t\tawait (raw as any).effect({\n\t\t\t\t\tvalue: $input.value,\n\t\t\t\t\t$input,\n\t\t\t\t\t$form: $block,\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\n\t\t\tif (!passed) {\n\t\t\t\tconst result = raw as any;\n\t\t\t\tconst message = this.getRuleMessage(\n\t\t\t\t\t$input,\n\t\t\t\t\trule,\n\t\t\t\t\tmessages,\n\t\t\t\t\tvalidator.defaultMessage,\n\t\t\t\t\tisObjectResult && typeof result.message === 'string' ? result.message : undefined,\n\t\t\t\t);\n\n\t\t\t\tthis.setValidationError($input, rule, message, 'client');\n\t\t\t\tthis.showError($input, message);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (isObjectResult && (raw as any).stopOthers) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\t\tthis.clearFieldErrorRecord($input);\n\t\tthis.hideError($input);\n\t\treturn true;\n\t}\n\n\tprivate async runFieldValidation(\n\t\t$input: FormFieldElement,\n\t\trules: ValidationRule[],\n\t\tmessages: Record<string, string> = {},\n\t\t$block: HTMLElement = this.$el,\n\t): Promise<boolean> {\n\t\tconst validationToken = this.startFieldValidation($input);\n\n\t\ttry {\n\t\t\tconst isValid = await this.validateInput($input, rules, messages, $block, validationToken);\n\t\t\tthis.finishFieldValidation($input, validationToken, isValid);\n\t\t\treturn isValid;\n\t\t} catch (error) {\n\t\t\tif (this.isLatestFieldValidation($input, validationToken)) {\n\t\t\t\tthis.clearFieldValidationState($input);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate getRadioGroup($input: FormFieldElement, $block: HTMLElement): HTMLInputElement[] {\n\t\tif (!($input instanceof HTMLInputElement) || $input.type !== 'radio' || !$input.name) return [];\n\n\t\treturn Array.from($block.querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')).filter(\n\t\t\t$radio => $radio.name === $input.name,\n\t\t);\n\t}\n\n\t/** Показывает ошибку конкретного поля по имени или DOM-элементу. */\n\tpublic showFieldError(\n\t\tfield: FieldReference,\n\t\tmessage: string,\n\t\tsource: ValidationErrorSource = 'manual',\n\t\trule: string = source,\n\t): boolean {\n\t\tconst $field = this.resolveField(field);\n\t\tif (!$field) {\n\t\t\tconsole.warn(`[FormFather] Field \"${String(field)}\" not found`);\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.setValidationError($field, rule, message, source);\n\t\tthis.showError($field, message);\n\t\t$field.removeAttribute('aria-busy');\n\t\tthis.setFieldValidationState($field, 'invalid');\n\t\tthis.syncErrorSummary();\n\t\treturn true;\n\t}\n\n\t/** Проверяет одно поле по имени или DOM-элементу. */\n\tpublic async validateField(field: FieldReference): Promise<boolean> {\n\t\tconst $field = this.resolveField(field);\n\t\tif (!$field) {\n\t\t\tconsole.warn(`[FormFather] Field \"${String(field)}\" not found`);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { rules, messages } = this.getFieldValidationConfig($field);\n\t\tconst isValid = await this.runFieldValidation($field, rules, messages);\n\t\tthis.syncErrorSummary();\n\t\treturn isValid;\n\t}\n\n\t/**\n\t * Проверяет все поля ввода.\n\t *\n\t * Порядок для каждого поля:\n\t *\n\t * 1. `required` — если атрибут `required`\n\t * 2. правила из `validationSchema`\n\t * 3. правила из `data-validate`\n\t * 4. правила из `data-custom-validate`\n\t *\n\t * Для одного поля показывается только первая ошибка. Неизвестные правила фиксируются `console.warn` и исключаются ДО\n\t * валидации.\n\t */\n\tasync validate($block: HTMLElement = this.$el): Promise<boolean> {\n\t\tconst schema = this.getValidationSchema();\n\t\tconst erroredInputs: FormFieldElement[] = [];\n\t\tconst processed = new WeakSet<FormFieldElement>();\n\t\tlet ok = true;\n\n\t\tthis.errors = [];\n\n\t\tfor (const $input of this.getValidationFields($block, schema)) {\n\t\t\tif (processed.has($input)) continue;\n\n\t\t\tconst radioGroup = this.getRadioGroup($input, $block);\n\t\t\tif (radioGroup.length > 0) {\n\t\t\t\tradioGroup.forEach($radio => processed.add($radio));\n\t\t\t} else {\n\t\t\t\tprocessed.add($input);\n\t\t\t}\n\n\t\t\tconst { rules, messages } = this.getFieldValidationConfig($input, schema);\n\t\t\tconst fieldValid = await this.runFieldValidation($input, rules, messages, $block);\n\t\t\tif (!fieldValid) {\n\t\t\t\tok = false;\n\t\t\t\terroredInputs.push($input);\n\t\t\t}\n\t\t}\n\n\t\tconst formValidation = await this.validateFormValidators();\n\t\tif (!formValidation.ok) {\n\t\t\tok = false;\n\t\t\terroredInputs.push(...formValidation.erroredInputs);\n\t\t}\n\n\t\tconst visibleErroredInputs = erroredInputs.filter(item => !item.hasAttribute('data-no-error-scroll'));\n\t\tif (!ok && this.config.scrollToFirstErroredInput) {\n\t\t\tthis.scrollToFirstErroredInput(visibleErroredInputs);\n\t\t}\n\t\tif (!ok && this.config.focusFirstErroredInput) {\n\t\t\tthis.focusFirstErroredInput(visibleErroredInputs);\n\t\t}\n\n\t\tif (ok) {\n\t\t\tthis.hideErrorSummary();\n\t\t} else {\n\t\t\tthis.renderErrorSummary();\n\t\t}\n\n\t\treturn ok;\n\t}\n\n\t/** Блокирует кнопку отправки данных. */\n\tprivate disableSubmit() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.setAttribute('disabled', '');\n\t\t});\n\t}\n\n\t/** Снимает блокировку с кнопки отправки данных. */\n\tprivate enableSubmit() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.removeAttribute('disabled');\n\t\t});\n\t}\n\n\t/** Очищает поля ввода формы. */\n\tpublic clearInputs() {\n\t\tthis.inputs?.forEach($inputEl => {\n\t\t\tconst $input = $inputEl as HTMLInputElement;\n\t\t\tif ($input.type === 'radio' || $input.type === 'checkbox') {\n\t\t\t\t$input.checked = false;\n\t\t\t} else {\n\t\t\t\t$input.value = '';\n\t\t\t\t$input.parentElement?.classList.remove('filled');\n\t\t\t\t$input.dispatchEvent(new Event('input'));\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Общие настройки анимаций (можно подправить под вкус) */\n\tprivate readonly _anim = {\n\t\tduration: 220,\n\t\teasing: 'ease',\n\t\tpaddingTopOpened: 16,\n\t\ticonDuration: 700,\n\t};\n\n\tprivate _prefersReducedMotion(): boolean {\n\t\treturn typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n\t}\n\n\tprivate _canAnimate(el?: Element | null): boolean {\n\t\treturn !!(el && 'animate' in el && !this._prefersReducedMotion());\n\t}\n\n\tprivate _cancelAnimations(el: Element | null | undefined) {\n\t\t// Отменяем все активные WAAPI-анимации у элемента\n\t\tconst animatedEl = el as (Element & { getAnimations?: () => Animation[] }) | null | undefined;\n\t\tanimatedEl?.getAnimations?.().forEach(animation => animation.cancel());\n\t}\n\n\t/**\n\t * Показывает ошибку под полями ввода - ошибку, относящуюся ко всей форме.\n\t *\n\t * @param {String} text - Текст ошибки.\n\t */\n\tprivate showErrorForm(text: string) {\n\t\tconst inputWrappersList = this.$el.querySelectorAll(this.config.inputWrapperSelector!);\n\t\tconst $lastInputWrapper = inputWrappersList[inputWrappersList.length - 1] as HTMLElement | undefined;\n\t\tlet $errorWrapper = this.$el.querySelector('.error-block-under-input__wrapper') as HTMLElement | null;\n\n\t\tif (!$errorWrapper || ($lastInputWrapper && !($lastInputWrapper.nextElementSibling === $errorWrapper))) {\n\t\t\t$errorWrapper = document.createElement('div');\n\t\t\t$errorWrapper.className = 'error-block-under-input__wrapper';\n\t\t\t$errorWrapper.innerHTML = `\n <div class=\"error-block-under-input error-block-under-input--warning\" style=\"display:grid;grid-template-columns:auto 1fr;gap:8px;align-items:start;\">\n <div class=\"error-block-under-input__icon-wrapper\" style=\"position:relative;width:20px;height:20px;\">\n <span class=\"error-block-under-input__icon\" style=\"display:block;width:20px;height:20px;\"></span>\n <span class=\"error-block-under-input__icon error-block-under-input__icon--animated\" style=\"display:block;position:absolute;inset:0;\"></span>\n </div>\n <p class=\"error-block-under-input__text\" style=\"margin:0;\">\n <span class=\"error-block-under-input__main-text\"></span>\n <span class=\"error-block-under-input__secondary-text\"></span>\n </p>\n </div>\n `;\n\t\t\t// Стартовые inline-стили для анимаций\n\t\t\tObject.assign($errorWrapper.style, {\n\t\t\t\tboxSizing: 'border-box',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\theight: '0px',\n\t\t\t\tpaddingTop: '0px',\n\t\t\t\topacity: '0',\n\t\t\t} as CSSStyleDeclaration);\n\t\t\tif ($lastInputWrapper) {\n\t\t\t\t$lastInputWrapper.insertAdjacentElement('afterend', $errorWrapper);\n\t\t\t} else {\n\t\t\t\tthis.$el.appendChild($errorWrapper);\n\t\t\t}\n\t\t} else {\n\t\t\t// убедимся, что нужные стартовые inline-стили есть\n\t\t\t$errorWrapper.style.boxSizing = 'border-box';\n\t\t\t$errorWrapper.style.overflow = 'hidden';\n\t\t}\n\n\t\t// Текст\n\t\t($errorWrapper.querySelector('.error-block-under-input__main-text') as HTMLElement).textContent = text;\n\t\tconst $secondaryText = $errorWrapper.querySelector(\n\t\t\t'.error-block-under-input__secondary-text',\n\t\t) as HTMLElement | null;\n\t\tif ($secondaryText) $secondaryText.textContent = '';\n\n\t\t// Сброс success-класса, если он устанавливался где-то в другом коде\n\t\t$errorWrapper.querySelector('.error-block-under-input')?.classList.remove('error-block-under-input--success');\n\n\t\t// Посчитать целевую высоту\n\t\t// Чтобы корректно мерить, временно выставим auto\n\t\tconst prevHeight = $errorWrapper.style.height;\n\t\tconst prevPadding = $errorWrapper.style.paddingTop;\n\t\t$errorWrapper.style.height = 'auto';\n\t\t$errorWrapper.style.paddingTop = `${this._anim.paddingTopOpened}px`;\n\t\tconst targetHeight = $errorWrapper.clientHeight; // фактическая высота открытого состояния\n\n\t\t// Вернуть стартовое состояние (схлопнуто)\n\t\t$errorWrapper.style.height = prevHeight || '0px';\n\t\t$errorWrapper.style.paddingTop = prevPadding || '0px';\n\n\t\t// Если уже раскрыт на нужную высоту — просто «дзынь» иконке и выходим\n\t\tif (\n\t\t\tparseFloat($errorWrapper.style.height) === targetHeight &&\n\t\t\tparseFloat($errorWrapper.style.opacity || '1') === 1\n\t\t) {\n\t\t\tthis._ringIcon($errorWrapper);\n\t\t} else {\n\t\t\t// Анимация раскрытия\n\t\t\tthis._cancelAnimations($errorWrapper);\n\t\t\tif (this._canAnimate($errorWrapper)) {\n\t\t\t\tconst anim = $errorWrapper.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\theight: `${parseFloat($errorWrapper.style.height) || 0}px`,\n\t\t\t\t\t\t\tpaddingTop: `${parseFloat($errorWrapper.style.paddingTop) || 0}px`,\n\t\t\t\t\t\t\topacity: parseFloat($errorWrapper.style.opacity || '0'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\theight: `${targetHeight}px`,\n\t\t\t\t\t\t\tpaddingTop: `${this._anim.paddingTopOpened}px`,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{ duration: this._anim.duration, easing: this._anim.easing, fill: 'forwards' },\n\t\t\t\t);\n\t\t\t\tanim.addEventListener('finish', () => {\n\t\t\t\t\t// После анимации: фиксируем авто-высоту, чтобы текст мог меняться\n\t\t\t\t\t$errorWrapper.style.height = 'auto';\n\t\t\t\t\t$errorWrapper.style.paddingTop = `${this._anim.paddingTopOpened}px`;\n\t\t\t\t\t$errorWrapper.style.opacity = '1';\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Фолбэк без анимации\n\t\t\t\t$errorWrapper.style.height = 'auto';\n\t\t\t\t$errorWrapper.style.paddingTop = `${this._anim.paddingTopOpened}px`;\n\t\t\t\t$errorWrapper.style.opacity = '1';\n\t\t\t}\n\t\t\tthis._ringIcon($errorWrapper);\n\t\t}\n\n\t\t// Скрыть при первом вводе после показа\n\t\tthis.$el.addEventListener('input', () => this.hideErrorForm(), { passive: true, once: true });\n\t}\n\n\t/** Скрывает ошибку под полями ввода - ошибку, относящуюся ко всей форме. */\n\tprivate hideErrorForm() {\n\t\tconst inputWrappersList = this.$el.querySelectorAll(this.config.inputWrapperSelector!);\n\t\tconst $lastInputWrapper = inputWrappersList[inputWrappersList.length - 1] as HTMLElement | undefined;\n\t\tconst $errorWrapper = (\n\t\t\t$lastInputWrapper?.nextElementSibling || this.$el.querySelector('.error-block-under-input__wrapper')\n\t\t) as HTMLElement | null;\n\t\tif (!$errorWrapper || !$errorWrapper.classList.contains('error-block-under-input__wrapper')) return;\n\n\t\t// Текущая высота (если была auto) — измерим и зафиксируем\n\t\tconst wasAuto = $errorWrapper.style.height === '' || $errorWrapper.style.height === 'auto';\n\t\tif (wasAuto) {\n\t\t\t$errorWrapper.style.height = `${$errorWrapper.clientHeight}px`;\n\t\t}\n\t\t$errorWrapper.style.paddingTop = $errorWrapper.style.paddingTop || `${this._anim.paddingTopOpened}px`;\n\t\t$errorWrapper.style.opacity = $errorWrapper.style.opacity || '1';\n\n\t\t// Анимация схлопывания\n\t\tthis._cancelAnimations($errorWrapper);\n\t\tif (this._canAnimate($errorWrapper)) {\n\t\t\tconst anim = $errorWrapper.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\theight: `${parseFloat($errorWrapper.style.height) || $errorWrapper.clientHeight}px`,\n\t\t\t\t\t\tpaddingTop: `${parseFloat($errorWrapper.style.paddingTop) || this._anim.paddingTopOpened}px`,\n\t\t\t\t\t\topacity: parseFloat($errorWrapper.style.opacity || '1'),\n\t\t\t\t\t},\n\t\t\t\t\t{ height: '0px', paddingTop: '0px', opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{ duration: this._anim.duration, easing: this._anim.easing, fill: 'forwards' },\n\t\t\t);\n\t\t\tanim.addEventListener('finish', () => {\n\t\t\t\t// После закрытия можно удалить узел или оставить схлопнутым\n\t\t\t\t$errorWrapper.remove();\n\t\t\t\t// Если хотите оставлять в DOM:\n\t\t\t\t// $errorWrapper.style.height = '0px';\n\t\t\t\t// $errorWrapper.style.paddingTop = '0px';\n\t\t\t\t// $errorWrapper.style.opacity = '0';\n\t\t\t});\n\t\t} else {\n\t\t\t// Фолбэк без анимации\n\t\t\t$errorWrapper.remove();\n\t\t}\n\t}\n\n\t/** Короткая анимация иконки без CSS */\n\tprivate _ringIcon($wrapper: HTMLElement) {\n\t\tconst $icon = $wrapper.querySelector('.error-block-under-input__icon--animated') as HTMLElement | null;\n\t\tif (!$icon) return;\n\n\t\tthis._cancelAnimations($icon);\n\t\tif (!this._canAnimate($icon)) return;\n\n\t\t// Небольшое «качание» и вспышка прозрачности\n\t\t$icon.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'rotate(0deg) scale(1)', opacity: 0 },\n\t\t\t\t{ transform: 'rotate(-8deg) scale(1.05)', opacity: 1, offset: 0.15 },\n\t\t\t\t{ transform: 'rotate(8deg) scale(1.05)', opacity: 1, offset: 0.3 },\n\t\t\t\t{ transform: 'rotate(-6deg) scale(1.03)', opacity: 1, offset: 0.45 },\n\t\t\t\t{ transform: 'rotate(6deg) scale(1.03)', opacity: 1, offset: 0.6 },\n\t\t\t\t{ transform: 'rotate(0deg) scale(1)', opacity: 0 },\n\t\t\t],\n\t\t\t{ duration: this._anim.iconDuration, easing: 'ease' },\n\t\t);\n\t}\n\n\t/** Полностью снимает слушатели и чистит артефакты формы. */\n\tpublic destroy(): void {\n\t\t// 1) Снять submit-слушатель\n\t\tif (this._onSubmitHandler) {\n\t\t\tthis.$el.removeEventListener('submit', this._onSubmitHandler as EventListener);\n\t\t\tthis._onSubmitHandler = undefined;\n\t\t}\n\n\t\t// 1.1) Снять click-слушатель с кнопки submit\n\t\tif (this._onSubmitClickHandler) {\n\t\t\tthis.$submits.forEach($submit => {\n\t\t\t\t$submit.removeEventListener('click', this._onSubmitClickHandler as EventListener);\n\t\t\t});\n\t\t\tthis._onSubmitClickHandler = undefined;\n\t\t}\n\n\t\tthis.clearFieldValidationEvents();\n\t\tthis.mutationObserver?.disconnect();\n\t\tthis.mutationObserver = undefined;\n\n\t\t// 2) Удалить формовый error-блок под инпутами (если есть)\n\t\tconst formErrorWrapper = this.$el.querySelector('.error-block-under-input__wrapper') as HTMLElement | null;\n\t\tif (formErrorWrapper) {\n\t\t\tthis._cancelAnimations(formErrorWrapper);\n\t\t\tformErrorWrapper.remove();\n\t\t}\n\t\tthis.hideErrorSummary();\n\n\t\t// 3) Скрыть/удалить лоадер на кнопке submit\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.classList.remove('button--loading');\n\t\t\tconst btnLoader = $submit.querySelector('.button__loader') as HTMLElement | null;\n\t\t\tif (btnLoader) btnLoader.remove();\n\t\t});\n\n\t\t// 4) Сбросить ошибки у инпутов (если разметка позволяет)\n\t\tconst inputs = this.$el.querySelectorAll<FormFieldElement>('input, textarea, select');\n\t\tinputs.forEach($i => {\n\t\t\tthis.hideError($i);\n\t\t\tthis.clearFieldValidationState($i);\n\t\t});\n\n\t\t// 5) Убрать возможный флаг скролла\n\t\tdocument.documentElement.removeAttribute('data-now-scrolling');\n\n\t\t// 6) Очистить ссылки на элементы, чтобы помочь GC\n\t\tthis.inputs = null;\n\t\tthis.$submits = [];\n\t\tthis.errors = [];\n\t\tthis.waitResponse = false;\n\t\tFORM_INSTANCES.delete(this.$el);\n\t}\n\n\t/**\n\t * Проверяет входные данные на их корректность.\n\t *\n\t * @returns {boolean} Корректны данные или нет (true/false).\n\t */\n\tprivate isCorrectArguments(): boolean {\n\t\tif (this.$el.tagName !== 'FORM') {\n\t\t\tconsole.warn(`$el не является тегом form`);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.$submits.length === 0) {\n\t\t\tconsole.warn(`В форме нет кнопки с типом submit`);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate formDataToObject(formData: FormData): Record<string, any> {\n\t\tconst data: Record<string, any> = {};\n\n\t\tformData.forEach((value, key) => {\n\t\t\tif (Object.prototype.hasOwnProperty.call(data, key)) {\n\t\t\t\tif (!Array.isArray(data[key])) {\n\t\t\t\t\tdata[key] = [data[key]];\n\t\t\t\t}\n\t\t\t\tdata[key].push(value);\n\t\t\t} else {\n\t\t\t\tdata[key] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n\n\tprivate appendFormDataValue(formData: FormData, key: string, value: any): void {\n\t\tif (value === undefined || value === null) return;\n\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach((item, index) => {\n\t\t\t\tthis.appendFormDataValue(formData, `${key}[${index}]`, item);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (value instanceof Blob) {\n\t\t\tformData.append(key, value);\n\t\t\treturn;\n\t\t}\n\n\t\tformData.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n\t}\n\n\tprivate objectToFormData(data: Record<string, any>): FormData {\n\t\tconst formData = new FormData();\n\n\t\tObject.entries(data).forEach(([key, value]) => {\n\t\t\tthis.appendFormDataValue(formData, key, value);\n\t\t});\n\n\t\treturn formData;\n\t}\n\n\tprivate stringifyFormDataValue(value: FormDataEntryValue): string {\n\t\treturn typeof value === 'string' ? value : value.name;\n\t}\n\n\tprivate formDataToUrlSearchParams(formData: FormData): URLSearchParams {\n\t\tconst params = new URLSearchParams();\n\n\t\tformData.forEach((value, key) => {\n\t\t\tparams.append(key, this.stringifyFormDataValue(value));\n\t\t});\n\n\t\treturn params;\n\t}\n\n\tprivate formDataToTextBody(formData: FormData): string {\n\t\treturn Array.from(formData)\n\t\t\t.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(this.stringifyFormDataValue(value))}`)\n\t\t\t.join('\\n');\n\t}\n\n\tprivate isBodylessMethod(method: string): boolean {\n\t\treturn method === 'GET' || method === 'HEAD';\n\t}\n\n\tprivate appendQueryString(action: string, params: URLSearchParams): string {\n\t\tconst query = params.toString();\n\t\tif (!query) return action;\n\n\t\tconst separator = action.includes('?') ? '&' : '?';\n\t\treturn `${action}${separator}${query}`;\n\t}\n\n\tprivate findFieldByName(name: string): FormFieldElement | null {\n\t\tconst fields = Array.from(this.$el.querySelectorAll<FormFieldElement>('input, textarea, select'));\n\t\treturn fields.find($field => $field.name === name) || null;\n\t}\n\n\tprivate async parseResponseBody(response: Response): Promise<ResponseBody> {\n\t\ttry {\n\t\t\tconst responseBody = await response.json();\n\t\t\treturn responseBody && typeof responseBody === 'object'\n\t\t\t\t? responseBody\n\t\t\t\t: {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t'error-msg': 'Некорректный ответ сервера',\n\t\t\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: true,\n\t\t\t\t'error-msg': 'Некорректный ответ сервера',\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate handleUnsuccessfulResponse(responseBody: ResponseBody): void {\n\t\tif (responseBody.error !== true) return;\n\n\t\tif (responseBody['error-msg']) {\n\t\t\tthis.setErrorRecord(FORM_ERROR_FIELD, 'server', responseBody['error-msg'], 'server');\n\t\t\tthis.showErrorForm(responseBody['error-msg']);\n\t\t}\n\n\t\tif (responseBody.errors) {\n\t\t\tconst fieldsList: FormFieldElement[] = [];\n\t\t\tresponseBody.errors.forEach(error => {\n\t\t\t\tconst $field = this.findFieldByName(error.name);\n\t\t\t\tif ($field) {\n\t\t\t\t\tfieldsList.push($field);\n\t\t\t\t\tthis.setValidationError($field, 'server', error['error-msg'], 'server');\n\t\t\t\t\tthis.showError($field, error['error-msg']);\n\t\t\t\t\t$field.removeAttribute('aria-busy');\n\t\t\t\t\tthis.setFieldValidationState($field, 'invalid');\n\t\t\t\t} else {\n\t\t\t\t\tthis.setErrorRecord(error.name, 'server', error['error-msg'], 'server');\n\t\t\t\t\tconsole.warn(`Не найдено поле с именем: ${error.name}, для вывода ошибки: ${error['error-msg']}`);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (this.config.scrollToFirstErroredInput === true) this.scrollToFirstErroredInput(fieldsList);\n\t\t\tif (this.config.focusFirstErroredInput === true) this.focusFirstErroredInput(fieldsList);\n\t\t}\n\n\t\tthis.syncErrorSummary();\n\t}\n\n\tprivate async sendData(): Promise<Response> {\n\t\tconst action = this.$el.getAttribute('action') || '';\n\t\tconst method = this.$el.getAttribute('method')?.toUpperCase() || 'POST';\n\t\tconst enctype = this.$el.getAttribute('enctype') || 'application/x-www-form-urlencoded';\n\t\tlet body: BodyInit | null = null;\n\t\tlet headers: HeadersInit = {};\n\n\t\t// Сбор данных из формы\n\t\tconst formData = serializeToFormData(this.$el);\n\t\tlet data: Record<string, any> = this.formDataToObject(formData);\n\n\t\tif (this.config.logging) {\n\t\t\tfor (const key of formData.keys()) console.log(formData.get(key));\n\t\t}\n\n\t\t// Применение обёртки, если указано в настройках\n\t\tconst hasDataWrapper = typeof this.config.wrapData === 'function';\n\t\tif (typeof this.config.wrapData === 'function') {\n\t\t\tdata = this.config.wrapData(data);\n\t\t}\n\t\tconst requestFormData = hasDataWrapper ? this.objectToFormData(data) : formData;\n\n\t\tif (this.isBodylessMethod(method)) {\n\t\t\treturn fetch(this.appendQueryString(action, this.formDataToUrlSearchParams(requestFormData)), {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t});\n\t\t}\n\n\t\tswitch (enctype) {\n\t\t\tcase 'application/x-www-form-urlencoded':\n\t\t\t\tbody = this.formDataToUrlSearchParams(requestFormData).toString();\n\t\t\t\theaders['Content-Type'] = 'application/x-www-form-urlencoded';\n\t\t\t\tbreak;\n\n\t\t\tcase 'multipart/form-data':\n\t\t\t\tbody = requestFormData;\n\t\t\t\t// ВАЖНО: Не указываем Content-Type, т.к. браузер сам добавит с корректной границей!\n\t\t\t\tbreak;\n\n\t\t\tcase 'text/plain':\n\t\t\t\tbody = this.formDataToTextBody(requestFormData);\n\t\t\t\theaders['Content-Type'] = 'text/plain';\n\t\t\t\tbreak;\n\n\t\t\tcase 'application/json':\n\t\t\t\tbody = JSON.stringify(data);\n\t\t\t\theaders['Content-Type'] = 'application/json';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`Неизвестный enctype: ${enctype}. Используется application/x-www-form-urlencoded.`);\n\t\t\t\tbody = this.formDataToUrlSearchParams(requestFormData).toString();\n\t\t\t\theaders['Content-Type'] = 'application/x-www-form-urlencoded';\n\t\t}\n\n\t\treturn fetch(action, {\n\t\t\tmethod,\n\t\t\tbody,\n\t\t\theaders,\n\t\t});\n\t}\n\n\tpublic async submit(): Promise<SubmitResult | undefined> {\n\t\tif (!this.waitResponse) {\n\t\t\tlet loadingFinished = false;\n\t\t\tconst finishLoading = () => {\n\t\t\t\tif (loadingFinished) return;\n\n\t\t\t\tthis.waitResponse = false;\n\t\t\t\tif (this.config.showLoaderButton === true) this.hideLoader();\n\t\t\t\tloadingFinished = true;\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst beforeSubmitResult = await this.config.onBeforeSubmit?.(this);\n\t\t\t\tif (beforeSubmitResult === false) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.config.showLoaderButton === true) this.showLoader();\n\n\t\t\t\tthis.config.onSubmit?.(this);\n\t\t\t\tthis.waitResponse = true;\n\n\t\t\t\tconst response = await this.sendData();\n\t\t\t\tconst responseBody = await this.parseResponseBody(response);\n\t\t\t\tfinishLoading();\n\n\t\t\t\tthis.config.onResponse?.(responseBody, this);\n\n\t\t\t\tif (response.ok && responseBody.success === true) {\n\t\t\t\t\tthis.config.onResponseSuccess?.(responseBody, this);\n\t\t\t\t} else {\n\t\t\t\t\tthis.config.onResponseUnsuccess?.(responseBody, this);\n\t\t\t\t\tthis.handleUnsuccessfulResponse(responseBody);\n\t\t\t\t}\n\n\t\t\t\tparseCommonResponseProperties(responseBody);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: response.ok && responseBody.success === true,\n\t\t\t\t\tresponse,\n\t\t\t\t\tresponseBody,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tfinishLoading();\n\t\t\t\tthis.config.onSubmitError?.(error, this);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/helpers.ts","../src/validators.ts","../src/adapters.ts","../src/index.ts"],"sourcesContent":["/**\n * Возвращает форматированную дату.\n *\n * @param {string} dateValue\n * @param {string} format\n *\n * @returns {string}\n */\nfunction formatDate(dateValue: string, format: string): string {\n\tconst date = new Date(dateValue);\n\n\t/**\n\t * Добавляет ведущие нули.\n\t *\n\t * @param {number} num\n\t *\n\t * @returns {string}\n\t */\n\tconst pad = (num: number): string => num.toString().padStart(2, '0');\n\n\tconst day = pad(date.getDate());\n\tconst month = pad(date.getMonth() + 1);\n\tconst year = date.getFullYear().toString();\n\n\treturn format.replace('dd', day).replace('mm', month).replace('yyyy', year);\n}\n\n/**\n * Находит родительский элемент по заданому селектору.\n *\n * @param {HTMLElement | null} $el - Элемент, чего родителя нужно найти.\n * @param {string} selector - Селектор родителя.\n *\n * @returns {HTMLElement | null} Элемент родителя. Но если родителя с таким селектори не было найдено возвращается null.\n */\nexport function closest($el: HTMLElement | null, selector: string): HTMLElement | null {\n\tif ($el == null) return null;\n\n\tlet parent: HTMLElement | null = $el;\n\n\twhile (parent) {\n\t\tif (parent.matches(selector)) {\n\t\t\treturn parent;\n\t\t}\n\n\t\tparent = parent.parentElement;\n\t}\n\n\treturn null;\n}\n\n/** Включает блокировку скролла страницы */\nexport function blockScrollBody(): void {\n\t(window as any).lastBlockScrollPosition = window.pageYOffset;\n\tdocument.body.style.top = `${-(window as any).lastBlockScrollPosition}px`;\n\tdocument.body.classList.add('body--block-scroll');\n}\n\n/** Отменяет блокировку скролла страницы */\nexport function unblockScrollBody(): void {\n\tdocument.body.classList.remove('body--block-scroll');\n\tdocument.body.style.top = '';\n\twindow.scrollTo(0, (window as any).lastBlockScrollPosition || 0);\n}\n\n/**\n * Проверяет является ли строка валидным адресом электронной почты.\n *\n * @param {string} value - Строка, которую нужно проверить.\n *\n * @returns {boolean} Является ли строка валидным адресом электронной почты true/false.\n */\nexport function isEmailValid(value: string): boolean {\n\treturn /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{2,})$/iu.test(\n\t\tvalue,\n\t);\n}\n\nconst HTTP_PROTOCOLS = ['http:', 'https:'];\n\nfunction getNormalizedUrlString(originalUrlString: string): string {\n\tconst trimmedUrl = originalUrlString.trim();\n\tif (trimmedUrl.length === 0) return '';\n\n\tif (trimmedUrl.startsWith('//')) {\n\t\treturn `https:${trimmedUrl}`;\n\t}\n\n\treturn /^[a-z][a-z\\d+.-]*:\\/\\//i.test(trimmedUrl) ? trimmedUrl : `https://${trimmedUrl}`;\n}\n\nfunction isValidIpv4(hostname: string): boolean {\n\tconst parts = hostname.split('.');\n\tif (parts.length !== 4) return false;\n\n\treturn parts.every(part => {\n\t\tif (!/^\\d{1,3}$/.test(part)) return false;\n\t\tconst num = Number(part);\n\t\treturn num >= 0 && num <= 255;\n\t});\n}\n\nfunction isValidIpv6(hostname: string): boolean {\n\tif (!hostname.startsWith('[') || !hostname.endsWith(']')) return false;\n\n\tconst normalizedHostname = hostname.slice(1, -1);\n\treturn normalizedHostname.includes(':') && /^[\\da-f:.]+$/i.test(normalizedHostname);\n}\n\nfunction isValidDomainLabel(label: string): boolean {\n\treturn label.length > 0 && label.length <= 63 && /^[a-z\\d-]+$/i.test(label) && !label.startsWith('-') && !label.endsWith('-');\n}\n\nfunction isValidDomainHostname(hostname: string): boolean {\n\tconst labels = hostname.split('.');\n\treturn labels.length >= 2 && labels.every(isValidDomainLabel);\n}\n\nfunction isAllowedHostname(hostname: string): boolean {\n\tif (!hostname) return false;\n\n\treturn (\n\t\thostname === 'localhost' || isValidIpv4(hostname) || isValidIpv6(hostname) || isValidDomainHostname(hostname)\n\t);\n}\n\n/**\n * Проверяет является ли строка валидным url.\n *\n * @param {string} originalUrlString - Строка, которую нужно проверить.\n *\n * @returns {boolean} Является ли строка валидным url адресом true/false.\n */\nexport function isUrlValid(originalUrlString: string): boolean {\n\tconst urlString = getNormalizedUrlString(originalUrlString);\n\tif (urlString.length === 0) return false;\n\n\ttry {\n\t\tconst url = new URL(urlString);\n\t\treturn HTTP_PROTOCOLS.includes(url.protocol) && isAllowedHostname(url.hostname);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Проверяет является ли строка валидным номером телефона.\n *\n * @param {string} value - Строка, которую нужно проверить.\n *\n * @returns {boolean} Является ли строка валидным номером телефона true/false.\n */\nexport function isPhoneValid(value: string): boolean {\n\tconst numbersArray: string[] = [];\n\n\tArray.from(value).forEach(char => {\n\t\tif (!!Number(char) || Number(char) === 0) numbersArray.push(char);\n\t});\n\tif (numbersArray.length < 11 || (numbersArray.length < 12 && value[1] === '+')) return false;\n\n\treturn true;\n}\n\n/**\n * Кастомная сериализация формы в объект FormData.\n *\n * @param {HTMLElement} $element - DOM элемент для сериализации.\n *\n * @returns {FormData} Сериализованные данные формы в объекте FormData.\n */\nexport function serializeToFormData($element: HTMLElement): FormData {\n\tconst elements =\n\t\t$element.tagName === 'FORM'\n\t\t\t? Array.from(($element as HTMLFormElement).elements)\n\t\t\t: Array.from($element.querySelectorAll('input, select, textarea, button'));\n\n\tconst data = new FormData();\n\n\telements.forEach(element => {\n\t\tif (\n\t\t\t!(\n\t\t\t\telement instanceof HTMLInputElement ||\n\t\t\t\telement instanceof HTMLSelectElement ||\n\t\t\t\telement instanceof HTMLTextAreaElement ||\n\t\t\t\telement instanceof HTMLButtonElement\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!element.name || element.disabled || element.hasAttribute('data-no-serialize')) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (element instanceof HTMLButtonElement) {\n\t\t\treturn;\n\t\t}\n\t\tconst { name, type } = element;\n\n\t\tif (type === 'file') {\n\t\t\tif ((element as HTMLInputElement).multiple) {\n\t\t\t\tconst files = (element as HTMLInputElement).files;\n\t\t\t\tif (files) {\n\t\t\t\t\tfor (let i = 0; i < files.length; i++) {\n\t\t\t\t\t\t// Добавляем каждый файл с уникальным ключом\n\t\t\t\t\t\tdata.append(`${name}[${i}]`, files[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst files = (element as HTMLInputElement).files;\n\t\t\t\tif (files && files[0]) data.append(name, files[0]);\n\t\t\t}\n\t\t} else {\n\t\t\tlet value: string;\n\t\t\tif (type === 'select-one' || type === 'select-multiple') {\n\t\t\t\t// Обработка select элементов\n\t\t\t\tconst select = element as HTMLSelectElement;\n\t\t\t\tif (type === 'select-multiple') {\n\t\t\t\t\tconst selectedOptions = Array.from(select.selectedOptions).map(option => option.value);\n\t\t\t\t\tselectedOptions.forEach((val, index) => {\n\t\t\t\t\t\tdata.append(`${name}[${index}]`, val);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tvalue = select.value;\n\t\t\t\t\tif (value) data.append(name, value);\n\t\t\t\t}\n\t\t\t} else if (type === 'tel') {\n\t\t\t\tvalue = element.value\n\t\t\t\t\t.split(/[\\s()-]/)\n\t\t\t\t\t.join('')\n\t\t\t\t\t.replace(/^8/, '+7');\n\t\t\t} else if (type === 'checkbox' || type === 'radio') {\n\t\t\t\tif (!(element as HTMLInputElement).checked) return;\n\t\t\t\tvalue = element.value;\n\t\t\t} else if (type === 'date') {\n\t\t\t\tconst format = element.getAttribute('data-date-format');\n\t\t\t\tvalue = format ? formatDate(element.value, format) : element.value;\n\t\t\t} else {\n\t\t\t\tvalue = element.value;\n\t\t\t}\n\n\t\t\tif (value! && type !== 'select-one' && type !== 'select-multiple') {\n\t\t\t\tdata.append(name, value);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn data;\n}\n\n/**\n * Функция для разбора общих свойств ответа.\n *\n * @param {any} responseBody - Тело ответа.\n */\nexport function parseCommonResponseProperties(responseBody: any): void {\n\tif (Object.prototype.hasOwnProperty.call(responseBody, 'redirect-url')) {\n\t\tif (responseBody['redirect-url-delay']) {\n\t\t\tconst redirectUrlDelay: number = Number(responseBody['redirect-url-delay']);\n\t\t\tsetTimeout(() => {\n\t\t\t\twindow.location.href = responseBody['redirect-url'];\n\t\t\t}, redirectUrlDelay);\n\t\t} else {\n\t\t\twindow.location.href = responseBody['redirect-url'];\n\t\t}\n\t} else if (Object.prototype.hasOwnProperty.call(responseBody, 'reload')) {\n\t\tif (responseBody.reload === true) {\n\t\t\tif (responseBody['reload-delay']) {\n\t\t\t\tconst reloadDelay: number = Number(responseBody['reload-delay']);\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t}, reloadDelay);\n\t\t\t} else {\n\t\t\t\twindow.location.reload();\n\t\t\t}\n\t\t}\n\t}\n\t// Не показываем тост если делается редирект или обновление страницы (чтобы небыло вспышек) - в этом случае тосты обрабытываются в ответе onResponseSuccess | onResponseUnsuccess\n\telse {\n\t\tif (Object.prototype.hasOwnProperty.call(responseBody, 'toast')) {\n\t\t\tconst toasts = responseBody['toast'];\n\t\t\tconst normalizedToasts = Array.isArray(toasts) ? toasts : [toasts];\n\n\t\t\tnormalizedToasts.forEach(toast => {\n\t\t\t\t(window as any).showToast(toast);\n\t\t\t});\n\t\t} else if (Object.prototype.hasOwnProperty.call(responseBody, 'error-toast')) {\n\t\t\t/** @deprecated */\n\t\t\t(window as any).showToast(responseBody['error-toast']);\n\t\t}\n\t}\n}\n\n/**\n * Сериализует данные формы в объект JSON.\n *\n * @param {HTMLFormElement} form - Элемент формы.\n *\n * @returns {Object} Сериализованные данные формы.\n */\nexport function serializeFormToJSON(form: HTMLFormElement): { [key: string]: any } {\n\tconst obj: { [key: string]: any } = {};\n\tconst formData = new FormData(form);\n\n\tformData.forEach((value, key) => {\n\t\tif (obj.hasOwnProperty(key)) {\n\t\t\tif (!Array.isArray(obj[key])) {\n\t\t\t\tobj[key] = [obj[key]];\n\t\t\t}\n\t\t\tobj[key].push(value);\n\t\t} else {\n\t\t\tobj[key] = value;\n\t\t}\n\t});\n\n\treturn obj;\n}\n","import { isUrlValid } from './helpers';\n\n/* ---------- types ---------- */\nexport type ValidatorEffectCtx = {\n\tvalue: string;\n\t$input: ValidatorFieldElement;\n\t$form: HTMLElement;\n\tparams?: any;\n};\n\nexport type ValidatorFieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nexport type ValidatorResult = {\n\tvalid: boolean;\n\t/** Сообщение об ошибке, если нужно переопределить дефолт */\n\tmessage?: string;\n\t/** Выполнить сайд-эффект (подсветка, иконки, тексты и т.п.) */\n\teffect?: (ctx: ValidatorEffectCtx) => void | Promise<void>;\n\t/** Остановить дальнейшие правила для поля (даже если valid=true). Полезно, если валидатор полностью «ведёт» поле. */\n\tstopOthers?: boolean;\n};\n\nexport type ValidatorFn = (\n\tvalue: string,\n\t$input: ValidatorFieldElement,\n\t$form: HTMLElement,\n\tparams?: any,\n) => boolean | ValidatorResult | Promise<boolean | ValidatorResult>;\n\ninterface Validator {\n\tfn: ValidatorFn;\n\tdefaultMessage: string;\n}\n\n/* ---------- singleton-storage на globalThis ---------- */\nconst GLOBAL_KEY = Symbol.for('FormFather.validators');\nconst validators: Map<string, Validator> =\n\t(globalThis as any)[GLOBAL_KEY] ?? ((globalThis as any)[GLOBAL_KEY] = new Map<string, Validator>());\n\n/* ---------- API ---------- */\nexport function registerValidator(\n\tname: string,\n\tfn: ValidatorFn,\n\tdefaultMessage: string,\n\t{ override = false }: { override?: boolean } = {},\n): void {\n\tif (validators.has(name) && !override) {\n\t\tconsole.warn(`[FormFather] Validator \"${name}\" already exists; pass { override: true } to replace`);\n\t\treturn;\n\t}\n\tvalidators.set(name, { fn, defaultMessage });\n}\n\nexport const getValidator = (name: string): Validator | undefined => validators.get(name);\n\nexport function getAllValidators(): Map<string, Validator> {\n\treturn new Map(validators); // копию, чтобы никто не мутировал оригинал\n}\n\n/* ---------- built-in rules ---------- */\nfunction registerBuiltinValidator(name: string, fn: ValidatorFn, defaultMessage: string): void {\n\tif (!validators.has(name)) {\n\t\tvalidators.set(name, { fn, defaultMessage });\n\t}\n}\n\nregisterBuiltinValidator(\n\t'required',\n\t(value, $input, $form) => {\n\t\tif ($input && $input.type) {\n\t\t\tif ($input.type === 'checkbox') {\n\t\t\t\treturn ($input as HTMLInputElement).checked;\n\t\t\t}\n\t\t\tif ($input.type === 'radio') {\n\t\t\t\tconst group = $form.querySelectorAll(`input[type=\"radio\"][name=\"${$input.name}\"]`);\n\t\t\t\treturn Array.from(group).some(el => (el as HTMLInputElement).checked);\n\t\t\t}\n\t\t}\n\n\t\t// fallback — если нет $input (например, в unit-тестах)\n\t\treturn value.trim().length > 0;\n\t},\n\t'Пустое значение',\n);\n\nregisterBuiltinValidator('email', v => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v), 'Неверный формат');\n\nregisterBuiltinValidator('tel', v => /^\\+7\\d{10}$/.test(v), 'Неверный формат');\n\nregisterBuiltinValidator('url', v => isUrlValid(v), 'Неверный формат');\n\nregisterBuiltinValidator('not-numbers', v => !/[0-9]/.test(v), 'Неверный формат');\n","import { registerValidator, type ValidatorFieldElement, type ValidatorResult } from './validators';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type SchemaParseResult =\n\t| { success: true; data?: unknown }\n\t| { success: false; error?: unknown; issues?: Array<{ message?: string }> };\n\nexport type SchemaLike =\n\t| {\n\t\t\tsafeParse?: (value: unknown) => MaybePromise<SchemaParseResult>;\n\t\t\tparse?: (value: unknown) => MaybePromise<unknown>;\n\t }\n\t| ((value: unknown) => MaybePromise<boolean | ValidatorResult | void>);\n\nexport type AdapterValidator = (\n\tvalue: string,\n\t$input: ValidatorFieldElement,\n\t$form: HTMLElement,\n\tparams?: any,\n) => MaybePromise<boolean | ValidatorResult>;\n\nexport interface SchemaValidatorOptions {\n\tmessage?: string | ((error: unknown) => string);\n\tmapValue?: (value: string, $input: ValidatorFieldElement, $form: HTMLElement, params?: any) => unknown;\n}\n\nexport interface RegisterSchemaValidatorOptions extends SchemaValidatorOptions {\n\toverride?: boolean;\n}\n\nexport interface RegisterFieldValidatorOptions {\n\toverride?: boolean;\n}\n\nexport interface LengthValidatorOptions {\n\tmin?: number;\n\tmax?: number;\n\ttrim?: boolean;\n\temptyIsValid?: boolean;\n}\n\nfunction readFirstIssueMessage(error: unknown): string | undefined {\n\tif (!error || typeof error !== 'object') return undefined;\n\n\tconst issues = (error as any).issues || (error as any).errors;\n\tif (Array.isArray(issues)) {\n\t\tconst firstMessage = issues.find(issue => typeof issue?.message === 'string')?.message;\n\t\tif (firstMessage) return firstMessage;\n\t}\n\n\treturn typeof (error as any).message === 'string' ? (error as any).message : undefined;\n}\n\nfunction resolveMessage(error: unknown, message?: SchemaValidatorOptions['message']): string | undefined {\n\tif (typeof message === 'function') return message(error);\n\treturn message || readFirstIssueMessage(error);\n}\n\nfunction normalizeResult(result: boolean | ValidatorResult | void, message?: string): boolean | ValidatorResult {\n\tif (typeof result === 'object' && result !== null) return result;\n\tif (result === undefined) return true;\n\treturn result ? true : { valid: false, message };\n}\n\nexport function createSchemaValidator(schema: SchemaLike, options: SchemaValidatorOptions = {}): AdapterValidator {\n\treturn async (value, $input, $form, params) => {\n\t\tconst mappedValue = options.mapValue ? options.mapValue(value, $input, $form, params) : value;\n\n\t\ttry {\n\t\t\tif (typeof schema === 'function') {\n\t\t\t\treturn normalizeResult(await schema(mappedValue), resolveMessage(undefined, options.message));\n\t\t\t}\n\n\t\t\tif (typeof schema.safeParse === 'function') {\n\t\t\t\tconst result = await schema.safeParse(mappedValue);\n\t\t\t\tif (result.success) return true;\n\t\t\t\treturn { valid: false, message: resolveMessage(result.error || result, options.message) };\n\t\t\t}\n\n\t\t\tif (typeof schema.parse === 'function') {\n\t\t\t\tawait schema.parse(mappedValue);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treturn { valid: false, message: resolveMessage(error, options.message) };\n\t\t}\n\n\t\treturn { valid: false, message: resolveMessage(undefined, options.message) };\n\t};\n}\n\nexport function registerSchemaValidator(\n\tname: string,\n\tschema: SchemaLike,\n\tdefaultMessage: string,\n\toptions: RegisterSchemaValidatorOptions = {},\n): void {\n\tconst { override, ...adapterOptions } = options;\n\tregisterValidator(name, createSchemaValidator(schema, adapterOptions), defaultMessage, { override });\n}\n\nexport function registerFieldValidator(\n\tname: string,\n\tpredicate: (value: string, $input: ValidatorFieldElement, $form: HTMLElement, params?: any) => MaybePromise<boolean>,\n\tdefaultMessage: string,\n\toptions: RegisterFieldValidatorOptions = {},\n): void {\n\tregisterValidator(name, createFieldValidator(predicate), defaultMessage, options);\n}\n\nexport function createFieldValidator(\n\tpredicate: (value: string, $input: ValidatorFieldElement, $form: HTMLElement, params?: any) => MaybePromise<boolean>,\n\tmessage?: string,\n): AdapterValidator {\n\treturn async (value, $input, $form, params) => {\n\t\tconst valid = await predicate(value, $input, $form, params);\n\t\treturn valid ? true : { valid: false, message };\n\t};\n}\n\nexport function createPatternValidator(pattern: RegExp, message?: string): AdapterValidator {\n\treturn createFieldValidator(value => {\n\t\tpattern.lastIndex = 0;\n\t\treturn pattern.test(value);\n\t}, message);\n}\n\nexport function createLengthValidator(options: LengthValidatorOptions, message?: string): AdapterValidator {\n\treturn createFieldValidator(value => {\n\t\tconst normalizedValue = options.trim === false ? value : value.trim();\n\t\tif (normalizedValue.length === 0 && options.emptyIsValid === true) return true;\n\t\tif (typeof options.min === 'number' && normalizedValue.length < options.min) return false;\n\t\tif (typeof options.max === 'number' && normalizedValue.length > options.max) return false;\n\t\treturn true;\n\t}, message);\n}\n","import {\n\tserializeToFormData,\n\tisEmailValid,\n\tisUrlValid,\n\tparseCommonResponseProperties,\n\tclosest,\n\tisPhoneValid,\n\tserializeFormToJSON,\n} from './helpers';\nimport { getValidator } from './validators';\n\nexport * from './validators';\nexport * from './adapters';\nexport {\n\tserializeToFormData,\n\tisEmailValid,\n\tisUrlValid,\n\tparseCommonResponseProperties,\n\tclosest,\n\tisPhoneValid,\n\tblockScrollBody,\n\tunblockScrollBody,\n\tserializeFormToJSON,\n} from './helpers';\n\n// --- shared cross-file state (singleton via globalThis) ---\nconst FORM_GLOBAL_KEY = Symbol.for('formfather.shared');\n\ntype SharedState = {\n\tdefaultParams: Partial<FormOptions>;\n\tdefaultValidationSchema?: ValidationSchema;\n};\n\nconst __shared: SharedState =\n\t// уже существует? используем его\n\t(globalThis as any)[FORM_GLOBAL_KEY] ??\n\t// иначе создаём\n\t((globalThis as any)[FORM_GLOBAL_KEY] = {\n\t\tdefaultParams: {},\n\t\tdefaultValidationSchema: undefined,\n\t});\n\nexport type ValidationRule = string | { rule: string; params?: any };\nexport type ValidationTrigger = 'submit' | 'input' | 'blur' | 'change';\nexport type ValidationErrorSource = 'client' | 'server' | 'manual';\nexport type FieldReference = string | FormFieldElement;\n\nexport const FORM_ERROR_FIELD = '_form';\n\nexport interface ValidationError {\n\tfield: string;\n\trule: string;\n\tmessage: string;\n\tsource: ValidationErrorSource;\n}\n\nexport interface SubmitResult {\n\tsuccess: boolean;\n\tresponse?: Response;\n\tresponseBody?: ResponseBody;\n\terror?: unknown;\n}\n\nexport interface FormResetOptions {\n\tclearErrors?: boolean;\n}\n\nexport interface ErrorSummaryOptions {\n\t/** Existing summary container selector. If omitted, Form Father creates `[data-form-father-summary]` in the form. */\n\tselector?: string;\n\n\t/** Heading text for the default summary renderer. */\n\ttitle?: string;\n\n\t/** Move focus to the summary after rendering. Useful for submit-time screen reader announcements. */\n\tfocus?: boolean;\n\n\t/** Custom renderer. Return an element/string or render into your own container and return nothing. */\n\trender?: (errors: ValidationError[], formInstance: Form) => HTMLElement | string | void;\n}\n\nexport interface ValidationIssue {\n\tfield?: string;\n\trule?: string;\n\tmessage: string;\n\tsource?: ValidationErrorSource;\n}\n\nexport type ValidationIssueInput =\n\t| string\n\t| ValidationIssue\n\t| ErrorResponse\n\t| Record<string, string>\n\t| Array<string | ValidationIssue | ErrorResponse>;\n\nexport interface FormValidatorContext {\n\tform: Form;\n\tformElement: HTMLFormElement;\n\tvalues: Record<string, any>;\n\terrors: ValidationError[];\n}\n\nexport type FormValidatorResult =\n\t| boolean\n\t| string\n\t| void\n\t| ValidationIssue\n\t| Array<string | ValidationIssue>;\n\nexport type FormValidator = (context: FormValidatorContext) => FormValidatorResult | Promise<FormValidatorResult>;\n\nexport type FormValidatorPredicate = (context: FormValidatorContext) => boolean | Promise<boolean>;\nexport type FormValidatorIssueFactory =\n\t| string\n\t| ValidationIssue\n\t| ((context: FormValidatorContext) => string | ValidationIssue | Promise<string | ValidationIssue>);\n\nexport type ValidationSchema = Record<\n\tstring,\n\t{\n\t\trules: ValidationRule[];\n\t\tselector?: string;\n\t\tmessages?: Record<string, string>;\n\t}\n>;\n\nfunction readFormValue(values: Record<string, any>, field: string): any {\n\treturn values[field];\n}\n\nfunction isEmptyFormValue(value: any): boolean {\n\tif (Array.isArray(value)) return value.length === 0;\n\treturn value === undefined || value === null || String(value).trim().length === 0;\n}\n\nasync function resolveFormValidatorIssue(\n\tcontext: FormValidatorContext,\n\tissue: FormValidatorIssueFactory,\n\tfallbackField?: string,\n\tfallbackRule?: string,\n): Promise<string | ValidationIssue> {\n\tconst resolvedIssue = typeof issue === 'function' ? await issue(context) : issue;\n\tif (typeof resolvedIssue === 'string') {\n\t\treturn {\n\t\t\tfield: fallbackField,\n\t\t\trule: fallbackRule,\n\t\t\tmessage: resolvedIssue,\n\t\t};\n\t}\n\n\treturn {\n\t\tfield: fallbackField,\n\t\trule: fallbackRule,\n\t\t...resolvedIssue,\n\t};\n}\n\nexport function createFormValidator(\n\tpredicate: FormValidatorPredicate,\n\tissue: FormValidatorIssueFactory,\n): FormValidator {\n\treturn async context => {\n\t\tconst valid = await predicate(context);\n\t\treturn valid ? true : resolveFormValidatorIssue(context, issue);\n\t};\n}\n\nexport function sameAsField(\n\tfield: string,\n\totherField: string,\n\tmessage: string = 'Значения не совпадают',\n\trule: string = 'same-as-field',\n): FormValidator {\n\treturn createFormValidator(\n\t\t({ values }) => readFormValue(values, field) === readFormValue(values, otherField),\n\t\t{ field, rule, message },\n\t);\n}\n\nexport function requiredIf(\n\tfield: string,\n\tcondition: FormValidatorPredicate,\n\tmessage: string = 'Поле обязательно',\n\trule: string = 'conditional-required',\n): FormValidator {\n\treturn createFormValidator(\n\t\tasync context => !(await condition(context)) || !isEmptyFormValue(readFormValue(context.values, field)),\n\t\t{ field, rule, message },\n\t);\n}\n\nexport function dateOrder(\n\tstartField: string,\n\tendField: string,\n\tmessage: string = 'Дата окончания должна быть позже даты начала',\n\trule: string = 'date-order',\n): FormValidator {\n\treturn createFormValidator(\n\t\t({ values }) => {\n\t\t\tconst start = readFormValue(values, startField);\n\t\t\tconst end = readFormValue(values, endField);\n\t\t\tif (isEmptyFormValue(start) || isEmptyFormValue(end)) return true;\n\t\t\treturn Date.parse(String(start)) <= Date.parse(String(end));\n\t\t},\n\t\t{ field: endField, rule, message },\n\t);\n}\n\ntype SubmitElement = HTMLInputElement | HTMLButtonElement;\nexport type FormFieldElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nlet loaderIdCounter = 0;\nlet errorIdCounter = 0;\nconst FORM_INSTANCES = new WeakMap<HTMLFormElement, Form>();\nconst ERROR_DESCRIBEDBY_ID_ATTRIBUTE = 'data-form-father-describedby-id';\nconst ADDED_DESCRIBEDBY_ID_ATTRIBUTE = 'data-form-father-added-describedby-id';\nconst ERROR_SUMMARY_ATTRIBUTE = 'data-form-father-summary';\n\n/** Параметры формы. */\nexport interface FormOptions {\n\t/**\n\t * Функция обратного вызова. Запускается, перед началом валидации формы.\n\t *\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonBeforeValidate?: (formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается, когда закончилась валидация, но не началась отправка.\n\t *\n\t * @param isValid - Статус валидации.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonAfterValidate?: (isValid: boolean, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается после неуспешной клиентской валидации.\n\t *\n\t * @param errors - Список ошибок валидации.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonValidationError?: (errors: ValidationError[], formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается перед отправкой уже валидной формы. Если вернуть `false`, отправка будет\n\t * отменена.\n\t *\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonBeforeSubmit?: (formInstance: Form) => void | boolean | Promise<void | boolean>;\n\n\t/**\n\t * Функция обратного вызова. Запускается, когда форма отправляется.\n\t *\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonSubmit?: (formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова.\n\t *\n\t * @param responseBody - Тело ответа.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonResponse?: (responseBody: ResponseBody, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается после успешного HTTP-ответа и `success: true`.\n\t *\n\t * @param responseBody - Тело ответа.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonResponseSuccess?: (responseBody: ResponseBody, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается после неуспешного HTTP-ответа или `success !== true`.\n\t *\n\t * @param responseBody - Тело ответа.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonResponseUnsuccess?: (responseBody: ResponseBody, formInstance: Form) => void;\n\n\t/**\n\t * Функция обратного вызова. Запускается при исключении во время отправки формы.\n\t *\n\t * @param error - Ошибка отправки.\n\t * @param formInstance - Инстанс формы.\n\t */\n\tonSubmitError?: (error: unknown, formInstance: Form) => void;\n\n\t/** Нужно ли показывать loader в кнопке. По умолчанию `true`. */\n\tshowLoaderButton?: boolean;\n\n\t/** Нужно ли проскроливать до первого по порядку элемента с ошибкой. По умолчанию `true`. */\n\tscrollToFirstErroredInput?: boolean;\n\n\t/** Нужно ли переводить фокус в первое ошибочное поле. По умолчанию `false`. */\n\tfocusFirstErroredInput?: boolean;\n\n\t/** Кастомный тип ошибки. */\n\tcustomTypeError?: any;\n\n\t/** Цвет лоадера. */\n\tloaderColor?: string;\n\n\t/** Нужно ли выводить данные в консоль. По умолчанию `false`. */\n\tlogging?: boolean;\n\n\t/** Селектор поля ввода данных. Таких как textarea, input, select, ... . По умолчанию `.input`. */\n\tinputSelector?: string;\n\n\t/**\n\t * Селектор поля обёртки над полем ввода, у которого реализован публичный метод `showError`. По умолчанию\n\t * `.input-primary`.\n\t */\n\tinputWrapperSelector?: string;\n\n\t/**\n\t * События, на которых нужно запускать валидацию поля. `submit` всегда обрабатывается отдельно. По умолчанию\n\t * `submit`.\n\t */\n\tvalidateOn?: ValidationTrigger | ValidationTrigger[];\n\n\t/** События, на которых нужно повторно проверять уже ошибочные поля. По умолчанию `input` и `change`. */\n\trevalidateOn?: ValidationTrigger | ValidationTrigger[];\n\n\t/** Задержка live-валидации в миллисекундах. По умолчанию `0`. */\n\tvalidationDebounce?: number;\n\n\t/** Атрибут с CSS-селектором контейнера для ошибки поля. По умолчанию `data-error-container`. */\n\terrorContainerAttribute?: string;\n\n\t/** Атрибут, куда пишется состояние поля: `validating`, `valid` или `invalid`. */\n\tvalidationStateAttribute?: string;\n\n\t/** Связывать текст ошибки с полем через `aria-describedby`. По умолчанию `true`. */\n\tariaDescribeErrors?: boolean;\n\n\t/** Префикс id для автоматически созданных элементов ошибок. */\n\terrorIdPrefix?: string;\n\n\t/** Error summary для всей формы. По умолчанию выключен; `true` включает дефолтный renderer. */\n\terrorSummary?: boolean | ErrorSummaryOptions;\n\n\t/** Следить за динамически добавленными/удалёнными полями и submit-кнопками. По умолчанию `false`. */\n\tobserveMutations?: boolean;\n\n\t/** Функция для обёртки отправляемых данных. */\n\twrapData?: (data: Record<string, any>) => Record<string, any>;\n\n\t/** Схема валидации: поле → массив правил + override-сообщения */\n\tvalidationSchema?: ValidationSchema;\n\n\t/** Валидаторы всей формы: cross-field, conditional required, date ranges и другие проверки над `getValues()`. */\n\tformValidators?: FormValidator | FormValidator[];\n}\n\nexport interface ErrorResponse {\n\tname: string;\n\t'error-msg': string;\n}\n\nexport interface ResponseBody {\n\t[key: string]: any;\n\tsuccess?: boolean;\n\terror?: boolean;\n\t'error-msg'?: string;\n\terrors?: ErrorResponse[];\n}\n\n/** Изначальная дефолтная схема. */\nconst INITIAL_DEFAULT_SCHEMA: ValidationSchema = {\n\ttel: {\n\t\tselector: 'input[type=\"tel\"]',\n\t\trules: ['tel'],\n\t},\n\temail: {\n\t\tselector: 'input[type=\"email\"]',\n\t\trules: ['email'],\n\t},\n\trequired: {\n\t\tselector: '[required]',\n\t\trules: ['required'],\n\t},\n\turl: {\n\t\tselector: 'input[type=\"url\"]',\n\t\trules: ['url'],\n\t},\n\t'not-numbers': {\n\t\tselector: 'input[data-validate=\"not-numbers\"]',\n\t\trules: ['not-numbers'],\n\t},\n};\n\n/**\n * Реализует форму отправки данных.\n *\n * @class\n */\nexport default class Form {\n\tpublic $el: HTMLFormElement;\n\tprivate options: FormOptions;\n\tprivate config: FormOptions;\n\tprivate $submits: SubmitElement[] = [];\n\tprivate waitResponse: boolean = false;\n\tprivate inputs: NodeListOf<FormFieldElement> | null = null;\n\tprivate _onSubmitHandler?: (e: Event) => void | Promise<void>;\n\tprivate _onSubmitClickHandler?: (e: Event) => void | Promise<void>;\n\tprivate fieldEventHandlers: Array<{\n\t\t$input: FormFieldElement;\n\t\tevent: Exclude<ValidationTrigger, 'submit'>;\n\t\thandler: EventListener;\n\t}> = [];\n\tprivate liveValidationTimers = new WeakMap<FormFieldElement, ReturnType<typeof setTimeout>>();\n\tprivate fieldValidationTokens = new WeakMap<FormFieldElement, number>();\n\tprivate fieldValidationTokenCounter = 0;\n\tprivate mutationObserver?: MutationObserver;\n\tprivate errors: ValidationError[] = [];\n\n\tprivate static get defaultParams(): Partial<FormOptions> {\n\t\treturn __shared.defaultParams;\n\t}\n\tprivate static set defaultParams(v: Partial<FormOptions>) {\n\t\t__shared.defaultParams = v;\n\t}\n\n\tstatic get defaultValidationSchema(): ValidationSchema {\n\t\treturn (__shared.defaultValidationSchema ??= INITIAL_DEFAULT_SCHEMA);\n\t}\n\n\tstatic set defaultValidationSchema(v: ValidationSchema) {\n\t\t__shared.defaultValidationSchema = v;\n\t}\n\n\t/**\n\t * Создать форму.\n\t *\n\t * @param {HTMLElement} $el - Элемент формы (тег form!).\n\t * @param {Object} options - Параметры формы.\n\t */\n\tconstructor($el: HTMLElement, options: FormOptions = {}) {\n\t\tthis.$el = $el as HTMLFormElement;\n\t\tthis.options = options;\n\n\t\tconst defaultConfig: FormOptions = {\n\t\t\tonSubmit: () => {},\n\t\t\tonResponse: () => {},\n\t\t\tonResponseSuccess: () => {},\n\t\t\tonResponseUnsuccess: () => {},\n\t\t\tcustomTypeError: null,\n\t\t\tloaderColor: '#fff',\n\t\t\tshowLoaderButton: true,\n\t\t\tscrollToFirstErroredInput: true,\n\t\t\tfocusFirstErroredInput: false,\n\t\t\tlogging: false,\n\t\t\tinputSelector: '.input',\n\t\t\tinputWrapperSelector: '.input-primary',\n\t\t\tvalidateOn: 'submit',\n\t\t\trevalidateOn: ['input', 'change'],\n\t\t\tvalidationDebounce: 0,\n\t\t\terrorContainerAttribute: 'data-error-container',\n\t\t\tvalidationStateAttribute: 'data-form-father-state',\n\t\t\tariaDescribeErrors: true,\n\t\t\terrorIdPrefix: 'form-father-error',\n\t\t\terrorSummary: false,\n\t\t\tobserveMutations: false,\n\t\t};\n\n\t\t/* Слияние параметров: глобальные параметры → пользовательские параметры */\n\t\tthis.config = Object.assign({}, defaultConfig, Form.defaultParams, options);\n\n\t\tif (this.$el) {\n\t\t\tthis.$submits = this.findSubmitElements();\n\t\t\tif (this.isCorrectArguments()) {\n\t\t\t\tthis.bindSubmitHandlers();\n\t\t\t\tthis.initialization();\n\t\t\t\tthis.bindFieldValidationEvents();\n\t\t\t\tthis.setupMutationObserver();\n\t\t\t\tFORM_INSTANCES.set(this.$el, this);\n\t\t\t}\n\t\t} else {\n\t\t\tconsole.warn('Empty $el');\n\t\t}\n\t}\n\n\tpublic getOptions(): FormOptions {\n\t\treturn this.options;\n\t}\n\n\t/**\n\t * Инициализирует сразу несколько форм по CSS-селектору. Если форма уже инициализирована, её настройки обновятся.\n\t *\n\t * @param selector - CSS-селектор форм. По умолчанию `form[data-form-father]`.\n\t * @param options - Общие параметры для найденных форм.\n\t */\n\tpublic static initAll(selector: string = 'form[data-form-father]', options: FormOptions = {}): Form[] {\n\t\t/* istanbul ignore next -- SSR guard: jsdom does not allow document to be unset cleanly. */\n\t\tif (typeof document === 'undefined') return [];\n\n\t\treturn Array.from(document.querySelectorAll<HTMLFormElement>(selector))\n\t\t\t.filter($form => $form.tagName === 'FORM')\n\t\t\t.map($form => {\n\t\t\t\tconst existing = FORM_INSTANCES.get($form);\n\t\t\t\tif (existing) {\n\t\t\t\t\texisting.updateOptions(options);\n\t\t\t\t\treturn existing;\n\t\t\t\t}\n\n\t\t\t\treturn new Form($form, options);\n\t\t\t});\n\t}\n\n\t/** Обновляет настройки конкретного инстанса формы без пересоздания обработчиков вручную. */\n\tpublic updateOptions(options: Partial<FormOptions>): this {\n\t\tthis.options = { ...this.options, ...options };\n\t\tthis.config = { ...this.config, ...options };\n\t\tthis.refreshControls();\n\t\tthis.bindSubmitHandlers();\n\t\tthis.bindFieldValidationEvents();\n\t\tthis.setupMutationObserver();\n\t\treturn this;\n\t}\n\n\t/** Возвращает текущий список ошибок формы. */\n\tpublic getErrors(): ValidationError[] {\n\t\treturn this.errors.map(error => ({ ...error }));\n\t}\n\n\t/** Возвращает значения формы обычным объектом. */\n\tpublic getValues(): Record<string, any> {\n\t\treturn serializeFormToJSON(this.$el);\n\t}\n\n\tprivate normalizeValueList(value: any): string[] {\n\t\treturn Array.isArray(value) ? value.map(String) : [String(value)];\n\t}\n\n\t/** Проставляет значения полей по `name` и уведомляет UI через `input`/`change` события. */\n\tpublic setValues(values: Record<string, any>): this {\n\t\tthis.getAllFields().forEach($field => {\n\t\t\tif (!$field.name || !Object.prototype.hasOwnProperty.call(values, $field.name)) return;\n\n\t\t\tconst value = values[$field.name];\n\t\t\tif ($field instanceof HTMLInputElement && $field.type === 'file') return;\n\n\t\t\tif ($field instanceof HTMLInputElement && $field.type === 'checkbox') {\n\t\t\t\tif (typeof value === 'boolean') {\n\t\t\t\t\t$field.checked = value;\n\t\t\t\t} else {\n\t\t\t\t\t$field.checked = this.normalizeValueList(value).includes($field.value);\n\t\t\t\t}\n\t\t\t} else if ($field instanceof HTMLInputElement && $field.type === 'radio') {\n\t\t\t\t$field.checked = String(value) === $field.value;\n\t\t\t} else if ($field instanceof HTMLSelectElement && $field.multiple) {\n\t\t\t\tconst valuesList = this.normalizeValueList(value);\n\t\t\t\tArray.from($field.options).forEach(option => {\n\t\t\t\t\toption.selected = valuesList.includes(option.value);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t$field.value = value == null ? '' : String(value);\n\t\t\t}\n\n\t\t\t$field.dispatchEvent(new Event('input', { bubbles: true }));\n\t\t\t$field.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t});\n\n\t\treturn this;\n\t}\n\n\t/** Снимает все клиентские и серверные ошибки с формы, не меняя значения полей. */\n\tpublic clearErrors(): this {\n\t\tthis.errors = [];\n\t\tthis.getAllFields().forEach($field => {\n\t\t\tthis.hideError($field);\n\t\t\tthis.clearFieldValidationState($field);\n\t\t});\n\t\tthis.hideErrorForm();\n\t\tthis.hideErrorSummary();\n\t\treturn this;\n\t}\n\n\tprivate isErrorResponse(issue: unknown): issue is ErrorResponse {\n\t\treturn (\n\t\t\t!!issue &&\n\t\t\ttypeof issue === 'object' &&\n\t\t\ttypeof (issue as ErrorResponse).name === 'string' &&\n\t\t\ttypeof (issue as ErrorResponse)['error-msg'] === 'string'\n\t\t);\n\t}\n\n\tprivate normalizeValidationIssues(\n\t\tissues: ValidationIssueInput | FormValidatorResult,\n\t\tsource: ValidationErrorSource,\n\t): ValidationIssue[] {\n\t\tif (issues == null || issues === true) return [];\n\t\tif (issues === false) return [{ message: 'Некорректные данные формы', source }];\n\t\tif (typeof issues === 'string') return [{ message: issues, source }];\n\n\t\tif (Array.isArray(issues)) {\n\t\t\treturn issues.flatMap(issue => this.normalizeValidationIssues(issue, source));\n\t\t}\n\n\t\tif (this.isErrorResponse(issues)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tfield: issues.name,\n\t\t\t\t\trule: source,\n\t\t\t\t\tmessage: issues['error-msg'],\n\t\t\t\t\tsource,\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\tif (typeof issues === 'object' && 'message' in issues && typeof (issues as ValidationIssue).message === 'string') {\n\t\t\treturn [{ ...(issues as ValidationIssue), source: (issues as ValidationIssue).source || source }];\n\t\t}\n\n\t\tif (typeof issues === 'object') {\n\t\t\treturn Object.entries(issues as Record<string, string>).map(([field, message]) => ({\n\t\t\t\tfield,\n\t\t\t\trule: source,\n\t\t\t\tmessage,\n\t\t\t\tsource,\n\t\t\t}));\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tprivate applyValidationIssue(issue: ValidationIssue, source: ValidationErrorSource): FormFieldElement | null {\n\t\tconst issueSource = issue.source || source;\n\t\tconst rule = issue.rule || issueSource;\n\t\tconst field = issue.field || FORM_ERROR_FIELD;\n\n\t\tif (field === FORM_ERROR_FIELD) {\n\t\t\tthis.setErrorRecord(FORM_ERROR_FIELD, rule, issue.message, issueSource);\n\t\t\tthis.showErrorForm(issue.message);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst $field = this.findFieldByName(field);\n\t\tif (!$field) {\n\t\t\tthis.setErrorRecord(field, rule, issue.message, issueSource);\n\t\t\tconsole.warn(`Не найдено поле с именем: ${field}, для вывода ошибки: ${issue.message}`);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.showFieldError($field, issue.message, issueSource, rule);\n\t\treturn $field;\n\t}\n\n\t/** Показывает несколько ошибок формы или полей: из backend map/array, `ErrorResponse[]` или form validators. */\n\tpublic setErrors(issues: ValidationIssueInput, source: ValidationErrorSource = 'server'): this {\n\t\tthis.normalizeValidationIssues(issues, source).forEach(issue => {\n\t\t\tthis.applyValidationIssue(issue, source);\n\t\t});\n\t\tthis.syncErrorSummary();\n\t\treturn this;\n\t}\n\n\tprivate async validateFormValidators(): Promise<{ ok: boolean; erroredInputs: FormFieldElement[] }> {\n\t\tconst validators = this.config.formValidators\n\t\t\t? Array.isArray(this.config.formValidators)\n\t\t\t\t? this.config.formValidators\n\t\t\t\t: [this.config.formValidators]\n\t\t\t: [];\n\t\tconst erroredInputs: FormFieldElement[] = [];\n\t\tlet ok = true;\n\n\t\tfor (const validator of validators) {\n\t\t\tconst result = await validator({\n\t\t\t\tform: this,\n\t\t\t\tformElement: this.$el,\n\t\t\t\tvalues: this.getValues(),\n\t\t\t\terrors: this.getErrors(),\n\t\t\t});\n\t\t\tconst issues = this.normalizeValidationIssues(result, 'client');\n\t\t\tif (issues.length === 0) continue;\n\n\t\t\tok = false;\n\t\t\tissues.forEach(issue => {\n\t\t\t\tconst $field = this.applyValidationIssue(issue, 'client');\n\t\t\t\tif ($field) erroredInputs.push($field);\n\t\t\t});\n\t\t}\n\n\t\treturn { ok, erroredInputs };\n\t}\n\n\t/** Сбрасывает форму через native `reset()` и опционально очищает ошибки. */\n\tpublic reset(options: FormResetOptions = {}): this {\n\t\tthis.$el.reset();\n\t\tthis.refreshControls();\n\n\t\tif (options.clearErrors !== false) {\n\t\t\tthis.clearErrors();\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Обновляет параметры по умолчанию для настроек формы. Метод объединяет переданные параметры с уже существующими\n\t * параметрами по умолчанию.\n\t *\n\t * @param {Partial<FormOptions>} params - Объект, содержащий новые значения параметров. Можно передать только те\n\t * свойства, которые необходимо обновить; остальные сохранятся без изменений.\n\t */\n\tpublic static setDefaultParams(params: Partial<FormOptions>) {\n\t\tthis.defaultParams = { ...this.defaultParams, ...params };\n\t}\n\n\tprivate refreshControls(): void {\n\t\tthis.inputs = this.$el.querySelectorAll(this.config.inputSelector!) as NodeListOf<FormFieldElement>;\n\t}\n\n\tprivate findSubmitElements(): SubmitElement[] {\n\t\treturn Array.from(\n\t\t\tthis.$el.querySelectorAll('input[type=\"submit\"], input[type=\"image\"], button[type=\"submit\"], button:not([type])'),\n\t\t) as SubmitElement[];\n\t}\n\n\tprivate bindSubmitHandlers(): void {\n\t\tif (!this._onSubmitClickHandler) {\n\t\t\tthis._onSubmitClickHandler = async (e: Event) => {\n\t\t\t\tawait this.handleSubmitEvent(e);\n\t\t\t};\n\t\t}\n\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.removeEventListener('click', this._onSubmitClickHandler as EventListener);\n\t\t});\n\n\t\tthis.$submits = this.findSubmitElements();\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.addEventListener('click', this._onSubmitClickHandler as EventListener);\n\t\t});\n\t}\n\n\tprivate initialization() {\n\t\tthis.refreshControls();\n\n\t\tthis._onSubmitHandler = async (e: Event) => {\n\t\t\tawait this.handleSubmitEvent(e);\n\t\t};\n\t\tthis.$el.addEventListener('submit', this._onSubmitHandler as EventListener);\n\t}\n\n\tprivate async handleSubmitEvent(e: Event): Promise<SubmitResult | undefined> {\n\t\te.preventDefault();\n\t\tthis.config.onBeforeValidate?.(this);\n\n\t\tconst isValid = await this.validate();\n\n\t\tthis.config.onAfterValidate?.(isValid, this);\n\n\t\tif (!isValid) {\n\t\t\tthis.config.onValidationError?.(this.getErrors(), this);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: this.getErrors(),\n\t\t\t};\n\t\t}\n\n\t\treturn this.submit();\n\t}\n\n\tprivate normalizeTriggers(\n\t\tvalue: ValidationTrigger | ValidationTrigger[] | undefined,\n\t\tfallback: ValidationTrigger[],\n\t): ValidationTrigger[] {\n\t\tconst triggers = value == null ? fallback : Array.isArray(value) ? value : [value];\n\t\treturn Array.from(new Set(triggers));\n\t}\n\n\tprivate clearFieldValidationEvents(): void {\n\t\tthis.fieldEventHandlers.forEach(({ $input, event, handler }) => {\n\t\t\t$input.removeEventListener(event, handler);\n\t\t});\n\t\tthis.fieldEventHandlers = [];\n\t}\n\n\tprivate bindFieldValidationEvents(): void {\n\t\tthis.clearFieldValidationEvents();\n\n\t\tconst validateOn = this.normalizeTriggers(this.config.validateOn, ['submit']).filter(\n\t\t\t(event): event is Exclude<ValidationTrigger, 'submit'> => event !== 'submit',\n\t\t);\n\t\tconst revalidateOn = this.normalizeTriggers(this.config.revalidateOn, ['input', 'change']).filter(\n\t\t\t(event): event is Exclude<ValidationTrigger, 'submit'> => event !== 'submit',\n\t\t);\n\t\tconst events = Array.from(new Set([...validateOn, ...revalidateOn]));\n\t\tif (events.length === 0) return;\n\n\t\tconst fields = this.getAllFields();\n\t\tfields.forEach($input => {\n\t\t\tevents.forEach(event => {\n\t\t\t\tconst handler: EventListener = () => {\n\t\t\t\t\tconst shouldValidate = validateOn.includes(event) || this.hasFieldError($input);\n\t\t\t\t\tif (shouldValidate) this.scheduleFieldValidation($input);\n\t\t\t\t};\n\n\t\t\t\t$input.addEventListener(event, handler);\n\t\t\t\tthis.fieldEventHandlers.push({ $input, event, handler });\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate scheduleFieldValidation($input: FormFieldElement): void {\n\t\tconst currentTimer = this.liveValidationTimers.get($input);\n\t\tif (currentTimer) clearTimeout(currentTimer);\n\n\t\tconst delay = Math.max(0, Number(this.config.validationDebounce) || 0);\n\t\tconst run = () => {\n\t\t\tvoid this.validateField($input);\n\t\t};\n\n\t\tif (delay === 0) {\n\t\t\trun();\n\t\t\treturn;\n\t\t}\n\n\t\tconst timer = setTimeout(run, delay);\n\t\tthis.liveValidationTimers.set($input, timer);\n\t}\n\n\tprivate setupMutationObserver(): void {\n\t\tthis.mutationObserver?.disconnect();\n\t\tthis.mutationObserver = undefined;\n\n\t\tif (!this.config.observeMutations || typeof MutationObserver === 'undefined') return;\n\n\t\tthis.mutationObserver = new MutationObserver(() => {\n\t\t\tthis.refreshControls();\n\t\t\tthis.bindSubmitHandlers();\n\t\t\tthis.bindFieldValidationEvents();\n\t\t});\n\t\tthis.mutationObserver.observe(this.$el, {\n\t\t\tchildList: true,\n\t\t\tsubtree: true,\n\t\t});\n\t}\n\n\tprivate getErrorContainer($input: FormFieldElement): HTMLElement | null {\n\t\tconst attrName = this.config.errorContainerAttribute || 'data-error-container';\n\t\tconst selector = $input.getAttribute(attrName);\n\t\tif (!selector) return null;\n\n\t\ttry {\n\t\t\treturn document.querySelector(selector) as HTMLElement | null;\n\t\t} catch {\n\t\t\tconsole.warn(`[FormFather] Invalid error container selector \"${selector}\"`);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate toSafeIdPart(value: string): string {\n\t\tconst normalized = value.trim().toLowerCase().replace(/[^a-z0-9_-]+/gi, '-');\n\t\tlet start = 0;\n\t\tlet end = normalized.length;\n\n\t\twhile (start < end && normalized[start] === '-') {\n\t\t\tstart += 1;\n\t\t}\n\n\t\twhile (end > start && normalized[end - 1] === '-') {\n\t\t\tend -= 1;\n\t\t}\n\n\t\treturn normalized.slice(start, end) || 'field';\n\t}\n\n\tprivate createErrorId($input: FormFieldElement): string {\n\t\tconst prefix = this.config.errorIdPrefix || 'form-father-error';\n\t\treturn `${this.toSafeIdPart(prefix)}-${this.toSafeIdPart(this.getFieldKey($input))}-${++errorIdCounter}`;\n\t}\n\n\tprivate ensureElementId($input: FormFieldElement, $error: HTMLElement): string {\n\t\tif (!$error.id) {\n\t\t\t$error.id = $input.getAttribute(ERROR_DESCRIBEDBY_ID_ATTRIBUTE) || this.createErrorId($input);\n\t\t}\n\t\treturn $error.id;\n\t}\n\n\tprivate addErrorDescription($input: FormFieldElement, $error: HTMLElement): void {\n\t\tif (!$error.hasAttribute('role')) $error.setAttribute('role', 'alert');\n\n\t\tconst errorId = this.ensureElementId($input, $error);\n\t\t$input.setAttribute(ERROR_DESCRIBEDBY_ID_ATTRIBUTE, errorId);\n\n\t\tif (this.config.ariaDescribeErrors === false) return;\n\n\t\tconst currentIds = ($input.getAttribute('aria-describedby') || '').split(/\\s+/).filter(Boolean);\n\t\tif (!currentIds.includes(errorId)) {\n\t\t\t$input.setAttribute('aria-describedby', [...currentIds, errorId].join(' '));\n\t\t\t$input.setAttribute(ADDED_DESCRIBEDBY_ID_ATTRIBUTE, errorId);\n\t\t}\n\t}\n\n\tprivate removeErrorDescription($input: FormFieldElement): void {\n\t\tconst addedId = $input.getAttribute(ADDED_DESCRIBEDBY_ID_ATTRIBUTE);\n\t\tif (addedId) {\n\t\t\tconst nextIds = ($input.getAttribute('aria-describedby') || '')\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter(id => id && id !== addedId);\n\n\t\t\tif (nextIds.length > 0) {\n\t\t\t\t$input.setAttribute('aria-describedby', nextIds.join(' '));\n\t\t\t} else {\n\t\t\t\t$input.removeAttribute('aria-describedby');\n\t\t\t}\n\t\t}\n\n\t\t$input.removeAttribute(ERROR_DESCRIBEDBY_ID_ATTRIBUTE);\n\t\t$input.removeAttribute(ADDED_DESCRIBEDBY_ID_ATTRIBUTE);\n\t}\n\n\t/**\n\t * Показывает ошибку для поля ввода.\n\t *\n\t * @param {HTMLInputElement} $input - Поле ввода.\n\t * @param {String} text - Текст ошибки.\n\t */\n\tprivate showError($input: FormFieldElement, text: string) {\n\t\t$input.setAttribute('aria-invalid', 'true');\n\n\t\tconst $errorContainer = this.getErrorContainer($input);\n\t\tif ($errorContainer) {\n\t\t\t$errorContainer.textContent = text;\n\t\t\tthis.addErrorDescription($input, $errorContainer);\n\t\t\t$errorContainer.removeAttribute('hidden');\n\t\t\treturn;\n\t\t}\n\n\t\tconst $inputWrapper = closest($input, this.config.inputWrapperSelector!);\n\t\tif (!$inputWrapper) {\n\t\t\tconsole.warn(`Не найдена обёртка для поля с именем: ${$input.name || $input.type}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst customShowError = ($inputWrapper as any).showError;\n\t\tif (typeof customShowError === 'function') {\n\t\t\tcustomShowError.call($inputWrapper, text);\n\t\t\tconst $customError = $inputWrapper.querySelector('[data-form-father-error]') as HTMLElement | null;\n\t\t\tif ($customError) this.addErrorDescription($input, $customError);\n\t\t\treturn;\n\t\t}\n\n\t\t$inputWrapper.classList.add('input__wrapper--error');\n\n\t\tlet $error = $inputWrapper.querySelector('[data-form-father-error]') as HTMLElement | null;\n\t\tif (!$error) {\n\t\t\t$error = document.createElement('div');\n\t\t\t$error.setAttribute('data-form-father-error', '');\n\t\t\t$error.setAttribute('role', 'alert');\n\t\t\t$input.insertAdjacentElement('afterend', $error);\n\t\t}\n\t\t$error.textContent = text;\n\t\tthis.addErrorDescription($input, $error);\n\t}\n\n\t/** Показывает лоадер */\n\tprivate showLoader() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.classList.add('button--loading');\n\n\t\t\tif ($submit.querySelector('.button__loader')) return;\n\n\t\t\tconst gradientId = `form-father-loader-${loaderIdCounter++}`;\n\t\t\tconst loaderSvg = `\n\t\t\t\t<svg height=\"38\" viewBox=\"0 0 38 38\" width=\"38\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t<defs>\n\t\t\t\t\t<linearGradient id=\"${gradientId}\" x1=\"8.042%\" x2=\"65.682%\" y1=\"0%\" y2=\"23.865%\">\n\t\t\t\t\t\t<stop offset=\"0%\" stop-color=\"${this.config.loaderColor}\" stop-opacity=\"0\"/>\n\t\t\t\t\t\t<stop offset=\"63.146%\" stop-color=\"${this.config.loaderColor}\" stop-opacity=\".631\"/>\n\t\t\t\t\t\t<stop offset=\"100%\" stop-color=\"${this.config.loaderColor}\"/>\n\t\t\t\t\t</linearGradient>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<g fill-rule=\"evenodd\" fill=\"none\">\n\t\t\t\t\t<g transform=\"translate(1 1)\">\n\t\t\t\t\t\t<path d=\"M36 18c0-9.94-8.06-18-18-18\" id=\"Oval-2\" stroke-width=\"5\" stroke=\"url(#${gradientId})\"></path>\n\t\t\t\t\t\t<circle cx=\"36\" cy=\"18\" fill=\"${this.config.loaderColor}\" r=\"1\"></circle>\n\t\t\t\t\t</g>\n\t\t\t\t\t</g>\n\t\t\t\t</svg>\n\t\t\t`;\n\n\t\t\tconst $loaderEl = document.createElement('span');\n\t\t\t$loaderEl.innerHTML = loaderSvg;\n\t\t\t$loaderEl.className = 'button__loader';\n\t\t\t$submit.insertAdjacentElement('afterbegin', $loaderEl);\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\t$loaderEl.setAttribute('data-showed', '');\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Скрывает лоадер */\n\tprivate hideLoader() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.classList.remove('button--loading');\n\t\t\tconst $loader = $submit.querySelector('.button__loader') as HTMLElement | null;\n\t\t\tif ($loader) {\n\t\t\t\t$loader.classList.remove('active');\n\t\t\t\t$loader.removeAttribute('data-showed');\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t$loader.remove();\n\t\t\t\t}, 250);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Скрывает ошибку.\n\t *\n\t * @param {HTMLInputElement} $input - Поле ввода.\n\t */\n\tprivate hideError($input: FormFieldElement) {\n\t\tconst $inputWrapper = closest($input, this.config.inputWrapperSelector!) || $input.parentElement;\n\t\tconst $errorContainer = this.getErrorContainer($input);\n\n\t\t$input.removeAttribute('aria-invalid');\n\t\tthis.removeErrorDescription($input);\n\t\tif ($errorContainer) {\n\t\t\t$errorContainer.textContent = '';\n\t\t\t$errorContainer.setAttribute('hidden', '');\n\t\t}\n\t\t$inputWrapper?.querySelector('[data-form-father-error]')?.remove();\n\t\t$inputWrapper?.classList.remove('input__wrapper--error');\n\n\t\tif ($inputWrapper && $inputWrapper.classList.contains('input__wrapper')) {\n\t\t\tconst dataTypeError = $inputWrapper.getAttribute('data-type-error') || 'default';\n\n\t\t\tif (dataTypeError === 'default') {\n\t\t\t\t// Init error elements\n\t\t\t\t// const { $inputErrorIcon, $inputErrorBadge } = this.initErrorElements($inputWrapper, dataTypeError);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getErrorSummaryOptions(): ErrorSummaryOptions | null {\n\t\tif (!this.config.errorSummary) return null;\n\t\treturn this.config.errorSummary === true ? {} : this.config.errorSummary;\n\t}\n\n\tprivate getErrorSummaryContainer(options: ErrorSummaryOptions, create: boolean): HTMLElement | null {\n\t\tif (options.selector) {\n\t\t\ttry {\n\t\t\t\treturn (\n\t\t\t\t\t(this.$el.querySelector(options.selector) as HTMLElement | null) ||\n\t\t\t\t\t(document.querySelector(options.selector) as HTMLElement | null)\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tconsole.warn(`[FormFather] Invalid error summary selector \"${options.selector}\"`);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tconst existing = this.$el.querySelector(`[${ERROR_SUMMARY_ATTRIBUTE}]`) as HTMLElement | null;\n\t\tif (existing || !create) return existing;\n\n\t\tconst $summary = document.createElement('div');\n\t\t$summary.setAttribute(ERROR_SUMMARY_ATTRIBUTE, '');\n\t\tthis.$el.insertAdjacentElement('afterbegin', $summary);\n\t\treturn $summary;\n\t}\n\n\tprivate prepareErrorSummaryContainer($summary: HTMLElement): void {\n\t\t$summary.setAttribute(ERROR_SUMMARY_ATTRIBUTE, '');\n\t\tif (!$summary.hasAttribute('role')) $summary.setAttribute('role', 'alert');\n\t\tif (!$summary.hasAttribute('tabindex')) $summary.setAttribute('tabindex', '-1');\n\t\t$summary.removeAttribute('hidden');\n\t}\n\n\tprivate focusErrorSummary($summary: HTMLElement): void {\n\t\ttry {\n\t\t\t$summary.focus({ preventScroll: true });\n\t\t} catch {\n\t\t\t$summary.focus();\n\t\t}\n\t}\n\n\tprivate focusFieldFromSummary($field: FormFieldElement): void {\n\t\tif (typeof $field.scrollIntoView === 'function') {\n\t\t\t$field.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\t\t}\n\n\t\ttry {\n\t\t\t$field.focus({ preventScroll: true });\n\t\t} catch {\n\t\t\t$field.focus();\n\t\t}\n\t}\n\n\tprivate renderDefaultErrorSummary($summary: HTMLElement, errors: ValidationError[], options: ErrorSummaryOptions): void {\n\t\t$summary.textContent = '';\n\n\t\tconst $title = document.createElement('p');\n\t\t$title.setAttribute('data-form-father-summary-title', '');\n\t\t$title.textContent = options.title || 'Проверьте поля формы';\n\n\t\tconst $list = document.createElement('ul');\n\t\t$list.setAttribute('data-form-father-summary-list', '');\n\n\t\terrors.forEach(error => {\n\t\t\tconst $item = document.createElement('li');\n\t\t\tconst $field = error.field === FORM_ERROR_FIELD ? null : this.findFieldByName(error.field);\n\n\t\t\tif ($field) {\n\t\t\t\tconst $button = document.createElement('button');\n\t\t\t\t$button.type = 'button';\n\t\t\t\t$button.setAttribute('data-form-father-summary-field', error.field);\n\t\t\t\t$button.textContent = error.message;\n\t\t\t\t$button.addEventListener('click', () => this.focusFieldFromSummary($field));\n\t\t\t\t$item.appendChild($button);\n\t\t\t} else {\n\t\t\t\tconst $message = document.createElement('span');\n\t\t\t\t$message.textContent = error.message;\n\t\t\t\t$item.appendChild($message);\n\t\t\t}\n\n\t\t\t$list.appendChild($item);\n\t\t});\n\n\t\t$summary.append($title, $list);\n\t}\n\n\tprivate renderErrorSummary(errors: ValidationError[] = this.getErrors()): void {\n\t\tconst options = this.getErrorSummaryOptions();\n\t\tif (!options) return;\n\n\t\tif (errors.length === 0) {\n\t\t\tthis.hideErrorSummary();\n\t\t\treturn;\n\t\t}\n\n\t\tconst $summary = this.getErrorSummaryContainer(options, true);\n\t\tif (!$summary) return;\n\n\t\tthis.prepareErrorSummaryContainer($summary);\n\n\t\tconst rendered = options.render?.(errors.map(error => ({ ...error })), this);\n\t\tif (rendered instanceof HTMLElement) {\n\t\t\t$summary.replaceChildren(rendered);\n\t\t} else if (typeof rendered === 'string') {\n\t\t\t$summary.innerHTML = rendered;\n\t\t} else if (!options.render) {\n\t\t\tthis.renderDefaultErrorSummary($summary, errors, options);\n\t\t}\n\n\t\tif (options.focus) this.focusErrorSummary($summary);\n\t}\n\n\tprivate hideErrorSummary(): void {\n\t\tconst options = this.getErrorSummaryOptions() || {};\n\t\tconst $summary = this.getErrorSummaryContainer(options, false);\n\t\tif (!$summary) return;\n\n\t\t$summary.replaceChildren();\n\t\t$summary.setAttribute('hidden', '');\n\t}\n\n\tprivate syncErrorSummary(): void {\n\t\tif (this.errors.length === 0) {\n\t\t\tthis.hideErrorSummary();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.renderErrorSummary();\n\t}\n\n\t/**\n\t * Проскроливает до первого ошибочного поля.\n\t *\n\t * @param {HTMLElement[]} inputsList - Массив элементов с ошибкой.\n\t */\n\tprivate scrollToFirstErroredInput(inputsList: HTMLElement[]) {\n\t\tif (inputsList.length > 0) {\n\t\t\tconst allInputInFormList = Array.from(this.$el.querySelectorAll('input, textarea, select'));\n\t\t\tlet $firstInputOnForm: HTMLElement | null = null;\n\t\t\tlet minIndex = Infinity;\n\n\t\t\tinputsList.forEach($input => {\n\t\t\t\tconst findIndex = allInputInFormList.findIndex($item => $item === $input);\n\t\t\t\tif (findIndex < minIndex) {\n\t\t\t\t\tminIndex = findIndex;\n\t\t\t\t\t$firstInputOnForm = $input;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif ($firstInputOnForm) {\n\t\t\t\tconst rect = ($firstInputOnForm as HTMLElement).getBoundingClientRect();\n\t\t\t\tconst scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\t\t\t\tconst scrollTargetY = rect.top + scrollTop - window.innerHeight / 2;\n\n\t\t\t\tdocument.documentElement.setAttribute('data-now-scrolling', '');\n\n\t\t\t\twindow.scrollTo({\n\t\t\t\t\ttop: scrollTargetY,\n\t\t\t\t\tbehavior: 'smooth',\n\t\t\t\t});\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tdocument.documentElement.removeAttribute('data-now-scrolling');\n\t\t\t\t}, 800);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate focusFirstErroredInput(inputsList: HTMLElement[]) {\n\t\tif (inputsList.length === 0) return;\n\n\t\tconst allInputInFormList = Array.from(this.$el.querySelectorAll('input, textarea, select'));\n\t\tconst $firstInputOnForm = inputsList\n\t\t\t.slice()\n\t\t\t.sort((a, b) => allInputInFormList.indexOf(a) - allInputInFormList.indexOf(b))[0] as HTMLElement | undefined;\n\n\t\t$firstInputOnForm?.focus?.({ preventScroll: true });\n\t}\n\n\tprivate getValidationSchema(): ValidationSchema {\n\t\treturn {\n\t\t\t...(Form.defaultValidationSchema || {}),\n\t\t\t...(this.config.validationSchema || {}),\n\t\t};\n\t}\n\n\tprivate getAllFields($block: HTMLElement = this.$el): FormFieldElement[] {\n\t\treturn Array.from($block.querySelectorAll<FormFieldElement>('input, textarea, select'));\n\t}\n\n\tprivate getFieldKey($input: FormFieldElement): string {\n\t\treturn $input.name || $input.id || $input.getAttribute('data-field') || $input.type || 'field';\n\t}\n\n\tprivate hasFieldError($input: FormFieldElement): boolean {\n\t\tconst field = this.getFieldKey($input);\n\t\treturn $input.getAttribute('aria-invalid') === 'true' || this.errors.some(error => error.field === field);\n\t}\n\n\tprivate clearFieldErrorRecord($input: FormFieldElement): void {\n\t\tconst field = this.getFieldKey($input);\n\t\tthis.errors = this.errors.filter(error => error.field !== field);\n\t}\n\n\tprivate setErrorRecord(field: string, rule: string, message: string, source: ValidationErrorSource): void {\n\t\tthis.errors.push({\n\t\t\tfield,\n\t\t\trule,\n\t\t\tmessage,\n\t\t\tsource,\n\t\t});\n\t}\n\n\tprivate getValidationStateAttribute(): string {\n\t\treturn this.config.validationStateAttribute || 'data-form-father-state';\n\t}\n\n\tprivate setFieldValidationState($input: FormFieldElement, state: 'validating' | 'valid' | 'invalid' | null): void {\n\t\tconst attr = this.getValidationStateAttribute();\n\t\tif (state) {\n\t\t\t$input.setAttribute(attr, state);\n\t\t} else {\n\t\t\t$input.removeAttribute(attr);\n\t\t}\n\t}\n\n\tprivate startFieldValidation($input: FormFieldElement): number {\n\t\tconst token = ++this.fieldValidationTokenCounter;\n\t\tthis.fieldValidationTokens.set($input, token);\n\t\t$input.setAttribute('aria-busy', 'true');\n\t\tthis.setFieldValidationState($input, 'validating');\n\t\treturn token;\n\t}\n\n\tprivate isLatestFieldValidation($input: FormFieldElement, token?: number): boolean {\n\t\treturn token == null || this.fieldValidationTokens.get($input) === token;\n\t}\n\n\tprivate finishFieldValidation($input: FormFieldElement, token: number, isValid: boolean): void {\n\t\tif (!this.isLatestFieldValidation($input, token)) return;\n\n\t\t$input.removeAttribute('aria-busy');\n\t\tthis.setFieldValidationState($input, isValid ? 'valid' : 'invalid');\n\t}\n\n\tprivate clearFieldValidationState($input: FormFieldElement): void {\n\t\tthis.fieldValidationTokens.delete($input);\n\t\t$input.removeAttribute('aria-busy');\n\t\tthis.setFieldValidationState($input, null);\n\t}\n\n\tprivate setValidationError(\n\t\t$input: FormFieldElement,\n\t\trule: string,\n\t\tmessage: string,\n\t\tsource: ValidationErrorSource,\n\t): void {\n\t\tthis.clearFieldErrorRecord($input);\n\t\tthis.setErrorRecord(this.getFieldKey($input), rule, message, source);\n\t}\n\n\tprivate resolveField(field: FieldReference): FormFieldElement | null {\n\t\tif (typeof field !== 'string') return field;\n\t\treturn this.findFieldByName(field);\n\t}\n\n\tprivate parseRuleString(ruleString: string): ValidationRule {\n\t\tconst [rule, ...params] = ruleString.split(':').map(s => s.trim());\n\t\treturn params.length > 0 ? { rule, params: params.length === 1 ? params[0] : params } : rule;\n\t}\n\n\tprivate parseValidationAttribute(value: string | null): ValidationRule[] {\n\t\treturn (value ?? '')\n\t\t\t.split(/[,\\s|]+/)\n\t\t\t.map(s => s.trim())\n\t\t\t.filter(Boolean)\n\t\t\t.map(ruleString => this.parseRuleString(ruleString));\n\t}\n\n\tprivate getRuleName(rule: ValidationRule): string {\n\t\treturn typeof rule === 'string' ? rule : rule.rule;\n\t}\n\n\tprivate getRuleIdentity(rule: ValidationRule): string {\n\t\treturn JSON.stringify(rule);\n\t}\n\n\tprivate collectRules(\n\t\t$input: FormFieldElement,\n\t\tfromSchema: ValidationRule[] = [],\n\t\tschemaKeys: Set<string> = new Set(),\n\t): ValidationRule[] {\n\t\tconst list: ValidationRule[] = [];\n\n\t\tif ($input.hasAttribute('required')) list.push('required');\n\t\tlist.push(...fromSchema);\n\n\t\tconst dataValidateRules = this.parseValidationAttribute($input.getAttribute('data-validate')).filter(rule => {\n\t\t\tconst ruleName = this.getRuleName(rule);\n\t\t\treturn getValidator(ruleName) || !schemaKeys.has(ruleName);\n\t\t});\n\t\tlist.push(...dataValidateRules);\n\t\tlist.push(...this.parseValidationAttribute($input.getAttribute('data-custom-validate')));\n\n\t\tconst filtered: ValidationRule[] = [];\n\t\tconst seen = new Set<string>();\n\t\tfor (const rule of list) {\n\t\t\tconst ruleName = this.getRuleName(rule);\n\t\t\tif (!getValidator(ruleName)) {\n\t\t\t\tconsole.warn(`[FormFather] Unknown validation rule \"${ruleName}\"`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst identity = this.getRuleIdentity(rule);\n\t\t\tif (seen.has(identity)) continue;\n\t\t\tseen.add(identity);\n\t\t\tfiltered.push(rule);\n\t\t}\n\n\t\treturn filtered;\n\t}\n\n\tprivate getRuleMessage(\n\t\t$input: FormFieldElement,\n\t\trule: string,\n\t\tmessages: Record<string, string>,\n\t\tdefaultMessage: string,\n\t\toverrideMessage?: string,\n\t): string {\n\t\tconst attrMessage = $input.getAttribute(`data-error-${rule}`);\n\t\treturn overrideMessage || attrMessage || messages[rule] || defaultMessage;\n\t}\n\n\tprivate fieldMatchesSchemaDefinition(\n\t\t$input: FormFieldElement,\n\t\tkey: string,\n\t\tdef: ValidationSchema[string],\n\t): boolean {\n\t\tif (def.selector) {\n\t\t\ttry {\n\t\t\t\treturn $input.matches(def.selector);\n\t\t\t} catch {\n\t\t\t\tconsole.warn(`[FormFather] Invalid validation selector \"${def.selector}\"`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn this.parseValidationAttribute($input.getAttribute('data-validate')).some(rule => this.getRuleName(rule) === key);\n\t}\n\n\tprivate getFieldValidationConfig(\n\t\t$input: FormFieldElement,\n\t\tschema: ValidationSchema = this.getValidationSchema(),\n\t): { rules: ValidationRule[]; messages: Record<string, string> } {\n\t\tconst rules: ValidationRule[] = [];\n\t\tconst messages: Record<string, string> = {};\n\n\t\tfor (const [key, def] of Object.entries(schema)) {\n\t\t\tif (!this.fieldMatchesSchemaDefinition($input, key, def)) continue;\n\t\t\trules.push(...def.rules);\n\t\t\tObject.assign(messages, def.messages || {});\n\t\t}\n\n\t\treturn {\n\t\t\trules: this.collectRules($input, rules, new Set(Object.keys(schema))),\n\t\t\tmessages,\n\t\t};\n\t}\n\n\tprivate getValidationFields($block: HTMLElement, schema: ValidationSchema): FormFieldElement[] {\n\t\tconst fields = new Set<FormFieldElement>();\n\t\tconst addFields = (nodeList: NodeListOf<Element>) => {\n\t\t\tArray.from(nodeList).forEach($input => {\n\t\t\t\tif (\n\t\t\t\t\t$input instanceof HTMLInputElement ||\n\t\t\t\t\t$input instanceof HTMLTextAreaElement ||\n\t\t\t\t\t$input instanceof HTMLSelectElement\n\t\t\t\t) {\n\t\t\t\t\tfields.add($input);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tfor (const [key, def] of Object.entries(schema)) {\n\t\t\tif (def.selector) {\n\t\t\t\ttry {\n\t\t\t\t\taddFields($block.querySelectorAll(def.selector));\n\t\t\t\t} catch {\n\t\t\t\t\tconsole.warn(`[FormFather] Invalid validation selector \"${def.selector}\"`);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.getAllFields($block)\n\t\t\t\t.filter($input =>\n\t\t\t\t\tthis.parseValidationAttribute($input.getAttribute('data-validate')).some(rule => this.getRuleName(rule) === key),\n\t\t\t\t)\n\t\t\t\t.forEach($input => fields.add($input));\n\t\t}\n\n\t\taddFields($block.querySelectorAll('[required], [data-validate], [data-custom-validate]'));\n\t\treturn Array.from(fields);\n\t}\n\n\tprivate async validateInput(\n\t\t$input: FormFieldElement,\n\t\trules: ValidationRule[],\n\t\tmessages: Record<string, string> = {},\n\t\t$block: HTMLElement = this.$el,\n\t\tvalidationToken?: number,\n\t): Promise<boolean> {\n\t\tif ($input.hasAttribute('data-no-validate')) return true;\n\n\t\tconst isCheckable =\n\t\t\t$input instanceof HTMLInputElement && ($input.type === 'checkbox' || $input.type === 'radio');\n\t\tconst empty = isCheckable ? !$input.checked : $input.value.trim().length === 0;\n\t\tconst hasRequiredRule = rules.some(rule => this.getRuleName(rule) === 'required');\n\n\t\tif (empty && !hasRequiredRule) {\n\t\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\t\t\tthis.clearFieldErrorRecord($input);\n\t\t\tthis.hideError($input);\n\t\t\treturn true;\n\t\t}\n\n\t\tfor (const validationRule of rules) {\n\t\t\tconst { rule, params } =\n\t\t\t\ttypeof validationRule === 'string'\n\t\t\t\t\t? { rule: validationRule, params: undefined }\n\t\t\t\t\t: { rule: validationRule.rule, params: validationRule.params };\n\t\t\tconst validator = getValidator(rule);\n\t\t\tif (!validator) continue;\n\n\t\t\tconst raw = await validator.fn($input.value, $input, $block, params);\n\t\t\tconst isObjectResult = typeof raw === 'object' && raw !== null;\n\t\t\tconst passed = isObjectResult ? (raw as any).valid === true : !!raw;\n\n\t\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\n\t\t\tif (isObjectResult && (raw as any).effect) {\n\t\t\t\tawait (raw as any).effect({\n\t\t\t\t\tvalue: $input.value,\n\t\t\t\t\t$input,\n\t\t\t\t\t$form: $block,\n\t\t\t\t\tparams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\n\t\t\tif (!passed) {\n\t\t\t\tconst result = raw as any;\n\t\t\t\tconst message = this.getRuleMessage(\n\t\t\t\t\t$input,\n\t\t\t\t\trule,\n\t\t\t\t\tmessages,\n\t\t\t\t\tvalidator.defaultMessage,\n\t\t\t\t\tisObjectResult && typeof result.message === 'string' ? result.message : undefined,\n\t\t\t\t);\n\n\t\t\t\tthis.setValidationError($input, rule, message, 'client');\n\t\t\t\tthis.showError($input, message);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (isObjectResult && (raw as any).stopOthers) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.isLatestFieldValidation($input, validationToken)) return !this.hasFieldError($input);\n\t\tthis.clearFieldErrorRecord($input);\n\t\tthis.hideError($input);\n\t\treturn true;\n\t}\n\n\tprivate async runFieldValidation(\n\t\t$input: FormFieldElement,\n\t\trules: ValidationRule[],\n\t\tmessages: Record<string, string> = {},\n\t\t$block: HTMLElement = this.$el,\n\t): Promise<boolean> {\n\t\tconst validationToken = this.startFieldValidation($input);\n\n\t\ttry {\n\t\t\tconst isValid = await this.validateInput($input, rules, messages, $block, validationToken);\n\t\t\tthis.finishFieldValidation($input, validationToken, isValid);\n\t\t\treturn isValid;\n\t\t} catch (error) {\n\t\t\tif (this.isLatestFieldValidation($input, validationToken)) {\n\t\t\t\tthis.clearFieldValidationState($input);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate getRadioGroup($input: FormFieldElement, $block: HTMLElement): HTMLInputElement[] {\n\t\tif (!($input instanceof HTMLInputElement) || $input.type !== 'radio' || !$input.name) return [];\n\n\t\treturn Array.from($block.querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')).filter(\n\t\t\t$radio => $radio.name === $input.name,\n\t\t);\n\t}\n\n\t/** Показывает ошибку конкретного поля по имени или DOM-элементу. */\n\tpublic showFieldError(\n\t\tfield: FieldReference,\n\t\tmessage: string,\n\t\tsource: ValidationErrorSource = 'manual',\n\t\trule: string = source,\n\t): boolean {\n\t\tconst $field = this.resolveField(field);\n\t\tif (!$field) {\n\t\t\tconsole.warn(`[FormFather] Field \"${String(field)}\" not found`);\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.setValidationError($field, rule, message, source);\n\t\tthis.showError($field, message);\n\t\t$field.removeAttribute('aria-busy');\n\t\tthis.setFieldValidationState($field, 'invalid');\n\t\tthis.syncErrorSummary();\n\t\treturn true;\n\t}\n\n\t/** Проверяет одно поле по имени или DOM-элементу. */\n\tpublic async validateField(field: FieldReference): Promise<boolean> {\n\t\tconst $field = this.resolveField(field);\n\t\tif (!$field) {\n\t\t\tconsole.warn(`[FormFather] Field \"${String(field)}\" not found`);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { rules, messages } = this.getFieldValidationConfig($field);\n\t\tconst isValid = await this.runFieldValidation($field, rules, messages);\n\t\tthis.syncErrorSummary();\n\t\treturn isValid;\n\t}\n\n\t/**\n\t * Проверяет все поля ввода.\n\t *\n\t * Порядок для каждого поля:\n\t *\n\t * 1. `required` — если атрибут `required`\n\t * 2. правила из `validationSchema`\n\t * 3. правила из `data-validate`\n\t * 4. правила из `data-custom-validate`\n\t *\n\t * Для одного поля показывается только первая ошибка. Неизвестные правила фиксируются `console.warn` и исключаются ДО\n\t * валидации.\n\t */\n\tasync validate($block: HTMLElement = this.$el): Promise<boolean> {\n\t\tconst schema = this.getValidationSchema();\n\t\tconst erroredInputs: FormFieldElement[] = [];\n\t\tconst processed = new WeakSet<FormFieldElement>();\n\t\tlet ok = true;\n\n\t\tthis.errors = [];\n\n\t\tfor (const $input of this.getValidationFields($block, schema)) {\n\t\t\tif (processed.has($input)) continue;\n\n\t\t\tconst radioGroup = this.getRadioGroup($input, $block);\n\t\t\tif (radioGroup.length > 0) {\n\t\t\t\tradioGroup.forEach($radio => processed.add($radio));\n\t\t\t} else {\n\t\t\t\tprocessed.add($input);\n\t\t\t}\n\n\t\t\tconst { rules, messages } = this.getFieldValidationConfig($input, schema);\n\t\t\tconst fieldValid = await this.runFieldValidation($input, rules, messages, $block);\n\t\t\tif (!fieldValid) {\n\t\t\t\tok = false;\n\t\t\t\terroredInputs.push($input);\n\t\t\t}\n\t\t}\n\n\t\tconst formValidation = await this.validateFormValidators();\n\t\tif (!formValidation.ok) {\n\t\t\tok = false;\n\t\t\terroredInputs.push(...formValidation.erroredInputs);\n\t\t}\n\n\t\tconst visibleErroredInputs = erroredInputs.filter(item => !item.hasAttribute('data-no-error-scroll'));\n\t\tif (!ok && this.config.scrollToFirstErroredInput) {\n\t\t\tthis.scrollToFirstErroredInput(visibleErroredInputs);\n\t\t}\n\t\tif (!ok && this.config.focusFirstErroredInput) {\n\t\t\tthis.focusFirstErroredInput(visibleErroredInputs);\n\t\t}\n\n\t\tif (ok) {\n\t\t\tthis.hideErrorSummary();\n\t\t} else {\n\t\t\tthis.renderErrorSummary();\n\t\t}\n\n\t\treturn ok;\n\t}\n\n\t/** Блокирует кнопку отправки данных. */\n\tprivate disableSubmit() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.setAttribute('disabled', '');\n\t\t});\n\t}\n\n\t/** Снимает блокировку с кнопки отправки данных. */\n\tprivate enableSubmit() {\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.removeAttribute('disabled');\n\t\t});\n\t}\n\n\t/** Очищает поля ввода формы. */\n\tpublic clearInputs() {\n\t\tthis.inputs?.forEach($inputEl => {\n\t\t\tconst $input = $inputEl as HTMLInputElement;\n\t\t\tif ($input.type === 'radio' || $input.type === 'checkbox') {\n\t\t\t\t$input.checked = false;\n\t\t\t} else {\n\t\t\t\t$input.value = '';\n\t\t\t\t$input.parentElement?.classList.remove('filled');\n\t\t\t\t$input.dispatchEvent(new Event('input'));\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Общие настройки анимаций (можно подправить под вкус) */\n\tprivate readonly _anim = {\n\t\tduration: 220,\n\t\teasing: 'ease',\n\t\tpaddingTopOpened: 16,\n\t\ticonDuration: 700,\n\t};\n\n\tprivate _prefersReducedMotion(): boolean {\n\t\treturn typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n\t}\n\n\tprivate _canAnimate(el?: Element | null): boolean {\n\t\treturn !!(el && 'animate' in el && !this._prefersReducedMotion());\n\t}\n\n\tprivate _cancelAnimations(el: Element | null | undefined) {\n\t\t// Отменяем все активные WAAPI-анимации у элемента\n\t\tconst animatedEl = el as (Element & { getAnimations?: () => Animation[] }) | null | undefined;\n\t\tanimatedEl?.getAnimations?.().forEach(animation => animation.cancel());\n\t}\n\n\t/**\n\t * Показывает ошибку под полями ввода - ошибку, относящуюся ко всей форме.\n\t *\n\t * @param {String} text - Текст ошибки.\n\t */\n\tprivate showErrorForm(text: string) {\n\t\tconst inputWrappersList = this.$el.querySelectorAll(this.config.inputWrapperSelector!);\n\t\tconst $lastInputWrapper = inputWrappersList[inputWrappersList.length - 1] as HTMLElement | undefined;\n\t\tlet $errorWrapper = this.$el.querySelector('.error-block-under-input__wrapper') as HTMLElement | null;\n\n\t\tif (!$errorWrapper || ($lastInputWrapper && !($lastInputWrapper.nextElementSibling === $errorWrapper))) {\n\t\t\t$errorWrapper = document.createElement('div');\n\t\t\t$errorWrapper.className = 'error-block-under-input__wrapper';\n\t\t\t$errorWrapper.innerHTML = `\n <div class=\"error-block-under-input error-block-under-input--warning\" style=\"display:grid;grid-template-columns:auto 1fr;gap:8px;align-items:start;\">\n <div class=\"error-block-under-input__icon-wrapper\" style=\"position:relative;width:20px;height:20px;\">\n <span class=\"error-block-under-input__icon\" style=\"display:block;width:20px;height:20px;\"></span>\n <span class=\"error-block-under-input__icon error-block-under-input__icon--animated\" style=\"display:block;position:absolute;inset:0;\"></span>\n </div>\n <p class=\"error-block-under-input__text\" style=\"margin:0;\">\n <span class=\"error-block-under-input__main-text\"></span>\n <span class=\"error-block-under-input__secondary-text\"></span>\n </p>\n </div>\n `;\n\t\t\t// Стартовые inline-стили для анимаций\n\t\t\tObject.assign($errorWrapper.style, {\n\t\t\t\tboxSizing: 'border-box',\n\t\t\t\toverflow: 'hidden',\n\t\t\t\theight: '0px',\n\t\t\t\tpaddingTop: '0px',\n\t\t\t\topacity: '0',\n\t\t\t} as CSSStyleDeclaration);\n\t\t\tif ($lastInputWrapper) {\n\t\t\t\t$lastInputWrapper.insertAdjacentElement('afterend', $errorWrapper);\n\t\t\t} else {\n\t\t\t\tthis.$el.appendChild($errorWrapper);\n\t\t\t}\n\t\t} else {\n\t\t\t// убедимся, что нужные стартовые inline-стили есть\n\t\t\t$errorWrapper.style.boxSizing = 'border-box';\n\t\t\t$errorWrapper.style.overflow = 'hidden';\n\t\t}\n\n\t\t// Текст\n\t\t($errorWrapper.querySelector('.error-block-under-input__main-text') as HTMLElement).textContent = text;\n\t\tconst $secondaryText = $errorWrapper.querySelector(\n\t\t\t'.error-block-under-input__secondary-text',\n\t\t) as HTMLElement | null;\n\t\tif ($secondaryText) $secondaryText.textContent = '';\n\n\t\t// Сброс success-класса, если он устанавливался где-то в другом коде\n\t\t$errorWrapper.querySelector('.error-block-under-input')?.classList.remove('error-block-under-input--success');\n\n\t\t// Посчитать целевую высоту\n\t\t// Чтобы корректно мерить, временно выставим auto\n\t\tconst prevHeight = $errorWrapper.style.height;\n\t\tconst prevPadding = $errorWrapper.style.paddingTop;\n\t\t$errorWrapper.style.height = 'auto';\n\t\t$errorWrapper.style.paddingTop = `${this._anim.paddingTopOpened}px`;\n\t\tconst targetHeight = $errorWrapper.clientHeight; // фактическая высота открытого состояния\n\n\t\t// Вернуть стартовое состояние (схлопнуто)\n\t\t$errorWrapper.style.height = prevHeight || '0px';\n\t\t$errorWrapper.style.paddingTop = prevPadding || '0px';\n\n\t\t// Если уже раскрыт на нужную высоту — просто «дзынь» иконке и выходим\n\t\tif (\n\t\t\tparseFloat($errorWrapper.style.height) === targetHeight &&\n\t\t\tparseFloat($errorWrapper.style.opacity || '1') === 1\n\t\t) {\n\t\t\tthis._ringIcon($errorWrapper);\n\t\t} else {\n\t\t\t// Анимация раскрытия\n\t\t\tthis._cancelAnimations($errorWrapper);\n\t\t\tif (this._canAnimate($errorWrapper)) {\n\t\t\t\tconst anim = $errorWrapper.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\theight: `${parseFloat($errorWrapper.style.height) || 0}px`,\n\t\t\t\t\t\t\tpaddingTop: `${parseFloat($errorWrapper.style.paddingTop) || 0}px`,\n\t\t\t\t\t\t\topacity: parseFloat($errorWrapper.style.opacity || '0'),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\theight: `${targetHeight}px`,\n\t\t\t\t\t\t\tpaddingTop: `${this._anim.paddingTopOpened}px`,\n\t\t\t\t\t\t\topacity: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{ duration: this._anim.duration, easing: this._anim.easing, fill: 'forwards' },\n\t\t\t\t);\n\t\t\t\tanim.addEventListener('finish', () => {\n\t\t\t\t\t// После анимации: фиксируем авто-высоту, чтобы текст мог меняться\n\t\t\t\t\t$errorWrapper.style.height = 'auto';\n\t\t\t\t\t$errorWrapper.style.paddingTop = `${this._anim.paddingTopOpened}px`;\n\t\t\t\t\t$errorWrapper.style.opacity = '1';\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Фолбэк без анимации\n\t\t\t\t$errorWrapper.style.height = 'auto';\n\t\t\t\t$errorWrapper.style.paddingTop = `${this._anim.paddingTopOpened}px`;\n\t\t\t\t$errorWrapper.style.opacity = '1';\n\t\t\t}\n\t\t\tthis._ringIcon($errorWrapper);\n\t\t}\n\n\t\t// Скрыть при первом вводе после показа\n\t\tthis.$el.addEventListener('input', () => this.hideErrorForm(), { passive: true, once: true });\n\t}\n\n\t/** Скрывает ошибку под полями ввода - ошибку, относящуюся ко всей форме. */\n\tprivate hideErrorForm() {\n\t\tconst inputWrappersList = this.$el.querySelectorAll(this.config.inputWrapperSelector!);\n\t\tconst $lastInputWrapper = inputWrappersList[inputWrappersList.length - 1] as HTMLElement | undefined;\n\t\tconst $errorWrapper = (\n\t\t\t$lastInputWrapper?.nextElementSibling || this.$el.querySelector('.error-block-under-input__wrapper')\n\t\t) as HTMLElement | null;\n\t\tif (!$errorWrapper || !$errorWrapper.classList.contains('error-block-under-input__wrapper')) return;\n\n\t\t// Текущая высота (если была auto) — измерим и зафиксируем\n\t\tconst wasAuto = $errorWrapper.style.height === '' || $errorWrapper.style.height === 'auto';\n\t\tif (wasAuto) {\n\t\t\t$errorWrapper.style.height = `${$errorWrapper.clientHeight}px`;\n\t\t}\n\t\t$errorWrapper.style.paddingTop = $errorWrapper.style.paddingTop || `${this._anim.paddingTopOpened}px`;\n\t\t$errorWrapper.style.opacity = $errorWrapper.style.opacity || '1';\n\n\t\t// Анимация схлопывания\n\t\tthis._cancelAnimations($errorWrapper);\n\t\tif (this._canAnimate($errorWrapper)) {\n\t\t\tconst anim = $errorWrapper.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\theight: `${parseFloat($errorWrapper.style.height) || $errorWrapper.clientHeight}px`,\n\t\t\t\t\t\tpaddingTop: `${parseFloat($errorWrapper.style.paddingTop) || this._anim.paddingTopOpened}px`,\n\t\t\t\t\t\topacity: parseFloat($errorWrapper.style.opacity || '1'),\n\t\t\t\t\t},\n\t\t\t\t\t{ height: '0px', paddingTop: '0px', opacity: 0 },\n\t\t\t\t],\n\t\t\t\t{ duration: this._anim.duration, easing: this._anim.easing, fill: 'forwards' },\n\t\t\t);\n\t\t\tanim.addEventListener('finish', () => {\n\t\t\t\t// После закрытия можно удалить узел или оставить схлопнутым\n\t\t\t\t$errorWrapper.remove();\n\t\t\t\t// Если хотите оставлять в DOM:\n\t\t\t\t// $errorWrapper.style.height = '0px';\n\t\t\t\t// $errorWrapper.style.paddingTop = '0px';\n\t\t\t\t// $errorWrapper.style.opacity = '0';\n\t\t\t});\n\t\t} else {\n\t\t\t// Фолбэк без анимации\n\t\t\t$errorWrapper.remove();\n\t\t}\n\t}\n\n\t/** Короткая анимация иконки без CSS */\n\tprivate _ringIcon($wrapper: HTMLElement) {\n\t\tconst $icon = $wrapper.querySelector('.error-block-under-input__icon--animated') as HTMLElement | null;\n\t\tif (!$icon) return;\n\n\t\tthis._cancelAnimations($icon);\n\t\tif (!this._canAnimate($icon)) return;\n\n\t\t// Небольшое «качание» и вспышка прозрачности\n\t\t$icon.animate(\n\t\t\t[\n\t\t\t\t{ transform: 'rotate(0deg) scale(1)', opacity: 0 },\n\t\t\t\t{ transform: 'rotate(-8deg) scale(1.05)', opacity: 1, offset: 0.15 },\n\t\t\t\t{ transform: 'rotate(8deg) scale(1.05)', opacity: 1, offset: 0.3 },\n\t\t\t\t{ transform: 'rotate(-6deg) scale(1.03)', opacity: 1, offset: 0.45 },\n\t\t\t\t{ transform: 'rotate(6deg) scale(1.03)', opacity: 1, offset: 0.6 },\n\t\t\t\t{ transform: 'rotate(0deg) scale(1)', opacity: 0 },\n\t\t\t],\n\t\t\t{ duration: this._anim.iconDuration, easing: 'ease' },\n\t\t);\n\t}\n\n\t/** Полностью снимает слушатели и чистит артефакты формы. */\n\tpublic destroy(): void {\n\t\t// 1) Снять submit-слушатель\n\t\tif (this._onSubmitHandler) {\n\t\t\tthis.$el.removeEventListener('submit', this._onSubmitHandler as EventListener);\n\t\t\tthis._onSubmitHandler = undefined;\n\t\t}\n\n\t\t// 1.1) Снять click-слушатель с кнопки submit\n\t\tif (this._onSubmitClickHandler) {\n\t\t\tthis.$submits.forEach($submit => {\n\t\t\t\t$submit.removeEventListener('click', this._onSubmitClickHandler as EventListener);\n\t\t\t});\n\t\t\tthis._onSubmitClickHandler = undefined;\n\t\t}\n\n\t\tthis.clearFieldValidationEvents();\n\t\tthis.mutationObserver?.disconnect();\n\t\tthis.mutationObserver = undefined;\n\n\t\t// 2) Удалить формовый error-блок под инпутами (если есть)\n\t\tconst formErrorWrapper = this.$el.querySelector('.error-block-under-input__wrapper') as HTMLElement | null;\n\t\tif (formErrorWrapper) {\n\t\t\tthis._cancelAnimations(formErrorWrapper);\n\t\t\tformErrorWrapper.remove();\n\t\t}\n\t\tthis.hideErrorSummary();\n\n\t\t// 3) Скрыть/удалить лоадер на кнопке submit\n\t\tthis.$submits.forEach($submit => {\n\t\t\t$submit.classList.remove('button--loading');\n\t\t\tconst btnLoader = $submit.querySelector('.button__loader') as HTMLElement | null;\n\t\t\tif (btnLoader) btnLoader.remove();\n\t\t});\n\n\t\t// 4) Сбросить ошибки у инпутов (если разметка позволяет)\n\t\tconst inputs = this.$el.querySelectorAll<FormFieldElement>('input, textarea, select');\n\t\tinputs.forEach($i => {\n\t\t\tthis.hideError($i);\n\t\t\tthis.clearFieldValidationState($i);\n\t\t});\n\n\t\t// 5) Убрать возможный флаг скролла\n\t\tdocument.documentElement.removeAttribute('data-now-scrolling');\n\n\t\t// 6) Очистить ссылки на элементы, чтобы помочь GC\n\t\tthis.inputs = null;\n\t\tthis.$submits = [];\n\t\tthis.errors = [];\n\t\tthis.waitResponse = false;\n\t\tFORM_INSTANCES.delete(this.$el);\n\t}\n\n\t/**\n\t * Проверяет входные данные на их корректность.\n\t *\n\t * @returns {boolean} Корректны данные или нет (true/false).\n\t */\n\tprivate isCorrectArguments(): boolean {\n\t\tif (this.$el.tagName !== 'FORM') {\n\t\t\tconsole.warn(`$el не является тегом form`);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.$submits.length === 0) {\n\t\t\tconsole.warn(`В форме нет кнопки с типом submit`);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate formDataToObject(formData: FormData): Record<string, any> {\n\t\tconst data: Record<string, any> = {};\n\n\t\tformData.forEach((value, key) => {\n\t\t\tif (Object.prototype.hasOwnProperty.call(data, key)) {\n\t\t\t\tif (!Array.isArray(data[key])) {\n\t\t\t\t\tdata[key] = [data[key]];\n\t\t\t\t}\n\t\t\t\tdata[key].push(value);\n\t\t\t} else {\n\t\t\t\tdata[key] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn data;\n\t}\n\n\tprivate appendFormDataValue(formData: FormData, key: string, value: any): void {\n\t\tif (value === undefined || value === null) return;\n\n\t\tif (Array.isArray(value)) {\n\t\t\tvalue.forEach((item, index) => {\n\t\t\t\tthis.appendFormDataValue(formData, `${key}[${index}]`, item);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (value instanceof Blob) {\n\t\t\tformData.append(key, value);\n\t\t\treturn;\n\t\t}\n\n\t\tformData.append(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n\t}\n\n\tprivate objectToFormData(data: Record<string, any>): FormData {\n\t\tconst formData = new FormData();\n\n\t\tObject.entries(data).forEach(([key, value]) => {\n\t\t\tthis.appendFormDataValue(formData, key, value);\n\t\t});\n\n\t\treturn formData;\n\t}\n\n\tprivate stringifyFormDataValue(value: FormDataEntryValue): string {\n\t\treturn typeof value === 'string' ? value : value.name;\n\t}\n\n\tprivate formDataToUrlSearchParams(formData: FormData): URLSearchParams {\n\t\tconst params = new URLSearchParams();\n\n\t\tformData.forEach((value, key) => {\n\t\t\tparams.append(key, this.stringifyFormDataValue(value));\n\t\t});\n\n\t\treturn params;\n\t}\n\n\tprivate formDataToTextBody(formData: FormData): string {\n\t\treturn Array.from(formData)\n\t\t\t.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(this.stringifyFormDataValue(value))}`)\n\t\t\t.join('\\n');\n\t}\n\n\tprivate isBodylessMethod(method: string): boolean {\n\t\treturn method === 'GET' || method === 'HEAD';\n\t}\n\n\tprivate appendQueryString(action: string, params: URLSearchParams): string {\n\t\tconst query = params.toString();\n\t\tif (!query) return action;\n\n\t\tconst separator = action.includes('?') ? '&' : '?';\n\t\treturn `${action}${separator}${query}`;\n\t}\n\n\tprivate findFieldByName(name: string): FormFieldElement | null {\n\t\tconst fields = Array.from(this.$el.querySelectorAll<FormFieldElement>('input, textarea, select'));\n\t\treturn fields.find($field => $field.name === name) || null;\n\t}\n\n\tprivate async parseResponseBody(response: Response): Promise<ResponseBody> {\n\t\ttry {\n\t\t\tconst responseBody = await response.json();\n\t\t\treturn responseBody && typeof responseBody === 'object'\n\t\t\t\t? responseBody\n\t\t\t\t: {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\t'error-msg': 'Некорректный ответ сервера',\n\t\t\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: true,\n\t\t\t\t'error-msg': 'Некорректный ответ сервера',\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate handleUnsuccessfulResponse(responseBody: ResponseBody): void {\n\t\tif (responseBody.error !== true) return;\n\n\t\tif (responseBody['error-msg']) {\n\t\t\tthis.setErrorRecord(FORM_ERROR_FIELD, 'server', responseBody['error-msg'], 'server');\n\t\t\tthis.showErrorForm(responseBody['error-msg']);\n\t\t}\n\n\t\tif (responseBody.errors) {\n\t\t\tconst fieldsList: FormFieldElement[] = [];\n\t\t\tresponseBody.errors.forEach(error => {\n\t\t\t\tconst $field = this.findFieldByName(error.name);\n\t\t\t\tif ($field) {\n\t\t\t\t\tfieldsList.push($field);\n\t\t\t\t\tthis.setValidationError($field, 'server', error['error-msg'], 'server');\n\t\t\t\t\tthis.showError($field, error['error-msg']);\n\t\t\t\t\t$field.removeAttribute('aria-busy');\n\t\t\t\t\tthis.setFieldValidationState($field, 'invalid');\n\t\t\t\t} else {\n\t\t\t\t\tthis.setErrorRecord(error.name, 'server', error['error-msg'], 'server');\n\t\t\t\t\tconsole.warn(`Не найдено поле с именем: ${error.name}, для вывода ошибки: ${error['error-msg']}`);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (this.config.scrollToFirstErroredInput === true) this.scrollToFirstErroredInput(fieldsList);\n\t\t\tif (this.config.focusFirstErroredInput === true) this.focusFirstErroredInput(fieldsList);\n\t\t}\n\n\t\tthis.syncErrorSummary();\n\t}\n\n\tprivate async sendData(): Promise<Response> {\n\t\tconst action = this.$el.getAttribute('action') || '';\n\t\tconst method = this.$el.getAttribute('method')?.toUpperCase() || 'POST';\n\t\tconst enctype = this.$el.getAttribute('enctype') || 'application/x-www-form-urlencoded';\n\t\tlet body: BodyInit | null = null;\n\t\tlet headers: HeadersInit = {};\n\n\t\t// Сбор данных из формы\n\t\tconst formData = serializeToFormData(this.$el);\n\t\tlet data: Record<string, any> = this.formDataToObject(formData);\n\n\t\tif (this.config.logging) {\n\t\t\tfor (const key of formData.keys()) console.log(formData.get(key));\n\t\t}\n\n\t\t// Применение обёртки, если указано в настройках\n\t\tconst hasDataWrapper = typeof this.config.wrapData === 'function';\n\t\tif (typeof this.config.wrapData === 'function') {\n\t\t\tdata = this.config.wrapData(data);\n\t\t}\n\t\tconst requestFormData = hasDataWrapper ? this.objectToFormData(data) : formData;\n\n\t\tif (this.isBodylessMethod(method)) {\n\t\t\treturn fetch(this.appendQueryString(action, this.formDataToUrlSearchParams(requestFormData)), {\n\t\t\t\tmethod,\n\t\t\t\theaders,\n\t\t\t});\n\t\t}\n\n\t\tswitch (enctype) {\n\t\t\tcase 'application/x-www-form-urlencoded':\n\t\t\t\tbody = this.formDataToUrlSearchParams(requestFormData).toString();\n\t\t\t\theaders['Content-Type'] = 'application/x-www-form-urlencoded';\n\t\t\t\tbreak;\n\n\t\t\tcase 'multipart/form-data':\n\t\t\t\tbody = requestFormData;\n\t\t\t\t// ВАЖНО: Не указываем Content-Type, т.к. браузер сам добавит с корректной границей!\n\t\t\t\tbreak;\n\n\t\t\tcase 'text/plain':\n\t\t\t\tbody = this.formDataToTextBody(requestFormData);\n\t\t\t\theaders['Content-Type'] = 'text/plain';\n\t\t\t\tbreak;\n\n\t\t\tcase 'application/json':\n\t\t\t\tbody = JSON.stringify(data);\n\t\t\t\theaders['Content-Type'] = 'application/json';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn(`Неизвестный enctype: ${enctype}. Используется application/x-www-form-urlencoded.`);\n\t\t\t\tbody = this.formDataToUrlSearchParams(requestFormData).toString();\n\t\t\t\theaders['Content-Type'] = 'application/x-www-form-urlencoded';\n\t\t}\n\n\t\treturn fetch(action, {\n\t\t\tmethod,\n\t\t\tbody,\n\t\t\theaders,\n\t\t});\n\t}\n\n\tpublic async submit(): Promise<SubmitResult | undefined> {\n\t\tif (!this.waitResponse) {\n\t\t\tlet loadingFinished = false;\n\t\t\tconst finishLoading = () => {\n\t\t\t\tif (loadingFinished) return;\n\n\t\t\t\tthis.waitResponse = false;\n\t\t\t\tif (this.config.showLoaderButton === true) this.hideLoader();\n\t\t\t\tloadingFinished = true;\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tconst beforeSubmitResult = await this.config.onBeforeSubmit?.(this);\n\t\t\t\tif (beforeSubmitResult === false) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.config.showLoaderButton === true) this.showLoader();\n\n\t\t\t\tthis.config.onSubmit?.(this);\n\t\t\t\tthis.waitResponse = true;\n\n\t\t\t\tconst response = await this.sendData();\n\t\t\t\tconst responseBody = await this.parseResponseBody(response);\n\t\t\t\tfinishLoading();\n\n\t\t\t\tthis.config.onResponse?.(responseBody, this);\n\n\t\t\t\tif (response.ok && responseBody.success === true) {\n\t\t\t\t\tthis.config.onResponseSuccess?.(responseBody, this);\n\t\t\t\t} else {\n\t\t\t\t\tthis.config.onResponseUnsuccess?.(responseBody, this);\n\t\t\t\t\tthis.handleUnsuccessfulResponse(responseBody);\n\t\t\t\t}\n\n\t\t\t\tparseCommonResponseProperties(responseBody);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: response.ok && responseBody.success === true,\n\t\t\t\t\tresponse,\n\t\t\t\t\tresponseBody,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tfinishLoading();\n\t\t\t\tthis.config.onSubmitError?.(error, this);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n"],"names":["_a"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "form-father",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.14",
|
|
4
4
|
"description": "Form Father: Библиотека для обработки форм",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
75
75
|
"@rollup/plugin-terser": "^1.0.0",
|
|
76
76
|
"@types/jest": "^30.0.0",
|
|
77
|
-
"@types/jsdom": "^
|
|
77
|
+
"@types/jsdom": "^30.0.0",
|
|
78
78
|
"concurrently": "^10.0.4",
|
|
79
79
|
"esbuild": "^0.28.1",
|
|
80
80
|
"jest": "^30.0.5",
|