{"version":3,"file":"mn-angular-lib-modal-ui.mjs","sources":["../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-form-body/mn-custom-field-host.directive.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-custom-body-host/mn-custom-body-host.component.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-form-body/mn-form-body.component.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-form-body/mn-form-body.component.html","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-footer-actions/mn-footer-actions.component.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-wizard-body/mn-wizard-body.component.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-wizard-body/mn-wizard-body.component.html","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component.html","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-modal-shell/mn-modal-shell.component.ts","../../../projects/mn-angular-lib/modal-ui/src/mn-modal/components/mn-modal-shell/mn-modal-shell.component.html","../../../projects/mn-angular-lib/modal-ui/public-api.ts","../../../projects/mn-angular-lib/modal-ui/mn-angular-lib-modal-ui.ts"],"sourcesContent":["import {\n  Directive,\n  Input,\n  ViewContainerRef,\n  OnInit,\n  OnDestroy,\n  ComponentRef,\n  Type,\n  forwardRef,\n  inject\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { ModalInputMap } from 'mn-angular-lib/modal-core';\n\n@Directive({\n  selector: '[mnCustomFieldHost]',\n  standalone: true,\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MnCustomFieldHostDirective),\n      multi: true,\n    },\n  ],\n})\nexport class MnCustomFieldHostDirective implements OnInit, OnDestroy, ControlValueAccessor {\n  private vcr = inject(ViewContainerRef);\n\n  @Input() component!: Type<unknown>;\n  @Input() inputs?: ModalInputMap;\n\n  private componentRef?: ComponentRef<unknown>;\n  private onChange: (val: unknown) => void = () => {\n  };\n  private onTouched: () => void = () => {};\n\n  ngOnInit(): void {\n    if (!this.component) return;\n\n    this.vcr.clear();\n    this.componentRef = this.vcr.createComponent(this.component);\n\n    // Pass inputs to the component\n    if (this.inputs) {\n      Object.entries(this.inputs).forEach(([key, value]) => {\n        (this.componentRef!.instance as Record<string, unknown>)[key] = value;\n      });\n    }\n\n    // Wire up value accessor if the component supports it\n    const instance = this.componentRef.instance as {\n      registerOnChange?: (fn: (val: unknown) => void) => void;\n      registerOnTouched?: (fn: () => void) => void;\n    };\n    if (typeof instance.registerOnChange === 'function') {\n      instance.registerOnChange((val: unknown) => this.onChange(val));\n    }\n    if (typeof instance.registerOnTouched === 'function') {\n      instance.registerOnTouched(() => this.onTouched());\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.componentRef?.destroy();\n  }\n\n  writeValue(val: unknown): void {\n    const instance = this.componentRef?.instance as { writeValue?: (val: unknown) => void };\n    if (instance && typeof instance.writeValue === 'function') {\n      instance.writeValue(val);\n    }\n  }\n\n  registerOnChange(fn: (val: unknown) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    const instance = this.componentRef?.instance as { setDisabledState?: (isDisabled: boolean) => void };\n    if (instance && typeof instance.setDisabledState === 'function') {\n      instance.setDisabledState(isDisabled);\n    }\n  }\n}\n","import {\n  Component,\n  Input,\n  OnInit,\n  Type,\n  ViewChild,\n  ViewContainerRef,\n  ComponentRef,\n  TemplateRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnModalRef } from 'mn-angular-lib/modal-core';\nimport { CustomModalConfig } from 'mn-angular-lib/modal-core';\n\n@Component({\n  selector: 'mn-custom-body-host',\n  standalone: true,\n  imports: [CommonModule],\n  template: '<ng-container #container></ng-container>',\n})\nexport class MnCustomBodyHostComponent implements OnInit {\n  @Input() config!: CustomModalConfig;\n  @Input() modalRef!: MnModalRef<unknown>;\n\n  @ViewChild('container', { read: ViewContainerRef }) container!: ViewContainerRef;\n\n  private componentRef?: ComponentRef<unknown>;\n\n  ngOnInit(): void {\n    setTimeout(() => this.loadContent(), 0);\n  }\n\n  private loadContent(): void {\n    if (!this.container) return;\n\n    this.container.clear();\n\n    if (this.config.component) {\n      this.attachComponent(this.config.component);\n    } else if (this.config.template) {\n      this.attachTemplate(this.config.template);\n    }\n  }\n\n  attachComponent(component: Type<unknown>): void {\n    this.componentRef = this.container.createComponent(component);\n\n    // Pass inputs to the component\n    if (this.config.inputs) {\n      Object.entries(this.config.inputs).forEach(([key, value]) => {\n        (this.componentRef!.instance as Record<string, unknown>)[key] = value;\n      });\n    }\n\n    // Pass modalRef if the component has a modalRef property\n    const instance = this.componentRef.instance as Record<string, unknown>;\n    if (instance && 'modalRef' in instance) {\n      instance['modalRef'] = this.modalRef;\n    }\n  }\n\n  attachTemplate(template: TemplateRef<unknown>): void {\n    this.container.createEmbeddedView(template, {\n      $implicit: this.modalRef,\n      modalRef: this.modalRef,\n    });\n  }\n}\n","import {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  QueryList,\n  Type,\n  ViewChildren,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  AbstractControlOptions,\n  FormBuilder,\n  FormGroup,\n  ReactiveFormsModule,\n  ValidatorFn,\n  Validators,\n} from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { MnModalRef } from 'mn-angular-lib/modal-core';\nimport {\n  FieldDataSource,\n  FieldKind,\n  FieldRequiredCondition,\n  FieldVisibilityCondition,\n  FileFieldConfig,\n  FormFieldConfig,\n  FormFieldGroup,\n  FormModalConfig,\n  FormRow,\n  ModalCloseReason,\n  ModalI18nLabels,\n  ModalInputMap,\n  MultiSelectTableFieldConfig,\n  RatingFieldConfig,\n  SelectOption,\n  SingleSelectTableFieldConfig,\n  SliderFieldConfig,\n  SubmitMode,\n} from 'mn-angular-lib/modal-core';\nimport { MnButton } from 'mn-angular-lib/button';\nimport { MnInputField } from 'mn-angular-lib/forms';\nimport { MnCheckbox } from 'mn-angular-lib/forms';\nimport { MnDatetime } from 'mn-angular-lib/forms';\nimport { MnMultiSelect } from 'mn-angular-lib/forms';\nimport { MnTextarea } from 'mn-angular-lib/forms';\nimport { MnFileInput } from 'mn-angular-lib/forms';\nimport { MnSelect, MnSelectOption, MnSelectProps } from 'mn-angular-lib/forms';\nimport { MnCustomFieldHostDirective } from './mn-custom-field-host.directive';\nimport { MnLanguageService } from 'mn-angular-lib/core';\nimport { MnTable, TableDataSource } from 'mn-angular-lib/collection';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\nimport { LucideDynamicIcon, LucideIconData } from '@lucide/angular';\nimport { MN_MODAL_ACTION_ICONS, MODAL_ACTION_ICON_SIZE } from 'mn-angular-lib/modal-core';\n\n/**\n * A structural \"view\" over the {@link FormFieldConfig} discriminated union that\n * exposes every member-specific property as optional. The template and several\n * helpers need to read properties that only exist on some union members (e.g.\n * `placeholder`, `swatches`, `mode`, `dataSource`, `validators`). Casting the\n * field to this view keeps that access type-checked without resorting to `any`.\n */\ntype FormFieldView<TModel> = FormFieldConfig<TModel> & {\n  label?: string;\n  placeholder?: string;\n  validators?: ValidatorFn[];\n  asyncValidators?: ValidatorFn[];\n  updateOn?: 'change' | 'blur' | 'submit';\n  options?: SelectOption[];\n  dataSource?: FieldDataSource;\n  disabled?: boolean;\n  readOnly?: boolean;\n  visible?: FieldVisibilityCondition<TModel>;\n  conditionallyRequired?: FieldRequiredCondition<TModel>;\n  autoFocus?: boolean;\n  defaultValue?: unknown;\n  mask?: string;\n  autocomplete?: string;\n  minDate?: string;\n  maxDate?: string;\n  mode?: 'date' | 'time' | 'datetime-local';\n  min?: number | string;\n  max?: number | string;\n  step?: number;\n  rows?: number;\n  searchable?: boolean;\n  searchPlaceholder?: string;\n  maxSelections?: number;\n  collapseThreshold?: number;\n  collapsePlaceholder?: string;\n  allSelectedPlaceholder?: string;\n  swatches?: string[];\n  showValue?: boolean;\n  unit?: string;\n  accept?: string;\n  multiple?: boolean;\n  displayMode?: 'dropzone' | 'thumbnail' | 'list' | 'compact';\n  dropzoneHint?: string;\n  dropActiveHint?: string;\n  replaceLabel?: string;\n  removeLabel?: string;\n  currentUrl?: string | null;\n  currentUrls?: string[] | null;\n  onClear?: () => void;\n  // Non-optional in the view: the template only reads these inside the\n  // matching @case/@if guards where the runtime value is always present.\n  // Keeping them non-undefined avoids spurious template type errors that the\n  // previous `any` cast masked, without changing runtime behavior.\n  maxSize: number;\n  maxFiles?: number;\n  component: Type<unknown>;\n  inputs?: ModalInputMap;\n};\n\n@Component({\n  selector: 'mn-form-body',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MnButton,\n    MnInputField,\n    MnCheckbox,\n    MnDatetime,\n    MnMultiSelect,\n    MnTextarea,\n    MnFileInput,\n    MnSelect,\n    MnCustomFieldHostDirective,\n    MnTable,\n    MnCustomBodyHostComponent,\n    LucideDynamicIcon,\n  ],\n  templateUrl: './mn-form-body.component.html',\n  styleUrls: ['./mn-form-body.component.css'],\n})\nexport class MnFormBodyComponent<TModel = unknown, TResult = TModel>\n  implements OnInit, OnDestroy, AfterViewInit\n{\n  private fb = inject(FormBuilder);\n\n  /**\n   * Change detector used to announce state this component mutates outside an Angular\n   * event handler — after an `await`, or from an RxJS subscription. Consuming apps run\n   * zoneless, where such a write notifies nothing: the view is never marked dirty, so it\n   * keeps rendering the stale value and `checkNoChanges` then reports it as NG0100\n   * (e.g. the submit button staying disabled on \"Submitting...\" after a failed submit).\n   * Every async mutation of {@link isSubmitting}, {@link fieldLoading}, {@link fieldOptions}\n   * and {@link formErrors} must be followed by `markForCheck()`.\n   */\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  @Input() config!: FormModalConfig<TModel, TResult>;\n  @Input() modalRef!: MnModalRef<TResult>;\n  @Input() hideFooter = false;\n  @Input() hideCustomBody = false;\n  @Output() formStatusChange = new EventEmitter<string>();\n\n  @ViewChildren(MnInputField) inputFields?: QueryList<MnInputField>;\n  @ViewChildren(MnTextarea) textareas?: QueryList<MnTextarea>;\n\n  form!: FormGroup;\n  rows: FormRow<TModel>[] = [];\n  fieldGroups: FormFieldGroup<TModel>[] = [];\n  isSubmitting = false;\n  readonly FieldKind = FieldKind;\n  readonly ModalCloseReason = ModalCloseReason;\n\n  /** Cross-field validation errors: { fieldKey: errorMessage } */\n  formErrors: Record<string, string> = {};\n\n  /** Track which fields are currently visible (for conditional fields) */\n  fieldVisibility: Record<string, boolean> = {};\n\n  /** Track which fields are currently conditionally required */\n  fieldConditionallyRequired: Record<string, boolean> = {};\n\n  /** Track loading state per field for async data sources */\n  fieldLoading: Record<string, boolean> = {};\n\n  /** Dynamic options loaded from data sources */\n  fieldOptions: Record<string, SelectOption[]> = {};\n\n  private valueChangesSubscription?: Subscription;\n\n  asField(field: FormFieldConfig<TModel>): FormFieldView<TModel> {\n    return field as FormFieldView<TModel>;\n  }\n\n  asKey(key: keyof TModel | string): string {\n    return key as string;\n  }\n\n  // The template builds untyped `props` object literals and passes them to\n  // strongly-typed child component `[props]` inputs. There is no single static\n  // type for those literals, so this identity bridge must return `any` to keep\n  // the template assignment-compatible. This is a genuine template-bridge case.\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  asAny(val: unknown): any {\n    return val;\n  }\n\n  hasRequiredValidator(field: FormFieldConfig<TModel>): boolean {\n    const view = field as FormFieldView<TModel>;\n    // Check if conditionallyRequired is currently active\n    if (view.conditionallyRequired) {\n      const formValue = (this.form?.value ?? {}) as Partial<TModel>;\n      if (view.conditionallyRequired(formValue)) return true;\n    }\n    const validators = view.validators;\n    if (!validators) return false;\n    // Check if Validators.required is in the array by testing a dummy control\n    const control = this.fb.control(null, validators);\n    const errors = control.errors;\n    return errors != null && 'required' in errors;\n  }\n\n  /** Store table data sources keyed by field key for template access */\n  tableDataSources: Record<string, TableDataSource<unknown>> = {};\n\n  private languageService = inject(MnLanguageService);\n\n  private static readonly DEFAULT_LABELS: Record<string, string> = {\n    submit: 'Submit',\n    cancel: 'Cancel',\n    submitting: 'Submitting...',\n    selectPlaceholder: 'Select...',\n    loading: 'Loading...',\n    fileUploadPrompt: 'Click or drag files here',\n    fieldRequired: 'This field is required',\n    loadingOptions: 'Loading options...',\n    accepted: 'Accepted:',\n    maxSize: 'Max size:',\n  };\n\n  private resolveLabel(i18nValue: string | undefined, key: string): string {\n    if (i18nValue) return i18nValue;\n    const translated = this.languageService.translate(`common.${key}`);\n    return translated === `common.${key}` ? MnFormBodyComponent.DEFAULT_LABELS[key] : translated;\n  }\n\n  /** Resolved i18n labels with defaults, falling back to translated keys */\n  get labels() {\n    // The config's i18n map may carry extra keys beyond ModalI18nLabels (e.g.\n    // fieldRequired, loadingOptions), so widen the type to expose them as\n    // declared optional properties (keeps dot access type-checked).\n    const i18n: ModalI18nLabels &\n      Partial<Record<'fieldRequired' | 'loadingOptions' | 'accepted' | 'maxSize', string>> =\n      this.config.i18n || {};\n    return {\n      submit: this.resolveLabel(i18n.submit, 'submit'),\n      cancel: this.resolveLabel(i18n.cancel, 'cancel'),\n      submitting: this.resolveLabel(i18n.submitting, 'submitting'),\n      selectPlaceholder: this.resolveLabel(i18n.selectPlaceholder, 'selectPlaceholder'),\n      loading: this.resolveLabel(i18n.loading, 'loading'),\n      fileUploadPrompt: this.resolveLabel(i18n.fileUploadPrompt, 'fileUploadPrompt'),\n      fieldRequired: this.resolveLabel(i18n.fieldRequired, 'fieldRequired'),\n      loadingOptions: this.resolveLabel(i18n.loadingOptions, 'loadingOptions'),\n      accepted: this.resolveLabel(i18n.accepted, 'accepted'),\n      maxSize: this.resolveLabel(i18n.maxSize, 'maxSize'),\n    };\n  }\n\n  ngOnInit(): void {\n    this.initializeForm();\n    this.buildRows();\n    this.initializeVisibility();\n    this.initializeDataSources();\n    this.initializeTableFields();\n    this.subscribeToValueChanges();\n\n    if (this.config.disabled || this.config.readOnly) {\n      this.form.disable();\n    }\n\n    // Emit initial status\n    setTimeout(() => {\n      this.formStatusChange.emit(this.form.status);\n    });\n  }\n\n  ngAfterViewInit(): void {\n    // Small delay to ensure children are fully rendered and MnModalShell hasn't just stolen focus\n    setTimeout(() => {\n      this.applyAutoFocus();\n    }, 100);\n  }\n\n  public applyAutoFocus(): void {\n    const autoFocusField = this.config.fields.find((f) => (f as FormFieldView<TModel>).autoFocus);\n    if (!autoFocusField) return;\n\n    const key = autoFocusField.key as string;\n\n    // Small delay to ensure browser is ready to focus\n    setTimeout(() => {\n      // Try finding in MnInputField components\n      const inputField = this.inputFields?.find((f) => f.props.id === key);\n      if (inputField) {\n        inputField.focus();\n        return;\n      }\n\n      // Try finding in MnTextarea components\n      const textarea = this.textareas?.find((f) => f.props?.id === key);\n      if (textarea) {\n        textarea.focus();\n        return;\n      }\n\n      // Fallback to native element if possible\n      const el = document.getElementById(key);\n      if (el) el.focus();\n    }, 50);\n  }\n\n  ngOnDestroy(): void {\n    this.valueChangesSubscription?.unsubscribe();\n  }\n\n  private initializeForm(): void {\n    const formControls: Record<string, [unknown, AbstractControlOptions]> = {};\n\n    this.config.fields.forEach((field) => {\n      const fieldConfig = field as FormFieldView<TModel>;\n      let initialValue: unknown = this.config.initialValue?.[field.key as keyof TModel] ?? null;\n\n      // Handle checkbox default values\n      if (field.kind === FieldKind.CHECKBOX && initialValue === null) {\n        initialValue = fieldConfig.defaultValue ?? false;\n      }\n\n      const validators = fieldConfig.validators || [];\n      const asyncValidators = fieldConfig.asyncValidators || [];\n      const updateOn = fieldConfig.updateOn || 'change';\n\n      formControls[field.key as string] = [\n        initialValue,\n        {\n          validators,\n          asyncValidators,\n          updateOn,\n        },\n      ];\n    });\n\n    this.form = this.fb.group(formControls);\n\n    // Apply Angular FormGroup-level validators\n    if (this.config.groupValidators && this.config.groupValidators.length > 0) {\n      this.form.setValidators(this.config.groupValidators);\n      this.form.updateValueAndValidity();\n    }\n\n    // Apply disabled/readOnly state to controls\n    this.config.fields.forEach((field) => {\n      const fieldView = field as FormFieldView<TModel>;\n      const control = this.form.get(field.key as string);\n      if (control && (fieldView.disabled || fieldView.readOnly)) {\n        control.disable();\n      }\n    });\n  }\n\n  isFieldReadOnly(field: FormFieldConfig<TModel>): boolean {\n    return this.config.readOnly === true || (field as FormFieldView<TModel>).readOnly === true;\n  }\n\n  isFieldDisabled(field: FormFieldConfig<TModel>): boolean {\n    return this.config.disabled === true || (field as FormFieldView<TModel>).disabled === true;\n  }\n\n  /** Track which field groups are currently visible */\n  groupVisibility: Record<string, boolean> = {};\n\n  private buildRows(): void {\n    if (this.config.rows && this.config.rows.length > 0) {\n      this.rows = this.config.rows;\n    } else {\n      // Create rows for fields that are not in any row or group\n      const fieldsInGroups = new Set<string>();\n      (this.config.fieldGroups || []).forEach((g) => {\n        (g.rows || []).forEach((r) =>\n          r.fields.forEach((f) => fieldsInGroups.add(f.field.key as string)),\n        );\n        // Also check if group has flat fields list (compatibility)\n        if (g.fields) {\n          g.fields.forEach((f) => fieldsInGroups.add(f.key as string));\n        }\n      });\n\n      const fieldsInRows = new Set<string>();\n      (this.config.rows || []).forEach((r) =>\n        r.fields.forEach((f) => fieldsInRows.add(f.field.key as string)),\n      );\n\n      const standaloneFields = this.config.fields.filter(\n        (f) => !fieldsInGroups.has(f.key as string) && !fieldsInRows.has(f.key as string),\n      );\n\n      if (standaloneFields.length > 0) {\n        this.rows = standaloneFields.map((field) => ({\n          columns: 1,\n          fields: [{ field, span: 1 }],\n        }));\n      }\n    }\n    // Build field groups\n    this.fieldGroups = this.config.fieldGroups || [];\n    // Initialize group visibility\n    this.initializeGroupVisibility();\n  }\n\n  private initializeGroupVisibility(): void {\n    this.fieldGroups.forEach((group, index) => {\n      const key = group.title || `group-${index}`;\n      const isVisible = group.visible ? group.visible(this.form.value) : true;\n      this.groupVisibility[key] = isVisible;\n      // If group is hidden, clear validators on its fields\n      if (!isVisible) {\n        group.fields.forEach((field) => {\n          const control = this.form.get(field.key as string);\n          if (control) {\n            control.clearValidators();\n            control.updateValueAndValidity({ emitEvent: false });\n          }\n        });\n      }\n    });\n  }\n\n  private updateGroupVisibility(): void {\n    const formValue = this.form.value;\n    this.fieldGroups.forEach((group, index) => {\n      const key = group.title || `group-${index}`;\n      const wasVisible = this.groupVisibility[key];\n      const isVisible = group.visible ? group.visible(formValue) : true;\n      this.groupVisibility[key] = isVisible;\n\n      if (!isVisible && wasVisible) {\n        // Group became hidden — clear validators on its fields\n        group.fields.forEach((field) => {\n          const control = this.form.get(field.key as string);\n          if (control) {\n            control.clearValidators();\n            control.updateValueAndValidity({ emitEvent: false });\n          }\n        });\n      } else if (isVisible && !wasVisible) {\n        // Group became visible — restore validators\n        group.fields.forEach((field) => {\n          const fieldView = field as FormFieldView<TModel>;\n          const validators = fieldView.validators || [];\n          const control = this.form.get(field.key as string);\n          if (control) {\n            control.setValidators(validators);\n            control.updateValueAndValidity({ emitEvent: false });\n          }\n        });\n      }\n    });\n  }\n\n  isGroupVisible(group: FormFieldGroup<TModel>): boolean {\n    const key = group.title || `group-${this.fieldGroups.indexOf(group)}`;\n    return this.groupVisibility[key];\n  }\n\n  // =========================\n  // Feature 1: Conditional/Dynamic Fields\n  // =========================\n\n  private initializeVisibility(): void {\n    const formValue = this.form.value as Partial<TModel>;\n    this.config.fields.forEach((field) => {\n      const key = field.key as string;\n      const fieldView = field as FormFieldView<TModel>;\n      const isVisible = fieldView.visible ? fieldView.visible(formValue) : true;\n      this.fieldVisibility[key] = isVisible;\n\n      // If initially hidden, clear validators so they don't block submit\n      if (!isVisible) {\n        const control = this.form.get(key);\n        if (control) {\n          control.clearValidators();\n          control.updateValueAndValidity({ emitEvent: false });\n        }\n      } else if (fieldView.conditionallyRequired) {\n        // Initialize conditionallyRequired state for visible fields\n        const isRequired = fieldView.conditionallyRequired(formValue);\n        this.fieldConditionallyRequired[key] = isRequired;\n        if (isRequired) {\n          const control = this.form.get(key);\n          if (control) {\n            const validators = this.buildValidators(fieldView, formValue);\n            control.setValidators(validators);\n            control.updateValueAndValidity({ emitEvent: false });\n          }\n        }\n      }\n    });\n  }\n\n  private updateVisibility(): void {\n    const formValue = this.form.value as Partial<TModel>;\n    this.config.fields.forEach((field) => {\n      const key = field.key as string;\n      const fieldView = field as FormFieldView<TModel>;\n      const wasVisible = this.fieldVisibility[key];\n      const isVisible = fieldView.visible ? fieldView.visible(formValue) : true;\n      this.fieldVisibility[key] = isVisible;\n\n      // When a field becomes hidden, clear its validators so it doesn't block submit\n      const control = this.form.get(key);\n      if (control) {\n        if (!isVisible && wasVisible) {\n          control.clearValidators();\n          control.updateValueAndValidity({ emitEvent: false });\n        } else if (isVisible && !wasVisible) {\n          // Restore validators (including conditionallyRequired if active)\n          const validators = this.buildValidators(fieldView, formValue);\n          control.setValidators(validators);\n          control.updateValueAndValidity({ emitEvent: false });\n        } else if (isVisible) {\n          // Update conditionallyRequired for visible fields\n          this.updateConditionallyRequired(fieldView, formValue);\n        }\n      }\n    });\n  }\n\n  /**\n   * Builds the full validator array for a field, including conditionallyRequired.\n   * @param field The field configuration view.\n   * @param formValue The current form values.\n   * @returns Array of validators to apply.\n   */\n  private buildValidators(field: FormFieldView<TModel>, formValue: Partial<TModel>): ValidatorFn[] {\n    const baseValidators = field.validators ? [...field.validators] : [];\n    if (field.conditionallyRequired && field.conditionallyRequired(formValue)) {\n      if (!baseValidators.includes(Validators.required)) {\n        baseValidators.push(Validators.required);\n      }\n    }\n    return baseValidators;\n  }\n\n  /**\n   * Updates the conditionallyRequired state for a single field and adjusts validators.\n   * @param field The field configuration view.\n   * @param formValue The current form values.\n   */\n  private updateConditionallyRequired(\n    field: FormFieldView<TModel>,\n    formValue: Partial<TModel>,\n  ): void {\n    if (!field.conditionallyRequired) return;\n    const key = field.key as string;\n    const wasRequired = this.fieldConditionallyRequired[key] ?? false;\n    const isRequired = field.conditionallyRequired(formValue);\n    this.fieldConditionallyRequired[key] = isRequired;\n\n    if (isRequired !== wasRequired) {\n      const control = this.form.get(key);\n      if (control) {\n        const validators = this.buildValidators(field, formValue);\n        control.setValidators(validators);\n        control.updateValueAndValidity({ emitEvent: false });\n      }\n    }\n  }\n\n  isFieldVisible(field: FormFieldConfig<TModel>): boolean {\n    return this.fieldVisibility[field.key as string];\n  }\n\n  // =========================\n  // Feature 2: Cross-Field Validation\n  // =========================\n\n  private runFormValidators(): void {\n    this.formErrors = {};\n    if (!this.config.formValidators) return;\n\n    const formValue = this.form.value;\n    for (const validator of this.config.formValidators) {\n      const errors = validator(formValue);\n      if (errors) {\n        Object.assign(this.formErrors, errors);\n      }\n    }\n  }\n\n  getFieldError(key: string): string | null {\n    return this.formErrors[key] || null;\n  }\n\n  get hasFormErrors(): boolean {\n    return Object.keys(this.formErrors).length > 0;\n  }\n\n  // =========================\n  // Feature 3: Async Data Sources\n  // =========================\n\n  private initializeDataSources(): void {\n    this.config.fields.forEach((field) => {\n      const fieldView = field as FormFieldView<TModel>;\n      if (fieldView.dataSource) {\n        this.loadFieldOptions(\n          field.key as string,\n          fieldView.dataSource,\n          this.form.value as Partial<TModel>,\n        );\n      }\n    });\n  }\n\n  isFieldLoading(key: string): boolean {\n    return this.fieldLoading[key];\n  }\n\n  /** Get options for a field — uses dataSource options if available, otherwise static options */\n  getFieldOptions(field: FormFieldConfig<TModel>): SelectOption[] {\n    const key = field.key as string;\n    if (this.fieldOptions[key] !== undefined) {\n      return this.fieldOptions[key];\n    }\n    return (field as FormFieldView<TModel>).options || [];\n  }\n\n  /** Convert SelectOption[] to MnSelectOption[] for mn-lib-select */\n  getSelectOptions(field: FormFieldConfig<TModel>): MnSelectOption[] {\n    return this.getFieldOptions(field).map((o) => ({\n      label: o.label,\n      value: o.value,\n      disabled: o.state === 'disabled',\n    }));\n  }\n\n  getSelectProps(field: FormFieldConfig<TModel>): MnSelectProps {\n    return {\n      id: field.key as string,\n      label: this.asField(field).label,\n      placeholder: this.isFieldLoading(field.key as string)\n        ? this.labels.loading\n        : this.labels.selectPlaceholder,\n      options: this.getSelectOptions(field),\n      fullWidth: true,\n    };\n  }\n\n  private async loadFieldOptions(\n    key: string,\n    dataSource: FieldDataSource,\n    formValue: Partial<TModel>,\n  ): Promise<void> {\n    this.fieldLoading[key] = true;\n    this.cdr.markForCheck();\n    try {\n      this.fieldOptions[key] = await dataSource.load(formValue);\n    } catch (error) {\n      console.error(`Failed to load options for field '${key}':`, error);\n      this.fieldOptions[key] = [];\n    } finally {\n      // Resolved after an `await`, so nothing has told Angular the spinner can go and the\n      // options have arrived. Without this the field renders \"Loading options...\" forever.\n      this.fieldLoading[key] = false;\n      this.cdr.markForCheck();\n    }\n  }\n\n  // =========================\n  // Feature: Multi-Select Table Fields\n  // =========================\n\n  private initializeTableFields(): void {\n    this.config.fields.forEach((field) => {\n      if (field.kind === FieldKind.MULTI_SELECT_TABLE) {\n        const tableField = field as MultiSelectTableFieldConfig<TModel>;\n        const ds = tableField.tableDataSource;\n        // Force multi selection mode\n        ds.selectionMode = 'multi';\n\n        // Default the selection summary on. A table used as a form field is always\n        // inside a modal, where it is short, paged and searched — so the rows the\n        // user has already picked are the ones most likely to be scrolled out of\n        // sight, which is exactly what the summary exists to prevent. Set\n        // `selectionSummary: false` on the data source to opt a field out.\n        ds.selectionSummary ??= true;\n\n        // A modal is too short to make a rows-per-page choice meaningful, and the\n        // selector costs a row of footer the sheet cannot spare. Pinning the options\n        // to the single configured size hides it through the paginator's existing\n        // \"more than one option\" rule rather than adding a second way to hide it.\n        ds.pageSizeOptions = [ds.pageSize ?? 10];\n\n        // Pre-select rows from the form's initial value\n        const control = this.form.get(field.key as string);\n        if (control && Array.isArray(control.value) && control.value.length > 0) {\n          ds.initialSelectedIds = control.value.map((v: unknown) => String(v));\n        } else if (control && control.value === null) {\n          control.setValue([], { emitEvent: false });\n        }\n\n        this.tableDataSources[field.key as string] = ds;\n      } else if (field.kind === FieldKind.SINGLE_SELECT_TABLE) {\n        const tableField = field as SingleSelectTableFieldConfig<TModel>;\n        const ds = tableField.tableDataSource;\n        // Force single selection mode\n        ds.selectionMode = 'single';\n\n        // Pre-select row from the form's initial value\n        const control = this.form.get(field.key as string);\n        if (control && control.value != null) {\n          ds.initialSelectedIds = [String(control.value)];\n        }\n\n        this.tableDataSources[field.key as string] = ds;\n      }\n    });\n  }\n\n  onTableSelectionChange(field: FormFieldConfig<TModel>, selectedRows: unknown[]): void {\n    if (field.kind === FieldKind.SINGLE_SELECT_TABLE) {\n      const tableField = field as SingleSelectTableFieldConfig<TModel>;\n      const getVal = tableField.getRowValue || tableField.tableDataSource.getID;\n      const value = selectedRows.length > 0 ? getVal(selectedRows[0]) : null;\n      const control = this.form.get(field.key as string);\n      if (control) {\n        control.setValue(value);\n        control.markAsTouched();\n      }\n    } else {\n      const tableField = field as MultiSelectTableFieldConfig<TModel>;\n      const getVal = tableField.getRowValue || tableField.tableDataSource.getID;\n      const values = selectedRows.map((row) => getVal(row));\n      const control = this.form.get(field.key as string);\n      if (control) {\n        control.setValue(values);\n        control.markAsTouched();\n      }\n    }\n  }\n\n  // =========================\n  // Feature: Rating Fields\n  // =========================\n\n  getRatingRange(field: FormFieldConfig<TModel>): number[] {\n    const max = (field as RatingFieldConfig<TModel>).max || 5;\n    return Array.from({ length: max }, (_, i) => i + 1);\n  }\n\n  setRating(field: FormFieldConfig<TModel>, value: number): void {\n    const control = this.form.get(field.key as string);\n    if (control) {\n      control.setValue(value);\n      control.markAsTouched();\n    }\n  }\n\n  getRatingValue(field: FormFieldConfig<TModel>): number {\n    return this.form.get(field.key as string)?.value || 0;\n  }\n\n  // =========================\n  // Feature: Slider Fields\n  // =========================\n\n  onSliderChange(field: FormFieldConfig<TModel>, event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const value = parseFloat(input.value);\n    const control = this.form.get(field.key as string);\n    if (control) {\n      control.setValue(value);\n      control.markAsTouched();\n    }\n  }\n\n  getSliderValue(field: FormFieldConfig<TModel>): number {\n    const f = field as SliderFieldConfig<TModel>;\n    return this.form.get(field.key as string)?.value ?? f.min ?? 0;\n  }\n\n  // =========================\n  // Feature: Color Fields\n  // =========================\n\n  onColorChange(field: FormFieldConfig<TModel>, event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const control = this.form.get(field.key as string);\n    if (control) {\n      control.setValue(input.value);\n      control.markAsTouched();\n    }\n  }\n\n  setColorFromSwatch(field: FormFieldConfig<TModel>, color: string): void {\n    const control = this.form.get(field.key as string);\n    if (control) {\n      control.setValue(color);\n      control.markAsTouched();\n    }\n  }\n\n  getColorValue(field: FormFieldConfig<TModel>): string {\n    return this.form.get(field.key as string)?.value || '#000000';\n  }\n\n  // =========================\n  // Value Changes Subscription\n  // =========================\n\n  private subscribeToValueChanges(): void {\n    // Initialize previousFormValue with current form state to avoid false \"changed\" on first emission\n    this.previousFormValue = { ...this.form.value };\n\n    this.valueChangesSubscription = this.form.valueChanges.subscribe((formValue) => {\n      // Update conditional visibility\n      this.updateVisibility();\n\n      // Update group visibility\n      this.updateGroupVisibility();\n\n      // Run cross-field validators\n      this.runFormValidators();\n\n      // Reload data sources that depend on changed fields\n      this.reloadDependentDataSources(formValue);\n\n      // Emit status change\n      this.formStatusChange.emit(this.form.status);\n\n      // `valueChanges` can fire from outside an Angular event handler (a CVA writing on\n      // init, or a caller patching the form), and the callbacks above rewrite visibility,\n      // required-state and cross-field errors that the template reads.\n      this.cdr.markForCheck();\n    });\n  }\n\n  private previousFormValue: Partial<TModel> = {};\n\n  private reloadDependentDataSources(formValue: Partial<TModel>): void {\n    this.config.fields.forEach((field) => {\n      const fieldView = field as FormFieldView<TModel>;\n      const dataSource: FieldDataSource | undefined = fieldView.dataSource;\n      if (!dataSource?.dependsOn) return;\n\n      // Check if any dependency changed\n      const changed = dataSource.dependsOn.some((depKey) => {\n        return formValue[depKey as keyof TModel] !== this.previousFormValue[depKey as keyof TModel];\n      });\n\n      if (changed) {\n        this.loadFieldOptions(field.key as string, dataSource, formValue);\n      }\n    });\n    this.previousFormValue = { ...formValue };\n  }\n\n  // =========================\n  // Feature: File Upload Fields\n  // =========================\n\n  /**\n   * Invokes a FILE field's `onClear` callback when its existing image is removed.\n   * FILE fields render {@link MnFileInput}, which owns selection/validation and\n   * writes the value (`File | File[] | null`) straight to the form control.\n   * @param field The field whose existing image was cleared.\n   */\n  onFileCleared(field: FormFieldConfig<TModel>): void {\n    (field as FileFieldConfig<TModel>).onClear?.();\n  }\n\n  /** Icon size (px) for the footer action buttons. */\n  readonly actionIconSize = MODAL_ACTION_ICON_SIZE;\n\n  /** Whether action-button icons should render on this modal (defaults to true). */\n  get showActionIcons(): boolean {\n    return this.config.showActionIcons !== false;\n  }\n\n  /** The leading icon for the submit button, or null when icons are disabled. */\n  get submitIcon(): LucideIconData | null {\n    return this.showActionIcons ? MN_MODAL_ACTION_ICONS.confirm : null;\n  }\n\n  /** The leading icon for the cancel button, or null when icons are disabled. */\n  get cancelIcon(): LucideIconData | null {\n    return this.showActionIcons ? MN_MODAL_ACTION_ICONS.cancel : null;\n  }\n\n  async submit(): Promise<void> {\n    // Run cross-field validators before submit\n    this.runFormValidators();\n\n    if (this.form.invalid || this.isSubmitting || this.hasFormErrors) {\n      this.form.markAllAsTouched();\n      return;\n    }\n\n    if (this.config.submitMode === SubmitMode.ONCE) {\n      this.isSubmitting = true;\n    }\n\n    const formValue = this.form.value as TResult;\n\n    try {\n      if (this.config.onComplete) {\n        await this.config.onComplete.handle(formValue);\n      }\n      this.modalRef.close(formValue);\n    } catch (error) {\n      // Always allow retry on error, regardless of submit mode. This runs after an `await`,\n      // so it must announce itself: otherwise the button stays disabled on \"Submitting...\"\n      // and the user can never retry the action that just failed.\n      this.isSubmitting = false;\n      this.cdr.markForCheck();\n      console.error('Form submission error:', error);\n    }\n  }\n}\n","@if ((config.component || config.template) && !hideCustomBody) {\n  <mn-custom-body-host\n    [config]=\"asAny(config)\"\n    [modalRef]=\"asAny(modalRef)\"\n    class=\"mb-6 block\"\n  ></mn-custom-body-host>\n}\n\n<form (ngSubmit)=\"submit()\" [formGroup]=\"form\" class=\"flex flex-col gap-6 h-full\">\n  <!-- Shared field rendering template (must be inside form for formControlName) -->\n  <ng-template #fieldTemplate let-rowField>\n    @switch (rowField.field.kind) {\n      @case (FieldKind.TEXT) {\n        <div>\n          <mn-lib-input-field\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              type: 'text',\n              label: asField(rowField.field).label,\n              placeholder: asField(rowField.field).placeholder,\n              mask: asField(rowField.field).mask,\n              autocomplete: asField(rowField.field).autocomplete,\n              readonly: isFieldReadOnly(rowField.field),\n              fullWidth: true\n            })\"\n          ></mn-lib-input-field>\n        </div>\n      }\n\n      @case (FieldKind.NUMBER) {\n        <div>\n          <mn-lib-input-field\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              type: 'number',\n              label: asField(rowField.field).label,\n              placeholder: asField(rowField.field).placeholder,\n              readonly: isFieldReadOnly(rowField.field),\n              fullWidth: true\n            })\"\n          ></mn-lib-input-field>\n        </div>\n      }\n\n      @case (FieldKind.PASSWORD) {\n        <div>\n          <mn-lib-input-field\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              type: 'password',\n              label: asField(rowField.field).label,\n              placeholder: asField(rowField.field).placeholder,\n              readonly: isFieldReadOnly(rowField.field),\n              fullWidth: true\n            })\"\n          ></mn-lib-input-field>\n        </div>\n      }\n\n      @case (FieldKind.SELECT) {\n        <div class=\"flex flex-col\">\n          <mn-lib-select\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"getSelectProps(rowField.field)\"\n          ></mn-lib-select>\n          @if (isFieldLoading(asKey(rowField.field.key))) {\n            <div class=\"flex items-center gap-1 pl-2 pt-1\">\n              <div class=\"w-4 h-4 border-2 border-base-300 border-t-blue-500 rounded-full animate-spin\"></div>\n            </div>\n          }\n          @if (getFieldError(asKey(rowField.field.key))) {\n            <div class=\"text-red-500 text-xs pl-2 pt-1\">\n              {{ getFieldError(asKey(rowField.field.key)) }}\n            </div>\n          }\n        </div>\n      }\n\n      @case (FieldKind.CHECKBOX) {\n        <div>\n          <mn-lib-checkbox\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              label: asField(rowField.field).label,\n              disabled: isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field)\n            })\"\n          ></mn-lib-checkbox>\n        </div>\n      }\n\n      @case (FieldKind.DATE) {\n        <div>\n          <mn-lib-input-field\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              type: 'date',\n              label: asField(rowField.field).label,\n              placeholder: asField(rowField.field).placeholder,\n              startDate: asField(rowField.field).minDate,\n              endDate: asField(rowField.field).maxDate,\n              readonly: isFieldReadOnly(rowField.field),\n              fullWidth: true\n            })\"\n          ></mn-lib-input-field>\n        </div>\n      }\n\n      @case (FieldKind.DATETIME) {\n        <div>\n          <mn-lib-datetime\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              label: asField(rowField.field).label,\n              placeholder: asField(rowField.field).placeholder,\n              mode: asField(rowField.field).mode || 'datetime-local',\n              min: asField(rowField.field).min,\n              max: asField(rowField.field).max,\n              step: asField(rowField.field).step,\n              readonly: isFieldReadOnly(rowField.field),\n              fullWidth: true\n            })\"\n          ></mn-lib-datetime>\n        </div>\n      }\n\n      @case (FieldKind.TEXTAREA) {\n        <div>\n          <mn-lib-textarea\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              label: asField(rowField.field).label,\n              placeholder: asField(rowField.field).placeholder,\n              rows: asField(rowField.field).rows || 4,\n              resize: 'vertical',\n              autocomplete: asField(rowField.field).autocomplete,\n              readonly: isFieldReadOnly(rowField.field)\n            })\"\n          ></mn-lib-textarea>\n        </div>\n      }\n\n      @case (FieldKind.MULTI_SELECT) {\n        <div>\n          @if (isFieldLoading(asKey(rowField.field.key))) {\n            <div class=\"flex items-center gap-2 py-2 text-sm text-base-content/50\">\n              <div class=\"w-4 h-4 border-2 border-base-300 border-t-blue-500 rounded-full animate-spin\"></div>\n              {{ labels.loadingOptions }}\n            </div>\n          }\n          @if (!isFieldLoading(asKey(rowField.field.key))) {\n            <mn-lib-multi-select\n              [formControlName]=\"asKey(rowField.field.key)\"\n              [props]=\"asAny({\n                id: asKey(rowField.field.key),\n                label: asField(rowField.field).label,\n                options: getFieldOptions(rowField.field),\n                placeholder: asField(rowField.field).placeholder,\n                searchable: asField(rowField.field).searchable,\n                searchPlaceholder: asField(rowField.field).searchPlaceholder,\n                maxSelections: asField(rowField.field).maxSelections,\n                collapseThreshold: asField(rowField.field).collapseThreshold,\n                collapsePlaceholder: asField(rowField.field).collapsePlaceholder,\n                allSelectedPlaceholder: asField(rowField.field).allSelectedPlaceholder,\n                disabled: isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field)\n              })\"\n            ></mn-lib-multi-select>\n          }\n          @if (getFieldError(asKey(rowField.field.key))) {\n            <div class=\"text-red-500 text-xs pl-2 pt-1\">\n              {{ getFieldError(asKey(rowField.field.key)) }}\n            </div>\n          }\n        </div>\n      }\n\n      @case (FieldKind.MULTI_SELECT_TABLE) {\n        <ng-container [ngTemplateOutlet]=\"selectTableTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n      }\n\n      @case (FieldKind.SINGLE_SELECT_TABLE) {\n        <ng-container [ngTemplateOutlet]=\"selectTableTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n      }\n\n      @case (FieldKind.COLOR) {\n        <div class=\"flex flex-col gap-1\">\n          <label [for]=\"'field-' + asKey(rowField.field.key)\"\n                 class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n            {{ asField(rowField.field).label }}\n            @if (hasRequiredValidator(rowField.field)) {\n              <span class=\"text-red-500\">*</span>\n            }\n          </label>\n          <div class=\"flex items-center gap-3\">\n            <input\n              type=\"color\"\n              [id]=\"'field-' + asKey(rowField.field.key)\"\n              class=\"w-10 h-10 rounded-lg border border-base-300 cursor-pointer p-0.5\"\n              [value]=\"getColorValue(rowField.field)\"\n              [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n              (input)=\"onColorChange(rowField.field, $event)\"\n            />\n            <span class=\"text-sm text-base-content/60 font-mono\">{{ getColorValue(rowField.field) }}</span>\n          </div>\n          @if (asField(rowField.field).swatches) {\n            <div class=\"flex gap-1.5 mt-1\">\n              @for (swatch of asField(rowField.field).swatches; track swatch) {\n                <button\n                  mnButton\n                  [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n                  type=\"button\"\n                  class=\"w-6 h-6 rounded-md border border-base-300 cursor-pointer transition-transform hover:scale-110\"\n                  [style.background-color]=\"swatch\"\n                  [class.ring-2]=\"getColorValue(rowField.field) === swatch\"\n                  [class.ring-blue-500]=\"getColorValue(rowField.field) === swatch\"\n                  (click)=\"setColorFromSwatch(rowField.field, swatch)\"\n                  [attr.aria-label]=\"'Select color ' + swatch\"\n                ></button>\n              }\n            </div>\n          }\n          @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n            <div class=\"text-red-500 text-xs pl-2 pt-1\">\n              {{ labels.fieldRequired }}\n            </div>\n          }\n        </div>\n      }\n\n      @case (FieldKind.RATING) {\n        <div class=\"flex flex-col gap-1\">\n          <span [id]=\"'rating-label-' + asKey(rowField.field.key)\"\n                class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n            {{ asField(rowField.field).label }}\n            @if (hasRequiredValidator(rowField.field)) {\n              <span class=\"text-red-500\">*</span>\n            }\n          </span>\n          <div [attr.aria-labelledby]=\"'rating-label-' + asKey(rowField.field.key)\" class=\"flex items-center gap-1\"\n               role=\"group\">\n            @for (star of getRatingRange(rowField.field); track star) {\n              <button\n                mnButton\n                [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n                type=\"button\"\n                class=\"text-2xl cursor-pointer transition-colors focus:outline-none\"\n                [class.text-yellow-400]=\"star <= getRatingValue(rowField.field)\"\n                [class.text-base-300]=\"star > getRatingValue(rowField.field)\"\n                [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n                (click)=\"setRating(rowField.field, star)\"\n              >\n                &#9733;\n              </button>\n            }\n            <span class=\"text-sm text-base-content/50 ml-2\">{{ getRatingValue(rowField.field) }} / {{ asField(rowField.field).max || 5 }}</span>\n          </div>\n          @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n            <div class=\"text-red-500 text-xs pl-2 pt-1\">\n              {{ labels.fieldRequired }}\n            </div>\n          }\n        </div>\n      }\n\n      @case (FieldKind.SLIDER) {\n        <div class=\"flex flex-col gap-1\">\n          <label [for]=\"'field-' + asKey(rowField.field.key)\"\n                 class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n            {{ asField(rowField.field).label }}\n            @if (hasRequiredValidator(rowField.field)) {\n              <span class=\"text-red-500\">*</span>\n            }\n          </label>\n          <div class=\"flex items-center gap-3\">\n            <input\n              type=\"range\"\n              [id]=\"'field-' + asKey(rowField.field.key)\"\n              class=\"flex-1 h-2 bg-base-200 rounded-lg appearance-none cursor-pointer accent-blue-500\"\n              [attr.min]=\"asField(rowField.field).min ?? 0\"\n              [attr.max]=\"asField(rowField.field).max ?? 100\"\n              [attr.step]=\"asField(rowField.field).step ?? 1\"\n              [value]=\"getSliderValue(rowField.field)\"\n              [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n              (input)=\"onSliderChange(rowField.field, $event)\"\n            />\n            @if (asField(rowField.field).showValue !== false) {\n              <span class=\"text-sm text-base-content/60 min-w-[3rem] text-right\">\n                {{ getSliderValue(rowField.field) }}{{ asField(rowField.field).unit || '' }}\n              </span>\n            }\n          </div>\n          <div class=\"flex justify-between text-xs text-base-content/40 px-1\">\n            <span>{{ asField(rowField.field).min ?? 0 }}</span>\n            <span>{{ asField(rowField.field).max ?? 100 }}</span>\n          </div>\n          @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n            <div class=\"text-red-500 text-xs pl-2 pt-1\">\n              {{ labels.fieldRequired }}\n            </div>\n          }\n        </div>\n      }\n\n      @case (FieldKind.FILE) {\n        <div>\n          <mn-lib-file-input\n            (cleared)=\"onFileCleared(rowField.field)\"\n            [formControlName]=\"asKey(rowField.field.key)\"\n            [props]=\"asAny({\n              id: asKey(rowField.field.key),\n              label: asField(rowField.field).label,\n              accept: asField(rowField.field).accept,\n              multiple: asField(rowField.field).multiple,\n              maxFiles: asField(rowField.field).maxFiles,\n              maxSize: asField(rowField.field).maxSize,\n              displayMode: asField(rowField.field).displayMode,\n              dropzoneHint: asField(rowField.field).dropzoneHint,\n              dropActiveHint: asField(rowField.field).dropActiveHint,\n              replaceLabel: asField(rowField.field).replaceLabel,\n              removeLabel: asField(rowField.field).removeLabel,\n              currentUrl: asField(rowField.field).currentUrl,\n              currentUrls: asField(rowField.field).currentUrls,\n              disabled: isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\n            })\"\n          ></mn-lib-file-input>\n        </div>\n      }\n\n      @case (FieldKind.CUSTOM) {\n        <div>\n          <ng-container\n            mnCustomFieldHost\n            [component]=\"asField(rowField.field).component\"\n            [inputs]=\"asField(rowField.field).inputs\"\n            [formControlName]=\"asKey(rowField.field.key)\"\n          ></ng-container>\n        </div>\n      }\n\n      @default {\n        <div></div>\n      }\n    }\n\n    <!-- Show cross-field error below any field that has one -->\n    @if (getFieldError(asKey(rowField.field.key)) && rowField.field.kind !== FieldKind.SELECT && rowField.field.kind !== FieldKind.MULTI_SELECT) {\n      <div class=\"text-red-500 text-xs pl-2 pt-1\">\n        {{ getFieldError(asKey(rowField.field.key)) }}\n      </div>\n    }\n  </ng-template>\n\n  <!-- Shared template for MULTI_SELECT_TABLE and SINGLE_SELECT_TABLE -->\n  <ng-template #selectTableTemplate let-rowField>\n    <div class=\"flex flex-col gap-1\">\n      @if (asField(rowField.field).label) {\n        <span class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n          {{ asField(rowField.field).label }}\n          @if (hasRequiredValidator(rowField.field)) {\n            <span class=\"text-red-500\">*</span>\n          }\n        </span>\n      }\n      <mn-table\n        [dataSource]=\"tableDataSources[asKey(rowField.field.key)]\"\n        [attr.aria-label]=\"asField(rowField.field).label || null\"\n        (selectionChange)=\"onTableSelectionChange(rowField.field, $event)\"\n      ></mn-table>\n      @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n        <div class=\"text-red-500 text-xs pl-2 pt-1\">\n          {{ labels.fieldRequired }}\n        </div>\n      }\n    </div>\n  </ng-template>\n\n  <!-- Field Groups (sections with headers) -->\n  @if (fieldGroups.length > 0) {\n    <div class=\"flex flex-col gap-6\">\n      @for (group of fieldGroups; track group.title) {\n        <div class=\"flex flex-col gap-4\" [style.display]=\"isGroupVisible(group) ? '' : 'none'\">\n          <div class=\"border-b border-base-300 pb-2\">\n            <h3 class=\"text-base font-semibold text-base-content\">{{ group.title }}</h3>\n            @if (group.description) {\n              <p class=\"text-sm text-base-content/50 mt-0.5\">{{ group.description }}</p>\n            }\n          </div>\n          @for (row of group.rows; track $index) {\n            <div [style.--mn-form-cols]=\"row.columns || 1\" class=\"grid gap-4 mn-form-row\">\n              @for (rowField of row.fields; track rowField.field.key) {\n                <div [style.--mn-form-span]=\"rowField.span || 1\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\"\n                     class=\"flex flex-col gap-2 mn-form-cell\">\n                  <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n                </div>\n              }\n            </div>\n          }\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Standard rows (no groups) -->\n  @if (rows.length > 0) {\n    <div class=\"flex flex-col gap-4\">\n      @for (row of rows; track $index) {\n        <div [style.--mn-form-cols]=\"row.columns || 1\" class=\"grid gap-4 mn-form-row\">\n          @for (rowField of row.fields; track rowField.field.key) {\n            <div [style.--mn-form-span]=\"rowField.span || 1\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\"\n                 class=\"flex flex-col gap-2 mn-form-cell\">\n              <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Form-level errors (not tied to a specific field) -->\n  @if (formErrors['_form']) {\n    <div class=\"text-red-500 text-sm px-2 py-1 bg-red-50 rounded-md\">\n      {{ formErrors['_form'] }}\n    </div>\n  }\n\n  @if (!hideFooter) {\n    <div class=\"flex gap-3 pt-4 pb-6 border-t border-base-300 mt-auto sticky bottom-0 bg-base-100 z-10\">\n      <button\n        mnButton\n        type=\"button\"\n        [data]=\"{ variant: 'outline', color: 'secondary' }\"\n        (mousedown)=\"modalRef.dismiss(ModalCloseReason.CANCELLED)\"\n      >\n        @if (cancelIcon; as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n        }\n        {{ labels.cancel }}\n      </button>\n\n      <div class=\"flex-1\"></div>\n\n      <button\n        mnButton\n        type=\"submit\"\n        [data]=\"{ variant: 'fill', color: 'primary', disabled: form.invalid || isSubmitting }\"\n        [disabled]=\"form.invalid || isSubmitting\"\n      >\n        @if (submitIcon; as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n        }\n        {{ isSubmitting ? labels.submitting : labels.submit }}\n      </button>\n    </div>\n  }\n</form>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LucideDynamicIcon, LucideIconData } from '@lucide/angular';\nimport { MnButton, MnButtonTypes } from 'mn-angular-lib/button';\nimport { ActionStyle, ModalFooterAction } from 'mn-angular-lib/modal-core';\nimport { defaultIconForStyle, MODAL_ACTION_ICON_SIZE } from 'mn-angular-lib/modal-core';\n\n@Component({\n  selector: 'mn-footer-actions',\n  standalone: true,\n  imports: [CommonModule, MnButton, LucideDynamicIcon],\n  host: { class: 'contents' },\n  template: `\n    @for (action of leftActions; track action.label) {\n      <button\n        mnButton\n        [data]=\"getButtonData(action)\"\n        [disabled]=\"action.disabled || false\"\n        (click)=\"actionClick.emit(action)\"\n      >\n        @if (iconFor(action); as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n        }\n        {{ action.label }}\n      </button>\n    }\n\n    <div class=\"flex-1\"></div>\n\n    @for (action of rightActions; track action.label) {\n      <button\n        mnButton\n        [data]=\"getButtonData(action)\"\n        [disabled]=\"action.disabled || false\"\n        (click)=\"actionClick.emit(action)\"\n      >\n        @if (iconFor(action); as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n        }\n        {{ action.label }}\n      </button>\n    }\n  `,\n})\nexport class MnFooterActionsComponent<TResult = unknown> {\n  @Input() actions: ModalFooterAction<TResult>[] = [];\n  /** Whether to render leading icons on the action buttons (defaults to true). */\n  @Input() showIcons = true;\n  @Output() actionClick = new EventEmitter<ModalFooterAction<TResult>>();\n\n  /** Icon size (px) for the footer action buttons. */\n  readonly actionIconSize = MODAL_ACTION_ICON_SIZE;\n\n  /**\n   * Resolves the leading icon for a footer action, or null when icons are disabled.\n   * Uses the per-action override, else the default derived from its style.\n   * @param action The footer action to resolve an icon for.\n   */\n  iconFor(action: ModalFooterAction<TResult>): LucideIconData | null {\n    if (!this.showIcons) return null;\n    return action.icon ?? defaultIconForStyle(action.style);\n  }\n\n  get leftActions(): ModalFooterAction<TResult>[] {\n    return this.actions.filter((a) => a.position === 'left');\n  }\n\n  get rightActions(): ModalFooterAction<TResult>[] {\n    return this.actions.filter((a) => a.position !== 'left');\n  }\n\n  getButtonData(action: ModalFooterAction<TResult>): Partial<MnButtonTypes> {\n    switch (action.style) {\n      case ActionStyle.PRIMARY:\n        return { variant: 'fill', color: 'primary', disabled: action.disabled };\n      case ActionStyle.DANGER:\n        return { variant: 'fill', color: 'danger', disabled: action.disabled };\n      case ActionStyle.GHOST:\n        return { variant: 'text', color: 'gray', disabled: action.disabled };\n      case ActionStyle.SECONDARY:\n      default:\n        return { variant: 'outline', color: 'secondary', disabled: action.disabled };\n    }\n  }\n}\n","import {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  QueryList,\n  signal,\n  TemplateRef,\n  Type,\n  ViewChild,\n  ViewChildren,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { MnModalRef } from 'mn-angular-lib/modal-core';\nimport {\n  ActionStyle,\n  CustomModalConfig,\n  FormModalConfig,\n  ModalCloseReason,\n  ModalFooterAction,\n  ModalKind,\n  ModalRef,\n  ModalSize,\n  ModalStepId,\n  NavigationDirection,\n  WizardFlowMode,\n  WizardModalConfig,\n  WizardResult,\n  WizardStepConfig,\n} from 'mn-angular-lib/modal-core';\nimport { MnButton, MnButtonTypes } from 'mn-angular-lib/button';\nimport { MnFormBodyComponent } from '../mn-form-body/mn-form-body.component';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\nimport { MnFooterActionsComponent } from '../mn-footer-actions/mn-footer-actions.component';\nimport { MnLanguageService } from 'mn-angular-lib/core';\nimport { LucideDynamicIcon, LucideIconData } from '@lucide/angular';\nimport { MN_MODAL_ACTION_ICONS, MODAL_ACTION_ICON_SIZE } from 'mn-angular-lib/modal-core';\n\n@Component({\n  selector: 'mn-wizard-body',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    MnButton,\n    MnFormBodyComponent,\n    MnCustomBodyHostComponent,\n    MnFooterActionsComponent,\n    LucideDynamicIcon,\n  ],\n  templateUrl: './mn-wizard-body.component.html',\n  styleUrls: ['./mn-wizard-body.component.css'],\n})\nexport class MnWizardBodyComponent implements OnInit, AfterViewInit, OnDestroy {\n  private cdr = inject(ChangeDetectorRef);\n\n  @Input() config!: WizardModalConfig;\n  @Input() modalRef!: MnModalRef<WizardResult>;\n\n  @ViewChildren(MnFormBodyComponent) formBodies!: QueryList<MnFormBodyComponent>;\n  @ViewChildren('stepWrapper') stepWrappers!: QueryList<ElementRef<HTMLElement>>;\n  /**\n   * The step body's scroll container. Every step renders into this one element\n   * (inactive steps are hidden, not destroyed), so its scroll offset is shared —\n   * without an explicit reset, arriving on a new step lands you wherever the\n   * previous step was scrolled to. See {@link setCurrentStep}.\n   */\n  @ViewChild('stepScroller') stepScroller?: ElementRef<HTMLElement>;\n\n  currentStepId!: ModalStepId;\n  /**\n   * Title of the currently active step, mirrored into a signal so the modal\n   * shell can append it to the modal title on small screens (where the step\n   * labels under the progress circles are hidden). A signal — not a getter —\n   * because the shell lives outside this component's change-detection subtree,\n   * so a plain field mutation here would not update the shell in a zoneless app.\n   */\n  readonly currentStepTitle = signal<string | undefined>(undefined);\n  visitedStepIds: ModalStepId[] = [];\n  isCurrentStepValid = true;\n  isCompleting = false;\n  wizardErrors: Record<string, string> = {};\n\n  /**\n   * Min-height (px) for the step container, sized to the tallest step so the\n   * modal does not jump when navigating between steps. Monotonic — only grows.\n   */\n  measuredMinHeight = 0;\n\n  private languageService = inject(MnLanguageService);\n\n  private static readonly DEFAULT_LABELS: Record<string, string> = {\n    next: 'Next',\n    back: 'Back',\n    close: 'Close',\n    complete: 'Complete',\n    completing: 'Completing...',\n  };\n\n  private resolveLabel(i18nValue: string | undefined, key: string): string {\n    if (i18nValue) return i18nValue;\n    const translated = this.languageService.translate(`common.${key}`);\n    return translated === `common.${key}` ? MnWizardBodyComponent.DEFAULT_LABELS[key] : translated;\n  }\n\n  /** Resolved i18n labels with defaults, falling back to translated keys */\n  get labels() {\n    const i18n = (this.config as { i18n?: Record<string, string> }).i18n || {};\n    return {\n      next: this.resolveLabel(i18n['next'], 'next'),\n      back: this.resolveLabel(i18n['back'], 'back'),\n      close: this.resolveLabel(i18n['close'], 'close'),\n      complete: this.resolveLabel(i18n['complete'], 'complete'),\n      completing: this.resolveLabel(i18n['completing'], 'completing'),\n    };\n  }\n\n  /** Pre-built form configs keyed by step id — only for steps that have fields */\n  stepFormConfigs: Record<ModalStepId, FormModalConfig<unknown, unknown>> = {};\n\n  /**\n   * Pre-built host configs keyed by step id — only for steps whose body is a\n   * component or template (not a plain string) and that have no form fields.\n   * Drives the `mn-custom-body-host` rendered for those steps.\n   */\n  stepBodyConfigs: Record<ModalStepId, CustomModalConfig> = {};\n\n  private statusSubscription?: Subscription;\n  private formBodiesSubscription?: Subscription;\n\n  ngOnInit(): void {\n    // Pre-build form configs for all form-driven steps\n    for (const step of this.config.steps) {\n      if (step.fields && step.fields.length > 0) {\n        // Merge top-level initialValue with step-level initialValue\n        const mergedInitialValue = {\n          ...(this.config.initialValue || {}),\n          ...(step.initialValue || {}),\n        };\n\n        this.stepFormConfigs[step.id] = {\n          kind: ModalKind.FORM,\n          fields: step.fields,\n          rows: step.rows,\n          fieldGroups: step.fieldGroups,\n          formValidators: step.formValidators,\n          groupValidators: step.groupValidators,\n          initialValue: mergedInitialValue,\n          readOnly: this.config.readOnly,\n          disabled: this.config.disabled,\n        } as FormModalConfig<unknown, unknown>;\n      } else {\n        // A component/template body (not a plain string) renders through the\n        // custom-body host. Pre-build its config once so the `@Input` identity\n        // stays stable across change detection and the body is not re-created.\n        const bodyConfig = this.buildStepBodyConfig(step);\n        if (bodyConfig) {\n          this.stepBodyConfigs[step.id] = bodyConfig;\n        }\n      }\n    }\n\n    this.setCurrentStep(this.config.startStepId || this.config.steps[0]?.id);\n    if (this.currentStepId) {\n      this.visitedStepIds.push(this.currentStepId);\n    }\n  }\n\n  ngAfterViewInit(): void {\n    // Subscribe to form bodies list changes to track validity\n    this.formBodiesSubscription = this.formBodies.changes.subscribe(() => {\n      this.trackCurrentStepValidity();\n      // Apply autofocus when form bodies change (e.g. step navigation)\n      setTimeout(() => {\n        this.getCurrentFormBody()?.applyAutoFocus();\n      }, 100);\n      // Re-measure in case dynamic field visibility changed a step's height\n      this.measureTallestStep();\n    });\n    // Initial validity check\n    this.trackCurrentStepValidity();\n\n    // Pre-size the modal to the tallest step so it does not jump between steps.\n    // All steps are already rendered (display:none), so this is a pure layout\n    // read — it creates no components and triggers no data loads or autofocus.\n    setTimeout(() => this.measureTallestStep(), 0);\n    // A second pass catches content that grows after async data sources resolve.\n    setTimeout(() => this.measureTallestStep(), 300);\n  }\n\n  isTextBody(step: WizardStepConfig): boolean {\n    return typeof step.body === 'string';\n  }\n\n  /**\n   * Builds the {@link CustomModalConfig} used to render a step whose body is a\n   * component or template. Returns `undefined` for steps with no body or a\n   * plain-string body (those render through their own template branches).\n   * @param step The wizard step to inspect.\n   */\n  private buildStepBodyConfig(step: WizardStepConfig): CustomModalConfig | undefined {\n    const body = step.body;\n    if (!body || typeof body === 'string') return undefined;\n    const config: CustomModalConfig = { kind: ModalKind.CUSTOM, inputs: step.bodyInputs };\n    if (body instanceof TemplateRef) {\n      config.template = body;\n    } else {\n      config.component = body as Type<unknown>;\n    }\n    return config;\n  }\n\n  async goToStep(step: WizardStepConfig): Promise<void> {\n    if (!this.canNavigateToStep(step)) return;\n    if (step.id === this.currentStepId) return;\n\n    // Validate current step's form before allowing direct step navigation\n    const formBody = this.getCurrentFormBody();\n    if (formBody && formBody.form.invalid) {\n      formBody.form.markAllAsTouched();\n      return;\n    }\n\n    const previousStepId = this.currentStepId;\n    this.setCurrentStep(step.id);\n\n    if (!this.visitedStepIds.includes(this.currentStepId)) {\n      this.visitedStepIds.push(this.currentStepId);\n    }\n\n    await this.notifyStepChange(previousStepId, NavigationDirection.DIRECT);\n    this.trackCurrentStepValidity();\n  }\n\n  ngOnDestroy(): void {\n    this.statusSubscription?.unsubscribe();\n    this.formBodiesSubscription?.unsubscribe();\n  }\n\n  /**\n   * Measures every step's natural height and records the tallest as\n   * {@link measuredMinHeight}. Monotonic: the value only ever grows, so a\n   * re-measure can never shrink the modal. Skipped when the modal has an\n   * explicit height or is full-size (those are already fixed-height).\n   */\n  private measureTallestStep(): void {\n    if (this.config.sizeHeight || this.config.sizeWidth === ModalSize.FULL) return;\n    const wrappers = this.stepWrappers?.toArray().map((ref) => ref.nativeElement) ?? [];\n    if (wrappers.length === 0) return;\n\n    // Synchronous pre-paint pass: show one step at a time, read its height,\n    // then restore the original display values (so there is no visible flicker).\n    const originalDisplay = wrappers.map((el) => el.style.display);\n    let tallest = 0;\n    for (let i = 0; i < wrappers.length; i++) {\n      for (let j = 0; j < wrappers.length; j++) {\n        wrappers[j].style.display = i === j ? 'block' : 'none';\n      }\n      tallest = Math.max(tallest, wrappers[i].offsetHeight);\n    }\n    wrappers.forEach((el, i) => (el.style.display = originalDisplay[i]));\n\n    if (tallest > this.measuredMinHeight) {\n      this.measuredMinHeight = tallest;\n      this.cdr.detectChanges();\n    }\n  }\n\n  /** Get visible steps (filtered by visibility condition) */\n  get visibleSteps(): WizardStepConfig[] {\n    return this.config.steps.filter((s) => this.isStepVisible(s));\n  }\n\n  isStepVisible(step: WizardStepConfig): boolean {\n    if (!step.visible) return true;\n    return step.visible(this.getAggregatedData());\n  }\n\n  get currentStep() {\n    return this.config.steps.find((s) => s.id === this.currentStepId);\n  }\n\n  get currentVisibleIndex(): number {\n    return this.visibleSteps.findIndex((s) => s.id === this.currentStepId);\n  }\n\n  get currentStepIndex(): number {\n    return this.config.steps.findIndex((s) => s.id === this.currentStepId);\n  }\n\n  get canGoBack(): boolean {\n    return this.currentVisibleIndex > 0;\n  }\n\n  get canGoNext(): boolean {\n    return this.currentVisibleIndex < this.visibleSteps.length - 1;\n  }\n\n  get isLastStep(): boolean {\n    return this.currentVisibleIndex === this.visibleSteps.length - 1;\n  }\n\n  /** Icon size (px) for the wizard action buttons. */\n  readonly actionIconSize = MODAL_ACTION_ICON_SIZE;\n\n  /** Whether action-button icons should render on this wizard (defaults to true). */\n  get showActionIcons(): boolean {\n    return this.config.showActionIcons !== false;\n  }\n\n  /**\n   * The leading icon for the back button, or null when icons are disabled.\n   * Shows a back arrow when navigation is possible, otherwise a cross (the\n   * button acts as \"Close\" on the first step).\n   */\n  get backIcon(): LucideIconData | null {\n    if (!this.showActionIcons) return null;\n    return this.canGoBack ? MN_MODAL_ACTION_ICONS.back : MN_MODAL_ACTION_ICONS.cancel;\n  }\n\n  /** The trailing icon for the next button, or null when icons are disabled. */\n  get nextIcon(): LucideIconData | null {\n    return this.showActionIcons ? MN_MODAL_ACTION_ICONS.next : null;\n  }\n\n  /** The leading icon for the complete button, or null when icons are disabled. */\n  get completeIcon(): LucideIconData | null {\n    return this.showActionIcons ? MN_MODAL_ACTION_ICONS.confirm : null;\n  }\n\n  /** Index of the current step for the progress line */\n  get currentProgressIndex(): number {\n    return this.currentVisibleIndex;\n  }\n\n  get isFreeFlow(): boolean {\n    return this.config.flow === WizardFlowMode.FREE;\n  }\n\n  canNavigateToStep(step: WizardStepConfig): boolean {\n    if (!this.isFreeFlow) return false;\n    return this.isStepVisible(step);\n  }\n\n  async next(): Promise<void> {\n    if (!this.canGoNext) return;\n\n    const currentStep = this.currentStep;\n\n    // Validate embedded form if present\n    const formBody = this.getCurrentFormBody();\n    if (formBody && formBody.form.invalid) {\n      formBody.form.markAllAsTouched();\n      return;\n    }\n\n    if (currentStep?.guard?.canExit) {\n      const canExit = await currentStep.guard.canExit();\n      if (!canExit) return;\n    }\n\n    if (currentStep?.validators) {\n      for (const validator of currentStep.validators) {\n        const result = await validator.validate();\n        if (result.status === 'invalid') return;\n      }\n    }\n\n    // Find next visible step\n    const nextStep = this.visibleSteps[this.currentVisibleIndex + 1];\n    if (!nextStep) return;\n\n    if (nextStep.guard?.canEnter) {\n      const canEnter = await nextStep.guard.canEnter();\n      if (!canEnter) return;\n    }\n\n    const previousStepId = this.currentStepId;\n    this.setCurrentStep(nextStep.id);\n\n    if (!this.visitedStepIds.includes(this.currentStepId)) {\n      this.visitedStepIds.push(this.currentStepId);\n    }\n\n    await this.notifyStepChange(previousStepId, NavigationDirection.FORWARD);\n    this.trackCurrentStepValidity();\n  }\n\n  /** Find the MnFormBodyComponent for the current step */\n  private getCurrentFormBody(): MnFormBodyComponent | undefined {\n    if (!this.formBodies) return undefined;\n    // formBodies only contains entries for steps that have stepFormConfigs\n    // We need to find which form body index corresponds to the current step\n    const formStepIds = this.config.steps\n      .filter((s) => this.stepFormConfigs[s.id])\n      .map((s) => s.id);\n    const formIndex = formStepIds.indexOf(this.currentStepId);\n    if (formIndex === -1) return undefined;\n    return this.formBodies.toArray()[formIndex];\n  }\n\n  private trackCurrentStepValidity(): void {\n    // Unsubscribe from previous\n    this.statusSubscription?.unsubscribe();\n    this.statusSubscription = undefined;\n\n    const formBody = this.getCurrentFormBody();\n    if (formBody && formBody.form) {\n      this.isCurrentStepValid = formBody.form.valid;\n      this.statusSubscription = formBody.form.statusChanges.subscribe(() => {\n        this.isCurrentStepValid = formBody.form.valid;\n        this.cdr.detectChanges();\n      });\n    } else {\n      this.isCurrentStepValid = true;\n    }\n    this.cdr.detectChanges();\n  }\n\n  async back(): Promise<void> {\n    if (!this.canGoBack) {\n      // Call onCancel handler if configured\n      if (this.config.onCancel) {\n        await this.config.onCancel(ModalCloseReason.CANCELLED);\n      }\n      this.modalRef.dismiss(ModalCloseReason.CANCELLED);\n      return;\n    }\n\n    const prevStep = this.visibleSteps[this.currentVisibleIndex - 1];\n    const previousStepId = this.currentStepId;\n\n    // Remove current step from visited so the circle resets\n    this.visitedStepIds = this.visitedStepIds.filter((id) => id !== this.currentStepId);\n\n    this.setCurrentStep(prevStep.id);\n\n    await this.notifyStepChange(previousStepId, NavigationDirection.BACKWARD);\n    this.trackCurrentStepValidity();\n  }\n\n  /**\n   * Activates a step and mirrors its title into {@link currentStepTitle} so the\n   * shell can reflect the step name in the modal title on small screens.\n   * @param stepId Id of the step to make current.\n   */\n  private setCurrentStep(stepId: ModalStepId): void {\n    this.currentStepId = stepId;\n    this.currentStepTitle.set(this.config.steps.find((s) => s.id === stepId)?.title);\n    // A new step always starts at its top — the shared scroller would otherwise\n    // keep the previous step's offset. Instant, not smooth: a scroll animation\n    // during a step swap reads as a glitch. Absent before the view is created.\n    if (this.stepScroller) {\n      this.stepScroller.nativeElement.scrollTop = 0;\n    }\n  }\n\n  async complete(): Promise<void> {\n    if (this.isCompleting) return;\n\n    const currentStep = this.currentStep;\n\n    // Validate embedded form if present\n    const formBody = this.getCurrentFormBody();\n    if (formBody && formBody.form.invalid) {\n      formBody.form.markAllAsTouched();\n      return;\n    }\n\n    if (currentStep?.validators) {\n      for (const validator of currentStep.validators) {\n        const result = await validator.validate();\n        if (result.status === 'invalid') return;\n      }\n    }\n\n    this.isCompleting = true;\n    this.wizardErrors = {};\n    this.cdr.detectChanges();\n\n    try {\n      const aggregatedData = this.getAggregatedData();\n\n      // Run cross-step validators (onBeforeComplete)\n      if (this.config.onBeforeComplete) {\n        for (const validator of this.config.onBeforeComplete) {\n          const errors = await validator(aggregatedData);\n          if (errors) {\n            this.wizardErrors = { ...this.wizardErrors, ...errors };\n          }\n        }\n        if (Object.keys(this.wizardErrors).length > 0) {\n          this.isCompleting = false;\n          this.cdr.detectChanges();\n          return;\n        }\n      }\n\n      const result: WizardResult = {\n        status: ModalCloseReason.COMPLETED,\n        visitedStepIds: this.visitedStepIds,\n        payload: aggregatedData,\n      };\n\n      if (this.config.onComplete) {\n        await this.config.onComplete.handle(result);\n      }\n\n      this.modalRef.close(result);\n    } catch (error) {\n      this.isCompleting = false;\n      this.cdr.detectChanges();\n      console.error('Wizard completion error:', error);\n    }\n  }\n\n  /** Collect form data from all form-driven steps, namespaced by step ID */\n  private getAggregatedData(): Record<ModalStepId, Record<string, unknown>> {\n    const aggregated: Record<ModalStepId, Record<string, unknown>> = {};\n    if (!this.formBodies) return aggregated;\n\n    const formStepIds = this.config.steps\n      .filter((s) => this.stepFormConfigs[s.id])\n      .map((s) => s.id);\n\n    this.formBodies.toArray().forEach((fb, index) => {\n      if (fb.form && formStepIds[index]) {\n        aggregated[formStepIds[index]] = { ...fb.form.value };\n      }\n    });\n\n    return aggregated;\n  }\n\n  /**\n   * Maps a footer action's ActionStyle to mnButton data props.\n   * @param action The footer action configuration.\n   */\n  getFooterActionButtonData(action: ModalFooterAction<unknown>): Partial<MnButtonTypes> {\n    switch (action.style) {\n      case ActionStyle.DANGER:\n        return { variant: 'outline', color: 'danger' };\n      case ActionStyle.PRIMARY:\n        return { variant: 'fill', color: 'primary' };\n      case ActionStyle.SECONDARY:\n        return { variant: 'outline', color: 'secondary' };\n      case ActionStyle.GHOST:\n        return { variant: 'text', color: 'gray' };\n      default:\n        return { variant: 'outline', color: 'secondary' };\n    }\n  }\n\n  /**\n   * Handles a custom footer action click.\n   * @param action The footer action configuration.\n   */\n  async handleFooterAction(action: ModalFooterAction<unknown>): Promise<void> {\n    if (action.handler) {\n      await action.handler(this.modalRef as unknown as ModalRef<unknown>);\n    }\n    if (action.closesModal) {\n      this.modalRef.close(\n        (action.closeReason || ModalCloseReason.PROGRAMMATIC) as unknown as WizardResult,\n      );\n    }\n  }\n\n  private async notifyStepChange(\n    previousStepId: ModalStepId,\n    direction: NavigationDirection,\n  ): Promise<void> {\n    if (this.config.onStepChange) {\n      await this.config.onStepChange.handle({\n        previousStepId,\n        currentStepId: this.currentStepId,\n        direction,\n      });\n    }\n  }\n}\n","<div class=\"flex flex-col flex-auto min-h-0\">\n  @if (config.component || config.template) {\n    <mn-custom-body-host\n      [config]=\"$any(config)\"\n      [modalRef]=\"$any(modalRef)\"\n      class=\"block flex-none px-6 pt-6\"\n    ></mn-custom-body-host>\n  }\n\n  <!-- Steps header — fixed (does not scroll with the step body) -->\n  <div class=\"flex-none px-6 pt-2 pb-4 border-b border-base-300 bg-base-100\">\n    <div class=\"relative flex items-start\">\n      <!-- Background line spanning from first circle center to last circle center -->\n      <div\n        [style.left]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n        [style.right]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n        class=\"absolute top-3.75 h-1 bg-base-300 z-0\"\n      ></div>\n\n      <!-- Progress fill line -->\n      @if (visibleSteps.length > 1) {\n        <div\n          [style.left]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n          [style.width]=\"'calc(' + (currentProgressIndex / (visibleSteps.length - 1)) * (100 - 100 / visibleSteps.length) + '%)'\"\n          class=\"absolute top-3.75 h-1 bg-success z-1 transition-all duration-500\"\n        ></div>\n      }\n\n      @for (step of visibleSteps; track step.id; let i = $index; ) {\n        <div\n          (keyup.enter)=\"isFreeFlow ? goToStep(step) : null\"\n          (click)=\"isFreeFlow ? goToStep(step) : null\"\n          [attr.tabindex]=\"isFreeFlow && canNavigateToStep(step) ? 0 : null\"\n          [class.cursor-pointer]=\"isFreeFlow && canNavigateToStep(step)\"\n          class=\"relative flex flex-col items-center gap-1 z-10 w-0 flex-1\"\n        >\n          <div\n            [ngClass]=\"{\n              'bg-primary text-primary-content': step.id === currentStepId,\n              'bg-success text-success-content': visitedStepIds.includes(step.id) && step.id !== currentStepId,\n              'bg-base-200 text-base-content/50': !visitedStepIds.includes(step.id) && step.id !== currentStepId\n            }\"\n            class=\"w-8 h-8 rounded-full flex items-center justify-center font-semibold transition-all text-sm\"\n          >{{ i + 1 }}\n          </div>\n          <div\n            [ngClass]=\"{\n              'text-base-content font-semibold': step.id === currentStepId,\n              'text-base-content/50': step.id !== currentStepId\n            }\"\n            class=\"text-xs text-center whitespace-nowrap hidden sm:block\"\n          >{{ step.title }}\n          </div>\n\n        </div>\n      }\n    </div>\n  </div>\n\n  <!-- Step body — the only scrolling region in the wizard, shared by every step -->\n  <div #stepScroller class=\"flex-auto min-h-0 overflow-y-auto px-6 py-6\">\n    <div [style.min-height]=\"measuredMinHeight ? measuredMinHeight + 'px' : null\" class=\"min-h-48\">\n    @for (step of config.steps; track step.id) {\n      <div #stepWrapper [style.display]=\"step.id === currentStepId ? 'block' : 'none'\">\n        <h3 class=\"text-lg font-semibold text-base-content mb-4\">{{ step.title }}</h3>\n        <div class=\"text-base-content/80\">\n          <!-- Form step -->\n          @if (stepFormConfigs[step.id]) {\n            <mn-form-body\n              [config]=\"stepFormConfigs[step.id]\"\n              [modalRef]=\"$any(modalRef)\"\n              [hideFooter]=\"true\"\n              [hideCustomBody]=\"true\"\n            ></mn-form-body>\n          }\n\n          <!-- Text body -->\n          @if (!stepFormConfigs[step.id] && isTextBody(step)) {\n            <div>\n              {{ step.body }}\n            </div>\n          }\n\n          <!-- Component / template body -->\n          @if (stepBodyConfigs[step.id]) {\n            <mn-custom-body-host\n              [config]=\"stepBodyConfigs[step.id]\"\n              [modalRef]=\"$any(modalRef)\"\n            ></mn-custom-body-host>\n          }\n        </div>\n      </div>\n    }\n    </div>\n  </div>\n\n  <!-- Wizard-level errors (from onBeforeComplete) — fixed, above the footer -->\n  @if (wizardErrors && (wizardErrors | keyvalue).length > 0) {\n    <div class=\"flex flex-col gap-1 mx-6 mb-2 px-2 py-2 bg-red-50 rounded-md\">\n      @for (err of wizardErrors | keyvalue; track err.key) {\n        <div class=\"text-red-500 text-sm\">\n          {{ err.value }}\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Footer — fixed (does not scroll with the step body) -->\n  <div class=\"flex-none flex gap-3 px-6 pt-4 pb-6 border-t border-base-300 bg-base-100\">\n    @if (!currentStep?.hideBack) {\n      <button\n        type=\"button\"\n        mnButton\n        [data]=\"{ variant: 'outline', color: 'secondary' }\"\n        (click)=\"back()\"\n      >\n        @if (backIcon; as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n        }\n        {{ currentStep?.backLabel || (canGoBack ? labels.back : labels.close) }}\n      </button>\n    }\n\n    <!-- Custom footer actions -->\n    @if (config.footerActions) {\n      <mn-footer-actions\n        [actions]=\"config.footerActions\"\n        [showIcons]=\"showActionIcons\"\n        (actionClick)=\"handleFooterAction($any($event))\"\n      ></mn-footer-actions>\n    } @else {\n      <div class=\"flex-1\"></div>\n    }\n\n    @if (!isLastStep) {\n      <button\n        type=\"button\"\n        mnButton\n        [data]=\"{ variant: 'fill', color: 'primary', disabled: !isCurrentStepValid }\"\n        (click)=\"next()\"\n      >\n        {{ currentStep?.nextLabel || labels.next }}\n        @if (nextIcon; as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"ml-2\"></svg>\n        }\n      </button>\n    }\n\n    @if (isLastStep) {\n      <button\n        type=\"button\"\n        mnButton\n        [data]=\"{ variant: 'fill', color: 'primary', disabled: !isCurrentStepValid || isCompleting }\"\n        [disabled]=\"!isCurrentStepValid || isCompleting\"\n        (click)=\"complete()\"\n      >\n        @if (completeIcon; as icon) {\n          <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n        }\n        {{ currentStep?.nextLabel || (isCompleting ? labels.completing : labels.complete) }}\n      </button>\n    }\n  </div>\n</div>\n","import {\n  ChangeDetectorRef,\n  Component,\n  inject,\n  Input,\n  OnInit,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MnModalRef } from 'mn-angular-lib/modal-core';\nimport {\n  ActionStyle,\n  ConfirmationModalConfig,\n  ConfirmationTone,\n  ModalCloseReason,\n} from 'mn-angular-lib/modal-core';\nimport { MnButton } from 'mn-angular-lib/button';\nimport { MnFormBodyComponent } from '../mn-form-body/mn-form-body.component';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\nimport { MnLanguageService } from 'mn-angular-lib/core';\nimport { LucideDynamicIcon, LucideIconData } from '@lucide/angular';\nimport { MN_MODAL_ACTION_ICONS, MODAL_ACTION_ICON_SIZE } from 'mn-angular-lib/modal-core';\nimport * as lucide from 'lucide';\nimport { lucideIcons } from 'mn-angular-lib/core';\n\n/** Lucide icons this file renders. */\nconst ICONS = lucideIcons({ CircleAlert: lucide.CircleAlert, TriangleAlert: lucide.TriangleAlert });\n\n@Component({\n  selector: 'mn-confirmation-body',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MnButton,\n    MnFormBodyComponent,\n    MnCustomBodyHostComponent,\n    ReactiveFormsModule,\n    LucideDynamicIcon,\n  ],\n  templateUrl: './mn-confirmation-body.component.html',\n  styleUrls: ['./mn-confirmation-body.component.css'],\n})\nexport class MnConfirmationBodyComponent<TResult = boolean> implements OnInit {\n  /** Lucide icons the template renders. */\n  protected readonly icons = ICONS;\n\n  private cdr = inject(ChangeDetectorRef);\n\n  @Input() config!: ConfirmationModalConfig<TResult>;\n  @Input() modalRef!: MnModalRef<TResult>;\n\n  @ViewChild(MnFormBodyComponent) formBody?: MnFormBodyComponent;\n\n  confirmButtonStatus = 'VALID';\n  hasFormFields = false;\n\n  private languageService = inject(MnLanguageService);\n\n  ngOnInit(): void {\n    this.hasFormFields = !!(\n      (this.config.fields && this.config.fields.length > 0) ||\n      (this.config.fieldGroups && this.config.fieldGroups.length > 0) ||\n      (this.config.rows && this.config.rows.length > 0)\n    );\n  }\n\n  onFormStatusChange(status: string): void {\n    this.confirmButtonStatus = status;\n    this.cdr.markForCheck();\n    this.cdr.detectChanges();\n  }\n\n  async confirm(): Promise<void> {\n    if (this.hasFormFields && this.formBody?.form.invalid) {\n      this.formBody.form.markAllAsTouched();\n      return;\n    }\n\n    const result = (this.hasFormFields ? this.formBody?.form.value : true) as TResult;\n\n    if (this.config.confirm?.handler) {\n      await this.config.confirm.handler.handle(result);\n    }\n\n    this.modalRef.close(result);\n  }\n\n  cancel(): void {\n    const reason = this.config.cancel?.reason || ModalCloseReason.CANCELLED;\n    this.modalRef.dismiss(reason);\n  }\n\n  private resolveLabel(value: string | undefined, key: string, fallback: string): string {\n    if (value) return value;\n    const translated = this.languageService.translate(`common.${key}`);\n    return translated === `common.${key}` ? fallback : translated;\n  }\n\n  get confirmLabel(): string {\n    return this.resolveLabel(this.config.confirm?.label, 'confirm', 'Confirm');\n  }\n\n  get cancelLabel(): string {\n    return this.resolveLabel(this.config.cancel?.label, 'cancel', 'Cancel');\n  }\n\n  get confirmStyle(): ActionStyle {\n    return this.config.confirm?.style || ActionStyle.PRIMARY;\n  }\n\n  get cancelStyle(): ActionStyle {\n    return this.config.cancel?.style || ActionStyle.SECONDARY;\n  }\n\n  get toneClass(): string {\n    switch (this.config.tone) {\n      case ConfirmationTone.WARNING:\n        return 'tone-warning';\n      case ConfirmationTone.DANGER:\n        return 'tone-danger';\n      default:\n        return 'tone-default';\n    }\n  }\n\n  getButtonColor(style: ActionStyle): 'primary' | 'secondary' | 'danger' | 'warning' | 'success' {\n    switch (style) {\n      case ActionStyle.PRIMARY:\n        return 'primary';\n      case ActionStyle.DANGER:\n        return 'danger';\n      case ActionStyle.GHOST:\n        return 'secondary';\n      default:\n        return 'secondary';\n    }\n  }\n\n  getButtonVariant(style: ActionStyle): 'fill' | 'outline' | 'text' {\n    switch (style) {\n      case ActionStyle.PRIMARY:\n      case ActionStyle.DANGER:\n        return 'fill';\n      case ActionStyle.GHOST:\n        return 'text';\n      default:\n        return 'outline';\n    }\n  }\n  get isConfirmDisabled(): boolean {\n    if (this.hasFormFields) {\n      return this.confirmButtonStatus !== 'VALID';\n    }\n    return false;\n  }\n\n  /** Icon size (px) for the action buttons. */\n  readonly actionIconSize = MODAL_ACTION_ICON_SIZE;\n\n  /** Whether action-button icons should render on this modal (defaults to true). */\n  get showActionIcons(): boolean {\n    return this.config.showActionIcons !== false;\n  }\n\n  /**\n   * The leading icon for the confirm button, or null when icons are disabled.\n   * Uses the per-action override, else defaults by style (DANGER → trash, else check).\n   */\n  get confirmIcon(): LucideIconData | null {\n    if (!this.showActionIcons) return null;\n    if (this.config.confirm?.icon) return this.config.confirm.icon;\n    return this.confirmStyle === ActionStyle.DANGER\n      ? MN_MODAL_ACTION_ICONS.danger\n      : MN_MODAL_ACTION_ICONS.confirm;\n  }\n\n  /** The leading icon for the cancel button, or null when icons are disabled. */\n  get cancelIcon(): LucideIconData | null {\n    if (!this.showActionIcons) return null;\n    return this.config.cancel?.icon ?? MN_MODAL_ACTION_ICONS.cancel;\n  }\n}\n","<div class=\"flex flex-col gap-6\" [ngClass]=\"toneClass\">\n  <!-- Custom Content (Component or Template) -->\n  @if (config.component || config.template) {\n    <mn-custom-body-host\n      [config]=\"$any(config)\"\n      [modalRef]=\"$any(modalRef)\"\n    ></mn-custom-body-host>\n  }\n\n  <div class=\"flex flex-col items-center text-center gap-6\">\n    @if (config.tone === 'warning' || config.tone === 'danger') {\n      <div\n        class=\"w-12 h-12 rounded-full flex items-center justify-center\"\n        [ngClass]=\"{\n          'bg-blue-100 text-blue-500': config.tone !== 'warning' && config.tone !== 'danger',\n          'bg-amber-100 text-amber-500': config.tone === 'warning',\n          'bg-red-100 text-red-500': config.tone === 'danger'\n        }\">\n        @if (config.tone === 'warning') {\n          <svg [size]=\"24\" [lucideIcon]=\"icons.TriangleAlert\"></svg>\n        }\n        @if (config.tone === 'danger') {\n          <svg [size]=\"24\" [lucideIcon]=\"icons.CircleAlert\"></svg>\n        }\n      </div>\n    }\n\n    @if (config.message) {\n      <div class=\"text-base text-base-content/80 leading-relaxed max-w-[28rem]\">\n        {{ config.message }}\n      </div>\n    }\n  </div>\n\n  <!-- Form Fields / Rows -->\n  @if (hasFormFields) {\n    <mn-form-body\n      [config]=\"$any(config)\"\n      [modalRef]=\"$any(modalRef)\"\n      [hideFooter]=\"true\"\n      [hideCustomBody]=\"true\"\n      (formStatusChange)=\"onFormStatusChange($event)\"\n    ></mn-form-body>\n  }\n\n  <div class=\"flex gap-3 w-full pb-6 sticky bottom-0 bg-base-100 z-10\">\n    <button\n      type=\"button\"\n      mnButton\n      [data]=\"{\n        variant: getButtonVariant(cancelStyle),\n        color: getButtonColor(cancelStyle)\n      }\"\n      (click)=\"cancel()\"\n    >\n      @if (cancelIcon; as icon) {\n        <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n      }\n      {{ cancelLabel }}\n    </button>\n\n    <div class=\"flex-1\"></div>\n\n    <button\n      type=\"button\"\n      mnButton\n      [data]=\"{\n        variant: getButtonVariant(confirmStyle),\n        color: getButtonColor(confirmStyle),\n        disabled: isConfirmDisabled\n      }\"\n      [disabled]=\"isConfirmDisabled\"\n      (click)=\"confirm()\"\n    >\n      @if (confirmIcon; as icon) {\n        <svg [lucideIcon]=\"icon\" [size]=\"actionIconSize\" class=\"mr-2\"></svg>\n      }\n      {{ confirmLabel }}\n    </button>\n  </div>\n</div>\n","import {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  ElementRef,\n  HostBinding,\n  HostListener,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnModalRef } from 'mn-angular-lib/modal-core';\nimport {\n  ActionStyle,\n  BackdropMode,\n  CloseMode,\n  ConfirmationModalConfig,\n  CustomModalConfig,\n  FormModalConfig,\n  KeyboardMode,\n  ModalCloseReason,\n  ModalConfig,\n  ModalFooterAction,\n  ModalKind,\n  ModalSize,\n  WizardModalConfig,\n} from 'mn-angular-lib/modal-core';\nimport { MnWizardBodyComponent } from '../mn-wizard-body/mn-wizard-body.component';\nimport { MnFormBodyComponent } from '../mn-form-body/mn-form-body.component';\nimport { MnConfirmationBodyComponent } from '../mn-confirmation-body/mn-confirmation-body.component';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\nimport { MnFooterActionsComponent } from '../mn-footer-actions/mn-footer-actions.component';\nimport { MnButton } from 'mn-angular-lib/button';\nimport { MnBottomSheet } from 'mn-angular-lib/bottom-sheet';\nimport { LucideDynamicIcon } from '@lucide/angular';\nimport { MN_HAPTICS } from 'mn-angular-lib/modal-core';\nimport { MnLanguageService } from 'mn-angular-lib/core';\nimport * as lucide from 'lucide';\nimport { lucideIcons } from 'mn-angular-lib/core';\n\n/** Lucide icons this file renders. */\nconst ICONS = lucideIcons({ X: lucide.X });\n\n@Component({\n  selector: 'mn-modal-shell',\n  standalone: true,\n  imports: [\n    CommonModule,\n    MnWizardBodyComponent,\n    MnFormBodyComponent,\n    MnConfirmationBodyComponent,\n    MnCustomBodyHostComponent,\n    MnFooterActionsComponent,\n    MnButton,\n    MnBottomSheet,\n    LucideDynamicIcon,\n  ],\n  templateUrl: './mn-modal-shell.component.html',\n  styleUrls: ['./mn-modal-shell.component.css'],\n})\nexport class MnModalShellComponent<TResult = unknown> implements OnInit, AfterViewInit, OnDestroy {\n  /** Lucide icons the template renders. */\n  protected readonly icons = ICONS;\n\n  private readonly lang = inject(MnLanguageService);\n\n  /**\n   * Accessible name for this control. Resolved through the conventional\n   * `mnModal.close` key so an app can translate it, falling back to English when the\n   * key is not defined rather than leaking the raw key into the UI.\n   */\n  get closeModalLabel(): string {\n    return this.lang.translateIfPresent('mnModal.close') ?? 'Close modal';\n  }\n\n  private el = inject<ElementRef<HTMLElement>>(ElementRef);\n  private cdr = inject(ChangeDetectorRef);\n\n  @Input() config!: ModalConfig<TResult>;\n  @Input() modalRef!: MnModalRef<TResult>;\n\n  isClosing = false;\n  /**\n   * Whether another modal is stacked on top of this one. Set imperatively by\n   * `MnModalService` on the already-rendered shell below the newly opened one, so it must\n   * be a signal: mutating a plain field there changes the host `[class]` after the view was\n   * checked (NG0100 ExpressionChangedAfterItHasBeenChecked) and does not schedule change\n   * detection in a zoneless app. A signal write both notifies the host binding and schedules CD.\n   */\n  readonly isStacked = signal(false);\n  readonly ModalKind = ModalKind;\n  /** The rendered wizard body, when this modal is a wizard — used to read the active step title. */\n  private readonly wizardBody = viewChild(MnWizardBodyComponent);\n  /** Tailwind's `sm` breakpoint — below this the modal presents as a bottom sheet. */\n  private static readonly SHEET_MAX_WIDTH = 639.98;\n  /**\n   * Title of the wizard's current step, or undefined for non-wizard modals.\n   * The template appends it to the modal title on small screens, where the\n   * step labels under the progress circles are hidden.\n   */\n  readonly wizardStepTitle = computed(() => this.wizardBody()?.currentStepTitle());\n  private previouslyFocusedElement: HTMLElement | null = null;\n  private focusTrapListener: ((e: KeyboardEvent) => void) | null = null;\n  private pollingTimer: ReturnType<typeof setInterval> | null = null;\n  private pollAttempts = 0;\n  /** Upper bound for the close wait if no animation/transition end event fires\n   *  (e.g. an animation was suppressed). Must stay longer than the slowest close\n   *  path so it never preempts. */\n  private static readonly CLOSE_FALLBACK_MS = 700;\n  /** Live match of the sheet breakpoint, so the modal switches between the centered dialog\n   *  and the bottom sheet when the viewport crosses it (e.g. an orientation change). */\n  readonly isNarrow = signal(false);\n  /** The bottom sheet presenting this modal on mobile, absent on the desktop dialog path. */\n  private readonly bottomSheet = viewChild(MnBottomSheet);\n  /** Optional native haptic engine. Absent on the web — every call is null-guarded. */\n  private haptics = inject(MN_HAPTICS, { optional: true });\n  private sheetMedia: MediaQueryList | null = null;\n  private sheetMediaListener: ((event: MediaQueryListEvent) => void) | null = null;\n\n  /** Whether this modal is allowed to present as a bottom sheet on small screens (default: true). */\n  get isMobileSheet(): boolean {\n    return this.config.mobileBottomSheet !== false;\n  }\n\n  /** Whether the modal should currently render as a bottom sheet (mobile) rather than the\n   *  centered dialog (desktop). */\n  get showMobileSheet(): boolean {\n    return this.isMobileSheet && this.isNarrow();\n  }\n\n  @HostBinding('class') get hostClasses(): string {\n    const size = this.config.sizeWidth || ModalSize.MD;\n    // `closing` is intentionally NOT derived here. startClosing() adds the\n    // `.closing` class imperatively (classList.add) for reliable, zoneless-safe\n    // application. Deriving it here as well flips the host class string after the\n    // view has been checked (NG0100). Angular's class binding only manages the tokens\n    // it emits, so it leaves the imperatively added `.closing` untouched.\n    const animType =\n      typeof this.config.animation === 'string'\n        ? this.config.animation\n        : this.config.animation?.type || 'slide';\n    const animation = ` anim-${animType}`;\n    const stacked = this.isStacked() ? ' is-stacked' : '';\n    const mobileSheet = this.showMobileSheet ? ' mobile-sheet' : '';\n    return `modal-shell modal-${size}${animation}${stacked}${mobileSheet}`;\n  }\n\n  private setupFocusTrap(): void {\n    this.focusTrapListener = (e: KeyboardEvent) => {\n      if (e.key !== 'Tab') return;\n      const focusable = this.el.nativeElement.querySelectorAll<HTMLElement>(\n        'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n      );\n      if (focusable.length === 0) return;\n      const first = focusable[0];\n      const last = focusable[focusable.length - 1];\n      if (e.shiftKey) {\n        if (document.activeElement === first) {\n          e.preventDefault();\n          last.focus();\n        }\n      } else {\n        if (document.activeElement === last) {\n          e.preventDefault();\n          first.focus();\n        }\n      }\n    };\n    this.el.nativeElement.addEventListener('keydown', this.focusTrapListener);\n  }\n\n  private removeFocusTrap(): void {\n    if (this.focusTrapListener) {\n      this.el.nativeElement.removeEventListener('keydown', this.focusTrapListener);\n      this.focusTrapListener = null;\n    }\n  }\n\n  asWizard(config: ModalConfig<TResult>): WizardModalConfig {\n    return config as unknown as WizardModalConfig;\n  }\n\n  asForm(config: ModalConfig<TResult>): FormModalConfig {\n    return config as unknown as FormModalConfig;\n  }\n\n  asConfirmation(config: ModalConfig<TResult>): ConfirmationModalConfig {\n    return config as unknown as ConfirmationModalConfig;\n  }\n\n  asCustom(config: ModalConfig<TResult>): CustomModalConfig {\n    return config as unknown as CustomModalConfig;\n  }\n\n  /** Whether the modal can be dismissed at all (drives the sheet's swipe/backdrop arming). */\n  get canClose(): boolean {\n    return this.config.closeMode !== CloseMode.DISABLED;\n  }\n\n  ngOnInit(): void {\n    this.startWatchingViewport();\n    this.startPollingIfConfigured();\n  }\n\n  ngOnDestroy(): void {\n    this.removeFocusTrap();\n    this.stopPolling();\n    this.stopWatchingViewport();\n    // Restore focus to previously focused element\n    if (\n      this.previouslyFocusedElement &&\n      typeof this.previouslyFocusedElement.focus === 'function'\n    ) {\n      this.previouslyFocusedElement.focus();\n    }\n  }\n\n  /**\n   * Triggers the closing animation and resolves once it has actually finished.\n   *\n   * Deferred via setTimeout to avoid NG0100 when called during a CD cycle. On mobile the\n   * exit is owned by the bottom sheet, so we delegate to its `startClosing()` (idempotent\n   * with a swipe-dismiss already in flight); on desktop we wait for the dialog container's\n   * `animationend`/`transitionend`. A fallback timeout guarantees resolution if no event\n   * fires, and we short-circuit under reduced motion (the CSS collapses to instant).\n   */\n  startClosing(): Promise<void> {\n    return new Promise((resolve) => {\n      setTimeout(async () => {\n        this.isClosing = true;\n        // @HostBinding('class') updates are flushed when the host view is checked\n        // (appRef.tick), not by a bare detectChanges() on this dynamically-created\n        // root component. Apply the `.closing` class directly so the backdrop fade is\n        // reliable in a zoneless app.\n        this.el.nativeElement.classList.add('closing');\n        this.cdr.detectChanges();\n\n        if (this.prefersReducedMotion()) {\n          resolve();\n          return;\n        }\n\n        // Mobile: the bottom sheet drives the slide-down exit.\n        const sheet = this.bottomSheet();\n        if (sheet) {\n          await sheet.startClosing();\n          resolve();\n          return;\n        }\n\n        // Desktop: wait for the centered dialog container's own close animation.\n        const container = this.el.nativeElement.querySelector(\n          '.modal-container',\n        ) as HTMLElement | null;\n        if (!container) {\n          resolve();\n          return;\n        }\n\n        let settled = false;\n        const done = (event?: Event): void => {\n          // Ignore end events bubbling up from descendant animations/transitions.\n          if (event && event.target !== container) return;\n          if (settled) return;\n          settled = true;\n          container.removeEventListener('animationend', done);\n          container.removeEventListener('transitionend', done);\n          clearTimeout(fallback);\n          resolve();\n        };\n\n        container.addEventListener('animationend', done);\n        container.addEventListener('transitionend', done);\n        const fallback = setTimeout(done, MnModalShellComponent.CLOSE_FALLBACK_MS);\n      });\n    });\n  }\n\n  private prefersReducedMotion(): boolean {\n    return (\n      typeof window !== 'undefined' &&\n      typeof window.matchMedia === 'function' &&\n      window.matchMedia('(prefers-reduced-motion: reduce)').matches\n    );\n  }\n\n  @HostListener('document:keydown.escape', ['$event'])\n  onEscapeKey(event: Event): void {\n    if (this.config.keyboard === KeyboardMode.ENABLED) {\n      this.handleClose(ModalCloseReason.ESCAPE);\n      if (event && event.preventDefault) {\n        event.preventDefault();\n      }\n    }\n  }\n\n  onBackdropClick(): void {\n    const shouldClose =\n      this.config.backdrop === BackdropMode.CLOSABLE ||\n      (this.isMobileSheet && this.config.backdrop !== BackdropMode.STATIC);\n    if (shouldClose) {\n      this.handleClose(ModalCloseReason.BACKDROP);\n    }\n  }\n\n  onCloseButtonClick(): void {\n    this.handleClose(ModalCloseReason.DISMISSED);\n  }\n\n  /**\n   * Guard consulted by the bottom sheet before it commits a swipe/flick/backdrop dismissal.\n   * Mirrors the DISABLED/GUARDED rules of {@link handleClose} so a swipe cannot escape a\n   * modal that a button close could not. Bound as a field so the template passes it directly.\n   */\n  readonly sheetDismissGuard = async (): Promise<boolean> => {\n    if (this.config.closeMode === CloseMode.DISABLED) {\n      return false;\n    }\n    if (this.config.closeMode === CloseMode.GUARDED && this.config.closeGuard) {\n      return await this.config.closeGuard();\n    }\n    return true;\n  };\n\n  /**\n   * Handles the sheet's `(dismiss)` — emitted only after its guard passed and its exit\n   * animation finished. Dismisses the modal (no re-guard) with a confirming haptic.\n   */\n  onSheetDismiss(): void {\n    this.haptics?.impact('medium');\n    this.modalRef.dismiss(ModalCloseReason.DISMISSED);\n  }\n\n  ngAfterViewInit(): void {\n    this.previouslyFocusedElement = document.activeElement as HTMLElement;\n    this.setupFocusTrap();\n    // Focus the modal container (the centered dialog, or the sheet's container on mobile).\n    const container = this.el.nativeElement.querySelector('.modal-container') as HTMLElement;\n    if (container) {\n      container.focus();\n    }\n  }\n\n  /** Tracks the sheet breakpoint through `matchMedia` so the dialog/sheet fork re-renders\n   *  when the viewport crosses it. */\n  private startWatchingViewport(): void {\n    if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n    this.sheetMedia = window.matchMedia(`(max-width: ${MnModalShellComponent.SHEET_MAX_WIDTH}px)`);\n    this.isNarrow.set(this.sheetMedia.matches);\n    this.sheetMediaListener = (event: MediaQueryListEvent) => this.isNarrow.set(event.matches);\n    this.sheetMedia.addEventListener('change', this.sheetMediaListener);\n  }\n\n  /** Tears down the breakpoint listener. Idempotent. */\n  private stopWatchingViewport(): void {\n    if (this.sheetMedia && this.sheetMediaListener) {\n      this.sheetMedia.removeEventListener('change', this.sheetMediaListener);\n    }\n    this.sheetMedia = null;\n    this.sheetMediaListener = null;\n  }\n\n  /** Attempts to dismiss the modal. Resolves true if it was actually dismissed,\n   *  false if blocked by a DISABLED close mode or a rejected close guard. */\n  private async handleClose(reason: ModalCloseReason): Promise<boolean> {\n    if (this.config.closeMode === CloseMode.DISABLED) {\n      return false;\n    }\n\n    if (this.config.closeMode === CloseMode.GUARDED) {\n      if (this.config.closeGuard) {\n        const allowed = await this.config.closeGuard();\n        if (!allowed) return false;\n      }\n    }\n\n    this.modalRef.dismiss(reason);\n    return true;\n  }\n\n  get showBackdrop(): boolean {\n    return this.config.backdrop !== BackdropMode.HIDE;\n  }\n\n  get containerSizeClass(): string {\n    switch (this.config.sizeWidth || ModalSize.MD) {\n      case ModalSize.SM:\n        return 'w-96';\n      case ModalSize.MD:\n        return 'w-[32rem]';\n      case ModalSize.LG:\n        return 'w-[48rem]';\n      case ModalSize.XL:\n        return 'w-[64rem]';\n      case ModalSize.FULL:\n        return 'w-[95vw]';\n      default:\n        return 'w-[32rem]';\n    }\n  }\n\n  get containerHeightStyle(): string | null {\n    if (this.config.sizeWidth === ModalSize.FULL && !this.config.sizeHeight) {\n      return '95vh';\n    }\n    if (!this.config.sizeHeight) return null;\n    switch (this.config.sizeHeight) {\n      case ModalSize.SM:\n        return '30vh';\n      case ModalSize.MD:\n        return '50vh';\n      case ModalSize.LG:\n        return '70vh';\n      case ModalSize.XL:\n        return '85vh';\n      case ModalSize.FULL:\n        return '95vh';\n      default:\n        return null;\n    }\n  }\n\n  get showCloseButton(): boolean {\n    return this.config.closeMode !== CloseMode.DISABLED;\n  }\n\n  // =========================\n  // Footer Actions\n  // =========================\n\n  get hasCustomFooterActions(): boolean {\n    return !!this.config.footerActions && this.config.footerActions.length > 0;\n  }\n\n  get leftFooterActions(): ModalFooterAction<TResult>[] {\n    return (this.config.footerActions || []).filter((a) => a.position === 'left');\n  }\n\n  get rightFooterActions(): ModalFooterAction<TResult>[] {\n    return (this.config.footerActions || []).filter((a) => a.position !== 'left');\n  }\n\n  async onFooterAction(action: ModalFooterAction<TResult>): Promise<void> {\n    if (action.disabled) return;\n    if (action.handler) {\n      await action.handler(this.modalRef);\n    }\n    if (action.closesModal) {\n      if (action.closeReason === ModalCloseReason.COMPLETED) {\n        this.modalRef.close();\n      } else {\n        this.modalRef.dismiss(action.closeReason || ModalCloseReason.DISMISSED);\n      }\n    }\n  }\n\n  getActionButtonColor(\n    style?: ActionStyle,\n  ): 'primary' | 'secondary' | 'danger' | 'warning' | 'success' {\n    switch (style) {\n      case ActionStyle.PRIMARY:\n        return 'primary';\n      case ActionStyle.DANGER:\n        return 'danger';\n      case ActionStyle.GHOST:\n        return 'secondary';\n      default:\n        return 'secondary';\n    }\n  }\n\n  getActionButtonVariant(style?: ActionStyle): 'fill' | 'outline' | 'text' {\n    switch (style) {\n      case ActionStyle.PRIMARY:\n      case ActionStyle.DANGER:\n        return 'fill';\n      case ActionStyle.GHOST:\n        return 'text';\n      default:\n        return 'outline';\n    }\n  }\n\n  // =========================\n  // Polling\n  // =========================\n\n  private startPollingIfConfigured(): void {\n    const polling = this.config.polling;\n    if (!polling) return;\n    if (polling.autoStart === false) return;\n    this.startPolling();\n  }\n\n  private startPolling(): void {\n    const polling = this.config.polling;\n    if (!polling) return;\n\n    this.pollingTimer = setInterval(async () => {\n      this.pollAttempts++;\n      try {\n        const shouldStop = await polling.onPoll(this.modalRef);\n        if (shouldStop === true) {\n          this.stopPolling();\n        }\n      } catch (e) {\n        console.error('Polling error:', e);\n      }\n      if (polling.maxAttempts && this.pollAttempts >= polling.maxAttempts) {\n        this.stopPolling();\n      }\n    }, polling.interval);\n  }\n\n  private stopPolling(): void {\n    if (this.pollingTimer) {\n      clearInterval(this.pollingTimer);\n      this.pollingTimer = null;\n    }\n  }\n}\n","@if (showBackdrop) {\n  <!-- The backdrop is a visual overlay — keyboard dismiss is handled at component level via Escape key -->\n    <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n  <div class=\"modal-backdrop absolute inset-0 bg-black/50 animate-[fadeIn_0.2s_ease-in-out]\" (click)=\"onBackdropClick()\"></div>\n}\n\n@if (showMobileSheet) {\n  <!-- Mobile: the shared bottom sheet owns the anchoring, grabber, swipe/flick-to-dismiss\n       and slide animation. The shell keeps its own backdrop (so the sheet renders none),\n       and its close animation delegates to the sheet's startClosing(). `modal-container`\n       is kept as a class hook so the host app's keyboard-lift CSS still matches. -->\n  <mn-bottom-sheet\n    (dismiss)=\"onSheetDismiss()\"\n    [ariaLabelledby]=\"config.title ? 'mn-modal-title' : undefined\"\n    [containerClass]=\"'modal-container'\"\n    [dismissGuard]=\"sheetDismissGuard\"\n    [dismissible]=\"canClose\"\n    [growWithKeyboard]=\"true\"\n    [maxHeightVh]=\"92\"\n    [showBackdrop]=\"false\"\n  >\n    <ng-container [ngTemplateOutlet]=\"modalBody\"></ng-container>\n  </mn-bottom-sheet>\n} @else {\n  <!--\n    Desktop centered dialog. The container deliberately does NOT stop click propagation.\n    The backdrop is a *sibling* element (absolutely positioned behind this one), never an\n    ancestor, so clicks in here can't reach `onBackdropClick()` anyway. Swallowing them\n    instead broke every \"click outside me\" handler inside a modal.\n  -->\n  <div\n    [attr.aria-describedby]=\"config.description ? 'mn-modal-description' : null\"\n    [attr.aria-labelledby]=\"config.title ? 'mn-modal-title' : null\"\n    [ngClass]=\"containerSizeClass\"\n    [style.height]=\"containerHeightStyle\"\n    aria-modal=\"true\"\n    class=\"modal-container relative bg-base-100 rounded-lg shadow-xl max-h-[90vh] max-w-[calc(100vw-2rem)] overflow-hidden flex flex-col\"\n    role=\"dialog\"\n    tabindex=\"-1\"\n  >\n    <ng-container [ngTemplateOutlet]=\"modalBody\"></ng-container>\n  </div>\n}\n\n<ng-template #modalBody>\n  <div [class.border-b]=\"config.kind !== ModalKind.WIZARD\"\n       [class.border-base-300]=\"config.kind !== ModalKind.WIZARD\"\n       class=\"flex items-center justify-between p-6\">\n    <div class=\"flex flex-col gap-0.5\">\n      @if (config.title) {\n        <!-- On small screens the wizard's step labels (under the progress circles) are hidden,\n             so surface the active step name here as \"Title - Step\" instead. -->\n        <h2 class=\"m-0 text-xl font-semibold text-base-content\"\n            id=\"mn-modal-title\">{{ config.title }}@if (config.kind === ModalKind.WIZARD && wizardStepTitle()) {\n          <span class=\"sm:hidden font-normal text-base-content/60\"> - {{ wizardStepTitle() }}</span>\n        }</h2>\n      }\n      @if (config.subtitle) {\n        <p class=\"m-0 text-sm text-base-content/60 font-normal\">{{ config.subtitle }}</p>\n      }\n    </div>\n    @if (showCloseButton) {\n      <div [class]=\"showMobileSheet ? 'hidden sm:flex' : ''\">\n        <button\n          mnButton\n          [data]=\"{ size: 'sm', variant: 'text', color: 'gray', hover: true, borderRadius: 'md' }\"\n          type=\"button\"\n          class=\"w-8 h-8\"\n          (click)=\"onCloseButtonClick()\"\n          [attr.aria-label]=\"closeModalLabel\"\n        >\n          <svg [lucideIcon]=\"icons.X\" [size]=\"18\"></svg>\n        </button>\n      </div>\n    }\n  </div>\n  @if (config.description) {\n    <p class=\"m-0 px-6 text-sm text-base-content/60 leading-relaxed\" id=\"mn-modal-description\">{{ config.description }}</p>\n  }\n\n  @if (config.kind === ModalKind.WIZARD) {\n    <!-- Wizard manages its own internal scrolling so the steps header and footer\n         stay fixed while only the step body scrolls. No padding/scroll here. -->\n    <div class=\"flex-auto min-h-0 overflow-hidden flex flex-col\">\n      <mn-wizard-body\n        [config]=\"asWizard(config)\"\n        [modalRef]=\"$any(modalRef)\"\n        class=\"flex-auto min-h-0 flex flex-col\"\n      ></mn-wizard-body>\n    </div>\n  } @else {\n    <div class=\"flex-1 overflow-y-auto px-6 pt-6\">\n      @if (config.kind === ModalKind.FORM) {\n        <mn-form-body\n          [config]=\"asForm(config)\"\n          [modalRef]=\"$any(modalRef)\"\n          class=\"block h-full\"\n        ></mn-form-body>\n      }\n\n      @if (config.kind === ModalKind.CONFIRMATION) {\n        <mn-confirmation-body\n          [config]=\"asConfirmation(config)\"\n          [modalRef]=\"$any(modalRef)\"\n        ></mn-confirmation-body>\n      }\n\n      @if (config.kind === ModalKind.CUSTOM) {\n        <mn-custom-body-host\n          [config]=\"asCustom(config)\"\n          [modalRef]=\"$any(modalRef)\"\n          class=\"block pb-6\"\n        ></mn-custom-body-host>\n      }\n    </div>\n  }\n\n  <!-- Custom Footer Actions (not for wizard modals, they render their own) -->\n  @if (hasCustomFooterActions && config.kind !== ModalKind.WIZARD) {\n    <div class=\"flex gap-3 p-6 border-t border-base-300\">\n      <mn-footer-actions\n        [actions]=\"config.footerActions || []\"\n        [showIcons]=\"config.showActionIcons !== false\"\n        (actionClick)=\"onFooterAction($event)\"\n      ></mn-footer-actions>\n    </div>\n  }\n</ng-template>\n","/**\n * Public API of the `mn-angular-lib/modal-ui` entry point: the modal shell and body components. `MnModalService` loads this entry point on demand, so it is not part of a consumer's startup bundle.\n *\n * Each entry point is its own module in the published package, so a consumer's bundler\n * splits it into the chunk that uses it instead of loading the whole library at startup.\n * The root `mn-angular-lib` entry re-exports every entry point.\n */\nexport { MnModalShellComponent } from './src/mn-modal/components/mn-modal-shell/mn-modal-shell.component';\nexport { MnWizardBodyComponent } from './src/mn-modal/components/mn-wizard-body/mn-wizard-body.component';\nexport { MnFormBodyComponent } from './src/mn-modal/components/mn-form-body/mn-form-body.component';\nexport { MnConfirmationBodyComponent } from './src/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component';\nexport { MnCustomBodyHostComponent } from './src/mn-modal/components/mn-custom-body-host/mn-custom-body-host.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["ICONS"],"mappings":"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"}