{"version":3,"sources":["../src/types/ICondition.ts","../src/types/IRulesEngineAction.ts","../src/types/TypedFieldConfig.ts","../src/types/IFormTemplate.ts","../src/helpers/LocaleRegistry.ts","../src/strings.ts","../src/providers/RulesEngineProvider.tsx","../src/helpers/ConditionEvaluator.ts","../src/helpers/ValueFunctionRegistry.ts","../src/helpers/ExpressionEngine.ts","../src/helpers/RuleEngine.ts","../src/reducers/RulesEngineReducer.ts","../src/providers/InjectedFieldProvider.tsx","../src/helpers/ValidationRegistry.ts","../src/helpers/FormosaicHelper.ts","../src/helpers/FieldHelper.ts","../src/helpers/DependencyGraphValidator.ts","../src/helpers/ConfigValidator.ts","../src/components/WizardForm.tsx","../src/helpers/WizardHelper.ts","../src/components/FieldArray.tsx","../src/components/Formosaic.tsx","../src/templates/TemplateRegistry.ts","../src/templates/LookupRegistry.ts","../src/templates/ExpressionInterpolator.ts","../src/templates/TemplateResolver.ts","../src/hooks/useFormAnalytics.ts","../src/components/ConfirmInputsModal.tsx","../src/components/RenderField.tsx","../src/components/FieldWrapper.tsx","../src/components/FormosaicFields.tsx","../src/components/FormErrorBoundary.tsx","../src/utils/lazyFieldRegistry.ts","../src/hooks/useDraftPersistence.ts","../src/utils/formStateSerialization.ts","../src/hooks/useBeforeUnload.ts","../src/templates/ConnectionCompiler.ts","../src/templates/ComposedFormBuilder.ts","../src/components/ComposedForm.tsx","../src/components/FormFragment.tsx","../src/components/FormConnection.tsx","../src/components/FormField.tsx"],"sourcesContent":["/**\n * Condition types for the v2 rule engine.\n *\n * Conditions can be field-level comparisons or logical combinations (AND/OR/NOT).\n * Used in IRule.when, IValidationRule.when, and IWizardStepCondition.\n */\n\n/** A condition that compares a single field's value */\nexport interface IFieldCondition {\n  /** The field name to evaluate */\n  field: string;\n  /** Comparison operator */\n  operator:\n    | \"equals\"\n    | \"notEquals\"\n    | \"greaterThan\"\n    | \"lessThan\"\n    | \"greaterThanOrEqual\"\n    | \"lessThanOrEqual\"\n    | \"contains\"\n    | \"notContains\"\n    | \"startsWith\"\n    | \"endsWith\"\n    | \"in\"\n    | \"notIn\"\n    | \"isEmpty\"\n    | \"isNotEmpty\"\n    | \"matches\"\n    | \"arrayContains\"\n    | \"arrayNotContains\"\n    | \"arrayLengthEquals\"\n    | \"arrayLengthGreaterThan\"\n    | \"arrayLengthLessThan\";\n  /** The value to compare against. Not required for isEmpty/isNotEmpty. */\n  value?: unknown;\n}\n\n/** A logical combination of conditions */\nexport interface ILogicalCondition {\n  /** Logical operator to combine child conditions */\n  operator: \"and\" | \"or\" | \"not\";\n  /** Child conditions to combine */\n  conditions: ICondition[];\n}\n\n/** Union type: either a field comparison or a logical combination */\nexport type ICondition = IFieldCondition | ILogicalCondition;\n\n/** Type guard: checks if a condition is a logical condition (and/or/not) */\nexport function isLogicalCondition(condition: ICondition): condition is ILogicalCondition {\n  const op = condition.operator;\n  return op === \"and\" || op === \"or\" || op === \"not\";\n}\n\n/** Type guard: checks if a condition is a field condition */\nexport function isFieldCondition(condition: ICondition): condition is IFieldCondition {\n  return \"field\" in condition;\n}\n","import { IRuntimeFormState } from \"./IRuntimeFieldState\";\n\n/** Action type keys for the rules engine reducer */\nexport enum RulesEngineActionType {\n  SET = \"RULES_ENGINE_SET\",\n  UPDATE = \"RULES_ENGINE_UPDATE\",\n  CLEAR = \"RULES_ENGINE_CLEAR\",\n  CLEAR_PENDING_SETVALUE = \"RULES_ENGINE_CLEAR_PENDING_SETVALUE\",\n}\n\nexport interface ISetRulesAction {\n  readonly type: RulesEngineActionType.SET;\n  readonly payload: {\n    readonly configName: string;\n    readonly formState: IRuntimeFormState;\n  };\n}\n\nexport interface IUpdateRulesAction {\n  readonly type: RulesEngineActionType.UPDATE;\n  readonly payload: {\n    readonly configName: string;\n    readonly formState: IRuntimeFormState;\n  };\n}\n\nexport interface IClearRulesAction {\n  readonly type: RulesEngineActionType.CLEAR;\n  readonly payload: {\n    readonly configName?: string;\n  };\n}\n\nexport interface IClearPendingSetValueAction {\n  readonly type: RulesEngineActionType.CLEAR_PENDING_SETVALUE;\n  readonly payload: {\n    readonly configName: string;\n    /** Specific field names to clear. If omitted, clears pendingSetValue on every field. */\n    readonly fieldNames?: readonly string[];\n  };\n}\n\nexport type RulesEngineAction =\n  | ISetRulesAction\n  | IUpdateRulesAction\n  | IClearRulesAction\n  | IClearPendingSetValueAction;\n","import { IFieldConfig } from \"./IFieldConfig\";\nimport { ICondition } from \"./ICondition\";\nimport { IFieldEffect } from \"./IFieldEffect\";\n\n/**\n * A field config where rule targets are constrained to known field names.\n * Provides compile-time checking that cross-field rule effects reference valid fields.\n */\nexport type TypedFieldConfig<TFields extends string> = Omit<IFieldConfig, \"rules\"> & {\n  /**\n   * Business rules with type-safe cross-field effect targets.\n   * Field names in `then.fields` and `else.fields` are checked against TFields.\n   */\n  rules?: Array<{\n    id?: string;\n    when: ICondition;\n    then: Omit<IFieldEffect, \"fields\"> & {\n      fields?: Partial<Record<TFields, IFieldEffect>>;\n    };\n    else?: Omit<IFieldEffect, \"fields\"> & {\n      fields?: Partial<Record<TFields, IFieldEffect>>;\n    };\n    priority?: number;\n  }>;\n};\n\n/**\n * Define field configs with type-safe rule references.\n * TypeScript will error if a rule's cross-field effect targets a field name that doesn't exist.\n *\n * At runtime this is a no-op -- it just returns the input. The value is purely at compile time.\n *\n * @example\n * const config = defineFormConfig({\n *   name: { type: \"Textbox\", label: \"Name\" },\n *   status: {\n *     type: \"Dropdown\",\n *     label: \"Status\",\n *     options: [{ value: \"Active\", label: \"Active\" }, { value: \"Inactive\", label: \"Inactive\" }],\n *     rules: [{\n *       when: { field: \"status\", operator: \"equals\", value: \"Active\" },\n *       then: { fields: { name: { required: true } } },  // \"name\" checked at compile time\n *     }],\n *   },\n * });\n */\nexport function defineFormConfig<T extends Record<string, TypedFieldConfig<Extract<keyof T, string>>>>(\n  fields: T\n): Record<string, IFieldConfig> {\n  return fields as unknown as Record<string, IFieldConfig>;\n}\n","import { IFieldConfig } from \"./IFieldConfig\";\nimport { IRule } from \"./IRule\";\nimport { IWizardConfig } from \"./IWizardConfig\";\n\nexport interface ITemplateParamSchema {\n  type: \"string\" | \"number\" | \"boolean\";\n  enum?: unknown[];\n  default?: unknown;\n  required?: boolean;\n}\n\nexport interface ITemplateFieldRef {\n  templateRef: string;\n  templateParams?: Record<string, unknown>;\n  templateOverrides?: Record<string, Partial<IFieldConfig>>;\n  defaultValues?: Record<string, unknown>;\n}\n\nexport function isTemplateFieldRef(\n  field: IFieldConfig | ITemplateFieldRef\n): field is ITemplateFieldRef {\n  return \"templateRef\" in field && typeof (field as ITemplateFieldRef).templateRef === \"string\";\n}\n\n// TParams is a marker type for registerFormTemplate<T>() call-site inference only.\nexport interface IFormTemplate<TParams extends Record<string, unknown> = Record<string, unknown>> {\n  params?: Record<string, ITemplateParamSchema>;\n  fields: Record<string, IFieldConfig | ITemplateFieldRef>;\n  fieldOrder?: string[];\n  rules?: IRule[];\n  wizard?: IWizardConfig;\n  ports?: Record<string, string[]>;\n}\n","import { ICoreLocaleStrings } from \"../types/ILocaleStrings\";\n\n/** Default English strings */\nconst defaultStrings: ICoreLocaleStrings = {\n  // Form status\n  autoSavePending: \"AutoSave Pending, please check for errors...\",\n  savePending: \"Save Pending, please check for errors...\",\n  saving: \"Saving...\",\n  saveError: \"Error saving form\",\n\n  // Actions\n  save: \"Save\",\n  cancel: \"Cancel\",\n  create: \"Create\",\n  update: \"Update\",\n  confirm: \"Confirm\",\n  add: \"Add\",\n  edit: \"Edit\",\n  deleteLabel: \"Delete\",\n  remove: \"Remove\",\n  close: \"Close\",\n  clear: \"Clear\",\n\n  // Field labels\n  required: \"Required\",\n  remaining: \"remaining\",\n  na: \"N/A\",\n  unknown: \"Unknown\",\n  loading: \"Loading\",\n  noResultsFound: \"No results found\",\n  clickToClear: \"Click here to Clear\",\n\n  // Document links\n  linkTitleLabel: \"Link Title\",\n  linkUrlLabel: \"Link URL\",\n  urlRequired: \"Invalid Url (http/https required)\",\n\n  // Expand/collapse\n  seeLess: \"See less\",\n  expand: \"Expand\",\n\n  // Rich text editor\n  openExpandedTextEditor: \"Open Expanded Editor\",\n  closeExpandedTextEditor: \"Close Expanded Editor\",\n\n  // Unsaved changes\n  unsavedChanges: \"Unsaved Changes\",\n  returnToEditing: \"Return to Editing\",\n  dontSave: \"Don't save\",\n  overview: \"Overview\",\n  by: \"by\",\n\n  // Accessibility\n  filterFields: \"Filter form fields\",\n  saved: \"Saved successfully\",\n  saveFailed: \"Save failed\",\n  validating: \"Validating...\",\n  stepOf: (current: number, total: number) => `Step ${current} of ${total}`,\n  formWizard: \"Form wizard\",\n  itemOfTotal: (index: number, total: number, label: string) => `${label} item ${index} of ${total}`,\n\n  // Dynamic functions\n  saveChangesTo: (title: string) => `Do you want to save your changes to ${title}?`,\n\n  // Validation error messages\n  invalidUrl: \"Invalid URL\",\n  invalidEmail: \"Invalid email address\",\n  invalidPhoneNumber: \"Invalid phone number\",\n  invalidYear: \"Invalid year\",\n  contentExceedsMaxSize: (maxKb: number) => `Content exceeds maximum size of ${maxKb}KB`,\n  noSpecialCharacters: \"Special characters are not allowed\",\n  invalidCurrencyFormat: \"Invalid currency format\",\n  duplicateValue: (value: string) => `Duplicate value: ${value}`,\n  mustBeAtLeastChars: (min: number) => `Must be at least ${min} characters`,\n  mustBeAtMostChars: (max: number) => `Must be at most ${max} characters`,\n  mustBeANumber: \"Must be a number\",\n  mustBeBetween: (min: number, max: number) => `Must be between ${min} and ${max}`,\n  thisFieldIsRequired: \"This field is required\",\n\n  // Reliability / save status\n  saveRetrying: \"Retrying save...\",\n  saveTimeout: \"Save timed out\",\n\n  // Draft persistence\n  draftRecovered: \"Draft recovered\",\n  discardDraft: \"Discard draft\",\n  unsavedChangesWarning: \"You have unsaved changes. Are you sure you want to leave?\",\n};\n\n/**\n * SSR / multi-tenant contract (audit P1-21):\n *\n * `currentLocale` is a module-level singleton. It is intended to be set\n * ONCE at app boot (or once per deploy) to the locale of the whole app.\n * It is NOT a per-request locale: in an SSR / multi-tenant environment\n * where different requests need different locales, calling\n * `registerLocale()` from a per-request code path will cause cross-request\n * pollution (the last caller wins for all concurrent/subsequent requests\n * on the same Node process).\n *\n * For per-request i18n, wrap your own translation layer at the framework\n * level (e.g. React Context provided by a route/layout) and pass\n * translated strings into Formosaic via props / render props. This\n * registry is an English-default fallback, not a per-request\n * translation engine.\n */\nlet currentLocale: ICoreLocaleStrings = { ...defaultStrings };\n\n/**\n * Register a partial or full locale override. Unspecified keys fall back to English defaults.\n * Can be called multiple times; each call merges into the current locale.\n */\nexport function registerLocale(partial: Partial<ICoreLocaleStrings>): void {\n  currentLocale = { ...currentLocale, ...partial };\n}\n\n/**\n * Get a locale string by key. Returns the registered locale value or the English default.\n */\nexport function getLocaleString<K extends keyof ICoreLocaleStrings>(key: K): ICoreLocaleStrings[K] {\n  return currentLocale[key];\n}\n\n/**\n * Reset the locale to English defaults. Useful for testing.\n */\nexport function resetLocale(): void {\n  currentLocale = { ...defaultStrings };\n}\n\n/**\n * Get the full current locale object. Useful for debugging or bulk operations.\n */\nexport function getCurrentLocale(): ICoreLocaleStrings {\n  return { ...currentLocale };\n}\n","import { getLocaleString } from \"./helpers/LocaleRegistry\";\n\n/**\n * User-facing string literals (v2).\n * All properties resolve through the locale registry.\n */\nexport const FormStrings = {\n  get autoSavePending() { return getLocaleString(\"autoSavePending\"); },\n  get savePending() { return getLocaleString(\"savePending\"); },\n  get remaining() { return getLocaleString(\"remaining\"); },\n  get saving() { return getLocaleString(\"saving\"); },\n  get seeLess() { return getLocaleString(\"seeLess\"); },\n  get expand() { return getLocaleString(\"expand\"); },\n  get required() { return getLocaleString(\"required\"); },\n  get save() { return getLocaleString(\"save\"); },\n  get cancel() { return getLocaleString(\"cancel\"); },\n  get create() { return getLocaleString(\"create\"); },\n  get update() { return getLocaleString(\"update\"); },\n  get na() { return getLocaleString(\"na\"); },\n  get saveError() { return getLocaleString(\"saveError\"); },\n  get confirm() { return getLocaleString(\"confirm\"); },\n  get linkTitleLabel() { return getLocaleString(\"linkTitleLabel\"); },\n  get linkUrlLabel() { return getLocaleString(\"linkUrlLabel\"); },\n  get add() { return getLocaleString(\"add\"); },\n  get edit() { return getLocaleString(\"edit\"); },\n  get deleteLabel() { return getLocaleString(\"deleteLabel\"); },\n  get remove() { return getLocaleString(\"remove\"); },\n  get unknown() { return getLocaleString(\"unknown\"); },\n  get close() { return getLocaleString(\"close\"); },\n  get loading() { return getLocaleString(\"loading\"); },\n  get noResultsFound() { return getLocaleString(\"noResultsFound\"); },\n  get clickToClear() { return getLocaleString(\"clickToClear\"); },\n  get clear() { return getLocaleString(\"clear\"); },\n  get urlRequired() { return getLocaleString(\"urlRequired\"); },\n  get openExpandedTextEditor() { return getLocaleString(\"openExpandedTextEditor\"); },\n  get closeExpandedTextEditor() { return getLocaleString(\"closeExpandedTextEditor\"); },\n  get unsavedChanges() { return getLocaleString(\"unsavedChanges\"); },\n  get returnToEditing() { return getLocaleString(\"returnToEditing\"); },\n  get dontSave() { return getLocaleString(\"dontSave\"); },\n  get overview() { return getLocaleString(\"overview\"); },\n  get by() { return getLocaleString(\"by\"); },\n  get filterFields() { return getLocaleString(\"filterFields\"); },\n  get saved() { return getLocaleString(\"saved\"); },\n  get saveFailed() { return getLocaleString(\"saveFailed\"); },\n  get validating() { return getLocaleString(\"validating\"); },\n  get stepOf() { return getLocaleString(\"stepOf\"); },\n  get formWizard() { return getLocaleString(\"formWizard\"); },\n  get itemOfTotal() { return getLocaleString(\"itemOfTotal\"); },\n  get saveChangesTo() { return getLocaleString(\"saveChangesTo\"); },\n  get draftRecovered() { return getLocaleString(\"draftRecovered\"); },\n  get discardDraft() { return getLocaleString(\"discardDraft\"); },\n  get unsavedChangesWarning() { return getLocaleString(\"unsavedChangesWarning\"); },\n  get saveRetrying() { return getLocaleString(\"saveRetrying\"); },\n  get saveTimeout() { return getLocaleString(\"saveTimeout\"); },\n};\n\n","import { IEntityData } from \"../utils\";\nimport React from \"react\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { RulesEngineActionType } from \"../types/IRulesEngineAction\";\nimport { evaluateAllRules, evaluateAffectedFields } from \"../helpers/RuleEngine\";\nimport rulesEngineReducer, { defaultRulesEngineState } from \"../reducers/RulesEngineReducer\";\nimport { IRulesEngineProvider } from \"./IRulesEngineProvider\";\n\nconst RulesEngineContext: React.Context<IRulesEngineProvider> = React.createContext(\n  undefined as unknown as IRulesEngineProvider\n);\n\nexport function UseRulesEngineContext() {\n  const context = React.useContext(RulesEngineContext);\n  if (context === undefined) {\n    throw new Error(\n      \"UseRulesEngineContext() was called outside of <RulesEngineProvider>. \" +\n      \"Required hierarchy: <RulesEngineProvider> > <InjectedFieldProvider> > <Formosaic>\"\n    );\n  }\n  return context;\n}\n\n\nexport const RulesEngineProvider: React.FC<React.PropsWithChildren<{}>> = (\n  props: React.PropsWithChildren<{}>\n): React.JSX.Element => {\n  const [rulesState, dispatch] = React.useReducer(rulesEngineReducer, defaultRulesEngineState);\n\n  const rulesStateRef = React.useRef(rulesState);\n  React.useEffect(() => { rulesStateRef.current = rulesState; }, [rulesState]);\n\n  const initFormState = React.useCallback((\n    configName: string,\n    defaultValues: IEntityData,\n    fields: Record<string, IFieldConfig>,\n    areAllFieldsReadonly?: boolean\n  ): IRuntimeFormState => {\n    const formState = evaluateAllRules(fields, defaultValues, areAllFieldsReadonly);\n\n    dispatch({\n      type: RulesEngineActionType.SET,\n      payload: { configName, formState },\n    });\n\n    return formState;\n  }, []);\n\n  const clearFormState = React.useCallback((configName?: string) => {\n    dispatch({\n      type: RulesEngineActionType.CLEAR,\n      payload: { configName },\n    });\n  }, []);\n\n  const clearPendingSetValue = React.useCallback((\n    configName: string,\n    fieldNames?: readonly string[]\n  ) => {\n    dispatch({\n      type: RulesEngineActionType.CLEAR_PENDING_SETVALUE,\n      payload: { configName, fieldNames },\n    });\n  }, []);\n\n  const processFieldChange = React.useCallback((\n    entityData: IEntityData,\n    configName: string,\n    fieldName: string,\n    fields: Record<string, IFieldConfig>\n  ) => {\n    const currentState = rulesStateRef.current.configs[configName];\n    if (!currentState) return;\n\n    // Re-evaluate when this field affects other fields (forward deps)\n    // or when it has its own rules that may produce cross-field effects\n    const fieldState = currentState.fieldStates[fieldName];\n    const hasDependents = (fieldState?.dependentFields?.length ?? 0) > 0;\n    const hasRules = !!(fields[fieldName]?.rules?.length);\n\n    if (!hasDependents && !hasRules) return;\n\n    const updatedState = evaluateAffectedFields(fieldName, fields, entityData, currentState);\n\n    dispatch({\n      type: RulesEngineActionType.UPDATE,\n      payload: { configName, formState: updatedState },\n    });\n  }, []);\n\n  const providerValue: IRulesEngineProvider = React.useMemo(() => ({\n    rulesState,\n    initFormState,\n    processFieldChange,\n    clearFormState,\n    clearPendingSetValue,\n  }), [rulesState, initFormState, processFieldChange, clearFormState, clearPendingSetValue]);\n\n  return (\n    <RulesEngineContext.Provider value={providerValue}>\n      {props.children}\n    </RulesEngineContext.Provider>\n  );\n};\n\n","import { ICondition, IFieldCondition, ILogicalCondition, isLogicalCondition } from \"../types/ICondition\";\nimport { IEntityData } from \"../utils\";\n\n/**\n * Evaluates a condition tree against the current form values.\n *\n * Supports all 15 field operators and AND/OR/NOT logical operators.\n */\nexport function evaluateCondition(condition: ICondition, values: IEntityData): boolean {\n  if (isLogicalCondition(condition)) {\n    return evaluateLogicalCondition(condition, values);\n  }\n  return evaluateFieldCondition(condition as IFieldCondition, values);\n}\n\nfunction evaluateLogicalCondition(condition: ILogicalCondition, values: IEntityData): boolean {\n  // Per audit P1-9: default missing `conditions` to an empty array and return\n  // mathematically-correct defaults (and:true, or:false, not:true) so a\n  // user authoring error surfaces as a no-op rule rather than a runtime crash.\n  const conditions = Array.isArray(condition.conditions) ? condition.conditions : [];\n  switch (condition.operator) {\n    case \"and\":\n      return conditions.every(c => evaluateCondition(c, values));\n    case \"or\":\n      return conditions.some(c => evaluateCondition(c, values));\n    case \"not\":\n      // NOT applies to the first (and typically only) child condition.\n      // Empty `conditions` => logical not of nothing => true.\n      return conditions.length > 0\n        ? !evaluateCondition(conditions[0], values)\n        : true;\n    default:\n      return false;\n  }\n}\n\nfunction evaluateFieldCondition(condition: IFieldCondition, values: IEntityData): boolean {\n  const fieldValue = getNestedValue(values, condition.field);\n\n  switch (condition.operator) {\n    case \"equals\":\n      return looseEquals(fieldValue, condition.value);\n    case \"notEquals\":\n      return !looseEquals(fieldValue, condition.value);\n    case \"greaterThan\":\n      return toNumber(fieldValue) > toNumber(condition.value);\n    case \"lessThan\":\n      return toNumber(fieldValue) < toNumber(condition.value);\n    case \"greaterThanOrEqual\":\n      return toNumber(fieldValue) >= toNumber(condition.value);\n    case \"lessThanOrEqual\":\n      return toNumber(fieldValue) <= toNumber(condition.value);\n    case \"contains\":\n      return toString(fieldValue).includes(toString(condition.value));\n    case \"notContains\":\n      return !toString(fieldValue).includes(toString(condition.value));\n    case \"startsWith\":\n      return toString(fieldValue).startsWith(toString(condition.value));\n    case \"endsWith\":\n      return toString(fieldValue).endsWith(toString(condition.value));\n    case \"in\":\n      return Array.isArray(condition.value)\n        ? condition.value.some(v => looseEquals(fieldValue, v))\n        : false;\n    case \"notIn\":\n      return Array.isArray(condition.value)\n        ? !condition.value.some(v => looseEquals(fieldValue, v))\n        : false;\n    case \"isEmpty\":\n      return isValueEmpty(fieldValue);\n    case \"isNotEmpty\":\n      return !isValueEmpty(fieldValue);\n    case \"matches\":\n      // Per audit P0-10: cap regex source length and input length before\n      // executing to mitigate ReDoS via adversarial configs.\n      try {\n        const pattern = toString(condition.value);\n        const input = toString(fieldValue);\n        if (pattern.length > 256) {\n          if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n            // eslint-disable-next-line no-console\n            console.warn(`[formosaic] 'matches' regex source exceeds 256 chars; returning false to prevent ReDoS.`);\n          }\n          return false;\n        }\n        if (input.length > 10_000) {\n          if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n            // eslint-disable-next-line no-console\n            console.warn(`[formosaic] 'matches' input exceeds 10000 chars; returning false to prevent ReDoS.`);\n          }\n          return false;\n        }\n        return new RegExp(pattern).test(input);\n      } catch {\n        return false;\n      }\n    case \"arrayContains\":\n      return Array.isArray(fieldValue)\n        ? fieldValue.some(v => looseEquals(v, condition.value))\n        : false;\n    case \"arrayNotContains\":\n      return Array.isArray(fieldValue)\n        ? !fieldValue.some(v => looseEquals(v, condition.value))\n        : true;\n    case \"arrayLengthEquals\":\n      return Array.isArray(fieldValue)\n        ? fieldValue.length === toNumber(condition.value)\n        : false;\n    case \"arrayLengthGreaterThan\":\n      return Array.isArray(fieldValue)\n        ? fieldValue.length > toNumber(condition.value)\n        : false;\n    case \"arrayLengthLessThan\":\n      return Array.isArray(fieldValue)\n        ? fieldValue.length < toNumber(condition.value)\n        : false;\n    default:\n      return false;\n  }\n}\n\n/**\n * Extracts all field names referenced in a condition tree.\n */\nexport function extractConditionDependencies(condition: ICondition): string[] {\n  const deps = new Set<string>();\n  collectDependencies(condition, deps);\n  return [...deps];\n}\n\nfunction collectDependencies(condition: ICondition, deps: Set<string>): void {\n  if (isLogicalCondition(condition)) {\n    const conditions = Array.isArray(condition.conditions) ? condition.conditions : [];\n    conditions.forEach(c => collectDependencies(c, deps));\n  } else {\n    const fieldRef = (condition as IFieldCondition).field;\n    if (fieldRef) deps.add(fieldRef);\n  }\n}\n\n// --- Utility functions ---\n\nfunction getNestedValue(obj: IEntityData, path: string): unknown {\n  const parts = path.split(\".\");\n  let current: unknown = obj;\n  for (const part of parts) {\n    if (current === null || current === undefined) return undefined;\n    // Per audit P0-10: refuse to traverse prototype-pollution keys.\n    if (part === \"__proto__\" || part === \"constructor\" || part === \"prototype\") return undefined;\n    current = (current as Record<string, unknown>)[part];\n  }\n  return current;\n}\n\nfunction looseEquals(a: unknown, b: unknown): boolean {\n  if (a === b) return true;\n  if (a == null && b == null) return true;\n  if (a == null || b == null) return false;\n  return String(a) === String(b);\n}\n\nfunction toNumber(value: unknown): number {\n  if (typeof value === \"number\") return value;\n  if (typeof value === \"string\") {\n    const n = Number(value);\n    return isNaN(n) ? 0 : n;\n  }\n  if (value instanceof Date) return value.getTime();\n  return 0;\n}\n\nfunction toString(value: unknown): string {\n  if (value === null || value === undefined) return \"\";\n  if (typeof value === \"string\") return value;\n  return String(value);\n}\n\nfunction isValueEmpty(value: unknown): boolean {\n  if (value === null || value === undefined) return true;\n  if (typeof value === \"string\") return value.trim() === \"\";\n  if (Array.isArray(value)) return value.length === 0;\n  if (typeof value === \"object\") return Object.keys(value).length === 0;\n  return false;\n}\n","import { IEntityData, SubEntityType } from \"../utils\";\n\n/**\n * Value function signature (v2).\n * Used in computed value expressions via $fn.name() syntax.\n */\nexport type ValueFunction = (context: IValueFunctionContext) => SubEntityType;\n\nexport interface IValueFunctionContext {\n  fieldName: string;\n  fieldValue?: SubEntityType;\n  values: IEntityData;\n  parentEntity?: IEntityData;\n  currentUserId?: string;\n}\n\n// --- Built-in value functions ---\n\nconst defaultValueFunctions: Record<string, ValueFunction> = {\n  setDate: () => new Date(),\n  setDateIfNull: ({ fieldValue }) => fieldValue ? fieldValue : new Date(),\n  setLoggedInUser: ({ currentUserId }) => currentUserId ? { id: currentUserId } : undefined,\n};\n\n/**\n * SSR / multi-tenant contract (audit P1-21):\n *\n * Plugin-style registry of named value functions referenced via `$fn.name()`\n * in computed-value expressions. Register ONCE at app boot. Value functions\n * receive `values`, `parentEntity`, `currentUserId` per-call, so per-request\n * state should be plumbed through those arguments — never captured in a\n * module-level closure, which would leak across tenants/requests.\n */\nlet valueFunctionRegistry: Record<string, ValueFunction> = { ...defaultValueFunctions };\n\n/** Register custom value functions (merge into registry) */\nexport function registerValueFunctions(custom: Record<string, ValueFunction>): void {\n  valueFunctionRegistry = { ...valueFunctionRegistry, ...custom };\n}\n\n/** Get a value function by name */\nexport function getValueFunction(name: string): ValueFunction | undefined {\n  return valueFunctionRegistry[name];\n}\n\n/** Execute a named value function */\nexport function executeValueFunction(\n  fieldName: string,\n  functionName: string,\n  values: IEntityData,\n  fieldValue?: SubEntityType,\n  parentEntity?: IEntityData,\n  currentUserId?: string\n): SubEntityType {\n  const fn = valueFunctionRegistry[functionName];\n  if (fn) {\n    return fn({ fieldName, fieldValue, values, parentEntity, currentUserId });\n  }\n  return undefined;\n}\n\n/** Reset registry to defaults (for testing) */\nexport function resetValueFunctionRegistry(): void {\n  valueFunctionRegistry = { ...defaultValueFunctions };\n}\n","import { IEntityData } from \"../utils\";\nimport { getValueFunction } from \"./ValueFunctionRegistry\";\nimport { Parser } from \"expr-eval\";\n\n/**\n * CSP-SAFE: This module uses expr-eval (https://www.npmjs.com/package/expr-eval) instead of\n * `new Function()` / `eval()`, making expression evaluation safe in environments with strict\n * Content-Security-Policies (CSP) that forbid `script-src 'unsafe-eval'`.\n *\n * Evaluates an expression string against form values.\n *\n * Supports:\n * - $values.fieldName for field references (including nested paths)\n * - $fn.name() for value function calls\n * - $parent.fieldName for parent entity references\n * - $root.fieldName alias for $values.fieldName\n * - Math functions (expr-eval builtins): round(), floor(), ceil(), abs(), min(), max(), sqrt(), pow(), log()\n * - Arithmetic: +, -, *, /\n * - Comparison: ==, !=, >, <, >=, <=\n * - Logical: and, or, not\n * - String concatenation via +\n *\n * @example\n *   \"$values.quantity * $values.unitPrice\"\n *   \"$fn.setDate()\"\n *   \"$parent.category\"\n *   \"round($values.total * 100) / 100\"\n */\n\n// Private CSP-safe parser singleton.\n// expr-eval 2.x exposes binaryOps/consts as plain objects on each Parser\n// instance. We create our own fresh instance in a factory here rather than\n// mutating the library's default — see audit P1-20. This keeps overrides\n// isolated to our own internal parser.\nfunction createInternalParser(): Parser {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const parser: Parser = new Parser() as any;\n  // Override + to handle string concatenation (string + number, number + string).\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const origAdd = (parser as any).binaryOps[\"+\"];\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  (parser as any).binaryOps[\"+\"] = (a: unknown, b: unknown): unknown => {\n    if (typeof a === \"string\" || typeof b === \"string\") return String(a) + String(b);\n    return origAdd(a as number, b as number);\n  };\n  // Register NaN as a named constant so substituted \"NaN\" tokens evaluate correctly.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  (parser as any).consts[\"NaN\"] = NaN;\n  return parser;\n}\n\nconst _parser: Parser = createInternalParser();\n\n\nexport function evaluateExpression(\n  expression: string,\n  values: IEntityData,\n  fieldName?: string,\n  parentEntity?: IEntityData,\n  currentUserId?: string\n): unknown {\n  // Optimisation: if the expression is a single $fn.name() call (nothing else),\n  // execute the function and return its result directly — preserving complex types\n  // such as Date objects that cannot be round-tripped through text substitution.\n  const singleFnMatch = /^\\s*\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)\\s*$/.exec(expression);\n  if (singleFnMatch) {\n    const fn = getValueFunction(singleFnMatch[1]);\n    if (!fn) return undefined;\n    return fn({\n      fieldName: fieldName ?? \"\",\n      fieldValue: fieldName ? values[fieldName] as string : undefined,\n      values,\n      parentEntity,\n      currentUserId,\n    });\n  }\n\n  // Step 1 – resolve $fn.name() calls by executing registered value functions and\n  // substituting their results as literal tokens into the expression string.\n  let resolved = expression.replace(\n    /\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)/g,\n    (_, fnName: string) => {\n      const fn = getValueFunction(fnName);\n      if (fn) {\n        const result = fn({\n          fieldName: fieldName ?? \"\",\n          fieldValue: fieldName ? values[fieldName] as string : undefined,\n          values,\n          parentEntity,\n          currentUserId,\n        });\n        if (result === null || result === undefined) return \"NaN\";\n        if (typeof result === \"string\") return JSON.stringify(result);\n        if (result instanceof Date) return String(result.getTime());\n        return String(result);\n      }\n      // Unknown function: substitute NaN so arithmetic remains well-behaved\n      return \"NaN\";\n    }\n  );\n\n  // Step 2 – substitute $parent.fieldName, $root.fieldName, $values.fieldName with\n  // their literal values inline. null/undefined values are substituted as the token\n  // \"NaN\" so that arithmetic expressions (e.g. qty * price) return NaN rather than\n  // throwing, preserving backward-compatible behaviour.\n\n  const serializeValue = (value: unknown): string => {\n    if (value === null || value === undefined) return \"NaN\";\n    if (typeof value === \"string\") return JSON.stringify(value);\n    if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n    if (value instanceof Date) return String(value.getTime());\n    return String(value);\n  };\n\n  // Replace $parent.fieldName\n  resolved = resolved.replace(\n    /\\$parent\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n    (_, fieldPath: string) => serializeValue(getNestedValue(parentEntity ?? {}, fieldPath))\n  );\n\n  // Replace $root.fieldName (alias for $values)\n  resolved = resolved.replace(\n    /\\$root\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n    (_, fieldPath: string) => serializeValue(getNestedValue(values, fieldPath))\n  );\n\n  // Replace $values.fieldName\n  resolved = resolved.replace(\n    /\\$values\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n    (_, fieldPath: string) => serializeValue(getNestedValue(values, fieldPath))\n  );\n\n  // Step 3 – evaluate with the CSP-safe expr-eval parser\n  try {\n    return _parser.evaluate(resolved, {});\n  } catch {\n    return undefined;\n  }\n}\n\nfunction getNestedValue(obj: IEntityData, path: string): unknown {\n  const parts = path.split(\".\");\n  let current: unknown = obj;\n  for (const part of parts) {\n    if (current === null || current === undefined) return undefined;\n    // Per audit P0-10: refuse to traverse prototype-pollution keys.\n    if (part === \"__proto__\" || part === \"constructor\" || part === \"prototype\") return undefined;\n    current = (current as Record<string, unknown>)[part];\n  }\n  return current;\n}\n\n/**\n * Extracts field names referenced in an expression via $values.fieldName or $root.fieldName.\n */\nexport function extractExpressionDependencies(expression: string): string[] {\n  const deps = new Set<string>();\n  const valuesRegex = /\\$(?:values|root)\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g;\n  let match;\n  while ((match = valuesRegex.exec(expression)) !== null) {\n    deps.add(match[1]);\n  }\n  return [...deps];\n}\n\n/**\n * Extracts value function names referenced via $fn.name() syntax.\n */\nexport function extractFunctionDependencies(expression: string): string[] {\n  const fns = new Set<string>();\n  const fnRegex = /\\$fn\\.([a-zA-Z_][a-zA-Z0-9_]*)\\(\\)/g;\n  let match;\n  while ((match = fnRegex.exec(expression)) !== null) {\n    fns.add(match[1]);\n  }\n  return [...fns];\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IRule } from \"../types/IRule\";\nimport { IFieldEffect } from \"../types/IFieldEffect\";\nimport { IRuntimeFieldState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IEntityData } from \"../utils\";\nimport { evaluateCondition, extractConditionDependencies } from \"./ConditionEvaluator\";\nimport { extractExpressionDependencies } from \"./ExpressionEngine\";\nimport { logEvent } from \"./EventTimeline\";\n\n/**\n * Builds the dependency graph from field configs.\n * Returns adjacency lists: for each field, which other fields depend on it.\n */\nexport function buildDependencyGraph(\n  fields: Record<string, IFieldConfig>\n): Record<string, Set<string>> {\n  const graph: Record<string, Set<string>> = {};\n  const fieldNames = Object.keys(fields);\n\n  for (const name of fieldNames) {\n    graph[name] = new Set();\n  }\n\n  // Resolve a dotted dependency reference to the longest-prefix field that\n  // actually exists in the fields record. This lets rule conditions like\n  // `{ field: \"address.city\" }` register an edge on the `address` field\n  // when only `address` is a top-level key (e.g. an object/template field).\n  // Without this, evaluateAffectedFields would skip the rule on changes to\n  // the ancestor key. See audit finding P0-5.\n  const resolveDepKey = (dep: string): string | undefined => {\n    if (dep in graph) return dep;\n    let idx = dep.lastIndexOf(\".\");\n    while (idx > 0) {\n      const candidate = dep.slice(0, idx);\n      if (candidate in graph) return candidate;\n      idx = dep.lastIndexOf(\".\", idx - 1);\n    }\n    return undefined;\n  };\n\n  for (const [fieldName, config] of Object.entries(fields)) {\n    if (config.rules) {\n      for (const rule of config.rules) {\n        // Fields referenced in the when condition\n        const condDeps = extractConditionDependencies(rule.when);\n        for (const dep of condDeps) {\n          const key = resolveDepKey(dep);\n          if (key) {\n            graph[key].add(fieldName);\n          }\n        }\n\n        // Fields referenced in cross-field effects\n        collectEffectTargets(rule.then, fieldName, graph);\n        if (rule.else) {\n          collectEffectTargets(rule.else, fieldName, graph);\n        }\n      }\n    }\n\n    // Computed value dependencies\n    if (config.computedValue) {\n      const exprDeps = extractExpressionDependencies(config.computedValue);\n      for (const dep of exprDeps) {\n        const key = resolveDepKey(dep);\n        if (key) {\n          graph[key].add(fieldName);\n        }\n      }\n    }\n  }\n\n  return graph;\n}\n\nfunction collectEffectTargets(\n  effect: IFieldEffect,\n  ownerField: string,\n  graph: Record<string, Set<string>>\n): void {\n  if (effect.fields) {\n    for (const targetField of Object.keys(effect.fields)) {\n      // Skip self-references: a field targeting itself via cross-field effect\n      // syntax is handled as a self-effect during evaluation and must not\n      // create a self-loop that would poison the topological sort.\n      if (targetField !== ownerField && targetField in graph) {\n        graph[ownerField]?.add(targetField);\n      }\n    }\n  }\n}\n\n/**\n * Topological sort of field names using Kahn's algorithm.\n * Returns fields in dependency order. Detects cycles.\n */\nexport function topologicalSort(\n  graph: Record<string, Set<string>>\n): { sorted: string[]; hasCycle: boolean; cycleFields: string[] } {\n  const inDegree: Record<string, number> = {};\n  const adjacency: Record<string, string[]> = {};\n  const fields = Object.keys(graph);\n\n  for (const f of fields) {\n    inDegree[f] = 0;\n    adjacency[f] = [...graph[f]];\n  }\n\n  for (const f of fields) {\n    for (const dep of adjacency[f]) {\n      if (dep in inDegree) {\n        inDegree[dep]++;\n      }\n    }\n  }\n\n  const queue: string[] = [];\n  for (const f of fields) {\n    if (inDegree[f] === 0) queue.push(f);\n  }\n\n  const sorted: string[] = [];\n  while (queue.length > 0) {\n    const current = queue.shift()!;\n    sorted.push(current);\n    for (const neighbor of adjacency[current]) {\n      if (neighbor in inDegree) {\n        inDegree[neighbor]--;\n        if (inDegree[neighbor] === 0) queue.push(neighbor);\n      }\n    }\n  }\n\n  const hasCycle = sorted.length < fields.length;\n  const cycleFields = hasCycle ? fields.filter(f => !sorted.includes(f)) : [];\n  return { sorted, hasCycle, cycleFields };\n}\n\n/**\n * Builds the default runtime field state from static field configs.\n */\nexport function buildDefaultFieldStates(\n  fields: Record<string, IFieldConfig>,\n  areAllFieldsReadonly?: boolean\n): Record<string, IRuntimeFieldState> {\n  const states: Record<string, IRuntimeFieldState> = {};\n  const graph = buildDependencyGraph(fields);\n\n  for (const [fieldName, config] of Object.entries(fields)) {\n    states[fieldName] = {\n      type: config.type,\n      required: config.required,\n      hidden: config.hidden || config.type === \"DynamicFragment\",\n      readOnly: areAllFieldsReadonly ? true : config.readOnly,\n      validate: config.validate,\n      computedValue: config.computedValue,\n      confirmInput: config.confirmInput,\n      options: config.options,\n      label: config.label,\n      defaultValue: config.defaultValue,\n      computeOnCreateOnly: config.computeOnCreateOnly,\n      dependentFields: [...(graph[fieldName] ?? [])],\n      dependsOnFields: [],\n      activeRuleIds: [],\n    };\n  }\n\n  // Wire up reverse dependencies\n  for (const [fieldName, state] of Object.entries(states)) {\n    for (const dep of state.dependentFields ?? []) {\n      if (states[dep]) {\n        states[dep].dependsOnFields = states[dep].dependsOnFields ?? [];\n        states[dep].dependsOnFields!.push(fieldName);\n      }\n    }\n  }\n\n  return states;\n}\n\n/**\n * Evaluates all rules for all fields against current values.\n * Returns the full runtime form state.\n */\nexport function evaluateAllRules(\n  fields: Record<string, IFieldConfig>,\n  values: IEntityData,\n  areAllFieldsReadonly?: boolean\n): IRuntimeFormState {\n  const fieldStates = buildDefaultFieldStates(fields, areAllFieldsReadonly);\n  const fieldOrder = Object.keys(fields);\n\n  // Apply rules in topological order for correct dependency resolution\n  const graph = buildDependencyGraph(fields);\n  const { sorted } = topologicalSort(graph);\n  const evalOrder = sorted.length > 0 ? sorted : fieldOrder;\n\n  let currentOrder = [...fieldOrder];\n\n  for (const fieldName of evalOrder) {\n    const config = fields[fieldName];\n    if (!config?.rules) continue;\n\n    const ruleResults = evaluateFieldRules(config.rules, values);\n\n    if (fieldStates[fieldName]) {\n      fieldStates[fieldName].activeRuleIds = ruleResults.activeRuleIds;\n    }\n\n    logEvent(\"rule_evaluated\", fieldName, `${config.rules.length} rule(s) evaluated`);\n\n    // Apply self-effects\n    applyEffectToState(fieldStates, fieldName, ruleResults.selfEffect);\n\n    // Apply setValue from then-branch only (stored separately to avoid else contamination)\n    if (ruleResults.pendingSetValue !== undefined && fieldStates[fieldName]) {\n      fieldStates[fieldName].pendingSetValue = ruleResults.pendingSetValue;\n    }\n\n    // Apply cross-field effects\n    for (const [targetField, effect] of Object.entries(ruleResults.crossEffects)) {\n      if (fieldStates[targetField]) {\n        applyEffectToState(fieldStates, targetField, effect);\n      }\n    }\n\n    // Apply field order changes\n    if (ruleResults.fieldOrder) {\n      currentOrder = ruleResults.fieldOrder;\n    }\n  }\n\n  return { fieldStates, fieldOrder: currentOrder };\n}\n\n/**\n * Evaluates rules for fields that are transitively affected by a changed field.\n * Returns only the changed field states (incremental update).\n */\nexport function evaluateAffectedFields(\n  changedField: string,\n  fields: Record<string, IFieldConfig>,\n  values: IEntityData,\n  currentState: IRuntimeFormState\n): IRuntimeFormState {\n  // Find all transitively affected fields via the dependency graph\n  const affected = getTransitivelyAffectedFields(changedField, currentState.fieldStates);\n  // Always include the changed field itself so its own rules re-evaluate\n  affected.add(changedField);\n\n  // First pass: collect cross-field effect targets from rules on affected fields\n  // so we can reset and re-evaluate them too\n  const crossFieldTargets = new Set<string>();\n  for (const fieldName of affected) {\n    const config = fields[fieldName];\n    if (!config?.rules) continue;\n    for (const rule of config.rules) {\n      if (rule.then?.fields) {\n        for (const target of Object.keys(rule.then.fields)) {\n          if (target in fields) crossFieldTargets.add(target);\n        }\n      }\n      if (rule.else?.fields) {\n        for (const target of Object.keys(rule.else.fields)) {\n          if (target in fields) crossFieldTargets.add(target);\n        }\n      }\n    }\n  }\n\n  // Merge cross-field targets into the set of fields to re-evaluate\n  for (const target of crossFieldTargets) {\n    affected.add(target);\n  }\n\n  logEvent(\"field_change\", changedField, `${affected.size} affected field(s)`);\n\n  const updatedStates = { ...currentState.fieldStates };\n  let updatedOrder = [...currentState.fieldOrder];\n\n  // Reset affected fields to defaults, preserving dependency graph edges\n  for (const fieldName of affected) {\n    const config = fields[fieldName];\n    if (!config) continue;\n\n    updatedStates[fieldName] = {\n      ...updatedStates[fieldName],\n      type: config.type,\n      required: config.required,\n      hidden: config.hidden || config.type === \"DynamicFragment\",\n      readOnly: config.readOnly,\n      validate: config.validate,\n      computedValue: config.computedValue,\n      confirmInput: config.confirmInput,\n      options: config.options,\n      label: config.label,\n      defaultValue: config.defaultValue,\n      computeOnCreateOnly: config.computeOnCreateOnly,\n      // Preserve dependency graph — these are set at init and must survive updates\n      dependentFields: updatedStates[fieldName]?.dependentFields,\n      dependsOnFields: updatedStates[fieldName]?.dependsOnFields,\n      activeRuleIds: [],\n      pendingSetValue: undefined,\n    };\n  }\n\n  // Re-apply all rules from fields in the affected set\n  for (const ownerField of affected) {\n    const config = fields[ownerField];\n    if (!config?.rules) continue;\n\n    const ruleResults = evaluateFieldRules(config.rules, values);\n\n    // Apply self-effects\n    applyEffectToState(updatedStates, ownerField, ruleResults.selfEffect);\n    if (ruleResults.pendingSetValue !== undefined && updatedStates[ownerField]) {\n      updatedStates[ownerField].pendingSetValue = ruleResults.pendingSetValue;\n    }\n\n    if (updatedStates[ownerField]) {\n      updatedStates[ownerField].activeRuleIds = ruleResults.activeRuleIds;\n    }\n\n    // Apply cross-field effects — targets are guaranteed to be in updatedStates\n    // because we added them to the affected set above\n    for (const [targetField, effect] of Object.entries(ruleResults.crossEffects)) {\n      if (updatedStates[targetField]) {\n        applyEffectToState(updatedStates, targetField, effect);\n      }\n    }\n\n    if (ruleResults.fieldOrder) {\n      updatedOrder = ruleResults.fieldOrder;\n    }\n  }\n\n  return { fieldStates: updatedStates, fieldOrder: updatedOrder };\n}\n\nfunction getTransitivelyAffectedFields(\n  changedField: string,\n  fieldStates: Record<string, IRuntimeFieldState>\n): Set<string> {\n  const affected = new Set<string>();\n  const queue = [changedField];\n\n  while (queue.length > 0) {\n    const current = queue.shift()!;\n    const deps = fieldStates[current]?.dependentFields ?? [];\n    for (const dep of deps) {\n      if (!affected.has(dep)) {\n        affected.add(dep);\n        queue.push(dep);\n      }\n    }\n  }\n\n  return affected;\n}\n\ninterface IRuleEvalResult {\n  selfEffect: IFieldEffect;\n  crossEffects: Record<string, IFieldEffect>;\n  fieldOrder?: string[];\n  activeRuleIds: string[];\n  /** Pending setValue from the winning then-branch rule (undefined if no rule fired setValue) */\n  pendingSetValue?: { value: unknown };\n}\n\n/**\n * Evaluates an array of rules for a single field.\n * Resolves priority conflicts (higher priority wins).\n */\nfunction evaluateFieldRules(rules: IRule[], values: IEntityData): IRuleEvalResult {\n  // Sort by priority (higher first) for conflict resolution\n  const sorted = [...rules].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n\n  const selfEffect: IFieldEffect = {};\n  const crossEffects: Record<string, IFieldEffect> = {};\n  let fieldOrder: string[] | undefined;\n  const activeRuleIds: string[] = [];\n  // setValue is tracked separately: only applies from the then-branch (not else)\n  let pendingSetValue: { value: unknown } | undefined;\n\n  for (let i = 0; i < sorted.length; i++) {\n    const rule = sorted[i];\n    const conditionMet = evaluateCondition(rule.when, values);\n    if (conditionMet) {\n      activeRuleIds.push(rule.id ?? `rule_${i}`);\n    }\n    const effect = conditionMet ? rule.then : rule.else;\n\n    // setValue: only from the then branch, first-write-wins by priority\n    if (conditionMet && rule.then?.setValue !== undefined && pendingSetValue === undefined) {\n      pendingSetValue = { value: rule.then.setValue };\n    }\n\n    if (!effect) continue;\n\n    // Merge self-effects (first write wins due to priority sort)\n    // Note: setValue is intentionally excluded from general merging — handled above\n    mergeEffect(selfEffect, effect);\n\n    // Merge cross-field effects\n    if (effect.fields) {\n      for (const [targetField, targetEffect] of Object.entries(effect.fields)) {\n        if (!crossEffects[targetField]) {\n          crossEffects[targetField] = {};\n        }\n        mergeEffect(crossEffects[targetField], targetEffect);\n      }\n    }\n\n    // Field order (highest priority rule wins)\n    if (effect.fieldOrder && !fieldOrder) {\n      fieldOrder = effect.fieldOrder;\n    }\n  }\n\n  return { selfEffect, crossEffects, fieldOrder, activeRuleIds, pendingSetValue };\n}\n\n/**\n * Merges an effect into a target effect (first-write-wins for each property).\n */\nfunction mergeEffect(target: IFieldEffect, source: IFieldEffect): void {\n  if (source.required !== undefined && target.required === undefined) {\n    target.required = source.required;\n  }\n  if (source.hidden !== undefined && target.hidden === undefined) {\n    target.hidden = source.hidden;\n  }\n  if (source.readOnly !== undefined && target.readOnly === undefined) {\n    target.readOnly = source.readOnly;\n  }\n  if (source.label !== undefined && target.label === undefined) {\n    target.label = source.label;\n  }\n  if (source.type !== undefined && target.type === undefined) {\n    target.type = source.type;\n  }\n  if (source.options !== undefined && target.options === undefined) {\n    target.options = source.options;\n  }\n  if (source.validate !== undefined && target.validate === undefined) {\n    target.validate = source.validate;\n  }\n  if (source.computedValue !== undefined && target.computedValue === undefined) {\n    target.computedValue = source.computedValue;\n  }\n  // Note: setValue is intentionally NOT merged here — it is handled via pendingSetValue\n  // in evaluateFieldRules to ensure it only applies from the then branch (not else).\n}\n\nfunction applyEffectToState(\n  states: Record<string, IRuntimeFieldState>,\n  fieldName: string,\n  effect: IFieldEffect\n): void {\n  const state = states[fieldName];\n  if (!state) return;\n\n  if (effect.required !== undefined) state.required = effect.required;\n  if (effect.hidden !== undefined) state.hidden = effect.hidden;\n  if (effect.readOnly !== undefined) state.readOnly = effect.readOnly;\n  if (effect.label !== undefined) state.label = effect.label;\n  if (effect.type !== undefined) state.type = effect.type;\n  if (effect.options !== undefined) state.options = effect.options;\n  if (effect.validate !== undefined) state.validate = effect.validate;\n  if (effect.computedValue !== undefined) state.computedValue = effect.computedValue;\n  // Note: setValue is applied via ruleResults.pendingSetValue in evaluateAllRules /\n  // evaluateAffectedFields, NOT here — to ensure it only fires from the then branch.\n}\n","import { RulesEngineActionType, RulesEngineAction } from \"../types/IRulesEngineAction\";\nimport { IRulesEngineState } from \"../types/IRuntimeFieldState\";\n\nexport const defaultRulesEngineState: IRulesEngineState = {\n  configs: {},\n};\n\nconst rulesEngineReducer = (\n  state: IRulesEngineState = defaultRulesEngineState,\n  action: RulesEngineAction\n): IRulesEngineState => {\n  switch (action.type) {\n    case RulesEngineActionType.SET: {\n      const configName = action.payload.configName;\n      return {\n        configs: {\n          ...state.configs,\n          [configName]: { ...action.payload.formState },\n        },\n      };\n    }\n    case RulesEngineActionType.UPDATE: {\n      const configName = action.payload.configName;\n      const existing = state.configs[configName];\n      if (!existing) return state;\n\n      const updatedFieldStates = { ...existing.fieldStates };\n      Object.keys(action.payload.formState.fieldStates).forEach(fieldName => {\n        const prev = updatedFieldStates[fieldName];\n        const next = action.payload.formState.fieldStates[fieldName];\n        updatedFieldStates[fieldName] = {\n          ...prev,\n          ...next,\n          // Preserve dependency graph edges — these are set at init and must\n          // not be overwritten by incremental updates that omit them\n          dependentFields: next.dependentFields ?? prev?.dependentFields,\n          dependsOnFields: next.dependsOnFields ?? prev?.dependsOnFields,\n        };\n      });\n\n      return {\n        configs: {\n          ...state.configs,\n          [configName]: {\n            fieldStates: updatedFieldStates,\n            fieldOrder: action.payload.formState.fieldOrder,\n          },\n        },\n      };\n    }\n    case RulesEngineActionType.CLEAR: {\n      if (action.payload.configName) {\n        const { [action.payload.configName]: _, ...remaining } = state.configs;\n        return { configs: remaining };\n      }\n      return defaultRulesEngineState;\n    }\n    case RulesEngineActionType.CLEAR_PENDING_SETVALUE: {\n      const { configName, fieldNames } = action.payload;\n      const existing = state.configs[configName];\n      if (!existing) return state;\n\n      const targets = fieldNames ?? Object.keys(existing.fieldStates);\n      let changed = false;\n      const updatedFieldStates: typeof existing.fieldStates = { ...existing.fieldStates };\n      for (const fieldName of targets) {\n        const fs = updatedFieldStates[fieldName];\n        if (fs && fs.pendingSetValue !== undefined) {\n          updatedFieldStates[fieldName] = { ...fs, pendingSetValue: undefined };\n          changed = true;\n        }\n      }\n      if (!changed) return state;\n\n      return {\n        configs: {\n          ...state.configs,\n          [configName]: {\n            fieldStates: updatedFieldStates,\n            fieldOrder: existing.fieldOrder,\n          },\n        },\n      };\n    }\n    default:\n      return state;\n  }\n};\n\nexport default rulesEngineReducer;\n","import React from \"react\";\nimport { IInjectedFieldProvider } from \"./IInjectedFieldProvider\";\n\nconst InjectedFieldContext: React.Context<IInjectedFieldProvider> = React.createContext(\n  undefined as unknown as IInjectedFieldProvider\n);\n\nexport function UseInjectedFieldContext() {\n  const context = React.useContext(InjectedFieldContext);\n  if (context === undefined) {\n    throw new Error(\n      \"UseInjectedFieldContext() was called outside of <InjectedFieldProvider>. \" +\n      \"Required hierarchy: <RulesEngineProvider> > <InjectedFieldProvider> > <Formosaic>\"\n    );\n  }\n  return context;\n}\n\n\ninterface InjectedFieldProviderProps {\n  /** Optional initial field registry. If provided, fields are set immediately. */\n  injectedFields?: Record<string, React.JSX.Element>;\n  children?: React.ReactNode;\n}\n\nexport const InjectedFieldProvider: React.FC<InjectedFieldProviderProps> = (\n  props: InjectedFieldProviderProps\n): React.JSX.Element => {\n  const [injectedFields, setInjectedFields] = React.useState<Record<string, React.JSX.Element>>(\n    (props.injectedFields ?? undefined) as unknown as Record<string, React.JSX.Element>\n  );\n\n  const providerValue: IInjectedFieldProvider = React.useMemo(() => ({\n    injectedFields,\n    setInjectedFields,\n  }), [injectedFields]);\n\n  return (\n    <InjectedFieldContext.Provider value={providerValue}>\n      {props.children}\n    </InjectedFieldContext.Provider>\n  );\n};\n\n","import { IEntityData } from \"../utils\";\nimport { IValidationRule } from \"../types/IValidationRule\";\nimport { ICondition } from \"../types/ICondition\";\nimport { evaluateCondition } from \"./ConditionEvaluator\";\n\n/**\n * Unified validator function signature.\n * Handles sync, async, and cross-field validation.\n *\n * @param value - The field's current value\n * @param params - Parameters from IValidationRule.params\n * @param context - Full form context (values, field name, abort signal)\n * @returns Error message string, undefined if valid, or a Promise for async\n */\nexport type ValidatorFn = (\n  value: unknown,\n  params: Record<string, unknown> | undefined,\n  context: IValidationContext\n) => string | undefined | Promise<string | undefined>;\n\nexport interface IValidationContext {\n  fieldName: string;\n  values: IEntityData;\n  signal?: AbortSignal;\n}\n\n// --- Built-in validators ---\n\nconst required: ValidatorFn = (value) => {\n  if (value === null || value === undefined || (typeof value === \"string\" && value.trim() === \"\")) {\n    return \"This field is required\";\n  }\n  return undefined;\n};\n\nconst email: ValidatorFn = (value) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(value) ? undefined : \"Invalid email address\";\n};\n\nconst phone: ValidatorFn = (value) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  const phoneRegex = /^[+]?[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/;\n  return phoneRegex.test(value) ? undefined : \"Invalid phone number\";\n};\n\nconst url: ValidatorFn = (value) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  return /(http(s?)):\\/\\//i.test(value) ? undefined : \"Invalid URL\";\n};\n\nconst year: ValidatorFn = (value) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  const y = parseInt(value, 10);\n  if (isNaN(y) || y < 1900 || y > 2100) return \"Invalid year\";\n  return undefined;\n};\n\nconst noSpecialCharacters: ValidatorFn = (value) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  return /[^a-zA-Z0-9\\s\\-_.]/.test(value) ? \"Special characters are not allowed\" : undefined;\n};\n\nconst currency: ValidatorFn = (value) => {\n  if (!value && value !== 0) return undefined;\n  const str = typeof value === \"string\" ? value : String(value);\n  return /^-?\\d{1,}(\\.\\d{1,2})?$/.test(str) ? undefined : \"Invalid currency format\";\n};\n\nconst uniqueInArray: ValidatorFn = (value) => {\n  if (!value || !Array.isArray(value)) return undefined;\n  const seen = new Set<string>();\n  for (const item of value) {\n    const str = String(item);\n    if (seen.has(str)) return `Duplicate value: ${str}`;\n    seen.add(str);\n  }\n  return undefined;\n};\n\nconst minLength: ValidatorFn = (value, params) => {\n  if (value === null || value === undefined || typeof value !== \"string\") return undefined;\n  const min = Number(params?.min ?? 0);\n  return value.length < min ? `Must be at least ${min} characters` : undefined;\n};\n\nconst maxLength: ValidatorFn = (value, params) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  const max = Number(params?.max ?? Infinity);\n  return value.length > max ? `Must be at most ${max} characters` : undefined;\n};\n\nconst numericRange: ValidatorFn = (value, params) => {\n  if (value == null || value === \"\") return undefined;\n  const num = typeof value === \"number\" ? value : Number(value);\n  if (isNaN(num)) return \"Must be a number\";\n  const min = Number(params?.min ?? -Infinity);\n  const max = Number(params?.max ?? Infinity);\n  if (num < min || num > max) return `Must be between ${min} and ${max}`;\n  return undefined;\n};\n\nconst pattern: ValidatorFn = (value, params) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  const regex = params?.pattern;\n  const message = (params?.message as string) ?? \"Invalid format\";\n  if (!regex) return undefined;\n  // Per audit P0-10: cap pattern source and input length to mitigate ReDoS\n  // from adversarial configs.\n  const patternStr = String(regex);\n  if (patternStr.length > 256) {\n    if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n      // eslint-disable-next-line no-console\n      console.warn(\"[formosaic] pattern validator regex source exceeds 256 chars; skipping.\");\n    }\n    return undefined;\n  }\n  if (value.length > 10_000) {\n    if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n      // eslint-disable-next-line no-console\n      console.warn(\"[formosaic] pattern validator input exceeds 10000 chars; skipping.\");\n    }\n    return undefined;\n  }\n  try {\n    return new RegExp(patternStr).test(value) ? undefined : message;\n  } catch {\n    return undefined;\n  }\n};\n\nconst maxKb: ValidatorFn = (value, params) => {\n  if (!value || typeof value !== \"string\") return undefined;\n  const maxKbValue = Number(params?.maxKb ?? 150);\n  const sizeKb = Math.ceil(new Blob([value]).size / 1000);\n  return sizeKb > maxKbValue ? `Content exceeds maximum size of ${maxKbValue}KB` : undefined;\n};\n\nconst exclusiveNumericRange: ValidatorFn = (value, params) => {\n  if (value == null || value === \"\") return undefined;\n  const num = typeof value === \"number\" ? value : Number(value);\n  if (isNaN(num)) return \"Must be a number\";\n  const exclMin = params?.exclusiveMin != null ? Number(params.exclusiveMin) : undefined;\n  const exclMax = params?.exclusiveMax != null ? Number(params.exclusiveMax) : undefined;\n  const min = params?.min != null ? Number(params.min) : undefined;\n  const max = params?.max != null ? Number(params.max) : undefined;\n  if (exclMin !== undefined && num <= exclMin) return `Must be greater than ${exclMin}`;\n  if (exclMax !== undefined && num >= exclMax) return `Must be less than ${exclMax}`;\n  if (min !== undefined && num < min) return `Must be at least ${min}`;\n  if (max !== undefined && num > max) return `Must be at most ${max}`;\n  return undefined;\n};\n\nconst multipleOf: ValidatorFn = (value, params) => {\n  if (value == null || value === \"\") return undefined;\n  const num = typeof value === \"number\" ? value : Number(value);\n  if (isNaN(num)) return \"Must be a number\";\n  const factor = Number(params?.factor ?? 1);\n  if (factor === 0) return undefined;\n  // Use tolerance for floating-point arithmetic\n  const remainder = Math.abs(num % factor);\n  const tolerance = 1e-10;\n  if (remainder > tolerance && Math.abs(remainder - Math.abs(factor)) > tolerance) {\n    return `Must be a multiple of ${factor}`;\n  }\n  return undefined;\n};\n\nconst requiredIf: ValidatorFn = (value, params, context) => {\n  if (!params?.field || !params?.values) return undefined;\n  const depValue = context.values[params.field as string];\n  const allowedValues = params.values as string[];\n  if (allowedValues.includes(String(depValue)) && (value == null || value === \"\")) {\n    return \"This field is required\";\n  }\n  return undefined;\n};\n\n// --- Validator Metadata ---\n\n/** Metadata describing a validator for use in designer UIs and documentation. */\nexport interface IValidatorMetadata {\n  /** Human-readable display name */\n  label: string;\n  /** Optional description of what the validator checks */\n  description?: string;\n  /** Named parameters the validator accepts */\n  params?: Record<string, {\n    type: \"string\" | \"number\" | \"boolean\";\n    label: string;\n    required?: boolean;\n  }>;\n}\n\n/**\n * SSR / multi-tenant contract (audit P1-21):\n *\n * Plugin-style registry. Populate ONCE at app boot. Metadata is shared\n * across all requests served by the same Node process.\n */\nlet validatorMetadataRegistry: Record<string, IValidatorMetadata> = {};\n\n/** Register metadata for a custom (or built-in) validator */\nexport function registerValidatorMetadata(name: string, metadata: IValidatorMetadata): void {\n  validatorMetadataRegistry = { ...validatorMetadataRegistry, [name]: metadata };\n}\n\n/** Get metadata for a specific validator by name */\nexport function getValidatorMetadata(name: string): IValidatorMetadata | undefined {\n  return validatorMetadataRegistry[name];\n}\n\n/** Get all registered validator metadata */\nexport function getAllValidatorMetadata(): Record<string, IValidatorMetadata> {\n  return { ...validatorMetadataRegistry };\n}\n\n/** Reset validator metadata registry (for testing) */\nexport function resetValidatorMetadataRegistry(): void {\n  validatorMetadataRegistry = {};\n}\n\n// --- Registry ---\n\nconst defaultValidators: Record<string, ValidatorFn> = {\n  required,\n  email,\n  phone,\n  url,\n  year,\n  noSpecialCharacters,\n  currency,\n  uniqueInArray,\n  minLength,\n  maxLength,\n  numericRange,\n  pattern,\n  maxKb,\n  exclusiveNumericRange,\n  multipleOf,\n  requiredIf,\n  // Legacy name aliases\n  EmailValidation: email,\n  PhoneNumberValidation: phone,\n  YearValidation: year,\n  isValidUrl: url,\n  NoSpecialCharactersValidation: noSpecialCharacters,\n  CurrencyValidation: currency,\n  UniqueInArrayValidation: uniqueInArray,\n  Max150KbValidation: (v, _p, c) => maxKb(v, { maxKb: 150 }, c),\n  Max32KbValidation: (v, _p, c) => maxKb(v, { maxKb: 32 }, c),\n};\n\n/**\n * SSR / multi-tenant contract (audit P1-21):\n *\n * Plugin-style registry of named validator functions. Register custom\n * validators ONCE at app boot via registerValidators(). Validators receive\n * `value`, `params`, and `context.values` per-call, so per-request/per-user\n * state must be plumbed through those arguments — do NOT capture per-request\n * context in a module-level closure, as it would leak across tenants.\n */\nlet validatorRegistry: Record<string, ValidatorFn> = { ...defaultValidators };\n\n/** Register custom validators (merge into registry) */\nexport function registerValidators(custom: Record<string, ValidatorFn>): void {\n  validatorRegistry = { ...validatorRegistry, ...custom };\n}\n\n/** Get a validator by name */\nexport function getValidator(name: string): ValidatorFn | undefined {\n  return validatorRegistry[name];\n}\n\n/** Get a copy of the full registry */\nexport function getValidatorRegistry(): Record<string, ValidatorFn> {\n  return { ...validatorRegistry };\n}\n\n/** Reset registry to defaults (for testing) */\nexport function resetValidatorRegistry(): void {\n  validatorRegistry = { ...defaultValidators };\n  warnedUnknownValidators.clear();\n}\n\n/**\n * Dev-only warning for validation rules referencing a validator name that is\n * not in the registry. Without this, a typo'd `name` silently disables the\n * rule (audit 2026-06 finding 4). Warns once per unknown name per process to\n * avoid flooding the console from per-keystroke validation.\n */\nconst warnedUnknownValidators = new Set<string>();\nfunction warnUnknownValidator(name: string): void {\n  if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n    if (!warnedUnknownValidators.has(name)) {\n      warnedUnknownValidators.add(name);\n      // eslint-disable-next-line no-console\n      console.warn(\n        `[formosaic] Validation rule references unregistered validator \"${name}\"; the rule is skipped. ` +\n        `Register it via registerValidators({ ${name}: ... }) or fix the rule's \"name\".`\n      );\n    }\n  }\n}\n\n/**\n * Run all validation rules for a field value.\n * Handles sync, async, and conditional validation.\n */\nexport async function runValidations(\n  value: unknown,\n  rules: IValidationRule[],\n  context: IValidationContext\n): Promise<string | undefined> {\n  for (const rule of rules) {\n    if (context.signal?.aborted) return undefined;\n\n    // Check conditional validation\n    if (rule.when) {\n      if (!evaluateCondition(rule.when, context.values)) continue;\n    }\n\n    const validator = getValidator(rule.name);\n    if (!validator) {\n      warnUnknownValidator(rule.name);\n      continue;\n    }\n\n    const result = validator(value, rule.params, context);\n    const message = result instanceof Promise ? await result : result;\n\n    if (message) {\n      return rule.message ?? message;\n    }\n  }\n  return undefined;\n}\n\n/**\n * Run only sync validation rules (no await, fast fail).\n */\nexport function runSyncValidations(\n  value: unknown,\n  rules: IValidationRule[],\n  context: IValidationContext\n): string | undefined {\n  for (const rule of rules) {\n    if (rule.async) continue;\n\n    if (rule.when) {\n      if (!evaluateCondition(rule.when, context.values)) continue;\n    }\n\n    const validator = getValidator(rule.name);\n    if (!validator) {\n      warnUnknownValidator(rule.name);\n      continue;\n    }\n\n    const result = validator(value, rule.params, context);\n    if (typeof result === \"string\") {\n      return rule.message ?? result;\n    }\n  }\n  return undefined;\n}\n\n// --- Factory helpers for common validators ---\n\nexport function createMinLengthRule(min: number, message?: string): IValidationRule {\n  return { name: \"minLength\", params: { min }, message };\n}\n\nexport function createMaxLengthRule(max: number, message?: string): IValidationRule {\n  return { name: \"maxLength\", params: { max }, message };\n}\n\nexport function createNumericRangeRule(min: number, max: number, message?: string): IValidationRule {\n  return { name: \"numericRange\", params: { min, max }, message };\n}\n\nexport function createPatternRule(pattern: string, message: string): IValidationRule {\n  return { name: \"pattern\", params: { pattern, message } };\n}\n\nexport function createRequiredIfRule(\n  field: string,\n  values: string[],\n  message?: string\n): IValidationRule {\n  return { name: \"requiredIf\", params: { field, values }, message };\n}\n","import { IEntityData, SubEntityType, isEmpty, isNull, isStringEmpty } from \"../utils\";\nimport { UseFormGetValues, UseFormSetValue } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IConfirmInputModalProps } from \"../types/IConfirmInputModalProps\";\nimport { IFieldToRender } from \"../types/IFieldToRender\";\nimport { IRuntimeFieldState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IOption } from \"../types/IOption\";\nimport { evaluateAllRules, buildDependencyGraph, topologicalSort } from \"./RuleEngine\";\nimport { runSyncValidations, runValidations, IValidationContext } from \"./ValidationRegistry\";\nimport { executeValueFunction } from \"./ValueFunctionRegistry\";\nimport { evaluateExpression } from \"./ExpressionEngine\";\nimport { logEvent } from \"./EventTimeline\";\n\nfunction getNestedFormValue(obj: Record<string, unknown>, path: string): unknown {\n  const parts = path.split(\".\");\n  let current: unknown = obj;\n  for (const part of parts) {\n    if (current === null || current === undefined) return undefined;\n    if (part === \"__proto__\" || part === \"constructor\" || part === \"prototype\") return undefined;\n    current = (current as Record<string, unknown>)[part];\n  }\n  return current;\n}\n\nfunction setNestedFormValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n  const parts = path.split(\".\");\n  let current: Record<string, unknown> = obj;\n  for (let i = 0; i < parts.length - 1; i++) {\n    const part = parts[i];\n    if (part === \"__proto__\" || part === \"constructor\" || part === \"prototype\") return;\n    const next = current[part];\n    if (next === null || next === undefined || typeof next !== \"object\" || Array.isArray(next)) {\n      current[part] = {};\n    }\n    current = current[part] as Record<string, unknown>;\n  }\n  const last = parts[parts.length - 1];\n  if (last === \"__proto__\" || last === \"constructor\" || last === \"prototype\") return;\n  current[last] = value;\n}\n\nexport const IsExpandVisible = (\n  fieldStates: Record<string, IRuntimeFieldState>,\n  expandCutoffCount: number = 12\n): boolean => {\n  let count = 0;\n  Object.keys(fieldStates).forEach(field => {\n    if (!fieldStates[field].hidden) count += 1;\n  });\n  return count > expandCutoffCount;\n};\n\nexport const GetConfirmInputModalProps = (\n  dirtyFieldNames: string[],\n  fieldStates: Record<string, IRuntimeFieldState>\n): IConfirmInputModalProps => {\n  const confirmInputModalProps: IConfirmInputModalProps = {};\n\n  dirtyFieldNames?.forEach(fieldName => {\n    fieldStates[fieldName]?.dependentFields?.forEach(dependentFieldName => {\n      if (fieldStates[dependentFieldName]?.confirmInput) {\n        if (confirmInputModalProps.confirmInputsTriggeredBy === undefined) {\n          confirmInputModalProps.confirmInputsTriggeredBy = fieldName;\n          confirmInputModalProps.dependentFieldNames = [dependentFieldName];\n        } else {\n          confirmInputModalProps.dependentFieldNames!.push(dependentFieldName);\n        }\n      }\n    });\n  });\n\n  confirmInputModalProps.otherDirtyFields = dirtyFieldNames?.filter(\n    fieldName =>\n      !confirmInputModalProps.dependentFieldNames?.includes(fieldName) &&\n      fieldName !== confirmInputModalProps.confirmInputsTriggeredBy\n  );\n\n  return confirmInputModalProps;\n};\n\ninterface IExecuteComputedValue {\n  fieldName: string;\n  expression: string;\n}\n\nexport const GetComputedValuesOnDirtyFields = (\n  dirtyFieldNames: string[],\n  fieldStates: Record<string, IRuntimeFieldState>\n): IExecuteComputedValue[] => {\n  const computedValues: IExecuteComputedValue[] = [];\n\n  dirtyFieldNames?.forEach(fieldName => {\n    fieldStates[fieldName]?.dependentFields?.forEach(dependentFieldName => {\n      const state = fieldStates[dependentFieldName];\n      if (\n        state?.computedValue &&\n        !state.computeOnCreateOnly &&\n        !dirtyFieldNames.includes(dependentFieldName)\n      ) {\n        computedValues.push({\n          fieldName: dependentFieldName,\n          expression: state.computedValue,\n        });\n      }\n    });\n  });\n\n  return computedValues;\n};\n\nexport const GetComputedValuesOnCreate = (\n  fieldStates: Record<string, IRuntimeFieldState>\n): IExecuteComputedValue[] => {\n  const computedValues: IExecuteComputedValue[] = [];\n\n  Object.keys(fieldStates).forEach(fieldName => {\n    const state = fieldStates[fieldName];\n    if (state.computedValue && state.computeOnCreateOnly) {\n      computedValues.push({\n        fieldName,\n        expression: state.computedValue,\n      });\n    }\n  });\n\n  return computedValues;\n};\n\nexport const ExecuteComputedValue = (\n  expression: string,\n  values: IEntityData,\n  fieldName?: string,\n  parentEntity?: IEntityData,\n  currentUserId?: string\n): SubEntityType => {\n  return evaluateExpression(expression, values, fieldName, parentEntity, currentUserId) as SubEntityType;\n};\n\nexport const CheckFieldValidationRules = (\n  value: unknown,\n  fieldName: string,\n  entityData: IEntityData,\n  state: IRuntimeFieldState\n): string | undefined => {\n  if (!state.validate || state.validate.length === 0) return undefined;\n  const context: IValidationContext = { fieldName, values: entityData };\n  const result = runSyncValidations(value, state.validate, context);\n  logEvent(\"validation_run\", fieldName, result ? `failed: ${result}` : \"passed\");\n  return result;\n};\n\nexport const CheckAsyncFieldValidationRules = async (\n  value: unknown,\n  fieldName: string,\n  entityData: IEntityData,\n  state: IRuntimeFieldState,\n  signal?: AbortSignal\n): Promise<string | undefined> => {\n  if (!state.validate || state.validate.length === 0) return undefined;\n  const context: IValidationContext = { fieldName, values: entityData, signal };\n  return runValidations(value, state.validate, context);\n};\n\nexport const CheckValidDropdownOptions = (\n  fieldStates: Record<string, IRuntimeFieldState>,\n  formValues: IEntityData,\n  setValue: UseFormSetValue<IEntityData>\n) => {\n  if (isEmpty(fieldStates) || isEmpty(formValues)) return;\n\n  Object.keys(fieldStates).forEach(fieldName => {\n    const { type, options } = fieldStates[fieldName];\n    const fieldValue = getNestedFormValue(formValues, fieldName);\n    if (\n      (type === \"Dropdown\" || type === \"StatusDropdown\") &&\n      !isNull(fieldValue) &&\n      // \"\" means \"no selection\", not an invalid selection — nulling it out\n      // changes the value representation and flips react-hook-form's global\n      // isDirty deep-compare at mount (save button enabled on a pristine\n      // form, spurious beforeunload warnings).\n      fieldValue !== \"\" &&\n      options &&\n      options.findIndex(o => String(o.value) === String(fieldValue)) === -1\n    ) {\n      setValue(`${fieldName}` as const, null, { shouldDirty: false });\n    } else if (type === \"Multiselect\" && !isNull(fieldValue) && options) {\n      const filteredValues = (fieldValue as string[])?.filter(\n        val => options.some(o => String(o.value) === val)\n      );\n      if (filteredValues?.length !== (fieldValue as string[])?.length) {\n        setValue(`${fieldName}` as const, filteredValues, { shouldDirty: false });\n      }\n    }\n  });\n};\n\nexport const CheckDefaultValues = (\n  fieldStates: Record<string, IRuntimeFieldState>,\n  formValues: IEntityData,\n  setValue: UseFormSetValue<IEntityData>\n) => {\n  if (isEmpty(fieldStates) || isEmpty(formValues)) return;\n\n  Object.keys(fieldStates).forEach(fieldName => {\n    const { defaultValue, hidden } = fieldStates[fieldName];\n    if (!isNull(defaultValue) && isNull(getNestedFormValue(formValues, fieldName)) && !hidden) {\n      // Per audit P1-2: applying defaults must NOT dirty the form. Dirtying\n      // the form at mount triggers useBeforeUnload warnings and may cause\n      // spurious autosaves of values the user never touched.\n      setValue(`${fieldName}` as const, defaultValue, { shouldDirty: false });\n    }\n  });\n};\n\nexport const InitOnCreateFormState = (\n  configName: string,\n  fields: Record<string, IFieldConfig>,\n  defaultValues: IEntityData,\n  parentEntity: IEntityData,\n  userId: string,\n  setValue: UseFormSetValue<IEntityData>,\n  initFormState: (\n    configName: string,\n    defaultValues: IEntityData,\n    fields: Record<string, IFieldConfig>,\n    areAllFieldsReadonly?: boolean\n  ) => IRuntimeFormState,\n  getValues?: UseFormGetValues<IEntityData>\n): { formState: IRuntimeFormState; initEntityData: IEntityData } => {\n  const initEntityData: IEntityData = { ...defaultValues, Parent: { ...parentEntity } };\n\n  // Execute computed values and apply defaults in topological order so a field\n  // whose computedValue depends on another field (possibly also computed) reads\n  // the already-computed value rather than undefined. Use nested writes so\n  // dotted field names (e.g. \"shipping.name\") are legible to subsequent reads\n  // via getNestedFormValue / ExpressionEngine. See audit finding P0-6.\n  const graph = buildDependencyGraph(fields);\n  const { sorted } = topologicalSort(graph);\n  const fieldNames = sorted.length > 0 ? sorted : Object.keys(fields);\n\n  for (const fieldName of fieldNames) {\n    const config = fields[fieldName];\n    if (!config) continue;\n    if (config.computedValue && config.computeOnCreateOnly) {\n      const result = ExecuteComputedValue(\n        config.computedValue,\n        initEntityData,\n        fieldName,\n        parentEntity,\n        userId\n      );\n      if (result !== undefined) {\n        setValue(`${fieldName}` as const, result);\n        setNestedFormValue(initEntityData, fieldName, result);\n      }\n    }\n    if (config.defaultValue !== undefined && isNull(getNestedFormValue(initEntityData, fieldName))) {\n      setValue(`${fieldName}` as const, config.defaultValue);\n      setNestedFormValue(initEntityData, fieldName, config.defaultValue);\n    }\n  }\n\n  // If caller passed getValues, rebuild initEntityData from the RHF store so\n  // the returned data is the authoritative form state.\n  const finalEntityData: IEntityData = getValues\n    ? { ...(getValues() as IEntityData), Parent: initEntityData.Parent }\n    : initEntityData;\n\n  return {\n    formState: initFormState(configName, finalEntityData, fields, false),\n    initEntityData: finalEntityData,\n  };\n};\n\nexport const InitOnEditFormState = (\n  configName: string,\n  fields: Record<string, IFieldConfig>,\n  defaultValues: IEntityData,\n  areAllFieldsReadonly: boolean,\n  initFormState: (\n    configName: string,\n    defaultValues: IEntityData,\n    fields: Record<string, IFieldConfig>,\n    areAllFieldsReadonly?: boolean\n  ) => IRuntimeFormState\n): { formState: IRuntimeFormState; initEntityData: IEntityData } => {\n  return {\n    formState: initFormState(configName, defaultValues, fields, areAllFieldsReadonly),\n    initEntityData: defaultValues,\n  };\n};\n\nexport const ShowField = (filterText?: string, value?: SubEntityType, label?: string): boolean => {\n  if (!filterText) return true;\n  const valueStr = JSON.stringify(value)?.toLowerCase();\n  const labelStr = label?.toLowerCase();\n  return (valueStr?.includes(filterText.toLowerCase()) ?? false) ||\n    (labelStr?.includes(filterText.toLowerCase()) ?? false);\n};\n\nexport const GetFieldsToRender = (\n  fieldRenderLimit: number,\n  fieldOrder: string[],\n  fieldStates?: Record<string, IRuntimeFieldState>\n): IFieldToRender[] => {\n  if (fieldRenderLimit) {\n    const fieldsToRender: IFieldToRender[] = [];\n    let count = 0;\n    fieldOrder.forEach(fieldName => {\n      if (fieldStates?.[fieldName]?.hidden) return;\n      if (count === fieldRenderLimit) {\n        fieldsToRender.push({ fieldName, softHidden: true });\n      } else {\n        fieldsToRender.push({ fieldName, softHidden: false });\n        count += 1;\n      }\n    });\n    return fieldsToRender;\n  }\n  return fieldOrder?.map(fieldName => ({ fieldName, softHidden: false }));\n};\n\n","import { IOption } from \"../types/IOption\";\n\n/** Sort options alphabetically by label */\nexport function SortOptions(options: IOption[]): IOption[] {\n  return [...options].sort((a, b) => {\n    const aLabel = a.label?.toLowerCase() ?? \"\";\n    const bLabel = b.label?.toLowerCase() ?? \"\";\n    return aLabel < bLabel ? -1 : aLabel > bLabel ? 1 : 0;\n  });\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { buildDependencyGraph, topologicalSort } from \"./RuleEngine\";\nimport { extractConditionDependencies } from \"./ConditionEvaluator\";\n\nexport interface ICycleError {\n  type: \"dependency\" | \"self\";\n  fields: string[];\n  message: string;\n}\n\n/**\n * Detects circular dependencies in field rules using Kahn's algorithm.\n * Operates on the dependency graph built from IFieldConfig.rules.\n */\nexport function detectDependencyCycles(\n  fields: Record<string, IFieldConfig>\n): ICycleError[] {\n  const errors: ICycleError[] = [];\n  const graph = buildDependencyGraph(fields);\n  const { hasCycle, cycleFields } = topologicalSort(graph);\n\n  if (hasCycle) {\n    errors.push({\n      type: \"dependency\",\n      fields: cycleFields,\n      message: `Circular dependency detected among fields: ${cycleFields.join(\", \")}`,\n    });\n  }\n\n  return errors;\n}\n\n/**\n * Detects self-dependencies (a field's rule references itself in a way that causes loops).\n */\nexport function detectSelfDependencies(\n  fields: Record<string, IFieldConfig>\n): ICycleError[] {\n  const errors: ICycleError[] = [];\n\n  for (const [fieldName, config] of Object.entries(fields)) {\n    if (!config.rules) continue;\n    for (const rule of config.rules) {\n      // Check if the rule's condition references itself AND its effect targets itself\n      const condDeps = extractConditionDependencies(rule.when);\n      const selfInCondition = condDeps.includes(fieldName);\n\n      if (selfInCondition && rule.then.fields?.[fieldName]) {\n        errors.push({\n          type: \"self\",\n          fields: [fieldName],\n          message: `Field \"${fieldName}\" has a rule that both depends on and modifies itself`,\n        });\n      }\n    }\n  }\n\n  return errors;\n}\n\n/**\n * Validates the full dependency graph of field configs.\n * Logs warnings in development, returns errors for programmatic use.\n */\nexport function validateDependencyGraph(\n  fields: Record<string, IFieldConfig>\n): ICycleError[] {\n  const errors: ICycleError[] = [];\n\n  errors.push(...detectDependencyCycles(fields));\n  errors.push(...detectSelfDependencies(fields));\n\n  // Log warnings in development\n  try {\n    if (typeof globalThis !== \"undefined\" && (globalThis as Record<string, unknown>).__DEV__ !== false) {\n      for (const error of errors) {\n        console.warn(`[Formosaic] ${error.message}`);\n      }\n    }\n  } catch {\n    // Silently ignore\n  }\n\n  return errors;\n}\n","import { IFieldConfig } from \"../types/IFieldConfig\";\nimport { getValidator } from \"./ValidationRegistry\";\nimport { detectDependencyCycles, detectSelfDependencies } from \"./DependencyGraphValidator\";\nimport { extractConditionDependencies } from \"./ConditionEvaluator\";\n\nexport interface IConfigValidationError {\n  type:\n    | \"missing_rule_target\"\n    | \"unregistered_component\"\n    | \"unregistered_validator\"\n    | \"circular_dependency\"\n    | \"self_dependency\"\n    | \"missing_options\"\n    | \"invalid_condition\";\n  fieldName: string;\n  message: string;\n  details?: string;\n}\n\n/**\n * Validates field configs for common issues at dev time.\n *\n * Checks:\n * - Rule conditions reference existing fields\n * - Cross-field effects target existing fields\n * - Component types are registered (if registry provided)\n * - Validators are registered\n * - Dropdown fields have options or rules providing them\n * - No circular/self dependencies\n */\nexport function validateFieldConfigs(\n  fields: Record<string, IFieldConfig>,\n  registeredComponents?: Set<string>\n): IConfigValidationError[] {\n  const errors: IConfigValidationError[] = [];\n  const fieldNames = new Set(Object.keys(fields));\n\n  for (const [fieldName, config] of Object.entries(fields)) {\n    // Check rule condition field references\n    if (config.rules) {\n      for (const rule of config.rules) {\n        const condDeps = extractConditionDependencies(rule.when);\n        for (const dep of condDeps) {\n          if (!fieldNames.has(dep)) {\n            errors.push({\n              type: \"missing_rule_target\",\n              fieldName,\n              message: `Field \"${fieldName}\" has a rule condition referencing non-existent field \"${dep}\"`,\n              details: dep,\n            });\n          }\n        }\n\n        // Check cross-field effect targets\n        if (rule.then.fields) {\n          for (const target of Object.keys(rule.then.fields)) {\n            if (!fieldNames.has(target)) {\n              errors.push({\n                type: \"missing_rule_target\",\n                fieldName,\n                message: `Field \"${fieldName}\" has a rule effect targeting non-existent field \"${target}\"`,\n                details: target,\n              });\n            }\n          }\n        }\n        if (rule.else?.fields) {\n          for (const target of Object.keys(rule.else.fields)) {\n            if (!fieldNames.has(target)) {\n              errors.push({\n                type: \"missing_rule_target\",\n                fieldName,\n                message: `Field \"${fieldName}\" has a rule else-effect targeting non-existent field \"${target}\"`,\n                details: target,\n              });\n            }\n          }\n        }\n      }\n    }\n\n    // Check component types are registered\n    if (registeredComponents && config.type && !registeredComponents.has(config.type)) {\n      errors.push({\n        type: \"unregistered_component\",\n        fieldName,\n        message: `Field \"${fieldName}\" uses unregistered component type \"${config.type}\". Available: ${[...registeredComponents].join(\", \")}`,\n        details: config.type,\n      });\n    }\n\n    // Check validator names\n    if (config.validate) {\n      for (const rule of config.validate) {\n        if (!getValidator(rule.name)) {\n          errors.push({\n            type: \"unregistered_validator\",\n            fieldName,\n            message: `Field \"${fieldName}\" references unregistered validator \"${rule.name}\"`,\n            details: rule.name,\n          });\n        }\n      }\n    }\n\n    // Check dropdown fields have options\n    if (\n      (config.type === \"Dropdown\" || config.type === \"StatusDropdown\" || config.type === \"Multiselect\") &&\n      (!config.options || config.options.length === 0) &&\n      !hasRuleProvidingOptions(fieldName, fields)\n    ) {\n      errors.push({\n        type: \"missing_options\",\n        fieldName,\n        message: `Field \"${fieldName}\" is a ${config.type} but has no options configured and no rules providing options`,\n      });\n    }\n  }\n\n  // Check for circular/self dependencies\n  const cycleErrors = detectDependencyCycles(fields);\n  for (const cycleError of cycleErrors) {\n    errors.push({\n      type: \"circular_dependency\",\n      fieldName: cycleError.fields[0] ?? \"\",\n      message: cycleError.message,\n    });\n  }\n\n  const selfErrors = detectSelfDependencies(fields);\n  for (const selfError of selfErrors) {\n    errors.push({\n      type: \"self_dependency\",\n      fieldName: selfError.fields[0] ?? \"\",\n      message: selfError.message,\n    });\n  }\n\n  return errors;\n}\n\n/** Checks if any rule provides options for a field */\nfunction hasRuleProvidingOptions(\n  targetFieldName: string,\n  fields: Record<string, IFieldConfig>\n): boolean {\n  for (const config of Object.values(fields)) {\n    if (config.rules) {\n      for (const rule of config.rules) {\n        if (rule.then.fields?.[targetFieldName]?.options) return true;\n        if (rule.else?.fields?.[targetFieldName]?.options) return true;\n      }\n    }\n  }\n  return false;\n}\n","import React from \"react\";\nimport { IWizardConfig, IWizardStep } from \"../types/IWizardConfig\";\nimport { IEntityData } from \"../utils\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { getVisibleSteps, getStepFields, isStepValid } from \"../helpers/WizardHelper\";\nimport { FormStrings } from \"../strings\";\n\nexport interface IWizardNavigationProps {\n  steps: IWizardStep[];\n  currentStepIndex: number;\n  goToStep: (index: number) => void;\n  canGoNext: boolean;\n  canGoPrev: boolean;\n  goNext: () => void;\n  goPrev: () => void;\n}\n\nexport interface IWizardStepHeaderProps {\n  step: IWizardStep;\n  stepIndex: number;\n  totalSteps: number;\n}\n\nexport interface IWizardFormProps {\n  wizardConfig: IWizardConfig;\n  entityData: IEntityData;\n  fieldStates?: Record<string, IRuntimeFieldState>;\n  errors?: Record<string, unknown>;\n  renderStepContent: (fields: string[]) => React.ReactNode;\n  renderStepNavigation?: (props: IWizardNavigationProps) => React.ReactNode;\n  renderStepHeader?: (props: IWizardStepHeaderProps) => React.ReactNode;\n  onStepChange?: (fromIndex: number, toIndex: number) => void;\n  /** Analytics callback for wizard step changes. */\n  onAnalyticsStepChange?: (fromStep: number, toStep: number) => void;\n}\n\nexport const WizardForm: React.FC<IWizardFormProps> = (props) => {\n  const {\n    wizardConfig, entityData, fieldStates, errors,\n    renderStepContent, renderStepNavigation, renderStepHeader, onStepChange, onAnalyticsStepChange,\n  } = props;\n\n  const [currentStepIndex, setCurrentStepIndex] = React.useState(0);\n\n  const visibleSteps = React.useMemo(\n    () => getVisibleSteps(wizardConfig.steps, entityData),\n    [wizardConfig.steps, entityData]\n  );\n\n  // Per audit P1-7: clamp currentStepIndex when steps disappear so the\n  // wizard never renders blank or hangs on an invalid index.\n  React.useEffect(() => {\n    if (currentStepIndex >= visibleSteps.length) {\n      setCurrentStepIndex(Math.max(0, visibleSteps.length - 1));\n    }\n  }, [visibleSteps.length, currentStepIndex]);\n\n  const currentStep = visibleSteps[currentStepIndex];\n  const currentFields = currentStep ? getStepFields(currentStep, fieldStates) : [];\n  const canGoNext = currentStepIndex < visibleSteps.length - 1;\n  const canGoPrev = currentStepIndex > 0;\n\n  const goToStep = React.useCallback((index: number) => {\n    if (index >= 0 && index < visibleSteps.length) {\n      if (wizardConfig.validateOnStepChange && errors && currentStep) {\n        if (!isStepValid(currentStep, errors)) return;\n      }\n      const prevIndex = currentStepIndex;\n      setCurrentStepIndex(index);\n      onStepChange?.(prevIndex, index);\n      onAnalyticsStepChange?.(prevIndex, index);\n    }\n  }, [visibleSteps.length, currentStepIndex, wizardConfig.validateOnStepChange, errors, currentStep, onStepChange, onAnalyticsStepChange]);\n\n  const goNext = React.useCallback(() => { if (canGoNext) goToStep(currentStepIndex + 1); }, [canGoNext, currentStepIndex, goToStep]);\n  const goPrev = React.useCallback(() => { if (canGoPrev) goToStep(currentStepIndex - 1); }, [canGoPrev, currentStepIndex, goToStep]);\n\n  const stepAnnouncement = currentStep\n    ? `${FormStrings.stepOf(currentStepIndex + 1, visibleSteps.length)}${currentStep.title ? `: ${currentStep.title}` : \"\"}`\n    : \"\";\n\n  if (!currentStep) return null;\n\n  return (\n    <div className=\"wizard-form\" role=\"group\" aria-label={FormStrings.formWizard}>\n      <div role=\"status\" aria-live=\"polite\" className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }} data-testid=\"wizard-step-live-region\">\n        {stepAnnouncement}\n      </div>\n      {renderStepHeader?.({ step: currentStep, stepIndex: currentStepIndex, totalSteps: visibleSteps.length })}\n      <div className=\"wizard-step-content\" aria-current=\"step\">\n        {renderStepContent(currentFields)}\n      </div>\n      {renderStepNavigation?.({ steps: visibleSteps, currentStepIndex, goToStep, canGoNext, canGoPrev, goNext, goPrev })}\n    </div>\n  );\n};\n\n","import { IEntityData } from \"../utils\";\nimport { IWizardStep } from \"../types/IWizardConfig\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { evaluateCondition } from \"./ConditionEvaluator\";\n\nexport function getVisibleSteps(\n  steps: IWizardStep[],\n  entityData: IEntityData\n): IWizardStep[] {\n  return steps.filter(step => {\n    if (!step.visibleWhen) return true;\n    return evaluateCondition(step.visibleWhen, entityData);\n  });\n}\n\nexport function getStepFields(\n  step: IWizardStep,\n  fieldStates?: Record<string, IRuntimeFieldState>\n): string[] {\n  const fields = step.fields ?? [];\n  if (!fieldStates) return fields;\n  return fields.filter(fieldName => {\n    const state = fieldStates[fieldName];\n    return !state?.hidden;\n  });\n}\n\nexport function getStepFieldOrder(\n  steps: IWizardStep[],\n  entityData: IEntityData\n): string[] {\n  const visibleSteps = getVisibleSteps(steps, entityData);\n  return visibleSteps.flatMap(step => step.fields ?? []);\n}\n\nexport function validateStepFields(\n  step: IWizardStep,\n  errors: Record<string, unknown>\n): string[] {\n  return (step.fields ?? []).filter(fieldName => fieldName in errors);\n}\n\nexport function isStepValid(\n  step: IWizardStep,\n  errors: Record<string, unknown>\n): boolean {\n  return validateStepFields(step, errors).length === 0;\n}\n\nexport function getStepIndex(\n  steps: IWizardStep[],\n  stepId: string\n): number {\n  return steps.findIndex(s => s.id === stepId);\n}\n","import React from \"react\";\nimport { useFieldArray, useFormContext } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { FormStrings } from \"../strings\";\n\nexport interface IFieldArrayProps {\n  fieldName: string;\n  config: IFieldConfig;\n  renderItem: (itemFieldNames: string[], index: number, remove: () => void) => React.ReactNode;\n  renderAddButton?: (append: () => void, canAdd: boolean) => React.ReactNode;\n}\n\nexport const FieldArray: React.FC<IFieldArrayProps> = (props) => {\n  const { fieldName, config, renderItem, renderAddButton } = props;\n  const { control } = useFormContext();\n  const { fields, append, remove } = useFieldArray({ control, name: fieldName });\n\n  const canAdd = config.maxItems ? fields.length < config.maxItems : true;\n  const canRemove = config.minItems ? fields.length > config.minItems : true;\n\n  const handleAppend = React.useCallback(() => {\n    if (canAdd) append({});\n  }, [canAdd, append]);\n\n  const handleRemove = React.useCallback((index: number) => {\n    if (canRemove) remove(index);\n  }, [canRemove, remove]);\n\n  const itemFieldNames = React.useMemo(\n    () => config.items ? Object.keys(config.items) : [],\n    [config.items]\n  );\n\n  return (\n    <div className=\"field-array\" role=\"group\" aria-label={config.label || fieldName}>\n      {fields.map((field, index) => (\n        <div key={field.id} className=\"field-array-item\" role=\"group\" aria-label={FormStrings.itemOfTotal(index + 1, fields.length, config.label || fieldName)}>\n          {renderItem(\n            itemFieldNames.map(name => `${fieldName}.${index}.${name}`),\n            index,\n            () => handleRemove(index)\n          )}\n        </div>\n      ))}\n      {renderAddButton?.(handleAppend, canAdd)}\n    </div>\n  );\n};\n\n","import { IEntityData, SubEntityType, isEmpty } from \"../utils\";\nimport \"../styles.css\";\nimport React from \"react\";\nimport { FormProvider, FormState, useForm } from \"react-hook-form\";\nimport { FormConstants } from \"../constants\";\nimport {\n  CheckDefaultValues,\n  CheckValidDropdownOptions,\n  ExecuteComputedValue,\n  GetConfirmInputModalProps,\n  GetComputedValuesOnDirtyFields,\n  InitOnCreateFormState,\n  InitOnEditFormState,\n  IsExpandVisible,\n} from \"../helpers/FormosaicHelper\";\nimport { IRulesEngineState, IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IConfirmInputModalProps } from \"../types/IConfirmInputModalProps\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IFormConfig } from \"../types/IFormConfig\";\nimport { IFormosaicProps } from \"../types/IFormosaicProps\";\nimport { isTemplateFieldRef } from \"../types/IFormTemplate\";\nimport { resolveTemplates } from \"../templates/TemplateResolver\";\nimport { UseRulesEngineContext } from \"../providers/RulesEngineProvider\";\nimport { FormStrings } from \"../strings\";\nimport { useFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport ConfirmInputsModal from \"./ConfirmInputsModal\";\nimport { FormFields } from \"./FormosaicFields\";\n\ninterface IFormosaicComponentProps extends IFormosaicProps {\n  /** v2 form config (preferred). If provided, fieldConfigs is ignored. */\n  formConfig?: IFormConfig;\n  /** v1-style field configs (for migration). Use formConfig instead. */\n  fieldConfigs?: Record<string, IFieldConfig>;\n  defaultValues: IEntityData;\n  saveData?: (entityData: IEntityData, dirtyFieldNames?: string[]) => Promise<IEntityData>;\n  saveTimeoutMs?: number;\n  maxSaveRetries?: number;\n  renderExpandButton?: (props: { isExpanded: boolean; onToggle: () => void }) => React.JSX.Element;\n  renderFilterInput?: (props: { onChange: (value: string) => void }) => React.JSX.Element;\n  renderDialog?: (props: { isOpen: boolean; onSave: () => void; onCancel: () => void; children: React.ReactNode }) => React.JSX.Element;\n  isManualSave?: boolean;\n  renderSaveButton?: (props: { onSave: () => void; isDirty: boolean; isValid: boolean; isSubmitting: boolean }) => React.ReactNode;\n  formErrors?: string[];\n  /** Per-field server-side errors to inject (e.g. from a failed API save). Keys are field names, values are error messages. */\n  fieldErrors?: Record<string, string>;\n  renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n  renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n  renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n  /** Called with validated form values when the user submits. Works alongside auto-save. */\n  onSubmit?: (values: IEntityData) => void | Promise<void>;\n  /** Called with RHF FieldErrors when submit validation fails. */\n  onSubmitError?: (errors: import(\"react-hook-form\").FieldErrors) => void;\n  /** Render prop for a custom submit button. If onSubmit is provided and this is omitted, a default submit button is rendered. */\n  renderSubmitButton?: (props: { onSubmit: () => void; isDirty: boolean; isValid: boolean; isSubmitting: boolean }) => React.ReactNode;\n}\n\nexport const Formosaic: React.FC<IFormosaicComponentProps> = (props: IFormosaicComponentProps): React.JSX.Element => {\n  const {\n    configName,\n    testId,\n    expandCutoffCount,\n    formConfig,\n    defaultValues,\n    areAllFieldsReadonly,\n    collapsedMaxHeight,\n    isCreate,\n    parentEntity,\n    enableFilter,\n    currentUserId,\n    onSaveError,\n    isManualSave = false,\n    saveTimeoutMs = 30000,\n    maxSaveRetries = 3,\n    renderExpandButton,\n    renderFilterInput,\n    renderDialog,\n    renderSaveButton,\n    formErrors,\n    fieldErrors,\n    renderLabel,\n    renderError,\n    renderStatus,\n    onSubmit: onSubmitProp,\n    onSubmitError,\n    renderSubmitButton,\n  } = props;\n\n  // Support both v2 formConfig and v1 fieldConfigs\n  const rawFields = formConfig?.fields ?? props.fieldConfigs ?? {};\n\n  // Detect and resolve templates: if any field is a templateRef, resolve them all\n  const hasTemplateRefs = formConfig\n    ? Object.values(formConfig.fields).some(f => isTemplateFieldRef(f))\n    : false;\n  const resolvedConfig = hasTemplateRefs && formConfig\n    ? resolveTemplates(formConfig)\n    : formConfig;\n  // Use resolved fields for all downstream work (after resolution, all templateRefs are gone)\n  const fields = (resolvedConfig?.fields ?? rawFields) as Record<string, IFieldConfig>;\n\n  const formSettings = resolvedConfig?.settings;\n  const effectiveManualSave = formSettings?.manualSave ?? isManualSave;\n  const effectiveSaveTimeout = formSettings?.saveTimeoutMs ?? saveTimeoutMs;\n  const effectiveMaxRetries = formSettings?.maxSaveRetries ?? maxSaveRetries;\n  const effectiveExpandCutoff = formSettings?.expandCutoffCount ?? expandCutoffCount;\n  const analytics = useFormAnalytics(formSettings?.analytics);\n\n  // Per audit P0-4: do NOT fall back to a noop saveData. A noop resolver\n  // returning `{}` causes handleDirtyFields to reset the form to an empty\n  // object, wiping in-progress user edits. When `saveData` is not supplied,\n  // the save flow is skipped entirely below.\n  const saveData = props.saveData;\n\n  const { initFormState, processFieldChange, rulesState, clearPendingSetValue } = UseRulesEngineContext();\n\n  const saveTimeoutDelay = React.useRef<number | undefined>(undefined);\n  const saveTimeout = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const confirmInputModalProps = React.useRef<IConfirmInputModalProps | undefined>(undefined);\n  const saveAbortControllerRef = React.useRef<AbortController | undefined>(undefined);\n  const [isExpanded, setIsExpanded] = React.useState<boolean>(false);\n  const [expandEnabled, setExpandEnabled] = React.useState<boolean>();\n  const [inputFieldsConfirmed, setInputFieldsConfirmed] = React.useState<boolean>(true);\n  const [filterText, setFilterText] = React.useState<string>();\n  const [statusMessage, setStatusMessage] = React.useState<string>(\"\");\n\n  const formMethods = useForm({ mode: \"onChange\", defaultValues });\n  const { reset, resetField, handleSubmit, trigger, setValue, getValues, setError, clearErrors, formState } = formMethods;\n\n  const rulesStateRef = React.useRef<IRulesEngineState>(rulesState);\n  const formStateRef = React.useRef<FormState<IEntityData>>({ ...formState });\n  const filterTimeoutRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n  const validateAndSaveRef = React.useRef<(() => void) | undefined>(undefined);\n  const { isDirty, isValid, dirtyFields, errors, isSubmitting, isSubmitSuccessful } = formState;\n\n  React.useEffect(() => { rulesStateRef.current = rulesState; }, [rulesState]);\n  React.useEffect(() => { formStateRef.current = formState; }, [formState]);\n\n  // Track last-init inputs so we only re-init when meaningful inputs change,\n  // not on every parent rerender. See audit P1-1.\n  const initInputsRef = React.useRef<{\n    fields: Record<string, IFieldConfig>;\n    defaultValues: IEntityData;\n    configName: string;\n    isCreate?: boolean;\n    areAllFieldsReadonly?: boolean;\n    parentEntity?: IEntityData;\n    currentUserId?: string;\n  } | undefined>(undefined);\n\n  React.useEffect(() => {\n    const last = initInputsRef.current;\n    if (\n      last &&\n      last.fields === fields &&\n      last.defaultValues === defaultValues &&\n      last.configName === configName &&\n      last.isCreate === isCreate &&\n      last.areAllFieldsReadonly === areAllFieldsReadonly &&\n      last.parentEntity === parentEntity &&\n      last.currentUserId === currentUserId\n    ) {\n      return;\n    }\n    initInputsRef.current = { fields, defaultValues, configName, isCreate, areAllFieldsReadonly, parentEntity, currentUserId };\n    initForm(defaultValues);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [fields, defaultValues, configName, isCreate, areAllFieldsReadonly, parentEntity, currentUserId]);\n\n  // Inject server-side per-field errors into RHF error state\n  React.useEffect(() => {\n    if (!fieldErrors) return;\n    Object.entries(fieldErrors).forEach(([fieldName, message]) => {\n      setError(fieldName, { type: \"server\", message });\n    });\n  }, [fieldErrors]);\n\n  const initForm = (entityData: IEntityData) => {\n    const { formState: loadedState, initEntityData } = isCreate\n      ? InitOnCreateFormState(configName, fields, entityData, parentEntity ?? {}, currentUserId ?? \"\", setValue, initFormState, getValues)\n      : InitOnEditFormState(configName, fields, entityData, areAllFieldsReadonly ?? false, initFormState);\n\n    setExpandEnabled(IsExpandVisible(loadedState.fieldStates, effectiveExpandCutoff));\n    CheckValidDropdownOptions(loadedState.fieldStates, initEntityData, setValue);\n    // Defaults are applied once at init-time only (P1-3). Rules that want to\n    // reset or override values should use setValue effects (pendingSetValue).\n    CheckDefaultValues(loadedState.fieldStates, initEntityData, setValue);\n  };\n\n  React.useEffect(() => {\n    if (rulesState.configs[configName]) {\n      const cfg = rulesState.configs[configName];\n      CheckValidDropdownOptions(cfg.fieldStates, getValues(), setValue);\n      // Per audit P1-3: do NOT re-apply defaults on every rules-state change.\n      // Defaults are init-time only (see initForm). Rules that want to reset or\n      // replace values should use setValue effects via pendingSetValue.\n      handleComputedValues(cfg);\n\n      // Apply pending setValue effects from rules. We dispatch a reducer\n      // action to clear them immutably rather than mutating state in place\n      // (P1-4). After applying each value, call processFieldChange so any\n      // downstream rules re-evaluate against the new value.\n      const appliedFields: string[] = [];\n      for (const [fieldName, fieldState] of Object.entries(cfg.fieldStates)) {\n        if (fieldState.pendingSetValue !== undefined) {\n          setValue(`${fieldName}` as const, fieldState.pendingSetValue.value, { shouldDirty: true });\n          appliedFields.push(fieldName);\n        }\n      }\n      if (appliedFields.length > 0) {\n        // Cascade: let any rules whose condition depends on these fields re-run.\n        for (const fieldName of appliedFields) {\n          processFieldChange(getValues(), configName, fieldName, fields);\n        }\n        clearPendingSetValue(configName, appliedFields);\n      }\n    }\n  }, [rulesState]);\n\n  const attemptSave = React.useCallback(() => {\n    if (saveTimeout.current) { clearTimeout(saveTimeout.current); saveTimeout.current = undefined; }\n    saveTimeout.current = setTimeout(() => {\n      validateAndSaveRef.current?.();\n      clearTimeout(saveTimeout.current);\n      saveTimeout.current = undefined;\n    }, saveTimeoutDelay?.current || 100);\n  }, []);\n\n  // Stable reference to avoid breaking downstream memoization. See audit P0-2.\n  // Uses only stable deps: `configName`, `fields`, and functions from RHF/context\n  // which are stable by contract. `effectiveManualSave` is a primitive.\n  const setFieldValue = React.useCallback((\n    fieldName: string,\n    fieldValue: unknown,\n    skipSave?: boolean,\n    timeout?: number\n  ) => {\n    saveTimeoutDelay.current = timeout;\n    setValue(`${fieldName}` as const, fieldValue, { shouldDirty: !skipSave });\n    trigger(fieldName);\n    processFieldChange(getValues(), configName, fieldName, fields);\n    if (!skipSave && !effectiveManualSave) { attemptSave(); }\n  }, [setValue, trigger, getValues, processFieldChange, configName, fields, effectiveManualSave, attemptSave]);\n\n  const manualSave = React.useCallback(() => { validateAndSaveRef.current?.(); }, []);\n\n  const saveConfirmInputFields = () => {\n    trigger().then((valid: boolean) => {\n      if (valid) { setInputFieldsConfirmed(true); attemptSave(); }\n    });\n  };\n\n  const handleComputedValues = (runtimeState?: IRuntimeFormState) => {\n    const { dirtyFields } = formState;\n    const cfg = runtimeState ?? rulesStateRef.current.configs[configName];\n    if (!cfg) return;\n    const computedValues = GetComputedValuesOnDirtyFields(Object.keys(dirtyFields), cfg.fieldStates);\n    if (computedValues.length > 0) {\n      computedValues.forEach(cv => {\n        const result = ExecuteComputedValue(cv.expression, getValues(), cv.fieldName);\n        setValue(`${cv.fieldName}` as const, result as unknown, { shouldDirty: true });\n        // Per audit P1-5: re-trigger validation and cascade rules that depend\n        // on this computed field so downstream validation / cross-field rules\n        // reflect the new value.\n        trigger(cv.fieldName);\n        processFieldChange(getValues(), configName, cv.fieldName, fields);\n      });\n    }\n  };\n\n  const focusFirstError = () => {\n    if (typeof document === \"undefined\") return;\n    const currentErrors = formStateRef.current.errors;\n    const errorFieldNames = Object.keys(currentErrors);\n    if (errorFieldNames.length > 0) {\n      const element = document.getElementById(errorFieldNames[0]) || document.querySelector<HTMLElement>(`[name=\"${errorFieldNames[0]}\"]`);\n      if (element && typeof element.focus === \"function\") element.focus();\n    }\n  };\n\n  const validateAndSave = () => {\n    const { dirtyFields } = formStateRef.current;\n    const currentRulesState = rulesStateRef.current;\n    const cfg = currentRulesState.configs[configName];\n    if (cfg?.fieldStates) {\n      Object.keys(cfg.fieldStates).forEach(fieldName => {\n        if (cfg.fieldStates[fieldName]?.hidden) clearErrors(fieldName);\n      });\n    }\n\n    setStatusMessage(FormStrings.validating);\n    trigger().then((valid: boolean) => {\n      if (!valid) {\n        setIsExpanded(true);\n        setStatusMessage(\"\");\n        (typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : setTimeout)(() => focusFirstError());\n      } else {\n        const newConfirmInputModalProps = confirmInputModalProps.current === undefined\n          ? GetConfirmInputModalProps(Object.keys(dirtyFields), cfg?.fieldStates ?? {})\n          : undefined;\n\n        if (newConfirmInputModalProps && !isEmpty(newConfirmInputModalProps.confirmInputsTriggeredBy) && (newConfirmInputModalProps.dependentFieldNames?.length ?? 0) > 0) {\n          confirmInputModalProps.current = newConfirmInputModalProps;\n          setInputFieldsConfirmed(false);\n          setStatusMessage(\"\");\n        } else if (dirtyFields && Object.keys(dirtyFields).length > 0) {\n          setStatusMessage(FormStrings.saving);\n          handleSubmit(handleSave)();\n          confirmInputModalProps.current = undefined;\n        } else {\n          setStatusMessage(\"\");\n        }\n      }\n    });\n  };\n  validateAndSaveRef.current = validateAndSave;\n\n  const handleSave = (data: IEntityData) => {\n    // Per audit P0-4: skip the save flow entirely when no saveData was\n    // supplied. Falling back to a noop resolver (returning `{}`) would cause\n    // handleDirtyFields to reset the form to an empty object, wiping edits.\n    if (!saveData) return;\n    if (saveAbortControllerRef.current) saveAbortControllerRef.current.abort();\n    const abortController = new AbortController();\n    saveAbortControllerRef.current = abortController;\n    const dirtyFieldNames = Object.keys(formStateRef.current.dirtyFields);\n\n    const saveWithTimeoutAndRetry = async (attempt: number): Promise<void> => {\n      if (abortController.signal.aborted) return;\n\n      // Abortable timeout: reject on either the configured timeout OR abort.\n      // Track the setTimeout handle so we can clear it on success (P2-23).\n      let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n      const timeoutPromise = new Promise<never>((_, reject) => {\n        timeoutHandle = setTimeout(\n          () => reject(new Error(FormStrings.saveTimeout)),\n          effectiveSaveTimeout\n        );\n        const onAbort = () => {\n          if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n          reject(new Error(\"aborted\"));\n        };\n        if (abortController.signal.aborted) onAbort();\n        else abortController.signal.addEventListener(\"abort\", onAbort, { once: true });\n      });\n\n      try {\n        // Forward the AbortSignal to the consumer's saveData as an optional\n        // third arg. Older consumers (2-arg) ignore it; new consumers can\n        // honor it to cancel in-flight network requests (P0-4).\n        const updatedEntity = await Promise.race([\n          (saveData as (\n            data: IEntityData,\n            dirtyFieldNames?: string[],\n            options?: { signal?: AbortSignal }\n          ) => Promise<IEntityData>)(data, dirtyFieldNames, { signal: abortController.signal }),\n          timeoutPromise,\n        ]);\n        // Clear the timeout immediately so the handle isn't leaked.\n        if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n        if (abortController.signal.aborted) return;\n        setStatusMessage(FormStrings.saved);\n        analytics.trackFormSubmit(data as Record<string, unknown>);\n        if (!isCreate) handleDirtyFields(updatedEntity, data);\n      } catch (error) {\n        if (timeoutHandle !== undefined) clearTimeout(timeoutHandle);\n        if (abortController.signal.aborted) return;\n        if (attempt < effectiveMaxRetries) {\n          const delay = Math.pow(2, attempt) * 1000;\n          // Abortable sleep between retries: new edits must not wait out a\n          // stale retry sleep (P0-4).\n          try {\n            await new Promise<void>((resolve, reject) => {\n              const sleepHandle = setTimeout(resolve, delay);\n              const onAbort = () => {\n                clearTimeout(sleepHandle);\n                reject(new Error(\"aborted\"));\n              };\n              if (abortController.signal.aborted) onAbort();\n              else abortController.signal.addEventListener(\"abort\", onAbort, { once: true });\n            });\n          } catch {\n            return; // aborted during sleep\n          }\n          if (abortController.signal.aborted) return;\n          return saveWithTimeoutAndRetry(attempt + 1);\n        }\n        setStatusMessage(FormStrings.saveFailed);\n        dirtyFieldNames.forEach(field => { setError(field, { type: \"custom\", message: FormStrings.saveError }); });\n        onSaveError?.(`${FormStrings.saveError}${error ? `: ${error}` : \"\"}`);\n      }\n    };\n    saveWithTimeoutAndRetry(0);\n  };\n\n  const handleDirtyFields = (entity: IEntityData, data: IEntityData) => {\n    const { dirtyFields } = formStateRef.current;\n    const stillDirtyFields: IEntityData = {};\n    Object.keys(dirtyFields).forEach(field => { stillDirtyFields[field] = getValues(field); });\n    // Per audit P0-4: if the consumer's saveData returns null/undefined, fall\n    // back to the submitted data so RHF reset() doesn't blow away in-progress\n    // edits.\n    const resetValue = (entity ?? data) as IEntityData;\n    reset(resetValue);\n    Object.keys(stillDirtyFields).forEach(field => {\n      if (JSON.stringify(stillDirtyFields[field]) !== JSON.stringify(data[field])) {\n        setFieldValue(field, stillDirtyFields[field], false, saveTimeoutDelay?.current);\n      }\n    });\n  };\n\n  // Feature 2: handleSubmit / Batch Submit Validation\n  // Triggers full RHF validation, calls onSubmit if valid, onSubmitError if invalid,\n  // and focuses the first invalid field.\n  const handleFormSubmit = React.useCallback(() => {\n    if (!onSubmitProp) return;\n    const cfg = rulesStateRef.current.configs[configName];\n    // Clear hidden-field errors before batch validation (mirrors validateAndSave behaviour)\n    if (cfg?.fieldStates) {\n      Object.keys(cfg.fieldStates).forEach(fieldName => {\n        if (cfg.fieldStates[fieldName]?.hidden) clearErrors(fieldName);\n      });\n    }\n    trigger().then((valid: boolean) => {\n      if (!valid) {\n        setIsExpanded(true);\n        (typeof requestAnimationFrame !== \"undefined\" ? requestAnimationFrame : setTimeout)(() => focusFirstError());\n        onSubmitError?.(formStateRef.current.errors);\n      } else {\n        const values = formMethods.getValues();\n        Promise.resolve(onSubmitProp(values)).catch(() => { /* consumer handles errors */ });\n      }\n    });\n  }, [onSubmitProp, onSubmitError, configName, trigger, clearErrors]);\n\n  const onFilterChange = React.useCallback((value: string) => {\n    if (filterTimeoutRef.current) clearTimeout(filterTimeoutRef.current);\n    filterTimeoutRef.current = setTimeout(() => setFilterText(value), 500);\n  }, []);\n\n  const cancelConfirmInputFields = () => {\n    const current = confirmInputModalProps.current;\n    if (current && current.otherDirtyFields && current.otherDirtyFields.length > 0) {\n      if (current.confirmInputsTriggeredBy) resetField(current.confirmInputsTriggeredBy);\n      if (current.dependentFieldNames) current.dependentFieldNames.forEach(n => resetField(n));\n      if (saveData) {\n        saveData(getValues(), current.otherDirtyFields).then(updatedEntity => initForm(updatedEntity ?? getValues()));\n      } else {\n        initForm(getValues());\n      }\n    } else {\n      reset();\n      initForm(getValues());\n    }\n    setInputFieldsConfirmed(true);\n    confirmInputModalProps.current = undefined;\n  };\n\n  const cutoff = expandEnabled && !isExpanded\n    ? (effectiveExpandCutoff ?? FormConstants.defaultExpandCutoffCount)\n    : undefined;\n\n  return (\n    <FormProvider {...formMethods}>\n      <div role=\"status\" aria-live=\"polite\" className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }} data-testid=\"form-status-live-region\">\n        {statusMessage}\n      </div>\n      {enableFilter && (\n        <div className=\"formosaic-filter\">\n          {renderFilterInput ? renderFilterInput({ onChange: onFilterChange }) : (\n            <input type=\"text\" placeholder={FormStrings.filterFields} aria-label={FormStrings.filterFields} onChange={(e) => onFilterChange(e.target.value)} className=\"formosaic-filter-input\" />\n          )}\n        </div>\n      )}\n      {formErrors && formErrors.length > 0 && (\n        <div className=\"form-errors\" role=\"alert\" style={{ color: \"var(--formosaic-error-color, #d13438)\", padding: \"8px\", marginBottom: \"8px\" }}>\n          {formErrors.map((err, i) => (<div key={i} className=\"form-error-item\">{err}</div>))}\n        </div>\n      )}\n      <div className=\"formosaic-form-wrapper\" data-formosaic-no-animations={formConfig?.settings?.animations === false || undefined}>\n        <FormFields\n          testId={testId}\n          isExpanded={isExpanded}\n          expandEnabled={expandEnabled}\n          fieldOrder={rulesState?.configs[configName]?.fieldOrder}\n          collapsedMaxHeight={collapsedMaxHeight}\n          formState={rulesState?.configs[configName]}\n          fields={fields}\n          setFieldValue={setFieldValue}\n          isManualSave={effectiveManualSave}\n          isCreate={isCreate}\n          filterText={filterText}\n          fieldRenderLimit={cutoff}\n          renderLabel={renderLabel}\n          renderError={renderError}\n          renderStatus={renderStatus}\n          analytics={analytics}\n        />\n        {expandEnabled && (\n          renderExpandButton ? renderExpandButton({ isExpanded, onToggle: () => setIsExpanded(!isExpanded) }) : (\n            <button className=\"expand-button\" onClick={() => setIsExpanded(!isExpanded)} aria-expanded={isExpanded} data-testid={`${testId ? testId + \"-\" : \"\"}expand-form`}>\n              {isExpanded ? FormStrings.seeLess : FormStrings.expand}\n            </button>\n          )\n        )}\n        {effectiveManualSave && (\n          renderSaveButton ? renderSaveButton({ onSave: manualSave, isDirty, isValid, isSubmitting }) : (\n            <div className=\"formosaic-save-actions\" style={{ marginTop: \"16px\", display: \"flex\", gap: \"8px\" }}>\n              <button type=\"button\" className=\"save-button\" onClick={manualSave} disabled={!isDirty || isSubmitting}>\n                {isCreate ? FormStrings.create : FormStrings.save}\n              </button>\n              <button type=\"button\" className=\"cancel-button\" onClick={() => { reset(); initForm(defaultValues); }} disabled={!isDirty || isSubmitting}>\n                {FormStrings.cancel}\n              </button>\n            </div>\n          )\n        )}\n        {onSubmitProp && (\n          renderSubmitButton ? renderSubmitButton({ onSubmit: handleFormSubmit, isDirty, isValid, isSubmitting }) : (\n            <div className=\"formosaic-submit-actions\" style={{ marginTop: \"16px\" }}>\n              <button type=\"button\" className=\"submit-button\" onClick={handleFormSubmit} disabled={isSubmitting}>\n                {FormStrings.save}\n              </button>\n            </div>\n          )\n        )}\n      </div>\n      <ConfirmInputsModal\n        isOpen={confirmInputModalProps !== undefined && !inputFieldsConfirmed}\n        configName={configName}\n        testId={testId}\n        fields={fields}\n        confirmInputFields={confirmInputModalProps?.current?.dependentFieldNames ?? []}\n        cancelConfirmInputFields={cancelConfirmInputFields}\n        saveConfirmInputFields={saveConfirmInputFields}\n        renderDialog={renderDialog}\n      />\n    </FormProvider>\n  );\n};\n\n","import { IFormTemplate } from \"../types/IFormTemplate\";\n\n/**\n * SSR / multi-tenant contract (audit P1-21):\n *\n * This module-level registry is a plugin registry: it is intended to be\n * populated ONCE at app boot (outside of any request handler) and then read\n * from at request time. Templates registered here are shared across all\n * requests served by the same Node process — do NOT call registerFormTemplate\n * from inside a per-request code path (route handler, Server Component render,\n * Server Action) unless the template is truly static for the whole deploy.\n *\n * Per-request template variation should be handled by passing a resolved\n * `IFormConfig` directly to <Formosaic> instead of relying on this registry.\n */\nlet registry: Record<string, IFormTemplate> = {};\n\nexport function registerFormTemplate<TParams extends Record<string, unknown> = Record<string, unknown>>(\n  name: string,\n  template: IFormTemplate<TParams>\n): void {\n  registry[name] = template;\n}\n\nexport function registerFormTemplates(templates: Record<string, IFormTemplate>): void {\n  for (const [name, template] of Object.entries(templates)) {\n    registry[name] = template;\n  }\n}\n\nexport function getFormTemplate(name: string): IFormTemplate | undefined {\n  return registry[name];\n}\n\nexport function resetFormTemplates(): void {\n  registry = {};\n}\n","/**\n * SSR / multi-tenant contract (audit P1-21):\n *\n * Plugin-style registry for static lookup tables referenced as\n * `$lookup.tableName` in template expressions. Populate ONCE at app boot;\n * values are shared across all requests served by the same Node process.\n * Do NOT register per-request / per-tenant lookup data here — pass it via\n * template params instead.\n */\nlet registry: Record<string, unknown> = {};\n\nexport function registerLookupTables(tables: Record<string, unknown>): void {\n  registry = { ...registry, ...tables };\n}\n\nexport function getLookupTable(name: string): unknown | undefined {\n  return registry[name];\n}\n\nexport function resetLookupTables(): void {\n  registry = {};\n}\n","/**\n * ExpressionInterpolator — lightweight template expression evaluator.\n *\n * Resolves `{{expression}}` strings at template resolution time.\n * Returns any JSON type (string, boolean, number, array, object).\n *\n * Supported syntax:\n * - `params.key`                          — param property access\n * - `$lookup.table.key`                   — lookup table dot access\n * - `$lookup.table[params.key]`           — lookup table bracket access with dynamic key\n * - `'string literal'`                    — single-quoted string literals\n * - `true` / `false`                      — boolean literals\n * - numeric literals                      — number literals\n * - `==` / `!=`                           — equality / inequality\n * - `condition ? trueExpr : falseExpr`   — ternary (right-associative, nestable)\n *\n * This is intentionally separate from ExpressionEngine.ts (which uses expr-eval\n * for runtime $values/$fn expressions). This module is CSP-safe and uses no eval.\n */\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Interpolate a single value.\n * - If `value` is a string matching `^{{...}}$`, evaluate the inner expression.\n * - Otherwise return `value` as-is (including non-strings).\n */\nexport function interpolate(\n  value: string,\n  params: Record<string, unknown>,\n  lookups: Record<string, unknown>\n): unknown {\n  if (typeof value !== \"string\") return value;\n\n  const trimmed = value.trim();\n  if (trimmed.startsWith(\"{{\") && trimmed.endsWith(\"}}\")) {\n    const expr = trimmed.slice(2, -2).trim();\n    return evaluateExpr(expr, params, lookups);\n  }\n\n  return value;\n}\n\n/**\n * Recursively walk an object or array, calling `interpolate` on every string\n * leaf value. Non-string leaves are left untouched.\n */\nexport function interpolateDeep(\n  obj: unknown,\n  params: Record<string, unknown>,\n  lookups: Record<string, unknown>\n): unknown {\n  if (Array.isArray(obj)) {\n    return obj.map((item) => interpolateDeep(item, params, lookups));\n  }\n  if (obj !== null && typeof obj === \"object\") {\n    const result: Record<string, unknown> = {};\n    for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\n      result[key] = interpolateDeep(val, params, lookups);\n    }\n    return result;\n  }\n  if (typeof obj === \"string\") {\n    return interpolate(obj, params, lookups);\n  }\n  return obj;\n}\n\n// ---------------------------------------------------------------------------\n// Expression evaluator (private)\n// ---------------------------------------------------------------------------\n\n/**\n * Evaluate a single expression string (no `{{ }}` wrappers).\n */\nfunction evaluateExpr(\n  expr: string,\n  params: Record<string, unknown>,\n  lookups: Record<string, unknown>\n): unknown {\n  expr = expr.trim();\n\n  // 1. Ternary: find the first `?` that is not inside single quotes\n  const qPos = findTernary(expr);\n  if (qPos !== -1) {\n    const condition = expr.slice(0, qPos).trim();\n    const rest = expr.slice(qPos + 1).trim();\n    // Find matching `:` (right-associative: skip nested ternaries)\n    const cPos = findColon(rest);\n    if (cPos !== -1) {\n      const trueBranch = rest.slice(0, cPos).trim();\n      const falseBranch = rest.slice(cPos + 1).trim();\n      const condResult = evaluateExpr(condition, params, lookups);\n      return condResult\n        ? evaluateExpr(trueBranch, params, lookups)\n        : evaluateExpr(falseBranch, params, lookups);\n    }\n  }\n\n  // 2. Equality / inequality: `left == right` or `left != right`\n  //    We scan right-to-left to catch the last occurrence (avoids false matches\n  //    inside string literals handled below, but simple scan is fine here since\n  //    we've already stripped ternary branches above).\n  const eqResult = tryParseEquality(expr, params, lookups);\n  if (eqResult !== undefined) return eqResult;\n\n  // 3. String literal: 'value'\n  if (expr.startsWith(\"'\") && expr.endsWith(\"'\")) {\n    return expr.slice(1, -1);\n  }\n\n  // 4. Boolean literals\n  if (expr === \"true\") return true;\n  if (expr === \"false\") return false;\n\n  // 5. Numeric literal\n  if (/^-?\\d+(\\.\\d+)?$/.test(expr)) return Number(expr);\n\n  // Per audit P0-7: the $lookup table-name segment comes from authored\n  // config and can be arbitrary. Refuse to traverse prototype-pollution\n  // keys, plus reject any bracket-derived subKey that hits them. Keys\n  // traversed by `getNestedValue` are already guarded.\n  const isPollutionKey = (k: string): boolean =>\n    k === \"__proto__\" || k === \"constructor\" || k === \"prototype\";\n\n  // 6. $lookup.table[params.key] — bracket access\n  const bracketMatch = /^\\$lookup\\.([a-zA-Z_][a-zA-Z0-9_]*)\\.([a-zA-Z_][a-zA-Z0-9_]*)\\[(.+)\\]$/.exec(expr);\n  if (bracketMatch) {\n    const [, tableName, subKey, bracketExpr] = bracketMatch;\n    if (isPollutionKey(tableName) || isPollutionKey(subKey)) return undefined;\n    const table = lookups[tableName] as Record<string, unknown> | undefined;\n    if (!table) return undefined;\n    const subTable = table[subKey] as Record<string, unknown> | undefined;\n    if (!subTable) return undefined;\n    const keyValue = evaluateExpr(bracketExpr.trim(), params, lookups);\n    const bracketKey = String(keyValue);\n    if (isPollutionKey(bracketKey)) return undefined;\n    return subTable[bracketKey];\n  }\n\n  // Also handle $lookup.table[params.key] without an intermediate subkey\n  const bracketTopMatch = /^\\$lookup\\.([a-zA-Z_][a-zA-Z0-9_]*)\\[(.+)\\]$/.exec(expr);\n  if (bracketTopMatch) {\n    const [, tableName, bracketExpr] = bracketTopMatch;\n    if (isPollutionKey(tableName)) return undefined;\n    const table = lookups[tableName] as Record<string, unknown> | undefined;\n    if (!table) return undefined;\n    const keyValue = evaluateExpr(bracketExpr.trim(), params, lookups);\n    const bracketKey = String(keyValue);\n    if (isPollutionKey(bracketKey)) return undefined;\n    return (table as Record<string, unknown>)[bracketKey];\n  }\n\n  // 7. $lookup.table.key — dot access (may have multiple segments)\n  if (expr.startsWith(\"$lookup.\")) {\n    const path = expr.slice(\"$lookup.\".length); // e.g. \"stateOptions.US\"\n    const parts = path.split(\".\");\n    const [tableName, ...rest] = parts;\n    if (isPollutionKey(tableName)) return undefined;\n    const table = lookups[tableName];\n    if (table === undefined) return undefined;\n    return getNestedValue(table as Record<string, unknown>, rest.join(\".\"));\n  }\n\n  // 8. params.key — dot access on params\n  if (expr.startsWith(\"params.\")) {\n    const path = expr.slice(\"params.\".length);\n    return getNestedValue(params, path);\n  }\n\n  // Unknown expression — return undefined\n  return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Equality / inequality parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Attempt to parse `left == right` or `left != right` at the top level.\n * Returns the boolean result, or `undefined` if the expression does not\n * contain a top-level equality operator.\n */\nfunction tryParseEquality(\n  expr: string,\n  params: Record<string, unknown>,\n  lookups: Record<string, unknown>\n): boolean | undefined {\n  // Scan for `==` or `!=` outside single-quoted strings\n  let inString = false;\n  for (let i = 0; i < expr.length - 1; i++) {\n    const ch = expr[i];\n    if (ch === \"'\" && !inString) { inString = true; continue; }\n    if (ch === \"'\" && inString) { inString = false; continue; }\n    if (inString) continue;\n\n    if (expr[i] === \"!\" && expr[i + 1] === \"=\") {\n      const left = evaluateExpr(expr.slice(0, i).trim(), params, lookups);\n      const right = evaluateExpr(expr.slice(i + 2).trim(), params, lookups);\n      return left !== right;\n    }\n    if (expr[i] === \"=\" && expr[i + 1] === \"=\") {\n      const left = evaluateExpr(expr.slice(0, i).trim(), params, lookups);\n      const right = evaluateExpr(expr.slice(i + 2).trim(), params, lookups);\n      return left === right;\n    }\n  }\n  return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Ternary helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Find the index of the first `?` in `expr` that is not inside single quotes.\n * Returns -1 if not found.\n */\nfunction findTernary(expr: string): number {\n  let inString = false;\n  for (let i = 0; i < expr.length; i++) {\n    const ch = expr[i];\n    if (ch === \"'\" && !inString) { inString = true; continue; }\n    if (ch === \"'\" && inString) { inString = false; continue; }\n    if (!inString && ch === \"?\") return i;\n  }\n  return -1;\n}\n\n/**\n * Find the index of the `:` that separates the true-branch from the\n * false-branch of a ternary, in the string `rest` (the part after `?`).\n *\n * We must handle right-associative nesting: the `:` we want is the one\n * matching the outermost ternary, not a nested one. We track nesting depth\n * by counting unquoted `?` characters (each one requires one `:` to close).\n */\nfunction findColon(rest: string): number {\n  let inString = false;\n  let depth = 0; // number of unmatched `?` characters seen so far\n  for (let i = 0; i < rest.length; i++) {\n    const ch = rest[i];\n    if (ch === \"'\" && !inString) { inString = true; continue; }\n    if (ch === \"'\" && inString) { inString = false; continue; }\n    if (inString) continue;\n    if (ch === \"?\") { depth++; continue; }\n    if (ch === \":\") {\n      if (depth === 0) return i;\n      depth--;\n    }\n  }\n  return -1;\n}\n\n// ---------------------------------------------------------------------------\n// Property access helper\n// ---------------------------------------------------------------------------\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n  if (!path) return obj;\n  const parts = path.split(\".\");\n  let current: unknown = obj;\n  for (const part of parts) {\n    if (current === null || current === undefined) return undefined;\n    // Per audit P0-10: refuse to traverse prototype-pollution keys. Without\n    // this, a malicious params object could reach Object.prototype or the\n    // constructor function via e.g. `{{params.__proto__.polluted}}`.\n    if (part === \"__proto__\" || part === \"constructor\" || part === \"prototype\") return undefined;\n    current = (current as Record<string, unknown>)[part];\n  }\n  return current;\n}\n","/**\n * TemplateResolver — 11-step resolution pipeline.\n *\n * Transforms an IFormConfig containing templateRef fields into a flat\n * IResolvedFormConfig with no template references remaining. The output\n * is a standard IFormConfig that the existing rules engine can consume.\n *\n * Pipeline steps:\n *  1. Collect     — Walk config tree, find all templateRef nodes\n *  2. Params      — Evaluate {{expression}} strings against params + $lookup tables\n *  3. Expand      — Replace templateRef node with template's fields, prefixed by field name\n *  4. Override    — Apply templateOverrides (shallow merge) and defaultValues\n *  5. Recurse     — If expanded fields contain templateRef, repeat (with cycle detection)\n *  6. Rewrite     — Prefix internal rule field references to match resolved paths\n *  7. Scope       — Rewrite $values references in expressions to use prefixed paths\n *  8. Merge ports — Collect port declarations, rewrite to prefixed paths\n *  9. Wizard      — Expand wizard step `fragments` arrays to resolved field name lists\n * 10. Attach meta — Build _templateMeta mapping for DevTools (dev mode only)\n * 11. Output      — Standard IFormConfig with no template references remaining\n */\n\nimport { IFormConfig } from \"../types/IFormConfig\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IFormTemplate, ITemplateFieldRef, isTemplateFieldRef } from \"../types/IFormTemplate\";\nimport { IResolvedFormConfig, IResolvedFieldMeta, ITemplateMeta } from \"../types/IResolvedFormConfig\";\nimport { IRule } from \"../types/IRule\";\nimport { ICondition, IFieldCondition, isLogicalCondition } from \"../types/ICondition\";\nimport { IFieldEffect } from \"../types/IFieldEffect\";\nimport { getFormTemplate } from \"./TemplateRegistry\";\nimport { getLookupTable } from \"./LookupRegistry\";\nimport { interpolateDeep } from \"./ExpressionInterpolator\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface IResolveOptions {\n  /** Additional templates merged with global registry and config.templates. */\n  templates?: Record<string, IFormTemplate>;\n  /** Additional lookups merged with global registry and config.lookups. */\n  lookups?: Record<string, unknown>;\n  /** Maximum template nesting depth. Default: 10. */\n  maxDepth?: number;\n}\n\n/**\n * Resolve all template references in a form config, producing a flat\n * IResolvedFormConfig with no templateRef fields remaining.\n */\nexport function resolveTemplates(\n  config: IFormConfig,\n  options?: IResolveOptions\n): IResolvedFormConfig {\n  const maxDepth = options?.maxDepth ?? 10;\n\n  // Build merged template registry: global -> config.templates -> options.templates\n  const mergedTemplates: Record<string, IFormTemplate> = {};\n  // Pull from global registry by trying to look up inline/config templates later\n  // We store inline + option templates here; global is accessed via getFormTemplate\n  if (config.templates) {\n    safeMerge(mergedTemplates, config.templates);\n  }\n  if (options?.templates) {\n    safeMerge(mergedTemplates, options.templates);\n  }\n\n  // Build merged lookup tables: global -> config.lookups -> options.lookups\n  const mergedLookups: Record<string, unknown> = {};\n  if (config.lookups) {\n    safeMerge(mergedLookups, config.lookups);\n  }\n  if (options?.lookups) {\n    safeMerge(mergedLookups, options.lookups);\n  }\n\n  // Resolution context\n  const ctx: IResolutionContext = {\n    mergedTemplates,\n    mergedLookups,\n    maxDepth,\n    templateMeta: {},\n    resolvedPorts: {},\n    // Track which resolved field names belong to which fragment prefix\n    fragmentFields: {} as Record<string, string[]>,\n    // Track template fieldOrder per fragment\n    fragmentFieldOrders: {} as Record<string, string[]>,\n    // Track template wizard configs per fragment\n    fragmentWizards: {},\n    // Track field metadata for _fieldMeta\n    fieldMeta: {},\n  };\n\n  // Step 1-5: Expand all fields (recursive)\n  const resolvedFields: Record<string, IFieldConfig> = {};\n  for (const [fieldName, fieldDef] of Object.entries(config.fields)) {\n    if (isTemplateFieldRef(fieldDef)) {\n      expandTemplateRef(\n        fieldName,\n        fieldDef,\n        resolvedFields,\n        ctx,\n        [],   // resolution stack for cycle detection\n        0     // current depth\n      );\n    } else {\n      resolvedFields[fieldName] = { ...fieldDef };\n      // Issue 5: Populate _fieldMeta for direct (non-template) fields\n      ctx.fieldMeta[fieldName] = { source: \"direct\" };\n    }\n  }\n\n  // Step 6-7 already done during expansion (rules rewritten in expandTemplateRef)\n\n  // Step 8: fieldOrder expansion\n  let resolvedFieldOrder = config.fieldOrder;\n  if (resolvedFieldOrder) {\n    resolvedFieldOrder = expandFieldOrder(resolvedFieldOrder, ctx);\n  }\n\n  // Step 9: Wizard fragment expansion\n  let resolvedWizard = config.wizard;\n  if (resolvedWizard) {\n    resolvedWizard = expandWizardFragments(resolvedWizard, ctx);\n  }\n\n  // Step 10-11: Build output\n  const result: IResolvedFormConfig = {\n    ...config,\n    fields: resolvedFields,\n  };\n\n  if (resolvedFieldOrder) {\n    result.fieldOrder = resolvedFieldOrder;\n  }\n\n  if (resolvedWizard) {\n    result.wizard = resolvedWizard;\n  }\n\n  // Attach template meta (always — useful for DevTools)\n  if (Object.keys(ctx.templateMeta).length > 0) {\n    result._templateMeta = ctx.templateMeta;\n  }\n\n  // Attach resolved ports\n  if (Object.keys(ctx.resolvedPorts).length > 0) {\n    result._resolvedPorts = ctx.resolvedPorts;\n  }\n\n  // Issue 5: Attach field metadata\n  if (Object.keys(ctx.fieldMeta).length > 0) {\n    result._fieldMeta = ctx.fieldMeta;\n  }\n\n  return result;\n}\n\n// ---------------------------------------------------------------------------\n// Error types (Issue 6)\n// ---------------------------------------------------------------------------\n\nexport type TemplateErrorType =\n  | \"template_not_found\"\n  | \"template_cycle\"\n  | \"template_max_depth\";\n\n/**\n * Structured error for template resolution failures.\n * Mirrors the IConfigValidationError pattern from ConfigValidator.\n */\nexport class TemplateResolutionError extends Error {\n  public readonly type: TemplateErrorType;\n  public readonly fieldName: string;\n  public readonly details?: string;\n\n  constructor(type: TemplateErrorType, fieldName: string, message: string, details?: string) {\n    super(message);\n    this.name = \"TemplateResolutionError\";\n    this.type = type;\n    this.fieldName = fieldName;\n    this.details = details;\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface IResolutionContext {\n  mergedTemplates: Record<string, IFormTemplate>;\n  mergedLookups: Record<string, unknown>;\n  maxDepth: number;\n  templateMeta: ITemplateMeta;\n  resolvedPorts: Record<string, string[]>;\n  fragmentFields: Record<string, string[]>;\n  fragmentFieldOrders: Record<string, string[]>;\n  /** Track which fragments came from templates with sub-wizard configs. */\n  fragmentWizards: Record<string, IFormTemplate[\"wizard\"]>;\n  /** Track field metadata for _fieldMeta. */\n  fieldMeta: Record<string, IResolvedFieldMeta>;\n}\n\n// ---------------------------------------------------------------------------\n// Core expansion logic (Steps 1-7)\n// ---------------------------------------------------------------------------\n\nfunction lookupTemplate(name: string, prefix: string, ctx: IResolutionContext): IFormTemplate {\n  // Inline/options templates take precedence over global registry\n  const tmpl = ctx.mergedTemplates[name] ?? getFormTemplate(name);\n  if (!tmpl) {\n    throw new TemplateResolutionError(\n      \"template_not_found\",\n      prefix,\n      `Template \"${name}\" not found. Ensure it is registered via registerFormTemplate() ` +\n      `or provided inline in config.templates.`,\n      name\n    );\n  }\n  return tmpl;\n}\n\nfunction expandTemplateRef(\n  prefix: string,\n  ref: ITemplateFieldRef,\n  output: Record<string, IFieldConfig>,\n  ctx: IResolutionContext,\n  resolutionStack: string[],\n  depth: number\n): void {\n  // Cycle detection\n  if (resolutionStack.includes(ref.templateRef)) {\n    throw new TemplateResolutionError(\n      \"template_cycle\",\n      prefix,\n      `Cycle detected in template resolution: ${[...resolutionStack, ref.templateRef].join(\" -> \")}. ` +\n      `Templates cannot reference each other in a circular chain.`,\n      [...resolutionStack, ref.templateRef].join(\" -> \")\n    );\n  }\n\n  // Max depth check\n  if (depth >= ctx.maxDepth) {\n    throw new TemplateResolutionError(\n      \"template_max_depth\",\n      prefix,\n      `Maximum template resolution depth (${ctx.maxDepth}) exceeded at \"${prefix}\". ` +\n      `This usually indicates deeply nested or recursive templates.`,\n      String(ctx.maxDepth)\n    );\n  }\n\n  const template = lookupTemplate(ref.templateRef, prefix, ctx);\n\n  // Step 2: Resolve params (merge provided params with template param defaults)\n  const resolvedParams = resolveParams(template, ref.templateParams ?? {});\n\n  // Build merged lookups (global + inline)\n  const lookups = buildLookups(ctx);\n\n  // Warn on missing lookup references in template fields\n  warnMissingLookups(template, lookups);\n\n  // Deep-clone and interpolate template fields with resolved params\n  const interpolatedFields = interpolateDeep(\n    deepClone(template.fields),\n    resolvedParams,\n    lookups\n  ) as Record<string, IFieldConfig | ITemplateFieldRef>;\n\n  // Track which field names belong to this fragment\n  const fragmentFieldNames: string[] = [];\n\n  // Step 3-5: Expand each field, applying prefix\n  for (const [localName, fieldDef] of Object.entries(interpolatedFields)) {\n    const prefixedName = `${prefix}.${localName}`;\n\n    if (isTemplateFieldRef(fieldDef)) {\n      // Recurse for nested template refs\n      expandTemplateRef(\n        prefixedName,\n        fieldDef,\n        output,\n        ctx,\n        [...resolutionStack, ref.templateRef],\n        depth + 1\n      );\n      // Include nested fragment's resolved fields in the parent fragment's field list\n      const nestedFields = ctx.fragmentFields[prefixedName];\n      if (nestedFields) {\n        fragmentFieldNames.push(...nestedFields);\n      }\n    } else {\n      let resolvedField: IFieldConfig = { ...fieldDef };\n\n      // Step 4: Apply templateOverrides\n      if (ref.templateOverrides && ref.templateOverrides[localName]) {\n        resolvedField = { ...resolvedField, ...ref.templateOverrides[localName] };\n      }\n\n      // Step 4: Apply defaultValues\n      if (ref.defaultValues && localName in ref.defaultValues) {\n        resolvedField.defaultValue = ref.defaultValues[localName];\n      }\n\n      // Step 7: Rewrite $values references in computedValue\n      if (resolvedField.computedValue) {\n        resolvedField.computedValue = rewriteExpressionScope(\n          resolvedField.computedValue,\n          prefix,\n          new Set(Object.keys(interpolatedFields))\n        );\n      }\n\n      output[prefixedName] = resolvedField;\n      fragmentFieldNames.push(prefixedName);\n\n      // Step 10: Build template meta\n      ctx.templateMeta[prefixedName] = {\n        template: ref.templateRef,\n        fragment: prefix,\n        originalName: localName,\n      };\n\n      // Issue 5: Populate _fieldMeta for template-sourced fields\n      ctx.fieldMeta[prefixedName] = {\n        source: \"template\",\n        fragmentPrefix: prefix,\n        templateName: ref.templateRef,\n      };\n    }\n  }\n\n  // Track fragment fields for wizard/fieldOrder expansion\n  ctx.fragmentFields[prefix] = fragmentFieldNames;\n\n  // Track template's fieldOrder for this fragment\n  if (template.fieldOrder) {\n    ctx.fragmentFieldOrders[prefix] = template.fieldOrder.map(f => `${prefix}.${f}`);\n  }\n\n  // Track template's wizard config for sub-wizard inline/nested expansion\n  if (template.wizard) {\n    ctx.fragmentWizards[prefix] = template.wizard;\n  }\n\n  // Step 6: Rewrite template-level rules and attach to first resolved field\n  if (template.rules && template.rules.length > 0) {\n    const localFieldNames = new Set(Object.keys(interpolatedFields));\n    const rewrittenRules = template.rules.map(rule =>\n      rewriteRule(deepClone(rule) as IRule, prefix, localFieldNames)\n    );\n\n    // Attach rules to the first field in the resolved output for this fragment\n    const firstFieldKey = fragmentFieldNames[0];\n    if (firstFieldKey && output[firstFieldKey]) {\n      const existing = output[firstFieldKey].rules ?? [];\n      output[firstFieldKey].rules = [...existing, ...rewrittenRules];\n    }\n  }\n\n  // Step 8: Merge ports with prefixed paths\n  if (template.ports) {\n    for (const [portName, portFields] of Object.entries(template.ports)) {\n      const prefixedPortName = `${prefix}.${portName}`;\n      ctx.resolvedPorts[prefixedPortName] = portFields.map(f => `${prefix}.${f}`);\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Param resolution (Step 2)\n// ---------------------------------------------------------------------------\n\nfunction resolveParams(\n  template: IFormTemplate,\n  providedParams: Record<string, unknown>\n): Record<string, unknown> {\n  const resolved: Record<string, unknown> = { ...providedParams };\n\n  if (template.params) {\n    for (const [paramName, schema] of Object.entries(template.params)) {\n      if (!(paramName in resolved) && schema.default !== undefined) {\n        resolved[paramName] = schema.default;\n      }\n    }\n  }\n\n  return resolved;\n}\n\n// ---------------------------------------------------------------------------\n// Lookup building\n// ---------------------------------------------------------------------------\n\nfunction buildLookups(ctx: IResolutionContext): Record<string, unknown> {\n  // Start with global registry lookups, then overlay merged (inline + options)\n  const result: Record<string, unknown> = {};\n\n  // We can't enumerate the global lookup registry, but merged already has\n  // config.lookups + options.lookups. Global lookups are accessed via getLookupTable()\n  // in the interpolator. However, our interpolateDeep passes lookups directly,\n  // so we need to include anything from the global registry that might be needed.\n  // Since we can't enumerate, we rely on the merged set.\n  safeMerge(result, ctx.mergedLookups);\n\n  return result;\n}\n\n// ---------------------------------------------------------------------------\n// Missing lookup warnings\n// ---------------------------------------------------------------------------\n\nfunction warnMissingLookups(\n  template: IFormTemplate,\n  lookups: Record<string, unknown>\n): void {\n  // Scan template fields for $lookup references and warn if lookup table is missing\n  const fieldsJson = JSON.stringify(template.fields);\n  const lookupRefs = fieldsJson.match(/\\$lookup\\.([a-zA-Z_][a-zA-Z0-9_]*)/g);\n  if (lookupRefs) {\n    const seen = new Set<string>();\n    for (const ref of lookupRefs) {\n      const tableName = ref.slice(\"$lookup.\".length);\n      if (!seen.has(tableName) && !(tableName in lookups)) {\n        // Check global registry as well\n        if (getLookupTable(tableName) === undefined) {\n          console.warn(\n            `[Formosaic] Lookup table \"${tableName}\" referenced in template but not found ` +\n            `in config.lookups or global lookup registry.`\n          );\n        }\n        seen.add(tableName);\n      }\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Rule rewriting (Step 6)\n// ---------------------------------------------------------------------------\n\nfunction rewriteRule(\n  rule: IRule,\n  prefix: string,\n  localFields: Set<string>\n): IRule {\n  return {\n    ...rule,\n    when: rewriteCondition(rule.when, prefix, localFields),\n    then: rewriteEffect(rule.then, prefix, localFields),\n    ...(rule.else ? { else: rewriteEffect(rule.else, prefix, localFields) } : {}),\n  };\n}\n\nfunction rewriteCondition(\n  condition: ICondition,\n  prefix: string,\n  localFields: Set<string>\n): ICondition {\n  if (isLogicalCondition(condition)) {\n    return {\n      ...condition,\n      conditions: condition.conditions.map(c =>\n        rewriteCondition(c, prefix, localFields)\n      ),\n    };\n  }\n\n  // Field condition\n  const fc = condition as IFieldCondition;\n  return {\n    ...fc,\n    field: rewriteFieldRef(fc.field, prefix, localFields),\n  };\n}\n\nfunction rewriteEffect(\n  effect: IFieldEffect,\n  prefix: string,\n  localFields: Set<string>\n): IFieldEffect {\n  const rewritten: IFieldEffect = { ...effect };\n\n  // Rewrite the `fields` map keys (cross-field effects)\n  if (effect.fields) {\n    const newFields: Record<string, IFieldEffect> = {};\n    for (const [fieldName, fieldEffect] of Object.entries(effect.fields)) {\n      const rewrittenKey = rewriteFieldRef(fieldName, prefix, localFields);\n      newFields[rewrittenKey] = rewriteEffect(fieldEffect, prefix, localFields);\n    }\n    rewritten.fields = newFields;\n  }\n\n  // Rewrite computedValue expression scope\n  if (effect.computedValue) {\n    rewritten.computedValue = rewriteExpressionScope(\n      effect.computedValue,\n      prefix,\n      localFields\n    );\n  }\n\n  return rewritten;\n}\n\n/**\n * Rewrite a field name reference:\n * - `$root.X` -> strip $root. prefix (root-level reference)\n * - local field name (exists in template) -> prefix it\n * - Unknown -> leave as-is (could be a root-level field)\n */\nfunction rewriteFieldRef(\n  fieldName: string,\n  prefix: string,\n  localFields: Set<string>\n): string {\n  // $root.X -> X (root-level field reference)\n  if (fieldName.startsWith(\"$root.\")) {\n    return fieldName.slice(\"$root.\".length);\n  }\n\n  // Local field -> prefix it\n  if (localFields.has(fieldName)) {\n    return `${prefix}.${fieldName}`;\n  }\n\n  // Unknown field — return as-is (may be a root-level field)\n  return fieldName;\n}\n\n// ---------------------------------------------------------------------------\n// Expression scope rewriting (Step 7)\n// ---------------------------------------------------------------------------\n\n/**\n * Rewrite $values.X references in an expression string.\n * - If X is a local template field, rewrite to $values.{prefix}.X\n * - If X starts with $root., rewrite to $values.{rest} (strip $root.)\n * - Otherwise leave as-is\n */\nfunction rewriteExpressionScope(\n  expression: string,\n  prefix: string,\n  localFields: Set<string>\n): string {\n  // Match $values.something (dot-path after $values.)\n  return expression.replace(\n    /\\$values\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n    (_match, path: string) => {\n      // $values.$root.X -> $values.X\n      if (path.startsWith(\"$root.\")) {\n        return `$values.${path.slice(\"$root.\".length)}`;\n      }\n\n      // Extract the first segment of the path (e.g., \"qty\" from \"qty.sub\")\n      const firstSegment = path.split(\".\")[0];\n\n      // If the first segment is a local field, prefix it\n      if (localFields.has(firstSegment)) {\n        return `$values.${prefix}.${path}`;\n      }\n\n      // Otherwise leave as-is (root-level reference)\n      return `$values.${path}`;\n    }\n  );\n}\n\n// ---------------------------------------------------------------------------\n// fieldOrder expansion (Step 8 of output)\n// ---------------------------------------------------------------------------\n\nfunction expandFieldOrder(\n  fieldOrder: string[],\n  ctx: IResolutionContext\n): string[] {\n  const expanded: string[] = [];\n  for (const entry of fieldOrder) {\n    // If entry is a fragment prefix, expand to the template's field order\n    if (ctx.fragmentFieldOrders[entry]) {\n      expanded.push(...ctx.fragmentFieldOrders[entry]);\n    } else if (ctx.fragmentFields[entry]) {\n      // Fragment exists but no explicit fieldOrder — use the fragment's field list\n      expanded.push(...ctx.fragmentFields[entry]);\n    } else {\n      // Regular field name, keep as-is\n      expanded.push(entry);\n    }\n  }\n  return expanded;\n}\n\n// ---------------------------------------------------------------------------\n// Wizard fragment expansion (Step 9)\n// ---------------------------------------------------------------------------\n\nfunction expandWizardFragments(\n  wizard: IFormConfig[\"wizard\"],\n  ctx: IResolutionContext\n): IFormConfig[\"wizard\"] {\n  if (!wizard) return wizard;\n\n  const expandedSteps: typeof wizard.steps = [];\n\n  for (const step of wizard.steps) {\n    if (!step.fragments || step.fragments.length === 0) {\n      expandedSteps.push(step);\n      continue;\n    }\n\n    // Check if any fragment has a sub-wizard AND the step uses \"inline\" mode\n    const mode = step.fragmentWizardMode ?? \"inline\";\n\n    if (mode === \"inline\") {\n      // Check if any fragment has a sub-wizard to inline\n      const hasSubWizard = step.fragments.some(f => ctx.fragmentWizards[f]);\n\n      if (hasSubWizard) {\n        // Inline mode: replace this step with flattened sub-wizard steps\n        // First, collect any direct fields on the step (they go into a preamble step or first sub-step)\n        const directFields = [...(step.fields ?? [])];\n        // Also collect fields from fragments that have NO sub-wizard\n        const nonWizardFragmentFields: string[] = [];\n\n        for (const fragment of step.fragments) {\n          const subWizard = ctx.fragmentWizards[fragment];\n          if (subWizard) {\n            // Flatten sub-wizard steps into the outer wizard\n            for (const subStep of subWizard.steps) {\n              const subFields: string[] = [];\n              // Map sub-step fields to prefixed names\n              if (subStep.fields) {\n                for (const f of subStep.fields) {\n                  subFields.push(`${fragment}.${f}`);\n                }\n              }\n              // Expand sub-step fragments if any\n              if (subStep.fragments) {\n                for (const subFrag of subStep.fragments) {\n                  const prefixedFrag = `${fragment}.${subFrag}`;\n                  const fragFields = ctx.fragmentFields[prefixedFrag];\n                  if (fragFields) {\n                    subFields.push(...fragFields);\n                  }\n                }\n              }\n              expandedSteps.push({\n                id: `${fragment}.${subStep.id}`,\n                title: `${fragment} - ${subStep.title}`,\n                ...(subStep.description && { description: subStep.description }),\n                fields: subFields,\n                ...(subStep.visibleWhen && { visibleWhen: subStep.visibleWhen }),\n              });\n            }\n          } else {\n            // No sub-wizard — collect fields normally\n            const fragmentFieldNames = ctx.fragmentFields[fragment];\n            if (fragmentFieldNames) {\n              nonWizardFragmentFields.push(...fragmentFieldNames);\n            }\n          }\n        }\n\n        // If there are direct fields or non-wizard fragment fields, include them in a step\n        if (directFields.length > 0 || nonWizardFragmentFields.length > 0) {\n          expandedSteps.push({\n            ...step,\n            fields: [...directFields, ...nonWizardFragmentFields],\n          });\n        }\n        continue;\n      }\n    }\n\n    // \"nested\" mode or no sub-wizards: expand fragments to field lists (treat as single step)\n    const expandedFields: string[] = [...(step.fields ?? [])];\n    for (const fragment of step.fragments) {\n      const fragmentFieldNames = ctx.fragmentFields[fragment];\n      if (fragmentFieldNames) {\n        expandedFields.push(...fragmentFieldNames);\n      }\n    }\n\n    expandedSteps.push({\n      ...step,\n      fields: expandedFields,\n    });\n  }\n\n  return {\n    ...wizard,\n    steps: expandedSteps,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction deepClone<T>(obj: T): T {\n  return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Merge source keys into target, excluding prototype-pollution keys\n * (__proto__, constructor, prototype). See audit P0-10.\n */\nfunction safeMerge<T extends Record<string, unknown>>(\n  target: T,\n  source: Record<string, unknown>\n): void {\n  for (const key of Object.keys(source)) {\n    if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n    (target as Record<string, unknown>)[key] = source[key];\n  }\n}\n","import { useRef, useMemo } from \"react\";\nimport { IAnalyticsCallbacks } from \"../types/IAnalyticsCallbacks\";\n\n/**\n * Stable wrapper functions for analytics callbacks.\n * Each function is a no-op when the corresponding callback is not provided.\n */\nexport interface IFormAnalytics {\n  trackFieldFocus: (fieldName: string) => void;\n  trackFieldBlur: (fieldName: string) => void;\n  trackFieldChange: (fieldName: string, oldValue: unknown, newValue: unknown) => void;\n  trackValidationError: (fieldName: string, errors: string[]) => void;\n  trackFormSubmit: (values: Record<string, unknown>) => void;\n  trackFormAbandonment: (filledFields: string[], emptyRequiredFields: string[]) => void;\n  trackWizardStepChange: (fromStep: number, toStep: number) => void;\n  trackRuleTriggered: (event: { fieldName: string; ruleIndex: number; conditionMet: boolean }) => void;\n  /** Timestamp (ms) when the hook was first created -- used for form duration. */\n  formStartTime: number;\n}\n\n/**\n * Hook that wraps IAnalyticsCallbacks into safe, memoized wrapper functions.\n * Tracks form start time for duration calculations and per-field focus times.\n */\nexport function useFormAnalytics(callbacks?: IAnalyticsCallbacks): IFormAnalytics {\n  const formStartTime = useRef(Date.now()).current;\n  const focusTimes = useRef<Record<string, number>>({});\n  const callbacksRef = useRef(callbacks);\n  callbacksRef.current = callbacks;\n\n  return useMemo<IFormAnalytics>(() => ({\n    formStartTime,\n\n    trackFieldFocus(fieldName: string) {\n      focusTimes.current[fieldName] = Date.now();\n      callbacksRef.current?.onFieldFocus?.(fieldName);\n    },\n\n    trackFieldBlur(fieldName: string) {\n      const start = focusTimes.current[fieldName];\n      const timeSpentMs = start ? Date.now() - start : 0;\n      delete focusTimes.current[fieldName];\n      callbacksRef.current?.onFieldBlur?.(fieldName, timeSpentMs);\n    },\n\n    trackFieldChange(fieldName: string, oldValue: unknown, newValue: unknown) {\n      callbacksRef.current?.onFieldChange?.(fieldName, oldValue, newValue);\n    },\n\n    trackValidationError(fieldName: string, errors: string[]) {\n      callbacksRef.current?.onValidationError?.(fieldName, errors);\n    },\n\n    trackFormSubmit(values: Record<string, unknown>) {\n      const durationMs = Date.now() - formStartTime;\n      callbacksRef.current?.onFormSubmit?.(values, durationMs);\n    },\n\n    trackFormAbandonment(filledFields: string[], emptyRequiredFields: string[]) {\n      callbacksRef.current?.onFormAbandonment?.(filledFields, emptyRequiredFields);\n    },\n\n    trackWizardStepChange(fromStep: number, toStep: number) {\n      callbacksRef.current?.onWizardStepChange?.(fromStep, toStep);\n    },\n\n    trackRuleTriggered(event: { fieldName: string; ruleIndex: number; conditionMet: boolean }) {\n      callbacksRef.current?.onRuleTriggered?.(event);\n    },\n  }), [formStartTime]);\n}\n","import React from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { UseRulesEngineContext } from \"../providers/RulesEngineProvider\";\nimport { FormStrings } from \"../strings\";\nimport RenderField from \"./RenderField\";\n\ninterface IConfirmInputsModalProps {\n  isOpen?: boolean;\n  configName: string;\n  testId?: string;\n  fields: Record<string, IFieldConfig>;\n  confirmInputFields: string[];\n  saveConfirmInputFields: () => void;\n  cancelConfirmInputFields: () => void;\n  renderDialog?: (props: { isOpen: boolean; onSave: () => void; onCancel: () => void; children: React.ReactNode }) => React.JSX.Element;\n}\n\nfunction getFocusableElements(container: HTMLElement): HTMLElement[] {\n  const selector = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n  return Array.from(container.querySelectorAll<HTMLElement>(selector));\n}\n\nconst ConfirmInputsModal = (props: IConfirmInputsModalProps) => {\n  const {\n    isOpen, configName, testId,\n    fields, confirmInputFields, saveConfirmInputFields,\n    cancelConfirmInputFields, renderDialog,\n  } = props;\n\n  const { setValue, trigger } = useFormContext();\n  const { rulesState } = UseRulesEngineContext();\n\n  const dialogRef = React.useRef<HTMLDialogElement>(null);\n  const previouslyFocusedRef = React.useRef<Element | null>(null);\n  const saveButtonRef = React.useRef<HTMLButtonElement>(null);\n\n  React.useEffect(() => {\n    if (isOpen && dialogRef.current && !dialogRef.current.open) {\n      previouslyFocusedRef.current = document.activeElement;\n      dialogRef.current.showModal();\n      saveButtonRef.current?.focus();\n    } else if (!isOpen && dialogRef.current?.open) {\n      dialogRef.current.close();\n      // The previously focused element may have been removed from the DOM\n      // while the modal was open (e.g. a rule hid its field) — focusing a\n      // detached element is a silent no-op at best.\n      if (previouslyFocusedRef.current instanceof HTMLElement && previouslyFocusedRef.current.isConnected) {\n        previouslyFocusedRef.current.focus();\n      }\n      previouslyFocusedRef.current = null;\n    }\n  }, [isOpen]);\n\n  React.useEffect(() => {\n    const dialog = dialogRef.current;\n    if (!dialog) return;\n    const handleCancel = (e: Event) => { e.preventDefault(); cancelConfirmInputFields(); };\n    dialog.addEventListener(\"cancel\", handleCancel);\n    return () => { dialog.removeEventListener(\"cancel\", handleCancel); };\n  }, [cancelConfirmInputFields]);\n\n  const handleKeyDown = React.useCallback((e: React.KeyboardEvent<HTMLDialogElement>) => {\n    if (e.key !== \"Tab\" || !dialogRef.current) return;\n    const focusableElements = getFocusableElements(dialogRef.current);\n    if (focusableElements.length === 0) return;\n    const first = focusableElements[0];\n    const last = focusableElements[focusableElements.length - 1];\n    if (e.shiftKey) {\n      if (document.activeElement === first) { e.preventDefault(); last.focus(); }\n    } else {\n      if (document.activeElement === last) { e.preventDefault(); first.focus(); }\n    }\n  }, []);\n\n  // Stable identity: RenderField is React.memo'd, so a new function per render\n  // would defeat its memoization for every modal field.\n  const setValueFunctionFieldValue = React.useCallback((fieldName: string, fieldValue: unknown) => {\n    trigger();\n    setValue(`${fieldName}` as const, fieldValue, { shouldDirty: true });\n  }, [trigger, setValue]);\n\n  const content = (\n    <div className=\"formosaic-form-wrapper\">\n      <div className=\"formosaic-form-container\">\n        <form className=\"formosaic-form formosaic-modal\">\n          {confirmInputFields?.map(confirmInputField => {\n            const fieldState = rulesState.configs[configName]?.fieldStates[confirmInputField];\n            const fieldConfig = fields[confirmInputField];\n            if (!fieldState || !fieldConfig) return null;\n            return (\n              <RenderField\n                key={`${confirmInputField}-modal`}\n                fieldName={confirmInputField}\n                testId={testId}\n                type={fieldState.type ?? \"\"}\n                required\n                options={fieldState.options}\n                validate={fieldState.validate}\n                isManualSave\n                setFieldValue={setValueFunctionFieldValue}\n                label={fieldConfig.label}\n                skipLayoutReadOnly\n                hideOnCreate={fieldConfig.hideOnCreate}\n                config={fieldConfig.config}\n              />\n            );\n          })}\n        </form>\n      </div>\n    </div>\n  );\n\n  if (renderDialog) {\n    return renderDialog({ isOpen: !!isOpen, onSave: saveConfirmInputFields, onCancel: cancelConfirmInputFields, children: content });\n  }\n\n  return (\n    <dialog ref={dialogRef} className=\"formosaic-modal\" role=\"dialog\" aria-modal=\"true\" aria-label={FormStrings.confirm} onKeyDown={handleKeyDown}>\n      {content}\n      <div className=\"formosaic-modal-actions\">\n        <button type=\"button\" ref={saveButtonRef} onClick={saveConfirmInputFields}>{FormStrings.save}</button>\n        <button type=\"button\" onClick={cancelConfirmInputFields}>{FormStrings.cancel}</button>\n      </div>\n    </dialog>\n  );\n};\n\nexport default ConfirmInputsModal;\n","import { isEmpty, isNull } from \"../utils\";\nimport React from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { CheckFieldValidationRules, CheckAsyncFieldValidationRules, ShowField } from \"../helpers/FormosaicHelper\";\nimport { IOption } from \"../types/IOption\";\nimport { IValidationRule } from \"../types/IValidationRule\";\nimport { IRuntimeFieldState } from \"../types/IRuntimeFieldState\";\nimport { UseInjectedFieldContext } from \"../providers/InjectedFieldProvider\";\nimport { FormStrings } from \"../strings\";\nimport { IFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport { FieldWrapper } from \"./FieldWrapper\";\nimport { trackRender } from \"../helpers/RenderTracker\";\n\ninterface IRenderFieldProps {\n  fieldName: string;\n  testId?: string;\n  type: string;\n  hidden?: boolean;\n  required?: boolean;\n  readOnly?: boolean;\n  disabled?: boolean;\n  options?: IOption[];\n  optionsLoading?: boolean;\n  validate?: IValidationRule[];\n  isManualSave?: boolean;\n  setFieldValue: (fieldName: string, fieldValue: unknown, skipSave?: boolean) => void;\n  isCreate?: boolean;\n  filterText?: string;\n  softHidden?: boolean;\n  label?: string;\n  skipLayoutReadOnly?: boolean;\n  hideOnCreate?: boolean;\n  config?: Record<string, unknown>;\n  description?: string;\n  placeholder?: string;\n  helpText?: string;\n  renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n  renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n  renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n  analytics?: IFormAnalytics;\n}\n\ninterface IFieldAnalyticsTrackerProps {\n  fieldName: string;\n  value: unknown;\n  errorMessage?: string;\n  analytics: IFormAnalytics;\n}\n\n/**\n * Owns the analytics side effects for a field. Rendered from inside the\n * Controller render prop (where hooks are unavailable) so tracking runs in\n * effects rather than during render: trackValidationError fires only when the\n * error message transitions, and trackFieldChange fires once per actual value\n * change. Refs persist across StrictMode's double-invoked dev renders, so\n * neither callback double-fires.\n */\nconst FieldAnalyticsTracker = ({ fieldName, value, errorMessage, analytics }: IFieldAnalyticsTrackerProps) => {\n  const previousValueRef = React.useRef<unknown>(undefined);\n  const lastTrackedErrorRef = React.useRef<string | undefined>(undefined);\n\n  React.useEffect(() => {\n    if (errorMessage && lastTrackedErrorRef.current !== errorMessage) {\n      analytics.trackValidationError(fieldName, [errorMessage]);\n    }\n    lastTrackedErrorRef.current = errorMessage;\n  }, [errorMessage, analytics, fieldName]);\n\n  React.useEffect(() => {\n    if (previousValueRef.current !== undefined && previousValueRef.current !== value) {\n      analytics.trackFieldChange(fieldName, previousValueRef.current, value);\n    }\n    previousValueRef.current = value;\n  }, [value, analytics, fieldName]);\n\n  return null;\n};\n\nconst RenderField = (props: IRenderFieldProps) => {\n  const {\n    type, fieldName, testId,\n    hidden, required, readOnly, disabled, options, optionsLoading, validate,\n    isManualSave,\n    setFieldValue, isCreate, filterText, softHidden,\n    label, skipLayoutReadOnly, hideOnCreate, config,\n    description, placeholder, helpText,\n    renderLabel, renderError, renderStatus, analytics,\n  } = props;\n\n  const { injectedFields } = UseInjectedFieldContext();\n  const { control, getValues } = useFormContext();\n\n  const isDisabled = disabled ?? false;\n\n  // Animation: two-phase show/hide state machine\n  const effectivelyHidden = hidden || (isCreate && hideOnCreate);\n  const [shouldRender, setShouldRender] = React.useState(!effectivelyHidden);\n  const [isExiting, setIsExiting] = React.useState(false);\n  const isFirstRender = React.useRef(true);\n  const fallbackTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  // Animation: change detection refs (all initialized to undefined sentinel to skip initial render)\n  const prevOptionsRef = React.useRef<IOption[] | undefined>(undefined);\n  const prevLabelRef = React.useRef<string | undefined>(undefined);\n  const prevReadOnlyRef = React.useRef<boolean | undefined>(undefined);\n  const [optionsChanged, setOptionsChanged] = React.useState(false);\n  const [labelChanging, setLabelChanging] = React.useState(false);\n  const [readOnlyEntering, setReadOnlyEntering] = React.useState(false);\n\n  // Effect: watch hidden prop for show/hide transitions\n  // Intentionally omits shouldRender/isExiting from deps — adding them would cause\n  // re-fire loops. The effect only needs to run when effectivelyHidden changes;\n  // shouldRender/isExiting are always current at that point due to React batching.\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  React.useEffect(() => {\n    if (isFirstRender.current) {\n      isFirstRender.current = false;\n      return;\n    }\n\n    if (effectivelyHidden && shouldRender) {\n      // Start exit animation\n      setIsExiting(true);\n      // Fallback: force unmount if transitionend doesn't fire\n      fallbackTimerRef.current = setTimeout(() => {\n        setShouldRender(false);\n        setIsExiting(false);\n      }, 300); // ~2x animation duration\n    } else if (!effectivelyHidden && !shouldRender) {\n      // Show: mount the field, CSS @starting-style handles entry\n      setShouldRender(true);\n      setIsExiting(false);\n    } else if (!effectivelyHidden && isExiting) {\n      // Rapid toggle: cancel exit\n      setIsExiting(false);\n      if (fallbackTimerRef.current) {\n        clearTimeout(fallbackTimerRef.current);\n        fallbackTimerRef.current = null;\n      }\n    }\n  }, [effectivelyHidden]);\n\n  // Cleanup fallback timer on unmount\n  React.useEffect(() => {\n    return () => {\n      if (fallbackTimerRef.current) {\n        clearTimeout(fallbackTimerRef.current);\n      }\n    };\n  }, []);\n\n  const handleTransitionEnd = React.useCallback((e: React.TransitionEvent) => {\n    // Only respond to our own grid wrapper's transition, not bubbled child events\n    if (e.target !== e.currentTarget) return;\n    if (isExiting) {\n      setShouldRender(false);\n      setIsExiting(false);\n      if (fallbackTimerRef.current) {\n        clearTimeout(fallbackTimerRef.current);\n        fallbackTimerRef.current = null;\n      }\n    }\n  }, [isExiting]);\n\n  // Effect: detect options changes\n  React.useEffect(() => {\n    const prev = prevOptionsRef.current;\n    prevOptionsRef.current = options;\n    if (prev === undefined) return; // skip initial\n    const prevValues = prev?.map(o => o.value) ?? [];\n    const currValues = options?.map(o => o.value) ?? [];\n    if (prevValues.length !== currValues.length || prevValues.some((v, i) => v !== currValues[i])) {\n      setOptionsChanged(true);\n    }\n  }, [options]);\n\n  // Effect: detect label changes\n  React.useEffect(() => {\n    const prev = prevLabelRef.current;\n    prevLabelRef.current = label;\n    if (prev === undefined) return; // skip initial\n    if (prev !== label) {\n      setLabelChanging(true);\n    }\n  }, [label]);\n\n  // Effect: detect readOnly changes (uses undefined sentinel to skip initial render, same as options/label)\n  React.useEffect(() => {\n    const isReadOnly = readOnly || (isDisabled && (isNull(skipLayoutReadOnly) || (!isNull(skipLayoutReadOnly) && !skipLayoutReadOnly)));\n    const prev = prevReadOnlyRef.current;\n    prevReadOnlyRef.current = isReadOnly;\n    if (prev === undefined) return; // skip initial render\n    if (prev !== isReadOnly) {\n      setReadOnlyEntering(true);\n    }\n  }, [readOnly, isDisabled, skipLayoutReadOnly]);\n\n  // Clear change-detection flags after the specific animation that ended\n  const handleContainerAnimationEnd = React.useCallback((e: React.AnimationEvent) => {\n    const name = e.animationName;\n    if (name === \"formosaic-options-flash\") setOptionsChanged(false);\n    else if (name === \"formosaic-label-pulse\") setLabelChanging(false);\n    else if (name === \"formosaic-readonly-fade\") setReadOnlyEntering(false);\n  }, []);\n\n  React.useEffect(() => {\n    // Gate dev-only render tracking: no work in production. See audit P1-22.\n    if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n      trackRender(fieldName);\n    }\n  });\n\n  const fieldNameConst = `${fieldName}` as const;\n\n  const FieldComponent = React.useMemo(() => {\n    const isReadOnly = readOnly || (isDisabled && (isNull(skipLayoutReadOnly) || (!isNull(skipLayoutReadOnly) && !skipLayoutReadOnly)));\n\n    if (!isEmpty(injectedFields) && injectedFields[type]) {\n      const Comp = injectedFields[type];\n      return (\n        <Controller\n          name={fieldNameConst}\n          control={control}\n          rules={{\n            // Per audit P0-9: Toggle with required:true must require a truthy\n            // value (the user must actively toggle it on). Previously Toggle\n            // was silently exempted, breaking required-consent UX.\n            required: required && !isReadOnly\n              ? { value: true, message: FormStrings.required }\n              : undefined,\n            validate: async (value) => {\n              // Per audit P0-8: do NOT short-circuit on falsy values (0, \"\",\n              // false, null). Each validator guards its own empty cases and\n              // may fire on an empty/zero value (e.g. numericRange min:5\n              // must reject 0). Only short-circuit when validation is\n              // disabled or the field is read-only.\n              if (!validate || validate.length === 0 || isReadOnly) return undefined;\n              // Build a mock runtime state for validation\n              const fieldState: IRuntimeFieldState = { validate };\n              const syncError = CheckFieldValidationRules(value, fieldName, getValues(), fieldState);\n              if (syncError) return syncError;\n              return CheckAsyncFieldValidationRules(value, fieldName, getValues(), fieldState);\n            },\n          }}\n          render={({\n            field: { value },\n            fieldState: { error, isDirty },\n            formState: { isSubmitting, isSubmitSuccessful, errors },\n          }) => {\n            const errorCount = errors ? Object.keys(errors).length : 0;\n            const saving = isDirty && (isSubmitting || isSubmitSuccessful);\n            const savePending = isDirty && errorCount > 0 && !isSubmitting && !isSubmitSuccessful;\n            const tracker = analytics ? (\n              <FieldAnalyticsTracker\n                fieldName={fieldName}\n                value={value}\n                errorMessage={error ? error.message || \"Error\" : undefined}\n                analytics={analytics}\n              />\n            ) : null;\n            return type === \"DynamicFragment\" ? (\n              <>{tracker}{React.cloneElement(Comp, { value })}</>\n            ) : ShowField(filterText, value, label) && !softHidden ? (\n              <>\n              {tracker}\n              <FieldWrapper\n                id={fieldName}\n                required={required}\n                label={label}\n                error={error}\n                errorCount={errorCount}\n                saving={saving}\n                savePending={savePending}\n                labelClassName=\"form-label\"\n                isManualSave={isManualSave}\n                renderLabel={renderLabel}\n                renderError={renderError}\n                renderStatus={renderStatus}\n              >\n                {React.cloneElement(Comp, {\n                  fieldName,\n                  testId,\n                  value,\n                  readOnly: isReadOnly,\n                  required,\n                  error,\n                  errorCount,\n                  saving,\n                  savePending,\n                  config,\n                  options,\n                  optionsLoading,\n                  label,\n                  type,\n                  description,\n                  placeholder,\n                  helpText,\n                  setFieldValue,\n                  onFocus: analytics ? () => analytics.trackFieldFocus(fieldName) : undefined,\n                  onBlur: analytics ? () => analytics.trackFieldBlur(fieldName) : undefined,\n                })}\n              </FieldWrapper>\n              </>\n            ) : <>{tracker}</>;\n          }}\n        />\n      );\n    }\n\n    const available = !isEmpty(injectedFields) ? Object.keys(injectedFields).join(\", \") : \"none\";\n    return (\n      <div style={{ color: \"red\", fontSize: \"0.85em\", padding: \"4px\" }}>\n        Missing component &quot;{type}&quot; for field &quot;{fieldName}&quot;. Available: [{available}]\n      </div>\n    );\n  }, [type, required, readOnly, disabled, options, optionsLoading, softHidden, renderLabel, renderError, renderStatus,\n    fieldName, fieldNameConst, label, validate, config, description, placeholder, helpText,\n    isManualSave, skipLayoutReadOnly,\n    testId,\n    injectedFields, analytics, control, getValues, setFieldValue]);\n\n  if (!shouldRender) return <></>;\n\n  return (\n    <div\n      className=\"formosaic-field-animate\"\n      data-exiting={isExiting || undefined}\n      data-first-render={isFirstRender.current || undefined}\n      onTransitionEnd={handleTransitionEnd}\n    >\n      <div className=\"formosaic-field-animate-inner\">\n        <div\n          className=\"formosaic-field-container\"\n          data-options-changed={optionsChanged || undefined}\n          data-label-changing={labelChanging || undefined}\n          data-readonly-entering={readOnlyEntering || undefined}\n          onAnimationEnd={handleContainerAnimationEnd}\n        >\n          {FieldComponent}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default React.memo(RenderField);\n","import React from \"react\";\nimport { FieldError } from \"react-hook-form\";\nimport { FormStrings } from \"../strings\";\n\ninterface IFieldWrapperProps {\n  id?: string;\n  readonly label?: string;\n  readonly required?: boolean;\n  readonly error?: FieldError;\n  readonly errorCount?: number;\n  readonly savePending?: boolean;\n  readonly saving?: boolean;\n  readonly labelClassName?: string;\n  readonly fieldClassName?: string;\n  readonly showControlonSide?: boolean;\n  readonly ariaLabel?: string;\n  readonly ariaDescription?: string;\n  readonly containerClassName?: string;\n  readonly additionalInfo?: string;\n  readonly additionalInfoIcon?: string;\n  readonly additionalInfoComponent?: React.ReactNode;\n  isManualSave?: boolean;\n  renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n  renderError?: (props: { id: string; error?: FieldError; errorCount?: number }) => React.ReactNode;\n  renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n}\n\nexport const FieldWrapper: React.FunctionComponent<React.PropsWithChildren<IFieldWrapperProps>> = React.memo((\n  props: React.PropsWithChildren<IFieldWrapperProps>\n) => {\n  const {\n    id, required, error, errorCount, savePending, saving,\n    labelClassName, fieldClassName, showControlonSide, label,\n    ariaLabel, ariaDescription, containerClassName,\n    additionalInfo, additionalInfoComponent, isManualSave,\n    renderLabel, renderError, renderStatus,\n  } = props;\n\n  const labelId = `${id}_label`;\n  const errorMessageId = `${id}_error`;\n  const children = (Array.isArray(props.children) ? props.children : [props.children]) as React.ReactElement<Record<string, unknown>>[];\n\n  // Animation: detect error appearance for slide-in animation\n  const prevHasErrorRef = React.useRef<boolean | undefined>(undefined);\n  const [errorEntering, setErrorEntering] = React.useState(false);\n  React.useEffect(() => {\n    const hasError = !!error;\n    const prev = prevHasErrorRef.current;\n    prevHasErrorRef.current = hasError;\n    if (prev === undefined) return; // skip initial\n    if (!prev && hasError) {\n      setErrorEntering(true);\n    }\n  }, [error]);\n  const handleErrorAnimationEnd = React.useCallback(() => {\n    setErrorEntering(false);\n  }, []);\n\n  const defaultLabel = (\n    <div className={labelClassName || \"\"}>\n      <label id={labelId} htmlFor={id} className=\"field-label\">\n        {label}\n        {required && <><span className=\"required-indicator formosaic-required-indicator\" aria-hidden=\"true\" style={{ color: \"var(--formosaic-required-color, #d13438)\" }}> *</span><span className=\"sr-only\" style={{ position: \"absolute\", width: \"1px\", height: \"1px\", padding: 0, margin: \"-1px\", overflow: \"hidden\", clip: \"rect(0, 0, 0, 0)\", whiteSpace: \"nowrap\", border: 0 }}> (required)</span></>}\n      </label>\n      {additionalInfoComponent}\n      {!additionalInfoComponent && additionalInfo && (\n        <span className=\"additional-info\" title={additionalInfo}>&#9432;</span>\n      )}\n    </div>\n  );\n\n  const defaultErrorAndStatus = (\n    <div className=\"message formosaic-error-animate\" data-error-entering={errorEntering || undefined} onAnimationEnd={handleErrorAnimationEnd}>\n      {error ? (\n        <>\n          <span className=\"error-icon\" aria-hidden=\"true\" style={{ color: \"var(--formosaic-error-color, #d13438)\" }}>&#10006;</span>\n          <span className=\"error-message\" id={errorMessageId} role=\"alert\" style={{ color: \"var(--formosaic-error-color, #d13438)\" }}>\n            {error.message || \"Error\"}\n          </span>\n        </>\n      ) : savePending ? (\n        <>\n          <span className=\"warning-icon\" aria-hidden=\"true\" style={{ color: \"var(--formosaic-warning-color, #ffb900)\" }}>&#9888;</span>\n          <span className=\"warning-message\" id={errorMessageId} role=\"status\" style={{ color: \"var(--formosaic-warning-color, #ffb900)\" }}>\n            {!isManualSave ? FormStrings.autoSavePending : FormStrings.savePending} ({`${errorCount} ${FormStrings.remaining}`})\n          </span>\n        </>\n      ) : saving ? (\n        <>\n          <span className=\"save-spinner\" aria-hidden=\"true\" style={{ color: \"var(--formosaic-saving-color, #0078d4)\" }}>&#8987;</span>\n          <span className=\"save-message\" id={errorMessageId} role=\"status\" style={{ color: \"var(--formosaic-saving-color, #0078d4)\" }}>\n            {FormStrings.saving}\n          </span>\n        </>\n      ) : <></>}\n    </div>\n  );\n\n  return (\n    <div\n      className={`form-field ${showControlonSide ? \"flexBox\" : \"\"} ${containerClassName || \"\"} ${saving ? \"saving\" : \"\"}`}\n      aria-busy={saving ? \"true\" : undefined}\n    >\n      {renderLabel ? renderLabel({ id: id || \"\", labelId, label, required }) : defaultLabel}\n      <div className={`flexBox-Direction-column field-container ${fieldClassName || \"\"}`}>\n        {children.map((child, index) => {\n          if (child && child.props) {\n            const childProps: Record<string, unknown> = {\n              id,\n              \"aria-labelledby\": ariaLabel ? undefined : labelId,\n              \"aria-label\": ariaLabel || undefined,\n              \"aria-required\": required,\n              \"aria-invalid\": !!error,\n              \"aria-describedby\": errorMessageId,\n              key: index,\n              className: child.props.className,\n            };\n            if (ariaDescription && !error) {\n              childProps[\"aria-description\"] = ariaDescription;\n            }\n            if (index === 0) {\n              return React.cloneElement(child, childProps);\n            }\n            const siblingProps: Record<string, unknown> = {\n              key: index,\n              \"aria-labelledby\": childProps[\"aria-labelledby\"],\n              \"aria-label\": childProps[\"aria-label\"],\n              \"aria-required\": childProps[\"aria-required\"],\n              \"aria-invalid\": childProps[\"aria-invalid\"],\n              \"aria-describedby\": childProps[\"aria-describedby\"],\n              className: child.props.className,\n            };\n            if (childProps[\"aria-description\"]) {\n              siblingProps[\"aria-description\"] = childProps[\"aria-description\"];\n            }\n            return React.cloneElement(child, siblingProps);\n          }\n          return <React.Fragment key={index} />;\n        })}\n      </div>\n      {renderError\n        ? renderError({ id: id || \"\", error, errorCount })\n        : renderStatus\n          ? renderStatus({ id: id || \"\", saving, savePending, errorCount, isManualSave })\n          : defaultErrorAndStatus}\n    </div>\n  );\n});\n\n","import React from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { GetFieldsToRender } from \"../helpers/FormosaicHelper\";\nimport { IRuntimeFormState } from \"../types/IRuntimeFieldState\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IOption } from \"../types/IOption\";\nimport { IFormAnalytics } from \"../hooks/useFormAnalytics\";\nimport RenderField from \"./RenderField\";\nimport { FormErrorBoundary } from \"./FormErrorBoundary\";\n\ninterface IFormFieldsProps {\n  testId?: string;\n  isExpanded?: boolean;\n  expandEnabled?: boolean;\n  fieldOrder?: string[];\n  inPanel?: boolean;\n  collapsedMaxHeight?: number;\n  formState?: IRuntimeFormState;\n  fields?: Record<string, IFieldConfig>;\n  setFieldValue: (fieldName: string, fieldValue: unknown, skipSave?: boolean) => void;\n  isManualSave?: boolean;\n  isCreate?: boolean;\n  filterText?: string;\n  fieldRenderLimit?: number;\n  renderLabel?: (props: { id: string; labelId: string; label?: string; required?: boolean }) => React.ReactNode;\n  renderError?: (props: { id: string; error?: import(\"react-hook-form\").FieldError; errorCount?: number }) => React.ReactNode;\n  renderStatus?: (props: { id: string; saving?: boolean; savePending?: boolean; errorCount?: number; isManualSave?: boolean }) => React.ReactNode;\n  analytics?: IFormAnalytics;\n}\n\nexport const FormFields = (props: IFormFieldsProps) => {\n  const {\n    testId,\n    isExpanded, expandEnabled, fieldOrder, inPanel, collapsedMaxHeight,\n    formState, fields, setFieldValue, isManualSave, isCreate, filterText,\n    fieldRenderLimit, renderLabel, renderError, renderStatus, analytics,\n  } = props;\n\n  // Async options state: maps fieldId -> loaded IOption[] (undefined = not yet loaded)\n  const [asyncOptions, setAsyncOptions] = React.useState<Record<string, IOption[]>>({});\n  // Async options loading state: maps fieldId -> boolean\n  const [asyncOptionsLoading, setAsyncOptionsLoading] = React.useState<Record<string, boolean>>({});\n  // Cache key per field: JSON-serialised values of optionsDependsOn fields\n  const asyncCacheKeyRef = React.useRef<Record<string, string>>({});\n  // Per-field AbortController so a new fetch cancels the previous one (P1-6).\n  const loadOptionsAbortRef = React.useRef<Record<string, AbortController>>({});\n\n  const { getValues } = useFormContext();\n\n  // Run loadOptions for each field that declares it, re-running when deps\n  // change. We gate on the `fields` reference plus snapshot dep-value keys\n  // (via the cache key ref). Stale fetches are ignored — only the request\n  // whose cacheKey matches the current one commits results. See audit P1-6.\n  React.useEffect(() => {\n    if (!fields) return;\n    Object.entries(fields).forEach(([fieldId, fieldConfig]) => {\n      if (!fieldConfig.loadOptions) return;\n      const depValues = (fieldConfig.optionsDependsOn ?? []).reduce<Record<string, unknown>>(\n        (acc, dep) => { acc[dep] = getValues(dep); return acc; },\n        {}\n      );\n      const cacheKey = JSON.stringify(depValues);\n      if (asyncCacheKeyRef.current[fieldId] === cacheKey) return; // deps unchanged, use cached result\n      asyncCacheKeyRef.current[fieldId] = cacheKey;\n\n      // Abort any in-flight fetch for this field before starting a new one.\n      const prevController = loadOptionsAbortRef.current[fieldId];\n      if (prevController) prevController.abort();\n      const controller = new AbortController();\n      loadOptionsAbortRef.current[fieldId] = controller;\n\n      setAsyncOptionsLoading(prev => ({ ...prev, [fieldId]: true }));\n      fieldConfig.loadOptions({ fieldId, values: getValues() })\n        .then(options => {\n          // Ignore stale responses: only commit if the cacheKey we started\n          // with is still the current one for this field.\n          if (asyncCacheKeyRef.current[fieldId] !== cacheKey) return;\n          if (controller.signal.aborted) return;\n          setAsyncOptions(prev => ({ ...prev, [fieldId]: options }));\n        })\n        .catch(() => {\n          // On error, leave the previous options intact and clear loading state\n        })\n        .finally(() => {\n          if (asyncCacheKeyRef.current[fieldId] !== cacheKey) return;\n          setAsyncOptionsLoading(prev => ({ ...prev, [fieldId]: false }));\n        });\n    });\n  }, [fields]);\n\n  // Cleanup in-flight fetches on unmount.\n  React.useEffect(() => {\n    return () => {\n      for (const controller of Object.values(loadOptionsAbortRef.current)) {\n        controller.abort();\n      }\n      loadOptionsAbortRef.current = {};\n    };\n  }, []);\n\n  const collapsedClass = !isExpanded && (expandEnabled || expandEnabled === undefined) ? \"collapsed\" : \"\";\n  const fieldsToRender = GetFieldsToRender(fieldRenderLimit ?? 0, fieldOrder ?? [], formState?.fieldStates);\n  const loadingKey = `${testId ? testId + \"-\" : \"\"}form-loaded`;\n\n  return (\n    <div className={`formosaic-form-container ${collapsedClass}`}>\n      <form\n        className={`formosaic-form ${collapsedClass} ${inPanel ? \"in-panel\" : \"\"}`}\n        style={collapsedClass && collapsedMaxHeight ? { maxHeight: `${collapsedMaxHeight}px` } : undefined}\n        data-testid={`${testId ? testId + \"-\" : \"\"}form`}\n      >\n        <input type=\"hidden\" id={loadingKey} name={loadingKey} data-testid={loadingKey} />\n        {fieldsToRender?.map(fieldToRender => {\n          const { fieldName, softHidden } = fieldToRender;\n          const fieldState = formState?.fieldStates[fieldName];\n          if (!fieldState) return <React.Fragment key={fieldName} />;\n\n          const fieldConfig = fields![fieldName];\n          return (\n            <FormErrorBoundary key={`${fieldName}-form`}>\n              <RenderField\n                fieldName={fieldName}\n                testId={testId}\n                type={fieldState.type ?? \"\"}\n                hidden={fieldState.hidden}\n                required={fieldState.required}\n                readOnly={fieldState.readOnly}\n                options={asyncOptions[fieldName] ?? fieldState.options}\n                optionsLoading={asyncOptionsLoading[fieldName] ?? false}\n                validate={fieldState.validate}\n                setFieldValue={setFieldValue}\n                isManualSave={isManualSave}\n                isCreate={isCreate}\n                filterText={filterText}\n                softHidden={softHidden}\n                label={fieldState?.label ?? fieldConfig?.label}\n                skipLayoutReadOnly={fieldConfig?.skipLayoutReadOnly}\n                hideOnCreate={fieldConfig?.hideOnCreate}\n                config={fieldConfig?.config}\n                description={fieldConfig?.description}\n                placeholder={fieldConfig?.placeholder}\n                helpText={fieldConfig?.helpText}\n                renderLabel={renderLabel}\n                renderError={renderError}\n                renderStatus={renderStatus}\n                analytics={analytics}\n              />\n            </FormErrorBoundary>\n          );\n        })}\n      </form>\n    </div>\n  );\n};\n\n","import React from \"react\";\n\ninterface IFormErrorBoundaryProps {\n  children: React.ReactNode;\n  fallback?: (error: Error, resetError: () => void) => React.ReactNode;\n  onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n}\n\ninterface IFormErrorBoundaryState {\n  hasError: boolean;\n  error: Error | null;\n}\n\nexport class FormErrorBoundary extends React.Component<IFormErrorBoundaryProps, IFormErrorBoundaryState> {\n  constructor(props: IFormErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null };\n  }\n\n  static getDerivedStateFromError(error: Error): IFormErrorBoundaryState {\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n    this.props.onError?.(error, errorInfo);\n  }\n\n  resetError = (): void => {\n    this.setState({ hasError: false, error: null });\n  };\n\n  render(): React.ReactNode {\n    if (this.state.hasError && this.state.error) {\n      if (this.props.fallback) return this.props.fallback(this.state.error, this.resetError);\n      return (\n        <div className=\"form-error-boundary\" role=\"alert\" aria-live=\"assertive\">\n          <span className=\"error-boundary-message\">Something went wrong: {this.state.error.message}</span>\n          <button className=\"error-boundary-retry\" onClick={this.resetError} type=\"button\">Retry</button>\n        </div>\n      );\n    }\n    return this.props.children;\n  }\n}\n\n","import React from \"react\";\nimport { Dictionary } from \"../utils\";\n\ntype LazyFieldImport = () => Promise<{ default: React.ComponentType<any> }>;\n\n/**\n * Creates a field registry where components are loaded on-demand via React.lazy().\n * Fields are only loaded when first rendered, reducing initial bundle size.\n *\n * @example\n * const registry = createLazyFieldRegistry({\n *   Textbox: () => import(\"./fields/Textbox\"),\n *   Dropdown: () => import(\"./fields/Dropdown\"),\n * });\n */\nexport function createLazyFieldRegistry(\n  imports: Record<string, LazyFieldImport>\n): Dictionary<React.JSX.Element> {\n  const registry: Dictionary<React.JSX.Element> = {};\n\n  for (const [key, importFn] of Object.entries(imports)) {\n    const LazyComponent = React.lazy(importFn);\n    registry[key] = React.createElement(\n      React.Suspense,\n      { fallback: React.createElement(\"span\", { className: \"field-loading\" }, \"Loading...\") },\n      React.createElement(LazyComponent)\n    );\n  }\n\n  return registry;\n}\n","import { useEffect, useCallback, useRef, useState } from \"react\";\nimport { IEntityData } from \"../utils\";\nimport { serializeFormState, deserializeFormState } from \"../utils/formStateSerialization\";\n\nexport interface IDraftPersistenceOptions {\n  /** Unique form identifier for storage key */\n  formId: string;\n  /** Current form data to persist */\n  data: IEntityData;\n  /** Auto-save interval in ms (default 30000) */\n  saveIntervalMs?: number;\n  /** Whether persistence is enabled (default true) */\n  enabled?: boolean;\n  /** Custom storage key prefix (default \"draft_\") */\n  storageKeyPrefix?: string;\n}\n\nexport interface IDraftState {\n  data: IEntityData;\n  timestamp: number;\n}\n\nexport interface IUseDraftPersistenceResult {\n  /** Recover a saved draft if one exists */\n  recoverDraft: () => IDraftState | null;\n  /** Clear the saved draft */\n  clearDraft: () => void;\n  /** Whether a draft exists */\n  hasDraft: boolean;\n  /** Manually save current state as draft */\n  saveDraft: () => void;\n}\n\nfunction getStorageKey(formId: string, prefix: string): string {\n  return `${prefix}${formId}`;\n}\n\nfunction getStorage(): Storage | undefined {\n  try {\n    return typeof localStorage !== \"undefined\" ? localStorage : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Hook that persists form draft state to localStorage on a configurable interval.\n *\n * Handles localStorage errors gracefully (e.g. private browsing, quota exceeded).\n */\nexport function useDraftPersistence(options: IDraftPersistenceOptions): IUseDraftPersistenceResult {\n  const {\n    formId,\n    data,\n    saveIntervalMs = 30000,\n    enabled = true,\n    storageKeyPrefix = \"draft_\",\n  } = options;\n\n  const [hasDraft, setHasDraft] = useState<boolean>(false);\n  const dataRef = useRef<IEntityData>(data);\n  const intervalRef = useRef<ReturnType<typeof setInterval> | undefined>(undefined);\n\n  // Keep dataRef up to date with the latest data\n  useEffect(() => {\n    dataRef.current = data;\n  }, [data]);\n\n  const storageKey = getStorageKey(formId, storageKeyPrefix);\n\n  const saveDraft = useCallback(() => {\n    try {\n      const storage = getStorage();\n      if (!storage) return;\n      const draftState: IDraftState = {\n        data: dataRef.current,\n        timestamp: Date.now(),\n      };\n      storage.setItem(storageKey, serializeFormState(draftState as unknown as IEntityData));\n      setHasDraft(true);\n    } catch {\n      // localStorage may throw in private browsing or when quota is exceeded\n    }\n  }, [storageKey]);\n\n  const recoverDraft = useCallback((): IDraftState | null => {\n    try {\n      const storage = getStorage();\n      if (!storage) return null;\n      const stored = storage.getItem(storageKey);\n      if (!stored) return null;\n      const parsed = deserializeFormState(stored) as unknown as IDraftState;\n      return parsed;\n    } catch {\n      return null;\n    }\n  }, [storageKey]);\n\n  const clearDraft = useCallback(() => {\n    try {\n      const storage = getStorage();\n      if (!storage) return;\n      storage.removeItem(storageKey);\n      setHasDraft(false);\n    } catch {\n      // localStorage may throw in private browsing\n    }\n  }, [storageKey]);\n\n  // On mount, check if a draft exists\n  useEffect(() => {\n    if (!enabled) return;\n    try {\n      const storage = getStorage();\n      if (!storage) { setHasDraft(false); return; }\n      const stored = storage.getItem(storageKey);\n      setHasDraft(stored !== null);\n    } catch {\n      setHasDraft(false);\n    }\n  }, [enabled, storageKey]);\n\n  // Set up auto-save interval\n  useEffect(() => {\n    if (!enabled) return;\n\n    intervalRef.current = setInterval(() => {\n      saveDraft();\n    }, saveIntervalMs);\n\n    return () => {\n      if (intervalRef.current !== undefined) {\n        clearInterval(intervalRef.current);\n        intervalRef.current = undefined;\n      }\n    };\n  }, [enabled, saveIntervalMs, saveDraft]);\n\n  return {\n    recoverDraft,\n    clearDraft,\n    hasDraft,\n    saveDraft,\n  };\n}\n","import { IEntityData } from \"../utils\";\n\n/**\n * Recursively walk an object tree and replace Date instances with\n * a serializable marker: `{ __type: \"Date\", value: \"<ISO string>\" }`.\n *\n * JSON.stringify's replacer receives the *return value* of `.toJSON()`,\n * which means Date objects appear as plain strings to the replacer.\n * Pre-processing avoids this problem.\n */\nfunction markDates(value: unknown, visited = new WeakSet()): unknown {\n  if (value instanceof Date) {\n    return { __type: \"Date\", value: value.toISOString() };\n  }\n  if (Array.isArray(value)) {\n    if (visited.has(value)) return value;\n    visited.add(value);\n    return value.map((item) => markDates(item, visited));\n  }\n  if (value !== null && typeof value === \"object\") {\n    if (visited.has(value as object)) return value;\n    visited.add(value as object);\n    const result: Record<string, unknown> = {};\n    for (const key of Object.keys(value as Record<string, unknown>)) {\n      result[key] = markDates((value as Record<string, unknown>)[key], visited);\n    }\n    return result;\n  }\n  return value;\n}\n\n/**\n * Serialize form state to a JSON string, preserving Date objects\n * with a special `__type` marker so they can be round-tripped.\n */\nexport function serializeFormState(data: IEntityData): string {\n  return JSON.stringify(markDates(data));\n}\n\n/**\n * Deserialize a JSON string back to form state, restoring Date objects\n * that were serialized with `serializeFormState`.\n */\nexport function deserializeFormState(json: string): IEntityData {\n  return JSON.parse(json, (_key, value) => {\n    if (value && typeof value === \"object\" && value.__type === \"Date\") {\n      return new Date(value.value);\n    }\n    return value;\n  });\n}\n","import { useEffect, useRef } from \"react\";\n\n/**\n * Hook that warns the user before navigating away when there are unsaved changes.\n *\n * @param shouldWarn - Whether the beforeunload warning should be active\n * @param message - Custom message (modern browsers ignore custom text but still show a prompt)\n * @param onAbandonment - Optional analytics callback fired when the user leaves with unsaved changes\n */\nexport function useBeforeUnload(\n  shouldWarn: boolean,\n  message?: string,\n  onAbandonment?: () => void,\n): void {\n  const onAbandonmentRef = useRef(onAbandonment);\n  onAbandonmentRef.current = onAbandonment;\n\n  useEffect(() => {\n    if (!shouldWarn || typeof window === \"undefined\") return;\n\n    const handler = (e: BeforeUnloadEvent) => {\n      e.preventDefault();\n      onAbandonmentRef.current?.();\n      // Modern browsers ignore custom messages but still show a prompt\n      return (e.returnValue = message ?? \"You have unsaved changes.\");\n    };\n\n    window.addEventListener(\"beforeunload\", handler);\n    return () => window.removeEventListener(\"beforeunload\", handler);\n  }, [shouldWarn, message]);\n}\n","import { IFormConnection } from \"../types/IFormConnection\";\nimport { IRule } from \"../types/IRule\";\nimport { IFieldEffect } from \"../types/IFieldEffect\";\n\n/**\n * ConnectionCompiler — translates IFormConnection[] into IRule[].\n *\n * Connections are syntactic sugar for cross-fragment rules. Each connection\n * describes a conditional relationship between a source port and a target port,\n * and the desired effect when the connection's condition is met.\n *\n * Port matching is by field suffix (local name after stripping the fragment\n * prefix), not by array index. This allows ports to list fields in different\n * orders and still produce correct pairings.\n */\n\n/**\n * Compile an array of IFormConnection into IRule[].\n *\n * @param connections  The connections to compile.\n * @param resolvedPorts  A map of \"{fragment}.{port}\" -> string[] of fully-qualified field names.\n *                       Produced by the TemplateResolver (stored in _resolvedPorts).\n */\nexport function compileConnections(\n  connections: IFormConnection[],\n  resolvedPorts: Record<string, string[]>\n): IRule[] {\n  return connections.map(connection => compileConnection(connection, resolvedPorts));\n}\n\n// ---------------------------------------------------------------------------\n// Per-connection compilation\n// ---------------------------------------------------------------------------\n\nfunction compileConnection(\n  connection: IFormConnection,\n  resolvedPorts: Record<string, string[]>\n): IRule {\n  const sourceKey = `${connection.source.fragment}.${connection.source.port}`;\n  const targetKey = `${connection.target.fragment}.${connection.target.port}`;\n\n  const sourceFields = resolvedPorts[sourceKey] ?? [];\n  const targetFields = resolvedPorts[targetKey] ?? [];\n\n  // Build suffix -> field maps for each side\n  const sourceBySuffix = buildSuffixMap(connection.source.fragment, sourceFields);\n  const targetBySuffix = buildSuffixMap(connection.target.fragment, targetFields);\n\n  // Warn on mismatched suffixes\n  warnOnMismatch(connection.name, sourceBySuffix, targetBySuffix);\n\n  // Build the fields effect map by matching on common suffixes\n  const effectFields: Record<string, Partial<IFieldEffect>> = {};\n\n  for (const [suffix, sourceField] of Object.entries(sourceBySuffix)) {\n    const targetField = targetBySuffix[suffix];\n    if (!targetField) {\n      // Already warned above; skip\n      continue;\n    }\n\n    effectFields[targetField] = buildFieldEffect(connection.effect, sourceField);\n  }\n\n  const thenEffect: IFieldEffect = { fields: effectFields };\n\n  return {\n    id: connection.name,\n    when: connection.when,\n    then: thenEffect,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Suffix map building\n// ---------------------------------------------------------------------------\n\n/**\n * Build a map of local suffix -> fully-qualified field name.\n *\n * The suffix is derived by stripping the fragment prefix and the following dot.\n * For example, given fragment \"shipping\" and field \"shipping.name\", the suffix\n * is \"name\". Nested fields like \"shipping.address.city\" produce suffix \"address.city\".\n */\nfunction buildSuffixMap(\n  fragment: string,\n  fields: string[]\n): Record<string, string> {\n  const prefix = `${fragment}.`;\n  const map: Record<string, string> = {};\n\n  for (const field of fields) {\n    const suffix = field.startsWith(prefix) ? field.slice(prefix.length) : field;\n    if (map[suffix] !== undefined && map[suffix] !== field) {\n      // Two port fields reduce to the same suffix (e.g. \"a.address.street\"\n      // and a non-prefixed \"address.street\"); the later one wins and the\n      // earlier silently stops participating in the connection (audit\n      // 2026-06 finding 5) — make the overwrite visible.\n      console.warn(\n        `[Formosaic] Port fields \"${map[suffix]}\" and \"${field}\" in fragment \"${fragment}\" ` +\n        `both reduce to suffix \"${suffix}\"; \"${field}\" wins and \"${map[suffix]}\" is ignored.`\n      );\n    }\n    map[suffix] = field;\n  }\n\n  return map;\n}\n\n// ---------------------------------------------------------------------------\n// Mismatch warnings\n// ---------------------------------------------------------------------------\n\nfunction warnOnMismatch(\n  connectionName: string,\n  sourceBySuffix: Record<string, string>,\n  targetBySuffix: Record<string, string>\n): void {\n  const sourceSuffixes = new Set(Object.keys(sourceBySuffix));\n  const targetSuffixes = new Set(Object.keys(targetBySuffix));\n\n  const onlyInSource = [...sourceSuffixes].filter(s => !targetSuffixes.has(s));\n  const onlyInTarget = [...targetSuffixes].filter(s => !sourceSuffixes.has(s));\n\n  if (onlyInSource.length > 0 || onlyInTarget.length > 0) {\n    const parts: string[] = [];\n    if (onlyInSource.length > 0) {\n      parts.push(`source-only fields: ${onlyInSource.join(\", \")}`);\n    }\n    if (onlyInTarget.length > 0) {\n      parts.push(`target-only fields: ${onlyInTarget.join(\", \")}`);\n    }\n    console.warn(\n      `[Formosaic] Connection \"${connectionName}\" has mismatched port fields — ${parts.join(\"; \")}. ` +\n      `Unmatched fields will be skipped.`\n    );\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Effect building\n// ---------------------------------------------------------------------------\n\nfunction buildFieldEffect(\n  effect: IFormConnection[\"effect\"],\n  sourceField: string\n): Partial<IFieldEffect> {\n  switch (effect) {\n    case \"copyValues\":\n    case \"computeFrom\":\n      return { computedValue: `$root.${sourceField}` };\n\n    case \"hide\":\n      return { hidden: true };\n\n    case \"readOnly\":\n      return { readOnly: true };\n  }\n}\n","import { IComposeFormOptions } from \"../types/IFormConnection\";\nimport { IFormConfig } from \"../types/IFormConfig\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { ITemplateFieldRef } from \"../types/IFormTemplate\";\nimport { resolveTemplates } from \"./TemplateResolver\";\nimport { compileConnections } from \"./ConnectionCompiler\";\nimport { IResolvedFormConfig } from \"../types/IResolvedFormConfig\";\n\nexport function composeForm(options: IComposeFormOptions): IResolvedFormConfig {\n  const fields: Record<string, IFieldConfig | ITemplateFieldRef> = {};\n\n  // Build templateRef entries from fragments\n  for (const [prefix, fragment] of Object.entries(options.fragments ?? {})) {\n    if (fragment.template) {\n      const ref: ITemplateFieldRef = {\n        templateRef: fragment.template,\n        ...(fragment.params && { templateParams: fragment.params }),\n        ...(fragment.overrides && { templateOverrides: fragment.overrides }),\n        ...(fragment.defaultValues && { defaultValues: fragment.defaultValues }),\n      };\n      fields[prefix] = ref;\n    } else if (fragment.config) {\n      // Inline config: prefix each field\n      for (const [fieldName, fieldConfig] of Object.entries(fragment.config.fields)) {\n        fields[`${prefix}.${fieldName}`] = fieldConfig as IFieldConfig;\n      }\n    }\n  }\n\n  // Merge standalone fields\n  if (options.fields) {\n    for (const [name, config] of Object.entries(options.fields)) {\n      fields[name] = config;\n    }\n  }\n\n  // Build the IFormConfig\n  const config: IFormConfig = {\n    version: 2,\n    fields,\n    ...(options.fieldOrder && { fieldOrder: options.fieldOrder }),\n    ...(options.wizard && { wizard: options.wizard }),\n    ...(options.settings && { settings: options.settings }),\n    ...(options.lookups && { lookups: options.lookups }),\n  };\n\n  // Resolve templates\n  const resolved = resolveTemplates(config);\n\n  // Compile connections if present\n  if (options.connections?.length && resolved._resolvedPorts) {\n    const connectionRules = compileConnections(options.connections, resolved._resolvedPorts);\n    if (connectionRules.length > 0) {\n      // Attach connection rules to the first standalone field (or first fragment field)\n      const targetFieldName =\n        Object.keys(options.fields ?? {})[0] ?? Object.keys(resolved.fields)[0];\n      if (targetFieldName && resolved.fields[targetFieldName]) {\n        resolved.fields[targetFieldName] = {\n          ...resolved.fields[targetFieldName],\n          rules: [\n            ...(resolved.fields[targetFieldName].rules ?? []),\n            ...connectionRules,\n          ],\n        };\n      } else if ((globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env?.NODE_ENV !== \"production\") {\n        // Per audit P1-8: warn when we cannot attach connection rules because\n        // no owner field exists. Previously this was silently dropped.\n        // eslint-disable-next-line no-console\n        console.warn(\n          \"[formosaic] composeForm(): connection rules were defined but there is no owner field to attach them to. \" +\n          \"Add a standalone field (via options.fields) or ensure at least one fragment expands to a visible field.\"\n        );\n      }\n    }\n  }\n\n  return resolved;\n}\n\n/**\n * Type-safe builder for composed forms. At runtime this is identical to `composeForm()`.\n * The value is purely at the type level — IComposeFormOptions provides type checking\n * for fragment definitions, connections, and wizard steps.\n *\n * @example\n * const config = defineComposedForm({\n *   fragments: {\n *     shipping: { template: \"address\", params: { required: true } },\n *     billing: { template: \"address\" },\n *   },\n *   fields: { sameAddr: { type: \"Toggle\", label: \"Same as shipping?\" } },\n *   connections: [{ name: \"copy\", when: ..., source: ..., target: ..., effect: \"copyValues\" }],\n * });\n */\nexport function defineComposedForm(options: IComposeFormOptions): IResolvedFormConfig {\n  return composeForm(options);\n}\n","import React, { useMemo } from \"react\";\nimport { composeForm } from \"../templates/ComposedFormBuilder\";\nimport { IComposeFormOptions, IFragmentDef, IFormConnection } from \"../types/IFormConnection\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\nimport { IFormConfig, IFormSettings } from \"../types/IFormConfig\";\nimport { IWizardConfig } from \"../types/IWizardConfig\";\nimport { IFormFragmentProps } from \"./FormFragment\";\nimport { IFormConnectionProps } from \"./FormConnection\";\nimport { IFormFieldProps } from \"./FormField\";\nimport { Formosaic } from \"./Formosaic\";\nimport { IEntityData } from \"../utils\";\n\nexport interface IComposedFormProps {\n  /** Base config to merge JSX declarations into. */\n  config?: IFormConfig;\n  /** Form-level settings. */\n  settings?: IFormSettings;\n  /** Wizard config. */\n  wizard?: IWizardConfig;\n  /** Field display order. */\n  fieldOrder?: string[];\n  /** Lookup tables. */\n  lookups?: Record<string, unknown>;\n  /** Save callback. */\n  onSave?: (data: IEntityData) => void | Promise<void>;\n  /** Entity data (initial values). */\n  entityData?: IEntityData;\n  /** Whether form is in read-only mode. */\n  readOnly?: boolean;\n  /** Config name for the form instance. Defaults to \"composed\". */\n  configName?: string;\n  /** Test ID prefix. */\n  testId?: string;\n  /** Children: FormFragment, FormField, FormConnection components. */\n  children?: React.ReactNode;\n}\n\nexport function ComposedForm(props: IComposedFormProps): React.ReactElement | null {\n  const {\n    children,\n    config: baseConfig,\n    settings,\n    wizard,\n    fieldOrder,\n    lookups,\n    onSave,\n    entityData,\n    readOnly,\n    configName = \"composed\",\n    testId,\n  } = props;\n\n  const composedConfig = useMemo(() => {\n    const fragments: Record<string, IFragmentDef> = {};\n    const fields: Record<string, IFieldConfig> = {};\n    const connections: IFormConnection[] = [];\n\n    // Walk children to extract props\n    React.Children.forEach(children, (child) => {\n      if (!React.isValidElement(child)) return;\n      const displayName = (child.type as any)?.displayName;\n\n      if (displayName === \"FormFragment\") {\n        const p = child.props as IFormFragmentProps;\n        fragments[p.prefix] = {\n          ...(p.template && { template: p.template }),\n          ...(p.config && { config: p.config }),\n          ...(p.params && { params: p.params }),\n          ...(p.overrides && { overrides: p.overrides }),\n          ...(p.defaultValues && { defaultValues: p.defaultValues }),\n        };\n      } else if (displayName === \"FormField\") {\n        const p = child.props as IFormFieldProps;\n        fields[p.name] = p.config;\n      } else if (displayName === \"FormConnection\") {\n        const p = child.props as IFormConnectionProps;\n        connections.push({\n          name: p.name,\n          when: p.when,\n          source: p.source,\n          target: p.target,\n          effect: p.effect,\n        });\n      }\n    });\n\n    // Merge base config fields/fragments with JSX-extracted ones\n    // JSX children are merged ON TOP of the base config\n    const baseFields = baseConfig?.fields ?? {};\n    const baseTemplates = baseConfig?.templates;\n    const baseLookups = baseConfig?.lookups;\n\n    // Separate templateRef entries from plain fields in baseConfig\n    const baseFragments: Record<string, IFragmentDef> = {};\n    const basePlainFields: Record<string, IFieldConfig> = {};\n    for (const [name, fieldDef] of Object.entries(baseFields)) {\n      if (\"templateRef\" in fieldDef && typeof (fieldDef as any).templateRef === \"string\") {\n        const ref = fieldDef as any;\n        baseFragments[name] = {\n          template: ref.templateRef,\n          ...(ref.templateParams && { params: ref.templateParams }),\n          ...(ref.templateOverrides && { overrides: ref.templateOverrides }),\n          ...(ref.defaultValues && { defaultValues: ref.defaultValues }),\n        };\n      } else {\n        basePlainFields[name] = fieldDef as IFieldConfig;\n      }\n    }\n\n    // Merge: base first, then JSX on top (JSX wins on conflict)\n    const mergedFragments = { ...baseFragments, ...fragments };\n    const mergedFields = { ...basePlainFields, ...fields };\n    const mergedLookups = { ...baseLookups, ...lookups };\n\n    const hasFragments = Object.keys(mergedFragments).length > 0;\n    const hasFields = Object.keys(mergedFields).length > 0;\n\n    if (hasFragments || hasFields) {\n      const options: IComposeFormOptions = {\n        fragments: mergedFragments,\n        ...(Object.keys(mergedFields).length > 0 && { fields: mergedFields }),\n        ...(connections.length > 0 && { connections }),\n        ...(fieldOrder ?? baseConfig?.fieldOrder ? { fieldOrder: fieldOrder ?? baseConfig?.fieldOrder } : {}),\n        ...(wizard ?? baseConfig?.wizard ? { wizard: wizard ?? baseConfig?.wizard } : {}),\n        ...(settings ?? baseConfig?.settings ? { settings: settings ?? baseConfig?.settings } : {}),\n        ...(Object.keys(mergedLookups).length > 0 && { lookups: mergedLookups }),\n      };\n      const composed = composeForm(options);\n      // Carry over inline templates if present\n      if (baseTemplates) {\n        composed.templates = { ...baseTemplates, ...composed.templates };\n      }\n      return composed;\n    }\n\n    // If only baseConfig provided (no JSX children, no fragments), return it as-is\n    return baseConfig ?? { version: 2 as const, fields: {} };\n  }, [children, fieldOrder, wizard, settings, lookups, baseConfig]);\n\n  const defaultValues = entityData ?? {};\n\n  return (\n    <Formosaic\n      configName={configName}\n      testId={testId}\n      formConfig={composedConfig}\n      defaultValues={defaultValues}\n      areAllFieldsReadonly={readOnly}\n      saveData={onSave ? async (data) => { await onSave(data); return data; } : undefined}\n    />\n  );\n}\nComposedForm.displayName = \"ComposedForm\";\n","import { IFormConfig } from \"../types/IFormConfig\";\nimport { IFieldConfig } from \"../types/IFieldConfig\";\n\nexport interface IFormFragmentProps {\n  template?: string;\n  config?: IFormConfig;\n  params?: Record<string, unknown>;\n  prefix: string;\n  overrides?: Record<string, Partial<IFieldConfig>>;\n  defaultValues?: Record<string, unknown>;\n}\n\n/** Declaration-only component. Returns null. Props read by ComposedForm. */\nexport function FormFragment(_props: IFormFragmentProps): null {\n  return null;\n}\nFormFragment.displayName = \"FormFragment\";\n","import { ICondition } from \"../types/ICondition\";\n\nexport interface IFormConnectionProps {\n  name: string;\n  when: ICondition;\n  source: { fragment: string; port: string };\n  target: { fragment: string; port: string };\n  effect: \"copyValues\" | \"hide\" | \"readOnly\" | \"computeFrom\";\n}\n\n/** Declaration-only component. Returns null. Props read by ComposedForm. */\nexport function FormConnection(_props: IFormConnectionProps): null {\n  return null;\n}\nFormConnection.displayName = \"FormConnection\";\n","import { IFieldConfig } from \"../types/IFieldConfig\";\n\nexport interface IFormFieldProps {\n  name: string;\n  config: IFieldConfig;\n}\n\n/** Declaration-only component. Returns null. Props read by ComposedForm. */\nexport function FormField(_props: IFormFieldProps): null {\n  return null;\n}\nFormField.displayName = \"FormField\";\n"],"mappings":"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","names":["RulesEngineActionType","maxKb","pattern","getNestedValue","React","jsx","pattern","React","jsx","React","React","jsx","jsxs","React","React","registry","getNestedValue","React","useFormContext","React","useFormContext","React","jsx","jsxs","React","required","Fragment","jsx","jsxs","React","required","useFormContext","jsx","jsxs","useFormContext","React","React","useFormContext","React","jsx","jsxs","jsx","jsxs","React","useFormContext","jsx","jsxs","React","dirtyFields","React","registry","useRef","useRef","useEffect","useRef","config","React","useMemo","jsx","useMemo","React"]}