@formatica/vue 0.2.1 → 0.2.3
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 +280 -24
- package/dist/components/BaseField.d.ts +2 -2
- package/dist/components/BaseField.d.ts.map +1 -1
- package/dist/components/FormBuilder.d.ts +3 -3
- package/dist/components/FormBuilder.d.ts.map +1 -1
- package/dist/components/FormField.d.ts.map +1 -1
- package/dist/components/inputs/SelectInput.d.ts.map +1 -1
- package/dist/components/inputs/TagsInput.d.ts.map +1 -1
- package/dist/core/schemaParser.d.ts +1 -1
- package/dist/core/schemaParser.d.ts.map +1 -1
- package/dist/core/useForm.d.ts +1 -1
- package/dist/core/useForm.d.ts.map +1 -1
- package/dist/core/useFormI18n.d.ts +1 -1
- package/dist/core/useFormI18n.d.ts.map +1 -1
- package/dist/core/useTheme.d.ts +1 -1
- package/dist/core/useTheme.d.ts.map +1 -1
- package/dist/core/useValidation.d.ts +1 -1
- package/dist/core/useValidation.d.ts.map +1 -1
- package/dist/formatica.es.js +1287 -1258
- package/dist/formatica.es.js.map +1 -1
- package/dist/formatica.umd.cjs +1 -1
- package/dist/formatica.umd.cjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/style.css +60 -47
- package/dist/types/schema.d.ts +1 -0
- package/dist/types/schema.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/formatica.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatica.es.js","sources":["../src/core/fieldRegistry.ts","../src/plugin.ts","../src/core/eventBus.ts","../src/core/useFormI18n.ts","../src/core/useValidation.ts","../src/core/useForm.ts","../src/core/useTheme.ts","../src/components/inputs/CheckboxGroupInput.vue","../src/components/inputs/CheckboxInput.vue","../src/components/inputs/DateInput.vue","../src/components/inputs/FileInput.vue","../src/components/inputs/NumberInput.vue","../src/components/inputs/PhoneInput.vue","../src/components/inputs/RadioInput.vue","../src/components/inputs/SelectInput.vue","../src/components/inputs/SliderInput.vue","../src/components/inputs/SwitchInput.vue","../src/components/inputs/TagsInput.vue","../src/components/inputs/TextareaInput.vue","../src/components/inputs/TextInput.vue","../src/components/BaseField.vue","../src/components/FormField.vue","../src/components/layout/FormDivider.vue","../src/components/layout/FormGroup.vue","../src/components/layout/FormHtml.vue","../src/components/layout/FormRow.vue","../src/components/layout/FormSteps.vue","../src/components/layout/FormTabs.vue","../src/components/layout/LayoutRenderer.vue","../src/components/FormBuilder.vue"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Formatica – Field component registry\n// ---------------------------------------------------------------------------\n\nimport type { Component, ComputedRef, InjectionKey } from \"vue\";\n\n// ---------------------------------------------------------------------------\n// Per-instance component overrides (provided by FormBuilder)\n// ---------------------------------------------------------------------------\n\nexport const FormComponentsKey: InjectionKey<ComputedRef<Record<string, Component>>> =\n Symbol(\"FormaticaComponents\");\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst registry = new Map<string, Component>();\n\n/**\n * Register a Vue component for a given field type.\n * If a component is already registered for that type, it will be replaced.\n */\nexport function registerFieldType(type: string, component: Component): void {\n registry.set(type, component);\n}\n\n/**\n * Unregister a field type component.\n */\nexport function unregisterFieldType(type: string): void {\n registry.delete(type);\n}\n\n/**\n * Retrieve the component registered for a given field type.\n */\nexport function getFieldComponent(type: string): Component | undefined {\n return registry.get(type);\n}\n\n/**\n * Check whether a component is registered for a given field type.\n */\nexport function hasFieldType(type: string): boolean {\n return registry.has(type);\n}\n\n/**\n * Return all registered field type names.\n */\nexport function getRegisteredFieldTypes(): string[] {\n return Array.from(registry.keys());\n}\n","// ---------------------------------------------------------------------------\n// Formatica Vue – Plugin (global configuration)\n// ---------------------------------------------------------------------------\n\nimport type { App, Component, InjectionKey, Plugin } from \"vue\";\nimport { reactive } from \"vue\";\nimport type { ThemeConfig } from \"@formatica/core\";\nimport { registerFieldType } from \"./core/fieldRegistry\";\n\nexport interface FormaticaOptions {\n theme?: ThemeConfig;\n locale?: string;\n fallbackLocale?: string;\n components?: Record<string, Component>;\n}\n\nexport const FormaticaKey: InjectionKey<FormaticaOptions> = Symbol(\"Formatica\");\n\nexport function createFormatica(options: FormaticaOptions = {}): Plugin {\n return {\n install(app: App) {\n app.provide(FormaticaKey, reactive(options));\n\n // Register global custom components\n if (options.components) {\n for (const [type, component] of Object.entries(options.components)) {\n registerFieldType(type, component);\n }\n }\n },\n };\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Typed event bus\n// ---------------------------------------------------------------------------\n\nimport type { FormEventName, FormEventPayloadMap } from \"../types/form\";\n\ntype EventHandler<E extends FormEventName> = (payload: FormEventPayloadMap[E]) => void;\n\nexport interface EventBus {\n on: <E extends FormEventName>(event: E, handler: EventHandler<E>) => () => void;\n emit: <E extends FormEventName>(event: E, payload: FormEventPayloadMap[E]) => void;\n}\n\nexport function createEventBus(): EventBus {\n const handlers = new Map<FormEventName, Set<EventHandler<FormEventName>>>();\n\n function on<E extends FormEventName>(event: E, handler: EventHandler<E>): () => void {\n if (!handlers.has(event)) {\n handlers.set(event, new Set());\n }\n const set = handlers.get(event);\n if (!set) return () => {};\n set.add(handler as EventHandler<FormEventName>);\n return () => {\n set.delete(handler as EventHandler<FormEventName>);\n };\n }\n\n function emit<E extends FormEventName>(event: E, payload: FormEventPayloadMap[E]): void {\n const set = handlers.get(event);\n if (set) {\n for (const handler of set) {\n handler(payload);\n }\n }\n }\n\n return { on, emit };\n}\n","// ---------------------------------------------------------------------------\n// Formatica – I18n composable\n// ---------------------------------------------------------------------------\n\nimport { type InjectionKey, inject, provide, type Ref } from \"vue\";\nimport type { FieldTranslations, FormTranslations } from \"@formatica/core\";\nimport { titleCase } from \"@formatica/core\";\n\n// ---------------------------------------------------------------------------\n// Injection key\n// ---------------------------------------------------------------------------\n\nexport const FormI18nKey: InjectionKey<FormI18nInstance> = Symbol(\"FormaticaI18n\");\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FormI18nInstance {\n locale: Ref<string>;\n fallbackLocale: string;\n t: (field: string, key: string) => string;\n tOption: (field: string, optionValue: string) => string;\n tValidation: (ruleName: string, params?: Record<string, unknown>) => string;\n}\n\nexport interface UseFormI18nOptions {\n locale: Ref<string>;\n fallbackLocale?: string;\n fieldTranslations?: Record<string, FieldTranslations>;\n formTranslations?: FormTranslations;\n}\n\n// ---------------------------------------------------------------------------\n// Default validation messages\n// ---------------------------------------------------------------------------\n\nconst defaultMessages: Record<string, string> = {\n required: \"This field is required\",\n email: \"Please enter a valid email address\",\n url: \"Please enter a valid URL\",\n min: \"Must be at least {min}\",\n max: \"Must be at most {max}\",\n minLength: \"Must be at least {min} characters\",\n maxLength: \"Must be at most {max} characters\",\n between: \"Must be between {min} and {max}\",\n pattern: \"Invalid format\",\n numeric: \"Must be a number\",\n integer: \"Must be an integer\",\n alpha: \"Must contain only letters\",\n alphaNumeric: \"Must contain only letters and numbers\",\n confirmed: \"Confirmation does not match\",\n date: \"Please enter a valid date\",\n};\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\nexport function useFormI18n(options: UseFormI18nOptions): FormI18nInstance {\n const {\n locale,\n fallbackLocale = \"en\",\n fieldTranslations = {},\n formTranslations = {},\n } = options;\n\n /**\n * Resolve a translated string for a field.\n * Resolution order: translations[locale] -> translations[fallback] -> titleCase(fieldName)\n */\n function t(field: string, key: string): string {\n const translations = fieldTranslations[field];\n if (translations) {\n const localeData = translations[locale.value];\n if (localeData) {\n const value = localeData[key as keyof typeof localeData];\n if (typeof value === \"string\") return value;\n }\n\n const fallbackData = translations[fallbackLocale];\n if (fallbackData) {\n const value = fallbackData[key as keyof typeof fallbackData];\n if (typeof value === \"string\") return value;\n }\n }\n\n // For labels, fall back to title-cased field name\n if (key === \"label\") return titleCase(field);\n return \"\";\n }\n\n /**\n * Resolve a translated option label.\n */\n function tOption(field: string, optionValue: string): string {\n const translations = fieldTranslations[field];\n if (translations) {\n const localeData = translations[locale.value];\n if (localeData?.options?.[optionValue]) return localeData.options[optionValue];\n\n const fallbackData = translations[fallbackLocale];\n if (fallbackData?.options?.[optionValue]) return fallbackData.options[optionValue];\n }\n return optionValue;\n }\n\n /**\n * Resolve a translated validation message with parameter interpolation.\n */\n function tValidation(ruleName: string, params?: Record<string, unknown>): string {\n // Check form-level translations first\n const localeMessages = formTranslations[locale.value]?.messages;\n if (localeMessages?.[ruleName]) {\n return interpolate(localeMessages[ruleName], params ?? {});\n }\n\n const fallbackMessages = formTranslations[fallbackLocale]?.messages;\n if (fallbackMessages?.[ruleName]) {\n return interpolate(fallbackMessages[ruleName], params ?? {});\n }\n\n // Default messages\n const template = defaultMessages[ruleName];\n if (template) return interpolate(template, params ?? {});\n\n return `Validation failed: ${ruleName}`;\n }\n\n const instance: FormI18nInstance = {\n locale,\n fallbackLocale,\n t,\n tOption,\n tValidation,\n };\n\n provide(FormI18nKey, instance);\n\n return instance;\n}\n\n/**\n * Inject the i18n instance provided by a parent useFormI18n call.\n */\nexport function useFormI18nContext(): FormI18nInstance | undefined {\n return inject(FormI18nKey);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction interpolate(template: string, params: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Validation composable\n// ---------------------------------------------------------------------------\n\nimport { type Ref, ref } from \"vue\";\nimport type { FieldSchema, FormSettings, ValidationRule } from \"@formatica/core\";\nimport { evaluateCondition, getRule } from \"@formatica/core\";\nimport type { FormContext } from \"../types/form\";\n\n// ---------------------------------------------------------------------------\n// Rule string parser (\"required|minLength:3|email\" → ValidationRule[])\n// ---------------------------------------------------------------------------\n\nfunction parseRuleString(input: string): ValidationRule[] {\n return input.split(\"|\").map((segment) => {\n const [name, ...paramParts] = segment.split(\":\");\n const params: Record<string, unknown> = {};\n if (paramParts.length > 0) {\n const paramStr = paramParts.join(\":\");\n // Support \"min:3\" → { min: 3 } or \"between:1,10\" → { min: 1, max: 10 }\n const values = paramStr.split(\",\");\n if (name === \"between\" && values.length === 2) {\n params.min = values[0];\n params.max = values[1];\n } else if (values.length === 1) {\n // Use the rule name as the param key\n params[name] = values[0];\n } else {\n params.values = values;\n }\n }\n return { name, params };\n });\n}\n\nfunction normalizeRules(field: FieldSchema): ValidationRule[] {\n const raw = field.rules;\n if (!raw) {\n const rules: ValidationRule[] = [];\n if (field.required) rules.push({ name: \"required\" });\n return rules;\n }\n\n if (typeof raw === \"string\") {\n return parseRuleString(raw);\n }\n\n if (Array.isArray(raw)) {\n return raw.flatMap((r) => (typeof r === \"string\" ? parseRuleString(r) : []));\n }\n\n // Record<string, unknown> form: { required: true, minLength: 3 }\n const rules: ValidationRule[] = [];\n for (const [name, paramValue] of Object.entries(raw)) {\n if (paramValue === false) continue;\n const params: Record<string, unknown> = {};\n if (typeof paramValue === \"object\" && paramValue !== null && !Array.isArray(paramValue)) {\n Object.assign(params, paramValue);\n } else if (paramValue !== true) {\n params[name] = paramValue;\n }\n rules.push({ name, params });\n }\n return rules;\n}\n\n// ---------------------------------------------------------------------------\n// Debounce helper\n// ---------------------------------------------------------------------------\n\nfunction debounce<T extends (...args: never[]) => Promise<unknown>>(\n fn: T,\n ms: number,\n): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let pendingResolve: ((v: Awaited<ReturnType<T>>) => void) | null = null;\n\n return (...args: Parameters<T>) => {\n return new Promise<Awaited<ReturnType<T>>>((resolve) => {\n if (timer !== null) {\n clearTimeout(timer);\n // Resolve the previous pending promise with empty errors\n if (pendingResolve) pendingResolve([] as Awaited<ReturnType<T>>);\n }\n pendingResolve = resolve;\n timer = setTimeout(async () => {\n timer = null;\n const result = await fn(...args);\n resolve(result as Awaited<ReturnType<T>>);\n pendingResolve = null;\n }, ms);\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\nexport interface UseValidationOptions {\n fields: Ref<FieldSchema[]>;\n values: Ref<Record<string, unknown>>;\n settings?: FormSettings;\n}\n\nexport interface UseValidationReturn {\n errors: Ref<Record<string, string[]>>;\n validateField: (name: string, ctx: FormContext) => Promise<string[]>;\n validateAll: (ctx: FormContext) => Promise<Record<string, string[]>>;\n clearFieldErrors: (name: string) => void;\n clearAllErrors: () => void;\n}\n\nexport function useValidation(options: UseValidationOptions): UseValidationReturn {\n const { fields, values, settings } = options;\n const errors = ref<Record<string, string[]>>({});\n const debouncedValidators = new Map<string, (...args: never[]) => Promise<string[]>>();\n\n function getDebounced(name: string, ms: number): (...args: never[]) => Promise<string[]> {\n const key = `${name}:${ms}`;\n if (!debouncedValidators.has(key)) {\n debouncedValidators.set(\n key,\n debounce(async (...args: never[]) => {\n return runValidateField(args[0] as string, args[1] as FormContext);\n }, ms),\n );\n }\n const validator = debouncedValidators.get(key);\n if (!validator) throw new Error(`Debounced validator not found for ${key}`);\n return validator;\n }\n\n async function runValidateField(name: string, ctx: FormContext): Promise<string[]> {\n const field = fields.value.find((f) => f.name === name);\n if (!field) return [];\n\n const fieldRules = normalizeRules(field);\n const value = values.value[name];\n const fieldErrors: string[] = [];\n\n for (const rule of fieldRules) {\n // Check conditional rules\n if (rule.params?.when) {\n const condition = rule.params.when as Record<string, unknown>;\n if (\"field\" in condition || \"and\" in condition || \"or\" in condition) {\n const met = evaluateCondition(\n condition as Parameters<typeof evaluateCondition>[0],\n values.value,\n );\n if (!met) continue;\n }\n }\n\n // Skip optional rules when value is empty\n if (rule.optional && isEmpty(value)) continue;\n\n // Resolve the rule function\n let result: boolean | string;\n\n if (rule.validator) {\n result = await rule.validator(value, rule.params ?? {}, ctx);\n } else {\n const fn = getRule(rule.name);\n if (!fn) continue;\n result = await fn(value, rule.params ?? {}, ctx);\n }\n\n if (result !== true) {\n const message = rule.message\n ? interpolateMessage(rule.message, rule.params ?? {})\n : typeof result === \"string\"\n ? result\n : `Validation failed for rule: ${rule.name}`;\n fieldErrors.push(message);\n\n if (rule.bail) break;\n }\n }\n\n errors.value[name] = fieldErrors;\n return fieldErrors;\n }\n\n async function validateField(name: string, ctx: FormContext): Promise<string[]> {\n const debounceMs = settings?.debounce;\n if (debounceMs && debounceMs > 0) {\n const fn = getDebounced(name, debounceMs);\n return fn(name as never, ctx as never);\n }\n return runValidateField(name, ctx);\n }\n\n async function validateAll(ctx: FormContext): Promise<Record<string, string[]>> {\n const results: Record<string, string[]> = {};\n const promises = fields.value.map(async (field) => {\n const fieldErrors = await runValidateField(field.name, ctx);\n if (fieldErrors.length > 0) {\n results[field.name] = fieldErrors;\n }\n });\n await Promise.all(promises);\n errors.value = { ...results };\n return results;\n }\n\n function clearFieldErrors(name: string): void {\n delete errors.value[name];\n }\n\n function clearAllErrors(): void {\n errors.value = {};\n }\n\n return {\n errors,\n validateField,\n validateAll,\n clearFieldErrors,\n clearAllErrors,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isEmpty(value: unknown): boolean {\n if (value === null || value === undefined || value === \"\") return true;\n if (Array.isArray(value) && value.length === 0) return true;\n return false;\n}\n\nfunction interpolateMessage(template: string, params: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Main form composable\n// ---------------------------------------------------------------------------\n\nimport { computed, type InjectionKey, provide, reactive, ref, watch } from \"vue\";\nimport type { FieldSchema, FieldTranslations, FormSchema } from \"@formatica/core\";\nimport { evaluateCondition, extractFields } from \"@formatica/core\";\nimport type { FieldInstance, FormContext, FormInstance, SubmitHandler } from \"../types/form\";\nimport { createEventBus } from \"./eventBus\";\nimport { useFormI18n } from \"./useFormI18n\";\nimport { useValidation } from \"./useValidation\";\n\n// ---------------------------------------------------------------------------\n// Injection key\n// ---------------------------------------------------------------------------\n\nexport const FormContextKey: InjectionKey<FormInstance> = Symbol(\"FormaticaContext\");\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface UseFormOptions {\n locale?: string;\n fallbackLocale?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTypeDefault(field: FieldSchema): unknown {\n switch (field.type) {\n case \"tags\":\n return [];\n case \"checkbox-group\":\n return [];\n case \"checkbox\":\n return false;\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n return null;\n case \"file\":\n return null;\n default:\n return \"\";\n }\n}\n\nfunction buildDefaults(fields: FieldSchema[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n values[field.name] = field.defaultValue ?? getTypeDefault(field);\n }\n return values;\n}\n\nfunction collectFieldTranslations(fields: FieldSchema[]): Record<string, FieldTranslations> {\n const map: Record<string, FieldTranslations> = {};\n for (const field of fields) {\n if (field.translations) map[field.name] = field.translations;\n }\n return map;\n}\n\n// ---------------------------------------------------------------------------\n// Main composable\n// ---------------------------------------------------------------------------\n\nexport function useForm(schema: FormSchema, options?: UseFormOptions): FormInstance {\n const locale = ref(options?.locale ?? \"en\");\n const fallbackLocale = options?.fallbackLocale ?? \"en\";\n\n let currentSchema = schema;\n const fieldsRef = ref<FieldSchema[]>(extractFields(schema.fields));\n\n // Core reactive state\n const values = reactive<Record<string, unknown>>(buildDefaults(extractFields(schema.fields)));\n const errors = reactive<Record<string, string[]>>({});\n const touched = reactive<Record<string, boolean>>({});\n const dirty = reactive<Record<string, boolean>>({});\n const isSubmitting = ref(false);\n const submitCount = ref(0);\n\n const isValid = computed(() => Object.values(errors).every((e) => e.length === 0));\n const isDirty = computed(() => Object.values(dirty).some(Boolean));\n\n const bus = createEventBus();\n\n function getFormContext(): FormContext {\n return { values: { ...values }, getFieldValue: (name: string) => values[name] };\n }\n\n // Validation & i18n\n const valuesRef = computed(() => ({ ...values }));\n const validation = useValidation({\n fields: fieldsRef,\n values: valuesRef,\n settings: schema.settings,\n });\n\n useFormI18n({\n locale,\n fallbackLocale,\n fieldTranslations: collectFieldTranslations(extractFields(schema.fields)),\n formTranslations: schema.translations,\n });\n\n let initialValues = buildDefaults(extractFields(schema.fields));\n\n // Watch value changes\n watch(\n () => ({ ...values }),\n (newVals, oldVals) => {\n if (!oldVals) return;\n for (const key of Object.keys(newVals)) {\n if (newVals[key] !== oldVals[key]) {\n dirty[key] = true;\n bus.emit(\"field:change\", {\n field: key,\n value: newVals[key],\n previousValue: oldVals[key],\n });\n if (schema.settings?.validateOnChange) validateField(key);\n }\n }\n bus.emit(\"change\", { values: newVals });\n },\n { deep: true },\n );\n\n // Field instances\n const fieldInstances = new Map<string, FieldInstance>();\n\n function buildFieldInstance(fs: FieldSchema): FieldInstance {\n const n = fs.name;\n return {\n name: n,\n value: computed({\n get: () => values[n],\n set: (v) => {\n values[n] = v;\n },\n }),\n errors: computed(() => errors[n] ?? []),\n touched: computed({\n get: () => touched[n] ?? false,\n set: (v) => {\n touched[n] = v;\n },\n }),\n dirty: computed({\n get: () => dirty[n] ?? false,\n set: (v) => {\n dirty[n] = v;\n },\n }),\n disabled: computed(() =>\n typeof fs.disabled === \"function\"\n ? fs.disabled(getFormContext())\n : (fs.disabled ?? false),\n ),\n visible: computed(() => {\n if (fs.condition) return evaluateCondition(fs.condition, values);\n if (typeof fs.visible === \"function\") return fs.visible(getFormContext());\n return fs.visible ?? true;\n }),\n schema: fs,\n validate: () => validateField(n),\n reset: () => {\n values[n] = initialValues[n] ?? null;\n delete errors[n];\n touched[n] = false;\n dirty[n] = false;\n },\n clear: () => {\n values[n] = null;\n delete errors[n];\n },\n };\n }\n\n function initFieldInstances(): void {\n fieldInstances.clear();\n for (const field of extractFields(currentSchema.fields)) {\n fieldInstances.set(field.name, buildFieldInstance(field));\n }\n }\n initFieldInstances();\n\n // ---- Core methods ----\n\n async function validateField(name: string): Promise<string[]> {\n const fieldErrors = await validation.validateField(name, getFormContext());\n errors[name] = fieldErrors;\n bus.emit(\"validate:field\", {\n field: name,\n valid: fieldErrors.length === 0,\n errors: fieldErrors,\n });\n return fieldErrors;\n }\n\n async function validate(): Promise<boolean> {\n const allErrors = await validation.validateAll(getFormContext());\n for (const key of Object.keys(errors)) {\n if (!(key in allErrors)) delete errors[key];\n }\n for (const [key, errs] of Object.entries(allErrors)) {\n errors[key] = errs;\n }\n const valid = Object.values(allErrors).every((e) => e.length === 0);\n bus.emit(\"validate\", { valid, errors: { ...allErrors } });\n return valid;\n }\n\n async function submit(handler?: SubmitHandler): Promise<void> {\n isSubmitting.value = true;\n submitCount.value += 1;\n try {\n for (const f of extractFields(currentSchema.fields)) touched[f.name] = true;\n const valid = await validate();\n if (!valid) {\n bus.emit(\"submit:error\", {\n values: { ...values },\n error: new Error(\"Validation failed\"),\n });\n return;\n }\n bus.emit(\"submit\", { values: { ...values } });\n if (handler) await handler({ ...values }, getFormContext());\n bus.emit(\"submit:success\", { values: { ...values }, result: undefined });\n } catch (error: unknown) {\n bus.emit(\"submit:error\", { values: { ...values }, error });\n throw error;\n } finally {\n isSubmitting.value = false;\n }\n }\n\n function reset(): void {\n for (const f of extractFields(currentSchema.fields)) {\n values[f.name] = initialValues[f.name] ?? null;\n delete errors[f.name];\n touched[f.name] = false;\n dirty[f.name] = false;\n }\n validation.clearAllErrors();\n bus.emit(\"reset\", undefined);\n }\n\n function clear(): void {\n for (const f of extractFields(currentSchema.fields)) {\n values[f.name] = null;\n delete errors[f.name];\n }\n validation.clearAllErrors();\n }\n\n function updateSchema(newSchema: FormSchema): void {\n currentSchema = newSchema;\n const newFields = extractFields(newSchema.fields);\n fieldsRef.value = newFields;\n initialValues = buildDefaults(newFields);\n for (const f of newFields) {\n if (!(f.name in values)) values[f.name] = f.defaultValue ?? null;\n }\n const newNames = new Set(newFields.map((f) => f.name));\n for (const key of Object.keys(values)) {\n if (!newNames.has(key)) {\n delete values[key];\n delete errors[key];\n delete touched[key];\n delete dirty[key];\n }\n }\n initFieldInstances();\n }\n\n // ---- Build instance ----\n\n const instance: FormInstance = {\n values,\n errors,\n touched,\n dirty,\n isValid,\n isDirty,\n isSubmitting,\n submitCount,\n validate,\n validateField,\n submit,\n reset,\n clear,\n setError: (name, messages) => {\n errors[name] = messages;\n },\n clearError: (name) => {\n delete errors[name];\n validation.clearFieldErrors(name);\n },\n clearErrors: () => {\n for (const k of Object.keys(errors)) delete errors[k];\n validation.clearAllErrors();\n },\n getField: (name) => fieldInstances.get(name),\n setFieldValue: (name, value) => {\n values[name] = value;\n },\n setFieldDisabled: (name, disabled) => {\n const fs = extractFields(currentSchema.fields).find((f) => f.name === name);\n if (fs) fs.disabled = disabled;\n },\n setFieldVisible: (name, visible) => {\n const fs = extractFields(currentSchema.fields).find((f) => f.name === name);\n if (fs) fs.visible = visible;\n },\n on: bus.on,\n locale,\n setLocale: (l) => {\n locale.value = l;\n },\n schema: currentSchema,\n updateSchema,\n };\n\n provide(FormContextKey, instance);\n return instance;\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Theme composable\n// ---------------------------------------------------------------------------\n\nimport {\n type ComputedRef,\n type Ref,\n computed,\n type InjectionKey,\n inject,\n provide,\n ref,\n toRef,\n isRef,\n} from \"vue\";\nimport type { ThemeConfig } from \"@formatica/core\";\n\n// ---------------------------------------------------------------------------\n// Injection key\n// ---------------------------------------------------------------------------\n\nexport const FormThemeKey: InjectionKey<ThemeInstance> = Symbol(\"FormaticaTheme\");\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ThemeClasses {\n form: string;\n field: string;\n label: string;\n input: string;\n error: string;\n helpText: string;\n group: string;\n row: string;\n steps: string;\n tabs: string;\n button: string;\n}\n\nexport interface ThemeInstance {\n config: ThemeConfig;\n classes: ComputedRef<ThemeClasses>;\n cssVars: ComputedRef<Record<string, string>>;\n}\n\n// ---------------------------------------------------------------------------\n// Default theme\n// ---------------------------------------------------------------------------\n\nconst defaultTheme: ThemeConfig = {\n name: \"default\",\n colors: {\n primary: \"#3b82f6\",\n primaryHover: \"#2563eb\",\n error: \"#ef4444\",\n errorHover: \"#dc2626\",\n success: \"#22c55e\",\n warning: \"#f59e0b\",\n info: \"#3b82f6\",\n text: \"#1f2937\",\n textSecondary: \"#6b7280\",\n textDisabled: \"#9ca3af\",\n background: \"#ffffff\",\n backgroundDisabled: \"#f3f4f6\",\n border: \"#d1d5db\",\n borderFocus: \"#3b82f6\",\n borderError: \"#ef4444\",\n placeholder: \"#9ca3af\",\n },\n typography: {\n fontFamily: \"inherit\",\n fontSize: \"0.875rem\",\n fontSizeSmall: \"0.75rem\",\n fontSizeLarge: \"1rem\",\n lineHeight: \"1.5\",\n labelFontWeight: \"500\",\n },\n spacing: {\n fieldGap: \"1rem\",\n rowGap: \"1rem\",\n inputPaddingX: \"0.75rem\",\n inputPaddingY: \"0.5rem\",\n labelMarginBottom: \"0.375rem\",\n },\n borders: {\n radius: \"0.375rem\",\n radiusSmall: \"0.25rem\",\n radiusLarge: \"0.5rem\",\n width: \"1px\",\n style: \"solid\",\n },\n shadows: {\n focus: \"0 0 0 3px rgba(59, 130, 246, 0.1)\",\n error: \"0 0 0 3px rgba(239, 68, 68, 0.1)\",\n dropdown: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n },\n transitions: {\n duration: \"150ms\",\n timingFunction: \"ease-in-out\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\nexport function useTheme(config?: ThemeConfig | Ref<ThemeConfig | undefined>): ThemeInstance {\n const themeRef: Ref<ThemeConfig> = isRef(config)\n ? computed(() => config.value ?? defaultTheme)\n : ref(config ?? defaultTheme);\n\n const classes = computed<ThemeClasses>(() => {\n const comps = themeRef.value.components ?? {};\n return {\n form: comps.form ?? \"fc-form\",\n field: comps.field ?? \"fc-field\",\n label: comps.label ?? \"fc-label\",\n input: comps.input ?? \"fc-input\",\n error: comps.error ?? \"fc-error\",\n helpText: comps.helpText ?? \"fc-help-text\",\n group: comps.group ?? \"fc-group\",\n row: comps.row ?? \"fc-row\",\n steps: comps.steps ?? \"fc-steps\",\n tabs: comps.tabs ?? \"fc-tabs\",\n button: comps.button ?? \"fc-button\",\n };\n });\n\n const cssVars = computed<Record<string, string>>(() => {\n const t = themeRef.value;\n const vars: Record<string, string> = {};\n\n if (t.colors) {\n for (const [key, value] of Object.entries(t.colors)) {\n if (value) vars[`--fc-color-${camelToKebab(key)}`] = value;\n }\n }\n if (t.typography) {\n for (const [key, value] of Object.entries(t.typography)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (t.spacing) {\n for (const [key, value] of Object.entries(t.spacing)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (t.borders) {\n for (const [key, value] of Object.entries(t.borders)) {\n if (value) vars[`--fc-border-${camelToKebab(key)}`] = value;\n }\n }\n if (t.shadows) {\n for (const [key, value] of Object.entries(t.shadows)) {\n if (value) vars[`--fc-shadow-${camelToKebab(key)}`] = value;\n }\n }\n if (t.transitions) {\n for (const [key, value] of Object.entries(t.transitions)) {\n if (value) vars[`--fc-transition-${camelToKebab(key)}`] = value;\n }\n }\n if (t.cssVars) {\n Object.assign(vars, t.cssVars);\n }\n\n return vars;\n });\n\n const instance: ThemeInstance = {\n config: themeRef.value,\n classes,\n cssVars,\n };\n\n provide(FormThemeKey, instance);\n\n return instance;\n}\n\n/**\n * Inject the theme instance provided by a parent useTheme call.\n * Falls back to default theme classes if no provider exists.\n */\nexport function useThemeClasses(): ThemeInstance {\n const injected = inject(FormThemeKey);\n if (injected) return injected;\n // Return a minimal default without providing (read-only consumer)\n return useThemeDefault();\n}\n\nfunction useThemeDefault(): ThemeInstance {\n const classes = computed<ThemeClasses>(() => ({\n form: \"fc-form\",\n field: \"fc-field\",\n label: \"fc-label\",\n input: \"fc-input\",\n error: \"fc-error\",\n helpText: \"fc-help-text\",\n group: \"fc-group\",\n row: \"fc-row\",\n steps: \"fc-steps\",\n tabs: \"fc-tabs\",\n button: \"fc-button\",\n }));\n\n const cssVars = computed<Record<string, string>>(() => ({}));\n\n return { config: defaultTheme, classes, cssVars };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n import type { OptionItem } from \"../../types/schema\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: Array<string | number | boolean>;\n options: OptionItem[];\n inline?: boolean;\n disabled?: boolean;\n minSelect?: number;\n maxSelect?: number;\n }>(),\n {\n inline: false,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: Array<string | number | boolean>];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n function isChecked(value: string | number | boolean): boolean {\n return props.modelValue.includes(value);\n }\n\n function isOptionDisabled(option: OptionItem): boolean {\n if (props.disabled || option.disabled) return true;\n // Enforce maxSelect: disable unchecked options when at max\n if (\n props.maxSelect &&\n !isChecked(option.value) &&\n props.modelValue.length >= props.maxSelect\n ) {\n return true;\n }\n return false;\n }\n\n function toggleOption(option: OptionItem) {\n if (isOptionDisabled(option)) return;\n const arr = [...props.modelValue];\n const idx = arr.indexOf(option.value);\n if (idx >= 0) {\n // Enforce minSelect: do not remove if at minimum\n if (props.minSelect && arr.length <= props.minSelect) return;\n arr.splice(idx, 1);\n } else {\n arr.push(option.value);\n }\n emit(\"update:modelValue\", arr);\n }\n\n function onKeydown(event: KeyboardEvent, option: OptionItem) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggleOption(option);\n }\n }\n</script>\n\n<template>\n <div\n role=\"group\"\n :class=\"inline ? 'flex flex-wrap gap-4' : 'flex flex-col gap-2'\"\n >\n <label\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :class=\"[\n 'inline-flex items-center gap-2 select-none',\n isOptionDisabled(option) ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n ]\"\n >\n <input\n type=\"checkbox\"\n :checked=\"isChecked(option.value)\"\n :disabled=\"isOptionDisabled(option)\"\n class=\"sr-only\"\n @change=\"toggleOption(option)\"\n @blur=\"emit('blur', $event)\"\n />\n <div\n role=\"checkbox\"\n :aria-checked=\"isChecked(option.value)\"\n :aria-disabled=\"isOptionDisabled(option) || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors duration-200',\n isChecked(option.value)\n ? 'text-white'\n : 'border-gray-300 bg-white',\n ]\"\n :style=\"isChecked(option.value) ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggleOption(option)\"\n @keydown=\"onKeydown($event, option)\"\n >\n <svg\n v-if=\"isChecked(option.value)\"\n class=\"h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 6l3 3 5-5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"text-sm text-gray-700\">{{ option.label }}</span>\n </label>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: boolean;\n checkboxLabel?: string;\n disabled?: boolean;\n }>(),\n {\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: boolean];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const wrapperClasses = computed(() => [\n \"inline-flex items-center gap-2 select-none\",\n props.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n ]);\n\n function toggle() {\n if (props.disabled) return;\n emit(\"update:modelValue\", !props.modelValue);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggle();\n }\n }\n</script>\n\n<template>\n <label :class=\"wrapperClasses\">\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n class=\"sr-only\"\n @change=\"toggle\"\n @blur=\"emit('blur', $event)\"\n />\n <div\n role=\"checkbox\"\n :aria-checked=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors duration-200',\n modelValue\n ? 'text-white'\n : 'border-gray-300 bg-white',\n ]\"\n :style=\"modelValue ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggle\"\n @keydown=\"onKeydown\"\n >\n <svg\n v-if=\"modelValue\"\n class=\"h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 6l3 3 5-5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span v-if=\"checkboxLabel\" class=\"text-sm text-gray-700\">{{ checkboxLabel }}</span>\n </label>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n format?: string;\n minDate?: string;\n maxDate?: string;\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n placeholder: \"\",\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-date-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit(\"update:modelValue\", target.value);\n }\n</script>\n\n<template>\n <input\n type=\"date\"\n :value=\"modelValue\"\n :min=\"minDate\"\n :max=\"maxDate\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-date-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: File | File[] | null;\n accept?: string;\n maxSize?: number;\n multiple?: boolean;\n maxFiles?: number;\n disabled?: boolean;\n }>(),\n {\n multiple: false,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: File | File[] | null];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const fileInputRef = ref<HTMLInputElement | null>(null);\n const isDragOver = ref(false);\n\n const files = computed<File[]>(() => {\n if (!props.modelValue) return [];\n return Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue];\n });\n\n function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n function filterFiles(incoming: File[]): File[] {\n let valid = incoming;\n if (props.maxSize) {\n const limit = props.maxSize;\n valid = valid.filter((f) => f.size <= limit);\n }\n if (props.multiple && props.maxFiles) {\n const remaining = props.maxFiles - files.value.length;\n valid = valid.slice(0, Math.max(0, remaining));\n }\n return valid;\n }\n\n function addFiles(incoming: File[]) {\n const valid = filterFiles(incoming);\n if (valid.length === 0) return;\n if (props.multiple) {\n emit(\"update:modelValue\", [...files.value, ...valid]);\n } else {\n emit(\"update:modelValue\", valid[0]);\n }\n }\n\n function onFileChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (!target.files) return;\n addFiles(Array.from(target.files));\n // Reset so same file can be selected again\n target.value = \"\";\n }\n\n function removeFile(index: number) {\n if (props.disabled) return;\n const updated = files.value.filter((_, i) => i !== index);\n if (props.multiple) {\n emit(\"update:modelValue\", updated.length ? updated : []);\n } else {\n emit(\"update:modelValue\", null);\n }\n }\n\n function onDragOver(event: DragEvent) {\n event.preventDefault();\n if (!props.disabled) isDragOver.value = true;\n }\n\n function onDragLeave() {\n isDragOver.value = false;\n }\n\n function onDrop(event: DragEvent) {\n event.preventDefault();\n isDragOver.value = false;\n if (props.disabled || !event.dataTransfer?.files) return;\n addFiles(Array.from(event.dataTransfer.files));\n }\n\n function openPicker() {\n if (!props.disabled) fileInputRef.value?.click();\n }\n</script>\n\n<template>\n <div :class=\"disabled ? 'opacity-50 cursor-not-allowed' : ''\">\n <!-- Drop zone -->\n <div\n role=\"button\"\n tabindex=\"0\"\n :aria-disabled=\"disabled || undefined\"\n :class=\"[\n 'flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-6 text-center transition-colors duration-200',\n !isDragOver ? 'border-gray-300 bg-gray-50' : '',\n disabled ? 'pointer-events-none' : 'cursor-pointer hover:border-gray-400',\n ]\"\n :style=\"isDragOver ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)' } : {}\"\n @click=\"openPicker\"\n @keydown.enter=\"openPicker\"\n @keydown.space.prevent=\"openPicker\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n @blur=\"emit('blur', $event as unknown as FocusEvent)\"\n >\n <svg\n class=\"mb-2 h-8 w-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 16v-8m0 0l-3 3m3-3l3 3M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1\"\n />\n </svg>\n <p class=\"text-sm text-gray-600\">\n Drop files here or <span class=\"font-medium\" :style=\"{ color: 'var(--fc-color-primary, #3b82f6)' }\">browse</span>\n </p>\n <p v-if=\"accept\" class=\"mt-1 text-xs text-gray-400\">Accepted: {{ accept }}</p>\n </div>\n\n <input\n ref=\"fileInputRef\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n class=\"hidden\"\n @change=\"onFileChange\"\n />\n\n <!-- File list -->\n <ul v-if=\"files.length > 0\" class=\"mt-3 space-y-2\">\n <li\n v-for=\"(file, idx) in files\"\n :key=\"`${file.name}-${idx}`\"\n class=\"flex items-center justify-between rounded-md border border-gray-200 bg-white px-3 py-2 text-sm\"\n >\n <div class=\"flex items-center gap-2 truncate\">\n <svg\n class=\"h-4 w-4 shrink-0 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span class=\"truncate\">{{ file.name }}</span>\n <span class=\"shrink-0 text-xs text-gray-400\">({{ formatSize(file.size) }})</span>\n </div>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"ml-2 shrink-0 text-gray-400 hover:text-red-500 transition-colors duration-200\"\n aria-label=\"Remove file\"\n @click.stop=\"removeFile(idx)\"\n >\n ×\n </button>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: number | null;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n prefix?: string;\n suffix?: string;\n disabled?: boolean;\n readonly?: boolean;\n }>(),\n {\n step: 1,\n disabled: false,\n readonly: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: number | null];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const hasAddons = computed(() => !!props.prefix || !!props.suffix);\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"placeholder:text-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-number-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n props.prefix ? \"rounded-l-none\" : \"\",\n props.suffix ? \"rounded-r-none\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n const raw = target.value;\n if (raw === \"\") {\n emit(\"update:modelValue\", null);\n return;\n }\n let num = parseFloat(raw);\n if (Number.isNaN(num)) return;\n if (props.precision !== undefined) {\n num = parseFloat(num.toFixed(props.precision));\n }\n emit(\"update:modelValue\", num);\n }\n</script>\n\n<template>\n <div v-if=\"hasAddons\" class=\"flex items-stretch\">\n <span\n v-if=\"prefix\"\n class=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ prefix }}\n </span>\n <input\n type=\"number\"\n :value=\"modelValue ?? ''\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n <span\n v-if=\"suffix\"\n class=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ suffix }}\n </span>\n </div>\n <input\n v-else\n type=\"number\"\n :value=\"modelValue ?? ''\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-number-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import {\n AsYouType,\n type CountryCode,\n getCountries,\n getCountryCallingCode,\n parsePhoneNumber,\n } from \"libphonenumber-js\";\n import { computed, nextTick, onMounted, ref, watch } from \"vue\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n defaultCountry?: string;\n countries?: string[];\n showDialCode?: boolean;\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n defaultCountry: \"US\",\n showDialCode: true,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n }>();\n\n // ---------------------------------------------------------------------------\n // Country data\n // ---------------------------------------------------------------------------\n\n interface CountryItem {\n code: CountryCode;\n name: string;\n dialCode: string;\n flag: string;\n }\n\n const countryNames: Record<string, string> = {\n AF: \"Afghanistan\",\n AL: \"Albania\",\n DZ: \"Algeria\",\n AD: \"Andorra\",\n AO: \"Angola\",\n AR: \"Argentina\",\n AM: \"Armenia\",\n AU: \"Australia\",\n AT: \"Austria\",\n AZ: \"Azerbaijan\",\n BH: \"Bahrain\",\n BD: \"Bangladesh\",\n BY: \"Belarus\",\n BE: \"Belgium\",\n BZ: \"Belize\",\n BJ: \"Benin\",\n BT: \"Bhutan\",\n BO: \"Bolivia\",\n BA: \"Bosnia\",\n BW: \"Botswana\",\n BR: \"Brazil\",\n BN: \"Brunei\",\n BG: \"Bulgaria\",\n BF: \"Burkina Faso\",\n BI: \"Burundi\",\n KH: \"Cambodia\",\n CM: \"Cameroon\",\n CA: \"Canada\",\n CL: \"Chile\",\n CN: \"China\",\n CO: \"Colombia\",\n CR: \"Costa Rica\",\n HR: \"Croatia\",\n CU: \"Cuba\",\n CY: \"Cyprus\",\n CZ: \"Czechia\",\n DK: \"Denmark\",\n DO: \"Dominican Rep.\",\n EC: \"Ecuador\",\n EG: \"Egypt\",\n SV: \"El Salvador\",\n EE: \"Estonia\",\n ET: \"Ethiopia\",\n FI: \"Finland\",\n FR: \"France\",\n GE: \"Georgia\",\n DE: \"Germany\",\n GH: \"Ghana\",\n GR: \"Greece\",\n GT: \"Guatemala\",\n HN: \"Honduras\",\n HK: \"Hong Kong\",\n HU: \"Hungary\",\n IS: \"Iceland\",\n IN: \"India\",\n ID: \"Indonesia\",\n IR: \"Iran\",\n IQ: \"Iraq\",\n IE: \"Ireland\",\n IL: \"Israel\",\n IT: \"Italy\",\n JM: \"Jamaica\",\n JP: \"Japan\",\n JO: \"Jordan\",\n KZ: \"Kazakhstan\",\n KE: \"Kenya\",\n KR: \"South Korea\",\n KW: \"Kuwait\",\n LV: \"Latvia\",\n LB: \"Lebanon\",\n LY: \"Libya\",\n LT: \"Lithuania\",\n LU: \"Luxembourg\",\n MO: \"Macau\",\n MY: \"Malaysia\",\n MX: \"Mexico\",\n MA: \"Morocco\",\n MZ: \"Mozambique\",\n MM: \"Myanmar\",\n NP: \"Nepal\",\n NL: \"Netherlands\",\n NZ: \"New Zealand\",\n NI: \"Nicaragua\",\n NG: \"Nigeria\",\n NO: \"Norway\",\n OM: \"Oman\",\n PK: \"Pakistan\",\n PA: \"Panama\",\n PY: \"Paraguay\",\n PE: \"Peru\",\n PH: \"Philippines\",\n PL: \"Poland\",\n PT: \"Portugal\",\n QA: \"Qatar\",\n RO: \"Romania\",\n RU: \"Russia\",\n SA: \"Saudi Arabia\",\n RS: \"Serbia\",\n SG: \"Singapore\",\n SK: \"Slovakia\",\n SI: \"Slovenia\",\n ZA: \"South Africa\",\n ES: \"Spain\",\n LK: \"Sri Lanka\",\n SE: \"Sweden\",\n CH: \"Switzerland\",\n TW: \"Taiwan\",\n TZ: \"Tanzania\",\n TH: \"Thailand\",\n TR: \"Turkey\",\n UA: \"Ukraine\",\n AE: \"UAE\",\n GB: \"United Kingdom\",\n US: \"United States\",\n UY: \"Uruguay\",\n VE: \"Venezuela\",\n VN: \"Vietnam\",\n ZW: \"Zimbabwe\",\n };\n\n function countryFlag(code: string): string {\n return code\n .toUpperCase()\n .split(\"\")\n .map((c) => String.fromCodePoint(0x1f1e6 + c.charCodeAt(0) - 65))\n .join(\"\");\n }\n\n const allCountries = computed<CountryItem[]>(() => {\n const codes = props.countries?.length\n ? props.countries.filter((c): c is CountryCode =>\n getCountries().includes(c as CountryCode),\n )\n : getCountries();\n\n return codes\n .map((code) => ({\n code,\n name: countryNames[code] ?? code,\n dialCode: `+${getCountryCallingCode(code)}`,\n flag: countryFlag(code),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n });\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const selectedCountry = ref<CountryCode>(props.defaultCountry as CountryCode);\n const nationalNumber = ref(\"\");\n const dropdownOpen = ref(false);\n const search = ref(\"\");\n const searchInputRef = ref<HTMLInputElement | null>(null);\n\n const filteredCountries = computed(() => {\n const q = search.value.toLowerCase();\n if (!q) return allCountries.value;\n return allCountries.value.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.code.toLowerCase().includes(q) ||\n c.dialCode.includes(q),\n );\n });\n\n const selectedCountryData = computed(\n () =>\n allCountries.value.find((c) => c.code === selectedCountry.value) ??\n allCountries.value[0],\n );\n\n // ---------------------------------------------------------------------------\n // Sync model value\n // ---------------------------------------------------------------------------\n\n onMounted(() => {\n if (props.modelValue) parseIncoming(props.modelValue);\n });\n\n watch(\n () => props.modelValue,\n (val) => {\n if (val) parseIncoming(val);\n },\n );\n\n function parseIncoming(val: string) {\n try {\n const parsed = parsePhoneNumber(val);\n if (parsed?.country) {\n selectedCountry.value = parsed.country;\n nationalNumber.value = parsed.nationalNumber;\n return;\n }\n } catch {\n // Not a valid international number\n }\n nationalNumber.value = val.replace(/^\\+\\d+\\s*/, \"\");\n }\n\n function emitValue() {\n if (!nationalNumber.value.trim()) {\n emit(\"update:modelValue\", \"\");\n return;\n }\n const formatter = new AsYouType(selectedCountry.value);\n formatter.input(`+${getCountryCallingCode(selectedCountry.value)}${nationalNumber.value}`);\n const num = formatter.getNumber();\n emit(\"update:modelValue\", num?.format(\"E.164\") ?? nationalNumber.value);\n }\n\n function onInput(e: Event) {\n const target = e.target as HTMLInputElement;\n nationalNumber.value = target.value;\n emitValue();\n }\n\n function selectCountry(code: CountryCode) {\n selectedCountry.value = code;\n dropdownOpen.value = false;\n search.value = \"\";\n emitValue();\n }\n\n function openDropdown() {\n if (props.disabled) return;\n dropdownOpen.value = true;\n search.value = \"\";\n nextTick(() => searchInputRef.value?.focus());\n }\n\n function closeDropdown() {\n dropdownOpen.value = false;\n search.value = \"\";\n }\n</script>\n\n<template>\n <div class=\"relative\">\n <div\n :class=\"[\n 'flex items-stretch rounded-lg border transition-colors',\n disabled\n ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700'\n : 'border-gray-300 dark:border-gray-600 focus-within:border-primary-500 focus-within:ring-2 focus-within:ring-primary-500/20',\n ]\"\n >\n <!-- Country selector button -->\n <button\n v-if=\"showDialCode\"\n type=\"button\"\n :disabled=\"disabled\"\n class=\"flex items-center gap-1.5 px-3 border-r border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 rounded-l-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors shrink-0\"\n @mousedown.prevent=\"dropdownOpen ? closeDropdown() : openDropdown()\"\n >\n <span class=\"text-lg leading-none\">{{ selectedCountryData?.flag }}</span>\n <span class=\"text-xs text-gray-500 dark:text-gray-400 font-medium\">{{ selectedCountryData?.dialCode }}</span>\n <svg\n :class=\"['h-3 w-3 text-gray-400 transition-transform', dropdownOpen ? 'rotate-180' : '']\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n\n <!-- Phone number input -->\n <input\n type=\"tel\"\n :value=\"nationalNumber\"\n :placeholder=\"placeholder || 'Phone number'\"\n :disabled=\"disabled\"\n autocomplete=\"tel-national\"\n class=\"flex-1 bg-transparent px-3 py-2 text-sm text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 outline-none min-w-0\"\n :class=\"showDialCode ? 'rounded-r-lg' : 'rounded-lg'\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n />\n </div>\n\n <!-- Backdrop (invisible, closes dropdown on click) -->\n <div\n v-if=\"dropdownOpen\"\n class=\"fixed inset-0 z-40\"\n @mousedown=\"closeDropdown\"\n />\n\n <!-- Country dropdown -->\n <div\n v-if=\"dropdownOpen\"\n class=\"absolute left-0 top-full z-50 mt-1 w-72 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-xl overflow-hidden\"\n >\n <!-- Search -->\n <div class=\"border-b border-gray-200 dark:border-gray-700 p-2\">\n <input\n ref=\"searchInputRef\"\n v-model=\"search\"\n type=\"text\"\n placeholder=\"Search country...\"\n class=\"w-full rounded-md border border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 px-3 py-1.5 text-xs text-gray-900 dark:text-white placeholder-gray-400 outline-none focus:border-primary-500\"\n />\n </div>\n\n <!-- Country list -->\n <div class=\"max-h-48 overflow-y-auto\">\n <button\n v-for=\"country in filteredCountries\"\n :key=\"country.code\"\n type=\"button\"\n :class=\"[\n 'flex w-full items-center gap-3 px-3 py-2 text-left text-sm transition-colors hover:bg-gray-50 dark:hover:bg-gray-800',\n country.code === selectedCountry\n ? 'bg-primary-50 dark:bg-primary-950/30 text-primary-700 dark:text-primary-300'\n : 'text-gray-700 dark:text-gray-300',\n ]\"\n @mousedown.prevent=\"selectCountry(country.code)\"\n >\n <span class=\"text-lg leading-none\">{{ country.flag }}</span>\n <span class=\"flex-1 truncate text-xs\">{{ country.name }}</span>\n <span class=\"text-[11px] text-gray-400 dark:text-gray-500 font-mono\">{{ country.dialCode }}</span>\n </button>\n <p\n v-if=\"filteredCountries.length === 0\"\n class=\"px-3 py-4 text-center text-xs text-gray-400 dark:text-gray-500\"\n >\n No countries found\n </p>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { useThemeClasses } from \"../../core/useTheme\";\n import type { OptionItem } from \"../../types/schema\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string | number | boolean | null;\n options: OptionItem[];\n inline?: boolean;\n disabled?: boolean;\n }>(),\n {\n inline: false,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string | number | boolean | null];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n function isSelected(value: string | number | boolean): boolean {\n return props.modelValue === value;\n }\n\n function isOptionDisabled(option: OptionItem): boolean {\n return props.disabled || !!option.disabled;\n }\n\n function selectOption(option: OptionItem) {\n if (isOptionDisabled(option)) return;\n emit(\"update:modelValue\", option.value);\n }\n\n function onKeydown(event: KeyboardEvent, option: OptionItem) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n selectOption(option);\n }\n }\n</script>\n\n<template>\n <div\n role=\"radiogroup\"\n :class=\"inline ? 'flex flex-wrap gap-4' : 'flex flex-col gap-2'\"\n >\n <label\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :class=\"[\n 'inline-flex items-center gap-2 select-none',\n isOptionDisabled(option) ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n ]\"\n >\n <input\n type=\"radio\"\n :checked=\"isSelected(option.value)\"\n :disabled=\"isOptionDisabled(option)\"\n class=\"sr-only\"\n @change=\"selectOption(option)\"\n @blur=\"emit('blur', $event)\"\n />\n <div\n role=\"radio\"\n :aria-checked=\"isSelected(option.value)\"\n :aria-disabled=\"isOptionDisabled(option) || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors duration-200',\n !isSelected(option.value) ? 'border-gray-300' : '',\n ]\"\n :style=\"isSelected(option.value) ? { borderColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"selectOption(option)\"\n @keydown=\"onKeydown($event, option)\"\n >\n <div\n v-if=\"isSelected(option.value)\"\n class=\"h-2.5 w-2.5 rounded-full\"\n :style=\"{ backgroundColor: 'var(--fc-color-primary, #3b82f6)' }\"\n />\n </div>\n <span class=\"text-sm text-gray-700\">{{ option.label }}</span>\n </label>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n import type { OptionItem } from \"../../types/schema\";\n\n type SelectValue = string | number | boolean | Array<string | number | boolean> | null;\n\n const props = withDefaults(\n defineProps<{\n modelValue: SelectValue;\n options: OptionItem[];\n multiple?: boolean;\n searchable?: boolean;\n clearable?: boolean;\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n multiple: false,\n searchable: false,\n clearable: false,\n placeholder: \"Select...\",\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: SelectValue];\n blur: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const isOpen = ref(false);\n const search = ref(\"\");\n const highlightedIndex = ref(-1);\n const containerRef = ref<HTMLDivElement | null>(null);\n const searchInputRef = ref<HTMLInputElement | null>(null);\n\n const selectedValues = computed<Array<string | number | boolean>>(() => {\n if (props.modelValue === null || props.modelValue === undefined) return [];\n if (Array.isArray(props.modelValue)) return props.modelValue;\n return [props.modelValue];\n });\n\n const displayLabel = computed(() => {\n if (selectedValues.value.length === 0) return \"\";\n if (props.multiple) return \"\";\n const opt = props.options.find((o) => o.value === selectedValues.value[0]);\n return opt?.label ?? String(selectedValues.value[0]);\n });\n\n const filteredOptions = computed(() => {\n if (!search.value) return props.options;\n const q = search.value.toLowerCase();\n return props.options.filter((o) => o.label.toLowerCase().includes(q));\n });\n\n function isSelected(value: string | number | boolean): boolean {\n return selectedValues.value.includes(value);\n }\n\n function toggle() {\n if (props.disabled) return;\n isOpen.value ? close() : open();\n }\n\n function open() {\n isOpen.value = true;\n highlightedIndex.value = -1;\n search.value = \"\";\n nextTick(() => searchInputRef.value?.focus());\n }\n\n function close() {\n isOpen.value = false;\n search.value = \"\";\n }\n\n function selectOption(option: OptionItem) {\n if (option.disabled) return;\n if (props.multiple) {\n const arr = [...selectedValues.value];\n const idx = arr.indexOf(option.value);\n if (idx >= 0) arr.splice(idx, 1);\n else arr.push(option.value);\n emit(\"update:modelValue\", arr);\n } else {\n emit(\"update:modelValue\", option.value);\n close();\n }\n }\n\n function removeTag(value: string | number | boolean) {\n if (props.disabled) return;\n const arr = selectedValues.value.filter((v) => v !== value);\n emit(\"update:modelValue\", arr.length ? arr : props.multiple ? [] : null);\n }\n\n function clear(event: MouseEvent) {\n event.stopPropagation();\n emit(\"update:modelValue\", props.multiple ? [] : null);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (!isOpen.value) {\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"ArrowDown\") {\n event.preventDefault();\n open();\n }\n return;\n }\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1,\n );\n break;\n case \"ArrowUp\":\n event.preventDefault();\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);\n break;\n case \"Enter\":\n event.preventDefault();\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[highlightedIndex.value]);\n }\n break;\n case \"Escape\":\n event.preventDefault();\n close();\n break;\n }\n }\n\n function onClickOutside(event: MouseEvent) {\n if (containerRef.value && !containerRef.value.contains(event.target as Node)) {\n close();\n }\n }\n\n function tagLabel(value: string | number | boolean): string {\n const opt = props.options.find((o) => o.value === value);\n return opt?.label ?? String(value);\n }\n\n onMounted(() => document.addEventListener(\"mousedown\", onClickOutside));\n onBeforeUnmount(() => document.removeEventListener(\"mousedown\", onClickOutside));\n\n watch(isOpen, (val) => {\n if (!val) emit(\"blur\", new FocusEvent(\"blur\"));\n });\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[\n 'relative w-full',\n theme.classes.value.input,\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n ]\"\n >\n <!-- Trigger -->\n <div\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"listbox\"\n tabindex=\"0\"\n :class=\"[\n 'flex min-h-[38px] w-full cursor-pointer items-center rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm',\n 'transition-colors duration-200',\n !isOpen ? '' : 'ring-2 ring-blue-500/20',\n disabled ? 'pointer-events-none bg-gray-100' : '',\n ]\"\n :style=\"isOpen ? { borderColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggle\"\n @keydown=\"onKeydown\"\n >\n <div class=\"flex flex-1 flex-wrap items-center gap-1\">\n <!-- Multiple tags -->\n <template v-if=\"multiple\">\n <span\n v-for=\"val in selectedValues\"\n :key=\"String(val)\"\n class=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs\"\n :style=\"{ backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 15%, white)', color: 'var(--fc-color-primary, #3b82f6)' }\"\n >\n {{ tagLabel(val) }}\n <button\n type=\"button\"\n class=\"ml-0.5\"\n :style=\"{ color: 'var(--fc-color-primary, #3b82f6)' }\"\n aria-label=\"Remove\"\n @click.stop=\"removeTag(val)\"\n >\n ×\n </button>\n </span>\n </template>\n <!-- Single display -->\n <span v-else-if=\"displayLabel\" class=\"truncate\">{{ displayLabel }}</span>\n <!-- Placeholder -->\n <span v-else class=\"text-gray-400\">{{ placeholder }}</span>\n </div>\n <!-- Clear button -->\n <button\n v-if=\"clearable && selectedValues.length > 0 && !disabled\"\n type=\"button\"\n class=\"ml-1 shrink-0 text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n aria-label=\"Clear selection\"\n @click=\"clear\"\n >\n ×\n </button>\n <!-- Chevron -->\n <svg\n class=\"ml-1 h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200\"\n :class=\"isOpen ? 'rotate-180' : ''\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <!-- Dropdown -->\n <div\n v-if=\"isOpen\"\n class=\"absolute z-50 mt-1 w-full rounded-md border border-gray-200 bg-white shadow-lg\"\n >\n <!-- Search -->\n <div v-if=\"searchable\" class=\"border-b border-gray-200 p-2\">\n <input\n ref=\"searchInputRef\"\n v-model=\"search\"\n type=\"text\"\n class=\"w-full rounded border border-gray-300 px-2 py-1 text-sm focus:outline-none fc-select-search\"\n placeholder=\"Search...\"\n @keydown=\"onKeydown\"\n />\n </div>\n <!-- Options list -->\n <ul role=\"listbox\" class=\"max-h-60 overflow-auto py-1\">\n <li\n v-for=\"(option, idx) in filteredOptions\"\n :key=\"String(option.value)\"\n role=\"option\"\n :aria-selected=\"isSelected(option.value)\"\n :class=\"[\n 'cursor-pointer px-3 py-2 text-sm transition-colors duration-200',\n !isSelected(option.value) ? 'text-gray-900' : '',\n highlightedIndex === idx ? 'bg-gray-100' : '',\n option.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-gray-50',\n ]\"\n :style=\"isSelected(option.value) ? { backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)', color: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = idx\"\n >\n {{ option.label }}\n </li>\n <li v-if=\"filteredOptions.length === 0\" class=\"px-3 py-2 text-sm text-gray-400\">\n No options found\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fc-select-search:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: number;\n min?: number;\n max?: number;\n step?: number;\n showTooltip?: boolean;\n disabled?: boolean;\n }>(),\n {\n min: 0,\n max: 100,\n step: 1,\n showTooltip: true,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: number];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const isActive = ref(false);\n\n const percentage = computed(() => {\n const range = props.max - props.min;\n if (range === 0) return 0;\n return ((props.modelValue - props.min) / range) * 100;\n });\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit(\"update:modelValue\", parseFloat(target.value));\n }\n</script>\n\n<template>\n <div\n :class=\"[\n 'relative w-full py-2',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n ]\"\n >\n <!-- Tooltip -->\n <div\n v-if=\"showTooltip && isActive\"\n class=\"absolute -top-8 rounded bg-gray-800 px-2 py-1 text-xs text-white shadow-sm transition-opacity duration-200\"\n :style=\"{ left: `calc(${percentage}% - 16px)` }\"\n >\n {{ modelValue }}\n </div>\n <input\n type=\"range\"\n :value=\"modelValue\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-valuenow=\"modelValue\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-disabled=\"disabled || undefined\"\n class=\"h-2 w-full cursor-pointer appearance-none rounded-full bg-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500/20 disabled:pointer-events-none\"\n :style=\"{ accentColor: 'var(--fc-color-primary, #3b82f6)' }\"\n @input=\"onInput\"\n @mousedown=\"isActive = true\"\n @mouseup=\"isActive = false\"\n @touchstart=\"isActive = true\"\n @touchend=\"isActive = false\"\n @focus=\"isActive = true\"\n @blur=\"isActive = false; emit('blur', $event)\"\n />\n <!-- Min/Max labels -->\n <div class=\"mt-1 flex justify-between text-xs text-gray-400\">\n <span>{{ min }}</span>\n <span>{{ max }}</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: boolean;\n activeLabel?: string;\n inactiveLabel?: string;\n disabled?: boolean;\n }>(),\n {\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: boolean];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const wrapperClasses = computed(() => [\n \"inline-flex items-center gap-2 select-none\",\n props.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n ]);\n\n function toggle() {\n if (props.disabled) return;\n emit(\"update:modelValue\", !props.modelValue);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggle();\n }\n }\n</script>\n\n<template>\n <label :class=\"wrapperClasses\">\n <span v-if=\"inactiveLabel\" class=\"text-sm text-gray-600\">{{ inactiveLabel }}</span>\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n class=\"sr-only\"\n @change=\"toggle\"\n @blur=\"emit('blur', $event)\"\n />\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'relative inline-flex h-6 w-11 shrink-0 rounded-full border-2 border-transparent transition-colors duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)]',\n !modelValue ? 'bg-gray-300' : '',\n disabled ? 'pointer-events-none' : 'focus:outline-none focus:ring-2 focus:ring-blue-500/20',\n ]\"\n :style=\"modelValue ? { backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggle\"\n @keydown=\"onKeydown\"\n >\n <span\n :class=\"[\n 'pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm transition-transform duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)]',\n modelValue ? 'translate-x-5' : 'translate-x-0',\n ]\"\n aria-hidden=\"true\"\n />\n </button>\n <span v-if=\"activeLabel\" class=\"text-sm text-gray-600\">{{ activeLabel }}</span>\n </label>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string[] | null;\n maxTags?: number;\n suggestions?: string[];\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n modelValue: () => [],\n suggestions: () => [],\n placeholder: \"Add a tag...\",\n disabled: false,\n },\n );\n\n const tags = computed(() => (Array.isArray(props.modelValue) ? props.modelValue : []));\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string[]];\n blur: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const inputValue = ref(\"\");\n const isFocused = ref(false);\n const showSuggestions = ref(false);\n const highlightedIndex = ref(-1);\n const containerRef = ref<HTMLDivElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n\n const canAdd = computed(() => !props.maxTags || tags.value.length < props.maxTags);\n\n const filteredSuggestions = computed(() => {\n if (!inputValue.value || props.suggestions.length === 0) return [];\n const q = inputValue.value.toLowerCase();\n return props.suggestions.filter(\n (s) => s.toLowerCase().includes(q) && !tags.value.includes(s),\n );\n });\n\n function addTag(tag: string) {\n const trimmed = tag.trim();\n if (!trimmed || !canAdd.value || tags.value.includes(trimmed)) return;\n emit(\"update:modelValue\", [...tags.value, trimmed]);\n inputValue.value = \"\";\n showSuggestions.value = false;\n highlightedIndex.value = -1;\n }\n\n function removeTag(index: number) {\n if (props.disabled) return;\n const updated = tags.value.filter((_, i) => i !== index);\n emit(\"update:modelValue\", updated);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n if (highlightedIndex.value >= 0 && filteredSuggestions.value[highlightedIndex.value]) {\n addTag(filteredSuggestions.value[highlightedIndex.value]);\n } else {\n addTag(inputValue.value);\n }\n return;\n }\n if (event.key === \"Backspace\" && inputValue.value === \"\" && tags.value.length > 0) {\n removeTag(tags.value.length - 1);\n return;\n }\n if (event.key === \"ArrowDown\" && showSuggestions.value) {\n event.preventDefault();\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredSuggestions.value.length - 1,\n );\n return;\n }\n if (event.key === \"ArrowUp\" && showSuggestions.value) {\n event.preventDefault();\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);\n return;\n }\n if (event.key === \"Escape\") {\n showSuggestions.value = false;\n highlightedIndex.value = -1;\n }\n }\n\n function onInput() {\n showSuggestions.value = inputValue.value.length > 0 && filteredSuggestions.value.length > 0;\n highlightedIndex.value = -1;\n }\n\n function onClickOutside(event: MouseEvent) {\n if (containerRef.value && !containerRef.value.contains(event.target as Node)) {\n showSuggestions.value = false;\n }\n }\n\n onMounted(() => document.addEventListener(\"mousedown\", onClickOutside));\n onBeforeUnmount(() => document.removeEventListener(\"mousedown\", onClickOutside));\n\n watch(inputValue, () => {\n nextTick(onInput);\n });\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[\n 'relative w-full',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n ]\"\n >\n <div\n :class=\"[\n 'flex flex-wrap items-center gap-1.5 rounded-md border bg-white px-2 py-1.5 text-sm transition-colors duration-200',\n !isFocused ? 'border-gray-300' : 'ring-2 ring-blue-500/20',\n theme.classes.value.input,\n ]\"\n :style=\"isFocused ? { borderColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"inputRef?.focus()\"\n >\n <!-- Tags -->\n <span\n v-for=\"(tag, idx) in tags\"\n :key=\"tag\"\n class=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs\"\n :style=\"{ backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 15%, white)', color: 'var(--fc-color-primary, #3b82f6)' }\"\n >\n {{ tag }}\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"ml-0.5 transition-colors duration-200\"\n :style=\"{ color: 'var(--fc-color-primary, #3b82f6)' }\"\n aria-label=\"Remove tag\"\n @click.stop=\"removeTag(idx)\"\n >\n ×\n </button>\n </span>\n <!-- Input -->\n <input\n ref=\"inputRef\"\n v-model=\"inputValue\"\n type=\"text\"\n :placeholder=\"tags.length === 0 ? placeholder : ''\"\n :disabled=\"disabled\"\n class=\"min-w-[80px] flex-1 border-0 bg-transparent p-0 text-sm outline-none placeholder:text-gray-400\"\n @keydown=\"onKeydown\"\n @focus=\"isFocused = true\"\n @blur=\"isFocused = false; emit('blur', $event)\"\n />\n </div>\n\n <!-- Suggestions dropdown -->\n <ul\n v-if=\"showSuggestions && filteredSuggestions.length > 0\"\n class=\"absolute z-50 mt-1 w-full rounded-md border border-gray-200 bg-white py-1 shadow-lg\"\n role=\"listbox\"\n >\n <li\n v-for=\"(suggestion, idx) in filteredSuggestions\"\n :key=\"suggestion\"\n role=\"option\"\n :aria-selected=\"highlightedIndex === idx\"\n :class=\"[\n 'cursor-pointer px-3 py-2 text-sm transition-colors duration-200',\n highlightedIndex !== idx ? 'text-gray-900 hover:bg-gray-50' : '',\n ]\"\n :style=\"highlightedIndex === idx ? { backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)', color: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @mousedown.prevent=\"addTag(suggestion)\"\n @mouseenter=\"highlightedIndex = idx\"\n >\n {{ suggestion }}\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onMounted, ref, watch } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n rows?: number;\n autoResize?: boolean;\n maxLength?: number;\n placeholder?: string;\n disabled?: boolean;\n readonly?: boolean;\n }>(),\n {\n rows: 3,\n autoResize: false,\n placeholder: \"\",\n disabled: false,\n readonly: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n const textareaRef = ref<HTMLTextAreaElement | null>(null);\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"placeholder:text-gray-400 resize-y\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-textarea-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n props.autoResize ? \"resize-none overflow-hidden\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function adjustHeight() {\n if (!props.autoResize || !textareaRef.value) return;\n const el = textareaRef.value;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }\n\n function onInput(event: Event) {\n const target = event.target as HTMLTextAreaElement;\n emit(\"update:modelValue\", target.value);\n if (props.autoResize) nextTick(adjustHeight);\n }\n\n watch(\n () => props.modelValue,\n () => {\n if (props.autoResize) nextTick(adjustHeight);\n },\n );\n\n onMounted(() => {\n if (props.autoResize) adjustHeight();\n });\n</script>\n\n<template>\n <textarea\n ref=\"textareaRef\"\n :value=\"modelValue\"\n :rows=\"rows\"\n :maxlength=\"maxLength\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-textarea-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n inputType?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\";\n placeholder?: string;\n maxLength?: number;\n prefix?: string;\n suffix?: string;\n disabled?: boolean;\n readonly?: boolean;\n mask?: string;\n }>(),\n {\n inputType: \"text\",\n placeholder: \"\",\n disabled: false,\n readonly: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const hasAddons = computed(() => !!props.prefix || !!props.suffix);\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"placeholder:text-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-text-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n props.prefix ? \"rounded-l-none\" : \"\",\n props.suffix ? \"rounded-r-none\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit(\"update:modelValue\", target.value);\n }\n</script>\n\n<template>\n <div v-if=\"hasAddons\" class=\"flex items-stretch\">\n <span\n v-if=\"prefix\"\n class=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ prefix }}\n </span>\n <input\n :type=\"inputType\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxLength\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n <span\n v-if=\"suffix\"\n class=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ suffix }}\n </span>\n </div>\n <input\n v-else\n :type=\"inputType\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxLength\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-text-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed, inject, ref } from \"vue\";\n import { type FormI18nInstance, FormI18nKey } from \"../core/useFormI18n\";\n import { FormThemeKey, type ThemeInstance } from \"../core/useTheme\";\n import type { FieldBase } from \"@formatica/core\";\n\n const props = withDefaults(\n defineProps<{\n fieldSchema: FieldBase;\n fieldName: string;\n errors: string[];\n touched: boolean;\n }>(),\n {\n errors: () => [],\n touched: false,\n },\n );\n\n const i18n = inject<FormI18nInstance>(FormI18nKey);\n const theme = inject<ThemeInstance>(FormThemeKey);\n\n const showTooltip = ref(false);\n\n const label = computed(() => {\n if (i18n) {\n const translated = i18n.t(props.fieldName, \"label\");\n if (translated) return translated;\n }\n return props.fieldSchema.label ?? props.fieldName;\n });\n\n const helpText = computed(() => {\n if (i18n) {\n const translated = i18n.t(props.fieldName, \"helpText\");\n if (translated) return translated;\n }\n return props.fieldSchema.helpText ?? \"\";\n });\n\n const tooltip = computed(() => {\n if (i18n) {\n const translated = i18n.t(props.fieldName, \"tooltip\");\n if (translated) return translated;\n }\n return props.fieldSchema.tooltip ?? \"\";\n });\n\n const hasErrors = computed(() => props.touched && props.errors.length > 0);\n\n const wrapperClasses = computed(() => [\n theme?.classes.value.field ?? \"fc-field\",\n props.fieldSchema.className ?? \"\",\n props.fieldSchema.disabled ? \"opacity-50 cursor-not-allowed\" : \"\",\n props.fieldSchema.readOnly ? \"fc-readonly\" : \"\",\n ]);\n\n const fieldId = computed(() => `fc-field-${props.fieldName}`);\n const errorId = computed(() => `fc-error-${props.fieldName}`);\n</script>\n\n<template>\n <div\n :class=\"wrapperClasses\"\n :style=\"fieldSchema.style\"\n class=\"relative mb-4\"\n >\n <!-- Label row -->\n <div\n v-if=\"fieldSchema.type !== 'hidden'\"\n class=\"mb-1.5 flex items-center gap-1\"\n >\n <label\n :for=\"fieldId\"\n :class=\"theme?.classes.value.label ?? 'fc-label'\"\n class=\"block text-sm font-medium text-gray-700\"\n >\n {{ label }}\n <span\n v-if=\"fieldSchema.required\"\n class=\"text-red-500 ml-0.5\"\n aria-hidden=\"true\"\n >*</span>\n </label>\n\n <!-- Tooltip icon -->\n <span\n v-if=\"tooltip\"\n class=\"relative inline-flex\"\n @mouseenter=\"showTooltip = true\"\n @mouseleave=\"showTooltip = false\"\n @focusin=\"showTooltip = true\"\n @focusout=\"showTooltip = false\"\n >\n <button\n type=\"button\"\n class=\"inline-flex h-4 w-4 items-center justify-center rounded-full bg-gray-200 text-gray-500 text-xs hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n :aria-label=\"`Info: ${tooltip}`\"\n tabindex=\"0\"\n >\n i\n </button>\n <Transition\n enter-active-class=\"motion-safe:transition motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"motion-safe:transition motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"showTooltip\"\n role=\"tooltip\"\n class=\"absolute bottom-full left-1/2 z-10 mb-2 -translate-x-1/2 rounded-md bg-gray-900 px-3 py-1.5 text-xs text-white shadow-lg whitespace-nowrap\"\n >\n {{ tooltip }}\n <div class=\"absolute left-1/2 top-full -translate-x-1/2 border-4 border-transparent border-t-gray-900\" />\n </div>\n </Transition>\n </span>\n </div>\n\n <!-- Input slot -->\n <div :id=\"fieldId\">\n <slot />\n </div>\n\n <!-- Error messages -->\n <TransitionGroup\n tag=\"div\"\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 -translate-y-1 max-h-0\"\n enter-to-class=\"opacity-100 translate-y-0 max-h-8\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 translate-y-0 max-h-8\"\n leave-to-class=\"opacity-0 -translate-y-1 max-h-0\"\n class=\"\"\n >\n <p\n v-for=\"(error, idx) in (hasErrors ? errors : [])\"\n :key=\"error + idx\"\n :id=\"idx === 0 ? errorId : undefined\"\n :class=\"theme?.classes.value.error ?? 'fc-error'\"\n class=\"mt-1 text-xs text-red-500\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n </TransitionGroup>\n\n <!-- Help text -->\n <p\n v-if=\"helpText && !hasErrors\"\n :class=\"theme?.classes.value.helpText ?? 'fc-help-text'\"\n class=\"mt-1 text-xs text-gray-400\"\n >\n {{ helpText }}\n </p>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { Component, ComputedRef } from \"vue\";\n import { computed, inject } from \"vue\";\n import { FormComponentsKey, getFieldComponent } from \"../core/fieldRegistry\";\n import type { FieldSchema } from \"@formatica/core\";\n import { evaluateCondition, extractFields } from \"@formatica/core\";\n import { FormContextKey } from \"../core/useForm\";\n import type { FormInstance } from \"../types/form\";\n import BaseField from \"./BaseField.vue\";\n\n const props = defineProps<{\n name: string;\n }>();\n\n const form = inject<FormInstance>(FormContextKey);\n if (!form) {\n throw new Error(\n \"FormField must be used inside a FormBuilder (FormContextKey not provided)\",\n );\n }\n\n // Per-instance component overrides from FormBuilder's `components` prop\n const componentOverrides = inject<ComputedRef<Record<string, Component>> | null>(\n FormComponentsKey,\n null,\n );\n\n const fieldSchema = computed<FieldSchema | undefined>(() =>\n extractFields(form.schema.fields).find((f) => f.name === props.name),\n );\n\n const inputComponent = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return undefined;\n // 1. Per-instance override (components prop on FormBuilder)\n const override = componentOverrides?.value?.[schema.type];\n if (override) return override;\n // 2. Global registry\n return getFieldComponent(schema.type);\n });\n\n const fieldValue = computed(() => form.values[props.name]);\n const fieldErrors = computed(() => form.errors[props.name] ?? []);\n const fieldTouched = computed(() => form.touched[props.name] ?? false);\n\n const isVisible = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return false;\n\n if (schema.condition) {\n return evaluateCondition(schema.condition, form.values);\n }\n if (typeof schema.visible === \"function\") {\n return schema.visible({\n values: { ...form.values },\n getFieldValue: (name: string) => form.values[name],\n });\n }\n return schema.visible ?? true;\n });\n\n const isDisabled = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return false;\n\n if (typeof schema.disabled === \"function\") {\n return schema.disabled({\n values: { ...form.values },\n getFieldValue: (name: string) => form.values[name],\n });\n }\n return schema.disabled ?? false;\n });\n\n const inputProps = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return {};\n\n const {\n name: _,\n label: _l,\n helpText: _h,\n tooltip: _t,\n condition: _c,\n translations: _tr,\n meta: _m,\n rules: _r,\n visible: _v,\n className: _cn,\n style: _s,\n defaultValue: _dv,\n ...rest\n } = schema;\n\n return {\n ...rest,\n modelValue: fieldValue.value,\n disabled: isDisabled.value,\n readonly: schema.readOnly ?? false,\n placeholder: schema.placeholder ?? \"\",\n };\n });\n\n function onUpdateModelValue(value: unknown) {\n form.setFieldValue(props.name, value);\n }\n\n function onBlur() {\n form.touched[props.name] = true;\n if (form.schema.settings?.validateOnBlur !== false) {\n form.validateField(props.name);\n }\n }\n</script>\n\n<template>\n <Transition\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-300 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 max-h-0\"\n enter-to-class=\"opacity-100 max-h-96\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 max-h-96\"\n leave-to-class=\"opacity-0 max-h-0\"\n >\n <BaseField\n v-if=\"isVisible && fieldSchema\"\n :field-schema=\"fieldSchema\"\n :field-name=\"name\"\n :errors=\"fieldErrors\"\n :touched=\"fieldTouched\"\n >\n <component\n :is=\"inputComponent\"\n v-if=\"inputComponent\"\n v-bind=\"inputProps\"\n :aria-invalid=\"fieldTouched && fieldErrors.length > 0 ? true : undefined\"\n :aria-describedby=\"fieldTouched && fieldErrors.length > 0 ? `fc-error-${name}` : undefined\"\n @update:model-value=\"onUpdateModelValue\"\n @blur=\"onBlur\"\n />\n <div\n v-else\n class=\"rounded-md border border-dashed border-amber-400 bg-amber-50 px-3 py-2 text-xs text-amber-700\"\n >\n No component registered for field type \"{{ fieldSchema.type }}\"\n </div>\n </BaseField>\n </Transition>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n label?: string;\n className?: string;\n }>();\n</script>\n\n<template>\n <div\n :class=\"className ?? ''\"\n class=\"relative my-4\"\n role=\"separator\"\n >\n <div class=\"absolute inset-0 flex items-center\" aria-hidden=\"true\">\n <div class=\"w-full border-t border-gray-200\" />\n </div>\n <div v-if=\"label\" class=\"relative flex justify-center\">\n <span class=\"bg-white px-3 text-xs text-gray-500\">\n {{ label }}\n </span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import type { SchemaNode } from \"../../types/schema\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = withDefaults(\n defineProps<{\n title?: string;\n description?: string;\n collapsible?: boolean;\n collapsed?: boolean;\n children: SchemaNode[];\n className?: string;\n }>(),\n {\n collapsible: false,\n collapsed: false,\n },\n );\n\n const isCollapsed = ref(props.collapsed);\n\n function toggle() {\n if (props.collapsible) {\n isCollapsed.value = !isCollapsed.value;\n }\n }\n\n const headerId = computed(() =>\n props.title ? `fc-group-${props.title.toLowerCase().replace(/\\s+/g, \"-\")}` : undefined,\n );\n</script>\n\n<template>\n <fieldset\n :class=\"[className ?? '']\"\n class=\"rounded-lg border border-gray-200 bg-white\"\n :aria-labelledby=\"headerId\"\n >\n <!-- Header -->\n <div\n v-if=\"title || description\"\n class=\"border-b border-gray-100 px-4 py-3\"\n >\n <component\n :is=\"collapsible ? 'button' : 'div'\"\n :type=\"collapsible ? 'button' : undefined\"\n class=\"flex w-full items-center justify-between text-left\"\n :class=\"collapsible ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-500/40 rounded' : ''\"\n :aria-expanded=\"collapsible ? !isCollapsed : undefined\"\n :aria-controls=\"collapsible ? `fc-group-body-${headerId}` : undefined\"\n @click=\"toggle\"\n >\n <div>\n <legend\n v-if=\"title\"\n :id=\"headerId\"\n class=\"text-sm font-semibold text-gray-800\"\n >\n {{ title }}\n </legend>\n <p v-if=\"description\" class=\"mt-0.5 text-xs text-gray-500\">\n {{ description }}\n </p>\n </div>\n <svg\n v-if=\"collapsible\"\n class=\"h-4 w-4 shrink-0 text-gray-400 motion-safe:transition-transform motion-safe:duration-200\"\n :class=\"isCollapsed ? '' : 'rotate-180'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </component>\n </div>\n\n <!-- Body with accordion animation -->\n <Transition\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-300 motion-safe:ease-out\"\n enter-from-class=\"max-h-0 opacity-0 overflow-hidden\"\n enter-to-class=\"max-h-[2000px] opacity-100 overflow-hidden\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-in\"\n leave-from-class=\"max-h-[2000px] opacity-100 overflow-hidden\"\n leave-to-class=\"max-h-0 opacity-0 overflow-hidden\"\n >\n <div\n v-show=\"!isCollapsed\"\n :id=\"collapsible ? `fc-group-body-${headerId}` : undefined\"\n class=\"p-4\"\n >\n <LayoutRenderer :nodes=\"children\" />\n </div>\n </Transition>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { sanitizeHtml } from \"../../utils/sanitize\";\n\n const props = defineProps<{\n content: string;\n className?: string;\n }>();\n\n const sanitized = computed(() => sanitizeHtml(props.content));\n</script>\n\n<template>\n <div\n :class=\"className ?? ''\"\n class=\"fc-html prose prose-sm max-w-none text-gray-700\"\n v-html=\"sanitized\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import type { SchemaNode } from \"../../types/schema\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = withDefaults(\n defineProps<{\n children: SchemaNode[];\n gap?: string | number;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n className?: string;\n }>(),\n {\n align: \"stretch\",\n },\n );\n\n const alignClass = computed(() => {\n const map: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n };\n return map[props.align] ?? \"items-stretch\";\n });\n\n const gapStyle = computed(() => {\n if (!props.gap) return \"\";\n return typeof props.gap === \"number\" ? `${props.gap}px` : props.gap;\n });\n</script>\n\n<template>\n <div\n class=\"grid grid-cols-12\"\n :class=\"[alignClass, className ?? '']\"\n :style=\"gapStyle ? { gap: gapStyle } : { gap: '1rem' }\"\n role=\"group\"\n >\n <LayoutRenderer :nodes=\"children\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, inject, ref } from \"vue\";\n import { FormContextKey } from \"../../core/useForm\";\n import type { FormInstance } from \"../../types/form\";\n import type { SchemaNode, StepNodeItem } from \"../../types/schema\";\n import { isFieldNode } from \"../../utils/extractFields\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = withDefaults(\n defineProps<{\n steps: StepNodeItem[];\n linear?: boolean;\n className?: string;\n }>(),\n {\n linear: false,\n },\n );\n\n const form = inject<FormInstance>(FormContextKey);\n\n const currentStep = ref(0);\n const completedSteps = ref<Set<number>>(new Set());\n\n const visibleSteps = computed(() => props.steps);\n\n const totalSteps = computed(() => visibleSteps.value.length);\n const isFirstStep = computed(() => currentStep.value === 0);\n const isLastStep = computed(() => currentStep.value === totalSteps.value - 1);\n\n function getStepFieldNames(step: StepNodeItem): string[] {\n const names: string[] = [];\n function collect(nodes: SchemaNode[]) {\n for (const node of nodes) {\n if (isFieldNode(node)) {\n names.push(node.name);\n } else if (node.type === \"row\" || node.type === \"group\") {\n collect(node.children);\n } else if (node.type === \"steps\") {\n for (const s of node.steps) collect(s.children);\n } else if (node.type === \"tabs\") {\n for (const t of node.tabs) collect(t.children);\n }\n }\n }\n collect(step.children);\n return names;\n }\n\n async function validateCurrentStep(): Promise<boolean> {\n if (!form || !props.linear) return true;\n const step = visibleSteps.value[currentStep.value];\n if (!step) return true;\n const fieldNames = getStepFieldNames(step);\n let allValid = true;\n for (const name of fieldNames) {\n const fieldErrors = await form.validateField(name);\n form.touched[name] = true;\n if (fieldErrors.length > 0) allValid = false;\n }\n return allValid;\n }\n\n async function goNext() {\n if (isLastStep.value) return;\n if (props.linear) {\n const valid = await validateCurrentStep();\n if (!valid) return;\n }\n completedSteps.value.add(currentStep.value);\n currentStep.value++;\n }\n\n function goPrevious() {\n if (isFirstStep.value) return;\n currentStep.value--;\n }\n\n function goToStep(index: number) {\n if (props.linear && index > currentStep.value) return;\n currentStep.value = index;\n }\n</script>\n\n<template>\n <div :class=\"className ?? ''\" class=\"space-y-6\">\n <!-- Progress indicator -->\n <nav aria-label=\"Form steps\" class=\"flex items-center justify-center\">\n <ol class=\"flex items-center gap-0\">\n <li\n v-for=\"(step, idx) in visibleSteps\"\n :key=\"idx\"\n class=\"flex items-center\"\n >\n <!-- Step circle -->\n <button\n type=\"button\"\n :disabled=\"linear && idx > currentStep\"\n :aria-current=\"idx === currentStep ? 'step' : undefined\"\n :aria-label=\"`Step ${idx + 1}: ${step.title}`\"\n class=\"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold motion-safe:transition-all motion-safe:duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n :class=\"[\n completedSteps.has(idx) && idx !== currentStep\n ? 'border-green-500 bg-green-500 text-white'\n : idx !== currentStep\n ? 'border-gray-300 bg-white text-gray-500'\n : 'text-white',\n linear && idx > currentStep ? 'cursor-not-allowed' : 'cursor-pointer hover:shadow-md',\n ]\"\n :style=\"idx === currentStep ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"goToStep(idx)\"\n >\n <!-- Checkmark for completed -->\n <svg\n v-if=\"completedSteps.has(idx) && idx !== currentStep\"\n class=\"h-4 w-4 motion-safe:transition-transform motion-safe:duration-200\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n <span v-else>{{ idx + 1 }}</span>\n </button>\n\n <!-- Connector line -->\n <div\n v-if=\"idx < visibleSteps.length - 1\"\n class=\"mx-1 h-0.5 w-8 motion-safe:transition-colors motion-safe:duration-300 sm:w-12\"\n :class=\"completedSteps.has(idx) ? 'bg-green-500' : 'bg-gray-200'\"\n />\n </li>\n </ol>\n </nav>\n\n <!-- Step title -->\n <div\n v-if=\"visibleSteps[currentStep]\"\n class=\"text-center\"\n >\n <h3 class=\"text-base font-semibold text-gray-800\">\n {{ visibleSteps[currentStep].title }}\n </h3>\n <p\n v-if=\"visibleSteps[currentStep].description\"\n class=\"mt-1 text-sm text-gray-500\"\n >\n {{ visibleSteps[currentStep].description }}\n </p>\n </div>\n\n <!-- Step content with transition -->\n <Transition\n mode=\"out-in\"\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <div\n v-if=\"visibleSteps[currentStep]\"\n :key=\"currentStep\"\n >\n <LayoutRenderer :nodes=\"visibleSteps[currentStep].children\" />\n </div>\n </Transition>\n\n <!-- Navigation buttons -->\n <div class=\"flex items-center justify-between border-t border-gray-100 pt-4\">\n <button\n type=\"button\"\n :disabled=\"isFirstStep\"\n class=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 motion-safe:transition-colors motion-safe:duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50 fc-steps-prev-btn\"\n @click=\"goPrevious\"\n >\n Previous\n </button>\n <span class=\"text-xs text-gray-400\">\n {{ currentStep + 1 }} / {{ totalSteps }}\n </span>\n <button\n v-if=\"!isLastStep\"\n type=\"button\"\n class=\"rounded-md px-4 py-2 text-sm font-medium text-white motion-safe:transition-colors motion-safe:duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 fc-steps-next-btn\"\n :style=\"{ backgroundColor: 'var(--fc-color-primary, #3b82f6)' }\"\n @click=\"goNext\"\n >\n Next\n </button>\n <div v-else class=\"w-[72px]\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import type { TabNodeItem } from \"../../types/schema\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = defineProps<{\n tabs: TabNodeItem[];\n className?: string;\n }>();\n\n const activeIndex = ref(0);\n\n const visibleTabs = computed(() => props.tabs);\n\n function selectTab(index: number) {\n const tab = visibleTabs.value[index];\n if (tab?.disabled) return;\n activeIndex.value = index;\n }\n\n function onKeydown(event: KeyboardEvent, index: number) {\n const count = visibleTabs.value.length;\n let nextIndex = index;\n\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n nextIndex = (index + 1) % count;\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n nextIndex = (index - 1 + count) % count;\n } else if (event.key === \"Home\") {\n event.preventDefault();\n nextIndex = 0;\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextIndex = count - 1;\n } else {\n return;\n }\n\n // Skip disabled tabs\n while (visibleTabs.value[nextIndex]?.disabled && nextIndex !== index) {\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n nextIndex = (nextIndex - 1 + count) % count;\n } else {\n nextIndex = (nextIndex + 1) % count;\n }\n }\n\n selectTab(nextIndex);\n const tabEl = document.getElementById(`fc-tab-${nextIndex}`);\n tabEl?.focus();\n }\n\n const tabPanelId = computed(() => `fc-tabpanel-${activeIndex.value}`);\n</script>\n\n<template>\n <div :class=\"className ?? ''\">\n <!-- Tab bar -->\n <div\n class=\"relative flex border-b border-gray-200\"\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n <button\n v-for=\"(tab, idx) in visibleTabs\"\n :key=\"idx\"\n :id=\"`fc-tab-${idx}`\"\n type=\"button\"\n role=\"tab\"\n :aria-selected=\"idx === activeIndex\"\n :aria-controls=\"tabPanelId\"\n :aria-disabled=\"tab.disabled || undefined\"\n :tabindex=\"idx === activeIndex ? 0 : -1\"\n class=\"relative px-4 py-2.5 text-sm font-medium motion-safe:transition-colors motion-safe:duration-150 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500/40\"\n :class=\"[\n idx !== activeIndex\n ? tab.disabled\n ? 'cursor-not-allowed text-gray-300'\n : 'text-gray-500 hover:text-gray-700'\n : '',\n ]\"\n :style=\"idx === activeIndex ? { color: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"selectTab(idx)\"\n @keydown=\"onKeydown($event, idx)\"\n >\n {{ tab.title }}\n <!-- Active underline indicator -->\n <span\n v-if=\"idx === activeIndex\"\n class=\"absolute inset-x-0 -bottom-px h-0.5 motion-safe:transition-all motion-safe:duration-200\"\n :style=\"{ backgroundColor: 'var(--fc-color-primary, #3b82f6)' }\"\n />\n </button>\n </div>\n\n <!-- Tab panel -->\n <Transition\n mode=\"out-in\"\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 translate-y-1\"\n enter-to-class=\"opacity-100 translate-y-0\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 translate-y-0\"\n leave-to-class=\"opacity-0 -translate-y-1\"\n >\n <div\n v-if=\"visibleTabs[activeIndex]\"\n :key=\"activeIndex\"\n :id=\"tabPanelId\"\n role=\"tabpanel\"\n :aria-labelledby=\"`fc-tab-${activeIndex}`\"\n tabindex=\"0\"\n class=\"pt-4\"\n >\n <LayoutRenderer :nodes=\"visibleTabs[activeIndex].children\" />\n </div>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { inject } from \"vue\";\n import { evaluateCondition } from \"../../core/useConditions\";\n import { FormContextKey } from \"../../core/useForm\";\n import type { FormInstance } from \"../../types/form\";\n import type { LayoutNode } from \"../../types/layout\";\n import type { SchemaNode } from \"../../types/schema\";\n import { isFieldNode } from \"../../utils/extractFields\";\n import FormField from \"../FormField.vue\";\n import FormDivider from \"./FormDivider.vue\";\n import FormGroup from \"./FormGroup.vue\";\n import FormHtml from \"./FormHtml.vue\";\n import FormRow from \"./FormRow.vue\";\n import FormSteps from \"./FormSteps.vue\";\n import FormTabs from \"./FormTabs.vue\";\n\n defineProps<{\n nodes: SchemaNode[] | LayoutNode[];\n }>();\n\n const form = inject<FormInstance>(FormContextKey);\n\n function isConditionalVisible(node: LayoutNode & { type: \"conditional\" }): boolean {\n if (!form) return true;\n return evaluateCondition(node.condition, form.values);\n }\n\n function getSpanStyle(span: number | string | undefined): Record<string, string> {\n if (span === \"full\") return { gridColumn: \"1 / -1\" };\n if (span === \"auto\") return { gridColumn: \"auto\" };\n if (typeof span === \"number\") return { gridColumn: `span ${span} / span ${span}` };\n // Default: full width when inside a grid (span 12)\n return { gridColumn: \"span 12 / span 12\" };\n }\n</script>\n\n<template>\n <template v-for=\"(node, index) in nodes\" :key=\"index\">\n <!-- Field node (SchemaNode with a name) -->\n <div\n v-if=\"isFieldNode(node as SchemaNode)\"\n :class=\"(node as any).className ?? ''\"\n :style=\"getSpanStyle((node as any).span)\"\n >\n <FormField :name=\"(node as any).name\" />\n </div>\n\n <!-- Legacy field reference (LayoutNode backwards compat) -->\n <div\n v-else-if=\"node.type === 'field'\"\n :class=\"(node as any).className ?? ''\"\n :style=\"getSpanStyle((node as any).span)\"\n >\n <FormField :name=\"(node as any).name\" />\n </div>\n\n <!-- Row -->\n <FormRow\n v-else-if=\"node.type === 'row'\"\n :children=\"(node as any).children\"\n :gap=\"(node as any).gap\"\n :align=\"(node as any).align\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Group -->\n <FormGroup\n v-else-if=\"node.type === 'group'\"\n :title=\"(node as any).title\"\n :description=\"(node as any).description\"\n :collapsible=\"(node as any).collapsible\"\n :collapsed=\"(node as any).collapsed\"\n :children=\"(node as any).children\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Steps -->\n <FormSteps\n v-else-if=\"node.type === 'steps'\"\n :steps=\"(node as any).steps\"\n :linear=\"(node as any).linear\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Tabs -->\n <FormTabs\n v-else-if=\"node.type === 'tabs'\"\n :tabs=\"(node as any).tabs\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Divider -->\n <FormDivider\n v-else-if=\"node.type === 'divider'\"\n :label=\"(node as any).label\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Html -->\n <FormHtml\n v-else-if=\"node.type === 'html'\"\n :content=\"(node as any).content\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Conditional (legacy LayoutNode) -->\n <template v-else-if=\"node.type === 'conditional'\">\n <LayoutRenderer\n v-if=\"isConditionalVisible(node as any)\"\n :nodes=\"(node as any).children\"\n />\n <LayoutRenderer\n v-else-if=\"(node as any).elseChildren?.length\"\n :nodes=\"(node as any).elseChildren\"\n />\n </template>\n </template>\n</template>\n","<script setup lang=\"ts\">\n import { type Component, computed, onMounted, inject, provide, toRef, watch } from \"vue\";\n import { FormComponentsKey, hasFieldType, registerFieldType } from \"../core/fieldRegistry\";\n import { useForm } from \"../core/useForm\";\n import { useFormI18nContext } from \"../core/useFormI18n\";\n import { useTheme, useThemeClasses } from \"../core/useTheme\";\n import { FormaticaKey } from \"../plugin\";\n import type { FormaticaOptions } from \"../plugin\";\n import type { FormSchema, LayoutSchema, SchemaNode, ThemeConfig } from \"@formatica/core\";\n import CheckboxGroupInput from \"./inputs/CheckboxGroupInput.vue\";\n import CheckboxInput from \"./inputs/CheckboxInput.vue\";\n import DateInput from \"./inputs/DateInput.vue\";\n import FileInput from \"./inputs/FileInput.vue\";\n import NumberInput from \"./inputs/NumberInput.vue\";\n import PhoneInput from \"./inputs/PhoneInput.vue\";\n import RadioInput from \"./inputs/RadioInput.vue\";\n import SelectInput from \"./inputs/SelectInput.vue\";\n import SliderInput from \"./inputs/SliderInput.vue\";\n import SwitchInput from \"./inputs/SwitchInput.vue\";\n import TagsInput from \"./inputs/TagsInput.vue\";\n import TextareaInput from \"./inputs/TextareaInput.vue\";\n // Built-in input components\n import TextInput from \"./inputs/TextInput.vue\";\n import LayoutRenderer from \"./layout/LayoutRenderer.vue\";\n\n const props = defineProps<{\n schema: FormSchema;\n layout?: LayoutSchema;\n locale?: string;\n fallbackLocale?: string;\n modelValue?: Record<string, unknown>;\n theme?: ThemeConfig;\n /** Override built-in components or register custom field types per instance. */\n components?: Record<string, Component>;\n }>();\n\n const emit = defineEmits<{\n submit: [values: Record<string, unknown>];\n error: [error: unknown];\n \"update:modelValue\": [values: Record<string, unknown>];\n }>();\n\n // Inject global plugin options (if installed via createFormatica)\n const globalOptions = inject<FormaticaOptions | undefined>(FormaticaKey, undefined);\n\n // Merge: props override globals\n const resolvedTheme = computed(() => props.theme ?? globalOptions?.theme);\n const resolvedLocale = computed(() => props.locale ?? globalOptions?.locale ?? \"en\");\n const resolvedFallbackLocale = computed(\n () => props.fallbackLocale ?? globalOptions?.fallbackLocale ?? \"en\",\n );\n const resolvedComponents = computed(() => props.components ?? globalOptions?.components ?? {});\n\n // Register built-in field types (idempotent)\n const builtInTypes: [string, typeof TextInput][] = [\n [\"text\", TextInput],\n [\"number\", NumberInput],\n [\"textarea\", TextareaInput],\n [\"select\", SelectInput],\n [\"checkbox\", CheckboxInput],\n [\"checkbox-group\", CheckboxGroupInput],\n [\"radio\", RadioInput],\n [\"switch\", SwitchInput],\n [\"date\", DateInput],\n [\"file\", FileInput],\n [\"slider\", SliderInput],\n [\"tags\", TagsInput],\n [\"phone\", PhoneInput],\n ];\n\n for (const [type, component] of builtInTypes) {\n if (!hasFieldType(type)) {\n registerFieldType(type, component);\n }\n }\n\n // Provide per-instance component overrides (merged with globals)\n provide(FormComponentsKey, resolvedComponents);\n\n // Initialize theme (provides FormThemeKey) — reactive to prop/global changes\n useTheme(resolvedTheme);\n const themeInstance = useThemeClasses();\n\n // Initialize form (provides FormContextKey and FormI18nKey)\n const form = useForm(props.schema, {\n locale: resolvedLocale.value,\n fallbackLocale: resolvedFallbackLocale.value,\n });\n\n // Sync external modelValue into form\n if (props.modelValue) {\n for (const [key, value] of Object.entries(props.modelValue)) {\n form.setFieldValue(key, value);\n }\n }\n\n // Watch modelValue for external changes\n watch(\n () => props.modelValue,\n (newValues) => {\n if (!newValues) return;\n for (const [key, value] of Object.entries(newValues)) {\n if (form.values[key] !== value) {\n form.setFieldValue(key, value);\n }\n }\n },\n { deep: true },\n );\n\n // Emit modelValue updates when form values change\n watch(\n () => ({ ...form.values }),\n (newValues) => {\n emit(\"update:modelValue\", newValues);\n },\n { deep: true },\n );\n\n // Watch locale changes (resolved from prop or global)\n watch(resolvedLocale, (newLocale) => {\n if (newLocale) form.setLocale(newLocale);\n });\n\n // I18n for form-level translations\n const i18n = useFormI18nContext();\n\n const formTitle = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"\";\n const loc = translations[resolvedLocale.value];\n if (loc?.messages?.title) return loc.messages.title;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.messages?.title ?? \"\";\n });\n\n const formDescription = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"\";\n const loc = translations[resolvedLocale.value];\n if (loc?.messages?.description) return loc.messages.description;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.messages?.description ?? \"\";\n });\n\n const submitLabel = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"Submit\";\n const loc = translations[resolvedLocale.value];\n if (loc?.submit) return loc.submit;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.submit ?? \"Submit\";\n });\n\n const resetLabel = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"Reset\";\n const loc = translations[resolvedLocale.value];\n if (loc?.reset) return loc.reset;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.reset ?? \"Reset\";\n });\n\n // Resolve layout: schema.fields is the unified tree (fields + containers).\n // Fall back to layout prop for backwards compat.\n const layoutNodes = computed<SchemaNode[]>(() => {\n if (props.layout?.nodes?.length) {\n return props.layout.nodes as unknown as SchemaNode[];\n }\n return props.schema.fields;\n });\n\n async function onSubmit() {\n try {\n await form.submit(async (values) => {\n emit(\"submit\", values);\n });\n } catch (error: unknown) {\n emit(\"error\", error);\n }\n }\n\n function onReset() {\n form.reset();\n }\n\n defineExpose({ form });\n</script>\n\n<template>\n <form\n :class=\"[themeInstance.classes.value.form, 'fc-form-builder']\"\n :style=\"themeInstance.cssVars.value\"\n novalidate\n @submit.prevent=\"onSubmit\"\n @reset.prevent=\"onReset\"\n >\n <!-- Form title / description -->\n <div v-if=\"formTitle || formDescription\" class=\"mb-6\">\n <h2\n v-if=\"formTitle\"\n class=\"text-lg font-semibold text-gray-900\"\n >\n {{ formTitle }}\n </h2>\n <p\n v-if=\"formDescription\"\n class=\"mt-1 text-sm text-gray-500\"\n >\n {{ formDescription }}\n </p>\n </div>\n\n <!-- Layout -->\n <LayoutRenderer :nodes=\"layoutNodes\" />\n\n <!-- Actions -->\n <div class=\"mt-6 flex items-center gap-3\">\n <button\n type=\"submit\"\n :disabled=\"form.isSubmitting.value\"\n :class=\"themeInstance.classes.value.button\"\n class=\"fc-submit-btn rounded-md px-4 py-2 text-sm font-medium text-white motion-safe:transition-colors motion-safe:duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n style=\"background-color: var(--fc-color-primary, #3b82f6)\"\n >\n <span\n v-if=\"form.isSubmitting.value\"\n class=\"mr-2 inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white border-t-transparent\"\n aria-hidden=\"true\"\n />\n {{ submitLabel }}\n </button>\n <button\n type=\"reset\"\n :disabled=\"form.isSubmitting.value\"\n class=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 motion-safe:transition-colors motion-safe:duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {{ resetLabel }}\n </button>\n </div>\n </form>\n</template>\n"],"names":["FormComponentsKey","registry","registerFieldType","type","component","unregisterFieldType","getFieldComponent","hasFieldType","getRegisteredFieldTypes","FormaticaKey","createFormatica","options","app","reactive","createEventBus","handlers","on","event","handler","set","emit","payload","FormI18nKey","defaultMessages","useFormI18n","locale","fallbackLocale","fieldTranslations","formTranslations","t","field","key","translations","localeData","value","fallbackData","titleCase","tOption","optionValue","_a","_b","tValidation","ruleName","params","localeMessages","interpolate","fallbackMessages","template","instance","provide","useFormI18nContext","inject","_","parseRuleString","input","segment","name","paramParts","values","normalizeRules","raw","rules","r","paramValue","debounce","fn","ms","timer","pendingResolve","args","resolve","result","useValidation","fields","settings","errors","ref","debouncedValidators","getDebounced","runValidateField","validator","ctx","f","fieldRules","fieldErrors","rule","condition","evaluateCondition","isEmpty","getRule","message","interpolateMessage","validateField","debounceMs","validateAll","results","promises","clearFieldErrors","clearAllErrors","FormContextKey","getTypeDefault","buildDefaults","collectFieldTranslations","map","useForm","schema","currentSchema","fieldsRef","extractFields","touched","dirty","isSubmitting","submitCount","isValid","computed","e","isDirty","bus","getFormContext","valuesRef","validation","initialValues","watch","newVals","oldVals","fieldInstances","buildFieldInstance","fs","n","v","initFieldInstances","validate","allErrors","errs","valid","submit","error","reset","clear","updateSchema","newSchema","newFields","newNames","messages","k","disabled","visible","l","FormThemeKey","defaultTheme","useTheme","config","themeRef","isRef","classes","comps","cssVars","vars","camelToKebab","useThemeClasses","injected","useThemeDefault","str","props","__props","__emit","isChecked","isOptionDisabled","option","toggleOption","arr","idx","onKeydown","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createElementVNode","$event","_cache","_normalizeStyle","_openBlock","_hoisted_3","_hoisted_4","_toDisplayString","wrapperClasses","toggle","theme","baseClasses","onInput","target","fileInputRef","isDragOver","files","formatSize","bytes","filterFiles","incoming","limit","remaining","addFiles","onFileChange","removeFile","index","updated","i","onDragOver","onDragLeave","onDrop","openPicker","_hoisted_2","file","_hoisted_5","_hoisted_6","_hoisted_7","_withModifiers","_hoisted_8","hasAddons","num","_hoisted_1","countryNames","countryFlag","code","c","allCountries","getCountries","getCountryCallingCode","a","b","selectedCountry","nationalNumber","dropdownOpen","search","searchInputRef","filteredCountries","q","selectedCountryData","onMounted","parseIncoming","val","parsed","parsePhoneNumber","emitValue","formatter","AsYouType","selectCountry","openDropdown","nextTick","closeDropdown","country","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","isSelected","selectOption","isOpen","highlightedIndex","containerRef","selectedValues","displayLabel","opt","o","filteredOptions","close","open","removeTag","onClickOutside","tagLabel","onBeforeUnmount","_unref","_hoisted_9","isActive","percentage","range","tags","inputValue","isFocused","showSuggestions","inputRef","canAdd","filteredSuggestions","s","addTag","tag","trimmed","_createTextVNode","suggestion","textareaRef","adjustHeight","el","i18n","showTooltip","label","translated","helpText","tooltip","hasErrors","fieldId","errorId","_createVNode","_Transition","_renderSlot","_ctx","_TransitionGroup","form","componentOverrides","fieldSchema","inputComponent","override","fieldValue","fieldTouched","isVisible","isDisabled","inputProps","_l","_h","_t","_c","_tr","_m","_r","_v","_cn","_s","_dv","rest","onUpdateModelValue","onBlur","_createBlock","BaseField","_resolveDynamicComponent","_mergeProps","isCollapsed","headerId","LayoutRenderer","sanitized","sanitizeHtml","alignClass","gapStyle","currentStep","completedSteps","visibleSteps","totalSteps","isFirstStep","isLastStep","getStepFieldNames","step","names","collect","nodes","node","isFieldNode","validateCurrentStep","fieldNames","allValid","goNext","goPrevious","goToStep","activeIndex","visibleTabs","selectTab","tab","count","nextIndex","tabEl","tabPanelId","isConditionalVisible","getSpanStyle","span","FormField","FormRow","FormGroup","FormSteps","FormTabs","FormDivider","FormHtml","_component_LayoutRenderer","globalOptions","resolvedTheme","resolvedLocale","resolvedFallbackLocale","resolvedComponents","builtInTypes","TextInput","NumberInput","TextareaInput","SelectInput","CheckboxInput","CheckboxGroupInput","RadioInput","SwitchInput","DateInput","FileInput","SliderInput","TagsInput","PhoneInput","themeInstance","newValues","newLocale","formTitle","loc","fb","formDescription","submitLabel","resetLabel","layoutNodes","onSubmit","onReset","__expose"],"mappings":"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MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,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"}
|
|
1
|
+
{"version":3,"file":"formatica.es.js","sources":["../src/core/fieldRegistry.ts","../src/core/eventBus.ts","../src/core/useFormI18n.ts","../src/core/useValidation.ts","../src/core/useForm.ts","../src/core/useTheme.ts","../src/plugin.ts","../src/components/inputs/CheckboxGroupInput.vue","../src/components/inputs/CheckboxInput.vue","../src/components/inputs/DateInput.vue","../src/components/inputs/FileInput.vue","../src/components/inputs/NumberInput.vue","../src/components/inputs/PhoneInput.vue","../src/components/inputs/RadioInput.vue","../src/components/inputs/SelectInput.vue","../src/components/inputs/SliderInput.vue","../src/components/inputs/SwitchInput.vue","../src/components/inputs/TagsInput.vue","../src/components/inputs/TextareaInput.vue","../src/components/inputs/TextInput.vue","../src/components/BaseField.vue","../src/components/FormField.vue","../src/components/layout/FormDivider.vue","../src/components/layout/FormGroup.vue","../src/components/layout/FormHtml.vue","../src/components/layout/FormRow.vue","../src/components/layout/FormSteps.vue","../src/components/layout/FormTabs.vue","../src/components/layout/LayoutRenderer.vue","../src/components/FormBuilder.vue"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Formatica – Field component registry\n// ---------------------------------------------------------------------------\n\nimport type { Component, ComputedRef, InjectionKey } from \"vue\";\n\n// ---------------------------------------------------------------------------\n// Per-instance component overrides (provided by FormBuilder)\n// ---------------------------------------------------------------------------\n\nexport const FormComponentsKey: InjectionKey<ComputedRef<Record<string, Component>>> =\n Symbol(\"FormaticaComponents\");\n\n// ---------------------------------------------------------------------------\n// Registry\n// ---------------------------------------------------------------------------\n\nconst registry = new Map<string, Component>();\n\n/**\n * Register a Vue component for a given field type.\n * If a component is already registered for that type, it will be replaced.\n */\nexport function registerFieldType(type: string, component: Component): void {\n registry.set(type, component);\n}\n\n/**\n * Unregister a field type component.\n */\nexport function unregisterFieldType(type: string): void {\n registry.delete(type);\n}\n\n/**\n * Retrieve the component registered for a given field type.\n */\nexport function getFieldComponent(type: string): Component | undefined {\n return registry.get(type);\n}\n\n/**\n * Check whether a component is registered for a given field type.\n */\nexport function hasFieldType(type: string): boolean {\n return registry.has(type);\n}\n\n/**\n * Return all registered field type names.\n */\nexport function getRegisteredFieldTypes(): string[] {\n return Array.from(registry.keys());\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Typed event bus\n// ---------------------------------------------------------------------------\n\nimport type { FormEventName, FormEventPayloadMap } from \"../types/form\";\n\ntype EventHandler<E extends FormEventName> = (payload: FormEventPayloadMap[E]) => void;\n\nexport interface EventBus {\n on: <E extends FormEventName>(event: E, handler: EventHandler<E>) => () => void;\n emit: <E extends FormEventName>(event: E, payload: FormEventPayloadMap[E]) => void;\n}\n\nexport function createEventBus(): EventBus {\n const handlers = new Map<FormEventName, Set<EventHandler<FormEventName>>>();\n\n function on<E extends FormEventName>(event: E, handler: EventHandler<E>): () => void {\n if (!handlers.has(event)) {\n handlers.set(event, new Set());\n }\n const set = handlers.get(event);\n if (!set) return () => {};\n set.add(handler as EventHandler<FormEventName>);\n return () => {\n set.delete(handler as EventHandler<FormEventName>);\n };\n }\n\n function emit<E extends FormEventName>(event: E, payload: FormEventPayloadMap[E]): void {\n const set = handlers.get(event);\n if (set) {\n for (const handler of set) {\n handler(payload);\n }\n }\n }\n\n return { on, emit };\n}\n","// ---------------------------------------------------------------------------\n// Formatica – I18n composable\n// ---------------------------------------------------------------------------\n\nimport type { FieldTranslations, FormTranslations } from \"@formatica/core\";\nimport { titleCase } from \"@formatica/core\";\nimport { type InjectionKey, inject, provide, type Ref } from \"vue\";\n\n// ---------------------------------------------------------------------------\n// Injection key\n// ---------------------------------------------------------------------------\n\nexport const FormI18nKey: InjectionKey<FormI18nInstance> = Symbol(\"FormaticaI18n\");\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface FormI18nInstance {\n locale: Ref<string>;\n fallbackLocale: string;\n t: (field: string, key: string) => string;\n tOption: (field: string, optionValue: string) => string;\n tValidation: (ruleName: string, params?: Record<string, unknown>) => string;\n}\n\nexport interface UseFormI18nOptions {\n locale: Ref<string>;\n fallbackLocale?: string;\n fieldTranslations?: Record<string, FieldTranslations>;\n formTranslations?: FormTranslations;\n}\n\n// ---------------------------------------------------------------------------\n// Default validation messages\n// ---------------------------------------------------------------------------\n\nconst defaultMessages: Record<string, string> = {\n required: \"This field is required\",\n email: \"Please enter a valid email address\",\n url: \"Please enter a valid URL\",\n min: \"Must be at least {min}\",\n max: \"Must be at most {max}\",\n minLength: \"Must be at least {min} characters\",\n maxLength: \"Must be at most {max} characters\",\n between: \"Must be between {min} and {max}\",\n pattern: \"Invalid format\",\n numeric: \"Must be a number\",\n integer: \"Must be an integer\",\n alpha: \"Must contain only letters\",\n alphaNumeric: \"Must contain only letters and numbers\",\n confirmed: \"Confirmation does not match\",\n date: \"Please enter a valid date\",\n};\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\nexport function useFormI18n(options: UseFormI18nOptions): FormI18nInstance {\n const {\n locale,\n fallbackLocale = \"en\",\n fieldTranslations = {},\n formTranslations = {},\n } = options;\n\n /**\n * Resolve a translated string for a field.\n * Resolution order: translations[locale] -> translations[fallback] -> titleCase(fieldName)\n */\n function t(field: string, key: string): string {\n const translations = fieldTranslations[field];\n if (translations) {\n const localeData = translations[locale.value];\n if (localeData) {\n const value = localeData[key as keyof typeof localeData];\n if (typeof value === \"string\") return value;\n }\n\n const fallbackData = translations[fallbackLocale];\n if (fallbackData) {\n const value = fallbackData[key as keyof typeof fallbackData];\n if (typeof value === \"string\") return value;\n }\n }\n\n // For labels, fall back to title-cased field name\n if (key === \"label\") return titleCase(field);\n return \"\";\n }\n\n /**\n * Resolve a translated option label.\n */\n function tOption(field: string, optionValue: string): string {\n const translations = fieldTranslations[field];\n if (translations) {\n const localeData = translations[locale.value];\n if (localeData?.options?.[optionValue]) return localeData.options[optionValue];\n\n const fallbackData = translations[fallbackLocale];\n if (fallbackData?.options?.[optionValue]) return fallbackData.options[optionValue];\n }\n return optionValue;\n }\n\n /**\n * Resolve a translated validation message with parameter interpolation.\n */\n function tValidation(ruleName: string, params?: Record<string, unknown>): string {\n // Check form-level translations first\n const localeMessages = formTranslations[locale.value]?.messages;\n if (localeMessages?.[ruleName]) {\n return interpolate(localeMessages[ruleName], params ?? {});\n }\n\n const fallbackMessages = formTranslations[fallbackLocale]?.messages;\n if (fallbackMessages?.[ruleName]) {\n return interpolate(fallbackMessages[ruleName], params ?? {});\n }\n\n // Default messages\n const template = defaultMessages[ruleName];\n if (template) return interpolate(template, params ?? {});\n\n return `Validation failed: ${ruleName}`;\n }\n\n const instance: FormI18nInstance = {\n locale,\n fallbackLocale,\n t,\n tOption,\n tValidation,\n };\n\n provide(FormI18nKey, instance);\n\n return instance;\n}\n\n/**\n * Inject the i18n instance provided by a parent useFormI18n call.\n */\nexport function useFormI18nContext(): FormI18nInstance | undefined {\n return inject(FormI18nKey);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction interpolate(template: string, params: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Validation composable\n// ---------------------------------------------------------------------------\n\nimport type { FieldSchema, FormSettings, ValidationRule } from \"@formatica/core\";\nimport { evaluateCondition, getRule } from \"@formatica/core\";\nimport { type Ref, ref } from \"vue\";\nimport type { FormContext } from \"../types/form\";\n\n// ---------------------------------------------------------------------------\n// Rule string parser (\"required|minLength:3|email\" → ValidationRule[])\n// ---------------------------------------------------------------------------\n\nfunction parseRuleString(input: string): ValidationRule[] {\n return input.split(\"|\").map((segment) => {\n const [rawName, ...paramParts] = segment.split(\":\");\n const name = rawName ?? \"\";\n const params: Record<string, unknown> = {};\n if (paramParts.length > 0) {\n const paramStr = paramParts.join(\":\");\n // Support \"min:3\" → { min: 3 } or \"between:1,10\" → { min: 1, max: 10 }\n const values = paramStr.split(\",\");\n if (name === \"between\" && values.length === 2) {\n params.min = values[0];\n params.max = values[1];\n } else if (values.length === 1) {\n // Use the rule name as the param key\n params[name] = values[0];\n } else {\n params.values = values;\n }\n }\n return { name, params };\n });\n}\n\nfunction normalizeRules(field: FieldSchema): ValidationRule[] {\n const raw = field.rules;\n if (!raw) {\n const rules: ValidationRule[] = [];\n if (field.required) rules.push({ name: \"required\" });\n return rules;\n }\n\n if (typeof raw === \"string\") {\n return parseRuleString(raw);\n }\n\n if (Array.isArray(raw)) {\n return raw.flatMap((r) => (typeof r === \"string\" ? parseRuleString(r) : []));\n }\n\n // Record<string, unknown> form: { required: true, minLength: 3 }\n const rules: ValidationRule[] = [];\n for (const [name, paramValue] of Object.entries(raw)) {\n if (paramValue === false) continue;\n const params: Record<string, unknown> = {};\n if (typeof paramValue === \"object\" && paramValue !== null && !Array.isArray(paramValue)) {\n Object.assign(params, paramValue);\n } else if (paramValue !== true) {\n params[name] = paramValue;\n }\n rules.push({ name, params });\n }\n return rules;\n}\n\n// ---------------------------------------------------------------------------\n// Debounce helper\n// ---------------------------------------------------------------------------\n\nfunction debounce<T extends (...args: never[]) => Promise<unknown>>(\n fn: T,\n ms: number,\n): (...args: Parameters<T>) => Promise<Awaited<ReturnType<T>>> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n let pendingResolve: ((v: Awaited<ReturnType<T>>) => void) | null = null;\n\n return (...args: Parameters<T>) => {\n return new Promise<Awaited<ReturnType<T>>>((resolve) => {\n if (timer !== null) {\n clearTimeout(timer);\n // Resolve the previous pending promise with empty errors\n if (pendingResolve) pendingResolve([] as Awaited<ReturnType<T>>);\n }\n pendingResolve = resolve;\n timer = setTimeout(async () => {\n timer = null;\n const result = await fn(...args);\n resolve(result as Awaited<ReturnType<T>>);\n pendingResolve = null;\n }, ms);\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\nexport interface UseValidationOptions {\n fields: Ref<FieldSchema[]>;\n values: Ref<Record<string, unknown>>;\n settings?: FormSettings;\n}\n\nexport interface UseValidationReturn {\n errors: Ref<Record<string, string[]>>;\n validateField: (name: string, ctx: FormContext) => Promise<string[]>;\n validateAll: (ctx: FormContext) => Promise<Record<string, string[]>>;\n clearFieldErrors: (name: string) => void;\n clearAllErrors: () => void;\n}\n\nexport function useValidation(options: UseValidationOptions): UseValidationReturn {\n const { fields, values, settings } = options;\n const errors = ref<Record<string, string[]>>({});\n const debouncedValidators = new Map<string, (...args: never[]) => Promise<string[]>>();\n\n function getDebounced(name: string, ms: number): (...args: never[]) => Promise<string[]> {\n const key = `${name}:${ms}`;\n if (!debouncedValidators.has(key)) {\n debouncedValidators.set(\n key,\n debounce(async (...args: never[]) => {\n return runValidateField(\n args[0] as unknown as string,\n args[1] as unknown as FormContext,\n );\n }, ms),\n );\n }\n const validator = debouncedValidators.get(key);\n if (!validator) throw new Error(`Debounced validator not found for ${key}`);\n return validator;\n }\n\n async function runValidateField(name: string, ctx: FormContext): Promise<string[]> {\n const field = fields.value.find((f) => f.name === name);\n if (!field) return [];\n\n const fieldRules = normalizeRules(field);\n const value = values.value[name];\n const fieldErrors: string[] = [];\n\n for (const rule of fieldRules) {\n // Check conditional rules\n if (rule.params?.when) {\n const condition = rule.params.when as Record<string, unknown>;\n if (\"field\" in condition || \"and\" in condition || \"or\" in condition) {\n const met = evaluateCondition(\n condition as Parameters<typeof evaluateCondition>[0],\n values.value,\n );\n if (!met) continue;\n }\n }\n\n // Skip optional rules when value is empty\n if (rule.optional && isEmpty(value)) continue;\n\n // Resolve the rule function\n let result: boolean | string;\n\n if (rule.validator) {\n result = await rule.validator(value, rule.params ?? {}, ctx);\n } else {\n const fn = getRule(rule.name);\n if (!fn) continue;\n result = await fn(value, rule.params ?? {}, ctx);\n }\n\n if (result !== true) {\n const message = rule.message\n ? interpolateMessage(rule.message, rule.params ?? {})\n : typeof result === \"string\"\n ? result\n : `Validation failed for rule: ${rule.name}`;\n fieldErrors.push(message);\n\n if (rule.bail) break;\n }\n }\n\n errors.value[name] = fieldErrors;\n return fieldErrors;\n }\n\n async function validateField(name: string, ctx: FormContext): Promise<string[]> {\n const debounceMs = settings?.debounce;\n if (debounceMs && debounceMs > 0) {\n const fn = getDebounced(name, debounceMs);\n return fn(name as never, ctx as never);\n }\n return runValidateField(name, ctx);\n }\n\n async function validateAll(ctx: FormContext): Promise<Record<string, string[]>> {\n const results: Record<string, string[]> = {};\n const promises = fields.value.map(async (field) => {\n const fieldErrors = await runValidateField(field.name, ctx);\n if (fieldErrors.length > 0) {\n results[field.name] = fieldErrors;\n }\n });\n await Promise.all(promises);\n errors.value = { ...results };\n return results;\n }\n\n function clearFieldErrors(name: string): void {\n delete errors.value[name];\n }\n\n function clearAllErrors(): void {\n errors.value = {};\n }\n\n return {\n errors,\n validateField,\n validateAll,\n clearFieldErrors,\n clearAllErrors,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isEmpty(value: unknown): boolean {\n if (value === null || value === undefined || value === \"\") return true;\n if (Array.isArray(value) && value.length === 0) return true;\n return false;\n}\n\nfunction interpolateMessage(template: string, params: Record<string, unknown>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n return params[key] !== undefined ? String(params[key]) : `{${key}}`;\n });\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Main form composable\n// ---------------------------------------------------------------------------\n\nimport type { FieldSchema, FieldTranslations, FormSchema } from \"@formatica/core\";\nimport { evaluateCondition, extractFields } from \"@formatica/core\";\nimport { computed, type InjectionKey, provide, reactive, ref, watch } from \"vue\";\nimport type { FieldInstance, FormContext, FormInstance, SubmitHandler } from \"../types/form\";\nimport { createEventBus } from \"./eventBus\";\nimport { useFormI18n } from \"./useFormI18n\";\nimport { useValidation } from \"./useValidation\";\n\n// ---------------------------------------------------------------------------\n// Injection key\n// ---------------------------------------------------------------------------\n\nexport const FormContextKey: InjectionKey<FormInstance> = Symbol(\"FormaticaContext\");\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface UseFormOptions {\n locale?: string;\n fallbackLocale?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getTypeDefault(field: FieldSchema): unknown {\n switch (field.type) {\n case \"tags\":\n return [];\n case \"checkbox-group\":\n return [];\n case \"checkbox\":\n return false;\n case \"switch\":\n return false;\n case \"number\":\n case \"slider\":\n return null;\n case \"file\":\n return null;\n default:\n return \"\";\n }\n}\n\nfunction buildDefaults(fields: FieldSchema[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n for (const field of fields) {\n values[field.name] = field.defaultValue ?? getTypeDefault(field);\n }\n return values;\n}\n\nfunction collectFieldTranslations(fields: FieldSchema[]): Record<string, FieldTranslations> {\n const map: Record<string, FieldTranslations> = {};\n for (const field of fields) {\n if (field.translations) map[field.name] = field.translations;\n }\n return map;\n}\n\n// ---------------------------------------------------------------------------\n// Main composable\n// ---------------------------------------------------------------------------\n\nexport function useForm(schema: FormSchema, options?: UseFormOptions): FormInstance {\n const locale = ref(options?.locale ?? \"en\");\n const fallbackLocale = options?.fallbackLocale ?? \"en\";\n\n let currentSchema = schema;\n const fieldsRef = ref<FieldSchema[]>(extractFields(schema.fields));\n\n // Core reactive state\n const values = reactive<Record<string, unknown>>(buildDefaults(extractFields(schema.fields)));\n const errors = reactive<Record<string, string[]>>({});\n const touched = reactive<Record<string, boolean>>({});\n const dirty = reactive<Record<string, boolean>>({});\n const isSubmitting = ref(false);\n const submitCount = ref(0);\n\n const isValid = computed(() => Object.values(errors).every((e) => e.length === 0));\n const isDirty = computed(() => Object.values(dirty).some(Boolean));\n\n const bus = createEventBus();\n\n function getFormContext(): FormContext {\n return { values: { ...values }, getFieldValue: (name: string) => values[name] };\n }\n\n // Validation & i18n\n const valuesRef = computed(() => ({ ...values }));\n const validation = useValidation({\n fields: fieldsRef,\n values: valuesRef,\n settings: schema.settings,\n });\n\n useFormI18n({\n locale,\n fallbackLocale,\n fieldTranslations: collectFieldTranslations(extractFields(schema.fields)),\n formTranslations: schema.translations,\n });\n\n let initialValues = buildDefaults(extractFields(schema.fields));\n\n // Watch value changes\n watch(\n () => ({ ...values }),\n (newVals, oldVals) => {\n if (!oldVals) return;\n for (const key of Object.keys(newVals)) {\n if (newVals[key] !== oldVals[key]) {\n dirty[key] = true;\n bus.emit(\"field:change\", {\n field: key,\n value: newVals[key],\n previousValue: oldVals[key],\n });\n if (schema.settings?.validateOnChange) validateField(key);\n }\n }\n bus.emit(\"change\", { values: newVals });\n },\n { deep: true },\n );\n\n // Field instances\n const fieldInstances = new Map<string, FieldInstance>();\n\n function buildFieldInstance(fs: FieldSchema): FieldInstance {\n const n = fs.name;\n return {\n name: n,\n value: computed({\n get: () => values[n],\n set: (v) => {\n values[n] = v;\n },\n }),\n errors: computed(() => errors[n] ?? []),\n touched: computed({\n get: () => touched[n] ?? false,\n set: (v) => {\n touched[n] = v;\n },\n }),\n dirty: computed({\n get: () => dirty[n] ?? false,\n set: (v) => {\n dirty[n] = v;\n },\n }),\n disabled: computed(() =>\n typeof fs.disabled === \"function\"\n ? fs.disabled(getFormContext())\n : (fs.disabled ?? false),\n ),\n visible: computed(() => {\n if (fs.condition) return evaluateCondition(fs.condition, values);\n if (typeof fs.visible === \"function\") return fs.visible(getFormContext());\n return fs.visible ?? true;\n }),\n schema: fs,\n validate: () => validateField(n),\n reset: () => {\n values[n] = initialValues[n] ?? null;\n delete errors[n];\n touched[n] = false;\n dirty[n] = false;\n },\n clear: () => {\n values[n] = null;\n delete errors[n];\n },\n };\n }\n\n function initFieldInstances(): void {\n fieldInstances.clear();\n for (const field of extractFields(currentSchema.fields)) {\n fieldInstances.set(field.name, buildFieldInstance(field));\n }\n }\n initFieldInstances();\n\n // ---- Core methods ----\n\n async function validateField(name: string): Promise<string[]> {\n const fieldErrors = await validation.validateField(name, getFormContext());\n errors[name] = fieldErrors;\n bus.emit(\"validate:field\", {\n field: name,\n valid: fieldErrors.length === 0,\n errors: fieldErrors,\n });\n return fieldErrors;\n }\n\n async function validate(): Promise<boolean> {\n const allErrors = await validation.validateAll(getFormContext());\n for (const key of Object.keys(errors)) {\n if (!(key in allErrors)) delete errors[key];\n }\n for (const [key, errs] of Object.entries(allErrors)) {\n errors[key] = errs;\n }\n const valid = Object.values(allErrors).every((e) => e.length === 0);\n bus.emit(\"validate\", { valid, errors: { ...allErrors } });\n return valid;\n }\n\n async function submit(handler?: SubmitHandler): Promise<void> {\n isSubmitting.value = true;\n submitCount.value += 1;\n try {\n for (const f of extractFields(currentSchema.fields)) touched[f.name] = true;\n const valid = await validate();\n if (!valid) {\n bus.emit(\"submit:error\", {\n values: { ...values },\n error: new Error(\"Validation failed\"),\n });\n return;\n }\n bus.emit(\"submit\", { values: { ...values } });\n if (handler) await handler({ ...values }, getFormContext());\n bus.emit(\"submit:success\", { values: { ...values }, result: undefined });\n } catch (error: unknown) {\n bus.emit(\"submit:error\", { values: { ...values }, error });\n throw error;\n } finally {\n isSubmitting.value = false;\n }\n }\n\n function reset(): void {\n for (const f of extractFields(currentSchema.fields)) {\n values[f.name] = initialValues[f.name] ?? null;\n delete errors[f.name];\n touched[f.name] = false;\n dirty[f.name] = false;\n }\n validation.clearAllErrors();\n bus.emit(\"reset\", undefined);\n }\n\n function clear(): void {\n for (const f of extractFields(currentSchema.fields)) {\n values[f.name] = null;\n delete errors[f.name];\n }\n validation.clearAllErrors();\n }\n\n function updateSchema(newSchema: FormSchema): void {\n currentSchema = newSchema;\n const newFields = extractFields(newSchema.fields);\n fieldsRef.value = newFields;\n initialValues = buildDefaults(newFields);\n for (const f of newFields) {\n if (!(f.name in values)) values[f.name] = f.defaultValue ?? null;\n }\n const newNames = new Set(newFields.map((f) => f.name));\n for (const key of Object.keys(values)) {\n if (!newNames.has(key)) {\n delete values[key];\n delete errors[key];\n delete touched[key];\n delete dirty[key];\n }\n }\n initFieldInstances();\n }\n\n // ---- Build instance ----\n\n const instance: FormInstance = {\n values,\n errors,\n touched,\n dirty,\n isValid,\n isDirty,\n isSubmitting,\n submitCount,\n validate,\n validateField,\n submit,\n reset,\n clear,\n setError: (name, messages) => {\n errors[name] = messages;\n },\n clearError: (name) => {\n delete errors[name];\n validation.clearFieldErrors(name);\n },\n clearErrors: () => {\n for (const k of Object.keys(errors)) delete errors[k];\n validation.clearAllErrors();\n },\n getField: (name) => fieldInstances.get(name),\n setFieldValue: (name, value) => {\n values[name] = value;\n },\n setFieldDisabled: (name, disabled) => {\n const fs = extractFields(currentSchema.fields).find((f) => f.name === name);\n if (fs) fs.disabled = disabled;\n },\n setFieldVisible: (name, visible) => {\n const fs = extractFields(currentSchema.fields).find((f) => f.name === name);\n if (fs) fs.visible = visible;\n },\n on: bus.on,\n locale,\n setLocale: (l) => {\n locale.value = l;\n },\n schema: currentSchema,\n updateSchema,\n };\n\n provide(FormContextKey, instance);\n return instance;\n}\n","// ---------------------------------------------------------------------------\n// Formatica – Theme composable\n// ---------------------------------------------------------------------------\n\nimport type { ThemeConfig } from \"@formatica/core\";\nimport {\n type ComputedRef,\n computed,\n type InjectionKey,\n inject,\n isRef,\n provide,\n type Ref,\n ref,\n} from \"vue\";\n\n// ---------------------------------------------------------------------------\n// Injection key\n// ---------------------------------------------------------------------------\n\nexport const FormThemeKey: InjectionKey<ThemeInstance> = Symbol(\"FormaticaTheme\");\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ThemeClasses {\n form: string;\n field: string;\n label: string;\n input: string;\n error: string;\n helpText: string;\n group: string;\n row: string;\n steps: string;\n tabs: string;\n button: string;\n}\n\nexport interface ThemeInstance {\n config: ThemeConfig;\n classes: ComputedRef<ThemeClasses>;\n cssVars: ComputedRef<Record<string, string>>;\n}\n\n// ---------------------------------------------------------------------------\n// Default theme\n// ---------------------------------------------------------------------------\n\nconst defaultTheme: ThemeConfig = {\n name: \"default\",\n colors: {\n primary: \"#3b82f6\",\n primaryHover: \"#2563eb\",\n error: \"#ef4444\",\n errorHover: \"#dc2626\",\n success: \"#22c55e\",\n warning: \"#f59e0b\",\n info: \"#3b82f6\",\n text: \"#1f2937\",\n textSecondary: \"#6b7280\",\n textDisabled: \"#9ca3af\",\n background: \"#ffffff\",\n backgroundDisabled: \"#f3f4f6\",\n border: \"#d1d5db\",\n borderFocus: \"#3b82f6\",\n borderError: \"#ef4444\",\n placeholder: \"#9ca3af\",\n },\n typography: {\n fontFamily: \"inherit\",\n fontSize: \"0.875rem\",\n fontSizeSmall: \"0.75rem\",\n fontSizeLarge: \"1rem\",\n lineHeight: \"1.5\",\n labelFontWeight: \"500\",\n },\n spacing: {\n fieldGap: \"1rem\",\n rowGap: \"1rem\",\n inputPaddingX: \"0.75rem\",\n inputPaddingY: \"0.5rem\",\n labelMarginBottom: \"0.375rem\",\n },\n borders: {\n radius: \"0.375rem\",\n radiusSmall: \"0.25rem\",\n radiusLarge: \"0.5rem\",\n width: \"1px\",\n style: \"solid\",\n },\n shadows: {\n focus: \"0 0 0 3px rgba(59, 130, 246, 0.1)\",\n error: \"0 0 0 3px rgba(239, 68, 68, 0.1)\",\n dropdown: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n },\n transitions: {\n duration: \"150ms\",\n timingFunction: \"ease-in-out\",\n },\n};\n\n// ---------------------------------------------------------------------------\n// Composable\n// ---------------------------------------------------------------------------\n\nexport function useTheme(config?: ThemeConfig | Ref<ThemeConfig | undefined>): ThemeInstance {\n const themeRef: Ref<ThemeConfig> = isRef(config)\n ? computed(() => config.value ?? defaultTheme)\n : ref(config ?? defaultTheme);\n\n const classes = computed<ThemeClasses>(() => {\n const comps = themeRef.value.components ?? {};\n return {\n form: comps.form ?? \"fc-form\",\n field: comps.field ?? \"fc-field\",\n label: comps.label ?? \"fc-label\",\n input: comps.input ?? \"fc-input\",\n error: comps.error ?? \"fc-error\",\n helpText: comps.helpText ?? \"fc-help-text\",\n group: comps.group ?? \"fc-group\",\n row: comps.row ?? \"fc-row\",\n steps: comps.steps ?? \"fc-steps\",\n tabs: comps.tabs ?? \"fc-tabs\",\n button: comps.button ?? \"fc-button\",\n };\n });\n\n const cssVars = computed<Record<string, string>>(() => {\n const t = themeRef.value;\n const vars: Record<string, string> = {};\n\n if (t.colors) {\n for (const [key, value] of Object.entries(t.colors)) {\n if (value) vars[`--fc-color-${camelToKebab(key)}`] = value;\n }\n }\n if (t.typography) {\n for (const [key, value] of Object.entries(t.typography)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (t.spacing) {\n for (const [key, value] of Object.entries(t.spacing)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (t.borders) {\n for (const [key, value] of Object.entries(t.borders)) {\n if (value) vars[`--fc-border-${camelToKebab(key)}`] = value;\n }\n }\n if (t.shadows) {\n for (const [key, value] of Object.entries(t.shadows)) {\n if (value) vars[`--fc-shadow-${camelToKebab(key)}`] = value;\n }\n }\n if (t.transitions) {\n for (const [key, value] of Object.entries(t.transitions)) {\n if (value) vars[`--fc-transition-${camelToKebab(key)}`] = value;\n }\n }\n if (t.cssVars) {\n Object.assign(vars, t.cssVars);\n }\n\n return vars;\n });\n\n const instance: ThemeInstance = {\n config: themeRef.value,\n classes,\n cssVars,\n };\n\n provide(FormThemeKey, instance);\n\n return instance;\n}\n\n/**\n * Inject the theme instance provided by a parent useTheme call.\n * Falls back to default theme classes if no provider exists.\n */\nexport function useThemeClasses(): ThemeInstance {\n const injected = inject(FormThemeKey);\n if (injected) return injected;\n // Return a minimal default without providing (read-only consumer)\n return useThemeDefault();\n}\n\nfunction useThemeDefault(): ThemeInstance {\n const classes = computed<ThemeClasses>(() => ({\n form: \"fc-form\",\n field: \"fc-field\",\n label: \"fc-label\",\n input: \"fc-input\",\n error: \"fc-error\",\n helpText: \"fc-help-text\",\n group: \"fc-group\",\n row: \"fc-row\",\n steps: \"fc-steps\",\n tabs: \"fc-tabs\",\n button: \"fc-button\",\n }));\n\n const cssVars = computed<Record<string, string>>(() => ({}));\n\n return { config: defaultTheme, classes, cssVars };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n","// ---------------------------------------------------------------------------\n// Formatica Vue – Plugin (global configuration)\n// ---------------------------------------------------------------------------\n\nimport type { ThemeConfig } from \"@formatica/core\";\nimport type { App, Component, InjectionKey, Plugin } from \"vue\";\nimport { reactive } from \"vue\";\nimport { registerFieldType } from \"./core/fieldRegistry\";\n\nexport interface FormaticaOptions {\n theme?: ThemeConfig;\n locale?: string;\n fallbackLocale?: string;\n components?: Record<string, Component>;\n}\n\nexport const FormaticaKey: InjectionKey<FormaticaOptions> = Symbol(\"Formatica\");\n\nexport function createFormatica(options: FormaticaOptions = {}): Plugin {\n return {\n install(app: App) {\n app.provide(FormaticaKey, reactive(options));\n\n // Register global custom components\n if (options.components) {\n for (const [type, component] of Object.entries(options.components)) {\n registerFieldType(type, component);\n }\n }\n },\n };\n}\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n import type { OptionItem } from \"../../types/schema\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: Array<string | number | boolean>;\n options: OptionItem[];\n inline?: boolean;\n disabled?: boolean;\n minSelect?: number;\n maxSelect?: number;\n }>(),\n {\n inline: false,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: Array<string | number | boolean>];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n function isChecked(value: string | number | boolean): boolean {\n return props.modelValue.includes(value);\n }\n\n function isOptionDisabled(option: OptionItem): boolean {\n if (props.disabled || option.disabled) return true;\n // Enforce maxSelect: disable unchecked options when at max\n if (\n props.maxSelect &&\n !isChecked(option.value) &&\n props.modelValue.length >= props.maxSelect\n ) {\n return true;\n }\n return false;\n }\n\n function toggleOption(option: OptionItem) {\n if (isOptionDisabled(option)) return;\n const arr = [...props.modelValue];\n const idx = arr.indexOf(option.value);\n if (idx >= 0) {\n // Enforce minSelect: do not remove if at minimum\n if (props.minSelect && arr.length <= props.minSelect) return;\n arr.splice(idx, 1);\n } else {\n arr.push(option.value);\n }\n emit(\"update:modelValue\", arr);\n }\n\n function onKeydown(event: KeyboardEvent, option: OptionItem) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggleOption(option);\n }\n }\n</script>\n\n<template>\n <div\n role=\"group\"\n :class=\"inline ? 'flex flex-wrap gap-4' : 'flex flex-col gap-2'\"\n >\n <label\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :class=\"[\n 'inline-flex items-center gap-2 select-none',\n isOptionDisabled(option) ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n ]\"\n >\n <input\n type=\"checkbox\"\n :checked=\"isChecked(option.value)\"\n :disabled=\"isOptionDisabled(option)\"\n class=\"sr-only\"\n @change=\"toggleOption(option)\"\n @blur=\"emit('blur', $event)\"\n />\n <div\n role=\"checkbox\"\n :aria-checked=\"isChecked(option.value)\"\n :aria-disabled=\"isOptionDisabled(option) || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors duration-200',\n isChecked(option.value)\n ? 'text-white'\n : 'border-gray-300 bg-white',\n ]\"\n :style=\"isChecked(option.value) ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggleOption(option)\"\n @keydown=\"onKeydown($event, option)\"\n >\n <svg\n v-if=\"isChecked(option.value)\"\n class=\"h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 6l3 3 5-5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"text-sm text-gray-700\">{{ option.label }}</span>\n </label>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: boolean;\n checkboxLabel?: string;\n disabled?: boolean;\n }>(),\n {\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: boolean];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const wrapperClasses = computed(() => [\n \"inline-flex items-center gap-2 select-none\",\n props.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n ]);\n\n function toggle() {\n if (props.disabled) return;\n emit(\"update:modelValue\", !props.modelValue);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggle();\n }\n }\n</script>\n\n<template>\n <label :class=\"wrapperClasses\">\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n class=\"sr-only\"\n @change=\"toggle\"\n @blur=\"emit('blur', $event)\"\n />\n <div\n role=\"checkbox\"\n :aria-checked=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded border-2 transition-colors duration-200',\n modelValue\n ? 'text-white'\n : 'border-gray-300 bg-white',\n ]\"\n :style=\"modelValue ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggle\"\n @keydown=\"onKeydown\"\n >\n <svg\n v-if=\"modelValue\"\n class=\"h-3 w-3\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M2 6l3 3 5-5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span v-if=\"checkboxLabel\" class=\"text-sm text-gray-700\">{{ checkboxLabel }}</span>\n </label>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n format?: string;\n minDate?: string;\n maxDate?: string;\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n placeholder: \"\",\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-date-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit(\"update:modelValue\", target.value);\n }\n</script>\n\n<template>\n <input\n type=\"date\"\n :value=\"modelValue\"\n :min=\"minDate\"\n :max=\"maxDate\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-date-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: File | File[] | null;\n accept?: string;\n maxSize?: number;\n multiple?: boolean;\n maxFiles?: number;\n disabled?: boolean;\n }>(),\n {\n multiple: false,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: File | File[] | null];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const fileInputRef = ref<HTMLInputElement | null>(null);\n const isDragOver = ref(false);\n\n const files = computed<File[]>(() => {\n if (!props.modelValue) return [];\n return Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue];\n });\n\n function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n function filterFiles(incoming: File[]): File[] {\n let valid = incoming;\n if (props.maxSize) {\n const limit = props.maxSize;\n valid = valid.filter((f) => f.size <= limit);\n }\n if (props.multiple && props.maxFiles) {\n const remaining = props.maxFiles - files.value.length;\n valid = valid.slice(0, Math.max(0, remaining));\n }\n return valid;\n }\n\n function addFiles(incoming: File[]) {\n const valid = filterFiles(incoming);\n if (valid.length === 0) return;\n if (props.multiple) {\n emit(\"update:modelValue\", [...files.value, ...valid]);\n } else {\n emit(\"update:modelValue\", valid[0] ?? null);\n }\n }\n\n function onFileChange(event: Event) {\n const target = event.target as HTMLInputElement;\n if (!target.files) return;\n addFiles(Array.from(target.files));\n // Reset so same file can be selected again\n target.value = \"\";\n }\n\n function removeFile(index: number) {\n if (props.disabled) return;\n const updated = files.value.filter((_, i) => i !== index);\n if (props.multiple) {\n emit(\"update:modelValue\", updated.length ? updated : []);\n } else {\n emit(\"update:modelValue\", null);\n }\n }\n\n function onDragOver(event: DragEvent) {\n event.preventDefault();\n if (!props.disabled) isDragOver.value = true;\n }\n\n function onDragLeave() {\n isDragOver.value = false;\n }\n\n function onDrop(event: DragEvent) {\n event.preventDefault();\n isDragOver.value = false;\n if (props.disabled || !event.dataTransfer?.files) return;\n addFiles(Array.from(event.dataTransfer.files));\n }\n\n function openPicker() {\n if (!props.disabled) fileInputRef.value?.click();\n }\n</script>\n\n<template>\n <div :class=\"disabled ? 'opacity-50 cursor-not-allowed' : ''\">\n <!-- Drop zone -->\n <div\n role=\"button\"\n tabindex=\"0\"\n :aria-disabled=\"disabled || undefined\"\n :class=\"[\n 'flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-6 text-center transition-colors duration-200',\n !isDragOver ? 'border-gray-300 bg-gray-50' : '',\n disabled ? 'pointer-events-none' : 'cursor-pointer hover:border-gray-400',\n ]\"\n :style=\"isDragOver ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)' } : {}\"\n @click=\"openPicker\"\n @keydown.enter=\"openPicker\"\n @keydown.space.prevent=\"openPicker\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @drop=\"onDrop\"\n @blur=\"emit('blur', $event as unknown as FocusEvent)\"\n >\n <svg\n class=\"mb-2 h-8 w-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 16v-8m0 0l-3 3m3-3l3 3M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1\"\n />\n </svg>\n <p class=\"text-sm text-gray-600\">\n Drop files here or <span class=\"font-medium\" :style=\"{ color: 'var(--fc-color-primary, #3b82f6)' }\">browse</span>\n </p>\n <p v-if=\"accept\" class=\"mt-1 text-xs text-gray-400\">Accepted: {{ accept }}</p>\n </div>\n\n <input\n ref=\"fileInputRef\"\n type=\"file\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n class=\"hidden\"\n @change=\"onFileChange\"\n />\n\n <!-- File list -->\n <ul v-if=\"files.length > 0\" class=\"mt-3 space-y-2\">\n <li\n v-for=\"(file, idx) in files\"\n :key=\"`${file.name}-${idx}`\"\n class=\"flex items-center justify-between rounded-md border border-gray-200 bg-white px-3 py-2 text-sm\"\n >\n <div class=\"flex items-center gap-2 truncate\">\n <svg\n class=\"h-4 w-4 shrink-0 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span class=\"truncate\">{{ file.name }}</span>\n <span class=\"shrink-0 text-xs text-gray-400\">({{ formatSize(file.size) }})</span>\n </div>\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"ml-2 shrink-0 text-gray-400 hover:text-red-500 transition-colors duration-200\"\n aria-label=\"Remove file\"\n @click.stop=\"removeFile(idx)\"\n >\n ×\n </button>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: number | null;\n min?: number;\n max?: number;\n step?: number;\n precision?: number;\n prefix?: string;\n suffix?: string;\n disabled?: boolean;\n readonly?: boolean;\n }>(),\n {\n step: 1,\n disabled: false,\n readonly: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: number | null];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const hasAddons = computed(() => !!props.prefix || !!props.suffix);\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"placeholder:text-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-number-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n props.prefix ? \"rounded-l-none\" : \"\",\n props.suffix ? \"rounded-r-none\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n const raw = target.value;\n if (raw === \"\") {\n emit(\"update:modelValue\", null);\n return;\n }\n let num = parseFloat(raw);\n if (Number.isNaN(num)) return;\n if (props.precision !== undefined) {\n num = parseFloat(num.toFixed(props.precision));\n }\n emit(\"update:modelValue\", num);\n }\n</script>\n\n<template>\n <div v-if=\"hasAddons\" class=\"flex items-stretch\">\n <span\n v-if=\"prefix\"\n class=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ prefix }}\n </span>\n <input\n type=\"number\"\n :value=\"modelValue ?? ''\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n <span\n v-if=\"suffix\"\n class=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ suffix }}\n </span>\n </div>\n <input\n v-else\n type=\"number\"\n :value=\"modelValue ?? ''\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-number-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import {\n AsYouType,\n type CountryCode,\n getCountries,\n getCountryCallingCode,\n parsePhoneNumber,\n } from \"libphonenumber-js\";\n import { computed, nextTick, onMounted, ref, watch } from \"vue\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n defaultCountry?: string;\n countries?: string[];\n showDialCode?: boolean;\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n defaultCountry: \"US\",\n showDialCode: true,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n }>();\n\n // ---------------------------------------------------------------------------\n // Country data\n // ---------------------------------------------------------------------------\n\n interface CountryItem {\n code: CountryCode;\n name: string;\n dialCode: string;\n flag: string;\n }\n\n const countryNames: Record<string, string> = {\n AF: \"Afghanistan\",\n AL: \"Albania\",\n DZ: \"Algeria\",\n AD: \"Andorra\",\n AO: \"Angola\",\n AR: \"Argentina\",\n AM: \"Armenia\",\n AU: \"Australia\",\n AT: \"Austria\",\n AZ: \"Azerbaijan\",\n BH: \"Bahrain\",\n BD: \"Bangladesh\",\n BY: \"Belarus\",\n BE: \"Belgium\",\n BZ: \"Belize\",\n BJ: \"Benin\",\n BT: \"Bhutan\",\n BO: \"Bolivia\",\n BA: \"Bosnia\",\n BW: \"Botswana\",\n BR: \"Brazil\",\n BN: \"Brunei\",\n BG: \"Bulgaria\",\n BF: \"Burkina Faso\",\n BI: \"Burundi\",\n KH: \"Cambodia\",\n CM: \"Cameroon\",\n CA: \"Canada\",\n CL: \"Chile\",\n CN: \"China\",\n CO: \"Colombia\",\n CR: \"Costa Rica\",\n HR: \"Croatia\",\n CU: \"Cuba\",\n CY: \"Cyprus\",\n CZ: \"Czechia\",\n DK: \"Denmark\",\n DO: \"Dominican Rep.\",\n EC: \"Ecuador\",\n EG: \"Egypt\",\n SV: \"El Salvador\",\n EE: \"Estonia\",\n ET: \"Ethiopia\",\n FI: \"Finland\",\n FR: \"France\",\n GE: \"Georgia\",\n DE: \"Germany\",\n GH: \"Ghana\",\n GR: \"Greece\",\n GT: \"Guatemala\",\n HN: \"Honduras\",\n HK: \"Hong Kong\",\n HU: \"Hungary\",\n IS: \"Iceland\",\n IN: \"India\",\n ID: \"Indonesia\",\n IR: \"Iran\",\n IQ: \"Iraq\",\n IE: \"Ireland\",\n IL: \"Israel\",\n IT: \"Italy\",\n JM: \"Jamaica\",\n JP: \"Japan\",\n JO: \"Jordan\",\n KZ: \"Kazakhstan\",\n KE: \"Kenya\",\n KR: \"South Korea\",\n KW: \"Kuwait\",\n LV: \"Latvia\",\n LB: \"Lebanon\",\n LY: \"Libya\",\n LT: \"Lithuania\",\n LU: \"Luxembourg\",\n MO: \"Macau\",\n MY: \"Malaysia\",\n MX: \"Mexico\",\n MA: \"Morocco\",\n MZ: \"Mozambique\",\n MM: \"Myanmar\",\n NP: \"Nepal\",\n NL: \"Netherlands\",\n NZ: \"New Zealand\",\n NI: \"Nicaragua\",\n NG: \"Nigeria\",\n NO: \"Norway\",\n OM: \"Oman\",\n PK: \"Pakistan\",\n PA: \"Panama\",\n PY: \"Paraguay\",\n PE: \"Peru\",\n PH: \"Philippines\",\n PL: \"Poland\",\n PT: \"Portugal\",\n QA: \"Qatar\",\n RO: \"Romania\",\n RU: \"Russia\",\n SA: \"Saudi Arabia\",\n RS: \"Serbia\",\n SG: \"Singapore\",\n SK: \"Slovakia\",\n SI: \"Slovenia\",\n ZA: \"South Africa\",\n ES: \"Spain\",\n LK: \"Sri Lanka\",\n SE: \"Sweden\",\n CH: \"Switzerland\",\n TW: \"Taiwan\",\n TZ: \"Tanzania\",\n TH: \"Thailand\",\n TR: \"Turkey\",\n UA: \"Ukraine\",\n AE: \"UAE\",\n GB: \"United Kingdom\",\n US: \"United States\",\n UY: \"Uruguay\",\n VE: \"Venezuela\",\n VN: \"Vietnam\",\n ZW: \"Zimbabwe\",\n };\n\n function countryFlag(code: string): string {\n return code\n .toUpperCase()\n .split(\"\")\n .map((c) => String.fromCodePoint(0x1f1e6 + c.charCodeAt(0) - 65))\n .join(\"\");\n }\n\n const allCountries = computed<CountryItem[]>(() => {\n const codes = props.countries?.length\n ? props.countries.filter((c): c is CountryCode =>\n getCountries().includes(c as CountryCode),\n )\n : getCountries();\n\n return codes\n .map((code) => ({\n code,\n name: countryNames[code] ?? code,\n dialCode: `+${getCountryCallingCode(code)}`,\n flag: countryFlag(code),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n });\n\n // ---------------------------------------------------------------------------\n // State\n // ---------------------------------------------------------------------------\n\n const selectedCountry = ref<CountryCode>(props.defaultCountry as CountryCode);\n const nationalNumber = ref(\"\");\n const dropdownOpen = ref(false);\n const search = ref(\"\");\n const searchInputRef = ref<HTMLInputElement | null>(null);\n\n const filteredCountries = computed(() => {\n const q = search.value.toLowerCase();\n if (!q) return allCountries.value;\n return allCountries.value.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.code.toLowerCase().includes(q) ||\n c.dialCode.includes(q),\n );\n });\n\n const selectedCountryData = computed(\n () =>\n allCountries.value.find((c) => c.code === selectedCountry.value) ??\n allCountries.value[0],\n );\n\n // ---------------------------------------------------------------------------\n // Sync model value\n // ---------------------------------------------------------------------------\n\n onMounted(() => {\n if (props.modelValue) parseIncoming(props.modelValue);\n });\n\n watch(\n () => props.modelValue,\n (val) => {\n if (val) parseIncoming(val);\n },\n );\n\n function parseIncoming(val: string) {\n try {\n const parsed = parsePhoneNumber(val);\n if (parsed?.country) {\n selectedCountry.value = parsed.country;\n nationalNumber.value = parsed.nationalNumber;\n return;\n }\n } catch {\n // Not a valid international number\n }\n nationalNumber.value = val.replace(/^\\+\\d+\\s*/, \"\");\n }\n\n function emitValue() {\n if (!nationalNumber.value.trim()) {\n emit(\"update:modelValue\", \"\");\n return;\n }\n const formatter = new AsYouType(selectedCountry.value);\n formatter.input(`+${getCountryCallingCode(selectedCountry.value)}${nationalNumber.value}`);\n const num = formatter.getNumber();\n emit(\"update:modelValue\", num?.format(\"E.164\") ?? nationalNumber.value);\n }\n\n function onInput(e: Event) {\n const target = e.target as HTMLInputElement;\n nationalNumber.value = target.value;\n emitValue();\n }\n\n function selectCountry(code: CountryCode) {\n selectedCountry.value = code;\n dropdownOpen.value = false;\n search.value = \"\";\n emitValue();\n }\n\n function openDropdown() {\n if (props.disabled) return;\n dropdownOpen.value = true;\n search.value = \"\";\n nextTick(() => searchInputRef.value?.focus());\n }\n\n function closeDropdown() {\n dropdownOpen.value = false;\n search.value = \"\";\n }\n</script>\n\n<template>\n <div class=\"relative\">\n <div\n :class=\"[\n 'flex items-stretch rounded-lg border transition-colors',\n disabled\n ? 'opacity-50 cursor-not-allowed bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700'\n : 'border-gray-300 dark:border-gray-600 focus-within:border-primary-500 focus-within:ring-2 focus-within:ring-primary-500/20',\n ]\"\n >\n <!-- Country selector button -->\n <button\n v-if=\"showDialCode\"\n type=\"button\"\n :disabled=\"disabled\"\n class=\"flex items-center gap-1.5 px-3 border-r border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 rounded-l-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors shrink-0\"\n @mousedown.prevent=\"dropdownOpen ? closeDropdown() : openDropdown()\"\n >\n <span class=\"text-lg leading-none\">{{ selectedCountryData?.flag }}</span>\n <span class=\"text-xs text-gray-500 dark:text-gray-400 font-medium\">{{ selectedCountryData?.dialCode }}</span>\n <svg\n :class=\"['h-3 w-3 text-gray-400 transition-transform', dropdownOpen ? 'rotate-180' : '']\"\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n\n <!-- Phone number input -->\n <input\n type=\"tel\"\n :value=\"nationalNumber\"\n :placeholder=\"placeholder || 'Phone number'\"\n :disabled=\"disabled\"\n autocomplete=\"tel-national\"\n class=\"flex-1 bg-transparent px-3 py-2 text-sm text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 outline-none min-w-0\"\n :class=\"showDialCode ? 'rounded-r-lg' : 'rounded-lg'\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n />\n </div>\n\n <!-- Backdrop (invisible, closes dropdown on click) -->\n <div\n v-if=\"dropdownOpen\"\n class=\"fixed inset-0 z-40\"\n @mousedown=\"closeDropdown\"\n />\n\n <!-- Country dropdown -->\n <div\n v-if=\"dropdownOpen\"\n class=\"absolute left-0 top-full z-50 mt-1 w-72 rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-xl overflow-hidden\"\n >\n <!-- Search -->\n <div class=\"border-b border-gray-200 dark:border-gray-700 p-2\">\n <input\n ref=\"searchInputRef\"\n v-model=\"search\"\n type=\"text\"\n placeholder=\"Search country...\"\n class=\"w-full rounded-md border border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 px-3 py-1.5 text-xs text-gray-900 dark:text-white placeholder-gray-400 outline-none focus:border-primary-500\"\n />\n </div>\n\n <!-- Country list -->\n <div class=\"max-h-48 overflow-y-auto\">\n <button\n v-for=\"country in filteredCountries\"\n :key=\"country.code\"\n type=\"button\"\n :class=\"[\n 'flex w-full items-center gap-3 px-3 py-2 text-left text-sm transition-colors hover:bg-gray-50 dark:hover:bg-gray-800',\n country.code === selectedCountry\n ? 'bg-primary-50 dark:bg-primary-950/30 text-primary-700 dark:text-primary-300'\n : 'text-gray-700 dark:text-gray-300',\n ]\"\n @mousedown.prevent=\"selectCountry(country.code)\"\n >\n <span class=\"text-lg leading-none\">{{ country.flag }}</span>\n <span class=\"flex-1 truncate text-xs\">{{ country.name }}</span>\n <span class=\"text-[11px] text-gray-400 dark:text-gray-500 font-mono\">{{ country.dialCode }}</span>\n </button>\n <p\n v-if=\"filteredCountries.length === 0\"\n class=\"px-3 py-4 text-center text-xs text-gray-400 dark:text-gray-500\"\n >\n No countries found\n </p>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { useThemeClasses } from \"../../core/useTheme\";\n import type { OptionItem } from \"../../types/schema\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string | number | boolean | null;\n options: OptionItem[];\n inline?: boolean;\n disabled?: boolean;\n }>(),\n {\n inline: false,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string | number | boolean | null];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n function isSelected(value: string | number | boolean): boolean {\n return props.modelValue === value;\n }\n\n function isOptionDisabled(option: OptionItem): boolean {\n return props.disabled || !!option.disabled;\n }\n\n function selectOption(option: OptionItem) {\n if (isOptionDisabled(option)) return;\n emit(\"update:modelValue\", option.value);\n }\n\n function onKeydown(event: KeyboardEvent, option: OptionItem) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n selectOption(option);\n }\n }\n</script>\n\n<template>\n <div\n role=\"radiogroup\"\n :class=\"inline ? 'flex flex-wrap gap-4' : 'flex flex-col gap-2'\"\n >\n <label\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n :class=\"[\n 'inline-flex items-center gap-2 select-none',\n isOptionDisabled(option) ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',\n ]\"\n >\n <input\n type=\"radio\"\n :checked=\"isSelected(option.value)\"\n :disabled=\"isOptionDisabled(option)\"\n class=\"sr-only\"\n @change=\"selectOption(option)\"\n @blur=\"emit('blur', $event)\"\n />\n <div\n role=\"radio\"\n :aria-checked=\"isSelected(option.value)\"\n :aria-disabled=\"isOptionDisabled(option) || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2 transition-colors duration-200',\n !isSelected(option.value) ? 'border-gray-300' : '',\n ]\"\n :style=\"isSelected(option.value) ? { borderColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"selectOption(option)\"\n @keydown=\"onKeydown($event, option)\"\n >\n <div\n v-if=\"isSelected(option.value)\"\n class=\"h-2.5 w-2.5 rounded-full\"\n :style=\"{ backgroundColor: 'var(--fc-color-primary, #3b82f6)' }\"\n />\n </div>\n <span class=\"text-sm text-gray-700\">{{ option.label }}</span>\n </label>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n import type { OptionItem } from \"../../types/schema\";\n\n type SelectValue = string | number | boolean | Array<string | number | boolean> | null;\n\n const props = withDefaults(\n defineProps<{\n modelValue: SelectValue;\n options: OptionItem[];\n multiple?: boolean;\n searchable?: boolean;\n clearable?: boolean;\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n multiple: false,\n searchable: false,\n clearable: false,\n placeholder: \"Select...\",\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: SelectValue];\n blur: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const isOpen = ref(false);\n const search = ref(\"\");\n const highlightedIndex = ref(-1);\n const containerRef = ref<HTMLDivElement | null>(null);\n const searchInputRef = ref<HTMLInputElement | null>(null);\n\n const selectedValues = computed<Array<string | number | boolean>>(() => {\n if (props.modelValue === null || props.modelValue === undefined) return [];\n if (Array.isArray(props.modelValue)) return props.modelValue;\n return [props.modelValue];\n });\n\n const displayLabel = computed(() => {\n if (selectedValues.value.length === 0) return \"\";\n if (props.multiple) return \"\";\n const opt = props.options.find((o) => o.value === selectedValues.value[0]);\n return opt?.label ?? String(selectedValues.value[0]);\n });\n\n const filteredOptions = computed(() => {\n if (!search.value) return props.options;\n const q = search.value.toLowerCase();\n return props.options.filter((o) => o.label.toLowerCase().includes(q));\n });\n\n function isSelected(value: string | number | boolean): boolean {\n return selectedValues.value.includes(value);\n }\n\n function toggle() {\n if (props.disabled) return;\n isOpen.value ? close() : open();\n }\n\n function open() {\n isOpen.value = true;\n highlightedIndex.value = -1;\n search.value = \"\";\n nextTick(() => searchInputRef.value?.focus());\n }\n\n function close() {\n isOpen.value = false;\n search.value = \"\";\n }\n\n function selectOption(option: OptionItem) {\n if (option.disabled) return;\n if (props.multiple) {\n const arr = [...selectedValues.value];\n const idx = arr.indexOf(option.value);\n if (idx >= 0) arr.splice(idx, 1);\n else arr.push(option.value);\n emit(\"update:modelValue\", arr);\n } else {\n emit(\"update:modelValue\", option.value);\n close();\n }\n }\n\n function removeTag(value: string | number | boolean) {\n if (props.disabled) return;\n const arr = selectedValues.value.filter((v) => v !== value);\n emit(\"update:modelValue\", arr.length ? arr : props.multiple ? [] : null);\n }\n\n function clear(event: MouseEvent) {\n event.stopPropagation();\n emit(\"update:modelValue\", props.multiple ? [] : null);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (!isOpen.value) {\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"ArrowDown\") {\n event.preventDefault();\n open();\n }\n return;\n }\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1,\n );\n break;\n case \"ArrowUp\":\n event.preventDefault();\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);\n break;\n case \"Enter\":\n event.preventDefault();\n if (highlightedIndex.value >= 0) {\n const option = filteredOptions.value[highlightedIndex.value];\n if (option) selectOption(option);\n }\n break;\n case \"Escape\":\n event.preventDefault();\n close();\n break;\n }\n }\n\n function onClickOutside(event: MouseEvent) {\n if (containerRef.value && !containerRef.value.contains(event.target as Node)) {\n close();\n }\n }\n\n function tagLabel(value: string | number | boolean): string {\n const opt = props.options.find((o) => o.value === value);\n return opt?.label ?? String(value);\n }\n\n onMounted(() => document.addEventListener(\"mousedown\", onClickOutside));\n onBeforeUnmount(() => document.removeEventListener(\"mousedown\", onClickOutside));\n\n watch(isOpen, (val) => {\n if (!val) emit(\"blur\", new FocusEvent(\"blur\"));\n });\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[\n 'relative w-full',\n theme.classes.value.input,\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n ]\"\n >\n <!-- Trigger -->\n <div\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"listbox\"\n tabindex=\"0\"\n :class=\"[\n 'flex min-h-[38px] w-full cursor-pointer items-center rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm',\n 'transition-colors duration-200',\n !isOpen ? '' : 'ring-2 ring-blue-500/20',\n disabled ? 'pointer-events-none bg-gray-100' : '',\n ]\"\n :style=\"isOpen ? { borderColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggle\"\n @keydown=\"onKeydown\"\n >\n <div class=\"flex flex-1 flex-wrap items-center gap-1\">\n <!-- Multiple tags -->\n <template v-if=\"multiple\">\n <span\n v-for=\"val in selectedValues\"\n :key=\"String(val)\"\n class=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs\"\n :style=\"{ backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 15%, white)', color: 'var(--fc-color-primary, #3b82f6)' }\"\n >\n {{ tagLabel(val) }}\n <button\n type=\"button\"\n class=\"ml-0.5\"\n :style=\"{ color: 'var(--fc-color-primary, #3b82f6)' }\"\n aria-label=\"Remove\"\n @click.stop=\"removeTag(val)\"\n >\n ×\n </button>\n </span>\n </template>\n <!-- Single display -->\n <span v-else-if=\"displayLabel\" class=\"truncate\">{{ displayLabel }}</span>\n <!-- Placeholder -->\n <span v-else class=\"text-gray-400\">{{ placeholder }}</span>\n </div>\n <!-- Clear button -->\n <button\n v-if=\"clearable && selectedValues.length > 0 && !disabled\"\n type=\"button\"\n class=\"ml-1 shrink-0 text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n aria-label=\"Clear selection\"\n @click=\"clear\"\n >\n ×\n </button>\n <!-- Chevron -->\n <svg\n class=\"ml-1 h-4 w-4 shrink-0 text-gray-400 transition-transform duration-200\"\n :class=\"isOpen ? 'rotate-180' : ''\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <!-- Dropdown -->\n <div\n v-if=\"isOpen\"\n class=\"absolute z-50 mt-1 w-full rounded-md border border-gray-200 bg-white shadow-lg\"\n >\n <!-- Search -->\n <div v-if=\"searchable\" class=\"border-b border-gray-200 p-2\">\n <input\n ref=\"searchInputRef\"\n v-model=\"search\"\n type=\"text\"\n class=\"w-full rounded border border-gray-300 px-2 py-1 text-sm focus:outline-none fc-select-search\"\n placeholder=\"Search...\"\n @keydown=\"onKeydown\"\n />\n </div>\n <!-- Options list -->\n <ul role=\"listbox\" class=\"max-h-60 overflow-auto py-1\">\n <li\n v-for=\"(option, idx) in filteredOptions\"\n :key=\"String(option.value)\"\n role=\"option\"\n :aria-selected=\"isSelected(option.value)\"\n :class=\"[\n 'cursor-pointer px-3 py-2 text-sm transition-colors duration-200',\n !isSelected(option.value) ? 'text-gray-900' : '',\n highlightedIndex === idx ? 'bg-gray-100' : '',\n option.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-gray-50',\n ]\"\n :style=\"isSelected(option.value) ? { backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)', color: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = idx\"\n >\n {{ option.label }}\n </li>\n <li v-if=\"filteredOptions.length === 0\" class=\"px-3 py-2 text-sm text-gray-400\">\n No options found\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<style scoped>\n.fc-select-search:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: number;\n min?: number;\n max?: number;\n step?: number;\n showTooltip?: boolean;\n disabled?: boolean;\n }>(),\n {\n min: 0,\n max: 100,\n step: 1,\n showTooltip: true,\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: number];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const isActive = ref(false);\n\n const percentage = computed(() => {\n const range = props.max - props.min;\n if (range === 0) return 0;\n return ((props.modelValue - props.min) / range) * 100;\n });\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit(\"update:modelValue\", parseFloat(target.value));\n }\n</script>\n\n<template>\n <div\n :class=\"[\n 'relative w-full py-2',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n ]\"\n >\n <!-- Tooltip -->\n <div\n v-if=\"showTooltip && isActive\"\n class=\"absolute -top-8 rounded bg-gray-800 px-2 py-1 text-xs text-white shadow-sm transition-opacity duration-200\"\n :style=\"{ left: `calc(${percentage}% - 16px)` }\"\n >\n {{ modelValue }}\n </div>\n <input\n type=\"range\"\n :value=\"modelValue\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-valuenow=\"modelValue\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-disabled=\"disabled || undefined\"\n class=\"h-2 w-full cursor-pointer appearance-none rounded-full bg-gray-200 focus:outline-none focus:ring-2 focus:ring-blue-500/20 disabled:pointer-events-none\"\n :style=\"{ accentColor: 'var(--fc-color-primary, #3b82f6)' }\"\n @input=\"onInput\"\n @mousedown=\"isActive = true\"\n @mouseup=\"isActive = false\"\n @touchstart=\"isActive = true\"\n @touchend=\"isActive = false\"\n @focus=\"isActive = true\"\n @blur=\"isActive = false; emit('blur', $event)\"\n />\n <!-- Min/Max labels -->\n <div class=\"mt-1 flex justify-between text-xs text-gray-400\">\n <span>{{ min }}</span>\n <span>{{ max }}</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: boolean;\n activeLabel?: string;\n inactiveLabel?: string;\n disabled?: boolean;\n }>(),\n {\n disabled: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: boolean];\n blur: [event: FocusEvent];\n }>();\n\n useThemeClasses();\n\n const wrapperClasses = computed(() => [\n \"inline-flex items-center gap-2 select-none\",\n props.disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n ]);\n\n function toggle() {\n if (props.disabled) return;\n emit(\"update:modelValue\", !props.modelValue);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === \" \" || event.key === \"Enter\") {\n event.preventDefault();\n toggle();\n }\n }\n</script>\n\n<template>\n <label :class=\"wrapperClasses\">\n <span v-if=\"inactiveLabel\" class=\"text-sm text-gray-600\">{{ inactiveLabel }}</span>\n <input\n type=\"checkbox\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n class=\"sr-only\"\n @change=\"toggle\"\n @blur=\"emit('blur', $event)\"\n />\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :aria-disabled=\"disabled || undefined\"\n tabindex=\"0\"\n :class=\"[\n 'relative inline-flex h-6 w-11 shrink-0 rounded-full border-2 border-transparent transition-colors duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)]',\n !modelValue ? 'bg-gray-300' : '',\n disabled ? 'pointer-events-none' : 'focus:outline-none focus:ring-2 focus:ring-blue-500/20',\n ]\"\n :style=\"modelValue ? { backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"toggle\"\n @keydown=\"onKeydown\"\n >\n <span\n :class=\"[\n 'pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm transition-transform duration-300 ease-[cubic-bezier(0.34,1.56,0.64,1)]',\n modelValue ? 'translate-x-5' : 'translate-x-0',\n ]\"\n aria-hidden=\"true\"\n />\n </button>\n <span v-if=\"activeLabel\" class=\"text-sm text-gray-600\">{{ activeLabel }}</span>\n </label>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string[] | null;\n maxTags?: number;\n suggestions?: string[];\n placeholder?: string;\n disabled?: boolean;\n }>(),\n {\n modelValue: () => [],\n suggestions: () => [],\n placeholder: \"Add a tag...\",\n disabled: false,\n },\n );\n\n const tags = computed(() => (Array.isArray(props.modelValue) ? props.modelValue : []));\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string[]];\n blur: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const inputValue = ref(\"\");\n const isFocused = ref(false);\n const showSuggestions = ref(false);\n const highlightedIndex = ref(-1);\n const containerRef = ref<HTMLDivElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n\n const canAdd = computed(() => !props.maxTags || tags.value.length < props.maxTags);\n\n const filteredSuggestions = computed(() => {\n if (!inputValue.value || props.suggestions.length === 0) return [];\n const q = inputValue.value.toLowerCase();\n return props.suggestions.filter(\n (s) => s.toLowerCase().includes(q) && !tags.value.includes(s),\n );\n });\n\n function addTag(tag: string) {\n const trimmed = tag.trim();\n if (!trimmed || !canAdd.value || tags.value.includes(trimmed)) return;\n emit(\"update:modelValue\", [...tags.value, trimmed]);\n inputValue.value = \"\";\n showSuggestions.value = false;\n highlightedIndex.value = -1;\n }\n\n function removeTag(index: number) {\n if (props.disabled) return;\n const updated = tags.value.filter((_, i) => i !== index);\n emit(\"update:modelValue\", updated);\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n const suggestion =\n highlightedIndex.value >= 0\n ? filteredSuggestions.value[highlightedIndex.value]\n : undefined;\n if (suggestion) {\n addTag(suggestion);\n } else {\n addTag(inputValue.value);\n }\n return;\n }\n if (event.key === \"Backspace\" && inputValue.value === \"\" && tags.value.length > 0) {\n removeTag(tags.value.length - 1);\n return;\n }\n if (event.key === \"ArrowDown\" && showSuggestions.value) {\n event.preventDefault();\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredSuggestions.value.length - 1,\n );\n return;\n }\n if (event.key === \"ArrowUp\" && showSuggestions.value) {\n event.preventDefault();\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0);\n return;\n }\n if (event.key === \"Escape\") {\n showSuggestions.value = false;\n highlightedIndex.value = -1;\n }\n }\n\n function onInput() {\n showSuggestions.value = inputValue.value.length > 0 && filteredSuggestions.value.length > 0;\n highlightedIndex.value = -1;\n }\n\n function onClickOutside(event: MouseEvent) {\n if (containerRef.value && !containerRef.value.contains(event.target as Node)) {\n showSuggestions.value = false;\n }\n }\n\n onMounted(() => document.addEventListener(\"mousedown\", onClickOutside));\n onBeforeUnmount(() => document.removeEventListener(\"mousedown\", onClickOutside));\n\n watch(inputValue, () => {\n nextTick(onInput);\n });\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[\n 'relative w-full',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n ]\"\n >\n <div\n :class=\"[\n 'flex flex-wrap items-center gap-1.5 rounded-md border bg-white px-2 py-1.5 text-sm transition-colors duration-200',\n !isFocused ? 'border-gray-300' : 'ring-2 ring-blue-500/20',\n theme.classes.value.input,\n ]\"\n :style=\"isFocused ? { borderColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"inputRef?.focus()\"\n >\n <!-- Tags -->\n <span\n v-for=\"(tag, idx) in tags\"\n :key=\"tag\"\n class=\"inline-flex items-center gap-1 rounded px-2 py-0.5 text-xs\"\n :style=\"{ backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 15%, white)', color: 'var(--fc-color-primary, #3b82f6)' }\"\n >\n {{ tag }}\n <button\n v-if=\"!disabled\"\n type=\"button\"\n class=\"ml-0.5 transition-colors duration-200\"\n :style=\"{ color: 'var(--fc-color-primary, #3b82f6)' }\"\n aria-label=\"Remove tag\"\n @click.stop=\"removeTag(idx)\"\n >\n ×\n </button>\n </span>\n <!-- Input -->\n <input\n ref=\"inputRef\"\n v-model=\"inputValue\"\n type=\"text\"\n :placeholder=\"tags.length === 0 ? placeholder : ''\"\n :disabled=\"disabled\"\n class=\"min-w-[80px] flex-1 border-0 bg-transparent p-0 text-sm outline-none placeholder:text-gray-400\"\n @keydown=\"onKeydown\"\n @focus=\"isFocused = true\"\n @blur=\"isFocused = false; emit('blur', $event)\"\n />\n </div>\n\n <!-- Suggestions dropdown -->\n <ul\n v-if=\"showSuggestions && filteredSuggestions.length > 0\"\n class=\"absolute z-50 mt-1 w-full rounded-md border border-gray-200 bg-white py-1 shadow-lg\"\n role=\"listbox\"\n >\n <li\n v-for=\"(suggestion, idx) in filteredSuggestions\"\n :key=\"suggestion\"\n role=\"option\"\n :aria-selected=\"highlightedIndex === idx\"\n :class=\"[\n 'cursor-pointer px-3 py-2 text-sm transition-colors duration-200',\n highlightedIndex !== idx ? 'text-gray-900 hover:bg-gray-50' : '',\n ]\"\n :style=\"highlightedIndex === idx ? { backgroundColor: 'color-mix(in srgb, var(--fc-color-primary, #3b82f6) 8%, white)', color: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @mousedown.prevent=\"addTag(suggestion)\"\n @mouseenter=\"highlightedIndex = idx\"\n >\n {{ suggestion }}\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, nextTick, onMounted, ref, watch } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n rows?: number;\n autoResize?: boolean;\n maxLength?: number;\n placeholder?: string;\n disabled?: boolean;\n readonly?: boolean;\n }>(),\n {\n rows: 3,\n autoResize: false,\n placeholder: \"\",\n disabled: false,\n readonly: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n const textareaRef = ref<HTMLTextAreaElement | null>(null);\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"placeholder:text-gray-400 resize-y\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-textarea-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n props.autoResize ? \"resize-none overflow-hidden\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function adjustHeight() {\n if (!props.autoResize || !textareaRef.value) return;\n const el = textareaRef.value;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n }\n\n function onInput(event: Event) {\n const target = event.target as HTMLTextAreaElement;\n emit(\"update:modelValue\", target.value);\n if (props.autoResize) nextTick(adjustHeight);\n }\n\n watch(\n () => props.modelValue,\n () => {\n if (props.autoResize) nextTick(adjustHeight);\n },\n );\n\n onMounted(() => {\n if (props.autoResize) adjustHeight();\n });\n</script>\n\n<template>\n <textarea\n ref=\"textareaRef\"\n :value=\"modelValue\"\n :rows=\"rows\"\n :maxlength=\"maxLength\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-textarea-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { useThemeClasses } from \"../../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n modelValue: string;\n inputType?: \"text\" | \"email\" | \"password\" | \"url\" | \"tel\";\n placeholder?: string;\n maxLength?: number;\n prefix?: string;\n suffix?: string;\n disabled?: boolean;\n readonly?: boolean;\n mask?: string;\n }>(),\n {\n inputType: \"text\",\n placeholder: \"\",\n disabled: false,\n readonly: false,\n },\n );\n\n const emit = defineEmits<{\n \"update:modelValue\": [value: string];\n blur: [event: FocusEvent];\n focus: [event: FocusEvent];\n }>();\n\n const theme = useThemeClasses();\n\n const hasAddons = computed(() => !!props.prefix || !!props.suffix);\n\n const baseClasses = computed(() =>\n [\n \"w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm\",\n \"placeholder:text-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500/20 fc-text-input\",\n \"transition-colors duration-200\",\n props.disabled ? \"opacity-50 cursor-not-allowed bg-gray-100\" : \"\",\n props.prefix ? \"rounded-l-none\" : \"\",\n props.suffix ? \"rounded-r-none\" : \"\",\n theme.classes.value.input,\n ]\n .filter(Boolean)\n .join(\" \"),\n );\n\n function onInput(event: Event) {\n const target = event.target as HTMLInputElement;\n emit(\"update:modelValue\", target.value);\n }\n</script>\n\n<template>\n <div v-if=\"hasAddons\" class=\"flex items-stretch\">\n <span\n v-if=\"prefix\"\n class=\"inline-flex items-center rounded-l-md border border-r-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ prefix }}\n </span>\n <input\n :type=\"inputType\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxLength\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n <span\n v-if=\"suffix\"\n class=\"inline-flex items-center rounded-r-md border border-l-0 border-gray-300 bg-gray-50 px-3 text-sm text-gray-500\"\n >\n {{ suffix }}\n </span>\n </div>\n <input\n v-else\n :type=\"inputType\"\n :value=\"modelValue\"\n :placeholder=\"placeholder\"\n :maxlength=\"maxLength\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :class=\"baseClasses\"\n :aria-disabled=\"disabled || undefined\"\n :aria-readonly=\"readonly || undefined\"\n @input=\"onInput\"\n @blur=\"emit('blur', $event)\"\n @focus=\"emit('focus', $event)\"\n />\n</template>\n\n<style scoped>\n.fc-text-input:focus {\n border-color: var(--fc-color-primary, #3b82f6);\n}\n</style>\n","<script setup lang=\"ts\">\n import type { FieldBase, FieldSchema } from \"@formatica/core\";\n import { computed, inject, ref } from \"vue\";\n import { type FormI18nInstance, FormI18nKey } from \"../core/useFormI18n\";\n import { FormThemeKey, type ThemeInstance } from \"../core/useTheme\";\n\n const props = withDefaults(\n defineProps<{\n fieldSchema: FieldSchema;\n fieldName: string;\n errors: string[];\n touched: boolean;\n }>(),\n {\n errors: () => [],\n touched: false,\n },\n );\n\n const i18n = inject<FormI18nInstance>(FormI18nKey);\n const theme = inject<ThemeInstance>(FormThemeKey);\n\n const showTooltip = ref(false);\n\n const label = computed(() => {\n if (i18n) {\n const translated = i18n.t(props.fieldName, \"label\");\n if (translated) return translated;\n }\n return props.fieldSchema.label ?? props.fieldName;\n });\n\n const helpText = computed(() => {\n if (i18n) {\n const translated = i18n.t(props.fieldName, \"helpText\");\n if (translated) return translated;\n }\n return props.fieldSchema.helpText ?? \"\";\n });\n\n const tooltip = computed(() => {\n if (i18n) {\n const translated = i18n.t(props.fieldName, \"tooltip\");\n if (translated) return translated;\n }\n return props.fieldSchema.tooltip ?? \"\";\n });\n\n const hasErrors = computed(() => props.touched && props.errors.length > 0);\n\n const wrapperClasses = computed(() => [\n theme?.classes.value.field ?? \"fc-field\",\n props.fieldSchema.className ?? \"\",\n props.fieldSchema.disabled ? \"opacity-50 cursor-not-allowed\" : \"\",\n props.fieldSchema.readOnly ? \"fc-readonly\" : \"\",\n ]);\n\n const fieldId = computed(() => `fc-field-${props.fieldName}`);\n const errorId = computed(() => `fc-error-${props.fieldName}`);\n</script>\n\n<template>\n <div\n :class=\"wrapperClasses\"\n :style=\"fieldSchema.style\"\n class=\"relative mb-4\"\n >\n <!-- Label row -->\n <div\n v-if=\"fieldSchema.type !== 'hidden'\"\n class=\"mb-1.5 flex items-center gap-1\"\n >\n <label\n :for=\"fieldId\"\n :class=\"theme?.classes.value.label ?? 'fc-label'\"\n class=\"block text-sm font-medium text-gray-700\"\n >\n {{ label }}\n <span\n v-if=\"fieldSchema.required\"\n class=\"text-red-500 ml-0.5\"\n aria-hidden=\"true\"\n >*</span>\n </label>\n\n <!-- Tooltip icon -->\n <span\n v-if=\"tooltip\"\n class=\"relative inline-flex\"\n @mouseenter=\"showTooltip = true\"\n @mouseleave=\"showTooltip = false\"\n @focusin=\"showTooltip = true\"\n @focusout=\"showTooltip = false\"\n >\n <button\n type=\"button\"\n class=\"inline-flex h-4 w-4 items-center justify-center rounded-full bg-gray-200 text-gray-500 text-xs hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n :aria-label=\"`Info: ${tooltip}`\"\n tabindex=\"0\"\n >\n i\n </button>\n <Transition\n enter-active-class=\"motion-safe:transition motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"motion-safe:transition motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"showTooltip\"\n role=\"tooltip\"\n class=\"absolute bottom-full left-1/2 z-10 mb-2 -translate-x-1/2 rounded-md bg-gray-900 px-3 py-1.5 text-xs text-white shadow-lg whitespace-nowrap\"\n >\n {{ tooltip }}\n <div class=\"absolute left-1/2 top-full -translate-x-1/2 border-4 border-transparent border-t-gray-900\" />\n </div>\n </Transition>\n </span>\n </div>\n\n <!-- Input slot -->\n <div :id=\"fieldId\">\n <slot />\n </div>\n\n <!-- Error messages -->\n <TransitionGroup\n tag=\"div\"\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 -translate-y-1 max-h-0\"\n enter-to-class=\"opacity-100 translate-y-0 max-h-8\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 translate-y-0 max-h-8\"\n leave-to-class=\"opacity-0 -translate-y-1 max-h-0\"\n class=\"\"\n >\n <p\n v-for=\"(error, idx) in (hasErrors ? errors : [])\"\n :key=\"error + idx\"\n :id=\"idx === 0 ? errorId : undefined\"\n :class=\"theme?.classes.value.error ?? 'fc-error'\"\n class=\"mt-1 text-xs text-red-500\"\n role=\"alert\"\n >\n {{ error }}\n </p>\n </TransitionGroup>\n\n <!-- Help text -->\n <p\n v-if=\"helpText && !hasErrors\"\n :class=\"theme?.classes.value.helpText ?? 'fc-help-text'\"\n class=\"mt-1 text-xs text-gray-400\"\n >\n {{ helpText }}\n </p>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import type { FieldSchema } from \"@formatica/core\";\n import { evaluateCondition, extractFields } from \"@formatica/core\";\n import type { Component, ComputedRef } from \"vue\";\n import { computed, inject } from \"vue\";\n import { FormComponentsKey, getFieldComponent } from \"../core/fieldRegistry\";\n import { FormContextKey } from \"../core/useForm\";\n import type { FormInstance } from \"../types/form\";\n import BaseField from \"./BaseField.vue\";\n\n const props = defineProps<{\n name: string;\n }>();\n\n const _form = inject<FormInstance>(FormContextKey);\n if (!_form) {\n throw new Error(\n \"FormField must be used inside a FormBuilder (FormContextKey not provided)\",\n );\n }\n const form: FormInstance = _form;\n\n // Per-instance component overrides from FormBuilder's `components` prop\n const componentOverrides = inject<ComputedRef<Record<string, Component>> | null>(\n FormComponentsKey,\n null,\n );\n\n const fieldSchema = computed<FieldSchema | undefined>(() =>\n extractFields(form.schema.fields).find((f) => f.name === props.name),\n );\n\n const inputComponent = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return undefined;\n // 1. Per-instance override (components prop on FormBuilder)\n const override = componentOverrides?.value?.[schema.type];\n if (override) return override;\n // 2. Global registry\n return getFieldComponent(schema.type);\n });\n\n const fieldValue = computed(() => form.values[props.name]);\n const fieldErrors = computed(() => form.errors[props.name] ?? []);\n const fieldTouched = computed(() => form.touched[props.name] ?? false);\n\n const isVisible = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return false;\n\n if (schema.condition) {\n return evaluateCondition(schema.condition, form.values);\n }\n if (typeof schema.visible === \"function\") {\n return schema.visible({\n values: { ...form.values },\n getFieldValue: (name: string) => form.values[name],\n });\n }\n return schema.visible ?? true;\n });\n\n const isDisabled = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return false;\n\n if (typeof schema.disabled === \"function\") {\n return schema.disabled({\n values: { ...form.values },\n getFieldValue: (name: string) => form.values[name],\n });\n }\n return schema.disabled ?? false;\n });\n\n const inputProps = computed(() => {\n const schema = fieldSchema.value;\n if (!schema) return {};\n\n const {\n name: _,\n label: _l,\n helpText: _h,\n tooltip: _t,\n condition: _c,\n translations: _tr,\n meta: _m,\n rules: _r,\n visible: _v,\n className: _cn,\n style: _s,\n defaultValue: _dv,\n ...rest\n } = schema;\n\n return {\n ...rest,\n modelValue: fieldValue.value,\n disabled: isDisabled.value,\n readonly: schema.readOnly ?? false,\n placeholder: schema.placeholder ?? \"\",\n };\n });\n\n function onUpdateModelValue(value: unknown) {\n form.setFieldValue(props.name, value);\n }\n\n function onBlur() {\n form.touched[props.name] = true;\n if (form.schema.settings?.validateOnBlur !== false) {\n form.validateField(props.name);\n }\n }\n</script>\n\n<template>\n <Transition\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-300 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 max-h-0\"\n enter-to-class=\"opacity-100 max-h-96\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 max-h-96\"\n leave-to-class=\"opacity-0 max-h-0\"\n >\n <BaseField\n v-if=\"isVisible && fieldSchema\"\n :field-schema=\"fieldSchema\"\n :field-name=\"name\"\n :errors=\"fieldErrors\"\n :touched=\"fieldTouched\"\n >\n <component\n :is=\"inputComponent\"\n v-if=\"inputComponent\"\n v-bind=\"inputProps\"\n :aria-invalid=\"fieldTouched && fieldErrors.length > 0 ? true : undefined\"\n :aria-describedby=\"fieldTouched && fieldErrors.length > 0 ? `fc-error-${name}` : undefined\"\n @update:model-value=\"onUpdateModelValue\"\n @blur=\"onBlur\"\n />\n <div\n v-else\n class=\"rounded-md border border-dashed border-amber-400 bg-amber-50 px-3 py-2 text-xs text-amber-700\"\n >\n No component registered for field type \"{{ fieldSchema.type }}\"\n </div>\n </BaseField>\n </Transition>\n</template>\n","<script setup lang=\"ts\">\n defineProps<{\n label?: string;\n className?: string;\n }>();\n</script>\n\n<template>\n <div\n :class=\"className ?? ''\"\n class=\"relative my-4\"\n role=\"separator\"\n >\n <div class=\"absolute inset-0 flex items-center\" aria-hidden=\"true\">\n <div class=\"w-full border-t border-gray-200\" />\n </div>\n <div v-if=\"label\" class=\"relative flex justify-center\">\n <span class=\"bg-white px-3 text-xs text-gray-500\">\n {{ label }}\n </span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import type { SchemaNode } from \"../../types/schema\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = withDefaults(\n defineProps<{\n title?: string;\n description?: string;\n collapsible?: boolean;\n collapsed?: boolean;\n children: SchemaNode[];\n className?: string;\n }>(),\n {\n collapsible: false,\n collapsed: false,\n },\n );\n\n const isCollapsed = ref(props.collapsed);\n\n function toggle() {\n if (props.collapsible) {\n isCollapsed.value = !isCollapsed.value;\n }\n }\n\n const headerId = computed(() =>\n props.title ? `fc-group-${props.title.toLowerCase().replace(/\\s+/g, \"-\")}` : undefined,\n );\n</script>\n\n<template>\n <fieldset\n :class=\"[className ?? '']\"\n class=\"rounded-lg border border-gray-200 bg-white\"\n :aria-labelledby=\"headerId\"\n >\n <!-- Header -->\n <div\n v-if=\"title || description\"\n class=\"border-b border-gray-100 px-4 py-3\"\n >\n <component\n :is=\"collapsible ? 'button' : 'div'\"\n :type=\"collapsible ? 'button' : undefined\"\n class=\"flex w-full items-center justify-between text-left\"\n :class=\"collapsible ? 'cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-500/40 rounded' : ''\"\n :aria-expanded=\"collapsible ? !isCollapsed : undefined\"\n :aria-controls=\"collapsible ? `fc-group-body-${headerId}` : undefined\"\n @click=\"toggle\"\n >\n <div>\n <legend\n v-if=\"title\"\n :id=\"headerId\"\n class=\"text-sm font-semibold text-gray-800\"\n >\n {{ title }}\n </legend>\n <p v-if=\"description\" class=\"mt-0.5 text-xs text-gray-500\">\n {{ description }}\n </p>\n </div>\n <svg\n v-if=\"collapsible\"\n class=\"h-4 w-4 shrink-0 text-gray-400 motion-safe:transition-transform motion-safe:duration-200\"\n :class=\"isCollapsed ? '' : 'rotate-180'\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </component>\n </div>\n\n <!-- Body with accordion animation -->\n <Transition\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-300 motion-safe:ease-out\"\n enter-from-class=\"max-h-0 opacity-0 overflow-hidden\"\n enter-to-class=\"max-h-[2000px] opacity-100 overflow-hidden\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-in\"\n leave-from-class=\"max-h-[2000px] opacity-100 overflow-hidden\"\n leave-to-class=\"max-h-0 opacity-0 overflow-hidden\"\n >\n <div\n v-show=\"!isCollapsed\"\n :id=\"collapsible ? `fc-group-body-${headerId}` : undefined\"\n class=\"p-4\"\n >\n <LayoutRenderer :nodes=\"children\" />\n </div>\n </Transition>\n </fieldset>\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import { sanitizeHtml } from \"../../utils/sanitize\";\n\n const props = defineProps<{\n content: string;\n className?: string;\n }>();\n\n const sanitized = computed(() => sanitizeHtml(props.content));\n</script>\n\n<template>\n <div\n :class=\"className ?? ''\"\n class=\"fc-html prose prose-sm max-w-none text-gray-700\"\n v-html=\"sanitized\"\n />\n</template>\n","<script setup lang=\"ts\">\n import { computed } from \"vue\";\n import type { SchemaNode } from \"../../types/schema\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = withDefaults(\n defineProps<{\n children: SchemaNode[];\n gap?: string | number;\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n className?: string;\n }>(),\n {\n align: \"stretch\",\n },\n );\n\n const alignClass = computed(() => {\n const map: Record<string, string> = {\n start: \"items-start\",\n center: \"items-center\",\n end: \"items-end\",\n stretch: \"items-stretch\",\n };\n return map[props.align] ?? \"items-stretch\";\n });\n\n const gapStyle = computed(() => {\n if (!props.gap) return \"\";\n return typeof props.gap === \"number\" ? `${props.gap}px` : props.gap;\n });\n</script>\n\n<template>\n <div\n class=\"grid grid-cols-12\"\n :class=\"[alignClass, className ?? '']\"\n :style=\"gapStyle ? { gap: gapStyle } : { gap: '1rem' }\"\n role=\"group\"\n >\n <LayoutRenderer :nodes=\"children\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, inject, ref } from \"vue\";\n import { FormContextKey } from \"../../core/useForm\";\n import type { FormInstance } from \"../../types/form\";\n import type { SchemaNode, StepNodeItem } from \"../../types/schema\";\n import { isFieldNode } from \"../../utils/extractFields\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = withDefaults(\n defineProps<{\n steps: StepNodeItem[];\n linear?: boolean;\n className?: string;\n }>(),\n {\n linear: false,\n },\n );\n\n const form = inject<FormInstance>(FormContextKey);\n\n const currentStep = ref(0);\n const completedSteps = ref<Set<number>>(new Set());\n\n const visibleSteps = computed(() => props.steps);\n\n const totalSteps = computed(() => visibleSteps.value.length);\n const isFirstStep = computed(() => currentStep.value === 0);\n const isLastStep = computed(() => currentStep.value === totalSteps.value - 1);\n\n function getStepFieldNames(step: StepNodeItem): string[] {\n const names: string[] = [];\n function collect(nodes: SchemaNode[]) {\n for (const node of nodes) {\n if (isFieldNode(node)) {\n names.push(node.name);\n } else if (node.type === \"row\" || node.type === \"group\") {\n collect(node.children);\n } else if (node.type === \"steps\") {\n for (const s of node.steps) collect(s.children);\n } else if (node.type === \"tabs\") {\n for (const t of node.tabs) collect(t.children);\n }\n }\n }\n collect(step.children);\n return names;\n }\n\n async function validateCurrentStep(): Promise<boolean> {\n if (!form || !props.linear) return true;\n const step = visibleSteps.value[currentStep.value];\n if (!step) return true;\n const fieldNames = getStepFieldNames(step);\n let allValid = true;\n for (const name of fieldNames) {\n const fieldErrors = await form.validateField(name);\n form.touched[name] = true;\n if (fieldErrors.length > 0) allValid = false;\n }\n return allValid;\n }\n\n async function goNext() {\n if (isLastStep.value) return;\n if (props.linear) {\n const valid = await validateCurrentStep();\n if (!valid) return;\n }\n completedSteps.value.add(currentStep.value);\n currentStep.value++;\n }\n\n function goPrevious() {\n if (isFirstStep.value) return;\n currentStep.value--;\n }\n\n function goToStep(index: number) {\n if (props.linear && index > currentStep.value) return;\n currentStep.value = index;\n }\n</script>\n\n<template>\n <div :class=\"className ?? ''\" class=\"space-y-6\">\n <!-- Progress indicator -->\n <nav aria-label=\"Form steps\" class=\"flex items-center justify-center\">\n <ol class=\"flex items-center gap-0\">\n <li\n v-for=\"(step, idx) in visibleSteps\"\n :key=\"idx\"\n class=\"flex items-center\"\n >\n <!-- Step circle -->\n <button\n type=\"button\"\n :disabled=\"linear && idx > currentStep\"\n :aria-current=\"idx === currentStep ? 'step' : undefined\"\n :aria-label=\"`Step ${idx + 1}: ${step.title}`\"\n class=\"relative flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 text-xs font-semibold motion-safe:transition-all motion-safe:duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n :class=\"[\n completedSteps.has(idx) && idx !== currentStep\n ? 'border-green-500 bg-green-500 text-white'\n : idx !== currentStep\n ? 'border-gray-300 bg-white text-gray-500'\n : 'text-white',\n linear && idx > currentStep ? 'cursor-not-allowed' : 'cursor-pointer hover:shadow-md',\n ]\"\n :style=\"idx === currentStep ? { borderColor: 'var(--fc-color-primary, #3b82f6)', backgroundColor: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"goToStep(idx)\"\n >\n <!-- Checkmark for completed -->\n <svg\n v-if=\"completedSteps.has(idx) && idx !== currentStep\"\n class=\"h-4 w-4 motion-safe:transition-transform motion-safe:duration-200\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n <span v-else>{{ idx + 1 }}</span>\n </button>\n\n <!-- Connector line -->\n <div\n v-if=\"idx < visibleSteps.length - 1\"\n class=\"mx-1 h-0.5 w-8 motion-safe:transition-colors motion-safe:duration-300 sm:w-12\"\n :class=\"completedSteps.has(idx) ? 'bg-green-500' : 'bg-gray-200'\"\n />\n </li>\n </ol>\n </nav>\n\n <!-- Step title -->\n <div\n v-if=\"visibleSteps[currentStep]\"\n class=\"text-center\"\n >\n <h3 class=\"text-base font-semibold text-gray-800\">\n {{ visibleSteps[currentStep]!.title }}\n </h3>\n <p\n v-if=\"visibleSteps[currentStep]!.description\"\n class=\"mt-1 text-sm text-gray-500\"\n >\n {{ visibleSteps[currentStep]!.description }}\n </p>\n </div>\n\n <!-- Step content with transition -->\n <Transition\n mode=\"out-in\"\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <div\n v-if=\"visibleSteps[currentStep]\"\n :key=\"currentStep\"\n >\n <LayoutRenderer :nodes=\"visibleSteps[currentStep]!.children\" />\n </div>\n </Transition>\n\n <!-- Navigation buttons -->\n <div class=\"flex items-center justify-between border-t border-gray-100 pt-4\">\n <button\n type=\"button\"\n :disabled=\"isFirstStep\"\n class=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 motion-safe:transition-colors motion-safe:duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50 fc-steps-prev-btn\"\n @click=\"goPrevious\"\n >\n Previous\n </button>\n <span class=\"text-xs text-gray-400\">\n {{ currentStep + 1 }} / {{ totalSteps }}\n </span>\n <button\n v-if=\"!isLastStep\"\n type=\"button\"\n class=\"rounded-md px-4 py-2 text-sm font-medium text-white motion-safe:transition-colors motion-safe:duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 fc-steps-next-btn\"\n :style=\"{ backgroundColor: 'var(--fc-color-primary, #3b82f6)' }\"\n @click=\"goNext\"\n >\n Next\n </button>\n <div v-else class=\"w-[72px]\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { computed, ref } from \"vue\";\n import type { TabNodeItem } from \"../../types/schema\";\n import LayoutRenderer from \"./LayoutRenderer.vue\";\n\n const props = defineProps<{\n tabs: TabNodeItem[];\n className?: string;\n }>();\n\n const activeIndex = ref(0);\n\n const visibleTabs = computed(() => props.tabs);\n\n function selectTab(index: number) {\n const tab = visibleTabs.value[index];\n if (tab?.disabled) return;\n activeIndex.value = index;\n }\n\n function onKeydown(event: KeyboardEvent, index: number) {\n const count = visibleTabs.value.length;\n let nextIndex = index;\n\n if (event.key === \"ArrowRight\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n nextIndex = (index + 1) % count;\n } else if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n nextIndex = (index - 1 + count) % count;\n } else if (event.key === \"Home\") {\n event.preventDefault();\n nextIndex = 0;\n } else if (event.key === \"End\") {\n event.preventDefault();\n nextIndex = count - 1;\n } else {\n return;\n }\n\n // Skip disabled tabs\n while (visibleTabs.value[nextIndex]?.disabled && nextIndex !== index) {\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowUp\") {\n nextIndex = (nextIndex - 1 + count) % count;\n } else {\n nextIndex = (nextIndex + 1) % count;\n }\n }\n\n selectTab(nextIndex);\n const tabEl = document.getElementById(`fc-tab-${nextIndex}`);\n tabEl?.focus();\n }\n\n const tabPanelId = computed(() => `fc-tabpanel-${activeIndex.value}`);\n</script>\n\n<template>\n <div :class=\"className ?? ''\">\n <!-- Tab bar -->\n <div\n class=\"relative flex border-b border-gray-200\"\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n >\n <button\n v-for=\"(tab, idx) in visibleTabs\"\n :key=\"idx\"\n :id=\"`fc-tab-${idx}`\"\n type=\"button\"\n role=\"tab\"\n :aria-selected=\"idx === activeIndex\"\n :aria-controls=\"tabPanelId\"\n :aria-disabled=\"tab.disabled || undefined\"\n :tabindex=\"idx === activeIndex ? 0 : -1\"\n class=\"relative px-4 py-2.5 text-sm font-medium motion-safe:transition-colors motion-safe:duration-150 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500/40\"\n :class=\"[\n idx !== activeIndex\n ? tab.disabled\n ? 'cursor-not-allowed text-gray-300'\n : 'text-gray-500 hover:text-gray-700'\n : '',\n ]\"\n :style=\"idx === activeIndex ? { color: 'var(--fc-color-primary, #3b82f6)' } : {}\"\n @click=\"selectTab(idx)\"\n @keydown=\"onKeydown($event, idx)\"\n >\n {{ tab.title }}\n <!-- Active underline indicator -->\n <span\n v-if=\"idx === activeIndex\"\n class=\"absolute inset-x-0 -bottom-px h-0.5 motion-safe:transition-all motion-safe:duration-200\"\n :style=\"{ backgroundColor: 'var(--fc-color-primary, #3b82f6)' }\"\n />\n </button>\n </div>\n\n <!-- Tab panel -->\n <Transition\n mode=\"out-in\"\n enter-active-class=\"motion-safe:transition-all motion-safe:duration-200 motion-safe:ease-out\"\n enter-from-class=\"opacity-0 translate-y-1\"\n enter-to-class=\"opacity-100 translate-y-0\"\n leave-active-class=\"motion-safe:transition-all motion-safe:duration-150 motion-safe:ease-in\"\n leave-from-class=\"opacity-100 translate-y-0\"\n leave-to-class=\"opacity-0 -translate-y-1\"\n >\n <div\n v-if=\"visibleTabs[activeIndex]\"\n :key=\"activeIndex\"\n :id=\"tabPanelId\"\n role=\"tabpanel\"\n :aria-labelledby=\"`fc-tab-${activeIndex}`\"\n tabindex=\"0\"\n class=\"pt-4\"\n >\n <LayoutRenderer :nodes=\"visibleTabs[activeIndex]!.children\" />\n </div>\n </Transition>\n </div>\n</template>\n","<script setup lang=\"ts\">\n import { inject } from \"vue\";\n import { evaluateCondition } from \"../../core/useConditions\";\n import { FormContextKey } from \"../../core/useForm\";\n import type { FormInstance } from \"../../types/form\";\n import type { LayoutNode } from \"../../types/layout\";\n import type { SchemaNode } from \"../../types/schema\";\n import { isFieldNode } from \"../../utils/extractFields\";\n import FormField from \"../FormField.vue\";\n import FormDivider from \"./FormDivider.vue\";\n import FormGroup from \"./FormGroup.vue\";\n import FormHtml from \"./FormHtml.vue\";\n import FormRow from \"./FormRow.vue\";\n import FormSteps from \"./FormSteps.vue\";\n import FormTabs from \"./FormTabs.vue\";\n\n defineProps<{\n nodes: SchemaNode[] | LayoutNode[];\n }>();\n\n const form = inject<FormInstance>(FormContextKey);\n\n function isConditionalVisible(node: LayoutNode & { type: \"conditional\" }): boolean {\n if (!form) return true;\n return evaluateCondition(node.condition, form.values);\n }\n\n function getSpanStyle(span: number | string | undefined): Record<string, string> {\n if (span === \"full\") return { gridColumn: \"1 / -1\" };\n if (span === \"auto\") return { gridColumn: \"auto\" };\n if (typeof span === \"number\") return { gridColumn: `span ${span} / span ${span}` };\n // Default: full width when inside a grid (span 12)\n return { gridColumn: \"span 12 / span 12\" };\n }\n</script>\n\n<template>\n <template v-for=\"(node, index) in nodes\" :key=\"index\">\n <!-- Field node (SchemaNode with a name) -->\n <div\n v-if=\"isFieldNode(node as SchemaNode)\"\n :class=\"(node as any).className ?? ''\"\n :style=\"getSpanStyle((node as any).span)\"\n >\n <FormField :name=\"(node as any).name\" />\n </div>\n\n <!-- Legacy field reference (LayoutNode backwards compat) -->\n <div\n v-else-if=\"node.type === 'field'\"\n :class=\"(node as any).className ?? ''\"\n :style=\"getSpanStyle((node as any).span)\"\n >\n <FormField :name=\"(node as any).name\" />\n </div>\n\n <!-- Row -->\n <FormRow\n v-else-if=\"node.type === 'row'\"\n :children=\"(node as any).children\"\n :gap=\"(node as any).gap\"\n :align=\"(node as any).align\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Group -->\n <FormGroup\n v-else-if=\"node.type === 'group'\"\n :title=\"(node as any).title\"\n :description=\"(node as any).description\"\n :collapsible=\"(node as any).collapsible\"\n :collapsed=\"(node as any).collapsed\"\n :children=\"(node as any).children\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Steps -->\n <FormSteps\n v-else-if=\"node.type === 'steps'\"\n :steps=\"(node as any).steps\"\n :linear=\"(node as any).linear\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Tabs -->\n <FormTabs\n v-else-if=\"node.type === 'tabs'\"\n :tabs=\"(node as any).tabs\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Divider -->\n <FormDivider\n v-else-if=\"node.type === 'divider'\"\n :label=\"(node as any).label\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Html -->\n <FormHtml\n v-else-if=\"node.type === 'html'\"\n :content=\"(node as any).content\"\n :class-name=\"(node as any).className\"\n />\n\n <!-- Conditional (legacy LayoutNode) -->\n <template v-else-if=\"node.type === 'conditional'\">\n <LayoutRenderer\n v-if=\"isConditionalVisible(node as any)\"\n :nodes=\"(node as any).children\"\n />\n <LayoutRenderer\n v-else-if=\"(node as any).elseChildren?.length\"\n :nodes=\"(node as any).elseChildren\"\n />\n </template>\n </template>\n</template>\n","<script setup lang=\"ts\">\n import type { FormSchema, LayoutSchema, SchemaNode, ThemeConfig } from \"@formatica/core\";\n import { type Component, computed, inject, onMounted, provide, toRef, watch } from \"vue\";\n import { FormComponentsKey, hasFieldType, registerFieldType } from \"../core/fieldRegistry\";\n import { useForm } from \"../core/useForm\";\n import { useFormI18nContext } from \"../core/useFormI18n\";\n import { useTheme, useThemeClasses } from \"../core/useTheme\";\n import type { FormaticaOptions } from \"../plugin\";\n import { FormaticaKey } from \"../plugin\";\n import CheckboxGroupInput from \"./inputs/CheckboxGroupInput.vue\";\n import CheckboxInput from \"./inputs/CheckboxInput.vue\";\n import DateInput from \"./inputs/DateInput.vue\";\n import FileInput from \"./inputs/FileInput.vue\";\n import NumberInput from \"./inputs/NumberInput.vue\";\n import PhoneInput from \"./inputs/PhoneInput.vue\";\n import RadioInput from \"./inputs/RadioInput.vue\";\n import SelectInput from \"./inputs/SelectInput.vue\";\n import SliderInput from \"./inputs/SliderInput.vue\";\n import SwitchInput from \"./inputs/SwitchInput.vue\";\n import TagsInput from \"./inputs/TagsInput.vue\";\n import TextareaInput from \"./inputs/TextareaInput.vue\";\n // Built-in input components\n import TextInput from \"./inputs/TextInput.vue\";\n import LayoutRenderer from \"./layout/LayoutRenderer.vue\";\n\n const props = defineProps<{\n schema: FormSchema;\n layout?: LayoutSchema;\n locale?: string;\n fallbackLocale?: string;\n modelValue?: Record<string, unknown>;\n theme?: ThemeConfig;\n /** Override built-in components or register custom field types per instance. */\n components?: Record<string, Component>;\n }>();\n\n const emit = defineEmits<{\n submit: [values: Record<string, unknown>];\n error: [error: unknown];\n \"update:modelValue\": [values: Record<string, unknown>];\n }>();\n\n // Inject global plugin options (if installed via createFormatica)\n const globalOptions = inject<FormaticaOptions | undefined>(FormaticaKey, undefined);\n\n // Merge: props override globals\n const resolvedTheme = computed(() => props.theme ?? globalOptions?.theme);\n const resolvedLocale = computed(() => props.locale ?? globalOptions?.locale ?? \"en\");\n const resolvedFallbackLocale = computed(\n () => props.fallbackLocale ?? globalOptions?.fallbackLocale ?? \"en\",\n );\n const resolvedComponents = computed(() => props.components ?? globalOptions?.components ?? {});\n\n // Register built-in field types (idempotent)\n const builtInTypes: [string, Component][] = [\n [\"text\", TextInput],\n [\"number\", NumberInput],\n [\"textarea\", TextareaInput],\n [\"select\", SelectInput],\n [\"checkbox\", CheckboxInput],\n [\"checkbox-group\", CheckboxGroupInput],\n [\"radio\", RadioInput],\n [\"switch\", SwitchInput],\n [\"date\", DateInput],\n [\"file\", FileInput],\n [\"slider\", SliderInput],\n [\"tags\", TagsInput],\n [\"phone\", PhoneInput],\n ];\n\n for (const [type, component] of builtInTypes) {\n if (!hasFieldType(type)) {\n registerFieldType(type, component);\n }\n }\n\n // Provide per-instance component overrides (merged with globals)\n provide(FormComponentsKey, resolvedComponents);\n\n // Initialize theme (provides FormThemeKey) — reactive to prop/global changes\n useTheme(resolvedTheme);\n const themeInstance = useThemeClasses();\n\n // Build CSS variables directly from resolved theme for the form element\n // This ensures they're always applied even if provide/inject chain has issues\n function camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n }\n\n const formCssVars = computed<Record<string, string>>(() => {\n const theme = resolvedTheme.value;\n if (!theme) return {};\n const vars: Record<string, string> = {};\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value) vars[`--fc-color-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.borders) {\n for (const [key, value] of Object.entries(theme.borders)) {\n if (value) vars[`--fc-border-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.spacing) {\n for (const [key, value] of Object.entries(theme.spacing)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.typography) {\n for (const [key, value] of Object.entries(theme.typography)) {\n if (value) vars[`--fc-${camelToKebab(key)}`] = value;\n }\n }\n if (theme.cssVars) {\n Object.assign(vars, theme.cssVars);\n }\n return vars;\n });\n\n // Initialize form (provides FormContextKey and FormI18nKey)\n const form = useForm(props.schema, {\n locale: resolvedLocale.value,\n fallbackLocale: resolvedFallbackLocale.value,\n });\n\n // Sync external modelValue into form\n if (props.modelValue) {\n for (const [key, value] of Object.entries(props.modelValue)) {\n form.setFieldValue(key, value);\n }\n }\n\n // Watch modelValue for external changes\n watch(\n () => props.modelValue,\n (newValues) => {\n if (!newValues) return;\n for (const [key, value] of Object.entries(newValues)) {\n if (form.values[key] !== value) {\n form.setFieldValue(key, value);\n }\n }\n },\n { deep: true },\n );\n\n // Emit modelValue updates when form values change\n watch(\n () => ({ ...form.values }),\n (newValues) => {\n emit(\"update:modelValue\", newValues);\n },\n { deep: true },\n );\n\n // Watch locale changes (resolved from prop or global)\n watch(resolvedLocale, (newLocale) => {\n if (newLocale) form.setLocale(newLocale);\n });\n\n // I18n for form-level translations\n const i18n = useFormI18nContext();\n\n const formTitle = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"\";\n const loc = translations[resolvedLocale.value];\n if (loc?.messages?.title) return loc.messages.title;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.messages?.title ?? \"\";\n });\n\n const formDescription = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"\";\n const loc = translations[resolvedLocale.value];\n if (loc?.messages?.description) return loc.messages.description;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.messages?.description ?? \"\";\n });\n\n const submitLabel = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"Submit\";\n const loc = translations[resolvedLocale.value];\n if (loc?.submit) return loc.submit;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.submit ?? \"Submit\";\n });\n\n const resetLabel = computed(() => {\n const translations = props.schema.translations;\n if (!translations) return \"Reset\";\n const loc = translations[resolvedLocale.value];\n if (loc?.reset) return loc.reset;\n const fb = translations[resolvedFallbackLocale.value];\n return fb?.reset ?? \"Reset\";\n });\n\n // Resolve layout: schema.fields is the unified tree (fields + containers).\n // Fall back to layout prop for backwards compat.\n const layoutNodes = computed<SchemaNode[]>(() => {\n if (props.layout?.nodes?.length) {\n return props.layout.nodes as unknown as SchemaNode[];\n }\n return props.schema.fields;\n });\n\n async function onSubmit() {\n try {\n await form.submit(async (values) => {\n emit(\"submit\", values);\n });\n } catch (error: unknown) {\n emit(\"error\", error);\n }\n }\n\n function onReset() {\n form.reset();\n }\n\n defineExpose({ form });\n</script>\n\n<template>\n <form\n :class=\"[themeInstance.classes.value.form, 'fc-form-builder']\"\n :style=\"formCssVars\"\n novalidate\n @submit.prevent=\"onSubmit\"\n @reset.prevent=\"onReset\"\n >\n <!-- Form title / description -->\n <div v-if=\"formTitle || formDescription\" class=\"mb-6\">\n <h2\n v-if=\"formTitle\"\n class=\"text-lg font-semibold text-gray-900\"\n >\n {{ formTitle }}\n </h2>\n <p\n v-if=\"formDescription\"\n class=\"mt-1 text-sm text-gray-500\"\n >\n {{ formDescription }}\n </p>\n </div>\n\n <!-- Layout -->\n <LayoutRenderer :nodes=\"layoutNodes\" />\n\n <!-- Actions -->\n <div class=\"mt-6 flex items-center gap-3\">\n <button\n type=\"submit\"\n :disabled=\"form.isSubmitting.value\"\n :class=\"themeInstance.classes.value.button\"\n class=\"fc-submit-btn rounded-md px-4 py-2 text-sm font-medium text-white motion-safe:transition-colors motion-safe:duration-150 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n style=\"background-color: var(--fc-color-primary, #3b82f6)\"\n >\n <span\n v-if=\"form.isSubmitting.value\"\n class=\"mr-2 inline-block h-3.5 w-3.5 animate-spin rounded-full border-2 border-white border-t-transparent\"\n aria-hidden=\"true\"\n />\n {{ submitLabel }}\n </button>\n <button\n type=\"reset\"\n :disabled=\"form.isSubmitting.value\"\n class=\"rounded-md border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 motion-safe:transition-colors motion-safe:duration-150 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {{ resetLabel }}\n </button>\n </div>\n </form>\n</template>\n"],"names":["FormComponentsKey","registry","registerFieldType","type","component","unregisterFieldType","getFieldComponent","hasFieldType","getRegisteredFieldTypes","createEventBus","handlers","on","event","handler","set","emit","payload","FormI18nKey","defaultMessages","useFormI18n","options","locale","fallbackLocale","fieldTranslations","formTranslations","t","field","key","translations","localeData","value","fallbackData","titleCase","tOption","optionValue","_a","_b","tValidation","ruleName","params","localeMessages","interpolate","fallbackMessages","template","instance","provide","useFormI18nContext","inject","_","parseRuleString","input","segment","rawName","paramParts","name","values","normalizeRules","raw","rules","r","paramValue","debounce","fn","ms","timer","pendingResolve","args","resolve","result","useValidation","fields","settings","errors","ref","debouncedValidators","getDebounced","runValidateField","validator","ctx","f","fieldRules","fieldErrors","rule","condition","evaluateCondition","isEmpty","getRule","message","interpolateMessage","validateField","debounceMs","validateAll","results","promises","clearFieldErrors","clearAllErrors","FormContextKey","getTypeDefault","buildDefaults","collectFieldTranslations","map","useForm","schema","currentSchema","fieldsRef","extractFields","reactive","touched","dirty","isSubmitting","submitCount","isValid","computed","e","isDirty","bus","getFormContext","valuesRef","validation","initialValues","watch","newVals","oldVals","fieldInstances","buildFieldInstance","fs","n","v","initFieldInstances","validate","allErrors","errs","valid","submit","error","reset","clear","updateSchema","newSchema","newFields","newNames","messages","k","disabled","visible","l","FormThemeKey","defaultTheme","useTheme","config","themeRef","isRef","classes","comps","cssVars","vars","camelToKebab","useThemeClasses","injected","useThemeDefault","str","FormaticaKey","createFormatica","app","props","__props","__emit","isChecked","isOptionDisabled","option","toggleOption","arr","idx","onKeydown","_createElementBlock","_Fragment","_renderList","_normalizeClass","_createElementVNode","$event","_cache","_normalizeStyle","_openBlock","_hoisted_3","_hoisted_4","_toDisplayString","wrapperClasses","toggle","theme","baseClasses","onInput","target","fileInputRef","isDragOver","files","formatSize","bytes","filterFiles","incoming","limit","remaining","addFiles","onFileChange","removeFile","index","updated","i","onDragOver","onDragLeave","onDrop","openPicker","_hoisted_2","file","_hoisted_5","_hoisted_6","_hoisted_7","_withModifiers","_hoisted_8","hasAddons","num","_hoisted_1","countryNames","countryFlag","code","c","allCountries","getCountries","getCountryCallingCode","a","b","selectedCountry","nationalNumber","dropdownOpen","search","searchInputRef","filteredCountries","q","selectedCountryData","onMounted","parseIncoming","val","parsed","parsePhoneNumber","emitValue","formatter","AsYouType","selectCountry","openDropdown","nextTick","closeDropdown","country","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","isSelected","selectOption","isOpen","highlightedIndex","containerRef","selectedValues","displayLabel","opt","o","filteredOptions","close","open","removeTag","onClickOutside","tagLabel","onBeforeUnmount","_unref","_hoisted_9","isActive","percentage","range","tags","inputValue","isFocused","showSuggestions","inputRef","canAdd","filteredSuggestions","s","addTag","tag","trimmed","suggestion","_createTextVNode","textareaRef","adjustHeight","el","i18n","showTooltip","label","translated","helpText","tooltip","hasErrors","fieldId","errorId","_createVNode","_Transition","_renderSlot","_ctx","_TransitionGroup","_form","form","componentOverrides","fieldSchema","inputComponent","override","fieldValue","fieldTouched","isVisible","isDisabled","inputProps","_l","_h","_t","_c","_tr","_m","_r","_v","_cn","_s","_dv","rest","onUpdateModelValue","onBlur","_createBlock","BaseField","_resolveDynamicComponent","_mergeProps","isCollapsed","headerId","LayoutRenderer","sanitized","sanitizeHtml","alignClass","gapStyle","currentStep","completedSteps","visibleSteps","totalSteps","isFirstStep","isLastStep","getStepFieldNames","step","names","collect","nodes","node","isFieldNode","validateCurrentStep","fieldNames","allValid","goNext","goPrevious","goToStep","activeIndex","visibleTabs","selectTab","tab","count","nextIndex","tabEl","tabPanelId","isConditionalVisible","getSpanStyle","span","FormField","FormRow","FormGroup","FormSteps","FormTabs","FormDivider","FormHtml","_component_LayoutRenderer","globalOptions","resolvedTheme","resolvedLocale","resolvedFallbackLocale","resolvedComponents","builtInTypes","TextInput","NumberInput","TextareaInput","SelectInput","CheckboxInput","CheckboxGroupInput","RadioInput","SwitchInput","DateInput","FileInput","SliderInput","TagsInput","PhoneInput","themeInstance","formCssVars","newValues","newLocale","formTitle","loc","fb","formDescription","submitLabel","resetLabel","layoutNodes","onSubmit","onReset","__expose"],"mappings":"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J,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MAC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"}
|