@theredhead/lucid-forms 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theredhead-lucid-forms.mjs","sources":["../../../packages/ui-forms/src/lib/types/condition.types.ts","../../../packages/ui-forms/src/lib/types/form-schema.types.ts","../../../packages/ui-forms/src/lib/validation/validators.ts","../../../packages/ui-forms/src/lib/engine/condition-evaluator.ts","../../../packages/ui-forms/src/lib/engine/form-engine.ts","../../../packages/ui-forms/src/lib/registry/field-registry.ts","../../../packages/ui-forms/src/lib/registry/text-adapter-resolver.ts","../../../packages/ui-forms/src/lib/registry/built-in-fields.ts","../../../packages/ui-forms/src/lib/export/export-strategy.ts","../../../packages/ui-forms/src/lib/export/json-export-strategy.ts","../../../packages/ui-forms/src/lib/export/angular-component-export-strategy.ts","../../../packages/ui-forms/src/lib/export/index.ts","../../../packages/ui-forms/src/lib/components/form-field/form-field.component.ts","../../../packages/ui-forms/src/lib/components/form-field/form-field.component.html","../../../packages/ui-forms/src/lib/components/form-group.component.ts","../../../packages/ui-forms/src/lib/components/form-group.component.html","../../../packages/ui-forms/src/lib/components/form-settings.ts","../../../packages/ui-forms/src/lib/components/form.component.ts","../../../packages/ui-forms/src/lib/components/form.component.html","../../../packages/ui-forms/src/lib/components/form-wizard.component.ts","../../../packages/ui-forms/src/lib/components/form-wizard.component.html","../../../packages/ui-forms/src/lib/components/designer/designer-engine.ts","../../../packages/ui-forms/src/lib/components/designer/field-palette.component.ts","../../../packages/ui-forms/src/lib/components/designer/field-palette.component.html","../../../packages/ui-forms/src/lib/components/designer/designer-canvas.component.ts","../../../packages/ui-forms/src/lib/components/designer/designer-canvas.component.html","../../../packages/ui-forms/src/lib/components/designer/config-schema.ts","../../../packages/ui-forms/src/lib/components/designer/richtext-content-dialog/richtext-content-dialog.component.ts","../../../packages/ui-forms/src/lib/components/designer/richtext-content-dialog/richtext-content-dialog.component.html","../../../packages/ui-forms/src/lib/components/designer/property-inspector.component.ts","../../../packages/ui-forms/src/lib/components/designer/property-inspector.component.html","../../../packages/ui-forms/src/lib/components/designer/form-designer.component.ts","../../../packages/ui-forms/src/lib/components/designer/form-designer.component.html","../../../packages/ui-forms/src/lib/components/designer/index.ts","../../../packages/ui-forms/src/public-api.ts","../../../packages/ui-forms/src/theredhead-lucid-forms.ts"],"sourcesContent":["// ── Condition types ───────────────────────────────────────────────────\n\n/**\n * Operators available for field/group conditions.\n *\n * These compare the **live** value of a referenced field against\n * a target value to determine visibility or enabled state.\n */\nexport type ConditionOperator =\n | \"equals\"\n | \"notEquals\"\n | \"contains\"\n | \"notContains\"\n | \"empty\"\n | \"notEmpty\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\"\n | \"in\"\n | \"notIn\";\n\n/**\n * A single condition that controls whether a field or group is\n * visible / enabled, based on the live value of another field.\n *\n * Conditions are JSON-serializable so a form schema can be stored\n * as pure JSON and restored later.\n *\n * @example\n * ```json\n * { \"field\": \"country\", \"operator\": \"equals\", \"value\": \"NL\" }\n * ```\n */\nexport interface FieldCondition {\n /** ID of the field whose value is evaluated. */\n readonly field: string;\n\n /** Comparison operator. */\n readonly operator: ConditionOperator;\n\n /**\n * Target value to compare against. Omitted for unary operators\n * like `\"empty\"` and `\"notEmpty\"`.\n */\n readonly value?: unknown;\n}\n\n/**\n * Logical combination of multiple conditions.\n *\n * When `mode` is `\"every\"` (default), **all** conditions must pass.\n * When `mode` is `\"some\"`, **at least one** must pass.\n */\nexport interface ConditionGroup {\n /** How to combine the conditions. Defaults to `\"every\"`. */\n readonly mode?: \"every\" | \"some\";\n\n /** The individual conditions to evaluate. */\n readonly conditions: readonly FieldCondition[];\n}\n\n/**\n * Either a single condition or a group of conditions.\n * Used for both visibility and enabled state.\n */\nexport type Condition = FieldCondition | ConditionGroup;\n\n/**\n * Check whether a `Condition` is a `ConditionGroup` (has nested\n * `conditions` array) rather than a single `FieldCondition`.\n */\nexport function isConditionGroup(c: Condition): c is ConditionGroup {\n return \"conditions\" in c && Array.isArray(c.conditions);\n}\n","// ── Form schema types ────────────────────────────────────────────────\n\nimport type { Condition } from \"./condition.types\";\nimport type { ValidationRule } from \"./validation.types\";\n\n/**\n * An option for select / radio / autocomplete fields.\n *\n * @example\n * ```json\n * { \"label\": \"Netherlands\", \"value\": \"NL\" }\n * ```\n */\nexport interface FormFieldOption {\n readonly label: string;\n readonly value: unknown;\n /** Whether the option is disabled. */\n readonly disabled?: boolean;\n}\n\n/**\n * Definition of a single form field. Fully JSON-serializable.\n *\n * The `component` key is resolved at runtime through the\n * {@link FormFieldRegistry} to an actual Angular component that\n * exposes a two-way `value` (or mapped model) signal.\n *\n * @example\n * ```json\n * {\n * \"id\": \"email\",\n * \"title\": \"E-mail address\",\n * \"component\": \"text\",\n * \"config\": { \"type\": \"email\", \"placeholder\": \"you@example.com\" },\n * \"validation\": [\n * { \"type\": \"required\", \"message\": \"E-mail is required.\" },\n * { \"type\": \"email\", \"message\": \"Enter a valid e-mail address.\" }\n * ]\n * }\n * ```\n */\nexport interface FormFieldDefinition {\n /** Unique ID — used as the key in the form values object. */\n readonly id: string;\n\n /** Human-readable label shown above the field. */\n readonly title: string;\n\n /** Optional helper text shown below the field. */\n readonly description?: string;\n\n /**\n * Registry key that maps to an Angular component.\n *\n * Built-in keys: `\"text\"`, `\"select\"`, `\"checkbox\"`, `\"toggle\"`,\n * `\"radio\"`, `\"autocomplete\"`, `\"date\"`, `\"time\"`, `\"datetime\"`,\n * `\"color\"`, `\"slider\"`, `\"richtext\"`, `\"file\"`.\n */\n readonly component: string;\n\n /**\n * Arbitrary key–value config forwarded as inputs to the\n * resolved component. Keys must match the component's `input()`\n * signal names.\n */\n readonly config?: Readonly<Record<string, unknown>>;\n\n /**\n * Options for select, radio, and autocomplete fields.\n * Passed to the component's `options` or equivalent input.\n */\n readonly options?: readonly FormFieldOption[];\n\n /** Validation rules evaluated by the form engine. */\n readonly validation?: readonly ValidationRule[];\n\n /**\n * When set, the field is only visible if the condition is met.\n * Hidden fields are excluded from the output JSON.\n */\n readonly visibleWhen?: Condition;\n\n /**\n * When set, the field is disabled (non-interactive) unless the\n * condition is met.\n */\n readonly enabledWhen?: Condition;\n\n /** Default value used when the form is first created. */\n readonly defaultValue?: unknown;\n}\n\n/**\n * A named group of fields. Rendered as a fieldset / section, or\n * as a single step in wizard mode.\n *\n * @example\n * ```json\n * {\n * \"id\": \"personal\",\n * \"title\": \"Personal information\",\n * \"fields\": [\n * { \"id\": \"firstName\", \"title\": \"First name\", \"component\": \"text\" },\n * { \"id\": \"lastName\", \"title\": \"Last name\", \"component\": \"text\" }\n * ]\n * }\n * ```\n */\nexport interface FormGroupDefinition {\n /** Unique ID for the group. */\n readonly id: string;\n\n /** Group heading. */\n readonly title?: string;\n\n /** Optional description shown below the heading. */\n readonly description?: string;\n\n /** Ordered list of fields in this group. */\n readonly fields: readonly FormFieldDefinition[];\n\n /** Condition controlling group visibility. */\n readonly visibleWhen?: Condition;\n\n /** Condition controlling group enabled state. */\n readonly enabledWhen?: Condition;\n}\n\n/**\n * Top-level form schema. This is the JSON document that fully\n * describes a form — its structure, fields, validation, and\n * conditional logic.\n *\n * @example\n * ```json\n * {\n * \"id\": \"contact\",\n * \"title\": \"Contact form\",\n * \"groups\": [\n * {\n * \"id\": \"main\",\n * \"title\": \"Your details\",\n * \"fields\": [\n * { \"id\": \"name\", \"title\": \"Name\", \"component\": \"text\" },\n * { \"id\": \"email\", \"title\": \"E-mail\", \"component\": \"text\",\n * \"config\": { \"type\": \"email\" } }\n * ]\n * }\n * ]\n * }\n * ```\n */\nexport interface FormSchema {\n /** Unique form identifier. */\n readonly id: string;\n\n /** Form title (rendered as a heading). */\n readonly title?: string;\n\n /** Optional description shown below the title. */\n readonly description?: string;\n\n /** Ordered list of field groups. */\n readonly groups: readonly FormGroupDefinition[];\n}\n\n/**\n * The plain-object output produced by the form engine.\n *\n * Keys are field IDs, values are the current field values.\n * Only visible fields are included.\n */\nexport type FormValues = Record<string, unknown>;\n\n// ── Flair helpers ───────────────────────────────────────────────────\n\n/**\n * Known flair component keys. Flair items are purely presentational\n * elements that do not collect user input.\n */\nexport const FLAIR_COMPONENTS = [\n \"flair:richtext\",\n \"flair:image\",\n \"flair:media\",\n] as const;\n\n/** A flair component key. */\nexport type FlairComponent = (typeof FLAIR_COMPONENTS)[number];\n\n/**\n * Returns `true` if the given component key is a flair (non-data)\n * component.\n */\nexport function isFlairComponent(\n component: string,\n): component is FlairComponent {\n return (FLAIR_COMPONENTS as readonly string[]).includes(component);\n}\n","// ── Validation engine ────────────────────────────────────────────────\n\nimport type {\n ValidationError,\n ValidationResult,\n ValidationRule,\n} from \"../types/validation.types\";\n\n/**\n * Signature for a custom validator function.\n *\n * Returns `null` when valid, or a `ValidationError` on failure.\n */\nexport type ValidatorFn = (\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n) => ValidationError | null;\n\n/** Registry of custom validators keyed by `validatorId`. */\nconst customValidators = new Map<string, ValidatorFn>();\n\n/**\n * Register a custom validator that can be referenced by\n * `{ type: \"custom\", params: { validatorId: \"myId\" } }` in a\n * form schema.\n */\nexport function registerCustomValidator(id: string, fn: ValidatorFn): void {\n customValidators.set(id, fn);\n}\n\n// ── Built-in validator implementations ────────────────────────────────\n\nfunction isEmpty(v: unknown): boolean {\n if (v === null || v === undefined) return true;\n if (typeof v === \"boolean\") return !v;\n if (typeof v === \"string\") return v.trim().length === 0;\n if (Array.isArray(v)) return v.length === 0;\n return false;\n}\n\nfunction validateRequired(\n value: unknown,\n _params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n return isEmpty(value)\n ? { type: \"required\", message: message ?? \"This field is required.\" }\n : null;\n}\n\nfunction validateMinLength(\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n const min = params[\"min\"] as number;\n if (typeof value !== \"string\") return null;\n return value.length < min\n ? {\n type: \"minLength\",\n message: message ?? `Must be at least ${min} characters.`,\n }\n : null;\n}\n\nfunction validateMaxLength(\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n const max = params[\"max\"] as number;\n if (typeof value !== \"string\") return null;\n return value.length > max\n ? {\n type: \"maxLength\",\n message: message ?? `Must be at most ${max} characters.`,\n }\n : null;\n}\n\nfunction validateMin(\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n const min = params[\"min\"] as number;\n if (typeof value !== \"number\") return null;\n return value < min\n ? { type: \"min\", message: message ?? `Must be at least ${min}.` }\n : null;\n}\n\nfunction validateMax(\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n const max = params[\"max\"] as number;\n if (typeof value !== \"number\") return null;\n return value > max\n ? { type: \"max\", message: message ?? `Must be at most ${max}.` }\n : null;\n}\n\nfunction validatePattern(\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n const pattern = params[\"pattern\"] as string;\n if (typeof value !== \"string\" || value.length === 0) return null;\n const re = new RegExp(pattern);\n return !re.test(value)\n ? {\n type: \"pattern\",\n message: message ?? `Does not match the required pattern.`,\n }\n : null;\n}\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nfunction validateEmail(\n value: unknown,\n _params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n if (typeof value !== \"string\" || value.length === 0) return null;\n return !EMAIL_RE.test(value)\n ? {\n type: \"email\",\n message: message ?? \"Enter a valid e-mail address.\",\n }\n : null;\n}\n\nfunction validateCustom(\n value: unknown,\n params: Readonly<Record<string, unknown>>,\n message?: string,\n): ValidationError | null {\n const id = params[\"validatorId\"] as string;\n const fn = customValidators.get(id);\n if (!fn) {\n return { type: \"custom\", message: `Unknown validator: \"${id}\".` };\n }\n const result = fn(value, params);\n if (result) {\n return { ...result, message: message ?? result.message };\n }\n return null;\n}\n\n// ── Public API ────────────────────────────────────────────────────────\n\n/**\n * Run a single validation rule against a value.\n */\nexport function runValidator(\n rule: ValidationRule,\n value: unknown,\n): ValidationError | null {\n const params = rule.params ?? {};\n switch (rule.type) {\n case \"required\":\n return validateRequired(value, params, rule.message);\n case \"minLength\":\n return validateMinLength(value, params, rule.message);\n case \"maxLength\":\n return validateMaxLength(value, params, rule.message);\n case \"min\":\n return validateMin(value, params, rule.message);\n case \"max\":\n return validateMax(value, params, rule.message);\n case \"pattern\":\n return validatePattern(value, params, rule.message);\n case \"email\":\n return validateEmail(value, params, rule.message);\n case \"custom\":\n return validateCustom(value, params, rule.message);\n default:\n return null;\n }\n}\n\n/**\n * Validate a value against an array of rules and return a\n * {@link ValidationResult}.\n */\nexport function validate(\n rules: readonly ValidationRule[],\n value: unknown,\n): ValidationResult {\n const errors: ValidationError[] = [];\n for (const rule of rules) {\n const error = runValidator(rule, value);\n if (error) {\n errors.push(error);\n }\n }\n return { valid: errors.length === 0, errors };\n}\n","// ── Condition evaluator ───────────────────────────────────────────────\n\nimport {\n type Condition,\n type FieldCondition,\n isConditionGroup,\n} from \"../types/condition.types\";\nimport type { FormValues } from \"../types/form-schema.types\";\n\n/**\n * Evaluate a single {@link FieldCondition} against the current\n * form values.\n */\nfunction evaluateFieldCondition(\n condition: FieldCondition,\n values: FormValues,\n): boolean {\n const actual = values[condition.field];\n const target = condition.value;\n\n switch (condition.operator) {\n case \"equals\":\n return actual === target;\n case \"notEquals\":\n return actual !== target;\n case \"contains\":\n if (typeof actual === \"string\" && typeof target === \"string\") {\n return actual.includes(target);\n }\n if (Array.isArray(actual)) {\n return actual.includes(target);\n }\n return false;\n case \"notContains\":\n if (typeof actual === \"string\" && typeof target === \"string\") {\n return !actual.includes(target);\n }\n if (Array.isArray(actual)) {\n return !actual.includes(target);\n }\n return true;\n case \"empty\":\n return (\n actual === null ||\n actual === undefined ||\n actual === \"\" ||\n (Array.isArray(actual) && actual.length === 0)\n );\n case \"notEmpty\":\n return (\n actual !== null &&\n actual !== undefined &&\n actual !== \"\" &&\n !(Array.isArray(actual) && actual.length === 0)\n );\n case \"greaterThan\":\n return typeof actual === \"number\" && typeof target === \"number\"\n ? actual > target\n : false;\n case \"lessThan\":\n return typeof actual === \"number\" && typeof target === \"number\"\n ? actual < target\n : false;\n case \"greaterThanOrEqual\":\n return typeof actual === \"number\" && typeof target === \"number\"\n ? actual >= target\n : false;\n case \"lessThanOrEqual\":\n return typeof actual === \"number\" && typeof target === \"number\"\n ? actual <= target\n : false;\n case \"in\":\n return Array.isArray(target) ? target.includes(actual) : false;\n case \"notIn\":\n return Array.isArray(target) ? !target.includes(actual) : true;\n default:\n return true;\n }\n}\n\n/**\n * Evaluate a {@link Condition} (single or group) against the\n * current form values.\n *\n * @returns `true` when the condition is satisfied.\n */\nexport function evaluateCondition(\n condition: Condition,\n values: FormValues,\n): boolean {\n if (isConditionGroup(condition)) {\n const mode = condition.mode ?? \"every\";\n return mode === \"every\"\n ? condition.conditions.every((c) => evaluateFieldCondition(c, values))\n : condition.conditions.some((c) => evaluateFieldCondition(c, values));\n }\n return evaluateFieldCondition(condition, values);\n}\n","// ── Form engine ──────────────────────────────────────────────────────\n\nimport {\n computed,\n type Signal,\n signal,\n type WritableSignal,\n} from \"@angular/core\";\n\nimport type {\n FormFieldDefinition,\n FormGroupDefinition,\n FormSchema,\n FormValues,\n} from \"../types/form-schema.types\";\nimport { isFlairComponent } from \"../types/form-schema.types\";\nimport type { ValidationResult } from \"../types/validation.types\";\nimport { validate } from \"../validation/validators\";\nimport { evaluateCondition } from \"./condition-evaluator\";\n\n// ── Field state ──────────────────────────────────────────────────────\n\n/**\n * Runtime state for a single field managed by the form engine.\n */\nexport interface FieldState {\n /** The field definition from the schema. */\n readonly definition: FormFieldDefinition;\n\n /** Current value (writable signal). */\n readonly value: WritableSignal<unknown>;\n\n /** Whether the field is currently visible. */\n readonly visible: Signal<boolean>;\n\n /** Whether the field is currently enabled (interactive). */\n readonly enabled: Signal<boolean>;\n\n /** Live validation result. */\n readonly validation: Signal<ValidationResult>;\n\n /** Whether the field has been interacted with. */\n readonly touched: WritableSignal<boolean>;\n\n /** Whether the field has been changed from its default. */\n readonly dirty: Signal<boolean>;\n}\n\n// ── Group state ──────────────────────────────────────────────────────\n\n/**\n * Runtime state for a field group.\n */\nexport interface GroupState {\n /** The group definition from the schema. */\n readonly definition: FormGroupDefinition;\n\n /** Runtime states for every field in this group. */\n readonly fields: readonly FieldState[];\n\n /** Whether the group is currently visible. */\n readonly visible: Signal<boolean>;\n\n /** Whether the group is currently enabled. */\n readonly enabled: Signal<boolean>;\n\n /** Whether every visible field in the group is valid. */\n readonly valid: Signal<boolean>;\n}\n\n// ── Form engine ──────────────────────────────────────────────────────\n\n/**\n * Signal-based form engine. Takes a {@link FormSchema}, creates\n * reactive state for every field and group, evaluates conditions,\n * runs validation, and produces a JSON output object.\n *\n * The engine is framework-agnostic (no Angular DI required) — it\n * operates purely on signals and plain objects.\n *\n * @example\n * ```ts\n * const engine = new FormEngine(schema);\n * engine.setValue(\"email\", \"test@example.com\");\n * console.log(engine.values()); // { email: \"test@example.com\", … }\n * console.log(engine.valid()); // true / false\n * ```\n */\nexport class FormEngine {\n /** All field states indexed by field ID. */\n private readonly fieldMap = new Map<string, FieldState>();\n\n /** Ordered group states. */\n public readonly groups: readonly GroupState[];\n\n /** Live snapshot of all field values (including hidden fields). */\n public readonly values: Signal<FormValues>;\n\n /** Whether every visible field passes validation. */\n public readonly valid: Signal<boolean>;\n\n /** Whether any field has been interacted with. */\n public readonly touched: Signal<boolean>;\n\n /** Whether any field value differs from its default. */\n public readonly dirty: Signal<boolean>;\n\n public constructor(public readonly schema: FormSchema) {\n // 1. Build field & group states (populates fieldMap)\n this.groups = schema.groups.map((g) => this.buildGroupState(g));\n\n // 2. Reactive values — computed from individual field signals\n this.values = computed(() => this.readFieldValues());\n\n // 3. Top-level computed signals\n this.valid = computed(() =>\n this.groups.filter((g) => g.visible()).every((g) => g.valid()),\n );\n\n this.touched = computed(() =>\n [...this.fieldMap.values()].some((f) => f.touched()),\n );\n\n this.dirty = computed(() =>\n [...this.fieldMap.values()].some((f) => f.dirty()),\n );\n }\n\n // ── Public API ────────────────────────────────────────────────────\n\n /**\n * Get the {@link FieldState} for a field by ID.\n * Throws if the field is not found.\n */\n public getField(id: string): FieldState {\n const state = this.fieldMap.get(id);\n if (!state) {\n throw new Error(`FormEngine: unknown field \"${id}\".`);\n }\n return state;\n }\n\n /** Set the value of a single field by ID. */\n public setValue(id: string, value: unknown): void {\n this.getField(id).value.set(value);\n }\n\n /** Mark a field as touched. */\n public markTouched(id: string): void {\n this.getField(id).touched.set(true);\n }\n\n /** Mark all fields as touched (e.g. on submit attempt). */\n public markAllTouched(): void {\n for (const field of this.fieldMap.values()) {\n field.touched.set(true);\n }\n }\n\n /**\n * Reset the form to its initial default values and clear\n * touched/dirty state.\n */\n public reset(): void {\n for (const field of this.fieldMap.values()) {\n const def =\n field.definition.defaultValue ??\n this.defaultForComponent(field.definition.component);\n field.value.set(def);\n field.touched.set(false);\n }\n }\n\n /**\n * Produce the JSON output — a plain object containing only\n * **visible** field values.\n */\n public output(): Signal<FormValues> {\n return computed(() => {\n const result: Record<string, unknown> = {};\n for (const group of this.groups) {\n if (!group.visible()) continue;\n for (const field of group.fields) {\n if (!field.visible()) continue;\n if (isFlairComponent(field.definition.component)) continue;\n result[field.definition.id] = field.value();\n }\n }\n return result;\n });\n }\n\n // ── Private helpers ───────────────────────────────────────────────\n\n private buildGroupState(def: FormGroupDefinition): GroupState {\n const fields = def.fields.map((f) => this.buildFieldState(f));\n\n const visible = def.visibleWhen\n ? computed(() =>\n evaluateCondition(def.visibleWhen!, this.readFieldValues()),\n )\n : computed(() => true);\n\n const enabled = def.enabledWhen\n ? computed(() =>\n evaluateCondition(def.enabledWhen!, this.readFieldValues()),\n )\n : computed(() => true);\n\n const valid = computed(() =>\n fields.filter((f) => f.visible()).every((f) => f.validation().valid),\n );\n\n return { definition: def, fields, visible, enabled, valid };\n }\n\n private buildFieldState(def: FormFieldDefinition): FieldState {\n const defaultVal =\n def.defaultValue ?? this.defaultForComponent(def.component);\n const value = signal<unknown>(defaultVal);\n\n const visible = def.visibleWhen\n ? computed(() =>\n evaluateCondition(def.visibleWhen!, this.readFieldValues()),\n )\n : computed(() => true);\n\n const enabled = def.enabledWhen\n ? computed(() =>\n evaluateCondition(def.enabledWhen!, this.readFieldValues()),\n )\n : computed(() => true);\n\n const validation = computed(() =>\n !isFlairComponent(def.component) &&\n def.validation &&\n def.validation.length > 0\n ? validate(def.validation, value())\n : { valid: true, errors: [] },\n );\n\n const touched = signal(false);\n const dirty = computed(() => value() !== defaultVal);\n\n const state: FieldState = {\n definition: def,\n value,\n visible,\n enabled,\n validation,\n touched,\n dirty,\n };\n\n this.fieldMap.set(def.id, state);\n return state;\n }\n\n /**\n * Read all current field values reactively. When called inside a\n * `computed()`, it tracks every field's value signal so the\n * computed re-evaluates whenever any field changes.\n */\n private readFieldValues(): FormValues {\n const v: Record<string, unknown> = {};\n for (const [id, field] of this.fieldMap) {\n if (isFlairComponent(field.definition.component)) continue;\n v[id] = field.value();\n }\n return v;\n }\n\n /**\n * Produce a sensible default value for a given component type so\n * fields without explicit `defaultValue` still have a typed zero.\n */\n private defaultForComponent(component: string): unknown {\n switch (component) {\n case \"checkbox\":\n case \"toggle\":\n return false;\n case \"slider\":\n return 0;\n case \"date\":\n case \"time\":\n case \"datetime\":\n case \"color\":\n return null;\n case \"file\":\n return [];\n case \"autocomplete\":\n return [];\n case \"flair:richtext\":\n case \"flair:image\":\n case \"flair:media\":\n return null;\n default:\n return \"\";\n }\n }\n}\n","// ── Field registry ───────────────────────────────────────────────────\n\nimport {\n type EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n makeEnvironmentProviders,\n type Provider,\n type Type,\n} from \"@angular/core\";\n\n/**\n * Transforms a raw config value (typically a JSON-serializable string\n * or number) into the runtime value expected by the component input.\n *\n * Used by {@link FormFieldRegistration.configTransforms} to bridge\n * JSON-friendly config keys to complex runtime objects.\n */\nexport interface ConfigTransform {\n /** The actual component input name to set. */\n readonly inputKey: string;\n\n /** Convert the raw config value to the runtime input value. */\n readonly transform: (value: unknown) => unknown;\n}\n\n/**\n * Describes how a component is integrated into the form system.\n */\nexport interface FormFieldRegistration {\n /**\n * The Angular component class to instantiate.\n * Must be a standalone component.\n */\n readonly component: Type<unknown>;\n\n /**\n * Name of the model signal used for two-way value binding.\n *\n * Most ui-kit components use `\"value\"`. Exceptions:\n * - `UICheckbox` → `\"checked\"`\n * - `UIFileUpload` → `\"files\"`\n */\n readonly modelProperty: string;\n\n /**\n * Static inputs to apply by default (e.g. `{ type: \"email\" }`).\n * Merged with (overridden by) the field definition's `config`.\n */\n readonly defaultConfig?: Readonly<Record<string, unknown>>;\n\n /**\n * Optional map from config keys to {@link ConfigTransform} entries.\n *\n * When a config key appears in this map, the raw JSON value is\n * passed through the transform and set on the component input\n * specified by `inputKey` instead of the config key itself.\n *\n * @example\n * ```ts\n * configTransforms: {\n * textAdapter: {\n * inputKey: 'adapter',\n * transform: (key) => resolveTextAdapter(key as string),\n * },\n * }\n * ```\n */\n readonly configTransforms?: Readonly<Record<string, ConfigTransform>>;\n}\n\n/**\n * Multi-provider token that collects field registrations from\n * across the application.\n */\nexport const FORM_FIELD_REGISTRATIONS = new InjectionToken<\n ReadonlyMap<string, FormFieldRegistration>\n>(\"FORM_FIELD_REGISTRATIONS\", {\n factory: () => new Map(),\n});\n\n/**\n * Register one or more field types for use in form schemas.\n *\n * @example\n * ```ts\n * // app.config.ts\n * import { provideFormFields } from '@theredhead/lucid-forms';\n * import { UIInput, UISelect, UICheckbox } from '@theredhead/lucid-kit';\n *\n * export const appConfig = {\n * providers: [\n * provideFormFields({\n * text: { component: UIInput, modelProperty: 'value' },\n * select: { component: UISelect, modelProperty: 'value' },\n * checkbox: { component: UICheckbox, modelProperty: 'checked' },\n * }),\n * ],\n * };\n * ```\n */\nexport function provideFormFields(\n fields: Readonly<Record<string, FormFieldRegistration>>,\n): EnvironmentProviders {\n const map = new Map(Object.entries(fields));\n return makeEnvironmentProviders([\n {\n provide: FORM_FIELD_REGISTRATIONS,\n useValue: map,\n } satisfies Provider,\n ]);\n}\n\n/**\n * Injectable service that resolves a component key (e.g. `\"text\"`)\n * to a {@link FormFieldRegistration}.\n *\n * It merges all maps provided via `FORM_FIELD_REGISTRATIONS`.\n */\n@Injectable({ providedIn: \"root\" })\nexport class FormFieldRegistry {\n private readonly maps = inject(FORM_FIELD_REGISTRATIONS, {\n optional: true,\n }) as ReadonlyMap<string, FormFieldRegistration> | null;\n\n private merged: Map<string, FormFieldRegistration> | null = null;\n\n private getMerged(): Map<string, FormFieldRegistration> {\n if (this.merged) return this.merged;\n this.merged = new Map();\n if (this.maps) {\n for (const [key, reg] of this.maps) {\n this.merged.set(key, reg);\n }\n }\n return this.merged;\n }\n\n /** Resolve a component key to its registration, or `null`. */\n public resolve(key: string): FormFieldRegistration | null {\n return this.getMerged().get(key) ?? null;\n }\n\n /** All registered keys. */\n public keys(): string[] {\n return [...this.getMerged().keys()];\n }\n}\n","// ── Text adapter resolver ────────────────────────────────────────────\n\nimport {\n type TextAdapter,\n EmailTextAdapter,\n UrlTextAdapter,\n IPAddressTextAdapter,\n PhoneTextAdapter,\n CreditCardTextAdapter,\n MoneyTextAdapter,\n IntegerTextAdapter,\n FloatTextAdapter,\n DecimalTextAdapter,\n HexadecimalTextAdapter,\n PercentageTextAdapter,\n DateTextAdapter,\n TimeTextAdapter,\n ColorTextAdapter,\n SlugTextAdapter,\n UuidTextAdapter,\n CronTextAdapter,\n UppercaseTextAdapter,\n} from \"@theredhead/lucid-kit\";\n\n/**\n * Factory map from adapter key strings (as stored in form schema\n * JSON) to {@link TextAdapter} constructors.\n *\n * @internal\n */\nconst ADAPTER_FACTORIES: Readonly<Record<string, () => TextAdapter>> = {\n email: () => new EmailTextAdapter(),\n url: () => new UrlTextAdapter(),\n ip: () => new IPAddressTextAdapter(),\n phone: () => new PhoneTextAdapter(),\n creditCard: () => new CreditCardTextAdapter(),\n money: () => new MoneyTextAdapter(),\n integer: () => new IntegerTextAdapter(),\n float: () => new FloatTextAdapter(),\n decimal: () => new DecimalTextAdapter(),\n hexadecimal: () => new HexadecimalTextAdapter(),\n percentage: () => new PercentageTextAdapter(),\n date: () => new DateTextAdapter(),\n time: () => new TimeTextAdapter(),\n color: () => new ColorTextAdapter(),\n slug: () => new SlugTextAdapter(),\n uuid: () => new UuidTextAdapter(),\n cron: () => new CronTextAdapter(),\n uppercase: () => new UppercaseTextAdapter(),\n};\n\n/**\n * All available text adapter keys, in display order.\n */\nexport const TEXT_ADAPTER_KEYS = Object.keys(\n ADAPTER_FACTORIES,\n) as readonly string[];\n\n/**\n * Resolve a text adapter key to a {@link TextAdapter} instance.\n *\n * Returns `undefined` for empty/unknown keys.\n *\n * @param key Adapter key (e.g. `\"email\"`, `\"phone\"`, `\"money\"`).\n */\nexport function resolveTextAdapter(key: unknown): TextAdapter | undefined {\n if (typeof key !== \"string\" || !key) {\n return undefined;\n }\n return ADAPTER_FACTORIES[key]?.();\n}\n","// ── Built-in field registrations for @theredhead/lucid-kit ──────────────\n\nimport type { EnvironmentProviders } from \"@angular/core\";\n\nimport {\n UIInput,\n UIDropdownList,\n UICheckbox,\n UIToggle,\n UIRadioGroup,\n UIRichTextView,\n UIAutocomplete,\n DateInputAdapter,\n TimeTextAdapter,\n UIColorPicker,\n UISlider,\n UIRichTextEditor,\n UIFileUpload,\n UIImage,\n UIMediaPlayer,\n} from \"@theredhead/lucid-kit\";\n\nimport {\n provideFormFields,\n type FormFieldRegistration,\n} from \"./field-registry\";\nimport { resolveTextAdapter } from \"./text-adapter-resolver\";\n\n/**\n * Built-in field registrations that map common component keys\n * to `@theredhead/lucid-kit` components.\n *\n * | Key | Component | Model property |\n * |-----------------|---------------------|----------------|\n * | `\"text\"` | `UIInput` | `value` |\n * | `\"select\"` | `UIDropdownList` | `value` |\n * | `\"checkbox\"` | `UICheckbox` | `checked` |\n * | `\"toggle\"` | `UIToggle` | `value` |\n * | `\"radio\"` | `UIRadioGroup` | `value` |\n * | `\"autocomplete\"`| `UIAutocomplete` | `value` |\n * | `\"date\"` | `UIInput` + `DateInputAdapter` | `value` |\n * | `\"time\"` | `UIInput` + `TimeTextAdapter` | `value` |\n * | `\"datetime\"` | `UIInput` + `DateInputAdapter` | `value` |\n * | `\"color\"` | `UIColorPicker` | `value` |\n * | `\"slider\"` | `UISlider` | `value` |\n * | `\"richtext\"` | `UIRichTextEditor` | `value` |\n * | `\"file\"` | `UIFileUpload` | `files` |\n * | `\"flair:richtext\"` | `UIRichTextView` | `content` |\n * | `\"flair:image\"` | `UIImage` | `src` |\n * | `\"flair:media\"` | `UIMediaPlayer` | `source` |\n */\nexport const BUILT_IN_FIELDS: Readonly<Record<string, FormFieldRegistration>> =\n {\n text: {\n component: UIInput,\n modelProperty: \"value\",\n configTransforms: {\n textAdapter: {\n inputKey: \"adapter\",\n transform: resolveTextAdapter,\n },\n },\n },\n select: { component: UIDropdownList, modelProperty: \"value\" },\n checkbox: { component: UICheckbox, modelProperty: \"checked\" },\n toggle: { component: UIToggle, modelProperty: \"value\" },\n radio: { component: UIRadioGroup, modelProperty: \"value\" },\n autocomplete: { component: UIAutocomplete, modelProperty: \"value\" },\n date: {\n component: UIInput,\n modelProperty: \"value\",\n defaultConfig: { adapter: new DateInputAdapter() },\n },\n time: {\n component: UIInput,\n modelProperty: \"value\",\n defaultConfig: { adapter: new TimeTextAdapter() },\n },\n datetime: {\n component: UIInput,\n modelProperty: \"value\",\n defaultConfig: { adapter: new DateInputAdapter() },\n },\n color: { component: UIColorPicker, modelProperty: \"value\" },\n slider: {\n component: UISlider,\n modelProperty: \"value\",\n defaultConfig: { showValue: true, showMinMax: true },\n },\n richtext: { component: UIRichTextEditor, modelProperty: \"value\" },\n file: { component: UIFileUpload, modelProperty: \"files\" },\n \"flair:richtext\": {\n component: UIRichTextView,\n modelProperty: \"content\",\n },\n \"flair:image\": { component: UIImage, modelProperty: \"src\" },\n \"flair:media\": {\n component: UIMediaPlayer,\n modelProperty: \"source\",\n defaultConfig: { controls: true },\n },\n };\n\n/**\n * Convenience provider that registers all built-in\n * `@theredhead/lucid-kit` field types.\n *\n * @example\n * ```ts\n * import { provideBuiltInFormFields } from '@theredhead/lucid-forms';\n *\n * export const appConfig = {\n * providers: [provideBuiltInFormFields()],\n * };\n * ```\n */\nexport function provideBuiltInFormFields(): EnvironmentProviders {\n return provideFormFields(BUILT_IN_FIELDS);\n}\n","// ── Export strategy types ────────────────────────────────────────────\n\nimport type { FormSchema } from \"../types/form-schema.types\";\n\n/**\n * The result of an export operation.\n *\n * Contains the generated content as a string together with metadata\n * about the suggested file name and MIME type.\n */\nexport interface ExportResult {\n /** MIME type for the exported content (e.g. `\"application/json\"`, `\"text/typescript\"`). */\n readonly mimeType: string;\n\n /** Suggested file name for the exported artefact. */\n readonly fileName: string;\n\n /** The exported content as a string. */\n readonly content: string;\n}\n\n/**\n * Strategy interface for exporting a {@link FormSchema} into a\n * specific format.\n *\n * Implementations must be plain classes — no Angular DI required.\n *\n * @example\n * ```ts\n * class MyExportStrategy implements ExportStrategy {\n * readonly label = 'My Format';\n * readonly description = 'Export as My Format.';\n *\n * export(schema: FormSchema): ExportResult {\n * return {\n * mimeType: 'text/plain',\n * fileName: 'form.txt',\n * content: JSON.stringify(schema),\n * };\n * }\n * }\n * ```\n */\nexport interface ExportStrategy {\n /** Human-readable label displayed in the export format selector. */\n readonly label: string;\n\n /** Short description of the export format. */\n readonly description: string;\n\n /** Generate an {@link ExportResult} from the given schema. */\n export(schema: FormSchema): ExportResult;\n}\n\n// ── String utilities ────────────────────────────────────────────────\n\n/**\n * Convert a human-readable title to kebab-case.\n *\n * Falls back to `\"generated-form\"` when the input is empty or\n * contains no usable characters.\n *\n * @internal\n */\nexport function toKebabCase(text: string): string {\n return (\n text\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .replace(/[^a-z0-9-]/gi, \"\")\n .toLowerCase()\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"generated-form\"\n );\n}\n\n/**\n * Convert a human-readable title to PascalCase.\n *\n * Falls back to `\"GeneratedForm\"` when the input is empty.\n *\n * @internal\n */\nexport function toPascalCase(text: string): string {\n return toKebabCase(text)\n .split(\"-\")\n .map((s) => s.charAt(0).toUpperCase() + s.slice(1))\n .join(\"\");\n}\n","// ── JSON export strategy ────────────────────────────────────────────\n\nimport type { FormSchema } from \"../types/form-schema.types\";\nimport { toKebabCase } from \"./export-strategy\";\nimport type { ExportResult, ExportStrategy } from \"./export-strategy\";\n\n/**\n * Exports a {@link FormSchema} as a formatted JSON file.\n *\n * The output is a standard JSON document — identical to\n * `JSON.stringify(schema, null, 2)`.\n */\nexport class JsonExportStrategy implements ExportStrategy {\n public readonly label = \"JSON Schema\";\n public readonly description = \"Export the form schema as a JSON file.\";\n\n public export(schema: FormSchema): ExportResult {\n const title = schema.title?.trim() || \"form\";\n const fileName = toKebabCase(title) + \".schema.json\";\n\n return {\n mimeType: \"application/json\",\n fileName,\n content: JSON.stringify(schema, null, 2) + \"\\n\",\n };\n }\n}\n","// ── Angular component export strategy ───────────────────────────────\n\nimport type {\n FormFieldDefinition,\n FormGroupDefinition,\n FormSchema,\n} from \"../types/form-schema.types\";\nimport { toKebabCase, toPascalCase } from \"./export-strategy\";\nimport type { ExportResult, ExportStrategy } from \"./export-strategy\";\n\n// ── Component-key → UI-kit metadata ────────────────────────────────\n\ninterface FieldMeta {\n /** Angular component class name. */\n readonly className: string;\n /** Element selector used in templates. */\n readonly selector: string;\n /** The model property for two-way binding (`value`, `checked`, …). */\n readonly modelProp: string;\n /** TypeScript type for the interface property. */\n readonly tsType: string;\n /** Default value literal. */\n readonly defaultValue: string;\n}\n\nconst FIELD_META: Readonly<Record<string, FieldMeta>> = {\n text: {\n className: \"UIInput\",\n selector: \"ui-input\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n select: {\n className: \"UIDropdownList\",\n selector: \"ui-dropdown-list\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n checkbox: {\n className: \"UICheckbox\",\n selector: \"ui-checkbox\",\n modelProp: \"checked\",\n tsType: \"boolean\",\n defaultValue: \"false\",\n },\n toggle: {\n className: \"UIToggle\",\n selector: \"ui-toggle\",\n modelProp: \"value\",\n tsType: \"boolean\",\n defaultValue: \"false\",\n },\n radio: {\n className: \"UIRadioGroup\",\n selector: \"ui-radio-group\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n autocomplete: {\n className: \"UIAutocomplete\",\n selector: \"ui-autocomplete\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n date: {\n className: \"UIInput\",\n selector: \"ui-input\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n time: {\n className: \"UIInput\",\n selector: \"ui-input\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n datetime: {\n className: \"UIInput\",\n selector: \"ui-input\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n color: {\n className: \"UIColorPicker\",\n selector: \"ui-color-picker\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n slider: {\n className: \"UISlider\",\n selector: \"ui-slider\",\n modelProp: \"value\",\n tsType: \"number\",\n defaultValue: \"0\",\n },\n richtext: {\n className: \"UIRichTextEditor\",\n selector: \"ui-rich-text-editor\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n },\n file: {\n className: \"UIFileUpload\",\n selector: \"ui-file-upload\",\n modelProp: \"files\",\n tsType: \"File[]\",\n defaultValue: \"[]\",\n },\n};\n\n/** Fallback for unknown component keys. */\nconst UNKNOWN_META: FieldMeta = {\n className: \"UIInput\",\n selector: \"ui-input\",\n modelProp: \"value\",\n tsType: \"string\",\n defaultValue: \"''\",\n};\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\n/** @internal Convert a field id to a safe camelCase identifier. */\nfunction toCamelCase(text: string): string {\n const pascal = toPascalCase(text);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/** @internal Resolve FieldMeta for a component key. */\nfunction metaFor(componentKey: string): FieldMeta {\n return FIELD_META[componentKey] ?? UNKNOWN_META;\n}\n\n/**\n * @internal Render config entries as template attribute bindings.\n *\n * String values → `key=\"value\"`, others → `[key]=\"value\"`.\n */\nfunction configAttrs(\n config: Readonly<Record<string, unknown>> | undefined,\n): string {\n if (!config) return \"\";\n return Object.entries(config)\n .map(([k, v]) =>\n typeof v === \"string\" ? `${k}=\"${v}\"` : `[${k}]=\"${String(v)}\"`,\n )\n .join(\" \");\n}\n\n/**\n * @internal Build the options property name for a field\n * (e.g. `emailOptions`).\n */\nfunction optionsPropName(fieldId: string): string {\n return toCamelCase(fieldId) + \"Options\";\n}\n\n// ── Strategy ────────────────────────────────────────────────────────\n\n/**\n * Exports a {@link FormSchema} as a standalone Angular component\n * with a fully declarative HTML template.\n *\n * The generated `.component.ts` file contains:\n *\n * - A typed `<Title>FormValues` interface with one property per field\n * - Individual `signal()` fields for two-way binding\n * - A `computed()` `formValues` signal that assembles the full typed object\n * - A template that directly uses `@theredhead/lucid-kit` components\n * (`<ui-input>`, `<ui-select>`, …) — no `FormEngine` or `<ui-form>`\n *\n * The component is almost entirely declarative: the TypeScript class\n * is just signals and a single computed.\n */\nexport class AngularComponentExportStrategy implements ExportStrategy {\n public readonly label = \"Angular Component\";\n public readonly description =\n \"Standalone Angular component with declarative template.\";\n\n public export(schema: FormSchema): ExportResult {\n const title = schema.title?.trim() || \"Generated Form\";\n const kebab = toKebabCase(title);\n const pascal = toPascalCase(title);\n const className = pascal + \"Component\";\n const interfaceName = pascal + \"FormValues\";\n const selector = \"app-\" + kebab;\n const fileName = kebab + \".component.ts\";\n\n const allFields = schema.groups.flatMap((g) => g.fields);\n\n const lines: string[] = [\n \"// ── Generated by @theredhead/lucid-forms Designer ──────────────────────\",\n \"\",\n ...this.buildImports(allFields),\n \"\",\n ...this.buildInterface(interfaceName, allFields),\n \"\",\n ...this.buildComponent(\n selector,\n className,\n interfaceName,\n allFields,\n schema.groups,\n ),\n \"\",\n ];\n\n return {\n mimeType: \"text/typescript\",\n fileName,\n content: lines.join(\"\\n\"),\n };\n }\n\n // ── Code generators ─────────────────────────────────────────────\n\n /** @internal Build the import statements. */\n private buildImports(fields: readonly FormFieldDefinition[]): string[] {\n const angularImports = [\n \"ChangeDetectionStrategy\",\n \"Component\",\n \"computed\",\n \"signal\",\n ];\n const hasOutput = true; // always include formValues output\n if (hasOutput) angularImports.push(\"output\");\n\n const uiKitComponents = new Set<string>();\n for (const f of fields) {\n uiKitComponents.add(metaFor(f.component).className);\n }\n const sorted = [...uiKitComponents].sort();\n\n return [\n `import { ${angularImports.join(\", \")} } from '@angular/core';`,\n `import { ${sorted.join(\", \")} } from '@theredhead/lucid-kit';`,\n ];\n }\n\n /** @internal Build the values interface. */\n private buildInterface(\n name: string,\n fields: readonly FormFieldDefinition[],\n ): string[] {\n const lines: string[] = [`export interface ${name} {`];\n for (const f of fields) {\n const meta = metaFor(f.component);\n const prop = toCamelCase(f.id);\n if (f.title) {\n lines.push(` /** ${f.title} */`);\n }\n lines.push(` readonly ${prop}: ${meta.tsType};`);\n }\n lines.push(\"}\");\n return lines;\n }\n\n /** @internal Build the full @Component class. */\n private buildComponent(\n selector: string,\n className: string,\n interfaceName: string,\n fields: readonly FormFieldDefinition[],\n groups: readonly FormGroupDefinition[],\n ): string[] {\n const uiKitComponents = new Set<string>();\n for (const f of fields) {\n uiKitComponents.add(metaFor(f.component).className);\n }\n const sorted = [...uiKitComponents].sort();\n\n const template = this.buildTemplate(groups);\n const classBody = this.buildClassBody(interfaceName, fields);\n\n return [\n \"@Component({\",\n ` selector: '${selector}',`,\n \" standalone: true,\",\n ` imports: [${sorted.join(\", \")}],`,\n \" changeDetection: ChangeDetectionStrategy.OnPush,\",\n \" template: `\",\n ...template.map((l) => \" \" + l),\n \" `,\",\n \"})\",\n `export class ${className} {`,\n ...classBody.map((l) => (l ? \" \" + l : \"\")),\n \"}\",\n ];\n }\n\n /** @internal Build the HTML template with fieldsets and components. */\n private buildTemplate(groups: readonly FormGroupDefinition[]): string[] {\n const lines: string[] = [];\n\n for (const group of groups) {\n if (group.title) {\n lines.push(\"<fieldset>\");\n lines.push(` <legend>${group.title}</legend>`);\n lines.push(\"\");\n }\n\n for (const field of group.fields) {\n const meta = metaFor(field.component);\n const prop = toCamelCase(field.id);\n const attrs: string[] = [];\n\n // Two-way binding\n attrs.push(`[(${meta.modelProp})]=\"${prop}\"`);\n\n // aria-label\n if (field.title) {\n attrs.push(`ariaLabel=\"${field.title}\"`);\n }\n\n // Options (select, radio, autocomplete)\n if (field.options && field.options.length > 0) {\n attrs.push(`[options]=\"${optionsPropName(field.id)}\"`);\n }\n\n // Config attributes\n const cfgStr = configAttrs(field.config);\n if (cfgStr) {\n attrs.push(cfgStr);\n }\n\n const label = field.title || field.id;\n const indent = group.title ? \" \" : \"\";\n\n lines.push(`${indent}<label>`);\n lines.push(`${indent} ${label}`);\n lines.push(`${indent} <${meta.selector} ${attrs.join(\" \")} />`);\n lines.push(`${indent}</label>`);\n lines.push(\"\");\n }\n\n if (group.title) {\n lines.push(\"</fieldset>\");\n lines.push(\"\");\n }\n }\n\n return lines;\n }\n\n /** @internal Build the class body: signals, options, computed. */\n private buildClassBody(\n interfaceName: string,\n fields: readonly FormFieldDefinition[],\n ): string[] {\n const lines: string[] = [];\n\n // Signal fields\n lines.push(\"// ── Field signals ──\");\n for (const f of fields) {\n const meta = metaFor(f.component);\n const prop = toCamelCase(f.id);\n const defaultVal =\n f.defaultValue !== undefined\n ? JSON.stringify(f.defaultValue)\n : meta.defaultValue;\n lines.push(\n `public readonly ${prop} = signal<${meta.tsType}>(${defaultVal});`,\n );\n }\n\n // Options properties\n const fieldsWithOptions = fields.filter(\n (f) => f.options && f.options.length > 0,\n );\n if (fieldsWithOptions.length > 0) {\n lines.push(\"\");\n lines.push(\"// ── Options ──\");\n for (const f of fieldsWithOptions) {\n const name = optionsPropName(f.id);\n const json = JSON.stringify(\n f.options!.map((o) => ({ label: o.label, value: o.value })),\n null,\n 2,\n );\n // Indent the JSON nicely\n const indented = json.replace(/\\n/g, \"\\n \");\n lines.push(`protected readonly ${name} = ${indented} as const;`);\n }\n }\n\n // Computed form values\n lines.push(\"\");\n lines.push(\"// ── Assembled form values ──\");\n lines.push(\n `public readonly formValues = computed<${interfaceName}>(() => ({`,\n );\n for (const f of fields) {\n const prop = toCamelCase(f.id);\n lines.push(` ${prop}: this.${prop}(),`);\n }\n lines.push(\"}));\");\n\n return lines;\n }\n}\n","// ── Export barrel ────────────────────────────────────────────────────\n\nexport type { ExportResult, ExportStrategy } from \"./export-strategy\";\nexport { toKebabCase, toPascalCase } from \"./export-strategy\";\nexport { JsonExportStrategy } from \"./json-export-strategy\";\nexport { AngularComponentExportStrategy } from \"./angular-component-export-strategy\";\n","// ── UIFormField ──────────────────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n ViewContainerRef,\n viewChild,\n} from \"@angular/core\";\n\nimport { LoggerFactory, UISurface } from \"@theredhead/lucid-foundation\";\n\nimport type { FieldState } from \"../../engine/form-engine\";\nimport { FormFieldRegistry } from \"../../registry/field-registry\";\nimport { isFlairComponent } from \"../../types/form-schema.types\";\n\n/**\n * Renders a single form field by dynamically creating the component\n * registered for the field's `component` key and wiring up two-way\n * value binding, config inputs, and validation display.\n *\n * This component is used internally by {@link UIFormGroup} and\n * {@link UIForm}. It can also be used standalone for custom layouts.\n *\n * @example\n * ```html\n * <ui-form-field [state]=\"fieldState\" />\n * ```\n */\n@Component({\n selector: \"ui-form-field\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n host: {\n class: \"ui-form-field\",\n \"[class.invalid]\": \"showErrors()\",\n \"[class.disabled]\": \"!state().enabled()\",\n \"[class.hidden]\": \"!state().visible()\",\n },\n templateUrl: \"./form-field.component.html\",\n styleUrl: \"./form-field.component.scss\",\n})\nexport class UIFormField {\n /** The field state managed by the {@link FormEngine}. */\n public readonly state = input.required<FieldState>();\n\n private readonly registry = inject(FormFieldRegistry);\n private readonly log = inject(LoggerFactory).createLogger(\"UIFormField\");\n private readonly outlet = viewChild<unknown, ViewContainerRef>(\"outlet\", {\n read: ViewContainerRef,\n });\n\n /** @internal Show errors only when the field has been touched. */\n protected readonly showErrors = computed(\n () => this.state().touched() && !this.state().validation().valid,\n );\n\n /** @internal Whether this field is a flair (non-data) component. */\n protected readonly isFlair = computed(() =>\n isFlairComponent(this.state().definition.component),\n );\n\n /** @internal Whether the field has a `required` validation rule. */\n protected readonly isRequired = computed(() =>\n (this.state().definition.validation ?? []).some(\n (r) => r.type === \"required\",\n ),\n );\n\n public constructor() {\n // Create the component once the view is ready\n effect(() => {\n const fieldState = this.state();\n const vcr = this.outlet();\n if (!vcr) return;\n vcr.clear();\n\n const reg = this.registry.resolve(fieldState.definition.component);\n if (!reg) {\n this.log.warn(\n `No component registered for \"${fieldState.definition.component}\"`,\n [fieldState.definition.id],\n );\n return;\n }\n\n const ref = vcr.createComponent(reg.component);\n\n // Wire the model property (two-way).\n // Use untracked() so the effect does NOT track fieldState.value();\n // otherwise every keystroke would re-run the effect and recreate\n // the component, destroying focus.\n ref.setInput(\n reg.modelProperty,\n untracked(() => fieldState.value()),\n );\n\n // Subscribe to model changes.\n // Angular model() signals expose .subscribe() on the signal\n // itself (not on a separate *Change property).\n const modelProp = (ref.instance as Record<string, unknown>)[\n reg.modelProperty\n ];\n\n if (\n modelProp &&\n typeof (modelProp as Record<string, unknown>)[\"subscribe\"] ===\n \"function\"\n ) {\n // model() signal — subscribe directly\n (\n modelProp as { subscribe: (fn: (v: unknown) => void) => void }\n ).subscribe((v: unknown) => {\n fieldState.value.set(v);\n fieldState.touched.set(true);\n });\n } else {\n // Fallback: EventEmitter / output() — look for <prop>Change\n const changeOutput = (ref.instance as Record<string, unknown>)[\n reg.modelProperty + \"Change\"\n ];\n if (\n changeOutput &&\n typeof (changeOutput as Record<string, unknown>)[\"subscribe\"] ===\n \"function\"\n ) {\n (\n changeOutput as {\n subscribe: (fn: (v: unknown) => void) => void;\n }\n ).subscribe((v: unknown) => {\n fieldState.value.set(v);\n fieldState.touched.set(true);\n });\n }\n }\n\n // Apply config inputs (defaultConfig merged with field config)\n const config = {\n ...(reg.defaultConfig ?? {}),\n ...(fieldState.definition.config ?? {}),\n };\n\n for (const [key, val] of Object.entries(config)) {\n const transform = reg.configTransforms?.[key];\n if (transform) {\n try {\n ref.setInput(transform.inputKey, transform.transform(val));\n } catch {\n this.log.debug(\n `Input \"${transform.inputKey}\" not found on component`,\n [fieldState.definition.component],\n );\n }\n } else {\n try {\n ref.setInput(key, val);\n } catch {\n this.log.debug(`Input \"${key}\" not found on component`, [\n fieldState.definition.component,\n ]);\n }\n }\n }\n\n // Forward options for select/radio/autocomplete\n if (fieldState.definition.options) {\n try {\n ref.setInput(\"options\", fieldState.definition.options);\n } catch {\n // Component may not have an options input\n }\n }\n\n // Disabled state (untracked — don't recreate on toggle)\n if (!untracked(() => fieldState.enabled())) {\n try {\n ref.setInput(\"disabled\", true);\n } catch {\n // Not all components have a disabled input\n }\n }\n\n // Set aria label from title\n try {\n ref.setInput(\"ariaLabel\", fieldState.definition.title);\n } catch {\n // Not all components have ariaLabel\n }\n });\n }\n}\n","@if (state().visible() && !isFlair()) {\n <label class=\"label\" [attr.for]=\"state().definition.id\">\n {{ state().definition.title }}\n @if (isRequired()) {\n <span class=\"required\" aria-hidden=\"true\">*</span>\n }\n </label>\n\n @if (state().definition.description) {\n <p class=\"description\">{{ state().definition.description }}</p>\n }\n}\n\n<div class=\"control\" [class.control--hidden]=\"!state().visible()\">\n <ng-container #outlet />\n</div>\n\n@if (state().visible() && !isFlair() && showErrors()) {\n <ul class=\"errors\" role=\"alert\">\n @for (error of state().validation().errors; track error.type) {\n <li class=\"error\">{{ error.message }}</li>\n }\n </ul>\n}\n","// ── UIFormGroup ──────────────────────────────────────────────────────\n\nimport { ChangeDetectionStrategy, Component, input } from \"@angular/core\";\n\nimport type { GroupState } from \"../engine/form-engine\";\nimport { UIFormField } from \"./form-field/form-field.component\";\nimport { UISurface } from \"@theredhead/lucid-foundation\";\n\n/**\n * Renders a group of form fields as a visual section (fieldset).\n *\n * In sequential (non-wizard) mode every group is displayed\n * vertically. In wizard mode, {@link UIFormWizard} controls which\n * group is visible.\n *\n * @example\n * ```html\n * <ui-form-group [state]=\"groupState\" />\n * ```\n */\n@Component({\n selector: \"ui-form-group\",\n standalone: true,\n imports: [UIFormField],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n host: {\n class: \"ui-form-group\",\n \"[class.hidden]\": \"!state().visible()\",\n },\n templateUrl: \"./form-group.component.html\",\n styleUrl: \"./form-group.component.scss\",\n})\nexport class UIFormGroup {\n /** The group state managed by the {@link FormEngine}. */\n public readonly state = input.required<GroupState>();\n}\n","@if (state().visible()) {\n @if (state().definition.title) {\n <h3 class=\"title\">{{ state().definition.title }}</h3>\n }\n @if (state().definition.description) {\n <p class=\"description\">{{ state().definition.description }}</p>\n }\n <div class=\"fields\">\n @for (field of state().fields; track field.definition.id) {\n <ui-form-field [state]=\"field\" />\n }\n </div>\n}\n","// ── FormSettings ─────────────────────────────────────────────────────\n\nimport { InjectionToken, type Signal } from \"@angular/core\";\n\n/**\n * Shared settings provided by a parent form component (`UIForm` or\n * `UIFormWizard`) and consumed by child components such as\n * `UIFormField` via DI.\n */\nexport interface FormSettings {\n /** Minimum width (in pixels) for field controls. */\n readonly fieldMinWidth: Signal<number>;\n}\n\n/**\n * DI token for {@link FormSettings}.\n *\n * Provided by `UIForm` and `UIFormWizard` so that descendant\n * components can look up form-level settings without requiring\n * explicit input threading.\n */\nexport const FORM_SETTINGS = new InjectionToken<FormSettings>(\"FORM_SETTINGS\");\n","// ── UIForm ───────────────────────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n} from \"@angular/core\";\n\nimport { FormEngine } from \"../engine/form-engine\";\nimport type { FormValues } from \"../types/form-schema.types\";\nimport { FORM_SETTINGS } from \"./form-settings\";\nimport { UIFormGroup } from \"./form-group.component\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Top-level form component that renders all groups sequentially.\n *\n * Takes a {@link FormEngine} instance and displays every group's\n * fields in order, with validation and conditional visibility.\n *\n * @example\n * ```html\n * <ui-form [engine]=\"engine\" (formSubmit)=\"onSubmit($event)\" />\n * ```\n */\n@Component({\n selector: \"ui-form\",\n standalone: true,\n imports: [UIFormGroup],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: {\n class: \"ui-form\",\n },\n providers: [\n {\n provide: FORM_SETTINGS,\n useExisting: forwardRef(() => UIForm),\n },\n ],\n templateUrl: \"./form.component.html\",\n styleUrl: \"./form.component.scss\",\n})\nexport class UIForm {\n /** The form engine instance that drives this form. */\n public readonly engine = input.required<FormEngine>();\n\n /** Label for the submit button. Defaults to `\"Submit\"`. */\n public readonly submitLabel = input<string>(\"Submit\");\n\n /** Whether to show the built-in submit button. Defaults to `true`. */\n public readonly showSubmit = input<boolean>(true);\n\n /** Minimum width (in pixels) for form field controls. Defaults to `200`. */\n public readonly fieldMinWidth = input<number>(450);\n\n /** Emitted when the submit button is clicked and the form is valid. */\n public readonly formSubmit = output<FormValues>();\n\n /** @internal */\n protected readonly isValid = computed(() => this.engine().valid());\n\n /** @internal — collects all invalid visible fields for the summary. */\n protected readonly validationSummary = computed(() => {\n const summary: { fieldId: string; title: string; errors: string[] }[] = [];\n for (const group of this.engine().groups) {\n if (!group.visible()) continue;\n for (const field of group.fields) {\n if (!field.visible()) continue;\n const v = field.validation();\n if (!v.valid) {\n summary.push({\n fieldId: field.definition.id,\n title: field.definition.title || field.definition.id,\n errors: v.errors.map((e) => e.message),\n });\n }\n }\n }\n return summary;\n });\n\n /** @internal */\n protected onSubmit(): void {\n const eng = this.engine();\n eng.markAllTouched();\n if (eng.valid()) {\n this.formSubmit.emit(eng.output()());\n }\n }\n}\n","@if (engine().schema.title) {\n <h2 class=\"title\">{{ engine().schema.title }}</h2>\n}\n@if (engine().schema.description) {\n <p class=\"description\">{{ engine().schema.description }}</p>\n}\n\n@for (group of engine().groups; track group.definition.id) {\n <ui-form-group [state]=\"group\" />\n}\n\n@if (showSubmit()) {\n @if (!isValid() && validationSummary().length) {\n <div class=\"validation-summary\" role=\"alert\">\n <strong>Please fix the following issues:</strong>\n <ul>\n @for (item of validationSummary(); track item.fieldId) {\n <li>\n <strong>{{ item.title }}:</strong>\n {{ item.errors[0] }}\n </li>\n }\n </ul>\n </div>\n }\n <div class=\"actions\">\n <button\n type=\"button\"\n class=\"submit\"\n [disabled]=\"!engine().valid()\"\n (click)=\"onSubmit()\"\n >\n {{ submitLabel() }}\n </button>\n </div>\n}\n","// ── UIFormWizard ─────────────────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from \"@angular/core\";\n\nimport { FormEngine, type GroupState } from \"../engine/form-engine\";\nimport type { FormValues } from \"../types/form-schema.types\";\nimport { FORM_SETTINGS } from \"./form-settings\";\nimport { UIFormGroup } from \"./form-group.component\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Renders a {@link FormEngine}'s groups as wizard steps — one group\n * at a time with previous / next / submit navigation.\n *\n * Only visible groups are included as steps. The wizard validates\n * the current step before allowing navigation to the next.\n *\n * @example\n * ```html\n * <ui-form-wizard\n * [engine]=\"engine\"\n * (formSubmit)=\"onSubmit($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"ui-form-wizard\",\n standalone: true,\n imports: [UIFormGroup],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: {\n class: \"ui-form-wizard\",\n },\n providers: [\n {\n provide: FORM_SETTINGS,\n useExisting: forwardRef(() => UIFormWizard),\n },\n ],\n templateUrl: \"./form-wizard.component.html\",\n styleUrl: \"./form-wizard.component.scss\",\n})\nexport class UIFormWizard {\n /** The form engine instance that drives this wizard. */\n public readonly engine = input.required<FormEngine>();\n\n /** Label for the \"Next\" button. */\n public readonly nextLabel = input<string>(\"Next\");\n\n /** Label for the \"Previous\" button. */\n public readonly prevLabel = input<string>(\"Previous\");\n\n /** Label for the \"Submit\" button (last step). */\n public readonly submitLabel = input<string>(\"Submit\");\n\n /** Minimum width (in pixels) for form field controls. Defaults to `200`. */\n public readonly fieldMinWidth = input<number>(450);\n\n /** Emitted when the form is submitted (last step, valid). */\n public readonly formSubmit = output<FormValues>();\n\n /** Current step index. */\n protected readonly currentIndex = signal(0);\n\n /** Only visible groups are wizard steps. */\n protected readonly visibleGroups = computed(() =>\n this.engine().groups.filter((g) => g.visible()),\n );\n\n /** The currently displayed group state. */\n protected readonly currentGroup = computed<GroupState | null>(() => {\n const groups = this.visibleGroups();\n return groups[this.currentIndex()] ?? null;\n });\n\n /** Whether the current step is the last one. */\n protected readonly isLastStep = computed(\n () => this.currentIndex() === this.visibleGroups().length - 1,\n );\n\n /** Whether the current step's fields are all valid. */\n protected readonly currentStepValid = computed(() => {\n const group = this.currentGroup();\n return group ? group.valid() : false;\n });\n\n /** Navigate to the next step (marks current fields touched). */\n public next(): void {\n const group = this.currentGroup();\n if (group) {\n for (const field of group.fields) {\n field.touched.set(true);\n }\n }\n if (this.currentStepValid() && !this.isLastStep()) {\n this.currentIndex.update((i) => i + 1);\n }\n }\n\n /** Navigate to the previous step. */\n public prev(): void {\n if (this.currentIndex() > 0) {\n this.currentIndex.update((i) => i - 1);\n }\n }\n\n /** Jump to a specific step. */\n public goTo(index: number): void {\n if (index >= 0 && index <= this.currentIndex()) {\n this.currentIndex.set(index);\n }\n }\n\n /** @internal Submit handler. */\n protected onSubmit(): void {\n const eng = this.engine();\n eng.markAllTouched();\n if (eng.valid()) {\n this.formSubmit.emit(eng.output()());\n }\n }\n}\n","@if (engine().schema.title) {\n <h2 class=\"title\">{{ engine().schema.title }}</h2>\n}\n@if (engine().schema.description) {\n <p class=\"description\">{{ engine().schema.description }}</p>\n}\n\n<!-- Step indicator -->\n<nav class=\"steps\" aria-label=\"Form steps\">\n @for (step of visibleGroups(); track step.definition.id; let i = $index) {\n <button\n type=\"button\"\n class=\"step\"\n [class.step--active]=\"i === currentIndex()\"\n [class.step--completed]=\"i < currentIndex()\"\n [disabled]=\"i > currentIndex()\"\n (click)=\"goTo(i)\"\n [attr.aria-current]=\"i === currentIndex() ? 'step' : null\"\n >\n <span class=\"step-number\">{{ i + 1 }}</span>\n @if (step.definition.title) {\n <span class=\"step-label\">{{ step.definition.title }}</span>\n }\n </button>\n }\n</nav>\n\n<!-- Current group -->\n@if (currentGroup(); as group) {\n <ui-form-group [state]=\"group\" />\n}\n\n<!-- Navigation -->\n<div class=\"actions\">\n @if (currentIndex() > 0) {\n <button type=\"button\" class=\"btn btn--prev\" (click)=\"prev()\">\n {{ prevLabel() }}\n </button>\n }\n\n <div class=\"spacer\"></div>\n\n @if (isLastStep()) {\n <button\n type=\"button\"\n class=\"btn btn--submit\"\n [disabled]=\"!engine().valid()\"\n (click)=\"onSubmit()\"\n >\n {{ submitLabel() }}\n </button>\n } @else {\n <button\n type=\"button\"\n class=\"btn btn--next\"\n [disabled]=\"!currentStepValid()\"\n (click)=\"next()\"\n >\n {{ nextLabel() }}\n </button>\n }\n</div>\n","// ── FormDesignerEngine ───────────────────────────────────────────────\n\nimport {\n computed,\n signal,\n type Signal,\n type WritableSignal,\n} from \"@angular/core\";\n\nimport type {\n Condition,\n FormFieldDefinition,\n FormFieldOption,\n FormGroupDefinition,\n FormSchema,\n ValidationRule,\n} from \"../../types\";\n\n// ── Mutable wrappers ────────────────────────────────────────────────\n\n/**\n * Mutable counterpart of {@link FormFieldDefinition} used\n * exclusively inside the designer. Signal-driven so every\n * property change is immediately reflected in the live preview\n * and schema output.\n */\nexport interface MutableFieldDefinition {\n readonly uid: string;\n readonly id: WritableSignal<string>;\n readonly title: WritableSignal<string>;\n readonly description: WritableSignal<string>;\n readonly component: WritableSignal<string>;\n readonly config: WritableSignal<Record<string, unknown>>;\n readonly options: WritableSignal<FormFieldOption[]>;\n readonly validation: WritableSignal<ValidationRule[]>;\n readonly visibleWhen: WritableSignal<Condition | null>;\n readonly enabledWhen: WritableSignal<Condition | null>;\n readonly defaultValue: WritableSignal<unknown>;\n}\n\n/**\n * Mutable counterpart of {@link FormGroupDefinition}.\n */\nexport interface MutableGroupDefinition {\n readonly uid: string;\n readonly id: WritableSignal<string>;\n readonly title: WritableSignal<string>;\n readonly description: WritableSignal<string>;\n readonly fields: WritableSignal<MutableFieldDefinition[]>;\n readonly visibleWhen: WritableSignal<Condition | null>;\n readonly enabledWhen: WritableSignal<Condition | null>;\n}\n\n// ── Selection ───────────────────────────────────────────────────────\n\n/** What kind of item is currently selected in the designer. */\nexport type DesignerSelectionKind = \"field\" | \"group\" | \"form\";\n\n/**\n * Describes the currently selected item in the designer canvas.\n */\nexport interface DesignerSelection {\n readonly kind: DesignerSelectionKind;\n readonly groupUid: string | null;\n readonly fieldUid: string | null;\n}\n\n// ── Counters for generating unique IDs ──────────────────────────────\n\nlet nextFieldId = 1;\nlet nextGroupId = 1;\n\n/** @internal Reset counters (for testing). */\nexport function resetDesignerCounters(): void {\n nextFieldId = 1;\n nextGroupId = 1;\n}\n\n// ── Engine ──────────────────────────────────────────────────────────\n\n/**\n * Signal-based engine that maintains the mutable designer state\n * and produces a readonly {@link FormSchema} snapshot on demand.\n *\n * All mutations go through public methods so the UI stays in sync\n * via Angular's signal-based change detection.\n *\n * @example\n * ```ts\n * const engine = new FormDesignerEngine();\n * engine.addGroup();\n * engine.addField(engine.groups()[0].uid, 'text');\n * const schema = engine.schema();\n * ```\n */\nexport class FormDesignerEngine {\n // ── Form-level properties ─────────────────────────────────────────\n\n /** Form ID. */\n public readonly formId: WritableSignal<string> = signal(\"form-1\");\n\n /** Form title. */\n public readonly formTitle: WritableSignal<string> = signal(\"\");\n\n /** Form description. */\n public readonly formDescription: WritableSignal<string> = signal(\"\");\n\n // ── Groups ────────────────────────────────────────────────────────\n\n /** Ordered list of mutable group definitions. */\n public readonly groups: WritableSignal<MutableGroupDefinition[]> = signal([]);\n\n // ── Selection ─────────────────────────────────────────────────────\n\n /** Currently selected item in the canvas. */\n public readonly selection: WritableSignal<DesignerSelection | null> =\n signal(null);\n\n /** The currently selected mutable field (convenience). */\n public readonly selectedField: Signal<MutableFieldDefinition | null> =\n computed(() => {\n const sel = this.selection();\n if (!sel || sel.kind !== \"field\" || !sel.fieldUid) return null;\n for (const g of this.groups()) {\n for (const f of g.fields()) {\n if (f.uid === sel.fieldUid) return f;\n }\n }\n return null;\n });\n\n /** The currently selected mutable group (convenience). */\n public readonly selectedGroup: Signal<MutableGroupDefinition | null> =\n computed(() => {\n const sel = this.selection();\n if (!sel || !sel.groupUid) return null;\n return this.groups().find((g) => g.uid === sel.groupUid) ?? null;\n });\n\n // ── Computed schema output ────────────────────────────────────────\n\n /**\n * Produces a readonly {@link FormSchema} snapshot from the current\n * mutable state. Fully JSON-serializable.\n */\n public readonly schema: Signal<FormSchema> = computed(() =>\n this.buildSchema(),\n );\n\n // ── Group mutations ───────────────────────────────────────────────\n\n /** Add a new empty group at the end. Returns the new group's uid. */\n public addGroup(): string {\n const uid = crypto.randomUUID();\n const group = this.createMutableGroup(uid, `group-${nextGroupId++}`, \"\");\n this.groups.update((gs) => [...gs, group]);\n this.selection.set({ kind: \"group\", groupUid: uid, fieldUid: null });\n return uid;\n }\n\n /** Remove a group by uid. Clears selection if it pointed at the group. */\n public removeGroup(uid: string): void {\n this.groups.update((gs) => gs.filter((g) => g.uid !== uid));\n const sel = this.selection();\n if (sel && sel.groupUid === uid) {\n this.selection.set(null);\n }\n }\n\n /** Move a group to a new index. */\n public moveGroup(uid: string, newIndex: number): void {\n this.groups.update((gs) => {\n const idx = gs.findIndex((g) => g.uid === uid);\n if (idx === -1 || idx === newIndex) return gs;\n const copy = [...gs];\n const [item] = copy.splice(idx, 1);\n copy.splice(newIndex, 0, item);\n return copy;\n });\n }\n\n // ── Field mutations ───────────────────────────────────────────────\n\n /**\n * Add a new field to a group. Returns the new field's uid.\n *\n * @param groupUid — Target group\n * @param component — Field component key (e.g. `\"text\"`, `\"select\"`)\n * @param atIndex — Optional insertion index (appends if omitted)\n */\n public addField(\n groupUid: string,\n component: string,\n atIndex?: number,\n ): string {\n const group = this.groups().find((g) => g.uid === groupUid);\n if (!group) {\n throw new Error(`FormDesignerEngine: unknown group \"${groupUid}\".`);\n }\n\n const uid = crypto.randomUUID();\n const fieldId = `field_${nextFieldId++}`;\n const field = this.createMutableField(\n uid,\n fieldId,\n this.labelForComponent(component),\n component,\n );\n\n group.fields.update((fs) => {\n const copy = [...fs];\n if (atIndex !== undefined && atIndex >= 0 && atIndex <= copy.length) {\n copy.splice(atIndex, 0, field);\n } else {\n copy.push(field);\n }\n return copy;\n });\n\n this.selection.set({ kind: \"field\", groupUid, fieldUid: uid });\n return uid;\n }\n\n /** Remove a field by uid from its containing group. */\n public removeField(groupUid: string, fieldUid: string): void {\n const group = this.groups().find((g) => g.uid === groupUid);\n if (!group) return;\n group.fields.update((fs) => fs.filter((f) => f.uid !== fieldUid));\n\n const sel = this.selection();\n if (sel && sel.fieldUid === fieldUid) {\n this.selection.set(null);\n }\n }\n\n /** Move a field to a new position within its group, or to another group. */\n public moveField(\n sourceGroupUid: string,\n fieldUid: string,\n targetGroupUid: string,\n targetIndex: number,\n ): void {\n const sourceGroup = this.groups().find((g) => g.uid === sourceGroupUid);\n const targetGroup = this.groups().find((g) => g.uid === targetGroupUid);\n if (!sourceGroup || !targetGroup) return;\n\n let movedField: MutableFieldDefinition | undefined;\n\n sourceGroup.fields.update((fs) => {\n const idx = fs.findIndex((f) => f.uid === fieldUid);\n if (idx === -1) return fs;\n const copy = [...fs];\n [movedField] = copy.splice(idx, 1);\n return copy;\n });\n\n if (!movedField) return;\n\n const fieldToInsert = movedField;\n targetGroup.fields.update((fs) => {\n const copy = [...fs];\n copy.splice(Math.min(targetIndex, copy.length), 0, fieldToInsert);\n return copy;\n });\n }\n\n /** Duplicate a field within its group (inserted right after the original). */\n public duplicateField(groupUid: string, fieldUid: string): string | null {\n const group = this.groups().find((g) => g.uid === groupUid);\n if (!group) return null;\n\n const fields = group.fields();\n const original = fields.find((f) => f.uid === fieldUid);\n if (!original) return null;\n\n const newUid = crypto.randomUUID();\n const copy = this.createMutableField(\n newUid,\n original.id() + \"_copy\",\n original.title() + \" (copy)\",\n original.component(),\n );\n\n // Copy properties\n copy.description.set(original.description());\n copy.config.set({ ...original.config() });\n copy.options.set([...original.options()]);\n copy.validation.set([...original.validation()]);\n copy.visibleWhen.set(original.visibleWhen());\n copy.enabledWhen.set(original.enabledWhen());\n copy.defaultValue.set(original.defaultValue());\n\n const idx = fields.findIndex((f) => f.uid === fieldUid);\n group.fields.update((fs) => {\n const arr = [...fs];\n arr.splice(idx + 1, 0, copy);\n return arr;\n });\n\n this.selection.set({ kind: \"field\", groupUid, fieldUid: newUid });\n return newUid;\n }\n\n // ── Selection ─────────────────────────────────────────────────────\n\n /** Select a field for editing in the inspector. */\n public selectField(groupUid: string, fieldUid: string): void {\n this.selection.set({ kind: \"field\", groupUid, fieldUid });\n }\n\n /** Select a group for editing in the inspector. */\n public selectGroup(groupUid: string): void {\n this.selection.set({ kind: \"group\", groupUid, fieldUid: null });\n }\n\n /** Select the form-level properties for editing. */\n public selectForm(): void {\n this.selection.set({ kind: \"form\", groupUid: null, fieldUid: null });\n }\n\n /** Clear the selection. */\n public clearSelection(): void {\n this.selection.set(null);\n }\n\n // ── Import / Export ───────────────────────────────────────────────\n\n /**\n * Load an existing {@link FormSchema} into the designer,\n * replacing all current state.\n */\n public loadSchema(schema: FormSchema): void {\n this.formId.set(schema.id);\n this.formTitle.set(schema.title ?? \"\");\n this.formDescription.set(schema.description ?? \"\");\n\n const groups = schema.groups.map((gDef) => {\n const gUid = crypto.randomUUID();\n const fields = gDef.fields.map((fDef) => {\n const fUid = crypto.randomUUID();\n const mf = this.createMutableField(\n fUid,\n fDef.id,\n fDef.title,\n fDef.component,\n );\n mf.description.set(fDef.description ?? \"\");\n mf.config.set({ ...(fDef.config ?? {}) });\n mf.options.set([...(fDef.options ?? [])]);\n mf.validation.set([...(fDef.validation ?? [])]);\n mf.visibleWhen.set(fDef.visibleWhen ?? null);\n mf.enabledWhen.set(fDef.enabledWhen ?? null);\n mf.defaultValue.set(fDef.defaultValue ?? null);\n return mf;\n });\n\n const mg = this.createMutableGroup(gUid, gDef.id, gDef.title ?? \"\");\n mg.description.set(gDef.description ?? \"\");\n mg.fields.set(fields);\n mg.visibleWhen.set(gDef.visibleWhen ?? null);\n mg.enabledWhen.set(gDef.enabledWhen ?? null);\n return mg;\n });\n\n this.groups.set(groups);\n this.selection.set(null);\n }\n\n /**\n * Produce a pretty-printed JSON string of the current schema.\n */\n public toJSON(): string {\n return JSON.stringify(this.schema(), null, 2);\n }\n\n // ── Private helpers ───────────────────────────────────────────────\n\n private createMutableField(\n uid: string,\n id: string,\n title: string,\n component: string,\n ): MutableFieldDefinition {\n return {\n uid,\n id: signal(id),\n title: signal(title),\n description: signal(\"\"),\n component: signal(component),\n config: signal({}),\n options: signal([]),\n validation: signal([]),\n visibleWhen: signal(null),\n enabledWhen: signal(null),\n defaultValue: signal(null),\n };\n }\n\n private createMutableGroup(\n uid: string,\n id: string,\n title: string,\n ): MutableGroupDefinition {\n return {\n uid,\n id: signal(id),\n title: signal(title),\n description: signal(\"\"),\n fields: signal([]),\n visibleWhen: signal(null),\n enabledWhen: signal(null),\n };\n }\n\n private buildSchema(): FormSchema {\n const groups: FormGroupDefinition[] = this.groups().map((g) => {\n const fields: FormFieldDefinition[] = g.fields().map((f) => {\n const def: Record<string, unknown> = {\n id: f.id(),\n title: f.title(),\n component: f.component(),\n };\n if (f.description()) def[\"description\"] = f.description();\n if (Object.keys(f.config()).length > 0) def[\"config\"] = f.config();\n if (f.options().length > 0) def[\"options\"] = f.options();\n if (f.validation().length > 0) def[\"validation\"] = f.validation();\n if (f.visibleWhen()) def[\"visibleWhen\"] = f.visibleWhen();\n if (f.enabledWhen()) def[\"enabledWhen\"] = f.enabledWhen();\n if (f.defaultValue() !== null) def[\"defaultValue\"] = f.defaultValue();\n return def as unknown as FormFieldDefinition;\n });\n\n const gDef: Record<string, unknown> = {\n id: g.id(),\n fields,\n };\n if (g.title()) gDef[\"title\"] = g.title();\n if (g.description()) gDef[\"description\"] = g.description();\n if (g.visibleWhen()) gDef[\"visibleWhen\"] = g.visibleWhen();\n if (g.enabledWhen()) gDef[\"enabledWhen\"] = g.enabledWhen();\n return gDef as unknown as FormGroupDefinition;\n });\n\n const schema: Record<string, unknown> = {\n id: this.formId(),\n groups,\n };\n if (this.formTitle()) schema[\"title\"] = this.formTitle();\n if (this.formDescription()) schema[\"description\"] = this.formDescription();\n return schema as unknown as FormSchema;\n }\n\n /**\n * Generate a sensible default label from a component key.\n */\n private labelForComponent(component: string): string {\n const labels: Record<string, string> = {\n text: \"Text Field\",\n select: \"Select\",\n checkbox: \"Checkbox\",\n toggle: \"Toggle\",\n radio: \"Radio Group\",\n autocomplete: \"Autocomplete\",\n date: \"Date Picker\",\n time: \"Time Picker\",\n datetime: \"Date/Time\",\n color: \"Color Picker\",\n slider: \"Slider\",\n richtext: \"Rich Text\",\n file: \"File Upload\",\n \"flair:richtext\": \"Rich Text (flair)\",\n \"flair:image\": \"Image (flair)\",\n \"flair:media\": \"Media (flair)\",\n };\n return labels[component] ?? component;\n }\n}\n","// ── UIFieldPalette ──────────────────────────────────────────────────\n\nimport { ChangeDetectionStrategy, Component, output } from \"@angular/core\";\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Metadata for a draggable field type shown in the palette.\n */\nexport interface PaletteFieldType {\n /** Registry component key (e.g. `\"text\"`, `\"select\"`). */\n readonly key: string;\n /** Display label. */\n readonly label: string;\n /** Short description shown on hover. */\n readonly description: string;\n /** SVG icon content from the `UIIcons` registry. */\n readonly icon: string;\n}\n\n/** All built-in field types available in the palette. */\nconst PALETTE_FIELDS: readonly PaletteFieldType[] = [\n {\n key: \"text\",\n label: \"Text\",\n description: \"Single-line text input\",\n icon: UIIcons.Lucide.Text.TextCursorInput,\n },\n {\n key: \"select\",\n label: \"Select\",\n description: \"Dropdown selection\",\n icon: UIIcons.Lucide.Arrows.ChevronsUpDown,\n },\n {\n key: \"checkbox\",\n label: \"Checkbox\",\n description: \"Boolean checkbox\",\n icon: UIIcons.Lucide.Notifications.SquareCheck,\n },\n {\n key: \"toggle\",\n label: \"Toggle\",\n description: \"On/off toggle switch\",\n icon: UIIcons.Lucide.Account.ToggleLeft,\n },\n {\n key: \"radio\",\n label: \"Radio\",\n description: \"Radio button group\",\n icon: UIIcons.Lucide.Shapes.CircleDot,\n },\n {\n key: \"autocomplete\",\n label: \"Autocomplete\",\n description: \"Search with suggestions\",\n icon: UIIcons.Lucide.Social.Search,\n },\n {\n key: \"date\",\n label: \"Date\",\n description: \"Date picker\",\n icon: UIIcons.Lucide.Time.Calendar,\n },\n {\n key: \"time\",\n label: \"Time\",\n description: \"Time picker\",\n icon: UIIcons.Lucide.Time.Clock,\n },\n {\n key: \"datetime\",\n label: \"Date/Time\",\n description: \"Date and time picker\",\n icon: UIIcons.Lucide.Time.CalendarClock,\n },\n {\n key: \"color\",\n label: \"Color\",\n description: \"Color picker\",\n icon: UIIcons.Lucide.Design.Palette,\n },\n {\n key: \"slider\",\n label: \"Slider\",\n description: \"Numeric range slider\",\n icon: UIIcons.Lucide.Account.SlidersHorizontal,\n },\n {\n key: \"richtext\",\n label: \"Rich Text\",\n description: \"Rich text editor\",\n icon: UIIcons.Lucide.Text.Pilcrow,\n },\n {\n key: \"file\",\n label: \"File\",\n description: \"File upload\",\n icon: UIIcons.Lucide.Files.FileUp,\n },\n];\n\n/** Flair (non-data) types available in the palette. */\nconst PALETTE_FLAIR: readonly PaletteFieldType[] = [\n {\n key: \"flair:richtext\",\n label: \"Rich Text\",\n description: \"Static rich text content\",\n icon: UIIcons.Lucide.Text.PenLine,\n },\n {\n key: \"flair:image\",\n label: \"Image\",\n description: \"Static image\",\n icon: UIIcons.Lucide.Photography.Image,\n },\n {\n key: \"flair:media\",\n label: \"Media\",\n description: \"Audio or video player\",\n icon: UIIcons.Lucide.Communication.Video,\n },\n];\n\n/**\n * Palette sidebar that lists available field types. Clicking or\n * dragging a type emits the component key so the parent can add\n * it to the canvas.\n *\n * @example\n * ```html\n * <ui-field-palette (fieldRequested)=\"onAddField($event)\" />\n * ```\n */\n@Component({\n selector: \"ui-field-palette\",\n standalone: true,\n imports: [UIIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-field-palette\" },\n templateUrl: \"./field-palette.component.html\",\n styleUrl: \"./field-palette.component.scss\",\n})\nexport class UIFieldPalette {\n /** Emitted when the user clicks a field type to add it. */\n public readonly fieldRequested = output<string>();\n\n /** @internal Available field types. */\n protected readonly fieldTypes = PALETTE_FIELDS;\n\n /** @internal Available flair types. */\n protected readonly flairTypes = PALETTE_FLAIR;\n\n /** @internal */\n protected onDragStart(event: DragEvent, key: string): void {\n event.dataTransfer?.setData(\"text/plain\", key);\n event.dataTransfer!.effectAllowed = \"copy\";\n }\n}\n","<h3 class=\"heading\" id=\"heading-fields\">Fields</h3>\n<nav class=\"list\" aria-labelledby=\"heading-fields\">\n @for (ft of fieldTypes; track ft.key) {\n <button\n type=\"button\"\n class=\"item\"\n [attr.aria-label]=\"'Add ' + ft.label + ' field: ' + ft.description\"\n (click)=\"fieldRequested.emit(ft.key)\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, ft.key)\"\n >\n <ui-icon\n class=\"icon\"\n [svg]=\"ft.icon\"\n [size]=\"16\"\n aria-hidden=\"true\"\n />\n <span class=\"label\">{{ ft.label }}</span>\n </button>\n }\n</nav>\n\n<h3 class=\"heading heading--flair\" id=\"heading-flair\">Flair</h3>\n<nav class=\"list\" aria-labelledby=\"heading-flair\">\n @for (ft of flairTypes; track ft.key) {\n <button\n type=\"button\"\n class=\"item\"\n [attr.aria-label]=\"'Add ' + ft.label + ' flair: ' + ft.description\"\n (click)=\"fieldRequested.emit(ft.key)\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, ft.key)\"\n >\n <ui-icon\n class=\"icon\"\n [svg]=\"ft.icon\"\n [size]=\"16\"\n aria-hidden=\"true\"\n />\n <span class=\"label\">{{ ft.label }}</span>\n </button>\n }\n</nav>\n","// ── UIDesignerCanvas ────────────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from \"@angular/core\";\n\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\n\nimport { isFlairComponent } from \"../../types/form-schema.types\";\nimport type {\n FormDesignerEngine,\n MutableGroupDefinition,\n} from \"./designer-engine\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * The central canvas of the form designer. Displays all groups\n * and their fields as interactive cards that can be selected,\n * reordered, and deleted.\n *\n * @example\n * ```html\n * <ui-designer-canvas [engine]=\"engine\" />\n * ```\n */\n@Component({\n selector: \"ui-designer-canvas\",\n standalone: true,\n imports: [UIIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-designer-canvas\" },\n templateUrl: \"./designer-canvas.component.html\",\n styleUrl: \"./designer-canvas.component.scss\",\n})\nexport class UIDesignerCanvas {\n /** The designer engine driving this canvas. */\n public readonly engine = input.required<FormDesignerEngine>();\n\n /** Emitted when \"Add field\" is clicked on a group (passes group uid). */\n public readonly addFieldRequest = output<string>();\n\n /** @internal Icon references exposed to the template. */\n protected readonly icons = {\n ChevronUp: UIIcons.Lucide.Arrows.ChevronUp,\n ChevronDown: UIIcons.Lucide.Arrows.ChevronDown,\n Copy: UIIcons.Lucide.Text.Copy,\n X: UIIcons.Lucide.Notifications.X,\n } as const;\n\n /** @internal Whether a component key is a flair type. */\n protected readonly isFlair = isFlairComponent;\n\n /** @internal */\n protected moveGroupUp(event: Event, uid: string, index: number): void {\n event.stopPropagation();\n this.engine().moveGroup(uid, index - 1);\n }\n\n /** @internal */\n protected moveGroupDown(event: Event, uid: string, index: number): void {\n event.stopPropagation();\n this.engine().moveGroup(uid, index + 1);\n }\n\n /** @internal */\n protected removeGroup(event: Event, uid: string): void {\n event.stopPropagation();\n this.engine().removeGroup(uid);\n }\n\n /** @internal */\n protected moveFieldUp(\n event: Event,\n groupUid: string,\n fieldUid: string,\n index: number,\n ): void {\n event.stopPropagation();\n this.engine().moveField(groupUid, fieldUid, groupUid, index - 1);\n }\n\n /** @internal */\n protected moveFieldDown(\n event: Event,\n groupUid: string,\n fieldUid: string,\n index: number,\n ): void {\n event.stopPropagation();\n this.engine().moveField(groupUid, fieldUid, groupUid, index + 1);\n }\n\n /** @internal */\n protected duplicateField(\n event: Event,\n groupUid: string,\n fieldUid: string,\n ): void {\n event.stopPropagation();\n this.engine().duplicateField(groupUid, fieldUid);\n }\n\n /** @internal */\n protected removeField(\n event: Event,\n groupUid: string,\n fieldUid: string,\n ): void {\n event.stopPropagation();\n this.engine().removeField(groupUid, fieldUid);\n }\n\n /** @internal */\n protected onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.dataTransfer!.dropEffect = \"copy\";\n }\n\n /** @internal */\n protected onDropField(event: DragEvent, group: MutableGroupDefinition): void {\n event.preventDefault();\n const component = event.dataTransfer?.getData(\"text/plain\");\n if (component) {\n this.engine().addField(group.uid, component);\n }\n }\n}\n","<!-- Form header (click to select form-level props) -->\n<button\n type=\"button\"\n class=\"form-header\"\n [class.form-header--selected]=\"engine().selection()?.kind === 'form'\"\n [attr.aria-pressed]=\"engine().selection()?.kind === 'form'\"\n aria-label=\"Select form properties\"\n (click)=\"engine().selectForm()\"\n>\n <span class=\"form-title\">\n {{ engine().formTitle() || \"Untitled Form\" }}\n </span>\n @if (engine().formDescription()) {\n <span class=\"form-desc\">{{ engine().formDescription() }}</span>\n }\n</button>\n\n<!-- Groups -->\n@for (group of engine().groups(); track group.uid; let gi = $index) {\n <section\n class=\"group\"\n role=\"region\"\n [attr.aria-label]=\"group.title() || 'Group ' + (gi + 1)\"\n [class.group--selected]=\"\n engine().selection()?.kind === 'group' &&\n engine().selection()?.groupUid === group.uid\n \"\n (drop)=\"onDropField($event, group)\"\n (dragover)=\"onDragOver($event)\"\n >\n <!-- Group header -->\n <div class=\"group-header\">\n <span\n class=\"group-title\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"\n 'Select group: ' + (group.title() || 'Group ' + (gi + 1))\n \"\n (click)=\"engine().selectGroup(group.uid)\"\n (keydown.enter)=\"engine().selectGroup(group.uid)\"\n >{{ group.title() || \"Group \" + (gi + 1) }}</span\n >\n <div class=\"group-actions\">\n <button\n type=\"button\"\n class=\"dc-icon-btn\"\n aria-label=\"Move group up\"\n [disabled]=\"gi === 0\"\n (click)=\"moveGroupUp($event, group.uid, gi)\"\n >\n <ui-icon [svg]=\"icons.ChevronUp\" [size]=\"14\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"dc-icon-btn\"\n aria-label=\"Move group down\"\n [disabled]=\"gi === engine().groups().length - 1\"\n (click)=\"moveGroupDown($event, group.uid, gi)\"\n >\n <ui-icon\n [svg]=\"icons.ChevronDown\"\n [size]=\"14\"\n aria-hidden=\"true\"\n />\n </button>\n <button\n type=\"button\"\n class=\"dc-icon-btn dc-icon-btn--danger\"\n aria-label=\"Remove group\"\n (click)=\"removeGroup($event, group.uid)\"\n >\n <ui-icon [svg]=\"icons.X\" [size]=\"14\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n\n <!-- Fields -->\n <div class=\"fields\">\n @for (field of group.fields(); track field.uid; let fi = $index) {\n <div\n class=\"field\"\n [class.field--selected]=\"\n engine().selection()?.fieldUid === field.uid\n \"\n [class.field--flair]=\"isFlair(field.component())\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Select field: ' + field.title()\"\n (click)=\"engine().selectField(group.uid, field.uid)\"\n (keydown.enter)=\"engine().selectField(group.uid, field.uid)\"\n >\n <div\n class=\"field-info\"\n >\n <span class=\"field-component\" aria-hidden=\"true\">{{\n field.component()\n }}</span>\n <span class=\"field-title\">{{ field.title() }}</span>\n <span class=\"field-id\" aria-hidden=\"true\">{{\n field.id()\n }}</span>\n </div>\n <div\n class=\"field-actions\"\n role=\"toolbar\"\n [attr.aria-label]=\"'Actions for ' + field.title()\"\n >\n <button\n type=\"button\"\n class=\"dc-icon-btn\"\n aria-label=\"Move field up\"\n [disabled]=\"fi === 0\"\n (click)=\"moveFieldUp($event, group.uid, field.uid, fi)\"\n >\n <ui-icon\n [svg]=\"icons.ChevronUp\"\n [size]=\"14\"\n aria-hidden=\"true\"\n />\n </button>\n <button\n type=\"button\"\n class=\"dc-icon-btn\"\n aria-label=\"Move field down\"\n [disabled]=\"fi === group.fields().length - 1\"\n (click)=\"moveFieldDown($event, group.uid, field.uid, fi)\"\n >\n <ui-icon\n [svg]=\"icons.ChevronDown\"\n [size]=\"14\"\n aria-hidden=\"true\"\n />\n </button>\n <button\n type=\"button\"\n class=\"dc-icon-btn\"\n aria-label=\"Duplicate field\"\n (click)=\"duplicateField($event, group.uid, field.uid)\"\n >\n <ui-icon [svg]=\"icons.Copy\" [size]=\"14\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"dc-icon-btn dc-icon-btn--danger\"\n aria-label=\"Remove field\"\n (click)=\"removeField($event, group.uid, field.uid)\"\n >\n <ui-icon [svg]=\"icons.X\" [size]=\"14\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n }\n\n @if (group.fields().length === 0) {\n <div class=\"dc-empty\">\n Drop or click a field type to add it here\n </div>\n }\n </div>\n\n <!-- Add field button -->\n <button\n type=\"button\"\n class=\"dc-add-field\"\n (click)=\"addFieldRequest.emit(group.uid)\"\n >\n + Add field\n </button>\n </section>\n}\n\n<!-- Add group button -->\n<button type=\"button\" class=\"dc-add-group\" (click)=\"engine().addGroup()\">\n + Add group\n</button>\n","// ── Component config schemas ────────────────────────────────────────\n\n/**\n * Describes a single config property that the property inspector\n * renders as a structured form control.\n */\nexport interface ConfigPropertySchema {\n /** The config key name (e.g. `\"type\"`, `\"multiline\"`). */\n readonly key: string;\n\n /** Human-readable label shown in the inspector. */\n readonly label: string;\n\n /** The editor to use. */\n readonly editor: \"text\" | \"number\" | \"boolean\" | \"select\" | \"richtext\";\n\n /**\n * For `\"select\"` editors — the list of allowed values.\n * Each entry is either a plain string (used as both label and value)\n * or a `{ label, value }` pair.\n */\n readonly options?: readonly (string | { label: string; value: string })[];\n\n /** Default value when the property is not set. */\n readonly defaultValue?: unknown;\n\n /** Optional short hint shown as placeholder text. */\n readonly placeholder?: string;\n\n /**\n * When provided, the property is only shown in the inspector if this\n * predicate returns `true` for the current config values.\n */\n readonly visibleWhen?: (config: Record<string, unknown>) => boolean;\n}\n\n/**\n * Map from component key (e.g. `\"text\"`, `\"slider\"`) to an ordered\n * list of config property schemas.\n *\n * Properties that are not in this map for a given component are\n * still stored in `config` but are only editable via the raw\n * JSON fallback textarea.\n */\nexport const COMPONENT_CONFIG_SCHEMAS: Readonly<\n Record<string, readonly ConfigPropertySchema[]>\n> = {\n text: [\n {\n key: \"type\",\n label: \"Input type\",\n editor: \"select\",\n options: [\"text\", \"email\", \"password\", \"url\", \"tel\", \"search\"],\n defaultValue: \"text\",\n visibleWhen: (cfg) => !cfg[\"textAdapter\"],\n },\n {\n key: \"textAdapter\",\n label: \"Text adapter\",\n editor: \"select\",\n options: [\n { label: \"(none)\", value: \"\" },\n { label: \"Email\", value: \"email\" },\n { label: \"URL\", value: \"url\" },\n { label: \"IP Address\", value: \"ip\" },\n { label: \"Phone\", value: \"phone\" },\n { label: \"Credit Card\", value: \"creditCard\" },\n { label: \"Money\", value: \"money\" },\n { label: \"Integer\", value: \"integer\" },\n { label: \"Float\", value: \"float\" },\n { label: \"Decimal\", value: \"decimal\" },\n { label: \"Hexadecimal\", value: \"hexadecimal\" },\n { label: \"Percentage\", value: \"percentage\" },\n { label: \"Date\", value: \"date\" },\n { label: \"Time\", value: \"time\" },\n { label: \"Colour\", value: \"color\" },\n { label: \"Slug\", value: \"slug\" },\n { label: \"UUID\", value: \"uuid\" },\n { label: \"Cron\", value: \"cron\" },\n ],\n defaultValue: \"\",\n },\n {\n key: \"placeholder\",\n label: \"Placeholder\",\n editor: \"text\",\n placeholder: \"e.g. Enter your name…\",\n },\n {\n key: \"multiline\",\n label: \"Multiline (textarea)\",\n editor: \"boolean\",\n defaultValue: false,\n },\n {\n key: \"rows\",\n label: \"Visible rows\",\n editor: \"number\",\n defaultValue: 3,\n placeholder: \"3\",\n },\n ],\n\n select: [\n {\n key: \"placeholder\",\n label: \"Placeholder\",\n editor: \"text\",\n placeholder: \"e.g. Choose…\",\n },\n ],\n\n checkbox: [\n {\n key: \"variant\",\n label: \"Variant\",\n editor: \"select\",\n options: [\"checkbox\", \"switch\"],\n defaultValue: \"checkbox\",\n },\n {\n key: \"indeterminate\",\n label: \"Indeterminate\",\n editor: \"boolean\",\n defaultValue: false,\n },\n ],\n\n toggle: [\n {\n key: \"onLabel\",\n label: \"On label\",\n editor: \"text\",\n placeholder: \"e.g. Enabled\",\n },\n {\n key: \"offLabel\",\n label: \"Off label\",\n editor: \"text\",\n placeholder: \"e.g. Disabled\",\n },\n {\n key: \"size\",\n label: \"Size\",\n editor: \"select\",\n options: [\"sm\", \"md\", \"lg\"],\n defaultValue: \"md\",\n },\n ],\n\n radio: [],\n\n autocomplete: [\n {\n key: \"placeholder\",\n label: \"Placeholder\",\n editor: \"text\",\n placeholder: \"e.g. Search…\",\n },\n {\n key: \"minQueryLength\",\n label: \"Min query length\",\n editor: \"number\",\n defaultValue: 1,\n },\n {\n key: \"multi\",\n label: \"Multi-select\",\n editor: \"boolean\",\n defaultValue: false,\n },\n ],\n\n date: [\n {\n key: \"format\",\n label: \"Date format\",\n editor: \"select\",\n options: [\n \"yyyy-MM-dd\",\n \"dd/MM/yyyy\",\n \"MM/dd/yyyy\",\n \"dd.MM.yyyy\",\n \"dd-MM-yyyy\",\n \"yyyy/MM/dd\",\n ],\n defaultValue: \"yyyy-MM-dd\",\n },\n {\n key: \"placeholder\",\n label: \"Placeholder\",\n editor: \"text\",\n placeholder: \"e.g. Select date\",\n },\n {\n key: \"firstDayOfWeek\",\n label: \"First day of week\",\n editor: \"select\",\n options: [\n { label: \"Sunday\", value: \"0\" },\n { label: \"Monday\", value: \"1\" },\n { label: \"Tuesday\", value: \"2\" },\n { label: \"Wednesday\", value: \"3\" },\n { label: \"Thursday\", value: \"4\" },\n { label: \"Friday\", value: \"5\" },\n { label: \"Saturday\", value: \"6\" },\n ],\n defaultValue: 1,\n },\n ],\n\n time: [\n {\n key: \"clockMode\",\n label: \"Clock mode\",\n editor: \"select\",\n options: [\n { label: \"24-hour\", value: \"24\" },\n { label: \"12-hour\", value: \"12\" },\n ],\n defaultValue: 24,\n },\n {\n key: \"minuteStep\",\n label: \"Minute step\",\n editor: \"number\",\n defaultValue: 1,\n },\n ],\n\n datetime: [\n {\n key: \"dateFormat\",\n label: \"Date format\",\n editor: \"select\",\n options: [\n \"yyyy-MM-dd\",\n \"dd/MM/yyyy\",\n \"MM/dd/yyyy\",\n \"dd.MM.yyyy\",\n \"dd-MM-yyyy\",\n \"yyyy/MM/dd\",\n ],\n defaultValue: \"yyyy-MM-dd\",\n },\n {\n key: \"clockMode\",\n label: \"Clock mode\",\n editor: \"select\",\n options: [\n { label: \"24-hour\", value: \"24\" },\n { label: \"12-hour\", value: \"12\" },\n ],\n defaultValue: 24,\n },\n {\n key: \"minuteStep\",\n label: \"Minute step\",\n editor: \"number\",\n defaultValue: 1,\n },\n ],\n\n color: [\n {\n key: \"defaultMode\",\n label: \"Default mode\",\n editor: \"select\",\n options: [\"theme\", \"grid\", \"rgba\", \"hsla\"],\n defaultValue: \"theme\",\n },\n ],\n\n slider: [\n {\n key: \"mode\",\n label: \"Mode\",\n editor: \"select\",\n options: [\"single\", \"range\"],\n defaultValue: \"single\",\n },\n {\n key: \"min\",\n label: \"Min value\",\n editor: \"number\",\n defaultValue: 0,\n },\n {\n key: \"max\",\n label: \"Max value\",\n editor: \"number\",\n defaultValue: 100,\n },\n {\n key: \"step\",\n label: \"Step\",\n editor: \"number\",\n defaultValue: 1,\n },\n {\n key: \"showValue\",\n label: \"Show value label\",\n editor: \"boolean\",\n defaultValue: false,\n },\n {\n key: \"showTicks\",\n label: \"Show tick marks\",\n editor: \"boolean\",\n defaultValue: false,\n },\n ],\n\n richtext: [\n {\n key: \"mode\",\n label: \"Mode\",\n editor: \"select\",\n options: [\"html\", \"markdown\"],\n defaultValue: \"html\",\n },\n {\n key: \"placeholder\",\n label: \"Placeholder\",\n editor: \"text\",\n placeholder: \"e.g. Type here…\",\n },\n {\n key: \"sanitize\",\n label: \"Sanitize HTML\",\n editor: \"boolean\",\n defaultValue: true,\n },\n {\n key: \"maxLength\",\n label: \"Max length\",\n editor: \"number\",\n placeholder: \"0 = unlimited\",\n },\n ],\n\n file: [\n {\n key: \"accept\",\n label: \"Accepted types\",\n editor: \"text\",\n placeholder: \"e.g. image/*,.pdf\",\n },\n {\n key: \"multiple\",\n label: \"Multiple files\",\n editor: \"boolean\",\n defaultValue: false,\n },\n {\n key: \"maxFileSize\",\n label: \"Max file size (bytes)\",\n editor: \"number\",\n placeholder: \"e.g. 5242880\",\n },\n ],\n\n // ── Flair components ────────────────────────────────────────────────\n\n \"flair:richtext\": [\n {\n key: \"content\",\n label: \"HTML content\",\n editor: \"richtext\",\n },\n ],\n\n \"flair:image\": [\n {\n key: \"src\",\n label: \"Image URL\",\n editor: \"text\",\n placeholder: \"https://example.com/image.png\",\n },\n {\n key: \"alt\",\n label: \"Alt text\",\n editor: \"text\",\n placeholder: \"Describe the image\",\n },\n {\n key: \"width\",\n label: \"Width (px)\",\n editor: \"number\",\n placeholder: \"e.g. 400\",\n },\n {\n key: \"height\",\n label: \"Height (px)\",\n editor: \"number\",\n placeholder: \"e.g. 300\",\n },\n ],\n\n \"flair:media\": [\n {\n key: \"source\",\n label: \"Media URL\",\n editor: \"text\",\n placeholder: \"https://example.com/video.mp4\",\n },\n {\n key: \"type\",\n label: \"Media type\",\n editor: \"select\",\n options: [\"video\", \"audio\"],\n defaultValue: \"video\",\n },\n {\n key: \"controls\",\n label: \"Show controls\",\n editor: \"boolean\",\n defaultValue: true,\n },\n {\n key: \"poster\",\n label: \"Poster image URL\",\n editor: \"text\",\n placeholder: \"https://example.com/poster.jpg\",\n },\n ],\n};\n\n/**\n * Returns the config property schemas for a given component key.\n * Returns an empty array for unknown components.\n */\nexport function getConfigSchema(\n component: string,\n): readonly ConfigPropertySchema[] {\n return COMPONENT_CONFIG_SCHEMAS[component] ?? [];\n}\n","// ── UIRichTextContentDialog ─────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal,\n} from \"@angular/core\";\n\nimport {\n ModalRef,\n type UIModalContent,\n UIRichTextEditor,\n} from \"@theredhead/lucid-kit\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Modal dialog for editing the HTML content of a `flair:richtext`\n * field in the form designer.\n *\n * Opens a full {@link UIRichTextEditor} inside a native `<dialog>`\n * with Apply / Cancel actions.\n *\n * @internal Used exclusively by {@link UIPropertyInspector}.\n */\n@Component({\n selector: \"ui-richtext-content-dialog\",\n standalone: true,\n imports: [UIRichTextEditor],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-richtext-content-dialog\" },\n templateUrl: \"./richtext-content-dialog.component.html\",\n styleUrl: \"./richtext-content-dialog.component.scss\",\n})\nexport class UIRichTextContentDialog implements UIModalContent<string> {\n public readonly modalRef = inject(ModalRef<string>);\n\n /** Pre-filled HTML content (set via input by ModalService). */\n public readonly initialContent = input<string>(\"\");\n\n /** Mutable content value for the editor. @internal */\n protected readonly content = signal(\"\");\n\n public constructor() {\n queueMicrotask(() => {\n this.content.set(this.initialContent());\n });\n }\n\n /** @internal Called when the editor emits a value change. */\n protected onValueChange(html: string): void {\n this.content.set(html);\n }\n\n /** Apply and close the dialog with the edited content. */\n protected apply(): void {\n this.modalRef.close(this.content());\n }\n\n /** Cancel and dismiss the dialog without a result. */\n protected cancel(): void {\n this.modalRef.close(undefined);\n }\n}\n","<div class=\"editor-wrapper\">\n <ui-rich-text-editor\n [value]=\"content()\"\n (valueChange)=\"onValueChange($event)\"\n ariaLabel=\"Edit rich text content\"\n />\n</div>\n<div class=\"actions\">\n <button\n type=\"button\"\n class=\"btn btn--cancel\"\n (click)=\"cancel()\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"btn btn--apply\"\n (click)=\"apply()\"\n >\n Apply\n </button>\n</div>\n","// ── UIPropertyInspector ─────────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal,\n} from \"@angular/core\";\n\nimport {\n ModalService,\n type SelectOption,\n UICheckbox,\n UIDropdownList,\n UIIcon,\n UIIcons,\n UIInput,\n} from \"@theredhead/lucid-kit\";\n\nimport { isFlairComponent } from \"../../types/form-schema.types\";\nimport type {\n FormDesignerEngine,\n MutableFieldDefinition,\n} from \"./designer-engine\";\n\nimport { type ConfigPropertySchema, getConfigSchema } from \"./config-schema\";\nimport { UIRichTextContentDialog } from \"./richtext-content-dialog/richtext-content-dialog.component\";\n\nimport type {\n ValidationRule,\n ValidationRuleType,\n} from \"../../types/validation.types\";\nimport { UISurface } from \"@theredhead/lucid-foundation\";\n\n/** Available component keys for the component selector. */\nconst COMPONENT_OPTIONS: SelectOption[] = [\n \"text\",\n \"select\",\n \"checkbox\",\n \"toggle\",\n \"radio\",\n \"autocomplete\",\n \"date\",\n \"time\",\n \"datetime\",\n \"color\",\n \"slider\",\n \"richtext\",\n \"file\",\n \"flair:richtext\",\n \"flair:image\",\n \"flair:media\",\n].map((k) => ({ value: k, label: k }));\n\n/** Available validation rule types. */\nconst VALIDATION_TYPE_OPTIONS: SelectOption[] = (\n [\n \"required\",\n \"minLength\",\n \"maxLength\",\n \"min\",\n \"max\",\n \"pattern\",\n \"email\",\n ] satisfies ValidationRuleType[]\n).map((k) => ({ value: k, label: k }));\n\n/**\n * Property inspector panel for editing the properties of the\n * currently selected field, group, or form.\n *\n * @example\n * ```html\n * <ui-property-inspector [engine]=\"engine\" />\n * ```\n */\n@Component({\n selector: \"ui-property-inspector\",\n standalone: true,\n imports: [UIIcon, UIInput, UIDropdownList, UICheckbox],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: [\"surfaceType\"] }],\n host: { class: \"ui-property-inspector\" },\n templateUrl: \"./property-inspector.component.html\",\n styleUrl: \"./property-inspector.component.scss\",\n})\nexport class UIPropertyInspector {\n /** The designer engine driving this inspector. */\n public readonly engine = input.required<FormDesignerEngine>();\n\n /** @internal */\n protected readonly componentOptions = COMPONENT_OPTIONS;\n\n /** @internal */\n protected readonly validationTypeOptions = VALIDATION_TYPE_OPTIONS;\n\n /** @internal */\n protected readonly configError = signal<string>(\"\");\n\n /** @internal X icon for remove buttons. */\n protected readonly iconX = UIIcons.Lucide.Notifications.X;\n\n /** @internal Edit icon for the rich text button. */\n protected readonly iconEdit = UIIcons.Lucide.Text.Type;\n\n private readonly modalService = inject(ModalService);\n\n // ── Helpers ───────────────────────────────────────────────────────\n\n /** @internal Extract input value from a DOM event. */\n protected inputValue(event: Event): string {\n return (event.target as HTMLInputElement).value;\n }\n\n /** @internal Whether the field type supports options. */\n protected showOptions(field: MutableFieldDefinition): boolean {\n const comp = field.component();\n return comp === \"select\" || comp === \"radio\" || comp === \"autocomplete\";\n }\n\n /** @internal Whether the field is a flair (non-data) component. */\n protected isFieldFlair(field: MutableFieldDefinition): boolean {\n return isFlairComponent(field.component());\n }\n\n // ── Options ───────────────────────────────────────────────────────\n\n /** @internal */\n protected addOption(field: MutableFieldDefinition): void {\n field.options.update((opts) => [...opts, { label: \"\", value: \"\" }]);\n }\n\n /** @internal */\n protected removeOption(field: MutableFieldDefinition, index: number): void {\n field.options.update((opts) => opts.filter((_, i) => i !== index));\n }\n\n /** @internal */\n protected updateOption(\n field: MutableFieldDefinition,\n index: number,\n key: \"label\" | \"value\",\n value: string,\n ): void {\n field.options.update((opts) => {\n const copy = [...opts];\n copy[index] = { ...copy[index], [key]: value };\n return copy;\n });\n }\n\n // ── Validation ────────────────────────────────────────────────────\n\n /** @internal */\n protected addValidationRule(field: MutableFieldDefinition): void {\n field.validation.update((rules) => [\n ...rules,\n { type: \"required\" as ValidationRuleType, message: \"\" },\n ]);\n }\n\n /** @internal */\n protected removeValidationRule(\n field: MutableFieldDefinition,\n index: number,\n ): void {\n field.validation.update((rules) => rules.filter((_, i) => i !== index));\n }\n\n /** @internal */\n protected updateValidationRule(\n field: MutableFieldDefinition,\n index: number,\n key: string,\n value: string,\n ): void {\n field.validation.update((rules) => {\n const copy = [...rules];\n copy[index] = { ...copy[index], [key]: value } as ValidationRule;\n return copy;\n });\n }\n\n /** @internal */\n protected ruleHasParam(type: string): boolean {\n return [\"minLength\", \"maxLength\", \"min\", \"max\", \"pattern\"].includes(type);\n }\n\n /** @internal */\n protected paramPlaceholder(type: string): string {\n switch (type) {\n case \"minLength\":\n return \"Min length\";\n case \"maxLength\":\n return \"Max length\";\n case \"min\":\n return \"Min value\";\n case \"max\":\n return \"Max value\";\n case \"pattern\":\n return \"Regex pattern\";\n default:\n return \"Param\";\n }\n }\n\n /** @internal */\n protected ruleParamValue(rule: ValidationRule): string {\n if (!rule.params) return \"\";\n const p = rule.params;\n return String(p[\"min\"] ?? p[\"max\"] ?? p[\"pattern\"] ?? \"\");\n }\n\n /** @internal */\n protected updateValidationParam(\n field: MutableFieldDefinition,\n index: number,\n type: string,\n value: string,\n ): void {\n field.validation.update((rules) => {\n const copy = [...rules];\n let params: Record<string, unknown>;\n switch (type) {\n case \"minLength\":\n params = { min: parseInt(value, 10) || 0 };\n break;\n case \"maxLength\":\n params = { max: parseInt(value, 10) || 0 };\n break;\n case \"min\":\n params = { min: parseFloat(value) || 0 };\n break;\n case \"max\":\n params = { max: parseFloat(value) || 0 };\n break;\n case \"pattern\":\n params = { pattern: value };\n break;\n default:\n params = {};\n }\n copy[index] = { ...copy[index], params };\n return copy;\n });\n }\n\n // ── Structured Config ─────────────────────────────────────────────\n\n /** @internal Returns the config property schemas for the field's component. */\n protected configSchemaFor(\n field: MutableFieldDefinition,\n ): readonly ConfigPropertySchema[] {\n return getConfigSchema(field.component());\n }\n\n /** @internal Read a single config value. */\n protected configValue(field: MutableFieldDefinition, key: string): unknown {\n return field.config()[key] ?? null;\n }\n\n /** @internal Set a string config value (removes key if empty). */\n protected setConfigValue(\n field: MutableFieldDefinition,\n key: string,\n value: string,\n ): void {\n field.config.update((cfg) => {\n const copy = { ...cfg };\n if (value === \"\") {\n delete copy[key];\n } else {\n copy[key] = value;\n }\n return copy;\n });\n }\n\n /** @internal Set a numeric config value (removes key if empty/NaN). */\n protected setConfigNumber(\n field: MutableFieldDefinition,\n key: string,\n raw: string,\n ): void {\n field.config.update((cfg) => {\n const copy = { ...cfg };\n const n = parseFloat(raw);\n if (raw === \"\" || isNaN(n)) {\n delete copy[key];\n } else {\n copy[key] = n;\n }\n return copy;\n });\n }\n\n /** @internal Set a boolean config value. */\n protected setConfigBoolean(\n field: MutableFieldDefinition,\n key: string,\n checked: boolean,\n ): void {\n field.config.update((cfg) => {\n const copy = { ...cfg };\n if (!checked) {\n delete copy[key];\n } else {\n copy[key] = true;\n }\n return copy;\n });\n }\n\n /** @internal Normalize select options to SelectOption[] with empty option. */\n protected configSelectOptions(prop: ConfigPropertySchema): SelectOption[] {\n const opts = (prop.options ?? []).map((o) =>\n typeof o === \"string\" ? { label: o, value: o } : o,\n );\n return [{ label: \"\\u2014\", value: \"\" }, ...opts];\n }\n\n /** @internal Open a richtext editor dialog for the given config key. */\n protected openRichTextEditor(\n field: MutableFieldDefinition,\n key: string,\n ): void {\n const current = (field.config()[key] as string) ?? \"\";\n this.modalService\n .openModal<UIRichTextContentDialog, string>({\n component: UIRichTextContentDialog,\n inputs: { initialContent: current },\n ariaLabel: \"Edit rich text content\",\n })\n .closed.subscribe((result) => {\n if (result !== undefined) {\n this.setConfigValue(field, key, result);\n }\n });\n }\n\n // ── Extra Config (raw JSON for unknown keys) ──────────────────────\n\n /** @internal Whether the field has config keys not covered by the schema. */\n protected hasExtraConfig(field: MutableFieldDefinition): boolean {\n const schemaKeys = new Set(\n getConfigSchema(field.component()).map((p) => p.key),\n );\n return Object.keys(field.config()).some((k) => !schemaKeys.has(k));\n }\n\n /** @internal JSON string of config keys NOT in the structured schema. */\n protected extraConfigJSON(field: MutableFieldDefinition): string {\n const schemaKeys = new Set(\n getConfigSchema(field.component()).map((p) => p.key),\n );\n const extra: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(field.config())) {\n if (!schemaKeys.has(k)) extra[k] = v;\n }\n return Object.keys(extra).length > 0 ? JSON.stringify(extra, null, 2) : \"\";\n }\n\n /** @internal Parse and merge extra config JSON back into the field. */\n protected onExtraConfigChange(\n field: MutableFieldDefinition,\n event: Event,\n ): void {\n const raw = (event.target as HTMLTextAreaElement).value.trim();\n const schemaKeys = new Set(\n getConfigSchema(field.component()).map((p) => p.key),\n );\n\n // Keep all schema-managed keys, replace extra keys\n const managed: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(field.config())) {\n if (schemaKeys.has(k)) managed[k] = v;\n }\n\n if (!raw) {\n field.config.set(managed);\n this.configError.set(\"\");\n return;\n }\n\n try {\n const parsed = JSON.parse(raw);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed)\n ) {\n field.config.set({ ...managed, ...parsed });\n this.configError.set(\"\");\n } else {\n this.configError.set(\"Config must be a JSON object.\");\n }\n } catch {\n this.configError.set(\"Invalid JSON.\");\n }\n }\n}\n","@if (engine().selection(); as sel) {\n @switch (sel.kind) {\n @case (\"form\") {\n <h3 class=\"heading\">Form Properties</h3>\n <div class=\"section\">\n <div class=\"label\">\n ID\n <ui-input\n [value]=\"engine().formId()\"\n (valueChange)=\"engine().formId.set($event)\"\n ariaLabel=\"Form ID\"\n />\n </div>\n\n <div class=\"label\">\n Title\n <ui-input\n [value]=\"engine().formTitle()\"\n (valueChange)=\"engine().formTitle.set($event)\"\n ariaLabel=\"Form title\"\n />\n </div>\n\n <div class=\"label\">\n Description\n <ui-input\n [multiline]=\"true\"\n [rows]=\"2\"\n [value]=\"engine().formDescription()\"\n (valueChange)=\"engine().formDescription.set($event)\"\n ariaLabel=\"Form description\"\n />\n </div>\n </div>\n }\n\n @case (\"group\") {\n @if (engine().selectedGroup(); as group) {\n <h3 class=\"heading\">Group Properties</h3>\n <div class=\"section\">\n <div class=\"label\">\n ID\n <ui-input\n [value]=\"group.id()\"\n (valueChange)=\"group.id.set($event)\"\n ariaLabel=\"Group ID\"\n />\n </div>\n\n <div class=\"label\">\n Title\n <ui-input\n [value]=\"group.title()\"\n (valueChange)=\"group.title.set($event)\"\n ariaLabel=\"Group title\"\n />\n </div>\n\n <div class=\"label\">\n Description\n <ui-input\n [multiline]=\"true\"\n [rows]=\"2\"\n [value]=\"group.description()\"\n (valueChange)=\"group.description.set($event)\"\n ariaLabel=\"Group description\"\n />\n </div>\n </div>\n }\n }\n\n @case (\"field\") {\n @if (engine().selectedField(); as field) {\n <h3 class=\"heading\">Field Properties</h3>\n <div class=\"section\">\n <div class=\"label\">\n ID\n <ui-input\n [value]=\"field.id()\"\n (valueChange)=\"field.id.set($event)\"\n ariaLabel=\"Field ID\"\n />\n </div>\n\n @if (!isFieldFlair(field)) {\n <div class=\"label\">\n Title\n <ui-input\n [value]=\"field.title()\"\n (valueChange)=\"field.title.set($event)\"\n ariaLabel=\"Field title\"\n />\n </div>\n\n <div class=\"label\">\n Description\n <ui-input\n [multiline]=\"true\"\n [rows]=\"2\"\n [value]=\"field.description()\"\n (valueChange)=\"field.description.set($event)\"\n ariaLabel=\"Field description\"\n />\n </div>\n }\n\n <div class=\"label\">\n Component\n <ui-dropdown-list\n [options]=\"componentOptions\"\n [value]=\"field.component()\"\n (valueChange)=\"field.component.set($event)\"\n ariaLabel=\"Field component type\"\n />\n </div>\n\n @if (!isFieldFlair(field)) {\n <div class=\"label\">\n Default Value\n <ui-input\n [value]=\"'' + (field.defaultValue() ?? '')\"\n (valueChange)=\"field.defaultValue.set($event || null)\"\n ariaLabel=\"Default value\"\n />\n </div>\n }\n </div>\n\n <!-- Options (for select/radio/autocomplete) -->\n @if (!isFieldFlair(field) && showOptions(field)) {\n <h4 class=\"subheading\">Options</h4>\n <div class=\"section\">\n @for (opt of field.options(); track $index; let i = $index) {\n <div class=\"pi-option-row\">\n <ui-input\n [value]=\"opt.label\"\n (valueChange)=\"updateOption(field, i, 'label', $event)\"\n placeholder=\"Label\"\n ariaLabel=\"Option label\"\n />\n <ui-input\n [value]=\"'' + opt.value\"\n (valueChange)=\"updateOption(field, i, 'value', $event)\"\n placeholder=\"Value\"\n ariaLabel=\"Option value\"\n />\n <button\n type=\"button\"\n class=\"icon-btn icon-btn--danger\"\n aria-label=\"Remove option\"\n (click)=\"removeOption(field, i)\"\n >\n <ui-icon [svg]=\"iconX\" [size]=\"12\" aria-hidden=\"true\" />\n </button>\n </div>\n }\n <button\n type=\"button\"\n class=\"add-btn\"\n (click)=\"addOption(field)\"\n >\n + Add option\n </button>\n </div>\n }\n\n <!-- Validation -->\n @if (!isFieldFlair(field)) {\n <h4 class=\"subheading\">Validation</h4>\n <div class=\"section\">\n @for (\n rule of field.validation();\n track $index;\n let i = $index\n ) {\n <div class=\"validation-row\">\n <ui-dropdown-list\n [options]=\"validationTypeOptions\"\n [value]=\"rule.type\"\n (valueChange)=\"\n updateValidationRule(field, i, 'type', $event)\n \"\n ariaLabel=\"Validation rule type\"\n />\n\n @if (ruleHasParam(rule.type)) {\n <ui-input\n [value]=\"ruleParamValue(rule)\"\n (valueChange)=\"\n updateValidationParam(field, i, rule.type, $event)\n \"\n [placeholder]=\"paramPlaceholder(rule.type)\"\n ariaLabel=\"Validation parameter\"\n />\n }\n\n <ui-input\n [value]=\"rule.message ?? ''\"\n (valueChange)=\"\n updateValidationRule(field, i, 'message', $event)\n \"\n placeholder=\"Error message\"\n ariaLabel=\"Validation error message\"\n />\n\n <button\n type=\"button\"\n class=\"icon-btn icon-btn--danger\"\n aria-label=\"Remove validation rule\"\n (click)=\"removeValidationRule(field, i)\"\n >\n <ui-icon [svg]=\"iconX\" [size]=\"12\" aria-hidden=\"true\" />\n </button>\n </div>\n }\n <button\n type=\"button\"\n class=\"add-btn\"\n (click)=\"addValidationRule(field)\"\n >\n + Add rule\n </button>\n </div>\n }\n\n <!-- Config -->\n @if (configSchemaFor(field).length > 0) {\n <h4 class=\"subheading\">Config</h4>\n <div class=\"section\">\n @for (prop of configSchemaFor(field); track prop.key) {\n @if (!prop.visibleWhen || prop.visibleWhen(field.config())) {\n @switch (prop.editor) {\n @case (\"text\") {\n <div class=\"label\">\n {{ prop.label }}\n <ui-input\n [placeholder]=\"prop.placeholder ?? ''\"\n [value]=\"'' + (configValue(field, prop.key) ?? '')\"\n (valueChange)=\"\n setConfigValue(field, prop.key, $event)\n \"\n [ariaLabel]=\"prop.label\"\n />\n </div>\n }\n\n @case (\"number\") {\n <div class=\"label\">\n {{ prop.label }}\n <ui-input\n type=\"number\"\n [placeholder]=\"prop.placeholder ?? ''\"\n [value]=\"'' + (configValue(field, prop.key) ?? '')\"\n (valueChange)=\"\n setConfigNumber(field, prop.key, $event)\n \"\n [ariaLabel]=\"prop.label\"\n />\n </div>\n }\n\n @case (\"boolean\") {\n <ui-checkbox\n [checked]=\"!!configValue(field, prop.key)\"\n (checkedChange)=\"\n setConfigBoolean(field, prop.key, $event)\n \"\n [ariaLabel]=\"prop.label\"\n >\n {{ prop.label }}\n </ui-checkbox>\n }\n\n @case (\"select\") {\n <div class=\"label\">\n {{ prop.label }}\n <ui-dropdown-list\n [options]=\"configSelectOptions(prop)\"\n [value]=\"'' + (configValue(field, prop.key) ?? '')\"\n (valueChange)=\"\n setConfigValue(field, prop.key, $event)\n \"\n [ariaLabel]=\"prop.label\"\n />\n </div>\n }\n\n @case (\"richtext\") {\n <div class=\"label\">\n {{ prop.label }}\n <button\n type=\"button\"\n class=\"edit-content-btn\"\n (click)=\"openRichTextEditor(field, prop.key)\"\n >\n <ui-icon [svg]=\"iconEdit\" [size]=\"14\" aria-hidden=\"true\" />\n Edit Content\n </button>\n </div>\n }\n }\n }\n }\n </div>\n }\n\n <!-- Extra config (raw JSON, for properties not in the schema) -->\n @if (hasExtraConfig(field)) {\n <h4 class=\"subheading\">Extra Config (JSON)</h4>\n <div class=\"section\">\n <textarea\n class=\"textarea textarea--mono\"\n rows=\"3\"\n aria-label=\"Extra configuration JSON\"\n aria-describedby=\"pi-config-error\"\n [attr.aria-invalid]=\"configError() ? 'true' : null\"\n [value]=\"extraConfigJSON(field)\"\n (change)=\"onExtraConfigChange(field, $event)\"\n ></textarea>\n @if (configError()) {\n <p class=\"error\" id=\"pi-config-error\" role=\"alert\">\n {{ configError() }}\n </p>\n }\n </div>\n }\n }\n }\n }\n} @else {\n <div class=\"empty\">\n <p>Select a field, group, or form header to edit its properties.</p>\n </div>\n}\n","// ── UIFormDesigner ──────────────────────────────────────────────────\n\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n} from \"@angular/core\";\n\nimport { JsonPipe } from \"@angular/common\";\n\nimport { UIIcon, UIIcons } from \"@theredhead/lucid-kit\";\n\nimport type { FormSchema, FormValues } from \"../../types/form-schema.types\";\nimport { FormEngine } from \"../../engine/form-engine\";\nimport { UIForm } from \"../form.component\";\nimport { FormDesignerEngine } from \"./designer-engine\";\nimport { UIFieldPalette } from \"./field-palette.component\";\nimport { UIDesignerCanvas } from \"./designer-canvas.component\";\nimport { UIPropertyInspector } from \"./property-inspector.component\";\nimport { UISurface } from '@theredhead/lucid-foundation';\n\n/**\n * Full-featured form designer that lets users visually build\n * a {@link FormSchema} via a palette + canvas + inspector layout.\n *\n * Includes a live preview panel that renders the designed form\n * using {@link UIForm} and {@link FormEngine}.\n *\n * @example\n * ```html\n * <ui-form-designer\n * [schema]=\"existingSchema\"\n * (schemaChange)=\"onSave($event)\"\n * />\n * ```\n */\n@Component({\n selector: \"ui-form-designer\",\n standalone: true,\n imports: [\n JsonPipe,\n UIIcon,\n UIFieldPalette,\n UIDesignerCanvas,\n UIPropertyInspector,\n UIForm,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [{ directive: UISurface, inputs: ['surfaceType'] }],\n host: { class: \"ui-form-designer\" },\n templateUrl: \"./form-designer.component.html\",\n styleUrl: \"./form-designer.component.scss\",\n})\nexport class UIFormDesigner {\n /**\n * Optional initial schema to load into the designer.\n * When set, the designer engine imports it on init.\n */\n public readonly schema = input<FormSchema | null>(null);\n\n /** Emitted when the user clicks \"Export\" — always emits the raw schema. */\n public readonly schemaChange = output<FormSchema>();\n\n /** @internal Icon SVG for the copy button. */\n protected readonly copyIcon = UIIcons.Lucide.Text.Copy;\n\n /** @internal Active tab: design, preview, or json. */\n protected readonly activeTab = signal<\"design\" | \"preview\" | \"json\">(\n \"design\",\n );\n\n /** @internal The designer engine instance. */\n protected readonly designerEngine = new FormDesignerEngine();\n\n /**\n * @internal Preview engine — rebuilt whenever the schema changes.\n * Returns null if the schema has no groups/fields.\n */\n protected readonly previewEngine = computed(() => {\n const schema = this.designerEngine.schema();\n const hasFields = schema.groups.some((g) => g.fields.length > 0);\n if (!hasFields) return null;\n return new FormEngine(schema);\n });\n\n /** @internal Live output from the preview engine. */\n protected readonly previewOutput = computed(() => {\n const eng = this.previewEngine();\n return eng ? eng.output()() : null;\n });\n\n /** @internal The group uid to add a field to when palette is clicked. */\n private lastGroupUid: string | null = null;\n\n public constructor() {\n // Load initial schema when the input is set\n effect(() => {\n const s = this.schema();\n if (s) {\n this.designerEngine.loadSchema(s);\n }\n });\n }\n\n /** @internal Handle palette field click — add to first or last-used group. */\n protected onFieldRequested(componentKey: string): void {\n let groups = this.designerEngine.groups();\n\n // If there are no groups, create one first\n if (groups.length === 0) {\n this.lastGroupUid = this.designerEngine.addGroup();\n groups = this.designerEngine.groups();\n }\n\n // Find the target group\n const targetUid =\n this.lastGroupUid && groups.find((g) => g.uid === this.lastGroupUid)\n ? this.lastGroupUid\n : (groups[groups.length - 1]?.uid ?? this.designerEngine.addGroup());\n\n this.designerEngine.addField(targetUid, componentKey);\n this.lastGroupUid = targetUid;\n }\n\n /** @internal Handle \"Add field\" click within a specific group. */\n protected onAddFieldToGroup(groupUid: string): void {\n // Default to text field — user can change in inspector\n this.designerEngine.addField(groupUid, \"text\");\n this.lastGroupUid = groupUid;\n }\n\n /** @internal Copy the current JSON schema to the clipboard. */\n protected onCopyJson(): void {\n const json = JSON.stringify(this.designerEngine.schema(), null, 2);\n navigator.clipboard.writeText(json);\n }\n\n /** @internal Show submitted values in a native dialog. */\n protected onPreviewSubmit(values: FormValues): void {\n const dialog = document.createElement(\"dialog\");\n dialog.style.cssText =\n \"border:none;border-radius:12px;padding:24px;max-width:min(90vw,560px);\" +\n \"max-height:85vh;display:flex;flex-direction:column;background:var(--ui-surface,#fff);\" +\n \"color:var(--ui-text,#1d232b);box-shadow:0 8px 32px rgba(0,0,0,0.25);font-family:inherit;\";\n\n const heading = document.createElement(\"h2\");\n heading.textContent = \"Submitted Values\";\n heading.style.cssText =\n \"margin:0 0 16px;font-size:1.125rem;font-weight:600;\";\n\n const pre = document.createElement(\"pre\");\n pre.textContent = JSON.stringify(values, null, 2);\n pre.style.cssText =\n \"margin:0;padding:12px;border-radius:8px;background:rgba(0,0,0,0.06);\" +\n \"font-size:0.8125rem;overflow:auto;flex:1;min-height:200px;white-space:pre-wrap;word-break:break-word;\";\n\n const footer = document.createElement(\"div\");\n footer.style.cssText =\n \"display:flex;justify-content:flex-end;margin-top:16px;\";\n\n const btn = document.createElement(\"button\");\n btn.textContent = \"Close\";\n btn.style.cssText =\n \"appearance:none;border:none;border-radius:8px;padding:8px 20px;\" +\n \"font-size:0.875rem;font-weight:600;cursor:pointer;\" +\n \"background:var(--theredhead-primary,#3584e4);color:var(--theredhead-on-primary,#fff);\";\n btn.addEventListener(\"click\", () => {\n dialog.close();\n dialog.remove();\n });\n\n footer.appendChild(btn);\n dialog.append(heading, pre, footer);\n dialog.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n dialog.remove();\n }\n });\n dialog.addEventListener(\"close\", () => dialog.remove());\n document.body.appendChild(dialog);\n dialog.showModal();\n }\n}\n","<!-- Toolbar -->\n<header class=\"toolbar\">\n <span class=\"toolbar-title\">Form Designer</span>\n\n <div\n class=\"toolbar-actions\"\n role=\"tablist\"\n aria-label=\"Designer views\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n class=\"toolbar-btn\"\n [class.toolbar-btn--active]=\"activeTab() === 'design'\"\n [attr.aria-selected]=\"activeTab() === 'design'\"\n aria-controls=\"fd-tabpanel\"\n (click)=\"activeTab.set('design')\"\n >\n Design\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n class=\"toolbar-btn\"\n [class.toolbar-btn--active]=\"activeTab() === 'preview'\"\n [attr.aria-selected]=\"activeTab() === 'preview'\"\n aria-controls=\"fd-tabpanel\"\n (click)=\"activeTab.set('preview')\"\n >\n Preview\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n class=\"toolbar-btn\"\n [class.toolbar-btn--active]=\"activeTab() === 'json'\"\n [attr.aria-selected]=\"activeTab() === 'json'\"\n aria-controls=\"fd-tabpanel\"\n (click)=\"activeTab.set('json')\"\n >\n JSON\n </button>\n </div>\n</header>\n\n<!-- Content area -->\n<div\n class=\"body\"\n id=\"fd-tabpanel\"\n role=\"tabpanel\"\n [attr.aria-label]=\"activeTab() + ' view'\"\n>\n @switch (activeTab()) {\n @case (\"design\") {\n <ui-field-palette\n class=\"palette\"\n (fieldRequested)=\"onFieldRequested($event)\"\n />\n <ui-designer-canvas\n class=\"canvas\"\n [engine]=\"designerEngine\"\n (addFieldRequest)=\"onAddFieldToGroup($event)\"\n />\n <ui-property-inspector\n class=\"inspector\"\n [engine]=\"designerEngine\"\n />\n }\n\n @case (\"preview\") {\n <div class=\"preview\">\n @if (previewEngine()) {\n <ui-form\n [engine]=\"previewEngine()!\"\n submitLabel=\"Submit (Preview)\"\n (formSubmit)=\"onPreviewSubmit($event)\"\n />\n <div class=\"preview-live\">\n <h4 class=\"preview-live-heading\">\n Live output\n <span\n class=\"preview-live-badge\"\n [class.preview-live-badge--valid]=\"\n previewEngine()!.valid()\n \"\n >\n {{ previewEngine()!.valid() ? \"✓ valid\" : \"✗ invalid\" }}\n </span>\n </h4>\n <pre class=\"preview-live-json\">{{\n previewOutput() | json\n }}</pre>\n </div>\n } @else {\n <p class=\"preview-empty\">\n Add some fields to see the preview.\n </p>\n }\n </div>\n }\n\n @case (\"json\") {\n <div class=\"json\">\n <div class=\"json-header\">\n <button\n type=\"button\"\n class=\"copy-btn\"\n aria-label=\"Copy JSON to clipboard\"\n (click)=\"onCopyJson()\"\n >\n <ui-icon [svg]=\"copyIcon\" [size]=\"14\" />\n </button>\n </div>\n <pre class=\"json-pre\">{{ designerEngine.schema() | json }}</pre>\n </div>\n }\n }\n</div>\n","// ── Designer barrel ─────────────────────────────────────────────────\n\nexport { FormDesignerEngine } from \"./designer-engine\";\nexport type {\n MutableFieldDefinition,\n MutableGroupDefinition,\n DesignerSelection,\n DesignerSelectionKind,\n} from \"./designer-engine\";\nexport {\n UIFieldPalette,\n type PaletteFieldType,\n} from \"./field-palette.component\";\nexport { UIDesignerCanvas } from \"./designer-canvas.component\";\nexport { UIPropertyInspector } from \"./property-inspector.component\";\nexport { UIFormDesigner } from \"./form-designer.component\";\nexport { type ConfigPropertySchema, getConfigSchema } from \"./config-schema\";\n","/*\n * Public API Surface of @theredhead/lucid-forms\n */\n\n// ── Types ────────────────────────────────────────────────────────────\nexport type {\n ConditionOperator,\n FieldCondition,\n ConditionGroup,\n Condition,\n} from \"./lib/types\";\nexport { isConditionGroup } from \"./lib/types\";\n\nexport type {\n ValidationRuleType,\n ValidationRule,\n ValidationError,\n ValidationResult,\n} from \"./lib/types\";\n\nexport type {\n FormFieldOption,\n FormFieldDefinition,\n FormGroupDefinition,\n FormSchema,\n FormValues,\n FlairComponent,\n} from \"./lib/types\";\nexport { isFlairComponent, FLAIR_COMPONENTS } from \"./lib/types\";\n\n// ── Validation ───────────────────────────────────────────────────────\nexport {\n type ValidatorFn,\n registerCustomValidator,\n validate,\n} from \"./lib/validation\";\n\n// ── Engine ───────────────────────────────────────────────────────────\nexport { evaluateCondition } from \"./lib/engine\";\nexport { FormEngine, type FieldState, type GroupState } from \"./lib/engine\";\n\n// ── Registry ─────────────────────────────────────────────────────────\nexport {\n type ConfigTransform,\n type FormFieldRegistration,\n FORM_FIELD_REGISTRATIONS,\n provideFormFields,\n FormFieldRegistry,\n} from \"./lib/registry\";\nexport { BUILT_IN_FIELDS, provideBuiltInFormFields } from \"./lib/registry\";\nexport { resolveTextAdapter, TEXT_ADAPTER_KEYS } from \"./lib/registry\";\n\n// ── Export strategies ────────────────────────────────────────────────\nexport type { ExportResult, ExportStrategy } from \"./lib/export\";\nexport {\n JsonExportStrategy,\n AngularComponentExportStrategy,\n} from \"./lib/export\";\n\n// ── Components ───────────────────────────────────────────────────────\nexport { UIFormField } from \"./lib/components\";\nexport { UIFormGroup } from \"./lib/components\";\nexport { UIForm } from \"./lib/components\";\nexport { UIFormWizard } from \"./lib/components\";\n// ── Designer ─────────────────────────────────────────────────────\nexport {\n FormDesignerEngine,\n type MutableFieldDefinition,\n type MutableGroupDefinition,\n type DesignerSelection,\n type DesignerSelectionKind,\n UIFieldPalette,\n type PaletteFieldType,\n UIDesignerCanvas,\n UIPropertyInspector,\n UIFormDesigner,\n} from \"./lib/components\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|