@dmitryvim/form-builder 0.2.3 → 0.2.5
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/README.md +7 -0
- package/dist/browser/formbuilder.min.js +31 -31
- package/dist/browser/{formbuilder.v0.2.3.min.js → formbuilder.v0.2.5.min.js} +31 -31
- package/dist/cjs/index.cjs +32 -21
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.js +32 -21
- package/dist/esm/index.js.map +1 -1
- package/dist/form-builder.js +31 -31
- package/dist/types/instance/FormBuilderInstance.d.ts +1 -0
- package/dist/types/types/config.d.ts +1 -0
- package/package.json +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/validation.ts","../../src/utils/helpers.ts","../../src/components/text.ts","../../src/components/textarea.ts","../../src/components/number.ts","../../src/components/select.ts","../../src/utils/translation.ts","../../src/components/file.ts","../../src/components/container.ts","../../src/components/group.ts","../../src/components/index.ts","../../src/instance/state.ts","../../src/styles/theme.ts","../../src/utils/styles.ts","../../src/components/registry.ts","../../src/instance/FormBuilderInstance.ts","../../src/index.ts"],"names":["key","element","updateFilesList","t","renderElement","validateElement"],"mappings":"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","file":"index.js","sourcesContent":["// Schema validation utilities\n\nimport type { Element } from \"../types/index.js\";\n\n// Helper functions for field hints\nfunction addLengthHint(element: any, parts: string[]): void {\n if (element.minLength !== null || element.maxLength !== null) {\n if (element.minLength !== null && element.maxLength !== null) {\n parts.push(`length=${element.minLength}-${element.maxLength} characters`);\n } else if (element.maxLength !== null) {\n parts.push(`max=${element.maxLength} characters`);\n } else if (element.minLength !== null) {\n parts.push(`min=${element.minLength} characters`);\n }\n }\n}\n\nfunction addRangeHint(element: any, parts: string[]): void {\n if (element.min !== null || element.max !== null) {\n if (element.min !== null && element.max !== null) {\n parts.push(`range=${element.min}-${element.max}`);\n } else if (element.max !== null) {\n parts.push(`max=${element.max}`);\n } else if (element.min !== null) {\n parts.push(`min=${element.min}`);\n }\n }\n}\n\nfunction addFileSizeHint(element: any, parts: string[]): void {\n if (element.maxSizeMB) {\n parts.push(`max_size=${element.maxSizeMB}MB`);\n }\n}\n\nfunction addFormatHint(element: any, parts: string[]): void {\n if (element.accept?.extensions) {\n parts.push(\n `formats=${element.accept.extensions.map((ext: string) => ext.toUpperCase()).join(\",\")}`,\n );\n }\n}\n\nfunction addPatternHint(element: any, parts: string[]): void {\n if (element.pattern && !element.pattern.includes(\"А-Я\")) {\n parts.push(\"plain text only\");\n } else if (element.pattern?.includes(\"А-Я\")) {\n parts.push(\"text with punctuation\");\n }\n}\n\nexport function makeFieldHint(element: any): string {\n const parts: string[] = [];\n\n parts.push(element.required ? \"required\" : \"optional\");\n\n addLengthHint(element, parts);\n addRangeHint(element, parts);\n addFileSizeHint(element, parts);\n addFormatHint(element, parts);\n addPatternHint(element, parts);\n\n return parts.join(\" • \");\n}\n\nexport function validateSchema(schema: any): string[] {\n const errors: string[] = [];\n\n if (!schema || typeof schema !== \"object\") {\n errors.push(\"Schema must be an object\");\n return errors;\n }\n\n if (!schema.version) {\n errors.push(\"Schema missing version\");\n }\n\n if (!Array.isArray(schema.elements)) {\n errors.push(\"Schema missing elements array\");\n return errors;\n }\n\n function validateElements(elements: Element[], path: string): void {\n elements.forEach((element, index) => {\n const elementPath = `${path}[${index}]`;\n\n if (!element.type) {\n errors.push(`${elementPath}: missing type`);\n }\n\n if (!element.key) {\n errors.push(`${elementPath}: missing key`);\n }\n\n if (\n element.type === \"group\" &&\n \"elements\" in element &&\n element.elements\n ) {\n validateElements(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"container\" && element.elements) {\n validateElements(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"select\" && element.options) {\n const defaultValue = element.default;\n if (\n defaultValue !== undefined &&\n defaultValue !== null &&\n defaultValue !== \"\"\n ) {\n const hasMatchingOption = element.options.some(\n (opt) => opt.value === defaultValue,\n );\n if (!hasMatchingOption) {\n errors.push(\n `${elementPath}: default \"${defaultValue}\" not in options`,\n );\n }\n }\n }\n });\n }\n\n if (Array.isArray(schema.elements))\n validateElements(schema.elements, \"elements\");\n return errors;\n}\n","// Utility helper functions\n\nexport function isPlainObject(obj: any): obj is Record<string, any> {\n return obj && typeof obj === \"object\" && obj.constructor === Object;\n}\n\nexport function pathJoin(base: string, key: string): string {\n return base ? `${base}.${key}` : key;\n}\n\nexport function pretty(obj: any): string {\n return JSON.stringify(obj, null, 2);\n}\n\nexport function clear(node: HTMLElement): void {\n while (node.firstChild) node.removeChild(node.firstChild);\n}\n","// Text component rendering, validation, and update functions\n\nimport type {\n TextElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\nexport function renderTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.className = \"w-full rounded-lg\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n textInput.name = pathKey;\n textInput.placeholder = element.placeholder || \"Введите текст\";\n textInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners (CSS variables)\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, textInput.value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n wrapper.appendChild(textInput);\n\n // Add hint\n const textHint = document.createElement(\"p\");\n textHint.className = \"mt-1\";\n textHint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n textHint.textContent = makeFieldHint(element);\n wrapper.appendChild(textHint);\n}\n\nexport function renderMultipleTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-text-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-text-item flex items-center gap-2\";\n\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.className = \"flex-1\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n textInput.placeholder = element.placeholder || \"Enter text\";\n textInput.value = value;\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(textInput.name, textInput.value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n itemWrapper.appendChild(textInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-text-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-text-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-text-btn mt-2 px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = `+ Add ${element.label || \"Text\"}`;\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addTextItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate text input field and return extracted value with errors\n */\nexport function validateTextElement(\n element: TextElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate text input value\n const validateTextInput = (\n input: HTMLInputElement | HTMLTextAreaElement,\n val: string,\n fieldKey: string,\n ): void => {\n let hasError = false;\n\n if (!skipValidation && val) {\n if (\n element.minLength !== undefined &&\n element.minLength !== null &&\n val.length < element.minLength\n ) {\n errors.push(`${fieldKey}: minLength=${element.minLength}`);\n markValidity(input, `minLength=${element.minLength}`);\n hasError = true;\n } else if (\n element.maxLength !== undefined &&\n element.maxLength !== null &&\n val.length > element.maxLength\n ) {\n errors.push(`${fieldKey}: maxLength=${element.maxLength}`);\n markValidity(input, `maxLength=${element.maxLength}`);\n hasError = true;\n } else if (element.pattern) {\n try {\n const re = new RegExp(element.pattern);\n if (!re.test(val)) {\n errors.push(`${fieldKey}: pattern mismatch`);\n markValidity(input, \"pattern mismatch\");\n hasError = true;\n }\n } catch {\n errors.push(`${fieldKey}: invalid pattern`);\n markValidity(input, \"invalid pattern\");\n hasError = true;\n }\n }\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple text fields (array)\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement | HTMLTextAreaElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input, index) => {\n const val = input?.value ?? \"\";\n values.push(val);\n validateTextInput(input, val, `${key}[${index}]`);\n });\n\n // Validate count\n if (!skipValidation) {\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v.trim() !== \"\");\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: required`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: minimum ${minCount} items required`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: maximum ${maxCount} items allowed`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single text field\n const input = scopeRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n errors.push(`${key}: required`);\n markValidity(input, \"required\");\n return { value: \"\", errors };\n }\n\n validateTextInput(input!, val, key);\n return { value: val, errors };\n }\n}\n\n/**\n * Update text field value in DOM without re-render\n */\nexport function updateTextField(\n element: TextElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple text fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateTextField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement | HTMLTextAreaElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateTextField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single text field\n const input = scopeRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Textarea component rendering, validation, and update functions\n\nimport type {\n TextareaElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { validateTextElement, updateTextField } from \"./text.js\";\n\nexport function renderTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.name = pathKey;\n textareaInput.placeholder = element.placeholder || \"Введите текст\";\n textareaInput.rows = element.rows || 4;\n textareaInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, textareaInput.value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n wrapper.appendChild(textareaInput);\n\n // Add hint\n const textareaHint = document.createElement(\"p\");\n textareaHint.className = \"text-xs text-gray-500 mt-1\";\n textareaHint.textContent = makeFieldHint(element);\n wrapper.appendChild(textareaHint);\n}\n\nexport function renderMultipleTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n items.forEach((item, index) => {\n const textarea = item.querySelector(\"textarea\");\n if (textarea) {\n textarea.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextareaItem(\n value: string = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-textarea-item\";\n\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.placeholder = element.placeholder || \"Enter text\";\n textareaInput.rows = element.rows || 4;\n textareaInput.value = value;\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(textareaInput.name, textareaInput.value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n itemWrapper.appendChild(textareaInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm\";\n removeBtn.innerHTML = \"✕ Remove\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-textarea-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className =\n \"add-textarea-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm\";\n addBtn.textContent = `+ Add ${element.label || \"Textarea\"}`;\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextareaItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addTextareaItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate textarea element - delegates to text validator since they share validation logic\n */\nexport function validateTextareaElement(\n element: TextareaElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Textarea shares validation logic with text (minLength, maxLength, pattern)\n return validateTextElement(element as any, key, context);\n}\n\n/**\n * Update textarea field - delegates to text updater since they share update logic\n */\nexport function updateTextareaField(\n element: TextareaElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Textarea shares update logic with text\n updateTextField(element as any, fieldPath, value, context);\n}\n","// Number component rendering, validation, and update functions\n\nimport type {\n NumberElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\nexport function renderNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.name = pathKey;\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n wrapper.appendChild(numberInput);\n\n // Add hint\n const numberHint = document.createElement(\"p\");\n numberHint.className = \"text-xs text-gray-500 mt-1\";\n numberHint.textContent = makeFieldHint(element);\n wrapper.appendChild(numberHint);\n}\n\nexport function renderMultipleNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-number-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addNumberItem(\n value: string | number = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-number-item flex items-center gap-2\";\n\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value = value.toString();\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const val = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(numberInput.name, val);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n itemWrapper.appendChild(numberInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-number-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-number-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className =\n \"add-number-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm\";\n addBtn.textContent = `+ Add ${element.label || \"Number\"}`;\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addNumberItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addNumberItem(value as string | number));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate number input field and return extracted value with errors\n */\nexport function validateNumberElement(\n element: NumberElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate number value\n const validateNumberInput = (\n input: HTMLInputElement,\n v: number,\n fieldKey: string,\n ): void => {\n let hasError = false;\n\n if (\n !skipValidation &&\n element.min !== undefined &&\n element.min !== null &&\n v < element.min\n ) {\n errors.push(`${fieldKey}: < min=${element.min}`);\n markValidity(input, `< min=${element.min}`);\n hasError = true;\n } else if (\n !skipValidation &&\n element.max !== undefined &&\n element.max !== null &&\n v > element.max\n ) {\n errors.push(`${fieldKey}: > max=${element.max}`);\n markValidity(input, `> max=${element.max}`);\n hasError = true;\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple number fields (array)\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: (number | null)[] = [];\n\n inputs.forEach((input, index) => {\n const raw = input?.value ?? \"\";\n if (raw === \"\") {\n values.push(null);\n markValidity(input, null);\n return;\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n errors.push(`${key}[${index}]: not a number`);\n markValidity(input, \"not a number\");\n values.push(null);\n return;\n }\n\n validateNumberInput(input, v, `${key}[${index}]`);\n const d = Number.isInteger(element.decimals ?? 0) ? (element.decimals ?? 0) : 0;\n values.push(Number(v.toFixed(d)));\n });\n\n // Validate count\n if (!skipValidation) {\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== null);\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: required`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: minimum ${minCount} items required`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: maximum ${maxCount} items allowed`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(`[name$=\"${key}\"]`);\n const raw = input?.value ?? \"\";\n\n if (!skipValidation && element.required && raw === \"\") {\n errors.push(`${key}: required`);\n markValidity(input, \"required\");\n return { value: null, errors };\n }\n\n if (raw === \"\") {\n markValidity(input, null);\n return { value: null, errors };\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n errors.push(`${key}: not a number`);\n markValidity(input, \"not a number\");\n return { value: null, errors };\n }\n\n validateNumberInput(input!, v, key);\n const d = Number.isInteger(element.decimals ?? 0) ? (element.decimals ?? 0) : 0;\n return { value: Number(v.toFixed(d)), errors };\n }\n}\n\n/**\n * Update number field value in DOM without re-render\n */\nexport function updateNumberField(\n element: NumberElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple number fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateNumberField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateNumberField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Select component rendering functions\n\nimport type {\n SelectElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\nexport function renderSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.name = pathKey;\n selectInput.disabled = state.config.readonly;\n\n (element.options || []).forEach((option) => {\n const optionEl = document.createElement(\"option\");\n optionEl.value = option.value;\n optionEl.textContent = option.label;\n if ((ctx.prefill[element.key] || element.default) === option.value) {\n optionEl.selected = true;\n }\n selectInput.appendChild(optionEl);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n wrapper.appendChild(selectInput);\n\n // Add hint\n const selectHint = document.createElement(\"p\");\n selectHint.className = \"text-xs text-gray-500 mt-1\";\n selectHint.textContent = makeFieldHint(element);\n wrapper.appendChild(selectHint);\n}\n\nexport function renderMultipleSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || element.options?.[0]?.value || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-select-item\");\n items.forEach((item, index) => {\n const select = item.querySelector(\"select\");\n if (select) {\n select.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addSelectItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-select-item flex items-center gap-2\";\n\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.disabled = state.config.readonly;\n\n // Add options\n (element.options || []).forEach((option) => {\n const optionElement = document.createElement(\"option\");\n optionElement.value = option.value;\n optionElement.textContent = option.label;\n if (value === option.value) {\n optionElement.selected = true;\n }\n selectInput.appendChild(optionElement);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(selectInput.name, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n itemWrapper.appendChild(selectInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-select-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(item);\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-select-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className =\n \"add-select-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm\";\n addBtn.textContent = `+ Add ${element.label || \"Selection\"}`;\n addBtn.onclick = () => {\n const defaultValue =\n element.default || element.options?.[0]?.value || \"\";\n values.push(defaultValue);\n addSelectItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addSelectItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate select field and return extracted value with errors\n */\nexport function validateSelectElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate multiple count\n const validateMultipleCount = (\n key: string,\n values: string[],\n element: Element,\n filterFn: (v: string) => boolean,\n ): void => {\n if (skipValidation) return;\n\n const filteredValues = values.filter(filterFn);\n const minCount = \"minCount\" in element ? element.minCount ?? 1 : 1;\n const maxCount =\n \"maxCount\" in element ? element.maxCount ?? Infinity : Infinity;\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: required`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: minimum ${minCount} items required`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: maximum ${maxCount} items allowed`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n const inputs = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input) => {\n const val = input?.value ?? \"\";\n values.push(val);\n markValidity(input, null);\n });\n\n validateMultipleCount(key, values, element, (v) => v !== \"\");\n return { value: values, errors };\n } else {\n // Single select field\n const input = scopeRoot.querySelector<HTMLSelectElement>(\n `[name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n errors.push(`${key}: required`);\n markValidity(input, \"required\");\n return { value: null, errors };\n } else {\n markValidity(input, null);\n }\n\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n/**\n * Update select field value in DOM without re-render\n */\nexport function updateSelectField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateSelectField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const selects = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n selects.forEach((select, index) => {\n if (index < value.length) {\n select.value = value[index] != null ? String(value[index]) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value[index]);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n });\n\n if (value.length !== selects.length) {\n console.warn(\n `updateSelectField: Multiple field \"${fieldPath}\" has ${selects.length} selects but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single select field\n const select = scopeRoot.querySelector<HTMLSelectElement>(\n `[name=\"${fieldPath}\"]`,\n );\n\n if (select) {\n select.value = value != null ? String(value) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n }\n}\n","// Translation utilities\n\nimport type { State } from \"../types/state.js\";\n\n/**\n * Get translated string for a key\n * @param key Translation key\n * @param state Form state containing locale and translations\n * @returns Translated string or key if not found\n */\nexport function t(key: string, state: State): string {\n const locale = state.config.locale || \"en\";\n const translations =\n state.config.translations[locale] || state.config.translations.en;\n return (translations as any)[key] || key;\n}\n","// File component rendering functions and helpers\n\nimport type {\n FileElement,\n FilesElement,\n RenderContext,\n ResourceMetadata,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"../utils/translation.js\";\nimport { clear } from \"../utils/helpers.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { pathJoin } from \"../utils/helpers.js\";\n\n// File upload dependencies\ninterface FileDeps {\n picker: HTMLInputElement;\n fileUploadHandler: () => void;\n dragHandler: (files: FileList) => void;\n}\n\n// Render single file preview container\nexport async function renderFilePreview(\n container: HTMLElement,\n resourceId: string,\n state: State,\n options: {\n fileName?: string;\n isReadonly?: boolean;\n deps?: FileDeps | null;\n } = {},\n): Promise<void> {\n const { fileName = \"\", isReadonly = false, deps = null } = options;\n\n // Runtime validation for dependencies when not in readonly mode\n if (\n !isReadonly &&\n deps &&\n (!deps.picker || !deps.fileUploadHandler || !deps.dragHandler)\n ) {\n throw new Error(\n \"renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}\",\n );\n }\n\n // Clear container content first\n clear(container);\n\n if (isReadonly) {\n container.classList.add(\"cursor-pointer\");\n }\n\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = fileName || \"Preview\";\n\n // Use stored file from resourceIndex if available, or try getThumbnail\n const meta = state.resourceIndex.get(resourceId);\n\n if (meta && meta.file && meta.file instanceof File) {\n // For local files, use FileReader to display preview\n if (meta.type && meta.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n container.appendChild(img);\n } else if (meta.type && meta.type.startsWith(\"video/\")) {\n // Video file - use object URL for preview\n const videoUrl = URL.createObjectURL(meta.file);\n\n // Remove all conflicting handlers to prevent interference with video controls\n container.onclick = null;\n\n // Remove drag and drop event listeners by cloning the element\n const newContainer = container.cloneNode(false) as HTMLElement;\n if (container.parentNode) {\n container.parentNode.replaceChild(newContainer, container);\n }\n container = newContainer;\n\n container.innerHTML = `\n <div class=\"relative group h-full\">\n <video class=\"w-full h-full object-contain\" controls preload=\"auto\" muted>\n <source src=\"${videoUrl}\" type=\"${meta.type}\">\n Your browser does not support the video tag.\n </video>\n <div class=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity z-10 flex gap-1\">\n <button class=\"bg-red-600 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs delete-file-btn\">\n ${t(\"removeElement\", state)}\n </button>\n <button class=\"bg-gray-800 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs change-file-btn\">\n Change\n </button>\n </div>\n </div>\n `;\n\n // Add click handlers to the custom buttons\n const changeBtn = container.querySelector(\n \".change-file-btn\",\n ) as HTMLButtonElement;\n if (changeBtn) {\n changeBtn.onclick = (e) => {\n e.stopPropagation();\n if (deps?.picker) {\n deps.picker.click();\n }\n };\n }\n\n const deleteBtn = container.querySelector(\n \".delete-file-btn\",\n ) as HTMLButtonElement;\n if (deleteBtn) {\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n // Clear the file\n state.resourceIndex.delete(resourceId);\n // Update hidden input\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n // Clear preview and show placeholder\n if (deps?.fileUploadHandler) {\n container.onclick = deps.fileUploadHandler;\n }\n if (deps?.dragHandler) {\n setupDragAndDrop(container, deps.dragHandler);\n }\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${t(\"clickDragText\", state)}</div>\n </div>\n `;\n };\n }\n } else {\n // Non-image, non-video file\n container.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\"><div class=\"text-2xl mb-2\">📁</div><div class=\"text-sm\">${fileName}</div></div>`;\n }\n\n // Add delete button for edit mode (except for videos which have custom buttons)\n if (!isReadonly && !(meta && meta.type && meta.type.startsWith(\"video/\"))) {\n addDeleteButton(container, state, () => {\n // Clear the file\n state.resourceIndex.delete(resourceId);\n // Update hidden input\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n // Clear preview and show placeholder\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${t(\"clickDragText\", state)}</div>\n </div>\n `;\n });\n }\n } else if (state.config.getThumbnail) {\n // Try to get thumbnail from config for uploaded files\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n\n if (thumbnailUrl) {\n clear(container);\n img.src = thumbnailUrl;\n container.appendChild(img);\n } else {\n setEmptyFileContainer(container, state);\n }\n } catch (error) {\n console.error(\"Failed to get thumbnail:\", error);\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${fileName || \"Preview unavailable\"}</div>\n </div>\n `;\n }\n } else {\n setEmptyFileContainer(container, state);\n }\n}\n\n// Render file preview for readonly mode\nexport async function renderFilePreviewReadonly(\n resourceId: string,\n state: State,\n fileName?: string,\n): Promise<HTMLElement> {\n const meta = state.resourceIndex.get(resourceId);\n const actualFileName =\n fileName || meta?.name || resourceId.split(\"/\").pop() || \"file\";\n\n // Determine if this looks like a PSD file (should be treated as download, not preview)\n const isPSD = actualFileName.toLowerCase().match(/\\.psd$/);\n\n // Individual file result container\n const fileResult = document.createElement(\"div\");\n fileResult.className = isPSD ? \"space-y-2\" : \"space-y-3\";\n\n // Preview container - compact for PSD files, large for others\n const previewContainer = document.createElement(\"div\");\n if (isPSD) {\n // Compact container for PSD files\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm\";\n } else {\n // Large container for images/videos\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity\";\n }\n\n // Determine if this looks like an image file (excluding PSD files)\n const isImage =\n !isPSD &&\n (meta?.type?.startsWith(\"image/\") ||\n actualFileName.toLowerCase().match(/\\.(jpg|jpeg|png|gif|webp)$/));\n\n // Determine if this looks like a video file\n const isVideo =\n meta?.type?.startsWith(\"video/\") ||\n actualFileName.toLowerCase().match(/\\.(mp4|webm|avi|mov)$/);\n\n if (isImage) {\n // Image preview - try getThumbnail first\n if (state.config.getThumbnail) {\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n if (thumbnailUrl) {\n previewContainer.innerHTML = `<img src=\"${thumbnailUrl}\" alt=\"${actualFileName}\" class=\"w-full h-auto\">`;\n } else {\n // Fallback to icon if getThumbnail returns null/undefined\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else if (isVideo) {\n // Video preview - try getThumbnail for video URL\n if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(resourceId);\n if (videoUrl) {\n previewContainer.innerHTML = `\n <div class=\"relative group\">\n <video class=\"w-full h-auto\" controls preload=\"auto\" muted>\n <source src=\"${videoUrl}\" type=\"${meta?.type || \"video/mp4\"}\">\n Ваш браузер не поддерживает видео.\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center pointer-events-none\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-3\">\n <svg class=\"w-8 h-8 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for video\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else {\n // Other file types - special handling for PSD files\n const fileIcon = isPSD ? \"🎨\" : \"📁\";\n const fileDescription = isPSD ? \"PSD File\" : \"Document\";\n\n if (isPSD) {\n // Compact horizontal layout for PSD files\n previewContainer.innerHTML = `\n <div class=\"flex items-center space-x-3\">\n <div class=\"text-3xl text-gray-400\">${fileIcon}</div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"text-sm font-medium text-gray-900 truncate\">${actualFileName}</div>\n <div class=\"text-xs text-gray-500\">${fileDescription}</div>\n </div>\n </div>\n `;\n } else {\n // Large centered layout for other documents\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">${fileIcon}</div><div class=\"text-sm\">${actualFileName}</div><div class=\"text-xs text-gray-500 mt-1\">${fileDescription}</div></div></div>`;\n }\n }\n\n // File name (only show for non-PSD files since PSD files show name inline)\n const fileNameElement = document.createElement(\"p\");\n fileNameElement.className = isPSD\n ? \"hidden\"\n : \"text-sm font-medium text-gray-900 text-center\";\n fileNameElement.textContent = actualFileName;\n\n // Download button\n const downloadButton = document.createElement(\"button\");\n downloadButton.className =\n \"w-full px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\";\n downloadButton.textContent = t(\"downloadButton\", state);\n downloadButton.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (state.config.downloadFile) {\n state.config.downloadFile(resourceId, actualFileName);\n } else {\n forceDownload(resourceId, actualFileName, state);\n }\n };\n\n fileResult.appendChild(previewContainer);\n fileResult.appendChild(fileNameElement);\n fileResult.appendChild(downloadButton);\n\n return fileResult;\n}\n\n// Render resource pills for files\nexport function renderResourcePills(\n container: HTMLElement,\n rids: string[] | null,\n state: State,\n onRemove: ((rid: string) => void) | null,\n): void {\n clear(container);\n\n // Show initial placeholder only if this is the first render (no previous grid)\n const isInitialRender = !container.classList.contains(\"grid\");\n\n if ((!rids || rids.length === 0) && isInitialRender) {\n // Create grid container\n const gridContainer = document.createElement(\"div\");\n gridContainer.className = \"grid grid-cols-4 gap-3 mb-3\";\n\n // Create 4 placeholder slots\n for (let i = 0; i < 4; i++) {\n const slot = document.createElement(\"div\");\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"w-12 h-12 text-gray-400\");\n svg.setAttribute(\"fill\", \"currentColor\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n\n const path = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"path\",\n );\n path.setAttribute(\n \"d\",\n \"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\",\n );\n\n svg.appendChild(path);\n slot.appendChild(svg);\n\n // Add click handler to each slot\n slot.onclick = () => {\n // Look for file input\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n\n gridContainer.appendChild(slot);\n }\n\n // Create text container\n const textContainer = document.createElement(\"div\");\n textContainer.className = \"text-center text-xs text-gray-600\";\n\n const uploadLink = document.createElement(\"span\");\n uploadLink.className = \"underline cursor-pointer\";\n uploadLink.textContent = t(\"uploadText\", state);\n uploadLink.onclick = (e) => {\n e.stopPropagation();\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n\n textContainer.appendChild(uploadLink);\n textContainer.appendChild(document.createTextNode(` ${t(\"dragDropText\", state)}`));\n\n container.appendChild(gridContainer);\n container.appendChild(textContainer);\n return;\n }\n\n // Always show files grid if we have files OR if this was already a grid\n container.className = \"files-list grid grid-cols-4 gap-3 mt-2\";\n\n // Calculate how many slots we need\n const currentImagesCount = rids ? rids.length : 0;\n const rowsNeeded = Math.floor(currentImagesCount / 4) + 1;\n const slotsNeeded = rowsNeeded * 4;\n\n // Add all slots (filled and empty)\n for (let i = 0; i < slotsNeeded; i++) {\n const slot = document.createElement(\"div\");\n\n if (rids && i < rids.length) {\n // Filled slot with preview\n const rid = rids[i];\n const meta = state.resourceIndex.get(rid);\n slot.className =\n \"resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300\";\n slot.dataset.resourceId = rid;\n\n // Add image, video, or file content\n renderThumbnailForResource(slot, rid, meta, state).catch((err) => {\n console.error(\"Failed to render thumbnail:\", err);\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">Preview error</div>\n </div>`;\n });\n\n // Add remove button overlay\n if (onRemove) {\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.className = \"bg-red-600 text-white px-2 py-1 rounded text-xs\";\n removeBtn.textContent = t(\"removeElement\", state);\n removeBtn.onclick = (e) => {\n e.stopPropagation();\n onRemove(rid);\n };\n\n overlay.appendChild(removeBtn);\n slot.appendChild(overlay);\n }\n } else {\n // Empty slot placeholder\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n slot.innerHTML =\n '<svg class=\"w-12 h-12 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>';\n slot.onclick = () => {\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n }\n\n container.appendChild(slot);\n }\n}\n\n// Helper function to render thumbnail error UI\nfunction renderThumbnailError(slot: HTMLElement, iconSize: string = \"w-12 h-12\"): void {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"${iconSize} text-red-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\n </svg>\n <div class=\"text-xs mt-1 text-red-600\">Preview error</div>\n </div>`;\n}\n\n// Render thumbnail for resource\nasync function renderThumbnailForResource(\n slot: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): Promise<void> {\n // Add image, video, or file content\n if (meta && meta.type?.startsWith(\"image/\")) {\n if (meta.file && meta.file instanceof File) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n slot.appendChild(img);\n } else if (state.config.getThumbnail) {\n try {\n const url = await state.config.getThumbnail(rid);\n if (url) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n img.src = url;\n slot.appendChild(img);\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot);\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } else if (meta && meta.type?.startsWith(\"video/\")) {\n if (meta.file && meta.file instanceof File) {\n const videoUrl = URL.createObjectURL(meta.file);\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted>\n <source src=\"${videoUrl}\" type=\"${meta.type}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(rid);\n if (videoUrl) {\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted>\n <source src=\"${videoUrl}\" type=\"${meta.type}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${meta?.name || \"Video\"}</div>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot, \"w-8 h-8\");\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${meta?.name || \"Video\"}</div>\n </div>`;\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">${meta?.name || \"File\"}</div>\n </div>`;\n }\n}\n\n// Helper functions\nfunction setEmptyFileContainer(fileContainer: HTMLElement, state: State): void {\n fileContainer.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${t(\"clickDragText\", state)}</div>\n </div>\n `;\n}\n\nasync function handleFileSelect(\n file: File,\n container: HTMLElement,\n fieldName: string,\n state: State,\n deps: FileDeps | null = null,\n instance?: any,\n): Promise<void> {\n let rid: string;\n\n // If uploadHandler is configured, use it to upload the file\n if (state.config.uploadFile) {\n try {\n rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file, // Store the file object for local preview\n });\n\n // Create hidden input to store the resource ID\n let hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (!hiddenInput) {\n hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = fieldName;\n container.parentElement?.appendChild(hiddenInput);\n }\n hiddenInput.value = rid;\n\n renderFilePreview(container, rid, state, {\n fileName: file.name,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Trigger onChange after file upload completes\n if (instance && !state.config.readonly) {\n instance.triggerOnChange(fieldName, rid);\n }\n}\n\nfunction setupDragAndDrop(\n element: HTMLElement,\n dropHandler: (files: FileList) => void,\n): void {\n element.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n element.classList.add(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"dragleave\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n if (e.dataTransfer?.files) {\n dropHandler(e.dataTransfer.files);\n }\n });\n}\n\nfunction addDeleteButton(container: HTMLElement, state: State, onDelete: () => void): void {\n // Remove existing overlay if any\n const existingOverlay = container.querySelector(\".delete-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n\n // Create overlay with center delete button\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"delete-overlay absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.className =\n \"bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors\";\n deleteBtn.textContent = t(\"removeElement\", state);\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n onDelete();\n };\n\n overlay.appendChild(deleteBtn);\n container.appendChild(overlay);\n}\n\nasync function uploadSingleFile(file: File, state: State): Promise<string> {\n if (state.config.uploadFile) {\n try {\n const rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n return rid;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n}\n\nasync function forceDownload(resourceId: string, fileName: string, state: State): Promise<void> {\n try {\n // Try to get URL from dedicated download handler first, then fall back to thumbnail handler\n let fileUrl: string | null = null;\n\n if (state.config.getDownloadUrl) {\n fileUrl = state.config.getDownloadUrl(resourceId);\n } else if (state.config.getThumbnail) {\n fileUrl = await state.config.getThumbnail(resourceId);\n }\n\n if (fileUrl) {\n const finalUrl = fileUrl.startsWith(\"http\")\n ? fileUrl\n : new URL(fileUrl, window.location.href).href;\n\n const response = await fetch(finalUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const blob = await response.blob();\n downloadBlob(blob, fileName);\n } else {\n throw new Error(\"No download URL available for resource\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onDownloadError) {\n state.config.onDownloadError(err, resourceId, fileName);\n }\n console.error(`File download failed for ${fileName}:`, err);\n throw err;\n }\n}\n\nfunction downloadBlob(blob: Blob, fileName: string): void {\n try {\n const blobUrl = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = fileName;\n link.style.display = \"none\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setTimeout(() => {\n URL.revokeObjectURL(blobUrl);\n }, 100);\n } catch (error) {\n throw new Error(`Blob download failed: ${(error as Error).message}`);\n }\n}\n\nfunction addPrefillFilesToIndex(initialFiles: string[], state: State): void {\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n });\n }\n}\n\nfunction handleInitialFileData(\n initial: string,\n fileContainer: HTMLElement,\n pathKey: string,\n fileWrapper: HTMLElement,\n state: State,\n deps: FileDeps,\n): void {\n // Add prefill data to resourceIndex\n if (!state.resourceIndex.has(initial)) {\n const filename = initial.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(initial, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n renderFilePreview(fileContainer, initial, state, {\n fileName: initial,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Create hidden input to store the prefilled resource ID\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = initial;\n fileWrapper.appendChild(hiddenInput);\n}\n\nfunction setupFilesDropHandler(\n filesContainer: HTMLElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n pathKey?: string,\n instance?: any,\n): void {\n setupDragAndDrop(filesContainer, async (files) => {\n const arr = Array.from(files);\n for (const file of arr) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n updateCallback();\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n });\n}\n\nfunction setupFilesPickerHandler(\n filesPicker: HTMLInputElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n pathKey?: string,\n instance?: any,\n): void {\n filesPicker.onchange = async () => {\n if (filesPicker.files) {\n for (const file of Array.from(filesPicker.files)) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n }\n updateCallback();\n filesPicker.value = \"\";\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n };\n}\n\n// Component rendering functions\nexport function renderFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: use common preview function\n const initial = ctx.prefill[element.key];\n if (initial) {\n renderFilePreviewReadonly(initial as string, state).then((filePreview) => {\n wrapper.appendChild(filePreview);\n }).catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">Preview unavailable</div>`;\n wrapper.appendChild(emptyState);\n });\n } else {\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">${t(\"noFileSelected\", state)}</div>`;\n wrapper.appendChild(emptyState);\n }\n } else {\n // Edit mode: normal file input\n const fileWrapper = document.createElement(\"div\");\n fileWrapper.className = \"space-y-2\";\n\n const picker = document.createElement(\"input\");\n picker.type = \"file\";\n picker.name = pathKey;\n picker.style.display = \"none\";\n if (element.accept) {\n picker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const fileContainer = document.createElement(\"div\");\n fileContainer.className =\n \"file-preview-container w-full aspect-square max-w-xs bg-gray-100 rounded-lg overflow-hidden relative group cursor-pointer\";\n\n const initial = ctx.prefill[element.key];\n\n // Set up click and drag handlers\n const fileUploadHandler = () => picker.click();\n const dragHandler = (files: FileList) => {\n if (files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(files[0], fileContainer, pathKey, state, deps, ctx.instance);\n }\n };\n\n // Handle initial prefill data\n if (initial) {\n handleInitialFileData(\n initial as string,\n fileContainer,\n pathKey,\n fileWrapper,\n state,\n {\n picker,\n fileUploadHandler,\n dragHandler,\n },\n );\n } else {\n setEmptyFileContainer(fileContainer, state);\n }\n\n fileContainer.onclick = fileUploadHandler;\n setupDragAndDrop(fileContainer, dragHandler);\n\n picker.onchange = () => {\n if (picker.files && picker.files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(picker.files[0], fileContainer, pathKey, state, deps, ctx.instance);\n }\n };\n\n fileWrapper.appendChild(fileContainer);\n fileWrapper.appendChild(picker);\n\n // Add upload text\n const uploadText = document.createElement(\"p\");\n uploadText.className = \"text-xs text-gray-600 mt-2 text-center\";\n uploadText.innerHTML = `<span class=\"underline cursor-pointer\">${t(\"uploadText\", state)}</span> ${t(\"dragDropTextSingle\", state)}`;\n const uploadSpan = uploadText.querySelector(\"span\");\n if (uploadSpan) {\n uploadSpan.onclick = () => picker.click();\n }\n fileWrapper.appendChild(uploadText);\n\n // Add hint\n const fileHint = document.createElement(\"p\");\n fileHint.className = \"text-xs text-gray-500 mt-1 text-center\";\n fileHint.textContent = makeFieldHint(element);\n fileWrapper.appendChild(fileHint);\n\n wrapper.appendChild(fileWrapper);\n }\n}\n\nexport function renderFilesElement(\n element: FilesElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state).then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n }).catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${t(\"noFilesSelected\", state)}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: normal files input\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className =\n \"border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors\";\n\n const list = document.createElement(\"div\");\n list.className = \"files-list\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n // Add prefill files to resourceIndex\n addPrefillFilesToIndex(initialFiles, state);\n\n function updateFilesList(): void {\n renderResourcePills(list, initialFiles, state, (ridToRemove) => {\n const index = initialFiles.indexOf(ridToRemove);\n if (index > -1) {\n initialFiles.splice(index, 1);\n }\n updateFilesList();\n });\n }\n\n // Initial render\n updateFilesList();\n\n setupFilesDropHandler(filesContainer, initialFiles, state, updateFilesList, pathKey, ctx.instance);\n setupFilesPickerHandler(filesPicker, initialFiles, state, updateFilesList, pathKey, ctx.instance);\n\n filesContainer.appendChild(list);\n filesWrapper.appendChild(filesContainer);\n filesWrapper.appendChild(filesPicker);\n\n // Add hint\n const filesHint = document.createElement(\"p\");\n filesHint.className = \"text-xs text-gray-500 mt-1 text-center\";\n filesHint.textContent = makeFieldHint(element);\n filesWrapper.appendChild(filesHint);\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\nexport function renderMultipleFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const minFiles = element.minCount ?? 0;\n const maxFiles = element.maxCount ?? Infinity;\n\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state).then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n }).catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${t(\"noFilesSelected\", state)}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: multiple file input with min/max validation\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className = \"files-list space-y-2\";\n\n filesWrapper.appendChild(filesPicker);\n filesWrapper.appendChild(filesContainer);\n\n const initialFiles = Array.isArray(ctx.prefill[element.key])\n ? [...(ctx.prefill[element.key] as string[])]\n : [];\n\n // Add initial files to resource index\n addPrefillFilesToIndex(initialFiles, state);\n\n const updateFilesDisplay = (): void => {\n renderResourcePills(filesContainer, initialFiles, state, (index) => {\n initialFiles.splice(initialFiles.indexOf(index), 1);\n updateFilesDisplay();\n });\n\n // Show count and min/max info\n const countInfo = document.createElement(\"div\");\n countInfo.className = \"text-xs text-gray-500 mt-2 file-count-info\";\n const countText = `${initialFiles.length} file${initialFiles.length !== 1 ? \"s\" : \"\"}`;\n const minMaxText =\n minFiles > 0 || maxFiles < Infinity\n ? ` (${minFiles}-${maxFiles} allowed)`\n : \"\";\n countInfo.textContent = countText + minMaxText;\n\n // Remove previous count info\n const existingCount = filesWrapper.querySelector(\".file-count-info\");\n if (existingCount) existingCount.remove();\n\n filesWrapper.appendChild(countInfo);\n };\n\n // Set up drag and drop\n setupFilesDropHandler(filesContainer, initialFiles, state, updateFilesDisplay, pathKey, ctx.instance);\n\n // Set up file picker\n setupFilesPickerHandler(filesPicker, initialFiles, state, updateFilesDisplay, pathKey, ctx.instance);\n\n // Initial display\n updateFilesDisplay();\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate file field and return extracted value with errors\n */\nexport function validateFileElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n const isMultipleField =\n element.type === \"files\" ||\n (\"multiple\" in element && Boolean((element as FileElement).multiple));\n\n // Helper to validate file count\n const validateFileCount = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n\n const minFiles = \"minCount\" in element ? element.minCount ?? 0 : 0;\n const maxFiles =\n \"maxCount\" in element ? element.maxCount ?? Infinity : Infinity;\n\n if (element.required && resourceIds.length === 0) {\n errors.push(`${key}: required`);\n }\n if (resourceIds.length < minFiles) {\n errors.push(`${key}: minimum ${minFiles} files required`);\n }\n if (resourceIds.length > maxFiles) {\n errors.push(`${key}: maximum ${maxFiles} files allowed`);\n }\n };\n\n if (isMultipleField) {\n // Multiple file fields\n const fullKey = pathJoin(path, key);\n const pickerInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"file\"][name=\"${fullKey}\"]`,\n );\n const filesWrapper = pickerInput?.closest(\".space-y-2\");\n const container = filesWrapper?.querySelector(\".files-list\") || null;\n\n const resourceIds: string[] = [];\n if (container) {\n const pills = container.querySelectorAll<HTMLElement>(\".resource-pill\");\n pills.forEach((pill) => {\n const resourceId = pill.dataset.resourceId;\n if (resourceId) {\n resourceIds.push(resourceId);\n }\n });\n }\n\n validateFileCount(key, resourceIds, element);\n return { value: resourceIds, errors };\n } else {\n // Single file field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[name$=\"${key}\"][type=\"hidden\"]`,\n );\n const rid = input?.value ?? \"\";\n\n if (!skipValidation && element.required && rid === \"\") {\n errors.push(`${key}: required`);\n return { value: null, errors };\n }\n\n return { value: rid || null, errors };\n }\n}\n\n/**\n * Update file field value in DOM without re-render\n */\nexport function updateFileField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot, state } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple file fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateFileField: Expected array for multiple file field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update resource IDs in state\n value.forEach((resourceId) => {\n if (resourceId && typeof resourceId === \"string\") {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n }\n });\n\n // Note: Updating the file previews would require re-rendering\n console.info(\n `updateFileField: Multiple file field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n } else {\n // Single file field\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[name=\"${fieldPath}\"][type=\"hidden\"]`,\n );\n\n if (!hiddenInput) {\n console.warn(\n `updateFileField: Hidden input not found for file field \"${fieldPath}\"`,\n );\n return;\n }\n\n // Update hidden input value\n hiddenInput.value = value != null ? String(value) : \"\";\n\n // If value is a resource ID, update the resource index\n if (value && typeof value === \"string\") {\n if (!state.resourceIndex.has(value)) {\n // Add to resource index if not present\n const filename = value.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(value, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n // Note: Updating the file preview would require re-rendering\n // This method only updates the underlying data\n console.info(\n `updateFileField: File field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n }\n }\n}\n","// Container component rendering functions\n\nimport type {\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\nimport { pathJoin, isPlainObject } from \"../utils/helpers.js\";\n\n// Forward declaration - will be imported from components/index.ts\n// This creates a circular dependency that will be resolved at runtime\nlet renderElementFunc:\n | ((element: any, ctx: RenderContext) => HTMLElement)\n | null = null;\n\n// Export setter for renderElement function (called from components/index.ts)\nexport function setRenderElement(\n fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n renderElementFunc = fn;\n}\n\nfunction renderElement(element: any, ctx: RenderContext): HTMLElement {\n if (!renderElementFunc) {\n throw new Error(\n \"renderElement not initialized. Import from components/index.ts\",\n );\n }\n return renderElementFunc(element, ctx);\n}\n\nexport function renderSingleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Same as renderSingleGroup but with updated naming\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n containerWrap.setAttribute(\"data-container\", pathKey);\n\n const header = document.createElement(\"div\");\n header.className = \"flex justify-between items-center mb-4\";\n\n const left = document.createElement(\"div\");\n left.className = \"flex-1\";\n\n const itemsWrap = document.createElement(\"div\");\n itemsWrap.className = \"space-y-4\";\n\n containerWrap.appendChild(header);\n header.appendChild(left);\n\n // Single object container\n const subCtx: RenderContext = {\n path: pathJoin(ctx.path, element.key),\n prefill: (ctx.prefill?.[element.key] as Record<string, any>) || {},\n state: ctx.state,\n };\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n itemsWrap.appendChild(renderElement(child, subCtx));\n }\n });\n containerWrap.appendChild(itemsWrap);\n left.innerHTML = `<span>${element.label || element.key}</span>`;\n\n wrapper.appendChild(containerWrap);\n}\n\nexport function renderMultipleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n _pathKey: string,\n): void {\n const state = ctx.state;\n // Same as renderRepeatableGroup but with minCount/maxCount from element properties\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n\n const header = document.createElement(\"div\");\n header.className = \"flex justify-between items-center mb-4\";\n\n const left = document.createElement(\"div\");\n left.className = \"flex-1\";\n\n const right = document.createElement(\"div\");\n right.className = \"flex gap-2\";\n\n const itemsWrap = document.createElement(\"div\");\n itemsWrap.className = \"space-y-4\";\n\n containerWrap.appendChild(header);\n header.appendChild(left);\n if (!state.config.readonly) {\n header.appendChild(right);\n }\n\n const min = element.minCount ?? 0;\n const max = element.maxCount ?? Infinity;\n const pre = Array.isArray(ctx.prefill?.[element.key])\n ? (ctx.prefill[element.key] as Array<Record<string, any>>)\n : null;\n\n const countItems = (): number =>\n itemsWrap.querySelectorAll(\":scope > .containerItem\").length;\n\n const createAddButton = (): HTMLButtonElement => {\n const add = document.createElement(\"button\");\n add.type = \"button\";\n add.className =\n \"px-3 py-1.5 bg-blue-600 text-white text-sm rounded-lg hover:bg-blue-700 transition-colors\";\n add.textContent = t(\"addElement\", state);\n add.onclick = () => {\n if (countItems() < max) {\n const idx = countItems();\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: {},\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n item.appendChild(renderElement(child, subCtx));\n }\n });\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className =\n \"absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors\";\n rem.textContent = \"×\";\n rem.onclick = () => {\n item.remove();\n updateAddButton();\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n updateAddButton();\n }\n };\n return add;\n };\n\n const updateAddButton = (): void => {\n const currentCount = countItems();\n const addBtn = right.querySelector(\"button\") as HTMLButtonElement;\n if (addBtn) {\n addBtn.disabled = currentCount >= max;\n addBtn.style.opacity = currentCount >= max ? \"0.5\" : \"1\";\n }\n left.innerHTML = `<span>${element.label || element.key}</span> <span class=\"text-sm text-gray-500\">(${currentCount}/${max === Infinity ? \"∞\" : max})</span>`;\n };\n\n if (!state.config.readonly) {\n right.appendChild(createAddButton());\n }\n\n // Pre-fill initial items\n if (pre && Array.isArray(pre)) {\n pre.forEach((prefillObj, idx) => {\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: prefillObj || {},\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n item.appendChild(renderElement(child, subCtx));\n }\n });\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className =\n \"absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors\";\n rem.textContent = \"×\";\n rem.onclick = () => {\n item.remove();\n updateAddButton();\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n });\n }\n\n // Ensure minimum items\n if (!state.config.readonly) {\n while (countItems() < min) {\n const idx = countItems();\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: {},\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n item.appendChild(renderElement(child, subCtx));\n }\n });\n\n // Remove button - but disabled if we're at minimum\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className =\n \"absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors\";\n rem.textContent = \"×\";\n rem.onclick = () => {\n if (countItems() > min) {\n item.remove();\n updateAddButton();\n }\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n\n itemsWrap.appendChild(item);\n }\n }\n\n containerWrap.appendChild(itemsWrap);\n updateAddButton();\n\n wrapper.appendChild(containerWrap);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n// Forward declaration for validateElement - will be set from FormBuilderInstance\nlet validateElementFunc:\n | ((element: Element, ctx: { path: string }, customScopeRoot?: HTMLElement | null) => any)\n | null = null;\n\n// Export setter for validateElement function\nexport function setValidateElement(\n fn: (element: Element, ctx: { path: string }, customScopeRoot?: HTMLElement | null) => any,\n): void {\n validateElementFunc = fn;\n}\n\nfunction validateElement(\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n): any {\n if (!validateElementFunc) {\n throw new Error(\n \"validateElement not initialized. Should be set from FormBuilderInstance\",\n );\n }\n return validateElementFunc(element, ctx, customScopeRoot);\n}\n\n/**\n * Validate container field and return extracted value with errors\n */\nexport function validateContainerElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n if (!(\"elements\" in element)) {\n return { value: null, errors };\n }\n\n // Helper to validate container count\n const validateContainerCount = (\n key: string,\n items: any[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n\n const minItems = \"minCount\" in element ? element.minCount ?? 0 : 0;\n const maxItems =\n \"maxCount\" in element ? element.maxCount ?? Infinity : Infinity;\n\n if (element.required && items.length === 0) {\n errors.push(`${key}: required`);\n }\n if (items.length < minItems) {\n errors.push(`${key}: minimum ${minItems} items required`);\n }\n if (items.length > maxItems) {\n errors.push(`${key}: maximum ${maxItems} items allowed`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n const items: any[] = [];\n const allContainerWrappers = scopeRoot.querySelectorAll<HTMLElement>(\n \"[data-container-item]\",\n );\n const containerWrappers = Array.from(allContainerWrappers).filter((el) => {\n const attr = el.getAttribute(\"data-container-item\");\n return attr?.startsWith(`${key}[`);\n });\n const itemCount = containerWrappers.length;\n\n for (let i = 0; i < itemCount; i++) {\n const itemData: Record<string, any> = {};\n const itemContainer =\n scopeRoot.querySelector<HTMLElement>(\n `[data-container-item=\"${key}[${i}]\"]`,\n ) || scopeRoot;\n\n element.elements.forEach((child: any) => {\n if (child.hidden || child.type === \"hidden\") {\n itemData[child.key] =\n child.default !== undefined ? child.default : null;\n } else {\n const childKey = `${key}[${i}].${child.key}`;\n itemData[child.key] = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n itemContainer,\n );\n }\n });\n items.push(itemData);\n }\n\n validateContainerCount(key, items, element);\n return { value: items, errors };\n } else {\n // Single container\n const containerData: Record<string, any> = {};\n const containerContainer =\n scopeRoot.querySelector<HTMLElement>(`[data-container=\"${key}\"]`) ||\n scopeRoot;\n\n element.elements.forEach((child: any) => {\n if (child.hidden || child.type === \"hidden\") {\n containerData[child.key] =\n child.default !== undefined ? child.default : null;\n } else {\n const childKey = `${key}.${child.key}`;\n containerData[child.key] = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n containerContainer,\n );\n }\n });\n\n return { value: containerData, errors };\n }\n}\n\n/**\n * Update container field value in DOM without re-render\n */\nexport function updateContainerField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { instance, scopeRoot } = context;\n\n if (!(\"elements\" in element)) {\n return;\n }\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n if (!Array.isArray(value)) {\n console.warn(\n `updateContainerField: Expected array for multiple container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields for each item\n value.forEach((itemValue, index) => {\n if (isPlainObject(itemValue)) {\n element.elements.forEach((childElement) => {\n const childKey = childElement.key;\n const childPath = `${fieldPath}[${index}].${childKey}`;\n const childValue = (itemValue as Record<string, any>)[childKey];\n\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n });\n }\n });\n\n const existingContainers = scopeRoot.querySelectorAll(\n `[data-container-item^=\"${fieldPath}[\"]`,\n );\n if (value.length !== existingContainers.length) {\n console.warn(\n `updateContainerField: Multiple container field \"${fieldPath}\" item count mismatch. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single container\n if (!isPlainObject(value)) {\n console.warn(\n `updateContainerField: Expected object for container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields\n element.elements.forEach((childElement) => {\n const childKey = childElement.key;\n const childPath = `${fieldPath}.${childKey}`;\n const childValue = (value as Record<string, any>)[childKey];\n\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n });\n }\n}\n","// Group component - compatibility layer that delegates to container\n// Translates legacy GroupElement (with repeat: {min, max}) to ContainerElement (with multiple: true, minCount, maxCount)\n\nimport type {\n GroupElement,\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { isPlainObject } from \"../utils/helpers.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n validateContainerElement,\n updateContainerField,\n} from \"./container.js\";\n\n// Export setter for renderElement function (called from components/index.ts)\n// This is a no-op since group now delegates to container (which has its own setRenderElement)\nexport function setRenderElement(\n _fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n // No-op: container handles renderElement initialization\n}\n\n/**\n * Renders a group element by translating it to a ContainerElement\n * and delegating to container rendering functions.\n *\n * This maintains backward compatibility with the legacy group type\n * while eliminating code duplication.\n *\n * @deprecated Use type: \"container\" with multiple: true instead of type: \"group\" with repeat: {min, max}\n */\nexport function renderGroupElement(\n element: GroupElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Log deprecation warning once per element\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated and will be removed in a future version. ` +\n `Please use type: \"container\" with multiple: true instead. ` +\n `Field key: \"${element.key}\"`,\n );\n }\n\n // Translate GroupElement → ContainerElement\n const containerElement: ContainerElement = {\n type: \"container\",\n key: element.key,\n label: element.label,\n description: element.description,\n hint: element.hint,\n required: element.required,\n hidden: element.hidden,\n default: element.default,\n actions: element.actions,\n elements: element.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(element.repeat && isPlainObject(element.repeat)),\n minCount: element.repeat?.min,\n maxCount: element.repeat?.max,\n };\n\n // Delegate to container implementation\n if (containerElement.multiple) {\n renderMultipleContainerElement(containerElement, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(containerElement, ctx, wrapper, pathKey);\n }\n}\n\n// Legacy exports for backward compatibility (not used internally)\nexport { renderGroupElement as renderRepeatableGroup };\nexport { renderGroupElement as renderSingleGroup };\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Helper to translate GroupElement to ContainerElement\n */\nfunction translateGroupToContainer(element: Element): ContainerElement {\n const groupElement = element as GroupElement;\n return {\n type: \"container\",\n key: groupElement.key,\n label: groupElement.label,\n description: groupElement.description,\n hint: groupElement.hint,\n required: groupElement.required,\n hidden: groupElement.hidden,\n default: groupElement.default,\n actions: groupElement.actions,\n elements: groupElement.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(groupElement.repeat && isPlainObject(groupElement.repeat)),\n minCount: groupElement.repeat?.min,\n maxCount: groupElement.repeat?.max,\n };\n}\n\n/**\n * Validate group field by delegating to container validation\n * @deprecated Use validateContainerElement with type: \"container\" instead\n */\nexport function validateGroupElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field key: \"${key}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return validateContainerElement(containerElement, key, context);\n}\n\n/**\n * Update group field by delegating to container update\n * @deprecated Use updateContainerField with type: \"container\" instead\n */\nexport function updateGroupField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field path: \"${fieldPath}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return updateContainerField(containerElement, fieldPath, value, context);\n}\n","// Component registry and main renderElement dispatcher\n\nimport type { Element, RenderContext } from \"../types/index.js\";\nimport { pathJoin } from \"../utils/helpers.js\";\nimport { renderTextElement, renderMultipleTextElement } from \"./text.js\";\nimport {\n renderTextareaElement,\n renderMultipleTextareaElement,\n} from \"./textarea.js\";\nimport { renderNumberElement, renderMultipleNumberElement } from \"./number.js\";\nimport { renderSelectElement, renderMultipleSelectElement } from \"./select.js\";\nimport {\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n} from \"./file.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n setRenderElement as setContainerRenderElement,\n setValidateElement as setContainerValidateElement,\n} from \"./container.js\";\nimport {\n renderGroupElement,\n setRenderElement as setGroupRenderElement,\n} from \"./group.js\";\n\n// Tooltip management\nfunction showTooltip(tooltipId: string, button: HTMLElement): void {\n const tooltip = document.getElementById(tooltipId);\n if (!tooltip) return;\n\n const isCurrentlyVisible = !tooltip.classList.contains(\"hidden\");\n\n // Hide all tooltips first\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((t) => {\n t.classList.add(\"hidden\");\n });\n\n // If the tooltip was already visible, keep it hidden (toggle behavior)\n if (isCurrentlyVisible) {\n return;\n }\n\n // Position the tooltip intelligently\n const rect = button.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Ensure tooltip is appended to body for proper positioning\n if (tooltip && tooltip.parentElement !== document.body) {\n document.body.appendChild(tooltip);\n }\n\n // Show tooltip temporarily to measure its size\n tooltip.style.visibility = \"hidden\";\n tooltip.style.position = \"fixed\";\n tooltip.classList.remove(\"hidden\");\n const tooltipRect = tooltip.getBoundingClientRect();\n tooltip.classList.add(\"hidden\");\n tooltip.style.visibility = \"visible\";\n\n let left = rect.left;\n let top = rect.bottom + 5;\n\n // Adjust horizontal position if tooltip would go off-screen\n if (left + tooltipRect.width > viewportWidth) {\n left = rect.right - tooltipRect.width;\n }\n\n // Adjust vertical position if tooltip would go off-screen\n if (top + tooltipRect.height > viewportHeight) {\n top = rect.top - tooltipRect.height - 5;\n }\n\n // Ensure tooltip doesn't go off the left edge\n if (left < 10) {\n left = 10;\n }\n\n // Ensure tooltip doesn't go off the top edge\n if (top < 10) {\n top = rect.bottom + 5;\n }\n\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${top}px`;\n\n // Show the tooltip\n tooltip.classList.remove(\"hidden\");\n\n // Hide after 25 seconds\n setTimeout(() => {\n tooltip.classList.add(\"hidden\");\n }, 25000);\n}\n\n// Close tooltips when clicking outside\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const isInfoButton =\n target.closest(\"button\") && (target.closest(\"button\") as any).onclick;\n const isTooltip = target.closest('[id^=\"tooltip-\"]');\n\n if (!isInfoButton && !isTooltip) {\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((tooltip) => {\n tooltip.classList.add(\"hidden\");\n });\n }\n });\n}\n\n// Main renderElement function - dispatcher to component-specific renderers\nexport function renderElement(\n element: Element,\n ctx: RenderContext,\n): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"mb-6 fb-field-wrapper\";\n\n const label = document.createElement(\"div\");\n label.className = \"flex items-center mb-2\";\n const title = document.createElement(\"label\");\n title.className = \"text-sm font-medium text-gray-900\";\n title.textContent = element.label || element.key;\n if (element.required) {\n const req = document.createElement(\"span\");\n req.className = \"text-red-500 ml-1\";\n req.textContent = \"*\";\n title.appendChild(req);\n }\n label.appendChild(title);\n\n // Add info button if there's description or hint\n if (element.description || element.hint) {\n const infoBtn = document.createElement(\"button\");\n infoBtn.type = \"button\";\n infoBtn.className = \"ml-2 text-gray-400 hover:text-gray-600\";\n infoBtn.innerHTML =\n '<svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>';\n\n // Create tooltip\n const tooltipId = `tooltip-${element.key}-${Math.random().toString(36).substr(2, 9)}`;\n const tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.className =\n \"hidden absolute z-50 bg-gray-200 text-gray-900 text-sm rounded-lg p-3 max-w-sm border border-gray-300 shadow-lg\";\n tooltip.style.position = \"fixed\";\n tooltip.textContent =\n element.description || element.hint || \"Field information\";\n document.body.appendChild(tooltip);\n\n infoBtn.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n showTooltip(tooltipId, infoBtn);\n };\n\n label.appendChild(infoBtn);\n }\n\n wrapper.appendChild(label);\n\n const pathKey = pathJoin(ctx.path, element.key);\n\n switch (element.type) {\n case \"text\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleTextElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"textarea\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleTextareaElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextareaElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"number\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleNumberElement(element, ctx, wrapper, pathKey);\n } else {\n renderNumberElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"select\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleSelectElement(element, ctx, wrapper, pathKey);\n } else {\n renderSelectElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"file\":\n // Handle multiple files with file type using multiple property\n if (\"multiple\" in element && element.multiple) {\n renderMultipleFileElement(element, ctx, wrapper, pathKey);\n } else {\n renderFileElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"files\":\n renderFilesElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"group\":\n renderGroupElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"container\":\n // Handle containers with multiple property like groups\n if (\"multiple\" in element && element.multiple) {\n renderMultipleContainerElement(element, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n default: {\n const unsupported = document.createElement(\"div\");\n unsupported.className = \"text-red-500 text-sm\";\n unsupported.textContent = `Unsupported field type: ${(element as any).type}`;\n wrapper.appendChild(unsupported);\n }\n }\n\n // Actions are now only rendered via external actions system in renderExternalActions()\n // element.actions are only used for label lookup, not direct rendering\n\n return wrapper;\n}\n\n// Initialize circular dependencies\n// Container and Group components need renderElement for nested rendering\nsetContainerRenderElement(renderElement);\nsetGroupRenderElement(renderElement);\n\n// Export setter for container validation (will be called from FormBuilderInstance)\nexport { setContainerValidateElement };\n\n// Export all component renderers for potential direct use\nexport {\n renderTextElement,\n renderMultipleTextElement,\n renderTextareaElement,\n renderMultipleTextareaElement,\n renderNumberElement,\n renderMultipleNumberElement,\n renderSelectElement,\n renderMultipleSelectElement,\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n renderSingleContainerElement,\n renderMultipleContainerElement,\n renderGroupElement,\n};\n","// Instance state factory for Form Builder\n// Creates isolated state objects for each FormBuilderInstance\n\nimport type { State, Config } from \"../types/index.js\";\n\n/**\n * Default configuration for new instances\n */\nexport const defaultConfig: Config = {\n uploadFile: null,\n downloadFile: null,\n getThumbnail: null,\n getDownloadUrl: null,\n actionHandler: null,\n onChange: null,\n onFieldChange: null,\n onThumbnailError: null,\n onUploadError: null,\n onDownloadError: null,\n debounceMs: 300,\n enableFilePreview: true,\n maxPreviewSize: \"200px\",\n readonly: false,\n locale: \"en\",\n translations: {\n en: {\n addElement: \"Add Element\",\n removeElement: \"Remove\",\n uploadText: \"Upload\",\n dragDropText: \"or drag and drop files\",\n dragDropTextSingle: \"or drag and drop file\",\n clickDragText: \"Click or drag file\",\n noFileSelected: \"No file selected\",\n noFilesSelected: \"No files selected\",\n downloadButton: \"Download\",\n },\n ru: {\n addElement: \"Добавить элемент\",\n removeElement: \"Удалить\",\n uploadText: \"Загрузите\",\n dragDropText: \"или перетащите файлы\",\n dragDropTextSingle: \"или перетащите файл\",\n clickDragText: \"Нажмите или перетащите файл\",\n noFileSelected: \"Файл не выбран\",\n noFilesSelected: \"Нет файлов\",\n downloadButton: \"Скачать\",\n },\n },\n theme: {},\n};\n\n/**\n * Create a new isolated state object for a FormBuilderInstance\n */\nexport function createInstanceState(config?: Partial<Config>): State {\n return {\n schema: null,\n formRoot: null,\n resourceIndex: new Map(),\n externalActions: null,\n version: \"1.0.0\",\n config: {\n ...defaultConfig,\n ...config,\n },\n debounceTimer: null,\n };\n}\n\n/**\n * Generate unique instance ID for resource prefixing\n */\nexport function generateInstanceId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 9);\n return `inst-${timestamp}-${random}`;\n}\n","// Theme configuration and CSS custom properties\n// Provides a centralized theming system using CSS variables\n\nexport interface Theme {\n // Colors\n primaryColor: string;\n primaryHoverColor: string;\n errorColor: string;\n errorHoverColor: string;\n successColor: string;\n borderColor: string;\n borderHoverColor: string;\n borderFocusColor: string;\n backgroundColor: string;\n backgroundHoverColor: string;\n backgroundReadonlyColor: string;\n textColor: string;\n textSecondaryColor: string;\n textPlaceholderColor: string;\n textDisabledColor: string;\n\n // Button colors\n buttonBgColor: string;\n buttonTextColor: string;\n buttonBorderColor: string;\n buttonHoverBgColor: string;\n buttonHoverBorderColor: string;\n\n // Action button colors\n actionBgColor: string;\n actionTextColor: string;\n actionBorderColor: string;\n actionHoverBgColor: string;\n actionHoverBorderColor: string;\n\n // File upload colors\n fileUploadBgColor: string;\n fileUploadBorderColor: string;\n fileUploadTextColor: string;\n fileUploadHoverBorderColor: string;\n\n // Spacing\n inputPaddingX: string;\n inputPaddingY: string;\n borderRadius: string;\n borderWidth: string;\n\n // Typography\n fontSize: string;\n fontSizeSmall: string;\n fontSizeExtraSmall: string;\n fontFamily: string;\n fontWeightNormal: string;\n fontWeightMedium: string;\n\n // Focus ring\n focusRingWidth: string;\n focusRingColor: string;\n focusRingOpacity: string;\n\n // Transitions\n transitionDuration: string;\n}\n\nexport const defaultTheme: Theme = {\n // Colors - matching Tailwind defaults\n primaryColor: \"#3b82f6\", // blue-500\n primaryHoverColor: \"#2563eb\", // blue-600\n errorColor: \"#ef4444\", // red-500\n errorHoverColor: \"#dc2626\", // red-600\n successColor: \"#10b981\", // green-500\n borderColor: \"#d1d5db\", // gray-300\n borderHoverColor: \"#9ca3af\", // gray-400\n borderFocusColor: \"#3b82f6\", // blue-500\n backgroundColor: \"#ffffff\", // white\n backgroundHoverColor: \"#f9fafb\", // gray-50\n backgroundReadonlyColor: \"#f3f4f6\", // gray-100\n textColor: \"#1f2937\", // gray-800\n textSecondaryColor: \"#6b7280\", // gray-500\n textPlaceholderColor: \"#9ca3af\", // gray-400\n textDisabledColor: \"#d1d5db\", // gray-300\n\n // Button colors\n buttonBgColor: \"#3b82f6\", // blue-500\n buttonTextColor: \"#ffffff\", // white\n buttonBorderColor: \"#2563eb\", // blue-600\n buttonHoverBgColor: \"#2563eb\", // blue-600\n buttonHoverBorderColor: \"#1d4ed8\", // blue-700\n\n // Action button colors\n actionBgColor: \"#ffffff\", // white\n actionTextColor: \"#374151\", // gray-700\n actionBorderColor: \"#e5e7eb\", // gray-200\n actionHoverBgColor: \"#f9fafb\", // gray-50\n actionHoverBorderColor: \"#d1d5db\", // gray-300\n\n // File upload colors\n fileUploadBgColor: \"#f3f4f6\", // gray-100\n fileUploadBorderColor: \"#d1d5db\", // gray-300\n fileUploadTextColor: \"#9ca3af\", // gray-400\n fileUploadHoverBorderColor: \"#3b82f6\", // blue-500\n\n // Spacing\n inputPaddingX: \"0.75rem\", // 3 (12px)\n inputPaddingY: \"0.5rem\", // 2 (8px)\n borderRadius: \"0.5rem\", // rounded-lg (8px)\n borderWidth: \"1px\",\n\n // Typography\n fontSize: \"0.875rem\", // text-sm (14px)\n fontSizeSmall: \"0.75rem\", // text-xs (12px)\n fontSizeExtraSmall: \"0.625rem\", // 10px\n fontFamily:\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontWeightNormal: \"400\",\n fontWeightMedium: \"500\",\n\n // Focus ring\n focusRingWidth: \"2px\",\n focusRingColor: \"#3b82f6\", // blue-500\n focusRingOpacity: \"0.5\",\n\n // Transitions\n transitionDuration: \"200ms\",\n};\n\n/**\n * Generate CSS custom properties from theme object\n * Prefixes all variables with --fb- to avoid conflicts\n */\nexport function generateCSSVariables(theme: Partial<Theme>): string {\n const mergedTheme = { ...defaultTheme, ...theme };\n\n const cssVars: string[] = [];\n\n // Convert theme object to CSS variables\n Object.entries(mergedTheme).forEach(([key, value]) => {\n // Convert camelCase to kebab-case\n const kebabKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n cssVars.push(` --fb-${kebabKey}: ${value};`);\n });\n\n return cssVars.join(\"\\n\");\n}\n\n/**\n * Inject theme CSS variables into a container element or create a style tag\n */\nexport function injectThemeVariables(\n container: HTMLElement,\n theme: Partial<Theme>,\n): void {\n const cssVariables = generateCSSVariables(theme);\n\n // Check if there's already a theme style tag\n let styleTag = container.querySelector(\n \"style[data-fb-theme]\",\n ) as HTMLStyleElement;\n\n if (!styleTag) {\n styleTag = document.createElement(\"style\");\n styleTag.setAttribute(\"data-fb-theme\", \"true\");\n container.appendChild(styleTag);\n }\n\n // Create CSS rule targeting the container\n styleTag.textContent = `\n [data-fb-root=\"true\"] {\n${cssVariables}\n }\n `;\n}\n\n/**\n * Example theme configurations for documentation\n */\nexport const exampleThemes = {\n default: defaultTheme,\n\n dark: {\n ...defaultTheme,\n primaryColor: \"#60a5fa\", // blue-400\n primaryHoverColor: \"#3b82f6\", // blue-500\n borderColor: \"#4b5563\", // gray-600\n borderHoverColor: \"#6b7280\", // gray-500\n borderFocusColor: \"#60a5fa\", // blue-400\n backgroundColor: \"#1f2937\", // gray-800\n backgroundHoverColor: \"#374151\", // gray-700\n backgroundReadonlyColor: \"#111827\", // gray-900\n textColor: \"#f9fafb\", // gray-50\n textSecondaryColor: \"#9ca3af\", // gray-400\n textPlaceholderColor: \"#6b7280\", // gray-500\n fileUploadBgColor: \"#374151\", // gray-700\n fileUploadBorderColor: \"#4b5563\", // gray-600\n fileUploadTextColor: \"#9ca3af\", // gray-400\n } as Theme,\n\n klein: {\n ...defaultTheme,\n primaryColor: \"#0066cc\",\n primaryHoverColor: \"#0052a3\",\n errorColor: \"#d32f2f\",\n errorHoverColor: \"#c62828\",\n successColor: \"#388e3c\",\n borderColor: \"#e0e0e0\",\n borderHoverColor: \"#bdbdbd\",\n borderFocusColor: \"#0066cc\",\n borderRadius: \"4px\",\n fontSize: \"16px\",\n fontSizeSmall: \"14px\",\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n } as Theme,\n};\n","// Style utility functions for applying themed styles to form elements\n\nimport type { State } from \"../types/index.js\";\n\n/**\n * Apply themed input styles to an HTMLInputElement, HTMLTextAreaElement, or HTMLSelectElement\n */\nexport function applyInputStyles(\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n state: State,\n className?: string,\n): void {\n element.className = className || \"w-full\";\n element.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n\n // Add interactive hover/focus styles for editable inputs\n if (!state.config.readonly) {\n element.addEventListener(\"focus\", () => {\n element.style.borderColor = \"var(--fb-border-focus-color)\";\n element.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n element.style.outlineOffset = \"0\";\n });\n element.addEventListener(\"blur\", () => {\n element.style.borderColor = \"var(--fb-border-color)\";\n element.style.outline = \"none\";\n });\n element.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n element.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n}\n\n/**\n * Apply themed hint/description styles to a paragraph element\n */\nexport function applyHintStyles(element: HTMLParagraphElement): void {\n element.className = \"mt-1\";\n element.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n}\n\n/**\n * Create a styled add button with theme support\n */\nexport function createAddButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"mt-2 px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = text;\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = onClick;\n return addBtn;\n}\n\n/**\n * Create a styled remove button with theme support\n */\nexport function createRemoveButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = text;\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = onClick;\n return removeBtn;\n}\n\n/**\n * Apply themed action button styles (for external actions in readonly mode)\n */\nexport function applyActionButtonStyles(\n button: HTMLButtonElement,\n isFormLevel: boolean = false,\n): void {\n button.style.cssText = `\n background-color: var(--fb-action-bg-color);\n color: var(--fb-action-text-color);\n border: var(--fb-border-width) solid var(--fb-action-border-color);\n padding: ${isFormLevel ? \"0.5rem 1rem\" : \"0.5rem 0.75rem\"};\n font-size: var(--fb-font-size);\n font-weight: var(--fb-font-weight-medium);\n border-radius: var(--fb-border-radius);\n transition: all var(--fb-transition-duration);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n `;\n button.addEventListener(\"mouseenter\", () => {\n button.style.backgroundColor = \"var(--fb-action-hover-bg-color)\";\n button.style.borderColor = \"var(--fb-action-hover-border-color)\";\n });\n button.addEventListener(\"mouseleave\", () => {\n button.style.backgroundColor = \"var(--fb-action-bg-color)\";\n button.style.borderColor = \"var(--fb-action-border-color)\";\n });\n}\n","// Component operations registry - maps element types to validation/update functions\n// This registry provides delegation from FormBuilderInstance to component-specific logic\n\nimport type {\n Element,\n ComponentContext,\n ValidationResult,\n ComponentOperations,\n ComponentValidator,\n ComponentUpdater,\n} from \"../types/index.js\";\nimport { validateTextElement, updateTextField } from \"./text.js\";\nimport { validateTextareaElement, updateTextareaField } from \"./textarea.js\";\nimport { validateNumberElement, updateNumberField } from \"./number.js\";\nimport { validateSelectElement, updateSelectField } from \"./select.js\";\nimport { validateFileElement, updateFileField } from \"./file.js\";\nimport {\n validateContainerElement,\n updateContainerField,\n} from \"./container.js\";\nimport { validateGroupElement, updateGroupField } from \"./group.js\";\n\n/**\n * Component operations registry\n * Maps element type to validator and updater functions\n */\nconst componentRegistry: Record<string, ComponentOperations> = {\n text: {\n validate: validateTextElement as ComponentValidator,\n update: updateTextField as ComponentUpdater,\n },\n textarea: {\n validate: validateTextareaElement as ComponentValidator,\n update: updateTextareaField as ComponentUpdater,\n },\n number: {\n validate: validateNumberElement as ComponentValidator,\n update: updateNumberField as ComponentUpdater,\n },\n select: {\n validate: validateSelectElement as ComponentValidator,\n update: updateSelectField as ComponentUpdater,\n },\n file: {\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n files: {\n // Legacy type - delegates to file\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n container: {\n validate: validateContainerElement as ComponentValidator,\n update: updateContainerField as ComponentUpdater,\n },\n group: {\n // Deprecated type - delegates to container\n validate: validateGroupElement as ComponentValidator,\n update: updateGroupField as ComponentUpdater,\n },\n};\n\n/**\n * Get component operations for a given element type\n */\nexport function getComponentOperations(\n elementType: string,\n): ComponentOperations | null {\n return componentRegistry[elementType] || null;\n}\n\n/**\n * Validate element using component-specific validator\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function validateElementWithComponent(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult | null {\n const ops = getComponentOperations(element.type);\n if (ops && ops.validate) {\n return ops.validate(element, key, context);\n }\n return null; // Return null to indicate fallback to legacy implementation\n}\n\n/**\n * Update element using component-specific updater\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function updateElementWithComponent(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): boolean {\n const ops = getComponentOperations(element.type);\n if (ops && ops.update) {\n ops.update(element, fieldPath, value, context);\n return true;\n }\n return false; // Return false to indicate fallback to legacy implementation\n}\n","// Form Builder Instance - Encapsulated state management for multi-instance support\n\nimport type {\n Schema,\n Element,\n ContainerElement,\n GroupElement,\n ExternalAction,\n FormData as FormDataResult,\n Config,\n State,\n ComponentContext,\n} from \"../types/index.js\";\nimport { validateSchema } from \"../utils/validation.js\";\nimport { clear } from \"../utils/helpers.js\";\nimport {\n renderElement,\n setContainerValidateElement,\n} from \"../components/index.js\";\nimport { createInstanceState, generateInstanceId } from \"./state.js\";\nimport { injectThemeVariables } from \"../styles/theme.js\";\nimport { applyActionButtonStyles } from \"../utils/styles.js\";\nimport {\n validateElementWithComponent,\n updateElementWithComponent,\n} from \"../components/registry.js\";\n\n/**\n * FormBuilderInstance - Encapsulates all form state and operations\n * Allows multiple independent forms on the same page without state collisions\n */\nexport class FormBuilderInstance {\n private state: State;\n private instanceId: string;\n\n constructor(config?: Partial<Config>) {\n this.instanceId = generateInstanceId();\n this.state = createInstanceState(config);\n\n // Dev mode warnings\n if (typeof process !== \"undefined\" && process.env.NODE_ENV === \"development\") {\n // Warn if getThumbnail is not async\n if (config?.getThumbnail) {\n const testResult = config.getThumbnail(\"test-id\");\n if (!(testResult instanceof Promise)) {\n console.warn(\n \"[form-builder] getThumbnail must be async (return Promise). \" +\n \"Wrap your function: async (id) => { ... }\",\n );\n }\n }\n\n // Track instances for memory leak detection\n if (!globalThis.__formBuilderInstances) {\n globalThis.__formBuilderInstances = new Set<string>();\n }\n globalThis.__formBuilderInstances.add(this.instanceId);\n\n // Warn about instance count\n if (globalThis.__formBuilderInstances.size > 10) {\n console.warn(\n `[form-builder] ${globalThis.__formBuilderInstances.size} instances active. ` +\n \"Possible memory leak - ensure you call destroy() when done.\",\n );\n }\n }\n }\n\n /**\n * Get instance ID (useful for debugging and resource prefixing)\n */\n getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Get current state (for advanced use cases)\n */\n getState(): State {\n return this.state;\n }\n\n /**\n * Set the form root element\n */\n setFormRoot(element: HTMLElement): void {\n this.state.formRoot = element;\n }\n\n /**\n * Configure the form builder\n */\n configure(config: Partial<Config>): void {\n Object.assign(this.state.config, config);\n }\n\n /**\n * Set file upload handler\n */\n setUploadHandler(uploadFn: ((file: File) => Promise<string>) | null): void {\n this.state.config.uploadFile = uploadFn;\n }\n\n /**\n * Set file download handler\n */\n setDownloadHandler(\n downloadFn: ((resourceId: string, fileName: string) => void) | null,\n ): void {\n this.state.config.downloadFile = downloadFn;\n }\n\n /**\n * Set thumbnail generation handler\n */\n setThumbnailHandler(\n thumbnailFn: ((resourceId: string) => Promise<string | null>) | null,\n ): void {\n this.state.config.getThumbnail = thumbnailFn;\n }\n\n /**\n * Set action handler\n */\n setActionHandler(\n actionFn:\n | ((value: string, key: string, relatedField: string | null) => void)\n | null,\n ): void {\n this.state.config.actionHandler = actionFn;\n }\n\n /**\n * Set mode (edit or readonly)\n */\n setMode(mode: \"edit\" | \"readonly\"): void {\n this.state.config.readonly = mode === \"readonly\";\n }\n\n /**\n * Set locale\n */\n setLocale(locale: \"en\" | \"ru\"): void {\n if (this.state.config.translations[locale]) {\n this.state.config.locale = locale;\n }\n }\n\n /**\n * Trigger onChange callbacks with debouncing\n * @param fieldPath - Optional field path for field-specific change events\n * @param fieldValue - Optional field value for field-specific change events\n */\n triggerOnChange(fieldPath?: string, fieldValue?: any): void {\n // Skip if in readonly mode or during initial render\n if (this.state.config.readonly) return;\n\n // Clear existing debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n }\n\n // Set new debounce timer\n this.state.debounceTimer = setTimeout(() => {\n // Get current form data without validation to avoid UI errors\n const formData = this.validateForm(true);\n\n // Call onChange callback if configured\n if (this.state.config.onChange) {\n this.state.config.onChange(formData);\n }\n\n // Call onFieldChange callback if configured and field path provided\n if (\n this.state.config.onFieldChange &&\n fieldPath !== undefined &&\n fieldValue !== undefined\n ) {\n this.state.config.onFieldChange(fieldPath, fieldValue, formData);\n }\n\n // Clear timer reference\n this.state.debounceTimer = null;\n }, this.state.config.debounceMs) as unknown as number;\n }\n\n /**\n * Register an external action that will be displayed as a button\n * External actions can be form-level (no related_field) or field-level (with related_field)\n * @param action - External action definition\n */\n registerAction(action: ExternalAction): void {\n if (!action || !action.value) {\n throw new Error(\"Action must have a value property\");\n }\n\n // Initialize externalActions array if not exists\n if (!this.state.externalActions) {\n this.state.externalActions = [];\n }\n\n // Check if action already exists (by value and related_field)\n const existingIndex = this.state.externalActions.findIndex(\n (a) =>\n a.value === action.value && a.related_field === action.related_field,\n );\n\n if (existingIndex >= 0) {\n // Replace existing action\n this.state.externalActions[existingIndex] = action;\n } else {\n // Add new action\n this.state.externalActions.push(action);\n }\n }\n\n /**\n * Find the DOM element corresponding to a field path (instance-scoped)\n */\n private findFormElementByFieldPath(fieldPath: string): HTMLElement | null {\n if (!this.state.formRoot) return null;\n\n // In edit mode, try to find input elements with name attributes\n if (!this.state.config.readonly) {\n // Try exact match first\n let element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (element) return element;\n\n // Try with array notation variations\n const variations = [\n fieldPath,\n fieldPath.replace(/\\[(\\d+)\\]/g, \"[$1]\"),\n fieldPath.replace(/\\./g, \"[\") +\n \"]\".repeat((fieldPath.match(/\\./g) || []).length),\n ];\n\n for (const variation of variations) {\n element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${variation}\"]`,\n );\n if (element) return element;\n }\n }\n\n // In readonly mode, or if no input found, look for field wrappers\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) return null;\n\n const fieldWrappers =\n this.state.formRoot.querySelectorAll(\".fb-field-wrapper\");\n for (const wrapper of fieldWrappers) {\n const labelText = schemaElement.label || schemaElement.key;\n const labelElement = wrapper.querySelector(\"label\");\n if (\n labelElement &&\n (labelElement.textContent === labelText ||\n labelElement.textContent === `${labelText}*`)\n ) {\n let fieldElement =\n wrapper.querySelector<HTMLElement>(\".field-placeholder\");\n if (!fieldElement) {\n fieldElement = document.createElement(\"div\");\n fieldElement.className = \"field-placeholder\";\n fieldElement.style.display = \"none\";\n wrapper.appendChild(fieldElement);\n }\n return fieldElement;\n }\n }\n\n return null;\n }\n\n /**\n * Find schema element by field path\n */\n private findSchemaElement(fieldPath: string): Element | null {\n if (!this.state.schema || !this.state.schema.elements) return null;\n\n let currentElements = this.state.schema.elements;\n let foundElement: Element | null = null;\n\n const keys = fieldPath\n .replace(/\\[\\d+\\]/g, \"\")\n .split(\".\")\n .filter(Boolean);\n\n for (const key of keys) {\n foundElement = currentElements.find((el) => el.key === key) || null;\n if (!foundElement) {\n return null;\n }\n if (\"elements\" in foundElement && foundElement.elements) {\n currentElements = foundElement.elements;\n }\n }\n\n return foundElement;\n }\n\n /**\n * Resolve action label from schema or external action\n */\n private resolveActionLabel(\n actionKey: string,\n externalLabel: string | undefined,\n schemaElement: Element | null,\n isTrueFormLevelAction = false,\n ): string {\n if (schemaElement && \"actions\" in schemaElement && schemaElement.actions) {\n const predefinedAction = schemaElement.actions.find(\n (a) => a.key === actionKey,\n );\n if (predefinedAction && predefinedAction.label) {\n return predefinedAction.label;\n }\n }\n\n if (\n isTrueFormLevelAction &&\n this.state.schema &&\n \"actions\" in this.state.schema &&\n (this.state.schema as any).actions\n ) {\n const rootAction = (this.state.schema as any).actions.find(\n (a: any) => a.key === actionKey,\n );\n if (rootAction && rootAction.label) {\n return rootAction.label;\n }\n }\n\n if (externalLabel) {\n return externalLabel;\n }\n\n return actionKey;\n }\n\n /**\n * Render form-level action buttons at the bottom of the form\n */\n private renderFormLevelActions(\n actions: ExternalAction[],\n trueFormLevelActions: ExternalAction[] = [],\n ): void {\n if (!this.state.formRoot) return;\n\n const existingContainer = this.state.formRoot.querySelector(\n \".form-level-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"form-level-actions-container mt-6 pt-4 flex flex-wrap gap-3 justify-center\";\n actionsContainer.style.cssText = `\n border-top: var(--fb-border-width) solid var(--fb-border-color);\n `;\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, true);\n\n const isTrueFormLevelAction = trueFormLevelActions.includes(action);\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n null,\n isTrueFormLevelAction,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(action.value, action.key, null);\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n this.state.formRoot.appendChild(actionsContainer);\n }\n\n /**\n * Render external action buttons for fields\n */\n renderExternalActions(): void {\n if (!this.state.externalActions || !Array.isArray(this.state.externalActions))\n return;\n\n const actionsByField = new Map<string, ExternalAction[]>();\n const trueFormLevelActions: ExternalAction[] = [];\n const movedFormLevelActions: ExternalAction[] = [];\n\n this.state.externalActions.forEach((action) => {\n if (!action.key || !action.value) return;\n\n if (!action.related_field) {\n trueFormLevelActions.push(action);\n } else {\n if (!actionsByField.has(action.related_field)) {\n actionsByField.set(action.related_field, []);\n }\n actionsByField.get(action.related_field)!.push(action);\n }\n });\n\n actionsByField.forEach((actions, fieldPath) => {\n const fieldElement = this.findFormElementByFieldPath(fieldPath);\n if (!fieldElement) {\n console.warn(\n `External action: Could not find form element for field \"${fieldPath}\", treating as form-level actions`,\n );\n movedFormLevelActions.push(...actions);\n return;\n }\n\n let wrapper = fieldElement.closest(\".fb-field-wrapper\");\n if (!wrapper) {\n wrapper = fieldElement.parentElement;\n }\n\n if (!wrapper) {\n console.warn(\n `External action: Could not find wrapper for field \"${fieldPath}\"`,\n );\n return;\n }\n\n const existingContainer = wrapper.querySelector(\n \".external-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"external-actions-container mt-3 flex flex-wrap gap-2\";\n\n const schemaElement = this.findSchemaElement(fieldPath);\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, false);\n\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n schemaElement,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(\n action.value,\n action.key,\n action.related_field,\n );\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n wrapper.appendChild(actionsContainer);\n });\n\n const allFormLevelActions = [\n ...trueFormLevelActions,\n ...movedFormLevelActions,\n ];\n if (allFormLevelActions.length > 0) {\n this.renderFormLevelActions(allFormLevelActions, trueFormLevelActions);\n }\n }\n\n /**\n * Render form from schema\n */\n renderForm(\n root: HTMLElement,\n schema: Schema,\n prefill?: Record<string, any>,\n actions?: ExternalAction[],\n ): void {\n const errors = validateSchema(schema);\n if (errors.length > 0) {\n console.error(\"Schema validation errors:\", errors);\n return;\n }\n\n this.state.formRoot = root;\n this.state.schema = schema;\n this.state.externalActions = actions || null;\n\n clear(root);\n\n // Mark root element for theme CSS variables\n root.setAttribute(\"data-fb-root\", \"true\");\n\n // Inject theme CSS variables\n injectThemeVariables(root, this.state.config.theme);\n\n const formEl = document.createElement(\"div\");\n formEl.className = \"space-y-6\";\n\n schema.elements.forEach((element) => {\n if (element.hidden) {\n return;\n }\n const block = renderElement(element, {\n path: \"\",\n prefill: prefill || {},\n state: this.state,\n instance: this,\n });\n formEl.appendChild(block);\n });\n\n root.appendChild(formEl);\n\n if (\n this.state.config.readonly &&\n this.state.externalActions &&\n Array.isArray(this.state.externalActions)\n ) {\n this.renderExternalActions();\n }\n }\n\n /**\n * Validate form and extract data\n * This is a complete copy of the validateForm logic from form-builder.ts\n * but uses instance state instead of global state\n */\n validateForm(skipValidation = false): FormDataResult {\n if (!this.state.schema || !this.state.formRoot)\n return { valid: true, errors: [], data: {} };\n\n const errors: string[] = [];\n const data: Record<string, any> = {};\n\n\n // ============================================================================\n // Component delegation validation (all field types now use component registry)\n // ============================================================================\n\n // NOTE: All validateXxxElement functions have been migrated to their respective\n // component files (text.ts, select.ts, file.ts, container.ts, group.ts).\n // They are now called via the component registry pattern.\n\n // Inject validateElement into container component for nested validation\n const validateElement = (\n element: Element,\n ctx: { path: string },\n customScopeRoot: HTMLElement | null = null,\n ): any => {\n const key = element.key;\n const scopeRoot = customScopeRoot || this.state.formRoot!;\n\n // All components now use delegation pattern via component registry\n const componentContext: ComponentContext = {\n scopeRoot,\n state: this.state,\n instance: this,\n path: ctx.path,\n skipValidation,\n };\n\n const componentResult = validateElementWithComponent(\n element,\n key,\n componentContext,\n );\n\n if (componentResult !== null) {\n // Component validator handled it - merge errors and return value\n errors.push(...componentResult.errors);\n return componentResult.value;\n }\n\n // Unknown field type\n console.warn(`Unknown field type \"${element.type}\" for key \"${key}\"`);\n return null;\n };\n\n // Set up container validation to use this validateElement function\n setContainerValidateElement(validateElement);\n\n this.state.schema.elements.forEach((element) => {\n if (element.hidden) {\n data[element.key] =\n element.default !== undefined ? element.default : null;\n } else {\n data[element.key] = validateElement(element, { path: \"\" });\n }\n });\n\n return {\n valid: errors.length === 0,\n errors,\n data,\n };\n }\n\n /**\n * Get form data\n */\n getFormData(): FormDataResult {\n return this.validateForm(false);\n }\n\n /**\n * Submit form with validation\n */\n submitForm(): FormDataResult {\n const result = this.validateForm(false);\n if (result.valid) {\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formSubmit\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n }\n return result;\n }\n\n /**\n * Save draft without validation\n */\n saveDraft(): FormDataResult {\n const result = this.validateForm(true);\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formDraft\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n return result;\n }\n\n /**\n * Clear the form - reset all field values to empty while preserving form structure\n * This is done by re-rendering the form with empty data\n */\n clearForm(): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"clearForm: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Get current schema and form root\n const schema = this.state.schema;\n const formRoot = this.state.formRoot;\n\n // Build empty prefill data (only for hidden fields)\n const emptyPrefill = this.buildHiddenFieldsData(schema.elements);\n\n // Re-render the form with empty data\n // This will preserve the form structure but reset all visible field values\n this.renderForm(formRoot, schema, emptyPrefill);\n }\n\n /**\n * Build prefill data for hidden fields only\n * Hidden fields should retain their values when clearing\n */\n private buildHiddenFieldsData(\n elements: Element[],\n parentPath: string = \"\",\n ): Record<string, any> {\n const data: Record<string, any> = {};\n\n for (const element of elements) {\n const key = element.key;\n const fieldPath = parentPath ? `${parentPath}.${key}` : key;\n\n // Only include hidden fields\n if (element.hidden && element.default !== undefined) {\n data[fieldPath] = element.default;\n }\n\n // Recursively process container elements\n if (element.type === \"container\" || element.type === \"group\") {\n const containerElement = element as ContainerElement | GroupElement;\n const nestedData = this.buildHiddenFieldsData(\n containerElement.elements,\n fieldPath,\n );\n Object.assign(data, nestedData);\n }\n }\n\n return data;\n }\n\n /**\n * Set form data - update multiple fields without full re-render\n * @param data - Object with field paths and their values\n */\n setFormData(data: Record<string, any>): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"setFormData: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Update each field in the data object\n for (const fieldPath in data) {\n this.updateField(fieldPath, data[fieldPath]);\n }\n }\n\n /**\n * Update a single field by path without full re-render\n * @param fieldPath - Field path (e.g., \"email\", \"address.city\", \"items[0].name\")\n * @param value - New value for the field\n */\n updateField(fieldPath: string, value: any): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"updateField: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Find the schema element for this field\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) {\n console.warn(`updateField: Schema element not found for path \"${fieldPath}\"`);\n return;\n }\n\n // Find the DOM element\n const domElement = this.findFormElementByFieldPath(fieldPath);\n if (!domElement) {\n console.warn(`updateField: DOM element not found for path \"${fieldPath}\"`);\n return;\n }\n\n // Update based on field type\n this.updateFieldValue(domElement, schemaElement, fieldPath, value);\n\n // Optionally trigger onChange callback\n if (this.state.config.onChange || this.state.config.onFieldChange) {\n this.triggerOnChange(fieldPath, value);\n }\n }\n\n /**\n * Update field value in DOM based on field type\n * Delegates to component-specific updaters via registry\n */\n private updateFieldValue(\n domElement: HTMLElement,\n schemaElement: Element,\n fieldPath: string,\n value: any,\n ): void {\n const componentContext: ComponentContext = {\n scopeRoot: this.state.formRoot!,\n state: this.state,\n instance: this,\n path: \"\",\n };\n\n const handled = updateElementWithComponent(\n schemaElement,\n fieldPath,\n value,\n componentContext,\n );\n\n if (!handled) {\n console.warn(\n `updateField: No updater found for field type \"${schemaElement.type}\" at path \"${fieldPath}\"`,\n );\n }\n }\n\n /**\n * Destroy instance and clean up resources\n */\n destroy(): void {\n // Clear debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n this.state.debounceTimer = null;\n }\n\n // Clear resource index\n this.state.resourceIndex.clear();\n\n // Clear DOM\n if (this.state.formRoot) {\n clear(this.state.formRoot);\n }\n\n // Nullify references for garbage collection\n this.state.formRoot = null;\n this.state.schema = null;\n this.state.externalActions = null;\n\n // Remove from instance tracking in dev mode\n if (typeof process !== \"undefined\" && process.env.NODE_ENV === \"development\") {\n globalThis.__formBuilderInstances?.delete(this.instanceId);\n }\n }\n}\n","/**\n * Form Builder - Instance-Based API\n *\n * Zero-dependency JSON Schema form builder library with multi-instance support\n */\n\n// Import the FormBuilderInstance class\nimport { FormBuilderInstance } from \"./instance/FormBuilderInstance.js\";\n\n// Import validation utilities\nimport { validateSchema } from \"./utils/validation.js\";\n\n// Re-export all types for TypeScript consumers\nexport type {\n SelectOption,\n ElementAction,\n BaseElement,\n TextElement,\n TextareaElement,\n NumberElement,\n SelectElement,\n FileElement,\n FilesElement,\n ContainerElement,\n GroupElement,\n Element,\n Schema,\n ExternalAction,\n FormData,\n RenderContext,\n Translations,\n Locale,\n Config,\n ResourceMetadata,\n State,\n} from \"./types/index.js\";\n\n// Re-export theming types and utilities\nexport type { Theme } from \"./styles/theme.js\";\nexport { defaultTheme, exampleThemes } from \"./styles/theme.js\";\n\n/**\n * Factory function for creating new form instances\n *\n * @param config Optional configuration for the instance\n * @returns FormBuilderInstance\n *\n * @example\n * const form = createFormBuilder({\n * uploadFile: async (file) => {\n * // Upload logic\n * return \"resource-id-123\";\n * },\n * downloadFile: (resourceId, fileName) => {\n * // Download logic\n * }\n * });\n *\n * form.renderForm(containerElement, schema, prefillData);\n */\nexport function createFormBuilder(config?: Partial<import(\"./types/index.js\").Config>): FormBuilderInstance {\n return new FormBuilderInstance(config);\n}\n\n// Export FormBuilderInstance class for direct instantiation\nexport { FormBuilderInstance };\n\n// Export validation utilities\nexport { validateSchema };\n\n// Default export\nexport default FormBuilderInstance;\n\n// Browser global compatibility\n// Set window.FormBuilder to FormBuilderInstance class for browser usage\nif (typeof window !== \"undefined\") {\n (window as any).FormBuilder = FormBuilderInstance;\n (window as any).createFormBuilder = createFormBuilder;\n (window as any).validateSchema = validateSchema;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/validation.ts","../../src/utils/helpers.ts","../../src/components/text.ts","../../src/components/textarea.ts","../../src/components/number.ts","../../src/components/select.ts","../../src/utils/translation.ts","../../src/components/file.ts","../../src/components/container.ts","../../src/components/group.ts","../../src/components/index.ts","../../src/instance/state.ts","../../src/styles/theme.ts","../../src/utils/styles.ts","../../src/components/registry.ts","../../src/instance/FormBuilderInstance.ts","../../src/index.ts"],"names":["key","element","updateFilesList","t","renderElement","validateElement"],"mappings":"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","file":"index.js","sourcesContent":["// Schema validation utilities\n\nimport type { Element } from \"../types/index.js\";\n\n// Helper functions for field hints\nfunction addLengthHint(element: any, parts: string[]): void {\n if (element.minLength !== null || element.maxLength !== null) {\n if (element.minLength !== null && element.maxLength !== null) {\n parts.push(`length=${element.minLength}-${element.maxLength} characters`);\n } else if (element.maxLength !== null) {\n parts.push(`max=${element.maxLength} characters`);\n } else if (element.minLength !== null) {\n parts.push(`min=${element.minLength} characters`);\n }\n }\n}\n\nfunction addRangeHint(element: any, parts: string[]): void {\n if (element.min !== null || element.max !== null) {\n if (element.min !== null && element.max !== null) {\n parts.push(`range=${element.min}-${element.max}`);\n } else if (element.max !== null) {\n parts.push(`max=${element.max}`);\n } else if (element.min !== null) {\n parts.push(`min=${element.min}`);\n }\n }\n}\n\nfunction addFileSizeHint(element: any, parts: string[]): void {\n if (element.maxSizeMB) {\n parts.push(`max_size=${element.maxSizeMB}MB`);\n }\n}\n\nfunction addFormatHint(element: any, parts: string[]): void {\n if (element.accept?.extensions) {\n parts.push(\n `formats=${element.accept.extensions.map((ext: string) => ext.toUpperCase()).join(\",\")}`,\n );\n }\n}\n\nfunction addPatternHint(element: any, parts: string[]): void {\n if (element.pattern && !element.pattern.includes(\"А-Я\")) {\n parts.push(\"plain text only\");\n } else if (element.pattern?.includes(\"А-Я\")) {\n parts.push(\"text with punctuation\");\n }\n}\n\nexport function makeFieldHint(element: any): string {\n const parts: string[] = [];\n\n parts.push(element.required ? \"required\" : \"optional\");\n\n addLengthHint(element, parts);\n addRangeHint(element, parts);\n addFileSizeHint(element, parts);\n addFormatHint(element, parts);\n addPatternHint(element, parts);\n\n return parts.join(\" • \");\n}\n\nexport function validateSchema(schema: any): string[] {\n const errors: string[] = [];\n\n if (!schema || typeof schema !== \"object\") {\n errors.push(\"Schema must be an object\");\n return errors;\n }\n\n if (!schema.version) {\n errors.push(\"Schema missing version\");\n }\n\n if (!Array.isArray(schema.elements)) {\n errors.push(\"Schema missing elements array\");\n return errors;\n }\n\n function validateElements(elements: Element[], path: string): void {\n elements.forEach((element, index) => {\n const elementPath = `${path}[${index}]`;\n\n if (!element.type) {\n errors.push(`${elementPath}: missing type`);\n }\n\n if (!element.key) {\n errors.push(`${elementPath}: missing key`);\n }\n\n if (\n element.type === \"group\" &&\n \"elements\" in element &&\n element.elements\n ) {\n validateElements(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"container\" && element.elements) {\n validateElements(element.elements, `${elementPath}.elements`);\n }\n\n if (element.type === \"select\" && element.options) {\n const defaultValue = element.default;\n if (\n defaultValue !== undefined &&\n defaultValue !== null &&\n defaultValue !== \"\"\n ) {\n const hasMatchingOption = element.options.some(\n (opt) => opt.value === defaultValue,\n );\n if (!hasMatchingOption) {\n errors.push(\n `${elementPath}: default \"${defaultValue}\" not in options`,\n );\n }\n }\n }\n });\n }\n\n if (Array.isArray(schema.elements))\n validateElements(schema.elements, \"elements\");\n return errors;\n}\n","// Utility helper functions\n\nexport function isPlainObject(obj: any): obj is Record<string, any> {\n return obj && typeof obj === \"object\" && obj.constructor === Object;\n}\n\nexport function pathJoin(base: string, key: string): string {\n return base ? `${base}.${key}` : key;\n}\n\nexport function pretty(obj: any): string {\n return JSON.stringify(obj, null, 2);\n}\n\nexport function clear(node: HTMLElement): void {\n while (node.firstChild) node.removeChild(node.firstChild);\n}\n","// Text component rendering, validation, and update functions\n\nimport type {\n TextElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\nexport function renderTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.className = \"w-full rounded-lg\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n textInput.name = pathKey;\n textInput.placeholder = element.placeholder || \"Введите текст\";\n textInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners (CSS variables)\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, textInput.value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n wrapper.appendChild(textInput);\n\n // Add hint\n const textHint = document.createElement(\"p\");\n textHint.className = \"mt-1\";\n textHint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n textHint.textContent = makeFieldHint(element);\n wrapper.appendChild(textHint);\n}\n\nexport function renderMultipleTextElement(\n element: TextElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-text-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-text-item flex items-center gap-2\";\n\n const textInput = document.createElement(\"input\");\n textInput.type = \"text\";\n textInput.className = \"flex-1\";\n textInput.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n textInput.placeholder = element.placeholder || \"Enter text\";\n textInput.value = value;\n textInput.readOnly = state.config.readonly;\n\n // Add focus styles via event listeners\n if (!state.config.readonly) {\n textInput.addEventListener(\"focus\", () => {\n textInput.style.borderColor = \"var(--fb-border-focus-color)\";\n textInput.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n textInput.style.outlineOffset = \"0\";\n });\n textInput.addEventListener(\"blur\", () => {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n textInput.style.outline = \"none\";\n });\n textInput.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n textInput.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== textInput) {\n textInput.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(textInput.name, textInput.value);\n };\n textInput.addEventListener(\"blur\", handleChange);\n textInput.addEventListener(\"input\", handleChange);\n }\n\n itemWrapper.appendChild(textInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-text-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"remove-item-btn px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = \"✕\";\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-text-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"add-text-btn mt-2 px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = `+ Add ${element.label || \"Text\"}`;\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addTextItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"mt-1\";\n hint.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate text input field and return extracted value with errors\n */\nexport function validateTextElement(\n element: TextElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate text input value\n const validateTextInput = (\n input: HTMLInputElement | HTMLTextAreaElement,\n val: string,\n fieldKey: string,\n ): void => {\n let hasError = false;\n\n if (!skipValidation && val) {\n if (\n element.minLength !== undefined &&\n element.minLength !== null &&\n val.length < element.minLength\n ) {\n errors.push(`${fieldKey}: minLength=${element.minLength}`);\n markValidity(input, `minLength=${element.minLength}`);\n hasError = true;\n } else if (\n element.maxLength !== undefined &&\n element.maxLength !== null &&\n val.length > element.maxLength\n ) {\n errors.push(`${fieldKey}: maxLength=${element.maxLength}`);\n markValidity(input, `maxLength=${element.maxLength}`);\n hasError = true;\n } else if (element.pattern) {\n try {\n const re = new RegExp(element.pattern);\n if (!re.test(val)) {\n errors.push(`${fieldKey}: pattern mismatch`);\n markValidity(input, \"pattern mismatch\");\n hasError = true;\n }\n } catch {\n errors.push(`${fieldKey}: invalid pattern`);\n markValidity(input, \"invalid pattern\");\n hasError = true;\n }\n }\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple text fields (array)\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement | HTMLTextAreaElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input, index) => {\n const val = input?.value ?? \"\";\n values.push(val);\n validateTextInput(input, val, `${key}[${index}]`);\n });\n\n // Validate count\n if (!skipValidation) {\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v.trim() !== \"\");\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: required`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: minimum ${minCount} items required`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: maximum ${maxCount} items allowed`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single text field\n const input = scopeRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n errors.push(`${key}: required`);\n markValidity(input, \"required\");\n return { value: \"\", errors };\n }\n\n validateTextInput(input!, val, key);\n return { value: val, errors };\n }\n}\n\n/**\n * Update text field value in DOM without re-render\n */\nexport function updateTextField(\n element: TextElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple text fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateTextField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement | HTMLTextAreaElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateTextField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single text field\n const input = scopeRoot.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Textarea component rendering, validation, and update functions\n\nimport type {\n TextareaElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { validateTextElement, updateTextField } from \"./text.js\";\n\nexport function renderTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.name = pathKey;\n textareaInput.placeholder = element.placeholder || \"Введите текст\";\n textareaInput.rows = element.rows || 4;\n textareaInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, textareaInput.value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n wrapper.appendChild(textareaInput);\n\n // Add hint\n const textareaHint = document.createElement(\"p\");\n textareaHint.className = \"text-xs text-gray-500 mt-1\";\n textareaHint.textContent = makeFieldHint(element);\n wrapper.appendChild(textareaHint);\n}\n\nexport function renderMultipleTextareaElement(\n element: TextareaElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n items.forEach((item, index) => {\n const textarea = item.querySelector(\"textarea\");\n if (textarea) {\n textarea.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addTextareaItem(\n value: string = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-textarea-item\";\n\n const textareaInput = document.createElement(\"textarea\");\n textareaInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 resize-none\";\n textareaInput.placeholder = element.placeholder || \"Enter text\";\n textareaInput.rows = element.rows || 4;\n textareaInput.value = value;\n textareaInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(textareaInput.name, textareaInput.value);\n };\n textareaInput.addEventListener(\"blur\", handleChange);\n textareaInput.addEventListener(\"input\", handleChange);\n }\n\n itemWrapper.appendChild(textareaInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-textarea-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn mt-1 px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm\";\n removeBtn.innerHTML = \"✕ Remove\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-textarea-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className =\n \"add-textarea-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm\";\n addBtn.textContent = `+ Add ${element.label || \"Textarea\"}`;\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addTextareaItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addTextareaItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate textarea element - delegates to text validator since they share validation logic\n */\nexport function validateTextareaElement(\n element: TextareaElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Textarea shares validation logic with text (minLength, maxLength, pattern)\n return validateTextElement(element as any, key, context);\n}\n\n/**\n * Update textarea field - delegates to text updater since they share update logic\n */\nexport function updateTextareaField(\n element: TextareaElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Textarea shares update logic with text\n updateTextField(element as any, fieldPath, value, context);\n}\n","// Number component rendering, validation, and update functions\n\nimport type {\n NumberElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\nexport function renderNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.name = pathKey;\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value =\n (ctx.prefill[element.key] as string) || element.default || \"\";\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const value = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(pathKey, value);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n wrapper.appendChild(numberInput);\n\n // Add hint\n const numberHint = document.createElement(\"p\");\n numberHint.className = \"text-xs text-gray-500 mt-1\";\n numberHint.textContent = makeFieldHint(element);\n wrapper.appendChild(numberHint);\n}\n\nexport function renderMultipleNumberElement(\n element: NumberElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-number-item\");\n items.forEach((item, index) => {\n const input = item.querySelector(\"input\");\n if (input) {\n input.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addNumberItem(\n value: string | number = \"\",\n index: number = -1,\n ): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-number-item flex items-center gap-2\";\n\n const numberInput = document.createElement(\"input\");\n numberInput.type = \"number\";\n numberInput.className =\n \"flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n numberInput.placeholder = element.placeholder || \"0\";\n if (element.min !== undefined) numberInput.min = element.min.toString();\n if (element.max !== undefined) numberInput.max = element.max.toString();\n if (element.step !== undefined) numberInput.step = element.step.toString();\n numberInput.value = value.toString();\n numberInput.readOnly = state.config.readonly;\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n const val = numberInput.value ? parseFloat(numberInput.value) : null;\n ctx.instance.triggerOnChange(numberInput.name, val);\n };\n numberInput.addEventListener(\"blur\", handleChange);\n numberInput.addEventListener(\"input\", handleChange);\n }\n\n itemWrapper.appendChild(numberInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-number-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(\n item as Element,\n );\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-number-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className =\n \"add-number-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm\";\n addBtn.textContent = `+ Add ${element.label || \"Number\"}`;\n addBtn.onclick = () => {\n values.push(element.default || \"\");\n addNumberItem(element.default || \"\");\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addNumberItem(value as string | number));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate number input field and return extracted value with errors\n */\nexport function validateNumberElement(\n element: NumberElement,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate number value\n const validateNumberInput = (\n input: HTMLInputElement,\n v: number,\n fieldKey: string,\n ): void => {\n let hasError = false;\n\n if (\n !skipValidation &&\n element.min !== undefined &&\n element.min !== null &&\n v < element.min\n ) {\n errors.push(`${fieldKey}: < min=${element.min}`);\n markValidity(input, `< min=${element.min}`);\n hasError = true;\n } else if (\n !skipValidation &&\n element.max !== undefined &&\n element.max !== null &&\n v > element.max\n ) {\n errors.push(`${fieldKey}: > max=${element.max}`);\n markValidity(input, `> max=${element.max}`);\n hasError = true;\n }\n\n if (!hasError) {\n markValidity(input, null);\n }\n };\n\n if (element.multiple) {\n // Multiple number fields (array)\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: (number | null)[] = [];\n\n inputs.forEach((input, index) => {\n const raw = input?.value ?? \"\";\n if (raw === \"\") {\n values.push(null);\n markValidity(input, null);\n return;\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n errors.push(`${key}[${index}]: not a number`);\n markValidity(input, \"not a number\");\n values.push(null);\n return;\n }\n\n validateNumberInput(input, v, `${key}[${index}]`);\n const d = Number.isInteger(element.decimals ?? 0) ? (element.decimals ?? 0) : 0;\n values.push(Number(v.toFixed(d)));\n });\n\n // Validate count\n if (!skipValidation) {\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n const filteredValues = values.filter((v) => v !== null);\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: required`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: minimum ${minCount} items required`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: maximum ${maxCount} items allowed`);\n }\n }\n\n return { value: values, errors };\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(`[name$=\"${key}\"]`);\n const raw = input?.value ?? \"\";\n\n if (!skipValidation && element.required && raw === \"\") {\n errors.push(`${key}: required`);\n markValidity(input, \"required\");\n return { value: null, errors };\n }\n\n if (raw === \"\") {\n markValidity(input, null);\n return { value: null, errors };\n }\n\n const v = parseFloat(raw);\n if (!skipValidation && !Number.isFinite(v)) {\n errors.push(`${key}: not a number`);\n markValidity(input, \"not a number\");\n return { value: null, errors };\n }\n\n validateNumberInput(input!, v, key);\n const d = Number.isInteger(element.decimals ?? 0) ? (element.decimals ?? 0) : 0;\n return { value: Number(v.toFixed(d)), errors };\n }\n}\n\n/**\n * Update number field value in DOM without re-render\n */\nexport function updateNumberField(\n element: NumberElement,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (element.multiple) {\n // Multiple number fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateNumberField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const inputs = scopeRoot.querySelectorAll<HTMLInputElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n inputs.forEach((input, index) => {\n if (index < value.length) {\n input.value = value[index] != null ? String(value[index]) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n });\n\n if (value.length !== inputs.length) {\n console.warn(\n `updateNumberField: Multiple field \"${fieldPath}\" has ${inputs.length} inputs but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single number field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (input) {\n input.value = value != null ? String(value) : \"\";\n input.classList.remove(\"invalid\");\n input.title = \"\";\n }\n }\n}\n","// Select component rendering functions\n\nimport type {\n SelectElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\n\nexport function renderSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.name = pathKey;\n selectInput.disabled = state.config.readonly;\n\n (element.options || []).forEach((option) => {\n const optionEl = document.createElement(\"option\");\n optionEl.value = option.value;\n optionEl.textContent = option.label;\n if ((ctx.prefill[element.key] || element.default) === option.value) {\n optionEl.selected = true;\n }\n selectInput.appendChild(optionEl);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(pathKey, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n wrapper.appendChild(selectInput);\n\n // Add hint\n const selectHint = document.createElement(\"p\");\n selectHint.className = \"text-xs text-gray-500 mt-1\";\n selectHint.textContent = makeFieldHint(element);\n wrapper.appendChild(selectHint);\n}\n\nexport function renderMultipleSelectElement(\n element: SelectElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const prefillValues = ctx.prefill[element.key] || [];\n const values = Array.isArray(prefillValues) ? [...prefillValues] : [];\n\n // Ensure minimum count\n const minCount = element.minCount ?? 1;\n const maxCount = element.maxCount ?? Infinity;\n\n while (values.length < minCount) {\n values.push(element.default || element.options?.[0]?.value || \"\");\n }\n\n const container = document.createElement(\"div\");\n container.className = \"space-y-2\";\n wrapper.appendChild(container);\n\n function updateIndices(): void {\n const items = container.querySelectorAll(\".multiple-select-item\");\n items.forEach((item, index) => {\n const select = item.querySelector(\"select\");\n if (select) {\n select.name = `${pathKey}[${index}]`;\n }\n });\n }\n\n function addSelectItem(value: string = \"\", index: number = -1): HTMLElement {\n const itemWrapper = document.createElement(\"div\");\n itemWrapper.className = \"multiple-select-item flex items-center gap-2\";\n\n const selectInput = document.createElement(\"select\");\n selectInput.className =\n \"flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500\";\n selectInput.disabled = state.config.readonly;\n\n // Add options\n (element.options || []).forEach((option) => {\n const optionElement = document.createElement(\"option\");\n optionElement.value = option.value;\n optionElement.textContent = option.label;\n if (value === option.value) {\n optionElement.selected = true;\n }\n selectInput.appendChild(optionElement);\n });\n\n // Add onChange event listener (only in edit mode)\n if (!state.config.readonly && ctx.instance) {\n const handleChange = () => {\n ctx.instance.triggerOnChange(selectInput.name, selectInput.value);\n };\n selectInput.addEventListener(\"change\", handleChange);\n }\n\n itemWrapper.appendChild(selectInput);\n\n // Remove buttons are managed centrally via updateRemoveButtons()\n\n if (index === -1) {\n container.appendChild(itemWrapper);\n } else {\n container.insertBefore(itemWrapper, container.children[index]);\n }\n\n updateIndices();\n return itemWrapper;\n }\n\n function updateRemoveButtons(): void {\n if (state.config.readonly) return;\n const items = container.querySelectorAll(\".multiple-select-item\");\n const currentCount = items.length;\n items.forEach((item) => {\n let removeBtn = item.querySelector(\n \".remove-item-btn\",\n ) as HTMLButtonElement;\n if (!removeBtn) {\n removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className =\n \"remove-item-btn px-2 py-1 text-red-600 hover:bg-red-50 rounded\";\n removeBtn.innerHTML = \"✕\";\n removeBtn.onclick = () => {\n const currentIndex = Array.from(container.children).indexOf(item);\n if (container.children.length > minCount) {\n values.splice(currentIndex, 1);\n item.remove();\n updateIndices();\n updateAddButton();\n updateRemoveButtons();\n }\n };\n item.appendChild(removeBtn);\n }\n const disabled = currentCount <= minCount;\n removeBtn.disabled = disabled;\n removeBtn.style.opacity = disabled ? \"0.5\" : \"1\";\n removeBtn.style.pointerEvents = disabled ? \"none\" : \"auto\";\n });\n }\n\n function updateAddButton(): void {\n const existingAddBtn = wrapper.querySelector(\".add-select-btn\");\n if (existingAddBtn) existingAddBtn.remove();\n\n if (!state.config.readonly && values.length < maxCount) {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className =\n \"add-select-btn mt-2 px-3 py-1 text-blue-600 border border-blue-300 rounded hover:bg-blue-50 text-sm\";\n addBtn.textContent = `+ Add ${element.label || \"Selection\"}`;\n addBtn.onclick = () => {\n const defaultValue =\n element.default || element.options?.[0]?.value || \"\";\n values.push(defaultValue);\n addSelectItem(defaultValue);\n updateAddButton();\n updateRemoveButtons();\n };\n wrapper.appendChild(addBtn);\n }\n }\n\n // Render initial items\n values.forEach((value) => addSelectItem(value as string));\n updateAddButton();\n updateRemoveButtons();\n\n // Add hint\n const hint = document.createElement(\"p\");\n hint.className = \"text-xs text-gray-500 mt-1\";\n hint.textContent = makeFieldHint(element);\n wrapper.appendChild(hint);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate select field and return extracted value with errors\n */\nexport function validateSelectElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation } = context;\n\n // Helper to mark field validity\n const markValidity = (\n input: HTMLElement | null,\n errorMessage: string | null,\n ): void => {\n if (!input) return;\n\n const errorId = `error-${input.getAttribute(\"name\") || Math.random().toString(36).substring(7)}`;\n let errorElement = document.getElementById(errorId);\n\n if (errorMessage) {\n input.classList.add(\"invalid\");\n input.title = errorMessage;\n\n if (!errorElement) {\n errorElement = document.createElement(\"div\");\n errorElement.id = errorId;\n errorElement.className = \"error-message\";\n errorElement.style.cssText = `\n color: var(--fb-error-color);\n font-size: var(--fb-font-size-small);\n margin-top: 0.25rem;\n `;\n\n if (input.nextSibling) {\n input.parentNode?.insertBefore(errorElement, input.nextSibling);\n } else {\n input.parentNode?.appendChild(errorElement);\n }\n }\n\n errorElement.textContent = errorMessage;\n errorElement.style.display = \"block\";\n } else {\n input.classList.remove(\"invalid\");\n input.title = \"\";\n\n if (errorElement) {\n errorElement.remove();\n }\n }\n };\n\n // Helper to validate multiple count\n const validateMultipleCount = (\n key: string,\n values: string[],\n element: Element,\n filterFn: (v: string) => boolean,\n ): void => {\n if (skipValidation) return;\n\n const filteredValues = values.filter(filterFn);\n const minCount = \"minCount\" in element ? element.minCount ?? 1 : 1;\n const maxCount =\n \"maxCount\" in element ? element.maxCount ?? Infinity : Infinity;\n\n if (element.required && filteredValues.length === 0) {\n errors.push(`${key}: required`);\n }\n if (filteredValues.length < minCount) {\n errors.push(`${key}: minimum ${minCount} items required`);\n }\n if (filteredValues.length > maxCount) {\n errors.push(`${key}: maximum ${maxCount} items allowed`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n const inputs = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${key}[\"]`,\n );\n const values: string[] = [];\n\n inputs.forEach((input) => {\n const val = input?.value ?? \"\";\n values.push(val);\n markValidity(input, null);\n });\n\n validateMultipleCount(key, values, element, (v) => v !== \"\");\n return { value: values, errors };\n } else {\n // Single select field\n const input = scopeRoot.querySelector<HTMLSelectElement>(\n `[name$=\"${key}\"]`,\n );\n const val = input?.value ?? \"\";\n\n if (!skipValidation && element.required && val === \"\") {\n errors.push(`${key}: required`);\n markValidity(input, \"required\");\n return { value: null, errors };\n } else {\n markValidity(input, null);\n }\n\n return { value: val === \"\" ? null : val, errors };\n }\n}\n\n/**\n * Update select field value in DOM without re-render\n */\nexport function updateSelectField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple select fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateSelectField: Expected array for multiple field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n const selects = scopeRoot.querySelectorAll<HTMLSelectElement>(\n `[name^=\"${fieldPath}[\"]`,\n );\n\n selects.forEach((select, index) => {\n if (index < value.length) {\n select.value = value[index] != null ? String(value[index]) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value[index]);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n });\n\n if (value.length !== selects.length) {\n console.warn(\n `updateSelectField: Multiple field \"${fieldPath}\" has ${selects.length} selects but received ${value.length} values. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single select field\n const select = scopeRoot.querySelector<HTMLSelectElement>(\n `[name=\"${fieldPath}\"]`,\n );\n\n if (select) {\n select.value = value != null ? String(value) : \"\";\n\n // Update selected option\n const options = select.querySelectorAll(\"option\");\n options.forEach((option) => {\n option.selected = option.value === String(value);\n });\n\n select.classList.remove(\"invalid\");\n select.title = \"\";\n }\n }\n}\n","// Translation utilities\n\nimport type { State } from \"../types/state.js\";\n\n/**\n * Get translated string for a key\n * @param key Translation key\n * @param state Form state containing locale and translations\n * @returns Translated string or key if not found\n */\nexport function t(key: string, state: State): string {\n const locale = state.config.locale || \"en\";\n const translations =\n state.config.translations[locale] || state.config.translations.en;\n return (translations as any)[key] || key;\n}\n","// File component rendering functions and helpers\n\nimport type {\n FileElement,\n FilesElement,\n RenderContext,\n ResourceMetadata,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport type { State } from \"../types/state.js\";\nimport { t } from \"../utils/translation.js\";\nimport { clear } from \"../utils/helpers.js\";\nimport { makeFieldHint } from \"../utils/validation.js\";\nimport { pathJoin } from \"../utils/helpers.js\";\n\n// File upload dependencies\ninterface FileDeps {\n picker: HTMLInputElement;\n fileUploadHandler: () => void;\n dragHandler: (files: FileList) => void;\n}\n\n// Render single file preview container\nexport async function renderFilePreview(\n container: HTMLElement,\n resourceId: string,\n state: State,\n options: {\n fileName?: string;\n isReadonly?: boolean;\n deps?: FileDeps | null;\n } = {},\n): Promise<void> {\n const { fileName = \"\", isReadonly = false, deps = null } = options;\n\n // Runtime validation for dependencies when not in readonly mode\n if (\n !isReadonly &&\n deps &&\n (!deps.picker || !deps.fileUploadHandler || !deps.dragHandler)\n ) {\n throw new Error(\n \"renderFilePreview: missing deps {picker, fileUploadHandler, dragHandler}\",\n );\n }\n\n // Clear container content first\n clear(container);\n\n if (isReadonly) {\n container.classList.add(\"cursor-pointer\");\n }\n\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = fileName || \"Preview\";\n\n // Use stored file from resourceIndex if available, or try getThumbnail\n const meta = state.resourceIndex.get(resourceId);\n\n if (meta && meta.file && meta.file instanceof File) {\n // For local files, use FileReader to display preview\n if (meta.type && meta.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n container.appendChild(img);\n } else if (meta.type && meta.type.startsWith(\"video/\")) {\n // Video file - use object URL for preview\n const videoUrl = URL.createObjectURL(meta.file);\n\n // Remove all conflicting handlers to prevent interference with video controls\n container.onclick = null;\n\n // Remove drag and drop event listeners by cloning the element\n const newContainer = container.cloneNode(false) as HTMLElement;\n if (container.parentNode) {\n container.parentNode.replaceChild(newContainer, container);\n }\n container = newContainer;\n\n container.innerHTML = `\n <div class=\"relative group h-full\">\n <video class=\"w-full h-full object-contain\" controls preload=\"auto\" muted>\n <source src=\"${videoUrl}\" type=\"${meta.type}\">\n Your browser does not support the video tag.\n </video>\n <div class=\"absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity z-10 flex gap-1\">\n <button class=\"bg-red-600 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs delete-file-btn\">\n ${t(\"removeElement\", state)}\n </button>\n <button class=\"bg-gray-800 bg-opacity-75 hover:bg-opacity-90 text-white p-1 rounded text-xs change-file-btn\">\n Change\n </button>\n </div>\n </div>\n `;\n\n // Add click handlers to the custom buttons\n const changeBtn = container.querySelector(\n \".change-file-btn\",\n ) as HTMLButtonElement;\n if (changeBtn) {\n changeBtn.onclick = (e) => {\n e.stopPropagation();\n if (deps?.picker) {\n deps.picker.click();\n }\n };\n }\n\n const deleteBtn = container.querySelector(\n \".delete-file-btn\",\n ) as HTMLButtonElement;\n if (deleteBtn) {\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n // Clear the file\n state.resourceIndex.delete(resourceId);\n // Update hidden input\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n // Clear preview and show placeholder\n if (deps?.fileUploadHandler) {\n container.onclick = deps.fileUploadHandler;\n }\n if (deps?.dragHandler) {\n setupDragAndDrop(container, deps.dragHandler);\n }\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${t(\"clickDragText\", state)}</div>\n </div>\n `;\n };\n }\n } else {\n // Non-image, non-video file\n container.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\"><div class=\"text-2xl mb-2\">📁</div><div class=\"text-sm\">${fileName}</div></div>`;\n }\n\n // Add delete button for edit mode (except for videos which have custom buttons)\n if (!isReadonly && !(meta && meta.type && meta.type.startsWith(\"video/\"))) {\n addDeleteButton(container, state, () => {\n // Clear the file\n state.resourceIndex.delete(resourceId);\n // Update hidden input\n const hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (hiddenInput) {\n hiddenInput.value = \"\";\n }\n // Clear preview and show placeholder\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${t(\"clickDragText\", state)}</div>\n </div>\n `;\n });\n }\n } else if (state.config.getThumbnail) {\n // Try to get thumbnail from config for uploaded files\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n\n if (thumbnailUrl) {\n clear(container);\n\n // Check if this is a video file - if so, use <video> tag instead of <img>\n if (meta && meta.type && meta.type.startsWith(\"video/\")) {\n // Video file - create video element\n const video = document.createElement(\"video\");\n video.className = \"w-full h-full object-contain\";\n video.controls = true;\n video.preload = \"metadata\";\n video.muted = true;\n\n const source = document.createElement(\"source\");\n source.src = thumbnailUrl;\n source.type = meta.type;\n\n video.appendChild(source);\n video.appendChild(document.createTextNode(\"Your browser does not support the video tag.\"));\n container.appendChild(video);\n } else {\n // Image or unknown file - use img tag as before\n img.src = thumbnailUrl;\n container.appendChild(img);\n }\n } else {\n setEmptyFileContainer(container, state);\n }\n } catch (error) {\n console.error(\"Failed to get thumbnail:\", error);\n container.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${fileName || \"Preview unavailable\"}</div>\n </div>\n `;\n }\n } else {\n setEmptyFileContainer(container, state);\n }\n}\n\n// Render file preview for readonly mode\nexport async function renderFilePreviewReadonly(\n resourceId: string,\n state: State,\n fileName?: string,\n): Promise<HTMLElement> {\n const meta = state.resourceIndex.get(resourceId);\n const actualFileName =\n fileName || meta?.name || resourceId.split(\"/\").pop() || \"file\";\n\n // Determine if this looks like a PSD file (should be treated as download, not preview)\n const isPSD = actualFileName.toLowerCase().match(/\\.psd$/);\n\n // Individual file result container\n const fileResult = document.createElement(\"div\");\n fileResult.className = isPSD ? \"space-y-2\" : \"space-y-3\";\n\n // Preview container - compact for PSD files, large for others\n const previewContainer = document.createElement(\"div\");\n if (isPSD) {\n // Compact container for PSD files\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity flex items-center p-3 max-w-sm\";\n } else {\n // Large container for images/videos\n previewContainer.className =\n \"bg-gray-100 rounded-lg overflow-hidden cursor-pointer hover:opacity-90 transition-opacity\";\n }\n\n // Determine if this looks like an image file (excluding PSD files)\n const isImage =\n !isPSD &&\n (meta?.type?.startsWith(\"image/\") ||\n actualFileName.toLowerCase().match(/\\.(jpg|jpeg|png|gif|webp)$/));\n\n // Determine if this looks like a video file\n const isVideo =\n meta?.type?.startsWith(\"video/\") ||\n actualFileName.toLowerCase().match(/\\.(mp4|webm|avi|mov)$/);\n\n if (isImage) {\n // Image preview - try getThumbnail first\n if (state.config.getThumbnail) {\n try {\n const thumbnailUrl = await state.config.getThumbnail(resourceId);\n if (thumbnailUrl) {\n previewContainer.innerHTML = `<img src=\"${thumbnailUrl}\" alt=\"${actualFileName}\" class=\"w-full h-auto\">`;\n } else {\n // Fallback to icon if getThumbnail returns null/undefined\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🖼️</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else if (isVideo) {\n // Video preview - try getThumbnail for video URL\n if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(resourceId);\n if (videoUrl) {\n previewContainer.innerHTML = `\n <div class=\"relative group\">\n <video class=\"w-full h-auto\" controls preload=\"auto\" muted>\n <source src=\"${videoUrl}\" type=\"${meta?.type || \"video/mp4\"}\">\n Ваш браузер не поддерживает видео.\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-20 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center pointer-events-none\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-3\">\n <svg class=\"w-8 h-8 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } catch (error) {\n console.warn(\"getThumbnail failed for video\", resourceId, error);\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else {\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">🎥</div><div class=\"text-sm\">${actualFileName}</div></div></div>`;\n }\n } else {\n // Other file types - special handling for PSD files\n const fileIcon = isPSD ? \"🎨\" : \"📁\";\n const fileDescription = isPSD ? \"PSD File\" : \"Document\";\n\n if (isPSD) {\n // Compact horizontal layout for PSD files\n previewContainer.innerHTML = `\n <div class=\"flex items-center space-x-3\">\n <div class=\"text-3xl text-gray-400\">${fileIcon}</div>\n <div class=\"flex-1 min-w-0\">\n <div class=\"text-sm font-medium text-gray-900 truncate\">${actualFileName}</div>\n <div class=\"text-xs text-gray-500\">${fileDescription}</div>\n </div>\n </div>\n `;\n } else {\n // Large centered layout for other documents\n previewContainer.innerHTML = `<div class=\"aspect-video flex items-center justify-center text-gray-400\"><div class=\"text-center\"><div class=\"text-4xl mb-2\">${fileIcon}</div><div class=\"text-sm\">${actualFileName}</div><div class=\"text-xs text-gray-500 mt-1\">${fileDescription}</div></div></div>`;\n }\n }\n\n // File name (only show for non-PSD files since PSD files show name inline)\n const fileNameElement = document.createElement(\"p\");\n fileNameElement.className = isPSD\n ? \"hidden\"\n : \"text-sm font-medium text-gray-900 text-center\";\n fileNameElement.textContent = actualFileName;\n\n // Download button\n const downloadButton = document.createElement(\"button\");\n downloadButton.className =\n \"w-full px-3 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\";\n downloadButton.textContent = t(\"downloadButton\", state);\n downloadButton.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n if (state.config.downloadFile) {\n state.config.downloadFile(resourceId, actualFileName);\n } else {\n forceDownload(resourceId, actualFileName, state);\n }\n };\n\n fileResult.appendChild(previewContainer);\n fileResult.appendChild(fileNameElement);\n fileResult.appendChild(downloadButton);\n\n return fileResult;\n}\n\n// Render resource pills for files\nexport function renderResourcePills(\n container: HTMLElement,\n rids: string[] | null,\n state: State,\n onRemove: ((rid: string) => void) | null,\n): void {\n clear(container);\n\n // Show initial placeholder only if this is the first render (no previous grid)\n const isInitialRender = !container.classList.contains(\"grid\");\n\n if ((!rids || rids.length === 0) && isInitialRender) {\n // Create grid container\n const gridContainer = document.createElement(\"div\");\n gridContainer.className = \"grid grid-cols-4 gap-3 mb-3\";\n\n // Create 4 placeholder slots\n for (let i = 0; i < 4; i++) {\n const slot = document.createElement(\"div\");\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"w-12 h-12 text-gray-400\");\n svg.setAttribute(\"fill\", \"currentColor\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n\n const path = document.createElementNS(\n \"http://www.w3.org/2000/svg\",\n \"path\",\n );\n path.setAttribute(\n \"d\",\n \"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\",\n );\n\n svg.appendChild(path);\n slot.appendChild(svg);\n\n // Add click handler to each slot\n slot.onclick = () => {\n // Look for file input\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n\n gridContainer.appendChild(slot);\n }\n\n // Create text container\n const textContainer = document.createElement(\"div\");\n textContainer.className = \"text-center text-xs text-gray-600\";\n\n const uploadLink = document.createElement(\"span\");\n uploadLink.className = \"underline cursor-pointer\";\n uploadLink.textContent = t(\"uploadText\", state);\n uploadLink.onclick = (e) => {\n e.stopPropagation();\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n\n textContainer.appendChild(uploadLink);\n textContainer.appendChild(document.createTextNode(` ${t(\"dragDropText\", state)}`));\n\n container.appendChild(gridContainer);\n container.appendChild(textContainer);\n return;\n }\n\n // Always show files grid if we have files OR if this was already a grid\n container.className = \"files-list grid grid-cols-4 gap-3 mt-2\";\n\n // Calculate how many slots we need\n const currentImagesCount = rids ? rids.length : 0;\n const rowsNeeded = Math.floor(currentImagesCount / 4) + 1;\n const slotsNeeded = rowsNeeded * 4;\n\n // Add all slots (filled and empty)\n for (let i = 0; i < slotsNeeded; i++) {\n const slot = document.createElement(\"div\");\n\n if (rids && i < rids.length) {\n // Filled slot with preview\n const rid = rids[i];\n const meta = state.resourceIndex.get(rid);\n slot.className =\n \"resource-pill aspect-square bg-gray-100 rounded-lg overflow-hidden relative group border border-gray-300\";\n slot.dataset.resourceId = rid;\n\n // Add image, video, or file content\n renderThumbnailForResource(slot, rid, meta, state).catch((err) => {\n console.error(\"Failed to render thumbnail:\", err);\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">Preview error</div>\n </div>`;\n });\n\n // Add remove button overlay\n if (onRemove) {\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.className = \"bg-red-600 text-white px-2 py-1 rounded text-xs\";\n removeBtn.textContent = t(\"removeElement\", state);\n removeBtn.onclick = (e) => {\n e.stopPropagation();\n onRemove(rid);\n };\n\n overlay.appendChild(removeBtn);\n slot.appendChild(overlay);\n }\n } else {\n // Empty slot placeholder\n slot.className =\n \"aspect-square bg-gray-100 border-2 border-dashed border-gray-300 rounded-lg flex items-center justify-center cursor-pointer hover:border-gray-400 transition-colors\";\n slot.innerHTML =\n '<svg class=\"w-12 h-12 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/></svg>';\n slot.onclick = () => {\n let filesWrapper = container.parentElement;\n while (filesWrapper && !filesWrapper.classList.contains(\"space-y-2\")) {\n filesWrapper = filesWrapper.parentElement;\n }\n if (!filesWrapper && container.classList.contains(\"space-y-2\")) {\n filesWrapper = container;\n }\n const fileInput = filesWrapper?.querySelector(\n 'input[type=\"file\"]',\n ) as HTMLInputElement;\n if (fileInput) fileInput.click();\n };\n }\n\n container.appendChild(slot);\n }\n}\n\n// Helper function to render thumbnail error UI\nfunction renderThumbnailError(slot: HTMLElement, iconSize: string = \"w-12 h-12\"): void {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"${iconSize} text-red-400\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\n </svg>\n <div class=\"text-xs mt-1 text-red-600\">Preview error</div>\n </div>`;\n}\n\n// Render thumbnail for resource\nasync function renderThumbnailForResource(\n slot: HTMLElement,\n rid: string,\n meta: ResourceMetadata | undefined,\n state: State,\n): Promise<void> {\n // Add image, video, or file content\n if (meta && meta.type?.startsWith(\"image/\")) {\n if (meta.file && meta.file instanceof File) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n img.src = (e.target?.result as string) || \"\";\n };\n reader.readAsDataURL(meta.file);\n slot.appendChild(img);\n } else if (state.config.getThumbnail) {\n try {\n const url = await state.config.getThumbnail(rid);\n if (url) {\n const img = document.createElement(\"img\");\n img.className = \"w-full h-full object-contain\";\n img.alt = meta.name;\n img.src = url;\n slot.appendChild(img);\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot);\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>`;\n }\n } else if (meta && meta.type?.startsWith(\"video/\")) {\n if (meta.file && meta.file instanceof File) {\n const videoUrl = URL.createObjectURL(meta.file);\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted>\n <source src=\"${videoUrl}\" type=\"${meta.type}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else if (state.config.getThumbnail) {\n try {\n const videoUrl = await state.config.getThumbnail(rid);\n if (videoUrl) {\n slot.innerHTML = `\n <div class=\"relative group h-full w-full\">\n <video class=\"w-full h-full object-contain\" preload=\"metadata\" muted>\n <source src=\"${videoUrl}\" type=\"${meta.type}\">\n </video>\n <div class=\"absolute inset-0 bg-black bg-opacity-30 flex items-center justify-center\">\n <div class=\"bg-white bg-opacity-90 rounded-full p-1\">\n <svg class=\"w-4 h-4 text-gray-800\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n </div>\n </div>\n </div>\n `;\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${meta?.name || \"Video\"}</div>\n </div>`;\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onThumbnailError) {\n state.config.onThumbnailError(err, rid);\n }\n // Show error state in UI\n renderThumbnailError(slot, \"w-8 h-8\");\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-8 h-8\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\"/>\n </svg>\n <div class=\"text-xs mt-1\">${meta?.name || \"Video\"}</div>\n </div>`;\n }\n } else {\n slot.innerHTML = `<div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <div class=\"text-2xl mb-1\">📁</div>\n <div class=\"text-xs\">${meta?.name || \"File\"}</div>\n </div>`;\n }\n}\n\n// Helper functions\nfunction setEmptyFileContainer(fileContainer: HTMLElement, state: State): void {\n fileContainer.innerHTML = `\n <div class=\"flex flex-col items-center justify-center h-full text-gray-400\">\n <svg class=\"w-6 h-6 mb-2\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n <div class=\"text-sm text-center\">${t(\"clickDragText\", state)}</div>\n </div>\n `;\n}\n\nasync function handleFileSelect(\n file: File,\n container: HTMLElement,\n fieldName: string,\n state: State,\n deps: FileDeps | null = null,\n instance?: any,\n): Promise<void> {\n let rid: string;\n\n // If uploadHandler is configured, use it to upload the file\n if (state.config.uploadFile) {\n try {\n rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file, // Store the file object for local preview\n });\n\n // Create hidden input to store the resource ID\n let hiddenInput = container.parentElement?.querySelector(\n 'input[type=\"hidden\"]',\n ) as HTMLInputElement;\n if (!hiddenInput) {\n hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = fieldName;\n container.parentElement?.appendChild(hiddenInput);\n }\n hiddenInput.value = rid;\n\n renderFilePreview(container, rid, state, {\n fileName: file.name,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Trigger onChange after file upload completes\n if (instance && !state.config.readonly) {\n instance.triggerOnChange(fieldName, rid);\n }\n}\n\nfunction setupDragAndDrop(\n element: HTMLElement,\n dropHandler: (files: FileList) => void,\n): void {\n element.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n element.classList.add(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"dragleave\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n });\n\n element.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n element.classList.remove(\"border-blue-500\", \"bg-blue-50\");\n if (e.dataTransfer?.files) {\n dropHandler(e.dataTransfer.files);\n }\n });\n}\n\nfunction addDeleteButton(container: HTMLElement, state: State, onDelete: () => void): void {\n // Remove existing overlay if any\n const existingOverlay = container.querySelector(\".delete-overlay\");\n if (existingOverlay) {\n existingOverlay.remove();\n }\n\n // Create overlay with center delete button\n const overlay = document.createElement(\"div\");\n overlay.className =\n \"delete-overlay absolute inset-0 bg-black bg-opacity-50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\";\n\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.className =\n \"bg-red-600 text-white px-3 py-1 rounded text-sm hover:bg-red-700 transition-colors\";\n deleteBtn.textContent = t(\"removeElement\", state);\n deleteBtn.onclick = (e) => {\n e.stopPropagation();\n onDelete();\n };\n\n overlay.appendChild(deleteBtn);\n container.appendChild(overlay);\n}\n\nasync function uploadSingleFile(file: File, state: State): Promise<string> {\n if (state.config.uploadFile) {\n try {\n const rid = await state.config.uploadFile(file);\n if (typeof rid !== \"string\") {\n throw new Error(\"Upload handler must return a string resource ID\");\n }\n return rid;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onUploadError) {\n state.config.onUploadError(err, file);\n }\n throw new Error(`File upload failed: ${err.message}`);\n }\n } else {\n throw new Error(\n \"No upload handler configured. Set uploadHandler via FormBuilder.setUploadHandler()\",\n );\n }\n}\n\nasync function forceDownload(resourceId: string, fileName: string, state: State): Promise<void> {\n try {\n // Try to get URL from dedicated download handler first, then fall back to thumbnail handler\n let fileUrl: string | null = null;\n\n if (state.config.getDownloadUrl) {\n fileUrl = state.config.getDownloadUrl(resourceId);\n } else if (state.config.getThumbnail) {\n fileUrl = await state.config.getThumbnail(resourceId);\n }\n\n if (fileUrl) {\n const finalUrl = fileUrl.startsWith(\"http\")\n ? fileUrl\n : new URL(fileUrl, window.location.href).href;\n\n const response = await fetch(finalUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const blob = await response.blob();\n downloadBlob(blob, fileName);\n } else {\n throw new Error(\"No download URL available for resource\");\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n // Call error handler if configured\n if (state.config.onDownloadError) {\n state.config.onDownloadError(err, resourceId, fileName);\n }\n console.error(`File download failed for ${fileName}:`, err);\n throw err;\n }\n}\n\nfunction downloadBlob(blob: Blob, fileName: string): void {\n try {\n const blobUrl = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = fileName;\n link.style.display = \"none\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n setTimeout(() => {\n URL.revokeObjectURL(blobUrl);\n }, 100);\n } catch (error) {\n throw new Error(`Blob download failed: ${(error as Error).message}`);\n }\n}\n\nfunction addPrefillFilesToIndex(initialFiles: string[], state: State): void {\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n });\n }\n}\n\nfunction handleInitialFileData(\n initial: string,\n fileContainer: HTMLElement,\n pathKey: string,\n fileWrapper: HTMLElement,\n state: State,\n deps: FileDeps,\n): void {\n // Add prefill data to resourceIndex\n if (!state.resourceIndex.has(initial)) {\n const filename = initial.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(initial, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n renderFilePreview(fileContainer, initial, state, {\n fileName: initial,\n isReadonly: false,\n deps,\n }).catch(console.error);\n\n // Create hidden input to store the prefilled resource ID\n const hiddenInput = document.createElement(\"input\");\n hiddenInput.type = \"hidden\";\n hiddenInput.name = pathKey;\n hiddenInput.value = initial;\n fileWrapper.appendChild(hiddenInput);\n}\n\nfunction setupFilesDropHandler(\n filesContainer: HTMLElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n pathKey?: string,\n instance?: any,\n): void {\n setupDragAndDrop(filesContainer, async (files) => {\n const arr = Array.from(files);\n for (const file of arr) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n updateCallback();\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n });\n}\n\nfunction setupFilesPickerHandler(\n filesPicker: HTMLInputElement,\n initialFiles: string[],\n state: State,\n updateCallback: () => void,\n pathKey?: string,\n instance?: any,\n): void {\n filesPicker.onchange = async () => {\n if (filesPicker.files) {\n for (const file of Array.from(filesPicker.files)) {\n const rid = await uploadSingleFile(file, state);\n state.resourceIndex.set(rid, {\n name: file.name,\n type: file.type,\n size: file.size,\n uploadedAt: new Date(),\n file: undefined,\n });\n initialFiles.push(rid);\n }\n }\n updateCallback();\n filesPicker.value = \"\";\n\n // Trigger onChange after all files are uploaded\n if (instance && pathKey && !state.config.readonly) {\n instance.triggerOnChange(pathKey, initialFiles);\n }\n };\n}\n\n// Component rendering functions\nexport function renderFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: use common preview function\n const initial = ctx.prefill[element.key];\n if (initial) {\n renderFilePreviewReadonly(initial as string, state).then((filePreview) => {\n wrapper.appendChild(filePreview);\n }).catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">Preview unavailable</div>`;\n wrapper.appendChild(emptyState);\n });\n } else {\n const emptyState = document.createElement(\"div\");\n emptyState.className =\n \"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\";\n emptyState.innerHTML = `<div class=\"text-center\">${t(\"noFileSelected\", state)}</div>`;\n wrapper.appendChild(emptyState);\n }\n } else {\n // Edit mode: normal file input\n const fileWrapper = document.createElement(\"div\");\n fileWrapper.className = \"space-y-2\";\n\n const picker = document.createElement(\"input\");\n picker.type = \"file\";\n picker.name = pathKey;\n picker.style.display = \"none\";\n if (element.accept) {\n picker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const fileContainer = document.createElement(\"div\");\n fileContainer.className =\n \"file-preview-container w-full aspect-square max-w-xs bg-gray-100 rounded-lg overflow-hidden relative group cursor-pointer\";\n\n const initial = ctx.prefill[element.key];\n\n // Set up click and drag handlers\n const fileUploadHandler = () => picker.click();\n const dragHandler = (files: FileList) => {\n if (files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(files[0], fileContainer, pathKey, state, deps, ctx.instance);\n }\n };\n\n // Handle initial prefill data\n if (initial) {\n handleInitialFileData(\n initial as string,\n fileContainer,\n pathKey,\n fileWrapper,\n state,\n {\n picker,\n fileUploadHandler,\n dragHandler,\n },\n );\n } else {\n setEmptyFileContainer(fileContainer, state);\n }\n\n fileContainer.onclick = fileUploadHandler;\n setupDragAndDrop(fileContainer, dragHandler);\n\n picker.onchange = () => {\n if (picker.files && picker.files.length > 0) {\n const deps = { picker, fileUploadHandler, dragHandler };\n handleFileSelect(picker.files[0], fileContainer, pathKey, state, deps, ctx.instance);\n }\n };\n\n fileWrapper.appendChild(fileContainer);\n fileWrapper.appendChild(picker);\n\n // Add upload text\n const uploadText = document.createElement(\"p\");\n uploadText.className = \"text-xs text-gray-600 mt-2 text-center\";\n uploadText.innerHTML = `<span class=\"underline cursor-pointer\">${t(\"uploadText\", state)}</span> ${t(\"dragDropTextSingle\", state)}`;\n const uploadSpan = uploadText.querySelector(\"span\");\n if (uploadSpan) {\n uploadSpan.onclick = () => picker.click();\n }\n fileWrapper.appendChild(uploadText);\n\n // Add hint\n const fileHint = document.createElement(\"p\");\n fileHint.className = \"text-xs text-gray-500 mt-1 text-center\";\n fileHint.textContent = makeFieldHint(element);\n fileWrapper.appendChild(fileHint);\n\n wrapper.appendChild(fileWrapper);\n }\n}\n\nexport function renderFilesElement(\n element: FilesElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state).then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n }).catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${t(\"noFilesSelected\", state)}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: normal files input\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className =\n \"border-2 border-dashed border-gray-300 rounded-lg p-3 hover:border-gray-400 transition-colors\";\n\n const list = document.createElement(\"div\");\n list.className = \"files-list\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n // Add prefill files to resourceIndex\n addPrefillFilesToIndex(initialFiles, state);\n\n function updateFilesList(): void {\n renderResourcePills(list, initialFiles, state, (ridToRemove) => {\n const index = initialFiles.indexOf(ridToRemove);\n if (index > -1) {\n initialFiles.splice(index, 1);\n }\n updateFilesList();\n });\n }\n\n // Initial render\n updateFilesList();\n\n setupFilesDropHandler(filesContainer, initialFiles, state, updateFilesList, pathKey, ctx.instance);\n setupFilesPickerHandler(filesPicker, initialFiles, state, updateFilesList, pathKey, ctx.instance);\n\n filesContainer.appendChild(list);\n filesWrapper.appendChild(filesContainer);\n filesWrapper.appendChild(filesPicker);\n\n // Add hint\n const filesHint = document.createElement(\"p\");\n filesHint.className = \"text-xs text-gray-500 mt-1 text-center\";\n filesHint.textContent = makeFieldHint(element);\n filesWrapper.appendChild(filesHint);\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\nexport function renderMultipleFileElement(\n element: FileElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n const state = ctx.state;\n const minFiles = element.minCount ?? 0;\n const maxFiles = element.maxCount ?? Infinity;\n\n if (state.config.readonly) {\n // Readonly mode: render as results list\n const resultsWrapper = document.createElement(\"div\");\n resultsWrapper.className = \"space-y-4\";\n\n const initialFiles = (ctx.prefill[element.key] as string[]) || [];\n\n if (initialFiles.length > 0) {\n initialFiles.forEach((resourceId) => {\n renderFilePreviewReadonly(resourceId, state).then((filePreview) => {\n resultsWrapper.appendChild(filePreview);\n }).catch((err) => {\n console.error(\"Failed to render file preview:\", err);\n });\n });\n } else {\n resultsWrapper.innerHTML = `<div class=\"aspect-video bg-gray-100 rounded-lg flex items-center justify-center text-gray-500\"><div class=\"text-center\">${t(\"noFilesSelected\", state)}</div></div>`;\n }\n\n wrapper.appendChild(resultsWrapper);\n } else {\n // Edit mode: multiple file input with min/max validation\n const filesWrapper = document.createElement(\"div\");\n filesWrapper.className = \"space-y-2\";\n\n const filesPicker = document.createElement(\"input\");\n filesPicker.type = \"file\";\n filesPicker.name = pathKey;\n filesPicker.multiple = true;\n filesPicker.style.display = \"none\";\n if (element.accept) {\n filesPicker.accept =\n typeof element.accept === \"string\"\n ? element.accept\n : element.accept.extensions?.map((ext) => `.${ext}`).join(\",\") || \"\";\n }\n\n const filesContainer = document.createElement(\"div\");\n filesContainer.className = \"files-list space-y-2\";\n\n filesWrapper.appendChild(filesPicker);\n filesWrapper.appendChild(filesContainer);\n\n const initialFiles = Array.isArray(ctx.prefill[element.key])\n ? [...(ctx.prefill[element.key] as string[])]\n : [];\n\n // Add initial files to resource index\n addPrefillFilesToIndex(initialFiles, state);\n\n const updateFilesDisplay = (): void => {\n renderResourcePills(filesContainer, initialFiles, state, (index) => {\n initialFiles.splice(initialFiles.indexOf(index), 1);\n updateFilesDisplay();\n });\n\n // Show count and min/max info\n const countInfo = document.createElement(\"div\");\n countInfo.className = \"text-xs text-gray-500 mt-2 file-count-info\";\n const countText = `${initialFiles.length} file${initialFiles.length !== 1 ? \"s\" : \"\"}`;\n const minMaxText =\n minFiles > 0 || maxFiles < Infinity\n ? ` (${minFiles}-${maxFiles} allowed)`\n : \"\";\n countInfo.textContent = countText + minMaxText;\n\n // Remove previous count info\n const existingCount = filesWrapper.querySelector(\".file-count-info\");\n if (existingCount) existingCount.remove();\n\n filesWrapper.appendChild(countInfo);\n };\n\n // Set up drag and drop\n setupFilesDropHandler(filesContainer, initialFiles, state, updateFilesDisplay, pathKey, ctx.instance);\n\n // Set up file picker\n setupFilesPickerHandler(filesPicker, initialFiles, state, updateFilesDisplay, pathKey, ctx.instance);\n\n // Initial display\n updateFilesDisplay();\n\n wrapper.appendChild(filesWrapper);\n }\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Validate file field and return extracted value with errors\n */\nexport function validateFileElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n const isMultipleField =\n element.type === \"files\" ||\n (\"multiple\" in element && Boolean((element as FileElement).multiple));\n\n // Helper to validate file count\n const validateFileCount = (\n key: string,\n resourceIds: string[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n\n const minFiles = \"minCount\" in element ? element.minCount ?? 0 : 0;\n const maxFiles =\n \"maxCount\" in element ? element.maxCount ?? Infinity : Infinity;\n\n if (element.required && resourceIds.length === 0) {\n errors.push(`${key}: required`);\n }\n if (resourceIds.length < minFiles) {\n errors.push(`${key}: minimum ${minFiles} files required`);\n }\n if (resourceIds.length > maxFiles) {\n errors.push(`${key}: maximum ${maxFiles} files allowed`);\n }\n };\n\n if (isMultipleField) {\n // Multiple file fields\n const fullKey = pathJoin(path, key);\n const pickerInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[type=\"file\"][name=\"${fullKey}\"]`,\n );\n const filesWrapper = pickerInput?.closest(\".space-y-2\");\n const container = filesWrapper?.querySelector(\".files-list\") || null;\n\n const resourceIds: string[] = [];\n if (container) {\n const pills = container.querySelectorAll<HTMLElement>(\".resource-pill\");\n pills.forEach((pill) => {\n const resourceId = pill.dataset.resourceId;\n if (resourceId) {\n resourceIds.push(resourceId);\n }\n });\n }\n\n validateFileCount(key, resourceIds, element);\n return { value: resourceIds, errors };\n } else {\n // Single file field\n const input = scopeRoot.querySelector<HTMLInputElement>(\n `input[name$=\"${key}\"][type=\"hidden\"]`,\n );\n const rid = input?.value ?? \"\";\n\n if (!skipValidation && element.required && rid === \"\") {\n errors.push(`${key}: required`);\n return { value: null, errors };\n }\n\n return { value: rid || null, errors };\n }\n}\n\n/**\n * Update file field value in DOM without re-render\n */\nexport function updateFileField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { scopeRoot, state } = context;\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple file fields\n if (!Array.isArray(value)) {\n console.warn(\n `updateFileField: Expected array for multiple file field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update resource IDs in state\n value.forEach((resourceId) => {\n if (resourceId && typeof resourceId === \"string\") {\n if (!state.resourceIndex.has(resourceId)) {\n const filename = resourceId.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(resourceId, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n }\n });\n\n // Note: Updating the file previews would require re-rendering\n console.info(\n `updateFileField: Multiple file field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n } else {\n // Single file field\n const hiddenInput = scopeRoot.querySelector<HTMLInputElement>(\n `input[name=\"${fieldPath}\"][type=\"hidden\"]`,\n );\n\n if (!hiddenInput) {\n console.warn(\n `updateFileField: Hidden input not found for file field \"${fieldPath}\"`,\n );\n return;\n }\n\n // Update hidden input value\n hiddenInput.value = value != null ? String(value) : \"\";\n\n // If value is a resource ID, update the resource index\n if (value && typeof value === \"string\") {\n if (!state.resourceIndex.has(value)) {\n // Add to resource index if not present\n const filename = value.split(\"/\").pop() || \"file\";\n const extension = filename.split(\".\").pop()?.toLowerCase();\n let fileType = \"application/octet-stream\";\n\n if (extension) {\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(extension)) {\n fileType = `image/${extension === \"jpg\" ? \"jpeg\" : extension}`;\n } else if ([\"mp4\", \"webm\", \"mov\", \"avi\"].includes(extension)) {\n fileType = `video/${extension === \"mov\" ? \"quicktime\" : extension}`;\n }\n }\n\n state.resourceIndex.set(value, {\n name: filename,\n type: fileType,\n size: 0,\n uploadedAt: new Date(),\n file: undefined,\n });\n }\n\n // Note: Updating the file preview would require re-rendering\n // This method only updates the underlying data\n console.info(\n `updateFileField: File field \"${fieldPath}\" updated. Preview update requires re-render.`,\n );\n }\n }\n}\n","// Container component rendering functions\n\nimport type {\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { t } from \"../utils/translation.js\";\nimport { pathJoin, isPlainObject } from \"../utils/helpers.js\";\n\n// Forward declaration - will be imported from components/index.ts\n// This creates a circular dependency that will be resolved at runtime\nlet renderElementFunc:\n | ((element: any, ctx: RenderContext) => HTMLElement)\n | null = null;\n\n// Export setter for renderElement function (called from components/index.ts)\nexport function setRenderElement(\n fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n renderElementFunc = fn;\n}\n\nfunction renderElement(element: any, ctx: RenderContext): HTMLElement {\n if (!renderElementFunc) {\n throw new Error(\n \"renderElement not initialized. Import from components/index.ts\",\n );\n }\n return renderElementFunc(element, ctx);\n}\n\nexport function renderSingleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Same as renderSingleGroup but with updated naming\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n containerWrap.setAttribute(\"data-container\", pathKey);\n\n const header = document.createElement(\"div\");\n header.className = \"flex justify-between items-center mb-4\";\n\n const left = document.createElement(\"div\");\n left.className = \"flex-1\";\n\n const itemsWrap = document.createElement(\"div\");\n itemsWrap.className = \"space-y-4\";\n\n containerWrap.appendChild(header);\n header.appendChild(left);\n\n // Single object container\n const subCtx: RenderContext = {\n path: pathJoin(ctx.path, element.key),\n prefill: (ctx.prefill?.[element.key] as Record<string, any>) || {},\n state: ctx.state,\n };\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n itemsWrap.appendChild(renderElement(child, subCtx));\n }\n });\n containerWrap.appendChild(itemsWrap);\n left.innerHTML = `<span>${element.label || element.key}</span>`;\n\n wrapper.appendChild(containerWrap);\n}\n\nexport function renderMultipleContainerElement(\n element: ContainerElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n _pathKey: string,\n): void {\n const state = ctx.state;\n // Same as renderRepeatableGroup but with minCount/maxCount from element properties\n const containerWrap = document.createElement(\"div\");\n containerWrap.className = \"border border-gray-200 rounded-lg p-4 bg-gray-50\";\n\n const header = document.createElement(\"div\");\n header.className = \"flex justify-between items-center mb-4\";\n\n const left = document.createElement(\"div\");\n left.className = \"flex-1\";\n\n const right = document.createElement(\"div\");\n right.className = \"flex gap-2\";\n\n const itemsWrap = document.createElement(\"div\");\n itemsWrap.className = \"space-y-4\";\n\n containerWrap.appendChild(header);\n header.appendChild(left);\n if (!state.config.readonly) {\n header.appendChild(right);\n }\n\n const min = element.minCount ?? 0;\n const max = element.maxCount ?? Infinity;\n const pre = Array.isArray(ctx.prefill?.[element.key])\n ? (ctx.prefill[element.key] as Array<Record<string, any>>)\n : null;\n\n const countItems = (): number =>\n itemsWrap.querySelectorAll(\":scope > .containerItem\").length;\n\n const createAddButton = (): HTMLButtonElement => {\n const add = document.createElement(\"button\");\n add.type = \"button\";\n add.className =\n \"px-3 py-1.5 bg-blue-600 text-white text-sm rounded-lg hover:bg-blue-700 transition-colors\";\n add.textContent = t(\"addElement\", state);\n add.onclick = () => {\n if (countItems() < max) {\n const idx = countItems();\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: {},\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n item.appendChild(renderElement(child, subCtx));\n }\n });\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className =\n \"absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors\";\n rem.textContent = \"×\";\n rem.onclick = () => {\n item.remove();\n updateAddButton();\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n updateAddButton();\n }\n };\n return add;\n };\n\n const updateAddButton = (): void => {\n const currentCount = countItems();\n const addBtn = right.querySelector(\"button\") as HTMLButtonElement;\n if (addBtn) {\n addBtn.disabled = currentCount >= max;\n addBtn.style.opacity = currentCount >= max ? \"0.5\" : \"1\";\n }\n left.innerHTML = `<span>${element.label || element.key}</span> <span class=\"text-sm text-gray-500\">(${currentCount}/${max === Infinity ? \"∞\" : max})</span>`;\n };\n\n if (!state.config.readonly) {\n right.appendChild(createAddButton());\n }\n\n // Pre-fill initial items\n if (pre && Array.isArray(pre)) {\n pre.forEach((prefillObj, idx) => {\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: prefillObj || {},\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n item.appendChild(renderElement(child, subCtx));\n }\n });\n\n // Only add remove button in edit mode\n if (!state.config.readonly) {\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className =\n \"absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors\";\n rem.textContent = \"×\";\n rem.onclick = () => {\n item.remove();\n updateAddButton();\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n }\n\n itemsWrap.appendChild(item);\n });\n }\n\n // Ensure minimum items\n if (!state.config.readonly) {\n while (countItems() < min) {\n const idx = countItems();\n const subCtx: RenderContext = {\n state: ctx.state,\n path: pathJoin(ctx.path, `${element.key}[${idx}]`),\n prefill: {},\n };\n const item = document.createElement(\"div\");\n item.className =\n \"containerItem border border-gray-300 rounded-lg p-4 bg-white\";\n item.setAttribute(\"data-container-item\", `${element.key}[${idx}]`);\n\n element.elements.forEach((child) => {\n // Skip rendering hidden child elements\n if (!child.hidden) {\n item.appendChild(renderElement(child, subCtx));\n }\n });\n\n // Remove button - but disabled if we're at minimum\n const rem = document.createElement(\"button\");\n rem.type = \"button\";\n rem.className =\n \"absolute top-2 right-2 w-6 h-6 bg-red-500 text-white rounded-full text-xs hover:bg-red-600 transition-colors\";\n rem.textContent = \"×\";\n rem.onclick = () => {\n if (countItems() > min) {\n item.remove();\n updateAddButton();\n }\n };\n item.style.position = \"relative\";\n item.appendChild(rem);\n\n itemsWrap.appendChild(item);\n }\n }\n\n containerWrap.appendChild(itemsWrap);\n updateAddButton();\n\n wrapper.appendChild(containerWrap);\n}\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n// Forward declaration for validateElement - will be set from FormBuilderInstance\nlet validateElementFunc:\n | ((element: Element, ctx: { path: string }, customScopeRoot?: HTMLElement | null) => any)\n | null = null;\n\n// Export setter for validateElement function\nexport function setValidateElement(\n fn: (element: Element, ctx: { path: string }, customScopeRoot?: HTMLElement | null) => any,\n): void {\n validateElementFunc = fn;\n}\n\nfunction validateElement(\n element: Element,\n ctx: { path: string },\n customScopeRoot?: HTMLElement | null,\n): any {\n if (!validateElementFunc) {\n throw new Error(\n \"validateElement not initialized. Should be set from FormBuilderInstance\",\n );\n }\n return validateElementFunc(element, ctx, customScopeRoot);\n}\n\n/**\n * Validate container field and return extracted value with errors\n */\nexport function validateContainerElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n const errors: string[] = [];\n const { scopeRoot, skipValidation, path } = context;\n\n if (!(\"elements\" in element)) {\n return { value: null, errors };\n }\n\n // Helper to validate container count\n const validateContainerCount = (\n key: string,\n items: any[],\n element: Element,\n ): void => {\n if (skipValidation) return;\n\n const minItems = \"minCount\" in element ? element.minCount ?? 0 : 0;\n const maxItems =\n \"maxCount\" in element ? element.maxCount ?? Infinity : Infinity;\n\n if (element.required && items.length === 0) {\n errors.push(`${key}: required`);\n }\n if (items.length < minItems) {\n errors.push(`${key}: minimum ${minItems} items required`);\n }\n if (items.length > maxItems) {\n errors.push(`${key}: maximum ${maxItems} items allowed`);\n }\n };\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n const items: any[] = [];\n const allContainerWrappers = scopeRoot.querySelectorAll<HTMLElement>(\n \"[data-container-item]\",\n );\n const containerWrappers = Array.from(allContainerWrappers).filter((el) => {\n const attr = el.getAttribute(\"data-container-item\");\n return attr?.startsWith(`${key}[`);\n });\n const itemCount = containerWrappers.length;\n\n for (let i = 0; i < itemCount; i++) {\n const itemData: Record<string, any> = {};\n const itemContainer =\n scopeRoot.querySelector<HTMLElement>(\n `[data-container-item=\"${key}[${i}]\"]`,\n ) || scopeRoot;\n\n element.elements.forEach((child: any) => {\n if (child.hidden || child.type === \"hidden\") {\n itemData[child.key] =\n child.default !== undefined ? child.default : null;\n } else {\n const childKey = `${key}[${i}].${child.key}`;\n itemData[child.key] = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n itemContainer,\n );\n }\n });\n items.push(itemData);\n }\n\n validateContainerCount(key, items, element);\n return { value: items, errors };\n } else {\n // Single container\n const containerData: Record<string, any> = {};\n const containerContainer =\n scopeRoot.querySelector<HTMLElement>(`[data-container=\"${key}\"]`) ||\n scopeRoot;\n\n element.elements.forEach((child: any) => {\n if (child.hidden || child.type === \"hidden\") {\n containerData[child.key] =\n child.default !== undefined ? child.default : null;\n } else {\n const childKey = `${key}.${child.key}`;\n containerData[child.key] = validateElement(\n { ...child, key: childKey } as Element,\n { path },\n containerContainer,\n );\n }\n });\n\n return { value: containerData, errors };\n }\n}\n\n/**\n * Update container field value in DOM without re-render\n */\nexport function updateContainerField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n const { instance, scopeRoot } = context;\n\n if (!(\"elements\" in element)) {\n return;\n }\n\n if (\"multiple\" in element && element.multiple) {\n // Multiple containers\n if (!Array.isArray(value)) {\n console.warn(\n `updateContainerField: Expected array for multiple container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields for each item\n value.forEach((itemValue, index) => {\n if (isPlainObject(itemValue)) {\n element.elements.forEach((childElement) => {\n const childKey = childElement.key;\n const childPath = `${fieldPath}[${index}].${childKey}`;\n const childValue = (itemValue as Record<string, any>)[childKey];\n\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n });\n }\n });\n\n const existingContainers = scopeRoot.querySelectorAll(\n `[data-container-item^=\"${fieldPath}[\"]`,\n );\n if (value.length !== existingContainers.length) {\n console.warn(\n `updateContainerField: Multiple container field \"${fieldPath}\" item count mismatch. Consider re-rendering for add/remove.`,\n );\n }\n } else {\n // Single container\n if (!isPlainObject(value)) {\n console.warn(\n `updateContainerField: Expected object for container field \"${fieldPath}\", got ${typeof value}`,\n );\n return;\n }\n\n // Update nested fields\n element.elements.forEach((childElement) => {\n const childKey = childElement.key;\n const childPath = `${fieldPath}.${childKey}`;\n const childValue = (value as Record<string, any>)[childKey];\n\n if (childValue !== undefined) {\n instance.updateField(childPath, childValue);\n }\n });\n }\n}\n","// Group component - compatibility layer that delegates to container\n// Translates legacy GroupElement (with repeat: {min, max}) to ContainerElement (with multiple: true, minCount, maxCount)\n\nimport type {\n GroupElement,\n ContainerElement,\n RenderContext,\n ComponentContext,\n ValidationResult,\n Element,\n} from \"../types/index.js\";\nimport { isPlainObject } from \"../utils/helpers.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n validateContainerElement,\n updateContainerField,\n} from \"./container.js\";\n\n// Export setter for renderElement function (called from components/index.ts)\n// This is a no-op since group now delegates to container (which has its own setRenderElement)\nexport function setRenderElement(\n _fn: (element: any, ctx: RenderContext) => HTMLElement,\n): void {\n // No-op: container handles renderElement initialization\n}\n\n/**\n * Renders a group element by translating it to a ContainerElement\n * and delegating to container rendering functions.\n *\n * This maintains backward compatibility with the legacy group type\n * while eliminating code duplication.\n *\n * @deprecated Use type: \"container\" with multiple: true instead of type: \"group\" with repeat: {min, max}\n */\nexport function renderGroupElement(\n element: GroupElement,\n ctx: RenderContext,\n wrapper: HTMLElement,\n pathKey: string,\n): void {\n // Log deprecation warning once per element\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated and will be removed in a future version. ` +\n `Please use type: \"container\" with multiple: true instead. ` +\n `Field key: \"${element.key}\"`,\n );\n }\n\n // Translate GroupElement → ContainerElement\n const containerElement: ContainerElement = {\n type: \"container\",\n key: element.key,\n label: element.label,\n description: element.description,\n hint: element.hint,\n required: element.required,\n hidden: element.hidden,\n default: element.default,\n actions: element.actions,\n elements: element.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(element.repeat && isPlainObject(element.repeat)),\n minCount: element.repeat?.min,\n maxCount: element.repeat?.max,\n };\n\n // Delegate to container implementation\n if (containerElement.multiple) {\n renderMultipleContainerElement(containerElement, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(containerElement, ctx, wrapper, pathKey);\n }\n}\n\n// Legacy exports for backward compatibility (not used internally)\nexport { renderGroupElement as renderRepeatableGroup };\nexport { renderGroupElement as renderSingleGroup };\n\n// ============================================================================\n// Validation and Update Functions (Component-specific logic)\n// ============================================================================\n\n/**\n * Helper to translate GroupElement to ContainerElement\n */\nfunction translateGroupToContainer(element: Element): ContainerElement {\n const groupElement = element as GroupElement;\n return {\n type: \"container\",\n key: groupElement.key,\n label: groupElement.label,\n description: groupElement.description,\n hint: groupElement.hint,\n required: groupElement.required,\n hidden: groupElement.hidden,\n default: groupElement.default,\n actions: groupElement.actions,\n elements: groupElement.elements,\n // Translate repeat pattern to multiple pattern\n multiple: !!(groupElement.repeat && isPlainObject(groupElement.repeat)),\n minCount: groupElement.repeat?.min,\n maxCount: groupElement.repeat?.max,\n };\n}\n\n/**\n * Validate group field by delegating to container validation\n * @deprecated Use validateContainerElement with type: \"container\" instead\n */\nexport function validateGroupElement(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field key: \"${key}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return validateContainerElement(containerElement, key, context);\n}\n\n/**\n * Update group field by delegating to container update\n * @deprecated Use updateContainerField with type: \"container\" instead\n */\nexport function updateGroupField(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): void {\n // Log deprecation warning\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\n `[Form Builder] The \"group\" field type is deprecated. ` +\n `Please use type: \"container\" instead. Field path: \"${fieldPath}\"`,\n );\n }\n\n // Translate group to container and delegate\n const containerElement = translateGroupToContainer(element);\n return updateContainerField(containerElement, fieldPath, value, context);\n}\n","// Component registry and main renderElement dispatcher\n\nimport type { Element, RenderContext } from \"../types/index.js\";\nimport { pathJoin } from \"../utils/helpers.js\";\nimport { renderTextElement, renderMultipleTextElement } from \"./text.js\";\nimport {\n renderTextareaElement,\n renderMultipleTextareaElement,\n} from \"./textarea.js\";\nimport { renderNumberElement, renderMultipleNumberElement } from \"./number.js\";\nimport { renderSelectElement, renderMultipleSelectElement } from \"./select.js\";\nimport {\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n} from \"./file.js\";\nimport {\n renderSingleContainerElement,\n renderMultipleContainerElement,\n setRenderElement as setContainerRenderElement,\n setValidateElement as setContainerValidateElement,\n} from \"./container.js\";\nimport {\n renderGroupElement,\n setRenderElement as setGroupRenderElement,\n} from \"./group.js\";\n\n// Tooltip management\nfunction showTooltip(tooltipId: string, button: HTMLElement): void {\n const tooltip = document.getElementById(tooltipId);\n if (!tooltip) return;\n\n const isCurrentlyVisible = !tooltip.classList.contains(\"hidden\");\n\n // Hide all tooltips first\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((t) => {\n t.classList.add(\"hidden\");\n });\n\n // If the tooltip was already visible, keep it hidden (toggle behavior)\n if (isCurrentlyVisible) {\n return;\n }\n\n // Position the tooltip intelligently\n const rect = button.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Ensure tooltip is appended to body for proper positioning\n if (tooltip && tooltip.parentElement !== document.body) {\n document.body.appendChild(tooltip);\n }\n\n // Show tooltip temporarily to measure its size\n tooltip.style.visibility = \"hidden\";\n tooltip.style.position = \"fixed\";\n tooltip.classList.remove(\"hidden\");\n const tooltipRect = tooltip.getBoundingClientRect();\n tooltip.classList.add(\"hidden\");\n tooltip.style.visibility = \"visible\";\n\n let left = rect.left;\n let top = rect.bottom + 5;\n\n // Adjust horizontal position if tooltip would go off-screen\n if (left + tooltipRect.width > viewportWidth) {\n left = rect.right - tooltipRect.width;\n }\n\n // Adjust vertical position if tooltip would go off-screen\n if (top + tooltipRect.height > viewportHeight) {\n top = rect.top - tooltipRect.height - 5;\n }\n\n // Ensure tooltip doesn't go off the left edge\n if (left < 10) {\n left = 10;\n }\n\n // Ensure tooltip doesn't go off the top edge\n if (top < 10) {\n top = rect.bottom + 5;\n }\n\n tooltip.style.left = `${left}px`;\n tooltip.style.top = `${top}px`;\n\n // Show the tooltip\n tooltip.classList.remove(\"hidden\");\n\n // Hide after 25 seconds\n setTimeout(() => {\n tooltip.classList.add(\"hidden\");\n }, 25000);\n}\n\n// Close tooltips when clicking outside\nif (typeof document !== \"undefined\") {\n document.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const isInfoButton =\n target.closest(\"button\") && (target.closest(\"button\") as any).onclick;\n const isTooltip = target.closest('[id^=\"tooltip-\"]');\n\n if (!isInfoButton && !isTooltip) {\n document.querySelectorAll('[id^=\"tooltip-\"]').forEach((tooltip) => {\n tooltip.classList.add(\"hidden\");\n });\n }\n });\n}\n\n// Main renderElement function - dispatcher to component-specific renderers\nexport function renderElement(\n element: Element,\n ctx: RenderContext,\n): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"mb-6 fb-field-wrapper\";\n\n const label = document.createElement(\"div\");\n label.className = \"flex items-center mb-2\";\n const title = document.createElement(\"label\");\n title.className = \"text-sm font-medium text-gray-900\";\n title.textContent = element.label || element.key;\n if (element.required) {\n const req = document.createElement(\"span\");\n req.className = \"text-red-500 ml-1\";\n req.textContent = \"*\";\n title.appendChild(req);\n }\n label.appendChild(title);\n\n // Add info button if there's description or hint\n if (element.description || element.hint) {\n const infoBtn = document.createElement(\"button\");\n infoBtn.type = \"button\";\n infoBtn.className = \"ml-2 text-gray-400 hover:text-gray-600\";\n infoBtn.innerHTML =\n '<svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>';\n\n // Create tooltip\n const tooltipId = `tooltip-${element.key}-${Math.random().toString(36).substr(2, 9)}`;\n const tooltip = document.createElement(\"div\");\n tooltip.id = tooltipId;\n tooltip.className =\n \"hidden absolute z-50 bg-gray-200 text-gray-900 text-sm rounded-lg p-3 max-w-sm border border-gray-300 shadow-lg\";\n tooltip.style.position = \"fixed\";\n tooltip.textContent =\n element.description || element.hint || \"Field information\";\n document.body.appendChild(tooltip);\n\n infoBtn.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n showTooltip(tooltipId, infoBtn);\n };\n\n label.appendChild(infoBtn);\n }\n\n wrapper.appendChild(label);\n\n const pathKey = pathJoin(ctx.path, element.key);\n\n switch (element.type) {\n case \"text\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleTextElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"textarea\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleTextareaElement(element, ctx, wrapper, pathKey);\n } else {\n renderTextareaElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"number\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleNumberElement(element, ctx, wrapper, pathKey);\n } else {\n renderNumberElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"select\":\n if (\"multiple\" in element && element.multiple) {\n renderMultipleSelectElement(element, ctx, wrapper, pathKey);\n } else {\n renderSelectElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"file\":\n // Handle multiple files with file type using multiple property\n if (\"multiple\" in element && element.multiple) {\n renderMultipleFileElement(element, ctx, wrapper, pathKey);\n } else {\n renderFileElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n case \"files\":\n renderFilesElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"group\":\n renderGroupElement(element, ctx, wrapper, pathKey);\n break;\n\n case \"container\":\n // Handle containers with multiple property like groups\n if (\"multiple\" in element && element.multiple) {\n renderMultipleContainerElement(element, ctx, wrapper, pathKey);\n } else {\n renderSingleContainerElement(element, ctx, wrapper, pathKey);\n }\n break;\n\n default: {\n const unsupported = document.createElement(\"div\");\n unsupported.className = \"text-red-500 text-sm\";\n unsupported.textContent = `Unsupported field type: ${(element as any).type}`;\n wrapper.appendChild(unsupported);\n }\n }\n\n // Actions are now only rendered via external actions system in renderExternalActions()\n // element.actions are only used for label lookup, not direct rendering\n\n return wrapper;\n}\n\n// Initialize circular dependencies\n// Container and Group components need renderElement for nested rendering\nsetContainerRenderElement(renderElement);\nsetGroupRenderElement(renderElement);\n\n// Export setter for container validation (will be called from FormBuilderInstance)\nexport { setContainerValidateElement };\n\n// Export all component renderers for potential direct use\nexport {\n renderTextElement,\n renderMultipleTextElement,\n renderTextareaElement,\n renderMultipleTextareaElement,\n renderNumberElement,\n renderMultipleNumberElement,\n renderSelectElement,\n renderMultipleSelectElement,\n renderFileElement,\n renderFilesElement,\n renderMultipleFileElement,\n renderSingleContainerElement,\n renderMultipleContainerElement,\n renderGroupElement,\n};\n","// Instance state factory for Form Builder\n// Creates isolated state objects for each FormBuilderInstance\n\nimport type { State, Config } from \"../types/index.js\";\n\n/**\n * Default configuration for new instances\n */\nexport const defaultConfig: Config = {\n uploadFile: null,\n downloadFile: null,\n getThumbnail: null,\n getDownloadUrl: null,\n actionHandler: null,\n onChange: null,\n onFieldChange: null,\n onThumbnailError: null,\n onUploadError: null,\n onDownloadError: null,\n debounceMs: 300,\n verboseErrors: false,\n enableFilePreview: true,\n maxPreviewSize: \"200px\",\n readonly: false,\n locale: \"en\",\n translations: {\n en: {\n addElement: \"Add Element\",\n removeElement: \"Remove\",\n uploadText: \"Upload\",\n dragDropText: \"or drag and drop files\",\n dragDropTextSingle: \"or drag and drop file\",\n clickDragText: \"Click or drag file\",\n noFileSelected: \"No file selected\",\n noFilesSelected: \"No files selected\",\n downloadButton: \"Download\",\n },\n ru: {\n addElement: \"Добавить элемент\",\n removeElement: \"Удалить\",\n uploadText: \"Загрузите\",\n dragDropText: \"или перетащите файлы\",\n dragDropTextSingle: \"или перетащите файл\",\n clickDragText: \"Нажмите или перетащите файл\",\n noFileSelected: \"Файл не выбран\",\n noFilesSelected: \"Нет файлов\",\n downloadButton: \"Скачать\",\n },\n },\n theme: {},\n};\n\n/**\n * Create a new isolated state object for a FormBuilderInstance\n */\nexport function createInstanceState(config?: Partial<Config>): State {\n return {\n schema: null,\n formRoot: null,\n resourceIndex: new Map(),\n externalActions: null,\n version: \"1.0.0\",\n config: {\n ...defaultConfig,\n ...config,\n },\n debounceTimer: null,\n };\n}\n\n/**\n * Generate unique instance ID for resource prefixing\n */\nexport function generateInstanceId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 9);\n return `inst-${timestamp}-${random}`;\n}\n","// Theme configuration and CSS custom properties\n// Provides a centralized theming system using CSS variables\n\nexport interface Theme {\n // Colors\n primaryColor: string;\n primaryHoverColor: string;\n errorColor: string;\n errorHoverColor: string;\n successColor: string;\n borderColor: string;\n borderHoverColor: string;\n borderFocusColor: string;\n backgroundColor: string;\n backgroundHoverColor: string;\n backgroundReadonlyColor: string;\n textColor: string;\n textSecondaryColor: string;\n textPlaceholderColor: string;\n textDisabledColor: string;\n\n // Button colors\n buttonBgColor: string;\n buttonTextColor: string;\n buttonBorderColor: string;\n buttonHoverBgColor: string;\n buttonHoverBorderColor: string;\n\n // Action button colors\n actionBgColor: string;\n actionTextColor: string;\n actionBorderColor: string;\n actionHoverBgColor: string;\n actionHoverBorderColor: string;\n\n // File upload colors\n fileUploadBgColor: string;\n fileUploadBorderColor: string;\n fileUploadTextColor: string;\n fileUploadHoverBorderColor: string;\n\n // Spacing\n inputPaddingX: string;\n inputPaddingY: string;\n borderRadius: string;\n borderWidth: string;\n\n // Typography\n fontSize: string;\n fontSizeSmall: string;\n fontSizeExtraSmall: string;\n fontFamily: string;\n fontWeightNormal: string;\n fontWeightMedium: string;\n\n // Focus ring\n focusRingWidth: string;\n focusRingColor: string;\n focusRingOpacity: string;\n\n // Transitions\n transitionDuration: string;\n}\n\nexport const defaultTheme: Theme = {\n // Colors - matching Tailwind defaults\n primaryColor: \"#3b82f6\", // blue-500\n primaryHoverColor: \"#2563eb\", // blue-600\n errorColor: \"#ef4444\", // red-500\n errorHoverColor: \"#dc2626\", // red-600\n successColor: \"#10b981\", // green-500\n borderColor: \"#d1d5db\", // gray-300\n borderHoverColor: \"#9ca3af\", // gray-400\n borderFocusColor: \"#3b82f6\", // blue-500\n backgroundColor: \"#ffffff\", // white\n backgroundHoverColor: \"#f9fafb\", // gray-50\n backgroundReadonlyColor: \"#f3f4f6\", // gray-100\n textColor: \"#1f2937\", // gray-800\n textSecondaryColor: \"#6b7280\", // gray-500\n textPlaceholderColor: \"#9ca3af\", // gray-400\n textDisabledColor: \"#d1d5db\", // gray-300\n\n // Button colors\n buttonBgColor: \"#3b82f6\", // blue-500\n buttonTextColor: \"#ffffff\", // white\n buttonBorderColor: \"#2563eb\", // blue-600\n buttonHoverBgColor: \"#2563eb\", // blue-600\n buttonHoverBorderColor: \"#1d4ed8\", // blue-700\n\n // Action button colors\n actionBgColor: \"#ffffff\", // white\n actionTextColor: \"#374151\", // gray-700\n actionBorderColor: \"#e5e7eb\", // gray-200\n actionHoverBgColor: \"#f9fafb\", // gray-50\n actionHoverBorderColor: \"#d1d5db\", // gray-300\n\n // File upload colors\n fileUploadBgColor: \"#f3f4f6\", // gray-100\n fileUploadBorderColor: \"#d1d5db\", // gray-300\n fileUploadTextColor: \"#9ca3af\", // gray-400\n fileUploadHoverBorderColor: \"#3b82f6\", // blue-500\n\n // Spacing\n inputPaddingX: \"0.75rem\", // 3 (12px)\n inputPaddingY: \"0.5rem\", // 2 (8px)\n borderRadius: \"0.5rem\", // rounded-lg (8px)\n borderWidth: \"1px\",\n\n // Typography\n fontSize: \"0.875rem\", // text-sm (14px)\n fontSizeSmall: \"0.75rem\", // text-xs (12px)\n fontSizeExtraSmall: \"0.625rem\", // 10px\n fontFamily:\n 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontWeightNormal: \"400\",\n fontWeightMedium: \"500\",\n\n // Focus ring\n focusRingWidth: \"2px\",\n focusRingColor: \"#3b82f6\", // blue-500\n focusRingOpacity: \"0.5\",\n\n // Transitions\n transitionDuration: \"200ms\",\n};\n\n/**\n * Generate CSS custom properties from theme object\n * Prefixes all variables with --fb- to avoid conflicts\n */\nexport function generateCSSVariables(theme: Partial<Theme>): string {\n const mergedTheme = { ...defaultTheme, ...theme };\n\n const cssVars: string[] = [];\n\n // Convert theme object to CSS variables\n Object.entries(mergedTheme).forEach(([key, value]) => {\n // Convert camelCase to kebab-case\n const kebabKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n cssVars.push(` --fb-${kebabKey}: ${value};`);\n });\n\n return cssVars.join(\"\\n\");\n}\n\n/**\n * Inject theme CSS variables into a container element or create a style tag\n */\nexport function injectThemeVariables(\n container: HTMLElement,\n theme: Partial<Theme>,\n): void {\n const cssVariables = generateCSSVariables(theme);\n\n // Check if there's already a theme style tag\n let styleTag = container.querySelector(\n \"style[data-fb-theme]\",\n ) as HTMLStyleElement;\n\n if (!styleTag) {\n styleTag = document.createElement(\"style\");\n styleTag.setAttribute(\"data-fb-theme\", \"true\");\n container.appendChild(styleTag);\n }\n\n // Create CSS rule targeting the container\n styleTag.textContent = `\n [data-fb-root=\"true\"] {\n${cssVariables}\n }\n `;\n}\n\n/**\n * Example theme configurations for documentation\n */\nexport const exampleThemes = {\n default: defaultTheme,\n\n dark: {\n ...defaultTheme,\n primaryColor: \"#60a5fa\", // blue-400\n primaryHoverColor: \"#3b82f6\", // blue-500\n borderColor: \"#4b5563\", // gray-600\n borderHoverColor: \"#6b7280\", // gray-500\n borderFocusColor: \"#60a5fa\", // blue-400\n backgroundColor: \"#1f2937\", // gray-800\n backgroundHoverColor: \"#374151\", // gray-700\n backgroundReadonlyColor: \"#111827\", // gray-900\n textColor: \"#f9fafb\", // gray-50\n textSecondaryColor: \"#9ca3af\", // gray-400\n textPlaceholderColor: \"#6b7280\", // gray-500\n fileUploadBgColor: \"#374151\", // gray-700\n fileUploadBorderColor: \"#4b5563\", // gray-600\n fileUploadTextColor: \"#9ca3af\", // gray-400\n } as Theme,\n\n klein: {\n ...defaultTheme,\n primaryColor: \"#0066cc\",\n primaryHoverColor: \"#0052a3\",\n errorColor: \"#d32f2f\",\n errorHoverColor: \"#c62828\",\n successColor: \"#388e3c\",\n borderColor: \"#e0e0e0\",\n borderHoverColor: \"#bdbdbd\",\n borderFocusColor: \"#0066cc\",\n borderRadius: \"4px\",\n fontSize: \"16px\",\n fontSizeSmall: \"14px\",\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\n } as Theme,\n};\n","// Style utility functions for applying themed styles to form elements\n\nimport type { State } from \"../types/index.js\";\n\n/**\n * Apply themed input styles to an HTMLInputElement, HTMLTextAreaElement, or HTMLSelectElement\n */\nexport function applyInputStyles(\n element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n state: State,\n className?: string,\n): void {\n element.className = className || \"w-full\";\n element.style.cssText = `\n padding: var(--fb-input-padding-y) var(--fb-input-padding-x);\n border: var(--fb-border-width) solid var(--fb-border-color);\n border-radius: var(--fb-border-radius);\n background-color: ${state.config.readonly ? \"var(--fb-background-readonly-color)\" : \"var(--fb-background-color)\"};\n color: var(--fb-text-color);\n font-size: var(--fb-font-size);\n font-family: var(--fb-font-family);\n transition: all var(--fb-transition-duration) ease-in-out;\n `;\n\n // Add interactive hover/focus styles for editable inputs\n if (!state.config.readonly) {\n element.addEventListener(\"focus\", () => {\n element.style.borderColor = \"var(--fb-border-focus-color)\";\n element.style.outline = `var(--fb-focus-ring-width) solid var(--fb-focus-ring-color)`;\n element.style.outlineOffset = \"0\";\n });\n element.addEventListener(\"blur\", () => {\n element.style.borderColor = \"var(--fb-border-color)\";\n element.style.outline = \"none\";\n });\n element.addEventListener(\"mouseenter\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-hover-color)\";\n }\n });\n element.addEventListener(\"mouseleave\", () => {\n if (document.activeElement !== element) {\n element.style.borderColor = \"var(--fb-border-color)\";\n }\n });\n }\n}\n\n/**\n * Apply themed hint/description styles to a paragraph element\n */\nexport function applyHintStyles(element: HTMLParagraphElement): void {\n element.className = \"mt-1\";\n element.style.cssText = `\n font-size: var(--fb-font-size-small);\n color: var(--fb-text-secondary-color);\n `;\n}\n\n/**\n * Create a styled add button with theme support\n */\nexport function createAddButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const addBtn = document.createElement(\"button\");\n addBtn.type = \"button\";\n addBtn.className = \"mt-2 px-3 py-1 rounded\";\n addBtn.style.cssText = `\n color: var(--fb-primary-color);\n border: var(--fb-border-width) solid var(--fb-primary-color);\n background-color: transparent;\n font-size: var(--fb-font-size);\n transition: all var(--fb-transition-duration);\n `;\n addBtn.textContent = text;\n addBtn.addEventListener(\"mouseenter\", () => {\n addBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n addBtn.addEventListener(\"mouseleave\", () => {\n addBtn.style.backgroundColor = \"transparent\";\n });\n addBtn.onclick = onClick;\n return addBtn;\n}\n\n/**\n * Create a styled remove button with theme support\n */\nexport function createRemoveButton(\n text: string,\n onClick: () => void,\n): HTMLButtonElement {\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"px-2 py-1 rounded\";\n removeBtn.style.cssText = `\n color: var(--fb-error-color);\n background-color: transparent;\n transition: background-color var(--fb-transition-duration);\n `;\n removeBtn.innerHTML = text;\n removeBtn.addEventListener(\"mouseenter\", () => {\n removeBtn.style.backgroundColor = \"var(--fb-background-hover-color)\";\n });\n removeBtn.addEventListener(\"mouseleave\", () => {\n removeBtn.style.backgroundColor = \"transparent\";\n });\n removeBtn.onclick = onClick;\n return removeBtn;\n}\n\n/**\n * Apply themed action button styles (for external actions in readonly mode)\n */\nexport function applyActionButtonStyles(\n button: HTMLButtonElement,\n isFormLevel: boolean = false,\n): void {\n button.style.cssText = `\n background-color: var(--fb-action-bg-color);\n color: var(--fb-action-text-color);\n border: var(--fb-border-width) solid var(--fb-action-border-color);\n padding: ${isFormLevel ? \"0.5rem 1rem\" : \"0.5rem 0.75rem\"};\n font-size: var(--fb-font-size);\n font-weight: var(--fb-font-weight-medium);\n border-radius: var(--fb-border-radius);\n transition: all var(--fb-transition-duration);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n `;\n button.addEventListener(\"mouseenter\", () => {\n button.style.backgroundColor = \"var(--fb-action-hover-bg-color)\";\n button.style.borderColor = \"var(--fb-action-hover-border-color)\";\n });\n button.addEventListener(\"mouseleave\", () => {\n button.style.backgroundColor = \"var(--fb-action-bg-color)\";\n button.style.borderColor = \"var(--fb-action-border-color)\";\n });\n}\n","// Component operations registry - maps element types to validation/update functions\n// This registry provides delegation from FormBuilderInstance to component-specific logic\n\nimport type {\n Element,\n ComponentContext,\n ValidationResult,\n ComponentOperations,\n ComponentValidator,\n ComponentUpdater,\n} from \"../types/index.js\";\nimport { validateTextElement, updateTextField } from \"./text.js\";\nimport { validateTextareaElement, updateTextareaField } from \"./textarea.js\";\nimport { validateNumberElement, updateNumberField } from \"./number.js\";\nimport { validateSelectElement, updateSelectField } from \"./select.js\";\nimport { validateFileElement, updateFileField } from \"./file.js\";\nimport {\n validateContainerElement,\n updateContainerField,\n} from \"./container.js\";\nimport { validateGroupElement, updateGroupField } from \"./group.js\";\n\n/**\n * Component operations registry\n * Maps element type to validator and updater functions\n */\nconst componentRegistry: Record<string, ComponentOperations> = {\n text: {\n validate: validateTextElement as ComponentValidator,\n update: updateTextField as ComponentUpdater,\n },\n textarea: {\n validate: validateTextareaElement as ComponentValidator,\n update: updateTextareaField as ComponentUpdater,\n },\n number: {\n validate: validateNumberElement as ComponentValidator,\n update: updateNumberField as ComponentUpdater,\n },\n select: {\n validate: validateSelectElement as ComponentValidator,\n update: updateSelectField as ComponentUpdater,\n },\n file: {\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n files: {\n // Legacy type - delegates to file\n validate: validateFileElement as ComponentValidator,\n update: updateFileField as ComponentUpdater,\n },\n container: {\n validate: validateContainerElement as ComponentValidator,\n update: updateContainerField as ComponentUpdater,\n },\n group: {\n // Deprecated type - delegates to container\n validate: validateGroupElement as ComponentValidator,\n update: updateGroupField as ComponentUpdater,\n },\n};\n\n/**\n * Get component operations for a given element type\n */\nexport function getComponentOperations(\n elementType: string,\n): ComponentOperations | null {\n return componentRegistry[elementType] || null;\n}\n\n/**\n * Validate element using component-specific validator\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function validateElementWithComponent(\n element: Element,\n key: string,\n context: ComponentContext,\n): ValidationResult | null {\n const ops = getComponentOperations(element.type);\n if (ops && ops.validate) {\n return ops.validate(element, key, context);\n }\n return null; // Return null to indicate fallback to legacy implementation\n}\n\n/**\n * Update element using component-specific updater\n * Falls back to legacy implementation if component not yet migrated\n */\nexport function updateElementWithComponent(\n element: Element,\n fieldPath: string,\n value: any,\n context: ComponentContext,\n): boolean {\n const ops = getComponentOperations(element.type);\n if (ops && ops.update) {\n ops.update(element, fieldPath, value, context);\n return true;\n }\n return false; // Return false to indicate fallback to legacy implementation\n}\n","// Form Builder Instance - Encapsulated state management for multi-instance support\n\nimport type {\n Schema,\n Element,\n ContainerElement,\n GroupElement,\n ExternalAction,\n FormData as FormDataResult,\n Config,\n State,\n ComponentContext,\n} from \"../types/index.js\";\nimport { validateSchema } from \"../utils/validation.js\";\nimport { clear } from \"../utils/helpers.js\";\nimport {\n renderElement,\n setContainerValidateElement,\n} from \"../components/index.js\";\nimport { createInstanceState, generateInstanceId } from \"./state.js\";\nimport { injectThemeVariables } from \"../styles/theme.js\";\nimport { applyActionButtonStyles } from \"../utils/styles.js\";\nimport {\n validateElementWithComponent,\n updateElementWithComponent,\n} from \"../components/registry.js\";\n\n/**\n * FormBuilderInstance - Encapsulates all form state and operations\n * Allows multiple independent forms on the same page without state collisions\n */\nexport class FormBuilderInstance {\n private state: State;\n private instanceId: string;\n\n constructor(config?: Partial<Config>) {\n this.instanceId = generateInstanceId();\n this.state = createInstanceState(config);\n\n // Verbose error tracking: Track instances for memory leak detection\n if (this.state.config.verboseErrors) {\n if (!globalThis.__formBuilderInstances) {\n globalThis.__formBuilderInstances = new Set<string>();\n }\n globalThis.__formBuilderInstances.add(this.instanceId);\n\n // Warn about instance count\n if (globalThis.__formBuilderInstances.size > 10) {\n console.warn(\n `[form-builder] ${globalThis.__formBuilderInstances.size} instances active. ` +\n \"Possible memory leak - ensure you call destroy() when done.\",\n );\n }\n }\n }\n\n /**\n * Get instance ID (useful for debugging and resource prefixing)\n */\n getInstanceId(): string {\n return this.instanceId;\n }\n\n /**\n * Get current state (for advanced use cases)\n */\n getState(): State {\n return this.state;\n }\n\n /**\n * Set the form root element\n */\n setFormRoot(element: HTMLElement): void {\n this.state.formRoot = element;\n }\n\n /**\n * Configure the form builder\n */\n configure(config: Partial<Config>): void {\n Object.assign(this.state.config, config);\n }\n\n /**\n * Set file upload handler\n */\n setUploadHandler(uploadFn: ((file: File) => Promise<string>) | null): void {\n this.state.config.uploadFile = uploadFn;\n }\n\n /**\n * Set file download handler\n */\n setDownloadHandler(\n downloadFn: ((resourceId: string, fileName: string) => void) | null,\n ): void {\n this.state.config.downloadFile = downloadFn;\n }\n\n /**\n * Set thumbnail generation handler\n */\n setThumbnailHandler(\n thumbnailFn: ((resourceId: string) => Promise<string | null>) | null,\n ): void {\n this.state.config.getThumbnail = thumbnailFn;\n }\n\n /**\n * Set action handler\n */\n setActionHandler(\n actionFn:\n | ((value: string, key: string, relatedField: string | null) => void)\n | null,\n ): void {\n this.state.config.actionHandler = actionFn;\n }\n\n /**\n * Set mode (edit or readonly)\n */\n setMode(mode: \"edit\" | \"readonly\"): void {\n this.state.config.readonly = mode === \"readonly\";\n }\n\n /**\n * Set locale\n */\n setLocale(locale: \"en\" | \"ru\"): void {\n if (this.state.config.translations[locale]) {\n this.state.config.locale = locale;\n }\n }\n\n /**\n * Trigger onChange callbacks with debouncing\n * @param fieldPath - Optional field path for field-specific change events\n * @param fieldValue - Optional field value for field-specific change events\n */\n triggerOnChange(fieldPath?: string, fieldValue?: any): void {\n // Skip if in readonly mode or during initial render\n if (this.state.config.readonly) return;\n\n // Clear existing debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n }\n\n // Set new debounce timer\n this.state.debounceTimer = setTimeout(() => {\n // Get current form data without validation to avoid UI errors\n const formData = this.validateForm(true);\n\n // Call onChange callback if configured\n if (this.state.config.onChange) {\n this.state.config.onChange(formData);\n }\n\n // Call onFieldChange callback if configured and field path provided\n if (\n this.state.config.onFieldChange &&\n fieldPath !== undefined &&\n fieldValue !== undefined\n ) {\n this.state.config.onFieldChange(fieldPath, fieldValue, formData);\n }\n\n // Clear timer reference\n this.state.debounceTimer = null;\n }, this.state.config.debounceMs) as unknown as number;\n }\n\n /**\n * Register an external action that will be displayed as a button\n * External actions can be form-level (no related_field) or field-level (with related_field)\n * @param action - External action definition\n */\n registerAction(action: ExternalAction): void {\n if (!action || !action.value) {\n throw new Error(\"Action must have a value property\");\n }\n\n // Initialize externalActions array if not exists\n if (!this.state.externalActions) {\n this.state.externalActions = [];\n }\n\n // Check if action already exists (by value and related_field)\n const existingIndex = this.state.externalActions.findIndex(\n (a) =>\n a.value === action.value && a.related_field === action.related_field,\n );\n\n if (existingIndex >= 0) {\n // Replace existing action\n this.state.externalActions[existingIndex] = action;\n } else {\n // Add new action\n this.state.externalActions.push(action);\n }\n }\n\n /**\n * Find the DOM element corresponding to a field path (instance-scoped)\n */\n private findFormElementByFieldPath(fieldPath: string): HTMLElement | null {\n if (!this.state.formRoot) return null;\n\n // In edit mode, try to find input elements with name attributes\n if (!this.state.config.readonly) {\n // Try exact match first\n let element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${fieldPath}\"]`,\n );\n if (element) return element;\n\n // Try with array notation variations\n const variations = [\n fieldPath,\n fieldPath.replace(/\\[(\\d+)\\]/g, \"[$1]\"),\n fieldPath.replace(/\\./g, \"[\") +\n \"]\".repeat((fieldPath.match(/\\./g) || []).length),\n ];\n\n for (const variation of variations) {\n element = this.state.formRoot.querySelector<HTMLElement>(\n `[name=\"${variation}\"]`,\n );\n if (element) return element;\n }\n }\n\n // In readonly mode, or if no input found, look for field wrappers\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) return null;\n\n const fieldWrappers =\n this.state.formRoot.querySelectorAll(\".fb-field-wrapper\");\n for (const wrapper of fieldWrappers) {\n const labelText = schemaElement.label || schemaElement.key;\n const labelElement = wrapper.querySelector(\"label\");\n if (\n labelElement &&\n (labelElement.textContent === labelText ||\n labelElement.textContent === `${labelText}*`)\n ) {\n let fieldElement =\n wrapper.querySelector<HTMLElement>(\".field-placeholder\");\n if (!fieldElement) {\n fieldElement = document.createElement(\"div\");\n fieldElement.className = \"field-placeholder\";\n fieldElement.style.display = \"none\";\n wrapper.appendChild(fieldElement);\n }\n return fieldElement;\n }\n }\n\n return null;\n }\n\n /**\n * Find schema element by field path\n */\n private findSchemaElement(fieldPath: string): Element | null {\n if (!this.state.schema || !this.state.schema.elements) return null;\n\n let currentElements = this.state.schema.elements;\n let foundElement: Element | null = null;\n\n const keys = fieldPath\n .replace(/\\[\\d+\\]/g, \"\")\n .split(\".\")\n .filter(Boolean);\n\n for (const key of keys) {\n foundElement = currentElements.find((el) => el.key === key) || null;\n if (!foundElement) {\n return null;\n }\n if (\"elements\" in foundElement && foundElement.elements) {\n currentElements = foundElement.elements;\n }\n }\n\n return foundElement;\n }\n\n /**\n * Resolve action label from schema or external action\n */\n private resolveActionLabel(\n actionKey: string,\n externalLabel: string | undefined,\n schemaElement: Element | null,\n isTrueFormLevelAction = false,\n ): string {\n if (schemaElement && \"actions\" in schemaElement && schemaElement.actions) {\n const predefinedAction = schemaElement.actions.find(\n (a) => a.key === actionKey,\n );\n if (predefinedAction && predefinedAction.label) {\n return predefinedAction.label;\n }\n }\n\n if (\n isTrueFormLevelAction &&\n this.state.schema &&\n \"actions\" in this.state.schema &&\n (this.state.schema as any).actions\n ) {\n const rootAction = (this.state.schema as any).actions.find(\n (a: any) => a.key === actionKey,\n );\n if (rootAction && rootAction.label) {\n return rootAction.label;\n }\n }\n\n if (externalLabel) {\n return externalLabel;\n }\n\n return actionKey;\n }\n\n /**\n * Render form-level action buttons at the bottom of the form\n */\n private renderFormLevelActions(\n actions: ExternalAction[],\n trueFormLevelActions: ExternalAction[] = [],\n ): void {\n if (!this.state.formRoot) return;\n\n const existingContainer = this.state.formRoot.querySelector(\n \".form-level-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"form-level-actions-container mt-6 pt-4 flex flex-wrap gap-3 justify-center\";\n actionsContainer.style.cssText = `\n border-top: var(--fb-border-width) solid var(--fb-border-color);\n `;\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, true);\n\n const isTrueFormLevelAction = trueFormLevelActions.includes(action);\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n null,\n isTrueFormLevelAction,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(action.value, action.key, null);\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n this.state.formRoot.appendChild(actionsContainer);\n }\n\n /**\n * Render external action buttons for fields\n */\n renderExternalActions(): void {\n if (!this.state.externalActions || !Array.isArray(this.state.externalActions))\n return;\n\n const actionsByField = new Map<string, ExternalAction[]>();\n const trueFormLevelActions: ExternalAction[] = [];\n const movedFormLevelActions: ExternalAction[] = [];\n\n this.state.externalActions.forEach((action) => {\n if (!action.key || !action.value) return;\n\n if (!action.related_field) {\n trueFormLevelActions.push(action);\n } else {\n if (!actionsByField.has(action.related_field)) {\n actionsByField.set(action.related_field, []);\n }\n actionsByField.get(action.related_field)!.push(action);\n }\n });\n\n actionsByField.forEach((actions, fieldPath) => {\n const fieldElement = this.findFormElementByFieldPath(fieldPath);\n if (!fieldElement) {\n console.warn(\n `External action: Could not find form element for field \"${fieldPath}\", treating as form-level actions`,\n );\n movedFormLevelActions.push(...actions);\n return;\n }\n\n let wrapper = fieldElement.closest(\".fb-field-wrapper\");\n if (!wrapper) {\n wrapper = fieldElement.parentElement;\n }\n\n if (!wrapper) {\n console.warn(\n `External action: Could not find wrapper for field \"${fieldPath}\"`,\n );\n return;\n }\n\n const existingContainer = wrapper.querySelector(\n \".external-actions-container\",\n );\n if (existingContainer) {\n existingContainer.remove();\n }\n\n const actionsContainer = document.createElement(\"div\");\n actionsContainer.className =\n \"external-actions-container mt-3 flex flex-wrap gap-2\";\n\n const schemaElement = this.findSchemaElement(fieldPath);\n\n actions.forEach((action) => {\n const actionBtn = document.createElement(\"button\");\n actionBtn.type = \"button\";\n applyActionButtonStyles(actionBtn, false);\n\n const resolvedLabel = this.resolveActionLabel(\n action.key,\n action.label,\n schemaElement,\n );\n actionBtn.textContent = resolvedLabel;\n\n actionBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n this.state.config.actionHandler &&\n typeof this.state.config.actionHandler === \"function\"\n ) {\n this.state.config.actionHandler(\n action.value,\n action.key,\n action.related_field,\n );\n }\n });\n\n actionsContainer.appendChild(actionBtn);\n });\n\n wrapper.appendChild(actionsContainer);\n });\n\n const allFormLevelActions = [\n ...trueFormLevelActions,\n ...movedFormLevelActions,\n ];\n if (allFormLevelActions.length > 0) {\n this.renderFormLevelActions(allFormLevelActions, trueFormLevelActions);\n }\n }\n\n /**\n * Render form from schema\n */\n renderForm(\n root: HTMLElement,\n schema: Schema,\n prefill?: Record<string, any>,\n actions?: ExternalAction[],\n ): void {\n const errors = validateSchema(schema);\n if (errors.length > 0) {\n console.error(\"Schema validation errors:\", errors);\n return;\n }\n\n this.state.formRoot = root;\n this.state.schema = schema;\n this.state.externalActions = actions || null;\n\n clear(root);\n\n // Mark root element for theme CSS variables\n root.setAttribute(\"data-fb-root\", \"true\");\n\n // Inject theme CSS variables\n injectThemeVariables(root, this.state.config.theme);\n\n const formEl = document.createElement(\"div\");\n formEl.className = \"space-y-6\";\n\n schema.elements.forEach((element) => {\n if (element.hidden) {\n return;\n }\n const block = renderElement(element, {\n path: \"\",\n prefill: prefill || {},\n state: this.state,\n instance: this,\n });\n formEl.appendChild(block);\n });\n\n root.appendChild(formEl);\n\n if (\n this.state.config.readonly &&\n this.state.externalActions &&\n Array.isArray(this.state.externalActions)\n ) {\n this.renderExternalActions();\n }\n }\n\n /**\n * Validate form and extract data\n * This is a complete copy of the validateForm logic from form-builder.ts\n * but uses instance state instead of global state\n */\n validateForm(skipValidation = false): FormDataResult {\n if (!this.state.schema || !this.state.formRoot)\n return { valid: true, errors: [], data: {} };\n\n const errors: string[] = [];\n const data: Record<string, any> = {};\n\n\n // ============================================================================\n // Component delegation validation (all field types now use component registry)\n // ============================================================================\n\n // NOTE: All validateXxxElement functions have been migrated to their respective\n // component files (text.ts, select.ts, file.ts, container.ts, group.ts).\n // They are now called via the component registry pattern.\n\n // Inject validateElement into container component for nested validation\n const validateElement = (\n element: Element,\n ctx: { path: string },\n customScopeRoot: HTMLElement | null = null,\n ): any => {\n const key = element.key;\n const scopeRoot = customScopeRoot || this.state.formRoot!;\n\n // All components now use delegation pattern via component registry\n const componentContext: ComponentContext = {\n scopeRoot,\n state: this.state,\n instance: this,\n path: ctx.path,\n skipValidation,\n };\n\n const componentResult = validateElementWithComponent(\n element,\n key,\n componentContext,\n );\n\n if (componentResult !== null) {\n // Component validator handled it - merge errors and return value\n errors.push(...componentResult.errors);\n return componentResult.value;\n }\n\n // Unknown field type\n console.warn(`Unknown field type \"${element.type}\" for key \"${key}\"`);\n return null;\n };\n\n // Set up container validation to use this validateElement function\n setContainerValidateElement(validateElement);\n\n this.state.schema.elements.forEach((element) => {\n if (element.hidden) {\n data[element.key] =\n element.default !== undefined ? element.default : null;\n } else {\n data[element.key] = validateElement(element, { path: \"\" });\n }\n });\n\n return {\n valid: errors.length === 0,\n errors,\n data,\n };\n }\n\n /**\n * Get form data\n */\n getFormData(): FormDataResult {\n return this.validateForm(false);\n }\n\n /**\n * Submit form with validation\n */\n submitForm(): FormDataResult {\n const result = this.validateForm(false);\n if (result.valid) {\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formSubmit\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n }\n return result;\n }\n\n /**\n * Save draft without validation\n */\n saveDraft(): FormDataResult {\n const result = this.validateForm(true);\n if (typeof window !== \"undefined\" && window.parent) {\n window.parent.postMessage(\n {\n type: \"formDraft\",\n data: result.data,\n schema: this.state.schema,\n },\n \"*\",\n );\n }\n return result;\n }\n\n /**\n * Clear the form - reset all field values to empty while preserving form structure\n * This is done by re-rendering the form with empty data\n */\n clearForm(): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"clearForm: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Get current schema, form root, and external actions\n const schema = this.state.schema;\n const formRoot = this.state.formRoot;\n const actions = this.state.externalActions;\n\n // Build empty prefill data (only for hidden fields)\n const emptyPrefill = this.buildHiddenFieldsData(schema.elements);\n\n // Re-render the form with empty data, preserving external actions\n this.renderForm(formRoot, schema, emptyPrefill, actions || undefined);\n }\n\n /**\n * Build prefill data for hidden fields only\n * Hidden fields should retain their values when clearing\n * Builds nested objects instead of flattened dotted keys\n */\n private buildHiddenFieldsData(elements: Element[]): Record<string, any> {\n const data: Record<string, any> = {};\n\n for (const element of elements) {\n const key = element.key;\n\n // Only include hidden fields with explicit defaults\n if (element.hidden && element.default !== undefined) {\n data[key] = element.default;\n }\n\n // Recursively process container elements for nested hidden fields\n if (element.type === \"container\" || element.type === \"group\") {\n const containerElement = element as ContainerElement | GroupElement;\n const nestedData = this.buildHiddenFieldsData(containerElement.elements);\n\n if (Object.keys(nestedData).length > 0) {\n if (!(key in data)) {\n // No default set - use nested data\n data[key] = nestedData;\n } else if (\n typeof data[key] === \"object\" &&\n data[key] !== null &&\n !Array.isArray(data[key])\n ) {\n // Plain object default - merge nested data into it\n data[key] = { ...data[key], ...nestedData };\n }\n // If data[key] is array or other type, don't overwrite\n }\n }\n }\n\n return data;\n }\n\n /**\n * Set form data - update multiple fields without full re-render\n * @param data - Object with field paths and their values\n */\n setFormData(data: Record<string, any>): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"setFormData: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Update each field in the data object\n for (const fieldPath in data) {\n this.updateField(fieldPath, data[fieldPath]);\n }\n }\n\n /**\n * Update a single field by path without full re-render\n * @param fieldPath - Field path (e.g., \"email\", \"address.city\", \"items[0].name\")\n * @param value - New value for the field\n */\n updateField(fieldPath: string, value: any): void {\n if (!this.state.schema || !this.state.formRoot) {\n console.warn(\"updateField: Form not initialized. Call renderForm() first.\");\n return;\n }\n\n // Find the schema element for this field\n const schemaElement = this.findSchemaElement(fieldPath);\n if (!schemaElement) {\n console.warn(`updateField: Schema element not found for path \"${fieldPath}\"`);\n return;\n }\n\n // Find the DOM element\n const domElement = this.findFormElementByFieldPath(fieldPath);\n if (!domElement) {\n console.warn(`updateField: DOM element not found for path \"${fieldPath}\"`);\n return;\n }\n\n // Update based on field type\n this.updateFieldValue(domElement, schemaElement, fieldPath, value);\n\n // Optionally trigger onChange callback\n if (this.state.config.onChange || this.state.config.onFieldChange) {\n this.triggerOnChange(fieldPath, value);\n }\n }\n\n /**\n * Update field value in DOM based on field type\n * Delegates to component-specific updaters via registry\n */\n private updateFieldValue(\n domElement: HTMLElement,\n schemaElement: Element,\n fieldPath: string,\n value: any,\n ): void {\n const componentContext: ComponentContext = {\n scopeRoot: this.state.formRoot!,\n state: this.state,\n instance: this,\n path: \"\",\n };\n\n const handled = updateElementWithComponent(\n schemaElement,\n fieldPath,\n value,\n componentContext,\n );\n\n if (!handled) {\n console.warn(\n `updateField: No updater found for field type \"${schemaElement.type}\" at path \"${fieldPath}\"`,\n );\n }\n }\n\n /**\n * Destroy instance and clean up resources\n */\n destroy(): void {\n // Clear debounce timer\n if (this.state.debounceTimer !== null) {\n clearTimeout(this.state.debounceTimer);\n this.state.debounceTimer = null;\n }\n\n // Clear resource index\n this.state.resourceIndex.clear();\n\n // Clear DOM\n if (this.state.formRoot) {\n clear(this.state.formRoot);\n }\n\n // Nullify references for garbage collection\n this.state.formRoot = null;\n this.state.schema = null;\n this.state.externalActions = null;\n\n // Remove from instance tracking if verbose errors enabled\n if (this.state.config.verboseErrors) {\n globalThis.__formBuilderInstances?.delete(this.instanceId);\n }\n }\n}\n","/**\n * Form Builder - Instance-Based API\n *\n * Zero-dependency JSON Schema form builder library with multi-instance support\n */\n\n// Import the FormBuilderInstance class\nimport { FormBuilderInstance } from \"./instance/FormBuilderInstance.js\";\n\n// Import validation utilities\nimport { validateSchema } from \"./utils/validation.js\";\n\n// Re-export all types for TypeScript consumers\nexport type {\n SelectOption,\n ElementAction,\n BaseElement,\n TextElement,\n TextareaElement,\n NumberElement,\n SelectElement,\n FileElement,\n FilesElement,\n ContainerElement,\n GroupElement,\n Element,\n Schema,\n ExternalAction,\n FormData,\n RenderContext,\n Translations,\n Locale,\n Config,\n ResourceMetadata,\n State,\n} from \"./types/index.js\";\n\n// Re-export theming types and utilities\nexport type { Theme } from \"./styles/theme.js\";\nexport { defaultTheme, exampleThemes } from \"./styles/theme.js\";\n\n/**\n * Factory function for creating new form instances\n *\n * @param config Optional configuration for the instance\n * @returns FormBuilderInstance\n *\n * @example\n * const form = createFormBuilder({\n * uploadFile: async (file) => {\n * // Upload logic\n * return \"resource-id-123\";\n * },\n * downloadFile: (resourceId, fileName) => {\n * // Download logic\n * }\n * });\n *\n * form.renderForm(containerElement, schema, prefillData);\n */\nexport function createFormBuilder(config?: Partial<import(\"./types/index.js\").Config>): FormBuilderInstance {\n return new FormBuilderInstance(config);\n}\n\n// Export FormBuilderInstance class for direct instantiation\nexport { FormBuilderInstance };\n\n// Export validation utilities\nexport { validateSchema };\n\n// Default export\nexport default FormBuilderInstance;\n\n// Browser global compatibility\n// Set window.FormBuilder to FormBuilderInstance class for browser usage\nif (typeof window !== \"undefined\") {\n (window as any).FormBuilder = FormBuilderInstance;\n (window as any).createFormBuilder = createFormBuilder;\n (window as any).validateSchema = validateSchema;\n}\n"]}
|