{"version":3,"file":"commons-shared-web-ui.mjs","sources":["../../../src/lib/modules/material/material.module.ts","../../../src/lib/modules/smart-form/services/smart-form-controller.service.ts","../../../src/lib/modules/smart-form/utils/translation.utils.ts","../../../src/lib/utils/string.utils.ts","../../../src/lib/modules/smart-form/services/expression.service.ts","../../../src/lib/modules/button/components/button/button.component.ts","../../../src/lib/modules/button/components/button/button.component.html","../../../src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.ts","../../../src/lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component.html","../../../src/lib/modules/time-picker/components/time-picker/time-picker.component.ts","../../../src/lib/modules/time-picker/components/time-picker/time-picker.component.html","../../../src/lib/modules/smart-form/utils/trusted-url.pipe.ts","../../../src/lib/modules/smart-form/components/form-field/form-field.component.ts","../../../src/lib/modules/smart-form/components/form-field/form-field.component.html","../../../src/lib/modules/snackbar/components/snackbar.component.ts","../../../src/lib/modules/snackbar/components/snackbar.component.html","../../../src/lib/modules/snackbar/services/snackbar.service.ts","../../../src/lib/modules/smart-form/components/form-section/form-section.component.ts","../../../src/lib/modules/smart-form/components/form-section/form-section.component.html","../../../src/lib/modules/smart-form/components/smart-form/smart-form.component.ts","../../../src/lib/modules/smart-form/components/smart-form/smart-form.component.html","../../../src/lib/modules/button/button.module.ts","../../../src/lib/modules/alert/components/alert/alert.component.ts","../../../src/lib/modules/alert/components/alert/alert.component.html","../../../src/lib/modules/alert/alert.module.ts","../../../src/lib/modules/form-components/components/input/input.component.ts","../../../src/lib/modules/form-components/components/input/input.component.html","../../../src/lib/modules/form-components/directives/click-outside.directive.ts","../../../src/lib/modules/form-components/components/dropdown/dropdown.component.ts","../../../src/lib/modules/form-components/components/dropdown/dropdown.component.html","../../../src/lib/modules/form-components/components/checkbox/checkbox.component.ts","../../../src/lib/modules/form-components/components/checkbox/checkbox.component.html","../../../src/lib/modules/form-components/components/radio/radio.component.ts","../../../src/lib/modules/form-components/components/radio/radio.component.html","../../../src/lib/modules/form-components/components/toggle/toggle.component.ts","../../../src/lib/modules/form-components/components/toggle/toggle.component.html","../../../src/lib/modules/form-components/components/datepicker/datepicker.component.ts","../../../src/lib/modules/form-components/components/datepicker/datepicker.component.html","../../../src/lib/modules/form-components/components/search/search.component.ts","../../../src/lib/modules/form-components/components/search/search.component.html","../../../src/lib/modules/form-components/form-components.module.ts","../../../src/lib/modules/time-picker/time-picker.module.ts","../../../src/lib/modules/smart-form/smart-form.module.ts","../../../src/lib/modules/form-builder/services/form-schema-tree.service.ts","../../../src/lib/modules/form-builder/services/field-selection.service.ts","../../../src/lib/modules/form-builder/utils/constants.ts","../../../src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.ts","../../../src/lib/modules/form-builder/components/field-selection/selection-field-node/selection-field-node.component.html","../../../src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.ts","../../../src/lib/modules/form-builder/components/field-selection/selection-section-node/selection-section-node.component.html","../../../src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.ts","../../../src/lib/modules/form-builder/components/field-selection/group-node/group-node.component.html","../../../src/lib/modules/form-builder/components/field-selection/field-selection.component.ts","../../../src/lib/modules/form-builder/components/field-selection/field-selection.component.html","../../../src/lib/modules/form-builder/services/field-configurator.service.ts","../../../src/lib/modules/form-builder/tokens/builder.tokens.ts","../../../src/lib/modules/form-builder/configs/field-type-schema.map.ts","../../../src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.ts","../../../src/lib/modules/form-builder/components/field-configurator/configurator-tree/configurator-tree.component.html","../../../src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.ts","../../../src/lib/modules/form-builder/components/field-configurator/configurator-config-panel/configurator-config-panel.component.html","../../../src/lib/modules/form-builder/components/field-configurator/field-configurator.component.ts","../../../src/lib/modules/form-builder/components/field-configurator/field-configurator.component.html","../../../src/lib/modules/form-builder/form-builder.module.ts","../../../src/lib/modules/form-field-configuration/services/config-schema-tree.service.ts","../../../src/lib/modules/form-field-configuration/services/field-configuration.service.ts","../../../src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.ts","../../../src/lib/modules/form-field-configuration/components/config-field-node/config-field-node.component.html","../../../src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.ts","../../../src/lib/modules/form-field-configuration/components/config-section-node/config-section-node.component.html","../../../src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.ts","../../../src/lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component.html","../../../src/lib/modules/form-field-configuration/form-field-configuration.module.ts","../../../src/lib/modules/table-column-configuration/services/table-column-configuration.service.ts","../../../src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.ts","../../../src/lib/modules/table-column-configuration/components/config-column-node/config-column-node.component.html","../../../src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.ts","../../../src/lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component.html","../../../src/lib/modules/table-column-configuration/table-column-configuration.module.ts","../../../src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.ts","../../../src/lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component.html","../../../src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.ts","../../../src/lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component.html","../../../src/lib/modules/confirmation-modal/confirmation-modal.module.ts","../../../src/lib/modules/button-dropdown/button-dropdown.module.ts","../../../src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.ts","../../../src/lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component.html","../../../src/lib/modules/filter-sidebar/filter-sidebar.module.ts","../../../src/lib/modules/summary-card/components/summary-card/summary-card.component.ts","../../../src/lib/modules/summary-card/components/summary-card/summary-card.component.html","../../../src/lib/modules/summary-card/summary-card.module.ts","../../../src/lib/utils/translation.utils.ts","../../../src/lib/modules/configurable-form/component/configurable-form.component.ts","../../../src/lib/modules/configurable-form/component/configurable-form.component.html","../../../src/lib/modules/configurable-form/configurable-form.module.ts","../../../src/lib/modules/filter/components/filter/filter.component.ts","../../../src/lib/modules/filter/components/filter/filter.component.html","../../../src/lib/modules/filter/filter.module.ts","../../../src/lib/utils/constants.ts","../../../src/lib/modules/side-nav/components/side-nav/side-nav.component.ts","../../../src/lib/modules/side-nav/components/side-nav/side-nav.component.html","../../../src/lib/modules/side-nav/side-nav.module.ts","../../../src/lib/modules/pagination/components/pagination/pagination.component.ts","../../../src/lib/modules/pagination/components/pagination/pagination.component.html","../../../src/lib/modules/smart-table/utils/safe-html.pipe.ts","../../../src/lib/modules/smart-table/components/smart-table/smart-table.component.ts","../../../src/lib/modules/smart-table/components/smart-table/smart-table.component.html","../../../src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.ts","../../../src/lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component.html","../../../src/lib/modules/pagination/pagination.module.ts","../../../src/lib/modules/smart-table/smart-table.module.ts","../../../src/lib/modules/filter-table-selector/filter-table-selector.module.ts","../../../src/lib/shared-ui.module.ts","../../../src/lib/utils/storage.utils.ts","../../../src/lib/modules/configurable-form/configurable-form.examples.ts","../../../src/lib/modules/nav/components/nav/nav.component.ts","../../../src/lib/modules/nav/components/nav/nav.component.html","../../../src/lib/modules/nav/nav.module.ts","../../../src/lib/modules/smart-table/utils/smart-table.utils.ts","../../../src/lib/modules/smart-form/utils/validation.utils.ts","../../../src/lib/modules/smart-form/smart-form.examples.ts","../../../src/lib/modules/snackbar/snackbar.module.ts","../../../src/public-api.ts","../../../src/commons-shared-web-ui.ts"],"sourcesContent":["import { NgModule } from \"@angular/core\";\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatSnackBarModule } from \"@angular/material/snack-bar\";\r\nimport { MatCheckboxModule } from '@angular/material/checkbox'\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatNativeDateModule } from \"@angular/material/core\";\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {MatSliderModule} from '@angular/material/slider';\r\nimport {MatListModule} from '@angular/material/list';\r\nimport {MatChipsModule} from '@angular/material/chips';\r\nimport {MatPaginatorModule} from '@angular/material/paginator';\r\nimport {MatTableModule} from '@angular/material/table';\r\nimport {MatExpansionModule} from '@angular/material/expansion';\r\nimport {CdkAccordionModule} from '@angular/cdk/accordion';\r\nimport { MatSortModule } from \"@angular/material/sort\";\r\nimport {MatAutocompleteModule} from '@angular/material/autocomplete';\r\nimport {MatSlideToggleModule} from '@angular/material/slide-toggle';\r\nimport {MatButtonToggleModule} from '@angular/material/button-toggle';\r\n\r\n@NgModule({\r\n  imports: [\r\n    MatCardModule,\r\n    MatSnackBarModule,\r\n    MatCheckboxModule,\r\n    MatDividerModule,\r\n    MatSelectModule,\r\n    MatRadioModule,\r\n    MatDialogModule,\r\n    MatFormFieldModule,\r\n    MatDatepickerModule,\r\n    MatNativeDateModule,\r\n    MatInputModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatTabsModule,\r\n    MatButtonModule,\r\n    MatMenuModule,\r\n    MatTabsModule,\r\n    MatProgressBarModule,\r\n    MatTooltipModule,\r\n    MatSliderModule,\r\n    MatListModule,\r\n    MatChipsModule,\r\n    MatSortModule,\r\n    MatAutocompleteModule,\r\n    MatSlideToggleModule,\r\n    MatButtonToggleModule\r\n  ],\r\n  exports: [\r\n    MatCardModule,\r\n    MatSnackBarModule,\r\n    MatCheckboxModule,\r\n    MatDividerModule,\r\n    MatSelectModule,\r\n    MatRadioModule,\r\n    MatDialogModule,\r\n    MatFormFieldModule,\r\n    MatDatepickerModule,\r\n    MatNativeDateModule,\r\n    MatInputModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatTabsModule,\r\n    MatButtonModule,\r\n    MatMenuModule,\r\n    MatTabsModule,\r\n    MatProgressBarModule,\r\n    MatTooltipModule,\r\n    MatSliderModule,\r\n    MatListModule,\r\n    MatChipsModule,\r\n    MatPaginatorModule,\r\n    MatTableModule,\r\n    MatExpansionModule,\r\n    CdkAccordionModule,\r\n    MatSortModule,\r\n    MatAutocompleteModule,\r\n    MatSlideToggleModule,\r\n    MatButtonToggleModule\r\n  ]\r\n})\r\nexport class MaterialModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { FormLabels } from '../models/form-schema.model';\r\n\r\n@Injectable()\r\nexport class SmartFormController {\r\n  private formData: { [key: string]: any } = {};\r\n\r\n  /** Auth token sourced from the FormSchema configJSON (e.g. \"Bearer eyJ…\") */\r\n  token?: string;\r\n  /** HTTP header name for the token (default: \"Authorization\") */\r\n  tokenHeader?: string;\r\n  /** Flat map of translated i18n labels passed from SmartFormComponent */\r\n  labels: any = {};\r\n  /** Custom label keys for form actions (Next, Submit, Add, etc.) */\r\n  actionLabels?: FormLabels;\r\n  fieldSubjects: Map<string, BehaviorSubject<any>> = new Map();\r\n  fileAdded$ = new Subject<any>();\r\n  fileUploadFinished$ = new Subject<any>();\r\n  fileRemoved$ = new Subject<any>();\r\n  /** Emitted when a suffixActionIcon is clicked inside a form field */\r\n  suffixActionClick$ = new Subject<{ fieldName: string; actionId: string }>();\r\n  /** Selected options details passed dynamically from parent component */\r\n  selectedOptionsData: { [fieldName: string]: any } = {};\r\n\r\n  initialize(initialData: { [key: string]: any }): void {\r\n    this.formData = { ...initialData };\r\n    this.fieldSubjects.forEach((subject, key) => {\r\n      subject.next(this.formData[key]);\r\n    });\r\n  }\r\n\r\n  updateField(name: string, value: any): void {\r\n    this.formData[name] = value;\r\n\r\n    if (!this.fieldSubjects.has(name)) {\r\n      this.fieldSubjects.set(name, new BehaviorSubject<any>(value));\r\n    } else {\r\n      this.fieldSubjects.get(name)!.next(value);\r\n    }\r\n  }\r\n\r\n  getFieldValue(name: string): any {\r\n    return this.formData[name];\r\n  }\r\n\r\n  getFieldObservable(name: string): Observable<any> {\r\n    if (!this.fieldSubjects.has(name)) {\r\n      this.fieldSubjects.set(name, new BehaviorSubject<any>(this.formData[name]));\r\n    }\r\n    return this.fieldSubjects.get(name)!.asObservable();\r\n  }\r\n\r\n  getAllData(): { [key: string]: any } {\r\n    return { ...this.formData };\r\n  }\r\n\r\n  reset(): void {\r\n    this.formData = {};\r\n    this.fieldSubjects.forEach(subject => subject.next(undefined));\r\n  }\r\n\r\n  destroy(): void {\r\n    this.fieldSubjects.forEach(subject => subject.complete());\r\n    this.fieldSubjects.clear();\r\n  }\r\n}\r\n","import { FieldConfig, FormSchema } from '../models/form-schema.model';\r\n\r\n/**\r\n * Utility class for translating Smart Form schemas.\r\n */\r\nexport class SmartFormTranslationUtils {\r\n\r\n    /**\r\n     * Recursively walks the schema and replaces i18n keys with values from labels map.\r\n     * @param schema The FormSchema to translate.\r\n     * @param labels The labels map (can be flat or contain labelsObject property).\r\n     */\r\n    static translateSchema(schema: FormSchema, labels: any): void {\r\n        if (!schema || !labels) return;\r\n\r\n        // Support both flat labels map and the pattern used in ConfigurableForm which passes { labelsObject: ... }\r\n        const labelsMap = labels.labelsObject || labels;\r\n        const translate = (key: string) => labelsMap[key] || key;\r\n\r\n        // Root properties\r\n        if (schema.label) schema.label = translate(schema.label);\r\n        if (schema.description) schema.description = translate(schema.description);\r\n\r\n        // Submit config\r\n        if (schema.submitConfig) {\r\n            if (schema.submitConfig.successMessage) schema.submitConfig.successMessage = translate(schema.submitConfig.successMessage);\r\n            if (schema.submitConfig.errorMessage) schema.submitConfig.errorMessage = translate(schema.submitConfig.errorMessage);\r\n        }\r\n\r\n        // Section config\r\n        if (schema.sectionConfig) {\r\n            this.translateSection(schema.sectionConfig, translate);\r\n        }\r\n\r\n        // Stepper config\r\n        if (schema.stepperConfig?.children) {\r\n            schema.stepperConfig.children.forEach(field => this.translateField(field, translate));\r\n        }\r\n    }\r\n\r\n    private static translateSection(section: any, translate: (key: string) => string): void {\r\n        if (section.label) section.label = translate(section.label);\r\n        if (section.children) {\r\n            section.children.forEach((field: FieldConfig) => this.translateField(field, translate));\r\n        }\r\n    }\r\n\r\n    private static translateField(field: FieldConfig, translate: (key: string) => string): void {\r\n        if (field.label) field.label = translate(field.label);\r\n        if (field.placeholder) field.placeholder = translate(field.placeholder);\r\n        if (field.hint) field.hint = translate(field.hint);\r\n\r\n        if (field.richTextConfig?.placeholder) {\r\n            field.richTextConfig.placeholder = translate(field.richTextConfig.placeholder);\r\n        }\r\n\r\n        if (field.textConfig?.patternMessage) {\r\n            field.textConfig.patternMessage = translate(field.textConfig.patternMessage);\r\n        }\r\n\r\n        if (field.attachmentConfig?.acceptLabel) {\r\n            field.attachmentConfig.acceptLabel = translate(field.attachmentConfig.acceptLabel);\r\n        }\r\n\r\n        if (field.optionConfig?.optionList) {\r\n            field.optionConfig.optionList.forEach(opt => {\r\n                if (opt.label) opt.label = translate(opt.label);\r\n                if (opt.hint) opt.hint = translate(opt.hint);\r\n            });\r\n        }\r\n\r\n        // Recurse into children (ROW or GROUP)\r\n        if (field.children) {\r\n            field.children.forEach(child => this.translateField(child, translate));\r\n        }\r\n\r\n        // Recurse into nested section config\r\n        if (field.sectionConfig) {\r\n            this.translateSection(field.sectionConfig, translate);\r\n        }\r\n    }\r\n}\r\n","/**\r\n * Utility functions for string manipulation\r\n */\r\nexport class StringUtils {\r\n\r\n    /**\r\n     * Converts a string to camelCase.\r\n     * Example: \"First Name\" -> \"firstName\", \"Profile Picture\" -> \"profilePicture\"\r\n     */\r\n    static toCamelCase(str?: string): string {\r\n        if (!str) return '';\r\n        return str\r\n            .replace(/[^a-zA-Z0-9 ]/g, '')\r\n            .split(' ')\r\n            .filter(Boolean)\r\n            .map((word, i) =>\r\n                i === 0\r\n                    ? word.charAt(0).toLowerCase() + word.slice(1)\r\n                    : word.charAt(0).toUpperCase() + word.slice(1)\r\n            )\r\n            .join('');\r\n    }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ExpressionService {\r\n  private loadedFunctions: Map<string, Function> = new Map();\r\n\r\n  evaluate(expression: string, context: { [key: string]: any }, variables?: string[]): any {\r\n    try {\r\n      const vars = variables || this.extractVariables(expression);\r\n      const args = vars.map(v => context[v]);\r\n\r\n      const func = new Function(...vars, `return ${expression};`);\r\n      return func(...args);\r\n    } catch (e) {\r\n      console.error('Expression evaluation error:', e, { expression, vars: variables || this.extractVariables(expression), context });\r\n      return null;\r\n    }\r\n  }\r\n\r\n  evaluateCondition(expression: string, context: { [key: string]: any }): boolean {\r\n    const vars = this.extractVariables(expression);\r\n    try {\r\n      const args = vars.map(v => context[v]);\r\n      const func = new Function(...vars, `return ${expression};`);\r\n      const result = func(...args);\r\n      return !!result;\r\n    } catch (e) {\r\n      console.error('Condition evaluation error:', e, { expression, variables: vars, context });\r\n      return false;\r\n    }\r\n  }\r\n\r\n  evaluateFormula(formula: string, functionName: string, context: { [key: string]: any }, variables?: string[]): any {\r\n    try {\r\n      if (!this.loadedFunctions.has(functionName)) {\r\n        const func = new Function('context', `\r\n          ${formula}\r\n          return ${functionName};\r\n        `)(context);\r\n        this.loadedFunctions.set(functionName, func);\r\n      }\r\n\r\n      const fn = this.loadedFunctions.get(functionName);\r\n      if (!fn) return null;\r\n\r\n      const args = variables ? variables.map(v => context[v]) : [];\r\n      return fn(...args);\r\n    } catch (e) {\r\n      console.error('Formula evaluation error:', e);\r\n      return null;\r\n    }\r\n  }\r\n\r\n  extractVariables(expression: string): string[] {\r\n    if (!expression) return [];\r\n\r\n    // Remove strings from expression to avoid picking up variables inside quotes\r\n    const cleanExpr = expression\r\n      .replace(/'[^']*'/g, '')\r\n      .replace(/\"[^\"]*\"/g, '')\r\n      .replace(/`[^`]*`/g, '')\r\n      // Remove properties (e.g., .max) to only pick up top-level identifiers\r\n      .replace(/\\.\\w+/g, '');\r\n\r\n    const regex = /\\b[a-zA-Z_]\\w*\\b/g;\r\n    const matches = cleanExpr.match(regex) || [];\r\n    const keywords = [\r\n      'true', 'false', 'null', 'undefined', 'return', 'if', 'else', 'for', 'while', 'function', 'var', 'let', 'const', 'this',\r\n      'Math', 'JSON', 'console', 'window', 'document', 'Date', 'Object', 'Array', 'Number', 'String', 'Boolean', 'Symbol'\r\n    ];\r\n    return [...new Set(matches.filter(m => !keywords.includes(m)))];\r\n  }\r\n}\r\n","import { Component, Input, OnInit, HostBinding } from '@angular/core';\r\n\r\nimport { ButtonLabels, ButtonVariant } from '../../button.models';\r\n\r\n@Component({\r\n    selector: 'lib-button',\r\n    templateUrl: './button.component.html',\r\n    styleUrls: ['./button.component.scss'],\r\n    standalone: false\r\n})\r\nexport class ButtonComponent implements OnInit {\r\n\r\n    @Input() variant: ButtonVariant = 'primary';\r\n    @Input() type: 'button' | 'submit' | 'reset' = 'button';\r\n    @Input() disabled: boolean = false;\r\n\r\n    @HostBinding('style.pointer-events')\r\n    get pointerEvents(): string {\r\n        return this.disabled ? 'none' : 'auto';\r\n    }\r\n\r\n    // Customization Inputs\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() borderRadius?: string;\r\n    @Input() fontSize?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() backgroundColor?: string;\r\n    @Input() color?: string;\r\n    @Input() border?: string;\r\n    @Input() icon: boolean | string | { type: 'material' | 'fontawesome' | 'img'; value: string } = '';\r\n    @Input() labels?: ButtonLabels;\r\n\r\n    constructor() { }\r\n\r\n    ngOnInit(): void {\r\n    }\r\n\r\n    get isDefaultIcon(): boolean {\r\n        return this.icon === true;\r\n    }\r\n\r\n    get isStringIcon(): boolean {\r\n        return typeof this.icon === 'string' && this.icon !== '';\r\n    }\r\n\r\n    get isImgIcon(): boolean {\r\n        const icon = this.icon;\r\n        if (typeof icon === 'string') {\r\n            return icon.includes('/') || icon.includes('.') || icon.startsWith('http');\r\n        }\r\n        return typeof icon === 'object' && icon !== null && !!icon.value && (icon.type === 'img' || icon.value.includes('/') || icon.value.includes('.') || icon.value.startsWith('http'));\r\n    }\r\n\r\n    get isObjectIcon(): boolean {\r\n        return typeof this.icon === 'object' && this.icon !== null;\r\n    }\r\n\r\n    get iconString(): string {\r\n        return typeof this.icon === 'string' ? this.icon : '';\r\n    }\r\n\r\n    get iconObject(): { type: string; value: string } {\r\n        return typeof this.icon === 'object' ? this.icon as any : { type: '', value: '' };\r\n    }\r\n\r\n}\r\n","<button [type]=\"type\" [disabled]=\"disabled\" class=\"cc-btn\" [ngClass]=\"'cc-btn-' + variant\" [style.width]=\"width\"\r\n  [style.height]=\"height\" [style.border-radius]=\"borderRadius\" [style.font-size]=\"fontSize\"\r\n  [style.font-weight]=\"fontWeight\" [style.background-color]=\"backgroundColor\" [style.color]=\"color\"\r\n  [style.border]=\"border\">\r\n  <div class=\"cc-btn-icon-wrapper\" *ngIf=\"icon\">\r\n    <!-- String Icons -->\r\n    <ng-container *ngIf=\"isStringIcon\">\r\n      <i *ngIf=\"!isImgIcon\" [ngClass]=\"iconString\" class=\"cc-btn-icon\"></i>\r\n      <img *ngIf=\"isImgIcon\" [src]=\"iconString\" [attr.alt]=\"labels?.iconAltText || 'button icon'\"\r\n        class=\"cc-btn-icon cc-btn-img-icon\" />\r\n    </ng-container>\r\n\r\n    <!-- Object Icons -->\r\n    <ng-container *ngIf=\"isObjectIcon\">\r\n      <i *ngIf=\"iconObject.type === 'fontawesome'\" [ngClass]=\"iconObject.value\" class=\"cc-btn-icon\"></i>\r\n      <span *ngIf=\"iconObject.type === 'material'\" class=\"material-icons cc-btn-icon\">{{ iconObject.value }}</span>\r\n      <img *ngIf=\"iconObject.type === 'img'\" [src]=\"iconObject.value\" [attr.alt]=\"labels?.iconAltText || 'button icon'\"\r\n        class=\"cc-btn-icon cc-btn-img-icon\" />\r\n    </ng-container>\r\n  </div>\r\n  <ng-content></ng-content>\r\n</button>","import { Component, Input, Output, EventEmitter, OnInit, AfterViewInit, OnDestroy, ViewChild, ElementRef, NgZone, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { TimeMode, TimePickerLabels } from '../../models/time-picker.models';\r\n\r\ntype WheelType = 'hour' | 'minute' | 'period';\r\n\r\n@Component({\r\n  selector: 'lib-time-wheel-panel',\r\n  templateUrl: './time-wheel-panel.component.html',\r\n  styleUrls: ['./time-wheel-panel.component.scss'],\r\n  standalone: false\r\n})\r\nexport class TimeWheelPanelComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges {\r\n  @Input() mode: TimeMode = '12';\r\n  @Input() value: string = '';\r\n  @Input() labels?: TimePickerLabels;\r\n  @Input() minuteStep: number = 0;\r\n  @Input() minTime?: string; // \"HH:mm\" 24h\r\n  @Input() maxTime?: string; // \"HH:mm\" 24h\r\n\r\n  @Output() confirmed = new EventEmitter<string>();\r\n  @Output() cancelled = new EventEmitter<void>();\r\n\r\n  @ViewChild('hourWheel') hourWheel!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('minuteWheel') minuteWheel!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('periodWheel') periodWheel?: ElementRef<HTMLDivElement>;\r\n\r\n  // ─── Geometry (single source of truth; keep in sync with SCSS) ───\r\n  static readonly ITEM_HEIGHT = 36;\r\n  static readonly VISIBLE_ROWS = 3;\r\n  readonly ITEM_HEIGHT = TimeWheelPanelComponent.ITEM_HEIGHT;\r\n  readonly SPACERS = (TimeWheelPanelComponent.VISIBLE_ROWS - 1) / 2; // leading == trailing\r\n  readonly spacerRows: number[] = Array.from({ length: this.SPACERS }, (_, i) => i);\r\n  private get containerHeight(): number {\r\n    return TimeWheelPanelComponent.VISIBLE_ROWS * this.ITEM_HEIGHT;\r\n  }\r\n\r\n  hours: string[] = [];\r\n  minutes: string[] = [];\r\n  periods: string[] = ['AM', 'PM'];\r\n\r\n  // How many times each list is repeated in the DOM for the infinite loop.\r\n  // Computed per-list so one repeat band is always >= the viewport height.\r\n  hourRepeats: number[] = [0, 1, 2];\r\n  minuteRepeats: number[] = [0, 1, 2];\r\n\r\n  selectedHour: string = '09';\r\n  selectedMinute: string = '00';\r\n  selectedPeriod: string = 'AM';\r\n\r\n  disabledHours = new Set<string>();\r\n  disabledMinutes = new Set<string>();\r\n  disabledPeriods = new Set<string>();\r\n\r\n  private isInitialScrollDone: boolean = false;\r\n\r\n  private scrollListeners: Partial<Record<WheelType, () => void>> = {};\r\n  private idleTimers: Partial<Record<WheelType, ReturnType<typeof setTimeout>>> = {};\r\n  private rafIds: Partial<Record<WheelType, number>> = {};\r\n\r\n  private static readonly IDLE_MS = 90;\r\n\r\n  constructor(private zone: NgZone) {}\r\n\r\n  ngOnInit(): void {\r\n    this.generateHours();\r\n    this.generateMinutes();\r\n    this.parseInitialValue(this.value);\r\n    this.computeConstraints();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['mode'] || changes['minuteStep'] || changes['minTime'] || changes['maxTime']) {\r\n      this.generateHours();\r\n      this.generateMinutes();\r\n      this.computeConstraints();\r\n      if (this.isInitialScrollDone) {\r\n        this.zone.runOutsideAngular(() => {\r\n          this.scrollToValue('hour', this.selectedHour, false);\r\n          this.scrollToValue('minute', this.selectedMinute, false);\r\n          if (this.mode === '12') {\r\n            this.scrollToValue('period', this.selectedPeriod, false);\r\n          }\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    setTimeout(() => {\r\n      this.scrollToValue('hour', this.selectedHour, false);\r\n      this.scrollToValue('minute', this.selectedMinute, false);\r\n      if (this.mode === '12') {\r\n        this.scrollToValue('period', this.selectedPeriod, false);\r\n      }\r\n\r\n      this.updateWheelEffects(this.hourWheel.nativeElement);\r\n      this.updateWheelEffects(this.minuteWheel.nativeElement);\r\n      if (this.periodWheel) {\r\n        this.updateWheelEffects(this.periodWheel.nativeElement);\r\n      }\r\n\r\n      this.isInitialScrollDone = true;\r\n    }, 150);\r\n\r\n    // Native scroll drives everything. On each scroll event we (rAF-throttled)\r\n    // repaint the 3D wheel effect, and after the wheel goes idle we read the\r\n    // settled value + do the seamless wrap-around reposition.\r\n    this.zone.runOutsideAngular(() => {\r\n      this.attachScroll('hour', this.hourWheel.nativeElement);\r\n      this.attachScroll('minute', this.minuteWheel.nativeElement);\r\n      if (this.periodWheel) {\r\n        this.attachScroll('period', this.periodWheel.nativeElement);\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    const map: Partial<Record<WheelType, ElementRef<HTMLDivElement> | undefined>> = {\r\n      hour: this.hourWheel,\r\n      minute: this.minuteWheel,\r\n      period: this.periodWheel\r\n    };\r\n    (Object.keys(this.scrollListeners) as WheelType[]).forEach(type => {\r\n      const el = map[type]?.nativeElement;\r\n      const listener = this.scrollListeners[type];\r\n      if (el && listener) {\r\n        el.removeEventListener('scroll', listener);\r\n      }\r\n      const raf = this.rafIds[type];\r\n      if (raf) cancelAnimationFrame(raf);\r\n      const timer = this.idleTimers[type];\r\n      if (timer) clearTimeout(timer);\r\n    });\r\n  }\r\n\r\n  private attachScroll(type: WheelType, element: HTMLElement): void {\r\n    const listener = () => {\r\n      // Throttle the visual repaint to one per frame.\r\n      if (!this.rafIds[type]) {\r\n        this.rafIds[type] = requestAnimationFrame(() => {\r\n          this.rafIds[type] = undefined as unknown as number;\r\n          this.updateWheelEffects(element);\r\n        });\r\n      }\r\n\r\n      // Debounce the \"settled\" read.\r\n      const existing = this.idleTimers[type];\r\n      if (existing) clearTimeout(existing);\r\n      this.idleTimers[type] = setTimeout(() => {\r\n        this.onScrollIdle(type, element);\r\n      }, TimeWheelPanelComponent.IDLE_MS);\r\n    };\r\n\r\n    this.scrollListeners[type] = listener;\r\n    element.addEventListener('scroll', listener, { passive: true });\r\n  }\r\n\r\n  private generateHours(): void {\r\n    if (this.mode === '12') {\r\n      this.hours = Array.from({ length: 12 }, (_, i) => (i + 1).toString().padStart(2, '0'));\r\n    } else {\r\n      this.hours = Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, '0'));\r\n    }\r\n    this.hourRepeats = this.buildRepeats(this.hours.length);\r\n  }\r\n\r\n  private generateMinutes(): void {\r\n    const step = Math.max(1, this.minuteStep);\r\n    this.minutes = [];\r\n    for (let i = 0; i < 60; i += step) {\r\n      this.minutes.push(i.toString().padStart(2, '0'));\r\n    }\r\n    this.minuteRepeats = this.buildRepeats(this.minutes.length);\r\n  }\r\n\r\n  // Odd repeat count so that one buffer band (N*ITEM_HEIGHT) on each side of the\r\n  // central band is always >= the viewport height. Common case (N=12/24/60) → 3.\r\n  private buildRepeats(n: number): number[] {\r\n    const band = n * this.ITEM_HEIGHT;\r\n    const count = Math.max(3, 2 * Math.ceil(this.containerHeight / band) + 1);\r\n    return Array.from({ length: count }, (_, i) => i);\r\n  }\r\n\r\n  private centralBandStart(list: string[], repeats: number[]): number {\r\n    // Index (in the repeated DOM list) of the first item of the central band.\r\n    return Math.floor(repeats.length / 2) * list.length;\r\n  }\r\n\r\n  private parseInitialValue(valStr: string): void {\r\n    if (!valStr) {\r\n      this.setDefaultTime();\r\n      return;\r\n    }\r\n\r\n    const twelveRegex = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i;\r\n    const twentyFourRegex = /^(\\d{1,2}):(\\d{2})$/;\r\n\r\n    let match = valStr.trim().match(twelveRegex);\r\n    if (match) {\r\n      const hh = match[1].padStart(2, '0');\r\n      const mm = match[2];\r\n      const period = match[3].toUpperCase();\r\n\r\n      if (this.mode === '12') {\r\n        this.selectedHour = hh;\r\n        this.selectedMinute = this.findClosestMinute(mm);\r\n        this.selectedPeriod = period;\r\n      } else {\r\n        // Convert to 24h\r\n        let hNum = parseInt(hh, 10);\r\n        if (period === 'PM' && hNum !== 12) hNum += 12;\r\n        if (period === 'AM' && hNum === 12) hNum = 0;\r\n        this.selectedHour = hNum.toString().padStart(2, '0');\r\n        this.selectedMinute = this.findClosestMinute(mm);\r\n      }\r\n      return;\r\n    }\r\n\r\n    match = valStr.trim().match(twentyFourRegex);\r\n    if (match) {\r\n      const hh = match[1].padStart(2, '0');\r\n      const mm = match[2];\r\n\r\n      if (this.mode === '24') {\r\n        this.selectedHour = hh;\r\n        this.selectedMinute = this.findClosestMinute(mm);\r\n      } else {\r\n        // Convert to 12h\r\n        let hNum = parseInt(hh, 10);\r\n        const period = hNum >= 12 ? 'PM' : 'AM';\r\n        if (hNum > 12) hNum -= 12;\r\n        if (hNum === 0) hNum = 12;\r\n        this.selectedHour = hNum.toString().padStart(2, '0');\r\n        this.selectedMinute = this.findClosestMinute(mm);\r\n        this.selectedPeriod = period;\r\n      }\r\n      return;\r\n    }\r\n\r\n    this.setDefaultTime();\r\n  }\r\n\r\n  private findClosestMinute(mmStr: string): string {\r\n    const mmVal = parseInt(mmStr, 10);\r\n    if (isNaN(mmVal)) return '00';\r\n    let closest = this.minutes[0];\r\n    let minDiff = 60;\r\n    for (const m of this.minutes) {\r\n      const mVal = parseInt(m, 10);\r\n      const diff = Math.abs(mVal - mmVal);\r\n      if (diff < minDiff) {\r\n        minDiff = diff;\r\n        closest = m;\r\n      }\r\n    }\r\n    return closest;\r\n  }\r\n\r\n  private setDefaultTime(): void {\r\n    if (this.mode === '12') {\r\n      this.selectedHour = '09';\r\n      this.selectedMinute = '00';\r\n      this.selectedPeriod = 'AM';\r\n    } else {\r\n      this.selectedHour = '09';\r\n      this.selectedMinute = '00';\r\n    }\r\n  }\r\n\r\n  private toMinutes(h: number, m: number): number {\r\n    return h * 60 + m;\r\n  }\r\n\r\n  private parseLimit(hhmm: string): { h: number; m: number } {\r\n    const parts = hhmm.split(':');\r\n    return {\r\n      h: parseInt(parts[0], 10) || 0,\r\n      m: parseInt(parts[1], 10) || 0\r\n    };\r\n  }\r\n\r\n  private to24hrHour(displayHour: string, period: 'AM' | 'PM'): number {\r\n    const h = parseInt(displayHour, 10);\r\n    if (period === 'AM') {\r\n      return h === 12 ? 0 : h;\r\n    } else {\r\n      return h === 12 ? 12 : h + 12;\r\n    }\r\n  }\r\n\r\n  computeConstraints(): void {\r\n    this.disabledHours.clear();\r\n    this.disabledMinutes.clear();\r\n    this.disabledPeriods.clear();\r\n\r\n    if (!this.minTime && !this.maxTime) return;\r\n\r\n    let minMin = 0;\r\n    let maxMin = 23 * 60 + 59;\r\n\r\n    if (this.minTime) {\r\n      const parsed = this.parseLimit(this.minTime);\r\n      minMin = this.toMinutes(parsed.h, parsed.m);\r\n    }\r\n    if (this.maxTime) {\r\n      const parsed = this.parseLimit(this.maxTime);\r\n      maxMin = this.toMinutes(parsed.h, parsed.m);\r\n    }\r\n\r\n    if (minMin > maxMin) {\r\n      // Invalid config\r\n      return;\r\n    }\r\n\r\n    if (this.mode === '24') {\r\n      for (const h of this.hours) {\r\n        const hNum = parseInt(h, 10);\r\n        const hourStart = this.toMinutes(hNum, 0);\r\n        const hourEnd = this.toMinutes(hNum, 59);\r\n        if (hourEnd < minMin || hourStart > maxMin) {\r\n          this.disabledHours.add(h);\r\n        }\r\n      }\r\n\r\n      const selH = parseInt(this.selectedHour, 10);\r\n      for (const m of this.minutes) {\r\n        const mNum = parseInt(m, 10);\r\n        const total = this.toMinutes(selH, mNum);\r\n        if (total < minMin || total > maxMin) {\r\n          this.disabledMinutes.add(m);\r\n        }\r\n      }\r\n      return;\r\n    }\r\n\r\n    // 12-hour mode logic\r\n    const amCoversAny = minMin < 12 * 60;\r\n    const pmCoversAny = maxMin >= 12 * 60;\r\n\r\n    if (!amCoversAny) this.disabledPeriods.add('AM');\r\n    if (!pmCoversAny) this.disabledPeriods.add('PM');\r\n\r\n    for (const h of this.hours) {\r\n      const hNum = parseInt(h, 10);\r\n\r\n      const h24_AM = hNum === 12 ? 0 : hNum;\r\n      const amStart = this.toMinutes(h24_AM, 0);\r\n      const amEnd = this.toMinutes(h24_AM, 59);\r\n      const amValid = amEnd >= minMin && amStart <= maxMin && amCoversAny;\r\n\r\n      const h24_PM = hNum === 12 ? 12 : hNum + 12;\r\n      const pmStart = this.toMinutes(h24_PM, 0);\r\n      const pmEnd = this.toMinutes(h24_PM, 59);\r\n      const pmValid = pmEnd >= minMin && pmStart <= maxMin && pmCoversAny;\r\n\r\n      if (this.selectedPeriod === 'AM' && !amValid) this.disabledHours.add(h);\r\n      if (this.selectedPeriod === 'PM' && !pmValid) this.disabledHours.add(h);\r\n    }\r\n\r\n    const selH24 = this.to24hrHour(this.selectedHour, this.selectedPeriod as 'AM' | 'PM');\r\n    for (const m of this.minutes) {\r\n      const mNum = parseInt(m, 10);\r\n      const total = this.toMinutes(selH24, mNum);\r\n      if (total < minMin || total > maxMin) {\r\n        this.disabledMinutes.add(m);\r\n      }\r\n    }\r\n  }\r\n\r\n  updateWheelEffects(element: HTMLElement): void {\r\n    const scrollTop = element.scrollTop;\r\n    const items = element.children;\r\n\r\n    for (let i = 0; i < items.length; i++) {\r\n      const item = items[i] as HTMLElement;\r\n      if (item.classList.contains('cc-twp-spacer')) continue;\r\n\r\n      const itemTop = (i - this.SPACERS) * this.ITEM_HEIGHT;\r\n      const distance = Math.abs(itemTop - scrollTop);\r\n\r\n      const maxDist = this.ITEM_HEIGHT * 2;\r\n      const ratio = Math.max(0, 1 - distance / maxDist);\r\n\r\n      // Flatter than the old drum look: gentle scale + opacity fade only.\r\n      const scale = 0.85 + 0.15 * ratio;\r\n      const opacity = 0.4 + 0.6 * ratio;\r\n\r\n      item.style.transform = `scale(${scale}) translateZ(0)`;\r\n      item.style.opacity = String(opacity);\r\n    }\r\n  }\r\n\r\n  private listFor(type: WheelType): string[] {\r\n    if (type === 'hour') return this.hours;\r\n    if (type === 'minute') return this.minutes;\r\n    return this.periods;\r\n  }\r\n\r\n  private repeatsFor(type: WheelType): number[] {\r\n    if (type === 'hour') return this.hourRepeats;\r\n    if (type === 'minute') return this.minuteRepeats;\r\n    return [0];\r\n  }\r\n\r\n  private isDisabled(type: WheelType, val: string): boolean {\r\n    if (type === 'hour') return this.disabledHours.has(val);\r\n    if (type === 'minute') return this.disabledMinutes.has(val);\r\n    return this.disabledPeriods.has(val);\r\n  }\r\n\r\n  // Called after native inertial scrolling settles.\r\n  private onScrollIdle(type: WheelType, element: HTMLElement): void {\r\n    if (!this.isInitialScrollDone) return;\r\n\r\n    const list = this.listFor(type);\r\n    const N = list.length;\r\n    const looping = type === 'hour' || type === 'minute';\r\n\r\n    // 1. Seamless wrap-around: keep the resting position inside the central band.\r\n    if (looping) {\r\n      const band = N * this.ITEM_HEIGHT;\r\n      const start = this.centralBandStart(list, this.repeatsFor(type)) * this.ITEM_HEIGHT;\r\n      const end = start + band;\r\n      if (element.scrollTop < start || element.scrollTop >= end) {\r\n        const originalScrollBehavior = element.style.scrollBehavior;\r\n        element.style.scrollBehavior = 'auto';\r\n        \r\n        if (element.scrollTop < start) {\r\n          element.scrollTop += band;\r\n        } else {\r\n          element.scrollTop -= band;\r\n        }\r\n        \r\n        // Force layout reflow\r\n        const _ = element.scrollTop;\r\n        element.style.scrollBehavior = originalScrollBehavior;\r\n      }\r\n    }\r\n\r\n    // 2. Read the settled value.\r\n    let index = Math.round(element.scrollTop / this.ITEM_HEIGHT);\r\n    let origIndex = looping ? ((index % N) + N) % N : Math.max(0, Math.min(N - 1, index));\r\n    let val = list[origIndex];\r\n\r\n    // 3. If it landed on a disabled value, snap to the nearest enabled one.\r\n    if (val && this.isDisabled(type, val)) {\r\n      const enabled = this.nearestEnabled(type, origIndex);\r\n      if (enabled != null) {\r\n        this.scrollToValue(type, list[enabled], true);\r\n        origIndex = enabled;\r\n        val = list[enabled];\r\n      }\r\n    } else {\r\n      // Enforce a clean rest position (native mandatory-snap usually already did).\r\n      const target = index * this.ITEM_HEIGHT;\r\n      if (Math.abs(element.scrollTop - target) > 0.5) {\r\n        this.scrollToValue(type, val, true);\r\n      }\r\n    }\r\n\r\n    if (!val) return;\r\n\r\n    // 4. Commit the selection inside Angular's zone.\r\n    if (type === 'hour' && this.selectedHour !== val) {\r\n      this.zone.run(() => {\r\n        this.selectedHour = val!;\r\n        this.computeConstraints();\r\n        this.adjustSelectionOnConstraintChange();\r\n      });\r\n    } else if (type === 'minute' && this.selectedMinute !== val) {\r\n      this.zone.run(() => {\r\n        this.selectedMinute = val!;\r\n      });\r\n    } else if (type === 'period' && this.selectedPeriod !== val) {\r\n      this.zone.run(() => {\r\n        this.selectedPeriod = val!;\r\n        this.computeConstraints();\r\n        this.adjustSelectionOnConstraintChange();\r\n      });\r\n    }\r\n  }\r\n\r\n  // Search outward from origIndex for the closest enabled value index.\r\n  private nearestEnabled(type: WheelType, origIndex: number): number | null {\r\n    const list = this.listFor(type);\r\n    const N = list.length;\r\n    const looping = type === 'hour' || type === 'minute';\r\n\r\n    if (!this.isDisabled(type, list[origIndex])) return origIndex;\r\n\r\n    for (let offset = 1; offset < N; offset++) {\r\n      const up = looping ? (origIndex + offset) % N : origIndex + offset;\r\n      if (up >= 0 && up < N && !this.isDisabled(type, list[up])) return up;\r\n\r\n      const down = looping ? ((origIndex - offset) % N + N) % N : origIndex - offset;\r\n      if (down >= 0 && down < N && !this.isDisabled(type, list[down])) return down;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private adjustSelectionOnConstraintChange(): void {\r\n    if (this.mode === '12') {\r\n      if (this.disabledPeriods.has(this.selectedPeriod)) {\r\n        const alt = this.periods.find(p => !this.disabledPeriods.has(p));\r\n        if (alt) {\r\n          this.selectedPeriod = alt;\r\n          this.scrollToValue('period', alt, true);\r\n          this.computeConstraints();\r\n        }\r\n      }\r\n\r\n      if (this.disabledHours.has(this.selectedHour)) {\r\n        const validHour = this.hours.find(h => !this.disabledHours.has(h));\r\n        if (validHour) {\r\n          this.selectedHour = validHour;\r\n          this.scrollToValue('hour', validHour, true);\r\n          this.computeConstraints();\r\n        }\r\n      }\r\n    } else {\r\n      if (this.disabledHours.has(this.selectedHour)) {\r\n        const validHour = this.hours.find(h => !this.disabledHours.has(h));\r\n        if (validHour) {\r\n          this.selectedHour = validHour;\r\n          this.scrollToValue('hour', validHour, true);\r\n          this.computeConstraints();\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.disabledMinutes.has(this.selectedMinute)) {\r\n      const validMinute = this.minutes.find(m => !this.disabledMinutes.has(m));\r\n      if (validMinute) {\r\n        this.selectedMinute = validMinute;\r\n        this.scrollToValue('minute', validMinute, true);\r\n      }\r\n    }\r\n  }\r\n\r\n  selectValue(type: WheelType, val: string): void {\r\n    if (type === 'hour') {\r\n      if (this.disabledHours.has(val)) return;\r\n      this.selectedHour = val;\r\n    } else if (type === 'minute') {\r\n      if (this.disabledMinutes.has(val)) return;\r\n      this.selectedMinute = val;\r\n    } else if (type === 'period') {\r\n      if (this.disabledPeriods.has(val)) return;\r\n      this.selectedPeriod = val;\r\n    }\r\n    this.scrollToValue(type, val, true);\r\n    this.computeConstraints();\r\n    this.adjustSelectionOnConstraintChange();\r\n  }\r\n\r\n  scrollToValue(type: WheelType, val: string, smooth: boolean): void {\r\n    let element: HTMLElement | null = null;\r\n    if (type === 'hour') element = this.hourWheel?.nativeElement ?? null;\r\n    else if (type === 'minute') element = this.minuteWheel?.nativeElement ?? null;\r\n    else element = this.periodWheel?.nativeElement ?? null;\r\n\r\n    if (!element) return;\r\n\r\n    const list = this.listFor(type);\r\n    const index = list.indexOf(val);\r\n    if (index === -1) return;\r\n\r\n    const looping = type === 'hour' || type === 'minute';\r\n    const base = looping ? this.centralBandStart(list, this.repeatsFor(type)) : 0;\r\n    const targetIndex = base + index;\r\n\r\n    const originalBehavior = element.style.scrollBehavior;\r\n    element.style.scrollBehavior = smooth ? 'smooth' : 'auto';\r\n    element.scrollTop = targetIndex * this.ITEM_HEIGHT;\r\n    // Force layout reflow\r\n    const _ = element.scrollTop;\r\n    element.style.scrollBehavior = originalBehavior;\r\n  }\r\n\r\n  onCancel(): void {\r\n    this.cancelled.emit();\r\n  }\r\n\r\n  onConfirm(): void {\r\n    this.confirmed.emit(this.getFormattedTime());\r\n  }\r\n\r\n  getFormattedTime(): string {\r\n    if (this.mode === '24') {\r\n      return `${this.selectedHour}:${this.selectedMinute}`;\r\n    } else {\r\n      return `${this.selectedHour}:${this.selectedMinute} ${this.selectedPeriod}`;\r\n    }\r\n  }\r\n}\r\n","<div class=\"cc-twp-dialog\">\r\n  <!-- Subtle Configurable Title Header -->\r\n  <div class=\"cc-twp-header\">\r\n    <span class=\"cc-twp-title\">{{ labels?.selectTimeTitle || 'Select Time' }}</span>\r\n  </div>\r\n\r\n  <!-- Digital Preview -->\r\n  <div class=\"cc-twp-preview\">\r\n    <span class=\"cc-twp-preview-num\">{{ selectedHour }}</span>\r\n    <span class=\"cc-twp-preview-colon\">:</span>\r\n    <span class=\"cc-twp-preview-num\">{{ selectedMinute }}</span>\r\n    <span class=\"cc-twp-preview-period\" *ngIf=\"mode === '12'\"> {{ selectedPeriod }}</span>\r\n  </div>\r\n\r\n  <!-- Wheel Area -->\r\n  <div class=\"cc-twp-wheels\" [class.mode-24]=\"mode === '24'\">\r\n    <div class=\"cc-twp-highlight-bar\"></div>\r\n\r\n    <!-- Hour Column -->\r\n    <div class=\"cc-twp-col\">\r\n      <span class=\"cc-twp-col-label\">{{ labels?.hourLabel || 'Hour' }}</span>\r\n      <div class=\"cc-twp-scroll\" #hourWheel>\r\n        <div class=\"cc-twp-spacer\" *ngFor=\"let s of spacerRows\"></div>\r\n        <ng-container *ngFor=\"let rep of hourRepeats\">\r\n          <div *ngFor=\"let h of hours\"\r\n               class=\"cc-twp-item\"\r\n               [class.active]=\"selectedHour === h\"\r\n               [class.disabled]=\"disabledHours.has(h)\"\r\n               [attr.aria-disabled]=\"disabledHours.has(h)\"\r\n               (click)=\"selectValue('hour', h)\">{{ h }}</div>\r\n        </ng-container>\r\n        <div class=\"cc-twp-spacer\" *ngFor=\"let s of spacerRows\"></div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Minute Column -->\r\n    <div class=\"cc-twp-col\">\r\n      <span class=\"cc-twp-col-label\">{{ labels?.minuteLabel || 'Minute' }}</span>\r\n      <div class=\"cc-twp-scroll\" #minuteWheel>\r\n        <div class=\"cc-twp-spacer\" *ngFor=\"let s of spacerRows\"></div>\r\n        <ng-container *ngFor=\"let rep of minuteRepeats\">\r\n          <div *ngFor=\"let m of minutes\"\r\n               class=\"cc-twp-item\"\r\n               [class.active]=\"selectedMinute === m\"\r\n               [class.disabled]=\"disabledMinutes.has(m)\"\r\n               [attr.aria-disabled]=\"disabledMinutes.has(m)\"\r\n               (click)=\"selectValue('minute', m)\">{{ m }}</div>\r\n        </ng-container>\r\n        <div class=\"cc-twp-spacer\" *ngFor=\"let s of spacerRows\"></div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- AM/PM Column — 12hr mode only -->\r\n    <div class=\"cc-twp-col\" *ngIf=\"mode === '12'\">\r\n      <span class=\"cc-twp-col-label\">{{ labels?.periodLabel || 'AM/PM' }}</span>\r\n      <div class=\"cc-twp-scroll\" #periodWheel>\r\n        <div class=\"cc-twp-spacer\" *ngFor=\"let s of spacerRows\"></div>\r\n        <div *ngFor=\"let p of periods\"\r\n             class=\"cc-twp-item\"\r\n             [class.active]=\"selectedPeriod === p\"\r\n             [class.disabled]=\"disabledPeriods.has(p)\"\r\n             [attr.aria-disabled]=\"disabledPeriods.has(p)\"\r\n             (click)=\"selectValue('period', p)\">{{ p }}</div>\r\n        <div class=\"cc-twp-spacer\" *ngFor=\"let s of spacerRows\"></div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Footer -->\r\n  <div class=\"cc-twp-footer\">\r\n    <button class=\"cc-twp-btn cc-twp-btn-cancel\" (click)=\"onCancel()\">\r\n      {{ labels?.cancelLabel || 'Cancel' }}\r\n    </button>\r\n    <button class=\"cc-twp-btn cc-twp-btn-confirm\" (click)=\"onConfirm()\">\r\n      {{ labels?.confirmLabel || 'Confirm' }}\r\n    </button>\r\n  </div>\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { TimePickerConfig, TimePickerLabels, TimeMode, TimePickerVariant } from '../../models/time-picker.models';\r\n\r\n@Component({\r\n  selector: 'lib-time-picker',\r\n  templateUrl: './time-picker.component.html',\r\n  styleUrls: ['./time-picker.component.scss'],\r\n  standalone: false,\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => TimePickerComponent),\r\n      multi: true\r\n    }\r\n  ]\r\n})\r\nexport class TimePickerComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n  @Input() config?: TimePickerConfig;\r\n  @Input() labels?: TimePickerLabels;\r\n  @Input() label: string = '';\r\n  @Input() placeholder: string = '';\r\n  @Input() variant: TimePickerVariant = 'wheel';\r\n  @Input() mode: TimeMode = '12';\r\n  @Input() minuteStep: number = 0;\r\n  @Input() disabled: boolean = false;\r\n  @Input() required: boolean = false;\r\n  @Input() errorMessage: string = '';\r\n  @Input() minTime?: string;\r\n  @Input() maxTime?: string;\r\n\r\n  // Style inputs (to mirror datepicker pattern)\r\n  @Input() width?: string;\r\n  @Input() height?: string;\r\n  @Input() borderRadius?: string;\r\n  @Input() fontSize?: string;\r\n  @Input() gap?: string;\r\n  @Input() fontFamily?: string;\r\n  @Input() labelColor?: string;\r\n  @Input() labelFontSize?: string;\r\n  @Input() labelFontWeight?: string;\r\n  @Input() backgroundColor?: string;\r\n  @Input() borderColor?: string;\r\n  @Input() borderWidth?: string;\r\n  @Input() padding?: string;\r\n  @Input() fontWeight?: string;\r\n  @Input() color?: string;\r\n  @Input() placeholderColor?: string;\r\n  @Input() focusBorderColor?: string;\r\n  @Input() errorColor?: string;\r\n  @Input() disabledBackgroundColor?: string;\r\n  @Input() disabledColor?: string;\r\n\r\n  @Output() timeChange = new EventEmitter<string>();\r\n\r\n  displayValue: string = '';\r\n  isOpen: boolean = false;\r\n\r\n  onChange: (value: string) => void = () => {};\r\n  onTouched: () => void = () => {};\r\n\r\n  ngOnInit(): void {\r\n    this.updateFromConfig();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['config']) {\r\n      this.updateFromConfig();\r\n    }\r\n  }\r\n\r\n  private updateFromConfig(): void {\r\n    if (this.config) {\r\n      this.label = this.config.label ?? this.label;\r\n      this.placeholder = this.config.placeholder ?? this.placeholder;\r\n      this.variant = this.config.variant ?? this.variant;\r\n      this.mode = this.config.mode ?? this.mode;\r\n      this.minuteStep = this.config.minuteStep ?? this.minuteStep;\r\n      this.disabled = this.config.disabled ?? this.disabled;\r\n      this.required = this.config.required ?? this.required;\r\n      this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n\r\n      this.width = this.config.width ?? this.width;\r\n      this.height = this.config.height ?? this.height;\r\n      this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n      this.fontSize = this.config.fontSize ?? this.fontSize;\r\n      this.gap = this.config.gap ?? this.gap;\r\n      this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n      this.labelColor = this.config.labelColor ?? this.labelColor;\r\n      this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n      this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n      this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n      this.borderColor = this.config.borderColor ?? this.borderColor;\r\n      this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n      this.padding = this.config.padding ?? this.padding;\r\n      this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n      this.color = this.config.color ?? this.color;\r\n      this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n      this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n      this.errorColor = this.config.errorColor ?? this.errorColor;\r\n      this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n      this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n    }\r\n  }\r\n\r\n  writeValue(value: string): void {\r\n    this.displayValue = value || '';\r\n  }\r\n\r\n  registerOnChange(fn: any): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: any): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState(isDisabled: boolean): void {\r\n    this.disabled = isDisabled;\r\n  }\r\n\r\n  togglePanel(): void {\r\n    if (this.disabled) return;\r\n    this.isOpen = !this.isOpen;\r\n  }\r\n\r\n  closePanel(): void {\r\n    this.isOpen = false;\r\n  }\r\n\r\n  onConfirmed(timeString: string): void {\r\n    this.displayValue = timeString;\r\n    this.onChange(timeString);\r\n    this.timeChange.emit(timeString);\r\n    this.isOpen = false;\r\n    this.onTouched();\r\n  }\r\n\r\n  onCancelled(): void {\r\n    this.isOpen = false;\r\n    this.onTouched();\r\n  }\r\n\r\n  get wrapperStyles(): { [key: string]: string | undefined } {\r\n    return {\r\n      'width': this.width ? `${this.width}` : undefined,\r\n      '--cc-timepicker-label-gap': this.gap ? `${this.gap}` : undefined,\r\n      '--cc-timepicker-font-family': this.fontFamily ? `${this.fontFamily}` : undefined\r\n    };\r\n  }\r\n\r\n  get labelStyles(): { [key: string]: string | undefined } {\r\n    return {\r\n      '--cc-timepicker-label-color': this.labelColor ? `${this.labelColor}` : undefined,\r\n      '--cc-timepicker-label-font-size': this.labelFontSize ? `${this.labelFontSize}` : undefined,\r\n      '--cc-timepicker-label-font-weight': this.labelFontWeight ? `${this.labelFontWeight}` : undefined\r\n    };\r\n  }\r\n\r\n  get fieldStyles(): { [key: string]: string | undefined } {\r\n    return {\r\n      '--cc-timepicker-bg': this.backgroundColor ? `${this.backgroundColor}` : undefined,\r\n      '--cc-timepicker-border-radius': this.borderRadius ? `${this.borderRadius}` : undefined,\r\n      '--cc-timepicker-border-color': this.borderColor ? `${this.borderColor}` : undefined,\r\n      '--cc-timepicker-border-width': this.borderWidth ? `${this.borderWidth}` : undefined,\r\n      '--cc-timepicker-height': this.height ? `${this.height}` : undefined,\r\n      '--cc-timepicker-padding': this.padding ? `${this.padding}` : undefined,\r\n      '--cc-timepicker-font-size': this.fontSize ? `${this.fontSize}` : undefined,\r\n      '--cc-timepicker-font-weight': this.fontWeight ? `${this.fontWeight}` : undefined,\r\n      '--cc-timepicker-color': this.color ? `${this.color}` : undefined,\r\n      '--cc-timepicker-placeholder-color': this.placeholderColor ? `${this.placeholderColor}` : undefined,\r\n      '--cc-timepicker-focus-border-color': this.focusBorderColor ? `${this.focusBorderColor}` : undefined,\r\n      '--cc-timepicker-error-color': this.errorColor ? `${this.errorColor}` : undefined,\r\n      '--cc-timepicker-disabled-bg': this.disabledBackgroundColor ? `${this.disabledBackgroundColor}` : undefined,\r\n      '--cc-timepicker-disabled-color': this.disabledColor ? `${this.disabledColor}` : undefined\r\n    };\r\n  }\r\n}\r\n","<div class=\"cc-timepicker-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n  <label *ngIf=\"label\" class=\"cc-timepicker-label\" [ngStyle]=\"labelStyles\">\r\n    {{ label }}\r\n    <span *ngIf=\"required\" class=\"cc-timepicker-required\">{{ labels?.requiredMarker || '*' }}</span>\r\n  </label>\r\n\r\n  <!-- Trigger Field -->\r\n  <div class=\"cc-timepicker-field\"\r\n       [class.focused]=\"isOpen\"\r\n       [class.disabled]=\"disabled\"\r\n       [class.error]=\"errorMessage\"\r\n       [ngStyle]=\"fieldStyles\"\r\n       (click)=\"!disabled && togglePanel()\">\r\n    <span class=\"cc-timepicker-value\" [class.is-placeholder]=\"!displayValue\">\r\n      {{ displayValue || placeholder || 'Select time' }}\r\n    </span>\r\n    <span class=\"cc-timepicker-icon material-icons\">schedule</span>\r\n  </div>\r\n\r\n  <!-- Centered Modal Overlay -->\r\n  <div class=\"cc-timepicker-overlay\" *ngIf=\"isOpen\" (click)=\"onCancelled()\">\r\n    <div class=\"cc-timepicker-modal-content\" (click)=\"$event.stopPropagation()\">\r\n      <lib-time-wheel-panel\r\n        [mode]=\"mode\"\r\n        [value]=\"displayValue\"\r\n        [labels]=\"labels\"\r\n        [minuteStep]=\"minuteStep\"\r\n        [minTime]=\"minTime\"\r\n        [maxTime]=\"maxTime\"\r\n        (confirmed)=\"onConfirmed($event)\"\r\n        (cancelled)=\"onCancelled()\">\r\n      </lib-time-wheel-panel>\r\n    </div>\r\n  </div>\r\n\r\n  <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>\r\n","import { Pipe, PipeTransform, SecurityContext } from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n/**\r\n * Bypasses Angular's DomSanitizer for resource URLs (e.g. YouTube embed iframes).\r\n * Used only for trusted URLs such as YouTube embed links derived from user-provided video IDs.\r\n */\r\n@Pipe({\r\n    name: 'trustedUrl',\r\n    standalone: false\r\n})\r\nexport class TrustedUrlPipe implements PipeTransform {\r\n    constructor(private sanitizer: DomSanitizer) { }\r\n\r\n    transform(url: string): SafeResourceUrl | null {\r\n        if (!url) {\r\n            return null;\r\n        }\r\n        const cleaned = this.sanitizer.sanitize(SecurityContext.URL, url);\r\n        if (!cleaned) {\r\n            return null;\r\n        }\r\n        return this.sanitizer.bypassSecurityTrustResourceUrl(cleaned);\r\n    }\r\n}\r\n","import { Component, Injectable, Input, OnInit, OnDestroy, AfterViewInit, ViewChild, ElementRef, HostListener, ChangeDetectorRef } from '@angular/core';\r\nimport { ConnectedPosition, Overlay, ScrollStrategy } from '@angular/cdk/overlay';\r\nimport { DateAdapter, NativeDateAdapter } from '@angular/material/core';\r\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  ValidatorFn,\r\n  Validators\r\n} from '@angular/forms';\r\nimport { SectionConfig, FieldConfig, FormLabels, UploadedFile, MediaItem, LocationItem, LocationFieldValue, AttachmentConfig, LibraryUploadConfig, AutocompleteConfig, AutocompleteDisplayField, DropdownSearchConfig, DropdownPaginationConfig, TotalCountConfig, QueryParamsConfig, NestedStringConfig, LinkListConfig } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\nimport { ExpressionService } from '../../services/expression.service';\r\nimport { ValidationUtils } from '../../utils/validation.utils';\r\nimport { StringUtils } from '../../../../utils/string.utils';\r\nimport { Subject, combineLatest, forkJoin, BehaviorSubject, merge, Subscription, Observable, of } from 'rxjs';\r\nimport { takeUntil, debounceTime, distinctUntilChanged, finalize, map, catchError } from 'rxjs/operators';\r\nimport { ConfirmationModalConfig } from '../../../confirmation-modal/confirmation-modal.models';\r\nimport { TimePickerLabels } from '../../../time-picker/models/time-picker.models';\r\n\r\n/**\r\n * Displays a DATE field's bound value using a format that matches its configured\r\n * dateGranularity (see FieldConfig.dateConfig.dateGranularity) — \"MM/yyyy\" for MONTH,\r\n * \"yyyy\" for YEAR — instead of always rendering a full day/month/year date. DAY (the\r\n * default) falls through to NativeDateAdapter's normal locale-based formatting.\r\n * Provided per FormFieldComponent instance (see providers below) so it only affects\r\n * that one field's picker/input, not date formatting anywhere else in the app.\r\n */\r\n@Injectable()\r\nclass GranularityDateAdapter extends NativeDateAdapter {\r\n  granularity: 'DAY' | 'MONTH' | 'YEAR' = 'DAY';\r\n\r\n  override format(date: Date, displayFormat: Object): string {\r\n    if (this.granularity === 'YEAR') {\r\n      return String(date.getFullYear());\r\n    }\r\n    if (this.granularity === 'MONTH') {\r\n      const mm = String(date.getMonth() + 1).padStart(2, '0');\r\n      return `${mm}/${date.getFullYear()}`;\r\n    }\r\n    return super.format(date, displayFormat);\r\n  }\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-form-field',\r\n  templateUrl: './form-field.component.html',\r\n  styleUrls: ['./form-field.component.scss'],\r\n  standalone: false,\r\n  providers: [{ provide: DateAdapter, useClass: GranularityDateAdapter }]\r\n})\r\nexport class FormFieldComponent implements OnInit, AfterViewInit, OnDestroy {\r\n  @Input() config!: FieldConfig;\r\n  @Input() controller!: SmartFormController;\r\n  /**\r\n   * The FormGroup that THIS field's control should be registered in.\r\n   * For repeater instances this is the instance's own isolated FormGroup.\r\n   * For flat (non-repeater) fields this is the root formGroup.\r\n   */\r\n  @Input() formGroup!: FormGroup;\r\n\r\n  /**\r\n   * Set to TRUE when this field is part of a repeatable group (config.sectionConfig.allowMulti = true).\r\n   * When true, the field does NOT sync with the global controller to prevent data collision\r\n   * between different instances of the same repeater row.\r\n   */\r\n  @Input() allowMulti: boolean = false;\r\n\r\n  /**\r\n   * The repeater's FormArray, set only when this field instance lives inside an\r\n   * allowMulti section (see FormSectionComponent). Lets a single-select DROPDOWN\r\n   * exclude values already chosen by sibling instances — e.g. picking \"English\" in\r\n   * Language Details #1 removes it from Language Details #2's options — without any\r\n   * schema-level config (see displayOptionList/displayLocalOptionList below).\r\n   */\r\n  @Input() siblingFormArray: FormArray | null = null;\r\n  /** This instance's own index within siblingFormArray — excluded from the \"taken values\" set. */\r\n  @Input() siblingIndex: number | null = null;\r\n\r\n  value: any;\r\n  private _isVisible: boolean = true;\r\n\r\n  get isVisible(): boolean {\r\n    return this._isVisible;\r\n  }\r\n  set isVisible(value: boolean) {\r\n    this._isVisible = value;\r\n  }\r\n\r\n\r\n  showPassword: boolean = false;  // password show/hide toggle\r\n  dynamicMinDate: string | null = null;\r\n  dynamicMinTime: string | null = null;\r\n\r\n  /**\r\n   * Effective minimum date for the datepicker.\r\n   * Priority: dynamic (sibling field) → explicit minDate → today (when allowPast is false).\r\n   * When allowPast is not false, past dates stay allowed unless an explicit min is set.\r\n   */\r\n  get effectiveMinDate(): string | null {\r\n    const explicitMin = this.dynamicMinDate || this.config.dateConfig?.minDate || null;\r\n    if (explicitMin) return explicitMin;\r\n    if (this.config.dateConfig?.allowPast === false) {\r\n      const now = new Date();\r\n      const pad = (n: number) => String(n).padStart(2, '0');\r\n      return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Effective minimum time for the time input.\r\n   * Priority: dynamic (sibling field) → explicit minTime.\r\n   * Mirrors {@link effectiveMinDate} for TIME fields.\r\n   */\r\n  get effectiveMinTime(): string | null {\r\n    return this.dynamicMinTime || this.config.timeConfig?.minTime || null;\r\n  }\r\n\r\n  /** Effective maximum time for the time input (explicit maxTime only). */\r\n  get effectiveMaxTime(): string | null {\r\n    return this.config.timeConfig?.maxTime || null;\r\n  }\r\n\r\n  /** Fixed entry granularity for this DATE field — no per-user toggle, set entirely by\r\n   *  config (see DateConfig.dateGranularity's doc for what each level means). */\r\n  get effectiveDateGranularity(): 'DAY' | 'MONTH' | 'YEAR' {\r\n    return this.config.dateConfig?.dateGranularity || 'DAY';\r\n  }\r\n\r\n  /** Effective start view for the datepicker — jumps straight to the year grid for\r\n   *  MONTH/YEAR granularity so the day grid (and, for YEAR, the month grid) is skipped. */\r\n  get datePickerStartView(): 'month' | 'year' | 'multi-year' {\r\n    return this.effectiveDateGranularity === 'DAY' ? 'month' : 'multi-year';\r\n  }\r\n\r\n  /**\r\n   * Material's (yearSelected) output on <mat-datepicker> — fires whenever a year is\r\n   * clicked in the multi-year grid, for ANY granularity (it's just how Material's\r\n   * datepicker works), so this only acts when granularity is actually 'YEAR': commits\r\n   * Jan 1 of that year and closes immediately, skipping the month/day grids entirely.\r\n   * For 'DAY'/'MONTH' granularity this is a no-op — Material's own default behavior\r\n   * (drill into the month grid next) proceeds untouched.\r\n   */\r\n  onDateYearSelected(date: Date, picker: { close: () => void }): void {\r\n    if (this.effectiveDateGranularity !== 'YEAR') return;\r\n    const normalized = new Date(date.getFullYear(), 0, 1);\r\n    this.formGroup.get(this.config.name!)?.setValue(normalized);\r\n    picker.close();\r\n  }\r\n\r\n  /**\r\n   * Material's (monthSelected) output — fires when a month is clicked in the month grid.\r\n   * Only acts when granularity is 'MONTH': commits day=1 for that month/year and closes\r\n   * immediately, skipping the day grid. No-op for 'DAY' (default drill-in continues) and\r\n   * 'YEAR' (the picker already closed at year-selection, so this never fires for YEAR).\r\n   */\r\n  onDateMonthSelected(date: Date, picker: { close: () => void }): void {\r\n    if (this.effectiveDateGranularity !== 'MONTH') return;\r\n    const normalized = new Date(date.getFullYear(), date.getMonth(), 1);\r\n    this.formGroup.get(this.config.name!)?.setValue(normalized);\r\n    picker.close();\r\n  }\r\n\r\n  /**\r\n   * Fired every time the picker opens (Material's (opened) output). `startView` only sets\r\n   * the calendar's view on its very first render — clicking a year (in multi-year view)\r\n   * also drives Material's OWN internal auto-drill (MatCalendar's `_goToDateInView`, called\r\n   * as a side effect of the exact same click that fires (yearSelected)/(monthSelected)),\r\n   * which advances the calendar's `currentView` to 'year' then 'month' regardless of our\r\n   * close()-on-select handlers above. There's no public API to suppress that internal\r\n   * drill, so for MONTH/YEAR granularity we defensively force the view back to\r\n   * 'multi-year' on every open via Material's internal calendar reference — there's no\r\n   * supported public way to do this, so it's wrapped in a try/catch and silently no-ops if\r\n   * that internal shape ever changes in a future Material version. No-op entirely for\r\n   * 'DAY' granularity, leaving default date fields completely untouched.\r\n   */\r\n  onDatePickerOpened(picker: any): void {\r\n    if (this.effectiveDateGranularity === 'DAY') return;\r\n    try {\r\n      const calendar = picker?._componentRef?.instance?._calendar;\r\n      if (calendar) {\r\n        calendar.currentView = 'multi-year';\r\n      }\r\n    } catch {\r\n      // Best-effort only — falls back to whatever startView already achieved.\r\n    }\r\n  }\r\n\r\n  // ── DROPDOWN state ────────────────────────────────────────────────────────\r\n  isMultiDropdownOpen: boolean = false;\r\n  isSingleDropdownOpen: boolean = false;\r\n\r\n  // ── Dropdown pagination state ─────────────────────────────────────────────\r\n  dropdownCurrentPage: number = 0;\r\n  dropdownTotalCount: number = 0;\r\n  hasMoreDropdownPages: boolean = false;\r\n  isDropdownLoadingMore: boolean = false;\r\n\r\n  // ── Dropdown search state ─────────────────────────────────────────────────\r\n  searchText: string = '';\r\n  filteredOptionList: any[] = [];\r\n  dropdownSearch$ = new Subject<string>();\r\n  optionsLoading: boolean = false;\r\n  private optionsSubscription: Subscription | null = null;\r\n  isDragOver: boolean = false;    // file upload drag-over state\r\n  fileUploadError: string = '';   // per-field file validation error\r\n  multiSaveError: string = '';    // error for multisave validation\r\n  private destroy$ = new Subject<void>();\r\n\r\n  // ── MEDIA_UPLOAD support ────────────────────────────────────────────────\r\n  @ViewChild('mediaDeviceInput') mediaDeviceInput!: ElementRef<HTMLInputElement>;\r\n  /** Host div for the library picker — always in DOM, moved to body to escape parent transforms */\r\n  @ViewChild('libraryModal') libraryModalRef!: ElementRef<HTMLDivElement>;\r\n  private portalElement: HTMLElement | null = null;\r\n  showMediaMenu: boolean = false;          // hover/click dropdown menu\r\n  showYoutubeInput: boolean = false;       // inline YouTube URL input panel\r\n  youtubeUrlInput: string = '';            // model for the YT URL field\r\n  youtubeUrlError: string = '';            // validation message for YT url\r\n  mediaCarouselIndex: number = 0;         // active slide index for carousel\r\n  showLibraryModal: boolean = false;       // library picker modal\r\n  libraryImages: any[] = [];              // raw list fetched from library API\r\n  librarySelectedIds: Set<any> = new Set(); // selected library items\r\n  libraryLoading: boolean = false;\r\n  libraryError: string = '';\r\n  mediaUploadError: string = '';           // transient error message for max limits\r\n\r\n  // ── LOCATION field support ────────────────────────────────────────────────\r\n  /** Active tab: any string, e.g. 'VENUE', 'ONLINE', 'TBA'. Defaults to 'VENUE'. */\r\n  locationActiveTab: string = 'VENUE';\r\n  /** Current text in the venue search box */\r\n  locationSearchText: string = '';\r\n  /** Google Places autocomplete suggestions */\r\n  locationSuggestions: any[] = [];\r\n  /** Show the suggestions dropdown */\r\n  locationShowSuggestions: boolean = false;\r\n  /** Cached Google AutocompleteService instance */\r\n  private _googleAcService: any = null;\r\n  /** Whether Google Maps is loaded */\r\n  locationMapLoaded: boolean = false;\r\n  /** Map instance */\r\n  private _googleMap: any = null;\r\n  /** Map markers */\r\n  private _mapMarkers: any[] = [];\r\n\r\n  // ── AUTOCOMPLETE support ────────────────────────────────────────────────\r\n  /** FormControl used ONLY for the autocomplete text-input display value */\r\n  autocompleteInputCtrl = new FormControl('');\r\n  /** Filtered option list shown in the mat-autocomplete panel */\r\n  filteredOptions: { label: string; code: any }[] = [];\r\n  /**\r\n   * Component-local option list for DROPDOWN/RADIO/CHECKBOX/CHIP fields.\r\n   * Using a local copy prevents shared-config mutation when the same field config\r\n   * object is reused across multiple allowMulti repeater instances.\r\n   */\r\n  localOptionList: any[] = [];\r\n  /** Snapshot of default (unsearched) options and pagination state for DROPDOWN / AUTOCOMPLETE fields */\r\n  private defaultStateSnapshot: {\r\n    options: any[];\r\n    currentPage: number;\r\n    totalCount: number;\r\n    hasMorePages: boolean;\r\n  } = { options: [], currentPage: 0, totalCount: 0, hasMorePages: false };\r\n  /** Tracks whether the current localOptionList is filtered by an active server-side search query */\r\n  private _isServerSearchActive: boolean = false;\r\n  /** True from the moment \"Select All\" is turned on until the user deselects a single option,\r\n   *  toggles it back off, or starts a new search. While active, each newly-arrived paginated\r\n   *  page (loadMoreDropdownOptions) is auto-merged into the selection — see loadDropdownOptions\r\n   *  — so the selected count keeps pace with what's been scrolled into view (e.g. 10 -> 20 -> 34)\r\n   *  instead of freezing at whatever was loaded the moment \"Select All\" was clicked. */\r\n  private _selectAllActive: boolean = false;\r\n  /** Dedicated cache of currently selected option objects */\r\n  selectedItems: any[] = [];\r\n  /** Cache of the latest dependency parameters for server-side autocomplete filtering */\r\n  private _latestDependencyValues: { [key: string]: any } = {};\r\n  /** True when this field has no optionConfig.dependencies (nothing to satisfy) OR every\r\n   *  dependency's current value is present — false while waiting on a parent field. Guards every\r\n   *  opportunistic reload path (dropdown-open, search-reset, search-clear) so a dependent\r\n   *  dropdown never re-fetches an unfiltered full list just because it was opened/searched before\r\n   *  its parent was chosen — only setupDependencies()'s own reactive load (which always supplies\r\n   *  the real dependency params) is allowed to populate it.\r\n   *  Defaults to true here (fields with no dependencies never get corrected otherwise), but\r\n   *  ngOnInit flips it to false up front for any field that DOES declare dependencies — closing\r\n   *  the window between component creation and setupDependencies()'s first (necessarily async,\r\n   *  via combineLatest) emission, during which a fast dropdown-open would otherwise still see\r\n   *  this stale `true` default and fire an unfiltered fetch before the parent-unmet state is\r\n   *  known. */\r\n  private _dependenciesSatisfied: boolean = true;\r\n\r\n  // ── GROUP / allowMulti support ──────────────────────────────────────────\r\n\r\n  /** For GROUP fields with allowMulti = true */\r\n  groupFormArray!: FormArray;\r\n\r\n  /** For GROUP fields with allowMulti = false — single nested FormGroup */\r\n  groupFormGroup!: FormGroup;\r\n\r\n  /**\r\n   * Tracked list of repeater instances.\r\n   * Using a separate array (not FormArray.controls) + trackBy(id) ensures\r\n   * Angular creates FRESH child components for every new row, preventing\r\n   * cached values from bleeding into new instances.\r\n   *\r\n   * Enhanced with isEditing and isSaved flags for the 'multiSave' card UI.\r\n   * Each instance gets its own rowController so cascading dropdowns work\r\n   * independently within each repeater row.\r\n   */\r\n  instanceList: { id: number; fg: FormGroup; initialValue?: any; isEditing?: boolean; isSaved?: boolean; isExpanded?: boolean; rowController: SmartFormController }[] = [];\r\n  private _nextInstanceId = 0;\r\n\r\n  /** Tracks open accordion panels for standard (non-multiSave) GROUP repeaters. */\r\n  expandedGroupInstances = new Set<number>();\r\n\r\n  // ── LINK_LIST support ──────────────────────────────────────────────────\r\n  newLinkInputValue = '';\r\n  editingLinkIndex: number | null = null;\r\n  editingLinkValue = '';\r\n  linkValidationError = '';\r\n\r\n  /**\r\n   * Key used to register the GROUP control on the parent formGroup.\r\n   * Priority: sectionConfig.name > field.name > camelCase(label) > '__group__'\r\n   */\r\n  get groupKey(): string {\r\n    return (\r\n      this.config.sectionConfig?.name ||\r\n      this.config.name ||\r\n      StringUtils.toCamelCase(this.config.sectionConfig?.label) ||\r\n      '__group__'\r\n    );\r\n  }\r\n\r\n\r\n  readonly dropdownScrollStrategy: ScrollStrategy;\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private expressionService: ExpressionService,\r\n    private http: HttpClient,\r\n    private hostRef: ElementRef<HTMLElement>,\r\n    private overlay: Overlay,\r\n    private dateAdapter: DateAdapter<Date>,\r\n    private cdr: ChangeDetectorRef\r\n  ) {\r\n    this.dropdownScrollStrategy = this.overlay.scrollStrategies.reposition();\r\n  }\r\n\r\n  isFieldVisible(field: FieldConfig, rowController?: SmartFormController): boolean {\r\n    if (!field) return false;\r\n    if (field.isEnabled === false) return false;\r\n    if (field.visible === false) return false;\r\n    if (field.visibilityExpression) {\r\n      const ctrl = rowController || this.controller;\r\n      if (ctrl) {\r\n        return this.expressionService.evaluateCondition(\r\n          field.visibilityExpression,\r\n          ctrl.getAllData()\r\n        );\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /** Portal root, resolved from this component's own node rather than the global document. */\r\n  private get portalRoot(): HTMLElement | null {\r\n    return this.hostRef.nativeElement.ownerDocument?.body ?? null;\r\n  }\r\n\r\n  private _onGlobalScroll = (event: Event): void => {\r\n    if (!this.isSingleDropdownOpen && !this.isMultiDropdownOpen) return;\r\n    const target = event.target as HTMLElement;\r\n    const isInsideOptionsList = target?.classList?.contains('single-select-options-list') ||\r\n                                target?.classList?.contains('multi-select-options-list');\r\n    if (!isInsideOptionsList) {\r\n      this.isSingleDropdownOpen = false;\r\n      this.isMultiDropdownOpen = false;\r\n      this.resetDropdownSearch(false);\r\n    }\r\n  };\r\n\r\n  ngOnInit(): void {\r\n    if (typeof document !== 'undefined') {\r\n      document.addEventListener('scroll', this._onGlobalScroll, true);\r\n    }\r\n\r\n    this.isVisible = this.config.visible !== false && this.config.isEnabled !== false;\r\n\r\n    // Make this field's picker/input display text follow its configured granularity\r\n    // (MM/yyyy for MONTH, yyyy for YEAR) — no-op for non-DATE fields since they never\r\n    // read the adapter's formatted output.\r\n    (this.dateAdapter as GranularityDateAdapter).granularity = this.effectiveDateGranularity;\r\n\r\n    if (this.isGroup) {\r\n      this.initGroupField();\r\n      return;\r\n    }\r\n\r\n    // Seed localOptionList from any static options already in the config\r\n    // (e.g. optionList defined directly in the JSON like Yes/No dropdowns).\r\n    // filteredOptionList mirrors localOptionList and is narrowed by search.\r\n    // Dynamic options loaded via API will replace this array via loadDropdownOptions.\r\n    this.localOptionList = [...(this.config.optionConfig?.optionList || [])];\r\n    this.defaultStateSnapshot = {\r\n      options: [...this.localOptionList],\r\n      currentPage: 0,\r\n      totalCount: 0,\r\n      hasMorePages: false\r\n    };\r\n    this.filteredOptionList = [...this.localOptionList];\r\n\r\n    this.registerControl();\r\n    this.setupRequiredExpression();\r\n    this.mergeSelectedOptionsIntoList();\r\n    this._resolveLookupIfNeeded();\r\n    this._setupSiblingExclusion();\r\n    this.setupVisibility();\r\n    this.setupMinDateField();\r\n    this.setupMinTimeField();\r\n    this.setupGeneratedField();\r\n    this.setupFormulaValidation(); // Generic formula-based validation\r\n    // A field with dependencies starts \"not satisfied\" until setupDependencies()'s own\r\n    // (async) check proves otherwise — see _dependenciesSatisfied's doc comment. Without this,\r\n    // a dropdown opened in the brief window before that first emission would still read the\r\n    // stale `true` class-field default and fetch its full, unfiltered option list.\r\n    this._dependenciesSatisfied = !this.config.optionConfig?.dependencies;\r\n    this.setupDependencies();\r\n    this.setupMatchValidation();  // cross-field match (e.g. confirmPassword)\r\n\r\n    if (!this.config.optionConfig?.dependencies) {\r\n      this.loadDropdownOptions();\r\n    }\r\n\r\n    // ── Dropdown search stream (shared by single-select and multi-select) ────\r\n    if (this.isDropdown && this.config.optionConfig?.searchConfig?.enabled) {\r\n      this.initDropdownSearch();\r\n    }\r\n\r\n    if (this.isAutocomplete) {\r\n      this.initAutocomplete();\r\n    }\r\n\r\n    if (this.isLocation) {\r\n      this.initLocationField();\r\n    }\r\n  }\r\n\r\n  // ── GROUP initialisation ──────────────────────────────────────────────────\r\n  get addMultiLabel(): string {\r\n    const rawLabel = this.config.sectionConfig?.multiSaveConfig?.addLabel;\r\n    if (rawLabel) {\r\n      return this.controller.labels?.[rawLabel] || rawLabel;\r\n    }\r\n    const sectionLabel = this.config.sectionConfig?.label;\r\n    const translatedSectionLabel = sectionLabel ? (this.controller.labels?.[sectionLabel] || sectionLabel) : '';\r\n    return '+ Add a ' + translatedSectionLabel;\r\n  }\r\n\r\n  /** Getter for Select placeholder label */\r\n  get selectPlaceholderLabel(): string {\r\n    return this.controller.labels?.['SELECT_PLACEHOLDER'] || 'Select';\r\n  }\r\n\r\n  /** Getter for No options available label */\r\n  get noOptionsAvailableLabel(): string {\r\n    return this.controller.labels?.['NO_OPTIONS_AVAILABLE'] || 'No options available';\r\n  }\r\n\r\n  /** Getter for expand less icon name */\r\n  get expandLessLabel(): string {\r\n    return this.controller.labels?.['EXPAND_LESS'] || 'expand_less';\r\n  }\r\n\r\n  /** Getter for expand more icon name */\r\n  get expandMoreLabel(): string {\r\n    return this.controller.labels?.['EXPAND_MORE'] || 'expand_more';\r\n  }\r\n\r\n  /** Getter for dropdown search placeholder label */\r\n  get searchPlaceholderLabel(): string {\r\n    return this.controller.labels?.['SEARCH_PLACEHOLDER'] || 'Search...';\r\n  }\r\n\r\n  /** Getter for Select All label */\r\n  get selectAllLabel(): string {\r\n    return this.controller.labels?.['SELECT_ALL'] || 'Select All';\r\n  }\r\n\r\n  /** Getter for No matching options label */\r\n  get noMatchingOptionsLabel(): string {\r\n    return this.controller.labels?.['NO_MATCHING_OPTIONS'] || 'No options match your search';\r\n  }\r\n\r\n  /** Returns the label of the currently selected option for single-select custom dropdowns */\r\n  get singleSelectedLabel(): string {\r\n    if (!this.config.name) return '';\r\n    const currentValue = this.formGroup?.get(this.config.name)?.value;\r\n    if (currentValue === null || currentValue === undefined || currentValue === '') return '';\r\n    const matched = this.localOptionList.find(o => String(o.code) === String(currentValue));\r\n    return matched?.label || '';\r\n  }\r\n\r\n  isSingleOptionSelected(code: any): boolean {\r\n    if (!this.config.name) return false;\r\n    const val = this.formGroup?.get(this.config.name)?.value;\r\n    if (val === null || val === undefined || val === '') return false;\r\n    return String(val) === String(code);\r\n  }\r\n\r\n  /** Whether the dropdown search feature is enabled for this field */\r\n  get isSearchableDropdown(): boolean {\r\n    return !!this.config.optionConfig?.searchConfig?.enabled;\r\n  }\r\n\r\n  /** Whether the custom single-select dropdown overlay is required — for search, pagination, or\r\n   *  when optionConfig.customUI opts in to the styled overlay purely for visual consistency with\r\n   *  sibling dropdowns (no search box, no pagination — just the same panel/chevron treatment). */\r\n  get isCustomSingleDropdown(): boolean {\r\n    return this.isSearchableDropdown || !!this.config.optionConfig?.pagination?.enabled || !!this.config.optionConfig?.customUI;\r\n  }\r\n\r\n  private initGroupField(): void {\r\n    if (this.config.sectionConfig?.allowMulti) {\r\n      this.groupFormArray = this.fb.array([]);\r\n      this.formGroup.addControl(this.groupKey, this.groupFormArray);\r\n\r\n      const initialData = this.controller.getFieldValue(this.groupKey);\r\n      if (Array.isArray(initialData) && initialData.length > 0) {\r\n        initialData.forEach((item: any) => {\r\n          this.addGroupInstance(item);\r\n        });\r\n      } else {\r\n        // We always start with at least one instance.\r\n        // If multi-save is active, it starts in editing mode and is NOT\r\n        // added to the main form value until the user actually saves it.\r\n        this.addGroupInstance();\r\n      }\r\n    } else {\r\n      this.groupFormGroup = this.fb.group({});\r\n      this.formGroup.addControl(this.groupKey, this.groupFormGroup);\r\n    }\r\n    // Allow GROUP container nodes to participate in visibility expression evaluation.\r\n    // Without this, a GROUP's visibilityExpression (e.g. hiding an entire section header\r\n    // when none of its child fields are relevant) would never be evaluated because ngOnInit\r\n    // returns early after calling initGroupField(). This call is safe: setupVisibility()\r\n    // is a no-op when config.visibilityExpression is absent (existing groups unaffected).\r\n    this.setupVisibility();\r\n  }\r\n\r\n  /**\r\n   * Sets up cross-field validation based on the `onValidate` formula.\r\n   * Watches all variables mentioned in the formula and updates the field's\r\n   * validity whenever any of them change.\r\n   */\r\n  private setupFormulaValidation(): void {\r\n    if (!this.config.onValidate) return;\r\n\r\n    const expression = this.config.onValidate;\r\n    const variables = this.expressionService.extractVariables(expression);\r\n\r\n    // Subscribe to all fields mentioned in the formula\r\n    const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n\r\n    combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n      const context = this.controller.getAllData();\r\n      const isValid = this.expressionService.evaluateCondition(expression, context);\r\n\r\n      const control = this.formGroup.get(this.config.name!);\r\n      if (control) {\r\n        if (!isValid) {\r\n          control.setErrors({ ...control.errors, formulaError: true });\r\n        } else {\r\n          // Clear only the formulaError\r\n          if (control.hasError('formulaError')) {\r\n            const errors = { ...control.errors };\r\n            delete errors['formulaError'];\r\n            control.setErrors(Object.keys(errors).length ? errors : null);\r\n          }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  addGroupInstance(initialData?: any): void {\r\n    const fg = this.fb.group({});\r\n    const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n\r\n    // If initialData exists, treat the instance as already submitted/saved to form\r\n    const isEditing = initialData ? false : isMultiSave;\r\n    const isSaved = initialData ? true : !isMultiSave;\r\n\r\n    // Per-row controller: inherits token/labels from global but has isolated field state.\r\n    // This allows cascading dropdowns (dependencies) to work within each repeater row\r\n    // without cross-row data collisions.\r\n    const rowController = new SmartFormController();\r\n    rowController.token = this.controller.token;\r\n    rowController.tokenHeader = this.controller.tokenHeader;\r\n    rowController.labels = this.controller.labels;\r\n    rowController.actionLabels = this.controller.actionLabels;\r\n\r\n    // Pre-populate row controller so child fields initialize with the correct values\r\n    if (initialData) {\r\n      Object.entries(initialData).forEach(([key, value]) => {\r\n        rowController.updateField(key, value as any);\r\n      });\r\n    }\r\n\r\n    const instance = {\r\n      id: this._nextInstanceId++,\r\n      fg,\r\n      isEditing,\r\n      isSaved,\r\n      isExpanded: false,\r\n      initialValue: initialData ? { ...initialData } : undefined,\r\n      rowController\r\n    };\r\n\r\n    if (isSaved) {\r\n      this.groupFormArray.push(fg);\r\n    }\r\n\r\n    // Collapse all existing panels; expand only the new one\r\n    if (!isMultiSave) {\r\n      this.expandedGroupInstances.clear();\r\n      this.expandedGroupInstances.add(this.instanceList.length);\r\n    }\r\n\r\n    this.instanceList = [...this.instanceList, instance];\r\n\r\n    if (initialData) {\r\n      setTimeout(() => {\r\n        // Ensure that controls exist for all keys in initialData so we don't drop fields like ID!\r\n        Object.keys(initialData).forEach(key => {\r\n          if (!fg.contains(key)) {\r\n            fg.addControl(key, new FormControl(initialData[key]));\r\n          }\r\n        });\r\n        fg.patchValue(initialData);\r\n      });\r\n    }\r\n  }\r\n\r\n  saveGroupInstance(index: number): void {\r\n    const instance = this.instanceList[index];\r\n    const multiCfg = this.config.sectionConfig?.multiSaveConfig;\r\n\r\n    if (multiCfg?.active) {\r\n      // Reveal validation messages for every control in this entry, then block\r\n      // collapsing to the card view while any required/invalid field remains.\r\n      instance.fg.markAllAsTouched();\r\n      if (instance.fg.invalid) {\r\n        this.multiSaveError = this.controller.labels['ERR_MSG_EMPTY_MULTI'] || 'Please fill the required fields before saving.';\r\n        return;\r\n      }\r\n\r\n      this.multiSaveError = '';\r\n      instance.isSaved = true;\r\n      instance.isEditing = false;\r\n      instance.initialValue = { ...instance.fg.value };\r\n\r\n      // Push to the parent formArray so its submitted as part of the FormGroup value\r\n      if (!this.groupFormArray.controls.includes(instance.fg)) {\r\n        this.groupFormArray.push(instance.fg);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Re-opens any repeater instance (multiSave card or standard accordion panel)\r\n   * whose nested FormGroup is invalid, so errors hidden by a collapsed card/panel\r\n   * become visible. Called by the root form when a submit attempt is blocked.\r\n   * Returns true if at least one invalid instance was revealed.\r\n   */\r\n  revealInvalidInstances(): boolean {\r\n    if (!this.isGroup || !this.config.sectionConfig?.allowMulti) return false;\r\n\r\n    const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n    let foundInvalid = false;\r\n\r\n    this.instanceList.forEach((instance, i) => {\r\n      instance.fg.markAllAsTouched();\r\n      if (instance.fg.invalid) {\r\n        foundInvalid = true;\r\n        if (isMultiSave) {\r\n          instance.isEditing = true;\r\n        } else {\r\n          this.expandedGroupInstances.add(i);\r\n        }\r\n      }\r\n    });\r\n\r\n    return foundInvalid;\r\n  }\r\n\r\n  cancelGroupInstance(index: number): void {\r\n    const instance = this.instanceList[index];\r\n    if (!instance.isSaved) {\r\n      // It was a new, unsaved addition - remove it entirely\r\n      this.removeGroupInstance(index, true);\r\n    } else {\r\n      // Revert to original values\r\n      if (instance.initialValue) {\r\n        instance.fg.patchValue(instance.initialValue, { emitEvent: false });\r\n      }\r\n      instance.isEditing = false;\r\n    }\r\n  }\r\n\r\n  editGroupInstance(index: number): void {\r\n    const instance = this.instanceList[index];\r\n    instance.isEditing = true;\r\n    instance.initialValue = { ...instance.fg.value };\r\n  }\r\n\r\n  toggleExpandGroupInstance(index: number): void {\r\n    const instance = this.instanceList[index];\r\n    instance.isExpanded = !instance.isExpanded;\r\n  }\r\n\r\n  removeGroupInstance(index: number, force: boolean = false): void {\r\n    // If not multiSave, we keep the one-row minimum rule.\r\n    // In multiSave, we can remove it even if it's the last one.\r\n    const isMultiSave = !!this.config.sectionConfig?.multiSaveConfig?.active;\r\n\r\n    if (force || isMultiSave || this.instanceList.length > 1) {\r\n      const instance = this.instanceList[index];\r\n      const arrayIndex = this.groupFormArray.controls.indexOf(instance.fg);\r\n      if (arrayIndex >= 0) {\r\n        this.groupFormArray.removeAt(arrayIndex);\r\n      }\r\n      instance.rowController.destroy();\r\n      this.instanceList = this.instanceList.filter((_, i) => i !== index);\r\n\r\n      // Rebuild accordion expanded set after index shift\r\n      if (!isMultiSave) {\r\n        const updated = new Set<number>();\r\n        this.expandedGroupInstances.forEach(i => {\r\n          if (i < index) updated.add(i);\r\n          else if (i > index) updated.add(i - 1);\r\n        });\r\n        this.expandedGroupInstances = updated;\r\n      }\r\n    }\r\n  }\r\n\r\n  toggleGroupAccordion(index: number): void {\r\n    if (this.expandedGroupInstances.has(index)) {\r\n      this.expandedGroupInstances.delete(index);\r\n    } else {\r\n      this.expandedGroupInstances.add(index);\r\n    }\r\n  }\r\n\r\n  isGroupExpanded(index: number): boolean {\r\n    return this.expandedGroupInstances.has(index);\r\n  }\r\n\r\n  trackByInstanceId(_: number, item: { id: number; fg: FormGroup }): number {\r\n    return item.id;\r\n  }\r\n\r\n  // ── Leaf control ─────────────────────────────────────────────────────────\r\n\r\n  ngAfterViewInit(): void {\r\n    const el = this.libraryModalRef?.nativeElement;\r\n    const root = this.portalRoot;\r\n    if (el && root) {\r\n      this.portalElement = el;\r\n      root.appendChild(el);\r\n    }\r\n  }\r\n\r\n  // ── Suffix Action Icons ──────────────────────────────────────────────────\r\n  /** Handles click on a suffix action icon and emits via the controller */\r\n  onSuffixActionClick(actionId: string): void {\r\n    if (this.config.name) {\r\n      this.controller.suffixActionClick$.next({ fieldName: this.config.name, actionId });\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (typeof document !== 'undefined') {\r\n      document.removeEventListener('scroll', this._onGlobalScroll, true);\r\n    }\r\n    // Clean up DOM portal — no-op when the node was never appended\r\n    this.portalElement?.remove();\r\n    this.portalElement = null;\r\n\r\n    // Always complete so any subscriptions (e.g. subfields valueChanges) are cleaned up\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n\r\n    if (this.isGroup) {\r\n      if (this.config.sectionConfig?.allowMulti) {\r\n        this.instanceList.forEach(inst => inst.rowController?.destroy());\r\n      }\r\n      if (this.formGroup?.contains(this.groupKey)) {\r\n        this.formGroup.removeControl(this.groupKey);\r\n      }\r\n      return;\r\n    }\r\n\r\n    const fieldName = this.config.name;\r\n    if (fieldName && this.formGroup?.contains(fieldName)) {\r\n      this.formGroup.removeControl(fieldName);\r\n    }\r\n  }\r\n\r\n  registerControl(): void {\r\n    if (!this.config.name || !this.formGroup) return;\r\n\r\n    const fieldName = this.config.name;\r\n    const validators = this.getValidators();\r\n\r\n    // When inside a repeater instance, ALWAYS start with defaultValue (never\r\n    // read from the shared controller — prevents cross-instance value copying).\r\n    const rawInitialValue = this.allowMulti\r\n      ? (this.config.defaultValue ?? null)\r\n      : (this.controller.getFieldValue(fieldName) ?? this.config.defaultValue ?? null);\r\n\r\n    let initialValue = rawInitialValue;\r\n    if (this.isDropdown || this.isAutocomplete) {\r\n      const extracted = this.extractInitialOption(rawInitialValue);\r\n      if (extracted) {\r\n        this.selectedItems = extracted.parsedOptions;\r\n        this.addParsedOptions(extracted.parsedOptions);\r\n        initialValue = extracted.code;\r\n        if (!this.allowMulti) {\r\n          this.controller.updateField(fieldName, initialValue);\r\n          // Also store the full option value object so MFEs can retrieve it from\r\n          // the controller without needing formFieldComponents (which doesn't\r\n          // pierce GROUP/section component boundaries).\r\n          if (extracted.parsedOptions.length === 1) {\r\n            this.controller.updateField(`_val_${fieldName}`, extracted.parsedOptions[0].value ?? null);\r\n          } else if (extracted.parsedOptions.length > 1) {\r\n            this.controller.updateField(`_val_${fieldName}`, extracted.parsedOptions.map(p => p.value));\r\n          }\r\n        }\r\n      } else {\r\n        const codes = Array.isArray(rawInitialValue) ? rawInitialValue : (rawInitialValue !== null && rawInitialValue !== undefined && rawInitialValue !== '' ? [rawInitialValue] : []);\r\n        this.updateSelectedItems(codes);\r\n      }\r\n    }\r\n\r\n\r\n    let control = this.formGroup.get(fieldName) as FormControl;\r\n    if (!control) {\r\n      control = new FormControl(\r\n        { value: initialValue, disabled: !!this.config.disabled || !this.isVisible },\r\n        validators\r\n      );\r\n      this.formGroup.addControl(fieldName, control);\r\n    }\r\n\r\n    this.value = control.value;\r\n\r\n    if (!this.allowMulti) {\r\n      // ── Flat field: keep in sync with shared controller ──────────────────\r\n      control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n        if (this.isDropdown || this.isAutocomplete) {\r\n          const innerExtracted = this.extractInitialOption(val);\r\n          if (innerExtracted) {\r\n            this.selectedItems = innerExtracted.parsedOptions;\r\n            this.addParsedOptions(innerExtracted.parsedOptions);\r\n            control.setValue(innerExtracted.code, { emitEvent: false });\r\n            this.value = innerExtracted.code;\r\n            if (this.isAutocomplete) {\r\n              this._syncAutocompleteDisplayValue();\r\n            }\r\n            this.controller.updateField(fieldName, innerExtracted.code);\r\n            // Store the full option value object so MFEs can retrieve it by\r\n            // controller.getFieldValue('_val_<fieldName>') without needing\r\n            // to query formFieldComponents (which doesn't pierce GROUP boundaries).\r\n            if (innerExtracted.parsedOptions.length === 1) {\r\n              this.controller.updateField(`_val_${fieldName}`, innerExtracted.parsedOptions[0].value ?? null);\r\n            } else if (innerExtracted.parsedOptions.length > 1) {\r\n              this.controller.updateField(`_val_${fieldName}`, innerExtracted.parsedOptions.map(p => p.value));\r\n            }\r\n            return;\r\n          }\r\n          const codes = Array.isArray(val) ? val : (val !== null && val !== undefined && val !== '' ? [val] : []);\r\n          this.updateSelectedItems(codes);\r\n        }\r\n        this.value = val;\r\n        this.controller.updateField(fieldName, val);\r\n      });\r\n\r\n      this.controller.getFieldObservable(fieldName).pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n        let actualValue = val;\r\n        if (this.isDropdown || this.isAutocomplete) {\r\n          const innerExtracted = this.extractInitialOption(val);\r\n          if (innerExtracted) {\r\n            this.selectedItems = innerExtracted.parsedOptions;\r\n            this.addParsedOptions(innerExtracted.parsedOptions);\r\n            actualValue = innerExtracted.code;\r\n            this.controller.updateField(fieldName, actualValue);\r\n          } else {\r\n            const codes = Array.isArray(val) ? val : (val !== null && val !== undefined && val !== '' ? [val] : []);\r\n            this.updateSelectedItems(codes);\r\n          }\r\n        }\r\n\r\n        if (actualValue !== control.value) {\r\n          control.setValue(actualValue, { emitEvent: false });\r\n          this.value = actualValue;\r\n          if (this.isAutocomplete) {\r\n            this._syncAutocompleteDisplayValue();\r\n          }\r\n        }\r\n      });\r\n    } else {\r\n      // ── Repeater field: local value tracking only ─────────────────────────\r\n      control.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n        if (this.isDropdown || this.isAutocomplete) {\r\n          const innerExtracted = this.extractInitialOption(val);\r\n          if (innerExtracted) {\r\n            this.selectedItems = innerExtracted.parsedOptions;\r\n            this.addParsedOptions(innerExtracted.parsedOptions);\r\n            control.setValue(innerExtracted.code, { emitEvent: false });\r\n            this.value = innerExtracted.code;\r\n            if (this.isAutocomplete) {\r\n              this._syncAutocompleteDisplayValue();\r\n            }\r\n            return;\r\n          }\r\n          const codes = Array.isArray(val) ? val : (val !== null && val !== undefined && val !== '' ? [val] : []);\r\n          this.updateSelectedItems(codes);\r\n        }\r\n        this.value = val;\r\n      });\r\n    }\r\n  }\r\n\r\n  getValidators(): ValidatorFn[] {\r\n    const validators: ValidatorFn[] = [];\r\n    if (this.config.required) validators.push(Validators.required);\r\n    if (this.config.subType === 'EMAIL') validators.push(Validators.email);\r\n    if (this.config.subType === 'PASSWORD') {\r\n      // Minimum 8 chars by default; honour explicit textConfig.length overrides\r\n      const minLen = this.config.textConfig?.length?.min ?? 8;\r\n      validators.push(Validators.minLength(minLen));\r\n    }\r\n    if (this.config.textConfig?.length) {\r\n      const { min, max } = this.config.textConfig.length;\r\n      if (min && this.config.subType !== 'PASSWORD') validators.push(Validators.minLength(min));\r\n      if (max) validators.push(Validators.maxLength(max));\r\n    }\r\n    if (this.config.textConfig?.pattern) validators.push(Validators.pattern(this.config.textConfig.pattern));\r\n    if (this.config.numberConfig) {\r\n      const { min, max } = this.config.numberConfig;\r\n      if (min !== undefined) validators.push(Validators.min(min));\r\n      if (max !== undefined) validators.push(Validators.max(max));\r\n    }\r\n    if (this.config.type === 'RICH_TEXT' && this.config.richTextConfig?.maxLength) {\r\n      const max = this.config.richTextConfig.maxLength;\r\n      validators.push((control: import('@angular/forms').AbstractControl) => {\r\n        if (!control.value) return null;\r\n        const plainText = String(control.value).replace(/<[^>]*>/g, '');\r\n        return plainText.length > max\r\n          ? { 'maxlength': { requiredLength: max, actualLength: plainText.length } }\r\n          : null;\r\n      });\r\n    }\r\n    return validators;\r\n  }\r\n\r\n  // ── Cross-field match validation (password === confirmPassword) ───────────\r\n\r\n  /**\r\n   * When `textConfig.matchField` is configured, subscribes to value changes on\r\n   * BOTH this control and the referenced control so the mismatch error updates\r\n   * instantly whichever field the user edits last.\r\n   *\r\n   *  - Values differ  → sets `{ passwordMismatch: true }` on THIS control.\r\n   *  - Values match   → clears `passwordMismatch` from THIS control.\r\n   */\r\n  setupMatchValidation(): void {\r\n    const matchFieldName = this.config.textConfig?.matchField;\r\n    if (!matchFieldName || !this.config.name || !this.formGroup) return;\r\n\r\n    const thisControl = this.formGroup.get(this.config.name);\r\n    const otherControl = this.formGroup.get(matchFieldName);\r\n    if (!thisControl || !otherControl) return;\r\n\r\n    const runCheck = () => {\r\n      const thisVal = thisControl.value;\r\n      const otherVal = otherControl.value;\r\n\r\n      if (thisVal && otherVal && thisVal !== otherVal) {\r\n        // Both have a value but they differ — flag the mismatch\r\n        thisControl.setErrors(\r\n          { ...thisControl.errors, passwordMismatch: true },\r\n          { emitEvent: false }\r\n        );\r\n      } else {\r\n        // Either one is empty OR they now match — clear the mismatch error\r\n        if (thisControl.hasError('passwordMismatch')) {\r\n          const errors = { ...thisControl.errors };\r\n          delete errors['passwordMismatch'];\r\n          thisControl.setErrors(\r\n            Object.keys(errors).length ? errors : null,\r\n            { emitEvent: false }\r\n          );\r\n        }\r\n      }\r\n    };\r\n\r\n    // Fire when THIS (confirmPassword) field changes\r\n    thisControl.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(() => runCheck());\r\n\r\n    // Also fire when the OTHER (password) field changes so the error clears\r\n    // as soon as the user corrects the source value\r\n    otherControl.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(() => runCheck());\r\n  }\r\n\r\n  setupVisibility(): void {\r\n    if (!this.config.visibilityExpression) return;\r\n\r\n    // Prefer formGroup-level lookup: works for both allowMulti rows and non-multi rows\r\n    // that still have a row-scoped formGroup (e.g. accordion repeater with allowMulti=false).\r\n    if (this.formGroup) {\r\n      const variables = this.expressionService.extractVariables(this.config.visibilityExpression);\r\n      // The very first evaluate() call below runs synchronously during this field's own setup —\r\n      // at that instant there is no guarantee a SIBLING field this expression depends on (e.g.\r\n      // \"areaType\" for a Ward field gated on `areaType === 'urban'`) has already had ITS OWN\r\n      // initial/patched value written into the shared formGroup yet; field setup order across\r\n      // siblings isn't guaranteed. If that sibling hasn't landed yet, this expression evaluates\r\n      // false on nothing but a race, and used to reset({...}) this field's OWN already-patched\r\n      // initial value (e.g. a saved \"Ward\" selection) to null before the user ever saw it —\r\n      // permanently losing data that was correctly loaded, purely because of evaluation order.\r\n      // Only the very first pass is at risk of that race; every later call is driven by a real\r\n      // valueChanges emission (the user, or a fully-initialized sibling, actually changed\r\n      // something), so resetting a now-hidden field's stale value there remains correct and is\r\n      // left exactly as before. isVisible/enable-disable still updates synchronously on the\r\n      // first pass too — only the destructive reset is what's held back.\r\n      let hasEvaluatedOnce = false;\r\n      const evaluate = () => {\r\n        // Merge global controller data so cross-group variables (e.g. sessionTypeId\r\n        // referenced from inside a nested GROUP) are in scope.\r\n        // Local formGroup values take precedence to preserve same-group behaviour.\r\n        const context = { ...this.controller.getAllData(), ...this.formGroup.value };\r\n        this.isVisible = this.expressionService.evaluateCondition(this.config.visibilityExpression!, context);\r\n        const control = this.formGroup.get(this.config.name!);\r\n        if (control) {\r\n          if (this.isVisible) {\r\n            control.enable({ emitEvent: false });\r\n          } else {\r\n            control.disable({ emitEvent: false });\r\n            if (hasEvaluatedOnce && control.value !== null && control.value !== undefined && control.value !== '') {\r\n              control.reset(null, { emitEvent: false });\r\n            }\r\n          }\r\n        }\r\n        hasEvaluatedOnce = true;\r\n      };\r\n      evaluate();\r\n      // Subscribe to local group changes for same-group sibling expressions (existing behaviour).\r\n      this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => evaluate());\r\n      // Additionally subscribe to cross-group variables via the controller so that\r\n      // a field in a different FormGroup (e.g. sessionTypeId at root) re-evaluates\r\n      // this field's visibility even when the local formGroup does not emit.\r\n      const crossGroupVars = variables.filter(v => !this.formGroup.contains(v));\r\n      if (crossGroupVars.length > 0) {\r\n        const crossObservables = crossGroupVars.map(v => this.controller.getFieldObservable(v));\r\n        // BehaviorSubjects emit synchronously on subscription AND whenever\r\n        // controller.initialize() is called (e.g. in Edit mode after the view is\r\n        // already rendered). Calling evaluate() synchronously at that point mutates\r\n        // isVisible / control state inside Angular's checkNoChanges pass → NG0100.\r\n        // Deferring by one event-loop tick (setTimeout 0) allows the current CD\r\n        // cycle to complete first. The initial synchronous evaluate() above (line 898)\r\n        // still sets the correct initial state — this only affects subsequent updates.\r\n        combineLatest(crossObservables).pipe(takeUntil(this.destroy$)).subscribe(() => setTimeout(() => evaluate()));\r\n      }\r\n    } else {\r\n      const variables = this.expressionService.extractVariables(this.config.visibilityExpression);\r\n      const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n      combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n        const context = this.controller.getAllData();\r\n        this.isVisible = this.expressionService.evaluateCondition(this.config.visibilityExpression!, context);\r\n        const control = this.formGroup?.get(this.config.name!);\r\n        if (control) {\r\n          this.isVisible ? control.enable({ emitEvent: false }) : control.disable({ emitEvent: false });\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * When config.requiredExpression is set, dynamically re-evaluates the required\r\n   * validator whenever any referenced variable changes in the controller.\r\n   * Fully backwards-compatible: fields without requiredExpression are unaffected.\r\n   */\r\n  setupRequiredExpression(): void {\r\n    if (!this.config.requiredExpression || !this.config.name) return;\r\n\r\n    const control = this.formGroup?.get(this.config.name);\r\n    if (!control) return;\r\n\r\n    const expression = this.config.requiredExpression;\r\n    const variables = this.expressionService.extractVariables(expression);\r\n\r\n    const applyRequired = () => {\r\n      const context = { ...this.controller.getAllData(), ...this.formGroup.value };\r\n      const isRequired = this.expressionService.evaluateCondition(expression, context);\r\n      this.config.required = isRequired;\r\n      const base = this.getValidatorsWithoutRequired();\r\n      control.setValidators(isRequired ? [Validators.required, ...base] : base);\r\n      control.updateValueAndValidity({ emitEvent: false });\r\n    };\r\n\r\n    applyRequired(); // evaluate once on init\r\n\r\n    if (variables.length > 0) {\r\n      const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n      combineLatest(observables)\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe(() => applyRequired());\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns all validators from getValidators() except Validators.required.\r\n   * Used by setupRequiredExpression() to rebuild the validator list without\r\n   * duplicating the required validator.\r\n   */\r\n  private getValidatorsWithoutRequired(): ValidatorFn[] {\r\n    const savedRequired = this.config.required;\r\n    this.config.required = false;\r\n    const validators = this.getValidators();\r\n    this.config.required = savedRequired;\r\n    return validators;\r\n  }\r\n\r\n  /**\r\n   * trackBy function for field *ngFor loops in ROW containers.\r\n   * Keying by field name (or type as fallback for unnamed containers) prevents\r\n   * Angular from destroying and recreating FormFieldComponent instances on re-render,\r\n   * preserving localOptionList cache and avoiding duplicate API calls.\r\n   */\r\n  trackByFieldName(_: number, field: FieldConfig): string {\r\n    return field.name || field.type;\r\n  }\r\n\r\n  setupMinDateField(): void {\r\n    const minDateField = this.config.dateConfig?.minDateField;\r\n    if (!minDateField || this.config.type !== 'DATE') return;\r\n\r\n    // Use local date to avoid UTC-offset day shift (e.g. IST midnight = prev-day UTC)\r\n    const toIso = (val: any): string | null => {\r\n      if (!val) return null;\r\n      const d = val instanceof Date ? val : new Date(val);\r\n      if (isNaN(d.getTime())) return String(val);\r\n      const y = d.getFullYear();\r\n      const mo = String(d.getMonth() + 1).padStart(2, '0');\r\n      const dy = String(d.getDate()).padStart(2, '0');\r\n      return `${y}-${mo}-${dy}`;\r\n    };\r\n\r\n    // Prefer formGroup-level lookup: works for both allowMulti rows and non-multi rows\r\n    // that still have a row-scoped formGroup (e.g. accordion repeater with allowMulti=false).\r\n    if (this.formGroup) {\r\n      const sourceCtrl = this.formGroup.get(minDateField);\r\n      if (sourceCtrl) {\r\n        this.dynamicMinDate = toIso(sourceCtrl.value);\r\n        sourceCtrl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n          this.dynamicMinDate = toIso(val);\r\n          // If end date is now before the new start date, clear it immediately\r\n          const thisCtrl = this.formGroup?.get(this.config.name!);\r\n          if (thisCtrl?.value && val) {\r\n            const endD = thisCtrl.value instanceof Date ? thisCtrl.value : new Date(thisCtrl.value);\r\n            const minD = val instanceof Date ? val : new Date(val as string);\r\n            if (!isNaN(endD.getTime()) && !isNaN(minD.getTime()) && endD < minD) {\r\n              thisCtrl.setValue(null, { emitEvent: true });\r\n            }\r\n          }\r\n        });\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Fall back to controller-based lookup (non-repeater flat fields).\r\n    const updateMin = (context: any) => {\r\n      this.dynamicMinDate = toIso(context?.[minDateField]);\r\n    };\r\n    updateMin(this.controller.getAllData());\r\n    this.controller.getFieldObservable(minDateField)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(() => updateMin(this.controller.getAllData()));\r\n  }\r\n\r\n  /**\r\n   * Wires up a dynamic minimum for a TIME field from a sibling TIME field\r\n   * (config.timeConfig.minTimeField). When the source changes, this field's\r\n   * minimum updates and any now-invalid value (earlier than the new minimum)\r\n   * is cleared. Mirrors {@link setupMinDateField} for TIME fields.\r\n   */\r\n  setupMinTimeField(): void {\r\n    const minTimeField = this.config.timeConfig?.minTimeField;\r\n    if (!minTimeField || this.config.type !== 'TIME') return;\r\n\r\n    // Native <input type=\"time\"> stores an \"HH:mm\" (or \"HH:mm:ss\") string,\r\n    // which compares correctly lexicographically. Normalise anything else to a string.\r\n    const toTime = (val: any): string | null => {\r\n      if (val === null || val === undefined || val === '') return null;\r\n      return String(val);\r\n    };\r\n\r\n    // Prefer formGroup-level lookup so it works for both allowMulti rows and\r\n    // non-multi rows that still have a row-scoped formGroup (accordion repeaters).\r\n    if (this.formGroup) {\r\n      const sourceCtrl = this.formGroup.get(minTimeField);\r\n      if (sourceCtrl) {\r\n        this.dynamicMinTime = toTime(sourceCtrl.value);\r\n        sourceCtrl.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(val => {\r\n          this.dynamicMinTime = toTime(val);\r\n          // If this (end) time is now before the new start time, clear it immediately.\r\n          const thisCtrl = this.formGroup?.get(this.config.name!);\r\n          const min = this.dynamicMinTime;\r\n          if (thisCtrl?.value && min && String(thisCtrl.value) < min) {\r\n            thisCtrl.setValue(null, { emitEvent: true });\r\n          }\r\n        });\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Fall back to controller-based lookup (non-repeater flat fields).\r\n    const updateMin = (context: any) => {\r\n      this.dynamicMinTime = toTime(context?.[minTimeField]);\r\n    };\r\n    updateMin(this.controller.getAllData());\r\n    this.controller.getFieldObservable(minTimeField)\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(() => updateMin(this.controller.getAllData()));\r\n  }\r\n\r\n  setupGeneratedField(): void {\r\n    if (this.config.type !== 'GENERATED' || !this.config.generatedConfig) return;\r\n    const variables = this.config.generatedConfig.variables || [];\r\n    const observables = variables.map(v => this.controller.getFieldObservable(v));\r\n    combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n      const context = this.controller.getAllData();\r\n      const result = this.evaluateFormula(context);\r\n      if (result !== null && this.config.name) {\r\n        this.controller.updateField(this.config.name, result);\r\n      }\r\n    });\r\n  }\r\n\r\n  evaluateFormula(context: { [key: string]: any }): any {\r\n    if (!this.config.generatedConfig) return null;\r\n    const formula = this.config.generatedConfig.formula;\r\n    const functionName = this.extractFunctionName(formula);\r\n    if (functionName) {\r\n      return this.expressionService.evaluateFormula(\r\n        formula, functionName, context, this.config.generatedConfig.variables\r\n      );\r\n    }\r\n    return null;\r\n  }\r\n\r\n  extractFunctionName(formula: string): string | null {\r\n    const match = formula.match(/(?:function|fun)\\s+(\\w+)\\s*\\(/);\r\n    return match ? match[1] : null;\r\n  }\r\n\r\n  setupDependencies(): void {\r\n    if (!this.config.optionConfig?.dependencies) return;\r\n    const dependencies = this.config.optionConfig.dependencies;\r\n    const observables = Object.values(dependencies).map(fieldName =>\r\n      this.controller.getFieldObservable(fieldName)\r\n    );\r\n    // Track previous values so we can detect user-driven parent changes vs. initial load.\r\n    // BehaviorSubjects always emit the current value on subscribe — we must NOT clear the\r\n    // child's value on that first emission (it would wipe pre-populated edit-mode data).\r\n    let prevValues: any[] | null = null;\r\n    combineLatest(observables).pipe(takeUntil(this.destroy$)).subscribe(values => {\r\n      const dependencyValues: { [key: string]: any } = {};\r\n      Object.keys(dependencies).forEach((paramKey, index) => {\r\n        dependencyValues[paramKey] = values[index];\r\n      });\r\n      const allPresent = Object.values(dependencyValues).every(\r\n        v => v !== null && v !== undefined && v !== ''\r\n      );\r\n\r\n      const isFirstEmit = prevValues === null;\r\n      const parentChanged = !isFirstEmit && values.some((v, i) => v !== prevValues![i]);\r\n      prevValues = [...values];\r\n\r\n      this._dependenciesSatisfied = allPresent;\r\n\r\n      if (allPresent) {\r\n        if (parentChanged) {\r\n          // Parent value changed by user interaction — reset child selection so the\r\n          // previously chosen value (from a different parent) isn't shown as selected\r\n          // against the newly loaded options.\r\n          const control = this.formGroup?.get(this.config.name!);\r\n          if (control && control.value !== null && control.value !== '') {\r\n            control.setValue(null, { emitEvent: true });\r\n          }\r\n        }\r\n        this.dropdownCurrentPage = 0;\r\n        this.dropdownTotalCount = 0;\r\n        this.hasMoreDropdownPages = false;\r\n        this.defaultStateSnapshot = { options: [], currentPage: 0, totalCount: 0, hasMorePages: false };\r\n        this._latestDependencyValues = dependencyValues;\r\n        this.loadDropdownOptions(dependencyValues, 0, false);\r\n      } else if (this.config.optionConfig) {\r\n        this._latestDependencyValues = {};\r\n        this.localOptionList = [];\r\n        this.defaultStateSnapshot = { options: [], currentPage: 0, totalCount: 0, hasMorePages: false };\r\n        this.filteredOptionList = [];\r\n        this.dropdownCurrentPage = 0;\r\n        this.dropdownTotalCount = 0;\r\n        this.hasMoreDropdownPages = false;\r\n        if (parentChanged) {\r\n          const control = this.formGroup?.get(this.config.name!);\r\n          if (control && control.value !== null && control.value !== '') {\r\n            control.setValue(null, { emitEvent: true });\r\n          }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  /** Extracts the total item count from an API response using the configured path or fallbacks. */\r\n  private extractTotalCount(response: any, configuredPath?: string): number {\r\n    if (!response) return 0;\r\n\r\n    // 1. Try explicit path if configured (e.g. '0.totalCount', 'totalElements', '[0].totalCount')\r\n    if (configuredPath) {\r\n      const val = this.getValueByPath(response, configuredPath);\r\n      if (typeof val === 'number') return val;\r\n      if (val !== undefined && val !== null && !isNaN(Number(val))) return Number(val);\r\n    }\r\n\r\n    // 2. Auto-detection fallback chain:\r\n    // a) Dataset Count Array: [{ totalCount: 39 }] or [{ totalElements: 39 }]\r\n    const dsCount = this.getValueByPath(response, '0.totalCount');\r\n    if (dsCount !== undefined && typeof dsCount === 'number') return dsCount;\r\n\r\n    // b) Spring Data REST: { totalElements: 227 }\r\n    if (typeof response?.totalElements === 'number') return response.totalElements;\r\n\r\n    // c) Standard object: { totalCount: 150 }\r\n    if (typeof response?.totalCount === 'number') return response.totalCount;\r\n\r\n    // d) Standard object: { total: 85 }\r\n    if (typeof response?.total === 'number') return response.total;\r\n\r\n    // e) Plain array fallback\r\n    if (Array.isArray(response)) return response.length;\r\n\r\n    return 0;\r\n  }\r\n\r\n  /** Builds HttpParams for dropdown requests supporting both standard and nested_string (dataset) formats. */\r\n  private buildDropdownQueryParams(\r\n    url: string,\r\n    dynamicParams: { [key: string]: any } = {},\r\n    pageIndex: number = 0\r\n  ): { url: string; params: HttpParams } {\r\n    const optionConfig = this.config.optionConfig;\r\n    const acConfig = this.config.autocompleteConfig;\r\n    const qpConfig = optionConfig?.queryParamsConfig;\r\n    const pagination = optionConfig?.pagination;\r\n    const nestedConfig = qpConfig?.nestedStringConfig || optionConfig?.nestedStringConfig;\r\n\r\n    const staticQueryParams = acConfig?.queryParams || {};\r\n    const allQueryParams = { ...staticQueryParams, ...dynamicParams };\r\n\r\n    let fullUrl = url;\r\n    // Interpolate path variables (e.g., {program}) from allQueryParams\r\n    Object.keys(allQueryParams).forEach(key => {\r\n      const placeholder = `{${key}}`;\r\n      if (fullUrl.includes(placeholder)) {\r\n        fullUrl = fullUrl.replace(placeholder, String(allQueryParams[key]));\r\n        delete allQueryParams[key];\r\n      }\r\n    });\r\n\r\n    let paramsObj: any = {};\r\n\r\n    // Pagination query parameters\r\n    if (pagination?.enabled) {\r\n      const pageKey = qpConfig?.pageKey || pagination.pageKey || 'page';\r\n      const sizeKey = qpConfig?.sizeKey || pagination.sizeKey || 'size';\r\n      const pageOffset = qpConfig?.pageIndexOffset ?? pagination.pageOffset ?? 0;\r\n      const calculatedPage = pageIndex + pageOffset;\r\n      const pageSize = pagination.pageSize || 10;\r\n\r\n      paramsObj[pageKey] = calculatedPage.toString();\r\n      paramsObj[sizeKey] = pageSize.toString();\r\n    }\r\n\r\n    const filterHandling = qpConfig?.filterHandling || optionConfig?.searchConfig?.handling || (nestedConfig ? 'nested_string' : 'standard');\r\n\r\n    if (filterHandling === 'nested_string' && nestedConfig) {\r\n      const { paramName, baseValue, separator, assignment } = nestedConfig;\r\n      let nestedString = baseValue || '';\r\n      const assign = assignment || '=';\r\n      const sep = separator || '--';\r\n\r\n      // Merge dynamic params into nested string\r\n      Object.entries(allQueryParams).forEach(([key, value]) => {\r\n        if (value !== null && value !== undefined && value !== '') {\r\n          const prefix = nestedString ? sep : '';\r\n          nestedString += `${prefix}${key}${assign}${value}`;\r\n        }\r\n      });\r\n\r\n      paramsObj[paramName || 'params'] = nestedString;\r\n    } else {\r\n      // Standard handling\r\n      Object.entries(allQueryParams).forEach(([key, value]) => {\r\n        if (value !== null && value !== undefined) {\r\n          paramsObj[key] = String(value);\r\n        }\r\n      });\r\n    }\r\n\r\n    let httpParams = new HttpParams();\r\n    Object.entries(paramsObj).forEach(([k, v]) => {\r\n      httpParams = httpParams.append(k, String(v));\r\n    });\r\n\r\n    return { url: fullUrl, params: httpParams };\r\n  }\r\n\r\n  /**\r\n   * Loads options for DROPDOWN / AUTOCOMPLETE fields.\r\n   * Supports server-side pagination, separate Dataset count endpoints, and nested_string params.\r\n   */\r\n  loadDropdownOptions(\r\n    dynamicParams: { [key: string]: any } = {},\r\n    pageIndex: number = 0,\r\n    isLoadMore: boolean = false\r\n  ): void {\r\n    const optionConfig = this.config.optionConfig;\r\n    const acConfig = this.config.autocompleteConfig;\r\n    const pagination = optionConfig?.pagination;\r\n    const isPaginationEnabled = !!pagination?.enabled;\r\n\r\n    const urls = optionConfig?.apiUrls ||\r\n      (optionConfig?.apiUrl ? [optionConfig.apiUrl] :\r\n        optionConfig?.optionUrl ? [optionConfig.optionUrl] : []);\r\n\r\n    if (!urls || urls.length === 0) return;\r\n\r\n    if (!isLoadMore) {\r\n      if (this.optionsSubscription) {\r\n        this.optionsSubscription.unsubscribe();\r\n      }\r\n      this.optionsLoading = !!optionConfig?.showLoader;\r\n      this.dropdownCurrentPage = pageIndex;\r\n    } else {\r\n      this.isDropdownLoadingMore = true;\r\n      this.dropdownCurrentPage = pageIndex;\r\n    }\r\n\r\n    const method = optionConfig?.apiMethod || acConfig?.method || 'GET';\r\n    const staticBody = optionConfig?.apiPayload ?? acConfig?.body ?? null;\r\n    const customHeaders = acConfig?.headers;\r\n\r\n    const totalCountCfg = pagination?.totalCountConfig;\r\n    const isSeparateCount = isPaginationEnabled && totalCountCfg?.source === 'separate' && !!totalCountCfg.apiUrl;\r\n    const totalPath = totalCountCfg?.responsePath || pagination?.totalCountPath;\r\n\r\n    // Build data API requests\r\n    const dataObservables = urls.map(url => {\r\n      const httpParams = this.buildDropdownQueryParams(url, dynamicParams, pageIndex);\r\n      const fullUrl = httpParams.url;\r\n      const options: any = {\r\n        headers: this.getHeaders(customHeaders),\r\n        params: httpParams.params\r\n      };\r\n\r\n      switch (method) {\r\n        case 'POST': return this.http.post<any>(fullUrl, staticBody, options);\r\n        case 'PUT': return this.http.put<any>(fullUrl, staticBody, options);\r\n        case 'PATCH': return this.http.patch<any>(fullUrl, staticBody, options);\r\n        default: return this.http.get<any>(fullUrl, options);\r\n      }\r\n    });\r\n\r\n    const dataRequest$ = forkJoin(dataObservables);\r\n\r\n    let request$: Observable<{ responses: any[]; totalCount?: number }>;\r\n\r\n    if (isSeparateCount && !isLoadMore) {\r\n      // Execute both Data API and separate Count API concurrently via forkJoin\r\n      const countHttpParams = this.buildDropdownQueryParams(totalCountCfg.apiUrl!, dynamicParams, 0);\r\n      const countUrl = countHttpParams.url;\r\n      const countOptions: any = {\r\n        headers: this.getHeaders(customHeaders),\r\n        params: countHttpParams.params\r\n      };\r\n\r\n      const countRequest$ = method === 'POST'\r\n        ? this.http.post<any>(countUrl, staticBody, countOptions)\r\n        : this.http.get<any>(countUrl, countOptions);\r\n\r\n      request$ = forkJoin({\r\n        dataRes: dataRequest$,\r\n        countRes: countRequest$\r\n      }).pipe(\r\n        map(({ dataRes, countRes }) => ({\r\n          responses: dataRes,\r\n          totalCount: this.extractTotalCount(countRes, totalPath)\r\n        }))\r\n      );\r\n    } else {\r\n      request$ = dataRequest$.pipe(\r\n        map(responses => ({\r\n          responses,\r\n          totalCount: isPaginationEnabled ? this.extractTotalCount(responses[0], totalPath) : undefined\r\n        }))\r\n      );\r\n    }\r\n\r\n    this.optionsSubscription = request$.pipe(\r\n      takeUntil(this.destroy$),\r\n      finalize(() => {\r\n        this.optionsLoading = false;\r\n        this.isDropdownLoadingMore = false;\r\n        this.optionsSubscription = null;\r\n      })\r\n    ).subscribe({\r\n      next: ({ responses, totalCount }) => {\r\n        let mergedData: any[] = [];\r\n        responses.forEach((response: any) => {\r\n          let data = optionConfig?.dataPath\r\n            ? this.getValueByPath(response, optionConfig.dataPath)\r\n            : (Array.isArray(response) ? response : response.elements || response.data || response.items || response || []);\r\n\r\n          if (data !== null && typeof data === 'object' && !Array.isArray(data)) {\r\n            data = Object.values(data);\r\n          }\r\n\r\n          if (Array.isArray(data)) mergedData = [...mergedData, ...data];\r\n        });\r\n\r\n        if (optionConfig?.sortBy) {\r\n          const sortKey = optionConfig.sortBy;\r\n          const direction = optionConfig.sortDirection === 'DESC' ? -1 : 1;\r\n          mergedData.sort((a, b) => {\r\n            const valA = this.getValueByPath(a, sortKey);\r\n            const valB = this.getValueByPath(b, sortKey);\r\n            if (typeof valA === 'string' && typeof valB === 'string') return direction * valA.localeCompare(valB);\r\n            if (typeof valA === 'number' && typeof valB === 'number') return direction * (valA - valB);\r\n            return 0;\r\n          });\r\n        }\r\n\r\n        const labelTemplate = acConfig?.labelTemplate;\r\n\r\n        const mappedOptions = mergedData.map((item: any) => {\r\n          let label: string;\r\n          if (labelTemplate) {\r\n            label = labelTemplate.replace(/\\{(\\w+)\\}/g, (_: string, key: string) => {\r\n              const val = this.getValueByPath(item, key);\r\n              return val !== undefined && val !== null ? String(val) : '';\r\n            });\r\n          } else if (optionConfig?.labelPath) {\r\n            label = String(this.getValueByPath(item, optionConfig.labelPath) ?? '');\r\n          } else {\r\n            label = item.label || item.displayName || item.name || '';\r\n          }\r\n\r\n          const code = optionConfig?.valuePath\r\n            ? this.getValueByPath(item, optionConfig.valuePath)\r\n            : (item.code ?? item.id ?? item.value);\r\n\r\n          const displayFields = acConfig?.displayFields;\r\n          let displayMeta: { path: string; type: string; label?: string; value: string }[] | undefined;\r\n          if (displayFields) {\r\n            const fields: AutocompleteDisplayField[] = typeof displayFields === 'string'\r\n              ? [{ path: displayFields, type: 'text' }]\r\n              : displayFields;\r\n            displayMeta = fields.map(f => ({\r\n              path: f.path,\r\n              type: f.type || 'text',\r\n              icon: f.icon,\r\n              className: f.className,\r\n              label: f.label,\r\n              value: String(this.getValueByPath(item, f.path) ?? '')\r\n            })).filter(f => f.value !== '');\r\n          }\r\n\r\n          return { label, code, value: item, displayMeta };\r\n        });\r\n\r\n        if (isPaginationEnabled) {\r\n          if (!isLoadMore && totalCount !== undefined) {\r\n            this.dropdownTotalCount = totalCount;\r\n          }\r\n\r\n          let finalOptions: any[];\r\n          if (isLoadMore) {\r\n            const existingCodes = new Set(this.localOptionList.map(o => o.code));\r\n            const newUnique = mappedOptions.filter(o => !existingCodes.has(o.code));\r\n            finalOptions = [...this.localOptionList, ...newUnique];\r\n          } else {\r\n            const newCodesSet = new Set(mappedOptions.map(o => o.code));\r\n            finalOptions = [...mappedOptions];\r\n            this.selectedItems.forEach(opt => {\r\n              if (!newCodesSet.has(opt.code)) {\r\n                finalOptions.push(opt);\r\n              }\r\n            });\r\n          }\r\n\r\n          this.localOptionList = finalOptions;\r\n\r\n          const pageSize = pagination.pageSize || 10;\r\n          if (this.dropdownTotalCount > 0) {\r\n            this.hasMoreDropdownPages = (this.localOptionList.length < this.dropdownTotalCount) && (mappedOptions.length > 0);\r\n          } else {\r\n            this.hasMoreDropdownPages = mappedOptions.length >= pageSize;\r\n          }\r\n\r\n          if (!this._isServerSearchActive) {\r\n            this.defaultStateSnapshot = {\r\n              options: [...finalOptions],\r\n              currentPage: this.dropdownCurrentPage,\r\n              totalCount: this.dropdownTotalCount,\r\n              hasMorePages: this.hasMoreDropdownPages\r\n            };\r\n          }\r\n        } else {\r\n          // --- Non-paginated behavior (100% backward compatible) ---\r\n          const newCodesSet = new Set(mappedOptions.map(o => o.code));\r\n          const finalOptions = [...mappedOptions];\r\n          this.selectedItems.forEach(opt => {\r\n            if (!newCodesSet.has(opt.code)) {\r\n              finalOptions.push(opt);\r\n            }\r\n          });\r\n          this.localOptionList = finalOptions;\r\n          this.hasMoreDropdownPages = false;\r\n          if (!this._isServerSearchActive) {\r\n            this.defaultStateSnapshot = {\r\n              options: [...finalOptions],\r\n              currentPage: this.dropdownCurrentPage,\r\n              totalCount: this.dropdownTotalCount,\r\n              hasMorePages: false\r\n            };\r\n          }\r\n        }\r\n\r\n        if (this.isAutocomplete) {\r\n          this.filteredOptions = [...this.localOptionList];\r\n          this._syncAutocompleteDisplayValue();\r\n        }\r\n\r\n        if (this.isDropdown) {\r\n          this.filteredOptionList = [...this.localOptionList];\r\n          // Sticky \"Select All\": a newly-arrived paginated page gets auto-selected too, so\r\n          // selection keeps pace with what's been scrolled/loaded into view.\r\n          if (isLoadMore) {\r\n            this.applySelectAllToLoadedOptions();\r\n          }\r\n        }\r\n      },\r\n      error: err => console.error('Failed to load dropdown options:', err)\r\n    });\r\n  }\r\n\r\n  /** Triggers loading the next page of dropdown options. */\r\n  loadMoreDropdownOptions(): void {\r\n    if (!this.hasMoreDropdownPages || this.isDropdownLoadingMore || this.optionsLoading) return;\r\n    const nextPage = this.dropdownCurrentPage + 1;\r\n    this.loadDropdownOptions(this._latestDependencyValues, nextPage, true);\r\n  }\r\n\r\n  /** Handles scroll event on the dropdown options panel for infiniteScroll mode. */\r\n  onDropdownScroll(event: Event): void {\r\n    const pagination = this.config.optionConfig?.pagination;\r\n    if (!pagination?.enabled || pagination.mode !== 'infiniteScroll') return;\r\n    if (!this.hasMoreDropdownPages || this.isDropdownLoadingMore || this.optionsLoading) return;\r\n\r\n    const element = event.target as HTMLElement;\r\n    if (!element) return;\r\n\r\n    const threshold = 20; // px from bottom\r\n    const atBottom = element.scrollTop + element.clientHeight >= element.scrollHeight - threshold;\r\n\r\n    if (atBottom) {\r\n      this.loadMoreDropdownOptions();\r\n    }\r\n  }\r\n\r\n  private getValueByPath(obj: any, path: string): any {\r\n    if (!path || path === '') return obj;\r\n    return path.split('.').reduce((acc, part) => {\r\n      const match = part.match(/(\\w+)\\[(\\d+)\\]/);\r\n      if (match) return acc?.[match[1]]?.[parseInt(match[2])];\r\n      return acc?.[part];\r\n    }, obj);\r\n  }\r\n\r\n  /**\r\n   * Replaces `{placeholder}` tokens in a URL with values resolved from the\r\n   * current form data (supports dot / array-index paths via getValueByPath).\r\n   * Returns the interpolated URL plus whether EVERY token was resolved.\r\n   *\r\n   * Used by the delete flows: when a required id (e.g. `{entityId}`) is missing\r\n   * — as in CREATE mode before the entity exists — `resolved` is false and the\r\n   * caller skips the server delete and just removes the item from the form.\r\n   */\r\n  private resolveUrlPlaceholders(url: string): { url: string; resolved: boolean } {\r\n    if (!url || !url.includes('{')) return { url, resolved: true };\r\n    const data = this.controller.getAllData();\r\n    let resolved = true;\r\n    const out = url.replace(/\\{([^}]+)\\}/g, (_match, path: string) => {\r\n      const val = this.getValueByPath(data, path.trim());\r\n      if (val === null || val === undefined || val === '') {\r\n        resolved = false;\r\n        return `{${path}}`;\r\n      }\r\n      return String(val);\r\n    });\r\n    return { url: out, resolved };\r\n  }\r\n\r\n  /** Builds HttpHeaders using the token stored in the SmartFormController (sourced from configJSON)\r\n   *  merged with any custom headers declared in optionConfig.headers.\r\n   */\r\n  private _fileLabel(key: keyof FormLabels, fallback: string, vars: Record<string, string> = {}): string {\r\n    let tpl = (this.controller.actionLabels?.[key] as string) ?? fallback;\r\n    Object.entries(vars).forEach(([k, v]) => { tpl = tpl.replace(`{${k}}`, v); });\r\n    return tpl;\r\n  }\r\n\r\n  private getHeaders(customHeaders?: { [key: string]: string }): HttpHeaders {\r\n    let headers = new HttpHeaders();\r\n    const token = this.controller?.token;\r\n    if (token) {\r\n      const headerName = this.controller?.tokenHeader || 'Authorization';\r\n      headers = headers.set(headerName, token);\r\n    }\r\n    // Merge custom headers from optionConfig (allows MFE to pass e.g. X-SESSIONID)\r\n    if (customHeaders) {\r\n      Object.entries(customHeaders).forEach(([key, val]) => {\r\n        if (val !== undefined && val !== null) {\r\n          headers = headers.set(key, val);\r\n        }\r\n      });\r\n    }\r\n    return headers;\r\n  }\r\n\r\n  updateValue(newValue: any): void {\r\n    if (!this.config.name) return;\r\n    const control = this.formGroup.get(this.config.name);\r\n    if (control) {\r\n      control.setValue(newValue);\r\n      control.markAsDirty();\r\n      control.markAsTouched();\r\n    }\r\n  }\r\n\r\n  onCheckboxListChange(code: string, checked: boolean): void {\r\n    if (!this.config.name) return;\r\n    if (!checked) {\r\n      // Manually deselecting one item breaks the \"everything loaded is selected\" invariant —\r\n      // stop auto-including future paginated pages until Select All is explicitly re-toggled.\r\n      this._selectAllActive = false;\r\n    }\r\n    const currentValue = (this.allowMulti\r\n      ? (this.formGroup.get(this.config.name)?.value)\r\n      : this.controller.getFieldValue(this.config.name)) || [];\r\n    const newValue = checked\r\n      ? [...currentValue, code]\r\n      : currentValue.filter((c: string) => c !== code);\r\n    this.updateValue(newValue);\r\n  }\r\n\r\n  isChecked(code: string): boolean {\r\n    const value = this.value || [];\r\n    return Array.isArray(value) && value.some(v => String(v) === String(code));\r\n  }\r\n\r\n  get errorMessage(): string {\r\n    if (!this.config.name || !this.formGroup) return '';\r\n    const control = this.formGroup.get(this.config.name);\r\n    if (control && control.invalid && (control.touched || control.dirty)) {\r\n      if (control.hasError('required')) return 'This field is required';\r\n      if (control.hasError('email')) return 'Invalid email format';\r\n      if (control.hasError('passwordMismatch')) return 'Passwords do not match';\r\n      if (control.hasError('formulaError')) return this.config.errorMessage || 'Invalid value';\r\n      if (control.hasError('minlength')) return `Minimum length is ${control.errors?.['minlength'].requiredLength} characters`;\r\n      if (control.hasError('maxlength')) return `Maximum length is ${control.errors?.['maxlength'].requiredLength} characters`;\r\n      if (control.hasError('min')) return `Minimum value is ${control.errors?.['min'].min}`;\r\n      if (control.hasError('max')) return `Maximum value is ${control.errors?.['max'].max}`;\r\n      if (control.hasError('pattern')) return this.config.textConfig?.patternMessage || 'Invalid format';\r\n    }\r\n    return '';\r\n  }\r\n\r\n  get showCharCount(): boolean {\r\n    if (this.isTextField && this.config.subType !== 'PHONE') {\r\n      return !!(this.config.textConfig?.showCharCount && this.config.textConfig?.length?.max);\r\n    }\r\n    if (this.isRichText) {\r\n      return !!(this.config.richTextConfig?.showCharCount && this.config.richTextConfig?.maxLength);\r\n    }\r\n    return false;\r\n  }\r\n\r\n  get remainingCharacters(): number | null {\r\n    if (!this.showCharCount || !this.formGroup || !this.config.name) return null;\r\n    const currentVal = this.formGroup.get(this.config.name)?.value || '';\r\n\r\n    if (this.isTextField && this.config.textConfig?.length?.max) {\r\n      return Math.max(0, this.config.textConfig.length.max - currentVal.length);\r\n    }\r\n    if (this.isRichText && this.config.richTextConfig?.maxLength) {\r\n      const plainText = String(currentVal).replace(/<[^>]*>/g, '');\r\n      return Math.max(0, this.config.richTextConfig.maxLength - plainText.length);\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // ── RICH_TEXT toolbar ──────────────────────────────────────────────────\r\n\r\n  private static readonly RICH_TEXT_TOKEN_MAP: { [key: string]: any } = {\r\n    bold: 'bold',\r\n    italic: 'italic',\r\n    underline: 'underline',\r\n    strike: 'strike',\r\n    blockquote: 'blockquote',\r\n    code: 'code-block',\r\n    link: 'link',\r\n    image: 'image',\r\n    video: 'video',\r\n    clean: 'clean',\r\n    font: { font: [] },\r\n    size: { size: ['small', false, 'large', 'huge'] },\r\n    color: { color: [] },\r\n    background: { background: [] },\r\n    align: { align: [] },\r\n    header1: { header: 1 },\r\n    header2: { header: 2 },\r\n    orderedList: { list: 'ordered' },\r\n    bulletList: { list: 'bullet' },\r\n    subscript: { script: 'sub' },\r\n    superscript: { script: 'super' },\r\n    indentMinus: { indent: '-1' },\r\n    indentPlus: { indent: '+1' }\r\n  };\r\n\r\n  private static readonly DEFAULT_RICH_TEXT_HEADER: string[] =\r\n    ['bold', 'italic', 'underline', 'font', 'size', 'color', 'link', 'image', 'video'];\r\n\r\n  /**\r\n   * Builds the ngx-quill `modules.toolbar` config from `richTextConfig.headerConfig`\r\n   * (a flat list of tokens) falling back to a curated default set.\r\n   * Consecutive simple (button) tokens are grouped together; dropdown-style\r\n   * tokens (font/size/color/...) each get their own group, matching Quill's\r\n   * expected toolbar shape.\r\n   */\r\n  get richTextModules(): any {\r\n    const tokens = this.config.richTextConfig?.headerConfig?.length\r\n      ? this.config.richTextConfig.headerConfig\r\n      : FormFieldComponent.DEFAULT_RICH_TEXT_HEADER;\r\n\r\n    const groups: any[] = [];\r\n    let currentGroup: any[] = [];\r\n\r\n    tokens.forEach(token => {\r\n      const entry = FormFieldComponent.RICH_TEXT_TOKEN_MAP[token];\r\n      if (entry === undefined) return;\r\n      if (typeof entry === 'string') {\r\n        currentGroup.push(entry);\r\n      } else {\r\n        if (currentGroup.length) {\r\n          groups.push(currentGroup);\r\n          currentGroup = [];\r\n        }\r\n        groups.push([entry]);\r\n      }\r\n    });\r\n    if (currentGroup.length) groups.push(currentGroup);\r\n\r\n    return { toolbar: groups.length ? groups : false };\r\n  }\r\n\r\n  // ── DROPDOWN helpers (single + multi) ─────────────────────────────────────\r\n\r\n  /**\r\n   * Preferred positions for the custom dropdown panels, rendered in a CDK\r\n   * connected overlay so they escape a scrollable modal body (cc-confirmation-modal)\r\n   * instead of being clipped behind its footer. Opens below the trigger, flipping\r\n   * above when there isn't room.\r\n   */\r\n  readonly dropdownOverlayPositions: ConnectedPosition[] = [\r\n    { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\r\n    { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\r\n  ];\r\n\r\n  /**\r\n   * Close the dropdown when the CDK overlay reports a click outside the panel.\r\n   * Clicks on the trigger itself are ignored here so the trigger's own toggle\r\n   * handler can close it (otherwise the two would fight and re-open it).\r\n   */\r\n  onDropdownOverlayOutsideClick(event: MouseEvent, triggerEl: HTMLElement): void {\r\n    if (triggerEl && triggerEl.contains(event.target as Node)) {\r\n      return;\r\n    }\r\n    this.isMultiDropdownOpen = false;\r\n    this.isSingleDropdownOpen = false;\r\n    this.resetDropdownSearch();\r\n  }\r\n\r\n  dropdownOverlayWidth: number | string = 'auto';\r\n\r\n  toggleMultiDropdown(event: MouseEvent, triggerEl?: HTMLElement): void {\r\n    event.stopPropagation();\r\n    if (triggerEl) {\r\n      this.dropdownOverlayWidth = triggerEl.offsetWidth || 'auto';\r\n    }\r\n    this.isMultiDropdownOpen = !this.isMultiDropdownOpen;\r\n    if (this.isMultiDropdownOpen) {\r\n      this.resetDropdownSearch();\r\n    }\r\n  }\r\n\r\n  toggleSingleDropdown(event: MouseEvent, triggerEl?: HTMLElement): void {\r\n    event.stopPropagation();\r\n    if (triggerEl) {\r\n      this.dropdownOverlayWidth = triggerEl.offsetWidth || 'auto';\r\n    }\r\n    this.isSingleDropdownOpen = !this.isSingleDropdownOpen;\r\n    if (this.isSingleDropdownOpen) {\r\n      this.resetDropdownSearch();\r\n    }\r\n  }\r\n\r\n  selectSingleOption(option: any): void {\r\n    // A disabled dropdown still opens so the user can read what's set — but the\r\n    // options are locked, exactly like the disabled checkboxes in MULTIPLE mode.\r\n    if (this.config.disabled) return;\r\n    this.updateValue(option.code);\r\n    this.isSingleDropdownOpen = false;\r\n    this.resetDropdownSearch(false);\r\n  }\r\n\r\n  @HostListener('document:click')\r\n  onDocumentClick(): void {\r\n    if (this.isMultiDropdownOpen) {\r\n      this.isMultiDropdownOpen = false;\r\n      this.resetDropdownSearch(false);\r\n    }\r\n    if (this.isSingleDropdownOpen) {\r\n      this.isSingleDropdownOpen = false;\r\n      this.resetDropdownSearch(false);\r\n    }\r\n  }\r\n\r\n  @HostListener('window:resize')\r\n  onWindowResize(): void {\r\n    if (this.isSingleDropdownOpen || this.isMultiDropdownOpen) {\r\n      this.isSingleDropdownOpen = false;\r\n      this.isMultiDropdownOpen = false;\r\n      this.resetDropdownSearch(false);\r\n    }\r\n  }\r\n\r\n  @HostListener('document:keydown.escape')\r\n  onEscapeKey(): void {\r\n    this.isMultiDropdownOpen = false;\r\n    this.isSingleDropdownOpen = false;\r\n    this.resetDropdownSearch(false);\r\n  }\r\n\r\n  get multiSelectedCount(): number {\r\n    return Array.isArray(this.value) ? this.value.length : 0;\r\n  }\r\n\r\n  // ── Sibling-instance duplicate prevention (repeater DROPDOWNs) ────────────\r\n\r\n  /** Cache of values currently chosen for this field name by OTHER repeater instances.\r\n   *  Only reassigned (a new Set) when siblingFormArray's value actually changes — see\r\n   *  _setupSiblingExclusion(). Previously this was a getter that rebuilt the Set (and a\r\n   *  second getter that re-filtered the option list) on every change-detection cycle,\r\n   *  handing *ngFor a brand-new array reference every digest — that trips\r\n   *  ExpressionChangedAfterItHasBeenCheckedError in dev builds and made Angular\r\n   *  re-diff/re-render the option list constantly, very visible in a repeater with\r\n   *  several dropdown instances. */\r\n  private _siblingTaken: Set<any> = new Set();\r\n\r\n  /** True when this is a single-select DROPDOWN living inside an allowMulti repeater. */\r\n  private get _excludesSiblingValues(): boolean {\r\n    return this.isDropdown && this.config.subType !== 'MULTI'\r\n      && !!this.siblingFormArray && this.siblingIndex !== null;\r\n  }\r\n\r\n  /** Subscribes to the repeater's FormArray so _siblingTaken is refreshed only when a\r\n   *  sibling instance's value actually changes, not on every change-detection cycle. */\r\n  private _setupSiblingExclusion(): void {\r\n    if (!this._excludesSiblingValues) return;\r\n    this._refreshSiblingTaken();\r\n    this.siblingFormArray!.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n      this._refreshSiblingTaken();\r\n    });\r\n  }\r\n\r\n  private _refreshSiblingTaken(): void {\r\n    const taken = new Set<any>();\r\n    this.siblingFormArray!.controls.forEach((ctrl, i) => {\r\n      if (i === this.siblingIndex) return;\r\n      const v = (ctrl as FormGroup).get(this.config.name!)?.value;\r\n      if (v !== null && v !== undefined && v !== '') taken.add(v);\r\n    });\r\n    this._siblingTaken = taken;\r\n  }\r\n\r\n  /** Memoized per source list: only recomputes (and hands *ngFor a new array reference)\r\n   *  when the source list, the taken set, or this field's own value actually changed. */\r\n  private _displayListMemo: { [key: string]: { src: any[]; taken: Set<any>; ownValue: any; result: any[] } } = {};\r\n\r\n  private _excludeTaken(list: any[], memoKey: string): any[] {\r\n    if (!this._excludesSiblingValues || !list?.length) return list;\r\n    const ownValue = this.value;\r\n    const cached = this._displayListMemo[memoKey];\r\n    if (cached && cached.src === list && cached.taken === this._siblingTaken && cached.ownValue === ownValue) {\r\n      return cached.result;\r\n    }\r\n    const result = list.filter(opt => opt.code === ownValue || !this._siblingTaken.has(opt.code));\r\n    this._displayListMemo[memoKey] = { src: list, taken: this._siblingTaken, ownValue, result };\r\n    return result;\r\n  }\r\n\r\n  /** Options for the custom single-select dropdown, with sibling-taken values hidden. */\r\n  get displayOptionList(): any[] {\r\n    return this._excludeTaken(this.filteredOptionList, 'option');\r\n  }\r\n\r\n  /** Options for the native <select>/radio rendering, with sibling-taken values hidden. */\r\n  get displayLocalOptionList(): any[] {\r\n    return this._excludeTaken(this.localOptionList, 'local');\r\n  }\r\n\r\n  // ── Dropdown search helpers ───────────────────────────────────────────────\r\n\r\n  /** Initialise the RxJS search stream for dropdown filtering. */\r\n  private initDropdownSearch(): void {\r\n    const searchConfig = this.config.optionConfig?.searchConfig;\r\n    const debounceMs = searchConfig?.debounceTime ?? 300;\r\n\r\n    this.dropdownSearch$.pipe(\r\n      debounceTime(debounceMs),\r\n      distinctUntilChanged(),\r\n      takeUntil(this.destroy$)\r\n    ).subscribe(query => {\r\n      this.executeDropdownSearch(query);\r\n    });\r\n  }\r\n\r\n  /** Execute client-side or server-side dropdown search. */\r\n  private executeDropdownSearch(query: string): void {\r\n    const searchConfig = this.config.optionConfig?.searchConfig;\r\n    const mode = searchConfig?.mode || 'local';\r\n\r\n    // A new search (server or local) narrows to an unrelated result set — don't carry over a\r\n    // prior \"Select All\" and auto-select whatever this new query happens to load/show.\r\n    this._selectAllActive = false;\r\n\r\n    if (mode === 'server') {\r\n      // A dependent field (optionConfig.dependencies) with no parent value yet has nothing to\r\n      // search against — searching now would fire with the parent filter missing entirely and\r\n      // come back with an unfiltered full list. Wait for setupDependencies()'s own load instead.\r\n      if (!this._dependenciesSatisfied) return;\r\n\r\n      const searchKey = searchConfig?.searchKey || (searchConfig?.handling === 'nested_string' ? 'SEARCH_TEXT' : 'search');\r\n      const minLen = searchConfig?.minSearchLength ?? 3;\r\n\r\n      if (query.length >= minLen) {\r\n        this._isServerSearchActive = true;\r\n        const params = { ...this._latestDependencyValues, [searchKey]: query };\r\n        this.dropdownCurrentPage = 0;\r\n        this.loadDropdownOptions(params, 0, false);\r\n      } else if (query.length === 0) {\r\n        this._isServerSearchActive = false;\r\n        if (this.defaultStateSnapshot.options.length > 0) {\r\n          this.restoreDefaultOptionList();\r\n        } else {\r\n          this.dropdownCurrentPage = 0;\r\n          this.loadDropdownOptions(this._latestDependencyValues, 0, false);\r\n        }\r\n      }\r\n    } else {\r\n      // Local filtering\r\n      if (!query || query.trim().length === 0) {\r\n        this.filteredOptionList = [...this.localOptionList];\r\n      } else {\r\n        const q = query.toLowerCase().trim();\r\n        this.filteredOptionList = this.localOptionList.filter(opt =>\r\n          opt.label?.toLowerCase().includes(q) ||\r\n          String(opt.code).toLowerCase().includes(q)\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  /** Restores localOptionList and pagination metadata from defaultStateSnapshot, preserving selected item(s) */\r\n  private restoreDefaultOptionList(): void {\r\n    if (!this.defaultStateSnapshot.options.length) return;\r\n\r\n    // 1. Restore pagination & metadata\r\n    this.dropdownCurrentPage = this.defaultStateSnapshot.currentPage;\r\n    this.dropdownTotalCount = this.defaultStateSnapshot.totalCount;\r\n    this.hasMoreDropdownPages = this.defaultStateSnapshot.hasMorePages;\r\n\r\n    // 2. Restore options array with selected items preserved\r\n    const defaultCodes = new Set(this.defaultStateSnapshot.options.map(o => o.code));\r\n    const merged = [...this.defaultStateSnapshot.options];\r\n    this.selectedItems.forEach(opt => {\r\n      if (!defaultCodes.has(opt.code)) {\r\n        merged.push(opt);\r\n      }\r\n    });\r\n    this.localOptionList = merged;\r\n    this.filteredOptionList = [...this.localOptionList];\r\n    if (this.isAutocomplete) {\r\n      this.filteredOptions = [...this.localOptionList];\r\n    }\r\n  }\r\n\r\n  /** Resets the dropdown search text and filtered list. */\r\n  resetDropdownSearch(forceLoad = true, bypassCache = false): void {\r\n    const wasServerSearch = this._isServerSearchActive;\r\n    this.searchText = '';\r\n    this._isServerSearchActive = false;\r\n\r\n    const searchConfig = this.config.optionConfig?.searchConfig;\r\n    if (searchConfig?.enabled && searchConfig?.mode === 'server') {\r\n      if (this.defaultStateSnapshot.options.length > 0) {\r\n        this.restoreDefaultOptionList();\r\n      } else if (forceLoad && this._dependenciesSatisfied && (bypassCache || wasServerSearch || this.localOptionList.length === 0)) {\r\n        this.dropdownCurrentPage = 0;\r\n        this.loadDropdownOptions(this._latestDependencyValues, 0, false);\r\n      } else {\r\n        this.filteredOptionList = [...this.localOptionList];\r\n      }\r\n    } else {\r\n      this.filteredOptionList = [...this.localOptionList];\r\n    }\r\n  }\r\n\r\n  /** Merges option(s) from selectedOptionsData into the local dropdown options list */\r\n  mergeSelectedOptionsIntoList(): void {\r\n    if (!this.config.name || !(this.isDropdown || this.isAutocomplete)) return;\r\n\r\n    const data = this.controller.selectedOptionsData?.[this.config.name];\r\n    if (!data) return;\r\n\r\n    const parsed: any[] = [];\r\n    if (Array.isArray(data)) {\r\n      data.forEach(item => {\r\n        const opt = this.parseSingleOptionObject(item);\r\n        if (opt) parsed.push(opt);\r\n      });\r\n    } else {\r\n      const opt = this.parseSingleOptionObject(data);\r\n      if (opt) parsed.push(opt);\r\n    }\r\n\r\n    if (parsed.length > 0) {\r\n      this.selectedItems = parsed;\r\n      this.addParsedOptions(parsed);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * If the field's initial value is a primitive (not an object) and no\r\n   * selectedOptionsData was provided, uses lookupConfig to fire a targeted\r\n   * API call to resolve the display label for edit-mode prefilling.\r\n   */\r\n  private _resolveLookupIfNeeded(): void {\r\n    if (!(this.isDropdown || this.isAutocomplete)) return;\r\n\r\n    const fieldName = this.config.name;\r\n    if (!fieldName) return;\r\n\r\n    const lookup = this.config.optionConfig?.lookupConfig;\r\n    if (!lookup?.apiUrl) return;\r\n\r\n    // Skip if selectedOptionsData already provided a pre-seeded object\r\n    if (this.controller.selectedOptionsData?.[fieldName]) return;\r\n\r\n    // Skip only if selectedItems were already resolved with real option objects (object initialValue)\r\n    const hasFullyResolvedItems = this.selectedItems.length > 0 &&\r\n      this.selectedItems.every(item => item.value !== undefined && item.label !== String(item.code));\r\n    if (hasFullyResolvedItems) return;\r\n\r\n    const rawValue = this.controller.getFieldValue(fieldName);\r\n    if (rawValue === null || rawValue === undefined || rawValue === '') return;\r\n\r\n    // Determine if the value is primitive(s) that need resolution\r\n    const isArray = Array.isArray(rawValue);\r\n    const isPrimitive = !isArray && (typeof rawValue !== 'object');\r\n    const isArrayOfPrimitives = isArray && rawValue.length > 0 &&\r\n      rawValue.every((v: any) => typeof v !== 'object');\r\n\r\n    if (!isPrimitive && !isArrayOfPrimitives) return;\r\n\r\n    // Build the HTTP request\r\n    const method = (lookup.apiMethod || 'GET').toUpperCase();\r\n    const paramName = lookup.paramName || (isArrayOfPrimitives ? 'ids' : 'id');\r\n    const lookupDataPath = lookup.dataPath ?? this.config.optionConfig?.dataPath;\r\n    const headers = this.getHeaders(lookup.headers);\r\n\r\n    let request$: Observable<any>;\r\n\r\n    if (!isArrayOfPrimitives && lookup.apiUrl.includes('{value}')) {\r\n      // Single GET with URL placeholder: /api/users/{value}\r\n      const url = lookup.apiUrl.replace('{value}', encodeURIComponent(String(rawValue)));\r\n      request$ = method === 'POST'\r\n        ? this.http.post<any>(url, lookup.apiPayload || {}, { headers })\r\n        : this.http.get<any>(url, { headers });\r\n    } else if (method === 'POST') {\r\n      const isArrayPayload = Array.isArray(lookup.apiPayload);\r\n      if (isArrayPayload && lookup.paramName) {\r\n        const paramName = lookup.paramName;\r\n        // Query param POST: append paramName query params to URL and send array body (apiPayload)\r\n        const separator = lookup.apiUrl.includes('?') ? '&' : '?';\r\n        let queryParams = '';\r\n        if (isArrayOfPrimitives) {\r\n          queryParams = (rawValue as any[])\r\n            .map(v => `${encodeURIComponent(paramName)}=${encodeURIComponent(String(v))}`)\r\n            .join('&');\r\n        } else {\r\n          queryParams = `${encodeURIComponent(paramName)}=${encodeURIComponent(String(rawValue))}`;\r\n        }\r\n        const url = `${lookup.apiUrl}${separator}${queryParams}`;\r\n        request$ = this.http.post<any>(url, lookup.apiPayload, { headers });\r\n      } else if (!lookup.paramName) {\r\n        // Direct body array POST (e.g. Center Types / Beneficiary Types): send raw IDs directly as POST body\r\n        const body = isArrayOfPrimitives ? rawValue : [rawValue];\r\n        request$ = this.http.post<any>(lookup.apiUrl, body, { headers });\r\n      } else {\r\n        // Body object POST: merge value into apiPayload body object\r\n        const value = isArrayOfPrimitives ? rawValue : rawValue;\r\n        const body = { ...(lookup.apiPayload || {}), [paramName]: value };\r\n        request$ = this.http.post<any>(lookup.apiUrl, body, { headers });\r\n      }\r\n    } else {\r\n      // GET: append as query parameter\r\n      const queryVal = isArrayOfPrimitives ? rawValue.join(',') : String(rawValue);\r\n      const separator = lookup.apiUrl.includes('?') ? '&' : '?';\r\n      const url = `${lookup.apiUrl}${separator}${paramName}=${encodeURIComponent(queryVal)}`;\r\n      request$ = this.http.get<any>(url, { headers });\r\n    }\r\n\r\n    request$.pipe(\r\n      takeUntil(this.destroy$),\r\n      catchError(err => {\r\n        console.warn(`[SmartForm] lookupConfig resolution failed for field \"${fieldName}\":`, err);\r\n        return of(null);\r\n      })\r\n    ).subscribe(response => {\r\n      if (!response) return;\r\n\r\n      // Extract data using dataPath\r\n      let items: any;\r\n      if (lookupDataPath) {\r\n        items = this.getValueByPath(response, lookupDataPath);\r\n      } else {\r\n        items = Array.isArray(response) ? response : response;\r\n      }\r\n\r\n      // Normalize to array\r\n      const itemArray = Array.isArray(items) ? items : [items];\r\n\r\n      // Parse using existing parseSingleOptionObject\r\n      const parsed = itemArray\r\n        .map((item: any) => this.parseSingleOptionObject(item))\r\n        .filter((opt: any): opt is NonNullable<typeof opt> => !!opt);\r\n\r\n      if (parsed.length > 0) {\r\n        this.selectedItems = parsed;\r\n        this.addParsedOptions(parsed);\r\n\r\n        // Sync autocomplete display value\r\n        if (this.isAutocomplete) {\r\n          this._syncAutocompleteDisplayValue();\r\n        }\r\n\r\n        this.cdr.markForCheck();\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Extracts option(s) and their corresponding raw codes from an initial value object or array of objects.\r\n   * If the value is a primitive but initialLabelField is configured, it looks up the sibling field value.\r\n   */\r\n  private extractInitialOption(val: any): { code: any; parsedOptions: any[] } | null {\r\n    if (val === null || val === undefined || val === '') return null;\r\n\r\n    // Check if it's an array of items (e.g. for MULTIPLE dropdown)\r\n    if (Array.isArray(val)) {\r\n      const parsedOptions: any[] = [];\r\n      const codes: any[] = [];\r\n      let hasObjects = false;\r\n\r\n      val.forEach(item => {\r\n        const parsed = this.parseSingleOptionObject(item);\r\n        if (parsed) {\r\n          parsedOptions.push(parsed);\r\n          codes.push(parsed.code);\r\n          hasObjects = true;\r\n        } else {\r\n          codes.push(item);\r\n        }\r\n      });\r\n\r\n      if (hasObjects) {\r\n        return { code: codes, parsedOptions };\r\n      }\r\n      return null;\r\n    }\r\n\r\n    // Single item\r\n    const parsed = this.parseSingleOptionObject(val);\r\n    if (parsed) {\r\n      return { code: parsed.code, parsedOptions: [parsed] };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private parseSingleOptionObject(item: any): { code: any; label: string; value?: any } | null {\r\n    if (item && typeof item === 'object' && !Array.isArray(item)) {\r\n      // Avoid parsing File, Date, UploadedFile, or MediaItem\r\n      if (item instanceof Date || 'file' in item || 'mediaType' in item) {\r\n        return null;\r\n      }\r\n\r\n      const optionConfig = this.config.optionConfig;\r\n      const acConfig = this.config.autocompleteConfig;\r\n\r\n      // Extract code/value using valuePath or fallback\r\n      let code: any;\r\n      if (optionConfig?.valuePath) {\r\n        code = this.getValueByPath(item, optionConfig.valuePath);\r\n      } else {\r\n        code = item.code !== undefined ? item.code : (item.id !== undefined ? item.id : item.value);\r\n      }\r\n\r\n      // Extract label using labelTemplate, labelPath, or fallback\r\n      let label: string;\r\n      const labelTemplate = acConfig?.labelTemplate;\r\n      if (labelTemplate) {\r\n        label = labelTemplate.replace(/\\{(\\w+)\\}/g, (_: string, key: string) => {\r\n          const val = this.getValueByPath(item, key);\r\n          return val !== undefined && val !== null ? String(val) : '';\r\n        });\r\n      } else if (optionConfig?.labelPath) {\r\n        label = String(this.getValueByPath(item, optionConfig.labelPath) ?? '');\r\n      } else {\r\n        const fallbackLabel = item.label !== undefined ? item.label : (item.displayName !== undefined ? item.displayName : item.name);\r\n        if (Array.isArray(fallbackLabel)) {\r\n          const first = fallbackLabel[0];\r\n          label = first ? String(first.text || first.label || first.name || JSON.stringify(first)) : '';\r\n        } else {\r\n          label = fallbackLabel !== undefined && fallbackLabel !== null ? String(fallbackLabel) : '';\r\n        }\r\n      }\r\n\r\n      if (code !== undefined && code !== null) {\r\n        return { code, label, value: item };\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  private addParsedOptions(options: any[]): void {\r\n    let updated = false;\r\n    options.forEach(opt => {\r\n      const exists = this.localOptionList.some(o => o.code === opt.code);\r\n      if (!exists) {\r\n        const item = {\r\n          label: opt.label,\r\n          code: opt.code,\r\n          value: opt.value || opt\r\n        };\r\n        this.localOptionList.push(item);\r\n        if (!this.defaultStateSnapshot.options.some(o => o.code === opt.code)) {\r\n          this.defaultStateSnapshot.options.push(item);\r\n        }\r\n        updated = true;\r\n      }\r\n    });\r\n    if (updated) {\r\n      this.filteredOptionList = [...this.localOptionList];\r\n      if (this.isAutocomplete) {\r\n        this.filteredOptions = [...this.localOptionList];\r\n        this._syncAutocompleteDisplayValue();\r\n      }\r\n    }\r\n  }\r\n\r\n  private updateSelectedItems(codes: any[]): void {\r\n    const newSelectedItems: any[] = [];\r\n    codes.forEach(code => {\r\n      let match = this.selectedItems.find(o => String(o.code) === String(code));\r\n      if (!match) {\r\n        match = this.localOptionList.find(o => String(o.code) === String(code));\r\n      }\r\n      if (match) {\r\n        newSelectedItems.push(match);\r\n      } else {\r\n        newSelectedItems.push({ code, label: String(code) });\r\n      }\r\n    });\r\n    this.selectedItems = newSelectedItems;\r\n\r\n    // Push the resolved full objects to the controller for non-repeater fields\r\n    if (!this.allowMulti && this.config.name) {\r\n      if (this.config.subType !== 'MULTIPLE') {\r\n        const fullObj = this.selectedItems[0]?.value ?? null;\r\n        this.controller.updateField(`_val_${this.config.name}`, fullObj);\r\n      } else {\r\n        const fullObjs = this.selectedItems.map(item => item.value).filter(Boolean);\r\n        this.controller.updateField(`_val_${this.config.name}`, fullObjs);\r\n      }\r\n    }\r\n  }\r\n\r\n  // ── Select All helpers ────────────────────────────────────────────────────\r\n\r\n  /** Returns true if every option in the current filtered list is selected. */\r\n  isAllSelected(): boolean {\r\n    if (!this.filteredOptionList.length) return false;\r\n    const currentValue: any[] = Array.isArray(this.value) ? this.value : [];\r\n    return this.filteredOptionList.every(opt => currentValue.includes(opt.code));\r\n  }\r\n\r\n  /** Returns true if some (but not all) filtered options are selected — for indeterminate state. */\r\n  isSomeSelected(): boolean {\r\n    if (!this.filteredOptionList.length) return false;\r\n    const currentValue: any[] = Array.isArray(this.value) ? this.value : [];\r\n    const selectedCount = this.filteredOptionList.filter(opt => currentValue.includes(opt.code)).length;\r\n    return selectedCount > 0 && selectedCount < this.filteredOptionList.length;\r\n  }\r\n\r\n  /** Toggles selection of all filtered options. */\r\n  toggleSelectAll(checked: boolean): void {\r\n    if (!this.config.name) return;\r\n    this._selectAllActive = checked;\r\n    const currentValue: any[] = Array.isArray(this.value) ? [...this.value] : [];\r\n    const filteredCodes = this.filteredOptionList.map(opt => opt.code);\r\n\r\n    let newValue: any[];\r\n    if (checked) {\r\n      // Add all filtered codes that are not already selected\r\n      const toAdd = filteredCodes.filter(code => !currentValue.includes(code));\r\n      newValue = [...currentValue, ...toAdd];\r\n    } else {\r\n      // Remove only filtered codes from the selection\r\n      newValue = currentValue.filter(code => !filteredCodes.includes(code));\r\n    }\r\n    this.updateValue(newValue);\r\n  }\r\n\r\n  /** Merges every currently-loaded filtered option into the selection — used to keep an\r\n   *  already-active \"Select All\" in sync as more paginated pages arrive (see loadDropdownOptions). */\r\n  private applySelectAllToLoadedOptions(): void {\r\n    if (!this.config.name || !this._selectAllActive) return;\r\n    const currentValue: any[] = Array.isArray(this.value) ? this.value : [];\r\n    const filteredCodes = this.filteredOptionList.map(opt => opt.code);\r\n    const toAdd = filteredCodes.filter(code => !currentValue.includes(code));\r\n    if (toAdd.length === 0) return;\r\n    this.updateValue([...currentValue, ...toAdd]);\r\n  }\r\n\r\n  // ── Type guards ──────────────────────────────────────────────────────────\r\n\r\n  get isTextField(): boolean { return this.config.type === 'TEXT_INPUT'; }\r\n  get isNumberField(): boolean { return this.config.type === 'NUMBER_INPUT'; }\r\n  get isDateField(): boolean { return this.config.type === 'DATE'; }\r\n  get isTimeField(): boolean { return this.config.type === 'TIME'; }\r\n  get isWheelVariant(): boolean {\r\n    return this.config.type === 'TIME' && this.config.timeConfig?.variant === 'wheel';\r\n  }\r\n\r\n  get timePickerLabels(): TimePickerLabels {\r\n    const labels = this.controller.labels || {};\r\n    return {\r\n      selectTimeTitle: labels['TIME_PICKER.SELECT_TIME'],\r\n      hourLabel:       labels['TIME_PICKER.HOUR'],\r\n      minuteLabel:     labels['TIME_PICKER.MINUTE'],\r\n      periodLabel:     labels['TIME_PICKER.PERIOD'],\r\n      amLabel:         labels['TIME_PICKER.AM'],\r\n      pmLabel:         labels['TIME_PICKER.PM'],\r\n      confirmLabel:    labels['COMMON.ACTIONS.CONFIRM'],\r\n      cancelLabel:     labels['COMMON.ACTIONS.CANCEL'],\r\n    };\r\n  }\r\n  get isDropdown(): boolean { return this.config.type === 'DROPDOWN'; }\r\n  get isAutocomplete(): boolean { return this.config.type === 'AUTOCOMPLETE'; }\r\n  get isFileUpload(): boolean { return this.config.type === 'FILE_UPLOAD'; }\r\n  get isMediaUpload(): boolean { return this.config.type === 'MEDIA_UPLOAD'; }\r\n  get isRadio(): boolean { return this.config.type === 'RADIO'; }\r\n  get isCheckbox(): boolean { return this.config.type === 'CHECKBOX'; }\r\n  get isChip(): boolean { return this.config.type === 'CHIP'; }\r\n  get isSwitch(): boolean { return this.config.type === 'SWITCH'; }\r\n  get isRating(): boolean { return this.config.type === 'RATING'; }\r\n  get isRichText(): boolean { return this.config.type === 'RICH_TEXT'; }\r\n  get isGenerated(): boolean { return this.config.type === 'GENERATED'; }\r\n  get isRow(): boolean { return this.config.type === 'ROW'; }\r\n  get isGroup(): boolean { return this.config.type === 'GROUP'; }\r\n  get isLocation(): boolean { return this.config.type === 'LOCATION'; }\r\n  get isLinkList(): boolean { return this.config.type === 'LINK_LIST'; }\r\n\r\n  // ── AUTOCOMPLETE helpers ────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Initialise the separate display-control that drives the mat-autocomplete\r\n   * text input.  The real form control always stores the *code* value.\r\n   */\r\n  private initAutocomplete(): void {\r\n    // Sync display input whenever the real control value changes externally\r\n    this._syncAutocompleteDisplayValue();\r\n\r\n    // Read search settings from autocompleteConfig (preferred) — no fallback to optionConfig needed\r\n    const acConfig = this.config.autocompleteConfig;\r\n    const searchParam = acConfig?.searchParam || acConfig?.searchKey;\r\n    const minLength = acConfig?.searchMinLength ?? 1;\r\n    const debounceMs = acConfig?.searchDebounce ?? (searchParam ? 300 : 150);\r\n\r\n    // Filter the option list as the user types\r\n    this.autocompleteInputCtrl.valueChanges\r\n      .pipe(\r\n        debounceTime(debounceMs),\r\n        distinctUntilChanged(),\r\n        takeUntil(this.destroy$)\r\n      )\r\n      .subscribe(search => {\r\n        const query = typeof search === 'string' ? search : '';\r\n\r\n        if (searchParam) {\r\n          if (query.length >= minLength) {\r\n            // Trigger server-side search merged with active dependencies\r\n            const params = { ...this._latestDependencyValues, [searchParam]: query };\r\n            this.loadDropdownOptions(params);\r\n          } else {\r\n            // If query is below min length, revert to existing full list if empty query\r\n            this.filteredOptions = query.length === 0 ? [...this.localOptionList] : [];\r\n          }\r\n        } else {\r\n          // Local filter\r\n          this.filteredOptions = this._filterOptions(query);\r\n        }\r\n      });\r\n\r\n    // Initialise filtered list with all available options\r\n    this.filteredOptions = [...this.localOptionList];\r\n  }\r\n\r\n  /** Filter options by the user's search text (matches label or code). */\r\n  private _filterOptions(search: string): { label: string; code: any }[] {\r\n    const q = search.toLowerCase().trim();\r\n    if (!q) return [...this.localOptionList];\r\n    return this.localOptionList.filter(opt =>\r\n      opt.label?.toLowerCase().includes(q) ||\r\n      String(opt.code).toLowerCase().includes(q)\r\n    );\r\n  }\r\n\r\n  /** Put the human-readable label into the display control based on the stored code. */\r\n  private _syncAutocompleteDisplayValue(): void {\r\n    if (!this.config.name) return;\r\n    const code = this.formGroup?.get(this.config.name)?.value;\r\n    if (code === null || code === undefined || code === '') return;\r\n    const matched = this.localOptionList.find(o => o.code === code);\r\n    if (matched) {\r\n      this.autocompleteInputCtrl.setValue(matched.label, { emitEvent: false });\r\n    }\r\n  }\r\n\r\n  /** Called when user picks an option from the mat-autocomplete panel. */\r\n  onAutocompleteSelected(option: { label: string; code: any }): void {\r\n    this.autocompleteInputCtrl.setValue(option.label, { emitEvent: false });\r\n    this.updateValue(option.code);\r\n  }\r\n\r\n  /** Called when the input loses focus — clear display & value if text was manually deleted. */\r\n  onAutocompleteClear(): void {\r\n    const display = (this.autocompleteInputCtrl.value || '').trim();\r\n    if (!display) {\r\n      this.updateValue(null);\r\n    } else {\r\n      // Restore label from stored code (prevents partial text staying)\r\n      this._syncAutocompleteDisplayValue();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns the effective grid column span for a child inside a ROW.\r\n   * If the child declares an explicit colSpan, use it.\r\n   * Otherwise divide 12 equally among all children (floor, min 1).\r\n   */\r\n  getChildColSpan(child: FieldConfig): number {\r\n    if (child.colSpan) return child.colSpan;\r\n    const count = this.config.children?.length || 1;\r\n    return Math.max(1, Math.floor(12 / count));\r\n  }\r\n\r\n  getOptionColSpan(option: any): number {\r\n    const span = option.colSpan || option.colspan;\r\n    if (span) return span;\r\n    const count = this.localOptionList.length || 1;\r\n    return Math.max(1, Math.floor(12 / count));\r\n  }\r\n\r\n  // ── Rating helpers ───────────────────────────────────────────────────────\r\n\r\n  onRatingChange(star: number, event?: MouseEvent): void {\r\n    if (!this.config.name || this.config.disabled) return;\r\n    let newValue = star;\r\n    if (this.config.ratingConfig?.allowHalf && event) {\r\n      const target = event.target as HTMLElement;\r\n      const rect = target.getBoundingClientRect();\r\n      if (event.clientX - rect.left < rect.width / 2) newValue = star - 0.5;\r\n    }\r\n    if (this.value === newValue) newValue = 0;\r\n    this.updateValue(newValue);\r\n  }\r\n\r\n  getStarArray(): number[] {\r\n    const max = this.config.ratingConfig?.maxRating || 5;\r\n    return Array.from({ length: max }, (_, i) => i + 1);\r\n  }\r\n\r\n  isStarHalf(star: number): boolean { return (this.value || 0) === star - 0.5; }\r\n  isStarFilled(star: number): boolean { return (this.value || 0) >= star; }\r\n\r\n  // ── File Upload helpers ──────────────────────────────────────────────────\r\n\r\n  onDragOver(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isDragOver = true;\r\n  }\r\n\r\n  onDragLeave(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isDragOver = false;\r\n  }\r\n\r\n  onFileDrop(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isDragOver = false;\r\n    const files = event.dataTransfer?.files;\r\n    if (files && files.length > 0) {\r\n      this.processFiles(files);\r\n    }\r\n  }\r\n\r\n  onFileSelected(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    if (input.files && input.files.length > 0) {\r\n      this.processFiles(input.files);\r\n    }\r\n    // Reset input so the same file can be re-selected if removed\r\n    input.value = '';\r\n  }\r\n\r\n  private processFiles(files: FileList): void {\r\n    // ── MEDIA_UPLOAD branch — uses attachmentConfig, stores MediaItem[] ─────\r\n    if (this.isMediaUpload) {\r\n      const mediaCfg = this.config.attachmentConfig;\r\n      if (!mediaCfg) return;\r\n      const maxItems = mediaCfg.maxFiles ?? 10;\r\n\r\n      let errorShown = false;\r\n\r\n      Array.from(files).forEach(file => {\r\n        if (this.mediaItems.length >= maxItems) {\r\n          if (!errorShown) {\r\n            this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n            errorShown = true;\r\n          }\r\n          return;\r\n        }\r\n\r\n        const placeholder: MediaItem = { mediaType: 'image', url: '', isUploading: true };\r\n        this._appendMediaItem(placeholder);\r\n        this.controller.fileAdded$.next(file);\r\n\r\n        const formData = new FormData();\r\n        formData.append('file', file);\r\n\r\n        if (!mediaCfg.uploadUrl) return;\r\n        let finalUrl = mediaCfg.uploadUrl;\r\n        if (finalUrl.includes('{fileName}')) {\r\n          finalUrl = finalUrl.replace('{fileName}', encodeURIComponent(file.name));\r\n        }\r\n\r\n        this.http.post<any>(finalUrl, formData, { headers: this.getHeaders() })\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe({\r\n            next: (response: any) => {\r\n              // API returns { completeURL, id, mimeType, fileName, ... }\r\n              const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n              const current: MediaItem[] = [...this.mediaItems];\r\n              const idx = current.indexOf(placeholder);\r\n              if (idx !== -1) {\r\n                current[idx] = {\r\n                  mediaType: 'image',\r\n                  url: resolvedUrl,\r\n                  id: response?.id,\r\n                  mimeType: response?.mimeType,\r\n                  fileName: response?.fileName ?? response?.name,\r\n                  isUploading: false\r\n                };\r\n                this.updateValue(current);\r\n                this.mediaCarouselIndex = current.length - 1;\r\n                this.controller.fileUploadFinished$.next(file);\r\n              }\r\n            },\r\n            error: () => {\r\n              const cleaned = this.mediaItems.filter(m => m !== placeholder);\r\n              this.updateValue(cleaned.length ? cleaned : null);\r\n              this.controller.fileUploadFinished$.next(file);\r\n            }\r\n          });\r\n      });\r\n      return;\r\n    }\r\n\r\n    // ── FILE_UPLOAD branch — uses attachmentConfig, stores UploadedFile[] ────\r\n    this.fileUploadError = '';\r\n    const cfg = this.config.attachmentConfig;\r\n    const maxSizeBytes = (cfg?.maxSizeMB ?? 10) * 1024 * 1024;\r\n    const currentFiles: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n    const maxFiles = cfg?.maxFiles ?? (cfg?.multiple ? 10 : 1);\r\n    const isMultiple = cfg?.multiple ?? false;\r\n\r\n    const incoming = Array.from(files);\r\n\r\n    for (const file of incoming) {\r\n      // File type validation\r\n      if (cfg?.accept) {\r\n        const accepted = cfg.accept.split(',').map((s: string) => s.trim().toLowerCase());\r\n        const fileExt = '.' + file.name.toLowerCase().split('.').pop();\r\n        const fileMime = (file.type || '').toLowerCase();\r\n        const isAllowed = accepted.some((pattern: string) => {\r\n          if (pattern.startsWith('.')) return fileExt === pattern;\r\n          if (pattern.endsWith('/*')) return fileMime.startsWith(pattern.slice(0, -1));\r\n          return fileMime === pattern;\r\n        });\r\n        if (!isAllowed) {\r\n          this.fileUploadError = this._fileLabel('fileTypeError', '\"{fileName}\" is not a supported file type.', { fileName: file.name });\r\n          continue;\r\n        }\r\n      }\r\n      // Size validation\r\n      if (file.size > maxSizeBytes) {\r\n        this.fileUploadError = this._fileLabel('fileSizeError', '\"{fileName}\" exceeds the maximum allowed size of {maxSizeMB} MB.', { fileName: file.name, maxSizeMB: String(cfg?.maxSizeMB ?? 10) });\r\n        continue;\r\n      }\r\n      // Max-files validation\r\n      if (isMultiple && currentFiles.length >= maxFiles) {\r\n        this.fileUploadError = this._fileLabel('maxFilesError', 'Maximum {maxFiles} files allowed.', { maxFiles: String(maxFiles) });\r\n        break;\r\n      }\r\n\r\n      if (cfg?.uploadUrl) {\r\n        // ── API upload path ───────────────────────────────────────────────\r\n        const entry: UploadedFile = {\r\n          name: file.name,\r\n          size: file.size,\r\n          type: file.type,\r\n          file,\r\n          isUploading: true\r\n        };\r\n\r\n        // Add the placeholder entry immediately so the UI shows the progress row\r\n        const withPlaceholder = isMultiple\r\n          ? [...(this.value as UploadedFile[] || []), entry]\r\n          : [entry];\r\n        this.updateValue(withPlaceholder);\r\n        this.controller.fileAdded$.next(file);\r\n\r\n        const formData = new FormData();\r\n        formData.append('file', file);\r\n\r\n        let finalUrl = cfg.uploadUrl;\r\n        if (finalUrl.includes('{fileName}')) {\r\n          finalUrl = finalUrl.replace('{fileName}', encodeURIComponent(file.name));\r\n        }\r\n\r\n        this.http.post<any>(finalUrl, formData, { headers: this.getHeaders() })\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe({\r\n            next: (response: any) => {\r\n              // The API returns a JSON object; use completeURL if present,\r\n              // otherwise fall back to treating the raw response as a URL string.\r\n              const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n              const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n              const idx = current.indexOf(entry);\r\n              if (idx !== -1) {\r\n                const updatedEntry: UploadedFile = { ...entry, dataUrl: resolvedUrl, id: response?.id, isUploading: false };\r\n                const updatedList = [...current];\r\n                updatedList[idx] = updatedEntry;\r\n                this.updateValue(updatedList);\r\n                this.controller.fileUploadFinished$.next(file);\r\n              }\r\n            },\r\n            error: () => {\r\n              // Remove the failed placeholder from the list\r\n              const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n              const cleaned = current.filter(f => f !== entry);\r\n              this.updateValue(cleaned.length ? cleaned : null);\r\n              this.fileUploadError = this._fileLabel('fileUploadFailed', 'Failed to upload \"{fileName}\". Please try again.', { fileName: file.name });\r\n              this.controller.fileUploadFinished$.next(file);\r\n            }\r\n          });\r\n      } else {\r\n        // ── FileReader (base64) fallback path ────────────────────────────\r\n        const reader = new FileReader();\r\n        reader.onload = (e) => {\r\n          const entry: UploadedFile = {\r\n            name: file.name,\r\n            size: file.size,\r\n            type: file.type,\r\n            dataUrl: e.target?.result as string,\r\n            file\r\n          };\r\n          const updated = isMultiple\r\n            ? [...(this.value as UploadedFile[] || []), entry]\r\n            : [entry];\r\n          this.updateValue(updated);\r\n        };\r\n        reader.readAsDataURL(file);\r\n      }\r\n    }\r\n  }\r\n\r\n  removeUploadedFile(index: number): void {\r\n    const current: UploadedFile[] = (this.value as UploadedFile[]) || [];\r\n    const fileToRemove = current[index];\r\n    if (!fileToRemove) return;\r\n\r\n    const removeLocally = () => {\r\n      const updated = current.filter((_, i) => i !== index);\r\n      this.updateValue(updated);\r\n    };\r\n\r\n    const deleteUrl = this.config.attachmentConfig?.deleteUrl;\r\n    const { url: resolvedDeleteUrl, resolved } = deleteUrl\r\n      ? this.resolveUrlPlaceholders(deleteUrl)\r\n      : { url: '', resolved: false };\r\n\r\n    if (fileToRemove.id && fileToRemove.id !== 0 && deleteUrl && resolved) {\r\n      fileToRemove.isUploading = true; // Use this flag to disable the remove button\r\n      this.updateValue([...current]); // trigger UI update\r\n\r\n      let params = new HttpParams();\r\n      if (!resolvedDeleteUrl.includes('attachmentId=')) {\r\n        params = params.set('attachmentId', fileToRemove.id.toString());\r\n      }\r\n      if (!resolvedDeleteUrl.includes('reason=')) {\r\n        // As requested in the API link, the reason is passed\r\n        params = params.set('reason', 'DELETED BY CREATOR');\r\n      }\r\n\r\n      this.http.delete<any>(resolvedDeleteUrl, { headers: this.getHeaders(), params })\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: () => {\r\n            removeLocally();\r\n            this.controller.fileRemoved$.next(fileToRemove);\r\n          },\r\n          error: (err) => {\r\n            console.error('Failed to delete attachment', err);\r\n            fileToRemove.isUploading = false;\r\n            this.fileUploadError = this._fileLabel('fileDeleteFailed', 'Failed to delete \"{fileName}\". Please try again.', { fileName: fileToRemove.name });\r\n            this.updateValue([...current]);\r\n          }\r\n        });\r\n    } else {\r\n      // No id, no deleteUrl, or an unresolved URL placeholder (e.g. {entityId}\r\n      // in CREATE mode): just remove locally, no server delete call.\r\n      removeLocally();\r\n      this.controller.fileRemoved$.next(fileToRemove);\r\n    }\r\n  }\r\n\r\n  getFileIcon(mimeType: string): string {\r\n    if (!mimeType) return 'attach_file';  // guard: undefined/null from non-FILE_UPLOAD values\r\n    if (mimeType.includes('pdf')) return 'picture_as_pdf';\r\n    if (mimeType.includes('image')) return 'image';\r\n    if (mimeType.includes('word') || mimeType.includes('document')) return 'description';\r\n    if (mimeType.includes('sheet') || mimeType.includes('excel') || mimeType.includes('csv')) return 'table_chart';\r\n    if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'folder_zip';\r\n    return 'attach_file';\r\n  }\r\n\r\n  formatFileSize(bytes: number): string {\r\n    if (bytes < 1024) return `${bytes} B`;\r\n    if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n    return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n  }\r\n\r\n  // ── Action Labels ──────────────────────────────────────────────────────────\r\n\r\n  get addLabel(): string {\r\n    const key = this.controller.actionLabels?.addLabel || 'Add';\r\n    return this.controller.labels[key] || key;\r\n  }\r\n\r\n  get removeLabel(): string {\r\n    const key = this.controller.actionLabels?.removeLabel || 'Remove';\r\n    return this.controller.labels[key] || key;\r\n  }\r\n\r\n  // ── MEDIA_UPLOAD helpers ─────────────────────────────────────────────────\r\n\r\n  get mediaItems(): MediaItem[] {\r\n    return (this.value as MediaItem[]) || [];\r\n  }\r\n\r\n  /** Number of active items (used to clamp carousel index) */\r\n  get mediaCount(): number { return this.mediaItems.length; }\r\n\r\n  /** The currently visible carousel item */\r\n  get activeMediaItem(): MediaItem | null {\r\n    if (!this.mediaItems.length) return null;\r\n    return this.mediaItems[Math.min(this.mediaCarouselIndex, this.mediaItems.length - 1)];\r\n  }\r\n\r\n  /** Thumbnail strip items */\r\n  get mediaThumbnails(): MediaItem[] { return this.mediaItems; }\r\n\r\n  mediaCarouselPrev(): void {\r\n    if (this.mediaCarouselIndex > 0) this.mediaCarouselIndex--;\r\n  }\r\n\r\n  mediaCarouselNext(): void {\r\n    if (this.mediaCarouselIndex < this.mediaItems.length - 1) this.mediaCarouselIndex++;\r\n  }\r\n\r\n  mediaGoTo(index: number): void {\r\n    this.mediaCarouselIndex = index;\r\n  }\r\n\r\n  // ── YouTube ──────────────────────────────────────────────────────────────\r\n\r\n  onMediaMenuVideo(): void {\r\n    this.showMediaMenu = false;\r\n    this.showYoutubeInput = !this.showYoutubeInput;\r\n    this.youtubeUrlInput = '';\r\n    this.youtubeUrlError = '';\r\n  }\r\n\r\n  addYoutubeMedia(): void {\r\n    const cfg = this.config.attachmentConfig;\r\n    const maxItems = cfg?.maxFiles ?? 10;\r\n    if (this.mediaItems.length >= maxItems) {\r\n      this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n      return;\r\n    }\r\n\r\n    const url = this.youtubeUrlInput.trim();\r\n    const videoId = this._extractYoutubeId(url);\r\n    if (!videoId) {\r\n      this.youtubeUrlError = this.controller.labels['ERR_INVALID_YOUTUBE_URL'] || 'Please enter a valid YouTube URL.';\r\n      return;\r\n    }\r\n    const item: MediaItem = {\r\n      mediaType: 'youtube',\r\n      url: `https://www.youtube.com/embed/${videoId}`,\r\n      thumbnailUrl: `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`\r\n    };\r\n    this._appendMediaItem(item);\r\n    this.showYoutubeInput = false;\r\n    this.youtubeUrlInput = '';\r\n    this.youtubeUrlError = '';\r\n  }\r\n\r\n  private _extractYoutubeId(url: string): string | null {\r\n    const patterns = [\r\n      /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([\\w-]{11})/,\r\n      /youtube\\.com\\/shorts\\/([\\w-]{11})/\r\n    ];\r\n    for (const p of patterns) {\r\n      const m = url.match(p);\r\n      if (m) return m[1];\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // ── Device upload ────────────────────────────────────────────────────────\r\n\r\n  onMediaMenuDevice(): void {\r\n    this.showMediaMenu = false;\r\n    this.showYoutubeInput = false;\r\n    // Use setTimeout so Angular finishes closing the dropdown before the\r\n    // browser opens the native file picker (the input lives outside *ngIf).\r\n    setTimeout(() => this.mediaDeviceInput?.nativeElement?.click());\r\n  }\r\n\r\n  onMediaFileSelected(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    if (input.files && input.files.length > 0) {\r\n      this.processFiles(input.files);\r\n    }\r\n    input.value = '';\r\n  }\r\n\r\n  // ── Library helpers ──────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Resolves the library-image sync POST endpoint from `attachmentConfig.libraryConfig.uploadConfig`.\r\n   * Returns `null` when not configured; the caller skips the API call.\r\n   */\r\n  private buildLibraryUploadRequest(\r\n    cfg: AttachmentConfig | undefined,\r\n    runtimeContext: Record<string, any>\r\n  ): { baseUrl: string; params: HttpParams } | null {\r\n    const uploadConfig = cfg?.libraryConfig?.uploadConfig;\r\n    if (!uploadConfig) return null;\r\n\r\n    const { baseUrl, params: paramDefs = [] } = uploadConfig;\r\n    let params = new HttpParams();\r\n\r\n    for (const def of paramDefs) {\r\n      let value: string | undefined;\r\n\r\n      // sourcePath takes precedence over staticValue\r\n      if (def.sourcePath) {\r\n        const resolved = def.sourcePath\r\n          .split('.')\r\n          .reduce((obj: Record<string, any>, k: string) => obj?.[k], runtimeContext);\r\n        if (resolved !== null && resolved !== undefined) {\r\n          value = String(resolved);\r\n        }\r\n      }\r\n\r\n      if (!value && def.staticValue) {\r\n        value = def.staticValue;\r\n      }\r\n\r\n      if (def.required && !value) {\r\n        console.warn(`[SmartForm] libraryConfig.uploadConfig: required param \"${def.key}\" could not be resolved.`);\r\n        return null;\r\n      }\r\n\r\n      if (typeof value === 'string') {\r\n        params = params.set(def.key, value);\r\n      }\r\n    }\r\n\r\n    return { baseUrl, params };\r\n  }\r\n\r\n  // ── Library picker ───────────────────────────────────────────────────────\r\n\r\n  /** Config object for the cc-confirmation-modal used as the library picker. */\r\n  get libraryModalConfig(): ConfirmationModalConfig {\r\n    const labels = this.controller.labels;\r\n    return {\r\n      title: labels['LBL_ADD_IMAGES'] || 'Add Images',\r\n      headerTheme: 'dark' as const,\r\n      size: 'lg',\r\n      closeOnBackdrop: true,\r\n      closeOnEsc: true,\r\n      showCloseButton: true,\r\n      cancelButton: {\r\n        show: true,\r\n        label: labels['LBL_CANCEL'] || 'Cancel'\r\n      },\r\n      confirmButton: {\r\n        label: labels['LBL_CONTINUE'] || 'Continue',\r\n        type: 'primary' as const\r\n      }\r\n    };\r\n  }\r\n\r\n  onMediaMenuLibrary(): void {\r\n    this.showMediaMenu = false;\r\n    this.showYoutubeInput = false;\r\n    this.libraryImages = [];\r\n    this.librarySelectedIds = new Set();\r\n    this.libraryError = '';\r\n    this.showLibraryModal = true;\r\n    this._loadLibraryImages();\r\n  }\r\n\r\n  private _loadLibraryImages(): void {\r\n    const cfg = this.config.attachmentConfig;\r\n    const libCfg = cfg?.libraryConfig;\r\n    if (!libCfg?.apiUrl) { this.libraryError = 'Library not configured.'; return; }\r\n    this.libraryLoading = true;\r\n    this.http.get<any>(libCfg.apiUrl, { headers: this.getHeaders() })\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe({\r\n        next: (res: any) => {\r\n          let data: any;\r\n\r\n          if (libCfg.dataPath) {\r\n            // Try explicit dot-notation path configured by the dev (e.g. 'data.items')\r\n            data = this.getValueByPath(res, libCfg.dataPath);\r\n          }\r\n\r\n          // If no array was found at the configured path, try auto-detecting\r\n          // the array from common structures\r\n          if (!Array.isArray(data)) {\r\n            if (Array.isArray(res)) {\r\n              // API returned a plain array\r\n              data = res;\r\n            } else if (res && typeof res === 'object') {\r\n              // API returned an object keyed by entity-id e.g. { \"1\": [...], \"2\": [...] }\r\n              // Flatten all value-arrays into one list\r\n              data = (Object.values(res) as any[][])\r\n                .filter(v => Array.isArray(v))\r\n                .reduce((acc, arr) => acc.concat(arr), []);\r\n            }\r\n          }\r\n\r\n          this.libraryImages = Array.isArray(data) ? data : [];\r\n          this.libraryLoading = false;\r\n        },\r\n        error: () => {\r\n          this.libraryError = this.controller.labels['ERR_LIBRARY_LOAD_FAILED'] || 'Failed to load library images.';\r\n          this.libraryLoading = false;\r\n        }\r\n      });\r\n  }\r\n\r\n  getLibraryItemUrl(item: any): string {\r\n    const libCfg = this.config.attachmentConfig?.libraryConfig;\r\n    return libCfg?.urlPath ? this.getValueByPath(item, libCfg.urlPath) : (item?.url || item?.completeURL || '');\r\n  }\r\n\r\n  getLibraryItemId(item: any): any {\r\n    const libCfg = this.config.attachmentConfig?.libraryConfig;\r\n    return libCfg?.idPath ? this.getValueByPath(item, libCfg.idPath) : (item?.id ?? item);\r\n  }\r\n\r\n  isLibraryItemSelected(item: any): boolean {\r\n    return this.librarySelectedIds.has(this.getLibraryItemId(item));\r\n  }\r\n\r\n  toggleLibraryItem(item: any): void {\r\n    const id = this.getLibraryItemId(item);\r\n    if (this.librarySelectedIds.has(id)) {\r\n      this.librarySelectedIds.delete(id);\r\n    } else {\r\n      this.librarySelectedIds.add(id);\r\n    }\r\n  }\r\n\r\n  closeLibraryModal(): void {\r\n    this.showLibraryModal = false;\r\n  }\r\n\r\n  confirmLibrarySelection(): void {\r\n    const selectedItems = this.libraryImages.filter(item => this.isLibraryItemSelected(item));\r\n\r\n    if (!selectedItems.length) {\r\n      this.showLibraryModal = false;\r\n      return;\r\n    }\r\n\r\n    const cfg = this.config.attachmentConfig;\r\n    const maxItems = cfg?.maxFiles ?? 10;\r\n    // NOTE: track added count live — do NOT snapshot currentItems here\r\n    let errorShown = false;\r\n\r\n    // Close modal immediately so UI feels responsive\r\n    this.showLibraryModal = false;\r\n\r\n    selectedItems.forEach(item => {\r\n      // Use live count — this.mediaItems grows as _appendMediaItem is called\r\n      if (this.mediaItems.length >= maxItems) {\r\n        if (!errorShown) {\r\n          this.showMediaError(this.controller.labels['ERR_MEDIA_MAX'] || `Maximum ${maxItems} media items allowed.`);\r\n          errorShown = true;\r\n        }\r\n        return;\r\n      }\r\n      const libraryUrl = this.getLibraryItemUrl(item);\r\n\r\n      if (!libraryUrl) return;\r\n\r\n      const placeholder: MediaItem = {\r\n        mediaType: 'image',\r\n        url: libraryUrl,\r\n        mimeType: item.mimeType,\r\n        fileName: item.fileName ?? item.name,\r\n        isUploading: true\r\n      };\r\n\r\n      this._appendMediaItem(placeholder);\r\n\r\n      // Build the POST request using the structured config or legacy URL fallback.\r\n      // The runtime context provides dynamic param values (e.g. the selected image URL).\r\n      const request = this.buildLibraryUploadRequest(cfg, { libraryItem: { url: libraryUrl } });\r\n\r\n      if (request) {\r\n        // For legacy fallback the completeUrl param is not yet on params — add it now.\r\n        // For the structured config it is declared via sourcePath='libraryItem.url' so\r\n        // it gets resolved inside buildLibraryUploadRequest and is already on params.\r\n        let { baseUrl, params } = request;\r\n        if (!params.has('completeUrl')) {\r\n          params = params.set('completeUrl', libraryUrl);\r\n        }\r\n\r\n        // POST with null body — all data travels as query params\r\n        this.http.post<any>(baseUrl, null, { headers: this.getHeaders(), params })\r\n          .pipe(takeUntil(this.destroy$))\r\n          .subscribe({\r\n            next: (response: any) => {\r\n              const current: MediaItem[] = [...this.mediaItems];\r\n              const idx = current.indexOf(placeholder);\r\n              if (idx !== -1) {\r\n                const resolvedUrl: string = (response?.completeURL ?? response)?.toString().trim();\r\n                current[idx] = {\r\n                  mediaType: 'image',\r\n                  url: resolvedUrl,\r\n                  id: response?.id,\r\n                  mimeType: response?.mimeType ?? placeholder.mimeType,\r\n                  fileName: response?.fileName ?? response?.name ?? placeholder.fileName,\r\n                  isUploading: false\r\n                };\r\n                this.updateValue(current);\r\n              }\r\n            },\r\n            error: (err) => {\r\n              console.error('Failed to sync library image to attachments:', err);\r\n              const current: MediaItem[] = [...this.mediaItems];\r\n              const cleaned = current.filter(m => m !== placeholder);\r\n              this.updateValue(cleaned.length ? cleaned : null);\r\n            }\r\n          });\r\n      } else {\r\n        // No sync URL configured — use the library URL directly (local-only fallback)\r\n        const current: MediaItem[] = [...this.mediaItems];\r\n        const idx = current.indexOf(placeholder);\r\n        if (idx !== -1) {\r\n          current[idx] = { ...placeholder, isUploading: false };\r\n          this.updateValue(current);\r\n        }\r\n      }\r\n    });\r\n\r\n    this.mediaCarouselIndex = this.mediaItems.length - 1;\r\n  }\r\n\r\n  // ── Remove item ──────────────────────────────────────────────────────────\r\n\r\n  removeMediaItem(index: number): void {\r\n    const items: MediaItem[] = [...this.mediaItems];\r\n    const item = items[index];\r\n    if (!item) return;\r\n\r\n    const removeLocally = () => {\r\n      const updated = items.filter((_, i) => i !== index);\r\n      this.updateValue(updated.length ? updated : null);\r\n      // Clamp carousel index so it never points past the end\r\n      this.mediaCarouselIndex = Math.max(0, this.mediaCarouselIndex - (index <= this.mediaCarouselIndex ? 1 : 0));\r\n    };\r\n\r\n    const deleteUrl = this.config.attachmentConfig?.deleteUrl;\r\n    const { url: resolvedDeleteUrl, resolved } = deleteUrl\r\n      ? this.resolveUrlPlaceholders(deleteUrl)\r\n      : { url: '', resolved: false };\r\n\r\n    if (item.id && item.id !== 0 && deleteUrl && resolved) {\r\n      // ── API delete path (same logic as removeUploadedFile) ───────────────\r\n      item.isUploading = true;       // disable the remove button while in-flight\r\n      this.updateValue([...items]);  // trigger change detection\r\n\r\n      let params = new HttpParams();\r\n      if (!resolvedDeleteUrl.includes('attachmentId=')) {\r\n        params = params.set('attachmentId', item.id.toString());\r\n      }\r\n      if (!resolvedDeleteUrl.includes('reason=')) {\r\n        params = params.set('reason', 'DELETED BY CREATOR');\r\n      }\r\n\r\n      this.http.delete<any>(resolvedDeleteUrl, { headers: this.getHeaders(), params })\r\n        .pipe(takeUntil(this.destroy$))\r\n        .subscribe({\r\n          next: () => {\r\n            removeLocally();\r\n            this.controller.fileRemoved$.next(item);\r\n          },\r\n          error: (err) => {\r\n            console.error('Failed to delete media attachment', err);\r\n            item.isUploading = false;\r\n            this.updateValue([...items]);  // restore UI state\r\n          }\r\n        });\r\n    } else {\r\n      // ── No id, no deleteUrl, or an unresolved URL placeholder (e.g.\r\n      //    {entityId} in CREATE mode before the entity exists): just remove\r\n      //    the item from the form — no server delete call. ─────────────────\r\n      removeLocally();\r\n      this.controller.fileRemoved$.next(item);\r\n    }\r\n  }\r\n\r\n\r\n  private _appendMediaItem(item: MediaItem): void {\r\n    const current: MediaItem[] = [...this.mediaItems];\r\n    current.push(item);\r\n    this.updateValue(current);\r\n    this.mediaCarouselIndex = current.length - 1;\r\n  }\r\n\r\n  private showMediaError(msg: string): void {\r\n    this.mediaUploadError = msg;\r\n    setTimeout(() => {\r\n      if (this.mediaUploadError === msg) this.mediaUploadError = '';\r\n    }, 4000);\r\n  }\r\n\r\n  // ── LOCATION field methods ─────────────────────────────────────────────────\r\n\r\n  private initLocationField(): void {\r\n    const cfg = this.config.locationConfig;\r\n    this.locationActiveTab = cfg?.defaultTab ?? 'VENUE';\r\n\r\n    // Restore from existing form value using the robust getter\r\n    if (this.locationValue.tab) {\r\n      this.locationActiveTab = this.locationValue.tab;\r\n    }\r\n\r\n    // Subscribe to external patchValue events (prefills)\r\n    this.formGroup.get(this.config.name!)?.valueChanges\r\n      .pipe(takeUntil(this.destroy$))\r\n      .subscribe(() => {\r\n        if (this.locationValue.tab) {\r\n          this.locationActiveTab = this.locationValue.tab;\r\n        }\r\n        setTimeout(() => this._renderMap());\r\n      });\r\n\r\n    // Load Google Maps script if not already loaded\r\n    this._ensureGoogleMapsScript();\r\n  }\r\n\r\n  private _ensureGoogleMapsScript(): void {\r\n    const apiKey = this.config.locationConfig?.googleMapsApiKey;\r\n    if (!apiKey) return;\r\n\r\n    if ((window as any).google?.maps?.places) {\r\n      this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n      this.locationMapLoaded = true;\r\n      setTimeout(() => this._renderMap(), 100);\r\n      return;\r\n    }\r\n\r\n    // Only inject once\r\n    if (document.querySelector('script[data-sf-gmaps]')) {\r\n      // Wait for the script to load\r\n      const wait = () => {\r\n        if ((window as any).google?.maps?.places) {\r\n          this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n          this.locationMapLoaded = true;\r\n          setTimeout(() => this._renderMap(), 100);\r\n        } else {\r\n          setTimeout(wait, 300);\r\n        }\r\n      };\r\n      wait();\r\n      return;\r\n    }\r\n\r\n    const script = document.createElement('script');\r\n    script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&libraries=places`;\r\n    script.async = true;\r\n    script.defer = true;\r\n    script.setAttribute('data-sf-gmaps', 'true');\r\n    script.onload = () => {\r\n      this._googleAcService = new (window as any).google.maps.places.AutocompleteService();\r\n      this.locationMapLoaded = true;\r\n      setTimeout(() => this._renderMap(), 100);\r\n    };\r\n    document.head.appendChild(script);\r\n  }\r\n\r\n  onLocationTabChange(tab: string): void {\r\n    if (this.locationActiveTab === 'VENUE' && tab !== 'VENUE') {\r\n      this._googleMap = null;\r\n      this._mapMarkers = [];\r\n    }\r\n    this.locationActiveTab = tab;\r\n    this.locationSuggestions = [];\r\n    this.locationShowSuggestions = false;\r\n    this.locationSearchText = '';\r\n    const existing: LocationFieldValue = this.formGroup.get(this.config.name!)?.value || { tab, venues: [], onlineUrl: '' };\r\n    existing.tab = tab;\r\n    this.updateValue(existing);\r\n    if (tab === 'VENUE') {\r\n      setTimeout(() => this._renderMap());\r\n    }\r\n  }\r\n\r\n  get locationValue(): LocationFieldValue {\r\n    let v = this.formGroup.get(this.config.name!)?.value;\r\n    if (typeof v === 'string') {\r\n      try { v = JSON.parse(v); } catch { /* ignore */ }\r\n    }\r\n    // Automatically unwrap if prefill payload was mistakenly double-nested like `{ location: { tab... } }`\r\n    if (v && !v.tab && v[this.config.name!]) {\r\n      v = v[this.config.name!];\r\n    }\r\n    if (v && v.tab) return v;\r\n    return { tab: this.locationActiveTab, venues: [], onlineUrl: '' };\r\n  }\r\n\r\n  get locationVenues(): LocationItem[] {\r\n    return this.locationValue.venues || [];\r\n  }\r\n\r\n  get locationOnlineUrl(): string {\r\n    return this.locationValue.onlineUrl || '';\r\n  }\r\n\r\n  get locationMaxReached(): boolean {\r\n    const isMulti = this.config.locationConfig?.allowMulti;\r\n    const max = isMulti ? (this.config.locationConfig?.maxLocations ?? 5) : 1;\r\n    return this.locationVenues.length >= max;\r\n  }\r\n\r\n  handleLocationSearchInput(event: Event): void {\r\n    const input = (event.target as HTMLInputElement).value;\r\n    this.locationSearchText = input;\r\n    if (!input || input.length < 2) {\r\n      this.locationSuggestions = [];\r\n      this.locationShowSuggestions = false;\r\n      return;\r\n    }\r\n    if (!this._googleAcService) {\r\n      return;\r\n    }\r\n    this._googleAcService.getPlacePredictions({ input }, (predictions: any[], status: string) => {\r\n      if (status === 'OK' && predictions) {\r\n        this.locationSuggestions = predictions;\r\n        this.locationShowSuggestions = true;\r\n      } else {\r\n        this.locationSuggestions = [];\r\n        this.locationShowSuggestions = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  onLocationSuggestionSelect(prediction: any): void {\r\n    if (!prediction) return;\r\n    const isMulti = this.config.locationConfig?.allowMulti;\r\n    const max = isMulti ? (this.config.locationConfig?.maxLocations ?? 5) : 1;\r\n    const current = this.locationVenues;\r\n    if (current.length >= max) return;\r\n\r\n    const newItem: LocationItem = {\r\n      description: prediction.description,\r\n      placeId: prediction.place_id,\r\n      address: prediction.description,\r\n      type: 'GOOGLE',\r\n      isActive: true\r\n    };\r\n\r\n    // Geocode to get lat/lng and components\r\n    if ((window as any).google?.maps?.Geocoder) {\r\n      const geocoder = new (window as any).google.maps.Geocoder();\r\n      geocoder.geocode({ placeId: prediction.place_id }, (results: any[], status: string) => {\r\n        if (status === 'OK' && results[0]) {\r\n          const res = results[0];\r\n          newItem.latitude = res.geometry?.location?.lat();\r\n          newItem.longitude = res.geometry?.location?.lng();\r\n          newItem.address = res.formatted_address || prediction.description;\r\n\r\n          let name = prediction.description;\r\n          if (prediction.structured_formatting && prediction.structured_formatting.main_text) {\r\n            name = prediction.structured_formatting.main_text;\r\n          }\r\n          newItem.name = name;\r\n\r\n          res.address_components?.forEach((c: any) => {\r\n            if (c.types.includes('locality')) newItem.cityLabel = c.long_name;\r\n            if (c.types.includes('administrative_area_level_1')) newItem.stateLabel = c.long_name;\r\n            if (c.types.includes('country')) newItem.countryLabel = c.long_name;\r\n          });\r\n        }\r\n        this._addVenueAndUpdate(newItem);\r\n      });\r\n    } else {\r\n      this._addVenueAndUpdate(newItem);\r\n    }\r\n\r\n    this.locationSearchText = '';\r\n    this.locationSuggestions = [];\r\n    this.locationShowSuggestions = false;\r\n  }\r\n\r\n  private _addVenueAndUpdate(item: LocationItem): void {\r\n    const val = { ...this.locationValue };\r\n    val.venues = [...(val.venues || []), item];\r\n    this.updateValue(val);\r\n    setTimeout(() => this._renderMap());\r\n  }\r\n\r\n  removeLocationVenue(index: number): void {\r\n    const val = { ...this.locationValue };\r\n    val.venues = (val.venues || []).filter((_, i) => i !== index);\r\n    this.updateValue(val);\r\n    setTimeout(() => this._renderMap());\r\n  }\r\n\r\n  onLocationUrlChange(url: string): void {\r\n    const val = { ...this.locationValue, onlineUrl: url };\r\n    this.updateValue(val);\r\n  }\r\n\r\n  hideLocationSuggestions(): void {\r\n    setTimeout(() => { this.locationShowSuggestions = false; }, 200);\r\n  }\r\n\r\n  getLocationMapEmbedUrl(): string {\r\n    const venues = this.locationVenues.filter(v => v.placeId || (typeof v.latitude === 'number' && typeof v.longitude === 'number'));\r\n    const apiKey = this.config.locationConfig?.googleMapsApiKey || '';\r\n\r\n    // No locations currently selected: Show the default map view (India)\r\n    if (!venues.length) {\r\n      if (apiKey) {\r\n        // Embed API center fallback if they have an API Key but no marker yet\r\n        const lat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n        const lng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n        const zoom = this.config.locationConfig?.defaultZoom ?? 4;\r\n        return `https://www.google.com/maps/embed/v1/view?key=${apiKey}&center=${lat},${lng}&zoom=${zoom}`;\r\n      } else {\r\n        // Static iframe fallback text query\r\n        return `https://maps.google.com/maps?q=India&output=embed`;\r\n      }\r\n    }\r\n\r\n    if (venues.length === 1) {\r\n      const v = venues[0];\r\n      const q = v.placeId ? `place_id:${v.placeId}` : encodeURIComponent(v.address || v.description || '');\r\n      return `https://www.google.com/maps/embed/v1/place?key=${apiKey}&q=${q}`;\r\n    }\r\n    // Multiple locations — use directions/search embed\r\n    const q = encodeURIComponent(venues.map(v => v.address || v.description).join('|'));\r\n    return `https://www.google.com/maps/embed/v1/search?key=${apiKey}&q=${q}`;\r\n  }\r\n\r\n  private _renderMap(): void {\r\n    if (!(window as any).google?.maps) return;\r\n    if (!this.config.locationConfig?.showMap && this.config.locationConfig?.showMap !== undefined) return;\r\n\r\n    const venues = this.locationVenues.filter(v => typeof v.latitude === 'number' && typeof v.longitude === 'number');\r\n\r\n    const mapEl = document.getElementById(`loc-map-${this.config.name}`);\r\n    if (!mapEl) return;\r\n\r\n    if (!this._googleMap) {\r\n      // Default to India if no venues exist\r\n      const defaultLat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n      const defaultLng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n      const defaultZoom = this.config.locationConfig?.defaultZoom ?? 4;\r\n\r\n      this._googleMap = new (window as any).google.maps.Map(mapEl, {\r\n        zoom: venues.length === 1 ? 12 : defaultZoom,\r\n        center: venues.length > 0\r\n          ? { lat: venues[0].latitude, lng: venues[0].longitude }\r\n          : { lat: defaultLat, lng: defaultLng }\r\n      });\r\n    } else {\r\n      if (venues.length === 0) {\r\n        // Re-center on default\r\n        const lat = this.config.locationConfig?.defaultLat ?? 20.5937;\r\n        const lng = this.config.locationConfig?.defaultLng ?? 78.9629;\r\n        this._googleMap.setCenter({ lat, lng });\r\n        this._googleMap.setZoom(this.config.locationConfig?.defaultZoom ?? 4);\r\n      } else if (venues.length === 1) {\r\n        this._googleMap.setCenter({ lat: venues[0].latitude, lng: venues[0].longitude });\r\n        this._googleMap.setZoom(12);\r\n      }\r\n    }\r\n\r\n    // Clear old markers\r\n    this._mapMarkers.forEach(m => m.setMap(null));\r\n    this._mapMarkers = [];\r\n\r\n    venues.forEach(v => {\r\n      const marker = new (window as any).google.maps.Marker({\r\n        position: { lat: v.latitude, lng: v.longitude },\r\n        map: this._googleMap,\r\n        title: v.name || v.address || v.description\r\n      });\r\n      this._mapMarkers.push(marker);\r\n    });\r\n\r\n    if (venues.length > 1) {\r\n      const bounds = new (window as any).google.maps.LatLngBounds();\r\n      venues.forEach(v => bounds.extend({ lat: v.latitude!, lng: v.longitude! }));\r\n      this._googleMap.fitBounds(bounds);\r\n    }\r\n  }\r\n\r\n  // ── LINK_LIST helpers ──────────────────────────────────────────────────\r\n  get linkListConfig(): LinkListConfig | undefined {\r\n    return this.config.linkListConfig;\r\n  }\r\n\r\n  get linkListItems(): any[] {\r\n    const format = this.linkListConfig?.valueFormat || 'string';\r\n    const val = this.value;\r\n    if (!val) return [];\r\n\r\n    if (format === 'string') {\r\n      if (typeof val === 'string') {\r\n        const sep = this.linkListConfig?.separator || ',';\r\n        return val.split(sep).map(s => s.trim()).filter(Boolean);\r\n      }\r\n      return [];\r\n    } else if (format === 'array') {\r\n      return Array.isArray(val) ? val : [];\r\n    } else if (format === 'object') {\r\n      return Array.isArray(val) ? val : [];\r\n    }\r\n    return [];\r\n  }\r\n\r\n  getLinkDisplayUrl(item: any): string {\r\n    if (!item) return '';\r\n    const format = this.linkListConfig?.valueFormat || 'string';\r\n    if (format === 'object') {\r\n      const urlKey = this.linkListConfig?.urlKey || 'linkUrl';\r\n      return item[urlKey] || '';\r\n    }\r\n    return String(item);\r\n  }\r\n\r\n  addLinkItem(event?: Event): void {\r\n    if (event) {\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n    }\r\n    const val = this.newLinkInputValue?.trim();\r\n    if (!val) return;\r\n\r\n    // Normalize URL\r\n    const formattedUrl = /^https?:\\/\\//i.test(val) ? val : 'https://' + val;\r\n\r\n    // Validate URL pattern\r\n    const patternStr = this.linkListConfig?.pattern || '^https?://([a-zA-Z0-9\\\\-]+\\\\.)+[a-zA-Z]{2,}(/\\\\S*)?$';\r\n    try {\r\n      const regex = new RegExp(patternStr, 'i');\r\n      if (!regex.test(formattedUrl)) {\r\n        this.linkValidationError = this.linkListConfig?.patternMessage || this.controller.labels['COMMON.INVALID_URL'] || 'Invalid URL format';\r\n        return;\r\n      }\r\n    } catch (e) {\r\n      console.error('Invalid pattern regex in LinkListConfig', e);\r\n    }\r\n\r\n    this.linkValidationError = '';\r\n\r\n    const format = this.linkListConfig?.valueFormat || 'string';\r\n    const currentItems = [...this.linkListItems];\r\n\r\n    if (format === 'string') {\r\n      currentItems.push(formattedUrl);\r\n      const sep = this.linkListConfig?.separator || ',';\r\n      this.updateValue(currentItems.join(sep));\r\n    } else if (format === 'array') {\r\n      currentItems.push(formattedUrl);\r\n      this.updateValue(currentItems);\r\n    } else if (format === 'object') {\r\n      const urlKey = this.linkListConfig?.urlKey || 'linkUrl';\r\n      currentItems.push({ [urlKey]: formattedUrl, id: 0 });\r\n      this.updateValue(currentItems);\r\n    }\r\n\r\n    this.newLinkInputValue = '';\r\n  }\r\n\r\n  deleteLinkItem(index: number): void {\r\n    const format = this.linkListConfig?.valueFormat || 'string';\r\n    const currentItems = [...this.linkListItems];\r\n    const itemToRemove = currentItems[index];\r\n\r\n    const deleteLinkLocal = () => {\r\n      currentItems.splice(index, 1);\r\n      if (format === 'string') {\r\n        const sep = this.linkListConfig?.separator || ',';\r\n        this.updateValue(currentItems.length > 0 ? currentItems.join(sep) : null);\r\n      } else if (format === 'array') {\r\n        this.updateValue(currentItems.length > 0 ? currentItems : null);\r\n      } else if (format === 'object') {\r\n        this.updateValue(currentItems.length > 0 ? currentItems : null);\r\n      }\r\n    };\r\n\r\n    const deleteApiUrl = this.linkListConfig?.deleteApiUrl;\r\n    if (format === 'object' && itemToRemove && itemToRemove.id && deleteApiUrl) {\r\n      let resolvedUrl = deleteApiUrl;\r\n      const idField = this.linkListConfig?.idField || 'id';\r\n      const itemId = itemToRemove[idField] || '';\r\n\r\n      if (resolvedUrl.includes(':id')) {\r\n        resolvedUrl = resolvedUrl.replace(':id', String(itemId));\r\n      } else if (resolvedUrl.includes('{id}')) {\r\n        resolvedUrl = resolvedUrl.replace('{id}', String(itemId));\r\n      }\r\n\r\n      this.http.delete<any>(resolvedUrl, { headers: this.getHeaders() }).subscribe({\r\n        next: () => {\r\n          deleteLinkLocal();\r\n        },\r\n        error: (err) => {\r\n          console.error('Failed to delete link via API', err);\r\n        }\r\n      });\r\n    } else {\r\n      deleteLinkLocal();\r\n    }\r\n  }\r\n\r\n  startEditLink(index: number): void {\r\n    this.editingLinkIndex = index;\r\n    const item = this.linkListItems[index];\r\n    this.editingLinkValue = this.getLinkDisplayUrl(item);\r\n  }\r\n\r\n  cancelEditLink(): void {\r\n    this.editingLinkIndex = null;\r\n    this.editingLinkValue = '';\r\n  }\r\n\r\n  saveEditLink(index: number): void {\r\n    const val = this.editingLinkValue?.trim();\r\n    if (!val) return;\r\n\r\n    const formattedUrl = /^https?:\\/\\//i.test(val) ? val : 'https://' + val;\r\n\r\n    // Validate URL pattern\r\n    const patternStr = this.linkListConfig?.pattern || '^https?://([a-zA-Z0-9\\\\-]+\\\\.)+[a-zA-Z]{2,}(/\\\\S*)?$';\r\n    try {\r\n      const regex = new RegExp(patternStr, 'i');\r\n      if (!regex.test(formattedUrl)) {\r\n        this.linkValidationError = this.linkListConfig?.patternMessage || this.controller.labels['COMMON.INVALID_URL'] || 'Invalid URL format';\r\n        return;\r\n      }\r\n    } catch (e) {\r\n      console.error('Invalid pattern regex in LinkListConfig', e);\r\n    }\r\n\r\n    this.linkValidationError = '';\r\n\r\n    const format = this.linkListConfig?.valueFormat || 'string';\r\n    const currentItems = [...this.linkListItems];\r\n    const itemToEdit = currentItems[index];\r\n\r\n    const updateLinkLocal = () => {\r\n      if (format === 'string') {\r\n        currentItems[index] = formattedUrl;\r\n        const sep = this.linkListConfig?.separator || ',';\r\n        this.updateValue(currentItems.join(sep));\r\n      } else if (format === 'array') {\r\n        currentItems[index] = formattedUrl;\r\n        this.updateValue(currentItems);\r\n      } else if (format === 'object') {\r\n        const urlKey = this.linkListConfig?.urlKey || 'linkUrl';\r\n        currentItems[index] = { ...itemToEdit, [urlKey]: formattedUrl };\r\n        this.updateValue(currentItems);\r\n      }\r\n      this.cancelEditLink();\r\n    };\r\n\r\n    const editApiUrl = this.linkListConfig?.editApiUrl;\r\n    if (format === 'object' && itemToEdit && itemToEdit.id && editApiUrl) {\r\n      let resolvedUrl = editApiUrl;\r\n      const idField = this.linkListConfig?.idField || 'id';\r\n      const itemId = itemToEdit[idField] || '';\r\n\r\n      if (resolvedUrl.includes(':id')) {\r\n        resolvedUrl = resolvedUrl.replace(':id', String(itemId));\r\n      } else if (resolvedUrl.includes('{id}')) {\r\n        resolvedUrl = resolvedUrl.replace('{id}', String(itemId));\r\n      }\r\n\r\n      const urlKey = this.linkListConfig?.urlKey || 'linkUrl';\r\n      const body = { ...itemToEdit, [urlKey]: formattedUrl };\r\n\r\n      this.http.put<any>(resolvedUrl, body, { headers: this.getHeaders() }).subscribe({\r\n        next: () => {\r\n          updateLinkLocal();\r\n        },\r\n        error: (err) => {\r\n          console.error('Failed to edit link via API', err);\r\n        }\r\n      });\r\n    } else {\r\n      updateLinkLocal();\r\n    }\r\n  }\r\n}\r\n\r\n","<div class=\"form-field mb-8px\" *ngIf=\"isVisible\" [class.has-error]=\"errorMessage\">\r\n\r\n  <!-- ══ ROW Layout ════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isRow\" class=\"form-row grid-row\">\r\n    <ng-container *ngFor=\"let child of config.children; trackBy: trackByFieldName\">\r\n      <!-- isFieldVisible() (not just isEnabled !== false) so a child hidden by\r\n           visibilityExpression — e.g. a dependent dropdown that isn't relevant to the\r\n           current selection — is fully removed from the DOM instead of leaving\r\n           this wrapper's grid-column cell reserved-but-empty (which the grid's own\r\n           grid-auto-flow: dense can't reclaim, since dense packing only repacks around\r\n           structurally absent items, not visually-empty ones). -->\r\n      <div class=\"row-field\" [style.gridColumn]=\"'span ' + getChildColSpan(child)\" *ngIf=\"isFieldVisible(child)\">\r\n        <lib-form-field #rowFieldRef [config]=\"child\" [controller]=\"controller\" [formGroup]=\"formGroup\" [allowMulti]=\"allowMulti\">\r\n        </lib-form-field>\r\n      </div>\r\n    </ng-container>\r\n  </div>\r\n\r\n  <!-- ══ GROUP — allowMulti (repeater) ════════════════════════════════════ -->\r\n  <div *ngIf=\"isGroup && config.sectionConfig?.allowMulti\"\r\n    class=\"group-section-wrapper mb-20px\"\r\n    [class.multi-save-active]=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n\r\n    <!-- Multi-Save: header row with label + top-right Add button -->\r\n    <div class=\"multi-save-header d-flex justify-content-between align-items-center mb-24\"\r\n      *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n      <h3 class=\"group-label\" *ngIf=\"config.sectionConfig?.label\">{{ config.sectionConfig!.label }}</h3>\r\n      <lib-button [variant]=\"'outline'\" [icon]=\"{type: 'material', value: 'add'}\" (click)=\"addGroupInstance()\"\r\n        class=\"btn-add-multi\">\r\n        {{ addMultiLabel }}\r\n      </lib-button>\r\n    </div>\r\n\r\n    <!-- Standard heading (non-multiSave) -->\r\n    <h3 class=\"group-label\"\r\n      *ngIf=\"config.sectionConfig?.label && !config.sectionConfig?.multiSaveConfig?.active\">{{\r\n      config.sectionConfig!.label }}</h3>\r\n\r\n    <!-- ── Standard (non-multiSave) repeater: accordion instances ─────────── -->\r\n    <ng-container *ngIf=\"!config.sectionConfig?.multiSaveConfig?.active\">\r\n      <div *ngFor=\"let instance of instanceList; trackBy: trackByInstanceId; let i = index\"\r\n        class=\"group-accordion-instance\"\r\n        [class.is-expanded]=\"isGroupExpanded(i)\">\r\n\r\n        <!-- Accordion header -->\r\n        <div class=\"group-accordion-header\" (click)=\"toggleGroupAccordion(i)\"\r\n          role=\"button\" [attr.aria-expanded]=\"isGroupExpanded(i)\">\r\n          <div class=\"accordion-header-left d-flex align-items-center gap-10\">\r\n            <span class=\"instance-badge\">{{ i + 1 }}</span>\r\n            <span class=\"instance-title\">{{ config.sectionConfig!.label }} #{{ i + 1 }}</span>\r\n          </div>\r\n          <div class=\"accordion-header-right d-flex align-items-center gap-6\">\r\n            <button type=\"button\" class=\"accordion-remove-btn\"\r\n              *ngIf=\"instanceList.length > 1\"\r\n              (click)=\"$event.stopPropagation(); removeGroupInstance(i)\"\r\n              aria-label=\"Remove\">\r\n              <mat-icon>delete_outline</mat-icon>\r\n            </button>\r\n            <mat-icon class=\"accordion-chevron\">\r\n              {{ isGroupExpanded(i) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n            </mat-icon>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Accordion body (always mounted so form controls survive collapse) -->\r\n        <div class=\"group-accordion-body\" [hidden]=\"!isGroupExpanded(i)\">\r\n          <div class=\"group-fields sf-grid\">\r\n            <ng-container *ngFor=\"let field of config.sectionConfig!.children\">\r\n              <lib-form-field #groupFieldRef\r\n                class=\"sf-col\"\r\n                [style.gridColumn]=\"'span ' + (field.colSpan || 12)\"\r\n                *ngIf=\"isFieldVisible(field, instance.rowController)\"\r\n                [config]=\"field\" [controller]=\"instance.rowController\" [formGroup]=\"instance.fg\"\r\n                [allowMulti]=\"false\" [siblingFormArray]=\"groupFormArray\" [siblingIndex]=\"i\">\r\n              </lib-form-field>\r\n            </ng-container>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Full-width dashed Add button -->\r\n      <button type=\"button\" class=\"btn-add-group\" (click)=\"addGroupInstance()\">\r\n        <mat-icon>add</mat-icon> {{ addLabel }} {{ config.sectionConfig!.label }}\r\n      </button>\r\n    </ng-container>\r\n\r\n    <!-- ── MultiSave: card instances ─────────────────────────────────────── -->\r\n    <ng-container *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n      <div *ngFor=\"let instance of instanceList; trackBy: trackByInstanceId; let i = index\"\r\n        class=\"group-instance position-relative mb-16 overflow-hidden\"\r\n        [class.is-editing]=\"instance.isEditing\"\r\n        [class.is-card]=\"!instance.isEditing\">\r\n\r\n        <!-- Edit / new form view -->\r\n        <div [hidden]=\"!instance.isEditing\">\r\n          <div class=\"group-fields sf-grid\">\r\n            <ng-container *ngFor=\"let field of config.sectionConfig!.children\">\r\n              <lib-form-field #groupFieldRef\r\n                class=\"sf-col\"\r\n                [style.gridColumn]=\"'span ' + (field.colSpan || 12)\"\r\n                *ngIf=\"isFieldVisible(field, instance.rowController)\"\r\n                [config]=\"field\" [controller]=\"instance.rowController\" [formGroup]=\"instance.fg\"\r\n                [allowMulti]=\"false\" [siblingFormArray]=\"groupFormArray\" [siblingIndex]=\"i\">\r\n              </lib-form-field>\r\n            </ng-container>\r\n          </div>\r\n\r\n          <!-- Save / Cancel -->\r\n          <div class=\"group-footer d-flex justify-content-end align-items-center gap-16 p-0-24\"\r\n            *ngIf=\"config.sectionConfig?.multiSaveConfig?.active\">\r\n            <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"multiSaveError\">{{ multiSaveError }}</span>\r\n            <div class=\"footer-actions d-flex gap-12\">\r\n              <lib-button [variant]=\"'outline'\" (click)=\"cancelGroupInstance(i)\">Cancel</lib-button>\r\n              <lib-button [variant]=\"'primary'\" (click)=\"saveGroupInstance(i)\">Save</lib-button>\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Card view (saved state) -->\r\n        <ng-container *ngIf=\"!instance.isEditing\">\r\n          <div class=\"card-view d-flex justify-content-between align-items-center p-18px-24px\"\r\n            [class.is-expanded]=\"instance.isExpanded\">\r\n            <div class=\"card-content flex-1 d-flex flex-column gap-4 overflow-hidden\">\r\n              <span class=\"card-title font-weight-600 overflow-hidden fs-1rem c-111827\">{{\r\n                instance.fg.get(config.sectionConfig!.multiSaveConfig!.summaryField || '')?.value\r\n                || '—' }}</span>\r\n            </div>\r\n            <div class=\"card-actions d-flex align-items-center gap-16 ml-20\">\r\n              <mat-icon class=\"icon-delete\" (click)=\"removeGroupInstance(i, true)\">delete_outline</mat-icon>\r\n              <mat-icon class=\"icon-edit\" (click)=\"editGroupInstance(i)\">edit_outline</mat-icon>\r\n              <mat-icon class=\"icon-expand\" (click)=\"toggleExpandGroupInstance(i)\">\r\n                {{ instance.isExpanded ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n              </mat-icon>\r\n            </div>\r\n          </div>\r\n        </ng-container>\r\n      </div>\r\n    </ng-container>\r\n  </div>\r\n\r\n  <!-- ══ GROUP — single (non-repeater) ════════════════════════════════════ -->\r\n  <div *ngIf=\"isGroup && config.sectionConfig && !config.sectionConfig.allowMulti\"\r\n    class=\"group-section-wrapper mb-20px\">\r\n    <h3 class=\"group-label\" *ngIf=\"config.sectionConfig.label\">{{ config.sectionConfig.label }}</h3>\r\n    <div class=\"group-fields sf-grid\">\r\n      <ng-container *ngFor=\"let field of config.sectionConfig.children\">\r\n        <lib-form-field #singleGroupFieldRef\r\n          class=\"sf-col\"\r\n          [style.gridColumn]=\"'span ' + (field.colSpan || 12)\"\r\n          *ngIf=\"isFieldVisible(field)\"\r\n          [config]=\"field\" [controller]=\"controller\" [formGroup]=\"groupFormGroup\" [allowMulti]=\"false\">\r\n        </lib-form-field>\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n\r\n\r\n  <!-- ══ Text Input ════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isTextField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <textarea *ngIf=\"config.subType === 'LONG'\" class=\"field-input textarea\" [placeholder]=\"config.placeholder || ''\"\r\n      [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\" rows=\"4\">\r\n    </textarea>\r\n\r\n    <!-- Password input with show/hide toggle -->\r\n    <div *ngIf=\"config.subType === 'PASSWORD'\" class=\"password-wrapper position-relative d-flex align-items-center\">\r\n      <input [type]=\"showPassword ? 'text' : 'password'\" class=\"field-input password-input\"\r\n        [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n      <button type=\"button\"\r\n        class=\"password-toggle position-absolute cursor-pointer d-flex align-items-center justify-content-center b-none border-none c-6B7280 p-0-25rem\"\r\n        (click)=\"showPassword = !showPassword\" tabindex=\"-1\"\r\n        [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\">\r\n        <mat-icon class=\"eye-icon\">{{ showPassword ? 'visibility' : 'visibility_off' }}</mat-icon>\r\n      </button>\r\n    </div>\r\n\r\n    <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n      <span class=\"input-prefix br-none\" *ngIf=\"config.prefix\">{{ config.prefix }}</span>\r\n\r\n      <input *ngIf=\"config.subType !== 'LONG' && config.subType !== 'PASSWORD'\"\r\n        [type]=\"config.subType === 'EMAIL' ? 'email' : config.subType === 'PHONE' ? 'tel' : 'text'\" class=\"field-input\"\r\n        [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\"\r\n        [readonly]=\"config.readonly\">\r\n\r\n      <span class=\"input-suffix d-flex align-items-center font-weight-500\" *ngIf=\"config.suffix\">{{ config.suffix\r\n        }}</span>\r\n\r\n      <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n        <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n      </div>\r\n\r\n      <!-- Suffix Action Icons (clickable) -->\r\n      <div class=\"suffix-action-icons position-absolute d-flex gap-8 align-items-center\"\r\n           *ngIf=\"config.suffixActionIcons?.length && !config.readonly\">\r\n        <mat-icon class=\"suffix-action-icon\"\r\n                  *ngFor=\"let action of config.suffixActionIcons\"\r\n                  [style.color]=\"action.color || null\"\r\n                  [title]=\"action.tooltip || ''\"\r\n                  (click)=\"onSuffixActionClick(action.actionId)\">\r\n          {{ action.icon }}\r\n        </mat-icon>\r\n      </div>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n    <div class=\"char-count-hint font-poppins font-weight-400 text-14 text-right c-6B7280\" *ngIf=\"showCharCount\">\r\n      {{ remainingCharacters }} characters remaining\r\n    </div>\r\n  </div>\r\n\r\n  <!-- ══ Number Input ══════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isNumberField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n      <span class=\"input-prefix br-none\" *ngIf=\"config.prefix\">{{ config.prefix }}</span>\r\n\r\n      <input type=\"number\" class=\"field-input\" [placeholder]=\"config.placeholder || ''\" [formControlName]=\"config.name!\"\r\n        [min]=\"config.numberConfig?.min ?? null\" [max]=\"config.numberConfig?.max ?? null\"\r\n        [step]=\"config.numberConfig?.step || 1\" [class.is-invalid]=\"errorMessage\" [readonly]=\"config.readonly\">\r\n\r\n      <span class=\"input-suffix d-flex align-items-center font-weight-500\" *ngIf=\"config.suffix\">{{ config.suffix\r\n        }}</span>\r\n\r\n      <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n        <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n      </div>\r\n\r\n      <!-- Suffix Action Icons (clickable) -->\r\n      <div class=\"suffix-action-icons position-absolute d-flex gap-8 align-items-center\"\r\n           *ngIf=\"config.suffixActionIcons?.length && !config.readonly\">\r\n        <mat-icon class=\"suffix-action-icon\"\r\n                  *ngFor=\"let action of config.suffixActionIcons\"\r\n                  [style.color]=\"action.color || null\"\r\n                  [title]=\"action.tooltip || ''\"\r\n                  (click)=\"onSuffixActionClick(action.actionId)\">\r\n          {{ action.icon }}\r\n        </mat-icon>\r\n      </div>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Date Input ════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isDateField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n      <input matInput [matDatepicker]=\"datePicker\" class=\"field-input date-input has-icon-right\"\r\n        [formControlName]=\"config.name!\" [min]=\"effectiveMinDate\" [max]=\"config.dateConfig?.maxDate\"\r\n        [class.is-invalid]=\"errorMessage\" [placeholder]=\"config.placeholder || ''\"\r\n        [readonly]=\"config.readonly || config.dateConfig?.inputReadonly\"\r\n        (click)=\"!config.readonly && datePicker.open()\">\r\n      <div class=\"date-icon-wrapper position-absolute d-flex align-items-center justify-content-center\"\r\n        *ngIf=\"!config.readonly\">\r\n        <mat-datepicker-toggle matSuffix [for]=\"datePicker\"></mat-datepicker-toggle>\r\n      </div>\r\n      <mat-datepicker #datePicker [startView]=\"datePickerStartView\"\r\n        (opened)=\"onDatePickerOpened(datePicker)\"\r\n        (yearSelected)=\"onDateYearSelected($event, datePicker)\"\r\n        (monthSelected)=\"onDateMonthSelected($event, datePicker)\">\r\n      </mat-datepicker>\r\n\r\n      <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n        <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n      </div>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Time Input ════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isTimeField\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <!-- DEFAULT variant: existing native input — unchanged -->\r\n    <ng-container *ngIf=\"!isWheelVariant\">\r\n      <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n        {{ config.label }}\r\n        <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n      </label>\r\n\r\n      <div class=\"input-group position-relative d-flex w-100\" [class.readonly]=\"config.readonly\">\r\n        <input type=\"time\" class=\"field-input time-input\" [formControlName]=\"config.name!\"\r\n          [min]=\"effectiveMinTime\" [max]=\"effectiveMaxTime\"\r\n          [class.is-invalid]=\"errorMessage\" [readonly]=\"config.readonly || config.timeConfig?.inputReadonly\">\r\n\r\n        <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n          <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n        </div>\r\n      </div>\r\n    </ng-container>\r\n\r\n    <!-- WHEEL variant: drum-roll picker -->\r\n    <lib-time-picker\r\n      *ngIf=\"isWheelVariant\"\r\n      [formControlName]=\"config.name!\"\r\n      [label]=\"config.label || ''\"\r\n      [placeholder]=\"config.timeConfig?.placeholder || ''\"\r\n      [required]=\"config.required || false\"\r\n      [disabled]=\"config.readonly || false\"\r\n      [mode]=\"config.timeConfig?.mode || '12'\"\r\n      [minuteStep]=\"config.timeConfig?.minuteStep || 1\"\r\n      [minTime]=\"effectiveMinTime || undefined\"\r\n      [maxTime]=\"config.timeConfig?.maxTime\"\r\n      [errorMessage]=\"errorMessage\"\r\n      [labels]=\"timePickerLabels\">\r\n    </lib-time-picker>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Autocomplete ═════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isAutocomplete\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <!-- Hidden real control (stores the code value) -->\r\n    <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n    <div class=\"autocomplete-wrapper position-relative d-flex align-items-center w-100\"\r\n      [class.is-invalid]=\"errorMessage\" [class.readonly]=\"config.readonly\">\r\n      <!-- Search icon -->\r\n      <mat-icon class=\"ac-search-icon position-absolute fs-1-1rem c-9CA3AF pe-none\">search</mat-icon>\r\n\r\n      <input class=\"field-input ac-input\" [formControl]=\"autocompleteInputCtrl\" [matAutocomplete]=\"auto\"\r\n        [placeholder]=\"config.placeholder || 'Search…'\" [readonly]=\"!!config.readonly\" [class.is-invalid]=\"errorMessage\"\r\n        (blur)=\"onAutocompleteClear()\" autocomplete=\"off\">\r\n\r\n      <!-- Clear button -->\r\n      <button type=\"button\"\r\n        class=\"ac-clear-btn position-absolute d-flex align-items-center justify-content-center cursor-pointer rounded-50 b-none border-none c-9CA3AF p-0-2rem\"\r\n        *ngIf=\"autocompleteInputCtrl.value && !config.readonly\"\r\n        (click)=\"autocompleteInputCtrl.setValue(''); updateValue(null)\" tabindex=\"-1\" aria-label=\"Clear\">\r\n        <mat-icon>close</mat-icon>\r\n      </button>\r\n\r\n      <mat-autocomplete #auto=\"matAutocomplete\" [panelWidth]=\"'auto'\">\r\n        <mat-option *ngFor=\"let option of filteredOptions\" [value]=\"option.label\"\r\n          (onSelectionChange)=\"onAutocompleteSelected(option)\">\r\n          <span class=\"ac-option-label\">{{ option.label }}</span>\r\n\r\n          <!-- Dynamic display fields (image / email / phone / text) -->\r\n          <div class=\"ac-display-fields d-flex flex-wrap gap-6 mt-2\" *ngIf=\"option['displayMeta']?.length\">\r\n            <ng-container *ngFor=\"let field of option['displayMeta']\">\r\n\r\n              <!-- Image avatar -->\r\n              <span *ngIf=\"field.type === 'image' && field.value\" class=\"ac-df-item ac-df-image\">\r\n                <img [src]=\"field.value\" [alt]=\"field.label || 'image'\" class=\"ac-df-avatar\">\r\n              </span>\r\n\r\n              <!-- Email -->\r\n              <span *ngIf=\"field.type === 'email' && field.value\" class=\"ac-df-item ac-df-chip\">\r\n                <mat-icon class=\"ac-df-icon\">mail_outline</mat-icon>\r\n                <span *ngIf=\"field.label\" class=\"ac-df-label\">{{ field.label }}</span>\r\n                {{ field.value }}\r\n              </span>\r\n\r\n              <!-- Phone -->\r\n              <span *ngIf=\"field.type === 'phone' && field.value\" class=\"ac-df-item ac-df-chip\" [class]=\"field.className\">\r\n                <mat-icon class=\"ac-df-icon\">phone</mat-icon>\r\n                <span *ngIf=\"field.label\" class=\"ac-df-label\">{{ field.label }}</span>\r\n                {{ field.value }}\r\n              </span>\r\n\r\n              <!-- Custom / Icon-based / Generic Text -->\r\n              <span *ngIf=\"field.type !== 'image' && field.type !== 'email' && field.type !== 'phone' && field.value\" \r\n                class=\"ac-df-item\" [class.ac-df-chip]=\"!!field.icon\" [class]=\"field.className\">\r\n                <mat-icon class=\"ac-df-icon\" *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n                <span *ngIf=\"field.label\" class=\"ac-df-label\">{{ field.label }}</span>\r\n                {{ field.value }}\r\n              </span>\r\n\r\n            </ng-container>\r\n          </div>\r\n        </mat-option>\r\n        <mat-option *ngIf=\"filteredOptions.length === 0\" disabled class=\"ac-no-results fs-0-8125rem c-6B7280\">\r\n          No results found\r\n        </mat-option>\r\n      </mat-autocomplete>\r\n\r\n      <div class=\"readonly-icons position-absolute d-flex gap-8 pe-none\" *ngIf=\"config.readonly\">\r\n        <mat-icon class=\"lock-icon\">lock</mat-icon>\r\n      </div>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Dropdown ══════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isDropdown\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <!-- SINGLE SELECT: native select (default, non-searchable, non-paginated) -->\r\n    <div *ngIf=\"config.subType === 'SINGLE' && !isCustomSingleDropdown\" class=\"native-select-wrapper\">\r\n      <select class=\"field-input\" [formControlName]=\"config.name!\"\r\n        [class.is-invalid]=\"errorMessage\" [disabled]=\"optionsLoading || config.disabled\">\r\n        <option [ngValue]=\"null\" disabled selected>{{ optionsLoading ? (controller.labels['LBL_LOADING'] || 'Loading...') : (config.placeholder || selectPlaceholderLabel) }}</option>\r\n        <option *ngFor=\"let option of displayLocalOptionList\" [value]=\"option.code\">\r\n          {{ option.label }}\r\n        </option>\r\n      </select>\r\n      <div *ngIf=\"optionsLoading\" class=\"native-select-spinner\" aria-hidden=\"true\"></div>\r\n    </div>\r\n\r\n    <!-- SINGLE SELECT: custom dropdown panel (searchable or paginated) -->\r\n    <div *ngIf=\"config.subType === 'SINGLE' && isCustomSingleDropdown\" class=\"single-select-wrapper\"\r\n      [class.is-invalid]=\"errorMessage\">\r\n\r\n      <div #singleTrigger cdkOverlayOrigin #singleOrigin=\"cdkOverlayOrigin\"\r\n        class=\"field-input single-select-trigger d-flex align-items-center justify-content-between cursor-pointer\"\r\n        [class.ss-open]=\"isSingleDropdownOpen\"\r\n        [class.is-locked]=\"!!config.disabled\"\r\n        (click)=\"!optionsLoading && toggleSingleDropdown($event, singleTrigger)\">\r\n        <span *ngIf=\"singleSelectedLabel && !optionsLoading\" class=\"single-select-value fs-0-9rem\">\r\n          {{ singleSelectedLabel }}\r\n        </span>\r\n        <span *ngIf=\"!singleSelectedLabel || optionsLoading\" class=\"single-select-placeholder\">\r\n          {{ optionsLoading ? (controller.labels['LBL_LOADING'] || 'Loading...') : (config.placeholder || selectPlaceholderLabel) }}\r\n        </span>\r\n        <div class=\"d-flex align-items-center\">\r\n          <div *ngIf=\"optionsLoading\" class=\"mini-spinner me-2\" role=\"progressbar\" aria-label=\"Loading options\"></div>\r\n          <mat-icon class=\"trigger-lock-icon\" *ngIf=\"config.disabled\">lock</mat-icon>\r\n          <mat-icon class=\"single-select-arrow\">\r\n            {{ isSingleDropdownOpen ? expandLessLabel : expandMoreLabel }}\r\n          </mat-icon>\r\n        </div>\r\n      </div>\r\n\r\n      <ng-template cdkConnectedOverlay\r\n        [cdkConnectedOverlayOrigin]=\"singleOrigin\"\r\n        [cdkConnectedOverlayOpen]=\"isSingleDropdownOpen\"\r\n        [cdkConnectedOverlayPositions]=\"dropdownOverlayPositions\"\r\n        [cdkConnectedOverlayScrollStrategy]=\"dropdownScrollStrategy\"\r\n        [cdkConnectedOverlayWidth]=\"dropdownOverlayWidth\"\r\n        [cdkConnectedOverlayViewportMargin]=\"8\"\r\n        [cdkConnectedOverlayPush]=\"true\"\r\n        (overlayOutsideClick)=\"onDropdownOverlayOutsideClick($event, singleTrigger)\"\r\n        (detach)=\"isSingleDropdownOpen = false\">\r\n      <div class=\"single-select-panel\"\r\n        (click)=\"$event.stopPropagation()\">\r\n\r\n        <!-- Search input (shown only when searchConfig.enabled) -->\r\n        <div class=\"dropdown-search-wrapper\" *ngIf=\"isSearchableDropdown\">\r\n          <mat-icon class=\"dropdown-search-icon\">search</mat-icon>\r\n          <input type=\"text\" class=\"dropdown-search-input\"\r\n            [placeholder]=\"searchPlaceholderLabel\"\r\n            [(ngModel)]=\"searchText\" [ngModelOptions]=\"{standalone: true}\"\r\n            (input)=\"dropdownSearch$.next(searchText)\"\r\n            (click)=\"$event.stopPropagation()\">\r\n          <mat-icon *ngIf=\"searchText\" class=\"dropdown-search-clear cursor-pointer\"\r\n            (click)=\"searchText = ''; dropdownSearch$.next(''); $event.stopPropagation()\">close</mat-icon>\r\n        </div>\r\n\r\n        <!-- Options list -->\r\n        <div class=\"single-select-options-list\" (scroll)=\"onDropdownScroll($event)\">\r\n          <div *ngIf=\"optionsLoading\" class=\"dropdown-loading-state\">\r\n            <div class=\"dropdown-spinner\"></div>\r\n            <span class=\"fs-0-875rem c-6B7280\">{{ controller.labels['LBL_LOADING'] || 'Loading...' }}</span>\r\n          </div>\r\n\r\n          <ng-container *ngIf=\"!optionsLoading\">\r\n            <div *ngFor=\"let option of displayOptionList\"\r\n              class=\"single-select-option d-flex align-items-center gap-8 cursor-pointer\"\r\n              [class.selected]=\"isSingleOptionSelected(option.code)\"\r\n              [class.option-locked]=\"!!config.disabled\"\r\n              (click)=\"selectSingleOption(option)\">\r\n              <span class=\"fs-0-875rem c-111827\">{{ option.label }}</span>\r\n              <mat-icon *ngIf=\"isSingleOptionSelected(option.code)\" class=\"single-select-check\">check</mat-icon>\r\n            </div>\r\n            <div *ngIf=\"!filteredOptionList?.length && localOptionList?.length\"\r\n              class=\"multi-select-empty fs-0-875rem c-6B7280\">\r\n              {{ noMatchingOptionsLabel }}\r\n            </div>\r\n            <div *ngIf=\"!localOptionList?.length\"\r\n              class=\"multi-select-empty fs-0-875rem c-6B7280\">\r\n              {{ noOptionsAvailableLabel }}\r\n            </div>\r\n\r\n            <!-- Load More button / Pagination Spinner -->\r\n            <div *ngIf=\"config.optionConfig?.pagination?.enabled && ((hasMoreDropdownPages && config.optionConfig?.pagination?.mode !== 'infiniteScroll') || isDropdownLoadingMore)\" class=\"dropdown-pagination-footer\">\r\n              <button type=\"button\" class=\"btn-dropdown-load-more\"\r\n                *ngIf=\"hasMoreDropdownPages && config.optionConfig?.pagination?.mode !== 'infiniteScroll' && !isDropdownLoadingMore\"\r\n                (click)=\"loadMoreDropdownOptions(); $event.stopPropagation()\">\r\n                {{ controller.labels['LBL_LOAD_MORE'] || 'Load More' }}\r\n              </button>\r\n              <div *ngIf=\"isDropdownLoadingMore\" class=\"dropdown-loading-more-state\">\r\n                <div class=\"dropdown-spinner-small\"></div>\r\n                <span class=\"fs-0-8125rem c-6B7280\">{{ controller.labels['LBL_LOADING_MORE'] || 'Loading more...' }}</span>\r\n              </div>\r\n            </div>\r\n          </ng-container>\r\n        </div>\r\n      </div>\r\n      </ng-template>\r\n    </div>\r\n\r\n    <!-- MULTIPLE SELECT: custom panel with checkboxes -->\r\n    <div *ngIf=\"config.subType === 'MULTIPLE'\" class=\"multi-select-wrapper\"\r\n      [class.is-invalid]=\"errorMessage\">\r\n\r\n      <div #multiTrigger cdkOverlayOrigin #multiOrigin=\"cdkOverlayOrigin\"\r\n        class=\"field-input multi-select-trigger d-flex align-items-center justify-content-between cursor-pointer\"\r\n        [class.ms-open]=\"isMultiDropdownOpen\"\r\n        [class.is-locked]=\"!!config.disabled\"\r\n        (click)=\"!optionsLoading && toggleMultiDropdown($event, multiTrigger)\">\r\n        <span *ngIf=\"multiSelectedCount > 0 && !optionsLoading\" class=\"multi-select-value fs-0-9rem\">\r\n          {{ multiSelectedCount }} selected\r\n        </span>\r\n        <span *ngIf=\"multiSelectedCount === 0 || optionsLoading\" class=\"multi-select-placeholder\">\r\n          {{ optionsLoading ? (controller.labels['LBL_LOADING'] || 'Loading...') : (config.placeholder || selectPlaceholderLabel) }}\r\n        </span>\r\n        <div class=\"d-flex align-items-center\">\r\n          <div *ngIf=\"optionsLoading\" class=\"mini-spinner me-2\" role=\"progressbar\" aria-label=\"Loading options\"></div>\r\n          <mat-icon class=\"trigger-lock-icon\" *ngIf=\"config.disabled\">lock</mat-icon>\r\n          <mat-icon class=\"multi-select-arrow\">\r\n            {{ isMultiDropdownOpen ? expandLessLabel : expandMoreLabel }}\r\n          </mat-icon>\r\n        </div>\r\n      </div>\r\n\r\n      <ng-template cdkConnectedOverlay\r\n        [cdkConnectedOverlayOrigin]=\"multiOrigin\"\r\n        [cdkConnectedOverlayOpen]=\"isMultiDropdownOpen\"\r\n        [cdkConnectedOverlayPositions]=\"dropdownOverlayPositions\"\r\n        [cdkConnectedOverlayScrollStrategy]=\"dropdownScrollStrategy\"\r\n        [cdkConnectedOverlayWidth]=\"dropdownOverlayWidth\"\r\n        [cdkConnectedOverlayViewportMargin]=\"8\"\r\n        [cdkConnectedOverlayPush]=\"true\"\r\n        (overlayOutsideClick)=\"onDropdownOverlayOutsideClick($event, multiTrigger)\"\r\n        (detach)=\"isMultiDropdownOpen = false\">\r\n      <div class=\"multi-select-panel\"\r\n        (click)=\"$event.stopPropagation()\">\r\n\r\n        <!-- Search input (shown only when searchConfig.enabled) -->\r\n        <div class=\"dropdown-search-wrapper\" *ngIf=\"isSearchableDropdown\">\r\n          <mat-icon class=\"dropdown-search-icon\">search</mat-icon>\r\n          <input type=\"text\" class=\"dropdown-search-input\"\r\n            [placeholder]=\"searchPlaceholderLabel\"\r\n            [(ngModel)]=\"searchText\" [ngModelOptions]=\"{standalone: true}\"\r\n            (input)=\"dropdownSearch$.next(searchText)\"\r\n            (click)=\"$event.stopPropagation()\">\r\n          <mat-icon *ngIf=\"searchText\" class=\"dropdown-search-clear cursor-pointer\"\r\n            (click)=\"searchText = ''; dropdownSearch$.next(''); $event.stopPropagation()\">close</mat-icon>\r\n        </div>\r\n\r\n        <!-- Select All checkbox (shown only when showSelectAll is true) -->\r\n        <label *ngIf=\"config.optionConfig?.showSelectAll && filteredOptionList?.length\"\r\n          class=\"multi-select-option multi-select-all d-flex align-items-center gap-8 cursor-pointer\"\r\n          [class.option-locked]=\"!!config.disabled\">\r\n          <input type=\"checkbox\"\r\n            [checked]=\"isAllSelected()\"\r\n            [indeterminate]=\"isSomeSelected()\"\r\n            [disabled]=\"!!config.disabled\"\r\n            (change)=\"toggleSelectAll($any($event.target).checked)\">\r\n          <span class=\"fs-0-875rem c-111827 fw-600\">{{ selectAllLabel }}</span>\r\n        </label>\r\n\r\n        <!-- Options list -->\r\n        <div class=\"multi-select-options-list\" (scroll)=\"onDropdownScroll($event)\">\r\n          <div *ngIf=\"optionsLoading\" class=\"dropdown-loading-state\">\r\n            <div class=\"dropdown-spinner\"></div>\r\n            <span class=\"fs-0-875rem c-6B7280\">{{ controller.labels['LBL_LOADING'] || 'Loading...' }}</span>\r\n          </div>\r\n\r\n          <ng-container *ngIf=\"!optionsLoading\">\r\n            <label *ngFor=\"let option of filteredOptionList\"\r\n              class=\"multi-select-option d-flex align-items-center gap-8 cursor-pointer\"\r\n              [class.option-locked]=\"!!config.disabled\">\r\n              <input type=\"checkbox\"\r\n                [checked]=\"isChecked(option.code)\"\r\n                [disabled]=\"!!config.disabled\"\r\n                (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\">\r\n              <span class=\"fs-0-875rem c-111827\">{{ option.label }}</span>\r\n            </label>\r\n            <div *ngIf=\"!filteredOptionList?.length && localOptionList?.length\"\r\n              class=\"multi-select-empty fs-0-875rem c-6B7280\">\r\n              {{ noMatchingOptionsLabel }}\r\n            </div>\r\n            <div *ngIf=\"!localOptionList?.length\"\r\n              class=\"multi-select-empty fs-0-875rem c-6B7280\">\r\n              {{ noOptionsAvailableLabel }}\r\n            </div>\r\n\r\n            <!-- Load More button / Pagination Spinner -->\r\n            <div *ngIf=\"config.optionConfig?.pagination?.enabled && ((hasMoreDropdownPages && config.optionConfig?.pagination?.mode !== 'infiniteScroll') || isDropdownLoadingMore)\" class=\"dropdown-pagination-footer\">\r\n              <button type=\"button\" class=\"btn-dropdown-load-more\"\r\n                *ngIf=\"hasMoreDropdownPages && config.optionConfig?.pagination?.mode !== 'infiniteScroll' && !isDropdownLoadingMore\"\r\n                (click)=\"loadMoreDropdownOptions(); $event.stopPropagation()\">\r\n                {{ controller.labels['LBL_LOAD_MORE'] || 'Load More' }}\r\n              </button>\r\n              <div *ngIf=\"isDropdownLoadingMore\" class=\"dropdown-loading-more-state\">\r\n                <div class=\"dropdown-spinner-small\"></div>\r\n                <span class=\"fs-0-8125rem c-6B7280\">{{ controller.labels['LBL_LOADING_MORE'] || 'Loading more...' }}</span>\r\n              </div>\r\n            </div>\r\n          </ng-container>\r\n        </div>\r\n      </div>\r\n      </ng-template>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Radio ═════════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isRadio\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div class=\"radio-group\" [class.is-invalid]=\"errorMessage\"\r\n      [class]=\"config.optionConfig?.layout ? 'layout-' + config.optionConfig!.layout.toLowerCase() : ''\">\r\n      <label *ngFor=\"let option of localOptionList\" class=\"radio-label\"\r\n        [class.card-item]=\"config.subType === 'CARD'\"\r\n        [class.selected]=\"formGroup.get(config.name!)?.value === option.code\"\r\n        [style.gridColumn]=\"config.optionConfig?.layout?.toUpperCase() === 'COLUMN' ? 'span ' + getOptionColSpan(option) : null\">\r\n        <input type=\"radio\" [formControlName]=\"config.name!\" [value]=\"option.code\">\r\n        <div class=\"option-content d-flex flex-column gap-4 flex-1 text-left\">\r\n          <span class=\"label-text text-16 c-1F2937\">{{ option.label }}</span>\r\n          <span class=\"option-hint text-13 color-gray\" *ngIf=\"option.hint\">{{ option.hint }}</span>\r\n        </div>\r\n      </label>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Checkbox ══════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isCheckbox\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label && config.subType === 'LIST'\"\r\n      class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div *ngIf=\"config.subType === 'BOOL'\" class=\"checkbox-single\">\r\n      <label class=\"checkbox-label d-flex align-items-center gap-8 cursor-pointer fs-0-875rem c-111827\">\r\n        <input type=\"checkbox\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n        <span>{{ config.label }}</span>\r\n      </label>\r\n    </div>\r\n\r\n    <div *ngIf=\"config.subType === 'LIST' || config.subType === 'CARD'\" class=\"checkbox-group d-flex flex-column gap-8\"\r\n      [class.is-invalid]=\"errorMessage\"\r\n      [class]=\"config.optionConfig?.layout ? 'layout-' + config.optionConfig!.layout.toLowerCase() : ''\">\r\n      <label *ngFor=\"let option of localOptionList\"\r\n        class=\"checkbox-label d-flex align-items-center gap-8 cursor-pointer fs-0-875rem c-111827\"\r\n        [class.card-item]=\"config.subType === 'CARD'\" [class.selected]=\"isChecked(option.code)\"\r\n        [style.gridColumn]=\"config.optionConfig?.layout?.toUpperCase() === 'COLUMN' ? 'span ' + getOptionColSpan(option) : null\">\r\n        <input type=\"checkbox\" [checked]=\"isChecked(option.code)\" [disabled]=\"!!config.disabled\"\r\n          (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\">\r\n        <div class=\"option-content d-flex flex-column gap-4 flex-1 text-left\">\r\n          <span class=\"label-text text-16 c-1F2937\">{{ option.label }}</span>\r\n          <span class=\"option-hint text-13 color-gray\" *ngIf=\"option.hint\">{{ option.hint }}</span>\r\n        </div>\r\n      </label>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Chip ══════════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isChip\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div class=\"chip-group d-flex flex-wrap gap-8\" [class.is-invalid]=\"errorMessage\">\r\n      <label *ngFor=\"let option of localOptionList\"\r\n        class=\"chip-label cursor-pointer p-6px-14px b-ffffff c-374151 b-1px-solid-D1D5DB br-20px fs-0-875rem\"\r\n        [class.selected]=\"isChecked(option.code)\">\r\n        <input type=\"checkbox\" [checked]=\"isChecked(option.code)\" [disabled]=\"!!config.disabled\"\r\n          (change)=\"onCheckboxListChange(option.code, $any($event.target).checked)\" hidden>\r\n        <span>{{ option.label }}</span>\r\n      </label>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Switch ════════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isSwitch\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label class=\"switch-container d-flex justify-content-between align-items-center cursor-pointer\">\r\n      <span class=\"field-label d-block font-poppins c-202124 fs-18px\">{{ config.label }}</span>\r\n      <div class=\"switch position-relative\">\r\n        <input type=\"checkbox\" [formControlName]=\"config.name!\" [class.is-invalid]=\"errorMessage\">\r\n        <span class=\"slider position-absolute cursor-pointer\"></span>\r\n      </div>\r\n    </label>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Rich Text ═════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isRichText\" class=\"field-wrapper component-rich-text d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div class=\"rich-text-container\" [class.is-invalid]=\"errorMessage\">\r\n      <quill-editor [formControlName]=\"config.name!\" class=\"rich-text-editor d-block w-100\"\r\n        [placeholder]=\"config.richTextConfig?.placeholder || config.placeholder || ''\"\r\n        [styles]=\"{height: config.richTextConfig?.height || '200px'}\"\r\n        [modules]=\"richTextModules\">\r\n      </quill-editor>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n    <div class=\"char-count-hint font-poppins font-weight-400 text-14 text-right c-6B7280\" *ngIf=\"showCharCount\">\r\n      {{ remainingCharacters }} characters remaining\r\n    </div>\r\n  </div>\r\n\r\n  <!-- ══ Rating ════════════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isRating\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <div class=\"rating-group d-flex gap-4\" [class.is-invalid]=\"errorMessage\">\r\n      <span *ngFor=\"let star of getStarArray()\" class=\"star d-inline-flex align-items-center cursor-pointer\"\r\n        [class.filled]=\"isStarFilled(star)\" [class.half]=\"isStarHalf(star)\" (click)=\"onRatingChange(star, $event)\">\r\n        <mat-icon>{{ isStarFilled(star) || isStarHalf(star) ? 'star' : 'star_border' }}</mat-icon>\r\n      </span>\r\n    </div>\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Generated Field (read-only) ══════════════════════════════════════ -->\r\n  <div *ngIf=\"isGenerated\" class=\"field-wrapper d-flex flex-column gap-6\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">{{ config.label\r\n      }}</label>\r\n    <div class=\"generated-value fs-0-875rem p-0-625rem-0-875rem b-F3F4F6 b-1px-solid-E5E7EB br-8px c-6B7280\">{{ value ||\r\n      '-' }}</div>\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint\">{{ config.hint }}</span>\r\n  </div>\r\n\r\n  <!-- ══ File Upload ═══════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isFileUpload\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <!-- Drop Zone -->\r\n    <div\r\n      class=\"upload-drop-zone d-flex flex-column align-items-center justify-content-center gap-8 cursor-pointer text-center p-32px-24px us-none\"\r\n      [class.drag-over]=\"isDragOver\" [class.has-files]=\"value?.length\" [class.is-invalid]=\"errorMessage\"\r\n      (dragover)=\"onDragOver($event)\" (dragleave)=\"onDragLeave($event)\" (drop)=\"onFileDrop($event)\"\r\n      (click)=\"fileInput.click()\">\r\n\r\n      <!-- Icon with accent-colour pill background -->\r\n      <div class=\"upload-icon-wrap mb-4\">\r\n        <div class=\"dropzone-icon-pill d-flex align-items-center justify-content-center\">\r\n          <mat-icon class=\"upload-cloud-icon\">cloud_upload</mat-icon>\r\n        </div>\r\n      </div>\r\n\r\n      <p class=\"upload-main-text font-weight-600 m-0 fs-0-9rem\">Drag &amp; drop files here</p>\r\n      <p class=\"upload-sub-text m-0 fs-0-8rem c-64748B\">or <span class=\"upload-link\">Browse files</span></p>\r\n      <p class=\"upload-hint-text m-0 fs-0-78rem c-64748B\" *ngIf=\"config.attachmentConfig?.acceptLabel\">\r\n        Supported: <span class=\"upload-formats font-weight-500\">{{ config.attachmentConfig!.acceptLabel }}</span>\r\n      </p>\r\n      <p class=\"upload-hint-text m-0 fs-0-78rem c-64748B\" *ngIf=\"!config.attachmentConfig?.acceptLabel && config.hint\">\r\n        {{ config.hint }}\r\n      </p>\r\n      <span class=\"upload-size-badge fs-0-72rem\" *ngIf=\"config.attachmentConfig?.maxSizeMB\">\r\n        Max {{ config.attachmentConfig!.maxSizeMB }}MB\r\n      </span>\r\n\r\n      <!-- Hidden native file input -->\r\n      <input #fileInput type=\"file\" hidden [attr.multiple]=\"config.attachmentConfig?.multiple ? true : null\"\r\n        [attr.accept]=\"config.attachmentConfig?.accept || null\" (change)=\"onFileSelected($event)\">\r\n    </div>\r\n\r\n    <!-- Uploaded file list -->\r\n    <div class=\"uploaded-list d-flex flex-column gap-8 mt-10\" *ngIf=\"value?.length\">\r\n      <div *ngFor=\"let f of value; let i = index\"\r\n        class=\"uploaded-item d-flex align-items-center gap-10 p-10px-14px br-8px\"\r\n        [class.uploading]=\"f.isUploading\">\r\n\r\n        <!-- Uploading spinner -->\r\n        <ng-container *ngIf=\"f.isUploading; else fileReady\">\r\n          <div class=\"upload-spinner rounded-50 b-2px-solid-E2E8F0\"></div>\r\n          <div class=\"file-info flex-1 d-flex flex-column\">\r\n            <span class=\"file-name font-weight-500 overflow-hidden fs-0-85rem\" [title]=\"f.name\">{{ f.name }}</span>\r\n            <span class=\"file-size uploading-label fs-0-72rem\">Uploading...</span>\r\n          </div>\r\n        </ng-container>\r\n\r\n        <!-- Normal state once upload is done -->\r\n        <ng-template #fileReady>\r\n          <mat-icon class=\"file-type-icon\">{{ getFileIcon(f.type) }}</mat-icon>\r\n          <img *ngIf=\"f.type?.startsWith('image') && f.dataUrl\" [src]=\"f.dataUrl\" class=\"file-thumb rounded-4\"\r\n            alt=\"preview\">\r\n          <div class=\"file-info flex-1 d-flex flex-column\">\r\n            <span class=\"file-name font-weight-500 overflow-hidden fs-0-85rem\" [title]=\"f.name\">{{ f.name }}</span>\r\n            <span class=\"file-size fs-0-72rem\">{{ formatFileSize(f.size) }}</span>\r\n          </div>\r\n        </ng-template>\r\n\r\n        <!-- Compact icon-only remove button -->\r\n        <button type=\"button\" class=\"file-remove-btn d-flex align-items-center justify-content-center rounded-50\"\r\n          [disabled]=\"f.isUploading\" (click)=\"!f.isUploading && removeUploadedFile(i)\"\r\n          aria-label=\"Remove file\">\r\n          <mat-icon>close</mat-icon>\r\n        </button>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Validation / file errors -->\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"fileUploadError\">{{ fileUploadError }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage && !fileUploadError\">{{ errorMessage }}</span>\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\"\r\n      *ngIf=\"config.hint && !errorMessage && !fileUploadError && !config.attachmentConfig?.acceptLabel\">\r\n      {{ config.hint }}\r\n    </span>\r\n  </div>\r\n\r\n  <!-- ══ Media Upload (Type 2) ════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isMediaUpload\" class=\"field-wrapper media-upload-wrapper d-flex flex-column gap-6 p-0 border-none b-none\"\r\n    [formGroup]=\"formGroup\">\r\n\r\n    <!-- Hidden file input lives outside *ngIf — triggered via ViewChild -->\r\n    <input #mediaDeviceInput type=\"file\" hidden multiple accept=\"image/*\" (change)=\"onMediaFileSelected($event)\">\r\n\r\n    <!-- Two-column layout -->\r\n    <div class=\"mu-layout d-grid align-items-start\">\r\n\r\n      <!-- ── LEFT PANEL ──────────────────────────────────────────────── -->\r\n      <div class=\"mu-left d-flex flex-column gap-20\">\r\n\r\n        <!-- Header: title + max-items badge -->\r\n        <div class=\"mu-header d-flex align-items-start flex-wrap gap-10\">\r\n          <h3 class=\"mu-title m-0 c-111827 fs-1-35rem\">\r\n            {{ config.label }}\r\n            <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n          </h3>\r\n          <span\r\n            class=\"mu-badge d-inline-flex align-items-center rounded-20 color-white font-weight-600 fs-0-72rem p-4px-12px b-111827\"\r\n            *ngIf=\"config.attachmentConfig?.maxFiles\">\r\n            {{ controller.labels['LBL_MEDIA_MAX_PREFIX'] || 'Maximum' }}\r\n            {{ config.attachmentConfig?.maxFiles }}\r\n            {{ controller.labels['LBL_MEDIA_MAX_SUFFIX'] || 'Image & Videos' }}\r\n          </span>\r\n        </div>\r\n\r\n        <!-- Description -->\r\n        <p class=\"mu-description m-0 fs-0-875rem c-6B7280\" *ngIf=\"config.attachmentConfig?.description\">\r\n          {{ config.attachmentConfig?.description }}\r\n        </p>\r\n        <p class=\"mu-description m-0 fs-0-875rem c-6B7280\"\r\n          *ngIf=\"!config.attachmentConfig?.description && controller.labels['LBL_MEDIA_DESC']\">\r\n          {{ controller.labels['LBL_MEDIA_DESC'] }}\r\n        </p>\r\n\r\n        <!-- Feature bullet list -->\r\n        <ul class=\"mu-features m-0 p-0 d-flex flex-column gap-8 ls-none\"\r\n          *ngIf=\"config.attachmentConfig?.features?.length || controller.labels['LBL_MEDIA_FEATURE_1']\">\r\n          <ng-container *ngIf=\"config.attachmentConfig?.features?.length\">\r\n            <li *ngFor=\"let f of config.attachmentConfig?.features\"\r\n              class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n              <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ f }}\r\n            </li>\r\n          </ng-container>\r\n          <ng-container *ngIf=\"!config.attachmentConfig?.features?.length\">\r\n            <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_1']\"\r\n              class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n              <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_1'] }}\r\n            </li>\r\n            <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_2']\"\r\n              class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n              <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_2'] }}\r\n            </li>\r\n            <li *ngIf=\"controller.labels['LBL_MEDIA_FEATURE_3']\"\r\n              class=\"mu-feature-item d-flex align-items-center gap-8 fs-0-875rem c-374151\">\r\n              <mat-icon class=\"mu-check text-16 c-3B82F6\">check</mat-icon>{{ controller.labels['LBL_MEDIA_FEATURE_3'] }}\r\n            </li>\r\n          </ng-container>\r\n        </ul>\r\n\r\n        <!-- Backdrop to close dropdown on outside click -->\r\n        <div class=\"media-menu-backdrop\" *ngIf=\"showMediaMenu\"\r\n          (click)=\"$event.stopPropagation(); showMediaMenu = false\"></div>\r\n\r\n        <!-- Add Media button + dropdown -->\r\n        <div class=\"media-add-container position-relative\" (click)=\"showMediaMenu = !showMediaMenu\">\r\n          <lib-button id=\"btn-add-media-{{ config.name }}\" [variant]=\"'warning'\"\r\n            [icon]=\"{type: 'material', value: 'add_photo_alternate'}\">\r\n            {{ controller.labels['LBL_ADD_MEDIA'] || 'Add media' }}\r\n            <mat-icon class=\"menu-chevron fs-18px\">add</mat-icon>\r\n          </lib-button>\r\n\r\n          <div class=\"media-dropdown position-absolute rounded-12 overflow-hidden b-ffffff b-1px-solid-E5E7EB\"\r\n            *ngIf=\"showMediaMenu\" role=\"menu\" (click)=\"$event.stopPropagation()\">\r\n            <!-- Video -->\r\n            <button id=\"btn-media-video-{{ config.name }}\" type=\"button\"\r\n              class=\"media-dropdown-item d-flex align-items-center gap-12 w-100 cursor-pointer text-left b-none border-none p-12px-16px bb-1px-solid-F3F4F6\"\r\n              (click)=\"onMediaMenuVideo(); showMediaMenu = false\" role=\"menuitem\">\r\n              <span\r\n                class=\"media-drop-icon media-drop-icon--video d-flex align-items-center justify-content-center rounded-8\"><mat-icon>videocam</mat-icon></span>\r\n              <span class=\"media-drop-text d-flex flex-column flex-1\">\r\n                <span class=\"media-drop-label font-weight-600 fs-0-875rem c-111827\">{{\r\n                  controller.labels['LBL_MEDIA_VIDEO'] || 'Video' }}</span>\r\n                <span class=\"media-drop-desc c-6B7280 fs-0-75rem\">{{ controller.labels['LBL_MEDIA_VIDEO_DESC'] || 'Add\r\n                  YouTube URL'\r\n                  }}</span>\r\n              </span>\r\n            </button>\r\n            <!-- Device -->\r\n            <button id=\"btn-media-device-{{ config.name }}\" type=\"button\"\r\n              class=\"media-dropdown-item d-flex align-items-center gap-12 w-100 cursor-pointer text-left b-none border-none p-12px-16px bb-1px-solid-F3F4F6\"\r\n              (click)=\"onMediaMenuDevice(); showMediaMenu = false\" role=\"menuitem\">\r\n              <span\r\n                class=\"media-drop-icon media-drop-icon--device d-flex align-items-center justify-content-center rounded-8\"><mat-icon>upload</mat-icon></span>\r\n              <span class=\"media-drop-text d-flex flex-column flex-1\">\r\n                <span class=\"media-drop-label font-weight-600 fs-0-875rem c-111827\">{{\r\n                  controller.labels['LBL_MEDIA_DEVICE'] || 'Upload from device'\r\n                  }}</span>\r\n                <span class=\"media-drop-desc c-6B7280 fs-0-75rem\">{{ controller.labels['LBL_MEDIA_DEVICE_DESC'] ||\r\n                  'Select images from your\r\n                  computer' }}</span>\r\n              </span>\r\n            </button>\r\n            <!-- Library -->\r\n            <button id=\"btn-media-library-{{ config.name }}\" type=\"button\"\r\n              class=\"media-dropdown-item d-flex align-items-center gap-12 w-100 cursor-pointer text-left b-none border-none p-12px-16px bb-1px-solid-F3F4F6\"\r\n              (click)=\"onMediaMenuLibrary(); showMediaMenu = false\" role=\"menuitem\">\r\n              <span\r\n                class=\"media-drop-icon media-drop-icon--library d-flex align-items-center justify-content-center rounded-8\"><mat-icon>photo_library</mat-icon></span>\r\n              <span class=\"media-drop-text d-flex flex-column flex-1\">\r\n                <span class=\"media-drop-label font-weight-600 fs-0-875rem c-111827\">{{\r\n                  controller.labels['LBL_MEDIA_LIBRARY'] || 'Upload from library'\r\n                  }}</span>\r\n                <span class=\"media-drop-desc c-6B7280 fs-0-75rem\">{{ controller.labels['LBL_MEDIA_LIBRARY_DESC'] ||\r\n                  'Choose from default\r\n                  images' }}</span>\r\n              </span>\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- YouTube URL Input (inline below button) -->\r\n        <div class=\"youtube-input-panel d-flex flex-column gap-8 p-16 rounded-10 b-FFFAF1 b-1px-solid-E5E7EB\"\r\n          *ngIf=\"showYoutubeInput\">\r\n          <label class=\"youtube-panel-label d-flex align-items-center gap-6 font-weight-600 fs-0-875rem c-111827\">\r\n            {{ controller.labels['LBL_YOUTUBE_URL'] || 'Video URL' }}\r\n          </label>\r\n          <div class=\"youtube-input-row d-flex gap-8\">\r\n            <input id=\"input-youtube-url-{{ config.name }}\" type=\"url\" class=\"field-input youtube-url-input\"\r\n              [(ngModel)]=\"youtubeUrlInput\" [ngModelOptions]=\"{standalone: true}\"\r\n              [placeholder]=\"controller.labels['PH_YOUTUBE_URL'] || 'Video URL'\" (keyup.enter)=\"addYoutubeMedia()\">\r\n            <lib-button id=\"btn-add-youtube-{{ config.name }}\" [variant]=\"'secondary'\" (click)=\"addYoutubeMedia()\">\r\n              {{ controller.labels['LBL_ADD'] || 'Add' }}\r\n            </lib-button>\r\n          </div>\r\n          <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"youtubeUrlError\">{{ youtubeUrlError }}</span>\r\n        </div>\r\n\r\n        <div\r\n          class=\"media-upload-status d-flex align-items-center gap-8 mt-4 color-error rounded-8 font-weight-500 p-10px-14px b-FEF2F2 fs-0-85rem\"\r\n          *ngIf=\"mediaUploadError\">\r\n          <mat-icon class=\"status-icon fs-18px\">error_outline</mat-icon>\r\n          <span>{{ mediaUploadError }}</span>\r\n        </div>\r\n\r\n        <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n        <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ config.hint }}</span>\r\n      </div>\r\n      <!-- end left panel -->\r\n\r\n      <!-- ── RIGHT PANEL (carousel) ──────────────────────────────────── -->\r\n      <div class=\"mu-right d-flex flex-column gap-12\">\r\n\r\n        <!-- Carousel (when items exist) -->\r\n        <div class=\"media-carousel-section d-flex flex-column gap-12\" *ngIf=\"mediaItems.length\">\r\n          <div\r\n            class=\"media-carousel-main position-relative w-100 overflow-hidden d-flex align-items-center justify-content-center br-12px b-0F172A\">\r\n            <button id=\"btn-carousel-prev-{{ config.name }}\" type=\"button\"\r\n              class=\"carousel-nav carousel-nav--prev position-absolute rounded-50 cursor-pointer d-flex align-items-center justify-content-center border-none b-rgba-255-255-255-0-85\"\r\n              (click)=\"mediaCarouselPrev()\" [disabled]=\"mediaCarouselIndex === 0\" aria-label=\"Previous\">\r\n              <mat-icon>chevron_left</mat-icon>\r\n            </button>\r\n\r\n            <div class=\"carousel-viewer position-absolute d-flex align-items-center justify-content-center\"\r\n              *ngFor=\"let item of mediaItems; let i = index\" [hidden]=\"i !== mediaCarouselIndex\">\r\n              <div *ngIf=\"item.isUploading\"\r\n                class=\"carousel-uploading d-flex flex-column align-items-center gap-12 c-94A3B8 fs-0-85rem\">\r\n                <div class=\"carousel-spinner rounded-50 b-3px-solid-rgba-255-255-255-0-15\"></div>\r\n                <span>{{ controller.labels['LBL_UPLOADING'] || 'Uploading…' }}</span>\r\n              </div>\r\n              <ng-container *ngIf=\"!item.isUploading && item.mediaType === 'youtube'\">\r\n                <iframe class=\"carousel-iframe w-100 h-100 br-12px\" [src]=\"item.url | trustedUrl\" frameborder=\"0\"\r\n                  allowfullscreen\r\n                  allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\">\r\n                </iframe>\r\n              </ng-container>\r\n              <ng-container *ngIf=\"!item.isUploading && item.mediaType === 'image'\">\r\n                <img class=\"carousel-image w-100 h-100 br-12px\" [src]=\"item.url\" alt=\"Media\">\r\n              </ng-container>\r\n              <button id=\"btn-remove-media-{{ config.name }}-{{ i }}\" type=\"button\"\r\n                class=\"carousel-remove-btn position-absolute rounded-50 cursor-pointer d-flex align-items-center justify-content-center border-none b-rgba-0-0-0-0-55\"\r\n                [disabled]=\"item.isUploading\" (click)=\"removeMediaItem(i)\" aria-label=\"Remove\">\r\n                <mat-icon>close</mat-icon>\r\n              </button>\r\n            </div>\r\n\r\n            <button id=\"btn-carousel-next-{{ config.name }}\" type=\"button\"\r\n              class=\"carousel-nav carousel-nav--next position-absolute rounded-50 cursor-pointer d-flex align-items-center justify-content-center border-none b-rgba-255-255-255-0-85\"\r\n              (click)=\"mediaCarouselNext()\" [disabled]=\"mediaCarouselIndex === mediaItems.length - 1\" aria-label=\"Next\">\r\n              <mat-icon>chevron_right</mat-icon>\r\n            </button>\r\n\r\n            <div class=\"carousel-dots position-absolute d-flex gap-6\">\r\n              <span *ngFor=\"let item of mediaItems; let i = index\"\r\n                class=\"carousel-dot rounded-50 cursor-pointer b-rgba-255-255-255-0-45\"\r\n                [class.active]=\"i === mediaCarouselIndex\" (click)=\"mediaGoTo(i)\"></span>\r\n            </div>\r\n          </div>\r\n\r\n          <!-- Thumbnail strip -->\r\n          <div class=\"media-thumbnail-strip d-flex flex-wrap gap-8 pb-4px\">\r\n            <div *ngFor=\"let item of mediaThumbnails; let i = index\"\r\n              class=\"media-thumb rounded-8 overflow-hidden cursor-pointer d-flex align-items-center justify-content-center b-2px-solid-transparent b-E2E8F0\"\r\n              [class.active]=\"i === mediaCarouselIndex\" (click)=\"mediaGoTo(i)\">\r\n              <div *ngIf=\"item.isUploading\"\r\n                class=\"thumb-uploading d-flex align-items-center justify-content-center w-100 h-100\">\r\n                <div class=\"thumb-spinner rounded-50 b-2px-solid-E2E8F0\"></div>\r\n              </div>\r\n              <img *ngIf=\"!item.isUploading && item.mediaType === 'youtube' && item.thumbnailUrl\"\r\n                [src]=\"item.thumbnailUrl\" class=\"thumb-img w-100 h-100\" alt=\"Video thumbnail\">\r\n              <div *ngIf=\"!item.isUploading && item.mediaType === 'youtube' && !item.thumbnailUrl\"\r\n                class=\"thumb-yt-placeholder d-flex align-items-center justify-content-center w-100 h-100 b-1E293B c-EF4444\">\r\n                <mat-icon>play_circle</mat-icon>\r\n              </div>\r\n              <img *ngIf=\"!item.isUploading && item.mediaType === 'image' && item.url\" [src]=\"item.url\"\r\n                class=\"thumb-img w-100 h-100\" alt=\"Image thumbnail\">\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Empty right-side placeholder -->\r\n        <div\r\n          class=\"mu-right-empty d-flex flex-column align-items-center justify-content-center gap-10 h-100 text-center p-24 br-12px b-FFFAF1 c-94A3B8 b-2px-dashed-CBD5E1\"\r\n          *ngIf=\"!mediaItems.length\" (click)=\"onMediaMenuDevice()\">\r\n          <mat-icon class=\"mu-right-empty-icon fs-52px\">perm_media</mat-icon>\r\n          <p>{{ controller.labels['LBL_ADD_MEDIA'] || 'Add media' }}</p>\r\n        </div>\r\n\r\n      </div>\r\n      <!-- end right panel -->\r\n\r\n    </div><!-- end mu-layout -->\r\n  </div>\r\n\r\n\r\n  <!-- ══ Library Image Picker Modal ════════════════════════════════════════ -->\r\n  <!-- Wrapper is always in DOM (hidden) so @ViewChild can move it to body -->\r\n  <div #libraryModal class=\"media-library-portal-host\" [class.is-open]=\"showLibraryModal\">\r\n\r\n    <!-- Backdrop -->\r\n    <div class=\"media-library-overlay\" (click)=\"closeLibraryModal()\"></div>\r\n\r\n    <!-- Modal card -->\r\n    <div class=\"media-library-modal d-flex flex-column overflow-hidden b-ffffff br-16px\"\r\n      role=\"dialog\" aria-modal=\"true\">\r\n      <div class=\"library-modal-header d-flex align-items-start justify-content-between p-24px-28px bb-1px-solid-E5E7EB\">\r\n        <div class=\"header-left d-flex flex-column gap-8\">\r\n          <h3 class=\"library-modal-title m-0 color-dark fs-1-25rem\">\r\n            {{ controller.labels['LBL_ADD_IMAGES'] || 'Add Images' }}\r\n          </h3>\r\n          <p class=\"library-modal-subtitle m-0 color-gray fs-0-85rem\">\r\n            {{ controller.labels['LBL_LIBRARY_MODAL_DESC'] || 'Select images from your library.' }}\r\n          </p>\r\n        </div>\r\n        <button id=\"btn-close-library-{{ config.name }}\" type=\"button\"\r\n          class=\"library-close-btn d-flex align-items-center justify-content-center cursor-pointer rounded-50 border-none b-none c-9CA3AF\"\r\n          (click)=\"closeLibraryModal()\" aria-label=\"Close\">\r\n          <mat-icon>close</mat-icon>\r\n        </button>\r\n      </div>\r\n\r\n      <!-- Loading -->\r\n      <div class=\"library-loading\" *ngIf=\"libraryLoading\">\r\n        <div class=\"lib-spinner rounded-50 b-3px-solid-E2E8F0\"></div>\r\n        <span>{{ controller.labels['LBL_LOADING'] || 'Loading…' }}</span>\r\n      </div>\r\n\r\n      <!-- Error -->\r\n      <div class=\"library-error d-flex align-items-center gap-8 color-error b-FEF2F2 fs-0-875rem p-16px-24px\"\r\n        *ngIf=\"libraryError && !libraryLoading\">\r\n        <mat-icon>error_outline</mat-icon>\r\n        {{ libraryError }}\r\n      </div>\r\n\r\n      <!-- Image grid -->\r\n      <div class=\"library-grid d-grid gap-16 flex-1 p-28px b-F9FAFB\" *ngIf=\"!libraryLoading && libraryImages.length\">\r\n        <div *ngFor=\"let img of libraryImages; let li = index\" id=\"lib-img-{{ config.name }}-{{ li }}\"\r\n          class=\"library-grid-item position-relative rounded-12 overflow-hidden cursor-pointer bg-white b-3px-solid-transparent\"\r\n          [class.selected]=\"isLibraryItemSelected(img)\" (click)=\"toggleLibraryItem(img)\">\r\n          <img [src]=\"getLibraryItemUrl(img)\" class=\"library-grid-img w-100 h-100 d-block\" alt=\"Library image\">\r\n          <div\r\n            class=\"library-check position-absolute bg-white rounded-50 d-flex align-items-center justify-content-center c-3B82F6\"\r\n            *ngIf=\"isLibraryItemSelected(img)\">\r\n            <mat-icon>check_circle</mat-icon>\r\n          </div>\r\n          <div class=\"library-overlay-hover position-absolute b-rgba-59-130-246-0-12\"></div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Empty library -->\r\n      <div\r\n        class=\"library-empty d-flex flex-column align-items-center justify-content-center gap-12 flex-1 c-9CA3AF fs-0-875rem p-48px-24px\"\r\n        *ngIf=\"!libraryLoading && !libraryError && libraryImages.length === 0\">\r\n        <mat-icon>image_not_supported</mat-icon>\r\n        <span>{{ controller.labels['LBL_LIBRARY_EMPTY'] || 'No images found in library.' }}</span>\r\n      </div>\r\n\r\n      <!-- Footer -->\r\n      <div class=\"library-modal-footer d-flex align-items-center justify-content-end bg-white p-20px-28px bt-1px-solid-E5E7EB\">\r\n        <div class=\"library-footer-actions d-flex gap-12\">\r\n          <lib-button id=\"btn-library-cancel-{{ config.name }}\" [variant]=\"'outline'\" (click)=\"closeLibraryModal()\">\r\n            {{ controller.labels['LBL_CANCEL'] || 'Cancel' }}\r\n          </lib-button>\r\n          <lib-button id=\"btn-library-confirm-{{ config.name }}\" [variant]=\"'primary'\"\r\n            [disabled]=\"librarySelectedIds.size === 0\" (click)=\"confirmLibrarySelection()\">\r\n            {{ controller.labels['LBL_CONTINUE'] || 'Continue' }}\r\n          </lib-button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n\r\n\r\n  <!-- ══ Location Field ═══════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isLocation\" class=\"field-wrapper location-field-wrapper d-flex flex-column gap-6 gap-12\"\r\n    [formGroup]=\"formGroup\">\r\n\r\n    <!-- Field label -->\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n    <p class=\"location-subtitle m-0 c-6B7280 fs-0-8125rem\" *ngIf=\"config.hint\">{{ config.hint }}</p>\r\n\r\n    <!-- Three-tab bar -->\r\n    <div class=\"location-tabs d-flex gap-12 mb-24\">\r\n      <lib-button class=\"loc-tab-btn flex-1\" [variant]=\"locationActiveTab === 'VENUE' ? 'warning' : 'outline'\"\r\n        (click)=\"onLocationTabChange('VENUE')\">\r\n        {{ controller.labels['LBL_LOC_VENUE'] || 'Venue' }}\r\n      </lib-button>\r\n      <lib-button class=\"loc-tab-btn flex-1\" [variant]=\"locationActiveTab === 'ONLINE' ? 'warning' : 'outline'\"\r\n        (click)=\"onLocationTabChange('ONLINE')\">\r\n        {{ controller.labels['LBL_LOC_ONLINE'] || 'Online Event' }}\r\n      </lib-button>\r\n      <lib-button class=\"loc-tab-btn flex-1\" [variant]=\"locationActiveTab === 'TBA' ? 'warning' : 'outline'\"\r\n        (click)=\"onLocationTabChange('TBA')\">\r\n        {{ controller.labels['LBL_LOC_TBA'] || 'To be Announced' }}\r\n      </lib-button>\r\n    </div>\r\n\r\n    <!-- VENUE TAB -->\r\n    <div *ngIf=\"locationActiveTab === 'VENUE'\" class=\"loc-panel loc-venue-panel d-flex flex-column gap-12\">\r\n\r\n      <p class=\"loc-section-label m-0 font-weight-600 c-111827 fs-0-9rem\">\r\n        {{ controller.labels['LBL_LOC_ADDRESS'] || 'Location address' }}\r\n      </p>\r\n\r\n      <!-- Added venue rows -->\r\n      <div class=\"loc-venue-list d-flex flex-column gap-8\" *ngIf=\"locationVenues.length > 0\">\r\n        <div *ngFor=\"let venue of locationVenues; let i = index\"\r\n          class=\"loc-venue-item d-flex align-items-center gap-10 p-10px-14px br-7px b-ffffff b-1px-solid-D1D5DB\">\r\n          <mat-icon class=\"loc-venue-search-icon fs-18px c-9CA3AF\">search</mat-icon>\r\n          <span class=\"loc-venue-text flex-1 overflow-hidden fs-0-875rem c-111827\">{{ venue.address || venue.name ||\r\n            venue.description }}</span>\r\n          <button type=\"button\"\r\n            class=\"loc-action-btn loc-delete-btn d-flex align-items-center justify-content-center cursor-pointer rounded-50 b-none border-none p-4px\"\r\n            (click)=\"removeLocationVenue(i)\">\r\n            <mat-icon>delete_outline</mat-icon>\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Location count badge -->\r\n      <p class=\"loc-count-text m-0 font-weight-600 fs-0-8125rem c-3B82F6\"\r\n        *ngIf=\"locationVenues.length > 0 && config.locationConfig?.allowMulti\">\r\n        {{ locationVenues.length }}&nbsp;{{ controller.labels['LBL_LOC_COUNT_SUFFIX'] || 'Locations Added!' }}\r\n      </p>\r\n\r\n      <!-- Search input (hide when max reached) -->\r\n      <div class=\"loc-search-container position-relative\" *ngIf=\"!locationMaxReached\">\r\n        <div class=\"loc-search-wrapper position-relative d-flex align-items-center mt-4\">\r\n          <mat-icon class=\"loc-search-icon position-absolute fs-1-1rem c-9CA3AF pe-none\">search</mat-icon>\r\n          <input\r\n            class=\"field-input loc-search-input w-100 font-poppins flex-1 fs-0-875rem c-111827 br-7px br-8px bc-F3F4F6 pl-2-4rem bc-DC2626 pt-0-625rem pb-0-625rem pl-16px pr-16px bc-ffffff b-1px-solid-D1D5DB pr-3-5rem\"\r\n            [placeholder]=\"config.locationConfig?.venuePlaceholder || (controller.labels['PH_LOC_VENUE'] || 'Type to search venue...')\"\r\n            [value]=\"locationSearchText\" (input)=\"handleLocationSearchInput($event)\" (blur)=\"hideLocationSuggestions()\"\r\n            autocomplete=\"off\" [class.is-invalid]=\"errorMessage\">\r\n        </div>\r\n        <!-- Suggestions dropdown -->\r\n        <div class=\"loc-suggestions-panel position-absolute overflow-hidden br-8px b-ffffff b-1px-solid-D1D5DB\"\r\n          *ngIf=\"locationShowSuggestions && locationSuggestions.length\">\r\n          <div *ngFor=\"let sug of locationSuggestions\"\r\n            class=\"loc-suggestion-item d-flex align-items-center gap-10 cursor-pointer p-10px-14px\"\r\n            (mousedown)=\"onLocationSuggestionSelect(sug)\">\r\n            <mat-icon class=\"loc-suggestion-icon fs-18px c-E53E3E\">place</mat-icon>\r\n            <span class=\"loc-suggestion-text overflow-hidden fs-0-875rem c-374151\">{{ sug.description }}</span>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Add another button -->\r\n      <button type=\"button\"\r\n        class=\"loc-add-btn d-inline-flex align-items-center gap-6 cursor-pointer font-weight-600 p-0 b-none border-none fs-0-875rem c-1A56DB\"\r\n        *ngIf=\"locationVenues.length > 0 && !locationMaxReached && config.locationConfig?.allowMulti\">\r\n        <mat-icon>add_circle_outline</mat-icon>\r\n        <span>{{ controller.labels['LBL_LOC_ADD_ANOTHER'] || 'Add another Location' }}</span>\r\n      </button>\r\n\r\n      <!-- Map -->\r\n      <div class=\"loc-map-container overflow-hidden br-10px b-1px-solid-E5E7EB\"\r\n        *ngIf=\"config.locationConfig?.showMap !== false\">\r\n        <ng-container *ngIf=\"config.locationConfig?.googleMapsApiKey; else simpleEmbed\">\r\n          <div [id]=\"'loc-map-' + config.name\" class=\"loc-map-frame w-100 d-block border-none\"\r\n            [style.height]=\"config.locationConfig?.mapHeight || '300px'\"></div>\r\n        </ng-container>\r\n        <ng-template #simpleEmbed>\r\n          <iframe class=\"loc-map-frame w-100 d-block border-none\"\r\n            [style.height]=\"config.locationConfig?.mapHeight || '300px'\" [src]=\"getLocationMapEmbedUrl() | trustedUrl\"\r\n            frameborder=\"0\" allowfullscreen loading=\"lazy\">\r\n          </iframe>\r\n        </ng-template>\r\n      </div>\r\n\r\n      <!-- Map hint -->\r\n      <p class=\"loc-map-hint m-0 text-center fs-0-78rem c-6B7280\">\r\n        {{ controller.labels['LBL_LOC_MAP_HINT'] || 'Type the venue address. A map will appear to assist you.' }}\r\n      </p>\r\n    </div>\r\n\r\n    <!-- ONLINE TAB -->\r\n    <div *ngIf=\"locationActiveTab === 'ONLINE'\" class=\"loc-panel loc-online-panel d-flex flex-column gap-12\">\r\n      <p class=\"loc-section-label m-0 font-weight-600 c-111827 fs-0-9rem\">\r\n        {{ controller.labels['LBL_LOC_ONLINE_URL'] || 'Event URL' }}\r\n      </p>\r\n      <div class=\"loc-search-wrapper position-relative d-flex align-items-center mt-4\">\r\n        <mat-icon class=\"loc-search-icon position-absolute fs-1-1rem c-9CA3AF pe-none\">link</mat-icon>\r\n        <input\r\n          class=\"field-input loc-search-input w-100 font-poppins flex-1 fs-0-875rem c-111827 br-7px br-8px bc-F3F4F6 pl-2-4rem bc-DC2626 pt-0-625rem pb-0-625rem pl-16px pr-16px bc-ffffff b-1px-solid-D1D5DB pr-3-5rem\"\r\n          type=\"url\"\r\n          [placeholder]=\"config.locationConfig?.onlinePlaceholder || (controller.labels['PH_LOC_ONLINE'] || 'https://zoom.us/j/...')\"\r\n          [value]=\"locationOnlineUrl\" (input)=\"onLocationUrlChange($any($event.target).value)\"\r\n          [class.is-invalid]=\"errorMessage\">\r\n      </div>\r\n    </div>\r\n\r\n    <!-- TBA TAB -->\r\n    <div *ngIf=\"locationActiveTab === 'TBA'\"\r\n      class=\"loc-panel loc-tba-panel d-flex flex-column gap-12 justify-content-center\">\r\n      <div\r\n        class=\"loc-tba-content d-flex flex-column align-items-center justify-content-center text-center gap-12 p-32px-24px b-F9FAFB b-1px-dashed-D1D5DB br-10px\">\r\n        <mat-icon class=\"loc-tba-icon fs-40px c-9CA3AF\">schedule</mat-icon>\r\n        <p class=\"loc-tba-text m-0 c-6B7280 fs-0-9rem\">\r\n          {{ controller.labels['LBL_LOC_TBA_DESC'] || \"This event's location is yet to be announced. Check back later\r\n          for updates.\" }}\r\n        </p>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Hidden real form control -->\r\n    <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n  <!-- ══ Link List Input ════════════════════════════════════════════════════ -->\r\n  <div *ngIf=\"isLinkList\" class=\"field-wrapper d-flex flex-column gap-6\" [formGroup]=\"formGroup\">\r\n    <label *ngIf=\"config.label\" class=\"field-label d-block font-poppins c-202124 fs-18px\">\r\n      {{ controller.labels[config.label] || config.label }}\r\n      <span class=\"required c-DC2626 ml-0-125rem\" *ngIf=\"config.required\">*</span>\r\n    </label>\r\n\r\n    <!-- Top Links list (if listPosition === 'top') -->\r\n    <div *ngIf=\"linkListConfig?.listPosition === 'top' && linkListItems.length > 0\" class=\"link-list-container mb-8px\">\r\n      <ul class=\"link-items-list p-0 m-0\" \r\n          [style.display]=\"'grid'\"\r\n          [style.gridTemplateColumns]=\"'repeat(12, 1fr)'\"\r\n          [style.gap]=\"'12px 16px'\">\r\n        <li *ngFor=\"let item of linkListItems; let idx = index\" \r\n            class=\"link-list-item\"\r\n            [style.gridColumn]=\"'span ' + (linkListConfig?.colSpan || 12)\">\r\n          <!-- Normal display mode -->\r\n          <ng-container *ngIf=\"editingLinkIndex !== idx\">\r\n            <span class=\"link-url-text text-truncate font-weight-500 color-333\">{{ getLinkDisplayUrl(item) }}</span>\r\n            <div class=\"link-item-actions d-flex align-items-center gap-12px\">\r\n              <button type=\"button\" class=\"action-btn edit-btn\" \r\n                      *ngIf=\"linkListConfig?.editable !== false\" (click)=\"startEditLink(idx)\" [title]=\"controller.labels['COMMON.ACTIONS.EDIT'] || 'Edit'\">\r\n                <mat-icon>edit</mat-icon>\r\n              </button>\r\n              <button type=\"button\" class=\"action-btn delete-btn\" \r\n                      *ngIf=\"linkListConfig?.deleteable !== false\" (click)=\"deleteLinkItem(idx)\" [title]=\"controller.labels['COMMON.ACTIONS.DELETE'] || 'Delete'\">\r\n                <mat-icon>delete_outline</mat-icon>\r\n              </button>\r\n            </div>\r\n          </ng-container>\r\n\r\n          <!-- Inline Edit mode -->\r\n          <ng-container *ngIf=\"editingLinkIndex === idx\">\r\n            <div class=\"edit-input-wrapper d-flex align-items-center gap-8px w-100\">\r\n              <input type=\"text\" class=\"field-input flex-1 py-4px\" [(ngModel)]=\"editingLinkValue\" \r\n                     [ngModelOptions]=\"{standalone: true}\" (keydown.enter)=\"saveEditLink(idx)\" (keydown.escape)=\"cancelEditLink()\"\r\n                     (input)=\"linkValidationError = ''\">\r\n              <button type=\"button\" class=\"action-btn save-btn\" (click)=\"saveEditLink(idx)\" [title]=\"controller.labels['COMMON.ACTIONS.SAVE'] || 'Save'\">\r\n                <mat-icon>check</mat-icon>\r\n              </button>\r\n              <button type=\"button\" class=\"action-btn cancel-btn\" (click)=\"cancelEditLink()\" [title]=\"controller.labels['COMMON.ACTIONS.CANCEL'] || 'Cancel'\">\r\n                <mat-icon>close</mat-icon>\r\n              </button>\r\n            </div>\r\n          </ng-container>\r\n        </li>\r\n      </ul>\r\n    </div>\r\n\r\n    <!-- Input text + plus icon -->\r\n    <div class=\"input-group position-relative d-flex w-100\">\r\n      <input type=\"text\" class=\"field-input pe-40px\" [placeholder]=\"controller.labels[config.placeholder!] || config.placeholder || controller.labels['COMMON.ENTER_LINK'] || 'Enter link...'\"\r\n             [(ngModel)]=\"newLinkInputValue\" [ngModelOptions]=\"{standalone: true}\" (keydown.enter)=\"addLinkItem($event)\"\r\n             [disabled]=\"config.readonly || config.disabled\"\r\n             (input)=\"linkValidationError = ''\">\r\n      \r\n      <button type=\"button\" class=\"position-absolute right-8px top-50-percent translate-y-minus-50 d-flex align-items-center justify-content-center b-none bg-none p-0 cursor-pointer color-primary\"\r\n              [disabled]=\"config.readonly || config.disabled || !newLinkInputValue?.trim()\"\r\n              (click)=\"addLinkItem()\" style=\"right: 8px; top: 50%; transform: translateY(-50%); z-index: 10;\">\r\n        <mat-icon>add</mat-icon>\r\n      </button>\r\n    </div>\r\n\r\n    <!-- Validation error message -->\r\n    <span class=\"field-error color-error fs-0-75rem mt-4px d-block\" *ngIf=\"linkValidationError\">{{ linkValidationError }}</span>\r\n\r\n    <!-- Bottom Links list (if listPosition !== 'top') -->\r\n    <div *ngIf=\"linkListConfig?.listPosition !== 'top' && linkListItems.length > 0\" class=\"link-list-container mt-8px\">\r\n      <ul class=\"link-items-list p-0 m-0\" \r\n          [style.display]=\"'grid'\"\r\n          [style.gridTemplateColumns]=\"'repeat(12, 1fr)'\"\r\n          [style.gap]=\"'12px 16px'\">\r\n        <li *ngFor=\"let item of linkListItems; let idx = index\" \r\n            class=\"link-list-item\"\r\n            [style.gridColumn]=\"'span ' + (linkListConfig?.colSpan || 12)\">\r\n          <!-- Normal display mode -->\r\n          <ng-container *ngIf=\"editingLinkIndex !== idx\">\r\n            <span class=\"link-url-text text-truncate font-weight-500 color-333\">{{ getLinkDisplayUrl(item) }}</span>\r\n            <div class=\"link-item-actions d-flex align-items-center gap-12px\">\r\n              <button type=\"button\" class=\"action-btn edit-btn\" \r\n                      *ngIf=\"linkListConfig?.editable !== false\" (click)=\"startEditLink(idx)\" [title]=\"controller.labels['COMMON.ACTIONS.EDIT'] || 'Edit'\">\r\n                <mat-icon>edit</mat-icon>\r\n              </button>\r\n              <button type=\"button\" class=\"action-btn delete-btn\" \r\n                      *ngIf=\"linkListConfig?.deleteable !== false\" (click)=\"deleteLinkItem(idx)\" [title]=\"controller.labels['COMMON.ACTIONS.DELETE'] || 'Delete'\">\r\n                <mat-icon>delete_outline</mat-icon>\r\n              </button>\r\n            </div>\r\n          </ng-container>\r\n\r\n          <!-- Inline Edit mode -->\r\n          <ng-container *ngIf=\"editingLinkIndex === idx\">\r\n            <div class=\"edit-input-wrapper d-flex align-items-center gap-8px w-100\">\r\n              <input type=\"text\" class=\"field-input flex-1 py-4px\" [(ngModel)]=\"editingLinkValue\" \r\n                     [ngModelOptions]=\"{standalone: true}\" (keydown.enter)=\"saveEditLink(idx)\" (keydown.escape)=\"cancelEditLink()\"\r\n                     (input)=\"linkValidationError = ''\">\r\n              <button type=\"button\" class=\"action-btn save-btn\" (click)=\"saveEditLink(idx)\" [title]=\"controller.labels['COMMON.ACTIONS.SAVE'] || 'Save'\">\r\n                <mat-icon>check</mat-icon>\r\n              </button>\r\n              <button type=\"button\" class=\"action-btn cancel-btn\" (click)=\"cancelEditLink()\" [title]=\"controller.labels['COMMON.ACTIONS.CANCEL'] || 'Cancel'\">\r\n                <mat-icon>close</mat-icon>\r\n              </button>\r\n            </div>\r\n          </ng-container>\r\n        </li>\r\n      </ul>\r\n    </div>\r\n\r\n    <!-- Hidden real form control -->\r\n    <input type=\"hidden\" [formControlName]=\"config.name!\">\r\n\r\n    <span class=\"field-hint c-6B7280 fs-0-75rem\" *ngIf=\"config.hint && !errorMessage\">{{ controller.labels[config.hint] || config.hint }}</span>\r\n    <span class=\"field-error color-error fs-0-75rem\" *ngIf=\"errorMessage\">{{ errorMessage }}</span>\r\n  </div>\r\n\r\n</div>","import { Component, inject } from '@angular/core';\r\nimport { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar';\r\nimport { SnackbarConfig } from '../models/snackbar.models';\r\n\r\n@Component({\r\n  selector: 'lib-snackbar',\r\n  templateUrl: './snackbar.component.html',\r\n  styleUrls: ['./snackbar.component.scss'],\r\n  standalone: false\r\n})\r\nexport class SnackbarComponent {\r\n  public data: SnackbarConfig = inject(MAT_SNACK_BAR_DATA);\r\n  public snackBarRef: MatSnackBarRef<SnackbarComponent> = inject(MatSnackBarRef);\r\n\r\n  get variantClass(): string {\r\n    return `snackbar-${this.data.variant || 'info'}`;\r\n  }\r\n}\r\n","<div class=\"cc-snackbar-container\" [ngClass]=\"variantClass\">\r\n  <div class=\"cc-snackbar-icon\">\r\n    <!-- Success Icon -->\r\n    <svg *ngIf=\"data.variant === 'success'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n      <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"></path>\r\n      <polyline points=\"22 4 12 14.01 9 11.01\"></polyline>\r\n    </svg>\r\n    \r\n    <!-- Error Icon -->\r\n    <svg *ngIf=\"data.variant === 'error'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n      <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n      <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"></line>\r\n      <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"></line>\r\n    </svg>\r\n    \r\n    <!-- Warning Icon -->\r\n    <svg *ngIf=\"data.variant === 'warning'\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n      <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\r\n      <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\r\n      <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\r\n    </svg>\r\n    \r\n    <!-- Info Icon -->\r\n    <svg *ngIf=\"data.variant === 'info' || !data.variant\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n      <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n      <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line>\r\n      <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line>\r\n    </svg>\r\n  </div>\r\n  \r\n  <div class=\"cc-snackbar-message\">\r\n    {{ data.message }}\r\n  </div>\r\n\r\n  <button *ngIf=\"data.showCloseButton\" class=\"cc-snackbar-close\" (click)=\"snackBarRef.dismiss()\">\r\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n      <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n      <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n    </svg>\r\n  </button>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';\r\nimport { SnackbarConfig } from '../models/snackbar.models';\r\nimport { SnackbarComponent } from '../components/snackbar.component';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SnackbarService {\r\n\r\n  constructor(private snackBar: MatSnackBar) {}\r\n\r\n  show(config: SnackbarConfig): void {\r\n    const matConfig: MatSnackBarConfig = {\r\n      duration: config.duration ?? 5000,\r\n      horizontalPosition: config.horizontalPosition ?? 'right',\r\n      verticalPosition: config.verticalPosition ?? 'top',\r\n      panelClass: ['cc-snackbar-panel', `cc-snackbar-${config.variant || 'info'}`],\r\n      data: config // Pass the entire config down to the component\r\n    };\r\n    \r\n    this.snackBar.openFromComponent(SnackbarComponent, matConfig);\r\n  }\r\n\r\n  success(message: string, duration?: number): void {\r\n    this.show({ message, variant: 'success', duration });\r\n  }\r\n\r\n  error(message: string, duration?: number): void {\r\n    this.show({ message, variant: 'error', duration });\r\n  }\r\n\r\n  warning(message: string, duration?: number): void {\r\n    this.show({ message, variant: 'warning', duration });\r\n  }\r\n\r\n  info(message: string, duration?: number): void {\r\n    this.show({ message, variant: 'info', duration });\r\n  }\r\n}\r\n","import { Component, Input, OnInit, OnDestroy } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\r\nimport { SectionConfig, FieldConfig } from '../../models/form-schema.model';\r\nimport { SmartFormController } from '../../services/smart-form-controller.service';\r\nimport { ExpressionService } from '../../services/expression.service';\r\n\r\n@Component({\r\n  selector: 'lib-form-section',\r\n  templateUrl: './form-section.component.html',\r\n  styleUrls: ['./form-section.component.scss'],\r\n  standalone: false\r\n})\r\nexport class FormSectionComponent implements OnInit, OnDestroy {\r\n  @Input() config!: SectionConfig;\r\n  @Input() controller!: SmartFormController;\r\n  @Input() formGroup!: FormGroup;\r\n\r\n  /**\r\n   * For allowMulti sections: the FormArray registered on the root formGroup.\r\n   * Each element is a FormGroup representing one repeater instance.\r\n   */\r\n  repeaterFormArray!: FormArray;\r\n\r\n  /** Tracks which accordion panels are open (by index). New instances start expanded. */\r\n  expandedInstances = new Set<number>();\r\n\r\n  /**\r\n   * The key under which the FormArray is registered in the root formGroup.\r\n   * Falls back to config.name or a generated key.\r\n   */\r\n  get arrayKey(): string {\r\n    return this.config.name || '__repeater__';\r\n  }\r\n\r\n  constructor(\r\n    private fb: FormBuilder,\r\n    private expressionService: ExpressionService\r\n  ) { }\r\n\r\n  isFieldVisible(field: FieldConfig): boolean {\r\n    if (!field) return false;\r\n    if (field.isEnabled === false) return false;\r\n    if (field.visible === false) return false;\r\n    if (field.visibilityExpression && this.controller) {\r\n      return this.expressionService.evaluateCondition(\r\n        field.visibilityExpression,\r\n        this.controller.getAllData()\r\n      );\r\n    }\r\n    return true;\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    if (this.config.allowMulti) {\r\n      this.repeaterFormArray = this.fb.array([]);\r\n      this.formGroup.addControl(this.arrayKey, this.repeaterFormArray);\r\n      // Start with one empty instance\r\n      this.addInstance();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.config.allowMulti && this.formGroup.contains(this.arrayKey)) {\r\n      this.formGroup.removeControl(this.arrayKey);\r\n    }\r\n  }\r\n\r\n  // ── Repeater helpers ──────────────────────────────────────────────────────\r\n\r\n  /** Creates a fresh FormGroup for one repeater instance */\r\n  private createInstanceGroup(): FormGroup {\r\n    return this.fb.group({});\r\n  }\r\n\r\n  addInstance(): void {\r\n    const newIndex = this.repeaterFormArray.length;\r\n    // Require the last existing instance to be valid before allowing another — otherwise\r\n    // a user can stack up multiple incomplete entries (e.g. several \"Parent Details\" rows\r\n    // all missing the required name) with no indication anything is wrong until final submit.\r\n    if (newIndex > 0) {\r\n      const lastGroup = this.repeaterFormArray.at(newIndex - 1) as FormGroup;\r\n      lastGroup.markAllAsTouched();\r\n      if (lastGroup.invalid) {\r\n        this.expandedInstances.clear();\r\n        this.expandedInstances.add(newIndex - 1);\r\n        return;\r\n      }\r\n    }\r\n    this.repeaterFormArray.push(this.createInstanceGroup());\r\n    // Collapse all existing panels; expand only the new one\r\n    this.expandedInstances.clear();\r\n    this.expandedInstances.add(newIndex);\r\n  }\r\n\r\n  removeInstance(index: number): void {\r\n    if (this.repeaterFormArray.length > 1) {\r\n      this.repeaterFormArray.removeAt(index);\r\n      // Rebuild expanded set to account for shifted indices\r\n      const updated = new Set<number>();\r\n      this.expandedInstances.forEach(i => {\r\n        if (i < index) updated.add(i);\r\n        else if (i > index) updated.add(i - 1);\r\n      });\r\n      this.expandedInstances = updated;\r\n    }\r\n  }\r\n\r\n  toggleInstance(index: number): void {\r\n    if (this.expandedInstances.has(index)) {\r\n      this.expandedInstances.delete(index);\r\n    } else {\r\n      this.expandedInstances.add(index);\r\n    }\r\n  }\r\n\r\n  isExpanded(index: number): boolean {\r\n    return this.expandedInstances.has(index);\r\n  }\r\n\r\n  getInstanceGroup(index: number): FormGroup {\r\n    return this.repeaterFormArray.at(index) as FormGroup;\r\n  }\r\n\r\n  get instanceGroups(): FormGroup[] {\r\n    return this.repeaterFormArray.controls as FormGroup[];\r\n  }\r\n\r\n  // ── Non-repeater: flat single FormGroup (root formGroup passed through) ──\r\n\r\n  /** For non-allowMulti sections we simply pass the root formGroup down */\r\n  get flatFormGroup(): FormGroup {\r\n    return this.formGroup;\r\n  }\r\n\r\n  // ── Collect nested fields for a given child ───────────────────────────────\r\n  /** Flatten a field tree to get all leaf fields (for ROW children etc.) */\r\n  getFlatFields(fields: FieldConfig[]): FieldConfig[] {\r\n    const result: FieldConfig[] = [];\r\n    fields.forEach(f => {\r\n      if (f.type === 'ROW' && f.children) {\r\n        result.push(...this.getFlatFields(f.children));\r\n      } else {\r\n        result.push(f);\r\n      }\r\n    });\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * trackBy function for field *ngFor loops.\r\n   * Keying by field name (or type as fallback for unnamed containers) prevents\r\n   * Angular from destroying and recreating FormFieldComponent instances when the\r\n   * parent re-renders — preserving localOptionList cache and avoiding duplicate\r\n   * API calls.\r\n   */\r\n  trackByFieldName(_: number, field: FieldConfig): string {\r\n    return field.name || field.type;\r\n  }\r\n}\r\n","<div class=\"form-section-container\">\r\n  <h3 class=\"section-label\" *ngIf=\"config.label && !config.allowMulti\">{{ config.label }}</h3>\r\n\r\n  <!-- ══ Repeater (allowMulti) ══════════════════════════════════════════════ -->\r\n  <ng-container *ngIf=\"config.allowMulti\">\r\n    <h3 class=\"section-label\">{{ config.label }}</h3>\r\n\r\n    <div *ngFor=\"let instanceGroup of instanceGroups; let i = index\"\r\n      class=\"accordion-instance\"\r\n      [class.is-expanded]=\"isExpanded(i)\">\r\n\r\n      <!-- Accordion header (always visible) -->\r\n      <div class=\"accordion-header\" (click)=\"toggleInstance(i)\" role=\"button\" [attr.aria-expanded]=\"isExpanded(i)\">\r\n        <div class=\"accordion-header-left\">\r\n          <span class=\"instance-badge\">{{ i + 1 }}</span>\r\n          <span class=\"instance-title\">{{ config.label }} #{{ i + 1 }}</span>\r\n        </div>\r\n        <div class=\"accordion-header-right\">\r\n          <button type=\"button\" class=\"accordion-remove-btn\"\r\n            *ngIf=\"instanceGroups.length > 1\"\r\n            (click)=\"$event.stopPropagation(); removeInstance(i)\"\r\n            aria-label=\"Remove instance\">\r\n            <mat-icon>delete_outline</mat-icon>\r\n          </button>\r\n          <mat-icon class=\"accordion-chevron\">\r\n            {{ isExpanded(i) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n          </mat-icon>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Accordion body (always mounted so form controls survive collapse) -->\r\n      <div class=\"accordion-body\" [hidden]=\"!isExpanded(i)\">\r\n        <div class=\"section-fields sf-grid\">\r\n          <ng-container *ngFor=\"let field of config.children; trackBy: trackByFieldName\">\r\n            <lib-form-field #sectionRepeaterFieldRef\r\n              class=\"sf-col\"\r\n              [style.gridColumn]=\"'span ' + (field.colSpan || 12)\"\r\n              *ngIf=\"isFieldVisible(field)\"\r\n              [config]=\"field\" [controller]=\"controller\" [formGroup]=\"instanceGroup\"\r\n              [siblingFormArray]=\"repeaterFormArray\" [siblingIndex]=\"i\">\r\n            </lib-form-field>\r\n          </ng-container>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Full-width dashed Add button -->\r\n    <button type=\"button\" class=\"btn-add-section\" (click)=\"addInstance()\">\r\n      <mat-icon>add</mat-icon> Add {{ config.label }}\r\n    </button>\r\n  </ng-container>\r\n\r\n  <!-- ══ Non-repeater (single instance) ════════════════════════════════════ -->\r\n  <ng-container *ngIf=\"!config.allowMulti\">\r\n    <div class=\"section-fields sf-grid\">\r\n      <ng-container *ngFor=\"let field of config.children; trackBy: trackByFieldName\">\r\n        <lib-form-field #sectionFlatFieldRef\r\n          class=\"sf-col\"\r\n          [style.gridColumn]=\"'span ' + (field.colSpan || 12)\"\r\n          *ngIf=\"isFieldVisible(field)\"\r\n          [config]=\"field\" [controller]=\"controller\" [formGroup]=\"flatFormGroup\">\r\n        </lib-form-field>\r\n      </ng-container>\r\n    </div>\r\n  </ng-container>\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, OnChanges, SimpleChanges, Output, QueryList, ViewChildren } from '@angular/core';\nimport { FormArray, FormBuilder, FormGroup } from '@angular/forms';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { ActionBarConfig, ActionButtonConfig, ActionConfig, FieldConfig, FormSchema } from '../../models/form-schema.model';\nimport { SmartFormController } from '../../services/smart-form-controller.service';\nimport { ExpressionService } from '../../services/expression.service';\nimport { SmartFormTranslationUtils } from '../../utils/translation.utils';\nimport { SnackbarService } from '../../../snackbar/services/snackbar.service';\nimport { FormFieldComponent } from '../form-field/form-field.component';\nimport { Subject, takeUntil } from 'rxjs';\n\n@Component({\n  selector: 'lib-smart-form',\n  templateUrl: './smart-form.component.html',\n  styleUrls: ['./smart-form.component.scss'],\n  providers: [SmartFormController],\n  standalone: false\n})\nexport class SmartFormComponent implements OnInit, OnChanges, OnDestroy {\n  @ViewChildren(FormFieldComponent) formFieldComponents!: QueryList<FormFieldComponent>;\n\n  private destroy$ = new Subject<void>();\n  @Input() formJson!: string;\n  @Input() initialValues?: { [key: string]: any };\n  @Input() enableDraftAutoSave: boolean = false;\n  /** Flat i18n labels map passed by the consuming app.\n   *  After JSON parse the schema is walked and every string value that\n   *  matches a key in this map is replaced with the translated value.\n   *  Mirrors the pattern used by ConfigurableFormComponent + translateConfig.\n   */\n  @Input() labels: any = {};\n  @Input() mode: 'CREATE' | 'EDIT' = 'CREATE';\n  /** When true, all form fields are disabled and the action bar is hidden (preview/read-only mode). */\n  @Input() readOnly: boolean = false;\n  /** Selected options details passed dynamically from parent component to resolve edit-mode dropdown labels */\n  @Input() selectedOptionsData?: { [key: string]: any };\n\n  @Output() submit = new EventEmitter<{ [key: string]: any }>();\n  @Output() draftSave = new EventEmitter<string>();\n  /**\n   * Emitted when a button with a custom `type` (not 'cancel', 'draft', or\n   * 'submit') is clicked. Payload contains the button `id` and the current\n   * form data snapshot.\n   */\n  @Output() actionClick = new EventEmitter<{ id: string; formData: { [key: string]: any } }>();\n  @Output() valueChange = new EventEmitter<{ [key: string]: any }>();\n  @Output() fileAdded = new EventEmitter<any>();\n  @Output() fileUploadFinished = new EventEmitter<any>();\n  @Output() fileRemoved = new EventEmitter<any>();\n  /** Emitted when a suffixActionIcon is clicked. Payload: { fieldName, actionId } */\n  @Output() suffixActionClick = new EventEmitter<{ fieldName: string; actionId: string }>();\n  /** Emitted whenever the active section step changes. Carries current state so the\n   *  host can show/hide Previous/Next/Submit buttons in its own footer. */\n  @Output() stepChange = new EventEmitter<{\n    currentStep: number;\n    totalSteps: number;\n    isFirst: boolean;\n    isLast: boolean;\n    stepLabel: string;\n  }>();\n\n  formSchema!: FormSchema;\n  formGroup!: FormGroup;\n  fieldList: FieldConfig[] = [];\n  isStepper: boolean = false;\n  currentStep: number = 0;\n  isLoading: boolean = false;\n  isDraftLoading: boolean = false;\n\n  /** True when sectionStepper mode is active (SECTION form with top-level GROUPs as steps). */\n  isSectionStepper: boolean = false;\n  /** Index of the currently visible section step. */\n  currentSectionStep: number = 0;\n  /** Flat list of top-level GROUP FieldConfigs that become the stepper steps. */\n  sectionSteps: FieldConfig[] = [];\n  /** Validation state per section step — drives badge colour/icon. */\n  stepValidationStates: ('untouched' | 'valid' | 'warning')[] = [];\n  /** Flat field-name lists per step used for targeted validation. */\n  private stepFieldNames: string[][] = [];\n\n  /** Controls skeleton visibility. Stays false until schema is parsed AND\n   *  any EDIT-mode data fetch completes, but always shows for at least\n   *  SKELETON_MIN_MS so the animation is visible even on fast loads. */\n  isFormReady = false;\n  private readonly SKELETON_MIN_MS = 350;\n  private _skeletonStart = 0;\n\n  constructor(\n    private fb: FormBuilder,\n    public controller: SmartFormController,\n    private expressionService: ExpressionService,\n    private http: HttpClient,\n    private snackbarService: SnackbarService,\n    private router: Router,\n    private cdr: ChangeDetectorRef\n  ) { }\n\n  ngOnInit(): void {\n    this._skeletonStart = Date.now();\n    this._startForm();\n    this.controller.fileAdded$.pipe(takeUntil(this.destroy$)).subscribe(file => this.fileAdded.emit(file));\n    this.controller.fileUploadFinished$.pipe(takeUntil(this.destroy$)).subscribe(file => this.fileUploadFinished.emit(file));\n    this.controller.fileRemoved$.pipe(takeUntil(this.destroy$)).subscribe(file => this.fileRemoved.emit(file));\n    this.controller.suffixActionClick$.pipe(takeUntil(this.destroy$)).subscribe(data => this.suffixActionClick.emit(data));\n  }\n\n  loadEditData(): void {\n    const config = this.formSchema.editConfig!;\n    this.isLoading = true;\n    const headers = this.getHeaders();\n    this.http.get(config.loadApiUrl, { headers }).subscribe({\n      next: (response: any) => {\n        this.initialValues = response;\n        this.controller.initialize(this.initialValues || {});\n        this.isLoading = false;\n        this._markReady();\n      },\n      error: (err) => {\n        this.showAlert('error', config.errorMessage || 'Failed to load form data', config.snackbarConfig);\n        console.error('Load data error:', err);\n        this.isLoading = false;\n        this._markReady();\n      }\n    });\n  }\n\n  /** Flips isFormReady=true after the skeleton has been visible for at least SKELETON_MIN_MS. */\n  private _markReady(): void {\n    const elapsed = Date.now() - this._skeletonStart;\n    const remaining = Math.max(0, this.SKELETON_MIN_MS - elapsed);\n    setTimeout(() => {\n      this.isFormReady = true;\n      // markForCheck propagates dirty up through any OnPush ancestor components\n      // (e.g. configurator-config-panel) so the skeleton-to-form transition\n      // renders in the same zone tick rather than waiting for a future user event.\n      this.cdr.markForCheck();\n    }, remaining);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['formJson'] && !changes['formJson'].isFirstChange()) {\n      this._startForm();\n    }\n    if (changes['labels'] && !changes['labels'].isFirstChange() && this.formSchema) {\n      this._startForm();\n    }\n    if (changes['selectedOptionsData'] && this.formSchema) {\n      this.controller.selectedOptionsData = this.selectedOptionsData || {};\n      this.formFieldComponents?.forEach(field => field.mergeSelectedOptionsIntoList());\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.controller.destroy();\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  /** Public backward-compatible entry point — delegates to _startForm. */\n  parseFormJson(): void {\n    this._startForm();\n  }\n\n  private _startForm(): void {\n    if (!this.formJson) return;\n    let schema: any;\n    try {\n      schema = JSON.parse(this.formJson);\n    } catch (e) {\n      console.error('SmartForm: invalid formJson', e);\n      return;\n    }\n    this._applySchema(schema);\n  }\n\n  private _applySchema(schema: any): void {\n    this.formSchema = schema as FormSchema;\n    this.controller.selectedOptionsData = this.selectedOptionsData || {};\n    this.controller.token = this.formSchema.token;\n    this.controller.tokenHeader = this.formSchema.tokenHeader;\n    if (this.labels && Object.keys(this.labels).length) {\n      SmartFormTranslationUtils.translateSchema(this.formSchema, this.labels);\n    }\n    this.controller.labels = this.labels;\n    this.controller.actionLabels = this.formSchema.labels;\n    this.isStepper = this.formSchema.formType === 'STEPPER';\n    this.fieldList = this.isStepper\n      ? (this.formSchema.stepperConfig?.children || []).filter(step => step.isEnabled !== false && step.sectionConfig?.isEnabled !== false)\n      : (this.formSchema.sectionConfig?.children || []).filter(field => field.isEnabled !== false);\n    const topLevelGroups = this.fieldList.filter(f => f.type === 'GROUP' && f.sectionConfig);\n    // >= 1, not > 1: when every top-level field is a GROUP, that's the section-stepper\n    // layout regardless of how many groups survive the isEnabled filter above. The\n    // non-stepper \"Regular SECTION form\" fallback (see the template) hands the WHOLE\n    // sectionConfig — including these GROUP children — to a single lib-form-section,\n    // which isn't built to expand GROUP-type children; requiring >1 group meant a schema\n    // reduced to exactly one enabled section (e.g. everything but \"Identity &\n    // Demographics\" toggled off) silently rendered nothing. The nav bar itself still\n    // hides for a single step (see template) so a lone section looks like a plain form.\n    this.isSectionStepper = !this.isStepper &&\n      (this.formSchema.sectionStepper === true ||\n        (this.formSchema.sectionStepper !== false && topLevelGroups.length === this.fieldList.length && topLevelGroups.length >= 1));\n    if (this.isSectionStepper) {\n      this.sectionSteps = topLevelGroups;\n      this.currentSectionStep = 0;\n      this.stepValidationStates = this.sectionSteps.map(() => 'untouched' as const);\n      this.stepFieldNames = this.sectionSteps.map(s => this._collectFieldNames(s.sectionConfig?.children || []));\n      setTimeout(() => this._emitStepChange());\n    }\n    // Pre-seed array values (allowMulti GROUP initial data) into the controller\n    // BEFORE initializeForm() runs. form-field.initGroupField() calls\n    // controller.getFieldValue(groupKey) during ngOnInit to determine how many\n    // rows to create — it must find the array already there or it falls back to\n    // a single empty row and loses all initial values.\n    if (this.initialValues) {\n      Object.entries(this.initialValues).forEach(([key, value]) => {\n        if (Array.isArray(value)) {\n          this.controller.updateField(key, value);\n        }\n      });\n    }\n    this.initializeForm();\n    if (this.mode === 'EDIT' && this.formSchema?.editConfig?.loadApiUrl) {\n      this.loadEditData();\n    } else if (this.initialValues) {\n      this.controller.initialize(this.initialValues);\n      this._markReady();\n    } else {\n      this._markReady();\n    }\n  }\n\n\n  initializeForm(): void {\n    this.formGroup = this.fb.group({});\n    this.collectFields(this.fieldList);\n\n    // In read-only mode, disable all controls so the form acts as a preview\n    if (this.readOnly) {\n      this.formGroup.disable();\n    }\n\n    // Emit value changes to parent (skipped in read-only mode)\n    if (!this.readOnly) {\n      this.formGroup.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\n        this.valueChange.emit(this.collectFormData());\n      });\n    }\n  }\n\n  collectFields(fields: FieldConfig[]): void {\n    fields.forEach(field => {\n      if (field.isEnabled === false || field.sectionConfig?.isEnabled === false) return;\n\n      // Flat leaf fields: seed controller with default values\n      if (field.name && field.type !== 'GROUP' && field.type !== 'ROW') {\n        // Check if initialValues already has a value for this field\n        const existingValue = this.initialValues?.[field.name];\n        const value = existingValue !== undefined\n          ? existingValue\n          : (field.defaultValue !== undefined ? field.defaultValue : null);\n        this.controller.updateField(field.name, value);\n      }\n      // Recurse into ROW children\n      if (field.type === 'ROW' && field.children?.length) {\n        this.collectFields(field.children);\n      }\n      // Recurse into GROUP children\n      if (field.type === 'GROUP' && field.sectionConfig?.children?.length) {\n        this.collectFields(field.sectionConfig.children);\n      }\n    });\n  }\n\n  // ───────────────────────────────────────────────────────────────────────────\n  // Submit\n  // ───────────────────────────────────────────────────────────────────────────\n\n  handleSubmit(): void {\n    if (this.isStepper && this.currentStep < this.fieldList.length - 1) {\n      if (this.validate()) this.nextStep();\n      return;\n    }\n    if (!this.validate()) return;\n\n    this.submitToApi(this.collectFormData(), 'submit');\n  }\n\n  // ───────────────────────────────────────────────────────────────────────────\n  // Cancel\n  // ───────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Universal action handler for any button click.\n   * One handler decides how to process based on action.kind.\n   */\n  handleButtonClick(btn: ActionButtonConfig): void {\n    const action = btn.action;\n    if (!action) return;\n\n    switch (action.kind) {\n      case 'submit':\n        this.handleSubmit();\n        break;\n      case 'draft':\n        this.submitToApi(this.collectFormData(), 'draft', btn);\n        break;\n      case 'navigate':\n        this.navigateTo(action.redirectUrl);\n        break;\n      case 'api':\n        this.fireActionApiCall(action);\n        break;\n      case 'emit':\n        this.actionClick.emit({ id: btn.id, formData: this.collectFormData() });\n        break;\n      case 'next':\n        if (this.validate()) this.nextStep();\n        break;\n      case 'prev':\n        this.previousStep();\n        break;\n    }\n  }\n\n  // ── Action-Redirects & API ──────────────────────────────────────────────────\n\n  private fireActionApiCall(action: ActionConfig): void {\n    if (!action.apiUrl) return;\n    const headers = this.getHeaders();\n    const method = action.method || 'POST';\n    const body = action.extraPayload || {};\n\n    this.isLoading = true;\n    this.http.request(method, action.apiUrl, { body, headers }).subscribe({\n      next: (response) => {\n        this.isLoading = false;\n        const msg = action.successMessage || 'Action successful';\n        this.showAlert('success', msg, action.snackbarConfig);\n        if (action.redirectUrl) this.navigateTo(action.redirectUrl);\n      },\n      error: (err) => {\n        this.isLoading = false;\n        const msg = action.errorMessage || 'Action failed';\n        this.showAlert('error', msg, action.snackbarConfig);\n        console.error('API Action error:', err);\n      }\n    });\n  }\n\n  /**\n   * Constructs nested payload by checking field properties on form controls.\n   */\n  collectFormData(): { [key: string]: any } {\n    const rawValue = this.extractGroupValue(this.formGroup);\n    let payload = this.buildNestedPayload(rawValue, this.fieldList);\n\n    // Merge extra fields based on the mode\n    const config = this.mode === 'EDIT' ? this.formSchema.editConfig : this.formSchema.submitConfig;\n    if (config?.extraPayload) {\n      payload = this.deepMerge(payload, config.extraPayload);\n    }\n\n    return payload;\n  }\n\n  /**\n   * Deep merges the source object (e.g. extraPayload) into the target object (e.g. form payload).\n   */\n  private deepMerge(target: any, source: any): any {\n    if (typeof target !== 'object' || target === null) {\n      return source;\n    }\n    if (typeof source !== 'object' || source === null) {\n      return source;\n    }\n\n    if (Array.isArray(target) && Array.isArray(source)) {\n      // For arrays, we merge objects at the same index\n      const maxLength = Math.max(target.length, source.length);\n      const mergedArray = [];\n      for (let i = 0; i < maxLength; i++) {\n        if (i < target.length && i < source.length) {\n          mergedArray.push(this.deepMerge(target[i], source[i]));\n        } else if (i < source.length) {\n          mergedArray.push(source[i]);\n        } else {\n          mergedArray.push(target[i]);\n        }\n      }\n      return mergedArray;\n    }\n\n    const merged = { ...target };\n    Object.keys(source).forEach(key => {\n      if (source[key] instanceof Object && key in target) {\n        merged[key] = this.deepMerge(target[key], source[key]);\n      } else {\n        merged[key] = source[key];\n      }\n    });\n    return merged;\n  }\n\n  private buildNestedPayload(rawValue: any, fields: FieldConfig[]): { [key: string]: any } {\n    if (rawValue === null || typeof rawValue !== 'object') return rawValue;\n\n    const payload: { [key: string]: any } = {};\n    const processedKeys = new Set<string>();\n\n    const processFields = (fieldList: FieldConfig[]) => {\n      fieldList.forEach(field => {\n        if (field.isEnabled === false || field.sectionConfig?.isEnabled === false) return;\n\n        if (field.type === 'ROW' && field.children) {\n          processFields(field.children);\n        } else if (field.type === 'GROUP' && field.sectionConfig?.children) {\n          // FormFieldComponent generates unnamed groups using their label inside the root FormGroup.\n          const generatedKey = field.sectionConfig.label\n            ? field.sectionConfig.label.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (w, i) => i === 0 ? w.toLowerCase() : w.toUpperCase()).replace(/\\s+/g, '')\n            : '';\n          const groupKey = field.sectionConfig.name || field.name || generatedKey || '__group__';\n          \n          processedKeys.add(groupKey);\n\n          const groupRawValue = rawValue[groupKey];\n          if (groupRawValue !== undefined) {\n            // Identify if it's purely a visual section vs an explicit structural data block\n            const isStructural = field.sectionConfig.name || field.name || field.sectionConfig.allowMulti;\n\n            if (!isStructural) {\n              // Visual section: Flatten its contents directly onto the target payload layer\n              Object.assign(payload, this.buildNestedPayload(groupRawValue, field.sectionConfig.children));\n            } else {\n              // Structural block: process nested mappings / array instances\n              const nestedData = (field.sectionConfig.allowMulti && Array.isArray(groupRawValue))\n                ? groupRawValue.map(item => this.buildNestedPayload(item, field.sectionConfig!.children!))\n                : this.buildNestedPayload(groupRawValue, field.sectionConfig.children);\n\n              if (field.payloadPath) {\n                this.setNestedValue(payload, field.payloadPath, nestedData);\n              } else {\n                payload[groupKey] = nestedData;\n              }\n            }\n          }\n        } else if (field.name) {\n          processedKeys.add(field.name);\n          if (rawValue[field.name] !== undefined) {\n            const val = rawValue[field.name];\n            if (field.payloadPath) {\n              this.setNestedValue(payload, field.payloadPath, val);\n            } else {\n              payload[field.name] = val;\n            }\n          }\n        }\n      });\n    };\n\n    processFields(fields);\n\n    // Preserve any hidden tracking keys (e.g. id, uuid, isEdit) that were present in the initial data\n    Object.keys(rawValue).forEach(key => {\n      if (!processedKeys.has(key)) {\n        payload[key] = rawValue[key];\n      }\n    });\n\n    return payload;\n  }\n\n  private setNestedValue(obj: any, path: string, value: any): void {\n    // Regex matches the property name and optionally an array index e.g. \"name[0]\" -> regex yields [\"name[0]\", \"name\", \"0\"]\n    const arrayRegex = /^([a-zA-Z0-9_]+)\\[(\\d+)\\]$/;\n\n    const parts = path.split('.');\n    let current = obj;\n\n    for (let i = 0; i < parts.length - 1; i++) {\n      const part = parts[i];\n      const match = part.match(arrayRegex);\n\n      if (match) {\n        const prop = match[1];\n        const index = parseInt(match[2], 10);\n        if (!current[prop]) current[prop] = [];\n        if (!current[prop][index]) current[prop][index] = {};\n        current = current[prop][index];\n      } else {\n        if (!current[part]) current[part] = {};\n        current = current[part];\n      }\n    }\n\n    const lastPart = parts[parts.length - 1];\n    const matchLast = lastPart.match(arrayRegex);\n    if (matchLast) {\n      const prop = matchLast[1];\n      const index = parseInt(matchLast[2], 10);\n      if (!current[prop]) current[prop] = [];\n      current[prop][index] = value;\n    } else {\n      current[lastPart] = value;\n    }\n  }\n\n  private extractGroupValue(group: FormGroup): { [key: string]: any } {\n    const result: { [key: string]: any } = {};\n    Object.keys(group.controls).forEach(key => {\n      const ctrl = group.controls[key];\n      if (ctrl instanceof FormArray) {\n        // Repeater → array of objects\n        result[key] = (ctrl.controls as FormGroup[]).map(fg => this.extractGroupValue(fg));\n      } else if (ctrl instanceof FormGroup) {\n        // Nested single group → nested object\n        result[key] = this.extractGroupValue(ctrl);\n      } else {\n        result[key] = ctrl?.value ?? null;\n      }\n    });\n    return result;\n  }\n\n  validate(): boolean {\n    if (this.formGroup.invalid) {\n      this.formGroup.markAllAsTouched();\n\n      // Re-open any repeater card/accordion entry whose nested fields are invalid,\n      // so its error messages (otherwise hidden behind a collapsed panel) become visible.\n      let hadHiddenInvalidEntry = false;\n      this.formFieldComponents?.forEach(field => {\n        if (field.revealInvalidInstances()) hadHiddenInvalidEntry = true;\n      });\n\n      const message = hadHiddenInvalidEntry\n        ? (this.controller.labels?.['ERR_MSG_HIDDEN_REQUIRED_FIELDS'] || 'Please fill in all required fields — some are inside a collapsed section.')\n        : (this.controller.labels?.['ERR_MSG_REQUIRED_FIELDS'] || 'Please fill in all required fields before submitting.');\n      this.showAlert('warning', message);\n\n      this.scrollToFirstInvalidControl();\n      return false;\n    }\n    return true;\n  }\n\n  scrollToFirstInvalidControl(): void {\n    setTimeout(() => {\n      // .is-invalid is set by form-field on actual control elements (not on <form>).\n      // The fallback targets native inputs/selects directly so we never accidentally\n      // scroll to the <form> element, which also receives .ng-invalid.ng-touched.\n      const firstInvalidControl =\n        document.querySelector('.is-invalid') ||\n        document.querySelector(\n          'input.ng-invalid.ng-touched, select.ng-invalid.ng-touched, textarea.ng-invalid.ng-touched'\n        );\n      if (firstInvalidControl) {\n        firstInvalidControl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    }, 100);\n  }\n\n  submitToApi(formData: any, actionType: 'submit' | 'draft' = 'submit', btn?: ActionButtonConfig): void {\n    const isEdit = this.mode === 'EDIT';\n    const configLine: any = isEdit ? this.formSchema.editConfig : this.formSchema.submitConfig;\n    const action = btn?.action;\n\n    // Build the final payload, merging draft extraPayload if applicable\n    let finalPayload = formData;\n    if (actionType === 'draft' && action?.extraPayload) {\n      finalPayload = this.deepMerge(finalPayload, action.extraPayload);\n    }\n\n    // Fallback for emitted outputs if no API URL is defined centrally\n    if (!configLine || (!configLine.apiUrl && !configLine.submitApiUrl)) {\n      if (actionType === 'draft') {\n        this.draftSave.emit(JSON.stringify(finalPayload));\n        if (action?.redirectUrl) this.navigateTo(action.redirectUrl);\n      } else {\n        this.submit.emit(finalPayload);\n      }\n      return;\n    }\n\n    const apiUrl = isEdit ? configLine.submitApiUrl : configLine.apiUrl;\n    const method = isEdit ? (configLine.submitMethod || 'PATCH') : (configLine.method || 'POST');\n    const headers = this.getHeaders();\n\n    // Messages and redirect URLs (Prefer button action overrides if present)\n    const successMsg = actionType === 'draft'\n      ? (action?.successMessage || 'Draft saved successfully')\n      : (action?.successMessage || configLine.successMessage || 'Form submitted successfully');\n\n    const errorMsg = actionType === 'draft'\n      ? (action?.errorMessage || 'Failed to save draft')\n      : (action?.errorMessage || configLine.errorMessage || 'Failed to submit form');\n\n    const redirectUrl = actionType === 'draft'\n      ? (action?.redirectUrl || configLine.redirectUrl)\n      : (action?.redirectUrl || configLine.redirectUrl);\n\n    if (actionType === 'draft') {\n      this.isDraftLoading = true;\n    } else {\n      this.isLoading = true;\n    }\n\n    this.http.request(method, apiUrl, { body: finalPayload, headers }).subscribe({\n      next: (response) => {\n        this.showAlert('success', successMsg, action?.snackbarConfig || configLine.snackbarConfig);\n\n        if (actionType === 'draft') {\n          this.draftSave.emit(JSON.stringify(response));\n          this.isDraftLoading = false;\n        } else {\n          this.submit.emit(response);\n          this.isLoading = false;\n        }\n\n        if (redirectUrl) {\n          setTimeout(() => this.navigateTo(redirectUrl), 1500);\n        }\n      },\n      error: (err) => {\n        this.showAlert('error', errorMsg, action?.snackbarConfig || configLine.snackbarConfig);\n        console.error(actionType === 'draft' ? 'Draft save error:' : 'Submit error:', err);\n        this.isLoading = false;\n        this.isDraftLoading = false;\n      }\n    });\n  }\n\n  showAlert(type: 'success' | 'error' | 'warning' | 'info', message: string, customConfig?: any): void {\n    this.snackbarService.show({\n      variant: type,\n      message: message,\n      showCloseButton: true,\n      ...customConfig\n    });\n  }\n\n  /** Builds HttpHeaders from the token stored in the controller (sourced from configJSON). */\n  getHeaders(): HttpHeaders {\n    let headers = new HttpHeaders();\n    if (this.controller.token) {\n      const headerName = this.controller.tokenHeader || 'Authorization';\n      headers = headers.set(headerName, this.controller.token);\n    }\n    return headers;\n  }\n\n  // ───────────────────────────────────────────────────────────────────────────\n  // Stepper\n  // ───────────────────────────────────────────────────────────────────────────\n\n  nextStep(): void {\n    if (this.currentStep < this.fieldList.length - 1) this.currentStep++;\n  }\n\n  previousStep(): void {\n    if (this.currentStep > 0) this.currentStep--;\n  }\n\n  get canGoNext(): boolean { return this.currentStep < this.fieldList.length - 1; }\n  get canGoPrevious(): boolean { return this.currentStep > 0; }\n  get currentStepConfig(): FieldConfig | undefined {\n    return this.isStepper ? this.fieldList[this.currentStep] : undefined;\n  }\n\n  // ── Section Stepper (public API called by host via ViewChild) ────────────────\n\n  /** Advance to the next section step. Called by the host footer \"Next\" button.\n   *  Validates the current step first — marks it valid (green) or warning (orange). */\n  navigateToNext(): void {\n    if (!this.isSectionStepper) return;\n    if (this.currentSectionStep < this.sectionSteps.length - 1) {\n      this._validateStep(this.currentSectionStep);\n      this.currentSectionStep++;\n      this._emitStepChange();\n    }\n  }\n\n  /** Go back to the previous section step. Called by the host footer \"Previous\" button. */\n  navigateToPrevious(): void {\n    if (!this.isSectionStepper) return;\n    if (this.currentSectionStep > 0) {\n      this.currentSectionStep--;\n      this._emitStepChange();\n    }\n  }\n\n  /** Jump directly to a specific section step by index.\n   *  Validates the step being left so the badge state updates correctly. */\n  goToSectionStep(index: number): void {\n    if (!this.isSectionStepper) return;\n    if (index < 0 || index >= this.sectionSteps.length || index === this.currentSectionStep) return;\n    this._validateStep(this.currentSectionStep);\n    this.currentSectionStep = index;\n    this._emitStepChange();\n  }\n\n  get isSectionStepFirst(): boolean { return this.currentSectionStep === 0; }\n  get isSectionStepLast(): boolean { return this.currentSectionStep === this.sectionSteps.length - 1; }\n\n  /** Returns the SectionConfig for a given step — passed to lib-form-section.\n   *  The outer label is intentionally omitted because the stepper nav already\n   *  displays it; showing it again inside the content would be redundant. */\n  getSectionStepConfig(step: FieldConfig): any {\n    const { label, ...rest } = step.sectionConfig! as any;\n    return rest;\n  }\n\n  private _emitStepChange(): void {\n    const step = this.sectionSteps[this.currentSectionStep];\n    this.stepChange.emit({\n      currentStep: this.currentSectionStep,\n      totalSteps: this.sectionSteps.length,\n      isFirst: this.isSectionStepFirst,\n      isLast: this.isSectionStepLast,\n      stepLabel: step?.sectionConfig?.label || `Step ${this.currentSectionStep + 1}`\n    });\n  }\n\n  /** Marks all controls in the given step as touched, records valid/warning state,\n   *  and returns whether the step had any invalid control. */\n  private _validateStep(stepIndex: number): boolean {\n    const names = this.stepFieldNames[stepIndex] || [];\n    let hasInvalid = false;\n    names.forEach(name => {\n      const ctrl = this.formGroup.get(name);\n      if (!ctrl) return;\n      if (ctrl instanceof FormArray) {\n        ctrl.controls.forEach(c => c.markAllAsTouched());\n        if (ctrl.invalid) hasInvalid = true;\n      } else if (ctrl instanceof FormGroup) {\n        ctrl.markAllAsTouched();\n        if (ctrl.invalid) hasInvalid = true;\n      } else {\n        ctrl.markAsTouched();\n        if (ctrl.invalid) hasInvalid = true;\n      }\n    });\n    this.stepValidationStates[stepIndex] = hasInvalid ? 'warning' : 'valid';\n    return hasInvalid;\n  }\n\n  /** Public hard-validation check for the host app: does the CURRENT step have any\n   *  invalid required field? navigateToNext()/goToSectionStep() only mark a step's badge\n   *  as a soft \"warning\" and still advance regardless — hosts that need to actually BLOCK\n   *  navigation until required fields are filled (e.g. the beneficiary add/edit wizard)\n   *  should call this before invoking navigateToNext(). Also marks the step's controls as\n   *  touched so the field-level error states render immediately. */\n  isCurrentStepValid(): boolean {\n    if (!this.isSectionStepper) return true;\n    return !this._validateStep(this.currentSectionStep);\n  }\n\n  /** Recursively collects all leaf field names from a set of FieldConfigs. */\n  private _collectFieldNames(fields: FieldConfig[]): string[] {\n    const names: string[] = [];\n    fields.forEach(f => {\n      if (f.isEnabled === false) return;\n      if (f.name && f.type !== 'GROUP' && f.type !== 'ROW') {\n        names.push(f.name);\n      }\n      if (f.type === 'ROW' && f.children?.length) {\n        names.push(...this._collectFieldNames(f.children));\n      }\n      if (f.type === 'GROUP' && f.sectionConfig?.children?.length) {\n        if (f.name || f.sectionConfig.name) {\n          names.push((f.name || f.sectionConfig.name)!);\n        }\n        names.push(...this._collectFieldNames(f.sectionConfig.children));\n      }\n    });\n    return names;\n  }\n\n  // ── Action Labels ──────────────────────────────────────────────────────────\n\n  get nextLabel(): string {\n    const key = this.formSchema?.labels?.nextLabel || 'Next';\n    return this.labels[key] || key;\n  }\n\n  get submitLabel(): string {\n    const btn = this.getButtonByActionKind('submit');\n    if (btn?.label) return this.labels[btn.label] || btn.label;\n    const key = this.formSchema?.labels?.submitLabel || 'Submit';\n    return this.labels[key] || key;\n  }\n\n  get previousLabel(): string {\n    const key = this.formSchema?.labels?.previousLabel || 'Previous';\n    return this.labels[key] || key;\n  }\n\n  // ── Action Bar helpers ─────────────────────────────────────────────────────\n\n  get actionBarConfig(): ActionBarConfig | undefined {\n    return this.formSchema?.actionBarConfig;\n  }\n\n  /**\n   * Returns buttons for a given alignment, sorted by `order` (stable).\n   */\n  getButtonsForAlignment(alignment: 'left' | 'right'): ActionButtonConfig[] {\n    return (this.actionBarConfig?.buttons || [])\n      .filter(b => !b.hidden && (b.alignment ?? 'right') === alignment)\n      .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n  }\n\n  getButtonLabel(btn: ActionButtonConfig): string {\n    if (btn.action?.kind === 'submit' && this.isStepper && this.canGoNext) {\n      return this.nextLabel;\n    }\n    const key = btn.label || btn.id;\n    return this.labels[key] || key;\n  }\n\n  isButtonDisabled(btn: ActionButtonConfig): boolean {\n    if (btn.disabled) return true;\n    const kind = btn.action?.kind;\n    if (kind === 'submit' || kind === 'draft' || kind === 'api') {\n      return this.isLoading || this.isDraftLoading;\n    }\n    return false;\n  }\n\n  private getButtonByActionKind(kind: string): ActionButtonConfig | undefined {\n    return (this.actionBarConfig?.buttons || []).find(b => b.action?.kind === kind);\n  }\n\n  // ── Navigation helper ──────────────────────────────────────────────────────\n\n  private navigateTo(url?: string): void {\n    if (!url) return;\n    if (url.startsWith('http://') || url.startsWith('https://')) {\n      window.location.href = url;\n    } else {\n      this.router.navigateByUrl(url);\n    }\n  }\n\n}\n","<div class=\"smart-form-container\">\r\n\r\n  <!-- ══ Skeleton loader ════════════════════════════════════════════════════ -->\r\n  <div class=\"smart-form-skeleton\" *ngIf=\"!isFormReady\" aria-hidden=\"true\">\r\n\r\n    <!-- Title + description -->\r\n    <div class=\"skel-header\">\r\n      <div class=\"skel-block skel-title\" style=\"--sd: 0s\"></div>\r\n      <div class=\"skel-block skel-desc\" style=\"--sd: 0.07s\"></div>\r\n    </div>\r\n\r\n    <!-- Section 1 — two full-width fields -->\r\n    <div class=\"skel-section\">\r\n      <div class=\"skel-block skel-section-label\" style=\"--sd: 0.1s; width: 32%\"></div>\r\n      <div class=\"skel-fields skel-fields--two\">\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.13s; width: 55%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.15s\"></div>\r\n        </div>\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.16s; width: 45%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.18s\"></div>\r\n        </div>\r\n        <div class=\"skel-field skel-field--full\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.2s; width: 38%\"></div>\r\n          <div class=\"skel-block skel-input skel-input--textarea\" style=\"--sd: 0.22s\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Section 2 — three columns -->\r\n    <div class=\"skel-section\">\r\n      <div class=\"skel-block skel-section-label\" style=\"--sd: 0.25s; width: 24%\"></div>\r\n      <div class=\"skel-fields skel-fields--three\">\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.28s; width: 60%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.30s\"></div>\r\n        </div>\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.31s; width: 50%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.33s\"></div>\r\n        </div>\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.34s; width: 65%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.36s\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Section 3 — two columns + chip row -->\r\n    <div class=\"skel-section\">\r\n      <div class=\"skel-block skel-section-label\" style=\"--sd: 0.38s; width: 28%\"></div>\r\n      <div class=\"skel-fields skel-fields--two\">\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.40s; width: 48%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.42s\"></div>\r\n        </div>\r\n        <div class=\"skel-field\">\r\n          <div class=\"skel-block skel-label\" style=\"--sd: 0.43s; width: 55%\"></div>\r\n          <div class=\"skel-block skel-input\" style=\"--sd: 0.45s\"></div>\r\n        </div>\r\n      </div>\r\n      <div class=\"skel-chips\">\r\n        <div class=\"skel-block skel-chip\" style=\"--sd: 0.47s; width: 72px\"></div>\r\n        <div class=\"skel-block skel-chip\" style=\"--sd: 0.49s; width: 96px\"></div>\r\n        <div class=\"skel-block skel-chip\" style=\"--sd: 0.51s; width: 80px\"></div>\r\n        <div class=\"skel-block skel-chip\" style=\"--sd: 0.53s; width: 64px\"></div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Action bar -->\r\n    <div class=\"skel-actions\">\r\n      <div class=\"skel-block skel-btn\" style=\"--sd: 0.55s; width: 88px\"></div>\r\n      <div class=\"skel-block skel-btn skel-btn--primary\" style=\"--sd: 0.58s; width: 120px\"></div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- ══════════════════════════════════════════════════════════════════════\r\n       SECTION STEPPER layout — stepper nav card + per-step form panels.\r\n       Rendered when formSchema.sectionStepper === true.\r\n       The nav and each step section are separate cards (no outer wrapper card).\r\n       ══════════════════════════════════════════════════════════════════════ -->\r\n  <ng-container *ngIf=\"formSchema && isFormReady && isSectionStepper\">\r\n\r\n    <!-- Horizontal stepper nav card — hidden for a single step (nothing to step between) -->\r\n    <div class=\"section-stepper-nav\" *ngIf=\"sectionSteps.length > 1\">\r\n      <div class=\"section-stepper-track\">\r\n        <div\r\n          *ngFor=\"let step of sectionSteps; let i = index\"\r\n          class=\"section-stepper-step\"\r\n          [class.ss-active]=\"i === currentSectionStep\"\r\n          [class.ss-completed]=\"i < currentSectionStep && stepValidationStates[i] !== 'warning'\"\r\n          [class.ss-warning]=\"i < currentSectionStep && stepValidationStates[i] === 'warning'\"\r\n          [attr.data-tooltip]=\"step.sectionConfig?.label || 'Step ' + (i + 1)\"\r\n          (click)=\"goToSectionStep(i)\">\r\n\r\n          <!-- Connector line — left side (hidden for first step) -->\r\n          <div class=\"ss-connector ss-connector--left\" *ngIf=\"i > 0\"></div>\r\n\r\n          <!-- Step badge -->\r\n          <div class=\"ss-badge\">\r\n            <!-- Green checkmark: visited and valid -->\r\n            <svg *ngIf=\"i < currentSectionStep && stepValidationStates[i] !== 'warning'\"\r\n                 width=\"13\" height=\"13\" viewBox=\"0 0 24 24\"\r\n                 fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n                 stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n              <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n            </svg>\r\n            <!-- Warning: bold ! is the most visible option inside a 38px circle badge -->\r\n            <span *ngIf=\"i < currentSectionStep && stepValidationStates[i] === 'warning'\"\r\n                  class=\"ss-warning-mark\">!</span>\r\n            <!-- Number: current or future step -->\r\n            <span *ngIf=\"i >= currentSectionStep\">{{ i + 1 }}</span>\r\n          </div>\r\n\r\n          <!-- Step label (truncated; full text revealed by CSS tooltip) -->\r\n          <div class=\"ss-label\" [title]=\"step.sectionConfig?.label || 'Step ' + (i + 1)\">\r\n            {{ step.sectionConfig?.label || 'Step ' + (i + 1) }}\r\n          </div>\r\n\r\n          <!-- Connector line — right side (hidden for last step) -->\r\n          <div class=\"ss-connector ss-connector--right\" *ngIf=\"i < sectionSteps.length - 1\"></div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Step panels — all mounted, only active one is visible (preserves form data) -->\r\n    <form [formGroup]=\"formGroup\" class=\"smart-form ss-form\">\r\n      <div\r\n        *ngFor=\"let step of sectionSteps; let i = index\"\r\n        class=\"ss-step-panel\"\r\n        [style.display]=\"i === currentSectionStep ? 'block' : 'none'\">\r\n        <lib-form-section\r\n          [config]=\"getSectionStepConfig(step)\"\r\n          [controller]=\"controller\"\r\n          [formGroup]=\"formGroup\">\r\n        </lib-form-section>\r\n      </div>\r\n    </form>\r\n\r\n    <!-- ── Action bar: Prev / custom action buttons / Next ──────────────────── -->\r\n    <div class=\"form-actions\"\r\n         *ngIf=\"!readOnly && formSchema.showActions !== false && actionBarConfig?.buttons?.length\">\r\n\r\n      <!-- LEFT GROUP: Previous button + left-aligned custom buttons -->\r\n      <div class=\"action-group action-group--left\">\r\n        <lib-button\r\n          *ngIf=\"!isSectionStepFirst\"\r\n          variant=\"outline\"\r\n          (click)=\"navigateToPrevious()\">\r\n          {{ previousLabel }}\r\n        </lib-button>\r\n        <ng-container *ngFor=\"let btn of getButtonsForAlignment('left')\">\r\n          <lib-button\r\n            *ngIf=\"!btn.showOnLastStepOnly || isSectionStepLast\"\r\n            [variant]=\"$any(btn.variant) || 'outline'\"\r\n            [disabled]=\"isButtonDisabled(btn)\"\r\n            (click)=\"handleButtonClick(btn)\">\r\n            {{ getButtonLabel(btn) }}\r\n          </lib-button>\r\n        </ng-container>\r\n      </div>\r\n\r\n      <!-- RIGHT GROUP: right-aligned custom buttons + Next button -->\r\n      <div class=\"action-group action-group--right\">\r\n        <ng-container *ngFor=\"let btn of getButtonsForAlignment('right')\">\r\n          <lib-button\r\n            *ngIf=\"!btn.showOnLastStepOnly || isSectionStepLast\"\r\n            [variant]=\"$any(btn.variant) || 'primary'\"\r\n            [disabled]=\"isButtonDisabled(btn)\"\r\n            (click)=\"handleButtonClick(btn)\">\r\n            {{ getButtonLabel(btn) }}\r\n          </lib-button>\r\n        </ng-container>\r\n        <lib-button\r\n          *ngIf=\"!isSectionStepLast\"\r\n          variant=\"primary\"\r\n          (click)=\"navigateToNext()\">\r\n          {{ nextLabel }}\r\n        </lib-button>\r\n      </div>\r\n\r\n    </div>\r\n\r\n  </ng-container>\r\n\r\n  <!-- ══════════════════════════════════════════════════════════════════════\r\n       Regular card wrapper — used for SECTION and STEPPER form types.\r\n       ══════════════════════════════════════════════════════════════════════ -->\r\n  <div class=\"smart-form-wrapper\" *ngIf=\"formSchema && isFormReady && !isSectionStepper\"\r\n       [class.smart-form-wrapper--readonly]=\"readOnly\">\r\n\r\n    <!-- Form Header -->\r\n    <div class=\"form-header\" *ngIf=\"formSchema.showTitle !== false\">\r\n      <h2 class=\"form-title\">{{ formSchema.label }}</h2>\r\n      <p class=\"form-description\" *ngIf=\"formSchema.description\">{{ formSchema.description }}</p>\r\n    </div>\r\n\r\n    <!-- STEPPER type nav -->\r\n    <div class=\"stepper-nav\" *ngIf=\"isStepper && formSchema.stepperConfig?.showStep !== false\">\r\n      <div class=\"stepper-steps\" [class.horizontal]=\"formSchema.stepperConfig?.isHorizontal !== false\">\r\n        <div *ngFor=\"let step of fieldList; let i = index\" class=\"stepper-step\" [class.active]=\"i === currentStep\"\r\n          [class.completed]=\"i < currentStep\">\r\n          <div class=\"step-number\">{{ i + 1 }}</div>\r\n          <div class=\"step-label\">{{ step.sectionConfig?.label || 'Step ' + (i + 1) }}</div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Form Content -->\r\n    <form [formGroup]=\"formGroup\" class=\"smart-form\">\r\n      <!-- Regular SECTION form -->\r\n      <div *ngIf=\"!isStepper && formSchema.sectionConfig && formSchema.sectionConfig.isEnabled !== false\" class=\"form-section\">\r\n        <lib-form-section [config]=\"formSchema.sectionConfig\" [controller]=\"controller\" [formGroup]=\"formGroup\">\r\n        </lib-form-section>\r\n      </div>\r\n\r\n      <!-- STEPPER type form -->\r\n      <div *ngIf=\"isStepper && currentStepConfig && currentStepConfig.sectionConfig?.isEnabled !== false\" class=\"form-stepper\">\r\n        <lib-form-section [config]=\"currentStepConfig.sectionConfig!\" [controller]=\"controller\" [formGroup]=\"formGroup\">\r\n        </lib-form-section>\r\n      </div>\r\n    </form>\r\n\r\n    <!-- ── Form Actions ──────────────────────────────────────────────────── -->\r\n    <div class=\"form-actions\" *ngIf=\"formSchema.showActions !== false && !readOnly && actionBarConfig?.buttons?.length\">\r\n\r\n      <!-- LEFT GROUP -->\r\n      <div class=\"action-group action-group--left\">\r\n        <lib-button\r\n          *ngFor=\"let btn of getButtonsForAlignment('left')\"\r\n          [variant]=\"$any(btn.variant) || 'outline'\"\r\n          [disabled]=\"isButtonDisabled(btn)\"\r\n          (click)=\"handleButtonClick(btn)\">\r\n          {{ getButtonLabel(btn) }}\r\n        </lib-button>\r\n      </div>\r\n\r\n      <!-- RIGHT GROUP -->\r\n      <div class=\"action-group action-group--right\">\r\n        <lib-button\r\n          *ngFor=\"let btn of getButtonsForAlignment('right')\"\r\n          [variant]=\"$any(btn.variant) || 'primary'\"\r\n          [disabled]=\"isButtonDisabled(btn)\"\r\n          (click)=\"handleButtonClick(btn)\">\r\n          {{ getButtonLabel(btn) }}\r\n        </lib-button>\r\n      </div>\r\n\r\n    </div>\r\n  </div>\r\n\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonComponent } from './components/button/button.component';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    ButtonComponent\r\n  ],\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  exports: [\r\n    ButtonComponent\r\n  ]\r\n})\r\nexport class ButtonModule { }\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertLabels, AlertVariant, IconInput } from '../../alert.models';\r\n\r\n@Component({\r\n    selector: 'lib-alert',\r\n    templateUrl: './alert.component.html',\r\n    styleUrls: ['./alert.component.scss'],\r\n    standalone: false\r\n})\r\nexport class AlertComponent implements OnInit {\r\n    @Input() variant: AlertVariant = 'info';\r\n    @Input() title: string = '';\r\n    @Input() message: string = '';\r\n    @Input() icon: IconInput = true;\r\n    @Input() customIcon: string = ''; // New input for custom class\r\n    @Input() labels?: AlertLabels;\r\n\r\n    // Customization Inputs\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() borderRadius?: string;\r\n    @Input() padding?: string;\r\n    @Input() gap?: string;\r\n    @Input() backgroundColor?: string;\r\n    @Input() color?: string; // New input for custom text color\r\n    @Input() borderColor?: string;\r\n    @Input() fontSize?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() boxShadow?: string;\r\n\r\n    // Granular Border Radius Customization\r\n    @Input() borderTopLeftRadius?: string;\r\n    @Input() borderTopRightRadius?: string;\r\n    @Input() borderBottomLeftRadius?: string;\r\n    @Input() borderBottomRightRadius?: string;\r\n\r\n    constructor() { }\r\n\r\n    ngOnInit(): void {\r\n    }\r\n\r\n    get isDefaultIcon(): boolean {\r\n        return this.icon === true;\r\n    }\r\n\r\n    get isStringIcon(): boolean {\r\n        return typeof this.icon === 'string';\r\n    }\r\n\r\n    get isObjectIcon(): boolean {\r\n        return typeof this.icon === 'object' && this.icon !== null;\r\n    }\r\n\r\n    get iconString(): string {\r\n        return typeof this.icon === 'string' ? this.icon : '';\r\n    }\r\n\r\n    get isImgIcon(): boolean {\r\n        const icon = this.icon;\r\n        if (typeof icon === 'string') {\r\n            return icon.includes('/') || icon.includes('.') || icon.startsWith('http');\r\n        }\r\n        return typeof icon === 'object' && icon !== null && icon.type === 'img';\r\n    }\r\n\r\n    get iconObject(): { type: string; value: string } {\r\n        return typeof this.icon === 'object' ? this.icon as any : { type: '', value: '' };\r\n    }\r\n\r\n    get defaultIconClass(): string {\r\n        switch (this.variant) {\r\n            case 'success': return 'fa-solid fa-circle-check';\r\n            case 'warning':\r\n            case 'warning-shadow': return 'fa-solid fa-triangle-exclamation';\r\n            case 'error': return 'fa-solid fa-triangle-exclamation';\r\n            case 'info':\r\n            default: return 'fa-solid fa-circle-info';\r\n        }\r\n    }\r\n}\r\n","<div class=\"cc-alert\" [ngClass]=\"'cc-alert-' + variant\" [style.width]=\"width\" [style.height]=\"height\"\r\n    [style.border-radius]=\"borderRadius\" [style.border-top-left-radius]=\"borderTopLeftRadius\"\r\n    [style.border-top-right-radius]=\"borderTopRightRadius\" [style.border-bottom-left-radius]=\"borderBottomLeftRadius\"\r\n    [style.border-bottom-right-radius]=\"borderBottomRightRadius\" [style.padding]=\"padding\" [style.gap]=\"gap\"\r\n    [style.background-color]=\"backgroundColor\" [style.color]=\"color\" [style.border-color]=\"borderColor\"\r\n    [style.font-size]=\"fontSize\" [style.font-weight]=\"fontWeight\" [style.box-shadow]=\"boxShadow\">\r\n\r\n    <div class=\"cc-alert-icon\" *ngIf=\"icon\">\r\n        <i *ngIf=\"customIcon\" [ngClass]=\"customIcon\"></i>\r\n        <i *ngIf=\"!customIcon && isDefaultIcon\" [ngClass]=\"defaultIconClass\"></i>\r\n        <i *ngIf=\"!customIcon && isStringIcon && !isImgIcon\" [ngClass]=\"iconString\"></i>\r\n        <img *ngIf=\"!customIcon && isStringIcon && isImgIcon\" [src]=\"iconString\"\r\n            [attr.alt]=\"labels?.iconAltText || 'alert icon'\" />\r\n        <ng-container *ngIf=\"isObjectIcon\">\r\n            <i *ngIf=\"iconObject.type === 'fontawesome'\" [ngClass]=\"iconObject.value\"></i>\r\n            <span *ngIf=\"iconObject.type === 'material'\" class=\"material-icons\">{{ iconObject.value }}</span>\r\n            <img *ngIf=\"iconObject.type === 'img'\" [src]=\"iconObject.value\"\r\n                [attr.alt]=\"labels?.iconAltText || 'alert icon'\" />\r\n        </ng-container>\r\n    </div>\r\n\r\n    <div class=\"cc-alert-content\">\r\n        <div class=\"cc-alert-title\" *ngIf=\"title\">{{ title }}</div>\r\n        <div class=\"cc-alert-message\" *ngIf=\"message\">{{ message }}</div>\r\n        <ng-content></ng-content>\r\n    </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertComponent } from './components/alert/alert.component';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        AlertComponent\r\n    ],\r\n    imports: [\r\n        CommonModule\r\n    ],\r\n    exports: [\r\n        AlertComponent\r\n    ]\r\n})\r\nexport class AlertModule { }\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { InputConfig, InputType, InputLabels } from './input.models';\r\n\r\n@Component({\r\n    selector: 'lib-input',\r\n    templateUrl: './input.component.html',\r\n    styleUrls: ['./input.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => InputComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class InputComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n    @Input() config?: InputConfig;\r\n    @Input() labels?: InputLabels;\r\n    @Input() type: InputType = 'text';\r\n    @Input() label: string = '';\r\n    @Input() placeholder: string = '';\r\n    @Input() disabled: boolean = false;\r\n    @Input() required: boolean = false;\r\n    @Input() readonly: boolean = false;\r\n    @Input() clearable: boolean = true;\r\n    @Input() maxLength?: number;\r\n    @Input() minLength?: number;\r\n    @Input() min?: number | string;\r\n    @Input() max?: number | string;\r\n    @Input() pattern?: string;\r\n    @Input() errorMessage: string = '';\r\n    @Input() helperText: string = '';\r\n    @Input() rows: number = 3;\r\n    @Input() prefixIcon?: any;\r\n    @Input() suffixIcon?: any;\r\n    @Input() value: any = '';\r\n\r\n    // Style inputs\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() borderRadius?: string;\r\n    @Input() fontSize?: string;\r\n\r\n    @Input() gap?: string;\r\n    @Input() fontFamily?: string;\r\n    @Input() labelColor?: string;\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n\r\n    @Input() backgroundColor?: string;\r\n    @Input() borderColor?: string;\r\n    @Input() borderWidth?: string;\r\n    @Input() padding?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() color?: string;\r\n    @Input() placeholderColor?: string;\r\n    @Input() focusBorderColor?: string;\r\n    @Input() errorColor?: string;\r\n    @Input() disabledBackgroundColor?: string;\r\n    @Input() disabledColor?: string;\r\n    @Input() boxShadow?: string;\r\n\r\n    @Output() valueChange = new EventEmitter<any>();\r\n    @Output() inputBlur = new EventEmitter<void>();\r\n    @Output() inputFocus = new EventEmitter<void>();\r\n\r\n    showPassword = false;\r\n    focused = false;\r\n    onChange: (value: any) => void = () => { };\r\n    onTouched: () => void = () => { };\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        this.updateFromLabels();\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config']) {\r\n            this.updateFromConfig();\r\n        }\r\n        if (changes['labels']) {\r\n            this.updateFromLabels();\r\n        }\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.type = this.config.type ?? this.type;\r\n            this.label = this.config.label ?? this.label;\r\n            this.placeholder = this.config.placeholder ?? this.placeholder;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.required = this.config.required ?? this.required;\r\n            this.readonly = this.config.readonly ?? this.readonly;\r\n            this.maxLength = this.config.maxLength ?? this.maxLength;\r\n            this.minLength = this.config.minLength ?? this.minLength;\r\n            this.min = this.config.min ?? this.min;\r\n            this.max = this.config.max ?? this.max;\r\n            this.pattern = this.config.pattern ?? this.pattern;\r\n            this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n            this.helperText = this.config.helperText ?? this.helperText;\r\n            this.rows = this.config.rows ?? this.rows;\r\n            this.prefixIcon = this.config.prefixIcon ?? this.prefixIcon;\r\n            this.suffixIcon = this.config.suffixIcon ?? this.suffixIcon;\r\n\r\n            // Style inputs\r\n            this.width = this.config.width ?? this.width;\r\n            this.height = this.config.height ?? this.height;\r\n            this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n            this.fontSize = this.config.fontSize ?? this.fontSize;\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n            this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n            this.borderColor = this.config.borderColor ?? this.borderColor;\r\n            this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n            this.padding = this.config.padding ?? this.padding;\r\n            this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n            this.color = this.config.color ?? this.color;\r\n            this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n            this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n            this.errorColor = this.config.errorColor ?? this.errorColor;\r\n            this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n            this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n            this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n\r\n            if (this.config.value !== undefined) {\r\n                this.value = this.config.value;\r\n            }\r\n        }\r\n    }\r\n\r\n    private updateFromLabels(): void {\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n            this.placeholder = this.labels.placeholder || this.placeholder;\r\n            this.errorMessage = this.labels.errorMessage || this.errorMessage;\r\n            this.helperText = this.labels.helperText || this.helperText;\r\n        }\r\n    }\r\n\r\n    get requiredMarker(): string {\r\n        return this.labels?.requiredMarker || '*';\r\n    }\r\n\r\n    writeValue(value: any): void {\r\n        this.value = value;\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    onInputChange(event: any): void {\r\n        const value = event.target.value;\r\n        this.value = this.type === 'number' ? (value ? Number(value) : null) : value;\r\n        this.onChange(this.value);\r\n        this.valueChange.emit(this.value);\r\n    }\r\n\r\n    onBlur(): void {\r\n        this.focused = false;\r\n        this.onTouched();\r\n        this.inputBlur.emit();\r\n    }\r\n\r\n    onFocus(): void {\r\n        this.focused = true;\r\n        this.inputFocus.emit();\r\n    }\r\n\r\n    togglePasswordVisibility(): void {\r\n        this.showPassword = !this.showPassword;\r\n    }\r\n\r\n    getIconType(icon: any): 'material' | 'fontawesome' | 'img' | 'none' {\r\n        if (!icon) return 'none';\r\n        if (typeof icon === 'string') {\r\n            if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n                return 'img';\r\n            }\r\n            return 'material';\r\n        }\r\n        return icon.type || 'material';\r\n    }\r\n\r\n    getIconValue(icon: any): string {\r\n        if (typeof icon === 'string') return icon;\r\n        return icon?.value || '';\r\n    }\r\n\r\n    get inputType(): string {\r\n        if (this.type === 'password' && this.showPassword) {\r\n            return 'text';\r\n        }\r\n        return this.type === 'textarea' ? 'text' : this.type;\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            'width': this.getStyleValue(this.width),\r\n            '--cc-input-label-gap': this.getStyleValue(this.gap),\r\n            '--cc-input-font-family': this.getStyleValue(this.fontFamily)\r\n        };\r\n    }\r\n\r\n    get labelStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-input-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-input-label-font-size': this.getStyleValue(this.labelFontSize),\r\n            '--cc-input-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n        };\r\n    }\r\n\r\n    get fieldStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-input-bg': this.getStyleValue(this.backgroundColor),\r\n            '--cc-input-border-radius': this.getStyleValue(this.borderRadius),\r\n            '--cc-input-border-color': this.getStyleValue(this.borderColor),\r\n            '--cc-input-border-width': this.getStyleValue(this.borderWidth),\r\n            '--cc-input-height': this.getStyleValue(this.height),\r\n            '--cc-input-padding': this.getStyleValue(this.padding),\r\n            '--cc-input-font-size': this.getStyleValue(this.fontSize),\r\n            '--cc-input-font-weight': this.getStyleValue(this.fontWeight),\r\n            '--cc-input-color': this.getStyleValue(this.color),\r\n            '--cc-input-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n            '--cc-input-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n            '--cc-input-error-color': this.getStyleValue(this.errorColor),\r\n            '--cc-input-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n            '--cc-input-disabled-color': this.getStyleValue(this.disabledColor),\r\n            'box-shadow': this.getStyleValue(this.boxShadow)\r\n        };\r\n    }\r\n}\r\n\r\n","<div class=\"cc-input-container\" [ngStyle]=\"wrapperStyles\">\r\n    <label *ngIf=\"label\" class=\"cc-input-label\" [ngStyle]=\"labelStyles\">\r\n        {{ label }}\r\n        <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n    </label>\r\n\r\n    <div class=\"cc-input-wrapper\" [class.focused]=\"focused\" [class.disabled]=\"disabled\" [class.error]=\"errorMessage\"\r\n        [ngStyle]=\"fieldStyles\">\r\n\r\n        <!-- Prefix Icon -->\r\n        <span class=\"cc-input-prefix\" *ngIf=\"prefixIcon\">\r\n            <span class=\"material-icons\" *ngIf=\"getIconType(prefixIcon) === 'material'\">{{ getIconValue(prefixIcon)\r\n                }}</span>\r\n            <i *ngIf=\"getIconType(prefixIcon) === 'fontawesome'\" [class]=\"getIconValue(prefixIcon)\"></i>\r\n            <img *ngIf=\"getIconType(prefixIcon) === 'img'\" [src]=\"getIconValue(prefixIcon)\" class=\"cc-icon-img\"\r\n                [attr.alt]=\"labels?.prefixAltText || 'prefix'\" />\r\n        </span>\r\n\r\n        <!-- Input -->\r\n        <input *ngIf=\"type !== 'textarea'\" class=\"cc-input-element\" [type]=\"inputType\" [value]=\"value\"\r\n            [placeholder]=\"placeholder\" [disabled]=\"disabled\" [required]=\"required\" [readonly]=\"readonly\"\r\n            [maxLength]=\"maxLength || 524288\" [minLength]=\"minLength || 0\" [min]=\"min\" [max]=\"max\" [pattern]=\"pattern\"\r\n            (input)=\"onInputChange($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [attr.aria-invalid]=\"!!errorMessage\"\r\n            [attr.aria-describedby]=\"helperText ? 'helper-text' : null\" />\r\n\r\n        <!-- Textarea -->\r\n        <textarea *ngIf=\"type === 'textarea'\" class=\"cc-input-element cc-textarea\" [value]=\"value\"\r\n            [placeholder]=\"placeholder\" [disabled]=\"disabled\" [required]=\"required\" [readonly]=\"readonly\"\r\n            [maxLength]=\"maxLength || 524288\" [minLength]=\"minLength || 0\" [rows]=\"rows\" (input)=\"onInputChange($event)\"\r\n            (blur)=\"onBlur()\" (focus)=\"onFocus()\" [attr.aria-invalid]=\"!!errorMessage\"></textarea>\r\n\r\n        <!-- Suffix Icon / Password Toggle -->\r\n        <span class=\"cc-input-suffix\">\r\n            <button *ngIf=\"type === 'password'\" type=\"button\" class=\"cc-icon-btn\" (click)=\"togglePasswordVisibility()\"\r\n                [attr.aria-label]=\"labels?.passwordToggleAriaLabel\">\r\n                <span class=\"material-icons\">{{ showPassword ? 'visibility_off' : 'visibility' }}</span>\r\n            </button>\r\n\r\n            <ng-container *ngIf=\"suffixIcon && type !== 'password'\">\r\n                <span class=\"material-icons\" *ngIf=\"getIconType(suffixIcon) === 'material'\">{{ getIconValue(suffixIcon)\r\n                    }}</span>\r\n                <i *ngIf=\"getIconType(suffixIcon) === 'fontawesome'\" [class]=\"getIconValue(suffixIcon)\"></i>\r\n                <img *ngIf=\"getIconType(suffixIcon) === 'img'\" [src]=\"getIconValue(suffixIcon)\" class=\"cc-icon-img\"\r\n                    [attr.alt]=\"labels?.suffixAltText || 'suffix'\" />\r\n            </ng-container>\r\n        </span>\r\n    </div>\r\n\r\n    <div class=\"cc-helper-text\" *ngIf=\"helperText\" id=\"helper-text\">{{ helperText }}</div>\r\n    <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Directive, ElementRef, Output, EventEmitter, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n    selector: '[libClickOutside]',\r\n    standalone: false\r\n})\r\nexport class ClickOutsideDirective {\r\n    @Output() libClickOutside = new EventEmitter<void>();\r\n\r\n    constructor(private elementRef: ElementRef) { }\r\n\r\n    @HostListener('document:click', ['$event.target'])\r\n    public onClick(target: any): void {\r\n        // Skip if the target was removed from the DOM before the click event fired\r\n        // (happens with CDK virtual scroll which detaches nodes during rendering)\r\n        if (!document.documentElement.contains(target)) return;\r\n        const clickedInside = this.elementRef.nativeElement.contains(target);\r\n        if (!clickedInside) {\r\n            this.libClickOutside.emit();\r\n        }\r\n    }\r\n}\r\n","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, OnDestroy, SimpleChanges, HostListener, ViewChild, ElementRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { DropdownOption, DropdownConfig, DropdownLabels } from './dropdown.models';\r\n\r\n@Component({\r\n    selector: 'lib-dropdown',\r\n    templateUrl: './dropdown.component.html',\r\n    styleUrls: ['./dropdown.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => DropdownComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class DropdownComponent implements ControlValueAccessor, OnInit, OnChanges, OnDestroy {\r\n    @Input() config?: DropdownConfig;\r\n    @Input() labels?: DropdownLabels;\r\n    @Input() options: DropdownOption[] = [];\r\n    @Input() selectedValue?: any;\r\n    @Input() placeholder: string = '';\r\n    @Input() label: string = '';\r\n    @Input() multiple: boolean = false;\r\n    @Input() searchable: boolean = false;\r\n    @Input() clearable: boolean = false;\r\n    @Input() disabled: boolean = false;\r\n    @Input() required: boolean = false;\r\n    @Input() errorMessage: string = '';\r\n    @Input() serverSearch: boolean = false;\r\n    @Input() searchDebounceMs: number = 300;\r\n    @Input() lazyLoad: boolean = false;\r\n    // Live state for server-search/lazy-load — kept as plain inputs (not part of `config`)\r\n    // since they change on every keystroke/scroll and shouldn't require replacing the whole\r\n    // config object each time.\r\n    @Input() loading: boolean = false;\r\n    @Input() loadingMore: boolean = false;\r\n    @Input() hasMore: boolean = false;\r\n\r\n    // Configurable styles\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() borderRadius?: string;\r\n    @Input() fontSize?: string;\r\n\r\n    // Additional style inputs inferred from template/getters\r\n    @Input() gap?: string;\r\n    @Input() fontFamily?: string;\r\n    @Input() labelColor?: string;\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n\r\n    @Input() backgroundColor?: string;\r\n    @Input() borderColor?: string;\r\n    @Input() borderWidth?: string;\r\n    @Input() padding?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() color?: string;\r\n    @Input() placeholderColor?: string;\r\n    @Input() focusBorderColor?: string;\r\n    @Input() errorColor?: string;\r\n    @Input() disabledBackgroundColor?: string;\r\n    @Input() disabledColor?: string;\r\n    @Input() boxShadow?: string;\r\n\r\n    @Output() selectionChange = new EventEmitter<any>();\r\n    @Output() searchTermChange = new EventEmitter<string>();\r\n    @Output() loadMore = new EventEmitter<void>();\r\n    // Fires every time the panel opens — lets a serverSearch consumer know it should reset\r\n    // back to the unfiltered/first page, since reopening after a search otherwise keeps\r\n    // showing that search's narrowed result set forever (this component doesn't own `options`\r\n    // in serverSearch mode, so it can't refetch that on its own).\r\n    @Output() opened = new EventEmitter<void>();\r\n\r\n    @ViewChild(CdkVirtualScrollViewport) viewport?: CdkVirtualScrollViewport;\r\n    @ViewChild('searchInput') searchInput?: ElementRef;\r\n    @ViewChild('triggerEl') triggerEl?: ElementRef;\r\n\r\n    filteredOptions: DropdownOption[] = [];\r\n    searchTerm: string = '';\r\n    value: any = null;\r\n    isOpen = false;\r\n    focusedIndex = -1;\r\n    menuPosition = { top: 0, left: 0, width: 0 };\r\n\r\n    onChange: (value: any) => void = () => { };\r\n    onTouched: () => void = () => { };\r\n\r\n    // True from the moment \"Select All\" is turned on until the user either turns it back off\r\n    // or manually deselects a single option. While active, every newly lazy-loaded page is\r\n    // auto-merged into the selection (see ngOnChanges) so the count of selected items keeps\r\n    // matching what's on screen (10 -> 20 -> ... -> 34) instead of freezing at whatever was\r\n    // loaded at the moment \"Select All\" was clicked.\r\n    private selectAllActive = false;\r\n\r\n    private search$ = new Subject<string>();\r\n\r\n    constructor(private el: ElementRef) {\r\n        this.search$.pipe(debounceTime(this.searchDebounceMs), distinctUntilChanged())\r\n            .subscribe(term => this.searchTermChange.emit(term));\r\n    }\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        this.updateFromLabels();\r\n        this.filteredOptions = this.serverSearch ? this.options : this.validOptions;\r\n    }\r\n\r\n    ngOnDestroy(): void {\r\n        this.search$.complete();\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config']) {\r\n            this.updateFromConfig();\r\n        }\r\n        if (changes['labels']) {\r\n            this.updateFromLabels();\r\n        }\r\n        if (changes['config'] || changes['options']) {\r\n            this.filteredOptions = this.serverSearch ? this.options : this.validOptions;\r\n            // Sticky \"Select All\": a newly-arrived lazy-loaded page gets auto-selected too,\r\n            // so selection keeps pace with what's been scrolled into view.\r\n            if (changes['options'] && !changes['options'].isFirstChange() && this.selectAllActive) {\r\n                this.applySelectAllToLoadedOptions();\r\n            }\r\n        }\r\n        if (changes['selectedValue']) {\r\n            const incoming = changes['selectedValue'].currentValue;\r\n            if (incoming !== undefined && incoming !== this.value) {\r\n                this.value = incoming ?? null;\r\n            }\r\n        }\r\n    }\r\n\r\n    private get validOptions(): DropdownOption[] {\r\n        return this.options.filter(o => o.label != null && o.label !== '');\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.options = this.config.options || this.options;\r\n            this.placeholder = this.config.placeholder ?? this.placeholder;\r\n            this.label = this.config.label ?? this.label;\r\n            this.multiple = this.config.multiple ?? this.multiple;\r\n            this.searchable = this.config.searchable ?? this.searchable;\r\n            this.serverSearch = this.config.serverSearch ?? this.serverSearch;\r\n            this.searchDebounceMs = this.config.searchDebounceMs ?? this.searchDebounceMs;\r\n            this.lazyLoad = this.config.lazyLoad ?? this.lazyLoad;\r\n            this.clearable = this.config.clearable ?? this.clearable;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.required = this.config.required ?? this.required;\r\n            this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n            this.width = this.config.width ?? this.width;\r\n            this.height = this.config.height ?? this.height;\r\n            this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n            this.fontSize = this.config.fontSize ?? this.fontSize;\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n            this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n            this.borderColor = this.config.borderColor ?? this.borderColor;\r\n            this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n            this.padding = this.config.padding ?? this.padding;\r\n            this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n            this.color = this.config.color ?? this.color;\r\n            this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n            this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n            this.errorColor = this.config.errorColor ?? this.errorColor;\r\n            this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n            this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n            this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n        }\r\n    }\r\n\r\n    private updateFromLabels(): void {\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n            this.placeholder = this.labels.placeholder || this.placeholder;\r\n            this.errorMessage = this.labels.errorMessage || this.errorMessage;\r\n        }\r\n    }\r\n\r\n    get resolvedLabels() {\r\n        return {\r\n            requiredMarker:   this.labels?.requiredMarker   || '*',\r\n            searchPlaceholder: this.labels?.searchPlaceholder || 'Search...',\r\n            selectedSuffix:   this.labels?.selectedSuffix   || 'selected',\r\n            clearAriaLabel:   this.labels?.clearAriaLabel   || 'Clear selection',\r\n            noResultsFound:   this.labels?.noResultsFound   || 'No results found',\r\n        };\r\n    }\r\n\r\n    writeValue(value: any): void {\r\n        this.value = value;\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    toggle(): void {\r\n        if (this.disabled) return;\r\n        if (!this.isOpen && this.triggerEl) {\r\n            const rect: DOMRect = this.triggerEl.nativeElement.getBoundingClientRect();\r\n            const optCount = this.filteredOptions.length || 1;\r\n            const menuH = Math.min(optCount * 40, 240) + (this.searchable ? 50 : 0) + 8;\r\n            const spaceBelow = window.innerHeight - rect.bottom;\r\n            const top = spaceBelow < menuH + 8 ? rect.top - menuH - 4 : rect.bottom + 2;\r\n            this.menuPosition = { top, left: rect.left, width: rect.width };\r\n            const closeOnScroll = (e: Event) => {\r\n                if (this.el.nativeElement.contains(e.target as Node)) return;\r\n                this.close();\r\n                document.removeEventListener('scroll', closeOnScroll, true);\r\n            };\r\n            document.addEventListener('scroll', closeOnScroll, true);\r\n        }\r\n        this.isOpen = !this.isOpen;\r\n        if (this.isOpen) {\r\n            this.focusedIndex = -1;\r\n            // Reset any previous search so reopening shows the full/unfiltered list again\r\n            // rather than whatever narrowed result was last searched for.\r\n            if (this.searchTerm) {\r\n                this.searchTerm = '';\r\n                if (this.searchInput) this.searchInput.nativeElement.value = '';\r\n                if (!this.serverSearch) this.filteredOptions = this.validOptions;\r\n            }\r\n            setTimeout(() => {\r\n                if (this.searchable && this.searchInput) {\r\n                    this.searchInput.nativeElement.focus();\r\n                } else if (this.viewport) {\r\n                    this.viewport.elementRef.nativeElement.focus();\r\n                }\r\n            });\r\n            this.opened.emit();\r\n        } else {\r\n            this.onTouched();\r\n        }\r\n    }\r\n\r\n    close(): void {\r\n        if (this.isOpen) {\r\n            this.isOpen = false;\r\n            this.onTouched();\r\n        }\r\n    }\r\n\r\n    // \"Select All\" only ever acts on the currently *visible* (filtered/loaded) options — with\r\n    // server-search or lazy pagination, not everything may be loaded, so this merges into\r\n    // whatever's already selected rather than replacing it outright.\r\n    get isAllFilteredSelected(): boolean {\r\n        if (!this.multiple || this.filteredOptions.length === 0) return false;\r\n        const values: any[] = Array.isArray(this.value) ? this.value : [];\r\n        return this.filteredOptions.every(o => o.disabled || values.includes(o.value));\r\n    }\r\n\r\n    toggleSelectAll(): void {\r\n        if (!this.multiple) return;\r\n        const selectable = this.filteredOptions.filter(o => !o.disabled).map(o => o.value);\r\n        if (selectable.length === 0) return;\r\n        const currentValues: any[] = Array.isArray(this.value) ? this.value : [];\r\n        if (this.isAllFilteredSelected) {\r\n            this.selectAllActive = false;\r\n            this.value = currentValues.filter(v => !selectable.includes(v));\r\n        } else {\r\n            this.selectAllActive = true;\r\n            this.value = [...currentValues, ...selectable.filter(v => !currentValues.includes(v))];\r\n        }\r\n        this.onChange(this.value);\r\n        this.selectionChange.emit(this.value);\r\n    }\r\n\r\n    /** Merges every currently-loaded selectable option into the selection — used to keep a\r\n     *  \"Select All\" that's already active in sync as more lazy-loaded pages arrive. */\r\n    private applySelectAllToLoadedOptions(): void {\r\n        const selectable = this.filteredOptions.filter(o => !o.disabled).map(o => o.value);\r\n        if (selectable.length === 0) return;\r\n        const currentValues: any[] = Array.isArray(this.value) ? this.value : [];\r\n        const merged = [...currentValues, ...selectable.filter(v => !currentValues.includes(v))];\r\n        if (merged.length === currentValues.length) return;\r\n        this.value = merged;\r\n        this.onChange(this.value);\r\n        this.selectionChange.emit(this.value);\r\n    }\r\n\r\n    selectOption(option: DropdownOption): void {\r\n        if (option.disabled) return;\r\n\r\n        if (this.multiple) {\r\n            const currentValues = Array.isArray(this.value) ? [...this.value] : [];\r\n            const index = currentValues.indexOf(option.value);\r\n            if (index > -1) {\r\n                currentValues.splice(index, 1);\r\n                // Manually deselecting one item breaks the \"everything loaded is selected\"\r\n                // invariant — stop auto-including future lazy-loaded pages until Select All\r\n                // is explicitly re-toggled.\r\n                this.selectAllActive = false;\r\n            } else {\r\n                currentValues.push(option.value);\r\n            }\r\n            this.value = currentValues;\r\n        } else {\r\n            this.value = option.value;\r\n            this.close();\r\n        }\r\n\r\n        this.onChange(this.value);\r\n        this.selectionChange.emit(this.value);\r\n    }\r\n\r\n    isSelected(option: DropdownOption): boolean {\r\n        if (this.multiple) {\r\n            return Array.isArray(this.value) && this.value.includes(option.value);\r\n        }\r\n        return this.value === option.value;\r\n    }\r\n\r\n    onSearch(term: string): void {\r\n        this.searchTerm = term;\r\n        if (this.serverSearch) {\r\n            // A new server search yields an unrelated result set — don't carry over a prior\r\n            // \"Select All\" and auto-select whatever this new query happens to load.\r\n            this.selectAllActive = false;\r\n            this.search$.next(term);\r\n            this.focusedIndex = -1;\r\n            return;\r\n        }\r\n        if (!term) {\r\n            this.filteredOptions = this.validOptions;\r\n        } else {\r\n            this.filteredOptions = this.validOptions.filter(option =>\r\n                option.label.toLowerCase().includes(term.toLowerCase())\r\n            );\r\n        }\r\n        this.focusedIndex = -1;\r\n    }\r\n\r\n    onOptionsScroll(event: Event): void {\r\n        if (!this.lazyLoad || !this.hasMore || this.loading || this.loadingMore) return;\r\n        const el = event.target as HTMLElement;\r\n        if (el.scrollTop + el.clientHeight >= el.scrollHeight - 24) {\r\n            this.loadMore.emit();\r\n        }\r\n    }\r\n\r\n    clearSelection(event?: Event): void {\r\n        if (event) {\r\n            event.stopPropagation();\r\n        }\r\n        this.value = this.multiple ? [] : null;\r\n        this.onChange(this.value);\r\n        this.selectionChange.emit(this.value);\r\n    }\r\n\r\n    getIconType(icon: any): 'material' | 'fontawesome' | 'img' | 'none' {\r\n        if (!icon) return 'none';\r\n        if (typeof icon === 'string') {\r\n            if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n                return 'img';\r\n            }\r\n            return 'material';\r\n        }\r\n        return icon.type || 'material';\r\n    }\r\n\r\n    getIconValue(icon: any): string {\r\n        if (typeof icon === 'string') return icon;\r\n        return icon?.value || '';\r\n    }\r\n\r\n    getSelectedLabel(): string {\r\n        if (this.multiple) {\r\n            const count = Array.isArray(this.value) ? this.value.length : 0;\r\n            return count > 0 ? `${count} ${this.resolvedLabels.selectedSuffix}` : '';\r\n        }\r\n\r\n        if (!this.value) return '';\r\n        const selected = this.options.find(opt => opt.value === this.value);\r\n        return selected?.label || '';\r\n    }\r\n\r\n    hasValue(): boolean {\r\n        if (this.multiple) {\r\n            return Array.isArray(this.value) && this.value.length > 0;\r\n        }\r\n        return this.value !== null && this.value !== undefined && this.value !== '';\r\n    }\r\n\r\n    @HostListener('keydown', ['$event'])\r\n    handleKeyboardEvent(event: KeyboardEvent): void {\r\n        if (this.disabled) return;\r\n\r\n        if (event.key === 'Escape') {\r\n            this.close();\r\n            return;\r\n        }\r\n\r\n        if (!this.isOpen && (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown')) {\r\n            this.toggle();\r\n            event.preventDefault();\r\n            return;\r\n        }\r\n\r\n        if (!this.isOpen) return;\r\n\r\n        switch (event.key) {\r\n            case 'ArrowDown':\r\n                this.focusedIndex = Math.min(this.focusedIndex + 1, this.filteredOptions.length - 1);\r\n                this.scrollToIndex(this.focusedIndex);\r\n                event.preventDefault();\r\n                break;\r\n            case 'ArrowUp':\r\n                this.focusedIndex = Math.max(this.focusedIndex - 1, 0);\r\n                this.scrollToIndex(this.focusedIndex);\r\n                event.preventDefault();\r\n                break;\r\n            case 'Enter':\r\n                if (this.focusedIndex > -1) {\r\n                    this.selectOption(this.filteredOptions[this.focusedIndex]);\r\n                }\r\n                event.preventDefault();\r\n                break;\r\n        }\r\n    }\r\n\r\n    scrollToIndex(index: number): void {\r\n        if (this.viewport) {\r\n            this.viewport.scrollToIndex(index);\r\n        }\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            'width': this.getStyleValue(this.width),\r\n            '--cc-dropdown-label-gap': this.getStyleValue(this.gap),\r\n            '--cc-dropdown-font-family': this.getStyleValue(this.fontFamily)\r\n        };\r\n    }\r\n\r\n    get labelStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-dropdown-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-dropdown-font-size': this.getStyleValue(this.labelFontSize),\r\n            '--cc-dropdown-font-weight': this.getStyleValue(this.labelFontWeight)\r\n        };\r\n    }\r\n\r\n    get fieldStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-dropdown-bg': this.getStyleValue(this.backgroundColor),\r\n            '--cc-dropdown-border-radius': this.getStyleValue(this.borderRadius),\r\n            '--cc-dropdown-border-color': this.getStyleValue(this.borderColor),\r\n            '--cc-dropdown-border-width': this.getStyleValue(this.borderWidth),\r\n            '--cc-dropdown-height': this.getStyleValue(this.height),\r\n            '--cc-dropdown-padding': this.getStyleValue(this.padding),\r\n            '--cc-dropdown-font-size': this.getStyleValue(this.fontSize),\r\n            '--cc-dropdown-font-weight': this.getStyleValue(this.fontWeight),\r\n            '--cc-dropdown-color': this.getStyleValue(this.color),\r\n            '--cc-dropdown-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n            '--cc-dropdown-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n            '--cc-dropdown-error-color': this.getStyleValue(this.errorColor),\r\n            '--cc-dropdown-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n            '--cc-dropdown-disabled-color': this.getStyleValue(this.disabledColor),\r\n            'box-shadow': this.getStyleValue(this.boxShadow)\r\n        };\r\n    }\r\n}\r\n","<div class=\"cc-dropdown-wrapper\" [ngStyle]=\"wrapperStyles\" libClickOutside (libClickOutside)=\"close()\">\r\n    <!-- Label -->\r\n    <label *ngIf=\"label\" class=\"cc-dropdown-label\" [ngStyle]=\"labelStyles\">\r\n        {{ label }}\r\n        <span *ngIf=\"required\" class=\"cc-required\">{{ resolvedLabels.requiredMarker }}</span>\r\n    </label>\r\n\r\n    <!-- Trigger -->\r\n    <div #triggerEl class=\"cc-dropdown-trigger\" [class.disabled]=\"disabled\" [class.open]=\"isOpen\" [class.error]=\"errorMessage\"\r\n        (click)=\"toggle()\" tabindex=\"0\" (keydown)=\"handleKeyboardEvent($event)\" [ngStyle]=\"fieldStyles\">\r\n\r\n        <div class=\"cc-selected-value\" *ngIf=\"hasValue()\">\r\n            {{ multiple ? value.length + ' ' + resolvedLabels.selectedSuffix : getSelectedLabel() }}\r\n        </div>\r\n        <div class=\"cc-placeholder\" *ngIf=\"!hasValue()\">{{ placeholder }}</div>\r\n\r\n        <div class=\"cc-actions\">\r\n            <span *ngIf=\"clearable && hasValue() && !disabled\" class=\"cc-clear-btn\" (click)=\"clearSelection($event)\"\r\n                [attr.aria-label]=\"resolvedLabels.clearAriaLabel\">\r\n                <span class=\"material-icons\">close</span>\r\n            </span>\r\n            <span class=\"cc-arrow material-icons\">expand_more</span>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- Dropdown Menu -->\r\n    <div class=\"cc-dropdown-menu\" *ngIf=\"isOpen\"\r\n         [ngStyle]=\"{ position: 'fixed', top: menuPosition.top + 'px', left: menuPosition.left + 'px', width: menuPosition.width + 'px', 'z-index': '9999' }\"\r\n         (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\">\r\n        <!-- Search -->\r\n        <div class=\"cc-search-container\" *ngIf=\"searchable\">\r\n            <input type=\"text\" #searchInput [placeholder]=\"resolvedLabels.searchPlaceholder\"\r\n                (input)=\"onSearch($any($event.target).value)\" (click)=\"$event.stopPropagation()\"\r\n                class=\"cc-dropdown-search-input\" />\r\n        </div>\r\n\r\n        <!-- Select All -->\r\n        <div class=\"cc-option cc-select-all\" *ngIf=\"multiple && filteredOptions.length > 0\"\r\n            [class.selected]=\"isAllFilteredSelected\" (click)=\"toggleSelectAll()\">\r\n            <span class=\"cc-multi-check\">\r\n                <span class=\"material-icons\" *ngIf=\"isAllFilteredSelected\">check_box</span>\r\n                <span class=\"material-icons\" *ngIf=\"!isAllFilteredSelected\">check_box_outline_blank</span>\r\n            </span>\r\n            <span class=\"cc-option-label\">Select All</span>\r\n        </div>\r\n\r\n        <!-- Options Virtual Scroll -->\r\n        <cdk-virtual-scroll-viewport itemSize=\"40\" class=\"cc-virtual-scroll\"\r\n            (scroll)=\"onOptionsScroll($event)\"\r\n            [style.height.px]=\"filteredOptions.length * 40 > 240 ? 240 : (filteredOptions.length * 40 || 40)\">\r\n\r\n            <div *ngIf=\"loading\" class=\"cc-status-row\">Loading...</div>\r\n\r\n            <div *cdkVirtualFor=\"let option of filteredOptions; let i = index\" class=\"cc-option\"\r\n                [class.selected]=\"isSelected(option)\" [class.focused]=\"i === focusedIndex\"\r\n                [class.disabled]=\"option.disabled\" (click)=\"selectOption(option)\">\r\n\r\n                <!-- Multi-select checkbox visual -->\r\n                <span class=\"cc-multi-check\" *ngIf=\"multiple\">\r\n                    <span class=\"material-icons\" *ngIf=\"isSelected(option)\">check_box</span>\r\n                    <span class=\"material-icons\" *ngIf=\"!isSelected(option)\">check_box_outline_blank</span>\r\n                </span>\r\n\r\n                <!-- Icon -->\r\n                <span class=\"cc-option-icon-wrapper\" *ngIf=\"option.icon\">\r\n                    <span class=\"material-icons\" *ngIf=\"getIconType(option.icon) === 'material'\">{{\r\n                        getIconValue(option.icon) }}</span>\r\n                    <i *ngIf=\"getIconType(option.icon) === 'fontawesome'\" [class]=\"getIconValue(option.icon)\"></i>\r\n                    <img *ngIf=\"getIconType(option.icon) === 'img'\" [src]=\"getIconValue(option.icon)\"\r\n                        class=\"cc-option-img\" alt=\"icon\" />\r\n                </span>\r\n\r\n                <span class=\"cc-option-label\">{{ option.label }}</span>\r\n\r\n                <!-- Single-select check visual -->\r\n                <span class=\"cc-single-check\" *ngIf=\"!multiple && isSelected(option)\">\r\n                    <span class=\"material-icons\">check</span>\r\n                </span>\r\n            </div>\r\n\r\n            <div *ngIf=\"!loading && filteredOptions.length === 0\" class=\"cc-no-results\">{{ resolvedLabels.noResultsFound }}</div>\r\n            <div *ngIf=\"loadingMore\" class=\"cc-status-row cc-loading-more\">Loading more...</div>\r\n        </cdk-virtual-scroll-viewport>\r\n    </div>\r\n\r\n    <!-- Error Message -->\r\n    <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { CheckboxConfig, CheckboxOption, CheckboxLabels } from './checkbox.models';\r\n\r\n@Component({\r\n    selector: 'lib-checkbox',\r\n    templateUrl: './checkbox.component.html',\r\n    styleUrls: ['./checkbox.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => CheckboxComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class CheckboxComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n    @Input() config: CheckboxConfig = {};\r\n    @Input() labels?: CheckboxLabels;\r\n    @Input() label: string = '';\r\n    @Input() checked: boolean = false;\r\n    @Input() disabled: boolean = false;\r\n    @Input() required: boolean = false;\r\n    @Input() indeterminate: boolean = false;\r\n    @Input() options: CheckboxOption[] = [];\r\n    @Input() labelPosition: 'before' | 'after' = 'after';\r\n    @Input() color: string = '#007bff';\r\n    @Input() borderRadius: string = '4px';\r\n    @Input() value: any = null;\r\n    @Input() errorMessage: string = '';\r\n\r\n    // Style inputs\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() fontSize?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() labelColor?: string;\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n    @Input() gap?: string;\r\n    @Input() fontFamily?: string;\r\n    @Input() backgroundColor?: string;\r\n    @Input() borderColor?: string;\r\n    @Input() borderWidth?: string;\r\n    @Input() padding?: string;\r\n    @Input() placeholderColor?: string;\r\n    @Input() focusBorderColor?: string;\r\n    @Input() errorColor?: string;\r\n    @Input() disabledBackgroundColor?: string;\r\n    @Input() disabledColor?: string;\r\n    @Input() boxShadow?: string;\r\n\r\n    @Input() size?: string;\r\n    @Input() checkedColor?: string;\r\n    @Input() uncheckedColor?: string;\r\n    @Input() groupLabelColor?: string;\r\n    @Input() groupLabelFontSize?: string;\r\n    @Input() groupLabelFontWeight?: string;\r\n\r\n    @Output() checkedChange = new EventEmitter<any>();\r\n\r\n    onChange: (value: any) => void = () => { };\r\n    onTouched: () => void = () => { };\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        this.updateFromLabels();\r\n\r\n        if (this.isGroup) {\r\n            this.value = this.options\r\n                .filter(opt => opt.checked)\r\n                .map(opt => opt.value);\r\n        } else {\r\n            this.value = this.checked;\r\n        }\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config']) {\r\n            this.updateFromConfig();\r\n        }\r\n        if (changes['labels']) {\r\n            this.updateFromLabels();\r\n        }\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.label = this.config.label ?? this.label;\r\n            this.checked = this.config.checked ?? this.checked;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.required = this.config.required ?? this.required;\r\n            this.indeterminate = this.config.indeterminate ?? this.indeterminate;\r\n            this.options = this.config.options || this.options;\r\n            this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n            this.color = this.config.color ?? this.color;\r\n            this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n            this.size = this.config.size ?? this.size;\r\n            this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n            this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n            this.groupLabelColor = this.config.groupLabelColor ?? this.groupLabelColor;\r\n            this.groupLabelFontSize = this.config.groupLabelFontSize ?? this.groupLabelFontSize;\r\n            this.groupLabelFontWeight = this.config.groupLabelFontWeight ?? this.groupLabelFontWeight;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n        }\r\n    }\r\n\r\n    private updateFromLabels(): void {\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n        }\r\n    }\r\n\r\n    get isGroup(): boolean {\r\n        return this.options && this.options.length > 0;\r\n    }\r\n\r\n    get visibleOptions(): CheckboxOption[] {\r\n        return this.options.filter(o => o.label != null && o.label !== '');\r\n    }\r\n\r\n    get requiredMarker(): string {\r\n        return this.labels?.requiredMarker || '*';\r\n    }\r\n\r\n    writeValue(value: any): void {\r\n        if (this.isGroup) {\r\n            this.value = Array.isArray(value) ? value : [];\r\n            this.options.forEach(opt => {\r\n                opt.checked = (this.value as any[]).includes(opt.value);\r\n            });\r\n        } else {\r\n            this.value = !!value;\r\n            this.checked = this.value as boolean;\r\n        }\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    onCheckboxChange(event: any): void {\r\n        const checked = event.target.checked;\r\n        this.value = checked;\r\n        this.checked = checked;\r\n        this.onChange(this.value);\r\n        this.onTouched();\r\n        this.checkedChange.emit(this.value);\r\n    }\r\n\r\n    onGroupCheckboxChange(option: CheckboxOption, event: any): void {\r\n        const checked = event.target.checked;\r\n        option.checked = checked;\r\n\r\n        const valueArray = this.value as any[];\r\n        if (checked) {\r\n            if (!valueArray.includes(option.value)) {\r\n                this.value = [...valueArray, option.value];\r\n            }\r\n        } else {\r\n            this.value = valueArray.filter(v => v !== option.value);\r\n        }\r\n\r\n        this.onChange(this.value);\r\n        this.onTouched();\r\n        this.checkedChange.emit(this.value);\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-checkbox-font-family': this.getStyleValue(this.fontFamily),\r\n            '--cc-checkbox-font-size': this.getStyleValue(this.fontSize),\r\n            '--cc-checkbox-font-weight': this.getStyleValue(this.fontWeight),\r\n            '--cc-checkbox-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-checkbox-size': this.getStyleValue(this.size),\r\n            '--cc-checkbox-checked-color': this.getStyleValue(this.checkedColor),\r\n            '--cc-checkbox-unchecked-color': this.getStyleValue(this.uncheckedColor),\r\n            '--cc-checkbox-disabled-color': this.getStyleValue(this.disabledColor),\r\n            '--cc-checkbox-error-color': this.getStyleValue(this.errorColor),\r\n            '--cc-checkbox-group-gap': this.getStyleValue(this.gap),\r\n            '--cc-checkbox-group-label-color': this.getStyleValue(this.groupLabelColor),\r\n            '--cc-checkbox-group-label-font-size': this.getStyleValue(this.groupLabelFontSize),\r\n            '--cc-checkbox-group-label-font-weight': this.getStyleValue(this.groupLabelFontWeight),\r\n            '--cc-checkbox-label-font-size': this.getStyleValue(this.labelFontSize),\r\n            '--cc-checkbox-label-font-weight': this.getStyleValue(this.labelFontWeight),\r\n            '--cc-checkbox-border-radius': this.getStyleValue(this.borderRadius)\r\n        };\r\n    }\r\n}\r\n\r\n","<div class=\"cc-checkbox-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n\r\n    <!-- Single Checkbox -->\r\n    <label *ngIf=\"!isGroup\" class=\"cc-checkbox-label\" [class.label-before]=\"labelPosition === 'before'\"\r\n        [class.disabled]=\"disabled\" [class.checked]=\"checked\">\r\n        <input type=\"checkbox\" class=\"cc-native-checkbox\" [checked]=\"checked\" [disabled]=\"disabled\"\r\n            [required]=\"required\" [indeterminate]=\"indeterminate\" (change)=\"onCheckboxChange($event)\" />\r\n        <span class=\"cc-checkmark\"></span>\r\n        <span class=\"cc-text\" *ngIf=\"label\">{{ label }}</span>\r\n    </label>\r\n\r\n    <!-- Checkbox Group -->\r\n    <div *ngIf=\"isGroup\" class=\"cc-checkbox-group\">\r\n        <label *ngIf=\"label\" class=\"cc-checkbox-group-label\" [class.label-before]=\"labelPosition === 'before'\">\r\n            {{ label }}\r\n            <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n        </label>\r\n\r\n        <label *ngFor=\"let option of visibleOptions\" class=\"cc-checkbox-label\" [class.disabled]=\"disabled || option.disabled\"\r\n            [class.checked]=\"option.checked\">\r\n            <input type=\"checkbox\" class=\"cc-native-checkbox\" [checked]=\"option.checked\"\r\n                [disabled]=\"disabled || option.disabled\" (change)=\"onGroupCheckboxChange(option, $event)\" />\r\n            <span class=\"cc-checkmark\"></span>\r\n            <span class=\"cc-text\">{{ option.label }}</span>\r\n        </label>\r\n    </div>\r\n\r\n    <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { RadioConfig, RadioOption, RadioLabels } from './radio.models';\r\n\r\n@Component({\r\n    selector: 'lib-radio',\r\n    templateUrl: './radio.component.html',\r\n    styleUrls: ['./radio.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => RadioComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class RadioComponent implements ControlValueAccessor, OnInit {\r\n    @Input() config?: RadioConfig;\r\n    @Input() label: string = '';\r\n    @Input() options: RadioOption[] = [];\r\n    @Input() disabled: boolean = false;\r\n    @Input() required: boolean = false;\r\n    @Input() labelPosition: 'before' | 'after' = 'after';\r\n    @Input() color: 'primary' | 'warning' | 'danger' | 'success' | 'accent' | 'warn' | string = 'primary';\r\n    @Input() layout: 'vertical' | 'horizontal' = 'vertical';\r\n\r\n    // i18n Labels\r\n    @Input() labels: RadioLabels = {};\r\n\r\n    // Customization — Layout\r\n    @Input() gap?: string;\r\n\r\n    // Customization — Colors\r\n    @Input() labelColor?: string;\r\n    @Input() checkedColor?: string;\r\n    @Input() uncheckedColor?: string;\r\n\r\n    // Customization — Typography\r\n    @Input() fontSize?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() fontFamily?: string;\r\n\r\n    // Customization — Group label\r\n    @Input() groupLabelColor?: string;\r\n    @Input() groupLabelFontSize?: string;\r\n    @Input() groupLabelFontWeight?: string;\r\n\r\n    // Customization — States\r\n    @Input() disabledColor?: string;\r\n    @Input() errorColor?: string;\r\n\r\n    // Customization — Size\r\n    @Input() size?: string;\r\n    @Input() borderRadius?: string;\r\n\r\n    // Customization — Synonyms for Playground\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n\r\n    @Output() selectionChange = new EventEmitter<any>();\r\n\r\n    value: any;\r\n    uuid = `radio-group-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n    private onChange: (value: any) => void = () => { };\r\n    private onTouched: () => void = () => { };\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        // i18n labels override\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n        }\r\n    }\r\n\r\n    ngOnChanges(changes: any): void {\r\n        if (changes.config) {\r\n            this.updateFromConfig();\r\n        }\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.label = this.config.label ?? this.label;\r\n            this.options = this.config.options || this.options;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.required = this.config.required ?? this.required;\r\n            this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n            this.color = this.config.color ?? this.color;\r\n            this.layout = this.config.layout ?? this.layout;\r\n            this.value = this.config.value;\r\n\r\n            // Style mappings\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n            this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n            this.fontSize = this.config.fontSize ?? this.fontSize;\r\n            this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n            this.groupLabelColor = this.config.groupLabelColor ?? this.groupLabelColor;\r\n            this.groupLabelFontSize = this.config.groupLabelFontSize ?? this.groupLabelFontSize;\r\n            this.groupLabelFontWeight = this.config.groupLabelFontWeight ?? this.groupLabelFontWeight;\r\n            this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n            this.errorColor = this.config.errorColor ?? this.errorColor;\r\n            this.size = this.config.size ?? this.size;\r\n            this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n        }\r\n    }\r\n\r\n\r\n    get requiredMarker(): string {\r\n        return this.labels?.requiredMarker || '*';\r\n    }\r\n\r\n    get visibleOptions(): RadioOption[] {\r\n        return this.options.filter(o => o.label != null && o.label !== '');\r\n    }\r\n\r\n    writeValue(value: any): void {\r\n        this.value = value;\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    onRadioChange(option: RadioOption): void {\r\n        this.value = option.value;\r\n        this.onChange(this.value);\r\n        this.onTouched();\r\n        this.selectionChange.emit(this.value);\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    private getThemeColor(colorStr: string | undefined): string | undefined {\r\n        if (!colorStr) return undefined;\r\n        const themeColors: { [key: string]: string } = {\r\n            'primary': 'var(--cc-radio-primary-bg, var(--cc-btn-primary-bg, #1A73E8))',\r\n            'warning': 'var(--cc-radio-warning-bg, var(--cc-btn-warning-bg, #F9C80E))',\r\n            'danger': 'var(--cc-radio-danger-bg, var(--cc-btn-danger-bg, #dc3545))',\r\n            'success': 'var(--cc-radio-success-bg, var(--cc-btn-success-bg, #28a745))',\r\n            'warn': 'var(--cc-radio-danger-bg, var(--cc-btn-danger-bg, #dc3545))',\r\n            'accent': 'var(--cc-radio-accent-bg, #ff4081)'\r\n        };\r\n        return themeColors[colorStr] || colorStr;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-radio-font-family': this.getStyleValue(this.fontFamily),\r\n            '--cc-radio-font-size': this.getStyleValue(this.fontSize || this.labelFontSize),\r\n            '--cc-radio-font-weight': this.getStyleValue(this.fontWeight || this.labelFontWeight),\r\n            '--cc-radio-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-radio-size': this.getStyleValue(this.size),\r\n            '--cc-radio-border-radius': this.getStyleValue(this.borderRadius),\r\n            '--cc-radio-checked-color': this.getStyleValue(this.getThemeColor(this.checkedColor || this.color)),\r\n            '--cc-radio-unchecked-color': this.getStyleValue(this.uncheckedColor),\r\n            '--cc-radio-disabled-color': this.getStyleValue(this.disabledColor),\r\n            '--cc-radio-error-color': this.getStyleValue(this.errorColor),\r\n            '--cc-radio-group-gap': this.getStyleValue(this.gap),\r\n            '--cc-radio-group-label-color': this.getStyleValue(this.groupLabelColor),\r\n            '--cc-radio-group-label-font-size': this.getStyleValue(this.groupLabelFontSize),\r\n            '--cc-radio-group-label-font-weight': this.getStyleValue(this.groupLabelFontWeight)\r\n        };\r\n    }\r\n}\r\n","<div class=\"cc-radio-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n    <label *ngIf=\"label\" class=\"cc-radio-group-label\" [class.disabled]=\"disabled\">\r\n        {{ label }}\r\n        <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n    </label>\r\n\r\n    <div class=\"cc-radio-group\" [class.horizontal]=\"layout === 'horizontal'\" [class.vertical]=\"layout === 'vertical'\"\r\n        role=\"radiogroup\">\r\n\r\n        <label class=\"cc-radio-label\" *ngFor=\"let option of visibleOptions; let i = index\"\r\n            [class.disabled]=\"disabled || option.disabled\" [class.checked]=\"value === option.value\"\r\n            [class.label-before]=\"labelPosition === 'before'\">\r\n\r\n            <input type=\"radio\" [name]=\"uuid\" [value]=\"option.value\" [checked]=\"value === option.value\"\r\n                [disabled]=\"disabled || option.disabled\" (change)=\"onRadioChange(option)\" class=\"cc-native-radio\"\r\n                [id]=\"uuid + '-' + i\">\r\n\r\n            <span class=\"cc-radio-circle\"></span>\r\n            <span class=\"cc-text\">{{ option.label }}</span>\r\n        </label>\r\n    </div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { ToggleConfig, ToggleLabels } from './toggle.models';\r\n\r\n@Component({\r\n    selector: 'lib-toggle',\r\n    templateUrl: './toggle.component.html',\r\n    styleUrls: ['./toggle.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => ToggleComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class ToggleComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n    @Input() config?: ToggleConfig;\r\n    @Input() labels?: ToggleLabels;\r\n    @Input() label: string = '';\r\n    @Input() checked: boolean = false;\r\n    @Input() disabled: boolean = false;\r\n    @Input() required: boolean = false;\r\n    @Input() labelPosition: 'before' | 'after' = 'after';\r\n    @Input() color: string = '#1A73E8';\r\n\r\n    // Customization — Colors\r\n    @Input() labelColor?: string;\r\n    @Input() uncheckedColor?: string;\r\n    @Input() checkedColor?: string;\r\n    @Input() thumbColor?: string;\r\n    @Input() checkedThumbColor?: string;\r\n\r\n    // Customization — Typography\r\n    @Input() fontSize?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() fontFamily?: string;\r\n\r\n    // Customization — Size\r\n    @Input() toggleWidth?: string;\r\n    @Input() toggleHeight?: string;\r\n    @Input() gap?: string;\r\n\r\n    // Customization — Slider\r\n    @Input() sliderColor?: string;\r\n\r\n    // Customization — Label\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n\r\n    // Customization — States\r\n    @Input() disabledColor?: string;\r\n\r\n    @Output() toggleChange = new EventEmitter<boolean>();\r\n\r\n    value: boolean = false;\r\n\r\n    private onChange: (value: any) => void = () => { };\r\n    private onTouched: () => void = () => { };\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        this.updateFromLabels();\r\n        this.value = this.checked;\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config']) {\r\n            this.updateFromConfig();\r\n        }\r\n        if (changes['labels']) {\r\n            this.updateFromLabels();\r\n        }\r\n        if (changes['checked']) {\r\n            this.value = this.checked;\r\n        }\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.label = this.config.label ?? this.label;\r\n            this.checked = this.config.checked ?? this.checked;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.required = this.config.required ?? this.required;\r\n            this.labelPosition = this.config.labelPosition ?? this.labelPosition;\r\n            this.color = this.config.color ?? this.color;\r\n            this.uncheckedColor = this.config.uncheckedColor ?? this.uncheckedColor;\r\n            this.checkedColor = this.config.checkedColor ?? this.checkedColor;\r\n            this.thumbColor = this.config.thumbColor ?? this.thumbColor;\r\n            this.checkedThumbColor = this.config.checkedThumbColor ?? this.checkedThumbColor;\r\n            this.fontSize = this.config.fontSize ?? this.fontSize;\r\n            this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n            this.toggleWidth = this.config.toggleWidth ?? this.toggleWidth;\r\n            this.toggleHeight = this.config.toggleHeight ?? this.toggleHeight;\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n        }\r\n    }\r\n\r\n    private updateFromLabels(): void {\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n        }\r\n    }\r\n\r\n    writeValue(value: any): void {\r\n        this.value = !!value;\r\n        this.checked = this.value;\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    onToggleChange(event: any): void {\r\n        this.value = event.target.checked;\r\n        this.checked = this.value;\r\n        this.onChange(this.value);\r\n        this.onTouched();\r\n        this.toggleChange.emit(this.value);\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    private getThemeColor(colorStr: string | undefined): string | undefined {\r\n        if (!colorStr) return undefined;\r\n        const themeColors: { [key: string]: string } = {\r\n            'primary': 'var(--cc-toggle-primary-bg, var(--cc-btn-primary-bg, #1A73E8))',\r\n            'warning': 'var(--cc-toggle-warning-bg, var(--cc-btn-warning-bg, #F9C80E))',\r\n            'danger': 'var(--cc-toggle-danger-bg, var(--cc-btn-danger-bg, #dc3545))',\r\n            'success': 'var(--cc-toggle-success-bg, var(--cc-btn-success-bg, #28a745))'\r\n        };\r\n        return themeColors[colorStr] || colorStr;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-toggle-font-family': this.getStyleValue(this.fontFamily),\r\n            '--cc-toggle-font-size': this.getStyleValue(this.fontSize || this.labelFontSize),\r\n            '--cc-toggle-font-weight': this.getStyleValue(this.fontWeight || this.labelFontWeight),\r\n            '--cc-toggle-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-toggle-width': this.getStyleValue(this.toggleWidth),\r\n            '--cc-toggle-height': this.getStyleValue(this.toggleHeight),\r\n            '--cc-toggle-gap': this.getStyleValue(this.gap),\r\n            '--cc-toggle-unchecked-bg': this.getStyleValue(this.uncheckedColor),\r\n            '--cc-toggle-checked-bg': this.getStyleValue(this.getThemeColor(this.checkedColor || this.color)),\r\n            '--cc-toggle-thumb-color': this.getStyleValue(this.thumbColor || this.sliderColor),\r\n            '--cc-toggle-checked-thumb-color': this.getStyleValue(this.checkedThumbColor),\r\n            '--cc-toggle-disabled-color': this.getStyleValue(this.disabledColor)\r\n        };\r\n    }\r\n}\r\n","<div class=\"cc-toggle-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n    <label class=\"cc-toggle-label\" [class.label-before]=\"labelPosition === 'before'\" [class.disabled]=\"disabled\">\r\n\r\n        <span class=\"cc-label-text\" *ngIf=\"label && labelPosition === 'before'\">{{ label }}</span>\r\n\r\n        <span class=\"cc-toggle-switch\">\r\n            <input type=\"checkbox\" class=\"cc-native-toggle\" [checked]=\"checked\" [disabled]=\"disabled\"\r\n                (change)=\"onToggleChange($event)\" />\r\n            <span class=\"cc-toggle-track\"></span>\r\n            <span class=\"cc-toggle-thumb\"></span>\r\n        </span>\r\n\r\n        <span class=\"cc-label-text\" *ngIf=\"label && labelPosition === 'after'\">{{ label }}</span>\r\n    </label>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DatePickerConfig, DatepickerLabels } from './datepicker.models';\r\n\r\n@Component({\r\n    selector: 'lib-datepicker',\r\n    templateUrl: './datepicker.component.html',\r\n    styleUrls: ['./datepicker.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => DatepickerComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class DatepickerComponent implements ControlValueAccessor, OnInit, OnChanges {\r\n    @Input() config?: DatePickerConfig;\r\n    @Input() labels?: DatepickerLabels;\r\n    @Input() label: string = '';\r\n    @Input() placeholder: string = '';\r\n    @Input() disabled: boolean = false;\r\n    @Input() required: boolean = false;\r\n    @Input() minDate?: string | Date; // Support string for native input\r\n    @Input() maxDate?: string | Date; // Support string for native input\r\n    @Input() isRange: boolean = false;\r\n    @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\r\n    @Input() value: any = null;\r\n    @Input() startDate?: string | Date;\r\n    @Input() endDate?: string | Date;\r\n    @Input() errorMessage: string = '';\r\n\r\n    // Style inputs\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() borderRadius?: string;\r\n    @Input() fontSize?: string;\r\n\r\n    @Input() gap?: string;\r\n    @Input() fontFamily?: string;\r\n    @Input() labelColor?: string;\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n\r\n    @Input() backgroundColor?: string;\r\n    @Input() borderColor?: string;\r\n    @Input() borderWidth?: string;\r\n    @Input() padding?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() color?: string;\r\n    @Input() placeholderColor?: string;\r\n    @Input() focusBorderColor?: string;\r\n    @Input() errorColor?: string;\r\n    @Input() disabledBackgroundColor?: string;\r\n    @Input() disabledColor?: string;\r\n    @Input() boxShadow?: string;\r\n\r\n    @Output() dateChange = new EventEmitter<any>();\r\n\r\n    onChange: (value: any) => void = () => { };\r\n    onTouched: () => void = () => { };\r\n\r\n    focused = false;\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        this.updateFromLabels();\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config']) {\r\n            this.updateFromConfig();\r\n        }\r\n        if (changes['labels']) {\r\n            this.updateFromLabels();\r\n        }\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.label = this.config.label ?? this.label;\r\n            this.placeholder = this.config.placeholder ?? this.placeholder;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.required = this.config.required ?? this.required;\r\n            this.minDate = this.config.minDate ?? this.minDate;\r\n            this.maxDate = this.config.maxDate ?? this.maxDate;\r\n            this.isRange = this.config.isRange ?? this.isRange;\r\n            this.width = this.config.width ?? this.width;\r\n            this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n            this.fontSize = this.config.fontSize ?? this.fontSize;\r\n            this.errorMessage = this.config.errorMessage ?? this.errorMessage;\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n            this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n            this.borderColor = this.config.borderColor ?? this.borderColor;\r\n            this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n            this.padding = this.config.padding ?? this.padding;\r\n            this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n            this.color = this.config.color ?? this.color;\r\n            this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n            this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n            this.errorColor = this.config.errorColor ?? this.errorColor;\r\n            this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n            this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n            this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n            this.height = this.config.height ?? this.height;\r\n\r\n            if (this.config.value !== undefined) {\r\n                this.value = this.config.value;\r\n            }\r\n            if (this.config.startDate) {\r\n                this.startDate = this.config.startDate;\r\n            }\r\n            if (this.config.endDate) {\r\n                this.endDate = this.config.endDate;\r\n            }\r\n        }\r\n    }\r\n\r\n    private updateFromLabels(): void {\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n            this.placeholder = this.labels.placeholder || this.placeholder;\r\n        }\r\n    }\r\n\r\n    get requiredMarker(): string {\r\n        return this.labels?.requiredMarker || '*';\r\n    }\r\n\r\n    get startDateLabel(): string {\r\n        return this.labels?.startDateLabel || 'Start Date';\r\n    }\r\n\r\n    get endDateLabel(): string {\r\n        return this.labels?.endDateLabel || 'End Date';\r\n    }\r\n\r\n    // Helper to format Date or string to YYYY-MM-DD for native input\r\n    private formatDate(date: Date | string | undefined | null): string {\r\n        if (!date) return '';\r\n        if (typeof date === 'string') return date; // Assume already formatted or ISO\r\n        try {\r\n            return date.toISOString().split('T')[0];\r\n        } catch (e) {\r\n            return '';\r\n        }\r\n    }\r\n\r\n    get formattedValue(): string {\r\n        return this.formatDate(this.value);\r\n    }\r\n\r\n    get formattedStartDate(): string {\r\n        return this.formatDate(this.startDate);\r\n    }\r\n\r\n    get formattedEndDate(): string {\r\n        return this.formatDate(this.endDate);\r\n    }\r\n\r\n    get formattedMin(): string {\r\n        return this.formatDate(this.minDate);\r\n    }\r\n\r\n    get formattedMax(): string {\r\n        return this.formatDate(this.maxDate);\r\n    }\r\n\r\n\r\n    writeValue(value: any): void {\r\n        if (this.isRange && value && typeof value === 'object' && 'start' in value) {\r\n            this.startDate = value.start;\r\n            this.endDate = value.end;\r\n        } else {\r\n            this.value = value;\r\n        }\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    onDateInput(event: any): void {\r\n        const value = event.target.value;\r\n        this.value = value; // Keep as string or convert if needed\r\n        this.onChange(this.value);\r\n        this.dateChange.emit(this.value);\r\n    }\r\n\r\n    onBlur(): void {\r\n        this.focused = false;\r\n        this.onTouched();\r\n    }\r\n\r\n    onFocus(): void {\r\n        this.focused = true;\r\n    }\r\n\r\n    onRangeStartInput(event: any): void {\r\n        this.startDate = event.target.value;\r\n        this.updateRangeValue();\r\n    }\r\n\r\n    onRangeEndInput(event: any): void {\r\n        this.endDate = event.target.value;\r\n        this.updateRangeValue();\r\n    }\r\n\r\n    private updateRangeValue(): void {\r\n        const rangeValue = { start: this.startDate, end: this.endDate };\r\n        this.onChange(rangeValue);\r\n        this.dateChange.emit(rangeValue);\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            'width': this.getStyleValue(this.width),\r\n            '--cc-datepicker-label-gap': this.getStyleValue(this.gap),\r\n            '--cc-datepicker-font-family': this.getStyleValue(this.fontFamily)\r\n        };\r\n    }\r\n\r\n    get labelStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-datepicker-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-datepicker-label-font-size': this.getStyleValue(this.labelFontSize),\r\n            '--cc-datepicker-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n        };\r\n    }\r\n\r\n    get fieldStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-datepicker-bg': this.getStyleValue(this.backgroundColor),\r\n            '--cc-datepicker-border-radius': this.getStyleValue(this.borderRadius),\r\n            '--cc-datepicker-border-color': this.getStyleValue(this.borderColor),\r\n            '--cc-datepicker-border-width': this.getStyleValue(this.borderWidth),\r\n            '--cc-datepicker-height': this.getStyleValue(this.height),\r\n            '--cc-datepicker-padding': this.getStyleValue(this.padding),\r\n            '--cc-datepicker-font-size': this.getStyleValue(this.fontSize),\r\n            '--cc-datepicker-font-weight': this.getStyleValue(this.fontWeight),\r\n            '--cc-datepicker-color': this.getStyleValue(this.color),\r\n            '--cc-datepicker-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n            '--cc-datepicker-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n            '--cc-datepicker-error-color': this.getStyleValue(this.errorColor),\r\n            '--cc-datepicker-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n            '--cc-datepicker-disabled-color': this.getStyleValue(this.disabledColor),\r\n            'box-shadow': this.getStyleValue(this.boxShadow)\r\n        };\r\n    }\r\n}\r\n","<div class=\"cc-datepicker-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n    <label *ngIf=\"label\" class=\"cc-datepicker-label\" [ngStyle]=\"labelStyles\">\r\n        {{ label }}\r\n        <span *ngIf=\"required\" class=\"cc-required\">{{ requiredMarker }}</span>\r\n    </label>\r\n\r\n    <!-- Single Date Picker -->\r\n    <div *ngIf=\"!isRange\" class=\"cc-datepicker-field\" [class.focused]=\"focused\" [class.disabled]=\"disabled\"\r\n        [class.error]=\"errorMessage\" [ngStyle]=\"fieldStyles\">\r\n\r\n        <input type=\"date\" class=\"cc-datepicker-input\" #dateInput [value]=\"formattedValue\" [disabled]=\"disabled\"\r\n            [required]=\"required\" [min]=\"formattedMin\" [max]=\"formattedMax\" [placeholder]=\"placeholder\"\r\n            (input)=\"onDateInput($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" (click)=\"dateInput.showPicker()\" />\r\n\r\n        <span class=\"cc-datepicker-icon material-icons\" (click)=\"dateInput.showPicker()\">calendar_today</span>\r\n    </div>\r\n\r\n    <!-- Range Date Picker -->\r\n    <div *ngIf=\"isRange\" class=\"cc-datepicker-range\">\r\n        <!-- Start Date -->\r\n        <div class=\"cc-datepicker-subfield\">\r\n            <label class=\"cc-datepicker-sublabel\">{{ startDateLabel }}</label>\r\n            <div class=\"cc-datepicker-field\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n                <input type=\"date\" class=\"cc-datepicker-input\" [value]=\"formattedStartDate\" [disabled]=\"disabled\"\r\n                    [required]=\"required\" [min]=\"formattedMin\" [max]=\"formattedEndDate || formattedMax\"\r\n                    (input)=\"onRangeStartInput($event)\" />\r\n            </div>\r\n        </div>\r\n\r\n        <!-- End Date -->\r\n        <div class=\"cc-datepicker-subfield\">\r\n            <label class=\"cc-datepicker-sublabel\">{{ endDateLabel }}</label>\r\n            <div class=\"cc-datepicker-field\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n                <input type=\"date\" class=\"cc-datepicker-input\" [value]=\"formattedEndDate\" [disabled]=\"disabled\"\r\n                    [required]=\"required\" [min]=\"formattedStartDate || formattedMin\" [max]=\"formattedMax\"\r\n                    (input)=\"onRangeEndInput($event)\" />\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"cc-error-message\" *ngIf=\"errorMessage\">{{ errorMessage }}</div>\r\n</div>","import { Component, Input, Output, EventEmitter, forwardRef, OnInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { FilterSearchConfig, SearchLabels } from './search.models';\r\n\r\n@Component({\r\n    selector: 'lib-search',\r\n    templateUrl: './search.component.html',\r\n    styleUrls: ['./search.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => SearchComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class SearchComponent implements ControlValueAccessor, OnInit, OnDestroy, OnChanges {\r\n    @Input() config?: FilterSearchConfig;\r\n    @Input() labels?: SearchLabels;\r\n    @Input() placeholder: string = '';\r\n    @Input() label: string = '';\r\n    @Input() disabled: boolean = false;\r\n    @Input() debounceMs: number = 300;\r\n    @Input() clearable: boolean = true;\r\n    @Input() value: any = '';\r\n\r\n    // Style inputs\r\n    @Input() width?: string;\r\n    @Input() height?: string;\r\n    @Input() borderRadius?: string;\r\n    @Input() fontSize?: string;\r\n\r\n    @Input() gap?: string;\r\n    @Input() fontFamily?: string;\r\n    @Input() labelColor?: string;\r\n    @Input() labelFontSize?: string;\r\n    @Input() labelFontWeight?: string;\r\n\r\n    @Input() backgroundColor?: string;\r\n    @Input() borderColor?: string;\r\n    @Input() borderWidth?: string;\r\n    @Input() border?: string; // Shorthand\r\n    @Input() padding?: string;\r\n    @Input() fontWeight?: string;\r\n    @Input() color?: string;\r\n    @Input() textColor?: string; // Alias for color or specific text color\r\n    @Input() iconColor?: string;\r\n    @Input() placeholderColor?: string;\r\n    @Input() focusBorderColor?: string;\r\n    @Input() disabledBackgroundColor?: string;\r\n    @Input() disabledColor?: string;\r\n    @Input() boxShadow?: string;\r\n\r\n    @Output() search = new EventEmitter<string>();\r\n    @Output() clear = new EventEmitter<void>();\r\n\r\n    private searchSubject = new Subject<string>();\r\n    focused = false;\r\n    onChange: (value: any) => void = () => { };\r\n    onTouched: () => void = () => { };\r\n\r\n    ngOnInit(): void {\r\n        this.updateFromConfig();\r\n        this.updateFromLabels();\r\n        this.searchSubject.pipe(\r\n            debounceTime(this.debounceMs),\r\n            distinctUntilChanged()\r\n        ).subscribe(value => {\r\n            this.search.emit(value);\r\n        });\r\n    }\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config']) {\r\n            this.updateFromConfig();\r\n        }\r\n        if (changes['labels']) {\r\n            this.updateFromLabels();\r\n        }\r\n    }\r\n\r\n    private updateFromConfig(): void {\r\n        if (this.config) {\r\n            this.placeholder = this.config.placeholder ?? this.placeholder;\r\n            this.label = this.config.label ?? this.label;\r\n            this.disabled = this.config.disabled ?? this.disabled;\r\n            this.debounceMs = this.config.debounceTime ?? this.debounceMs;\r\n            this.clearable = this.config.clearable ?? this.clearable;\r\n            this.width = this.config.width ?? this.width;\r\n            this.height = this.config.height ?? this.height;\r\n            this.borderRadius = this.config.borderRadius ?? this.borderRadius;\r\n            this.fontSize = this.config.fontSize ?? this.fontSize;\r\n            this.gap = this.config.gap ?? this.gap;\r\n            this.fontFamily = this.config.fontFamily ?? this.fontFamily;\r\n            this.labelColor = this.config.labelColor ?? this.labelColor;\r\n            this.labelFontSize = this.config.labelFontSize ?? this.labelFontSize;\r\n            this.labelFontWeight = this.config.labelFontWeight ?? this.labelFontWeight;\r\n            this.backgroundColor = this.config.backgroundColor ?? this.backgroundColor;\r\n            this.borderColor = this.config.borderColor ?? this.borderColor;\r\n            this.borderWidth = this.config.borderWidth ?? this.borderWidth;\r\n            this.border = this.config.border ?? this.border;\r\n            this.padding = this.config.padding ?? this.padding;\r\n            this.fontWeight = this.config.fontWeight ?? this.fontWeight;\r\n            this.color = this.config.color ?? this.color;\r\n            this.textColor = this.config.textColor ?? this.textColor;\r\n            this.iconColor = this.config.iconColor ?? this.iconColor;\r\n            this.placeholderColor = this.config.placeholderColor ?? this.placeholderColor;\r\n            this.focusBorderColor = this.config.focusBorderColor ?? this.focusBorderColor;\r\n            this.disabledBackgroundColor = this.config.disabledBackgroundColor ?? this.disabledBackgroundColor;\r\n            this.disabledColor = this.config.disabledColor ?? this.disabledColor;\r\n            this.boxShadow = this.config.boxShadow ?? this.boxShadow;\r\n            if (this.config.value) {\r\n                this.value = this.config.value;\r\n            }\r\n        }\r\n    }\r\n\r\n    private updateFromLabels(): void {\r\n        if (this.labels) {\r\n            this.label = this.labels.label || this.label;\r\n            this.placeholder = this.labels.placeholder || this.placeholder;\r\n        }\r\n    }\r\n\r\n    ngOnDestroy(): void {\r\n        this.searchSubject.complete();\r\n    }\r\n\r\n    get clearAriaLabel(): string {\r\n        return this.labels?.clearAriaLabel || 'Clear search';\r\n    }\r\n\r\n    writeValue(value: any): void {\r\n        this.value = value || '';\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    setDisabledState(isDisabled: boolean): void {\r\n        this.disabled = isDisabled;\r\n    }\r\n\r\n    onInputChange(event: any): void {\r\n        this.value = event.target.value;\r\n        this.onChange(this.value);\r\n        this.searchSubject.next(this.value);\r\n    }\r\n\r\n    onClear(): void {\r\n        this.value = '';\r\n        this.onChange(this.value);\r\n        this.searchSubject.next(this.value);\r\n        this.clear.emit();\r\n    }\r\n\r\n    onBlur(): void {\r\n        this.focused = false;\r\n        this.onTouched();\r\n    }\r\n\r\n    onFocus(): void {\r\n        this.focused = true;\r\n    }\r\n\r\n    private getStyleValue(value: string | undefined): string | undefined {\r\n        return value ? `${value}` : undefined;\r\n    }\r\n\r\n    get wrapperStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            'width': this.getStyleValue(this.width),\r\n            '--cc-search-label-gap': this.getStyleValue(this.gap),\r\n            '--cc-search-font-family': this.getStyleValue(this.fontFamily)\r\n        };\r\n    }\r\n\r\n    get labelStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-search-label-color': this.getStyleValue(this.labelColor),\r\n            '--cc-search-label-font-size': this.getStyleValue(this.labelFontSize),\r\n            '--cc-search-label-font-weight': this.getStyleValue(this.labelFontWeight)\r\n        };\r\n    }\r\n\r\n    get fieldStyles(): { [key: string]: string | undefined } {\r\n        return {\r\n            '--cc-search-bg': this.getStyleValue(this.backgroundColor),\r\n            '--cc-search-border-radius': this.getStyleValue(this.borderRadius),\r\n            '--cc-search-border-color': this.getStyleValue(this.borderColor),\r\n            '--cc-search-border-width': this.getStyleValue(this.borderWidth),\r\n            '--cc-search-border': this.getStyleValue(this.border),\r\n            '--cc-search-height': this.getStyleValue(this.height),\r\n            '--cc-search-padding': this.getStyleValue(this.padding),\r\n            '--cc-search-font-size': this.getStyleValue(this.fontSize),\r\n            '--cc-search-font-weight': this.getStyleValue(this.fontWeight),\r\n            '--cc-search-color': this.getStyleValue(this.color || this.textColor),\r\n            '--cc-search-icon-color': this.getStyleValue(this.iconColor),\r\n            '--cc-search-placeholder-color': this.getStyleValue(this.placeholderColor),\r\n            '--cc-search-focus-border-color': this.getStyleValue(this.focusBorderColor),\r\n            '--cc-search-disabled-bg': this.getStyleValue(this.disabledBackgroundColor),\r\n            '--cc-search-disabled-color': this.getStyleValue(this.disabledColor),\r\n            'box-shadow': this.getStyleValue(this.boxShadow)\r\n        };\r\n    }\r\n}\r\n","<div class=\"cc-search-wrapper\" [ngStyle]=\"wrapperStyles\">\r\n    <label *ngIf=\"label\" class=\"cc-search-label\" [ngStyle]=\"labelStyles\">{{ label }}</label>\r\n\r\n    <div class=\"cc-search-field\" [class.focused]=\"focused\" [class.disabled]=\"disabled\" [ngStyle]=\"fieldStyles\">\r\n        <span class=\"cc-search-icon material-icons\">search</span>\r\n\r\n        <input type=\"text\" class=\"cc-search-input\" [value]=\"value\" [placeholder]=\"placeholder\" [disabled]=\"disabled\"\r\n            (input)=\"onInputChange($event)\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" />\r\n\r\n        <button *ngIf=\"clearable && value && !disabled\" type=\"button\" class=\"cc-clear-btn\" (click)=\"onClear()\"\r\n            [attr.aria-label]=\"clearAriaLabel\">\r\n            <span class=\"material-icons\">close</span>\r\n        </button>\r\n    </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { InputComponent } from './components/input/input.component';\r\nimport { DropdownComponent } from './components/dropdown/dropdown.component';\r\nimport { CheckboxComponent } from './components/checkbox/checkbox.component';\r\nimport { RadioComponent } from './components/radio/radio.component';\r\nimport { ToggleComponent } from './components/toggle/toggle.component';\r\nimport { DatepickerComponent } from './components/datepicker/datepicker.component';\r\nimport { SearchComponent } from './components/search/search.component';\r\nimport { ClickOutsideDirective } from './directives/click-outside.directive';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        InputComponent,\r\n        DropdownComponent,\r\n        CheckboxComponent,\r\n        RadioComponent,\r\n        ToggleComponent,\r\n        DatepickerComponent,\r\n        SearchComponent,\r\n        ClickOutsideDirective\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        ReactiveFormsModule,\r\n        FormsModule,\r\n        ScrollingModule\r\n    ],\r\n    exports: [\r\n        InputComponent,\r\n        DropdownComponent,\r\n        CheckboxComponent,\r\n        RadioComponent,\r\n        ToggleComponent,\r\n        DatepickerComponent,\r\n        SearchComponent,\r\n        ClickOutsideDirective\r\n    ]\r\n})\r\nexport class FormComponentsModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TimePickerComponent } from './components/time-picker/time-picker.component';\r\nimport { TimeWheelPanelComponent } from './components/time-wheel-panel/time-wheel-panel.component';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    TimePickerComponent,\r\n    TimeWheelPanelComponent\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    FormComponentsModule\r\n  ],\r\n  exports: [\r\n    TimePickerComponent,\r\n    TimeWheelPanelComponent\r\n  ]\r\n})\r\nexport class TimePickerModule {}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { SmartFormComponent } from './components/smart-form/smart-form.component';\r\nimport { FormSectionComponent } from './components/form-section/form-section.component';\r\nimport { FormFieldComponent } from './components/form-field/form-field.component';\r\nimport { ExpressionService } from './services/expression.service';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { AlertModule } from '../alert/alert.module';\r\nimport { QuillModule } from 'ngx-quill';\r\nimport { TrustedUrlPipe } from './utils/trusted-url.pipe';\r\nimport { TimePickerModule } from '../time-picker/time-picker.module';\r\n@NgModule({\r\n  declarations: [\r\n    SmartFormComponent,\r\n    FormSectionComponent,\r\n    FormFieldComponent,\r\n    TrustedUrlPipe\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    ReactiveFormsModule,\r\n    FormsModule,\r\n    MaterialModule,\r\n    OverlayModule,\r\n    ButtonModule,\r\n    AlertModule,\r\n    QuillModule.forRoot(),\r\n    TimePickerModule\r\n  ],\r\n  exports: [\r\n    SmartFormComponent\r\n  ],\r\n  providers: [\r\n    ExpressionService\r\n  ]\r\n})\r\nexport class SmartFormModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n  FormSchema,\r\n  FieldConfig,\r\n  SectionConfig,\r\n} from '../../smart-form/models/form-schema.model';\r\nimport {\r\n  SelectionGroupNode,\r\n  SelectionSectionNode,\r\n  SelectionFieldNode,\r\n} from '../models/field-selection.models';\r\nimport {\r\n  ConfiguratorTreeNode,\r\n} from '../models/field-configurator.models';\r\n\r\n/**\r\n * Service to parse a FormSchema into selection/configurator tree structures,\r\n * and to rebuild a modified FormSchema from those trees.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class FormSchemaTreeService {\r\n\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n  // SELECTION TREE\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Parse a FormSchema into SelectionGroupNodes for the field-selection UI.\r\n   * Stepper forms produce one group per step; section forms produce one group.\r\n   */\r\n  parseSchemaToSelectionGroups(schema: FormSchema): SelectionGroupNode[] {\r\n    if (schema.formType === 'STEPPER' && schema.stepperConfig?.children?.length) {\r\n      return schema.stepperConfig.children\r\n        .filter(child => child.type === 'GROUP')\r\n        .map(groupField => this._buildGroupNode(groupField));\r\n    }\r\n\r\n    // SECTION form → single virtual group. This group has no backing FieldConfig of its\r\n    // own (it's the schema root, not a child), so its enabled state is DERIVED from its\r\n    // sections: on if at least one child section is on, off only once every child is off.\r\n    // This flag is not just cosmetic — smart-form.component.html reads sectionConfig.isEnabled\r\n    // to decide whether the whole form section renders for end users, so it must reflect the\r\n    // real combined state of its children rather than being an independently-clicked flag.\r\n    // The master toggle click itself still cascades enable/disable to all children (see\r\n    // FieldSelectionService.toggleGroup); this is just what happens to the header on re-parse.\r\n    if (schema.sectionConfig?.children?.length) {\r\n      const sections = this._buildSectionsFromChildren(schema.sectionConfig.children);\r\n      return [{\r\n        label: schema.label || 'Form',\r\n        groupFieldConfig: null,\r\n        enabled: sections.length === 0 || sections.some(s => s.enabled),\r\n        expanded: true, // Collapse by default for better UX\r\n        sections,\r\n      }];\r\n    }\r\n\r\n    return [];\r\n  }\r\n\r\n  /**\r\n   * Rebuild a FormSchema from the selection tree, updating visible/disabled/required\r\n   * flags on each FieldConfig. Does NOT mutate the original schema.\r\n   */\r\n  applySelectionToSchema(\r\n    groups: SelectionGroupNode[],\r\n    originalSchema: FormSchema,\r\n  ): FormSchema {\r\n    const schema: FormSchema = JSON.parse(JSON.stringify(originalSchema));\r\n\r\n    if (schema.formType === 'STEPPER' && schema.stepperConfig?.children?.length) {\r\n      const stepChildren = schema.stepperConfig.children.filter(c => c.type === 'GROUP');\r\n      groups.forEach((group, gi) => {\r\n        if (gi < stepChildren.length) {\r\n          const groupField = stepChildren[gi];\r\n          groupField.isEnabled = group.enabled;\r\n          groupField.visible = group.enabled; // Backward compatibility\r\n          groupField.disabled = !group.enabled;\r\n          if (groupField.sectionConfig?.children) {\r\n            this._applySectionsToChildren(group.sections, groupField.sectionConfig.children);\r\n          }\r\n        }\r\n      });\r\n    } else if (schema.sectionConfig?.children?.length && groups.length > 0) {\r\n      schema.sectionConfig.isEnabled = groups[0].enabled;\r\n      this._applySectionsToChildren(groups[0].sections, schema.sectionConfig.children);\r\n    }\r\n\r\n    return schema;\r\n  }\r\n\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n  // CONFIGURATOR TREE\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Parse a FormSchema into a flat ConfiguratorTreeNode[] for the left-panel tree.\r\n   */\r\n  parseSchemaToConfiguratorTree(schema: FormSchema): ConfiguratorTreeNode[] {\r\n    if (schema.formType === 'STEPPER' && schema.stepperConfig?.children?.length) {\r\n      return schema.stepperConfig.children\r\n        .filter(c => c.type === 'GROUP')\r\n        .map((groupField, gi) => this._buildConfiguratorGroupNode(groupField, [gi]));\r\n    }\r\n\r\n    if (schema.sectionConfig?.children?.length) {\r\n      return this._buildConfiguratorChildNodes(schema.sectionConfig.children, []);\r\n    }\r\n\r\n    return [];\r\n  }\r\n\r\n  /**\r\n   * Find a FieldConfig inside a FormSchema by its index path.\r\n   */\r\n  findFieldByPath(schema: FormSchema, path: number[]): FieldConfig | null {\r\n    if (path.length === 0) return null;\r\n\r\n    let children: FieldConfig[] | undefined;\r\n    if (schema.formType === 'STEPPER') {\r\n      children = schema.stepperConfig?.children;\r\n    } else {\r\n      children = schema.sectionConfig?.children;\r\n    }\r\n    if (!children) return null;\r\n\r\n    let current: FieldConfig | undefined;\r\n    for (let i = 0; i < path.length; i++) {\r\n      const idx = path[i];\r\n      if (!children || idx >= children.length) return null;\r\n      current = children[idx];\r\n\r\n      if (i < path.length - 1) {\r\n        // Navigate deeper\r\n        if (current.sectionConfig?.children) {\r\n          children = current.sectionConfig.children;\r\n        } else if (current.children) {\r\n          children = current.children;\r\n        } else {\r\n          return null;\r\n        }\r\n      }\r\n    }\r\n\r\n    return current ?? null;\r\n  }\r\n\r\n  /**\r\n   * Apply a partial patch to a FieldConfig located at the given path.\r\n   * Returns a new FormSchema (does not mutate the original).\r\n   */\r\n  /**\r\n   * Known top-level keys of FieldConfig.\r\n   * Used to strip stale group-name keys (e.g. textConstraintsTextConfig) that\r\n   * may have been introduced by previous incorrect patch operations.\r\n   */\r\n  private readonly _VALID_FIELD_KEYS = new Set([\r\n    'name', 'type', 'subType', 'label', 'placeholder', 'hint',\r\n    'required', 'disabled', 'readonly', 'isEnabled', 'visible',\r\n    'colSpan', 'defaultValue', 'prefix', 'suffix', 'className',\r\n    'payloadPath', 'errorMessage', 'visibilityExpression', 'onValidate',\r\n    'children', 'sectionConfig', 'rows',\r\n    'textConfig', 'emailConfig', 'phoneConfig', 'numberConfig',\r\n    'dateConfig', 'optionConfig', 'attachmentConfig', 'richTextConfig',\r\n    'ratingConfig', 'locationConfig', 'generatedConfig', 'rangeConfig',\r\n  ]);\r\n\r\n  applyFieldPatchToSchema(\r\n    path: number[],\r\n    patch: Partial<FieldConfig>,\r\n    originalSchema: FormSchema,\r\n  ): FormSchema {\r\n    const schema: FormSchema = JSON.parse(JSON.stringify(originalSchema));\r\n    const field = this.findFieldByPath(schema, path) as Record<string, any> | null;\r\n    if (field) {\r\n      // 1. Strip stale keys that don't belong to FieldConfig (e.g. old group names)\r\n      for (const key of Object.keys(field)) {\r\n        if (!this._VALID_FIELD_KEYS.has(key)) {\r\n          delete field[key];\r\n        }\r\n      }\r\n      // 2. Deep-merge the new patch on top of the cleaned field\r\n      FormSchemaTreeService.deepMerge(field, patch as any);\r\n      // 3. Clean up empty-string / null leaves from nested config objects.\r\n      //    e.g. user clears minDate → dateConfig.minDate becomes \"\" → remove it.\r\n      //    If the entire config object ends up empty → remove the key.\r\n      FormSchemaTreeService.cleanEmptyConfigValues(field);\r\n    }\r\n    return schema;\r\n  }\r\n\r\n  /**\r\n   * Remove empty-string and null values from all typed config sub-objects on a field.\r\n   * If all values in a config sub-object are empty, the key is deleted entirely.\r\n   */\r\n  public static cleanEmptyConfigValues(field: Record<string, any>): void {\r\n    const CONFIG_KEYS = [\r\n      'textConfig', 'emailConfig', 'phoneConfig', 'numberConfig',\r\n      'dateConfig', 'optionConfig', 'attachmentConfig', 'richTextConfig',\r\n      'ratingConfig', 'locationConfig', 'generatedConfig', 'rangeConfig',\r\n    ];\r\n    for (const key of CONFIG_KEYS) {\r\n      if (field[key] && typeof field[key] === 'object' && !Array.isArray(field[key])) {\r\n        field[key] = FormSchemaTreeService._removeEmptyLeaves(field[key]);\r\n        if (Object.keys(field[key]).length === 0) {\r\n          delete field[key];\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Recursively strip empty-string, null, and undefined values from a plain object.\r\n   * Nested objects that become empty after stripping are also removed.\r\n   */\r\n  private static _removeEmptyLeaves(obj: Record<string, any>): Record<string, any> {\r\n    const result: Record<string, any> = {};\r\n    for (const [key, val] of Object.entries(obj)) {\r\n      if (val === '' || val === null || val === undefined) continue;\r\n      if (typeof val === 'object' && !Array.isArray(val)) {\r\n        const nested = FormSchemaTreeService._removeEmptyLeaves(val);\r\n        if (Object.keys(nested).length > 0) result[key] = nested;\r\n      } else {\r\n        result[key] = val;\r\n      }\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Recursively merge `source` into `target` in-place.\r\n   * Objects are merged key-by-key; primitives/arrays replace the existing value.\r\n   */\r\n  public static deepMerge(target: Record<string, any>, source: Record<string, any>): void {\r\n    for (const key of Object.keys(source)) {\r\n      const srcVal = source[key];\r\n      const tgtVal = target[key];\r\n      if (\r\n        srcVal !== null &&\r\n        typeof srcVal === 'object' &&\r\n        !Array.isArray(srcVal) &&\r\n        tgtVal !== null &&\r\n        typeof tgtVal === 'object' &&\r\n        !Array.isArray(tgtVal)\r\n      ) {\r\n        // Both sides are plain objects — merge recursively\r\n        this.deepMerge(tgtVal, srcVal);\r\n      } else {\r\n        target[key] = srcVal;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Convert a flat object with dot-notation keys into a nested object.\r\n   * E.g. { 'a.b.c': 1 } -> { a: { b: { c: 1 } } }\r\n   */\r\n  public static inflatePatch(flatPatch: Record<string, any>): Record<string, any> {\r\n    const nested: Record<string, any> = {};\r\n\r\n    for (const [key, value] of Object.entries(flatPatch)) {\r\n      const parts = key.split('.');\r\n      let current = nested;\r\n\r\n      for (let i = 0; i < parts.length - 1; i++) {\r\n        const part = parts[i];\r\n        if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\r\n          current[part] = {};\r\n        }\r\n        current = current[part];\r\n      }\r\n\r\n      current[parts[parts.length - 1]] = value;\r\n    }\r\n\r\n    return nested;\r\n  }\r\n\r\n  /**\r\n   * Convert a nested object into a flat object with dot-notation keys.\r\n   * E.g. { a: { b: { c: 1 } } } -> { 'a.b.c': 1 }\r\n   */\r\n  public static flattenObject(obj: Record<string, any>, prefix = ''): Record<string, any> {\r\n    const flat: Record<string, any> = {};\r\n\r\n    for (const [key, value] of Object.entries(obj)) {\r\n      const newKey = prefix ? `${prefix}.${key}` : key;\r\n      if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\r\n        Object.assign(flat, this.flattenObject(value, newKey));\r\n      } else {\r\n        flat[newKey] = value;\r\n      }\r\n    }\r\n\r\n    return flat;\r\n  }\r\n\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n  // FIELD TYPE MAPPING (FormSchema type → builder field type)\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Map a FormSchema FieldConfig.type to the builder fieldType key\r\n   * used in field-type-schema.map.ts for config UI generation.\r\n   */\r\n  mapFieldTypeToBuilderType(type: string, subType?: string): string {\r\n    const typeMap: Record<string, string> = {\r\n      'TEXT_INPUT': 'shortText',\r\n      'TEXT': 'shortText',\r\n      'TEXTAREA': 'longText',\r\n      'RICH_TEXT': 'richText',\r\n      'NUMBER_INPUT': 'number',\r\n      'NUMBER': 'number',\r\n      'DATE': 'date',\r\n      'TIME': 'time',\r\n      'DROPDOWN': 'dropdown',\r\n      'SELECT': 'dropdown',\r\n      'MULTI_SELECT': 'multiSelect',\r\n      'AUTOCOMPLETE': 'autocomplete',\r\n      'RADIO': 'radio',\r\n      'CHECKBOX': 'checkbox',\r\n      'SWITCH': 'toggle',\r\n      'FILE_UPLOAD': 'file',\r\n      'RATING': 'rating',\r\n      'GENERATED': 'generated',\r\n      'CHIP': 'chip',\r\n      'LOCATION': 'location',\r\n      'GROUP': 'group',\r\n      'SUBFIELDS': 'section',\r\n    };\r\n\r\n    // Refinement by subType\r\n    if (type === 'TEXT_INPUT' && subType) {\r\n      switch (subType) {\r\n        case 'LONG':     return 'longText';\r\n        case 'EMAIL':    return 'email';\r\n        case 'PHONE':    return 'phone';\r\n        case 'PASSWORD': return 'password';\r\n        default:         return 'shortText';\r\n      }\r\n    }\r\n\r\n    if (type === 'NUMBER_INPUT') {\r\n      if (subType === 'DECIMAL') return 'decimal';\r\n      return 'number';\r\n    }\r\n\r\n    if (type === 'DATE') {\r\n      if (subType === 'DATETIME') return 'dateTime';\r\n      return 'date';\r\n    }\r\n\r\n    if (type === 'CHECKBOX' && subType === 'LIST') {\r\n      return 'multiCheckbox';\r\n    }\r\n\r\n    return typeMap[type] ?? 'shortText';\r\n  }\r\n\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n  // PRIVATE — Selection tree builders\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n\r\n  private _buildGroupNode(groupField: FieldConfig): SelectionGroupNode {\r\n    const sections: SelectionSectionNode[] = [];\r\n\r\n    if (groupField.sectionConfig?.children) {\r\n      const built = this._buildSectionsFromChildren(groupField.sectionConfig.children);\r\n      sections.push(...built);\r\n    }\r\n\r\n    return {\r\n      label: groupField.sectionConfig?.label || groupField.label || groupField.name || 'Group',\r\n      groupFieldConfig: groupField,\r\n      enabled: groupField.isEnabled ?? groupField.visible ?? true,\r\n      expanded: true, // Collapse by default for better UX - user can expand as needed\r\n      sections,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Build sections from a children array. Fields that are GROUP/SUBFIELDS\r\n   * become sections; other leaf fields are collected into a \"default\" section.\r\n   */\r\n  private _buildSectionsFromChildren(children: FieldConfig[]): SelectionSectionNode[] {\r\n    const sections: SelectionSectionNode[] = [];\r\n    let leafFields: SelectionFieldNode[] = [];\r\n\r\n    for (const child of children) {\r\n      if (child.type === 'GROUP' || (child.type === 'SUBFIELDS') || child.sectionConfig) {\r\n        // Flush any accumulated leaf fields into a default section\r\n        if (leafFields.length > 0) {\r\n          sections.push(this._createDefaultSection(leafFields));\r\n          leafFields = [];\r\n        }\r\n        sections.push(this._buildSectionNode(child));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        // ROW children are leaf fields\r\n        for (const rowChild of child.children) {\r\n          leafFields.push(...this._buildFieldNodesFor(rowChild));\r\n        }\r\n      } else {\r\n        leafFields.push(...this._buildFieldNodesFor(child));\r\n      }\r\n    }\r\n\r\n    // Flush remaining leaf fields\r\n    if (leafFields.length > 0) {\r\n      sections.push(this._createDefaultSection(leafFields));\r\n    }\r\n\r\n    return sections;\r\n  }\r\n\r\n  private _buildSectionNode(field: FieldConfig): SelectionSectionNode {\r\n    const subsections: SelectionSectionNode[] = [];\r\n    const fields: SelectionFieldNode[] = [];\r\n\r\n    const children = field.sectionConfig?.children ?? field.children ?? [];\r\n    for (const child of children) {\r\n      if (child.type === 'GROUP' || child.sectionConfig) {\r\n        subsections.push(this._buildSectionNode(child));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        for (const rowChild of child.children) {\r\n          fields.push(...this._buildFieldNodesFor(rowChild));\r\n        }\r\n      } else {\r\n        fields.push(...this._buildFieldNodesFor(child));\r\n      }\r\n    }\r\n\r\n    const isVisible = field.isEnabled ?? field.visible ?? true;\r\n    const enabled = isVisible && field.disabled !== true;\r\n\r\n    // A section acts as a true parent checkbox: when it's off, none of its descendants can be\r\n    // \"on\" in the UI, no matter what the raw schema says for them individually. Backend data can\r\n    // disagree (e.g. a prior save wrote the section's own isEnabled=false but never cascaded that\r\n    // down to every leaf field's isEnabled) — that's exactly the state that made Field\r\n    // Configuration silently drop selected-looking fields, since the build step below prunes the\r\n    // whole disabled branch regardless of children. Normalizing here keeps what the checkboxes\r\n    // show in sync with what will actually survive into the next step.\r\n    const normalizedFields = enabled ? fields : fields.map(f => ({ ...f, selected: false }));\r\n    const normalizedSubsections = enabled ? subsections : this._disableSectionsDeep(subsections);\r\n\r\n    return {\r\n      label: field.sectionConfig?.label || field.label || field.name || 'Section',\r\n      sectionConfig: field.sectionConfig ?? null,\r\n      parentFieldConfig: field,\r\n      enabled,\r\n      expanded: false, // Collapse by default for better UX - user can expand as needed\r\n      fields: normalizedFields,\r\n      subsections: normalizedSubsections,\r\n    };\r\n  }\r\n\r\n  /** Recursively forces enabled=false and selected=false through an already-built subtree. */\r\n  private _disableSectionsDeep(sections: SelectionSectionNode[]): SelectionSectionNode[] {\r\n    return sections.map(s => ({\r\n      ...s,\r\n      enabled: false,\r\n      fields: s.fields.map(f => ({ ...f, selected: false })),\r\n      subsections: this._disableSectionsDeep(s.subsections),\r\n    }));\r\n  }\r\n\r\n  private _createDefaultSection(fields: SelectionFieldNode[]): SelectionSectionNode {\r\n    return {\r\n      label: 'Fields',\r\n      sectionConfig: null,\r\n      parentFieldConfig: null,\r\n      enabled: true,\r\n      expanded: false, // Collapse by default for better UX - user can expand as needed\r\n      fields,\r\n      subsections: [],\r\n    };\r\n  }\r\n\r\n  private _buildFieldNode(field: FieldConfig): SelectionFieldNode {\r\n    return {\r\n      fieldConfig: field,\r\n      selected: field.isEnabled ?? field.visible ?? true,\r\n      isLocked: field.readonly === true,\r\n    };\r\n  }\r\n\r\n  /** Every leaf field produces exactly one SelectionFieldNode. */\r\n  private _buildFieldNodesFor(field: FieldConfig): SelectionFieldNode[] {\r\n    return [this._buildFieldNode(field)];\r\n  }\r\n\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n  // PRIVATE — Apply selection back to FormSchema children\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n\r\n  private _applySectionsToChildren(\r\n    sections: SelectionSectionNode[],\r\n    children: FieldConfig[],\r\n  ): void {\r\n    // Only sections built from an actual GROUP/section field (parentFieldConfig set) map\r\n    // 1:1 to a GROUP-typed schema child here. _buildSectionsFromChildren also inserts\r\n    // \"default\" leaf-bundle sections (parentFieldConfig: null) for stray top-level fields\r\n    // that aren't wrapped in a GROUP — those don't correspond to any schema child in this\r\n    // loop at all (their fields are applied via _findSelectionField below instead). Without\r\n    // filtering them out, a single leading/interleaved leaf field shifts `sectionIdx` out of\r\n    // alignment, silently applying one section's enabled/disabled state to the WRONG group\r\n    // (e.g. toggling \"Languages\" off ends up disabling \"Address Details\" instead).\r\n    const structuralSections = sections.filter(s => !!s.parentFieldConfig);\r\n    let sectionIdx = 0;\r\n    let fieldIdx = 0;\r\n\r\n    for (const child of children) {\r\n      if (child.type === 'GROUP' || child.sectionConfig) {\r\n        if (sectionIdx < structuralSections.length) {\r\n          const section = structuralSections[sectionIdx];\r\n          child.isEnabled = section.enabled;\r\n          child.visible = section.enabled; // Backward compatibility\r\n          child.disabled = !section.enabled;\r\n          const innerChildren = child.sectionConfig?.children ?? child.children ?? [];\r\n          if (innerChildren.length > 0) {\r\n            this._applySectionsToChildren(section.subsections, innerChildren);\r\n            // Also apply field selections\r\n            this._applyFieldsToChildren(section.fields, innerChildren);\r\n          }\r\n          sectionIdx++;\r\n        }\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        for (const rowChild of child.children) {\r\n          const matchedField = this._findSelectionField(sections, rowChild, fieldIdx);\r\n          if (matchedField) {\r\n            rowChild.isEnabled = matchedField.selected;\r\n            rowChild.visible = matchedField.selected; // Backward compatibility\r\n            fieldIdx++;\r\n          }\r\n        }\r\n      } else {\r\n        const matchedField = this._findSelectionField(sections, child, fieldIdx);\r\n        if (matchedField) {\r\n          child.isEnabled = matchedField.selected;\r\n          child.visible = matchedField.selected; // Backward compatibility\r\n          fieldIdx++;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private _applyFieldsToChildren(\r\n    selectionFields: SelectionFieldNode[],\r\n    children: FieldConfig[],\r\n  ): void {\r\n    let fi = 0;\r\n    for (const child of children) {\r\n      if (child.type === 'GROUP' || child.sectionConfig) continue;\r\n      if (child.type === 'ROW' && child.children?.length) {\r\n        for (const rowChild of child.children) {\r\n          fi = this._applyOneFieldSelection(selectionFields, rowChild, fi);\r\n        }\r\n      } else {\r\n        fi = this._applyOneFieldSelection(selectionFields, child, fi);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Applies the selection state for exactly one schema child at flat position `fi` in\r\n   * `selectionFields`, and returns the next unconsumed index.\r\n   */\r\n  private _applyOneFieldSelection(selectionFields: SelectionFieldNode[], child: FieldConfig, fi: number): number {\r\n    if (fi < selectionFields.length) {\r\n      child.isEnabled = selectionFields[fi].selected;\r\n      child.visible = selectionFields[fi].selected; // Backward compatibility\r\n    }\r\n    return fi + 1;\r\n  }\r\n\r\n  private _findSelectionField(\r\n    sections: SelectionSectionNode[],\r\n    _field: FieldConfig,\r\n    _index: number,\r\n  ): SelectionFieldNode | null {\r\n    // Flatten all fields from all sections\r\n    for (const section of sections) {\r\n      for (const f of section.fields) {\r\n        if (f.fieldConfig === _field || f.fieldConfig.name === _field.name) {\r\n          return f;\r\n        }\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n  // PRIVATE — Configurator tree builders\r\n  // ────────────────────────────────────────────────────────────────────────────\r\n\r\n  private _buildConfiguratorGroupNode(\r\n    groupField: FieldConfig,\r\n    basePath: number[],\r\n  ): ConfiguratorTreeNode {\r\n    const children: ConfiguratorTreeNode[] = [];\r\n    const sectionChildren = groupField.sectionConfig?.children ?? [];\r\n\r\n    sectionChildren.forEach((child, ci) => {\r\n      if (child.isEnabled === false || child.visible === false) return;\r\n      const childPath = [...basePath, ci];\r\n      if (child.type === 'GROUP' || child.type === 'SUBFIELDS' || child.subType === 'SECTION' || child.sectionConfig) {\r\n        children.push(this._buildConfiguratorSectionNode(child, childPath));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        child.children.forEach((rowChild, ri) => {\r\n          if (rowChild.isEnabled !== false && rowChild.visible !== false) {\r\n            children.push(this._buildConfiguratorLeafNode(rowChild, [...childPath, ri]));\r\n          }\r\n        });\r\n      } else {\r\n        children.push(this._buildConfiguratorLeafNode(child, childPath));\r\n      }\r\n    });\r\n\r\n    return {\r\n      id: groupField.name || `group-${basePath.join('-')}`,\r\n      label: groupField.sectionConfig?.label || groupField.label || 'Group',\r\n      type: 'group',\r\n      expanded: false,\r\n      fieldConfig: groupField,\r\n      path: basePath,\r\n      children,\r\n    };\r\n  }\r\n\r\n  private _buildConfiguratorSectionNode(\r\n    field: FieldConfig,\r\n    basePath: number[],\r\n  ): ConfiguratorTreeNode {\r\n    const children: ConfiguratorTreeNode[] = [];\r\n    const sectionChildren = field.sectionConfig?.children ?? field.children ?? [];\r\n\r\n    sectionChildren.forEach((child, ci) => {\r\n      if (child.isEnabled === false || child.visible === false) return;\r\n      const childPath = [...basePath, ci];\r\n      if (child.type === 'GROUP' || child.type === 'SUBFIELDS' || child.subType === 'SECTION' || child.sectionConfig) {\r\n        children.push(this._buildConfiguratorSectionNode(child, childPath));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        child.children.forEach((rowChild, ri) => {\r\n          if (rowChild.isEnabled !== false && rowChild.visible !== false) {\r\n            children.push(this._buildConfiguratorLeafNode(rowChild, [...childPath, ri]));\r\n          }\r\n        });\r\n      } else {\r\n        children.push(this._buildConfiguratorLeafNode(child, childPath));\r\n      }\r\n    });\r\n\r\n    return {\r\n      id: field.name || `section-${basePath.join('-')}`,\r\n      label: field.sectionConfig?.label || field.label || 'Section',\r\n      type: 'section',\r\n      expanded: false,\r\n      fieldConfig: field,\r\n      path: basePath,\r\n      children,\r\n    };\r\n  }\r\n\r\n  private _buildConfiguratorFieldNode(\r\n    field: FieldConfig,\r\n    path: number[],\r\n  ): ConfiguratorTreeNode {\r\n    return {\r\n      id: field.name || `field-${path.join('-')}`,\r\n      label: field.label || field.name || 'Field',\r\n      type: 'field',\r\n      expanded: false,\r\n      fieldConfig: field,\r\n      path,\r\n      children: [],\r\n    };\r\n  }\r\n\r\n  private _buildConfiguratorLeafNode(field: FieldConfig, path: number[]): ConfiguratorTreeNode {\r\n    return this._buildConfiguratorFieldNode(field, path);\r\n  }\r\n\r\n  private _buildConfiguratorChildNodes(\r\n    children: FieldConfig[],\r\n    basePath: number[],\r\n  ): ConfiguratorTreeNode[] {\r\n    const nodes: ConfiguratorTreeNode[] = [];\r\n\r\n    children.forEach((child, ci) => {\r\n      if (child.isEnabled === false || child.visible === false) return;\r\n      const childPath = [...basePath, ci];\r\n      if (child.type === 'GROUP' || child.sectionConfig) {\r\n        nodes.push(this._buildConfiguratorSectionNode(child, childPath));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        child.children.forEach((rowChild, ri) => {\r\n          if (rowChild.isEnabled !== false && rowChild.visible !== false) {\r\n            nodes.push(this._buildConfiguratorLeafNode(rowChild, [...childPath, ri]));\r\n          }\r\n        });\r\n      } else {\r\n        nodes.push(this._buildConfiguratorLeafNode(child, childPath));\r\n      }\r\n    });\r\n\r\n    return nodes;\r\n  }\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport { FormSchema } from '../../smart-form/models/form-schema.model';\r\nimport {\r\n  SelectionGroupNode,\r\n  SelectionSectionNode,\r\n  SelectionFieldNode,\r\n} from '../models/field-selection.models';\r\nimport { FormSchemaTreeService } from '../services/form-schema-tree.service';\r\n\r\ninterface FieldSelectionState {\r\n  groups: SelectionGroupNode[];\r\n  originalSchema: FormSchema | null;\r\n}\r\n\r\n/**\r\n * Signal-based service for the field-selection component.\r\n * Manages group/section/field enable/disable toggles.\r\n */\r\n@Injectable()\r\nexport class FieldSelectionService {\r\n  private readonly _state = signal<FieldSelectionState>({\r\n    groups: [],\r\n    originalSchema: null,\r\n  });\r\n\r\n  private readonly treeService = new FormSchemaTreeService();\r\n\r\n  // ── Computed slices ─────────────────────────────────────────────\r\n  readonly groups = computed(() => this._state().groups);\r\n  readonly originalSchema = computed(() => this._state().originalSchema);\r\n\r\n  readonly totalFieldCount = computed(() => {\r\n    let count = 0;\r\n    const countFields = (sections: SelectionSectionNode[]): void => {\r\n      for (const s of sections) {\r\n        count += s.fields.length;\r\n        countFields(s.subsections);\r\n      }\r\n    };\r\n    for (const g of this._state().groups) {\r\n      countFields(g.sections);\r\n    }\r\n    return count;\r\n  });\r\n\r\n  readonly selectedFieldCount = computed(() => {\r\n    let count = 0;\r\n    const countSelected = (sections: SelectionSectionNode[]): void => {\r\n      for (const s of sections) {\r\n        if (!s.enabled) continue;\r\n        count += s.fields.filter(f => f.selected).length;\r\n        countSelected(s.subsections);\r\n      }\r\n    };\r\n    for (const g of this._state().groups) {\r\n      if (!g.enabled) continue;\r\n      countSelected(g.sections);\r\n    }\r\n    return count;\r\n  });\r\n\r\n  // ── Mutators ────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Initialize the store from a FormSchema.\r\n   */\r\n  loadSchema(schema: FormSchema): void {\r\n    const groups = this._reconcileGroupsFromChildren(this.treeService.parseSchemaToSelectionGroups(schema));\r\n    this._state.set({ groups, originalSchema: schema });\r\n  }\r\n\r\n  /**\r\n   * Load a schema while preserving the expanded/collapsed state of sections and groups.\r\n   * Used when the schema structure hasn't changed but field selections have.\r\n   * This prevents the UI from unexpectedly collapsing sections when the user toggles a field.\r\n   */\r\n  loadSchemaPreservingExpanded(schema: FormSchema): void {\r\n    const oldGroups = this._state().groups;\r\n    const newGroups = this._reconcileGroupsFromChildren(this.treeService.parseSchemaToSelectionGroups(schema));\r\n\r\n    // Merge old expansion states into new groups\r\n    const mergedGroups = newGroups.map((newGroup, gi) => ({\r\n      ...newGroup,\r\n      expanded: oldGroups[gi]?.expanded ?? newGroup.expanded,\r\n      sections: this._mergeExpandedSections(newGroup.sections, oldGroups[gi]?.sections ?? []),\r\n    }));\r\n\r\n    this._state.set({ groups: mergedGroups, originalSchema: schema });\r\n  }\r\n\r\n  /**\r\n   * A freshly-parsed group/section's `enabled` comes straight from its persisted\r\n   * FieldConfig.isEnabled — unlike toggleField()/toggleSection(), which always follow a mutation\r\n   * with `_recomputeEnabledFromChildren()` to keep the section/group toggle in sync with its\r\n   * children's actual selected state. Without this, a schema saved with e.g. Address.isEnabled:\r\n   * false but its Country/State/District checkboxes individually selected (a state that toggling\r\n   * from within the UI can never itself produce, but stale/pre-fix persisted data can) loads with\r\n   * checked child boxes sitting under a section toggle that shows OFF — contradicting what the\r\n   * checkboxes say and, worse, matching what the Configurator tree/actual form use to prune the\r\n   * whole section. Runs the same reconciliation parse-time gets on every load, so the toggle\r\n   * always reflects reality regardless of how the persisted schema got into this state.\r\n   */\r\n  private _reconcileGroupsFromChildren(groups: SelectionGroupNode[]): SelectionGroupNode[] {\r\n    return groups.map(g => {\r\n      const sections = this._recomputeEnabledFromChildren(g.sections);\r\n      return {\r\n        ...g,\r\n        sections,\r\n        enabled: sections.length === 0 ? g.enabled : (sections.some(s => s.enabled) || g.enabled),\r\n      };\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Toggle a group's enabled state. Disabling cascades to all sections + fields.\r\n   * When enabling, all fields are selected (unless locked).\r\n   */\r\n  toggleGroup(groupIndex: number): void {\r\n    this._state.update(s => ({\r\n      ...s,\r\n      groups: s.groups.map((g, i) => {\r\n        if (i !== groupIndex) return g;\r\n        const enabled = !g.enabled;\r\n        return {\r\n          ...g,\r\n          enabled,\r\n          sections: enabled ? this._enableAllSections(g.sections) : this._disableAllSections(g.sections),\r\n        };\r\n      }),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Toggle a section's enabled state.\r\n   * Disabling cascades to all child fields (and subsections).\r\n   */\r\n  toggleSection(groupIndex: number, sectionPath: number[]): void {\r\n    this._state.update(s => ({\r\n      ...s,\r\n      groups: s.groups.map((g, gi) => {\r\n        if (gi !== groupIndex) return g;\r\n        const sections = this._recomputeEnabledFromChildren(\r\n          this._toggleSectionAtPath(g.sections, sectionPath, 0),\r\n        );\r\n        return {\r\n          ...g,\r\n          sections,\r\n          enabled: sections.some(sec => sec.enabled),\r\n        };\r\n      }),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Toggle a section's expanded (collapsed/expanded) state.\r\n   */\r\n  toggleSectionExpanded(groupIndex: number, sectionPath: number[]): void {\r\n    this._state.update(s => ({\r\n      ...s,\r\n      groups: s.groups.map((g, gi) => {\r\n        if (gi !== groupIndex) return g;\r\n        return {\r\n          ...g,\r\n          sections: this._toggleExpandedAtPath(g.sections, sectionPath, 0),\r\n        };\r\n      }),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Toggle a group's expanded (collapsed/expanded) state.\r\n   */\r\n  toggleGroupExpanded(groupIndex: number): void {\r\n    this._state.update(s => ({\r\n      ...s,\r\n      groups: s.groups.map((g, i) =>\r\n        i === groupIndex ? { ...g, expanded: !g.expanded } : g\r\n      ),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Toggle a field's selected (checkbox) state.\r\n   */\r\n  toggleField(groupIndex: number, sectionPath: number[], fieldIndex: number): void {\r\n    this._state.update(s => ({\r\n      ...s,\r\n      groups: s.groups.map((g, gi) => {\r\n        if (gi !== groupIndex) return g;\r\n        const sections = this._recomputeEnabledFromChildren(\r\n          this._toggleFieldAtPath(g.sections, sectionPath, 0, fieldIndex),\r\n        );\r\n        return {\r\n          ...g,\r\n          sections,\r\n          enabled: sections.some(sec => sec.enabled),\r\n        };\r\n      }),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Build and return the updated FormSchema with selection changes applied.\r\n   */\r\n  buildUpdatedSchema(): FormSchema | null {\r\n    const { groups, originalSchema } = this._state();\r\n    if (!originalSchema) return null;\r\n    return this.treeService.applySelectionToSchema(groups, originalSchema);\r\n  }\r\n\r\n  // ── Private helpers ─────────────────────────────────────────────\r\n\r\n  private _disableAllSections(sections: SelectionSectionNode[]): SelectionSectionNode[] {\r\n    return sections.map(s => ({\r\n      ...s,\r\n      enabled: false,\r\n      fields: s.fields.map(f => ({ ...f, selected: false })),\r\n      subsections: this._disableAllSections(s.subsections),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Enable all sections and their fields (except locked ones).\r\n   * Used when toggling a section/group back ON to restore field selections.\r\n   */\r\n  private _enableAllSections(sections: SelectionSectionNode[]): SelectionSectionNode[] {\r\n    return sections.map(s => ({\r\n      ...s,\r\n      enabled: true,\r\n      fields: s.fields.map(f => ({ ...f, selected: !f.isLocked })),\r\n      subsections: this._enableAllSections(s.subsections),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Re-derives `enabled` bottom-up for every section in the list, from its own current\r\n   * fields/subsections — mirroring \"Master Toggle Reflects Children\" (already true for the\r\n   * GROUP toggle vs. its sections) at every level: a section is ON as long as at least one of\r\n   * its fields is selected or a subsection is ON. Without this, re-selecting a single field\r\n   * after its parent section was switched off left the section's own toggle stuck OFF even\r\n   * though a child was visibly selected again.\r\n   */\r\n  private _recomputeEnabledFromChildren(sections: SelectionSectionNode[]): SelectionSectionNode[] {\r\n    return sections.map(s => {\r\n      const subsections = this._recomputeEnabledFromChildren(s.subsections);\r\n      // A locked field can't be deselected by the user and is always effectively active\r\n      // regardless of its raw `selected` value — see _toggleSectionAtPath's enable branch,\r\n      // which sets `selected: !f.isLocked` (locked fields keep `selected: false` but still\r\n      // render, so they must still count here or their section would wrongly derive as OFF).\r\n      const anyFieldActive = s.fields.some(f => f.selected || f.isLocked);\r\n      const anySubsectionEnabled = subsections.some(sub => sub.enabled);\r\n      return {\r\n        ...s,\r\n        enabled: anyFieldActive || anySubsectionEnabled,\r\n        subsections,\r\n      };\r\n    });\r\n  }\r\n\r\n  private _toggleSectionAtPath(\r\n    sections: SelectionSectionNode[],\r\n    path: number[],\r\n    depth: number,\r\n  ): SelectionSectionNode[] {\r\n    return sections.map((s, i) => {\r\n      if (i !== path[depth]) return s;\r\n\r\n      if (depth === path.length - 1) {\r\n        // This is the target section\r\n        const enabled = !s.enabled;\r\n        return {\r\n          ...s,\r\n          enabled,\r\n          // When enabling: select all non-locked fields and enable subsections\r\n          // When disabling: deselect all fields and disable subsections\r\n          fields: enabled ? s.fields.map(f => ({ ...f, selected: !f.isLocked })) : s.fields.map(f => ({ ...f, selected: false })),\r\n          subsections: enabled ? this._enableAllSections(s.subsections) : this._disableAllSections(s.subsections),\r\n        };\r\n      }\r\n\r\n      // Recurse into subsections\r\n      return {\r\n        ...s,\r\n        subsections: this._toggleSectionAtPath(s.subsections, path, depth + 1),\r\n      };\r\n    });\r\n  }\r\n\r\n  private _toggleExpandedAtPath(\r\n    sections: SelectionSectionNode[],\r\n    path: number[],\r\n    depth: number,\r\n  ): SelectionSectionNode[] {\r\n    return sections.map((s, i) => {\r\n      if (i !== path[depth]) return s;\r\n\r\n      if (depth === path.length - 1) {\r\n        return { ...s, expanded: !s.expanded };\r\n      }\r\n\r\n      return {\r\n        ...s,\r\n        subsections: this._toggleExpandedAtPath(s.subsections, path, depth + 1),\r\n      };\r\n    });\r\n  }\r\n\r\n  private _toggleFieldAtPath(\r\n    sections: SelectionSectionNode[],\r\n    sectionPath: number[],\r\n    depth: number,\r\n    fieldIndex: number,\r\n  ): SelectionSectionNode[] {\r\n    return sections.map((s, i) => {\r\n      if (i !== sectionPath[depth]) return s;\r\n\r\n      if (depth === sectionPath.length - 1) {\r\n        const target = s.fields[fieldIndex];\r\n        if (!target || target.isLocked) return s;\r\n\r\n        const newSelected = !target.selected;\r\n\r\n        return {\r\n          ...s,\r\n          fields: s.fields.map((f, fi) =>\r\n            fi === fieldIndex ? { ...f, selected: newSelected } : f\r\n          ),\r\n        };\r\n      }\r\n\r\n      return {\r\n        ...s,\r\n        subsections: this._toggleFieldAtPath(s.subsections, sectionPath, depth + 1, fieldIndex),\r\n      };\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Recursively merge expansion state from old sections into new sections.\r\n   * Preserves which sections were expanded/collapsed by the user.\r\n   */\r\n  private _mergeExpandedSections(\r\n    newSections: SelectionSectionNode[],\r\n    oldSections: SelectionSectionNode[],\r\n  ): SelectionSectionNode[] {\r\n    return newSections.map((newSection, ni) => {\r\n      const oldSection = oldSections[ni];\r\n      return {\r\n        ...newSection,\r\n        expanded: oldSection?.expanded ?? newSection.expanded,\r\n        subsections: this._mergeExpandedSections(\r\n          newSection.subsections,\r\n          oldSection?.subsections ?? [],\r\n        ),\r\n      };\r\n    });\r\n  }\r\n}\r\n","/** Available field types that users can switch to in the configurator. */\r\nexport const SWITCHABLE_FIELD_TYPES = [\r\n  { label: 'Short Text',      value: 'shortText'      },\r\n  { label: 'Long Text',       value: 'longText'       },\r\n  { label: 'Email',           value: 'email'          },\r\n  { label: 'Phone',           value: 'phone'          },\r\n  { label: 'Password',        value: 'password'       },\r\n  { label: 'Number (Integer)',value: 'number'         },\r\n  { label: 'Number (Decimal)',value: 'decimal'        },\r\n  { label: 'Date',            value: 'date'           },\r\n  { label: 'Time',            value: 'time'           },\r\n  { label: 'Date & Time',     value: 'dateTime'       },\r\n  { label: 'Dropdown',        value: 'dropdown'       },\r\n  { label: 'Multi-Select',    value: 'multiSelect'    },\r\n  { label: 'Autocomplete',    value: 'autocomplete'   },\r\n  { label: 'Checkbox',        value: 'checkbox'       },\r\n  { label: 'Multi-Checkbox',  value: 'multiCheckbox'  },\r\n  { label: 'Radio',           value: 'radio'          },\r\n  { label: 'Toggle',          value: 'toggle'         },\r\n  { label: 'Chips',           value: 'chip'           },\r\n  { label: 'Rich Text',       value: 'richText'       },\r\n  { label: 'File Upload',     value: 'file'           },\r\n  { label: 'Rating',          value: 'rating'         },\r\n  { label: 'Location',        value: 'location'       },\r\n  { label: 'Formula (Auto)',  value: 'generated'      },\r\n];\r\n\r\n/**\r\n * Field types that are driven by option configurations (optionConfig).\r\n * When `hideToggleForOptionTypes` is true on the field-selection configurator,\r\n * these field types will not show the enable/disable toggle — they are\r\n * UI element types whose options are pre-filled by the developer.\r\n */\r\nexport const OPTION_DRIVEN_FIELD_TYPES: ReadonlySet<string> = new Set([\r\n  'DROPDOWN',\r\n  'MULTI_SELECT',\r\n  'RADIO',\r\n  'AUTOCOMPLETE',\r\n  'CHECKBOX',\r\n  'MULTI_CHECKBOX',\r\n  'CHIP',\r\n]);\r\n\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormComponentsModule } from '../../../../form-components/form-components.module';\r\nimport { SelectionFieldNode } from '../../../models/field-selection.models';\r\nimport { OPTION_DRIVEN_FIELD_TYPES } from '../../../utils/constants';\r\n\r\n@Component({\r\n  selector: 'lib-selection-field-node',\r\n  standalone: false,\r\n  templateUrl: './selection-field-node.component.html',\r\n  styleUrls: ['./selection-field-node.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SelectionFieldNodeComponent {\r\n  @Input({ required: true }) field!: SelectionFieldNode;\r\n  @Output() toggleSelected = new EventEmitter<void>();\r\n\r\n  /**\r\n   * When true, the enable/disable toggle is hidden for option-driven field types\r\n   * (DROPDOWN, RADIO, MULTI_SELECT, etc.). These types have their options\r\n   * pre-configured by the developer and shouldn't be toggled by business users.\r\n   */\r\n  @Input() hideToggleForOptionTypes: boolean = false;\r\n\r\n  /**\r\n   * Set when the enclosing section is off. A field can never be meaningfully \"selected\" while\r\n   * its parent section is disabled — the Field Configuration step prunes the whole disabled\r\n   * branch regardless of individual field state — so the checkbox is locked out here to make\r\n   * that constraint visible instead of letting the user set a checked state that won't survive.\r\n   */\r\n  @Input() disabled: boolean = false;\r\n\r\n  onCheckedChange(): void {\r\n    if (this.disabled) return;\r\n    this.toggleSelected.emit();\r\n  }\r\n\r\n  get isOptionDrivenType(): boolean {\r\n    return OPTION_DRIVEN_FIELD_TYPES.has((this.field?.fieldConfig?.type ?? '').toUpperCase());\r\n  }\r\n}\r\n","<div\r\n  class=\"fb-selection-field\"\r\n  [class.fb-selection-field--selected]=\"field.selected\"\r\n  [class.fb-selection-field--locked]=\"field.isLocked\"\r\n  [class.fb-selection-field--option-type]=\"hideToggleForOptionTypes && isOptionDrivenType\"\r\n  [class.fb-selection-field--parent-disabled]=\"disabled\"\r\n>\r\n  <span class=\"fb-selection-field__label\">\r\n    {{ field.fieldConfig.label || field.fieldConfig.name }}\r\n  </span>\r\n\r\n  @if (field.isLocked) {\r\n    <span class=\"fb-selection-field__lock\" title=\"This field is locked\">\r\n      <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n        <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n        <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n      </svg>\r\n    </span>\r\n  } @else if (hideToggleForOptionTypes && isOptionDrivenType) {\r\n    <!-- Option-driven type: toggle hidden by config, show a badge instead -->\r\n    <span class=\"fb-selection-field__option-badge\" title=\"Options are pre-configured\">\r\n      <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n        <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\r\n        <polyline points=\"12 8 12 12 14 14\"></polyline>\r\n      </svg>\r\n    </span>\r\n  } @else {\r\n    <lib-checkbox\r\n      [checked]=\"field.selected\"\r\n      [disabled]=\"disabled\"\r\n      (checkedChange)=\"onCheckedChange()\"\r\n    />\r\n  }\r\n</div>\r\n","import {\n  Component,\n  ChangeDetectionStrategy,\n  Input,\n  Output,\n  EventEmitter,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormComponentsModule } from '../../../../form-components/form-components.module';\nimport { SelectionSectionNode } from '../../../models/field-selection.models';\nimport { SelectionFieldNodeComponent } from '../selection-field-node/selection-field-node.component';\n\n@Component({\n  selector: 'lib-selection-section-node',\n  standalone: false,\n  templateUrl: './selection-section-node.component.html',\n  styleUrls: ['./selection-section-node.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectionSectionNodeComponent {\n  @Input({ required: true }) section!: SelectionSectionNode;\n  @Input({ required: true }) sectionIndex!: number;\n  @Input() depth: number = 0;\n  /** Propagated from FieldSelectionComponent — see SelectionFieldNodeComponent for details. */\n  @Input() hideToggleForOptionTypes: boolean = false;\n\n  /** Emits the sub-path from this node downward (empty [] for self) */\n  @Output() toggleEnabled = new EventEmitter<number[]>();\n  @Output() toggleExpanded = new EventEmitter<number[]>();\n  @Output() fieldToggle = new EventEmitter<{ sectionPath: number[]; fieldIndex: number }>();\n\n  onToggleEnabled(): void {\n    this.toggleEnabled.emit([]);\n  }\n\n  onToggleExpanded(): void {\n    this.toggleExpanded.emit([]);\n  }\n\n  onSubsectionToggleEnabled(subIndex: number, subPath: number[]): void {\n    this.toggleEnabled.emit([subIndex, ...subPath]);\n  }\n\n  onSubsectionToggleExpanded(subIndex: number, subPath: number[]): void {\n    this.toggleExpanded.emit([subIndex, ...subPath]);\n  }\n\n  onFieldToggle(fieldIndex: number): void {\n    this.fieldToggle.emit({ sectionPath: [], fieldIndex });\n  }\n\n  onSubsectionFieldToggle(subIndex: number, payload: { sectionPath: number[]; fieldIndex: number }): void {\n    this.fieldToggle.emit({\n      sectionPath: [subIndex, ...payload.sectionPath],\n      fieldIndex: payload.fieldIndex,\n    });\n  }\n\n  get selectedCount(): number {\n    return this.section.fields.filter(f => f.selected).length;\n  }\n\n  get isLocked(): boolean {\n    return this.section.parentFieldConfig?.readonly === true;\n  }\n\n  trackByFieldIndex(index: number): number {\n    return index;\n  }\n\n  trackBySubsectionIndex(index: number): number {\n    return index;\n  }\n}\n","<div\r\n  class=\"fb-selection-section\"\r\n  [class.fb-selection-section--disabled]=\"!section.enabled\"\r\n  [class.fb-selection-section--nested]=\"depth > 0\"\r\n>\r\n  <div class=\"fb-selection-section__header\">\r\n    <button\r\n      class=\"fb-selection-section__expand-btn\"\r\n      (click)=\"onToggleExpanded()\"\r\n      [attr.aria-expanded]=\"section.expanded\"\r\n      type=\"button\"\r\n    >\r\n      <svg\r\n        class=\"fb-selection-section__chevron\"\r\n        [class.fb-selection-section__chevron--open]=\"section.expanded\"\r\n        width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n      >\r\n        <polyline points=\"6 9 12 15 18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n          stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>\r\n    </button>\r\n\r\n    <div class=\"fb-selection-section__meta\">\r\n      <span class=\"fb-selection-section__label\">{{ section.label }}</span>\r\n    </div>\r\n\r\n    @if (isLocked) {\r\n      <span class=\"fb-selection-section__lock\" title=\"This section is locked\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n          stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n          <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n          <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n        </svg>\r\n      </span>\r\n    } @else {\r\n      <lib-toggle\r\n        [checked]=\"section.enabled\"\r\n        [disabled]=\"false\"\r\n        [attr.aria-label]=\"'Enable ' + section.label\"\r\n        (toggleChange)=\"onToggleEnabled()\"\r\n      />\r\n    }\r\n  </div>\r\n\r\n  @if (section.expanded) {\r\n    <div class=\"fb-selection-section__body\">\r\n      @for (field of section.fields; track trackByFieldIndex($index); let fi = $index) {\r\n        <lib-selection-field-node\r\n          [field]=\"field\"\r\n          [hideToggleForOptionTypes]=\"hideToggleForOptionTypes\"\r\n          [disabled]=\"false\"\r\n          (toggleSelected)=\"onFieldToggle(fi)\"\r\n        />\r\n      }\r\n\r\n      @for (sub of section.subsections; track trackBySubsectionIndex($index); let si = $index) {\r\n        <lib-selection-section-node\r\n          [section]=\"sub\"\r\n          [sectionIndex]=\"si\"\r\n          [depth]=\"depth + 1\"\r\n          [hideToggleForOptionTypes]=\"hideToggleForOptionTypes\"\r\n          (toggleEnabled)=\"onSubsectionToggleEnabled(si, $event)\"\r\n          (toggleExpanded)=\"onSubsectionToggleExpanded(si, $event)\"\r\n          (fieldToggle)=\"onSubsectionFieldToggle(si, $event)\"\r\n        />\r\n      }\r\n    </div>\r\n  }\r\n</div>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormComponentsModule } from '../../../../form-components/form-components.module';\r\nimport { SelectionGroupNode } from '../../../models/field-selection.models';\r\nimport { SelectionSectionNodeComponent } from '../selection-section-node/selection-section-node.component';\r\n\r\n@Component({\r\n  selector: 'lib-group-node',\r\n  standalone: false,\r\n  templateUrl: './group-node.component.html',\r\n  styleUrls: ['./group-node.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GroupNodeComponent {\r\n  @Input({ required: true }) group!: SelectionGroupNode;\r\n  @Input({ required: true }) groupIndex!: number;\r\n  /** Propagated from FieldSelectionComponent — see SelectionFieldNodeComponent for details. */\r\n  @Input() hideToggleForOptionTypes: boolean = false;\r\n\r\n  @Output() toggleEnabled = new EventEmitter<void>();\r\n  @Output() toggleExpanded = new EventEmitter<void>();\r\n  @Output() sectionToggleEnabled = new EventEmitter<number[]>();\r\n  @Output() sectionToggleExpanded = new EventEmitter<number[]>();\r\n  @Output() fieldToggle = new EventEmitter<{ sectionPath: number[]; fieldIndex: number }>();\r\n\r\n  onSectionToggleEnabled(sectionIndex: number, subPath: number[]): void {\r\n    this.sectionToggleEnabled.emit([sectionIndex, ...subPath]);\r\n  }\r\n\r\n  onSectionToggleExpanded(sectionIndex: number, subPath: number[]): void {\r\n    this.sectionToggleExpanded.emit([sectionIndex, ...subPath]);\r\n  }\r\n\r\n  onFieldToggle(sectionIndex: number, payload: { sectionPath: number[]; fieldIndex: number }): void {\r\n    this.fieldToggle.emit({\r\n      sectionPath: [sectionIndex, ...payload.sectionPath],\r\n      fieldIndex: payload.fieldIndex,\r\n    });\r\n  }\r\n\r\n  trackBySectionIndex(index: number): number {\r\n    return index;\r\n  }\r\n}\r\n","<div class=\"fb-group-node\" [class.fb-group-node--disabled]=\"!group.enabled\">\r\n  <div class=\"fb-group-node__header\">\r\n    <button\r\n      class=\"fb-group-node__expand-btn\"\r\n      (click)=\"toggleExpanded.emit()\"\r\n      [attr.aria-expanded]=\"group.expanded\"\r\n      type=\"button\"\r\n    >\r\n      <svg\r\n        class=\"fb-group-node__chevron\"\r\n        [class.fb-group-node__chevron--open]=\"group.expanded\"\r\n        width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n      >\r\n        <polyline points=\"6 9 12 15 18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n          stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n      </svg>\r\n    </button>\r\n\r\n    <div class=\"fb-group-node__meta\">\r\n      <span class=\"fb-group-node__label\">{{ group.label }}</span>\r\n    </div>\r\n\r\n    <lib-toggle\r\n      [checked]=\"group.enabled\"\r\n      [disabled]=\"false\"\r\n      [attr.aria-label]=\"'Enable ' + group.label\"\r\n      (toggleChange)=\"toggleEnabled.emit()\"\r\n    />\r\n  </div>\r\n\r\n  @if (group.expanded) {\r\n    <div class=\"fb-group-node__body\">\r\n      @for (section of group.sections; track trackBySectionIndex($index); let si = $index) {\r\n        <lib-selection-section-node\r\n          [section]=\"section\"\r\n          [sectionIndex]=\"si\"\r\n          [depth]=\"0\"\r\n          [hideToggleForOptionTypes]=\"hideToggleForOptionTypes\"\r\n          (toggleEnabled)=\"onSectionToggleEnabled(si, $event)\"\r\n          (toggleExpanded)=\"onSectionToggleExpanded(si, $event)\"\r\n          (fieldToggle)=\"onFieldToggle(si, $event)\"\r\n        />\r\n      }\r\n    </div>\r\n  }\r\n</div>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormSchema } from '../../../smart-form/models/form-schema.model';\r\nimport { FieldSelectionService } from '../../services/field-selection.service';\r\nimport { GroupNodeComponent } from './group-node/group-node.component';\r\n\r\n@Component({\r\n  selector: 'lib-field-selection',\r\n  standalone: false,\r\n  providers: [FieldSelectionService],\r\n  templateUrl: './field-selection.component.html',\r\n  styleUrls: ['./field-selection.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FieldSelectionComponent implements OnChanges {\r\n  @Input({ required: true }) schema!: FormSchema;\r\n  @Output() schemaChange = new EventEmitter<FormSchema>();\r\n\r\n  /**\r\n   * When true, the enable/disable toggle is hidden for option-driven field types\r\n   * (DROPDOWN, RADIO, MULTI_SELECT, etc.).\r\n   * Useful for business-user-facing form configurators where developers\r\n   * pre-fill the option data and these fields should always be included.\r\n   * Defaults to false (show toggle for all fields).\r\n   */\r\n  @Input() hideToggleForOptionTypes: boolean = false;\r\n\r\n  protected readonly store = inject(FieldSelectionService);\r\n\r\n  /**\r\n   * Flag to track if the next schema change is from internal toggles.\r\n   * When true, we'll use loadSchemaPreservingExpanded() to keep user's expansion state.\r\n   */\r\n  private _isInternalChange = false;\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['schema'] && this.schema) {\r\n      // If schema changed from our internal toggles, preserve expansion state\r\n      // Otherwise, treat it as external schema change and reload fully\r\n      if (this._isInternalChange) {\r\n        this.store.loadSchemaPreservingExpanded(this.schema);\r\n        this._isInternalChange = false;\r\n      } else {\r\n        this.store.loadSchema(this.schema);\r\n      }\r\n    }\r\n  }\r\n\r\n  onToggleGroup(groupIndex: number): void {\r\n    this.store.toggleGroup(groupIndex);\r\n    this._emitChange();\r\n  }\r\n\r\n  onToggleGroupExpanded(groupIndex: number): void {\r\n    this.store.toggleGroupExpanded(groupIndex);\r\n  }\r\n\r\n  onToggleSection(groupIndex: number, sectionPath: number[]): void {\r\n    this.store.toggleSection(groupIndex, sectionPath);\r\n    this._emitChange();\r\n  }\r\n\r\n  onToggleSectionExpanded(groupIndex: number, sectionPath: number[]): void {\r\n    this.store.toggleSectionExpanded(groupIndex, sectionPath);\r\n  }\r\n\r\n  onToggleField(groupIndex: number, sectionPath: number[], fieldIndex: number): void {\r\n    this.store.toggleField(groupIndex, sectionPath, fieldIndex);\r\n    this._emitChange();\r\n  }\r\n\r\n  trackByGroupIndex(index: number): number {\r\n    return index;\r\n  }\r\n\r\n  private _emitChange(): void {\r\n    const updated = this.store.buildUpdatedSchema();\r\n    if (updated) {\r\n      // Mark that the next schema change is from internal toggles\r\n      // This prevents expansion state from being reset\r\n      this._isInternalChange = true;\r\n      this.schemaChange.emit(updated);\r\n    }\r\n  }\r\n}\r\n","<div class=\"fb-field-selection\">\r\n  @for (group of store.groups(); track trackByGroupIndex($index); let gi = $index) {\r\n    <lib-group-node\r\n      [group]=\"group\"\r\n      [groupIndex]=\"gi\"\r\n      [hideToggleForOptionTypes]=\"hideToggleForOptionTypes\"\r\n      (toggleEnabled)=\"onToggleGroup(gi)\"\r\n      (toggleExpanded)=\"onToggleGroupExpanded(gi)\"\r\n      (sectionToggleEnabled)=\"onToggleSection(gi, $event)\"\r\n      (sectionToggleExpanded)=\"onToggleSectionExpanded(gi, $event)\"\r\n      (fieldToggle)=\"onToggleField(gi, $event.sectionPath, $event.fieldIndex)\"\r\n    />\r\n  }\r\n\r\n  @if (store.groups().length === 0) {\r\n    <div class=\"fb-field-selection__empty\">\r\n      <p>No groups or fields found in the schema.</p>\r\n    </div>\r\n  }\r\n</div>\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport { FormSchema, FieldConfig } from '../../smart-form/models/form-schema.model';\r\nimport {\r\n  ConfiguratorTreeNode,\r\n  ConfiguratorFieldInfo,\r\n} from '../models/field-configurator.models';\r\nimport { FormSchemaTreeService } from '../services/form-schema-tree.service';\r\n\r\ninterface FieldConfiguratorState {\r\n  tree: ConfiguratorTreeNode[];\r\n  selectedFieldPath: number[] | null;\r\n  schema: FormSchema | null;\r\n}\r\n\r\n/**\r\n * Signal-based service for the field-configurator component.\r\n * Manages the tree + selected field + config panel state.\r\n */\r\n@Injectable()\r\nexport class FieldConfiguratorService {\r\n  private readonly _state = signal<FieldConfiguratorState>({\r\n    tree: [],\r\n    selectedFieldPath: null,\r\n    schema: null,\r\n  });\r\n\r\n  private readonly treeService = new FormSchemaTreeService();\r\n\r\n  // ── Computed slices ─────────────────────────────────────────────\r\n  readonly tree = computed(() => this._state().tree);\r\n  readonly schema = computed(() => this._state().schema);\r\n  readonly selectedFieldPath = computed(() => this._state().selectedFieldPath);\r\n\r\n  /** Resolves to the FieldConfig at the selected path. */\r\n  readonly selectedField = computed<FieldConfig | null>(() => {\r\n    const { schema, selectedFieldPath } = this._state();\r\n    if (!schema || !selectedFieldPath) return null;\r\n    return this.treeService.findFieldByPath(schema, selectedFieldPath);\r\n  });\r\n\r\n  readonly selectedFieldInfo = computed<ConfiguratorFieldInfo | null>(() => {\r\n    const field = this.selectedField();\r\n    const path = this.selectedFieldPath();\r\n    if (!field || !path) return null;\r\n\r\n    // Walk the tree to find group/section labels\r\n    const labels = this._getParentLabels(this._state().tree, path);\r\n\r\n    return {\r\n      fieldConfig: field,\r\n      groupLabel: labels.groupLabel,\r\n      sectionLabel: labels.sectionLabel,\r\n      path,\r\n    };\r\n  });\r\n\r\n  /**\r\n   * Returns the builder-compatible field type string for the currently selected field.\r\n   * Used to look up the config schema from field-type-schema.map.ts.\r\n   */\r\n  readonly selectedFieldBuilderType = computed<string | null>(() => {\r\n    const field = this.selectedField();\r\n    if (!field) return null;\r\n    return this.treeService.mapFieldTypeToBuilderType(field.type, field.subType);\r\n  });\r\n\r\n  // ── Mutators ────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Initialize the store from a FormSchema.\r\n   */\r\n  loadSchema(schema: FormSchema, preserveSelection = false): void {\r\n    // If it's the exact same object reference and we are not forcing a reset, skip.\r\n    if (this._state().schema === schema && preserveSelection) return;\r\n\r\n    const tree = this.treeService.parseSchemaToConfiguratorTree(schema);\r\n\r\n    this._state.update(s => {\r\n      // If preserveSelection is truthy, we definitely keep it.\r\n      // Otherwise, we still try to keep it IF the path is still valid in the new schema.\r\n      let newPath = s.selectedFieldPath;\r\n      if (!preserveSelection && newPath && !this.treeService.findFieldByPath(schema, newPath)) {\r\n        newPath = null;\r\n      }\r\n\r\n      return {\r\n        ...s,\r\n        tree,\r\n        selectedFieldPath: newPath,\r\n        schema: JSON.parse(JSON.stringify(schema)),\r\n      };\r\n    });\r\n  }\r\n\r\n  /** Select a field by its path. Pass null to deselect. */\r\n  selectField(path: number[] | null): void {\r\n    this._state.update(s => ({ ...s, selectedFieldPath: path }));\r\n  }\r\n\r\n  /**\r\n   * Toggle a tree node's expanded state.\r\n   */\r\n  toggleNodeExpanded(nodeId: string): void {\r\n    this._state.update(s => ({\r\n      ...s,\r\n      tree: this._toggleExpanded(s.tree, nodeId),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Apply a config patch to the currently selected field.\r\n   * Rebuilds the schema and tree nodes immutably.\r\n   */\r\n  patchSelectedField(patch: Partial<FieldConfig>): void {\r\n    const { schema, selectedFieldPath, tree } = this._state();\r\n    if (!schema || !selectedFieldPath) return;\r\n\r\n    const newSchema = this.treeService.applyFieldPatchToSchema(selectedFieldPath, patch, schema);\r\n\r\n    // Rebuild the tree to reflect label changes etc.\r\n    const newTree = this.treeService.parseSchemaToConfiguratorTree(newSchema);\r\n    // Preserve expanded states from the old tree\r\n    this._restoreExpandedStates(tree, newTree);\r\n\r\n    this._state.set({\r\n      schema: newSchema,\r\n      selectedFieldPath,\r\n      tree: newTree,\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Change the type (and optionally subType) of the currently selected field.\r\n   * Mapping goes from builderType keys (e.g. 'richText') → {type, subType?}.\r\n   * DROPDOWN fields cannot be changed and are guarded here as well.\r\n   */\r\n  changeFieldType(builderType: string): void {\r\n    const currentField = this.selectedField();\r\n    if (!currentField) return;\r\n    // Guard: never change a DROPDOWN-based field\r\n    const t = currentField.type?.toUpperCase();\r\n    if (t === 'DROPDOWN' || t === 'MULTI_SELECT') return;\r\n\r\n    const TYPE_MAP: Record<string, { type: string; subType?: string }> = {\r\n      shortText:     { type: 'TEXT_INPUT' },\r\n      longText:      { type: 'TEXT_INPUT', subType: 'LONG' },\r\n      email:         { type: 'TEXT_INPUT', subType: 'EMAIL' },\r\n      phone:         { type: 'TEXT_INPUT', subType: 'PHONE' },\r\n      password:      { type: 'TEXT_INPUT', subType: 'PASSWORD' },\r\n      number:        { type: 'NUMBER_INPUT', subType: 'INTEGER' },\r\n      decimal:       { type: 'NUMBER_INPUT', subType: 'DECIMAL' },\r\n      date:          { type: 'DATE', subType: 'SINGLE' },\r\n      time:          { type: 'TIME', subType: 'SINGLE' },\r\n      dateTime:      { type: 'DATE', subType: 'DATETIME' },\r\n      checkbox:      { type: 'CHECKBOX', subType: 'BOOL' },\r\n      multiCheckbox: { type: 'CHECKBOX', subType: 'LIST' },\r\n      radio:         { type: 'RADIO', subType: 'SINGLE' },\r\n      toggle:        { type: 'SWITCH', subType: 'BOOL' },\r\n      chip:          { type: 'CHIP', subType: 'MULTIPLE' },\r\n      richText:      { type: 'RICH_TEXT' },\r\n      file:          { type: 'FILE_UPLOAD', subType: 'SINGLE' },\r\n      rating:        { type: 'RATING', subType: 'STAR' },\r\n      location:      { type: 'LOCATION' },\r\n      generated:     { type: 'GENERATED', subType: 'FORMULA' },\r\n      multiSelect:   { type: 'MULTI_SELECT' },\r\n      autocomplete:  { type: 'AUTOCOMPLETE', subType: 'SINGLE' },\r\n      dropdown:      { type: 'DROPDOWN', subType: 'SINGLE' },\r\n      multiDropdown: { type: 'MULTI_SELECT' },\r\n    };\r\n\r\n    const mapping = TYPE_MAP[builderType];\r\n    if (!mapping) return;\r\n\r\n    const patch: Partial<FieldConfig> = { type: mapping.type };\r\n    if (mapping.subType !== undefined) {\r\n      patch.subType = mapping.subType;\r\n    } else {\r\n      // Clear stale subType from previous field type\r\n      patch.subType = undefined;\r\n    }\r\n    this.patchSelectedField(patch);\r\n  }\r\n\r\n  /**\r\n   * Get the current schema (with all applied modifications).\r\n   */\r\n  getCurrentSchema(): FormSchema | null {\r\n    return this._state().schema;\r\n  }\r\n\r\n  // ── Private helpers ─────────────────────────────────────────────\r\n\r\n  private _toggleExpanded(nodes: ConfiguratorTreeNode[], nodeId: string): ConfiguratorTreeNode[] {\r\n    return nodes.map(n => {\r\n      if (n.id === nodeId) {\r\n        return { ...n, expanded: !n.expanded };\r\n      }\r\n      if (n.children.length > 0) {\r\n        return { ...n, children: this._toggleExpanded(n.children, nodeId) };\r\n      }\r\n      return n;\r\n    });\r\n  }\r\n\r\n  private _restoreExpandedStates(\r\n    oldNodes: ConfiguratorTreeNode[],\r\n    newNodes: ConfiguratorTreeNode[],\r\n  ): void {\r\n    for (const newNode of newNodes) {\r\n      const oldNode = oldNodes.find(o => o.id === newNode.id);\r\n      if (oldNode) {\r\n        newNode.expanded = oldNode.expanded;\r\n        if (oldNode.children.length > 0 && newNode.children.length > 0) {\r\n          this._restoreExpandedStates(oldNode.children, newNode.children);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private _getParentLabels(\r\n    nodes: ConfiguratorTreeNode[],\r\n    path: number[],\r\n  ): { groupLabel: string; sectionLabel: string } {\r\n    let groupLabel = '';\r\n    let sectionLabel = '';\r\n\r\n    const findInNodes = (nodeList: ConfiguratorTreeNode[], targetPath: number[]): boolean => {\r\n      for (const node of nodeList) {\r\n        if (this._pathsEqual(node.path, targetPath)) {\r\n          return true;\r\n        }\r\n        if (node.children.length > 0) {\r\n          const found = findInNodes(node.children, targetPath);\r\n          if (found) {\r\n            if (node.type === 'group') groupLabel = node.label;\r\n            if (node.type === 'section') sectionLabel = node.label;\r\n            return true;\r\n          }\r\n        }\r\n      }\r\n      return false;\r\n    };\r\n\r\n    findInNodes(nodes, path);\r\n    return { groupLabel, sectionLabel };\r\n  }\r\n\r\n  private _pathsEqual(a: number[], b: number[]): boolean {\r\n    if (a.length !== b.length) return false;\r\n    return a.every((val, i) => val === b[i]);\r\n  }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { FieldTypeSchemaMap } from '../models/builder.models';\r\n\r\n/**\r\n * Optional token to override the field-type → config-schema mapping\r\n * used by the standalone FieldConfiguratorComponent.\r\n */\r\nexport const BUILDER_FIELD_TYPE_SCHEMA_MAP = new InjectionToken<FieldTypeSchemaMap>(\r\n  'BUILDER_FIELD_TYPE_SCHEMA_MAP'\r\n);\r\n","import { FormSchema } from '../../smart-form/models/form-schema.model';\r\nimport { SWITCHABLE_FIELD_TYPES } from '../utils/constants';\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SHARED BASE FIELDS (common to ALL field types)\r\n// These fields come from the core FieldConfig interface.\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst F = {\r\n  label: { name: 'label', type: 'TEXT_INPUT', label: 'Field Label', required: true, placeholder: 'Enter field label...', colSpan: 12 },\r\n  name:  { name: 'name', type: 'TEXT_INPUT', label: 'System Name (name)', placeholder: 'e.g. firstName', colSpan: 6, hint: 'Unique key for the field in payload' },\r\n  colSpan: { name: 'colSpan', type: 'NUMBER_INPUT', label: 'Col Span (1–12)', defaultValue: 12, colSpan: 6, hint: '6 = half width, 12 = full width' },\r\n  placeholder: { name: 'placeholder', type: 'TEXT_INPUT', label: 'Placeholder Text', placeholder: 'e.g. Enter value here...', colSpan: 6 },\r\n  hint: { name: 'hint', type: 'TEXT_INPUT', label: 'Hint (below field)', placeholder: 'Helpful instruction...', colSpan: 6 },\r\n  prefix: { name: 'prefix', type: 'TEXT_INPUT', label: 'Prefix', placeholder: 'e.g. $', colSpan: 6 },\r\n  suffix: { name: 'suffix', type: 'TEXT_INPUT', label: 'Suffix', placeholder: 'e.g. USD', colSpan: 6 },\r\n  defaultValue: { name: 'defaultValue', type: 'TEXT_INPUT', label: 'Default Value', placeholder: 'Pre-filled value', colSpan: 6 },\r\n  payloadPath: { name: 'payloadPath', type: 'TEXT_INPUT', label: 'Payload Path', placeholder: 'e.g. metadata.status.code', colSpan: 6, hint: 'Dot-notation path in API payload' },\r\n  className: { name: 'className', type: 'TEXT_INPUT', label: 'CSS Class', placeholder: 'e.g. custom-class', colSpan: 6 },\r\n  errorMessage: { name: 'errorMessage', type: 'TEXT_INPUT', label: 'Custom Error Message', placeholder: 'e.g. This field is required', colSpan: 12 },\r\n  visibilityExpression: { name: 'visibilityExpression', type: 'TEXT_INPUT', label: 'Visibility Expression', placeholder: 'e.g. data.age > 18', colSpan: 12, hint: 'Show/hide this field conditionally based on other field values' },\r\n  isEnabled: { name: 'isEnabled', type: 'SWITCH', label: 'Is Enabled', colSpan: 6, defaultValue: true },\r\n  required:  { name: 'required',  type: 'SWITCH', label: 'Required', colSpan: 6 },\r\n  readonly:  { name: 'readonly',  type: 'SWITCH', label: 'Read Only', colSpan: 6 },\r\n  disabled:  { name: 'disabled',  type: 'SWITCH', label: 'Disabled', colSpan: 6 },\r\n  type: {\r\n    name: 'type',\r\n    type: 'DROPDOWN',\r\n    label: 'Field Type',\r\n    colSpan: 6,\r\n    subType: 'SINGLE',\r\n    placeholder: 'Select field type',\r\n    optionConfig: { optionList: SWITCHABLE_FIELD_TYPES }\r\n  },\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SECTIONS\r\n// Each section groups related fields for better UX\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction section(label: string, children: any[]): any {\r\n  return {\r\n    type: 'GROUP',\r\n    label,\r\n    sectionConfig: { label, children }\r\n  };\r\n}\r\n\r\nfunction row(...children: any[]): any {\r\n  return { type: 'ROW', name: 'row-' + children.map(c => c.name).join('-'), children };\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// COMMON SECTIONS (shared across multiple types)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst BASE_SECTION_NO_TYPE = section('Basic Settings', [\r\n  row(F.label, F.name, F.colSpan, F.defaultValue, F.placeholder, F.hint),\r\n]);\r\n\r\nconst BASE_SECTION = section('Basic Settings', [\r\n  // row(F.name, F.type),\r\n  row(F.label, F.name, F.colSpan, F.defaultValue, F.placeholder, F.hint),\r\n]);\r\n\r\nconst FLAGS_SECTION = section('Field State', [\r\n  row(F.isEnabled, F.required),\r\n  row(F.readonly, F.disabled),\r\n]);\r\n\r\nconst ADVANCED_SECTION = section('Advanced', [\r\n  F.visibilityExpression,\r\n  row(F.payloadPath, F.className),\r\n  row(F.prefix, F.suffix),\r\n  F.errorMessage,\r\n]);\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// APPLY BUTTON\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst APPLY_BUTTON: any = {\r\n  actionBarConfig: {\r\n    buttons: [{\r\n      id: 'apply', label: 'Apply Changes', variant: 'primary',\r\n      alignment: 'right', action: { kind: 'emit' }\r\n    }]\r\n  }\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// SCHEMA BUILDER HELPER\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction buildSchema(...sections: any[]): FormSchema {\r\n  return {\r\n    entityType: 'FIELD_CONFIG',\r\n    label: 'Field Configuration',\r\n    formType: 'SECTION',\r\n    sectionConfig: { children: sections },\r\n    ...APPLY_BUTTON\r\n  } as FormSchema;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// TYPE-SPECIFIC CONFIG SCHEMAS\r\n// Based on: FieldConfig interface in form-schema.model.ts\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const DEFAULT_FIELD_TYPE_SCHEMA_MAP: Record<string, FormSchema> = {\r\n\r\n  // ── SHORT TEXT (TEXT_INPUT → textConfig: TextConfig) ─────────────────────\r\n  shortText: buildSchema(\r\n    BASE_SECTION,\r\n    section('Text Constraints (textConfig)', [\r\n      row(\r\n        { name: 'textConfig.length.min', type: 'NUMBER_INPUT', label: 'Min Length', colSpan: 6, hint: 'Minimum number of characters' },\r\n        { name: 'textConfig.length.max', type: 'NUMBER_INPUT', label: 'Max Length', colSpan: 6, hint: 'Maximum number of characters' },\r\n      ),\r\n      { name: 'textConfig.pattern', type: 'TEXT_INPUT', label: 'Regex Pattern', placeholder: '^[A-Za-z]+$', colSpan: 9 },\r\n      { name: 'textConfig.patternMessage', type: 'TEXT_INPUT', label: 'Pattern Error Message', placeholder: 'Only letters allowed', colSpan: 9 },\r\n      row(\r\n        { name: 'textConfig.showCharCount', type: 'SWITCH', label: 'Show Char Count', colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── PASSWORD (TEXT_INPUT + subType=PASSWORD → textConfig) ────────────────\r\n  password: buildSchema(\r\n    BASE_SECTION,\r\n    section('Password Settings (textConfig)', [\r\n      row(\r\n        { name: 'textConfig.length.min', type: 'NUMBER_INPUT', label: 'Min Length', colSpan: 6 },\r\n        { name: 'textConfig.length.max', type: 'NUMBER_INPUT', label: 'Max Length', colSpan: 6 },\r\n      ),\r\n      { name: 'textConfig.matchField', type: 'TEXT_INPUT', label: 'Match with Field', placeholder: 'password', colSpan: 12, hint: 'e.g. for \"Confirm Password\" field' },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── LONG TEXT (TEXT_INPUT + subType=LONG → textConfig) ───────────────────\r\n  longText: buildSchema(\r\n    BASE_SECTION,\r\n    section('Textarea Settings (textConfig)', [\r\n      row(\r\n        { name: 'textConfig.length.min', type: 'NUMBER_INPUT', label: 'Min Length', colSpan: 6 },\r\n        { name: 'textConfig.length.max', type: 'NUMBER_INPUT', label: 'Max Length', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'rows', type: 'NUMBER_INPUT', label: 'Visible Rows', defaultValue: 4, colSpan: 6, hint: 'Height of the textarea' },\r\n        { name: 'textConfig.showCharCount', type: 'SWITCH', label: 'Show Char Count', colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── EMAIL (TEXT_INPUT + subType=EMAIL → emailConfig: EmailConfig) ─────────\r\n  email: buildSchema(\r\n    BASE_SECTION,\r\n    section('Email Settings (emailConfig)', [\r\n      { name: 'emailConfig.defaultDomain', type: 'TEXT_INPUT', label: 'Default Domain', placeholder: 'example.com', colSpan: 6 },\r\n      { name: 'emailConfig.allowedDomains', type: 'TEXT_INPUT', label: 'Allowed Domains (comma-separated)', placeholder: 'example.com, org.com', colSpan: 12, hint: 'Leave blank to allow all domains' },\r\n      { name: 'emailConfig.blockedDomains', type: 'TEXT_INPUT', label: 'Blocked Domains (comma-separated)', placeholder: 'spam.com', colSpan: 12 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── PHONE (TEXT_INPUT + subType=PHONE → phoneConfig: PhoneConfig) ─────────\r\n  phone: buildSchema(\r\n    BASE_SECTION,\r\n    section('Phone Settings (phoneConfig)', [\r\n      row(\r\n        { name: 'phoneConfig.defaultCountryCode', type: 'TEXT_INPUT', label: 'Default Country Code', placeholder: '+91', colSpan: 6 },\r\n        { name: 'phoneConfig.prefixCountryCode', type: 'SWITCH', label: 'Prefix Country Code', colSpan: 6 },\r\n      ),\r\n      {\r\n        name: 'phoneConfig.supportedCountryCodeLocale',\r\n        type: 'TEXT_INPUT', label: 'Supported Country Codes (comma-separated)',\r\n        placeholder: 'IN, US, GB',\r\n        colSpan: 12,\r\n        hint: 'Leave blank to allow all country codes'\r\n      },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── NUMBER (NUMBER_INPUT → numberConfig: NumberConfig) ────────────────────\r\n  number: buildSchema(\r\n    BASE_SECTION,\r\n    section('Number Settings (numberConfig)', [\r\n      row(\r\n        { name: 'numberConfig.min', type: 'NUMBER_INPUT', label: 'Min Value', colSpan: 6 },\r\n        { name: 'numberConfig.max', type: 'NUMBER_INPUT', label: 'Max Value', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'numberConfig.step', type: 'NUMBER_INPUT', label: 'Step', colSpan: 6, hint: 'Increment by this amount' },\r\n        { name: 'numberConfig.precision', type: 'NUMBER_INPUT', label: 'Decimal Precision', colSpan: 6, defaultValue: 0 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── DECIMAL (NUMBER_INPUT + precision → numberConfig) ─────────────────────\r\n  decimal: buildSchema(\r\n    BASE_SECTION,\r\n    section('Decimal Number Settings (numberConfig)', [\r\n      row(\r\n        { name: 'numberConfig.min', type: 'NUMBER_INPUT', label: 'Min Value', colSpan: 6 },\r\n        { name: 'numberConfig.max', type: 'NUMBER_INPUT', label: 'Max Value', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'numberConfig.precision', type: 'NUMBER_INPUT', label: 'Decimal Places', defaultValue: 2, colSpan: 6 },\r\n        { name: 'numberConfig.step', type: 'NUMBER_INPUT', label: 'Step', defaultValue: 0.01, colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── DATE (DATE → dateConfig: DateConfig) ─────────────────────────────────\r\n  date: buildSchema(\r\n    BASE_SECTION,\r\n    section('Date Settings (dateConfig)', [\r\n      row(\r\n        { name: 'dateConfig.minDate', type: 'TEXT_INPUT', label: 'Min Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n        { name: 'dateConfig.maxDate', type: 'TEXT_INPUT', label: 'Max Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'dateConfig.allowFuture', type: 'SWITCH', label: 'Allow Future Dates', colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── TIME  ────────────────────────────────────────────────────────────────\r\n  time: buildSchema(\r\n    BASE_SECTION,\r\n    section('Time Settings', [\r\n      row(F.placeholder, F.hint),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── DATE & TIME  ──────────────────────────────────────────────────────────\r\n  dateTime: buildSchema(\r\n    BASE_SECTION,\r\n    section('Date & Time Settings (dateConfig)', [\r\n      row(\r\n        { name: 'dateConfig.minDate', type: 'TEXT_INPUT', label: 'Min Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n        { name: 'dateConfig.maxDate', type: 'TEXT_INPUT', label: 'Max Date', placeholder: 'YYYY-MM-DD', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'dateConfig.allowFuture', type: 'SWITCH', label: 'Allow Future', colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── DROPDOWN (DROPDOWN → optionConfig: OptionConfig) ─────────────────────\r\n  dropdown: buildSchema(\r\n    BASE_SECTION_NO_TYPE,\r\n    section('Dropdown Options (optionConfig)', [\r\n      {\r\n        name: 'optionConfig.optionList',\r\n        type: 'TEXT_INPUT',\r\n        subType: 'LONG',\r\n        label: 'Static Options (JSON)',\r\n        placeholder: '[{\"label\": \"Yes\", \"code\": \"Y\"}, {\"label\": \"No\", \"code\": \"N\"}]',\r\n        colSpan: 12,\r\n        hint: 'Paste an array of objects with \"label\" and \"code\" keys',\r\n      },\r\n      { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n      row(\r\n        { name: 'optionConfig.dataPath', type: 'TEXT_INPUT', label: 'Data Path', placeholder: 'data.items', colSpan: 6 },\r\n        { name: 'optionConfig.labelPath', type: 'TEXT_INPUT', label: 'Label Path', placeholder: 'name', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'optionConfig.valuePath', type: 'TEXT_INPUT', label: 'Value Path (code)', placeholder: 'code', colSpan: 6 },\r\n        { name: 'optionConfig.sortBy', type: 'TEXT_INPUT', label: 'Sort By', placeholder: 'name.text', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'optionConfig.responsePath', type: 'TEXT_INPUT', label: 'Response Path', placeholder: 'e.g. elements', colSpan: 6 },\r\n        {\r\n          name: 'optionConfig.layout',\r\n          type: 'DROPDOWN', subType: 'SINGLE',\r\n          label: 'Options Layout',\r\n          colSpan: 6,\r\n          optionConfig: { optionList: [{ label: 'Row', code: 'row' }, { label: 'Column', code: 'column' }] },\r\n        },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── AUTOCOMPLETE (AUTOCOMPLETE → optionConfig) ───────────────────────────\r\n  autocomplete: buildSchema(\r\n    BASE_SECTION,\r\n    section('Autocomplete Settings (optionConfig)', [\r\n      { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Search API URL', placeholder: '/api/search', colSpan: 12 },\r\n      { name: 'optionConfig.dataPath', type: 'TEXT_INPUT', label: 'Data Path', placeholder: 'data.items', colSpan: 6 },\r\n      { name: 'optionConfig.labelPath', type: 'TEXT_INPUT', label: 'Label Path', placeholder: 'name', colSpan: 6 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── MULTI-SELECT (same structure as dropdown) ────────────────────────────\r\n  multiSelect: buildSchema(\r\n    BASE_SECTION_NO_TYPE,\r\n    section('Multi-Select Options (optionConfig)', [\r\n      {\r\n        name: 'optionConfig.optionList',\r\n        type: 'TEXT_INPUT',\r\n        subType: 'LONG',\r\n        label: 'Static Options (JSON)',\r\n        placeholder: '[{\"label\": \"Option A\", \"code\": \"A\"}]',\r\n        colSpan: 12,\r\n        hint: 'Array of objects with \"label\" and \"code\" keys',\r\n      },\r\n      { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── CHECKBOX (CHECKBOX → optionConfig for list, no optionConfig for single)\r\n  checkbox: buildSchema(\r\n    BASE_SECTION,\r\n    section('Checkbox List Options (optionConfig)', [\r\n      {\r\n        name: 'optionConfig.optionList',\r\n        type: 'TEXT_INPUT',\r\n        subType: 'LONG',\r\n        label: 'Checkbox Options (JSON) — leave blank for single checkbox',\r\n        placeholder: '[{\"label\": \"Yes\", \"code\": \"Y\"}]',\r\n        colSpan: 12,\r\n      },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── MUTLI-CHECKBOX ───────────────────────────────────────────────────────\r\n  multiCheckbox: buildSchema(\r\n    BASE_SECTION,\r\n    section('Checkbox List Options (optionConfig)', [\r\n      {\r\n        name: 'optionConfig.optionList',\r\n        type: 'TEXT_INPUT',\r\n        subType: 'LONG',\r\n        label: 'Checkbox Options (JSON)',\r\n        placeholder: '[{\"label\": \"Opt A\", \"code\": \"A\"}]',\r\n        colSpan: 12,\r\n      },\r\n      { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── TOGGLE / SWITCH (SWITCH → no extra config except basics) ─────────────\r\n  toggle: buildSchema(\r\n    section('Basic Settings', [\r\n      row(F.label, F.name),\r\n      row(F.colSpan, F.defaultValue),\r\n      F.hint,\r\n    ]),\r\n    FLAGS_SECTION,\r\n    section('Advanced', [\r\n      F.visibilityExpression,\r\n      row(F.payloadPath, F.className),\r\n      F.errorMessage,\r\n    ]),\r\n  ),\r\n\r\n  // ── CHIPS ────────────────────────────────────────────────────────────────\r\n  chip: buildSchema(\r\n    BASE_SECTION,\r\n    section('Chip Options (optionConfig)', [\r\n      {\r\n        name: 'optionConfig.optionList',\r\n        type: 'TEXT_INPUT',\r\n        subType: 'LONG',\r\n        label: 'Chip Options (JSON)',\r\n        placeholder: '[{\"label\": \"Tag 1\", \"code\": \"T1\"}]',\r\n        colSpan: 12,\r\n      },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── RICH TEXT (RICH_TEXT → richTextConfig: RichTextConfig) ───────────────\r\n  richText: buildSchema(\r\n    BASE_SECTION,\r\n    section('Rich Text Editor Settings (richTextConfig)', [\r\n      row(\r\n        { name: 'richTextConfig.height', type: 'TEXT_INPUT', label: 'Editor Height', placeholder: '300px', colSpan: 6 },\r\n        { name: 'richTextConfig.maxLength', type: 'NUMBER_INPUT', label: 'Max Length (chars)', colSpan: 6 },\r\n      ),\r\n      row(\r\n        { name: 'richTextConfig.placeholder', type: 'TEXT_INPUT', label: 'Editor Placeholder', placeholder: 'Enter content here...', colSpan: 6 },\r\n        { name: 'richTextConfig.showCharCount', type: 'SWITCH', label: 'Show Char Count', colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── FILE UPLOAD (FILE_UPLOAD → attachmentConfig: AttachmentConfig) ────────\r\n  file: buildSchema(\r\n    BASE_SECTION,\r\n    section('File Upload Settings (attachmentConfig)', [\r\n      row(\r\n        { name: 'attachmentConfig.multiple', type: 'SWITCH', label: 'Allow Multiple Files', colSpan: 6 },\r\n        { name: 'attachmentConfig.maxFiles', type: 'NUMBER_INPUT', label: 'Max Files', colSpan: 6, hint: 'Only applies when multiple=true' },\r\n      ),\r\n      row(\r\n        { name: 'attachmentConfig.maxSizeMB', type: 'NUMBER_INPUT', label: 'Max File Size (MB)', colSpan: 6 },\r\n        { name: 'attachmentConfig.accept', type: 'TEXT_INPUT', label: 'Accepted Types', placeholder: '.pdf,.jpg,image/*', colSpan: 6 },\r\n      ),\r\n      { name: 'attachmentConfig.acceptLabel', type: 'TEXT_INPUT', label: 'Hint in Drop Zone', placeholder: 'JPG, PNG, PDF (max 5 MB)', colSpan: 12 },\r\n      { name: 'attachmentConfig.uploadUrl', type: 'TEXT_INPUT', label: 'Upload API URL', placeholder: '/api/upload', colSpan: 12 },\r\n      { name: 'attachmentConfig.deleteUrl', type: 'TEXT_INPUT', label: 'Delete API URL', placeholder: '/api/file/{id}', colSpan: 12 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── RATING (RATING → ratingConfig: RatingConfig) ─────────────────────────\r\n  rating: buildSchema(\r\n    BASE_SECTION,\r\n    section('Rating Settings (ratingConfig)', [\r\n      row(\r\n        { name: 'ratingConfig.maxRating', type: 'NUMBER_INPUT', label: 'Max Stars', defaultValue: 5, colSpan: 6 },\r\n        { name: 'ratingConfig.allowHalf', type: 'SWITCH', label: 'Allow Half Stars', colSpan: 6 },\r\n      ),\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── RADIO (RADIO → optionConfig for list) ────────────────────────────────\r\n  radio: buildSchema(\r\n    BASE_SECTION,\r\n    section('Radio Options (optionConfig)', [\r\n      {\r\n        name: 'optionConfig.optionList',\r\n        type: 'TEXT_INPUT',\r\n        subType: 'LONG',\r\n        label: 'Radio Options (JSON)',\r\n        placeholder: '[{\"label\": \"Male\", \"code\": \"M\"}, {\"label\": \"Female\", \"code\": \"F\"}]',\r\n        colSpan: 12,\r\n      },\r\n      { name: 'optionConfig.apiUrl', type: 'TEXT_INPUT', label: 'Options API URL', placeholder: '/api/options', colSpan: 12 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── LOCATION (LOCATION → locationConfig: LocationConfig) ─────────────────\r\n  location: buildSchema(\r\n    BASE_SECTION,\r\n    section('Location Settings (locationConfig)', [\r\n      row(\r\n        {\r\n          name: 'locationConfig.defaultTab',\r\n          type: 'DROPDOWN', subType: 'SINGLE',\r\n          label: 'Default Tab',\r\n          colSpan: 6,\r\n          optionConfig: { optionList: [{ label: 'Venue', code: 'VENUE' }, { label: 'Online', code: 'ONLINE' }, { label: 'TBA', code: 'TBA' }] },\r\n        },\r\n        { name: 'locationConfig.maxLocations', type: 'NUMBER_INPUT', label: 'Max Locations', colSpan: 6, defaultValue: 5 },\r\n      ),\r\n      row(\r\n        { name: 'locationConfig.allowMulti', type: 'SWITCH', label: 'Allow Multiple Locations', colSpan: 6 },\r\n        { name: 'locationConfig.showMap', type: 'SWITCH', label: 'Show Map Preview', colSpan: 6 },\r\n      ),\r\n      { name: 'locationConfig.googleMapsApiKey', type: 'TEXT_INPUT', label: 'Google Maps API Key', colSpan: 12 },\r\n      { name: 'locationConfig.venuePlaceholder', type: 'TEXT_INPUT', label: 'Venue Search Placeholder', colSpan: 6 },\r\n      { name: 'locationConfig.onlinePlaceholder', type: 'TEXT_INPUT', label: 'Online URL Placeholder', colSpan: 6 },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  // ── GENERATED / FORMULA ──────────────────────────────────────────────────\r\n  generated: buildSchema(\r\n    BASE_SECTION,\r\n    section('Formula Settings (generatedConfig)', [\r\n      { \r\n        name: 'generatedConfig.formula', \r\n        type: 'TEXT_INPUT', \r\n        label: 'Formula Expression', \r\n        placeholder: 'data.price * data.quantity', \r\n        colSpan: 12,\r\n        hint: 'Use data.field_name to reference other fields'\r\n      },\r\n    ]),\r\n    FLAGS_SECTION,\r\n    ADVANCED_SECTION,\r\n  ),\r\n  \r\n  // ── GROUP & SECTION ───────────────────────────────────────────────────────\r\n  group: buildSchema(\r\n    section('Group Settings', [\r\n      row(F.label, F.name),\r\n      row(F.colSpan),\r\n      F.isEnabled,\r\n    ]),\r\n    ADVANCED_SECTION,\r\n  ),\r\n\r\n  section: buildSchema(\r\n    section('Section Settings', [\r\n      row(F.label, F.name),\r\n      F.isEnabled,\r\n    ]),\r\n    ADVANCED_SECTION,\r\n  ),\r\n};\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfiguratorTreeNode } from '../../../models/field-configurator.models';\r\n\r\n@Component({\r\n  selector: 'lib-configurator-tree',\r\n  standalone: false,\r\n  templateUrl: './configurator-tree.component.html',\r\n  styleUrls: ['./configurator-tree.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfiguratorTreeComponent {\r\n  @Input() tree: ConfiguratorTreeNode[] = [];\r\n  @Input() selectedFieldPath: number[] | null = null;\r\n\r\n  @Output() selectField = new EventEmitter<{ path: number[] }>();\r\n  @Output() toggleExpanded = new EventEmitter<string>();\r\n\r\n  onNodeClick(node: ConfiguratorTreeNode): void {\r\n    if (node.type === 'field') {\r\n      this.selectField.emit({ path: node.path });\r\n    } else {\r\n      this.toggleExpanded.emit(node.id);\r\n    }\r\n  }\r\n\r\n  onFieldSelect(node: ConfiguratorTreeNode): void {\r\n    this.selectField.emit({ path: node.path });\r\n  }\r\n\r\n  onToggleExpand(node: ConfiguratorTreeNode, event: Event): void {\r\n    event.stopPropagation();\r\n    this.toggleExpanded.emit(node.id);\r\n  }\r\n\r\n  isSelected(node: ConfiguratorTreeNode): boolean {\r\n    if (!this.selectedFieldPath || !node.path) return false;\r\n    return this.pathsEqual(node.path, this.selectedFieldPath);\r\n  }\r\n\r\n  trackByNodeId(_index: number, node: ConfiguratorTreeNode): string {\r\n    return node.id;\r\n  }\r\n\r\n  private pathsEqual(a: number[], b: number[]): boolean {\r\n    if (a.length !== b.length) return false;\r\n    return a.every((v, i) => v === b[i]);\r\n  }\r\n}\r\n","<div class=\"fb-cfg-tree\">\r\n  <div class=\"fb-cfg-tree__header\">\r\n    <h4 class=\"fb-cfg-tree__title\">Field Tree</h4>\r\n    <p class=\"fb-cfg-tree__subtitle\">Select a field to configure</p>\r\n  </div>\r\n\r\n  <div class=\"fb-cfg-tree__scrollable\">\r\n    @for (node of tree; track trackByNodeId($index, node)) {\r\n      <ng-container *ngTemplateOutlet=\"treeNodeTpl; context: { $implicit: node, depth: 0 }\"></ng-container>\r\n    }\r\n\r\n    @if (tree.length === 0) {\r\n      <div class=\"fb-cfg-tree__empty\">\r\n        No fields to configure.\r\n      </div>\r\n    }\r\n  </div>\r\n</div>\r\n\r\n<!-- Recursive tree node template -->\r\n<ng-template #treeNodeTpl let-node let-depth=\"depth\">\r\n  @if (node.type === 'field') {\r\n    <!-- Field node (clickable leaf) -->\r\n    <div\r\n      class=\"fb-cfg-tree-item\"\r\n      [class.fb-cfg-tree-item--active]=\"isSelected(node)\"\r\n      (click)=\"onFieldSelect(node)\"\r\n      [style.padding-left.px]=\"16 + depth * 16\"\r\n    >\r\n      @if (node.children.length > 0) {\r\n        <span\r\n          class=\"fb-cfg-tree-item__chevron\"\r\n          [class.fb-cfg-tree-item__chevron--expanded]=\"node.expanded\"\r\n          (click)=\"onToggleExpand(node, $event)\"\r\n        >\r\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n            stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n            <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n          </svg>\r\n        </span>\r\n      }\r\n      <span class=\"fb-cfg-tree-item__drag\" title=\"Drag to reorder\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n          stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n          <circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"12\" r=\"1\"/>\r\n          <circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/>\r\n          <circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/>\r\n        </svg>\r\n      </span>\r\n      <div class=\"fb-cfg-tree-item__content\">\r\n        <span class=\"fb-cfg-tree-item__label\">{{ node.label }}</span>\r\n        @if (node.fieldConfig?.type) {\r\n          <span class=\"fb-cfg-tree-item__type\">{{ node.fieldConfig.type }}</span>\r\n        }\r\n      </div>\r\n    </div>\r\n    @if (node.children.length > 0 && node.expanded) {\r\n      <div class=\"fb-cfg-tree-section__children\">\r\n        @for (child of node.children; track trackByNodeId($index, child)) {\r\n          <ng-container *ngTemplateOutlet=\"treeNodeTpl; context: { $implicit: child, depth: depth + 1 }\"></ng-container>\r\n        }\r\n      </div>\r\n    }\r\n  } @else {\r\n    <!-- Group or Section node (expandable) -->\r\n    <div\r\n      class=\"fb-cfg-tree-section\"\r\n      [style.padding-left.px]=\"8 + depth * 12\"\r\n    >\r\n      <div class=\"fb-cfg-tree-section__header\" (click)=\"onNodeClick(node)\">\r\n        <div class=\"fb-cfg-tree-section__title-group\">\r\n          <span\r\n            class=\"fb-cfg-tree-section__chevron\"\r\n            [class.fb-cfg-tree-section__chevron--expanded]=\"node.expanded\"\r\n          >\r\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n              stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n              <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n            </svg>\r\n          </span>\r\n          <span class=\"fb-cfg-tree-section__label\">{{ node.label }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      @if (node.expanded && node.children.length > 0) {\r\n        <div class=\"fb-cfg-tree-section__children\">\r\n          @for (child of node.children; track trackByNodeId($index, child)) {\r\n            <ng-container *ngTemplateOutlet=\"treeNodeTpl; context: { $implicit: child, depth: depth + 1 }\"></ng-container>\r\n          }\r\n        </div>\r\n      }\r\n    </div>\r\n  }\r\n</ng-template>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  ChangeDetectorRef,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n  OnChanges,\r\n  SimpleChanges,\r\n} from '@angular/core';\r\nimport { FieldConfig, FormSchema } from '../../../../smart-form/models/form-schema.model';\r\nimport { ConfiguratorFieldInfo } from '../../../models/field-configurator.models';\r\nimport { SWITCHABLE_FIELD_TYPES } from '../../../utils/constants';\r\nimport { SnackbarService } from '../../../../snackbar/services/snackbar.service';\r\n\r\n@Component({\r\n  selector: 'lib-configurator-config-panel',\r\n  standalone: false,\r\n  templateUrl: './configurator-config-panel.component.html',\r\n  styleUrls: ['./configurator-config-panel.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfiguratorConfigPanelComponent implements OnChanges {\r\n  constructor(\r\n    private cdr: ChangeDetectorRef,\r\n    private snackbarService: SnackbarService\r\n  ) {}\r\n\r\n  @Input() selectedField: FieldConfig | null = null;\r\n  @Input() selectedFieldInfo: ConfiguratorFieldInfo | null = null;\r\n  @Input() builderFieldType: string | null = null;\r\n  @Input() fieldTypeSchemaMap: Record<string, FormSchema> = {};\r\n\r\n  @Output() configChange = new EventEmitter<Record<string, unknown>>();\r\n  @Output() typeChange = new EventEmitter<string>();\r\n\r\n  /**\r\n   * When false, all `optionConfig.*` fields (apiUrl, dataPath, labelPath, etc.)\r\n   * are hidden from the config panel. Business users don't need to configure\r\n   * option URLs — these are pre-filled by the developer in the master JSON.\r\n   */\r\n  @Input() showOptionConfig: boolean = true;\r\n\r\n  /**\r\n   * Field names that are mandatory and cannot be disabled.\r\n   * When the currently selected field is in this list, IS ENABLED / READ ONLY /\r\n   * DISABLED controls are hidden from the Field State step.\r\n   */\r\n  @Input() lockedFieldNames: string[] = [];\r\n\r\n  /** Exposed to the template for the native type-switcher select */\r\n  readonly switchableFieldTypes = SWITCHABLE_FIELD_TYPES;\r\n\r\n  configFormJson: string = '';\r\n  configInitialValues: Record<string, unknown> = {};\r\n  showConfigForm: boolean = false;\r\n\r\n  /**\r\n   * The type currently being PREVIEWED in the config form.\r\n   * Starts equal to builderFieldType; changes as user picks a new type.\r\n   * Emitted to the parent on Apply.\r\n   */\r\n  currentBuilderType: string | null = null;\r\n\r\n  /** Identity key of the currently rendered field — used to detect real field switches. */\r\n  private _currentFieldKey: string = '';\r\n\r\n  /** True when type switching should be disabled — DROPDOWN-based fields. */\r\n  get isDropdownType(): boolean {\r\n    const t = this.selectedField?.type?.toUpperCase();\r\n    return t === 'DROPDOWN' || t === 'MULTI_SELECT';\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (\r\n      (changes['selectedField'] || changes['builderFieldType'] || changes['fieldTypeSchemaMap'])\r\n      && this.selectedField\r\n      && this.builderFieldType\r\n    ) {\r\n      const key = `${this.selectedField.name}__${this.builderFieldType}`;\r\n      if (key !== this._currentFieldKey) {\r\n        this._currentFieldKey = key;\r\n        // Reset the previewed type whenever we switch to a different field\r\n        this.currentBuilderType = this.builderFieldType;\r\n        this._buildConfigFormForType(this.builderFieldType);\r\n      }\r\n    }\r\n  }\r\n\r\n  // ─── Type Switcher ────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Called when the user picks a new type from the native select in the header.\r\n   * Immediately rebuilds the config form to show fields for the new type.\r\n   * The actual field-level type change is only committed when Apply is clicked.\r\n   */\r\n  onTypeSelectChange(event: Event): void {\r\n    const newType = (event.target as HTMLSelectElement).value;\r\n    if (!newType || newType === this.currentBuilderType) return;\r\n    if (!this.fieldTypeSchemaMap[newType]) {\r\n      console.warn(`[ConfigPanel] No schema found for field type: ${newType}`);\r\n      return;\r\n    }\r\n    this.currentBuilderType = newType;\r\n    this._buildConfigFormForType(newType);\r\n  }\r\n\r\n  // ─── Form Actions ─────────────────────────────────────────────────────────\r\n\r\n  onActionClick(event: { id: string; formData: Record<string, unknown> }): void {\r\n    if (event.id === 'apply') {\r\n      const patch = this._buildPatchFromFormData(event.formData);\r\n\r\n      // Emit type change only if the user picked a different type\r\n      if (this.currentBuilderType && this.currentBuilderType !== this.builderFieldType) {\r\n        this.typeChange.emit(this.currentBuilderType);\r\n      }\r\n\r\n      this.configChange.emit(patch);\r\n\r\n      // Show success notification to user\r\n      const fieldLabel = this.selectedField?.label || this.selectedField?.name || 'Field';\r\n      this.snackbarService.success(`${fieldLabel} configuration updated successfully`);\r\n    }\r\n  }\r\n\r\n  // ─── Private: Build the config form JSON ─────────────────────────────────\r\n\r\n  /**\r\n   * Rebuild the SmartForm for the given builder type key.\r\n   * Uses a destroy/recreate cycle (showConfigForm toggle + setTimeout) to\r\n   * guarantee a completely fresh SmartForm instance is mounted.\r\n   */\r\n  private _buildConfigFormForType(builderType: string): void {\r\n    if (!this.fieldTypeSchemaMap || !this.selectedField) return;\r\n\r\n    let schema = this.fieldTypeSchemaMap[builderType];\r\n    if (!schema) {\r\n      this.showConfigForm = false;\r\n      this.configFormJson = '';\r\n      this.cdr.markForCheck();\r\n      return;\r\n    }\r\n\r\n    // When optionConfig should be hidden, filter it out of the schema\r\n    if (!this.showOptionConfig) {\r\n      schema = this._filterSchemaForOptionConfig(schema);\r\n    }\r\n\r\n    // When a mandatory/locked field is selected, hide IS ENABLED / READ ONLY / DISABLED\r\n    const isLockedField = this.selectedField?.name\r\n      ? this.lockedFieldNames.includes(this.selectedField.name)\r\n      : false;\r\n    if (isLockedField) {\r\n      schema = this._filterSchemaForLockedField(schema);\r\n    }\r\n\r\n    // 1. Hide current SmartForm instance (renders false in the current CD cycle\r\n    //    since ngOnChanges fires before the view is rendered)\r\n    this.showConfigForm = false;\r\n\r\n    // 2. Prepare new schema + initial values\r\n    this.configFormJson = JSON.stringify(schema);\r\n    this.configInitialValues = this._extractInitialValuesFromField(this.selectedField);\r\n\r\n    // 3. Re-mount on next tick — markForCheck schedules a proper CD pass\r\n    //    rather than forcing a synchronous check mid-cycle\r\n    setTimeout(() => {\r\n      this.showConfigForm = true;\r\n      this.cdr.markForCheck();\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Deep-clones the schema and removes any field whose `name` matches developer-only fields.\r\n   * This prevents end users from modifying system-level configurations like:\r\n   * - optionConfig.* (API URLs, data paths, etc.)\r\n   * - payloadPath (payload mapping)\r\n   * - className (CSS styling)\r\n   * - name (system identifier)\r\n   * \r\n   * Also removes entire sections that become empty after filtering.\r\n   */\r\n  private _filterSchemaForOptionConfig(schema: FormSchema): FormSchema {\r\n    // List of developer-only field names that should be hidden from end users\r\n    const DEVELOPER_ONLY_FIELDS = [\r\n      'payloadPath',      // Payload mapping configuration\r\n      'className',        // CSS class for styling\r\n      'name',             // System field identifier\r\n    ];\r\n\r\n    const isDeveloperOnlyField = (f: any): boolean => {\r\n      if (typeof f?.name !== 'string') return false;\r\n      \r\n      // Hide optionConfig.* fields (API URL, data path, label path, etc.)\r\n      if (f.name.startsWith('optionConfig.')) return true;\r\n      \r\n      // Hide other developer-only fields\r\n      if (DEVELOPER_ONLY_FIELDS.includes(f.name)) return true;\r\n      \r\n      return false;\r\n    };\r\n\r\n    const filterChildren = (children: any[]): any[] =>\r\n      children\r\n        .map((child: any) => {\r\n          // ROW — filter its inline children\r\n          if (child.type === 'ROW' && Array.isArray(child.children)) {\r\n            const filtered = child.children.filter((c: any) => !isDeveloperOnlyField(c));\r\n            return filtered.length ? { ...child, children: filtered } : null;\r\n          }\r\n          // GROUP / section wrapper — recurse into sectionConfig.children\r\n          if (child.sectionConfig?.children) {\r\n            const filteredChildren = filterChildren(child.sectionConfig.children);\r\n            // Drop the entire section if it becomes empty\r\n            if (!filteredChildren.length) return null;\r\n            return {\r\n              ...child,\r\n              sectionConfig: { ...child.sectionConfig, children: filteredChildren },\r\n            };\r\n          }\r\n          // Leaf field\r\n          if (isDeveloperOnlyField(child)) return null;\r\n          return child;\r\n        })\r\n        .filter(Boolean);\r\n\r\n    const topChildren = schema.sectionConfig?.children\r\n      ? filterChildren(schema.sectionConfig.children)\r\n      : [];\r\n\r\n    return {\r\n      ...schema,\r\n      sectionConfig: schema.sectionConfig\r\n        ? { ...schema.sectionConfig, children: topChildren }\r\n        : schema.sectionConfig,\r\n    } as FormSchema;\r\n  }\r\n\r\n  /**\r\n   * Remove IS ENABLED, READ ONLY, and DISABLED controls from the config schema\r\n   * when the selected field is a mandatory/locked field.\r\n   */\r\n  private _filterSchemaForLockedField(schema: FormSchema): FormSchema {\r\n    const LOCKED_HIDDEN_FIELDS = new Set(['isEnabled', 'readonly', 'disabled']);\r\n\r\n    const filterChildren = (children: any[]): any[] =>\r\n      children\r\n        .map((child: any) => {\r\n          if (child.type === 'ROW' && Array.isArray(child.children)) {\r\n            const filtered = child.children.filter((c: any) => !LOCKED_HIDDEN_FIELDS.has(c.name));\r\n            return filtered.length ? { ...child, children: filtered } : null;\r\n          }\r\n          if (child.sectionConfig?.children) {\r\n            const filteredChildren = filterChildren(child.sectionConfig.children);\r\n            if (!filteredChildren.length) return null;\r\n            return { ...child, sectionConfig: { ...child.sectionConfig, children: filteredChildren } };\r\n          }\r\n          if (LOCKED_HIDDEN_FIELDS.has(child.name)) return null;\r\n          return child;\r\n        })\r\n        .filter(Boolean);\r\n\r\n    const topChildren = schema.sectionConfig?.children\r\n      ? filterChildren(schema.sectionConfig.children)\r\n      : [];\r\n\r\n    return {\r\n      ...schema,\r\n      sectionConfig: schema.sectionConfig\r\n        ? { ...schema.sectionConfig, children: topChildren }\r\n        : schema.sectionConfig,\r\n    } as FormSchema;\r\n  }\r\n\r\n  // ─── Private: Extract initial values from FieldConfig ─────────────────────\r\n\r\n  private _extractInitialValuesFromField(field: FieldConfig): Record<string, unknown> {\r\n    const v: Record<string, unknown> = {};\r\n\r\n    const set = (key: string, val: unknown) => {\r\n      if (val !== undefined && val !== null) v[key] = val;\r\n    };\r\n\r\n    // ── Common FieldConfig properties ─────────────────────────────────────────\r\n    set('label',             field.label);\r\n    set('name',              field.name);\r\n    set('colSpan',           field.colSpan);\r\n    set('placeholder',       field.placeholder);\r\n    set('hint',              field.hint);\r\n    set('defaultValue',      field.defaultValue);\r\n    set('payloadPath',       field.payloadPath);\r\n    set('className',         field.className);\r\n    set('prefix',            field.prefix);\r\n    set('suffix',            field.suffix);\r\n    set('required',          field.required);\r\n    set('readonly',          field.readonly);\r\n    set('disabled',          field.disabled);\r\n    set('isEnabled',         field.isEnabled ?? field.visible);\r\n    set('errorMessage',      field.errorMessage);\r\n    set('visibilityExpression', field.visibilityExpression);\r\n\r\n    if (field.textConfig) {\r\n      const tc = field.textConfig;\r\n      set('textConfig.length.min',   tc.length?.min);\r\n      set('textConfig.length.max',   tc.length?.max);\r\n      set('textConfig.pattern',      tc.pattern);\r\n      set('textConfig.patternMessage', tc.patternMessage);\r\n      set('textConfig.showCharCount', tc.showCharCount);\r\n      set('textConfig.matchField',   tc.matchField);\r\n    }\r\n    if (field.emailConfig) {\r\n      const ec = field.emailConfig;\r\n      set('emailConfig.defaultDomain',    ec.defaultDomain);\r\n      set('emailConfig.allowedDomains',   ec.allowedDomains?.join(', '));\r\n      set('emailConfig.blockedDomains',   ec.blockedDomains?.join(', '));\r\n    }\r\n    if (field.phoneConfig) {\r\n      const pc = field.phoneConfig;\r\n      set('phoneConfig.defaultCountryCode',           pc.defaultCountryCode);\r\n      set('phoneConfig.prefixCountryCode',            pc.prefixCountryCode);\r\n      set('phoneConfig.supportedCountryCodeLocale',   pc.supportedCountryCodeLocale?.join(', '));\r\n    }\r\n    if (field.numberConfig) {\r\n      const nc = field.numberConfig;\r\n      set('numberConfig.min',       nc.min);\r\n      set('numberConfig.max',       nc.max);\r\n      set('numberConfig.step',      nc.step);\r\n      set('numberConfig.precision', nc.precision);\r\n    }\r\n    if (field.dateConfig) {\r\n      const dc = field.dateConfig;\r\n      set('dateConfig.minDate',     dc.minDate);\r\n      set('dateConfig.maxDate',     dc.maxDate);\r\n      set('dateConfig.allowFuture', dc.allowFuture);\r\n    }\r\n    if (field.optionConfig) {\r\n      const oc = field.optionConfig;\r\n      if (oc.optionList?.length) set('optionConfig.optionList', JSON.stringify(oc.optionList, null, 2));\r\n      set('optionConfig.apiUrl',       oc.apiUrl || oc.optionUrl);\r\n      set('optionConfig.dataPath',     oc.dataPath);\r\n      set('optionConfig.labelPath',    oc.labelPath);\r\n      set('optionConfig.valuePath',    oc.valuePath);\r\n      set('optionConfig.sortBy',       oc.sortBy);\r\n      set('optionConfig.layout',       oc.layout);\r\n    }\r\n    if (field.attachmentConfig) {\r\n      const ac = field.attachmentConfig;\r\n      set('attachmentConfig.multiple',    ac.multiple);\r\n      set('attachmentConfig.maxFiles',    ac.maxFiles);\r\n      set('attachmentConfig.maxSizeMB',   ac.maxSizeMB);\r\n      set('attachmentConfig.accept',      ac.accept);\r\n      set('attachmentConfig.acceptLabel', ac.acceptLabel);\r\n      set('attachmentConfig.uploadUrl',   ac.uploadUrl);\r\n      set('attachmentConfig.deleteUrl',   ac.deleteUrl);\r\n    }\r\n    if (field.richTextConfig) {\r\n      const rc = field.richTextConfig;\r\n      set('richTextConfig.height',       rc.height);\r\n      set('richTextConfig.maxLength',    rc.maxLength);\r\n      set('richTextConfig.placeholder',  rc.placeholder);\r\n      set('richTextConfig.showCharCount', rc.showCharCount);\r\n    }\r\n    if (field.ratingConfig) {\r\n      const rat = field.ratingConfig;\r\n      set('ratingConfig.maxRating', rat.maxRating);\r\n      set('ratingConfig.allowHalf', rat.allowHalf);\r\n    }\r\n    if (field.locationConfig) {\r\n      const lc = field.locationConfig;\r\n      set('locationConfig.defaultTab',            lc.defaultTab);\r\n      set('locationConfig.maxLocations',          lc.maxLocations);\r\n      set('locationConfig.allowMulti',            lc.allowMulti);\r\n      set('locationConfig.showMap',               lc.showMap);\r\n      set('locationConfig.googleMapsApiKey',      lc.googleMapsApiKey);\r\n      set('locationConfig.venuePlaceholder',      lc.venuePlaceholder);\r\n      set('locationConfig.onlinePlaceholder',     lc.onlinePlaceholder);\r\n    }\r\n\r\n    return v;\r\n  }\r\n\r\n  // ─── Private: Convert flat dot-notation form data → nested FieldConfig patch\r\n\r\n  private _buildPatchFromFormData(formData: Record<string, unknown>): Record<string, unknown> {\r\n    const patch: Record<string, unknown> = {};\r\n\r\n    const setNested = (obj: any, dotPath: string, val: unknown): void => {\r\n      const parts = dotPath.split('.');\r\n      let cur = obj;\r\n      for (let i = 0; i < parts.length - 1; i++) {\r\n        const part = parts[i];\r\n        if (typeof cur[part] !== 'object' || cur[part] === null) {\r\n          cur[part] = {};\r\n        }\r\n        cur = cur[part];\r\n      }\r\n      cur[parts[parts.length - 1]] = val;\r\n    };\r\n\r\n    const flatData: Record<string, unknown> = {};\r\n    for (const [key, val] of Object.entries(formData)) {\r\n      if (val !== null && typeof val === 'object' && !Array.isArray(val)) {\r\n        for (const [innerKey, innerVal] of Object.entries(val as Record<string, unknown>)) {\r\n          flatData[innerKey] = innerVal;\r\n        }\r\n      } else {\r\n        flatData[key] = val;\r\n      }\r\n    }\r\n\r\n    for (const [key, val] of Object.entries(flatData)) {\r\n      if (val === null || val === undefined) continue;\r\n      if (key.startsWith('row-')) continue;\r\n      setNested(patch, key, val);\r\n    }\r\n\r\n    // Post-process: parse JSON strings for optionConfig.optionList\r\n    if (patch['optionConfig'] && (patch['optionConfig'] as any)['optionList']) {\r\n      try {\r\n        const raw = (patch['optionConfig'] as any)['optionList'];\r\n        if (typeof raw === 'string') {\r\n          (patch['optionConfig'] as any)['optionList'] = JSON.parse(raw);\r\n        }\r\n      } catch {\r\n        // Ignore invalid JSON — leave as-is\r\n      }\r\n    }\r\n\r\n    // Post-process: split comma-separated strings for email/phone arrays\r\n    if (patch['emailConfig']) {\r\n      const ec = patch['emailConfig'] as any;\r\n      if (typeof ec['allowedDomains'] === 'string') ec['allowedDomains'] = ec['allowedDomains'].split(',').map((s: string) => s.trim()).filter(Boolean);\r\n      if (typeof ec['blockedDomains'] === 'string') ec['blockedDomains'] = ec['blockedDomains'].split(',').map((s: string) => s.trim()).filter(Boolean);\r\n    }\r\n    if (patch['phoneConfig']) {\r\n      const pc = patch['phoneConfig'] as any;\r\n      if (typeof pc['supportedCountryCodeLocale'] === 'string') {\r\n        pc['supportedCountryCodeLocale'] = pc['supportedCountryCodeLocale'].split(',').map((s: string) => s.trim()).filter(Boolean);\r\n      }\r\n    }\r\n\r\n    return patch;\r\n  }\r\n}\r\n","<div class=\"fb-config-panel\">\r\n  @if (!selectedField) {\r\n    <div class=\"fb-config-panel__empty\">\r\n      <div class=\"fb-config-panel__empty-icon\">\r\n        <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n          stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n          <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>\r\n          <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/>\r\n          <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>\r\n        </svg>\r\n      </div>\r\n      <p class=\"fb-config-panel__empty-text\">\r\n        Select a field from the tree panel to edit its configuration.\r\n      </p>\r\n    </div>\r\n  } @else {\r\n    <div class=\"fb-config-panel__header\">\r\n      <div class=\"fb-config-panel__header-left\">\r\n        <h3 class=\"fb-config-panel__title\">\r\n          {{ selectedField.label || selectedField.name || 'Field Settings' }}\r\n        </h3>\r\n        @if (selectedField.type) {\r\n          <span class=\"fb-config-panel__badge\">{{ selectedField.type }}</span>\r\n        }\r\n      </div>\r\n\r\n      <!-- Field Type Switcher: hidden for DROPDOWN / MULTI_SELECT fields -->\r\n      @if (!isDropdownType) {\r\n        <div class=\"fb-config-panel__type-switcher\">\r\n          <label class=\"fb-config-panel__type-label\" for=\"fb-field-type-select\">Field Type</label>\r\n          <select\r\n            id=\"fb-field-type-select\"\r\n            class=\"fb-config-panel__type-select\"\r\n            [value]=\"currentBuilderType\"\r\n            (change)=\"onTypeSelectChange($event)\"\r\n          >\r\n            @for (opt of switchableFieldTypes; track opt.value) {\r\n              <option [value]=\"opt.value\">{{ opt.label }}</option>\r\n            }\r\n          </select>\r\n        </div>\r\n      }\r\n    </div>\r\n\r\n    <div class=\"fb-config-panel__form-wrapper\">\r\n      @if (showConfigForm && configFormJson) {\r\n        <div class=\"fb-config-card\">\r\n          <lib-smart-form\r\n            [formJson]=\"configFormJson\"\r\n            [initialValues]=\"configInitialValues\"\r\n            (actionClick)=\"onActionClick($event)\"\r\n          />\r\n        </div>\r\n      } @else if (!showConfigForm) {\r\n        <!-- intentionally empty — SmartForm is being recycled -->\r\n      } @else {\r\n        <div class=\"fb-config-panel__error\">\r\n          No configuration schema available for this field type.\r\n        </div>\r\n      }\r\n    </div>\r\n  }\r\n</div>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  ChangeDetectorRef,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormSchema } from '../../../smart-form/models/form-schema.model';\r\nimport { SmartFormModule } from '../../../smart-form/smart-form.module';\r\nimport { FieldConfiguratorService } from '../../services/field-configurator.service';\r\nimport { ConfiguratorTreeComponent } from './configurator-tree/configurator-tree.component';\r\nimport { ConfiguratorConfigPanelComponent } from './configurator-config-panel/configurator-config-panel.component';\r\nimport { BUILDER_FIELD_TYPE_SCHEMA_MAP } from '../../tokens/builder.tokens';\r\nimport { DEFAULT_FIELD_TYPE_SCHEMA_MAP } from '../../configs/field-type-schema.map';\r\n\r\n@Component({\r\n  selector: 'lib-field-configurator',\r\n  standalone: false,\r\n  providers: [FieldConfiguratorService],\r\n  templateUrl: './field-configurator.component.html',\r\n  styleUrls: ['./field-configurator.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FieldConfiguratorComponent implements OnChanges {\r\n  @Input({ required: true }) schema!: FormSchema;\r\n  @Output() schemaChange = new EventEmitter<FormSchema>();\r\n\r\n  /**\r\n   * When false, the optionConfig section (apiUrl, dataPath, etc.) is hidden\r\n   * from the configurator panel. Useful for business-user-facing configurators\r\n   * where option URLs are pre-filled by the developer.\r\n   * Defaults to true (show everything).\r\n   */\r\n  @Input() showOptionConfig: boolean = true;\r\n\r\n  /**\r\n   * Field names that must always remain enabled and cannot be toggled off.\r\n   * When a locked field is selected, the IS ENABLED / READ ONLY / DISABLED\r\n   * controls are hidden so the user cannot accidentally disable the field.\r\n   */\r\n  @Input() lockedFieldNames: string[] = [];\r\n\r\n  readonly store = inject(FieldConfiguratorService);\r\n  private readonly cdr = inject(ChangeDetectorRef);\r\n  private readonly schemaMapOverride = inject(BUILDER_FIELD_TYPE_SCHEMA_MAP, { optional: true });\r\n\r\n  /**\r\n   * Merged field-type → config-schema map (defaults + optional overrides).\r\n   * Memoized to avoid triggering ngOnChanges in children due to new object references.\r\n   */\r\n  finalFieldTypeSchemaMap: Record<string, FormSchema> = { ...DEFAULT_FIELD_TYPE_SCHEMA_MAP, ...(this.schemaMapOverride ?? {}) } as any;\r\n\r\n  private _isInternalChange = false;\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['schema'] && this.schema) {\r\n      this.store.loadSchema(this.schema, this._isInternalChange);\r\n      this._isInternalChange = false;\r\n    }\r\n  }\r\n\r\n  onFieldSelected(selection: { path: number[] }): void {\r\n    this.store.selectField(selection.path);\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  onNodeToggleExpanded(nodeId: string): void {\r\n    this.store.toggleNodeExpanded(nodeId);\r\n    this.cdr.markForCheck();\r\n  }\r\n\r\n  onConfigChange(patch: Record<string, unknown>): void {\r\n    this._isInternalChange = true;\r\n    this.store.patchSelectedField(patch as any);\r\n    this._emitChange();\r\n  }\r\n\r\n  onTypeChange(builderType: string): void {\r\n    this._isInternalChange = true;\r\n    this.store.changeFieldType(builderType);\r\n    this._emitChange();\r\n  }\r\n\r\n  private _emitChange(): void {\r\n    const updated = this.store.getCurrentSchema();\r\n    if (updated) {\r\n      this.schemaChange.emit(updated);\r\n    }\r\n  }\r\n}\r\n","<div class=\"fb-configurator\">\r\n  <div class=\"fb-configurator__layout\">\r\n    <div class=\"fb-configurator__sidebar\">\r\n      <lib-configurator-tree\r\n        [tree]=\"store.tree()\"\r\n        [selectedFieldPath]=\"store.selectedFieldPath()\"\r\n        (selectField)=\"onFieldSelected($event)\"\r\n        (toggleExpanded)=\"onNodeToggleExpanded($event)\"\r\n      />\r\n    </div>\r\n\r\n    <div class=\"fb-configurator__main\">\r\n      <lib-configurator-config-panel\r\n        [selectedField]=\"store.selectedField()\"\r\n        [selectedFieldInfo]=\"store.selectedFieldInfo()\"\r\n        [builderFieldType]=\"store.selectedFieldBuilderType()\"\r\n        [fieldTypeSchemaMap]=\"finalFieldTypeSchemaMap\"\r\n        [showOptionConfig]=\"showOptionConfig\"\r\n        [lockedFieldNames]=\"lockedFieldNames\"\r\n        (configChange)=\"onConfigChange($event)\"\r\n        (typeChange)=\"onTypeChange($event)\"\r\n      />\r\n    </div>\r\n  </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SmartFormModule } from '../smart-form/smart-form.module';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\n\r\nimport { FieldSelectionComponent } from './components/field-selection/field-selection.component';\r\nimport { FieldConfiguratorComponent } from './components/field-configurator/field-configurator.component';\r\nimport { GroupNodeComponent } from './components/field-selection/group-node/group-node.component';\r\nimport { SelectionSectionNodeComponent } from './components/field-selection/selection-section-node/selection-section-node.component';\r\nimport { SelectionFieldNodeComponent } from './components/field-selection/selection-field-node/selection-field-node.component';\r\nimport { ConfiguratorTreeComponent } from './components/field-configurator/configurator-tree/configurator-tree.component';\r\nimport { ConfiguratorConfigPanelComponent } from './components/field-configurator/configurator-config-panel/configurator-config-panel.component';\r\n\r\nconst COMPONENTS = [\r\n  FieldSelectionComponent,\r\n  FieldConfiguratorComponent,\r\n  GroupNodeComponent,\r\n  SelectionSectionNodeComponent,\r\n  SelectionFieldNodeComponent,\r\n  ConfiguratorTreeComponent,\r\n  ConfiguratorConfigPanelComponent,\r\n];\r\n\r\n@NgModule({\r\n  declarations: [...COMPONENTS],\r\n  imports: [\r\n    CommonModule,\r\n    SmartFormModule,\r\n    FormComponentsModule,\r\n  ],\r\n  exports: [\r\n    FieldSelectionComponent,\r\n    FieldConfiguratorComponent,\r\n  ],\r\n})\r\nexport class FormBuilderModule {}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n  FormSchema,\r\n  FieldConfig,\r\n} from '../../smart-form/models/form-schema.model';\r\nimport {\r\n  ConfigSectionNode,\r\n  ConfigFieldNode,\r\n} from '../models/field-configuration.models';\r\n\r\n/**\r\n * Parses a FormSchema into a configurator tree (sections + fields, each carrying\r\n * visibility/mandatory state) and writes that tree back onto a schema.\r\n *\r\n * Nodes hold LIVE references to the FieldConfig objects inside the working schema\r\n * clone, so `applyTreeToSchema` simply walks the tree and assigns the node state\r\n * onto those references — there is no positional re-matching, which keeps it robust\r\n * against ROWs, nested groups, and mixed leaf/section children.\r\n *\r\n * Field order is a plain property of the schema — there is no separate `sequence`\r\n * field. Reordering rewrites the schema's own children array in place, so render\r\n * order (which simply follows array order, as it always has) reflects the\r\n * configurator's choices with no extra sorting logic anywhere else.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConfigSchemaTreeService {\r\n  // ── Parsing ─────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Build the configurator section tree from a schema.\r\n   * The passed schema is treated as the working copy — nodes reference its objects.\r\n   */\r\n  parseSchema(schema: FormSchema): ConfigSectionNode[] {\r\n    const topChildren =\r\n      schema.formType === 'STEPPER'\r\n        ? (schema.stepperConfig?.children ?? []).filter(c => c.type === 'GROUP')\r\n        : schema.sectionConfig?.children ?? [];\r\n    return this._buildSections(topChildren);\r\n  }\r\n\r\n  /**\r\n   * Write the current tree state back onto the schema the nodes reference.\r\n   * Sets isEnabled/visible/disabled for visibility, required for mandatory, and\r\n   * colSpan; and physically reorders each section's own children array to match\r\n   * the tree's current field order.\r\n   */\r\n  applyTreeToSchema(sections: ConfigSectionNode[]): void {\r\n    for (const section of sections) {\r\n      this._applySection(section);\r\n    }\r\n  }\r\n\r\n  // ── Private: parsing ──────────────────────────────────────────────────────────\r\n\r\n  private _buildSections(children: FieldConfig[]): ConfigSectionNode[] {\r\n    const sections: ConfigSectionNode[] = [];\r\n    const reorderable = !children.some(c => c.type === 'ROW');\r\n    let leafBundle: ConfigFieldNode[] = [];\r\n\r\n    for (const child of children) {\r\n      if (this._isSection(child)) {\r\n        if (leafBundle.length) {\r\n          sections.push(this._createBundleSection(leafBundle, children, reorderable));\r\n          leafBundle = [];\r\n        }\r\n        sections.push(this._buildSection(child));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        for (const rowChild of child.children) leafBundle.push(this._buildField(rowChild));\r\n      } else {\r\n        leafBundle.push(this._buildField(child));\r\n      }\r\n    }\r\n\r\n    if (leafBundle.length) sections.push(this._createBundleSection(leafBundle, children, reorderable));\r\n    return sections;\r\n  }\r\n\r\n  private _buildSection(field: FieldConfig): ConfigSectionNode {\r\n    const children = field.sectionConfig?.children ?? field.children ?? [];\r\n    const reorderable = !children.some(c => c.type === 'ROW');\r\n    const fields: ConfigFieldNode[] = [];\r\n    const subsections: ConfigSectionNode[] = [];\r\n\r\n    for (const child of children) {\r\n      if (this._isSection(child)) {\r\n        subsections.push(this._buildSection(child));\r\n      } else if (child.type === 'ROW' && child.children?.length) {\r\n        for (const rowChild of child.children) fields.push(this._buildField(rowChild));\r\n      } else {\r\n        fields.push(this._buildField(child));\r\n      }\r\n    }\r\n\r\n    // A section is locked (toggle replaced by a lock, can never be hidden) when its\r\n    // own field is locked OR any descendant field/subsection is locked — hiding the\r\n    // section would otherwise hide a field that must always stay visible. Subsection\r\n    // locks are already transitive, so checking direct children is enough.\r\n    const hasLockedDescendant =\r\n      fields.some(f => f.lockVisibility) || subsections.some(s => s.lockVisibility);\r\n    const lockVisibility = field.lockVisibility === true || hasLockedDescendant;\r\n\r\n    // Locked sections are always visible; otherwise honour the schema's flags.\r\n    const visible = lockVisibility\r\n      ? true\r\n      : (field.isEnabled ?? field.visible ?? true) && field.disabled !== true;\r\n    return {\r\n      label: field.sectionConfig?.label || field.label || field.name || 'Section',\r\n      fieldConfig: field,\r\n      sectionConfig: field.sectionConfig ?? null,\r\n      visible,\r\n      lockVisibility,\r\n      expanded: true,\r\n      fields,\r\n      subsections,\r\n      fieldsSource: children,\r\n      reorderable,\r\n    };\r\n  }\r\n\r\n  private _createBundleSection(\r\n    fields: ConfigFieldNode[],\r\n    fieldsSource: FieldConfig[],\r\n    reorderable: boolean,\r\n  ): ConfigSectionNode {\r\n    return {\r\n      label: 'Fields',\r\n      fieldConfig: null,\r\n      sectionConfig: null,\r\n      visible: true,\r\n      lockVisibility: false,\r\n      expanded: true,\r\n      fields,\r\n      subsections: [],\r\n      fieldsSource,\r\n      reorderable,\r\n    };\r\n  }\r\n\r\n  private _buildField(field: FieldConfig): ConfigFieldNode {\r\n    const visible = field.isEnabled ?? field.visible ?? true;\r\n    return {\r\n      fieldConfig: field,\r\n      label: field.label || field.name || 'Field',\r\n      type: field.type,\r\n      visible,\r\n      mandatory: visible ? field.required === true : false,\r\n      colSpan: field.colSpan ?? 12,\r\n      lockVisibility: field.lockVisibility === true,\r\n      lockMandatory: field.lockMandatory === true,\r\n      parentName: field.optionConfig?.dependencies?.['parentDataCode'],\r\n      visibilityLockedByParent: false,\r\n    };\r\n  }\r\n\r\n  private _isSection(field: FieldConfig): boolean {\r\n    return field.type === 'GROUP' || field.type === 'SUBFIELDS' || !!field.sectionConfig;\r\n  }\r\n\r\n  // ── Private: applying ─────────────────────────────────────────────────────────\r\n\r\n  private _applySection(section: ConfigSectionNode): void {\r\n    if (section.fieldConfig) {\r\n      section.fieldConfig.isEnabled = section.visible;\r\n      section.fieldConfig.visible = section.visible; // backward compatibility\r\n      section.fieldConfig.disabled = !section.visible;\r\n    }\r\n    if (section.reorderable && section.fieldsSource) {\r\n      this._reorderChildren(section.fieldsSource, section.fields);\r\n    }\r\n    for (const field of section.fields) this._applyField(field);\r\n    for (const sub of section.subsections) this._applySection(sub);\r\n  }\r\n\r\n  /**\r\n   * Rewrites `slots` in place so its leaf-field entries follow `fields`' current\r\n   * order. Section entries (GROUP/SUBFIELDS) keep their original array position —\r\n   * only the leaf fields move. Safe to call whenever `slots` contains no ROW\r\n   * (guaranteed by the `reorderable` flag the caller checks).\r\n   */\r\n  private _reorderChildren(slots: FieldConfig[], fields: ConfigFieldNode[]): void {\r\n    const orderedLeaves = fields.map(f => f.fieldConfig);\r\n    let cursor = 0;\r\n    for (let i = 0; i < slots.length; i++) {\r\n      if (!this._isSection(slots[i])) {\r\n        slots[i] = orderedLeaves[cursor++];\r\n      }\r\n    }\r\n  }\r\n\r\n  private _applyField(field: ConfigFieldNode): void {\r\n    field.fieldConfig.isEnabled = field.visible;\r\n    field.fieldConfig.visible = field.visible; // backward compatibility\r\n    field.fieldConfig.required = field.visible ? field.mandatory : false;\r\n    field.fieldConfig.colSpan = field.colSpan;\r\n  }\r\n}\r\n","import { Injectable, computed, inject, signal } from '@angular/core';\r\nimport { moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { FormSchema } from '../../smart-form/models/form-schema.model';\r\nimport { ConfigSectionNode, ConfigFieldNode } from '../models/field-configuration.models';\r\nimport { ConfigSchemaTreeService } from './config-schema-tree.service';\r\n\r\ninterface FieldConfigurationState {\r\n  sections: ConfigSectionNode[];\r\n  /** Deep clone of the input schema; node references point into this object. */\r\n  workingSchema: FormSchema | null;\r\n}\r\n\r\n/**\r\n * Signal-based store for the form-field-configuration component.\r\n * Owns the section/field tree and the visibility + mandatory toggle logic.\r\n * Provided at the component level (one store instance per configurator).\r\n */\r\n@Injectable()\r\nexport class FieldConfigurationService {\r\n  private readonly tree = inject(ConfigSchemaTreeService);\r\n\r\n  private readonly _state = signal<FieldConfigurationState>({\r\n    sections: [],\r\n    workingSchema: null,\r\n  });\r\n\r\n  readonly sections = computed(() => this._state().sections);\r\n\r\n  // ── Load ────────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Initialise from an input schema. The schema is deep-cloned so the caller's\r\n   * object is never mutated; the tree references the clone.\r\n   */\r\n  loadSchema(schema: FormSchema): void {\r\n    const workingSchema: FormSchema = JSON.parse(JSON.stringify(schema));\r\n    const parsed = this.tree.parseSchema(workingSchema);\r\n    // Apply dependency rules up-front so a schema that ships with a hidden parent\r\n    // (e.g. country off) starts with its dependents hidden + locked.\r\n    const sections = this._applyDependencyRules(parsed);\r\n    this._state.set({ sections, workingSchema });\r\n  }\r\n\r\n  // ── Mutations ─────────────────────────────────────────────────────────────────\r\n\r\n  /** Expand/collapse a section. Purely visual — does not change the schema. */\r\n  toggleSectionExpanded(path: number[]): void {\r\n    this._updateSectionAtPath(path, s => ({ ...s, expanded: !s.expanded }));\r\n  }\r\n\r\n  /**\r\n   * Toggle a section's visibility. Locked sections are ignored.\r\n   * Cascades: hiding disables every descendant field/subsection; showing\r\n   * re-enables all non-locked descendants.\r\n   */\r\n  toggleSectionVisible(path: number[]): void {\r\n    this._updateSectionAtPath(path, s => {\r\n      if (s.lockVisibility || !s.fieldConfig) return s;\r\n      const visible = !s.visible;\r\n      return this._cascadeVisibility(s, visible);\r\n    });\r\n    this._normalizeDependencies();\r\n  }\r\n\r\n  /**\r\n   * Toggle a field's visibility. Ignored for locked fields and for fields whose\r\n   * dependency parent is currently hidden (their toggle is disabled in the UI).\r\n   * Hiding a field also hides every field that depends on it (transitively).\r\n   */\r\n  toggleFieldVisible(path: number[], fieldIndex: number): void {\r\n    this._updateFieldAtPath(path, fieldIndex, f => {\r\n      if (f.lockVisibility || f.visibilityLockedByParent) return f;\r\n      const visible = !f.visible;\r\n      // \"Mandatory only if visible\" — drop the mandatory flag when hiding.\r\n      return { ...f, visible, mandatory: visible ? f.mandatory : false };\r\n    });\r\n    this._normalizeDependencies();\r\n  }\r\n\r\n  /** Toggle a field's mandatory flag. Ignored when locked or hidden. */\r\n  toggleFieldMandatory(path: number[], fieldIndex: number): void {\r\n    this._updateFieldAtPath(path, fieldIndex, f => {\r\n      if (f.lockMandatory || !f.visible) return f;\r\n      return { ...f, mandatory: !f.mandatory };\r\n    });\r\n  }\r\n\r\n  /** Set a field's column span, clamped to the 1-12 grid range. */\r\n  setFieldColSpan(path: number[], fieldIndex: number, colSpan: number): void {\r\n    const clamped = Math.min(12, Math.max(1, Math.round(colSpan) || 1));\r\n    this._updateFieldAtPath(path, fieldIndex, f => ({ ...f, colSpan: clamped }));\r\n  }\r\n\r\n  /**\r\n   * Reorder a field within its own section (drag-and-drop). Reordering is scoped to\r\n   * one section's direct fields — dragging never moves a field across sections.\r\n   * Rejected (no-op) if the move would place a field above the field it depends on\r\n   * via `optionConfig.dependencies` (e.g. a \"state\" field can never sort above the\r\n   * \"country\" field it depends on).\r\n   */\r\n  reorderField(path: number[], previousIndex: number, currentIndex: number): void {\r\n    if (previousIndex === currentIndex) return;\r\n    this._updateSectionAtPath(path, section => {\r\n      const fields = [...section.fields];\r\n      moveItemInArray(fields, previousIndex, currentIndex);\r\n      return this._isValidFieldOrder(fields) ? { ...section, fields } : section;\r\n    });\r\n  }\r\n\r\n  // ── Output ──────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Produce the updated schema. Writes the current tree state onto the working\r\n   * clone and returns a fresh deep clone (safe to hand to the host / submit).\r\n   * Returns null if no schema has been loaded.\r\n   */\r\n  buildUpdatedSchema(): FormSchema | null {\r\n    const { sections, workingSchema } = this._state();\r\n    if (!workingSchema) return null;\r\n    this.tree.applyTreeToSchema(sections);\r\n    return JSON.parse(JSON.stringify(workingSchema));\r\n  }\r\n\r\n  // ── Private helpers ─────────────────────────────────────────────────────────\r\n\r\n  private _updateSectionAtPath(\r\n    path: number[],\r\n    updater: (section: ConfigSectionNode) => ConfigSectionNode,\r\n  ): void {\r\n    this._state.update(state => ({\r\n      ...state,\r\n      sections: this._mapSectionAtPath(state.sections, path, 0, updater),\r\n    }));\r\n  }\r\n\r\n  private _updateFieldAtPath(\r\n    path: number[],\r\n    fieldIndex: number,\r\n    updater: (field: ConfigFieldNode) => ConfigFieldNode,\r\n  ): void {\r\n    this._updateSectionAtPath(path, section => ({\r\n      ...section,\r\n      fields: section.fields.map((f, i) => (i === fieldIndex ? updater(f) : f)),\r\n    }));\r\n  }\r\n\r\n  private _mapSectionAtPath(\r\n    sections: ConfigSectionNode[],\r\n    path: number[],\r\n    depth: number,\r\n    updater: (section: ConfigSectionNode) => ConfigSectionNode,\r\n  ): ConfigSectionNode[] {\r\n    return sections.map((section, i) => {\r\n      if (i !== path[depth]) return section;\r\n      if (depth === path.length - 1) return updater(section);\r\n      return {\r\n        ...section,\r\n        subsections: this._mapSectionAtPath(section.subsections, path, depth + 1, updater),\r\n      };\r\n    });\r\n  }\r\n\r\n  /** Re-apply field dependency rules to the current tree and commit the result. */\r\n  private _normalizeDependencies(): void {\r\n    this._state.update(state => ({\r\n      ...state,\r\n      sections: this._applyDependencyRules(state.sections),\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Enforce field dependencies expressed via `optionConfig.dependencies.parentDataCode`.\r\n   * A field can only be visible when its dependency parent is visible; hiding a\r\n   * parent cascades (transitively) to every dependent field. Locked-visible fields\r\n   * are never force-hidden.\r\n   *\r\n   * Returns a new tree with each field's `visible` / `mandatory` adjusted and its\r\n   * derived `visibilityLockedByParent` flag set (drives the disabled toggle in the UI).\r\n   */\r\n  private _applyDependencyRules(sections: ConfigSectionNode[]): ConfigSectionNode[] {\r\n    // 1. Gather every named field.\r\n    const allFields: ConfigFieldNode[] = [];\r\n    const collect = (secs: ConfigSectionNode[]): void => {\r\n      for (const s of secs) {\r\n        allFields.push(...s.fields);\r\n        collect(s.subsections);\r\n      }\r\n    };\r\n    collect(sections);\r\n\r\n    // 2. Resolve effective visibility to a fixed point over the parent chain.\r\n    const effective = new Map<string, boolean>();\r\n    for (const f of allFields) {\r\n      const name = f.fieldConfig.name;\r\n      if (name) effective.set(name, f.visible);\r\n    }\r\n    let changed = true;\r\n    let guard = 0;\r\n    const maxIterations = allFields.length + 2;\r\n    while (changed && guard++ < maxIterations) {\r\n      changed = false;\r\n      for (const f of allFields) {\r\n        const name = f.fieldConfig.name;\r\n        if (!name || f.lockVisibility || !f.parentName) continue;\r\n        // Parent hidden (and known) → this field must be hidden.\r\n        if (effective.get(f.parentName) === false && effective.get(name) !== false) {\r\n          effective.set(name, false);\r\n          changed = true;\r\n        }\r\n      }\r\n    }\r\n\r\n    // 3. Rebuild the tree applying the resolved visibility + lock flag.\r\n    const rebuildFields = (fields: ConfigFieldNode[]): ConfigFieldNode[] =>\r\n      fields.map(f => {\r\n        const name = f.fieldConfig.name;\r\n        const resolved = name && effective.has(name) ? effective.get(name)! : f.visible;\r\n        const newVisible = f.lockVisibility ? f.visible : resolved;\r\n        const parentHidden = !!f.parentName && effective.get(f.parentName) === false;\r\n        return {\r\n          ...f,\r\n          visible: newVisible,\r\n          mandatory: newVisible ? f.mandatory : false,\r\n          visibilityLockedByParent: parentHidden && !f.lockVisibility,\r\n        };\r\n      });\r\n    const rebuildSections = (secs: ConfigSectionNode[]): ConfigSectionNode[] =>\r\n      secs.map(s => ({\r\n        ...s,\r\n        fields: rebuildFields(s.fields),\r\n        subsections: rebuildSections(s.subsections),\r\n      }));\r\n    return rebuildSections(sections);\r\n  }\r\n\r\n  /**\r\n   * True when every field with a dependency parent (`parentName`) sorts after that\r\n   * parent within the given list. Fields whose parent isn't a sibling in this same\r\n   * list (cross-section dependency, or no such field) are unconstrained here.\r\n   */\r\n  private _isValidFieldOrder(fields: ConfigFieldNode[]): boolean {\r\n    const indexByName = new Map<string, number>();\r\n    fields.forEach((f, i) => {\r\n      const name = f.fieldConfig.name;\r\n      if (name) indexByName.set(name, i);\r\n    });\r\n    return fields.every((f, i) => {\r\n      if (!f.parentName) return true;\r\n      const parentIndex = indexByName.get(f.parentName);\r\n      return parentIndex === undefined || parentIndex < i;\r\n    });\r\n  }\r\n\r\n  /** Recursively set visibility on a section and all its descendants (respecting locks). */\r\n  private _cascadeVisibility(section: ConfigSectionNode, visible: boolean): ConfigSectionNode {\r\n    return {\r\n      ...section,\r\n      visible,\r\n      fields: section.fields.map(f =>\r\n        f.lockVisibility\r\n          ? f\r\n          : { ...f, visible, mandatory: visible ? f.mandatory : false },\r\n      ),\r\n      subsections: section.subsections.map(sub =>\r\n        sub.lockVisibility ? sub : this._cascadeVisibility(sub, visible),\r\n      ),\r\n    };\r\n  }\r\n}\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { ConfigFieldNode } from '../../models/field-configuration.models';\r\n\r\n/**\r\n * A single field row inside the form-field-configuration tree.\r\n * Shows a visibility indicator + label on the left, and a \"Mandatory\"\r\n * control + visibility toggle on the right.\r\n */\r\n@Component({\r\n  selector: 'lib-config-field-node',\r\n  standalone: false,\r\n  templateUrl: './config-field-node.component.html',\r\n  styleUrls: ['./config-field-node.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfigFieldNodeComponent {\r\n  @Input({ required: true }) field!: ConfigFieldNode;\r\n  /** Optional label translator (e.g. an ngx-translate instant fn). */\r\n  @Input() translate?: (key: string) => string;\r\n\r\n  @Output() toggleVisible = new EventEmitter<void>();\r\n  @Output() toggleMandatory = new EventEmitter<void>();\r\n  @Output() colSpanChange = new EventEmitter<number>();\r\n\r\n  get displayLabel(): string {\r\n    const label = this.field.label;\r\n    return this.translate ? this.translate(label) : label;\r\n  }\r\n\r\n  onColSpanInput(value: string): void {\r\n    const parsed = Number(value);\r\n    if (!Number.isFinite(parsed)) return;\r\n    this.colSpanChange.emit(parsed);\r\n  }\r\n}\r\n","<div\r\n  class=\"ffc-field\"\r\n  [class.ffc-field--hidden]=\"!field.visible\"\r\n  [class.ffc-field--locked]=\"field.lockVisibility\"\r\n>\r\n  <!-- Drag handle (reorder within this section) -->\r\n  <span class=\"ffc-field__grip\" title=\"Drag to reorder within this section\" aria-hidden=\"true\">\r\n    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n      <circle cx=\"8\" cy=\"5\" r=\"1.6\"></circle>\r\n      <circle cx=\"16\" cy=\"5\" r=\"1.6\"></circle>\r\n      <circle cx=\"8\" cy=\"12\" r=\"1.6\"></circle>\r\n      <circle cx=\"16\" cy=\"12\" r=\"1.6\"></circle>\r\n      <circle cx=\"8\" cy=\"19\" r=\"1.6\"></circle>\r\n      <circle cx=\"16\" cy=\"19\" r=\"1.6\"></circle>\r\n    </svg>\r\n  </span>\r\n\r\n  <!-- Visibility indicator (eye / eye-off) -->\r\n  <span class=\"ffc-field__eye\" [class.ffc-field__eye--off]=\"!field.visible\" aria-hidden=\"true\">\r\n    @if (field.visible) {\r\n      <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n        <path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"></path>\r\n        <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n      </svg>\r\n    } @else {\r\n      <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n        <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"></path>\r\n        <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>\r\n      </svg>\r\n    }\r\n  </span>\r\n\r\n  <span class=\"ffc-field__label\" [title]=\"displayLabel\">{{ displayLabel }}</span>\r\n\r\n  <!-- Column span (1-12 grid) -->\r\n  <label class=\"ffc-field__colspan\" [attr.title]=\"'Column span (1-12)'\">\r\n    <span class=\"ffc-field__colspan-text\">Col</span>\r\n    <input\r\n      type=\"number\"\r\n      min=\"1\"\r\n      max=\"12\"\r\n      step=\"1\"\r\n      class=\"ffc-field__colspan-input\"\r\n      [value]=\"field.colSpan\"\r\n      (change)=\"onColSpanInput($any($event.target).value)\"\r\n      (click)=\"$event.stopPropagation()\"\r\n      (mousedown)=\"$event.stopPropagation()\"\r\n    />\r\n  </label>\r\n\r\n  <!-- Mandatory control (only meaningful when visible) -->\r\n  <button\r\n    type=\"button\"\r\n    class=\"ffc-field__mandatory\"\r\n    [class.ffc-field__mandatory--disabled]=\"!field.visible || field.lockMandatory\"\r\n    [disabled]=\"!field.visible || field.lockMandatory\"\r\n    [attr.aria-pressed]=\"field.mandatory\"\r\n    (click)=\"toggleMandatory.emit()\"\r\n  >\r\n    <span class=\"ffc-check\" [class.ffc-check--on]=\"field.mandatory\">\r\n      <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"3.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n        <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n      </svg>\r\n    </span>\r\n    <span class=\"ffc-field__mandatory-text\">Mandatory</span>\r\n  </button>\r\n\r\n  <!-- Visibility toggle / lock -->\r\n  @if (field.lockVisibility) {\r\n    <span class=\"ffc-lock\" title=\"This field is always visible\">\r\n      <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n        <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n        <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n      </svg>\r\n    </span>\r\n  } @else {\r\n    <button\r\n      type=\"button\"\r\n      class=\"ffc-toggle\"\r\n      [class.ffc-toggle--on]=\"field.visible\"\r\n      [class.ffc-toggle--disabled]=\"field.visibilityLockedByParent\"\r\n      [disabled]=\"field.visibilityLockedByParent\"\r\n      role=\"switch\"\r\n      [attr.aria-checked]=\"field.visible\"\r\n      [attr.aria-label]=\"'Show ' + displayLabel\"\r\n      [attr.title]=\"field.visibilityLockedByParent ? 'Show the field it depends on first' : null\"\r\n      (click)=\"toggleVisible.emit()\"\r\n    >\r\n      <span class=\"ffc-toggle__thumb\"></span>\r\n    </button>\r\n  }\r\n</div>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { ConfigSectionNode } from '../../models/field-configuration.models';\r\n\r\n/** Payload for field-level events, carrying the sub-path from this section down. */\r\nexport interface FieldEventPayload {\r\n  sectionPath: number[];\r\n  fieldIndex: number;\r\n}\r\n\r\n/** Payload for a field colSpan change, carrying the sub-path from this section down. */\r\nexport interface FieldColSpanPayload extends FieldEventPayload {\r\n  colSpan: number;\r\n}\r\n\r\n/** Payload for a field drag-reorder, carrying the sub-path from this section down. */\r\nexport interface FieldReorderPayload {\r\n  sectionPath: number[];\r\n  previousIndex: number;\r\n  currentIndex: number;\r\n}\r\n\r\n/**\r\n * A recursive section/group node in the form-field-configuration tree.\r\n * Emits path-relative events that parents prefix with their own index before\r\n * bubbling up to the store.\r\n */\r\n@Component({\r\n  selector: 'lib-config-section-node',\r\n  standalone: false,\r\n  templateUrl: './config-section-node.component.html',\r\n  styleUrls: ['./config-section-node.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfigSectionNodeComponent {\r\n  @Input({ required: true }) section!: ConfigSectionNode;\r\n  @Input() depth = 0;\r\n  @Input() translate?: (key: string) => string;\r\n\r\n  /** Emits the sub-path from this node downward (empty [] for self). */\r\n  @Output() toggleVisible = new EventEmitter<number[]>();\r\n  @Output() toggleExpanded = new EventEmitter<number[]>();\r\n  @Output() fieldToggleVisible = new EventEmitter<FieldEventPayload>();\r\n  @Output() fieldToggleMandatory = new EventEmitter<FieldEventPayload>();\r\n  @Output() fieldColSpanChange = new EventEmitter<FieldColSpanPayload>();\r\n  @Output() fieldReorder = new EventEmitter<FieldReorderPayload>();\r\n\r\n  get displayLabel(): string {\r\n    return this.translate ? this.translate(this.section.label) : this.section.label;\r\n  }\r\n\r\n  get visibleFieldCount(): number {\r\n    return this.section.fields.filter(f => f.visible).length;\r\n  }\r\n\r\n  get hasToggle(): boolean {\r\n    return !!this.section.fieldConfig;\r\n  }\r\n\r\n  // ── Self events ──────────────────────────────────────────────\r\n  onToggleVisible(): void {\r\n    this.toggleVisible.emit([]);\r\n  }\r\n\r\n  onToggleExpanded(): void {\r\n    this.toggleExpanded.emit([]);\r\n  }\r\n\r\n  onFieldToggleVisible(fieldIndex: number): void {\r\n    this.fieldToggleVisible.emit({ sectionPath: [], fieldIndex });\r\n  }\r\n\r\n  onFieldToggleMandatory(fieldIndex: number): void {\r\n    this.fieldToggleMandatory.emit({ sectionPath: [], fieldIndex });\r\n  }\r\n\r\n  onFieldColSpanChange(fieldIndex: number, colSpan: number): void {\r\n    this.fieldColSpanChange.emit({ sectionPath: [], fieldIndex, colSpan });\r\n  }\r\n\r\n  onFieldDrop(event: CdkDragDrop<unknown>): void {\r\n    if (event.previousIndex === event.currentIndex) return;\r\n    this.fieldReorder.emit({\r\n      sectionPath: [],\r\n      previousIndex: event.previousIndex,\r\n      currentIndex: event.currentIndex,\r\n    });\r\n  }\r\n\r\n  // ── Subsection re-emits (prefix with the subsection index) ───\r\n  onSubToggleVisible(subIndex: number, subPath: number[]): void {\r\n    this.toggleVisible.emit([subIndex, ...subPath]);\r\n  }\r\n\r\n  onSubToggleExpanded(subIndex: number, subPath: number[]): void {\r\n    this.toggleExpanded.emit([subIndex, ...subPath]);\r\n  }\r\n\r\n  onSubFieldToggleVisible(subIndex: number, payload: FieldEventPayload): void {\r\n    this.fieldToggleVisible.emit({\r\n      sectionPath: [subIndex, ...payload.sectionPath],\r\n      fieldIndex: payload.fieldIndex,\r\n    });\r\n  }\r\n\r\n  onSubFieldToggleMandatory(subIndex: number, payload: FieldEventPayload): void {\r\n    this.fieldToggleMandatory.emit({\r\n      sectionPath: [subIndex, ...payload.sectionPath],\r\n      fieldIndex: payload.fieldIndex,\r\n    });\r\n  }\r\n\r\n  onSubFieldColSpanChange(subIndex: number, payload: FieldColSpanPayload): void {\r\n    this.fieldColSpanChange.emit({\r\n      sectionPath: [subIndex, ...payload.sectionPath],\r\n      fieldIndex: payload.fieldIndex,\r\n      colSpan: payload.colSpan,\r\n    });\r\n  }\r\n\r\n  onSubFieldReorder(subIndex: number, payload: FieldReorderPayload): void {\r\n    this.fieldReorder.emit({\r\n      sectionPath: [subIndex, ...payload.sectionPath],\r\n      previousIndex: payload.previousIndex,\r\n      currentIndex: payload.currentIndex,\r\n    });\r\n  }\r\n\r\n  trackByIndex(index: number): number {\r\n    return index;\r\n  }\r\n}\r\n","<div\r\n  class=\"ffc-section\"\r\n  [class.ffc-section--nested]=\"depth > 0\"\r\n  [class.ffc-section--hidden]=\"hasToggle && !section.visible\"\r\n>\r\n  <div class=\"ffc-section__header\">\r\n    <button\r\n      class=\"ffc-section__expand-btn\"\r\n      type=\"button\"\r\n      [attr.aria-expanded]=\"section.expanded\"\r\n      (click)=\"onToggleExpanded()\"\r\n    >\r\n      <svg\r\n        class=\"ffc-section__chevron\"\r\n        [class.ffc-section__chevron--open]=\"section.expanded\"\r\n        width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"\r\n      >\r\n        <polyline points=\"6 9 12 15 18 9\" stroke=\"currentColor\" stroke-width=\"2\"\r\n          stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n      </svg>\r\n    </button>\r\n\r\n    <span class=\"ffc-section__label\" [title]=\"displayLabel\">{{ displayLabel }}</span>\r\n\r\n    @if (section.fields.length) {\r\n      <span class=\"ffc-section__count\">{{ visibleFieldCount }}/{{ section.fields.length }} visible</span>\r\n    }\r\n\r\n    @if (hasToggle) {\r\n      @if (section.lockVisibility) {\r\n        <span class=\"ffc-lock\" title=\"This section is always visible\">\r\n          <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n            stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n            <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n            <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n          </svg>\r\n        </span>\r\n      } @else {\r\n        <button\r\n          type=\"button\"\r\n          class=\"ffc-toggle\"\r\n          [class.ffc-toggle--on]=\"section.visible\"\r\n          role=\"switch\"\r\n          [attr.aria-checked]=\"section.visible\"\r\n          [attr.aria-label]=\"'Show ' + displayLabel\"\r\n          (click)=\"onToggleVisible()\"\r\n        >\r\n          <span class=\"ffc-toggle__thumb\"></span>\r\n        </button>\r\n      }\r\n    }\r\n  </div>\r\n\r\n  @if (section.expanded) {\r\n    <div class=\"ffc-section__body\">\r\n      <div\r\n        class=\"ffc-section__fields\"\r\n        cdkDropList\r\n        [cdkDropListDisabled]=\"!section.reorderable\"\r\n        (cdkDropListDropped)=\"onFieldDrop($event)\"\r\n      >\r\n        @for (field of section.fields; track trackByIndex($index); let fi = $index) {\r\n          <lib-config-field-node\r\n            cdkDrag\r\n            [cdkDragDisabled]=\"!section.reorderable\"\r\n            [field]=\"field\"\r\n            [translate]=\"translate\"\r\n            (toggleVisible)=\"onFieldToggleVisible(fi)\"\r\n            (toggleMandatory)=\"onFieldToggleMandatory(fi)\"\r\n            (colSpanChange)=\"onFieldColSpanChange(fi, $event)\"\r\n          />\r\n        }\r\n      </div>\r\n\r\n      @for (sub of section.subsections; track trackByIndex($index); let si = $index) {\r\n        <lib-config-section-node\r\n          [section]=\"sub\"\r\n          [depth]=\"depth + 1\"\r\n          [translate]=\"translate\"\r\n          (toggleVisible)=\"onSubToggleVisible(si, $event)\"\r\n          (toggleExpanded)=\"onSubToggleExpanded(si, $event)\"\r\n          (fieldToggleVisible)=\"onSubFieldToggleVisible(si, $event)\"\r\n          (fieldToggleMandatory)=\"onSubFieldToggleMandatory(si, $event)\"\r\n          (fieldColSpanChange)=\"onSubFieldColSpanChange(si, $event)\"\r\n          (fieldReorder)=\"onSubFieldReorder(si, $event)\"\r\n        />\r\n      }\r\n    </div>\r\n  }\r\n</div>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  inject,\r\n} from '@angular/core';\r\nimport { FormSchema } from '../../../smart-form/models/form-schema.model';\r\nimport { FieldConfigurationService } from '../../services/field-configuration.service';\r\nimport {\r\n  FieldEventPayload,\r\n  FieldColSpanPayload,\r\n  FieldReorderPayload,\r\n} from '../config-section-node/config-section-node.component';\r\n\r\n/**\r\n * Form Field Configuration\r\n * ------------------------\r\n * Renders a compact tree of a form schema's sections and fields, each with a\r\n * **visibility** toggle, a **mandatory** control, an editable **column span**,\r\n * and a drag handle to **reorder** fields within their own section. Intended to\r\n * be embedded inside a `cc-confirmation-modal` on a host page (\"Configure fields\").\r\n *\r\n * Pass a `FormSchema` via `[schema]`. The input is deep-cloned, so it is never\r\n * mutated. When the user confirms, call `getUpdatedSchema()` to read back the\r\n * modified schema (visible/isEnabled/disabled, required, and colSpan flags\r\n * updated, and each section's own children reordered to match the tree).\r\n *\r\n * Fields/sections carrying `lockVisibility: true` cannot be hidden, and\r\n * `lockMandatory: true` freezes their required state.\r\n *\r\n * Reordering is scoped to one section's direct fields — a field can never be\r\n * dragged into another section, and a field can never be dragged above a field\r\n * it depends on via `optionConfig.dependencies` (e.g. \"state\" can't sort above\r\n * \"country\"). Sections whose children include a `ROW` wrapper can't be\r\n * reordered at all (dragging is disabled) to avoid flattening the row layout.\r\n *\r\n * @example\r\n * ```html\r\n * <cc-confirmation-modal [isOpen]=\"open\" (confirm)=\"save()\" (cancel)=\"open = false\">\r\n *   <lib-form-field-configuration #cfg [schema]=\"schema\" [translate]=\"translateFn\" />\r\n * </cc-confirmation-modal>\r\n * ```\r\n * ```ts\r\n * @ViewChild('cfg') cfg!: FormFieldConfigurationComponent;\r\n * save() { this.updatedSchema = this.cfg.getUpdatedSchema(); }\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'lib-form-field-configuration',\r\n  standalone: false,\r\n  providers: [FieldConfigurationService],\r\n  templateUrl: './form-field-configuration.component.html',\r\n  styleUrls: ['./form-field-configuration.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormFieldConfigurationComponent implements OnChanges {\r\n  /** The form schema to configure. Deep-cloned internally; never mutated. */\r\n  @Input({ required: true }) schema!: FormSchema;\r\n\r\n  /** Optional label translator, e.g. an ngx-translate `instant` function. */\r\n  @Input() translate?: (key: string) => string;\r\n\r\n  /** Show the \"Visible / Mandatory (only if visible)\" legend row. Default true. */\r\n  @Input() showLegend = true;\r\n\r\n  protected readonly store = inject(FieldConfigurationService);\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['schema'] && this.schema) {\r\n      this.store.loadSchema(this.schema);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns a fresh, modified copy of the schema with the current\r\n   * visibility/mandatory selections applied. Returns null if no schema loaded.\r\n   */\r\n  getUpdatedSchema(): FormSchema | null {\r\n    return this.store.buildUpdatedSchema();\r\n  }\r\n\r\n  // ── Event wiring (prefix top-level section index → store) ───────\r\n  onToggleVisible(sectionIndex: number, subPath: number[]): void {\r\n    this.store.toggleSectionVisible([sectionIndex, ...subPath]);\r\n  }\r\n\r\n  onToggleExpanded(sectionIndex: number, subPath: number[]): void {\r\n    this.store.toggleSectionExpanded([sectionIndex, ...subPath]);\r\n  }\r\n\r\n  onFieldToggleVisible(sectionIndex: number, payload: FieldEventPayload): void {\r\n    this.store.toggleFieldVisible([sectionIndex, ...payload.sectionPath], payload.fieldIndex);\r\n  }\r\n\r\n  onFieldToggleMandatory(sectionIndex: number, payload: FieldEventPayload): void {\r\n    this.store.toggleFieldMandatory([sectionIndex, ...payload.sectionPath], payload.fieldIndex);\r\n  }\r\n\r\n  onFieldColSpanChange(sectionIndex: number, payload: FieldColSpanPayload): void {\r\n    this.store.setFieldColSpan([sectionIndex, ...payload.sectionPath], payload.fieldIndex, payload.colSpan);\r\n  }\r\n\r\n  onFieldReorder(sectionIndex: number, payload: FieldReorderPayload): void {\r\n    this.store.reorderField([sectionIndex, ...payload.sectionPath], payload.previousIndex, payload.currentIndex);\r\n  }\r\n\r\n  trackByIndex(index: number): number {\r\n    return index;\r\n  }\r\n}\r\n","<div class=\"ffc-root\">\r\n  @if (showLegend) {\r\n    <div class=\"ffc-legend\">\r\n      <span class=\"ffc-legend__item\">\r\n        <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n          stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n          <path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"></path>\r\n          <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n        </svg>\r\n        <span>Visible</span>\r\n      </span>\r\n      <span class=\"ffc-legend__item\">\r\n        <span class=\"ffc-legend__asterisk\" aria-hidden=\"true\">&#10033;</span>\r\n        <span>Mandatory (only if visible)</span>\r\n      </span>\r\n    </div>\r\n  }\r\n\r\n  <div class=\"ffc-tree\">\r\n    @for (section of store.sections(); track trackByIndex($index); let si = $index) {\r\n      <lib-config-section-node\r\n        [section]=\"section\"\r\n        [depth]=\"0\"\r\n        [translate]=\"translate\"\r\n        (toggleVisible)=\"onToggleVisible(si, $event)\"\r\n        (toggleExpanded)=\"onToggleExpanded(si, $event)\"\r\n        (fieldToggleVisible)=\"onFieldToggleVisible(si, $event)\"\r\n        (fieldToggleMandatory)=\"onFieldToggleMandatory(si, $event)\"\r\n        (fieldColSpanChange)=\"onFieldColSpanChange(si, $event)\"\r\n        (fieldReorder)=\"onFieldReorder(si, $event)\"\r\n      />\r\n    }\r\n\r\n    @if (store.sections().length === 0) {\r\n      <div class=\"ffc-empty\">\r\n        <p>No sections or fields found in the schema.</p>\r\n      </div>\r\n    }\r\n  </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nimport { FormFieldConfigurationComponent } from './components/form-field-configuration/form-field-configuration.component';\r\nimport { ConfigSectionNodeComponent } from './components/config-section-node/config-section-node.component';\r\nimport { ConfigFieldNodeComponent } from './components/config-field-node/config-field-node.component';\r\n\r\nconst COMPONENTS = [\r\n  FormFieldConfigurationComponent,\r\n  ConfigSectionNodeComponent,\r\n  ConfigFieldNodeComponent,\r\n];\r\n\r\n@NgModule({\r\n  declarations: [...COMPONENTS],\r\n  imports: [\r\n    CommonModule,\r\n    DragDropModule,\r\n  ],\r\n  exports: [\r\n    FormFieldConfigurationComponent,\r\n  ],\r\n})\r\nexport class FormFieldConfigurationModule {}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport { moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { TableColumn, TableConfig } from '../../smart-table/models/table-config.model';\r\nimport { ConfigColumnNode } from '../models/table-column-configuration.models';\r\n\r\ninterface TableColumnConfigurationState {\r\n  columns: ConfigColumnNode[];\r\n  /** Deep clone of the input config; node references point into this object. */\r\n  workingConfig: TableConfig | null;\r\n}\r\n\r\n/**\r\n * Signal-based store for the table-column-configuration component.\r\n * Owns the column list and the visibility toggle logic.\r\n * Provided at the component level (one store instance per configurator).\r\n */\r\n@Injectable()\r\nexport class TableColumnConfigurationService {\r\n  private readonly _state = signal<TableColumnConfigurationState>({\r\n    columns: [],\r\n    workingConfig: null,\r\n  });\r\n\r\n  readonly columns = computed(() => this._state().columns);\r\n\r\n  // ── Load ──────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Initialise from an input table config. The config is deep-cloned so the\r\n   * caller's object is never mutated; the nodes reference the clone.\r\n   */\r\n  loadConfig(config: TableConfig): void {\r\n    const workingConfig: TableConfig = JSON.parse(JSON.stringify(config));\r\n    workingConfig.columns = this._sortBySequence(workingConfig.columns ?? []);\r\n    const columns = workingConfig.columns.map(col => this._buildColumn(col));\r\n    this._state.set({ columns, workingConfig });\r\n  }\r\n\r\n  // ── Mutations ─────────────────────────────────────────────────────────────\r\n\r\n  /** Toggle a column's visibility. Locked columns are ignored. */\r\n  toggleColumnVisible(index: number): void {\r\n    this._state.update(state => ({\r\n      ...state,\r\n      columns: state.columns.map((c, i) =>\r\n        i === index && !c.lockVisibility ? { ...c, visible: !c.visible } : c,\r\n      ),\r\n    }));\r\n  }\r\n\r\n  /** Move a column from `previousIndex` to `currentIndex` (drag-and-drop reorder). */\r\n  reorderColumn(previousIndex: number, currentIndex: number): void {\r\n    this._state.update(state => {\r\n      const columns = [...state.columns];\r\n      moveItemInArray(columns, previousIndex, currentIndex);\r\n      return { ...state, columns };\r\n    });\r\n  }\r\n\r\n  // ── Output ────────────────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Produce the updated config. Writes the current node state onto the working\r\n   * clone and returns a fresh deep clone (safe to hand to the host / persist).\r\n   * Returns null if no config has been loaded.\r\n   */\r\n  buildUpdatedConfig(): TableConfig | null {\r\n    const { columns, workingConfig } = this._state();\r\n    if (!workingConfig) return null;\r\n    columns.forEach((node, index) => {\r\n      node.column.isEnabled = node.visible;\r\n      node.column.visible = node.visible; // backward compatibility\r\n      node.column.sequence = index;\r\n    });\r\n    // Keep the working config's columns array in sync with the (possibly reordered) node list.\r\n    workingConfig.columns = columns.map(node => node.column);\r\n    return JSON.parse(JSON.stringify(workingConfig));\r\n  }\r\n\r\n  // ── Private helpers ─────────────────────────────────────────────────────────\r\n\r\n  private _buildColumn(column: TableColumn): ConfigColumnNode {\r\n    const visible = column.isEnabled ?? column.visible ?? true;\r\n    return {\r\n      column,\r\n      label: column.label || column.key || 'Column',\r\n      visible,\r\n      lockVisibility: column.lockVisibility === true,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Orders columns by `sequence` (ascending). Columns without a `sequence` keep their\r\n   * original relative order, placed after any columns that do have one — so configs that\r\n   * never set `sequence` come back untouched (stable sort).\r\n   */\r\n  private _sortBySequence(columns: TableColumn[]): TableColumn[] {\r\n    const hasSequence = columns.some(c => c.sequence !== undefined && c.sequence !== null);\r\n    if (!hasSequence) return columns;\r\n    return [...columns].sort((a, b) => {\r\n      const aSeq = a.sequence ?? Number.MAX_SAFE_INTEGER;\r\n      const bSeq = b.sequence ?? Number.MAX_SAFE_INTEGER;\r\n      return aSeq - bSeq;\r\n    });\r\n  }\r\n}\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n} from '@angular/core';\r\nimport { ConfigColumnNode } from '../../models/table-column-configuration.models';\r\n\r\n/**\r\n * A single column row inside the table-column-configuration list.\r\n * Shows a visibility indicator + column name on the left and a visibility\r\n * toggle (or a lock, when the column is locked visible) on the right.\r\n */\r\n@Component({\r\n  selector: 'lib-config-column-node',\r\n  standalone: false,\r\n  templateUrl: './config-column-node.component.html',\r\n  styleUrls: ['./config-column-node.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfigColumnNodeComponent {\r\n  @Input({ required: true }) column!: ConfigColumnNode;\r\n  /** Optional label translator (e.g. an ngx-translate instant fn). */\r\n  @Input() translate?: (key: string) => string;\r\n\r\n  @Output() toggleVisible = new EventEmitter<void>();\r\n\r\n  get displayLabel(): string {\r\n    const label = this.column.label;\r\n    return this.translate ? this.translate(label) : label;\r\n  }\r\n}\r\n","<div\r\n  class=\"tcc-col\"\r\n  [class.tcc-col--hidden]=\"!column.visible\"\r\n  [class.tcc-col--locked]=\"column.lockVisibility\"\r\n>\r\n  <!-- Drag handle (reorder via the sequence field) -->\r\n  <span class=\"tcc-col__grip\" title=\"Drag to reorder\" aria-hidden=\"true\">\r\n    <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n      <circle cx=\"8\" cy=\"5\" r=\"1.6\"></circle>\r\n      <circle cx=\"16\" cy=\"5\" r=\"1.6\"></circle>\r\n      <circle cx=\"8\" cy=\"12\" r=\"1.6\"></circle>\r\n      <circle cx=\"16\" cy=\"12\" r=\"1.6\"></circle>\r\n      <circle cx=\"8\" cy=\"19\" r=\"1.6\"></circle>\r\n      <circle cx=\"16\" cy=\"19\" r=\"1.6\"></circle>\r\n    </svg>\r\n  </span>\r\n\r\n  <!-- Visibility indicator (eye / eye-off) -->\r\n  <span class=\"tcc-col__eye\" [class.tcc-col__eye--off]=\"!column.visible\" aria-hidden=\"true\">\r\n    @if (column.visible) {\r\n      <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n        <path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"></path>\r\n        <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n      </svg>\r\n    } @else {\r\n      <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n        <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"></path>\r\n        <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"></line>\r\n      </svg>\r\n    }\r\n  </span>\r\n\r\n  <span class=\"tcc-col__label\" [title]=\"displayLabel\">{{ displayLabel }}</span>\r\n\r\n  <!-- Visibility toggle / lock -->\r\n  @if (column.lockVisibility) {\r\n    <span class=\"tcc-lock\" title=\"This column is always visible\">\r\n      <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n        stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n        <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\r\n        <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\r\n      </svg>\r\n    </span>\r\n  } @else {\r\n    <button\r\n      type=\"button\"\r\n      class=\"tcc-toggle\"\r\n      [class.tcc-toggle--on]=\"column.visible\"\r\n      role=\"switch\"\r\n      [attr.aria-checked]=\"column.visible\"\r\n      [attr.aria-label]=\"'Show ' + displayLabel\"\r\n      (click)=\"toggleVisible.emit()\"\r\n    >\r\n      <span class=\"tcc-toggle__thumb\"></span>\r\n    </button>\r\n  }\r\n</div>\r\n","import {\r\n  Component,\r\n  ChangeDetectionStrategy,\r\n  Input,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  inject,\r\n} from '@angular/core';\r\nimport { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { TableConfig } from '../../../smart-table/models/table-config.model';\r\nimport { TableColumnConfigurationService } from '../../services/table-column-configuration.service';\r\nimport { ConfigColumnNode } from '../../models/table-column-configuration.models';\r\n\r\n/**\r\n * Table Column Configuration\r\n * --------------------------\r\n * Renders a compact list of a table config's columns, each with a **visibility**\r\n * toggle and a drag handle for **reordering**. Intended to be embedded inside a\r\n * `cc-confirmation-modal` on a host page (\"Configure columns\").\r\n *\r\n * Pass a `TableConfig` via `[config]`. The input is deep-cloned, so it is never\r\n * mutated. Columns load pre-sorted by `sequence` (if set); columns without a\r\n * `sequence` keep their original relative order. When the user confirms, call\r\n * `getUpdatedConfig()` to read back the modified config (isEnabled/visible flags\r\n * and `sequence` updated per column, in the new order).\r\n *\r\n * Columns carrying `lockVisibility: true` cannot be hidden — their toggle is\r\n * replaced by a lock icon. They can still be dragged to reorder.\r\n *\r\n * @example\r\n * ```html\r\n * <cc-confirmation-modal [isOpen]=\"open\" (confirm)=\"save()\" (cancel)=\"open = false\">\r\n *   <lib-table-column-configuration #cfg [config]=\"tableConfig\" [translate]=\"translateFn\" />\r\n * </cc-confirmation-modal>\r\n * ```\r\n * ```ts\r\n * @ViewChild('cfg') cfg!: TableColumnConfigurationComponent;\r\n * save() { this.updatedConfig = this.cfg.getUpdatedConfig(); }\r\n * ```\r\n */\r\n@Component({\r\n  selector: 'lib-table-column-configuration',\r\n  standalone: false,\r\n  providers: [TableColumnConfigurationService],\r\n  templateUrl: './table-column-configuration.component.html',\r\n  styleUrls: ['./table-column-configuration.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TableColumnConfigurationComponent implements OnChanges {\r\n  /** The table config to configure. Deep-cloned internally; never mutated. */\r\n  @Input({ required: true }) config!: TableConfig;\r\n\r\n  /** Optional label translator, e.g. an ngx-translate `instant` function. */\r\n  @Input() translate?: (key: string) => string;\r\n\r\n  /** Show the \"Visible\" legend row. Default true. */\r\n  @Input() showLegend = true;\r\n\r\n  protected readonly store = inject(TableColumnConfigurationService);\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['config'] && this.config) {\r\n      this.store.loadConfig(this.config);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Returns a fresh, modified copy of the config with the current visibility\r\n   * selections applied. Returns null if no config has been loaded.\r\n   */\r\n  getUpdatedConfig(): TableConfig | null {\r\n    return this.store.buildUpdatedConfig();\r\n  }\r\n\r\n  onToggleVisible(index: number): void {\r\n    this.store.toggleColumnVisible(index);\r\n  }\r\n\r\n  /** Drag-and-drop reorder. Written back as `sequence` on each column by `getUpdatedConfig()`. */\r\n  onDrop(event: CdkDragDrop<ConfigColumnNode[]>): void {\r\n    if (event.previousIndex === event.currentIndex) return;\r\n    this.store.reorderColumn(event.previousIndex, event.currentIndex);\r\n  }\r\n\r\n  trackByIndex(index: number): number {\r\n    return index;\r\n  }\r\n}\r\n","<div class=\"tcc-root\">\r\n  @if (showLegend) {\r\n    <div class=\"tcc-legend\">\r\n      <span class=\"tcc-legend__item\">\r\n        <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n          stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\r\n          <path d=\"M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z\"></path>\r\n          <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n        </svg>\r\n        <span>Visible</span>\r\n      </span>\r\n    </div>\r\n  }\r\n\r\n  <div class=\"tcc-list\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n    @for (column of store.columns(); track trackByIndex($index); let ci = $index) {\r\n      <lib-config-column-node\r\n        cdkDrag\r\n        [column]=\"column\"\r\n        [translate]=\"translate\"\r\n        (toggleVisible)=\"onToggleVisible(ci)\"\r\n      />\r\n    }\r\n\r\n    @if (store.columns().length === 0) {\r\n      <div class=\"tcc-empty\">\r\n        <p>No columns found in the config.</p>\r\n      </div>\r\n    }\r\n  </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nimport { TableColumnConfigurationComponent } from './components/table-column-configuration/table-column-configuration.component';\r\nimport { ConfigColumnNodeComponent } from './components/config-column-node/config-column-node.component';\r\n\r\nconst COMPONENTS = [\r\n  TableColumnConfigurationComponent,\r\n  ConfigColumnNodeComponent,\r\n];\r\n\r\n@NgModule({\r\n  declarations: [...COMPONENTS],\r\n  imports: [\r\n    CommonModule,\r\n    DragDropModule,\r\n  ],\r\n  exports: [\r\n    TableColumnConfigurationComponent,\r\n  ],\r\n})\r\nexport class TableColumnConfigurationModule {}\r\n","import {\r\n    Component,\r\n    Input,\r\n    Output,\r\n    EventEmitter,\r\n    OnInit,\r\n    OnDestroy,\r\n    HostListener\r\n} from '@angular/core';\r\nimport { ConfirmationModalConfig } from '../../confirmation-modal.models';\r\n\r\n@Component({\r\n    selector: 'cc-confirmation-modal',\r\n    templateUrl: './confirmation-modal.component.html',\r\n    styleUrls: ['./confirmation-modal.component.scss'],\r\n    standalone: false\r\n})\r\nexport class ConfirmationModalComponent implements OnInit, OnDestroy {\r\n    @Input() config!: ConfirmationModalConfig;\r\n    @Input() isOpen = false;\r\n    @Input() confirmDisabled = false;\r\n    @Input() confirmLoading = false;\r\n\r\n    @Output() confirm = new EventEmitter<void>();\r\n    @Output() cancel = new EventEmitter<void>();\r\n    @Output() close = new EventEmitter<void>();\r\n    @Output() showCodeSnippet = new EventEmitter<void>();\r\n\r\n    // Default configuration\r\n    private defaultConfig: Partial<ConfirmationModalConfig> = {\r\n        headerTheme: 'dark', // Changed to dark as per new default requirement\r\n        width: '560px',\r\n        size: 'md',\r\n        type: 'modal',\r\n        panelPosition: 'right',\r\n        panelSpacing: '0px',\r\n        closeOnBackdrop: true,\r\n        closeOnEsc: true,\r\n        showCloseButton: true,\r\n        cancelButton: {\r\n            label: '',\r\n            show: true\r\n        }\r\n    };\r\n\r\n    mergedConfig!: ConfirmationModalConfig;\r\n    private previousActiveElement: HTMLElement | null = null;\r\n    private isSubmitting = false;\r\n    private _resetSubmittingTimer?: ReturnType<typeof setTimeout>;\r\n\r\n    ngOnInit(): void {\r\n        this.updateConfig();\r\n        // Store currently focused element\r\n        this.previousActiveElement = document.activeElement as HTMLElement;\r\n\r\n        // Prevent body scroll when modal is open\r\n        if (this.isOpen) {\r\n            this.toggleBodyScroll(true);\r\n        }\r\n    }\r\n\r\n    ngOnChanges(): void {\r\n        this.updateConfig();\r\n        if (this.isOpen !== undefined) {\r\n            this.toggleBodyScroll(this.isOpen);\r\n            if (!this.isOpen) {\r\n                this.isSubmitting = false; // Reset submission guard when modal closes\r\n            }\r\n        }\r\n        // Reset submission guard when loading state finishes\r\n        if (this.isSubmitting && !this.confirmLoading && !this.mergedConfig.confirmButton.loading) {\r\n            this.isSubmitting = false;\r\n        }\r\n    }\r\n\r\n    private updateConfig(): void {\r\n        if (!this.config) {\r\n            this.mergedConfig = { ...this.defaultConfig } as ConfirmationModalConfig;\r\n            return;\r\n        }\r\n\r\n        // Merge user config with defaults\r\n        this.mergedConfig = {\r\n            ...this.defaultConfig,\r\n            ...this.config,\r\n            cancelButton: {\r\n                ...this.defaultConfig.cancelButton,\r\n                ...this.config.cancelButton\r\n            },\r\n            confirmButton: {\r\n                ...this.config.confirmButton\r\n            }\r\n        };\r\n\r\n        if (this.mergedConfig.confirmButton) {\r\n            // Logic handled by input/flag\r\n        }\r\n    }\r\n\r\n    ngOnDestroy(): void {\r\n        clearTimeout(this._resetSubmittingTimer);\r\n\r\n        // Restore body scroll\r\n        this.toggleBodyScroll(false);\r\n\r\n        // Restore focus to previous element\r\n        if (this.previousActiveElement) {\r\n            this.previousActiveElement.focus();\r\n        }\r\n    }\r\n\r\n    private toggleBodyScroll(disable: boolean): void {\r\n        if (disable) {\r\n            document.body.style.overflow = 'hidden';\r\n        } else {\r\n            document.body.style.overflow = '';\r\n        }\r\n    }\r\n\r\n    @HostListener('document:keydown.escape', ['$event'])\r\n    handleEscape(event: KeyboardEvent): void {\r\n        if (this.isOpen && this.mergedConfig.closeOnEsc) {\r\n            event.preventDefault();\r\n            this.onClose();\r\n        }\r\n    }\r\n\r\n    onBackdropClick(event: MouseEvent): void {\r\n        // Only close if clicking directly on backdrop, not modal content\r\n        if (\r\n            this.mergedConfig.closeOnBackdrop &&\r\n            event.target === event.currentTarget\r\n        ) {\r\n            this.onClose();\r\n        }\r\n    }\r\n\r\n    onConfirm(): void {\r\n        const isDisabled = this.confirmDisabled || this.mergedConfig.confirmButton.disabled;\r\n        const isLoading = this.confirmLoading || this.mergedConfig.confirmButton.loading;\r\n\r\n        if (!isDisabled && !isLoading && !this.isSubmitting) {\r\n            this.isSubmitting = true;\r\n            this.confirm.emit();\r\n            // If the parent doesn't start loading within 300 ms (e.g. because client-side\r\n            // validation failed and no API call was made), reset the guard so the user\r\n            // can correct the form and try again.\r\n            clearTimeout(this._resetSubmittingTimer);\r\n            this._resetSubmittingTimer = setTimeout(() => {\r\n                if (!this.confirmLoading && !this.mergedConfig?.confirmButton?.loading) {\r\n                    this.isSubmitting = false;\r\n                }\r\n            }, 300);\r\n        }\r\n    }\r\n\r\n    onCancel(): void {\r\n        this.cancel.emit();\r\n    }\r\n\r\n    onClose(): void {\r\n        this.close.emit();\r\n    }\r\n\r\n    onShowCodeSnippet(): void {\r\n        this.showCodeSnippet.emit();\r\n    }\r\n\r\n    getModalWidth(): string {\r\n        if (this.mergedConfig.type === 'side-panel') {\r\n            return this.mergedConfig.panelWidth || this.mergedConfig.width || '400px';\r\n        }\r\n        if (this.mergedConfig.size) {\r\n            const sizeMap: Record<string, string> = {\r\n                sm: '400px',\r\n                md: '560px',\r\n                lg: '720px',\r\n                xl: '1200px'\r\n            };\r\n            return sizeMap[this.mergedConfig.size];\r\n        }\r\n        return this.mergedConfig.width || '560px';\r\n    }\r\n\r\n    getModalStyles(): any {\r\n        const styles: any = {};\r\n        const config = this.mergedConfig;\r\n\r\n        if (config.type === 'side-panel') {\r\n            const spacing = config.panelSpacing || '0px';\r\n            const pos = config.panelPosition || 'right';\r\n            \r\n            // Set position and spacing\r\n            styles.position = 'fixed';\r\n            styles.top = spacing;\r\n            styles.bottom = spacing;\r\n            styles[pos] = spacing;\r\n            \r\n            // Set dimensions\r\n            if (pos === 'left' || pos === 'right') {\r\n                styles.width = this.getModalWidth();\r\n                styles.height = config.panelHeight || `calc(100% - (${spacing} * 2))`;\r\n            } else {\r\n                styles.height = config.panelHeight || 'auto';\r\n                styles.width = config.panelWidth || `calc(100% - (${spacing} * 2))`;\r\n                styles.left = spacing;\r\n                styles.right = spacing;\r\n                if (pos === 'top') {\r\n                    styles.bottom = 'auto';\r\n                } else {\r\n                    styles.top = 'auto';\r\n                }\r\n            }\r\n            \r\n            // Visual enhancements for panel\r\n            styles['border-radius'] = config.borderRadius || '12px';\r\n            styles['box-shadow'] = '0 10px 40px rgba(0,0,0,0.15)';\r\n        } else {\r\n            // Modal mode\r\n            styles.width = this.getModalWidth();\r\n            if (config.backgroundColor) styles['background-color'] = config.backgroundColor;\r\n            if (config.borderRadius) styles['border-radius'] = config.borderRadius;\r\n            if (config.padding) styles.padding = config.padding;\r\n        }\r\n\r\n        return styles;\r\n    }\r\n\r\n    getConfirmButtonClass(): string {\r\n        const typeMap: Record<string, string> = {\r\n            primary: 'cc-btn-primary',\r\n            danger: 'cc-btn-danger',\r\n            warning: 'cc-btn-warning'\r\n        };\r\n        const isLoading = this.confirmLoading || this.mergedConfig.confirmButton.loading;\r\n        return `cc-btn ${typeMap[this.mergedConfig.confirmButton.type]} ${isLoading ? 'cc-btn-loading' : ''}`;\r\n    }\r\n\r\n    getHeaderClass(): string {\r\n        return `modal-header modal-header--${this.mergedConfig.headerTheme}`;\r\n    }\r\n\r\n    resolveIconType(icon: any): 'material' | 'custom' | 'img' {\r\n        if (typeof icon === 'string') {\r\n            if (icon.includes('/') || icon.includes('.') || icon.startsWith('http')) {\r\n                return 'img';\r\n            }\r\n            return 'material';\r\n        }\r\n        if (icon && typeof icon === 'object') {\r\n            if (icon.type === 'custom' || (icon.value && (icon.value.includes('/') || icon.value.includes('.') || icon.value.startsWith('http')))) {\r\n                return 'custom';\r\n            }\r\n            return icon.type || 'material';\r\n        }\r\n        return 'material';\r\n    }\r\n\r\n    getIconValue(icon: any): string {\r\n        return typeof icon === 'string' ? icon : icon?.value;\r\n    }\r\n\r\n    getIconColor(icon: any): string | undefined {\r\n        return typeof icon === 'object' ? icon.color : undefined;\r\n    }\r\n}\r\n","<div *ngIf=\"isOpen\" class=\"cc-modal-backdrop\" \r\n    [ngClass]=\"{'cc-modal-backdrop--side-panel': mergedConfig.type === 'side-panel'}\"\r\n    (click)=\"onBackdropClick($event)\" role=\"dialog\" [attr.aria-modal]=\"true\"\r\n    [attr.aria-labelledby]=\"'modal-title-' + mergedConfig.title\" [attr.aria-label]=\"mergedConfig.ariaLabel\"\r\n    [attr.aria-describedby]=\"mergedConfig.ariaDescribedBy\">\r\n\r\n    <div class=\"cc-modal-container {{ mergedConfig.customClass }}\" \r\n        [ngClass]=\"{'side-panel': mergedConfig.type === 'side-panel'}\"\r\n        [ngStyle]=\"getModalStyles()\" (click)=\"$event.stopPropagation()\">\r\n\r\n        <!-- Header -->\r\n        <div [ngClass]=\"getHeaderClass()\" [style.background-color]=\"mergedConfig.headerBackgroundColor\"\r\n            [style.border-bottom]=\"mergedConfig.headerBorderBottom\">\r\n            <div class=\"modal-header__content\">\r\n                <!-- Icon (Optional) -->\r\n                <span *ngIf=\"mergedConfig.icon\" class=\"modal-header__icon\">\r\n                    <ng-container [ngSwitch]=\"resolveIconType(mergedConfig.icon)\">\r\n                        <mat-icon *ngSwitchCase=\"'material'\" [style.color]=\"getIconColor(mergedConfig.icon)\">\r\n                            {{ getIconValue(mergedConfig.icon) }}\r\n                        </mat-icon>\r\n                        <img *ngSwitchCase=\"'custom'\" [src]=\"getIconValue(mergedConfig.icon)\"\r\n                            [attr.alt]=\"mergedConfig.labels?.iconAltText || mergedConfig.title + ' icon'\"\r\n                            class=\"modal-header__custom-icon\">\r\n                        <img *ngSwitchCase=\"'img'\" [src]=\"getIconValue(mergedConfig.icon)\"\r\n                            [attr.alt]=\"mergedConfig.labels?.iconAltText || mergedConfig.title + ' icon'\"\r\n                            class=\"modal-header__custom-icon\">\r\n                    </ng-container>\r\n                </span>\r\n\r\n                <!-- Title -->\r\n                <h2 class=\"modal-header__title\" [id]=\"'modal-title-' + mergedConfig.title\"\r\n                    [style.color]=\"mergedConfig.headerTextColor\">\r\n                    {{ mergedConfig.title }}\r\n                </h2>\r\n            </div>\r\n\r\n            <!-- Code Snippet Button -->\r\n            <button *ngIf=\"mergedConfig.showCodeSnippetButton\" type=\"button\" class=\"modal-header__code-btn\"\r\n                (click)=\"onShowCodeSnippet()\" [attr.aria-label]=\"mergedConfig.labels?.codeSnippetAriaLabel\"\r\n                [attr.title]=\"mergedConfig.labels?.codeSnippetTitle\">\r\n                <mat-icon>code</mat-icon>\r\n            </button>\r\n\r\n            <!-- Close Button -->\r\n            <button *ngIf=\"mergedConfig.showCloseButton\" type=\"button\" class=\"modal-header__close\" (click)=\"onClose()\"\r\n                [attr.aria-label]=\"mergedConfig.labels?.closeAriaLabel\">\r\n                <mat-icon>close</mat-icon>\r\n            </button>\r\n        </div>\r\n\r\n        <!-- Body (Content Projection) -->\r\n        <div class=\"cc-modal-body\" [ngClass]=\"{'cc-modal-body--form-mode': mergedConfig.formMode}\" [style.padding]=\"mergedConfig.padding\" [style.color]=\"mergedConfig.bodyTextColor\">\r\n            <ng-content></ng-content>\r\n        </div>\r\n\r\n        <!-- Footer -->\r\n        <div class=\"cc-modal-footer\" [style.background-color]=\"mergedConfig.footerBackgroundColor\"\r\n            [style.border-top]=\"mergedConfig.footerBorderTop\">\r\n\r\n            <ng-container *ngIf=\"!mergedConfig.customFooter\">\r\n                <button *ngIf=\"mergedConfig.cancelButton?.show\" type=\"button\" class=\"cc-btn cc-btn-secondary\"\r\n                    (click)=\"onCancel()\">\r\n                    {{ mergedConfig.cancelButton?.label }}\r\n                </button>\r\n\r\n                <button type=\"button\" [ngClass]=\"getConfirmButtonClass()\"\r\n                    [disabled]=\"confirmDisabled || mergedConfig.confirmButton.disabled || confirmLoading || mergedConfig.confirmButton.loading\"\r\n                    (click)=\"onConfirm()\">\r\n                    <span *ngIf=\"confirmLoading || mergedConfig.confirmButton.loading\" class=\"cc-btn-spinner\"></span>\r\n                    {{ mergedConfig.confirmButton.label }}\r\n                </button>\r\n            </ng-container>\r\n\r\n            <ng-content select=\"[cc-modal-footer]\"></ng-content>\r\n        </div>\r\n    </div>\r\n</div>","import {\r\n    Component,\r\n    Input,\r\n    Output,\r\n    EventEmitter,\r\n    HostListener,\r\n    ElementRef\r\n} from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { DropdownAction } from '../../button-dropdown.models';\r\nimport { ButtonVariant } from '../../../button/button.models';\r\nimport { ConfirmationModalConfig } from '../../../confirmation-modal/confirmation-modal.models';\r\n\r\n@Component({\r\n    selector: 'lib-button-dropdown',\r\n    templateUrl: './button-dropdown.component.html',\r\n    styleUrls: ['./button-dropdown.component.scss'],\r\n    standalone: false\r\n})\r\nexport class ButtonDropdownComponent {\r\n    @Input() label: string = 'Actions';\r\n    @Input() variant: ButtonVariant = 'primary';\r\n    @Input() menuTheme: 'light' | 'dark' = 'light';\r\n    @Input() icon: string = 'fa fa-chevron-down';\r\n    @Input() actions: DropdownAction[] = [];\r\n    @Input() data: any = null;\r\n    @Input() disabled: boolean = false;\r\n\r\n    @Output() apiActionStart = new EventEmitter<DropdownAction>();\r\n    @Output() apiActionSuccess = new EventEmitter<{ action: DropdownAction, response: any }>();\r\n    @Output() apiActionError = new EventEmitter<{ action: DropdownAction, error: any }>();\r\n    @Output() actionClick = new EventEmitter<{ action: DropdownAction, data: any }>();\r\n\r\n    isOpen = false;\r\n    isConfirmModalOpen = false;\r\n    pendingAction: DropdownAction | null = null;\r\n    confirmConfig: ConfirmationModalConfig | null = null;\r\n    confirmMessage: string = '';\r\n\r\n    constructor(\r\n        private elementRef: ElementRef,\r\n        private router: Router,\r\n        private http: HttpClient\r\n    ) {}\r\n\r\n    @HostListener('document:click', ['$event'])\r\n    onClickOutside(event: Event) {\r\n        if (!this.elementRef.nativeElement.contains(event.target)) {\r\n            this.isOpen = false;\r\n        }\r\n    }\r\n\r\n    toggleDropdown(event: Event) {\r\n        if (this.disabled) return;\r\n        event.stopPropagation();\r\n        this.isOpen = !this.isOpen;\r\n    }\r\n\r\n    onActionItemClick(action: DropdownAction, event: Event) {\r\n        event.stopPropagation();\r\n        this.isOpen = false;\r\n\r\n        if (action.disabled) return;\r\n\r\n        if (action.confirmationNeeded) {\r\n            this.pendingAction = action;\r\n            \r\n            // Smart inference for \"delete\" actions\r\n            const isDelete = action.apiMethod === 'DELETE' || \r\n                             action.variant === 'danger' || \r\n                             action.color === 'red' || \r\n                             action.label.toLowerCase().includes('delete');\r\n            \r\n            // Apply intelligent fallbacks based on action intent\r\n            this.confirmMessage = action.confirmationMessage || (isDelete \r\n                ? 'Are you sure you want to delete this item? This action cannot be undone.' \r\n                : 'Are you sure you want to proceed?');\r\n                \r\n            this.confirmConfig = {\r\n                title: action.confirmationTitle || (isDelete ? 'Confirm Deletion' : 'Please Confirm'),\r\n                icon: { type: 'material', value: 'warning', color: isDelete ? '#E63E30' : '#F9C80E' },\r\n                confirmButton: {\r\n                    label: isDelete ? 'Delete' : 'Confirm',\r\n                    type: isDelete ? 'danger' : 'primary'\r\n                },\r\n                cancelButton: {\r\n                    show: true,\r\n                    label: 'Cancel'\r\n                }\r\n            };\r\n            this.isConfirmModalOpen = true;\r\n        } else {\r\n            this.executeAction(action);\r\n        }\r\n    }\r\n\r\n    private executeAction(action: DropdownAction) {\r\n        this.actionClick.emit({ action, data: this.data });\r\n\r\n        if (action.type === 'callback' && action.callback) {\r\n            action.callback(this.data);\r\n        } else if (action.type === 'route' && action.route) {\r\n            this.navigateToRoute(action.route, this.data);\r\n        } else if (action.type === 'api' && action.apiUrl) {\r\n            this.executeApiCall(action);\r\n        }\r\n    }\r\n\r\n    private navigateToRoute(routePattern: string, rowData: any) {\r\n        let finalRoute = routePattern;\r\n        // Simple parameter replacement like smart-table: /users/:id -> /users/123\r\n        if (rowData) {\r\n            Object.keys(rowData).forEach(key => {\r\n                finalRoute = finalRoute.replace(`:${key}`, rowData[key]);\r\n            });\r\n        }\r\n        this.router.navigate([finalRoute]);\r\n    }\r\n\r\n    private executeApiCall(action: DropdownAction) {\r\n        this.apiActionStart.emit(action);\r\n        \r\n        let url = action.apiUrl!;\r\n        if (this.data) {\r\n            Object.keys(this.data).forEach(key => {\r\n                url = url.replace(`:${key}`, this.data[key]);\r\n            });\r\n        }\r\n\r\n        const method = (action.apiMethod || 'GET').toUpperCase();\r\n        let request$;\r\n\r\n        if (method === 'GET') request$ = this.http.get(url);\r\n        else if (method === 'POST') request$ = this.http.post(url, action.apiPayload || this.data);\r\n        else if (method === 'PUT') request$ = this.http.put(url, action.apiPayload || this.data);\r\n        else if (method === 'DELETE') request$ = this.http.delete(url);\r\n        else if (method === 'PATCH') request$ = this.http.patch(url, action.apiPayload || this.data);\r\n        else request$ = this.http.get(url); // fallback\r\n\r\n        request$.subscribe({\r\n            next: (res) => this.apiActionSuccess.emit({ action, response: res }),\r\n            error: (err) => this.apiActionError.emit({ action, error: err })\r\n        });\r\n    }\r\n\r\n    invokePendingAction() {\r\n        if (this.pendingAction) {\r\n            this.executeAction(this.pendingAction);\r\n        }\r\n        this.closeConfirmModal();\r\n    }\r\n\r\n    closeConfirmModal() {\r\n        this.isConfirmModalOpen = false;\r\n        this.pendingAction = null;\r\n        this.confirmConfig = null;\r\n        this.confirmMessage = '';\r\n    }\r\n}\r\n","<div class=\"cc-btn-dropdown-container\">\r\n    <!-- Main Toggle Button -->\r\n    <lib-button \r\n        [variant]=\"variant\" \r\n        [disabled]=\"disabled\"\r\n        (click)=\"toggleDropdown($event)\">\r\n        <span class=\"cc-btn-dropdown-content\">\r\n            {{ label }}\r\n            <i *ngIf=\"icon\" [class]=\"icon\" class=\"cc-btn-dropdown-icon\"></i>\r\n        </span>\r\n    </lib-button>\r\n\r\n    <!-- Dropdown Menu -->\r\n    <div class=\"cc-dropdown-menu\" [ngClass]=\"'cc-dropdown-menu--' + menuTheme\" *ngIf=\"isOpen\">\r\n        <button \r\n            type=\"button\" \r\n            class=\"cc-dropdown-item\" \r\n            *ngFor=\"let action of actions\"\r\n            [disabled]=\"action.disabled\"\r\n            [ngClass]=\"action.variant ? 'cc-dropdown-item--' + action.variant : (action.color === 'red' || action.color === 'danger') ? 'cc-dropdown-item--danger' : ''\"\r\n            [style.color]=\"action.color && !action.variant && action.color !== 'red' && action.color !== 'danger' ? action.color : null\"\r\n            (click)=\"onActionItemClick(action, $event)\">\r\n            <i *ngIf=\"action.icon\" [class]=\"action.icon\" class=\"cc-dropdown-item-icon\"></i>\r\n            <span>{{ action.label }}</span>\r\n        </button>\r\n        <div class=\"cc-dropdown-empty\" *ngIf=\"!actions || actions.length === 0\">\r\n            No actions available\r\n        </div>\r\n    </div>\r\n</div>\r\n\r\n<!-- Confirmation Modal for Critical Actions -->\r\n<cc-confirmation-modal \r\n    *ngIf=\"isConfirmModalOpen\"\r\n    [isOpen]=\"isConfirmModalOpen\" \r\n    [config]=\"confirmConfig!\"\r\n    (confirm)=\"invokePendingAction()\"\r\n    (close)=\"closeConfirmModal()\"\r\n    (cancel)=\"closeConfirmModal()\">\r\n    <p>{{ confirmMessage }}</p>\r\n</cc-confirmation-modal>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ConfirmationModalComponent } from './components/confirmation-modal/confirmation-modal.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        ConfirmationModalComponent\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        MatIconModule, // For material icons support\r\n        FormsModule // For ngModel in user examples (although mostly projected content, user might need it)\r\n    ],\r\n    exports: [\r\n        ConfirmationModalComponent\r\n    ]\r\n})\r\nexport class ConfirmationModalModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { ButtonDropdownComponent } from './components/button-dropdown/button-dropdown.component';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { ConfirmationModalModule } from '../confirmation-modal/confirmation-modal.module';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        ButtonDropdownComponent\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        RouterModule,\r\n        ButtonModule,\r\n        ConfirmationModalModule\r\n    ],\r\n    exports: [\r\n        ButtonDropdownComponent\r\n    ]\r\n})\r\nexport class ButtonDropdownModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, forwardRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { FilterSidebarChangeEvent, FilterSidebarConfig, FilterSidebarOutput, FilterItem } from '../../filter-sidebar.models';\r\n\r\n@Component({\r\n    selector: 'lib-filter-sidebar',\r\n    templateUrl: './filter-sidebar.component.html',\r\n    styleUrls: ['./filter-sidebar.component.scss'],\r\n    standalone: false,\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => FilterSidebarComponent),\r\n            multi: true\r\n        }\r\n    ]\r\n})\r\nexport class FilterSidebarComponent implements OnInit, ControlValueAccessor {\r\n    @Input() config!: FilterSidebarConfig;\r\n    @Input() initialFilters: FilterSidebarOutput = {};\r\n\r\n    @Output() filterChange = new EventEmitter<FilterSidebarChangeEvent>();\r\n    @Output() filterApply = new EventEmitter<FilterSidebarOutput>();\r\n    @Output() filterClear = new EventEmitter<void>();\r\n    @Output() showCodeSnippet = new EventEmitter<void>();\r\n    @Output() close = new EventEmitter<void>();\r\n\r\n    filters: FilterSidebarOutput = {};\r\n\r\n    // ControlValueAccessor callbacks\r\n    onChange: any = () => { };\r\n    onTouched: any = () => { };\r\n\r\n    isCollapsed = false;\r\n\r\n    toggleCollapse(): void {\r\n        this.isCollapsed = !this.isCollapsed;\r\n    }\r\n\r\n    constructor(\r\n        private router: Router,\r\n        private route: ActivatedRoute\r\n    ) { }\r\n\r\n    ngOnInit(): void {\r\n        if (this.initialFilters) {\r\n            this.filters = { ...this.initialFilters };\r\n        }\r\n\r\n        // Initialize from URL query params if persistent\r\n        if (this.config.settings?.persistent !== false) {\r\n            this.route.queryParams.subscribe(params => {\r\n                if (Object.keys(params).length > 0) {\r\n                    // Start with existing filters to preserve defaults not in URL\r\n                    const newFilters = { ...this.filters };\r\n\r\n                    Object.keys(params).forEach(key => {\r\n                        // Try to parse arrays or numbers if possible, otherwise string\r\n                        // This is a naive implementation, ideally config should dictate type\r\n                        const val = params[key];\r\n                        // If comma separated and looked like array? For now keep simple\r\n                        newFilters[key] = val;\r\n                    });\r\n\r\n                    this.filters = newFilters;\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    // ControlValueAccessor Implementation\r\n    writeValue(value: any): void {\r\n        if (value) {\r\n            this.filters = { ...value };\r\n        } else {\r\n            this.filters = {};\r\n        }\r\n    }\r\n\r\n    registerOnChange(fn: any): void {\r\n        this.onChange = fn;\r\n    }\r\n\r\n    registerOnTouched(fn: any): void {\r\n        this.onTouched = fn;\r\n    }\r\n\r\n    // Component Logic\r\n    onValueChange(key: string | undefined, value: any): void {\r\n        if (!key) return;\r\n\r\n        this.filters[key] = value;\r\n        this.notifyChanges(key, value);\r\n    }\r\n\r\n    private notifyChanges(key: string, value: any): void {\r\n        this.onChange(this.filters);\r\n\r\n        // Update URL if persistent\r\n        if (this.config.settings?.persistent !== false) {\r\n            this.updateUrl();\r\n        }\r\n\r\n        this.filterChange.emit({\r\n            key,\r\n            value,\r\n            allFilters: this.filters\r\n        });\r\n    }\r\n\r\n    private updateUrl(): void {\r\n        this.router.navigate([], {\r\n            relativeTo: this.route,\r\n            queryParams: this.filters,\r\n            queryParamsHandling: 'merge',\r\n            replaceUrl: true\r\n        });\r\n    }\r\n\r\n    applyFilters(): void {\r\n        this.filterApply.emit(this.filters);\r\n    }\r\n\r\n    clearFilters(): void {\r\n        this.filters = {};\r\n        this.onChange(this.filters);\r\n\r\n        if (this.config.settings?.persistent !== false) {\r\n            this.router.navigate([], {\r\n                relativeTo: this.route,\r\n                queryParams: {},\r\n            });\r\n        }\r\n\r\n        this.filterClear.emit();\r\n    }\r\n\r\n    onClose(): void {\r\n        this.close.emit();\r\n    }\r\n\r\n    onShowCodeSnippet(): void {\r\n        this.showCodeSnippet.emit();\r\n    }\r\n\r\n    get sidebarStyles(): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (this.config?.styles) {\r\n            if (this.config.styles.width) styles['--cc-filter-sidebar-width'] = this.config.styles.width;\r\n            if (this.config.styles.padding) styles['--cc-filter-sidebar-padding'] = this.config.styles.padding;\r\n            if (this.config.styles.gap) styles['--cc-filter-sidebar-gap'] = this.config.styles.gap;\r\n            if (this.config.styles.backgroundColor) styles['--cc-filter-sidebar-bg'] = this.config.styles.backgroundColor;\r\n            if (this.config.styles.headerHeight) styles['--cc-filter-header-height'] = this.config.styles.headerHeight;\r\n            if (this.config.styles.borderRadius) styles['--cc-filter-sidebar-border-radius'] = this.config.styles.borderRadius;\r\n        }\r\n        return styles;\r\n    }\r\n\r\n    trackByFn(index: number, item: FilterItem): any {\r\n        return item.key || index;\r\n    }\r\n}\r\n","<div class=\"cc-filter-sidebar\" [ngStyle]=\"sidebarStyles\" [class.collapsed]=\"isCollapsed\">\r\n\r\n    <!-- Header -->\r\n    <div class=\"cc-filter-header\" *ngIf=\"config.header?.visible !== false\">\r\n        <div class=\"cc-header-content\">\r\n            <span class=\"cc-header-title\" *ngIf=\"config.header?.title\">\r\n                <span *ngIf=\"config.header?.icon\" [class]=\"config.header?.icon\" class=\"cc-header-icon material-icons\">\r\n                    <!-- {{config.header?.icon }} -->\r\n                </span>\r\n                {{ config.header?.title }}\r\n            </span>\r\n            <ng-content select=\"[header-actions]\"></ng-content>\r\n        </div>\r\n        <button type=\"button\" *ngIf=\"config.settings?.collapsible\" (click)=\"toggleCollapse()\" class=\"cc-icon-btn\"\r\n            [attr.aria-label]=\"isCollapsed ? config.labels?.expandAriaLabel : config.labels?.collapseAriaLabel\">\r\n            <span class=\"material-icons\">{{ isCollapsed ? 'menu_open' : 'menu' }}</span>\r\n        </button>\r\n        <button type=\"button\" *ngIf=\"config.header?.showClose && !isCollapsed\" (click)=\"onClose()\"\r\n            class=\"cc-icon-btn cc-close-btn\" [attr.aria-label]=\"config.labels?.closeAriaLabel\">\r\n            <span class=\"material-icons\">close</span>\r\n        </button>\r\n        <!-- Code snippet debug (optional) -->\r\n        <button type=\"button\" *ngIf=\"config.settings?.showCodeSnippet\" (click)=\"onShowCodeSnippet()\" class=\"cc-icon-btn\"\r\n            [attr.aria-label]=\"config.labels?.codeSnippetAriaLabel\">\r\n            <span class=\"material-icons\">code</span>\r\n        </button>\r\n    </div>\r\n\r\n    <!-- Content (Scrollable) -->\r\n    <div class=\"cc-filter-content\" [class.hidden]=\"isCollapsed\">\r\n        <ng-container *ngFor=\"let item of config.items; trackBy: trackByFn\">\r\n            <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: item }\"></ng-container>\r\n        </ng-container>\r\n    </div>\r\n\r\n    <!-- Footer -->\r\n    <div class=\"cc-filter-footer\" *ngIf=\"config.footer?.visible !== false && !isCollapsed\">\r\n        <lib-button variant=\"outline\" color=\"warn\" class=\"cc-btn-clear\"\r\n            *ngIf=\"config.footer?.clearButton?.visible !== false\" (click)=\"clearFilters()\">\r\n            {{ config.footer?.clearButton?.label }}\r\n        </lib-button>\r\n        <lib-button variant=\"primary\" color=\"warn\" class=\"cc-btn-apply\"\r\n            *ngIf=\"config.footer?.applyButton?.visible !== false\" [disabled]=\"config.footer?.applyButton?.disabled ?? false\"\r\n            (click)=\"applyFilters()\">\r\n            {{ config.footer?.applyButton?.label }}\r\n        </lib-button>\r\n    </div>\r\n</div>\r\n\r\n<!-- Recursive Template for Items -->\r\n<ng-template #itemTemplate let-item=\"item\">\r\n    <div class=\"cc-filter-item\" [ngClass]=\"['type-' + item.type]\"\r\n        [style.display]=\"item.visible === false ? 'none' : 'block'\" [ngStyle]=\"item.styles\">\r\n\r\n        <ng-container [ngSwitch]=\"item.type\">\r\n\r\n            <!-- Input -->\r\n            <lib-input *ngSwitchCase=\"'input'\" [config]=\"item.inputConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"filters[item.key]\" (valueChange)=\"onValueChange(item.key, $event)\">\r\n            </lib-input>\r\n\r\n            <!-- Dropdown -->\r\n            <lib-dropdown *ngSwitchCase=\"'dropdown'\" [config]=\"item.dropdownConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"filters[item.key]\" (selectionChange)=\"onValueChange(item.key, $event)\">\r\n            </lib-dropdown>\r\n\r\n            <!-- Checkbox -->\r\n            <lib-checkbox *ngSwitchCase=\"'checkbox'\" [config]=\"item.checkboxConfig\" [label]=\"item.label\"\r\n                [checked]=\"!!filters[item.key]\" (checkedChange)=\"onValueChange(item.key, $event)\">\r\n            </lib-checkbox>\r\n\r\n            <!-- Radio -->\r\n            <lib-radio *ngSwitchCase=\"'radio'\" [config]=\"item.radioConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"filters[item.key]\" (selectionChange)=\"onValueChange(item.key, $event)\">\r\n            </lib-radio>\r\n\r\n            <!-- Toggle -->\r\n            <lib-toggle *ngSwitchCase=\"'toggle'\" [config]=\"item.toggleConfig\" [label]=\"item.label\"\r\n                [checked]=\"filters[item.key]\" (toggleChange)=\"onValueChange(item.key, $event)\">\r\n            </lib-toggle>\r\n\r\n            <!-- Datepicker -->\r\n            <lib-datepicker *ngSwitchCase=\"'datepicker'\" [config]=\"item.datepickerConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"filters[item.key]\" (dateChange)=\"onValueChange(item.key, $event)\">\r\n            </lib-datepicker>\r\n\r\n            <!-- Search -->\r\n            <lib-search *ngSwitchCase=\"'active-search'\" [config]=\"item.searchConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"filters[item.key]\" (search)=\"onValueChange(item.key, $event)\">\r\n            </lib-search>\r\n\r\n            <!-- Group / Accordion -->\r\n            <div *ngSwitchCase=\"'group'\" class=\"cc-accordion-item\" [class.expanded]=\"item.expanded\">\r\n                <button type=\"button\" class=\"cc-accordion-header\" (click)=\"item.expanded = !item.expanded\">\r\n                    <span class=\"cc-accordion-title\">{{ item.label }}</span>\r\n                    <span class=\"material-icons cc-accordion-icon\">{{ item.expanded ? 'expand_less' : 'expand_more'\r\n                        }}</span>\r\n                </button>\r\n\r\n                <div class=\"cc-accordion-body\" *ngIf=\"item.expanded\">\r\n                    <ng-container *ngFor=\"let child of item.children; trackBy: trackByFn\">\r\n                        <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: child }\"></ng-container>\r\n                    </ng-container>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Custom Divider -->\r\n            <div *ngSwitchCase=\"'divider'\" class=\"cc-filter-divider\"></div>\r\n\r\n        </ng-container>\r\n    </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { FilterSidebarComponent } from './components/filter-sidebar/filter-sidebar.component';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\nimport { ButtonModule } from '../button/button.module';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        FilterSidebarComponent\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        FormsModule,\r\n        ReactiveFormsModule,\r\n        FormComponentsModule,\r\n        ButtonModule\r\n    ],\r\n    exports: [\r\n        FilterSidebarComponent\r\n    ]\r\n})\r\nexport class FilterSidebarModule { }\r\n","import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core';\r\n\r\nexport interface SummaryCardConfig {\r\n    header: string;\r\n    value: string;\r\n    description?: string;\r\n\r\n    // Icon or Image (mutually exclusive)\r\n    icon?: string; // Material icon name\r\n    iconImage?: string; // URL for image icon\r\n\r\n    // Layout configurations\r\n    descriptionPosition?: 'bottom' | 'inline'; // 'bottom' (default) or 'inline' (right side of value)\r\n\r\n    // Extended Content\r\n    valueSubtext?: string; // Text displayed next to the value (e.g. \"/ 15 Target\")\r\n    metaData?: SummaryCardMeta[]; // Right-aligned meta information\r\n\r\n    // Color configurations\r\n    valueColor?: string; // Color for the value text\r\n    headerColor?: string; // Color for the header text\r\n    descriptionColor?: string; // Color for the description text\r\n    iconColor?: string; // Color for the icon\r\n    iconBackgroundColor?: string; // Background color for the icon container\r\n\r\n    // Additional styling\r\n    iconClass?: string; // Additional CSS classes for icon\r\n    valueClass?: string; // Additional CSS classes for value\r\n    headerClass?: string; // Additional CSS classes for header\r\n    descriptionClass?: string; // Additional CSS classes for description\r\n\r\n    // Interaction\r\n    isDisabled?: boolean; // Disable click interaction\r\n    isClickable?: boolean; // Whether card is clickable (default: true)\r\n}\r\n\r\nexport interface SummaryCardMeta {\r\n    text: string;\r\n    type?: 'text' | 'pill'; // 'text' (default) or 'pill' (badge style)\r\n    color?: string; // Text color\r\n    backgroundColor?: string; // Background color for pill\r\n    cssClass?: string; // Custom CSS class\r\n}\r\n\r\nexport interface SummaryCardLabels {\r\n    iconAlt: string;\r\n}\r\n\r\n@Component({\r\n    selector: 'lib-summary-card',\r\n    templateUrl: './summary-card.component.html',\r\n    styleUrls: ['./summary-card.component.scss'],\r\n    standalone: false\r\n})\r\nexport class SummaryCardComponent {\r\n    @Input() config!: SummaryCardConfig;\r\n    @Input() theme?: 'theme-1' | 'theme-2';\r\n    @Input() labels: any;\r\n    @Output() cardClick = new EventEmitter<void>();\r\n\r\n    constructor() { }\r\n\r\n    onCardClick(): void {\r\n        if (this.config?.isDisabled || this.config?.isClickable === false) {\r\n            return;\r\n        }\r\n        this.cardClick.emit();\r\n    }\r\n\r\n    get cardClasses(): { [key: string]: boolean } {\r\n        return {\r\n            'disabled': !!this.config?.isDisabled,\r\n            'clickable': this.config?.isClickable !== false && !this.config?.isDisabled\r\n        };\r\n    }\r\n\r\n    get iconStyles(): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (this.config.iconBackgroundColor) {\r\n            styles['backgroundColor'] = this.config.iconBackgroundColor;\r\n        }\r\n        if (this.config.iconColor) {\r\n            styles['color'] = this.config.iconColor;\r\n        }\r\n        return styles;\r\n    }\r\n\r\n    get headerStyles(): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (this.config.headerColor) {\r\n            styles['color'] = this.config.headerColor;\r\n        }\r\n        return styles;\r\n    }\r\n\r\n    get valueStyles(): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (this.config.valueColor) {\r\n            styles['color'] = this.config.valueColor;\r\n        }\r\n        return styles;\r\n    }\r\n\r\n    get descriptionStyles(): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (this.config.descriptionColor) {\r\n            styles['color'] = this.config.descriptionColor;\r\n        }\r\n        return styles;\r\n    }\r\n\r\n    get isDescriptionInline(): boolean {\r\n        return this.config.descriptionPosition === 'inline';\r\n    }\r\n\r\n    getMetaStyles(meta: SummaryCardMeta): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (meta.color) {\r\n            styles['color'] = meta.color;\r\n        }\r\n        if (meta.backgroundColor && meta.type === 'pill') {\r\n            styles['backgroundColor'] = meta.backgroundColor;\r\n        }\r\n        return styles;\r\n    }\r\n}\r\n","<div class=\"cc-summary-card\" (click)=\"onCardClick()\">\r\n    <!-- Icon Section (Left Side) -->\r\n    <div class=\"icon-section\" *ngIf=\"config.icon || config.iconImage\" [ngClass]=\"config.iconClass\"\r\n        [ngStyle]=\"iconStyles\">\r\n        <mat-icon *ngIf=\"config.icon\">{{ config.icon }}</mat-icon>\r\n        <img *ngIf=\"!config.icon && config.iconImage\" [src]=\"config.iconImage\" [alt]=\"labels.iconAlt\">\r\n    </div>\r\n\r\n    <!-- Right Section (Header + Value/Meta) -->\r\n    <div class=\"right-section\">\r\n        <!-- Header (Full Width on Right) -->\r\n        <div class=\"header\" [ngClass]=\"config.headerClass\" [ngStyle]=\"headerStyles\">\r\n            {{ config.header }}\r\n        </div>\r\n\r\n        <!-- Value and Meta Row -->\r\n        <div class=\"value-meta-row\">\r\n            <!-- Content Section -->\r\n            <div class=\"content-section\">\r\n                <!-- Value Row (with optional inline description) -->\r\n                <div class=\"value-row\" [class.inline-layout]=\"isDescriptionInline\">\r\n                    <div class=\"value-container\">\r\n                        <div class=\"value\" [ngClass]=\"config.valueClass\" [ngStyle]=\"valueStyles\">\r\n                            {{ config.value }}\r\n                            <span *ngIf=\"config.valueSubtext\" class=\"value-subtext\">{{ config.valueSubtext }}</span>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <!-- Description (inline or bottom based on config) -->\r\n                    <div class=\"description\" *ngIf=\"config.description\" [ngClass]=\"config.descriptionClass\"\r\n                        [ngStyle]=\"descriptionStyles\">\r\n                        {{ config.description }}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Meta/Status Section (Aligned with Value) -->\r\n            <div class=\"meta-section\" *ngIf=\"config.metaData && config.metaData.length > 0\">\r\n                <div *ngFor=\"let meta of config.metaData\" class=\"meta-item\"\r\n                    [ngClass]=\"[meta.type === 'pill' ? 'meta-pill' : 'meta-text', meta.cssClass || '']\"\r\n                    [ngStyle]=\"getMetaStyles(meta)\">\r\n                    {{ meta.text }}\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SummaryCardComponent } from './components/summary-card/summary-card.component';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        SummaryCardComponent\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        MatIconModule\r\n    ],\r\n    exports: [\r\n        SummaryCardComponent\r\n    ]\r\n})\r\nexport class SummaryCardModule { }\r\n","\r\n/**\r\n * Recursively translates the Configuration object using the provided labels map.\r\n * This function processes:\r\n * - Section Titles\r\n * - Field Labels\r\n * - Placeholders\r\n * - Help Texts\r\n * - Option Labels (for static options)\r\n * - Repeater Labels (addLabel, repeaterItemLabel)\r\n * \r\n * @param config The FormConfig object to translate\r\n * @param labelsMap A map of key-value pairs for translation (Flattened JSON)\r\n * @returns A new FormConfig object with translated strings\r\n */\r\nexport function translateConfig(config: any, labelsMap: any): any {\r\n    if (!config || !labelsMap) {\r\n        return config;\r\n    }\r\n\r\n    // Deep clone to avoid mutating original config, if not already cloned\r\n    // Note: Assuming config passed here is already a clone to be modified or we clone it.\r\n    // To be safe, let's clone it if it's the root call, but this function is helper.\r\n    // In component we do: processedConfig = JSON.parse(JSON.stringify(config)); -> translateConfig(processedConfig, map)\r\n    // So distinct reference is passed.\r\n\r\n    // Helper to translate a single key\r\n    const t = (key: string) => {\r\n        return labelsMap[key] || key;\r\n    };\r\n\r\n    if (config.sections) {\r\n        config.sections.forEach((section: any) => {\r\n            if (section.sectionTitle) {\r\n                section.sectionTitle = t(section.sectionTitle);\r\n            }\r\n            if (section.repeaterItemLabel) {\r\n                section.repeaterItemLabel = t(section.repeaterItemLabel);\r\n            }\r\n            if (section.addLabel) {\r\n                section.addLabel = t(section.addLabel);\r\n            }\r\n\r\n            if (section.fields) {\r\n                section.fields.forEach((field: any) => {\r\n                    translateField(field, t);\r\n                });\r\n            }\r\n        });\r\n    }\r\n\r\n    return config;\r\n}\r\n\r\nfunction translateField(field: any, t: (key: string) => string) {\r\n    if (field.label) {\r\n        field.label = t(field.label);\r\n    }\r\n    if (field.placeholder) {\r\n        field.placeholder = t(field.placeholder);\r\n    }\r\n    if (field.helpText) {\r\n        field.helpText = t(field.helpText);\r\n    }\r\n    if (field.suffixText) {\r\n        field.suffixText = t(field.suffixText);\r\n    }\r\n    if (field.prefixText) { // Assuming prefixText might exist or be added\r\n        field.prefixText = t(field.prefixText);\r\n    }\r\n\r\n    // Translate options if they exist\r\n    if (field.options) {\r\n        field.options.forEach((opt: any) => {\r\n            if (opt.label) {\r\n                opt.label = t(opt.label);\r\n            }\r\n        });\r\n    }\r\n\r\n    // Handle subFields for composite type\r\n    if (field.subFields) {\r\n        field.subFields.forEach((sub: any) => {\r\n            translateField(sub, t);\r\n        });\r\n    }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { FormBuilder, FormGroup, FormControl, FormArray, Validators, AbstractControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n    FormConfig,\r\n    FormField,\r\n    FormSection,\r\n    FormOption,\r\n    JsonFormConfig,\r\n    JsonFieldConfig,\r\n    FieldType,\r\n    UISubType\r\n} from '../configurable-form.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from '../../material/material.module';\r\nimport { translateConfig } from '../../../utils/translation.utils';\r\n\r\n@Component({\r\n    selector: 'lib-configurable-form',\r\n    templateUrl: './configurable-form.component.html',\r\n    styleUrls: ['./configurable-form.component.scss'],\r\n    standalone: true,\r\n    imports: [CommonModule, ReactiveFormsModule, MaterialModule],\r\n})\r\nexport class ConfigurableFormComponent implements OnInit, OnChanges {\r\n    @Input() config!: FormConfig;\r\n    @Input() jsonConfig!: JsonFormConfig;\r\n    @Input() data: any = {};\r\n    @Input() baseApiUrl: string = '';\r\n    @Input() labels: any;\r\n    @Output() optionsLoad = new EventEmitter<any>();\r\n\r\n    form!: FormGroup;\r\n    processedConfig!: FormConfig;\r\n    fieldVisibilityMap: Map<string, boolean> = new Map();\r\n    passwordFieldState: Map<string, boolean> = new Map();\r\n\r\n    constructor(\r\n        private fb: FormBuilder,\r\n        private snackBar: MatSnackBar,\r\n        private http: HttpClient\r\n    ) { }\r\n\r\n    ngOnInit(): void {\r\n        this.initializeForm();\r\n    }\r\n\r\n    ngOnChanges(changes: SimpleChanges): void {\r\n        if (changes['config'] || changes['jsonConfig']) {\r\n            this.initializeForm();\r\n        }\r\n        if (changes['data'] && this.form) {\r\n            this.form.patchValue(this.data);\r\n        }\r\n    }\r\n\r\n    initializeForm() {\r\n        // Transform JSON config if provided, otherwise use config directly\r\n        if (this.jsonConfig) {\r\n            this.processedConfig = this.transformJsonConfig(this.jsonConfig);\r\n        } else if (this.config) {\r\n            this.processedConfig = JSON.parse(JSON.stringify(this.config));\r\n        } else {\r\n            return;\r\n        }\r\n\r\n        // Apply translations if labels and labelsObject are provided\r\n        if (this.labels && this.labels.labelsObject) {\r\n            translateConfig(this.processedConfig, this.labels.labelsObject);\r\n        }\r\n\r\n\r\n        this.normalizeFields();\r\n        this.initializeFieldVisibility();\r\n        this.buildForm();\r\n        this.setupDependencies();\r\n\r\n        // Patch initial data if provided\r\n        if (this.data && Object.keys(this.data).length > 0) {\r\n            this.form.patchValue(this.data);\r\n        }\r\n    }\r\n\r\n    // Transform JSON config format to internal FormConfig format\r\n    transformJsonConfig(jsonConfig: JsonFormConfig): FormConfig {\r\n        const fields = jsonConfig.jsonConfig\r\n            .sort((a, b) => a.sequence - b.sequence)\r\n            .map(field => this.transformJsonField(field));\r\n\r\n        return {\r\n            sections: [{\r\n                sectionTitle: jsonConfig.label,\r\n                fields: fields\r\n            }],\r\n            entityType: jsonConfig.entityType\r\n        };\r\n    }\r\n\r\n    // Transform individual JSON field to FormField\r\n    transformJsonField(jsonField: JsonFieldConfig): FormField {\r\n        const fieldType = this.mapUISubTypeToFieldType(jsonField.uiConfig.subType);\r\n\r\n        return {\r\n            name: jsonField.jsonKey,\r\n            jsonKey: jsonField.jsonKey,\r\n            label: jsonField.label,\r\n            type: fieldType,\r\n            sequence: jsonField.sequence,\r\n            keyType: jsonField.keyType,\r\n            uiConfig: jsonField.uiConfig,\r\n            validationRules: jsonField.validationRules,\r\n            required: jsonField.validationRules?.isMandatory || jsonField.validationRules?.isRequired,\r\n            mandatory: jsonField.validationRules?.isMandatory,\r\n            dependsOn: undefined, // Will be set based on dependent array\r\n            dependent: jsonField.uiConfig.dependent,\r\n            optionConfigs: jsonField.uiConfig.optionConfigs,\r\n            class: 'col-12'\r\n        };\r\n    }\r\n\r\n    // Map UI subtype to field type\r\n    mapUISubTypeToFieldType(subType?: string): FieldType {\r\n        switch (subType) {\r\n            case 'UI_SUBTYPE.SHORT_TEXT':\r\n                return 'text';\r\n            case 'UI_SUBTYPE.LONG_TEXT':\r\n                return 'textarea';\r\n            case 'UI_SUBTYPE.NUMBER':\r\n                return 'number';\r\n            case 'UI_SUBTYPE.EMAIL':\r\n                return 'email';\r\n            case 'UI_SUBTYPE.PHONE':\r\n                return 'tel';\r\n            case 'UI_SUBTYPE.URL':\r\n                return 'url';\r\n            default:\r\n                return 'text';\r\n        }\r\n    }\r\n\r\n    // Normalize fields to ensure all required properties exist\r\n    normalizeFields() {\r\n        this.processedConfig.sections.forEach(section => {\r\n            section.fields.forEach(field => {\r\n                // Set default type if not specified\r\n                if (!field.type) {\r\n                    field.type = 'text';\r\n                }\r\n\r\n                // Merge uiConfig with field-level properties\r\n                if (field.uiConfig) {\r\n                    if (field.uiConfig.type === 'UI_TYPE.DROP_DOWN') {\r\n                        field.type = 'dropdown';\r\n                    }\r\n                    if (field.uiConfig.optionConfigs) {\r\n                        field.optionConfigs = field.uiConfig.optionConfigs;\r\n                    }\r\n                    if (field.uiConfig.dependent) {\r\n                        field.dependent = field.uiConfig.dependent;\r\n                    }\r\n                }\r\n\r\n                // Initialize visibility\r\n                if (field.visible === undefined) {\r\n                    field.visible = true;\r\n                }\r\n\r\n                // Load options for dropdowns\r\n                if ((field.type === 'dropdown' || field.type === 'select') && field.optionConfigs) {\r\n                    this.loadFieldOptions(field);\r\n                }\r\n            });\r\n        });\r\n    }\r\n\r\n    // Initialize field visibility map\r\n    initializeFieldVisibility() {\r\n        this.processedConfig.sections.forEach(section => {\r\n            section.fields.forEach(field => {\r\n                this.fieldVisibilityMap.set(field.name, field.visible !== false);\r\n            });\r\n        });\r\n    }\r\n\r\n    buildForm() {\r\n        const formGroupConfig: any = {};\r\n\r\n        this.processedConfig.sections.forEach(section => {\r\n            if (section.isRepeater) {\r\n                // Create FormArray for repeater sections\r\n                const arrayName = section.formArrayName || 'items';\r\n                const minItems = section.minItems || 1;\r\n                const initialItems = [];\r\n\r\n                for (let i = 0; i < minItems; i++) {\r\n                    initialItems.push(this.createGroup(section.fields));\r\n                }\r\n\r\n                formGroupConfig[arrayName] = this.fb.array(initialItems);\r\n            } else {\r\n                // Add regular fields to form group\r\n                section.fields.forEach(field => {\r\n                    if (field.subFields) {\r\n                        // Composite field - add all sub-fields\r\n                        field.subFields.forEach(subField => {\r\n                            if (field.required || field.mandatory) {\r\n                                subField.required = true;\r\n                            }\r\n                            formGroupConfig[subField.name] = this.createControl(subField);\r\n                        });\r\n                    } else {\r\n                        formGroupConfig[field.name] = this.createControl(field);\r\n                    }\r\n                });\r\n            }\r\n        });\r\n\r\n        this.form = this.fb.group(formGroupConfig);\r\n\r\n        // Apply composite validators to the root form group\r\n        this.processedConfig.sections.forEach(section => {\r\n            if (!section.isRepeater) {\r\n                section.fields.forEach(field => {\r\n                    if (field.type === 'composite' && field.compositeValidationRule && field.subFields) {\r\n                        this.form.addValidators(this.createCompositeValidator(field));\r\n                    }\r\n                });\r\n            }\r\n        });\r\n        this.form.updateValueAndValidity();\r\n    }\r\n\r\n    createCompositeValidator(field: FormField) {\r\n        return (control: AbstractControl) => {\r\n            const group = control as FormGroup;\r\n            if (!field.subFields || field.subFields.length < 2) return null;\r\n\r\n            if (field.compositeValidationRule === 'minMax') {\r\n                const minControl = group.get(field.subFields[0].name);\r\n                const maxControl = group.get(field.subFields[1].name);\r\n\r\n                if (minControl && maxControl && minControl.value !== null && maxControl.value !== null) {\r\n                    if (Number(minControl.value) > Number(maxControl.value)) {\r\n                        return { [`invalid_minMax_${field.name}`]: true };\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (field.compositeValidationRule === 'percentageTotal') {\r\n                let total = 0;\r\n                let allPresent = true;\r\n\r\n                field.subFields.forEach(sub => {\r\n                    const ctrl = group.get(sub.name);\r\n                    if (ctrl && ctrl.value !== null && ctrl.value !== '') {\r\n                        total += Number(ctrl.value);\r\n                    } else {\r\n                        allPresent = false;\r\n                    }\r\n                });\r\n\r\n                if (allPresent && total !== 100) {\r\n                    return { [`invalid_percentageTotal_${field.name}`]: true };\r\n                }\r\n            }\r\n\r\n            return null;\r\n        };\r\n    }\r\n\r\n    createControl(field: FormField): FormControl {\r\n        const validators = [];\r\n\r\n        // Add validators based on field configuration\r\n        if (field.required || field.mandatory || field.validationRules?.isMandatory || field.validationRules?.isRequired) {\r\n            validators.push(Validators.required);\r\n        }\r\n\r\n        if (field.validationRules?.minLength) {\r\n            validators.push(Validators.minLength(field.validationRules.minLength));\r\n        }\r\n\r\n        if (field.validationRules?.maxLength) {\r\n            validators.push(Validators.maxLength(field.validationRules.maxLength));\r\n        }\r\n\r\n        if (field.validationRules?.pattern) {\r\n            validators.push(Validators.pattern(field.validationRules.pattern));\r\n        }\r\n\r\n        if (field.validationRules?.min !== undefined) {\r\n            validators.push(Validators.min(field.validationRules.min));\r\n        }\r\n\r\n        if (field.validationRules?.max !== undefined) {\r\n            validators.push(Validators.max(field.validationRules.max));\r\n        }\r\n\r\n        if (field.type === 'email') {\r\n            validators.push(Validators.email);\r\n        }\r\n\r\n        const initialValue = field.value !== undefined ? field.value : '';\r\n        return this.fb.control({ value: initialValue, disabled: field.disabled || false }, validators);\r\n    }\r\n\r\n    createGroup(fields: FormField[]): FormGroup {\r\n        const groupConfig: any = {};\r\n\r\n        fields.forEach(field => {\r\n            if (field.subFields) {\r\n                field.subFields.forEach(subField => {\r\n                    groupConfig[subField.name] = this.createControl(subField);\r\n                });\r\n            } else {\r\n                groupConfig[field.name] = this.createControl(field);\r\n            }\r\n        });\r\n\r\n        return this.fb.group(groupConfig);\r\n    }\r\n\r\n    getFormArray(name: string): FormArray {\r\n        return this.form.get(name) as FormArray;\r\n    }\r\n\r\n    addRepeaterItem(section: FormSection) {\r\n        const arrayName = section.formArrayName || 'items';\r\n        const formArray = this.getFormArray(arrayName);\r\n\r\n        // Check max items\r\n        if (section.maxItems && formArray.length >= section.maxItems) {\r\n            this.snackBar.open(this.labels.errorMaxItemsAllowed.replace('{0}', String(section.maxItems)), this.labels.closeSnackBar, { duration: 3000 });\r\n            return;\r\n        }\r\n\r\n        formArray.push(this.createGroup(section.fields));\r\n    }\r\n\r\n    removeRepeaterItem(sectionName: string, index: number) {\r\n        const formArray = this.getFormArray(sectionName);\r\n        formArray.removeAt(index);\r\n    }\r\n\r\n    validate(): boolean {\r\n        if (this.form.invalid) {\r\n            this.form.markAllAsTouched();\r\n            this.scrollToFirstInvalidControl();\r\n            return false;\r\n        }\r\n        return true;\r\n    }\r\n\r\n    scrollToFirstInvalidControl() {\r\n        const firstInvalidControl = document.querySelector('.is-invalid');\r\n        if (firstInvalidControl) {\r\n            firstInvalidControl.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        }\r\n    }\r\n\r\n    setupDependencies() {\r\n        this.processedConfig.sections.forEach(section => {\r\n            section.fields.forEach(field => {\r\n\r\n\r\n                // Also setup for fields with dependent array\r\n                if (field.dependent && field.dependent.length > 0) {\r\n                    const control = this.form.get(field.name);\r\n                    if (control) {\r\n                        control.valueChanges.subscribe(value => {\r\n                            this.onFieldValueChange(field, value);\r\n                        });\r\n                    }\r\n                }\r\n            });\r\n        });\r\n    }\r\n\r\n    onFieldValueChange(field: FormField, value: any) {\r\n        // Handle dependent fields\r\n        if (field.dependent && field.dependent.length > 0) {\r\n            field.dependent.forEach(dependentFieldName => {\r\n                const dependentField = this.findFieldByName(dependentFieldName);\r\n                if (dependentField) {\r\n                    // Clear the dependent field value\r\n                    const control = this.form.get(dependentFieldName);\r\n                    if (control) {\r\n                        control.setValue('');\r\n                        control.markAsUntouched();\r\n                    }\r\n\r\n                    // Load new options for the dependent field\r\n                    if (value) {\r\n                        this.loadFieldOptions(dependentField, { [field.name]: value });\r\n                    } else {\r\n                        // Clear options if parent value is cleared\r\n                        dependentField.loadedOptions = [];\r\n                    }\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    // Load options for a dropdown field\r\n    loadFieldOptions(field: FormField, parentValues?: any) {\r\n        // Emit event for parent to notify about options load request\r\n        // Allow parent to mark as handled to skip internal API call\r\n        const event = { field, parentValue: parentValues, handled: false };\r\n        this.optionsLoad.emit(event);\r\n\r\n        if (event.handled) {\r\n            return;\r\n        }\r\n\r\n        if (!field.optionConfigs) {\r\n            return;\r\n        }\r\n\r\n        const config = field.optionConfigs;\r\n\r\n        // Handle static options\r\n        if (config.optionDTO === 'OPTION_DTO.STATIC' && config.staticOptions) {\r\n            field.loadedOptions = config.staticOptions;\r\n            return;\r\n        }\r\n\r\n        // Handle API-based options\r\n        if (config.optionDTO === 'OPTION_DTO.REF_DATA' && config.url) {\r\n            let url = config.url;\r\n\r\n            // Replace placeholders in URL with parent values\r\n            if (parentValues) {\r\n                Object.keys(parentValues).forEach(key => {\r\n                    url = url.replace(`{${key}}`, parentValues[key]);\r\n                });\r\n            }\r\n\r\n            // Prepend base API URL if provided\r\n            if (this.baseApiUrl && !url.startsWith('http')) {\r\n                url = `${this.baseApiUrl}/${url}`;\r\n            }\r\n\r\n            this.http.get<any>(url).subscribe({\r\n                next: (response) => {\r\n                    // Extract data from response\r\n                    const data = response.data || response.content || response;\r\n                    field.loadedOptions = this.extractOptions(data, config);\r\n                },\r\n                error: (error) => {\r\n                    console.error('Error loading options:', error);\r\n                    field.loadedOptions = [];\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    // Extract options from API response\r\n    extractOptions(data: any[], config: any): FormOption[] {\r\n        if (!Array.isArray(data)) {\r\n            return [];\r\n        }\r\n\r\n        return data.map(item => ({\r\n            label: item[config.labelKey || 'name'],\r\n            value: item[config.requestKey || 'code'] || item[config.valueKey || 'id'],\r\n            code: item.code,\r\n            name: item.name\r\n        }));\r\n    }\r\n\r\n    // Get options for a field (either static or loaded)\r\n    getFieldOptions(field: FormField): FormOption[] {\r\n        return field.loadedOptions || field.options || [];\r\n    }\r\n\r\n    // Check if field is visible\r\n    isFieldVisible(field: FormField): boolean {\r\n        return this.fieldVisibilityMap.get(field.name) !== false;\r\n    }\r\n\r\n    // Toggle field visibility\r\n    toggleFieldVisibility(field: FormField, visible: boolean) {\r\n        this.fieldVisibilityMap.set(field.name, visible);\r\n\r\n        const control = this.form.get(field.name);\r\n        if (control) {\r\n            if (visible) {\r\n                // Re-enable and restore validators\r\n                control.enable();\r\n                this.updateControlValidators(control, field);\r\n            } else {\r\n                // Disable and clear validators\r\n                control.disable();\r\n                control.clearValidators();\r\n                control.updateValueAndValidity();\r\n            }\r\n        }\r\n    }\r\n\r\n    // Update control validators based on field config\r\n    updateControlValidators(control: AbstractControl, field: FormField) {\r\n        const validators = [];\r\n\r\n        if (field.required || field.mandatory || field.validationRules?.isMandatory) {\r\n            validators.push(Validators.required);\r\n        }\r\n\r\n        if (field.validationRules?.minLength) {\r\n            validators.push(Validators.minLength(field.validationRules.minLength));\r\n        }\r\n\r\n        if (field.validationRules?.maxLength) {\r\n            validators.push(Validators.maxLength(field.validationRules.maxLength));\r\n        }\r\n\r\n        if (field.validationRules?.pattern) {\r\n            validators.push(Validators.pattern(field.validationRules.pattern));\r\n        }\r\n\r\n        control.setValidators(validators);\r\n        control.updateValueAndValidity();\r\n    }\r\n\r\n    onFileChange(event: any, field: FormField) {\r\n        const files: FileList = event.target.files;\r\n\r\n        if (!files || files.length === 0) {\r\n            return;\r\n        }\r\n\r\n        // Initialize uploadedFiles if not present\r\n        // Initialize uploadedFiles if not present\r\n        if (!field.uploadedFiles) {\r\n            field.uploadedFiles = [];\r\n        }\r\n\r\n        const uploadedFiles: any[] = [];\r\n        // Handle files\r\n        for (let i = 0; i < files.length; i++) {\r\n            const file = files[i];\r\n\r\n            // Check file size (5MB limit)\r\n            if (file.size > 5 * 1024 * 1024) {\r\n                this.snackBar.open(this.labels.errorFileLimitExceeded.replace('{0}', file.name), this.labels.closeSnackBar, { duration: 3000 });\r\n                continue;\r\n            }\r\n\r\n            uploadedFiles.push({\r\n                name: file.name,\r\n                size: file.size,\r\n                type: file.type,\r\n                file: file\r\n            });\r\n        }\r\n\r\n        if (field.multiple) {\r\n            field.uploadedFiles.push(...uploadedFiles);\r\n        } else {\r\n            field.uploadedFiles = uploadedFiles;\r\n        }\r\n\r\n        // Update form control value for validation\r\n        this.updateFileControlValue(field);\r\n\r\n        // Clear the input\r\n        event.target.value = '';\r\n    }\r\n\r\n    // Remove uploaded file\r\n    removeFile(field: FormField, index: number) {\r\n        if (field.uploadedFiles) {\r\n            field.uploadedFiles.splice(index, 1);\r\n            this.updateFileControlValue(field);\r\n        }\r\n    }\r\n\r\n    // Update file control value for validation\r\n    updateFileControlValue(field: FormField) {\r\n        const control = this.form.get(field.name);\r\n        if (control) {\r\n            const hasFiles = field.uploadedFiles && field.uploadedFiles.length > 0;\r\n            control.setValue(hasFiles ? field.uploadedFiles : null);\r\n            control.markAsTouched();\r\n        }\r\n    }\r\n\r\n    // Get character count for text field\r\n    getCharacterCount(fieldName: string): number {\r\n        const control = this.form.get(fieldName);\r\n        if (control && control.value) {\r\n            return control.value.toString().length;\r\n        }\r\n        return 0;\r\n    }\r\n\r\n    // Toggle section collapse\r\n    toggleSection(section: FormSection) {\r\n        section.collapsed = !section.collapsed;\r\n    }\r\n\r\n\r\n\r\n    // Helper method to find field by name\r\n    private findFieldByName(name: string): FormField | undefined {\r\n        for (const section of this.processedConfig.sections) {\r\n            const field = section.fields.find(f => f.name === name);\r\n            if (field) {\r\n                return field;\r\n            }\r\n        }\r\n        return undefined;\r\n    }\r\n\r\n    // Get the processed config for template use\r\n    get sections(): FormSection[] {\r\n        return this.processedConfig?.sections || [];\r\n    }\r\n\r\n    togglePassword(fieldName: string) {\r\n        this.passwordFieldState.set(fieldName, !this.passwordFieldState.get(fieldName));\r\n    }\r\n\r\n    isPasswordVisible(fieldName: string): boolean {\r\n        return this.passwordFieldState.get(fieldName) || false;\r\n    }\r\n}\r\n\r\n","<form [formGroup]=\"form\" class=\"configurable-form-container\" *ngIf=\"form\">\r\n\r\n    <ng-container *ngFor=\"let section of sections\">\r\n\r\n        <!-- Repeater Section -->\r\n        <div *ngIf=\"section.isRepeater; else normalSection\"\r\n            [ngClass]=\"section.noCardLayout ? 'section-no-card' : 'section-card'\">\r\n            <div class=\"section-header\" *ngIf=\"section.sectionTitle\">\r\n                <h3 class=\"section-title\">{{ section.sectionTitle }}</h3>\r\n                <button *ngIf=\"section.collapsible\" mat-icon-button type=\"button\" (click)=\"toggleSection(section)\">\r\n                    <mat-icon>{{ section.collapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n                </button>\r\n            </div>\r\n\r\n            <div [formArrayName]=\"section.formArrayName || 'items'\" *ngIf=\"!section.collapsed\">\r\n                <div *ngFor=\"let item of getFormArray(section.formArrayName!).controls; let i = index\"\r\n                    [formGroupName]=\"i\" class=\"repeater-item\">\r\n                    <div class=\"repeater-item-header\" *ngIf=\"getFormArray(section.formArrayName!).length > 1\">\r\n                        <span class=\"text-small\">{{ section.repeaterItemLabel || labels.repeaterItemDefaultLabel }} {{i\r\n                            + 1}}</span>\r\n                        <button mat-icon-button color=\"warn\" type=\"button\"\r\n                            (click)=\"removeRepeaterItem(section.formArrayName!, i)\"\r\n                            [disabled]=\"section.minItems && getFormArray(section.formArrayName!).length <= section.minItems\">\r\n                            <mat-icon>delete</mat-icon>\r\n                        </button>\r\n                    </div>\r\n\r\n                    <!-- Fields Grid -->\r\n                    <div class=\"form-grid\">\r\n                        <div *ngFor=\"let field of section.fields\" [ngClass]=\"['form-col', field.class || 'col-12']\"\r\n                            [hidden]=\"!isFieldVisible(field)\">\r\n                            <ng-container\r\n                                *ngTemplateOutlet=\"fieldTemplate; context: {field: field, group: item}\"></ng-container>\r\n                        </div>\r\n                    </div>\r\n\r\n                    <div class=\"repeater-separator\" *ngIf=\"i < getFormArray(section.formArrayName!).length - 1\"></div>\r\n                </div>\r\n            </div>\r\n\r\n            <button mat-button color=\"primary\" type=\"button\" (click)=\"addRepeaterItem(section)\" class=\"add-btn\"\r\n                *ngIf=\"!section.collapsed\"\r\n                [disabled]=\"section.maxItems && getFormArray(section.formArrayName!).length >= section.maxItems\">\r\n                <mat-icon>add_circle_outline</mat-icon> {{ section.addLabel || labels.addMoreDefaultLabel }}\r\n            </button>\r\n        </div>\r\n\r\n        <!-- Normal Section -->\r\n        <ng-template #normalSection>\r\n            <div [ngClass]=\"section.noCardLayout ? 'section-no-card' : 'section-card'\">\r\n                <div class=\"section-header\" *ngIf=\"section.sectionTitle\">\r\n                    <h3 class=\"section-title\">{{ section.sectionTitle }}</h3>\r\n                    <button *ngIf=\"section.collapsible\" mat-icon-button type=\"button\" (click)=\"toggleSection(section)\">\r\n                        <mat-icon>{{ section.collapsed ? 'expand_more' : 'expand_less' }}</mat-icon>\r\n                    </button>\r\n                </div>\r\n                <div class=\"form-grid\" *ngIf=\"!section.collapsed\">\r\n                    <div *ngFor=\"let field of section.fields\" [ngClass]=\"['form-col', field.class || 'col-12']\"\r\n                        [hidden]=\"!isFieldVisible(field)\">\r\n                        <!-- Pass the root form group to the template -->\r\n                        <ng-container\r\n                            *ngTemplateOutlet=\"fieldTemplate; context: {field: field, group: form}\"></ng-container>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </ng-template>\r\n\r\n    </ng-container>\r\n\r\n</form>\r\n\r\n<!-- Reusable Field Template -->\r\n<ng-template #fieldTemplate let-field=\"field\" let-group=\"group\">\r\n    <div [formGroup]=\"group\">\r\n\r\n        <!-- Text / Email / Number / Tel / URL (Password removed) -->\r\n        <div *ngIf=\"['text', 'email', 'number', 'tel', 'url'].includes(field.type || '')\" class=\"field-container\">\r\n            <div class=\"field-label\" *ngIf=\"field.label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </div>\r\n            <div class=\"input-wrapper\">\r\n                <input [type]=\"field.type\" [formControlName]=\"field.name\" [placeholder]=\"field.placeholder || ''\"\r\n                    [readonly]=\"field.readonly\" class=\"form-input\" [name]=\"field.name\"\r\n                    [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n                    [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\">\r\n                <div class=\"input-suffix\">\r\n                    <span class=\"suffix-text\" *ngIf=\"field.suffixText\">{{ field.suffixText }}</span>\r\n                    <mat-icon *ngIf=\"field.suffixIcon\">{{ field.suffixIcon }}</mat-icon>\r\n                    <mat-icon *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n                    <mat-icon *ngIf=\"field.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n                </div>\r\n            </div>\r\n            <!-- Character count -->\r\n            <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n                <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n                <div class=\"char-count\">\r\n                    {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n                    field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n                </div>\r\n            </div>\r\n            <div class=\"hint-text mt-2\"\r\n                *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n                {{ field.hint || field.helpText }}\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Password Field (Separated) -->\r\n        <div *ngIf=\"field.type === 'password'\" class=\"field-container\">\r\n            <div class=\"field-label\" *ngIf=\"field.label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </div>\r\n            <div class=\"input-wrapper\">\r\n                <input [type]=\"isPasswordVisible(field.name) ? 'text' : 'password'\" [formControlName]=\"field.name\"\r\n                    [placeholder]=\"field.placeholder || ''\" [readonly]=\"field.readonly\" class=\"form-input\"\r\n                    [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n                    [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\">\r\n                <div class=\"input-suffix\">\r\n                    <span class=\"suffix-text\" *ngIf=\"field.suffixText\">{{ field.suffixText }}</span>\r\n                    <mat-icon *ngIf=\"field.suffixIcon\">{{ field.suffixIcon }}</mat-icon>\r\n                    <mat-icon *ngIf=\"field.icon\">{{ field.icon }}</mat-icon>\r\n                    <mat-icon *ngIf=\"field.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n                    <mat-icon class=\"password-toggle-icon\" (click)=\"togglePassword(field.name)\">\r\n                        {{ isPasswordVisible(field.name) ? 'visibility' : 'visibility_off' }}\r\n                    </mat-icon>\r\n                </div>\r\n            </div>\r\n            <!-- Character count -->\r\n            <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n                <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n                <div class=\"char-count\">\r\n                    {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n                    field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n                </div>\r\n            </div>\r\n            <div class=\"hint-text mt-2\"\r\n                *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n                {{ field.hint || field.helpText }}\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Textarea -->\r\n        <div *ngIf=\"field.type === 'textarea'\" class=\"field-container\">\r\n            <div class=\"field-label\" *ngIf=\"field.label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </div>\r\n            <textarea [formControlName]=\"field.name\" [placeholder]=\"field.placeholder || ''\" [readonly]=\"field.readonly\"\r\n                class=\"form-input form-textarea\" rows=\"4\"\r\n                [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n                [maxlength]=\"field.validationRules?.maxLength || field.uiConfig?.maxCharacters\"></textarea>\r\n            <!-- Character count -->\r\n            <div class=\"char-count-row\" *ngIf=\"field.uiConfig?.maxCharacters || field.validationRules?.maxLength\">\r\n                <div class=\"hint-text\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n                <div class=\"char-count\">\r\n                    {{ getCharacterCount(field.name) }} / {{ field.uiConfig?.maxCharacters ||\r\n                    field.validationRules?.maxLength }} {{ labels.charactersLabel }}\r\n                </div>\r\n            </div>\r\n            <div class=\"hint-text mt-2\"\r\n                *ngIf=\"(field.hint || field.helpText) && !field.uiConfig?.maxCharacters && !field.validationRules?.maxLength\">\r\n                {{ field.hint || field.helpText }}\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Select / Dropdown -->\r\n        <div *ngIf=\"field.type === 'select' || field.type === 'dropdown'\" class=\"field-container\">\r\n            <div class=\"field-label\" *ngIf=\"field.label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </div>\r\n            <select [formControlName]=\"field.name\" class=\"form-input\"\r\n                [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n                <option value=\"\" disabled selected *ngIf=\"field.placeholder\">{{ field.placeholder }}</option>\r\n                <option value=\"\" disabled selected *ngIf=\"!field.placeholder\">{{ labels.selectDefaultPlaceholder }}\r\n                </option>\r\n                <option *ngFor=\"let opt of getFieldOptions(field)\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n            </select>\r\n            <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n        </div>\r\n\r\n        <!-- Date -->\r\n        <div *ngIf=\"field.type === 'date'\" class=\"field-container\">\r\n            <div class=\"field-label\" *ngIf=\"field.label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </div>\r\n            <div class=\"relative\">\r\n                <input matInput [matDatepicker]=\"picker\" [formControlName]=\"field.name\"\r\n                    [placeholder]=\"field.placeholder || ''\" class=\"form-input\"\r\n                    [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n                <mat-datepicker-toggle matSuffix [for]=\"picker\" class=\"date-toggle\"></mat-datepicker-toggle>\r\n                <mat-datepicker #picker></mat-datepicker>\r\n            </div>\r\n            <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n        </div>\r\n\r\n        <!-- Radio -->\r\n        <div *ngIf=\"field.type === 'radio'\" class=\"radio-group-container\"\r\n            [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\">\r\n            <label class=\"field-label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </label>\r\n            <mat-radio-group [formControlName]=\"field.name\" class=\"radio-group\">\r\n                <mat-radio-button *ngFor=\"let opt of getFieldOptions(field)\" [value]=\"opt.value\" class=\"radio-button\">\r\n                    {{ opt.label }}\r\n                </mat-radio-button>\r\n            </mat-radio-group>\r\n            <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n        </div>\r\n\r\n        <!-- Composite Field (Sub-groups) -->\r\n        <div *ngIf=\"field.type === 'composite'\" class=\"field-container\">\r\n            <div class=\"field-label\" *ngIf=\"field.label\">\r\n                {{ field.label }}\r\n                <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n            </div>\r\n            <div class=\"composite-container\">\r\n                <ng-container *ngFor=\"let sub of field.subFields; let last = last\">\r\n                    <div class=\"composite-sub-field\" style=\"flex: 1;\">\r\n                        <div class=\"field-label\" *ngIf=\"sub.label\"\r\n                            style=\"font-size: 0.75rem; font-weight: normal; margin-bottom: 0.25rem;\">\r\n                            {{ sub.label }}\r\n                        </div>\r\n                        <div class=\"input-wrapper\">\r\n                            <input [type]=\"sub.type\" [formControlName]=\"sub.name\" [placeholder]=\"sub.placeholder || ''\"\r\n                                [readonly]=\"sub.readonly\" class=\"form-input\"\r\n                                [class.is-invalid]=\"group.get(sub.name)?.touched && group.get(sub.name)?.invalid\">\r\n                            <div class=\"input-suffix\" [class.color-suffix]=\"sub.suffixText === '%'\">\r\n                                <span class=\"suffix-text\" *ngIf=\"sub.suffixText\">{{ sub.suffixText }}</span>\r\n                                <mat-icon *ngIf=\"sub.readonly\" class=\"lock-icon\">lock_outline</mat-icon>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                    <!-- Adjust separator alignment if labels are present -->\r\n                    <span class=\"separator\" *ngIf=\"!last && field.separator\"\r\n                        [style.padding-top]=\"sub.label ? '1.25rem' : '0'\">{{ field.separator }}</span>\r\n                </ng-container>\r\n            </div>\r\n            <div class=\"hint-text mt-2\" *ngIf=\"field.hint || field.helpText\">{{ field.hint || field.helpText }}</div>\r\n            <div class=\"error-text text-danger text-small mt-1\" *ngIf=\"group.errors?.['invalid_minMax_' + field.name]\">\r\n                {{ labels.errorMinValue }}\r\n            </div>\r\n            <div class=\"error-text text-danger text-small mt-1\"\r\n                *ngIf=\"group.errors?.['invalid_percentageTotal_' + field.name]\">\r\n                {{ labels.errorPercentageTotal }}\r\n            </div>\r\n        </div>\r\n    </div>\r\n\r\n    <!-- File Upload -->\r\n    <div *ngIf=\"field.type === 'file'\" class=\"field-container\">\r\n        <div class=\"field-label\" *ngIf=\"field.label\">\r\n            {{ field.label }}\r\n            <span class=\"text-danger\" *ngIf=\"field.required || field.mandatory\">*</span>\r\n        </div>\r\n\r\n        <!-- Upload Box -->\r\n        <div class=\"upload-box\" (click)=\"fileInput.click()\"\r\n            [class.is-invalid]=\"group.get(field.name)?.touched && group.get(field.name)?.invalid\"\r\n            *ngIf=\"!field.uploadedFiles || field.uploadedFiles.length === 0 || field.multiple\">\r\n            <mat-icon class=\"upload-icon\">cloud_upload</mat-icon>\r\n            <div class=\"upload-text\">{{ labels.uploadDragDropText }}</div>\r\n            <div class=\"upload-hint\">{{ labels.uploadHint }}</div>\r\n            <input #fileInput type=\"file\" [attr.multiple]=\"field.multiple ? true : null\" [attr.accept]=\"field.accept\"\r\n                (change)=\"onFileChange($event, field)\" style=\"display: none;\">\r\n        </div>\r\n\r\n        <!-- Uploaded Files List -->\r\n        <div class=\"uploaded-files-list\" *ngIf=\"field.uploadedFiles && field.uploadedFiles.length > 0\">\r\n            <div class=\"uploaded-file-item\" *ngFor=\"let file of field.uploadedFiles; let i = index\">\r\n                <div class=\"file-icon\">\r\n                    <mat-icon class=\"pdf-icon\" *ngIf=\"file.type === 'application/pdf'\">picture_as_pdf</mat-icon>\r\n                    <mat-icon class=\"doc-icon\"\r\n                        *ngIf=\"file.type.includes('word') || file.type.includes('document')\">description</mat-icon>\r\n                    <mat-icon class=\"img-icon\" *ngIf=\"file.type.includes('image')\">image</mat-icon>\r\n                    <mat-icon class=\"file-icon-default\"\r\n                        *ngIf=\"!file.type.includes('pdf') && !file.type.includes('word') && !file.type.includes('document') && !file.type.includes('image')\">insert_drive_file</mat-icon>\r\n                </div>\r\n                <div class=\"file-info\">\r\n                    <div class=\"file-name\">{{ file.name }}</div>\r\n                    <div class=\"file-size\">{{ (file.size / 1024).toFixed(2) }} KB</div>\r\n                </div>\r\n                <button mat-icon-button color=\"warn\" type=\"button\" (click)=\"removeFile(field, i)\"\r\n                    class=\"remove-file-btn\">\r\n                    <mat-icon>close</mat-icon>\r\n                </button>\r\n            </div>\r\n        </div>\r\n\r\n    </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { ConfigurableFormComponent } from './component/configurable-form.component';\r\nimport { MaterialModule } from '../material/material.module';\r\n\r\n@NgModule({\r\n    declarations: [],\r\n    imports: [\r\n        CommonModule,\r\n        ReactiveFormsModule,\r\n        MaterialModule,\r\n        ConfigurableFormComponent\r\n    ],\r\n    exports: [\r\n        ConfigurableFormComponent\r\n    ]\r\n})\r\nexport class ConfigurableFormModule { }\r\n","import { Component, EventEmitter, Input, OnInit, Output, ElementRef, HostListener } from '@angular/core';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { TableFilterConfig, TableFilterOutput, TableFilterColumn, TableFilterLabels } from '../../filter.models';\r\n\r\n@Component({\r\n    selector: 'lib-filter',\r\n    templateUrl: './filter.component.html',\r\n    styleUrls: ['./filter.component.scss'],\r\n    standalone: false\r\n})\r\nexport class FilterComponent implements OnInit {\r\n    @Input() config: TableFilterConfig = { items: [] };\r\n    @Input() activeFilters: TableFilterOutput = {};\r\n    @Input() columns: TableFilterColumn[] = [];\r\n    @Input() labels: TableFilterLabels = {\r\n        filterBtn: '',\r\n        clear: '',\r\n        apply: '',\r\n        search: '',\r\n        columns: '',\r\n        showAll: '',\r\n        hideAll: ''\r\n    };\r\n    @Input() theme: string = '';\r\n\r\n    @Output() filterChange = new EventEmitter<TableFilterOutput>();\r\n    @Output() columnChange = new EventEmitter<TableFilterColumn[]>();\r\n    @Output() toggle = new EventEmitter<boolean>();\r\n\r\n    isOpen = false;\r\n    activeTab: 'filters' | 'columns' = 'filters';\r\n\r\n    // Temporary state while panel is open\r\n    tempFilters: TableFilterOutput = {};\r\n    tempColumns: TableFilterColumn[] = [];\r\n\r\n    constructor(\r\n        private elementRef: ElementRef,\r\n        private router: Router,\r\n        private route: ActivatedRoute\r\n    ) { }\r\n\r\n    ngOnInit(): void {\r\n        this.syncTempState();\r\n        this.initFromUrl();\r\n    }\r\n\r\n    private initFromUrl(): void {\r\n        if (this.config.settings?.persistent) {\r\n            this.route.queryParams.subscribe(params => {\r\n                if (Object.keys(params).length > 0) {\r\n                    const newFilters: TableFilterOutput = { ...this.activeFilters };\r\n                    Object.keys(params).forEach(key => {\r\n                        // Skip non-filter params if possible, or assume all are filters\r\n                        // Ideally we check against config items\r\n                        if (params[key] !== undefined) {\r\n                            newFilters[key] = params[key];\r\n                        }\r\n                    });\r\n                    this.activeFilters = newFilters;\r\n                    this.syncTempState();\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    @HostListener('document:click', ['$event'])\r\n    onClickOutside(event: Event): void {\r\n        if (!this.elementRef.nativeElement.contains(event.target)) {\r\n            this.isOpen = false;\r\n        }\r\n    }\r\n\r\n    togglePanel(): void {\r\n        this.isOpen = !this.isOpen;\r\n        if (this.isOpen) {\r\n            this.syncTempState();\r\n            this.activeTab = 'filters';\r\n        }\r\n        this.toggle.emit(this.isOpen);\r\n    }\r\n\r\n    setActiveTab(tab: 'filters' | 'columns'): void {\r\n        this.activeTab = tab;\r\n    }\r\n\r\n    // Generic Filter Change Handler\r\n    onFilterChange(key: string | undefined, value: any): void {\r\n        if (!key) return;\r\n        this.tempFilters[key] = value;\r\n    }\r\n\r\n    // Column Visibility Logic\r\n    toggleColumn(columnId: string): void {\r\n        const col = this.tempColumns.find(c => c.id === columnId);\r\n        if (col) {\r\n            col.visible = !col.visible;\r\n        }\r\n    }\r\n\r\n    toggleAllColumns(visible: boolean): void {\r\n        this.tempColumns.forEach(c => c.visible = visible);\r\n    }\r\n\r\n    // Actions\r\n    clearAll(): void {\r\n        if (this.activeTab === 'filters') {\r\n            this.tempFilters = {};\r\n            if (this.config.settings?.persistent) {\r\n                this.updateUrl({});\r\n            }\r\n        } else {\r\n            // Reset columns to default or show all?\r\n            // Usually 'clear' in filters context means clear filters\r\n            // But if we are in columns tab, maybe we want to reset columns?\r\n            // For now, let's keep it simple: generic clear clears filters.\r\n            this.tempFilters = {};\r\n        }\r\n        // If we want clear to apply immediately without clicking apply:\r\n        // this.apply(); \r\n        // But usually \"Clear\" inside panel just clears temp state until Apply is clicked.\r\n        // However, if the user requested \"Persistent\" and \"Clear\", they might expect immediate URL update?\r\n        // Standard UX: panel actions apply on \"Apply\".\r\n        // The persisted state should only change when \"Apply\" is clicked?\r\n        // Wait, if I update URL on clearAll inside panel, it might be confusing if panel is still open with cleared state but not \"applied\" to data.\r\n        // Re-reading expectation: \"Persistent\" setting usually means the filter state is synced with URL.\r\n        // If I clear temp state, URL shouldn't change until I click Apply.\r\n        // SO I WILL NOT UPDATE URL HERE. The `initFromUrl` loads INTO `activeFilters`.\r\n        // `apply()` updates `activeFilters` AND should update URL.\r\n    }\r\n\r\n    apply(): void {\r\n        // Apply temp state to active state\r\n        this.activeFilters = { ...this.tempFilters };\r\n        // Clean up undefined/null values\r\n        Object.keys(this.activeFilters).forEach(key => {\r\n            if (this.activeFilters[key] === null || this.activeFilters[key] === undefined || this.activeFilters[key] === '') {\r\n                delete this.activeFilters[key];\r\n            }\r\n        });\r\n\r\n        // Apply columns\r\n        this.columns = this.tempColumns.map(c => ({ ...c }));\r\n\r\n        this.filterChange.emit(this.activeFilters);\r\n        this.columnChange.emit(this.columns);\r\n\r\n        if (this.config.settings?.persistent) {\r\n            this.updateUrl(this.activeFilters);\r\n        }\r\n\r\n        this.isOpen = false;\r\n    }\r\n\r\n\r\n    private updateUrl(queryParams: any): void {\r\n        this.router.navigate([], {\r\n            relativeTo: this.route,\r\n            queryParams: queryParams,\r\n            queryParamsHandling: 'merge', // or 'replace' to clear others? 'merge' ensures we don't lose other params\r\n            // But wait, if we removed a filter, merge keeps it?\r\n            // We need to explicitly clear removed keys if we use merge.\r\n            // Or use pure replacement of filter keys.\r\n            // For simplicity, let's assuming we want to replace parameters that overlap.\r\n            // But to clear keys, we need to pass `null` or `undefined` for those keys in `queryParams`?\r\n            // Angular router: passing null removes the param.\r\n        });\r\n\r\n        // Refined updateUrl logic:\r\n        // We merged activeFilters. But if we removed a key, it's missing from activeFilters.\r\n        // We need to compare with current params and remove keys that are no longer in activeFilters?\r\n        // A simpler way for this component:\r\n        // We likely want to replace ALL query params that correspond to filters. \r\n        // But we don't know which params are filters vs other things (e.g. page, sort).\r\n        // For now, I will just push `this.activeFilters`. \r\n        // NOTE: This doesn't clear keys that were removed. \r\n        // To fix clearing:\r\n        // I should probably navigate with exact activeFilters if I knew they are the ONLY params.\r\n        // Better:\r\n        // this.router.navigate([], { queryParams: this.activeFilters }); // property replaces all\r\n        // If we want to keep 'page', etc., we need to include them.\r\n        // Let's use 'merge' but we need to handle clearing.\r\n        // I will implement a smarter update.\r\n    }\r\n\r\n    activeFilterCountValue(): number {\r\n        return Object.keys(this.activeFilters).length;\r\n    }\r\n\r\n\r\n    get activeFilterCount(): number {\r\n        return Object.keys(this.activeFilters).length;\r\n    }\r\n\r\n    private syncTempState(): void {\r\n        this.tempFilters = { ...this.activeFilters };\r\n        this.tempColumns = JSON.parse(JSON.stringify(this.columns || []));\r\n    }\r\n\r\n    get containerStyles(): { [key: string]: string } {\r\n        const styles: { [key: string]: string } = {};\r\n        if (this.config.styles) {\r\n            if (this.config.styles.width) styles['--cc-filter-panel-width'] = this.config.styles.width;\r\n            if (this.config.styles.padding) styles['--cc-filter-panel-padding'] = this.config.styles.padding;\r\n            if (this.config.styles.gap) styles['--cc-filter-panel-gap'] = this.config.styles.gap;\r\n            if (this.config.styles.backgroundColor) styles['--cc-filter-panel-bg'] = this.config.styles.backgroundColor;\r\n            if (this.config.styles.borderRadius) styles['--cc-filter-panel-radius'] = this.config.styles.borderRadius;\r\n            if (this.config.styles.headerHeight) styles['--cc-filter-panel-header-height'] = this.config.styles.headerHeight;\r\n        }\r\n        return styles;\r\n    }\r\n\r\n    trackByFn(index: number, item: any): any {\r\n        return item.key || index;\r\n    }\r\n}\r\n","<div class=\"cc-filter-container\" [class.is-open]=\"isOpen\" [ngStyle]=\"containerStyles\">\r\n\r\n    <!-- Trigger Button -->\r\n    <lib-button variant=\"outline\" (click)=\"togglePanel()\" class=\"cc-filter-trigger\"\r\n        [class.active]=\"activeFilterCount > 0\">\r\n        <span class=\"fas fa-filter\"></span> {{ labels?.filterBtn || 'Filter' }}\r\n        <span *ngIf=\"activeFilterCount > 0\" class=\"cc-badge\">{{ activeFilterCount }}</span>\r\n    </lib-button>\r\n\r\n    <!-- Dropdown Panel -->\r\n    <div class=\"cc-filter-panel mat-elevation-z4\" *ngIf=\"isOpen\" (click)=\"$event.stopPropagation()\">\r\n\r\n        <!-- Header / Tabs -->\r\n        <div class=\"cc-panel-header\">\r\n            <div class=\"cc-tabs\">\r\n                <div class=\"cc-tab\" [class.active]=\"activeTab === 'filters'\" (click)=\"setActiveTab('filters')\">\r\n                    {{ labels.filterBtn }}\r\n                </div>\r\n                <!-- Hide columns tab if no columns config provided -->\r\n                <div class=\"cc-tab\" [class.active]=\"activeTab === 'columns'\" (click)=\"setActiveTab('columns')\"\r\n                    *ngIf=\"columns?.length\">\r\n                    {{ labels.columns }}\r\n                </div>\r\n            </div>\r\n            <button type=\"button\" class=\"cc-icon-btn\" (click)=\"togglePanel()\">\r\n                <span class=\"material-icons\">close</span>\r\n            </button>\r\n        </div>\r\n\r\n        <!-- Filters Tab Content -->\r\n        <div class=\"cc-panel-content\" *ngIf=\"activeTab === 'filters'\">\r\n\r\n            <!-- Dynamic Items -->\r\n            <ng-container *ngFor=\"let item of config.items; trackBy: trackByFn\">\r\n                <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: item }\"></ng-container>\r\n            </ng-container>\r\n\r\n        </div>\r\n\r\n        <!-- Columns Tab Content -->\r\n        <div class=\"cc-panel-content\" *ngIf=\"activeTab === 'columns'\">\r\n            <div class=\"cc-columns-actions\">\r\n                <lib-button variant=\"outline\" class=\"cc-btn-text\" (click)=\"toggleAllColumns(true)\">{{ labels.showAll\r\n                    }}</lib-button>\r\n                <lib-button variant=\"outline\" class=\"cc-btn-text\" (click)=\"toggleAllColumns(false)\">{{ labels.hideAll\r\n                    }}</lib-button>\r\n            </div>\r\n            <div class=\"cc-columns-list\">\r\n                <div *ngFor=\"let col of tempColumns\" class=\"cc-column-item\">\r\n                    <lib-checkbox [label]=\"col.label\" [checked]=\"col.visible\" (checkedChange)=\"toggleColumn(col.id)\">\r\n                    </lib-checkbox>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <!-- Footer Actions -->\r\n        <div class=\"cc-panel-footer\">\r\n            <lib-button variant=\"outline\" color=\"warn\" class=\"cc-btn-text text-danger\" (click)=\"clearAll()\">\r\n                {{ labels.clear }}\r\n            </lib-button>\r\n            <lib-button class=\"ms-2\" variant=\"primary\" (click)=\"apply()\">\r\n                {{ labels.apply }}\r\n            </lib-button>\r\n        </div>\r\n\r\n    </div>\r\n</div>\r\n\r\n<!-- Recursive Template for Items -->\r\n<ng-template #itemTemplate let-item=\"item\">\r\n    <div class=\"cc-filter-item\" [ngClass]=\"['type-' + item.type]\"\r\n        [style.display]=\"item.visible === false ? 'none' : 'block'\" [ngStyle]=\"item.styles\">\r\n\r\n        <ng-container [ngSwitch]=\"item.type\">\r\n\r\n            <!-- Input -->\r\n            <lib-input *ngSwitchCase=\"'input'\" [config]=\"item.inputConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"tempFilters[item.key]\" (valueChange)=\"onFilterChange(item.key, $event)\">\r\n            </lib-input>\r\n\r\n            <!-- Dropdown -->\r\n            <lib-dropdown *ngSwitchCase=\"'dropdown'\" [config]=\"item.dropdownConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"tempFilters[item.key]\" (selectionChange)=\"onFilterChange(item.key, $event)\">\r\n            </lib-dropdown>\r\n\r\n            <!-- Checkbox -->\r\n            <lib-checkbox *ngSwitchCase=\"'checkbox'\" [config]=\"item.checkboxConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"tempFilters[item.key]\" (checkedChange)=\"onFilterChange(item.key, $event)\">\r\n            </lib-checkbox>\r\n\r\n            <!-- Radio -->\r\n            <lib-radio *ngSwitchCase=\"'radio'\" [config]=\"item.radioConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"tempFilters[item.key]\" (selectionChange)=\"onFilterChange(item.key, $event)\">\r\n            </lib-radio>\r\n\r\n            <!-- Toggle -->\r\n            <lib-toggle *ngSwitchCase=\"'toggle'\" [config]=\"item.toggleConfig\" [label]=\"item.label\"\r\n                [checked]=\"tempFilters[item.key]\" (toggleChange)=\"onFilterChange(item.key, $event)\">\r\n            </lib-toggle>\r\n\r\n            <!-- Datepicker -->\r\n            <lib-datepicker *ngSwitchCase=\"'datepicker'\" [config]=\"item.datepickerConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"tempFilters[item.key]\" (dateChange)=\"onFilterChange(item.key, $event)\">\r\n            </lib-datepicker>\r\n\r\n            <!-- Search -->\r\n            <lib-search *ngSwitchCase=\"'active-search'\" [config]=\"item.searchConfig\" [label]=\"item.label\"\r\n                [ngModel]=\"tempFilters[item.key]\" (search)=\"onFilterChange(item.key, $event)\">\r\n            </lib-search>\r\n\r\n            <!-- Group / Accordion -->\r\n            <div *ngSwitchCase=\"'group'\" class=\"cc-accordion-item\" [class.expanded]=\"item.expanded\">\r\n                <button type=\"button\" class=\"cc-accordion-header\" (click)=\"item.expanded = !item.expanded\">\r\n                    <span class=\"cc-accordion-title\">{{ item.label }}</span>\r\n                    <span class=\"material-icons cc-accordion-icon\">{{ item.expanded ? 'expand_less' : 'expand_more'\r\n                        }}</span>\r\n                </button>\r\n\r\n                <div class=\"cc-accordion-body\" *ngIf=\"item.expanded\">\r\n                    <ng-container *ngFor=\"let child of item.children; trackBy: trackByFn\">\r\n                        <ng-container *ngTemplateOutlet=\"itemTemplate; context: { item: child }\"></ng-container>\r\n                    </ng-container>\r\n                </div>\r\n            </div>\r\n\r\n            <!-- Custom Divider -->\r\n            <div *ngSwitchCase=\"'divider'\" class=\"cc-filter-divider\"></div>\r\n\r\n        </ng-container>\r\n    </div>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { FormComponentsModule } from '../form-components/form-components.module';\r\nimport { FilterComponent } from './components/filter/filter.component';\r\n\r\n@NgModule({\r\n    declarations: [\r\n        FilterComponent\r\n    ],\r\n    imports: [\r\n        CommonModule,\r\n        FormsModule,\r\n        ReactiveFormsModule,\r\n        ButtonModule,\r\n        FormComponentsModule\r\n    ],\r\n    exports: [\r\n        FilterComponent\r\n    ]\r\n})\r\nexport class FilterModule { }\r\n","export const DEFAULT_ITEMS_PER_PAGE = 10;\r\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [5, 10, 20, 50, 100];\r\nexport const PAGINATION_THEME_DEFAULT = 'theme-1';\r\nexport const PAGINATION_THEME_DARK = 'theme-2';\r\n\r\n// Nav\r\nexport const NAV_VARIANT_DEFAULT: 'filled' | 'underline' | 'pills' = 'filled';\r\nexport const NAV_ORIENTATION_DEFAULT: 'horizontal' | 'vertical' = 'horizontal';\r\n\r\n// Side Nav\r\nexport const DEFAULT_SIDE_NAV_TOOLTIP_POSITION = 'right';\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, HostBinding } from '@angular/core';\r\nimport { TooltipPosition } from '@angular/material/tooltip';\r\nimport { SideNavSection, SideNavItem, SideNavStyleConfig } from '../../side-nav.models';\r\nimport { DEFAULT_SIDE_NAV_TOOLTIP_POSITION } from '../../../../utils/constants';\r\n\r\n@Component({\r\n  selector: 'lib-side-nav',\r\n  templateUrl: './side-nav.component.html',\r\n  styleUrls: ['./side-nav.component.scss'],\r\n  standalone: false\r\n})\r\nexport class SideNavComponent implements OnChanges {\r\n  @Input() sections: SideNavSection[] = [];\r\n  @Input() userRoles?: string[]; // If provided, filters items automatically based on roles\r\n  @Input() activeId?: string;\r\n  @Input() styleConfig?: SideNavStyleConfig;\r\n\r\n  /** Control whether the nav is collapsed externally (two-way bindable) */\r\n  @Input() collapsed: boolean = false;\r\n  /** Width of the nav when expanded. Overrides the CSS variable default. */\r\n  @Input() width?: string;\r\n  /** Width of the nav when collapsed (icons only). Overrides the CSS variable default. */\r\n  @Input() collapsedWidth?: string;\r\n  /** Whether to show the collapse toggle button */\r\n  @Input() showCollapseToggle: boolean = true;\r\n  /** Whether to hide icons when the side nav is expanded */\r\n  @Input() hideIconsWhenExpanded: boolean = false;\r\n  /** Whether to show tooltips on nav items */\r\n  @Input() showTooltips: boolean = false;\r\n  /** Position of the tooltip */\r\n  @Input() tooltipPosition: TooltipPosition = DEFAULT_SIDE_NAV_TOOLTIP_POSITION as TooltipPosition;\r\n\r\n  /** Optional dictionary for label translation */\r\n  @Input() labels?: { [key: string]: string };\r\n\r\n  @Output() itemClicked = new EventEmitter<SideNavItem>();\r\n  /** Emits whenever the collapsed state changes (supports two-way binding via [(collapsed)]) */\r\n  @Output() collapsedChange = new EventEmitter<boolean>();\r\n\r\n  /** Applies collapsed class to :host for the width CSS transition */\r\n  @HostBinding('class.cc-side-nav-host-collapsed') get isHostCollapsed() {\r\n    return this.collapsed;\r\n  }\r\n\r\n  filteredSections: SideNavSection[] = [];\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['sections'] || changes['userRoles'] || changes['labels']) {\r\n      this.filterAndMapSections();\r\n    }\r\n  }\r\n\r\n  private filterAndMapSections() {\r\n    if (!this.sections) {\r\n      this.filteredSections = [];\r\n      return;\r\n    }\r\n\r\n    const clonedSections: SideNavSection[] = structuredClone(this.sections);\r\n\r\n    this.filteredSections = clonedSections.map(section => {\r\n      // Map section heading if labels are provided\r\n      if (this.labels && section.heading) {\r\n        section.heading = this.labels[section.heading] || section.heading;\r\n      }\r\n\r\n      // Filter and map items\r\n      section.items = section.items.filter(item => {\r\n        if (this.userRoles && this.userRoles.length > 0 && item.roles && item.roles.length > 0) {\r\n           const hasRole = item.roles.some(role => this.userRoles?.includes(role));\r\n           if (!hasRole) return false;\r\n        }\r\n        return true;\r\n      }).map((item: any) => {\r\n        // Map item labels and tooltips\r\n        if (this.labels) {\r\n           const mappedLabel = this.labels[item.labelKey || item.label] || item.labelKey || item.label;\r\n           return {\r\n             ...item,\r\n             label: mappedLabel,\r\n             tooltip: this.labels[item.tooltip || item.labelKey] || mappedLabel\r\n           };\r\n        }\r\n        return item;\r\n      });\r\n\r\n      return section;\r\n    }).filter(section => section.items.length > 0);\r\n  }\r\n\r\n  onItemClick(item: SideNavItem, event: Event) {\r\n    if (item.disabled) {\r\n      event.preventDefault();\r\n      return;\r\n    }\r\n    this.activeId = item.id;\r\n    this.itemClicked.emit(item);\r\n  }\r\n\r\n  toggleCollapse() {\r\n    this.collapsed = !this.collapsed;\r\n    this.collapsedChange.emit(this.collapsed);\r\n  }\r\n\r\n  get customStyles(): { [key: string]: string } {\r\n    const styles: { [key: string]: string } = {};\r\n\r\n    // Size overrides from direct inputs (take priority over styleConfig)\r\n    if (this.width) styles['--cc-side-nav-width'] = this.width;\r\n    if (this.collapsedWidth) styles['--cc-side-nav-collapsed-width'] = this.collapsedWidth;\r\n\r\n    if (!this.styleConfig) return styles;\r\n\r\n    if (this.styleConfig.bg) styles['--cc-side-nav-bg'] = this.styleConfig.bg;\r\n    if (this.styleConfig.width) styles['--cc-side-nav-width'] = this.styleConfig.width;\r\n    if (this.styleConfig.collapsedWidth) styles['--cc-side-nav-collapsed-width'] = this.styleConfig.collapsedWidth;\r\n    if (this.styleConfig.fontFamily) styles['--cc-side-nav-font-family'] = this.styleConfig.fontFamily;\r\n    if (this.styleConfig.headingColor) styles['--cc-side-nav-heading-color'] = this.styleConfig.headingColor;\r\n    if (this.styleConfig.itemColor) styles['--cc-side-nav-item-color'] = this.styleConfig.itemColor;\r\n    if (this.styleConfig.itemHoverBg) styles['--cc-side-nav-item-hover-bg'] = this.styleConfig.itemHoverBg;\r\n    if (this.styleConfig.activeBg) styles['--cc-side-nav-active-bg'] = this.styleConfig.activeBg;\r\n    if (this.styleConfig.activeColor) styles['--cc-side-nav-active-color'] = this.styleConfig.activeColor;\r\n    if (this.styleConfig.activeHoverBg) styles['--cc-side-nav-active-hover-bg'] = this.styleConfig.activeHoverBg;\r\n    if (this.styleConfig.toggleBg) styles['--cc-side-nav-toggle-bg'] = this.styleConfig.toggleBg;\r\n    if (this.styleConfig.toggleBorderColor) styles['--cc-side-nav-toggle-border-color'] = this.styleConfig.toggleBorderColor;\r\n    if (this.styleConfig.tooltipBg) styles['--cc-side-nav-tooltip-bg'] = this.styleConfig.tooltipBg;\r\n    if (this.styleConfig.tooltipColor) styles['--cc-side-nav-tooltip-color'] = this.styleConfig.tooltipColor;\r\n    if (this.styleConfig.tooltipFontWeight) styles['--cc-side-nav-tooltip-font-weight'] = this.styleConfig.tooltipFontWeight;\r\n    if (this.styleConfig.tooltipLetterSpacing) styles['--cc-side-nav-tooltip-letter-spacing'] = this.styleConfig.tooltipLetterSpacing;\r\n    if (this.styleConfig.tooltipOffset) styles['--cc-side-nav-tooltip-offset'] = this.styleConfig.tooltipOffset;\r\n    if (this.styleConfig.tooltipShadow) styles['--cc-side-nav-tooltip-shadow'] = this.styleConfig.tooltipShadow;\r\n\r\n    return styles;\r\n  }\r\n}","<nav class=\"cc-side-nav\" [class.collapsed]=\"collapsed\" role=\"navigation\" [ngStyle]=\"customStyles\">\r\n\r\n  <div class=\"cc-side-nav-section\" *ngFor=\"let section of filteredSections; let i = index\">\r\n\r\n    <div class=\"cc-side-nav-heading-row\" *ngIf=\"section.heading && !collapsed\">\r\n      <h3 class=\"cc-side-nav-heading\">{{ section.heading }}</h3>\r\n    </div>\r\n\r\n    <ul class=\"cc-side-nav-list\">\r\n      <li *ngFor=\"let item of section.items\" class=\"cc-side-nav-list-item\">\r\n        <a (click)=\"onItemClick(item, $event)\" class=\"cc-side-nav-link\" [class.active]=\"item.id === activeId\"\r\n          [class.disabled]=\"item.disabled\" [matTooltip]=\"item.tooltip || item.label\"\r\n          [matTooltipPosition]=\"tooltipPosition\"\r\n          [matTooltipClass]=\"'cc-side-nav-tooltip'\" [attr.aria-current]=\"(item.id === activeId) ? 'page' : null\"\r\n          [attr.aria-disabled]=\"item.disabled ? true : null\">\r\n          <span *ngIf=\"item.icon && (collapsed || !hideIconsWhenExpanded)\" class=\"cc-side-nav-icon\">\r\n            <span *ngIf=\"!item.icon.includes('fa') && !item.icon.includes('bi')\" class=\"material-icons\">\r\n              {{ item.icon }}\r\n            </span>\r\n            <i *ngIf=\"item.icon.includes('fa') || item.icon.includes('bi')\" [class]=\"item.icon\"></i>\r\n          </span>\r\n          <!-- Label: always in DOM, CSS transitions handle fade on collapse -->\r\n          <span class=\"cc-side-nav-label\">{{ item.label }}</span>\r\n          <!-- Arrow: rendered for active items regardless of collapse state; CSS hides it -->\r\n          <span class=\"cc-side-nav-arrow material-icons\"\r\n            *ngIf=\"(item.id === activeId) && item.showArrow !== false\">chevron_right</span>\r\n        </a>\r\n      </li>\r\n    </ul>\r\n\r\n  </div>\r\n\r\n</nav>\r\n\r\n<!--\r\n  Toggle pill — always straddles the right edge of :host (right: -12px).\r\n  Hidden via opacity/scale until :host is hovered; always visible when collapsed.\r\n  Single chevron SVG rotates 180° via CSS — no icon swap needed.\r\n-->\r\n<button *ngIf=\"showCollapseToggle\"\r\n        class=\"cc-sn-toggle\"\r\n        (click)=\"toggleCollapse()\"\r\n        type=\"button\"\r\n        [attr.aria-label]=\"collapsed ? 'Expand navigation' : 'Collapse navigation'\">\r\n  <svg class=\"cc-sn-chevron\"\r\n       xmlns=\"http://www.w3.org/2000/svg\"\r\n       viewBox=\"0 0 16 16\"\r\n       fill=\"none\"\r\n       aria-hidden=\"true\">\r\n    <path d=\"M10 3L5 8L10 13\"\r\n          stroke=\"currentColor\"\r\n          stroke-width=\"1.75\"\r\n          stroke-linecap=\"round\"\r\n          stroke-linejoin=\"round\"/>\r\n  </svg>\r\n</button>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { SideNavComponent } from './components/side-nav/side-nav.component';\r\n\r\n@NgModule({\r\n  declarations: [SideNavComponent],\r\n  imports: [\r\n    CommonModule,\r\n    RouterModule,\r\n    MaterialModule\r\n  ],\r\n  exports: [SideNavComponent]\r\n})\r\nexport class SideNavModule { }\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\nimport { DEFAULT_ITEMS_PER_PAGE, DEFAULT_PAGE_SIZE_OPTIONS, PAGINATION_THEME_DEFAULT } from '../../../../utils/constants';\r\n\r\nexport interface PaginationLabels {\r\n  items: string;\r\n  of: string;\r\n  perPage: string;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-pagination',\r\n  templateUrl: './pagination.component.html',\r\n  styleUrls: ['./pagination.component.scss'],\r\n  standalone: false\r\n})\r\nexport class PaginationComponent implements OnInit, OnChanges {\r\n  @Input() totalItems: number = 0;\r\n  @Input() itemsPerPage: number = DEFAULT_ITEMS_PER_PAGE;\r\n  @Input() currentPage: number = 1;\r\n  @Input() pageSizeOptions: number[] = DEFAULT_PAGE_SIZE_OPTIONS;\r\n  @Input() theme: 'theme-1' | 'theme-2' = PAGINATION_THEME_DEFAULT;\r\n  @Input() labels: PaginationLabels = {\r\n    items: 'items',\r\n    of: 'of',\r\n    perPage: 'Per Page'\r\n  };\r\n\r\n  @Output() pageChange = new EventEmitter<number>();\r\n  @Output() itemsPerPageChange = new EventEmitter<number>();\r\n\r\n  totalPages: number = 0;\r\n  pages: (number | string)[] = [];\r\n  startItem: number = 0;\r\n  endItem: number = 0;\r\n\r\n  constructor() { }\r\n\r\n  ngOnInit(): void {\r\n    this.calculatePagination();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['totalItems'] || changes['itemsPerPage'] || changes['currentPage']) {\r\n      this.calculatePagination();\r\n    }\r\n  }\r\n\r\n  calculatePagination(): void {\r\n    this.totalPages = Math.ceil(this.totalItems / this.itemsPerPage);\r\n\r\n    // Ensure current page is valid\r\n    if (this.currentPage < 1) {\r\n      this.currentPage = 1;\r\n    } else if (this.currentPage > this.totalPages && this.totalPages > 0) {\r\n      this.currentPage = this.totalPages;\r\n    }\r\n\r\n    this.startItem = (this.currentPage - 1) * this.itemsPerPage + 1;\r\n    this.endItem = Math.min(this.currentPage * this.itemsPerPage, this.totalItems);\r\n\r\n    if (this.totalItems === 0) {\r\n      this.startItem = 0;\r\n      this.endItem = 0;\r\n    }\r\n\r\n    this.pages = this.getVisiblePages(this.currentPage, this.totalPages);\r\n  }\r\n\r\n  getVisiblePages(current: number, total: number): (number | string)[] {\r\n    if (total <= 7) {\r\n      return Array.from({ length: total }, (_, i) => i + 1);\r\n    }\r\n\r\n    if (current <= 4) {\r\n      return [1, 2, 3, 4, 5, '...', total];\r\n    }\r\n\r\n    if (current >= total - 3) {\r\n      return [1, '...', total - 4, total - 3, total - 2, total - 1, total];\r\n    }\r\n\r\n    return [1, '...', current - 1, current, current + 1, '...', total];\r\n  }\r\n\r\n  onPageChange(page: number | string): void {\r\n    if (typeof page === 'string') return;\r\n    if (page < 1 || page > this.totalPages || page === this.currentPage) return;\r\n    \r\n    this.pageChange.emit(page);\r\n  }\r\n\r\n  onItemsPerPageChange(event: Event): void {\r\n    const target = event.target as HTMLSelectElement;\r\n    const newSize = Number(target.value);\r\n    this.itemsPerPageChange.emit(newSize);\r\n  }\r\n\r\n  nextPage(): void {\r\n    if (this.currentPage < this.totalPages) {\r\n      this.onPageChange(this.currentPage + 1);\r\n    }\r\n  }\r\n\r\n  prevPage(): void {\r\n    if (this.currentPage > 1) {\r\n      this.onPageChange(this.currentPage - 1);\r\n    }\r\n  }\r\n}\r\n","<div class=\"cc-pagination\" [ngClass]=\"theme\">\r\n  <!-- Left Side: Items Info & Per Page -->\r\n  <div class=\"pagination-left\" *ngIf=\"pageSizeOptions.length > 1 || totalItems > 0\">\r\n    <span class=\"items-info\">\r\n      {{ startItem }}-{{ endItem }} {{ labels.of }} {{ totalItems }} {{ labels.items }}\r\n    </span>\r\n\r\n    <div class=\"per-page-selector\" *ngIf=\"pageSizeOptions.length > 1\">\r\n      <div class=\"select-wrapper\">\r\n        <select (change)=\"onItemsPerPageChange($event)\">\r\n          <option *ngFor=\"let option of pageSizeOptions\" [value]=\"option\" [selected]=\"option === itemsPerPage\">\r\n            {{ option }}\r\n          </option>\r\n        </select>\r\n        <span class=\"select-arrow\"></span>\r\n      </div>\r\n      <span class=\"per-page-label\">{{ labels.perPage }}</span>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Right Side: Page Controls -->\r\n  <div class=\"pagination-right\">\r\n    <button \r\n      class=\"page-btn prev-btn\" \r\n      [disabled]=\"currentPage === 1\" \r\n      (click)=\"prevPage()\"\r\n      aria-label=\"Previous Page\">\r\n      <span class=\"icon\">&lsaquo;</span>\r\n    </button>\r\n\r\n    <div class=\"page-numbers\">\r\n      <ng-container *ngFor=\"let page of pages\">\r\n        <button \r\n          *ngIf=\"page !== '...'\"\r\n          class=\"page-btn number-btn\" \r\n          [class.active]=\"page === currentPage\"\r\n          (click)=\"onPageChange(page)\">\r\n          {{ page }}\r\n        </button>\r\n        <span *ngIf=\"page === '...'\" class=\"ellipsis\">...</span>\r\n      </ng-container>\r\n    </div>\r\n\r\n    <button \r\n      class=\"page-btn next-btn\" \r\n      [disabled]=\"currentPage === totalPages || totalPages === 0\" \r\n      (click)=\"nextPage()\"\r\n      aria-label=\"Next Page\">\r\n      <span class=\"icon\">&rsaquo;</span>\r\n    </button>\r\n  </div>\r\n</div>\r\n","import { Pipe, PipeTransform, SecurityContext } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\n\r\n/**\r\n * Marks rich-text HTML (e.g. from a smart-table \"html\" column, always sourced from this\r\n * app's own rich-text editor output, never arbitrary external/user-supplied markup) as\r\n * trusted so [innerHTML] renders it without Angular's default HTML sanitizer stripping it.\r\n *\r\n * Deliberately does NOT run the value through DomSanitizer.sanitize(SecurityContext.HTML, ...)\r\n * first — that sanitizer strips `style` attributes entirely (they're not in its allowlist),\r\n * which silently destroyed rich-text formatting like text color and highlight color while\r\n * leaving semantic-tag formatting (bold/italic/underline) untouched, since only tags — not\r\n * inline styles — survive that pass.\r\n */\r\n@Pipe({\r\n    name: 'safeHtml',\r\n    standalone: false\r\n})\r\nexport class SafeHtmlPipe implements PipeTransform {\r\n    constructor(private sanitizer: DomSanitizer) { }\r\n\r\n    transform(value: string): SafeHtml | null {\r\n        if (!value) {\r\n            return '';\r\n        }\r\n        return this.sanitizer.bypassSecurityTrustHtml(value);\r\n    }\r\n}\r\n","import { Component, EventEmitter, Input, OnInit, Output, OnChanges, SimpleChanges, AfterViewInit, OnDestroy, ViewChildren, QueryList, ElementRef, ChangeDetectorRef, NgZone, inject, LOCALE_ID, HostListener } from '@angular/core';\r\nimport { TableConfig, TableColumn, TableAction, TableFilter, TableDataChangeEvent, TableRowSaveEvent, ActionVisibility, VisibilityRule, ColumnLookupConfig } from '../../models/table-config.model';\r\nimport { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';\r\nimport { formatDate } from '@angular/common';\r\nimport { Router } from '@angular/router';\r\nimport { catchError, finalize, map, debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { of, forkJoin, Subject } from 'rxjs';\r\n\r\n@Component({\r\n  selector: 'lib-smart-table',\r\n  templateUrl: './smart-table.component.html',\r\n  styleUrls: ['./smart-table.component.scss'],\r\n  standalone: false\r\n})\r\nexport class SmartTableComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\r\n  private static instanceCounter = 0;\r\n  /** Unique per-instance name for the row-selection radio group (see `isMultiSelect`). */\r\n  readonly radioGroupName = `st-row-select-${SmartTableComponent.instanceCounter++}`;\r\n\r\n  @Input() config!: TableConfig;\r\n\r\n  /**\r\n   * External data mode: pass table rows directly from the parent.\r\n   * When this input is provided, the component will NOT make any internal API calls.\r\n   * Instead, it emits sortChange / pageChange / searchChange / filterChange events\r\n   * so the parent can fetch and supply updated data.\r\n   */\r\n  @Input() tableData?: any[];\r\n\r\n  /**\r\n   * Total number of items — used by the pagination component when operating in\r\n   * external-data mode. Must be kept in sync by the parent.\r\n   */\r\n  @Input() totalItemsCount?: number;\r\n\r\n  /**\r\n   * External loading state: when the table operates in external-data mode\r\n   * (i.e. [tableData] is provided), the parent controls the loading spinner\r\n   * via this input. Ignored in internal-data mode where loading is self-managed.\r\n   */\r\n  @Input() externalLoading: boolean = false;\r\n\r\n  @Output() action = new EventEmitter<{ action: TableAction, row: any }>();\r\n  @Output() topAction = new EventEmitter<TableAction>(); // For top bar buttons\r\n  @Output() filterChange = new EventEmitter<{ key: string, value: any }>();\r\n  @Output() rowSelect = new EventEmitter<any[]>();\r\n  @Output() columnClick = new EventEmitter<{ row: any, column: string }>();\r\n\r\n  /**\r\n   * Pre-selected row objects. These are tracked across pages.\r\n   * Matching incoming data rows (via rowIdField) will be checked automatically.\r\n   */\r\n  @Input() selectedRows: any[] = [];\r\n\r\n  /** Emitted in external-data mode when the user changes the sort column/direction. */\r\n  @Output() sortChange = new EventEmitter<TableDataChangeEvent>();\r\n  /** Emitted in external-data mode when the user changes the page or page size. */\r\n  @Output() pageChange = new EventEmitter<TableDataChangeEvent>();\r\n  /** Emitted in external-data mode when the user types in the search box. */\r\n  @Output() searchChange = new EventEmitter<TableDataChangeEvent>();\r\n  /** Emitted when an inline-edited or inline-added row is saved. */\r\n  @Output() rowSave = new EventEmitter<TableRowSaveEvent>();\r\n\r\n  data: any[] = [];\r\n  totalItems: number = 0;\r\n  currentPage: number = 1;\r\n  loading: boolean = false;\r\n  originalRowsCache = new Map<any, any>();\r\n\r\n  /**\r\n   * Unified loading state used by the template. In external-data mode,\r\n   * defers to `externalLoading` (parent-driven). In internal-data mode,\r\n   * uses the internally managed `loading` flag.\r\n   */\r\n  get isTableLoading(): boolean {\r\n    if (this.tableData !== undefined) {\r\n      return this.externalLoading;\r\n    }\r\n    return this.loading;\r\n  }\r\n\r\n\r\n  // State\r\n  activeSort: { key: string, direction: 'ASC' | 'DESC' } = { key: '', direction: 'ASC' };\r\n  private isSortActive: boolean = false; // true only when orderBy is explicitly configured or user has sorted\r\n  activeFilters: { [key: string]: any } = {};\r\n  searchTerm: string = '';\r\n  stickyColumnStyles: { [key: string]: any } = {};\r\n  hasStickyColumns: boolean = false;\r\n  openDropdownId: string | null = null;\r\n  /** Viewport-relative position used to render the dropdown as position:fixed. */\r\n  dropdownPosition: { top: number; right: number } = { top: 0, right: 0 };\r\n  /** Items and row for the currently open dropdown — rendered in a portal outside the table. */\r\n  activeDropdownItems: any[] | null = null;\r\n  activeDropdownRow: any = null;\r\n  private scrollListeningEnabled = false;\r\n  private activeTriggerElement: HTMLElement | null = null;\r\n\r\n  // --- Filter dropdown state ---\r\n  openFilterKey: string | null = null;\r\n  activeFilterLabels: { [key: string]: string } = {};\r\n  /** Viewport-relative position used to render the filter panel as position:fixed. */\r\n  filterPosition: { top: number; left: number } = { top: 0, left: 0 };\r\n  /** The filter config for the currently open filter panel. */\r\n  activeFilterData: any | null = null;\r\n\r\n  // --- Delete confirmation modal state ---\r\n  deleteModalOpen = false;\r\n  deleteModalConfig: any = {};\r\n  private pendingDeleteAction: { item: any; row: any } | null = null;\r\n\r\n  /** code -> label maps for column lookups, bucketed by lookup cache key. */\r\n  private lookupMaps: { [cacheKey: string]: Map<string, string> } = {};\r\n  /** Guards against firing the same lookup request twice. */\r\n  private lookupInFlight = new Set<string>();\r\n  /** Full-list lookups already attempted — stops an empty/failed list refetching on every page. */\r\n  private lookupLoaded = new Set<string>();\r\n\r\n  searchSubject = new Subject<string>();\r\n\r\n  @ViewChildren('stickyHeader') stickyHeaders!: QueryList<ElementRef>;\r\n  private resizeObserver: ResizeObserver | null = null;\r\n  private locale = inject(LOCALE_ID);\r\n\r\n  constructor(\r\n      private http: HttpClient, \r\n      private router: Router,\r\n      private cdr: ChangeDetectorRef,\r\n      private ngZone: NgZone\r\n  ) { \r\n      // Debounce search input\r\n      this.searchSubject.pipe(\r\n          debounceTime(this.config?.searchConfig?.debounceTime || 300),\r\n          distinctUntilChanged()\r\n      ).subscribe(term => {\r\n          const minChars = this.config?.searchConfig?.minimumCharacter ?? 3;\r\n          // Stay idle for partial input below the threshold; clearing the box always re-triggers.\r\n          if (term.length > 0 && term.length < minChars) {\r\n              return;\r\n          }\r\n          this.searchTerm = term;\r\n          this.currentPage = 1;\r\n          if (this.tableData !== undefined) {\r\n              // External-data mode: delegate to parent via event\r\n              this.searchChange.emit(this.buildChangeEvent());\r\n          } else {\r\n              this.loadData();\r\n          }\r\n      });\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    window.addEventListener('scroll', this.onScrollCapture, true);\r\n    if (this.config) {\r\n      this.sortColumnsBySequence();\r\n      this.applyPaginationDefaults();\r\n      if (this.config.sortBy) {\r\n        this.activeSort.key = this.config.sortBy;\r\n      }\r\n      if (this.config.orderBy) {\r\n        this.activeSort.direction = this.config.orderBy;\r\n        this.isSortActive = true;\r\n      }\r\n      this.loadFilterOptions();\r\n      this.loadColumnLookups();\r\n\r\n      if (this.tableData !== undefined) {\r\n        // External-data mode: sync incoming data, skip internal API call\r\n        this.data = this.tableData;\r\n        if (this.totalItemsCount !== undefined) {\r\n          this.totalItems = this.totalItemsCount;\r\n        }\r\n        this.loadColumnLookups();\r\n      } else {\r\n        this.loadData();\r\n      }\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n      // External data changed — sync directly without an API call\r\n      if (changes['tableData']) {\r\n          this.data = this.tableData || [];\r\n          this.loadColumnLookups();\r\n      }\r\n      // Total count updated from parent\r\n      if (changes['totalItemsCount'] && this.totalItemsCount !== undefined) {\r\n          this.totalItems = this.totalItemsCount;\r\n      }\r\n      // Config changed — re-apply column ordering whenever a new config object arrives\r\n      if (changes['config'] && !changes['config'].firstChange) {\r\n          this.sortColumnsBySequence();\r\n          this.applyPaginationDefaults();\r\n          this.loadFilterOptions();\r\n          this.loadColumnLookups();\r\n          if (this.tableData === undefined) {\r\n              this.loadData();\r\n          }\r\n          setTimeout(() => this.calculateStickyPositions());\r\n      }\r\n      if (changes['selectedRows']) {\r\n          this.syncSelection();\r\n      }\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n      this.setupResizeObserver();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n      window.removeEventListener('scroll', this.onScrollCapture, true);\r\n      if (this.resizeObserver) {\r\n          this.resizeObserver.disconnect();\r\n      }\r\n  }\r\n\r\n  private onScrollCapture = (event: Event): void => {\r\n      if (!this.scrollListeningEnabled || !this.activeTriggerElement) {\r\n          return;\r\n      }\r\n      const scrollTarget = event.target as HTMLElement;\r\n      if (scrollTarget && scrollTarget.contains(this.activeTriggerElement)) {\r\n          this.ngZone.run(() => {\r\n              this.closeDropdown();\r\n              this.cdr.detectChanges();\r\n          });\r\n      }\r\n  };\r\n\r\n  private setupResizeObserver(): void {\r\n      if (this.resizeObserver) {\r\n          this.resizeObserver.disconnect();\r\n      }\r\n      \r\n      this.resizeObserver = new ResizeObserver(() => {\r\n          this.ngZone.run(() => {\r\n              this.calculateStickyPositions();\r\n          });\r\n      });\r\n\r\n      if (this.stickyHeaders) {\r\n          this.stickyHeaders.changes.subscribe(() => {\r\n              this.observeHeaders();\r\n              // Also recalculate immediately\r\n              setTimeout(() => this.calculateStickyPositions());\r\n          });\r\n          this.observeHeaders();\r\n      }\r\n  }\r\n\r\n  private observeHeaders(): void {\r\n      if (!this.resizeObserver || !this.stickyHeaders) return;\r\n      this.stickyHeaders.forEach(header => {\r\n          this.resizeObserver!.observe(header.nativeElement);\r\n      });\r\n  }\r\n  \r\n  loadData(): void {\r\n    if (!this.config?.apiUrl) return;\r\n    \r\n    this.loading = true;\r\n    let params: HttpParams;\r\n\r\n    // --- Query Params Construction ---\r\n    if (this.config.queryParamsConfig) {\r\n      const qpConfig = this.config.queryParamsConfig;\r\n      const pageKey = qpConfig.pageKey || 'page';\r\n      const sizeKey = qpConfig.sizeKey || 'pageSize';\r\n      const sortKey = qpConfig.sortKey || 'sortBy';\r\n      const orderKey = qpConfig.orderKey || 'orderBy';\r\n      const pageIndex = this.currentPage + (qpConfig.pageIndexOffset || 0);\r\n\r\n      let paramsObj: any = {\r\n        [pageKey]: pageIndex.toString(),\r\n        [sizeKey]: (this.config.pagination?.pageSize || 10).toString()\r\n      };\r\n\r\n      if (this.activeSort.key) paramsObj[sortKey] = this.activeSort.key;\r\n      // Only include orderBy if explicitly configured or user has sorted a column\r\n      if (this.isSortActive && this.activeSort.direction) paramsObj[orderKey] = this.activeSort.direction;\r\n      \r\n      // Search Handling\r\n      if (this.searchTerm) {\r\n          const searchConfig = this.config.searchConfig;\r\n          const searchKey = searchConfig?.searchKey || 'search';\r\n          \r\n          if (searchConfig?.handling === 'nested_string' && qpConfig.nestedStringConfig) {\r\n             // Will be handled in nested string construction below\r\n          } else {\r\n             paramsObj[searchKey] = this.searchTerm;\r\n          }\r\n      }\r\n\r\n      // Filter Handling (and Search if nested)\r\n      if (qpConfig.filterHandling === 'nested_string' && qpConfig.nestedStringConfig) {\r\n        const { paramName, baseValue, separator, assignment } = qpConfig.nestedStringConfig;\r\n        let nestedString = baseValue || '';\r\n        const assign = assignment || '=';\r\n\r\n        // Add Filters\r\n        Object.keys(this.activeFilters).forEach(key => {\r\n          if (this.activeFilters[key]) {\r\n            const prefix = nestedString ? separator : '';\r\n            nestedString += `${prefix}${key}${assign}${this.activeFilters[key]}`;\r\n          }\r\n        });\r\n        \r\n        // Add Search if nested\r\n        if (this.searchTerm && this.config.searchConfig?.handling === 'nested_string') {\r\n             const searchKey = this.config.searchConfig.searchKey || 'SEARCH_TERM';\r\n             const prefix = nestedString ? separator : '';\r\n             nestedString += `${prefix}${searchKey}${assign}${this.searchTerm}`;\r\n        }\r\n\r\n        paramsObj[paramName] = nestedString;\r\n      } else {\r\n        // Standard handling\r\n        Object.keys(this.activeFilters).forEach(key => {\r\n          if (this.activeFilters[key]) paramsObj[key] = this.activeFilters[key];\r\n        });\r\n      }\r\n      params = new HttpParams({ fromObject: paramsObj });\r\n\r\n    } else {\r\n      // --- Default Behavior (Backward Compatibility) ---\r\n      let paramsObj: any = {};\r\n      \r\n      if (this.config.pagination?.enabled) {\r\n        paramsObj['page'] = this.currentPage;\r\n        paramsObj['pageSize'] = this.config.pagination.pageSize;\r\n      }\r\n\r\n      if (this.activeSort.key) {\r\n        paramsObj['sortBy'] = this.activeSort.key;\r\n        // Only include orderBy if explicitly configured or user has sorted a column\r\n        if (this.isSortActive) paramsObj['orderBy'] = this.activeSort.direction;\r\n      }\r\n\r\n      if (this.searchTerm) {\r\n        const searchKey = this.config.searchConfig?.searchKey || 'search';\r\n        paramsObj[searchKey] = this.searchTerm;\r\n      }\r\n\r\n      Object.keys(this.activeFilters).forEach(key => {\r\n          if (this.activeFilters[key]) {\r\n               paramsObj[key] = this.activeFilters[key];\r\n          }\r\n      });\r\n\r\n      // Custom Request Params Mapper (if provided)\r\n      if (this.config.requestParams) {\r\n         const customParams = this.config.requestParams(\r\n             this.currentPage, \r\n             this.config.pagination?.pageSize || 10, \r\n             this.activeSort.key, \r\n             this.activeSort.direction, \r\n             this.searchTerm, \r\n             this.activeFilters\r\n         );\r\n         if (customParams instanceof HttpParams) {\r\n             // If function returns HttpParams, use it directly (caveat: might lose previous params if not careful in mapper)\r\n             params = customParams;\r\n         } else {\r\n             paramsObj = { ...paramsObj, ...customParams };\r\n             params = new HttpParams({ fromObject: paramsObj });\r\n         }\r\n      } else {\r\n         params = new HttpParams({ fromObject: paramsObj });\r\n      }\r\n    }\r\n\r\n    // --- Data Fetching ---\r\n    \r\n    // Check for separate count API\r\n    const totalCountConfig = this.config.pagination?.totalCountConfig;\r\n    let request$: any; // Observable\r\n\r\n    if (totalCountConfig?.source === 'separate' && totalCountConfig.apiUrl) {\r\n         const headers = this.getHeaders();\r\n         const method = this.config.apiMethod || 'GET';\r\n         const body = this.config.apiPayload || {};\r\n\r\n         const dataRequest$ = method === 'POST' ? this.http.post<any>(this.config.apiUrl, body, { params, headers }) : this.http.get<any>(this.config.apiUrl, { params, headers });\r\n         const countRequest$ = method === 'POST' ? this.http.post<any>(totalCountConfig.apiUrl, body, { params, headers }) : this.http.get<any>(totalCountConfig.apiUrl, { params, headers });\r\n\r\n         request$ = forkJoin({\r\n            data: dataRequest$,\r\n            count: countRequest$\r\n        }).pipe(\r\n            map(({ data, count }) => {\r\n                const dataPath = this.config.dataResponsePath !== undefined ? this.config.dataResponsePath : '';\r\n                return {\r\n                    data: this.getValueByPath(data, dataPath),\r\n                    total: this.getValueByPath(count, totalCountConfig.responsePath || '')\r\n                };\r\n            })\r\n        );\r\n    } else {\r\n    \r\n    const headers = this.getHeaders();\r\n    const method = this.config.apiMethod || 'GET';\r\n    const body = this.config.apiPayload || {};\r\n    \r\n    const baseRequest$ = method === 'POST' ? this.http.post<any>(this.config.apiUrl, body, { params, headers }) : this.http.get<any>(this.config.apiUrl, { params, headers });\r\n\r\n    request$ = baseRequest$.pipe(\r\n        map(response => {\r\n                const dataPath = this.config.dataResponsePath !== undefined ? this.config.dataResponsePath : '';\r\n                const totalPath = totalCountConfig?.responsePath || '';\r\n                return {\r\n                    data: this.getValueByPath(response, dataPath),\r\n                    // If source is 'same', try to get total from response, else default 0\r\n                    total: totalCountConfig ? this.getValueByPath(response, totalPath) : 0\r\n                };\r\n            })\r\n        );\r\n    }\r\n\r\n    request$.pipe(\r\n        finalize(() => this.loading = false),\r\n        catchError(err => {\r\n          console.error('Table Data Fetch Error', err);\r\n          return of({ data: [], total: 0 }); \r\n        })\r\n      )\r\n      .subscribe((result: any) => {\r\n          this.data = result.data || [];\r\n          if (this.config.pagination) {\r\n               this.totalItems = result.total || 0;\r\n          }\r\n          if (!this.config.columns || this.config.columns.length === 0) {\r\n                    if (this.data && this.data.length > 0) {\r\n                        this.config.columns = Object.keys(this.data[0]).map(key => ({\r\n                            key: key,\r\n                            label: this.toTitleCase(key),\r\n                            type: 'text',\r\n                            sortable: false,\r\n                            editable: false\r\n                        }));\r\n                    }\r\n                }\r\n          this.syncSelection();\r\n          this.loadColumnLookups();\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Syncs the locally loaded data set with the externally provided selectedRows.\r\n   * Marks 'selected' property on row objects to reflect checkbox state.\r\n   */\r\n  private syncSelection(): void {\r\n    if (!this.data || !this.data.length || !this.config) return;\r\n\r\n    const idField = (this.config as any).rowIdField || 'id';\r\n    const selectedIds = new Set((this.selectedRows || []).map(r => r[idField]));\r\n\r\n    this.data.forEach(row => {\r\n      row.selected = selectedIds.has(row[idField]);\r\n    });\r\n  }\r\n\r\n  // --- Actions ---\r\n\r\n  onPageChange(page: number): void {\r\n    this.currentPage = page;\r\n    if (this.tableData !== undefined) {\r\n      this.pageChange.emit(this.buildChangeEvent());\r\n    } else {\r\n      this.loadData();\r\n    }\r\n  }\r\n\r\n  onPageSizeChange(size: number): void {\r\n    if (this.config.pagination) {\r\n        this.config.pagination.pageSize = size;\r\n        this.currentPage = 1; // Reset to first page\r\n        if (this.tableData !== undefined) {\r\n            this.pageChange.emit(this.buildChangeEvent());\r\n        } else {\r\n            this.loadData();\r\n        }\r\n    }\r\n  }\r\n\r\n  onSort(col: TableColumn): void {\r\n    if (!col.sortable) return;\r\n\r\n    if (this.activeSort.key === col.key) {\r\n      this.activeSort.direction = this.activeSort.direction === 'ASC' ? 'DESC' : 'ASC';\r\n    } else {\r\n      this.activeSort.key = col.key;\r\n      this.activeSort.direction = 'ASC';\r\n    }\r\n    this.isSortActive = true; // User has actively sorted, include orderBy in API call\r\n\r\n    if (this.tableData !== undefined) {\r\n      // External-data mode: let the parent handle the API call\r\n      this.sortChange.emit(this.buildChangeEvent());\r\n    } else {\r\n      this.loadData();\r\n    }\r\n  }\r\n\r\n  onSearch(event: Event): void {\r\n     const value = (event.target as HTMLInputElement).value;\r\n     this.searchSubject.next(value);\r\n  }\r\n\r\n  onFilterChange(key: string, event: Event): void {\r\n      const value = (event.target as HTMLSelectElement).value;\r\n      this.applyFilter(key, value);\r\n  }\r\n\r\n  private applyFilter(key: string, value: any): void {\r\n      this.activeFilters[key] = value;\r\n      this.currentPage = 1;\r\n      this.filterChange.emit({ key, value });\r\n      if (this.tableData === undefined) {\r\n          this.loadData();\r\n      }\r\n  }\r\n\r\n  toggleFilter(key: string, event: Event): void {\r\n      event.stopPropagation();\r\n      if (this.openFilterKey === key) {\r\n          this.openFilterKey = null;\r\n          this.activeFilterData = null;\r\n          return;\r\n      }\r\n      const trigger = event.currentTarget as HTMLElement;\r\n      const rect = trigger.getBoundingClientRect();\r\n      this.filterPosition = { top: rect.bottom + 6, left: rect.left };\r\n      this.openFilterKey = key;\r\n      this.activeFilterData = this.config.filters?.find(f => f.key === key) || null;\r\n      this.activeTriggerElement = trigger;\r\n      this.scrollListeningEnabled = false;\r\n      setTimeout(() => {\r\n          this.scrollListeningEnabled = true;\r\n      }, 0);\r\n  }\r\n\r\n  selectFilterOption(filter: any, opt: { label: string; value: any } | null): void {\r\n      const value = opt ? opt.value : '';\r\n      this.activeFilterLabels[filter.key] = opt ? opt.label : '';\r\n      this.applyFilter(filter.key, value);\r\n      this.openFilterKey = null;\r\n  }\r\n\r\n  getFilterDisplay(filter: any): string {\r\n      return this.activeFilterLabels[filter.key] || filter.label;\r\n  }\r\n\r\n  getValidFilterOptions(filter: any): any[] {\r\n      return (filter?.options || []).filter((opt: any) => opt.label != null && opt.label !== '');\r\n  }\r\n\r\n  isFilterActive(filter: any): boolean {\r\n      return !!this.activeFilterLabels[filter.key];\r\n  }\r\n\r\n  // --- Private helpers ---\r\n\r\n  /**\r\n   * Assembles the current table state into a `TableDataChangeEvent` object.\r\n   * Emitted to the parent in external-data mode so it can fetch and supply new data.\r\n   */\r\n  private buildChangeEvent(): TableDataChangeEvent {\r\n      return {\r\n          page: this.currentPage,\r\n          pageSize: this.config.pagination?.pageSize || 10,\r\n          sortBy: this.activeSort.key || undefined,\r\n          orderBy: this.isSortActive ? this.activeSort.direction : undefined,\r\n          searchTerm: this.searchTerm || undefined,\r\n          filters: { ...this.activeFilters }\r\n      };\r\n  }\r\n  \r\n  onAction(action: TableAction, row: any): void {\r\n      if (action.type === 'edit-row' as any) {\r\n          const idField = (this.config as any).rowIdField || 'id';\r\n          this.originalRowsCache.set(row[idField], JSON.parse(JSON.stringify(row)));\r\n          this.prepareDateFieldsForEdit(row);\r\n          row.isEditing = true;\r\n          this.action.emit({ action, row });\r\n          return;\r\n      }\r\n\r\n      if (action.type === 'callback' && action.callback) {\r\n          action.callback(row);\r\n      }\r\n      \r\n      if (action.type === 'route' && action.route) {\r\n          const url = this.replaceParams(action.route, row);\r\n          this.router.navigateByUrl(url);\r\n          return;\r\n      }\r\n\r\n      if (action.type === 'api') {\r\n          if (action.confirmationNeeded) {\r\n              const message = action.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\r\n              if (!confirm(message)) return;\r\n          }\r\n          if (action.apiUrl) {\r\n              this.executeApiAction(action, row);\r\n          } else {\r\n             this.action.emit({ action, row });\r\n          }\r\n      } else {\r\n        this.action.emit({ action, row });\r\n      }\r\n  }\r\n\r\n  onActionItemClick(item: any, row: any, event: Event): void {\r\n      event.stopPropagation();\r\n      \r\n      if (item.type === 'edit-row') {\r\n          const idField = (this.config as any).rowIdField || 'id';\r\n          this.originalRowsCache.set(row[idField], JSON.parse(JSON.stringify(row)));\r\n          this.prepareDateFieldsForEdit(row);\r\n          row.isEditing = true;\r\n          this.action.emit({ action: item as TableAction, row });\r\n          this.closeDropdown();\r\n          return;\r\n      }\r\n\r\n      if (item.type === 'delete') {\r\n          this.openDeleteConfirmModal(item, row);\r\n          return;\r\n      }\r\n\r\n      if (item.type === 'callback' && item.callback) {\r\n          item.callback(row);\r\n      }\r\n      \r\n      if (item.type === 'route' && item.route) {\r\n          const url = this.replaceParams(item.route, row);\r\n          this.router.navigateByUrl(url);\r\n          return;\r\n      }\r\n\r\n      if (item.type === 'api') {\r\n          if (item.confirmationNeeded) {\r\n              const message = item.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\r\n              if (!confirm(message)) return;\r\n          }\r\n          if (item.apiUrl) {\r\n              this.executeApiAction(item as TableAction, row);\r\n          } else {\r\n              this.action.emit({ action: item as TableAction, row });\r\n          }\r\n      } else {\r\n          this.action.emit({ action: item as TableAction, row });\r\n      }\r\n  }\r\n\r\n  private openDeleteConfirmModal(item: any, row: any): void {\r\n      const cfg = item.deleteConfig || {};\r\n      this.deleteModalConfig = {\r\n          title: cfg.modalTitle || 'Confirm Delete',\r\n          size: 'sm' as const,\r\n          headerTheme: 'dark' as const,\r\n          confirmButton: {\r\n              label: cfg.confirmLabel || 'Delete',\r\n              type: 'danger' as const\r\n          },\r\n          cancelButton: {\r\n              label: cfg.cancelLabel || 'Cancel',\r\n              show: true\r\n          }\r\n      };\r\n      this.deleteModalMessage = cfg.modalMessage || 'Are you sure you want to delete this item?';\r\n      this.pendingDeleteAction = { item, row };\r\n      this.deleteModalOpen = true;\r\n  }\r\n\r\n  deleteModalMessage = '';\r\n\r\n  onDeleteConfirm(): void {\r\n      this.deleteModalOpen = false;\r\n      if (!this.pendingDeleteAction) return;\r\n      const { item, row } = this.pendingDeleteAction;\r\n      const cfg = item.deleteConfig || {};\r\n      const idField = cfg.idField || 'id';\r\n      const url = cfg.apiUrl.replace(`:${idField}`, row[idField]);\r\n      this.pendingDeleteAction = null;\r\n\r\n      this.loading = true;\r\n      this.http.delete(url, { headers: this.getHeaders() }).pipe(\r\n          finalize(() => this.loading = false)\r\n      ).subscribe({\r\n          next: () => {\r\n              if (this.data.length === 1 && this.currentPage > 1) {\r\n                  this.currentPage--;\r\n              }\r\n              this.loadData();\r\n              this.action.emit({ action: item as TableAction, row });\r\n          },\r\n          error: (err) => console.error('[SmartTable] Delete API Error', err)\r\n      });\r\n  }\r\n\r\n  onDeleteCancel(): void {\r\n      this.deleteModalOpen = false;\r\n      this.pendingDeleteAction = null;\r\n  }\r\n\r\n  onTopAction(action: TableAction): void {\r\n      if (action.type === 'add-row' as any) {\r\n          const idField = (this.config as any).rowIdField || 'id';\r\n          const newRow: any = {\r\n              [idField]: 0,\r\n              isNew: true,\r\n              isEditing: true\r\n          };\r\n          if (this.config.columns) {\r\n              this.config.columns.forEach(col => {\r\n                  if (col.editConfig && col.editConfig.defaultValue !== undefined) {\r\n                      newRow[col.key] = col.dataType === 'date'\r\n                          ? this.toDateObject(col.editConfig.defaultValue)\r\n                          : col.editConfig.defaultValue;\r\n                  } else {\r\n                      newRow[col.key] = col.dataType === 'date' ? null : '';\r\n                  }\r\n                  if (col.subFields) {\r\n                      col.subFields.forEach(sub => {\r\n                          if (sub.editConfig && sub.editConfig.defaultValue !== undefined) {\r\n                              newRow[sub.key] = sub.dataType === 'date'\r\n                                  ? this.toDateObject(sub.editConfig.defaultValue)\r\n                                  : sub.editConfig.defaultValue;\r\n                          } else {\r\n                              newRow[sub.key] = sub.dataType === 'date' ? null : '';\r\n                          }\r\n                      });\r\n                  }\r\n              });\r\n          }\r\n          this.data = [newRow, ...this.data];\r\n          setTimeout(() => this.calculateStickyPositions());\r\n          this.topAction.emit(action);\r\n          return;\r\n      }\r\n\r\n      if (action.type === 'callback' && action.callback) {\r\n          action.callback(null); // No row for top action\r\n      }\r\n      \r\n      if (action.type === 'route' && action.route) {\r\n          // Since it's a top action, replaceParams with an empty object or handle statically \r\n          const url = this.replaceParams(action.route, {});\r\n          this.router.navigateByUrl(url);\r\n          return;\r\n      }\r\n\r\n      if (action.type === 'api') {\r\n          if (action.confirmationNeeded) {\r\n              const message = action.confirmationMessage || this.config.labels?.defaultConfirmationMessage || 'Are you sure?';\r\n              if (!confirm(message)) return;\r\n          }\r\n          if (action.apiUrl) {\r\n             this.executeApiAction(action, null);\r\n          } else {\r\n             this.topAction.emit(action);\r\n          }\r\n      } else {\r\n          this.topAction.emit(action);\r\n      }\r\n  }\r\n\r\n  private executeApiAction(action: TableAction, row: any): void {\r\n      if (!action.apiUrl) return;\r\n      \r\n      const url = row ? this.replaceParams(action.apiUrl, row) : action.apiUrl;\r\n      const method = action.apiMethod || 'POST';\r\n      const headers = this.getHeaders();\r\n      const body = row ? row : {};\r\n      \r\n      this.loading = true;\r\n      this.http.request(method, url, { body, headers }).pipe(\r\n          finalize(() => this.loading = false)\r\n      ).subscribe({\r\n          next: () => {\r\n              this.loadData(); // reload on success\r\n              if (row) {\r\n                 this.action.emit({ action, row });\r\n              } else {\r\n                 this.topAction.emit(action);\r\n              }\r\n          },\r\n          error: (err) => {\r\n              console.error('API Action Error', err);\r\n          }\r\n      });\r\n  }\r\n\r\n  // --- Selection ---\r\n\r\n  /** `false` (via `config.multiSelect`) switches row selection from checkboxes to a radio button per row. */\r\n  get isMultiSelect(): boolean {\r\n      return this.config?.multiSelect !== false;\r\n  }\r\n\r\n  onSelectAll(event: Event): void {\r\n      const checked = (event.target as HTMLInputElement).checked;\r\n      this.data.forEach(row => row.selected = checked);\r\n      this.updateSelectedRows();\r\n  }\r\n\r\n  onRowSelect(row: any): void {\r\n      this.updateSelectedRows();\r\n  }\r\n\r\n  /** Single-select mode: the newly picked row replaces the entire selection, including across pages. */\r\n  onRowSelectSingle(row: any): void {\r\n      this.data.forEach(r => r.selected = (r === row));\r\n      this.selectedRows = [row];\r\n      this.rowSelect.emit(this.selectedRows);\r\n  }\r\n  \r\n  updateSelectedRows(): void {\r\n      const idField = (this.config as any).rowIdField || 'id';\r\n      \r\n      // 1. Identify rows from the global selection that are NOT on the current page\r\n      const currentPageIds = new Set(this.data.map(r => r[idField]));\r\n      const otherPagesSelected = (this.selectedRows || []).filter(r => !currentPageIds.has(r[idField]));\r\n      \r\n      // 2. Identify currently selected rows on the current page\r\n      const currentPageSelected = this.data.filter(row => row.selected);\r\n      \r\n      // 3. Merge them to form the new global selection\r\n      this.selectedRows = [...otherPagesSelected, ...currentPageSelected];\r\n      \r\n      this.rowSelect.emit(this.selectedRows);\r\n  }\r\n\r\n  // --- Helpers ---\r\n\r\n  getCellValue(row: any, col: TableColumn): any {\r\n    // Support nested properties via labelPath or key\r\n    const path = col.labelPath || col.key;\r\n    let val = this.getValueByPath(row, path);\r\n\r\n    // Code -> label resolution (roles, MDM master data, ...). Falls back to the\r\n    // raw code until the lookup response lands, so the cell is never blank.\r\n    const lookupCfg = this.getLookupConfig(col);\r\n    if (lookupCfg) {\r\n        val = this.resolveLookupLabel(val, lookupCfg);\r\n    }\r\n\r\n    // Formatting (Date, etc.)\r\n    if (col.type === 'date' && val) {\r\n        if (col.dateFormat) {\r\n            try {\r\n                return formatDate(val, col.dateFormat, this.locale);\r\n            } catch (e) {\r\n                console.warn('Invalid date format or value', val, col.dateFormat);\r\n                return val;\r\n            }\r\n        }\r\n        return new Date(val).toLocaleDateString();\r\n    }\r\n\r\n    if (val === null || val === undefined || val === '') {\r\n        return col.emptyValue ?? this.config.emptyValue ?? '-';\r\n    }\r\n    return val;\r\n  }\r\n\r\n  getBadgeClass(row: any, col: TableColumn): string {\r\n      // A lookup column keeps its badgeConfig keyed on the raw code rather than\r\n      // the resolved label, so pick the variant from the underlying value.\r\n      const val = this.getLookupConfig(col)\r\n          ? this.normalizeRuleValue(this.getValueByPath(row, col.labelPath || col.key))\r\n          : this.getCellValue(row, col);\r\n      const strVal = String(val);\r\n      \r\n      // Config approach\r\n      if (col.badgeConfig && col.badgeConfig[strVal]) {\r\n          return `badge-${col.badgeConfig[strVal]}`;\r\n      }\r\n\r\n      // Default Logic\r\n      const status = strVal.toLowerCase();\r\n      \r\n      if (['active', 'completed', 'success', 'approved'].includes(status)) return 'badge-success';\r\n      if (['pending', 'in progress', 'waiting'].includes(status)) return 'badge-warning';\r\n      if (['rejected', 'failed', 'error', 'deleted'].includes(status)) return 'badge-danger';\r\n      if (['draft', 'inactive'].includes(status)) return 'badge-neutral';\r\n      \r\n      return 'badge-info'; // default\r\n  }\r\n  \r\n  getAscOpacity(key: string): number {\r\n    if (this.activeSort.key !== key) return 0.45;\r\n    return this.activeSort.direction === 'ASC' ? 1 : 0.2;\r\n  }\r\n\r\n  getDescOpacity(key: string): number {\r\n    if (this.activeSort.key !== key) return 0.45;\r\n    return this.activeSort.direction === 'DESC' ? 1 : 0.2;\r\n  }\r\n\r\n  private replaceParams(template: string, row: any): string {\r\n      return template.replace(/:([a-zA-Z0-9_]+)/g, (_, key) => row[key] || '');\r\n  }\r\n  \r\n  // --- Column Lookups (code -> label) ---\r\n\r\n  /**\r\n   * Merges a column's inline lookup config with the shared definition it\r\n   * references (`TableConfig.lookups`). Inline properties win.\r\n   */\r\n  private getLookupConfig(col: TableColumn): ColumnLookupConfig | null {\r\n      const raw = col?.lookupConfig;\r\n      if (!raw) return null;\r\n      const shared = raw.ref ? this.config?.lookups?.[raw.ref] : undefined;\r\n      const merged = shared ? { ...shared, ...raw } : raw;\r\n      return merged.apiUrl ? merged : null;\r\n  }\r\n\r\n  /** Bucket the resolved code -> label map lives in. Identical endpoints share one. */\r\n  private getLookupCacheKey(cfg: ColumnLookupConfig): string {\r\n      if (cfg.cacheKey) return cfg.cacheKey;\r\n      if (cfg.ref) return cfg.ref;\r\n      return [\r\n          (cfg.apiMethod || 'GET').toUpperCase(),\r\n          cfg.apiUrl,\r\n          JSON.stringify(cfg.queryParams || {}),\r\n          JSON.stringify(cfg.apiPayload || {})\r\n      ].join('|');\r\n  }\r\n\r\n  /**\r\n   * Fires the lookup request for every column that declares one.\r\n   * - Full-list mode (no `paramName`): one request per endpoint, ever.\r\n   * - Targeted mode (`paramName` set): requests only the codes on the current\r\n   *   page that are not cached yet, so it re-runs as the user pages/searches.\r\n   */\r\n  private loadColumnLookups(): void {\r\n      if (!this.config?.columns) return;\r\n\r\n      this.config.columns.forEach(col => {\r\n          const cfg = this.getLookupConfig(col);\r\n          if (!cfg) return;\r\n\r\n          const cacheKey = this.getLookupCacheKey(cfg);\r\n          if (!this.lookupMaps[cacheKey]) {\r\n              this.lookupMaps[cacheKey] = new Map<string, string>();\r\n          }\r\n          const map = this.lookupMaps[cacheKey];\r\n\r\n          if (cfg.paramName) {\r\n              const missing = this.collectColumnCodes(col)\r\n                  .filter(code => !map.has(this.normalizeLookupKey(code, cfg)));\r\n              if (!missing.length) return;\r\n              const requestKey = cacheKey + '::' + missing.slice().sort().join(',');\r\n              if (this.lookupInFlight.has(requestKey)) return;\r\n              this.lookupInFlight.add(requestKey);\r\n              this.fetchLookup(cfg, cacheKey, requestKey, missing);\r\n          } else {\r\n              if (this.lookupInFlight.has(cacheKey) || this.lookupLoaded.has(cacheKey)) return;\r\n              this.lookupInFlight.add(cacheKey);\r\n              this.fetchLookup(cfg, cacheKey, cacheKey, null);\r\n          }\r\n      });\r\n  }\r\n\r\n  /** Distinct, non-empty codes held by `col` across the rows currently loaded. */\r\n  private collectColumnCodes(col: TableColumn): string[] {\r\n      const path = col.labelPath || col.key;\r\n      const codes = new Set<string>();\r\n      (this.data || []).forEach(row => {\r\n          const raw = this.getValueByPath(row, path);\r\n          const values = Array.isArray(raw) ? raw : [raw];\r\n          values.forEach(v => {\r\n              const code = this.normalizeRuleValue(v);\r\n              if (code !== null && code !== undefined && code !== '' && typeof code !== 'object') {\r\n                  codes.add(String(code));\r\n              }\r\n          });\r\n      });\r\n      return Array.from(codes);\r\n  }\r\n\r\n  /** Substitutes the `{codes}` / `{value}` placeholder in a url or param value. */\r\n  private applyLookupPlaceholders(input: string, codes: string): string {\r\n      return input.replace(/\\{codes\\}/g, codes).replace(/\\{value\\}/g, codes);\r\n  }\r\n\r\n  /**\r\n   * Issues the lookup request with any verb, then folds the response into the\r\n   * code -> label map. `codes` is null in full-list mode.\r\n   */\r\n  private fetchLookup(cfg: ColumnLookupConfig, cacheKey: string, requestKey: string, codes: string[] | null): void {\r\n      const method = (cfg.apiMethod || 'GET').toUpperCase();\r\n      const codeCsv = (codes || []).join(cfg.paramSeparator || ',');\r\n\r\n      let headers = this.getHeaders();\r\n      Object.keys(cfg.headers || {}).forEach(key => {\r\n          headers = headers.set(key, (cfg.headers as any)[key]);\r\n      });\r\n\r\n      let params = new HttpParams();\r\n      const addParam = (key: string, value: any) => {\r\n          if (value === null || value === undefined) return;\r\n          params = params.append(key, this.applyLookupPlaceholders(String(value), codeCsv));\r\n      };\r\n      Object.keys(cfg.queryParams || {}).forEach(key => {\r\n          const value = (cfg.queryParams as any)[key];\r\n          if (Array.isArray(value)) {\r\n              value.forEach(item => addParam(key, item));\r\n          } else {\r\n              addParam(key, value);\r\n          }\r\n      });\r\n\r\n      const body: any = cfg.apiPayload !== undefined && cfg.apiPayload !== null\r\n          ? JSON.parse(JSON.stringify(cfg.apiPayload))\r\n          : {};\r\n\r\n      // Targeted mode: attach the page's codes as a query param (GET) or body key.\r\n      if (codes && cfg.paramName) {\r\n          const format = cfg.paramFormat || (method === 'GET' ? 'csv' : 'array');\r\n          if (method === 'GET') {\r\n              if (format === 'repeat') {\r\n                  codes.forEach(code => { params = params.append(cfg.paramName as string, code); });\r\n              } else {\r\n                  params = params.set(cfg.paramName as string, codeCsv);\r\n              }\r\n          } else {\r\n              body[cfg.paramName as string] = format === 'csv' ? codeCsv : codes;\r\n          }\r\n      }\r\n\r\n      const url = this.applyLookupPlaceholders(cfg.apiUrl as string, codeCsv);\r\n      const request$ = method === 'GET'\r\n          ? this.http.get<any>(url, { headers, params })\r\n          : this.http.request<any>(method, url, { body, headers, params });\r\n\r\n      request$.pipe(\r\n          finalize(() => {\r\n              this.lookupInFlight.delete(requestKey);\r\n              // Full-list mode is a one-shot fetch: never re-request it, even if the\r\n              // list came back empty or the call failed.\r\n              if (!codes) this.lookupLoaded.add(cacheKey);\r\n          }),\r\n          catchError(err => {\r\n              console.error('[SmartTable] Lookup failed for ' + cfg.apiUrl, err);\r\n              return of(null);\r\n          })\r\n      ).subscribe((response: any) => {\r\n          if (response === null || response === undefined) return;\r\n          const extracted = this.getValueByPath(response, cfg.dataPath || '');\r\n          const items = Array.isArray(extracted) ? extracted : (extracted ? [extracted] : []);\r\n          const map = this.lookupMaps[cacheKey] || (this.lookupMaps[cacheKey] = new Map<string, string>());\r\n\r\n          items.forEach((item: any) => {\r\n              const code = this.getValueByPath(item, cfg.valueKey || 'code');\r\n              if (code === null || code === undefined || code === '') return;\r\n              const label = this.coerceLookupLabel(this.getValueByPath(item, cfg.labelKey || 'name'), code);\r\n              map.set(this.normalizeLookupKey(code, cfg), label);\r\n          });\r\n\r\n          this.cdr.markForCheck();\r\n      });\r\n  }\r\n\r\n  /** A label must be printable — objects/arrays degrade to the raw code. */\r\n  private coerceLookupLabel(label: any, code: any): string {\r\n      if (label === null || label === undefined || label === '') return String(code);\r\n      if (typeof label === 'object') return String(code);\r\n      return String(label);\r\n  }\r\n\r\n  /** Map key for a code, honouring `caseInsensitive` (default true). */\r\n  private normalizeLookupKey(code: any, cfg: ColumnLookupConfig): string {\r\n      const str = String(code);\r\n      return cfg.caseInsensitive === false ? str : str.toLowerCase();\r\n  }\r\n\r\n  /**\r\n   * Turns the raw cell value into its label(s). Accepts a single code, an array\r\n   * of codes, or objects wrapping a code. Unresolved codes are shown as-is\r\n   * (`fallback: 'code'`, the default) or dropped (`fallback: 'empty'`).\r\n   * Returns null when nothing is left, so the caller applies `emptyValue`.\r\n   */\r\n  private resolveLookupLabel(value: any, cfg: ColumnLookupConfig): any {\r\n      if (value === null || value === undefined || value === '') return value;\r\n\r\n      const map = this.lookupMaps[this.getLookupCacheKey(cfg)];\r\n      const values = Array.isArray(value) ? value : [value];\r\n\r\n      const labels = values.map(entry => {\r\n          const code = this.normalizeRuleValue(entry);\r\n          if (code === null || code === undefined || code === '' || typeof code === 'object') return null;\r\n          const hit = map?.get(this.normalizeLookupKey(code, cfg));\r\n          if (hit !== undefined) return hit;\r\n          return cfg.fallback === 'empty' ? null : String(code);\r\n      }).filter(label => label !== null && label !== '');\r\n\r\n      return labels.length ? labels.join(cfg.separator ?? ', ') : null;\r\n  }\r\n\r\n  private loadFilterOptions(): void {\r\n    if (!this.config.filters) return;\r\n\r\n    this.config.filters.forEach(filter => {\r\n      if (filter.apiUrl && !filter.options) {\r\n        const headers = this.getHeaders();\r\n        let params = new HttpParams();\r\n\r\n        if (filter.handling === 'nested_string' && filter.nestedStringConfig) {\r\n          const { paramName, baseValue } = filter.nestedStringConfig;\r\n          if (baseValue) {\r\n            params = params.set(paramName, baseValue);\r\n          }\r\n        }\r\n\r\n        const method = filter.apiMethod || 'GET';\r\n        const body = filter.apiPayload || {};\r\n        \r\n        const request$ = method === 'POST' \r\n            ? this.http.post<any>(filter.apiUrl, body, { headers, params }) \r\n            : this.http.get<any>(filter.apiUrl, { headers, params });\r\n\r\n        request$.subscribe({\r\n          next: (response) => {\r\n            const data = filter.dataPath ? this.getValueByPath(response, filter.dataPath) : response;\r\n            if (!Array.isArray(data)) {\r\n              console.error(`Filter data for ${filter.key} is not an array`, data);\r\n              return;\r\n            }\r\n            filter.options = data.map((item: any) => {\r\n              const label = filter.labelPath ? this.getValueByPath(item, filter.labelPath) :\r\n                (filter.labelKey ? item[filter.labelKey] : item.label || item.name);\r\n              const value = filter.valuePath ? this.getValueByPath(item, filter.valuePath) :\r\n                (filter.valueKey ? item[filter.valueKey] : item.value || item.code);\r\n              return { label, value };\r\n            });\r\n\r\n            // Auto-populate matching column options\r\n            if (this.config.columns) {\r\n              const matchingColumn = this.config.columns.find(col => col.key === filter.key);\r\n              if (matchingColumn && matchingColumn.dataType === 'select' && !matchingColumn.options) {\r\n                matchingColumn.options = filter.options;\r\n              }\r\n            }\r\n          },\r\n          error: (err) => console.error(`Failed to load filter options for ${filter.key}:`, err)\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  private getValueByPath(obj: any, path: string): any {\r\n      if (!path || path === '') return obj;\r\n      return path.split('.').reduce((acc, part) => {\r\n          const match = part.match(/(\\w+)\\[(\\d+)\\]/);\r\n          if (match) {\r\n              return acc?.[match[1]]?.[parseInt(match[2])];\r\n          }\r\n          return acc?.[part];\r\n      }, obj);\r\n  }\r\n\r\n  private calculateStickyPositions(): void {\r\n      // We calculate positions based on rendered widths\r\n      if (!this.stickyHeaders || this.stickyHeaders.length === 0) return;\r\n\r\n      this.stickyColumnStyles = {};\r\n      let leftOffset = 0;\r\n      this.hasStickyColumns = false;\r\n\r\n      // Default: only the first data column is sticky\r\n      const stickyCount = this.config.stickyColumnCount !== undefined ? this.config.stickyColumnCount : 1;\r\n\r\n      // Checkbox width handling\r\n      if (this.config.selectable) {\r\n         const firstSticky = this.config.columns.find((c, i) => i < stickyCount || c.sticky);\r\n         if (firstSticky) {\r\n             // We can try to measure checkbox col if needed, but usually fixed 40px\r\n             // Or better, if we have a checkbox col ref, assume 40px for now as it is fixed in CSS\r\n             leftOffset = 40; \r\n         }\r\n      }\r\n\r\n      const headerElements = this.stickyHeaders.toArray();\r\n\r\n      this.config.columns.forEach((col, index) => {\r\n          if (col.sticky || index < stickyCount) {\r\n              col.sticky = true;\r\n              this.hasStickyColumns = false; // Reset to true only after we set styles? No, wait. \r\n              // Actually property is used in template to add class 'sticky-col'\r\n              // but we need to update Styles based on previous cols widths\r\n              \r\n              // Find corresponding header element\r\n              // Note: headerElements corresponds to columns indices\r\n              const headerEl = headerElements[index]?.nativeElement;\r\n              \r\n              if (headerEl) {\r\n                  // Set style for current column\r\n                  this.stickyColumnStyles[col.key] = { \r\n                      left: `${leftOffset}px`\r\n                      // We DO NOT set width here, allowing it to be dynamic/auto\r\n                  };\r\n                  \r\n                  // Add THIS column's width to offset for the NEXT column\r\n                  // use getBoundingClientRect or offsetWidth\r\n                  leftOffset += headerEl.offsetWidth;\r\n              }\r\n              this.hasStickyColumns = true;\r\n          }\r\n      });\r\n      \r\n      this.cdr.detectChanges();\r\n  }\r\n\r\n  private toTitleCase(str: string): string {\r\n      return str\r\n          .replace(/([A-Z])/g, ' $1') // insert space before capital letters\r\n          .replace(/^./, (str) => str.toUpperCase()) // capitalize the first letter\r\n          .trim(); // remove any leading/trailing whitespace\r\n  }\r\n  \r\n  get columnCount(): number {\r\n      return this.config.columns.length;\r\n  }\r\n\r\n  /**\r\n   * Orders `config.columns` by their `sequence` value (ascending). Columns without a\r\n   * `sequence` are left in their original relative order, placed after any columns that\r\n   * do have one — so configs that never set `sequence` are left untouched (stable sort).\r\n   */\r\n  private sortColumnsBySequence(): void {\r\n      const columns = this.config?.columns;\r\n      if (!columns || columns.length === 0) return;\r\n      const hasSequence = columns.some(c => c.sequence !== undefined && c.sequence !== null);\r\n      if (!hasSequence) return;\r\n      this.config.columns = [...columns].sort((a, b) => {\r\n          const aSeq = a.sequence ?? Number.MAX_SAFE_INTEGER;\r\n          const bSeq = b.sequence ?? Number.MAX_SAFE_INTEGER;\r\n          return aSeq - bSeq;\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Filters out actions/action-items that are either explicitly disabled via\r\n   * `isEnabled: false` or hidden for the given row by their `visibleWhen` /\r\n   * `hiddenWhen` rules. Pass `row` to enable the row-aware rule evaluation;\r\n   * omit it (e.g. for header/colspan calculations) to evaluate `isEnabled` only.\r\n   */\r\n  getVisibleActions<T extends { isEnabled?: boolean } & ActionVisibility>(actions?: T[] | null, row?: any): T[] {\r\n      return (actions || []).filter(a => a.isEnabled !== false && this.isActionVisibleForRow(a, row));\r\n  }\r\n\r\n  /**\r\n   * Evaluates an action's `visibleWhen` / `hiddenWhen` rules against a row.\r\n   * `hiddenWhen` wins over `visibleWhen`. With no row or no rules, returns true.\r\n   */\r\n  private isActionVisibleForRow(action: ActionVisibility, row: any): boolean {\r\n      if (!row) return true;\r\n\r\n      // hiddenWhen: any matching rule hides the action.\r\n      if (action.hiddenWhen) {\r\n          const rules = Array.isArray(action.hiddenWhen) ? action.hiddenWhen : [action.hiddenWhen];\r\n          if (rules.some(rule => this.evaluateRule(rule, row))) return false;\r\n      }\r\n\r\n      // visibleWhen: all rules must match for the action to show.\r\n      if (action.visibleWhen) {\r\n          const rules = Array.isArray(action.visibleWhen) ? action.visibleWhen : [action.visibleWhen];\r\n          if (!rules.every(rule => this.evaluateRule(rule, row))) return false;\r\n      }\r\n\r\n      return true;\r\n  }\r\n\r\n  /** Evaluates a single visibility rule against a row. */\r\n  private evaluateRule(rule: VisibilityRule, row: any): boolean {\r\n      const raw = this.getValueByPath(row, rule.field);\r\n      const actual = this.normalizeRuleValue(raw);\r\n      const op = rule.operator || 'eq';\r\n\r\n      switch (op) {\r\n          case 'truthy': return !!raw;\r\n          case 'falsy': return !raw;\r\n          case 'neq': return !this.ruleValuesEqual(actual, this.normalizeRuleValue(rule.value));\r\n          case 'in': return (rule.values || []).some(v => this.ruleValuesEqual(actual, this.normalizeRuleValue(v)));\r\n          case 'nin': return !(rule.values || []).some(v => this.ruleValuesEqual(actual, this.normalizeRuleValue(v)));\r\n          case 'eq':\r\n          default: return this.ruleValuesEqual(actual, this.normalizeRuleValue(rule.value));\r\n      }\r\n  }\r\n\r\n  /**\r\n   * Normalizes a value for comparison. Objects shaped like `{ code, name, value }`\r\n   * collapse to their `code` (then `name`, then `value`) so a rule targeting\r\n   * `status` works whether the API returns an object or a plain string.\r\n   */\r\n  private normalizeRuleValue(val: any): any {\r\n      if (val && typeof val === 'object') {\r\n          return val.code ?? val.name ?? val.value ?? val;\r\n      }\r\n      return val;\r\n  }\r\n\r\n  /** Case-insensitive comparison for strings; strict-ish equality otherwise. */\r\n  private ruleValuesEqual(a: any, b: any): boolean {\r\n      if (typeof a === 'string' && typeof b === 'string') {\r\n          return a.toLowerCase() === b.toLowerCase();\r\n      }\r\n      return a === b;\r\n  }\r\n\r\n  get showPagination(): boolean {\r\n      if (!this.config?.pagination?.enabled) return false;\r\n      const pageSize = this.config.pagination.pageSize;\r\n      const effectiveTotal = this.totalItems > 0 ? this.totalItems : this.data.length;\r\n      return effectiveTotal > 10;\r\n  }\r\n\r\n  private applyPaginationDefaults(): void {\r\n      if (this.config?.pagination?.enabled) {\r\n          if (!this.config.pagination.pageSize) {\r\n              this.config.pagination.pageSize = 10;\r\n          }\r\n          if (!this.config.pagination.pageSizeOptions || this.config.pagination.pageSizeOptions.length === 0) {\r\n              this.config.pagination.pageSizeOptions = [5, 10, 20, 50, 100];\r\n          }\r\n      }\r\n  }\r\n\r\n  onColumnClick(row: any, col: TableColumn): void {\r\n      if (col.clickAction === 'callback') {\r\n          this.columnClick.emit({ row, column: col.key });\r\n      } else if (col.clickAction === 'route' && col.clickRoute) {\r\n          const url = this.replaceParams(col.clickRoute, row);\r\n          this.router.navigateByUrl(url);\r\n      }\r\n  }\r\n\r\n  private getHeaders(): HttpHeaders {\r\n      let headers = new HttpHeaders();\r\n      if (this.config.token) {\r\n          const headerName = this.config.tokenHeader || 'Authorization';\r\n          headers = headers.set(headerName, this.config.token);\r\n      }\r\n      return headers;\r\n  }\r\n\r\n  toggleDropdown(id: string, event: Event, items: any[], row: any): void {\r\n      event.stopPropagation();\r\n      if (this.openDropdownId === id) {\r\n        this.closeDropdown();\r\n        return;\r\n      }\r\n      const btn = event.currentTarget as HTMLElement;\r\n      const rect = btn.getBoundingClientRect();\r\n      const estimatedHeight = (items?.length || 1) * 44 + 8;\r\n      const spaceBelow = window.innerHeight - rect.bottom;\r\n      const top = spaceBelow < estimatedHeight + 4\r\n        ? Math.max(4, rect.top - estimatedHeight - 4)\r\n        : rect.bottom + 4;\r\n      this.dropdownPosition = {\r\n        top,\r\n        right: window.innerWidth - rect.right\r\n      };\r\n      this.openDropdownId = id;\r\n      this.activeDropdownItems = items || [];\r\n      this.activeDropdownRow = row;\r\n      this.activeTriggerElement = btn;\r\n      this.scrollListeningEnabled = false;\r\n      setTimeout(() => {\r\n          this.scrollListeningEnabled = true;\r\n      }, 0);\r\n  }\r\n\r\n  @HostListener('document:click')\r\n  closeDropdown(): void {\r\n      this.openDropdownId = null;\r\n      this.activeDropdownItems = null;\r\n      this.activeDropdownRow = null;\r\n      this.openFilterKey = null;\r\n      this.activeFilterData = null;\r\n      this.activeTriggerElement = null;\r\n      this.scrollListeningEnabled = false;\r\n  }\r\n\r\n  onCancelRow(row: any, index: number): void {\r\n      if (row.isNew) {\r\n          this.data.splice(index, 1);\r\n      } else {\r\n          const idField = (this.config as any).rowIdField || 'id';\r\n          const original = this.originalRowsCache.get(row[idField]);\r\n          if (original) {\r\n              Object.assign(row, original);\r\n              this.originalRowsCache.delete(row[idField]);\r\n          }\r\n          row.isEditing = false;\r\n      }\r\n  }\r\n\r\n  onSaveRow(row: any): void {\r\n      const { isNew, isEditing, selected, ...payload } = row;\r\n      this.normalizeDateFieldsForSave(payload);\r\n      const idField = (this.config as any).rowIdField || 'id';\r\n\r\n      if (this.tableData !== undefined) {\r\n          this.rowSave.emit({ row: payload, isNew: !!isNew });\r\n          row.isEditing = false;\r\n          row.isNew = false;\r\n      } else {\r\n          this.loading = true;\r\n          const headers = this.getHeaders();\r\n          \r\n          if (isNew) {\r\n              const url = this.config.apiUrl || '';\r\n              this.http.post(url, payload, { headers }).pipe(\r\n                  finalize(() => this.loading = false)\r\n              ).subscribe({\r\n                  next: () => {\r\n                      row.isEditing = false;\r\n                      row.isNew = false;\r\n                      this.loadData();\r\n                  },\r\n                  error: (err) => {\r\n                      console.error('[SmartTable] Save Row Error', err);\r\n                  }\r\n              });\r\n          } else {\r\n              let url = this.config.apiUrl || '';\r\n              if (url) {\r\n                  if (url.includes(':id') || url.includes(':' + idField)) {\r\n                      url = this.replaceParams(url, row);\r\n                  } else {\r\n                      url = url.endsWith('/') ? `${url}${row[idField]}` : `${url}/${row[idField]}`;\r\n                  }\r\n              }\r\n              const method = this.config.apiMethod === 'POST' ? 'POST' : 'PUT';\r\n              this.http.request(method, url, { body: payload, headers }).pipe(\r\n                  finalize(() => this.loading = false)\r\n              ).subscribe({\r\n                  next: () => {\r\n                      row.isEditing = false;\r\n                      this.originalRowsCache.delete(row[idField]);\r\n                      this.loadData();\r\n                  },\r\n                  error: (err) => {\r\n                      console.error('[SmartTable] Update Row Error', err);\r\n                  }\r\n              });\r\n          }\r\n      }\r\n  }\r\n\r\n  // ── Date field helpers ─────────────────────────────────────────────────\r\n\r\n  /** Convert any parseable date value to a native Date object for mat-datepicker binding. */\r\n  private toDateObject(val: any): Date | null {\r\n      if (!val) return null;\r\n      if (val instanceof Date) return val;\r\n      const d = new Date(val);\r\n      return isNaN(d.getTime()) ? null : d;\r\n  }\r\n\r\n  /** Pre-process all date columns on a row before entering edit mode. */\r\n  private prepareDateFieldsForEdit(row: any): void {\r\n      this.config.columns.forEach(col => {\r\n          if (col.dataType === 'date' && row[col.key]) {\r\n              row[col.key] = this.toDateObject(row[col.key]);\r\n          }\r\n          if (col.subFields) {\r\n              col.subFields.forEach(sub => {\r\n                  if (sub.dataType === 'date' && row[sub.key]) {\r\n                      row[sub.key] = this.toDateObject(row[sub.key]);\r\n                  }\r\n              });\r\n          }\r\n      });\r\n  }\r\n\r\n  /** Normalize Date objects back to ISO strings before sending payloads. */\r\n  private normalizeDateFieldsForSave(payload: any): void {\r\n      this.config.columns.forEach(col => {\r\n          if (col.dataType === 'date' && payload[col.key] instanceof Date) {\r\n              payload[col.key] = payload[col.key].toISOString();\r\n          }\r\n          if (col.subFields) {\r\n              col.subFields.forEach(sub => {\r\n                  if (sub.dataType === 'date' && payload[sub.key] instanceof Date) {\r\n                      payload[sub.key] = payload[sub.key].toISOString();\r\n                  }\r\n              });\r\n          }\r\n      });\r\n  }\r\n}\r\n","<div class=\"smart-table-outer\">\r\n  <!-- Table Card -->\r\n  <div class=\"smart-table-wrapper\">\r\n    <!-- Top Toolbar -->\r\n    <div class=\"st-toolbar\" *ngIf=\"config.searchConfig?.enabled || (config.filters && config.filters.length > 0) || (config.topBarButtons && config.topBarButtons.length > 0)\">\r\n\r\n      <!-- Search -->\r\n      <div class=\"st-search\" *ngIf=\"config.searchConfig?.enabled\">\r\n        <i class=\"fa fa-search\"></i>\r\n        <input type=\"text\" [placeholder]=\"config.labels?.searchPlaceholder || 'Search'\" (input)=\"onSearch($event)\">\r\n      </div>\r\n\r\n      <!-- Filters -->\r\n      <div class=\"st-filters\" *ngIf=\"config.filters\">\r\n        <div class=\"st-filter-item\" *ngFor=\"let filter of config.filters\">\r\n          <!-- Trigger -->\r\n          <div class=\"st-filter-trigger\"\r\n               [class.active]=\"openFilterKey === filter.key\"\r\n               [class.has-value]=\"isFilterActive(filter)\"\r\n               (click)=\"toggleFilter(filter.key, $event)\">\r\n            <span class=\"st-filter-trigger-label\">{{ getFilterDisplay(filter) }}</span>\r\n            <svg class=\"st-filter-chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n              <path d=\"M2.5 4.5L6 8L9.5 4.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n            </svg>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Top Bar Buttons -->\r\n      <div class=\"st-actions\" *ngIf=\"config.topBarButtons\">\r\n        <lib-button *ngFor=\"let btn of getVisibleActions(config.topBarButtons)\"\r\n                    [variant]=\"btn.btnVariant || 'primary'\"\r\n                    [icon]=\"btn.icon || ''\"\r\n                    (click)=\"onTopAction(btn)\">\r\n          {{ btn.label }}\r\n        </lib-button>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Selection count strip — visible whenever selectable is enabled -->\r\n    <div class=\"st-selection-strip\" *ngIf=\"config.selectable\">\r\n      <span class=\"st-selection-count\">{{ selectedRows.length }} of {{ totalItems > 0 ? totalItems : data.length }} selected</span>\r\n    </div>\r\n\r\n    <!-- Table Container -->\r\n    <div class=\"st-table-container\">\r\n      <div class=\"st-check-loader\" *ngIf=\"isTableLoading\">\r\n          <div class=\"spinner\"></div>\r\n      </div>\r\n      <table class=\"st-table\" [class.loading-data]=\"isTableLoading\" [class.is-selectable]=\"config.selectable\">\r\n        <thead>\r\n          <tr>\r\n            <th *ngIf=\"config.selectable\" class=\"st-checkbox-col\">\r\n              <input type=\"checkbox\" *ngIf=\"isMultiSelect\" (change)=\"onSelectAll($event)\">\r\n            </th>\r\n            <th *ngFor=\"let col of config.columns; let colIndex = index\"\r\n                #stickyHeader\r\n                [class.sortable]=\"col.sortable\"\r\n                [class.sticky-col]=\"col.sticky\"\r\n                [class.first-data-col]=\"colIndex === 0\"\r\n                [ngStyle]=\"stickyColumnStyles[col.key]\"\r\n                (click)=\"onSort(col)\">\r\n              {{ col.label }}\r\n              <span *ngIf=\"col.sortable\" class=\"sort-icon-wrap\">\r\n                <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n                  <!-- Down arrow — RIGHT side, prominent when DESC -->\r\n                  <path d=\"M11.258 15.8153L14.5913 13.2699C14.7483 13.15 14.8364 12.9875 14.8364 12.818C14.8364 12.6486 14.7483 12.4861 14.5913 12.3662C14.4344 12.2464 14.2216 12.1791 13.9997 12.1791C13.7778 12.1791 13.5649 12.2464 13.408 12.3662L11.4997 13.8299V2.63636C11.4997 2.46758 11.4119 2.30572 11.2556 2.18638C11.0993 2.06704 10.8874 2 10.6663 2C10.4453 2 10.2334 2.06704 10.0771 2.18638C9.92081 2.30572 9.83301 2.46758 9.83301 2.63636V15.3635C9.83383 15.4891 9.88333 15.6117 9.97528 15.7159C10.0672 15.8201 10.1975 15.9012 10.3497 15.9489C10.4486 15.9845 10.557 16.002 10.6663 15.9998C10.776 16.0003 10.8847 15.9843 10.9863 15.9526C11.0878 15.9209 11.1801 15.8743 11.258 15.8153Z\"\r\n                        fill=\"black\" [attr.fill-opacity]=\"getDescOpacity(col.key)\"/>\r\n                  <!-- Up arrow — LEFT side, prominent when ASC -->\r\n                  <path d=\"M7.33316 16C7.11215 16 6.90019 15.933 6.74391 15.8136C6.58763 15.6942 6.49983 15.5324 6.49983 15.3636V4.16902L4.5915 5.63278C4.43458 5.75262 4.22175 5.81995 3.99983 5.81995C3.77791 5.81995 3.56508 5.75262 3.40816 5.63278C3.25124 5.51294 3.16309 5.3504 3.16309 5.18093C3.16309 5.01145 3.25124 4.84891 3.40816 4.72907L6.7415 2.18341C6.85868 2.0951 7.00749 2.03528 7.16915 2.01149C7.33081 1.98771 7.49807 2.00102 7.64983 2.04976C7.80201 2.0975 7.93228 2.17858 8.02423 2.28278C8.11617 2.38697 8.16567 2.50962 8.1665 2.63526V15.3636C8.1665 15.5324 8.0787 15.6942 7.92242 15.8136C7.76614 15.933 7.55418 16 7.33316 16Z\"\r\n                        fill=\"black\" [attr.fill-opacity]=\"getAscOpacity(col.key)\"/>\r\n                </svg>\r\n              </span>\r\n            </th>\r\n            <th *ngIf=\"getVisibleActions(config.actions).length > 0\" class=\"st-actions-col\">\r\n              {{ config.labels?.actionColumnHeader || 'Actions' }}\r\n            </th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          <tr *ngFor=\"let row of data; let rowIndex = index\" [class.editing-row]=\"row.isEditing\" [ngClass]=\"row.isEditing && config.editingRowClass ? config.editingRowClass : ''\">\r\n            <td *ngIf=\"config.selectable\" class=\"st-checkbox-col\">\r\n              <input *ngIf=\"isMultiSelect\" type=\"checkbox\" [(ngModel)]=\"row.selected\" (change)=\"onRowSelect(row)\">\r\n              <input *ngIf=\"!isMultiSelect\" type=\"radio\" [name]=\"radioGroupName\" [checked]=\"row.selected\" (change)=\"onRowSelectSingle(row)\">\r\n            </td>\r\n            <td *ngFor=\"let col of config.columns; let colIndex = index\"\r\n                [class.sticky-col]=\"col.sticky\"\r\n                [class.first-data-col]=\"colIndex === 0\"\r\n                [ngStyle]=\"stickyColumnStyles[col.key]\"\r\n                [class.clickable-cell]=\"col.clickAction\"\r\n                (click)=\"onColumnClick(row, col)\">\r\n              <!-- READ MODE -->\r\n              <ng-container *ngIf=\"!row.isEditing\">\r\n                <!-- Text/Number/Date -->\r\n                <span *ngIf=\"col.type !== 'custom' && col.type !== 'html' && col.type !== 'badge'\">\r\n                  {{ getCellValue(row, col) }}\r\n                </span>\r\n                <!-- HTML -->\r\n                <div *ngIf=\"col.type === 'html'\" [innerHTML]=\"getCellValue(row, col) | safeHtml\"></div>\r\n                <!-- Badge -->\r\n                <span *ngIf=\"col.type === 'badge'\" class=\"st-badge\" [ngClass]=\"getBadgeClass(row, col)\">\r\n                    {{ getCellValue(row, col) }}\r\n                </span>\r\n              </ng-container>\r\n\r\n              <!-- EDIT/ADD MODE -->\r\n              <ng-container *ngIf=\"row.isEditing\">\r\n                <!-- Multi-field cell (stacked inputs) -->\r\n                <div *ngIf=\"col.subFields\" class=\"st-stacked-inputs\">\r\n                  <ng-container *ngFor=\"let sub of col.subFields\">\r\n                    <select *ngIf=\"sub.dataType === 'select'\"\r\n                            [(ngModel)]=\"row[sub.key]\"\r\n                            [disabled]=\"sub.editable === false || col.editConfig?.disabled\"\r\n                            class=\"st-cell-select\">\r\n                      <option *ngFor=\"let opt of sub.options\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n                    </select>\r\n                    <!-- Date picker -->\r\n                    <div *ngIf=\"sub.dataType === 'date'\" class=\"st-date-cell\">\r\n                      <input matInput [matDatepicker]=\"subPicker\"\r\n                             [(ngModel)]=\"row[sub.key]\"\r\n                             [disabled]=\"sub.editable === false || col.editConfig?.disabled\"\r\n                             [placeholder]=\"sub.placeholder || ''\"\r\n                             class=\"st-cell-input\"\r\n                             (click)=\"subPicker.open()\">\r\n                      <mat-datepicker-toggle [for]=\"subPicker\"></mat-datepicker-toggle>\r\n                      <mat-datepicker #subPicker></mat-datepicker>\r\n                    </div>\r\n                    <input *ngIf=\"sub.dataType !== 'select' && sub.dataType !== 'date'\"\r\n                           [type]=\"sub.dataType\"\r\n                           [(ngModel)]=\"row[sub.key]\"\r\n                           [disabled]=\"sub.editable === false || col.editConfig?.disabled\"\r\n                           [placeholder]=\"sub.placeholder || ''\"\r\n                           class=\"st-cell-input\">\r\n                  </ng-container>\r\n                </div>\r\n\r\n                <!-- Single field cell input -->\r\n                <div *ngIf=\"!col.subFields\">\r\n                  <select *ngIf=\"col.dataType === 'select'\"\r\n                          [(ngModel)]=\"row[col.key]\"\r\n                          [disabled]=\"col.editable === false || col.editConfig?.disabled\"\r\n                          class=\"st-cell-select\">\r\n                    <option *ngFor=\"let opt of col.options\" [value]=\"opt.value\">{{ opt.label }}</option>\r\n                  </select>\r\n                  <!-- Date picker -->\r\n                  <div *ngIf=\"col.dataType === 'date'\" class=\"st-date-cell\">\r\n                    <input matInput [matDatepicker]=\"colPicker\"\r\n                           [(ngModel)]=\"row[col.key]\"\r\n                           [disabled]=\"col.editable === false || col.editConfig?.disabled\"\r\n                           class=\"st-cell-input\"\r\n                           (click)=\"colPicker.open()\">\r\n                    <mat-datepicker-toggle [for]=\"colPicker\"></mat-datepicker-toggle>\r\n                    <mat-datepicker #colPicker></mat-datepicker>\r\n                  </div>\r\n                  <input *ngIf=\"col.dataType !== 'select' && col.dataType !== 'date'\"\r\n                         [type]=\"col.dataType || 'text'\"\r\n                         [(ngModel)]=\"row[col.key]\"\r\n                         [disabled]=\"col.editable === false || col.editConfig?.disabled\"\r\n                         class=\"st-cell-input\">\r\n                </div>\r\n              </ng-container>\r\n            </td>\r\n\r\n            <!-- Row Actions -->\r\n            <td *ngIf=\"getVisibleActions(config.actions).length > 0\" class=\"st-row-actions st-actions-col\">\r\n              <div class=\"action-buttons\">\r\n                <!-- EDIT MODE ACTIONS -->\r\n                <ng-container *ngIf=\"row.isEditing\">\r\n                  <div class=\"edit-mode-actions\">\r\n                    <lib-button variant=\"outline\" (click)=\"onCancelRow(row, rowIndex); $event.stopPropagation()\">\r\n                      {{ config.labels?.cancelLabel || 'Cancel' }}\r\n                    </lib-button>\r\n                    <lib-button [variant]=\"row.isNew ? (config.labels?.addButtonVariant || 'danger') : (config.labels?.saveButtonVariant || 'primary')\" (click)=\"onSaveRow(row); $event.stopPropagation()\">\r\n                      {{ row.isNew ? (config.labels?.addLabel || 'Add') : (config.labels?.saveLabel || 'Save') }}\r\n                    </lib-button>\r\n                  </div>\r\n                </ng-container>\r\n\r\n                <!-- READ MODE ACTIONS -->\r\n                <ng-container *ngIf=\"!row.isEditing\">\r\n                  <ng-container *ngFor=\"let action of getVisibleActions(config.actions, row); let i = index\">\r\n                      <ng-container *ngIf=\"action.type === 'dropdown'\">\r\n                          <div class=\"st-dropdown-container\" (click)=\"$event.stopPropagation()\">\r\n                              <button class=\"st-dropdown-btn\"\r\n                                      [class.active]=\"openDropdownId === (rowIndex + '-' + i)\"\r\n                                      (click)=\"toggleDropdown(rowIndex + '-' + i, $event, getVisibleActions(action.items, row), row)\">\r\n                                  <span class=\"action-circle\">\r\n                                    <i class=\"fa fa-ellipsis-h\"></i>\r\n                                  </span>\r\n                              </button>\r\n                          </div>\r\n                      </ng-container>\r\n                      <ng-container *ngIf=\"action.type !== 'dropdown'\">\r\n                        <lib-button\r\n                           [variant]=\"action.btnVariant || 'secondary'\"\r\n                           [icon]=\"action.icon || ''\"\r\n                           (click)=\"onAction(action, row)\">\r\n                           {{ action.label }}\r\n                       </lib-button>\r\n                      </ng-container>\r\n                  </ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </td>\r\n          </tr>\r\n          <tr *ngIf=\"data.length === 0 && !isTableLoading\">\r\n              <td [attr.colspan]=\"columnCount + (config.selectable ? 1 : 0) + (getVisibleActions(config.actions).length > 0 ? 1 : 0)\" class=\"no-data\">\r\n                  {{ config.labels?.noDataMessage || 'No data available' }}\r\n              </td>\r\n          </tr>\r\n        </tbody>\r\n      </table>\r\n    </div>\r\n\r\n    <!-- Pagination — inside the card, sticks to the bottom -->\r\n    <div class=\"st-pagination\" *ngIf=\"showPagination\">\r\n      <lib-pagination\r\n        [totalItems]=\"totalItems\"\r\n        [itemsPerPage]=\"config.pagination!.pageSize\"\r\n        [currentPage]=\"currentPage\"\r\n        [pageSizeOptions]=\"config.pagination!.pageSizeOptions\"\r\n        (pageChange)=\"onPageChange($event)\"\r\n        (itemsPerPageChange)=\"onPageSizeChange($event)\">\r\n      </lib-pagination>\r\n    </div>\r\n\r\n    <!-- Built-in Delete Confirmation Modal -->\r\n    <cc-confirmation-modal\r\n      [isOpen]=\"deleteModalOpen\"\r\n      [config]=\"deleteModalConfig\"\r\n      (confirm)=\"onDeleteConfirm()\"\r\n      (cancel)=\"onDeleteCancel()\"\r\n      (close)=\"onDeleteCancel()\">\r\n      <p>{{ deleteModalMessage }}</p>\r\n    </cc-confirmation-modal>\r\n  </div>\r\n</div>\r\n\r\n<!--\r\n  Filter panel portal — position:fixed keeps it above all overflow/sticky containers.\r\n-->\r\n<div class=\"st-filter-panel\"\r\n     *ngIf=\"openFilterKey !== null && activeFilterData\"\r\n     [ngStyle]=\"{\r\n       position: 'fixed',\r\n       top: filterPosition.top + 'px',\r\n       left: filterPosition.left + 'px',\r\n       'z-index': '99999'\r\n     }\"\r\n     (click)=\"$event.stopPropagation()\">\r\n  <div class=\"st-filter-option\"\r\n       [class.selected]=\"!isFilterActive(activeFilterData)\"\r\n       (click)=\"selectFilterOption(activeFilterData, null)\">\r\n    All {{ activeFilterData.label }}\r\n  </div>\r\n  <div class=\"st-filter-option\"\r\n       *ngFor=\"let opt of getValidFilterOptions(activeFilterData)\"\r\n       [class.selected]=\"activeFilters[activeFilterData.key] === opt.value\"\r\n       (click)=\"selectFilterOption(activeFilterData, opt)\">\r\n    {{ opt.label }}\r\n  </div>\r\n</div>\r\n\r\n<!--\r\n  Dropdown portal — rendered OUTSIDE every scroll/sticky container.\r\n  position:fixed + z-index:99999 here is unconditionally above all sticky table cells.\r\n-->\r\n<div class=\"st-dropdown-menu st-dropdown-portal\"\r\n     *ngIf=\"openDropdownId !== null && activeDropdownItems\"\r\n     [ngStyle]=\"{\r\n       position: 'fixed',\r\n       top: dropdownPosition.top + 'px',\r\n       right: dropdownPosition.right + 'px',\r\n       left: 'auto',\r\n       'z-index': '99999'\r\n     }\"\r\n     (click)=\"$event.stopPropagation()\">\r\n  <button class=\"st-dropdown-item\"\r\n          *ngFor=\"let item of activeDropdownItems\"\r\n          (click)=\"onActionItemClick(item, activeDropdownRow, $event); closeDropdown()\">\r\n    <i *ngIf=\"item.icon\" [class]=\"item.icon + ' st-action-icon'\"></i>\r\n    <span>{{ item.label }}</span>\r\n  </button>\r\n</div>\r\n","import {\r\n  Component,\r\n  Input,\r\n  Output,\r\n  EventEmitter,\r\n  OnInit,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  OnDestroy,\r\n  ChangeDetectorRef,\r\n  NgZone,\r\n} from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nimport {\r\n  FilterTableSelectorConfig,\r\n  FilterParamMap,\r\n} from '../../filter-table-selector.models';\r\nimport { FilterTableConfig } from '../../filter-table-selector.models';\r\n\r\n@Component({\r\n  selector: 'lib-filter-table-selector',\r\n  templateUrl: './filter-table-selector.component.html',\r\n  styleUrls: ['./filter-table-selector.component.scss'],\r\n  standalone: false,\r\n})\r\nexport class FilterTableSelectorComponent implements OnInit, OnChanges, OnDestroy {\r\n  /** Full config object driven by consuming MFE JSON. */\r\n  @Input() config!: FilterTableSelectorConfig;\r\n\r\n  /**\r\n   * Flat i18n labels map from the consuming MFE.\r\n   * Mirrors the pattern used by SmartFormComponent.\r\n   */\r\n  @Input() labels: Record<string, string> = {};\r\n\r\n  /**\r\n   * Pre-selected row identifiers.\r\n   * When provided, matching rows are pre-checked on first load and\r\n   * re-checked after each page navigation.\r\n   * Must be an array of row objects (the same shape returned by the API).\r\n   */\r\n  @Input() preSelectedRows: any[] = [];\r\n\r\n  /** Emits the array of currently selected row objects on \"Add / Submit\". */\r\n  @Output() onSubmit = new EventEmitter<any[]>();\r\n\r\n  /** Emits void on \"Back / Cancel\". */\r\n  @Output() onCancel = new EventEmitter<void>();\r\n\r\n  // ── Internal state ──────────────────────────────────────────────────────────\r\n\r\n  /** A deep-copy of tableConfig with the current filter params baked-in. */\r\n  resolvedTableConfig!: FilterTableConfig;\r\n\r\n  /** Current active filter params (merged from form submission). Array values become repeated\r\n   *  query-param keys (e.g. roleCodes=1&roleCodes=2), not comma-joined. */\r\n  activeFilterParams: Record<string, string | string[]> = {};\r\n\r\n  /** The base API URL without any filter query params. */\r\n  private baseApiUrl: string = '';\r\n\r\n  /** All rows selected so far, tracked across pagination pages. */\r\n  selectedRows: any[] = [];\r\n\r\n  /** Total rows currently loaded in the table (reported by SmartTable rowSelect). */\r\n  totalTableItems: number = 0;\r\n\r\n  /** Serialised SmartForm JSON (with labels translated + disabled fields applied). */\r\n  resolvedFormJson: string = '';\r\n\r\n  /**\r\n   * Default values to prefill the SmartForm.\r\n   * Updated on each initialize() call and reset to config defaults on Clear Filter.\r\n   */\r\n  resolvedInitialValues: Record<string, any> = {};\r\n\r\n  /**\r\n   * Version counter — bumping this forces *ngIf to re-create the SmartForm\r\n   * component with fresh initial values (used by Clear Filter).\r\n   */\r\n  formVersion: number = 0;\r\n\r\n  /** Whether the filter panel is visible (toggled on mobile, always visible on desktop). */\r\n  filterPanelVisible: boolean = true;\r\n\r\n  /**\r\n   * Tracks the live form values as the user changes fields.\r\n   * Updated via SmartForm's (valueChange) output.\r\n   * Used when the user clicks the \"Apply Filter\" button in the component.\r\n   */\r\n  currentFormValues: Record<string, any> = {};\r\n\r\n  private destroy$ = new Subject<void>();\r\n\r\n  constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) { }\r\n\r\n  // ── Lifecycle ────────────────────────────────────────────────────────────────\r\n\r\n  ngOnInit(): void {\r\n    this.initialize();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['config'] && !changes['config'].isFirstChange()) {\r\n      this.initialize();\r\n    }\r\n    if (changes['preSelectedRows'] && !changes['preSelectedRows'].isFirstChange()) {\r\n      this.syncPreselection();\r\n    }\r\n    if (changes['labels'] && !changes['labels'].isFirstChange()) {\r\n      this.buildFormJson();\r\n      this.applyFilterParamsToTable();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroy$.next();\r\n    this.destroy$.complete();\r\n  }\r\n\r\n  // ── Initialisation ───────────────────────────────────────────────────────────\r\n\r\n  private initialize(): void {\r\n    if (!this.config) return;\r\n\r\n    this.baseApiUrl = this.config.tableConfig.apiUrl || '';\r\n    this.selectedRows = [...(this.preSelectedRows || [])];\r\n\r\n    const defaults = this.config.filterConfig.defaultValues || {};\r\n\r\n    // Build default filter params from defaultValues for the initial API call\r\n    this.activeFilterParams = this.buildFilterParams(defaults);\r\n\r\n    // Synchronize currentFormValues so Apply Filter works even if no changes are made yet\r\n    this.currentFormValues = { ...defaults };\r\n\r\n    this.buildFormJson();\r\n    this.applyFilterParamsToTable();\r\n\r\n    // Bump version to force SmartForm re-creation with the new defaultValues\r\n    this.formVersion++;\r\n  }\r\n\r\n  // ── Form JSON construction ───────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Serialises the SmartForm config JSON.\r\n   * Applies disabledFields from filterPanelConfig.\r\n   */\r\n  private buildFormJson(overrideValues?: Record<string, any>): void {\r\n    if (!this.config?.filterConfig?.smartFormConfig) return;\r\n\r\n    // Deep-clone to avoid mutating the original config\r\n    const schema = JSON.parse(\r\n      JSON.stringify(this.config.filterConfig.smartFormConfig)\r\n    );\r\n\r\n    // Apply disabled fields and TRANSLATE LABELS\r\n    const disabled = this.config.filterConfig.disabledFields || [];\r\n    if (schema.sectionConfig?.children) {\r\n      schema.sectionConfig.children = schema.sectionConfig.children.map(\r\n        (field: any) => {\r\n          // Translate label and placeholder\r\n          if (field.label) field.label = this.translate(field.label);\r\n          if (field.placeholder) field.placeholder = this.translate(field.placeholder);\r\n\r\n          if (disabled.includes(field.name)) {\r\n            return { ...field, disabled: true };\r\n          }\r\n          return field;\r\n        }\r\n      );\r\n    }\r\n\r\n    this.resolvedFormJson = JSON.stringify(schema);\r\n\r\n    // Use override (e.g. after clear) or fall back to config defaults\r\n    const values = overrideValues !== undefined\r\n      ? overrideValues\r\n      : { ...(this.config.filterConfig.defaultValues || {}) };\r\n    this.resolvedInitialValues = values;\r\n  }\r\n\r\n  // ── Table URL & Payload resolution ─────────────────────────────────────────\r\n\r\n  /**\r\n   * Rebuilds resolvedTableConfig.\r\n   * If filterTarget is 'apiPayload' (or tableConfig.apiMethod is 'POST'), filter parameters are merged into apiPayload.\r\n   * Otherwise, filter parameters are appended to apiUrl as query string parameters.\r\n   */\r\n  private applyFilterParamsToTable(): void {\r\n    const isPost = this.config.tableConfig?.apiMethod === 'POST';\r\n    const filterTarget = this.config.filterConfig?.filterTarget || (isPost ? 'apiPayload' : 'queryParams');\r\n\r\n    let newUrl = this.baseApiUrl;\r\n    let newPayload = this.config.tableConfig.apiPayload ? JSON.parse(JSON.stringify(this.config.tableConfig.apiPayload)) : undefined;\r\n\r\n    if (filterTarget === 'apiPayload') {\r\n      newPayload = newPayload || {};\r\n      const mapping = this.config.filterConfig.filterParamMapping || [];\r\n      const mappedFieldNames = new Set(mapping.map((map: FilterParamMap) => map.formFieldName));\r\n\r\n      const assignToPayload = (apiParamKey: string, rawVal: any) => {\r\n        if (rawVal === null || rawVal === undefined || rawVal === '') return;\r\n        const keyParts = apiParamKey.split('.');\r\n        if (keyParts.length > 1) {\r\n          const containerKey = keyParts[0];\r\n          const subKey = keyParts.slice(1).join('.');\r\n          newPayload[containerKey] = newPayload[containerKey] || {};\r\n          newPayload[containerKey][subKey] = Array.isArray(rawVal) ? rawVal : [rawVal];\r\n        } else {\r\n          newPayload[apiParamKey] = rawVal;\r\n        }\r\n      };\r\n\r\n      mapping.forEach((map: FilterParamMap) => assignToPayload(map.apiParamKey, this.currentFormValues[map.formFieldName]));\r\n      // Same identity fallback as buildFilterParams() (queryParams path) — a field the\r\n      // consuming MFE adds without a filterParamMapping entry still reaches the payload,\r\n      // keyed by its own form field name.\r\n      Object.keys(this.currentFormValues || {})\r\n        .filter(fieldName => !mappedFieldNames.has(fieldName))\r\n        .forEach(fieldName => assignToPayload(fieldName, this.currentFormValues[fieldName]));\r\n    } else {\r\n      const paramString = Object.entries(this.activeFilterParams)\r\n        .filter(([, v]) => v !== null && v !== undefined && v !== '' && !(Array.isArray(v) && v.length === 0))\r\n        .flatMap(([k, v]) => (Array.isArray(v) ? v : [v]).map(val => `${encodeURIComponent(k)}=${encodeURIComponent(val)}`))\r\n        .join('&');\r\n\r\n      const separator = this.baseApiUrl.includes('?') ? '&' : '?';\r\n      newUrl = paramString\r\n        ? `${this.baseApiUrl}${separator}${paramString}`\r\n        : this.baseApiUrl;\r\n    }\r\n\r\n    // Translate Column Labels\r\n    const translatedColumns = (this.config.tableConfig.columns || []).map(col => ({\r\n      ...col,\r\n      label: this.translate(col.label)\r\n    }));\r\n\r\n    // Assign a new object reference so SmartTable's ngOnChanges fires\r\n    this.resolvedTableConfig = {\r\n      ...this.config.tableConfig,\r\n      columns: translatedColumns,\r\n      apiUrl: newUrl,\r\n      apiPayload: newPayload,\r\n      selectable: true,\r\n      multiSelect: this.config.selectionConfig.multiSelect,\r\n    };\r\n  }\r\n\r\n  // ── Filter param helpers ─────────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Converts a flat form-value map to API param key/value pairs using the configured\r\n   * filterParamMapping, PLUS an identity fallback (formFieldName used as-is for apiParamKey)\r\n   * for any form field that mapping doesn't explicitly cover. Without that fallback, a field a\r\n   * consuming MFE adds to its smartFormConfig — e.g. an address dropdown chain injected from the\r\n   * app's own TS — could never be forwarded to the API unless someone went back and hand-added a\r\n   * filterParamMapping entry for it. An explicit mapping entry still wins whenever both exist (e.g.\r\n   * remapping \"country\" to \"currentCountryCode\"), so nothing already relying on a renamed key\r\n   * changes behavior.\r\n   */\r\n  private buildFilterParams(\r\n    formValues: Record<string, any>\r\n  ): Record<string, string | string[]> {\r\n    const mapping = this.config.filterConfig.filterParamMapping || [];\r\n    const mappedFieldNames = new Set(mapping.map((map: FilterParamMap) => map.formFieldName));\r\n    const params: Record<string, string | string[]> = {};\r\n\r\n    const assign = (apiParamKey: string, rawVal: any) => {\r\n      if (rawVal === null || rawVal === undefined || rawVal === '') return;\r\n      // Multiselect fields become repeated query-param keys (roleCodes=1&roleCodes=2),\r\n      // not a single comma-joined value — matches how the search-service filter API\r\n      // (and most other backend filter endpoints) expect multi-value params.\r\n      params[apiParamKey] = Array.isArray(rawVal) ? rawVal.map(String) : String(rawVal);\r\n    };\r\n\r\n    mapping.forEach((map: FilterParamMap) => assign(map.apiParamKey, formValues[map.formFieldName]));\r\n    Object.keys(formValues || {})\r\n      .filter(fieldName => !mappedFieldNames.has(fieldName))\r\n      .forEach(fieldName => assign(fieldName, formValues[fieldName]));\r\n\r\n    return params;\r\n  }\r\n\r\n  // ── SmartForm event handlers ─────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Called every time a form field value changes (SmartForm valueChange output).\r\n   * We track the current values so the component-level \"Apply Filter\" button\r\n   * can read them without relying on a form submit button inside the JSON config.\r\n   */\r\n  onFormValueChange(values: Record<string, any>): void {\r\n    this.currentFormValues = values || {};\r\n  }\r\n\r\n  /**\r\n   * Called when the user clicks the \"Apply Filter\" button rendered by the component.\r\n   * Builds API params from the tracked form values and reloads the table.\r\n   */\r\n  applyCurrentFilter(): void {\r\n    this.activeFilterParams = this.buildFilterParams(this.currentFormValues);\r\n    this.applyFilterParamsToTable();\r\n  }\r\n\r\n  /**\r\n   * Clear Filter: resets form to default values (preserving disabled-field values),\r\n   * reloads the table with default params.\r\n   * The form is re-created via formVersion bump so SmartForm gets fresh initialValues.\r\n   */\r\n  onClearFilter(): void {\r\n    const defaults = this.config.filterConfig.defaultValues || {};\r\n    const disabled = this.config.filterConfig.disabledFields || [];\r\n\r\n    // Build reset values: keep default values for disabled fields, clear the rest\r\n    const resetValues: Record<string, any> = {};\r\n    disabled.forEach(fieldName => {\r\n      if (defaults[fieldName] !== undefined) {\r\n        resetValues[fieldName] = defaults[fieldName];\r\n      }\r\n    });\r\n\r\n    this.currentFormValues = { ...resetValues };\r\n    this.activeFilterParams = this.buildFilterParams(resetValues);\r\n\r\n    // Destroy and recreate SmartForm with clean initial values\r\n    this.resolvedFormJson = '';\r\n    this.formVersion++;\r\n\r\n    // Use NgZone + setTimeout to ensure the *ngIf toggles in one tick, then re-renders\r\n    this.ngZone.run(() => {\r\n      setTimeout(() => {\r\n        this.buildFormJson(resetValues);\r\n        this.applyFilterParamsToTable();\r\n      }, 0);\r\n    });\r\n  }\r\n\r\n  // ── SmartTable event handlers ────────────────────────────────────────────────\r\n\r\n  /**\r\n   * Called by SmartTable's (rowSelect) output.\r\n   * Merges page-level selection with the cross-page tracking set.\r\n   */\r\n  onRowSelect(globalSelection: any[]): void {\r\n    this.selectedRows = globalSelection || [];\r\n  }\r\n\r\n  /**\r\n   * Syncs preSelectedRows into the local selectedRows (called when input changes).\r\n   */\r\n  private syncPreselection(): void {\r\n    this.selectedRows = [...(this.preSelectedRows || [])];\r\n  }\r\n\r\n  // ── Action handlers ──────────────────────────────────────────────────────────\r\n\r\n  handleSubmit(): void {\r\n    this.onSubmit.emit([...this.selectedRows]);\r\n  }\r\n\r\n  handleCancel(): void {\r\n    this.onCancel.emit();\r\n  }\r\n\r\n  // ── Label helpers ─────────────────────────────────────────────────────────────\r\n\r\n  translate(key: string): string {\r\n    return this.labels[key] || key;\r\n  }\r\n\r\n  get titleLabel(): string {\r\n    return this.translate(this.config?.title || '');\r\n  }\r\n\r\n  get submitButtonLabel(): string {\r\n    return this.translate(this.config?.selectionConfig?.submitButtonLabel || '');\r\n  }\r\n\r\n  get cancelButtonLabel(): string {\r\n    return this.translate(this.config?.selectionConfig?.cancelButtonLabel || '');\r\n  }\r\n\r\n  get clearFilterButtonLabel(): string {\r\n    const key = this.config?.filterConfig?.clearFilterLabel || 'COMMON.FILTER_TABLE.CLEAR_FILTER';\r\n    return this.translate(key) || 'Clear Filter';\r\n  }\r\n\r\n  get applyFilterButtonLabel(): string {\r\n    const key = this.config?.filterConfig?.applyFilterLabel || 'COMMON.FILTER_TABLE.APPLY_FILTER';\r\n    return this.translate(key) || 'Apply Filter';\r\n  }\r\n\r\n  get selectionCountText(): string {\r\n    if (!this.config?.selectionConfig?.selectionCountLabel) return '';\r\n    const raw = this.translate(this.config.selectionConfig.selectionCountLabel);\r\n    return raw\r\n      .replace('{selected}', String(this.selectedRows.length))\r\n      .replace('{total}', String(this.totalTableItems));\r\n  }\r\n\r\n  get hasActiveFilters(): boolean {\r\n    return Object.keys(this.activeFilterParams).length > 0;\r\n  }\r\n\r\n}\r\n","<div class=\"fts-container\">\r\n\r\n  <!-- ── Modal Header ──────────────────────────────────────────────────────── -->\r\n  <div class=\"fts-header\" *ngIf=\"config?.title\">\r\n    <h2 class=\"fts-header__title\">{{ titleLabel }}</h2>\r\n  </div>\r\n\r\n  <!-- ── Body: Filter Panel + Table Panel ──────────────────────────────────── -->\r\n  <div class=\"fts-body\" *ngIf=\"config\">\r\n\r\n    <!-- LEFT: Filter Panel -->\r\n    <aside class=\"fts-filter-panel\" [class.fts-filter-panel--hidden]=\"!filterPanelVisible\">\r\n\r\n      <div class=\"fts-filter-panel__header\">\r\n        <span class=\"fts-filter-panel__title\">{{ translate('COMMON.FILTER_TABLE.FILTER_BY') || 'Filter By' }}</span>\r\n      </div>\r\n\r\n      <div class=\"fts-filter-panel__content\">\r\n        <!-- SmartForm renders the dynamic filter form. -->\r\n        <ng-container *ngIf=\"resolvedFormJson && formVersion >= 0\">\r\n          <lib-smart-form [formJson]=\"resolvedFormJson\" [labels]=\"labels\" [initialValues]=\"resolvedInitialValues\"\r\n            (valueChange)=\"onFormValueChange($event)\">\r\n          </lib-smart-form>\r\n        </ng-container>\r\n      </div>\r\n\r\n    </aside>\r\n\r\n    <!-- RIGHT: Table Panel -->\r\n    <section class=\"fts-table-panel\">\r\n\r\n      <!-- Table toolbar: selection count -->\r\n      <!-- <div class=\"fts-table-panel__toolbar\">\r\n        <span class=\"fts-selection-count\" *ngIf=\"config.selectionConfig?.selectionCountLabel\">\r\n          {{ selectionCountText }}\r\n        </span>\r\n      </div> -->\r\n\r\n      <!-- SmartTable -->\r\n      <div class=\"fts-table-wrapper\">\r\n        <lib-smart-table *ngIf=\"resolvedTableConfig\" [config]=\"resolvedTableConfig\" [selectedRows]=\"selectedRows\"\r\n          (rowSelect)=\"onRowSelect($event)\">\r\n        </lib-smart-table>\r\n      </div>\r\n\r\n    </section>\r\n\r\n  </div>\r\n\r\n  <!-- ── Footer Action Bar ─────────────────────────────────────────────────── -->\r\n  <div class=\"fts-footer\">\r\n    <div class=\"fts-footer__left\">\r\n      <lib-button id=\"fts-clear-filter-btn\" variant=\"outline\" (click)=\"onClearFilter()\">\r\n        {{ clearFilterButtonLabel }}\r\n      </lib-button>\r\n\r\n      <lib-button id=\"fts-apply-filter-btn\" variant=\"primary\" (click)=\"applyCurrentFilter()\">\r\n        {{ applyFilterButtonLabel }}\r\n      </lib-button>\r\n    </div>\r\n\r\n    <div class=\"fts-footer__right\">\r\n      <lib-button id=\"fts-cancel-btn\" variant=\"outline\" (click)=\"handleCancel()\">\r\n        {{ cancelButtonLabel }}\r\n      </lib-button>\r\n\r\n      <lib-button id=\"fts-submit-btn\" variant=\"primary\" (click)=\"handleSubmit()\">\r\n        {{ submitButtonLabel }}\r\n      </lib-button>\r\n    </div>\r\n  </div>\r\n\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PaginationComponent } from './components/pagination/pagination.component';\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    PaginationComponent\r\n  ],\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  exports: [\r\n    PaginationComponent\r\n  ]\r\n})\r\nexport class PaginationModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SmartTableComponent } from './components/smart-table/smart-table.component';\r\nimport { PaginationModule } from '../pagination/pagination.module';\r\nimport { ButtonModule } from '../button/button.module';\r\nimport { MaterialModule } from '../material/material.module';\r\nimport { ConfirmationModalModule } from '../confirmation-modal/confirmation-modal.module';\r\nimport { SafeHtmlPipe } from './utils/safe-html.pipe';\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    SmartTableComponent,\r\n    SafeHtmlPipe\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    PaginationModule,\r\n    ButtonModule,\r\n    MaterialModule,\r\n    ConfirmationModalModule\r\n  ],\r\n  exports: [\r\n    SmartTableComponent\r\n  ]\r\n})\r\nexport class SmartTableModule { }\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FilterTableSelectorComponent } from './components/filter-table-selector/filter-table-selector.component';\r\nimport { SmartFormModule } from '../smart-form/smart-form.module';\r\nimport { SmartTableModule } from '../smart-table/smart-table.module';\r\nimport { ButtonModule } from '../button/button.module';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    FilterTableSelectorComponent\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    SmartFormModule,\r\n    SmartTableModule,\r\n    ButtonModule\r\n  ],\r\n  exports: [\r\n    FilterTableSelectorComponent\r\n  ]\r\n})\r\nexport class FilterTableSelectorModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MaterialModule } from './modules/material/material.module';\r\nimport { AlertModule } from './modules/alert/alert.module';\r\nimport { ButtonModule } from './modules/button/button.module';\r\nimport { ButtonDropdownModule } from './modules/button-dropdown/button-dropdown.module';\r\nimport { ConfirmationModalModule } from './modules/confirmation-modal/confirmation-modal.module';\r\nimport { FilterSidebarModule } from './modules/filter-sidebar/filter-sidebar.module';\r\nimport { SummaryCardModule } from './modules/summary-card/summary-card.module';\r\nimport { ConfigurableFormModule } from './modules/configurable-form/configurable-form.module';\r\nimport { FormComponentsModule } from './modules/form-components/form-components.module';\r\nimport { SmartFormModule } from './modules/smart-form/smart-form.module';\r\nimport { FilterModule } from './modules/filter/filter.module';\r\nimport { SideNavModule } from './modules/side-nav/side-nav.module';\r\nimport { FormBuilderModule } from './modules/form-builder/form-builder.module';\r\nimport { FormFieldConfigurationModule } from './modules/form-field-configuration/form-field-configuration.module';\r\nimport { TableColumnConfigurationModule } from './modules/table-column-configuration/table-column-configuration.module';\r\nimport { FilterTableSelectorModule } from './modules/filter-table-selector/filter-table-selector.module';\r\nimport { TimePickerModule } from './modules/time-picker/time-picker.module';\r\n\r\n@NgModule({\r\n  declarations: [],\r\n  imports: [\r\n    CommonModule,\r\n    MaterialModule,\r\n    AlertModule, ButtonModule, ButtonDropdownModule, ConfirmationModalModule, FilterSidebarModule, FilterModule,\r\n    SummaryCardModule,\r\n    ConfigurableFormModule,\r\n    FormComponentsModule,\r\n    SmartFormModule,\r\n    SideNavModule,\r\n    FormBuilderModule,\r\n    FilterTableSelectorModule,\r\n    TimePickerModule,\r\n    FormFieldConfigurationModule,\r\n    TableColumnConfigurationModule,\r\n    FilterTableSelectorModule\r\n  ],\r\n  exports: [\r\n    MaterialModule,\r\n    AlertModule, ButtonModule, ButtonDropdownModule, ConfirmationModalModule, FilterSidebarModule, FilterModule,\r\n    SummaryCardModule,\r\n    ConfigurableFormModule,\r\n    FormComponentsModule,\r\n    SmartFormModule,\r\n    SideNavModule,\r\n    FormBuilderModule,\r\n    FilterTableSelectorModule,\r\n    TimePickerModule,\r\n    FormFieldConfigurationModule,\r\n    TableColumnConfigurationModule,\r\n    FilterTableSelectorModule\r\n  ],\r\n})\r\nexport class SharedUiModule { }\r\n","/**\r\n * Utility functions for LocalStorage operations\r\n */\r\nexport const getLocalStorageItem = (key: string): string | null => {\r\n  return localStorage.getItem(key);\r\n};\r\n\r\nexport const setLocalStorageItem = (key: string, value: string): void => {\r\n  localStorage.setItem(key, value);\r\n};\r\n\r\nexport const removeLocalStorageItem = (key: string): void => {\r\n  localStorage.removeItem(key);\r\n};\r\n\r\nexport const clearLocalStorage = (): void => {\r\n  localStorage.clear();\r\n};\r\n\r\n/**\r\n * Utility functions for SessionStorage operations\r\n */\r\nexport const getSessionStorageItem = (key: string): string | null => {\r\n  return sessionStorage.getItem(key);\r\n};\r\n\r\nexport const setSessionStorageItem = (key: string, value: string): void => {\r\n  sessionStorage.setItem(key, value);\r\n};\r\n\r\nexport const removeSessionStorageItem = (key: string): void => {\r\n  sessionStorage.removeItem(key);\r\n};\r\n\r\nexport const clearSessionStorage = (): void => {\r\n  sessionStorage.clear();\r\n};\r\n","import { FormConfig } from './configurable-form.model';\r\n\r\n/**\r\n * Example: Basic Form Configuration\r\n * This is a generic example for testing and demonstration purposes.\r\n */\r\nexport const EXAMPLE_FORM_CONFIG: FormConfig = {\r\n    sections: [\r\n        {\r\n            sectionTitle: 'User Information',\r\n            fields: [\r\n                {\r\n                    name: 'fullName',\r\n                    label: 'Full Name',\r\n                    type: 'text',\r\n                    placeholder: 'Enter full name',\r\n                    required: true,\r\n                    class: 'col-12'\r\n                },\r\n                {\r\n                    name: 'email',\r\n                    label: 'Email Address',\r\n                    type: 'email',\r\n                    placeholder: 'Enter email address',\r\n                    required: true,\r\n                    class: 'col-6'\r\n                },\r\n                {\r\n                    name: 'phone',\r\n                    label: 'Phone Number',\r\n                    type: 'tel',\r\n                    placeholder: '+91 9999999999',\r\n                    class: 'col-6'\r\n                },\r\n                {\r\n                    name: 'role',\r\n                    label: 'Role',\r\n                    type: 'dropdown',\r\n                    placeholder: 'Select Role',\r\n                    options: [\r\n                        { label: 'Admin', value: 'admin' },\r\n                        { label: 'User', value: 'user' },\r\n                        { label: 'Guest', value: 'guest' }\r\n                    ],\r\n                    class: 'col-12'\r\n                }\r\n            ]\r\n        },\r\n        {\r\n            sectionTitle: 'Preferences',\r\n            fields: [\r\n                {\r\n                    name: 'notifications',\r\n                    label: 'Receive Notifications',\r\n                    type: 'radio',\r\n                    options: [\r\n                        { label: 'Yes', value: 'yes' },\r\n                        { label: 'No', value: 'no' }\r\n                    ],\r\n                    value: 'yes',\r\n                    class: 'col-12'\r\n                }\r\n            ]\r\n        },\r\n        {\r\n            sectionTitle: 'Documents',\r\n            fields: [\r\n                {\r\n                    name: 'profilePicture',\r\n                    label: 'Profile Picture',\r\n                    type: 'file',\r\n                    accept: '.jpg,.png',\r\n                    multiple: false,\r\n                    helpText: 'Upload a single profile picture (Max 5MB)',\r\n                    class: 'col-12'\r\n                },\r\n                {\r\n                    name: 'certificates',\r\n                    label: 'Certificates',\r\n                    type: 'file',\r\n                    accept: '.pdf,.doc,.docx',\r\n                    multiple: true,\r\n                    helpText: 'Upload multiple certificates (Max 5MB each)',\r\n                    class: 'col-12'\r\n                }\r\n            ]\r\n        }\r\n    ],\r\n    entityType: 'User'\r\n};\r\n\r\n/**\r\n * Example: Target Group Configuration\r\n * Demonstrates composite fields for Age Group and Gender Split\r\n */\r\nexport const TARGET_GROUP_CONFIG: FormConfig = {\r\n    sections: [\r\n        {\r\n            sectionTitle: 'Target Group Settings',\r\n            fields: [\r\n                {\r\n                    name: 'targetAgeGroup',\r\n                    label: 'Target Age Group',\r\n                    type: 'composite',\r\n                    separator: '-',\r\n                    subFields: [\r\n                        {\r\n                            label: \"Min Age\",\r\n                            name: 'minAge',\r\n                            type: 'number',\r\n                            placeholder: 'Min Age',\r\n                            validationRules: { min: 0 }\r\n                        },\r\n                        {\r\n                            label: \"Max Age\",\r\n                            name: 'maxAge',\r\n                            type: 'number',\r\n                            placeholder: 'Max Age',\r\n                            validationRules: { min: 0 }\r\n                        }\r\n                    ],\r\n                    compositeValidationRule: 'minMax',\r\n                    class: 'col-12'\r\n                },\r\n                {\r\n                    name: 'genderSplit',\r\n                    label: 'Target Gender Split',\r\n                    type: 'composite',\r\n                    subFields: [\r\n                        {\r\n                            label: \"Male\",\r\n                            name: 'malePercentage',\r\n                            type: 'number',\r\n                            placeholder: 'Male',\r\n                            suffixText: '%',\r\n                            validationRules: { min: 0, max: 100 }\r\n                        },\r\n                        {\r\n                            label: \"Female\",\r\n                            name: 'femalePercentage',\r\n                            type: 'number',\r\n                            placeholder: 'Female',\r\n                            suffixText: '%',\r\n                            validationRules: { min: 0, max: 100 }\r\n                        }\r\n                    ],\r\n                    compositeValidationRule: 'percentageTotal',\r\n                    class: 'col-12'\r\n                }\r\n            ]\r\n        }\r\n    ],\r\n\r\n};\r\n","import { Component, EventEmitter, Input, Output, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { NAV_VARIANT_DEFAULT, NAV_ORIENTATION_DEFAULT } from '../../../../utils/constants';\r\nimport { NavStyleConfig } from '../../nav.models';\r\n\r\nexport interface NavItem {\r\n  id: string | number;\r\n  label: string;\r\n  icon?: string;\r\n  badge?: string | number;\r\n  disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n  selector: 'lib-nav',\r\n  templateUrl: './nav.component.html',\r\n  styleUrls: ['./nav.component.scss'],\r\n  standalone: false\r\n})\r\nexport class NavComponent implements OnChanges {\r\n  @Input() items: NavItem[] = [];\r\n  @Input() activeId: string | number | null = null;\r\n  @Input() variant: 'filled' | 'underline' | 'pills' = NAV_VARIANT_DEFAULT;\r\n  @Input() orientation: 'horizontal' | 'vertical' = NAV_ORIENTATION_DEFAULT;\r\n  @Input() styleConfig: NavStyleConfig = {};\r\n\r\n  @Output() selectionChange = new EventEmitter<NavItem>();\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['styleConfig']) {\r\n      console.log(' [NavComponent] styleConfig changed:', this.styleConfig);\r\n      console.log(' [NavComponent] computedStyles:', this.computedStyles);\r\n    }\r\n  }\r\n\r\n  get computedStyles(): { [key: string]: string | undefined } {\r\n    const c = this.styleConfig;\r\n    return {\r\n      // Container (direct CSS)\r\n      'width': c.width,\r\n      'box-shadow': c.boxShadow,\r\n\r\n      // Container (CSS Variables)\r\n      '--cc-nav-container-bg': c.backgroundColor,\r\n      '--cc-nav-container-radius': c.borderRadius,\r\n      '--cc-nav-container-border': c.border,\r\n      '--cc-nav-container-padding': c.padding,\r\n      '--cc-nav-container-gap': c.gap,\r\n\r\n      // Item (CSS Variables)\r\n      '--cc-nav-font-size': c.fontSize,\r\n      '--cc-nav-font-weight': c.fontWeight,\r\n      '--cc-nav-item-color': c.itemColor,\r\n      '--cc-nav-item-radius': c.itemRadius,\r\n      '--cc-nav-item-padding': c.itemPadding,\r\n\r\n      // Active Item (CSS Variables)\r\n      '--cc-nav-item-active-bg': c.activeItemBg,\r\n      '--cc-nav-item-active-color': c.activeItemColor,\r\n      '--cc-nav-item-active-font-weight': c.activeItemFontWeight,\r\n      '--cc-nav-item-active-border-color': c.activeItemBorderColor,\r\n\r\n      // Hover Item (CSS Variables)\r\n      '--cc-nav-item-hover-bg': c.hoverItemBg,\r\n      '--cc-nav-item-hover-color': c.hoverItemColor,\r\n\r\n      // Badge (CSS Variables)\r\n      '--cc-nav-badge-bg': c.badgeBg,\r\n      '--cc-nav-badge-color': c.badgeColor,\r\n    };\r\n  }\r\n\r\n  onItemClick(item: NavItem): void {\r\n    if (item.disabled) return;\r\n    if (item.id === this.activeId) return;\r\n\r\n    this.selectionChange.emit(item);\r\n  }\r\n\r\n  trackById(index: number, item: NavItem): string | number {\r\n    return item.id;\r\n  }\r\n}\r\n","<nav\r\n  class=\"cc-nav\"\r\n  [ngClass]=\"[variant, orientation]\"\r\n  [ngStyle]=\"computedStyles\"\r\n  role=\"tablist\"\r\n  [attr.aria-orientation]=\"orientation\">\r\n\r\n  <button\r\n    *ngFor=\"let item of items; trackBy: trackById\"\r\n    class=\"cc-nav-item\"\r\n    [class.active]=\"item.id === activeId\"\r\n    [class.disabled]=\"item.disabled\"\r\n    [disabled]=\"item.disabled\"\r\n    role=\"tab\"\r\n    [attr.aria-selected]=\"item.id === activeId\"\r\n    [attr.aria-disabled]=\"item.disabled || null\"\r\n    (click)=\"onItemClick(item)\">\r\n\r\n    <!-- Icon (optional) -->\r\n    <span *ngIf=\"item.icon\" class=\"cc-nav-item-icon\">\r\n      <i [ngClass]=\"item.icon\"></i>\r\n    </span>\r\n\r\n    <!-- Label -->\r\n    <span class=\"cc-nav-item-label\">{{ item.label }}</span>\r\n\r\n    <!-- Badge (optional) -->\r\n    <span *ngIf=\"item.badge != null\" class=\"cc-nav-item-badge\">\r\n      {{ item.badge }}\r\n    </span>\r\n\r\n  </button>\r\n\r\n</nav>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NavComponent } from './components/nav/nav.component';\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    NavComponent\r\n  ],\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  exports: [\r\n    NavComponent\r\n  ]\r\n})\r\nexport class NavModule { }\r\n","export function appendBaseUrlRecursively(obj: any, baseURL: string): void {\r\n  if (obj && typeof obj === 'object') {\r\n    if (obj.apiUrl && typeof obj.apiUrl === 'string' && !obj.apiUrl.startsWith('http://') && !obj.apiUrl.startsWith('https://')) {\r\n      let finalApiUrl = obj.apiUrl;\r\n      if (baseURL.endsWith('/') && finalApiUrl.startsWith('/')) {\r\n        finalApiUrl = finalApiUrl.substring(1);\r\n      } else if (!baseURL.endsWith('/') && !finalApiUrl.startsWith('/')) {\r\n        finalApiUrl = '/' + finalApiUrl;\r\n      }\r\n      obj.apiUrl = baseURL + finalApiUrl;\r\n    }\r\n    for (const key in obj) {\r\n      if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n        appendBaseUrlRecursively(obj[key], baseURL);\r\n      }\r\n    }\r\n  }\r\n}\r\n","import { AbstractControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class ValidationUtils {\r\n\r\n\r\n\r\n  static email(): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\r\n      return emailRegex.test(control.value) ? null : { email: true };\r\n    };\r\n  }\r\n\r\n  static phone(): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      const phoneRegex = /^\\+?[\\d\\s\\-\\(\\)]{10,}$/;\r\n      return phoneRegex.test(control.value) ? null : { phone: true };\r\n    };\r\n  }\r\n\r\n  static url(): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n      return urlRegex.test(control.value) ? null : { url: true };\r\n    };\r\n  }\r\n\r\n  static minLength(min: number): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      return control.value.length >= min ? null : { minLength: { min, actual: control.value.length } };\r\n    };\r\n  }\r\n\r\n  static maxLength(max: number): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      return control.value.length <= max ? null : { maxLength: { max, actual: control.value.length } };\r\n    };\r\n  }\r\n\r\n  static pattern(pattern: string, message?: string): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      const regex = new RegExp(pattern);\r\n      return regex.test(control.value) ? null : { pattern: { message: message || 'Invalid format' } };\r\n    };\r\n  }\r\n\r\n  static numberRange(min?: number, max?: number): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value && control.value !== 0) return null;\r\n      const value = Number(control.value);\r\n      if (min !== undefined && value < min) {\r\n        return { min: { min, actual: value } };\r\n      }\r\n      if (max !== undefined && value > max) {\r\n        return { max: { max, actual: value } };\r\n      }\r\n      return null;\r\n    };\r\n  }\r\n\r\n  static dateRange(minDate?: string, maxDate?: string): ValidatorFn {\r\n    return (control: AbstractControl): ValidationErrors | null => {\r\n      if (!control.value) return null;\r\n      const date = new Date(control.value);\r\n      if (minDate && date < new Date(minDate)) {\r\n        return { minDate: { minDate } };\r\n      }\r\n      if (maxDate && date > new Date(maxDate)) {\r\n        return { maxDate: { maxDate } };\r\n      }\r\n      return null;\r\n    };\r\n  }\r\n\r\n  static getErrorMessage(errors: ValidationErrors | null): string {\r\n    if (!errors) return '';\r\n\r\n    if (errors['required']) return 'This field is required';\r\n    if (errors['email']) return 'Please enter a valid email address';\r\n    if (errors['phone']) return 'Please enter a valid phone number';\r\n    if (errors['url']) return 'Please enter a valid URL';\r\n    if (errors['minLength']) return `Minimum length is ${errors['minLength'].min} characters`;\r\n    if (errors['maxLength']) return `Maximum length is ${errors['maxLength'].max} characters`;\r\n    if (errors['min']) return `Minimum value is ${errors['min'].min}`;\r\n    if (errors['max']) return `Maximum value is ${errors['max'].max}`;\r\n    if (errors['minDate']) return `Date must be after ${errors['minDate'].minDate}`;\r\n    if (errors['maxDate']) return `Date must be before ${errors['maxDate'].maxDate}`;\r\n    if (errors['pattern']) return errors['pattern'].message || 'Invalid format';\r\n\r\n    return 'Invalid value';\r\n  }\r\n}\r\n","export const SAMPLE_FORMS = {\r\n  // Simple Contact Form\r\n  contactForm: `{\r\n    \"entityType\": \"CONTACT\",\r\n    \"label\": \"Contact Us\",\r\n    \"description\": \"Send us a message\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"name\": \"name\",\r\n          \"label\": \"Full Name\",\r\n          \"type\": \"TEXT_INPUT\",\r\n          \"subType\": \"SHORT\",\r\n          \"required\": true,\r\n          \"hint\": \"Enter your full name\"\r\n        },\r\n        {\r\n          \"name\": \"email\",\r\n          \"label\": \"Email Address\",\r\n          \"type\": \"TEXT_INPUT\",\r\n          \"subType\": \"EMAIL\",\r\n          \"required\": true,\r\n          \"hint\": \"your.email@example.com\"\r\n        },\r\n        {\r\n          \"name\": \"meetingTime\",\r\n          \"label\": \"Meeting Time\",\r\n          \"type\": \"TIME\",\r\n          \"subType\": \"SINGLE\",\r\n          \"required\": true,\r\n          \"placeholder\": \"Select a time\"\r\n        },\r\n        {\r\n          \"name\": \"message\",\r\n          \"label\": \"Message\",\r\n          \"type\": \"TEXT_INPUT\",\r\n          \"subType\": \"LONG\",\r\n          \"required\": true,\r\n          \"textConfig\": {\r\n            \"length\": {\r\n              \"min\": 10,\r\n              \"max\": 500\r\n            }\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n\r\n  // User Registration with Stepper\r\n  registrationForm: `{\r\n    \"entityType\": \"USER\",\r\n    \"label\": \"User Registration\",\r\n    \"description\": \"Create your account\",\r\n    \"formType\": \"STEPPER\",\r\n    \"stepperConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Personal Information\",\r\n            \"children\": [\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"firstName\",\r\n                    \"label\": \"First Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true\r\n                  },\r\n                  {\r\n                    \"name\": \"lastName\",\r\n                    \"label\": \"Last Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true\r\n                  }\r\n                ]\r\n              },\r\n              {\r\n                \"name\": \"fullName\",\r\n                \"label\": \"Full Name\",\r\n                \"type\": \"GENERATED\",\r\n                \"subType\": \"FORMULA\",\r\n                \"generatedConfig\": {\r\n                  \"formula\": \"function fullName(first, last) { return (first || '') + ' ' + (last || ''); }\",\r\n                  \"variables\": [\"firstName\", \"lastName\"]\r\n                }\r\n              },\r\n              {\r\n                \"name\": \"dateOfBirth\",\r\n                \"label\": \"Date of Birth\",\r\n                \"type\": \"DATE\",\r\n                \"subType\": \"SINGLE\",\r\n                \"required\": true,\r\n                \"dateConfig\": {\r\n                  \"allowFuture\": false\r\n                }\r\n              }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Contact Information\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"email\",\r\n                \"label\": \"Email\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"EMAIL\",\r\n                \"required\": true\r\n              },\r\n              {\r\n                \"name\": \"phone\",\r\n                \"label\": \"Phone Number\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"PHONE\",\r\n                \"required\": true\r\n              }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Preferences\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"notifications\",\r\n                \"label\": \"Enable Email Notifications\",\r\n                \"type\": \"SWITCH\",\r\n                \"subType\": \"BOOL\",\r\n                \"defaultValue\": true\r\n              },\r\n              {\r\n                \"name\": \"interests\",\r\n                \"label\": \"Interests\",\r\n                \"type\": \"CHIP\",\r\n                \"subType\": \"MULTIPLE\",\r\n                \"optionConfig\": {\r\n                  \"optionList\": [\r\n                    { \"label\": \"Technology\", \"code\": \"TECH\" },\r\n                    { \"label\": \"Sports\", \"code\": \"SPORTS\" },\r\n                    { \"label\": \"Music\", \"code\": \"MUSIC\" },\r\n                    { \"label\": \"Travel\", \"code\": \"TRAVEL\" }\r\n                  ]\r\n                }\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ],\r\n      \"showStep\": true,\r\n      \"isHorizontal\": true\r\n    }\r\n  }`,\r\n\r\n  // Survey Form with Conditional Fields\r\n  surveyForm: `{\r\n    \"entityType\": \"SURVEY\",\r\n    \"label\": \"Customer Satisfaction Survey\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"name\": \"overallRating\",\r\n          \"label\": \"Overall Experience\",\r\n          \"type\": \"RATING\",\r\n          \"subType\": \"STAR\",\r\n          \"required\": true,\r\n          \"ratingConfig\": {\r\n            \"maxRating\": 5,\r\n            \"allowHalf\": false\r\n          }\r\n        },\r\n        {\r\n          \"name\": \"wouldRecommend\",\r\n          \"label\": \"Would you recommend us?\",\r\n          \"type\": \"RADIO\",\r\n          \"subType\": \"SINGLE\",\r\n          \"required\": true,\r\n          \"optionConfig\": {\r\n            \"optionList\": [\r\n              { \"label\": \"Yes\", \"code\": \"YES\" },\r\n              { \"label\": \"No\", \"code\": \"NO\" },\r\n              { \"label\": \"Maybe\", \"code\": \"MAYBE\" }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"name\": \"reasonForNo\",\r\n          \"label\": \"Why not?\",\r\n          \"type\": \"TEXT_INPUT\",\r\n          \"subType\": \"LONG\",\r\n          \"visibilityExpression\": \"wouldRecommend === 'NO'\",\r\n          \"required\": true\r\n        },\r\n        {\r\n          \"name\": \"improvements\",\r\n          \"label\": \"What can we improve?\",\r\n          \"type\": \"CHECKBOX\",\r\n          \"subType\": \"LIST\",\r\n          \"optionConfig\": {\r\n            \"optionList\": [\r\n              { \"label\": \"Customer Service\", \"code\": \"SERVICE\" },\r\n              { \"label\": \"Product Quality\", \"code\": \"QUALITY\" },\r\n              { \"label\": \"Pricing\", \"code\": \"PRICE\" },\r\n              { \"label\": \"Delivery Speed\", \"code\": \"DELIVERY\" }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"name\": \"additionalComments\",\r\n          \"label\": \"Additional Comments\",\r\n          \"type\": \"TEXT_INPUT\",\r\n          \"subType\": \"LONG\",\r\n          \"textConfig\": {\r\n            \"length\": {\r\n              \"max\": 1000\r\n            }\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n\r\n  // Job Application Form\r\n  jobApplicationForm: `{\r\n    \"entityType\": \"JOB_APPLICATION\",\r\n    \"label\": \"Job Application\",\r\n    \"description\": \"Apply for a position at our company\",\r\n    \"formType\": \"STEPPER\",\r\n    \"stepperConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Personal Details\",\r\n            \"children\": [\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"firstName\",\r\n                    \"label\": \"First Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true\r\n                  },\r\n                  {\r\n                    \"name\": \"lastName\",\r\n                    \"label\": \"Last Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true\r\n                  }\r\n                ]\r\n              },\r\n              {\r\n                \"name\": \"email\",\r\n                \"label\": \"Email\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"EMAIL\",\r\n                \"required\": true\r\n              },\r\n              {\r\n                \"name\": \"phone\",\r\n                \"label\": \"Phone\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"PHONE\",\r\n                \"required\": true\r\n              }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Experience\",\r\n            \"allowMulti\": true,\r\n            \"name\": \"experienceList\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"company\",\r\n                \"label\": \"Company Name\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"SHORT\",\r\n                \"required\": true\r\n              },\r\n              {\r\n                \"name\": \"position\",\r\n                \"label\": \"Position\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"SHORT\",\r\n                \"required\": true\r\n              },\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"startDate\",\r\n                    \"label\": \"Start Date\",\r\n                    \"type\": \"DATE\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"required\": true\r\n                  },\r\n                  {\r\n                    \"name\": \"endDate\",\r\n                    \"label\": \"End Date\",\r\n                    \"type\": \"DATE\",\r\n                    \"subType\": \"SINGLE\"\r\n                  }\r\n                ]\r\n              },\r\n              {\r\n                \"name\": \"responsibilities\",\r\n                \"label\": \"Key Responsibilities\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"LONG\"\r\n              }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Skills & Qualifications\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"skills\",\r\n                \"label\": \"Technical Skills\",\r\n                \"type\": \"CHIP\",\r\n                \"subType\": \"MULTIPLE\",\r\n                \"optionConfig\": {\r\n                  \"optionList\": [\r\n                    { \"label\": \"JavaScript\", \"code\": \"JS\" },\r\n                    { \"label\": \"TypeScript\", \"code\": \"TS\" },\r\n                    { \"label\": \"Angular\", \"code\": \"ANGULAR\" },\r\n                    { \"label\": \"React\", \"code\": \"REACT\" },\r\n                    { \"label\": \"Node.js\", \"code\": \"NODE\" },\r\n                    { \"label\": \"Python\", \"code\": \"PYTHON\" }\r\n                  ]\r\n                }\r\n              },\r\n              {\r\n                \"name\": \"yearsOfExperience\",\r\n                \"label\": \"Years of Experience\",\r\n                \"type\": \"NUMBER_INPUT\",\r\n                \"subType\": \"INTEGER\",\r\n                \"required\": true,\r\n                \"numberConfig\": {\r\n                  \"min\": 0,\r\n                  \"max\": 50\r\n                }\r\n              },\r\n              {\r\n                \"name\": \"availableToStart\",\r\n                \"label\": \"Available to Start\",\r\n                \"type\": \"DATE\",\r\n                \"subType\": \"SINGLE\",\r\n                \"required\": true,\r\n                \"dateConfig\": {\r\n                  \"allowFuture\": true\r\n                }\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ],\r\n      \"showStep\": true,\r\n      \"isHorizontal\": true\r\n    }\r\n  }`,\r\n\r\n  // Donor Form based on UI\r\n  donorForm: `{\r\n    \"entityType\": \"DONOR\",\r\n    \"label\": \"Donor Form\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Donor Details\",\r\n            \"name\": \"donorDetails\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"legalName\",\r\n                \"label\": \"Donor Legal Name\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"SHORT\",\r\n                \"required\": true,\r\n                \"placeholder\": \"Enter the name\"\r\n              },\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"shortCode\",\r\n                    \"label\": \"Donor Short Code\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"colSpan\": 3,\r\n                    \"disabled\": true,\r\n                    \"defaultValue\": \"DLP-24-L1\",\r\n                    \"hint\": \"System-generated, unique internal code\"\r\n                  },\r\n                  {\r\n                    \"name\": \"donorType\",\r\n                    \"label\": \"Donor Type\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"colSpan\": 3,\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Select\",\r\n                    \"optionConfig\": {\r\n                      \"optionList\": [\r\n                        { \"label\": \"Individual\", \"code\": \"INDIVIDUAL\" },\r\n                        { \"label\": \"Corporate\", \"code\": \"CORPORATE\" },\r\n                        { \"label\": \"Trust\", \"code\": \"TRUST\" }\r\n                      ]\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"regNumber\",\r\n                    \"label\": \"Registration / Legal Entity Number\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"colSpan\": 3,\r\n                    \"placeholder\": \"Type\",\r\n                    \"hint\": \"CIN / Trust Reg. No / Govt ID (if applicable)\"\r\n                  },\r\n                  {\r\n                    \"name\": \"country\",\r\n                    \"label\": \"Country of Incorporation\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"colSpan\": 3,\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Select\",\r\n                    \"optionConfig\": {\r\n                      \"optionList\": [\r\n                        { \"label\": \"India\", \"code\": \"IN\" },\r\n                        { \"label\": \"USA\", \"code\": \"US\" },\r\n                        { \"label\": \"UK\", \"code\": \"UK\" }\r\n                      ]\r\n                    }\r\n                  }\r\n                ]\r\n              },\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"profilePicture\",\r\n                    \"label\": \"Profile Picture\",\r\n                    \"type\": \"FILE_UPLOAD\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"colSpan\": 3,\r\n                    \"attachmentConfig\": {\r\n                      \"multiple\": false,\r\n                      \"maxSizeMB\": 2,\r\n                      \"accept\": \"image/*\",\r\n                      \"acceptLabel\": \"JPG, PNG, SVG (max 2 MB)\"\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"website\",\r\n                    \"label\": \"Organization Website (Optional)\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"colSpan\": 9,\r\n                    \"placeholder\": \"Add your website link or LinkedIn profile\",\r\n                    \"hint\": \"Add your website link to automatically fetch your logo, powered by Clearbit.\"\r\n                  }\r\n                ]\r\n              }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Primary Contact\",\r\n            \"allowMulti\": true,\r\n            \"name\": \"contacts\",\r\n            \"children\": [\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"contactName\",\r\n                    \"label\": \"Full Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"colSpan\": 6,\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Enter the name\"\r\n                  },\r\n                  {\r\n                    \"name\": \"designation\",\r\n                    \"label\": \"Designation/Title\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"colSpan\": 6,\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Select\",\r\n                    \"optionConfig\": {\r\n                      \"optionList\": [\r\n                        { \"label\": \"CEO\", \"code\": \"CEO\" },\r\n                        { \"label\": \"Manager\", \"code\": \"MANAGER\" },\r\n                        { \"label\": \"Other\", \"code\": \"OTHER\" }\r\n                      ]\r\n                    }\r\n                  }\r\n                ]\r\n              },\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"email\",\r\n                    \"label\": \"Email Address\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"EMAIL\",\r\n                    \"colSpan\": 4,\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Enter your email address\"\r\n                  },\r\n                  {\r\n                    \"name\": \"phone\",\r\n                    \"label\": \"Phone Number\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"PHONE\",\r\n                    \"colSpan\": 4,\r\n                    \"required\": true,\r\n                    \"placeholder\": \"+91 7007713990\"\r\n                  },\r\n                  {\r\n                    \"name\": \"communicationPreference\",\r\n                    \"label\": \"Communication Preference\",\r\n                    \"type\": \"RADIO\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"colSpan\": 4,\r\n                    \"required\": true,\r\n                    \"optionConfig\": {\r\n                      \"optionList\": [\r\n                        { \"label\": \"Email\", \"code\": \"EMAIL\" },\r\n                        { \"label\": \"Phone Number\", \"code\": \"PHONE\" }\r\n                      ]\r\n                    }\r\n                  }\r\n                ]\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n\r\n\r\n  // ──────────────────────────────────────────────────────────────────────────\r\n  // User Registration Form — Basic Details / Primary Address / User Role\r\n  // ──────────────────────────────────────────────────────────────────────────\r\n  userBasicDetailsForm: `{\r\n    \"entityType\": \"USER_REGISTRATION\",\r\n    \"label\": \"User Registration\",\r\n    \"description\": \"Fill in your details to create a new account\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Basic Details\",\r\n            \"name\": \"basicDetails\",\r\n            \"children\": [\r\n\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"firstName\",\r\n                    \"label\": \"First Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Enter first name\"\r\n                  },\r\n                  {\r\n                    \"name\": \"lastName\",\r\n                    \"label\": \"Last Name\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Enter last name\"\r\n                  }\r\n                ]\r\n              },\r\n\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"contactNo\",\r\n                    \"label\": \"Contact No\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"PHONE\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"+91 9999999999\",\r\n                    \"hint\": \"Enter a valid 10-digit mobile number\"\r\n                  },\r\n                  {\r\n                    \"name\": \"emailId\",\r\n                    \"label\": \"Email ID\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"EMAIL\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"example@domain.com\"\r\n                  }\r\n                ]\r\n              },\r\n\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"loginId\",\r\n                    \"label\": \"Login / User ID\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Choose a unique login ID\",\r\n                    \"hint\": \"Alphanumeric, no spaces\",\r\n                    \"textConfig\": {\r\n                      \"length\": { \"min\": 4, \"max\": 30 },\r\n                      \"pattern\": \"^[a-zA-Z0-9_]+$\",\r\n                      \"patternMessage\": \"Only letters, numbers and underscores are allowed\"\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"password\",\r\n                    \"label\": \"Password\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"PASSWORD\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Min. 8 characters\",\r\n                    \"hint\": \"Use at least 8 characters with letters and numbers\",\r\n                    \"textConfig\": {\r\n                      \"length\": { \"min\": 8, \"max\": 64 }\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"confirmPassword\",\r\n                    \"label\": \"Confirm Password\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"PASSWORD\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Re-enter your password\",\r\n                    \"textConfig\": {\r\n                      \"matchField\": \"password\"\r\n                    }\r\n                  }\r\n                ]\r\n              }\r\n\r\n            ]\r\n          }\r\n        },\r\n\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Primary Address\",\r\n            \"name\": \"primaryAddress\",\r\n            \"children\": [\r\n\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"addressLine1\",\r\n                    \"label\": \"Address Line 1\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"House / Flat No., Building, Street\"\r\n                  },\r\n                  {\r\n                    \"name\": \"addressLine2\",\r\n                    \"label\": \"Address Line 2\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"placeholder\": \"Area / Locality / Colony (optional)\"\r\n                  }\r\n                ]\r\n              },\r\n\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"country\",\r\n                    \"label\": \"Country\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Select Country\",\r\n                    \"optionConfig\": {\r\n                      \"optionList\": [\r\n                        { \"label\": \"India\", \"code\": \"REGION_COUNTRY.INDIA\" },\r\n                        { \"label\": \"USA\", \"code\": \"REGION_COUNTRY.USA\" }\r\n                      ]\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"state\",\r\n                    \"label\": \"State\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Select State\",\r\n                    \"optionConfig\": {\r\n                      \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_STATE&parentRefClass=GREF.REGION_COUNTRY\",\r\n                      \"labelPath\": \"label\",\r\n                      \"valuePath\": \"dataCode\",\r\n                      \"dependencies\": {\r\n                        \"parentRefData\": \"country\"\r\n                      }\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"city\",\r\n                    \"label\": \"City\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"Select City\",\r\n                    \"optionConfig\": {\r\n                      \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_DISTRICT&parentRefClass=GREF.REGION_STATE\",\r\n                      \"labelPath\": \"label\",\r\n                      \"valuePath\": \"dataCode\",\r\n                      \"dependencies\": {\r\n                        \"parentRefData\": \"state\"\r\n                      }\r\n                    }\r\n                  }\r\n                ]\r\n              },\r\n\r\n              {\r\n                \"type\": \"ROW\",\r\n                \"subType\": \"HORIZONTAL\",\r\n                \"children\": [\r\n                  {\r\n                    \"name\": \"block\",\r\n                    \"label\": \"Block / Taluka\",\r\n                    \"type\": \"DROPDOWN\",\r\n                    \"subType\": \"SINGLE\",\r\n                    \"placeholder\": \"Select Block\",\r\n                    \"optionConfig\": {\r\n                      \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/globalrefdata/v1?refClass=GREF.REGION_BLOCK&parentRefClass=GREF.REGION_DISTRICT\",\r\n                      \"labelPath\": \"label\",\r\n                      \"valuePath\": \"dataCode\",\r\n                      \"dependencies\": {\r\n                        \"parentRefData\": \"city\"\r\n                      }\r\n                    }\r\n                  },\r\n                  {\r\n                    \"name\": \"pinCode\",\r\n                    \"label\": \"PIN Code\",\r\n                    \"type\": \"TEXT_INPUT\",\r\n                    \"subType\": \"SHORT\",\r\n                    \"required\": true,\r\n                    \"placeholder\": \"6-digit PIN code\",\r\n                    \"textConfig\": {\r\n                      \"length\": { \"min\": 6, \"max\": 6 },\r\n                      \"pattern\": \"^[0-9]{6}$\",\r\n                      \"patternMessage\": \"Enter a valid 6-digit PIN code\"\r\n                    }\r\n                  }\r\n                ]\r\n              }\r\n\r\n            ]\r\n          }\r\n        },\r\n\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"User Role\",\r\n            \"name\": \"userRole\",\r\n            \"type\": \"ROW\",\r\n            \"subType\": \"HORIZONTAL\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"role\",\r\n                \"label\": \"User Role\",\r\n                \"type\": \"DROPDOWN\",\r\n                \"subType\": \"SINGLE\",\r\n                \"required\": true,\r\n                \"placeholder\": \"Select a role\",\r\n                \"optionConfig\": {\r\n                  \"apiUrl\": \"https://dev.platformcommons.org/gateway/commons-report-service/api/v1/datasets/name/VMS_GET_TENANT_ROLES/execute?params=TENANT_ID=1823\",\r\n                  \"labelPath\": \"roleName\",\r\n                  \"valuePath\": \"code\"\r\n                }\r\n              },\r\n              {\r\n                \"name\": \"reportingRole\",\r\n                \"label\": \"Reporting Role\",\r\n                \"type\": \"DROPDOWN\",\r\n                \"subType\": \"SINGLE\",\r\n                \"required\": true,\r\n                \"placeholder\": \"Select Reporting Role\",\r\n                \"optionConfig\": {\r\n                  \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/rolehierarchy/v1?criteria=roleCode.code='{{userRole}}' and isActive=1&includeAttributes=id,parentRoleCode\",\r\n                  \"dataPath\": \"payload\",\r\n                  \"labelPath\": \"parentRoleCode\",\r\n                  \"valuePath\": \"parentRoleCode\",\r\n                  \"dependencies\": {\r\n                    \"userRole\": \"role\"\r\n                  }\r\n                }\r\n              },\r\n              {\r\n                \"name\": \"reportingManager\",\r\n                \"label\": \"Reporting Manager\",\r\n                \"type\": \"DROPDOWN\",\r\n                \"subType\": \"SINGLE\",\r\n                \"required\": true,\r\n                \"placeholder\": \"Select Reporting Manager\",\r\n                \"optionConfig\": {\r\n                  \"apiUrl\": \"https://dev.platformcommons.org/ctld/api/tenant/user/role/criteria/v1?criteria=role.code='{{reportingRole}}' and isActive=1 and user.isActive=1\",\r\n                  \"dataPath\": \"payload\",\r\n                  \"labelPath\": \"user.userName\",\r\n                  \"valuePath\": \"user.id\",\r\n                  \"dependencies\": {\r\n                    \"reportingRole\": \"reportingRole\"\r\n                  }\r\n                }\r\n              }\r\n            ]\r\n          }\r\n        }\r\n\r\n      ]\r\n    }\r\n  }`,\r\n\r\n  // ──────────────────────────────────────────────────────────────────────────\r\n  // Document Upload Form — demonstrates the FILE_UPLOAD field type\r\n  // ──────────────────────────────────────────────────────────────────────────\r\n  documentUploadForm: `{\r\n    \"entityType\": \"DOCUMENT_UPLOAD\",\r\n    \"label\": \"Documents\",\r\n    \"description\": \"Upload the required documents\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Documents\",\r\n            \"name\": \"documents\",\r\n            \"children\": [\r\n              {\r\n                \"name\": \"profilePicture\",\r\n                \"label\": \"Profile Picture\",\r\n                \"type\": \"FILE_UPLOAD\",\r\n                \"subType\": \"SINGLE\",\r\n                \"required\": true,\r\n                \"attachmentConfig\": {\r\n                  \"multiple\": false,\r\n                  \"maxSizeMB\": 5,\r\n                  \"accept\": \".jpg,.jpeg,.png,.webp,image/*\",\r\n                  \"acceptLabel\": \"JPG, PNG, WEBP\"\r\n                }\r\n              },\r\n              {\r\n                \"name\": \"certificates\",\r\n                \"label\": \"Certificates\",\r\n                \"type\": \"FILE_UPLOAD\",\r\n                \"subType\": \"MULTIPLE\",\r\n                \"attachmentConfig\": {\r\n                  \"multiple\": true,\r\n                  \"maxFiles\": 5,\r\n                  \"maxSizeMB\": 10,\r\n                  \"accept\": \".pdf,.doc,.docx,.jpg,.jpeg,.png\",\r\n                  \"acceptLabel\": \"PDF, DOCX, JPG, PNG\"\r\n                }\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n\r\n  // Demand Definition Form (matching user request image)\r\n  demandDefinitionForm: `{\r\n    \"entityType\": \"DEMAND\",\r\n    \"label\": \"Demand Definition\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"type\": \"ROW\",\r\n          \"subType\": \"HORIZONTAL\",\r\n          \"children\": [\r\n            {\r\n              \"name\": \"beneficiaries\",\r\n              \"label\": \"Required Beneficiaries\",\r\n              \"type\": \"NUMBER_INPUT\",\r\n              \"subType\": \"INTEGER\",\r\n              \"required\": true,\r\n              \"suffix\": \"Students\",\r\n              \"placeholder\": \"0\",\r\n              \"numberConfig\": { \"min\": 0 }\r\n            },\r\n            {\r\n              \"name\": \"deliveryModel\",\r\n              \"label\": \"Preferred Delivery Model\",\r\n              \"type\": \"DROPDOWN\",\r\n              \"subType\": \"SINGLE\",\r\n              \"required\": true,\r\n              \"placeholder\": \"Select\",\r\n              \"optionConfig\": {\r\n                \"optionList\": [\r\n                  { \"label\": \"Onsite Delivery\", \"code\": \"ONSITE\" },\r\n                  { \"label\": \"Hybrid Model\", \"code\": \"HYBRID\" }\r\n                ]\r\n              }\r\n            }\r\n          ]\r\n        },\r\n        {\r\n          \"type\": \"ROW\",\r\n          \"subType\": \"HORIZONTAL\",\r\n          \"children\": [\r\n            {\r\n              \"name\": \"minAge\",\r\n              \"label\": \"Min Target Age\",\r\n              \"type\": \"NUMBER_INPUT\",\r\n              \"subType\": \"INTEGER\",\r\n              \"required\": true,\r\n              \"placeholder\": \"0\",\r\n              \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n              \"onValidate\": \"!maxAge || minAge <= maxAge\",\r\n              \"errorMessage\": \"Min Age cannot be greater than Max Age\"\r\n            },\r\n            {\r\n              \"name\": \"maxAge\",\r\n              \"label\": \"Max Target Age\",\r\n              \"type\": \"NUMBER_INPUT\",\r\n              \"subType\": \"INTEGER\",\r\n              \"required\": true,\r\n              \"placeholder\": \"100\",\r\n              \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n              \"onValidate\": \"!minAge || maxAge >= minAge\",\r\n              \"errorMessage\": \"Max Age cannot be less than Min Age\"\r\n            }\r\n          ]\r\n        },\r\n        {\r\n          \"type\": \"ROW\",\r\n          \"subType\": \"HORIZONTAL\",\r\n          \"children\": [\r\n            {\r\n              \"name\": \"male\",\r\n              \"label\": \"Male Split (%)\",\r\n              \"type\": \"NUMBER_INPUT\",\r\n              \"subType\": \"INTEGER\",\r\n              \"required\": true,\r\n              \"suffix\": \"%\",\r\n              \"placeholder\": \"50\",\r\n              \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n              \"onValidate\": \"(male || 0) + (female || 0) === 100\",\r\n              \"errorMessage\": \"Male + Female % must equal 100%\"\r\n            },\r\n            {\r\n              \"name\": \"female\",\r\n              \"label\": \"Female Split (%)\",\r\n              \"type\": \"NUMBER_INPUT\",\r\n              \"subType\": \"INTEGER\",\r\n              \"required\": true,\r\n              \"suffix\": \"%\",\r\n              \"placeholder\": \"50\",\r\n              \"numberConfig\": { \"min\": 0, \"max\": 100 },\r\n              \"onValidate\": \"(male || 0) + (female || 0) === 100\",\r\n              \"errorMessage\": \"Male + Female % must equal 100%\"\r\n            }\r\n          ]\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n\r\n\r\n\r\n  // Project Info Form (matching user request image)\r\n  // Project Form (Combined Info + Demand)\r\n  projectInfoForm: `{\r\n    \"entityType\": \"PROJECT\",\r\n    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.TITLE\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n        \"children\": [\r\n            {\r\n                \"type\": \"GROUP\",\r\n                \"subType\": \"SECTION\",\r\n                \"sectionConfig\": {\r\n                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.SECTION.INFO\",\r\n                    \"children\": [\r\n                        {\r\n                            \"type\": \"ROW\",\r\n                            \"subType\": \"HORIZONTAL\",\r\n                            \"children\": [\r\n                                {\r\n                                    \"name\": \"projectName\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.NAME.LABEL\",\r\n                                    \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.NAME.PH\",\r\n                                    \"type\": \"TEXT_INPUT\",\r\n                                    \"subType\": \"SHORT\",\r\n                                    \"required\": true,\r\n                                    \"colSpan\": 6\r\n                                },\r\n                                {\r\n                                    \"name\": \"programId\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.PROG_ID.LABEL\",\r\n                                    \"type\": \"TEXT_INPUT\",\r\n                                    \"subType\": \"SHORT\",\r\n                                    \"defaultValue\": \"DLP-24-L1\",\r\n                                    \"readonly\": true,\r\n                                    \"colSpan\": 6\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"type\": \"ROW\",\r\n                            \"subType\": \"HORIZONTAL\",\r\n                            \"children\": [\r\n                                {\r\n                                    \"name\": \"linkedProgram\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.LINKED_PROG.LABEL\",\r\n                                    \"type\": \"TEXT_INPUT\",\r\n                                    \"subType\": \"SHORT\",\r\n                                    \"defaultValue\": \"National Skills Initiative\",\r\n                                    \"readonly\": true,\r\n                                    \"colSpan\": 4\r\n                                },\r\n                                {\r\n                                    \"name\": \"linkedContract\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.LINKED_CONTRACT.LABEL\",\r\n                                    \"type\": \"TEXT_INPUT\",\r\n                                    \"subType\": \"SHORT\",\r\n                                    \"defaultValue\": \"NSI-Gov-Oct23\",\r\n                                    \"readonly\": true,\r\n                                    \"colSpan\": 4\r\n                                },\r\n                                {\r\n                                    \"name\": \"assignedDistrict\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.DISTRICT.LABEL\",\r\n                                    \"type\": \"TEXT_INPUT\",\r\n                                    \"subType\": \"SHORT\",\r\n                                    \"defaultValue\": \"Bangalore Rural\",\r\n                                    \"readonly\": true,\r\n                                    \"colSpan\": 4\r\n                                }\r\n                            ]\r\n                        }\r\n                    ]\r\n                }\r\n            },\r\n            {\r\n                \"type\": \"GROUP\",\r\n                \"subType\": \"SECTION\",\r\n                \"sectionConfig\": {\r\n                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.SECTION.DEMAND\",\r\n                    \"children\": [\r\n                        {\r\n                            \"type\": \"ROW\",\r\n                            \"subType\": \"HORIZONTAL\",\r\n                            \"children\": [\r\n                                {\r\n                                    \"name\": \"requiredBeneficiaries\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.BENEFICIARIES.LABEL\",\r\n                                    \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.BENEFICIARIES.PH\",\r\n                                    \"type\": \"NUMBER_INPUT\",\r\n                                    \"subType\": \"INTEGER\",\r\n                                    \"required\": true,\r\n                                    \"colSpan\": 6,\r\n                                    \"numberConfig\": {\r\n                                        \"min\": 1\r\n                                    }\r\n                                },\r\n                                {\r\n                                    \"name\": \"deliveryModel\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.DELIVERY_MODEL.LABEL\",\r\n                                    \"type\": \"DROPDOWN\",\r\n                                    \"subType\": \"SINGLE\",\r\n                                    \"required\": true,\r\n                                    \"colSpan\": 6,\r\n                                    \"optionConfig\": {\r\n                                        \"optionList\": [\r\n                                            {\r\n                                                \"label\": \"UI_PLAYGROUND.OPTION.IN_PERSON\",\r\n                                                \"code\": \"IN_PERSON\"\r\n                                            },\r\n                                            {\r\n                                                \"label\": \"UI_PLAYGROUND.OPTION.HYBRID\",\r\n                                                \"code\": \"HYBRID\"\r\n                                            },\r\n                                            {\r\n                                                \"label\": \"UI_PLAYGROUND.OPTION.ONLINE\",\r\n                                                \"code\": \"ONLINE\"\r\n                                            }\r\n                                        ]\r\n                                    }\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"type\": \"ROW\",\r\n                            \"subType\": \"HORIZONTAL\",\r\n                            \"children\": [\r\n                                {\r\n                                    \"name\": \"minAge\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.LABEL\",\r\n                                    \"type\": \"NUMBER_INPUT\",\r\n                                    \"subType\": \"INTEGER\",\r\n                                    \"required\": true,\r\n                                    \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.LABEL\",\r\n                                    \"numberConfig\": {\r\n                                        \"min\": 0,\r\n                                        \"max\": 100\r\n                                    },\r\n                                    \"onValidate\": \"!maxAge || minAge <= maxAge\",\r\n                                    \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MIN.ERR\"\r\n                                },\r\n                                {\r\n                                    \"name\": \"maxAge\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.LABEL\",\r\n                                    \"type\": \"NUMBER_INPUT\",\r\n                                    \"subType\": \"INTEGER\",\r\n                                    \"required\": true,\r\n                                    \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.LABEL\",\r\n                                    \"numberConfig\": {\r\n                                        \"min\": 0,\r\n                                        \"max\": 100\r\n                                    },\r\n                                    \"onValidate\": \"!minAge || maxAge >= minAge\",\r\n                                    \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.AGE_MAX.ERR\"\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"type\": \"ROW\",\r\n                            \"subType\": \"HORIZONTAL\",\r\n                            \"children\": [\r\n                                {\r\n                                    \"name\": \"maleSplit\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.MALE.LABEL\",\r\n                                    \"type\": \"NUMBER_INPUT\",\r\n                                    \"subType\": \"INTEGER\",\r\n                                    \"required\": true,\r\n                                    \"suffix\": \"%\",\r\n                                    \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.MALE.LABEL\",\r\n                                    \"numberConfig\": {\r\n                                        \"min\": 0,\r\n                                        \"max\": 100\r\n                                    },\r\n                                    \"onValidate\": \"(maleSplit || 0) + (femaleSplit || 0) === 100\",\r\n                                    \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.GENDER_SPLIT.ERR\"\r\n                                },\r\n                                {\r\n                                    \"name\": \"femaleSplit\",\r\n                                    \"label\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.FEMALE.LABEL\",\r\n                                    \"type\": \"NUMBER_INPUT\",\r\n                                    \"subType\": \"INTEGER\",\r\n                                    \"required\": true,\r\n                                    \"suffix\": \"%\",\r\n                                    \"placeholder\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.FEMALE.LABEL\",\r\n                                    \"numberConfig\": {\r\n                                        \"min\": 0,\r\n                                        \"max\": 100\r\n                                    },\r\n                                    \"onValidate\": \"(maleSplit || 0) + (femaleSplit || 0) === 100\",\r\n                                    \"errorMessage\": \"UI_PLAYGROUND.SMART_FORM.PROJECT.GENDER_SPLIT.ERR\"\r\n                                }\r\n                            ]\r\n                        }\r\n                    ]\r\n                }\r\n            }\r\n        ]\r\n    }\r\n}\r\n  }`,\r\n\r\n  faqForm: `{\r\n    \"entityType\": \"FAQ\",\r\n    \"label\": \"Frequently Asked Questions\",\r\n    \"description\": \"Answer attendee questions.\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"type\": \"GROUP\",\r\n          \"subType\": \"SECTION\",\r\n          \"sectionConfig\": {\r\n            \"label\": \"Frequently Asked Questions\",\r\n            \"allowMulti\": true,\r\n            \"name\": \"faqs\",\r\n            \"multiSaveConfig\": {\r\n              \"active\": true,\r\n              \"summaryField\": \"question\",\r\n              \"descriptionField\": \"answer\",\r\n              \"addLabel\": \"Add a Question\"\r\n            },\r\n            \"children\": [\r\n              {\r\n                \"name\": \"question\",\r\n                \"label\": \"Question\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"SHORT\",\r\n                \"required\": true,\r\n                \"placeholder\": \"What is Lorem Ipsum?\"\r\n              },\r\n              {\r\n                \"name\": \"answer\",\r\n                \"label\": \"Answer\",\r\n                \"type\": \"TEXT_INPUT\",\r\n                \"subType\": \"LONG\",\r\n                \"required\": true,\r\n                \"placeholder\": \"Contrary to popular belief...\"\r\n              }\r\n            ]\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n\r\n  // ── Location field example ──────────────────────────────────────────────\r\n  locationForm: `{\r\n    \"entityType\": \"EVENT\",\r\n    \"label\": \"Event Location\",\r\n    \"formType\": \"SECTION\",\r\n    \"sectionConfig\": {\r\n      \"children\": [\r\n        {\r\n          \"name\": \"eventLocation\",\r\n          \"label\": \"Location\",\r\n          \"type\": \"LOCATION\",\r\n          \"required\": true,\r\n          \"hint\": \"Set where your event takes place\",\r\n          \"locationConfig\": {\r\n            \"defaultTab\": \"VENUE\",\r\n            \"maxLocations\": 5,\r\n            \"venuePlaceholder\": \"Search for a venue address...\",\r\n            \"onlinePlaceholder\": \"https://zoom.us/j/meeting-id\",\r\n            \"showMap\": true,\r\n            \"mapHeight\": \"300px\",\r\n            \"googleMapsApiKey\": \"YOUR_GOOGLE_MAPS_API_KEY\"\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }`,\r\n};\r\n\r\n/**\r\n * i18n label keys used by the LOCATION field type.\r\n * Add these to your labels JSON file(s) for all supported languages.\r\n *\r\n * LBL_LOC_VENUE        – Tab: \"Venue\"\r\n * LBL_LOC_ONLINE       – Tab: \"Online Event\"\r\n * LBL_LOC_TBA          – Tab: \"To be Announced\"\r\n * LBL_LOC_ADDRESS      – Section heading inside Venue tab: \"Location address\"\r\n * LBL_LOC_COUNT_SUFFIX – e.g. \"Locations Added!\"\r\n * LBL_LOC_ADD_ANOTHER  – \"Add another Location\" button label\r\n * LBL_LOC_MAP_HINT     – hint below the embedded map\r\n * LBL_LOC_ONLINE_URL   – Label above online URL input: \"Event URL\"\r\n * LBL_LOC_TBA_DESC     – Message shown inside TBA tab\r\n * PH_LOC_VENUE         – Placeholder for venue search input\r\n * PH_LOC_ONLINE        – Placeholder for online URL input\r\n */\r\n\r\n\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { SnackbarComponent } from './components/snackbar.component';\r\n\r\n@NgModule({\r\n  declarations: [SnackbarComponent],\r\n  imports: [CommonModule, MatSnackBarModule],\r\n  exports: [SnackbarComponent]\r\n})\r\nexport class SnackbarModule {}\r\n","/*\n * Public API Surface of commons-shared-web-ui\n */\n\nexport * from './lib/modules/form-builder/form-builder.module';\nexport * from './lib/modules/form-builder/components/field-selection/field-selection.component';\nexport * from './lib/modules/form-builder/components/field-configurator/field-configurator.component';\n\n// ── Form Field Configuration ────────────────────────────────────────────────\nexport * from './lib/modules/form-field-configuration/form-field-configuration.module';\nexport * from './lib/modules/form-field-configuration/components/form-field-configuration/form-field-configuration.component';\nexport * from './lib/modules/form-field-configuration/components/config-section-node/config-section-node.component';\nexport * from './lib/modules/form-field-configuration/components/config-field-node/config-field-node.component';\nexport * from './lib/modules/form-field-configuration/models/field-configuration.models';\nexport * from './lib/modules/form-field-configuration/services/field-configuration.service';\nexport * from './lib/modules/form-field-configuration/services/config-schema-tree.service';\n\n// ── Table Column Configuration ──────────────────────────────────────────────\nexport * from './lib/modules/table-column-configuration/table-column-configuration.module';\nexport * from './lib/modules/table-column-configuration/components/table-column-configuration/table-column-configuration.component';\nexport * from './lib/modules/table-column-configuration/components/config-column-node/config-column-node.component';\nexport * from './lib/modules/table-column-configuration/models/table-column-configuration.models';\nexport * from './lib/modules/table-column-configuration/services/table-column-configuration.service';\n\nexport * from './lib/shared-ui.module';\nexport * from './lib/modules/material/material.module';\nexport * from './lib/utils/storage.utils';\nexport * from './lib/utils/string.utils';\nexport * from './lib/utils/translation.utils';\nexport * from './lib/modules/summary-card/summary-card.module';\nexport * from './lib/modules/summary-card/components/summary-card/summary-card.component';\nexport * from './lib/modules/configurable-form/configurable-form.module';\nexport * from './lib/modules/configurable-form/component/configurable-form.component';\n// Export Configurable Form resources namespaced to avoid collisions\nexport * from './lib/modules/configurable-form/configurable-form.model';\nexport * as ConfigurableFormExamples from './lib/modules/configurable-form/configurable-form.examples';\n\nexport * from './lib/modules/pagination/pagination.module';\nexport * from './lib/modules/pagination/components/pagination/pagination.component';\nexport * from './lib/modules/nav/nav.module';\nexport * from './lib/modules/nav/components/nav/nav.component';\nexport * from './lib/modules/nav/nav.models';\nexport * from './lib/modules/side-nav/side-nav.module';\nexport * from './lib/modules/side-nav/components/side-nav/side-nav.component';\nexport * from './lib/modules/side-nav/side-nav.models';\nexport * from './lib/utils/constants';\nexport * from './lib/modules/alert/alert.module';\nexport * from './lib/modules/alert/alert.models';\nexport * from './lib/modules/alert/components/alert/alert.component';\nexport * from './lib/modules/button/button.module';\nexport * from './lib/modules/button/button.models';\nexport * from './lib/modules/button/components/button/button.component';\nexport * from './lib/modules/button-dropdown/button-dropdown.module';\nexport * from './lib/modules/button-dropdown/button-dropdown.models';\nexport * from './lib/modules/button-dropdown/components/button-dropdown/button-dropdown.component';\nexport * from './lib/modules/confirmation-modal/confirmation-modal.module';\nexport * from './lib/modules/confirmation-modal/confirmation-modal.models';\nexport * from './lib/modules/confirmation-modal/components/confirmation-modal/confirmation-modal.component';\nexport * from './lib/modules/filter-sidebar/filter-sidebar.module';\nexport * from './lib/modules/filter-sidebar/filter-sidebar.models';\nexport * from './lib/modules/filter-sidebar/components/filter-sidebar/filter-sidebar.component';\nexport * from './lib/modules/filter/filter.module';\nexport * from './lib/modules/filter/filter.models';\nexport * from './lib/modules/filter/components/filter/filter.component';\nexport * from './lib/modules/form-components/form-components.module';\nexport * from './lib/modules/form-components/directives/click-outside.directive';\nexport * from './lib/modules/form-components/components/input/input.component';\nexport * from './lib/modules/form-components/components/input/input.models';\nexport * from './lib/modules/form-components/components/dropdown/dropdown.component';\nexport * from './lib/modules/form-components/components/dropdown/dropdown.models';\nexport * from './lib/modules/form-components/components/checkbox/checkbox.component';\nexport * from './lib/modules/form-components/components/checkbox/checkbox.models';\nexport * from './lib/modules/form-components/components/radio/radio.component';\nexport * from './lib/modules/form-components/components/radio/radio.models';\nexport * from './lib/modules/form-components/components/toggle/toggle.component';\nexport * from './lib/modules/form-components/components/toggle/toggle.models';\nexport * from './lib/modules/form-components/components/datepicker/datepicker.component';\nexport * from './lib/modules/form-components/components/datepicker/datepicker.models';\nexport * from './lib/modules/form-components/components/search/search.component';\nexport * from './lib/modules/form-components/components/search/search.models';\n\nexport * from './lib/modules/time-picker/time-picker.module';\nexport * from './lib/modules/time-picker/components/time-picker/time-picker.component';\nexport * from './lib/modules/time-picker/components/time-wheel-panel/time-wheel-panel.component';\nexport * from './lib/modules/time-picker/models/time-picker.models';\nexport * from './lib/modules/smart-table/smart-table.module';\nexport * from './lib/modules/smart-table/components/smart-table/smart-table.component';\nexport * from './lib/modules/smart-table/models/table-config.model';\nexport * from './lib/modules/smart-table/utils/smart-table.utils';\nexport * from './lib/modules/smart-form/smart-form.module';\nexport * from './lib/modules/smart-form/components/smart-form/smart-form.component';\nexport {\n  FormSchema,\n  SubmitConfig,\n  FieldConfig,\n  SectionConfig,\n  StepperConfig,\n  TextConfig,\n  NumberConfig,\n  DateConfig,\n  EmailConfig,\n  PhoneConfig,\n  GeneratedConfig,\n  RangeConfig,\n  AttachmentConfig,\n  LocationConfig,\n  RatingConfig,\n  ValidationResult,\n  LengthConstraint,\n  OptionItem,\n  SuffixActionIcon\n} from './lib/modules/smart-form/models/form-schema.model';\nexport * from './lib/modules/smart-form/services/expression.service';\nexport * from './lib/modules/smart-form/services/smart-form-controller.service';\nexport * from './lib/modules/smart-form/utils/validation.utils';\nexport * as SmartFormExamples from './lib/modules/smart-form/smart-form.examples';\n\nexport * from './lib/modules/snackbar/snackbar.module';\nexport * from './lib/modules/snackbar/components/snackbar.component';\nexport * from './lib/modules/snackbar/models/snackbar.models';\nexport * from './lib/modules/snackbar/services/snackbar.service';\n\n// ── FilterTableSelector ─────────────────────────────────────────────────────\nexport * from './lib/modules/filter-table-selector/filter-table-selector.module';\nexport * from './lib/modules/filter-table-selector/filter-table-selector.models';\nexport * from './lib/modules/filter-table-selector/components/filter-table-selector/filter-table-selector.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.TimeWheelPanelComponent","i1","i2.ExpressionService","i15.TrustedUrlPipe","i3","i4","i5.FormFieldComponent","takeUntil","i2.SmartFormController","i3.ExpressionService","i5.SnackbarService","i6","i7","i8.ButtonComponent","i9.FormSectionComponent","i2","i3.ClickOutsideDirective","i1.CheckboxComponent","i1.ToggleComponent","i2.SelectionFieldNodeComponent","i2.SelectionSectionNodeComponent","i1.GroupNodeComponent","i1.SnackbarService","i2.SmartFormComponent","i1.ConfiguratorTreeComponent","i2.ConfiguratorConfigPanelComponent","COMPONENTS","i2.ConfigFieldNodeComponent","i1.ConfigSectionNodeComponent","i2.ConfigColumnNodeComponent","i4.ButtonComponent","i5.ConfirmationModalComponent","i4.InputComponent","i5.DropdownComponent","i6.CheckboxComponent","i7.RadioComponent","i8.ToggleComponent","i9.DatepickerComponent","i10.SearchComponent","i11.ButtonComponent","i5","i9","i5.InputComponent","i6.DropdownComponent","i7.CheckboxComponent","i8.RadioComponent","i9.ToggleComponent","i10.DatepickerComponent","i11.SearchComponent","i5.PaginationComponent","i6.ButtonComponent","i9.ConfirmationModalComponent","i10.SafeHtmlPipe","i3.SmartTableComponent"],"mappings":"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"}