{"version":3,"file":"cloud-ide-element.mjs","sources":["../../../projects/cloud-ide-element/src/lib/utils/pipes/capitalize/capitalize.pipe.ts","../../../projects/cloud-ide-element/src/lib/utils/services/elements/elements.service.ts","../../../projects/cloud-ide-element/src/lib/services/portal.service.ts","../../../projects/cloud-ide-element/src/lib/elements/input/input.component.ts","../../../projects/cloud-ide-element/src/lib/elements/input/input.component.html","../../../projects/cloud-ide-element/src/lib/elements/select/select.component.ts","../../../projects/cloud-ide-element/src/lib/elements/select/select.component.html","../../../projects/cloud-ide-element/src/lib/assets/icons/cide-icons.ts","../../../projects/cloud-ide-element/src/lib/elements/icon/icon.component.ts","../../../projects/cloud-ide-element/src/lib/elements/icon/icon.component.html","../../../projects/cloud-ide-element/src/lib/elements/tab/cide-ele-tab.component.ts","../../../projects/cloud-ide-element/src/lib/elements/tab/cide-ele-tab.component.html","../../../projects/cloud-ide-element/src/lib/interfaces/core-file-manager.interface.ts","../../../projects/cloud-ide-element/src/lib/services/file-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/notification.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container.service.ts","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.service.ts","../../../projects/cloud-ide-element/src/lib/elements/file-input/file-input.component.ts","../../../projects/cloud-ide-element/src/lib/elements/file-input/file-input.component.html","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.component.ts","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.component.html","../../../projects/cloud-ide-element/src/lib/elements/textarea/textarea.component.ts","../../../projects/cloud-ide-element/src/lib/elements/textarea/textarea.component.html","../../../projects/cloud-ide-element/src/lib/elements/breadcrumb/breadcrumb.component.ts","../../../projects/cloud-ide-element/src/lib/elements/breadcrumb/breadcrumb.component.html","../../../projects/cloud-ide-element/src/lib/elements/spinner/spinner.component.ts","../../../projects/cloud-ide-element/src/lib/elements/spinner/spinner.component.html","../../../projects/cloud-ide-element/src/lib/utils/services/export.service.ts","../../../projects/cloud-ide-element/src/lib/services/currency/currency-config.interface.ts","../../../projects/cloud-ide-element/src/lib/services/currency/currency.service.ts","../../../projects/cloud-ide-element/src/lib/utils/pipes/currency/currency.pipe.ts","../../../projects/cloud-ide-element/src/lib/utils/directives/tooltip/tooltip.directive.ts","../../../projects/cloud-ide-element/src/lib/utils/directives/resizer/resizer.directive.ts","../../../projects/cloud-ide-element/src/lib/utils/path.helper.ts","../../../projects/cloud-ide-element/src/lib/utils/host-manager-routes.ts","../../../projects/cloud-ide-element/src/lib/utils/notification-routes.ts","../../../projects/cloud-ide-element/src/lib/elements/button/cide-ele-button.component.ts","../../../projects/cloud-ide-element/src/lib/elements/button/cide-ele-button.component.html","../../../projects/cloud-ide-element/src/lib/services/theme.service.ts","../../../projects/cloud-ide-element/src/lib/elements/theme-toggle/theme-toggle.component.ts","../../../projects/cloud-ide-element/src/lib/elements/theme-toggle/theme-toggle.component.html","../../../projects/cloud-ide-element/src/lib/elements/card/cide-ele-card.component.ts","../../../projects/cloud-ide-element/src/lib/services/notification-api.service.ts","../../../projects/cloud-ide-element/src/lib/services/websocket-notification.service.ts","../../../projects/cloud-ide-element/src/lib/services/core-file-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/dropdown-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/keyboard-shortcut.service.ts","../../../projects/cloud-ide-element/src/lib/services/confirmation.service.ts","../../../projects/cloud-ide-element/src/lib/services/ai.tokens.ts","../../../projects/cloud-ide-element/src/lib/directives/file-image/file-image.directive.ts","../../../projects/cloud-ide-element/src/lib/components/form-field-error/form-field-error.component.ts","../../../projects/cloud-ide-element/src/lib/components/confirmation-modal/confirmation-modal.component.ts","../../../projects/cloud-ide-element/src/lib/components/toast-notification/toast-notification.component.ts","../../../projects/cloud-ide-element/src/lib/components/global-notifications/global-notifications.component.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.types.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.component.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.component.html","../../../projects/cloud-ide-element/src/lib/components/dropdown/dropdown.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-manager.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-shortcuts.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-features.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-dynamic.directive.ts","../../../projects/cloud-ide-element/src/lib/components/json-editor/json-editor.component.ts","../../../projects/cloud-ide-element/src/lib/components/skeleton-loader/skeleton-loader.component.ts","../../../projects/cloud-ide-element/src/lib/components/skeleton-loader/skeleton-loader.component.html","../../../projects/cloud-ide-element/src/cloud-ide-element.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n  name: 'capitalize',\r\n  standalone: true\r\n})\r\nexport class CapitalizePipe implements PipeTransform {\r\n\r\n  transform(\r\n    value: string,\r\n    capitalizationMethod: 'allUpperCase' | 'titleCase' | 'sentenceCase'\r\n  ): string {\r\n    if (value) {\r\n      if (capitalizationMethod === 'allUpperCase') {\r\n        return value.toUpperCase();\r\n      } else if (capitalizationMethod === 'titleCase') {\r\n        const splitString = value\r\n          .split(' ')\r\n          .map((s) => `${s[0].toUpperCase()}${s.slice(1)}`);\r\n        return splitString.join(' ');\r\n      } else if (capitalizationMethod === 'sentenceCase') {\r\n        const splitString = value.split('.').map((s) => {\r\n          const trimmedString = s.trim();\r\n          if (trimmedString.length > 0) {\r\n            return `${trimmedString[0].toUpperCase()}${trimmedString.slice(1)}`;\r\n          }\r\n          return '';\r\n        });\r\n        return splitString.join('. ');\r\n      }\r\n    }\r\n    return '';\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { GetElementDataRequest, ICoreSype } from 'cloud-ide-lms-model';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CideElementsService {\r\n  cide_element_data: { [key: string]: ICoreSype } = {};\r\n  is_cide_element_data_updated: BehaviorSubject<boolean> = new BehaviorSubject(false);\r\n  async getElementData(body: GetElementDataRequest): Promise<ICoreSype> {\r\n    return new Promise<ICoreSype>((resolve) => {\r\n      const cide_element_data = this.cide_element_data[body?.sype_key];\r\n      if (cide_element_data) {\r\n        resolve(cide_element_data);\r\n      } else {\r\n        const subscription = this.is_cide_element_data_updated?.subscribe({\r\n          next: (is_cide_element_data_updated: boolean) => {\r\n            if (is_cide_element_data_updated) {\r\n              const cide_element_data = this.cide_element_data[body?.sype_key];\r\n              if (cide_element_data) {\r\n                subscription?.unsubscribe();\r\n                resolve(cide_element_data);\r\n              }\r\n            }\r\n          }\r\n        });\r\n      }\r\n    })\r\n  }\r\n}\r\n","import { Injectable, TemplateRef, ViewContainerRef, EmbeddedViewRef } from '@angular/core';\n\nexport interface PortalPosition {\n  top: number;\n  left: number;\n  maxHeight?: number;\n  maxWidth?: number;\n  minWidth?: number;\n}\n\nexport interface PortalConfig {\n  triggerElement: HTMLElement;\n  content: string;\n  className?: string;\n  position?: 'bottom' | 'top' | 'auto';\n  align?: 'left' | 'right' | 'center' | 'auto';\n  offsetX?: number;\n  offsetY?: number;\n  maxHeight?: number;\n  minWidth?: number;\n  closeOnClickOutside?: boolean;\n  closeOnEscape?: boolean;\n}\n\nexport interface TemplatePortalConfig {\n  triggerElement: HTMLElement;\n  template: TemplateRef<any>;\n  viewContainerRef: ViewContainerRef;\n  context?: any;\n  className?: string;\n  position?: 'bottom' | 'top' | 'auto';\n  align?: 'left' | 'right' | 'center' | 'auto';\n  offsetX?: number;\n  offsetY?: number;\n  maxHeight?: number;\n  minWidth?: number;\n  closeOnClickOutside?: boolean;\n  closeOnEscape?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class PortalService {\n  private portals = new Map<string, HTMLElement>();\n  private templatePortals = new Map<string, { element: HTMLElement; viewRef: EmbeddedViewRef<any> }>();\n  private boundClickOutsideHandler: (event: Event) => void;\n  private boundEscapeHandler: (event: KeyboardEvent) => void;\n  private closeCallbacks = new Map<string, () => void>();\n\n  constructor() {\n    this.boundClickOutsideHandler = this.handleClickOutside.bind(this);\n    this.boundEscapeHandler = this.handleEscape.bind(this);\n  }\n\n  /**\n   * Create a portal with the given configuration\n   */\n  createPortal(id: string, config: PortalConfig): HTMLElement {\n    // Clean up any existing portal with the same ID\n    this.destroyPortal(id);\n\n    // Calculate position\n    const position = this.calculatePosition(config);\n\n    // Create portal element\n    const portal = document.createElement('div');\n    portal.id = `portal-${id}`;\n    portal.className = `cide-portal ${config.className || ''}`;\n    portal.style.position = 'fixed';\n    portal.style.top = `${position.top}px`;\n    portal.style.left = `${position.left}px`;\n    portal.style.zIndex = '9999';\n\n    if (position.maxHeight) {\n      portal.style.maxHeight = `${position.maxHeight}px`;\n      portal.style.overflowY = 'auto';\n    }\n\n    if (position.maxWidth) {\n      portal.style.maxWidth = `${position.maxWidth}px`;\n    }\n\n    if (position.minWidth) {\n      portal.style.minWidth = `${position.minWidth}px`;\n    }\n\n    // Set content\n    portal.innerHTML = config.content;\n\n    // Append to body\n    document.body.appendChild(portal);\n\n    // Store portal reference\n    this.portals.set(id, portal);\n\n    // Set up event listeners if needed\n    if (config.closeOnClickOutside || config.closeOnEscape) {\n      this.setupEventListeners(id, config);\n    }\n\n    // Adjust position if portal goes outside viewport\n    this.adjustPosition(portal, config.triggerElement);\n\n    return portal;\n  }\n\n  /**\n   * Create a template-based portal with Angular template\n   */\n  createTemplatePortal(id: string, config: TemplatePortalConfig): HTMLElement {\n    // Clean up any existing portal with the same ID\n    this.destroyPortal(id);\n\n    // Calculate position\n    const position = this.calculatePosition({\n      triggerElement: config.triggerElement,\n      content: '', // Not used for template portals\n      position: config.position,\n      align: config.align,\n      offsetX: config.offsetX,\n      offsetY: config.offsetY,\n      maxHeight: config.maxHeight,\n      minWidth: config.minWidth\n    });\n    console.log(\"test astrd\", config);\n    // Create the view from template\n    const viewRef = config.viewContainerRef.createEmbeddedView(config.template, { context: config.context });\n    viewRef.detectChanges();\n\n    console.log('🔵 Template view created:', {\n      viewRef,\n      rootNodes: viewRef.rootNodes,\n      rootNodesLength: viewRef.rootNodes.length\n    });\n\n    // Create portal container element\n    const portal = document.createElement('div');\n    portal.id = `portal-${id}`;\n    portal.className = `cide-portal ${config.className || ''}`;\n    portal.style.position = 'fixed';\n    portal.style.top = `${position.top}px`;\n    portal.style.left = `${position.left}px`;\n    portal.style.zIndex = '99999'; // Increased z-index\n    portal.style.display = 'block';\n    portal.style.visibility = 'visible';\n    portal.style.opacity = '1';\n\n    if (position.maxHeight) {\n      portal.style.maxHeight = `${position.maxHeight}px`;\n      portal.style.overflowY = 'auto';\n    }\n\n    if (position.maxWidth) {\n      portal.style.maxWidth = `${position.maxWidth}px`;\n    }\n\n    if (position.minWidth) {\n      portal.style.minWidth = `${position.minWidth}px`;\n    }\n\n    // Append template nodes to portal\n    viewRef.rootNodes.forEach(node => {\n      portal.appendChild(node);\n    });\n\n    // Append to body\n    document.body.appendChild(portal);\n\n    // Store template portal reference\n    this.templatePortals.set(id, { element: portal, viewRef });\n\n    console.log('🔵 Portal created and appended to body:', {\n      id,\n      portal,\n      position: { top: position.top, left: position.left },\n      zIndex: portal.style.zIndex,\n      className: portal.className,\n      children: portal.children.length\n    });\n\n    // Set up event listeners if needed\n    if (config.closeOnClickOutside || config.closeOnEscape) {\n      this.setupEventListeners(id, {\n        triggerElement: config.triggerElement,\n        content: '',\n        closeOnClickOutside: config.closeOnClickOutside,\n        closeOnEscape: config.closeOnEscape\n      });\n    }\n\n    // Adjust position if portal goes outside viewport\n    this.adjustPosition(portal, config.triggerElement);\n\n    return portal;\n  }\n\n  /**\n   * Update portal content\n   */\n  updatePortal(id: string, content: string): void {\n    const portal = this.portals.get(id);\n    if (portal) {\n      portal.innerHTML = content;\n    }\n  }\n\n  /**\n   * Update portal position\n   */\n  updatePortalPosition(id: string, config: PortalConfig): void {\n    const portal = this.portals.get(id);\n    if (portal) {\n      const position = this.calculatePosition(config);\n      portal.style.top = `${position.top}px`;\n      portal.style.left = `${position.left}px`;\n      this.adjustPosition(portal, config.triggerElement);\n    }\n  }\n\n  /**\n   * Destroy a portal\n   */\n  destroyPortal(id: string): void {\n    // Handle regular portals\n    const portal = this.portals.get(id);\n    if (portal && portal.parentNode) {\n      portal.parentNode.removeChild(portal);\n      this.portals.delete(id);\n      this.closeCallbacks.delete(id);\n      this.cleanupEventListeners();\n      return;\n    }\n\n    // Handle template portals\n    const templatePortal = this.templatePortals.get(id);\n    if (templatePortal) {\n      if (templatePortal.element && templatePortal.element.parentNode) {\n        templatePortal.element.parentNode.removeChild(templatePortal.element);\n      }\n      templatePortal.viewRef.destroy();\n      this.templatePortals.delete(id);\n      this.closeCallbacks.delete(id);\n      this.cleanupEventListeners();\n    }\n  }\n\n  /**\n   * Destroy all portals\n   */\n  destroyAllPortals(): void {\n    this.portals.forEach((_, id) => this.destroyPortal(id));\n    this.templatePortals.forEach((_, id) => this.destroyPortal(id));\n  }\n\n  /**\n   * Register a close callback for a portal\n   */\n  registerCloseCallback(id: string, callback: () => void): void {\n    this.closeCallbacks.set(id, callback);\n  }\n\n  /**\n   * Get portal element by ID\n   */\n  getPortal(id: string): HTMLElement | undefined {\n    const portal = this.portals.get(id);\n    if (portal) return portal;\n\n    const templatePortal = this.templatePortals.get(id);\n    return templatePortal?.element;\n  }\n\n  /**\n   * Check if portal exists\n   */\n  hasPortal(id: string): boolean {\n    return this.portals.has(id) || this.templatePortals.has(id);\n  }\n\n  private calculatePosition(config: PortalConfig): PortalPosition {\n    const rect = config.triggerElement.getBoundingClientRect();\n    const viewport = {\n      width: window.innerWidth,\n      height: window.innerHeight\n    };\n\n    const offsetX = config.offsetX || 0;\n    const offsetY = config.offsetY || 4;\n    const estimatedHeight = config.maxHeight || 300;\n    const estimatedWidth = config.minWidth || rect.width;\n\n    // Smart vertical positioning - check available space above and below\n    const spaceBelow = viewport.height - rect.bottom;\n    const spaceAbove = rect.top;\n\n    let top: number;\n    let position: 'top' | 'bottom' = 'bottom'; // Default to bottom\n\n    // Determine if we should open above or below\n    // Note: Using fixed positioning, so positions are relative to viewport (no scroll offset needed)\n    if (config.position === 'auto' || !config.position) {\n      // Auto-detect: prefer bottom, but use top if not enough space below\n      if (spaceBelow < estimatedHeight && spaceAbove > estimatedHeight) {\n        position = 'top';\n        top = rect.top - estimatedHeight - offsetY;\n      } else {\n        position = 'bottom';\n        top = rect.bottom + offsetY;\n      }\n    } else if (config.position === 'top') {\n      position = 'top';\n      top = rect.top - estimatedHeight - offsetY;\n    } else {\n      position = 'bottom';\n      top = rect.bottom + offsetY;\n    }\n\n    let left = rect.left + offsetX;\n\n    // Auto-detect horizontal alignment\n    // Note: Using fixed positioning, so positions are relative to viewport (no scroll offset needed)\n    if (config.align === 'auto' || !config.align) {\n      const spaceRight = viewport.width - rect.left;\n      const spaceLeft = rect.right;\n\n      if (spaceRight < estimatedWidth && spaceLeft > estimatedWidth) {\n        // Align to right edge of trigger\n        left = rect.right - estimatedWidth;\n      }\n    } else if (config.align === 'right') {\n      left = rect.right - estimatedWidth;\n    } else if (config.align === 'center') {\n      left = rect.left + (rect.width / 2) - (estimatedWidth / 2);\n    }\n\n    return {\n      top,\n      left,\n      maxHeight: config.maxHeight,\n      minWidth: config.minWidth\n    };\n  }\n\n  private adjustPosition(portal: HTMLElement, triggerElement: HTMLElement): void {\n    const portalRect = portal.getBoundingClientRect();\n    const triggerRect = triggerElement.getBoundingClientRect();\n    const viewport = {\n      width: window.innerWidth,\n      height: window.innerHeight\n    };\n\n    const margin = 8; // Safety margin from edges\n    let adjustedLeft = parseInt(portal.style.left);\n    let adjustedTop = parseInt(portal.style.top);\n\n    // 1. Handle Horizontal Positioning & Scaling\n    if (portalRect.width > viewport.width - (margin * 2)) {\n      // Portal is wider than viewport, scale it down\n      portal.style.width = `${viewport.width - (margin * 2)}px`;\n      portal.style.maxWidth = `${viewport.width - (margin * 2)}px`;\n      adjustedLeft = margin;\n    } else {\n      // Adjust horizontal position if portal goes outside viewport\n      if (adjustedLeft + portalRect.width > viewport.width - margin) {\n        adjustedLeft = viewport.width - portalRect.width - margin;\n      }\n      if (adjustedLeft < margin) {\n        adjustedLeft = margin;\n      }\n    }\n\n    // 2. Smart Vertical Adjustment - flip to opposite side if needed\n    const spaceBelow = viewport.height - triggerRect.bottom;\n    const spaceAbove = triggerRect.top;\n    const portalHeight = portalRect.height;\n\n    // Check if it's currently at the bottom and overflowing\n    if (adjustedTop + portalHeight > viewport.height - margin) {\n      if (spaceAbove > portalHeight + margin) {\n        // Enough space above, flip it\n        adjustedTop = triggerRect.top - portalHeight - 4;\n      } else {\n        // Not enough space above either, just clamp it to bottom\n        adjustedTop = Math.max(margin, viewport.height - portalHeight - margin);\n      }\n    }\n    // Check if it's currently at the top and overflowing\n    else if (adjustedTop < margin) {\n      if (spaceBelow > portalHeight + margin) {\n        // Enough space below, flip it\n        adjustedTop = triggerRect.bottom + 4;\n      } else {\n        // Just clamp it to top\n        adjustedTop = margin;\n      }\n    }\n\n    portal.style.left = `${adjustedLeft}px`;\n    portal.style.top = `${adjustedTop}px`;\n  }\n\n  private setupEventListeners(id: string, config: PortalConfig): void {\n    // Set up event listeners only once when first portal is created\n    const totalPortals = this.portals.size + this.templatePortals.size;\n    if (totalPortals === 1) {\n      if (config.closeOnClickOutside) {\n        document.addEventListener('click', this.boundClickOutsideHandler);\n      }\n      if (config.closeOnEscape) {\n        document.addEventListener('keydown', this.boundEscapeHandler);\n      }\n    }\n  }\n\n  private cleanupEventListeners(): void {\n    // Clean up event listeners when no portals exist\n    const totalPortals = this.portals.size + this.templatePortals.size;\n    if (totalPortals === 0) {\n      document.removeEventListener('click', this.boundClickOutsideHandler);\n      document.removeEventListener('keydown', this.boundEscapeHandler);\n    }\n  }\n\n  private handleClickOutside(event: Event): void {\n    const target = event.target as HTMLElement;\n\n    // Handle regular portals\n    this.portals.forEach((portal, id) => {\n      const callback = this.closeCallbacks.get(id);\n      if (callback && !portal.contains(target)) {\n        // Check if click is on trigger element\n        const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\n        if (!triggerElement || !triggerElement.contains(target)) {\n          callback();\n        }\n      }\n    });\n\n    // Handle template portals\n    this.templatePortals.forEach((templatePortal, id) => {\n      const callback = this.closeCallbacks.get(id);\n      if (callback && !templatePortal.element.contains(target)) {\n        // Check if click is on trigger element\n        const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\n        if (!triggerElement || !triggerElement.contains(target)) {\n          callback();\n        }\n      }\n    });\n  }\n\n  private handleEscape(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      // Close the most recently opened portal\n      const portalIds = Array.from(this.portals.keys());\n      const templatePortalIds = Array.from(this.templatePortals.keys());\n      const allPortalIds = [...portalIds, ...templatePortalIds];\n      const lastPortalId = allPortalIds[allPortalIds.length - 1];\n\n      if (lastPortalId) {\n        const callback = this.closeCallbacks.get(lastPortalId);\n        if (callback) {\n          callback();\n        }\n      }\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, forwardRef, inject, ViewChild, TemplateRef, ViewContainerRef, EmbeddedViewRef, ChangeDetectorRef } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\nimport { autocapitalizeType, autocompleteType, controlType, elementStyleType, inputType, labelDirType, labelPlacementType, themeSize } from 'cloud-ide-lms-model';\nimport { PortalService } from '../../services/portal.service';\n\n/** @description type to register error related to control */\nexport type ErrorValidationStatus = {\n  maxlength?: string,\n  minlength?: string,\n  required?: string,\n}\nexport type ValidationStatus = {\n  validation: ErrorValidationStatus,\n  status: boolean\n}\n\n@Component({\n  selector: 'cide-ele-input',\n  standalone: true,\n  templateUrl: './input.component.html',\n  styleUrl: './input.component.scss',\n  imports: [\n    // directives\n    CommonModule,\n    // for ngModel\n    FormsModule\n  ],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => CideInputComponent),\n      multi: true\n    },\n    /** @description to apply validations  */\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => CideInputComponent),\n    },\n    CapitalizePipe\n  ]\n})\n\nexport class CideInputComponent implements ControlValueAccessor, Validator, OnChanges, OnInit, OnDestroy {\n\n  // Modern Angular v20 dependency injection pattern\n  public capitalizePipe = inject(CapitalizePipe);\n  private elementService = inject(CideElementsService);\n  private cdr = inject(ChangeDetectorRef);\n\n  constructor() {\n    // Modern Angular v20 pattern: Use constructor for initialization only\n    // Validate control\n    this.onValidate();\n  }\n  /*=======Set custom controls inputs to set components=========*/\n\n  /** \n   * @description to se the visual of control like solid control offerd by material design or outline with a border\n   * @options solid | outline | standard\n   */\n  @Input() fill: elementStyleType = 'outline';\n  /** @description Lable of control (Title), Like Name, Email */\n  @Input() label: string = \"\";\n  /** @description to hide and show label */\n  @Input() labelHide: boolean = false;\n  /** @description is control Editable or Disabled */\n  @Input() disabled: boolean = false;\n  /** @description Is Clear Input Cross button is visible or not */\n  @Input() clearInput: boolean = false;\n  /** @description Position of Label 'floating' | 'fixed' */\n  @Input() labelPlacement: labelPlacementType = \"floating\";\n  /** @description Lable direction from start of contrl or end of control */\n  @Input() labelDir: labelDirType = \"start\";\n  /** @description Place holder for control to display if there is no value */\n  @Input() placeholder: string = \"\";\n  /** @description it is to set leading icon, at the start of control  */\n  @Input() leadingIcon: string = \"\";\n  /** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon  */\n  @Input() trailingIcon: string = \"\";\n  /** @description to display below the control for suggestion, if there is any error then error will bw the first to shoe in place of help text */\n  @Input() helperText: string = \"\";\n  /** @description default true to collapse when there is no help text or error text, if false then element area in DOM will be reserved never detroy  */\n  @Input() helperTextCollapse: boolean = true;\n  /** @description show and hide helper text its forecfull */\n  @Input() hideHelperAndErrorText: boolean = true;\n  /** @description if found any error in control the error thext will be used to display error message, if there is help text still error text is having higher priority then helptext */\n  @Input() errorText: string = \"\";\n  /** @description maxlength for control */\n  @Input() maxlength: number = 0;\n  /** @description minlength for control */\n  @Input() minlength: number = 0;\n  /** @description is control is required or not input type is true | false */\n  @Input() required: boolean | undefined = undefined;\n  /** @description Auto capatalization for the value and applicable to word or to complete sentance */\n  @Input() autocapitalize: autocapitalizeType = \"off\";\n  /** @description auto complete type to help reader what is the type of value */\n  @Input() autocomplete: autocompleteType = \"off\";\n  /** @description type of control */\n  @Input() type: controlType = 'text';\n  /** @description width of control, default width is 100% */\n  @Input() width: string = '100%';\n  /** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */\n  @Input() id: string = '';\n  /** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */\n  @Input() ngModel: inputType = '';\n  @Input() option: string[] = [\"anksuh\", \"bhure\"];\n  /** @description min value for number type control or min date for date type control */\n  @Input() min: number | string | undefined = undefined;\n  /** @description max value for number type control or max date for date type control */\n  @Input() max: number | string | undefined = undefined;\n  /** @description step value for number type control */\n  @Input() step: number | string | undefined = undefined;\n  /**\n   * @description\n   * Holds the size of the component like Small, Extra small, Large\n   * by Default it takes small size\n   * or the size set by the project setup service\n   * or it will beset for individual component\n   * \n   * Size Appled \n   * Component level then setup service then finally default md\n   *  Options: \"2xs\" | \"\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \n   */\n  @Input() size: themeSize = \"md\";\n  /** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */\n  @Output() ngModelChange: EventEmitter<inputType> = new EventEmitter<inputType>();\n\n  /*\n      internal Properties for input\n  */\n  /** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */\n  public isNgModel: boolean = this.ngModel ? true : false;\n  /** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular  */\n  public isValid: boolean = true;\n  /** @description when control is touched then the will maid true by the us to check it is touched or not, when we will set this true we will call the onTouched callback method of angualr to inform angular that somthis is changed and control is touched */\n  public isTouched: boolean = false;\n  /** @description we will take type of control in type but is may be not exactly which input's type so we need to get type and set actule type to our input, also when type is set password but in calse view in textt then inuut type need to change to text */\n  public typeInternal: controlType = \"text\";\n  /** @description if traling is set the it is assigned by it, but some case tarling icon not as it is set need tro be changed at runtime, like password visibility hide and show */\n  public trailingIconInternal: string = \"\";\n\n  /* \n      Properties connected with trailingIconInternal \n  */\n  public isTrailingIconAllwedClick: boolean = false;\n\n  // Properties connected with id\n  public idRandom: string = this.randomString();\n\n  // Date picker properties\n  public showDatePicker: boolean = false;\n  public showMonthYearSelector: boolean = false;\n  public currentMonth: number = new Date().getMonth();\n  public currentYear: number = new Date().getFullYear();\n  public selectedDate: Date | null = null;\n  public calendarDays: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }[] = [];\n  public monthNames: string[] = [\n    'January', 'February', 'March', 'April', 'May', 'June',\n    'July', 'August', 'September', 'October', 'November', 'December'\n  ];\n  public shortMonthNames: string[] = [\n    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n  ];\n  private portalService = inject(PortalService);\n  private datePickerPortalId = `date-picker-${this.randomString()}`;\n  private viewContainerRef = inject(ViewContainerRef);\n\n  // ViewChild for date picker template\n  @ViewChild('datePickerTemplate', { static: true }) datePickerTemplate!: TemplateRef<any>;\n  private datePickerViewRef: EmbeddedViewRef<any> | null = null;\n\n  // Time picker properties\n  public showTimePicker: boolean = false;\n  public timeHours: number = 1;\n  public timeMinutes: number = 30;\n  public timeSeconds: number = 30;\n  public timeFormat: 'AM' | 'PM' = 'AM';\n  private timePickerPortalId = `time-picker-${this.randomString()}`;\n\n  // ViewChild for time picker template\n  @ViewChild('timePickerTemplate', { static: true }) timePickerTemplate!: TemplateRef<any>;\n\n  // DateTime picker properties\n  public showDateTimePicker: boolean = false;\n  public dateTimeStep: 'date' | 'time' = 'date';\n  private dateTimePickerPortalId = `datetime-picker-${this.randomString()}`;\n\n  // ViewChild for datetime picker template\n  @ViewChild('dateTimePickerTemplate', { static: true }) dateTimePickerTemplate!: TemplateRef<any>;\n\n  // ==================================METHODS FOR CUSTOM FORM COMPONENT=============================\n  // FOR ANGULAR CALLED BY UI\n\n  /** \n   * @description Function to call when the HTML Chnage to tell Angular somthing is changed.\n   * @field value : inputType\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  private onChange = (value: inputType) => { };\n\n  /** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */\n  onTouched = () => { };\n\n  /** @description Function to call when the input is need to Validate to tell Angular somthing is changed (in case of some input dipendent validation). */\n  onValidate = () => { };\n\n  /**\n   * @description\n   * Method that performs synchronous validation against the provided control.\n   * Exicuted by Angular\n   *\n   * @param control The control to validate against.\n   *\n   * @returns A map of validation errors if validation fails,\n   * otherwise null.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  validate(control: AbstractControl): ValidationErrors | null {\n    const validation_error = this.isControlValid(this.ngModel);\n    if (validation_error?.status) {\n      // Return the validation object directly, not wrapped in ValidationStatus\n      return validation_error.validation;\n    } else {\n      return null;\n    }\n  }\n  /**\n   * @description\n   * Registers a callback function to call when the validator inputs change.\n   * Exicuted by Angular\n   *\n   * @param fn The callback function\n   */\n  registerOnValidatorChange?(fn: () => void): void {\n    this.onValidate = fn;\n  }\n\n  /** @description when form control change from model side this method is implemented  */\n  writeValue(value: inputType): void {\n    // writeValue is called by Angular's ControlValueAccessor for reactive forms (formControlName)\n    // Always allow writeValue to update the value when called\n    // The isNgModel check was preventing reactive forms from working\n    let ngModel = this.autoCapitalizeByOption(value, this.type);\n    if (this.type === 'date') {\n      ngModel = this.processValue(ngModel, this.type);\n    }\n    console.log('writeValue', this.ngModel, ngModel);\n    this.ngModel = ngModel;\n  }\n  /** @description Allows Angular to register a function to call when the model changes. */\n  // Save the function as a property to call later here.\n  registerOnChange(fn: (value: inputType) => void): void {\n    this.onChange = fn;\n  }\n  /** @description Allows Angular to register a function to call when the input has been touched. */\n  // Save the function as a property to call later here.\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  //==========================================================================\n\n  /*\n    Methods for input\n*/\n\n  /** @description Detect wether input propertires canged or not */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes?.['value']) {\n      this.isNgModel = true;\n      this.ngModel = this.processValue(this.ngModel, this.type);\n    }\n\n    if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {\n      this.isControlValid(this.ngModel);\n    }\n\n    // Ditect type change\n    if (changes?.['type']) {\n      this.detectTypeChange();\n    }\n  }\n\n  ngOnInit(): void {\n    if (this.id) {\n      this.getControlData();\n    }\n  }\n\n  ngOnDestroy(): void {\n    // Clean up date picker portal\n    this.portalService.destroyPortal(this.datePickerPortalId);\n    // Clean up time picker portal\n    this.portalService.destroyPortal(this.timePickerPortalId);\n    // Clean up datetime picker portal\n    this.portalService.destroyPortal(this.dateTimePickerPortalId);\n  }\n\n  /** @description custom method run when HTML changes, we call method registerd by angular to detect change */\n  upDateValue(value: { target: { value: inputType } } | Event) {\n    const target = value.target as HTMLInputElement | { value: inputType };\n    this.isControlValid(target?.value);\n    const updatedValue = this.processValue(target?.value, this.type);\n    this.ngModel = updatedValue;\n    this.ngModelChange?.emit(updatedValue);\n    // console.log(target)\n    this.onChange(updatedValue);\n  }\n\n  /**\n   * @description method applicable in case of control type checkbox\n   * \n   * @param value boolean | string\n   */\n  updateValueCheckBox(value: string | boolean) {\n    // Convert string to boolean\n    this.ngModel = !this.ngModel;\n    value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);\n    this.ngModelChange?.emit(value);\n    this.onChange(value);\n  }\n\n  /** @description clear the value */\n  ClearInputValue() {\n    if (this.type == \"text\") {\n      this.upDateValue({ target: { value: \"\" } });\n    }\n  }\n\n  /** @description when HTML is focuesd */\n  focusControl() {\n    this.isTouched = true;\n    this.onTouched();\n    this.onValidate();\n  }\n\n  /**\n   * @description Handle date input for masking DD/MM/YYYY\n   */\n  onDateInput(event: Event): void {\n    if (this.type !== 'date') {\n      this.upDateValue(event);\n      return;\n    }\n\n    const input = event.target as HTMLInputElement;\n    let value = input.value;\n\n    // Remove non-numeric characters except slash\n    value = value.replace(/[^\\d/]/g, '');\n\n    // Auto-insert slashes\n    if (value.length === 2 && !value.includes('/')) {\n      value += '/';\n    } else if (value.length === 5 && (value.match(/\\//g) || []).length === 1) {\n      value += '/';\n    }\n\n    // Enforce max length for DD/MM/YYYY\n    if (value.length > 10) {\n      value = value.substring(0, 10);\n    }\n\n    // Update input value if changed\n    if (input.value !== value) {\n      input.value = value;\n    }\n\n    // Process value for ngModel (convert to standard format if complete)\n    this.upDateValue({ target: { value } } as any);\n  }\n\n  /** @description If control value need to be processed, like UPPERCASE */\n  processValue(value: inputType, type: controlType) {\n    value = this.autoCapitalizeByOption(value, type);\n    if (type === 'date' && typeof value === 'string' && value) {\n      // Handle DD/MM/YYYY format parsing\n      const ddmmyyyyRegex = /^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/;\n      const match = value.match(ddmmyyyyRegex);\n\n      if (match) {\n        const day = parseInt(match[1], 10);\n        const month = parseInt(match[2], 10);\n        const year = parseInt(match[3], 10);\n\n        // Basic validation\n        if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {\n          // Create standard YYYY-MM-DD for storage/model\n          return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n        }\n      }\n\n      // Ensure date is in YYYY-MM-DD format\n      const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n      if (dateRegex.test(value) && !isNaN(Date.parse(value))) {\n        return value; // Already in correct format\n      } else {\n        // Only attempt to format if it looks like a complete date to avoid aggressive auto-formatting while typing\n        // Checklist:\n        // 1. Must be at least 8 characters (e.g. 1/1/2025)\n        // 2. Must contain separators (- or / or .)\n        // 3. Must be a valid date\n        const hasSeparators = /[-/.]/.test(value);\n        if (value.length >= 8 && hasSeparators) {\n          const parsedDate = new Date(value);\n          if (!isNaN(parsedDate.getTime())) {\n            const year = parsedDate.getFullYear();\n            const month = String(parsedDate.getMonth() + 1).padStart(2, '0');\n            const day = String(parsedDate.getDate()).padStart(2, '0');\n            return `${year}-${month}-${day}`;\n          }\n        }\n        // Return raw value if not parseable yet, to allow user to keep typing\n        return value;\n      }\n    } else if (type === 'datetime-local' && typeof value === 'string' && value) {\n      // Try to parse and format datetime to YYYY-MM-DDTHH:mm\n      const parsedDate = new Date(value);\n      if (!isNaN(parsedDate.getTime())) {\n        // Check if already in correct format YYYY-MM-DDTHH:mm\n        if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(value)) {\n          return value; // Already in correct format\n        }\n        const year = parsedDate.getFullYear();\n        const month = String(parsedDate.getMonth() + 1).padStart(2, '0');\n        const day = String(parsedDate.getDate()).padStart(2, '0');\n        const hours = String(parsedDate.getHours()).padStart(2, '0');\n        const minutes = String(parsedDate.getMinutes()).padStart(2, '0');\n        return `${year}-${month}-${day}T${hours}:${minutes}`;\n      }\n    } else if (type === 'url' && typeof value === 'string' && value) {\n      // Normalize URL format - ensure it starts with http:// or https://\n      if (!value.startsWith('http://') && !value.startsWith('https://')) {\n        return `https://${value}`;\n      }\n    }\n    return value;\n  }\n\n  /** @description for capitalization */\n  autoCapitalizeByOption(value: inputType, type: controlType) {\n    if (type == 'text') {\n      if (this.autocapitalize == \"on\") {\n        return this.capitalizePipe?.transform(value as string, 'allUpperCase');\n      }\n      if (this.autocapitalize == \"words\") {\n        return this.capitalizePipe?.transform(value as string, 'titleCase');\n      }\n      if (this.autocapitalize == \"sentences\") {\n        return this.capitalizePipe?.transform(value as string, \"sentenceCase\");\n      }\n    } else if (type == 'url') {\n      // URLs should not be capitalized - return as is\n      return value;\n    }\n    return value;\n  }\n\n  /** @description It is used to return the value is valid or not */\n  isValidValueAndType(value: inputType, type: controlType) {\n    if (type == 'text') {\n      if (typeof (value) == 'string') {\n        if (value?.length > 0) {\n          return true;\n        } else {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    } else if (type == 'url') {\n      if (typeof (value) == 'string') {\n        if (value?.length > 0) {\n          // Validate URL format\n          const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\n          return urlRegex.test(value);\n        } else {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    } else if (type == 'date') {\n      if (typeof (value) == 'string') {\n        if (value?.length > 0) {\n          // Validate date format (YYYY-MM-DD)\n          const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n          return dateRegex.test(value) && !isNaN(Date.parse(value));\n        } else {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    } else if (type == 'time') {\n      if (typeof (value) == 'string') {\n        if (value?.length > 0) {\n          // Validate time format (HH:mm or HH:mm:ss)\n          const timeRegex = /^\\d{2}:\\d{2}(:\\d{2})?$/;\n          return timeRegex.test(value);\n        } else {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    } else if (type == 'datetime-local') {\n      if (typeof (value) == 'string') {\n        if (value?.length > 0) {\n          console.log(value, \"value, datetime-local\")\n          // Just check if it can be parsed as a valid date (no regex validation)\n          return !isNaN(Date.parse(value));\n        } else {\n          return false;\n        }\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  /** @description to check control is valid or not */\n  isControlValid(value: inputType): ValidationStatus {\n    const validation_status: ValidationStatus = {\n      validation: {},\n      status: false\n    };\n\n    if (this.required) {\n      if (!value) {\n        console.log(value, \"value, req\")\n        validation_status.status = true;\n        validation_status.validation.required = `required!`;\n      }\n    }\n\n    if (this.type == 'text') {\n      if (typeof (value) === 'number') {\n        value = value.toString();\n      }\n      if (typeof (value) == 'string') {\n        if (this.maxlength > 0) {\n          if (value?.length > this.maxlength) {\n            validation_status.status = true;\n            validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;\n          }\n        }\n        if (this.minlength > 0) {\n          if (value?.length < this.minlength) {\n            validation_status.status = true;\n            validation_status.validation.minlength = `minimum length is ${this.minlength}!`;\n          }\n        }\n      } else {\n        validation_status.status = true;\n        validation_status.validation.required = `required!`;\n      }\n    } else if (this.type == 'url') {\n      if (typeof (value) == 'string' && value) {\n        // URL validation regex - allows URLs with or without TLD (e.g., http://localhost or http://example.com)\n        // Pattern breakdown:\n        // - ^https?:\\/\\/ - protocol (http:// or https://)\n        // - (www\\.)? - optional www. prefix\n        // - [-a-zA-Z0-9@:%._\\+~#=]{1,256} - hostname (allows localhost, IP addresses, domain names with/without TLD)\n        // - (:\\d+)? - optional port number\n        // - (\\/[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)? - optional path, query params, and hash\n        const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}(:\\d+)?(\\/[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)?$/;\n        if (!urlRegex.test(value)) {\n          validation_status.status = true;\n          validation_status.validation.required = `Please enter a valid URL (e.g., https://example.com or http://localhost)!`;\n        }\n\n        if (this.maxlength > 0) {\n          if (value?.length > this.maxlength) {\n            validation_status.status = true;\n            validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;\n          }\n        }\n        if (this.minlength > 0) {\n          if (value?.length < this.minlength) {\n            validation_status.status = true;\n            validation_status.validation.minlength = `minimum length is ${this.minlength}!`;\n          }\n        }\n      } else if (this.required && !value) {\n        validation_status.status = true;\n        validation_status.validation.required = `URL is required!`;\n      }\n    } else if (this.type == 'date') {\n      if (typeof (value) == 'string' && value) {\n        // Validate date format and parse\n        const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n        if (!dateRegex.test(value)) {\n          validation_status.status = true;\n          validation_status.validation.required = `Invalid date format (YYYY-MM-DD)!`;\n        } else {\n          const parsedDate = Date.parse(value);\n          if (isNaN(parsedDate)) {\n            validation_status.status = true;\n            validation_status.validation.required = `Invalid date!`;\n          } else {\n            // Validate min date\n            if (this.min && typeof this.min === 'string') {\n              const minDate = Date.parse(this.min);\n              if (!isNaN(minDate) && parsedDate < minDate) {\n                validation_status.status = true;\n                validation_status.validation.required = `Date must be after ${this.min}!`;\n              }\n            }\n            // Validate max date\n            if (this.max && typeof this.max === 'string') {\n              const maxDate = Date.parse(this.max);\n              if (!isNaN(maxDate) && parsedDate > maxDate) {\n                validation_status.status = true;\n                validation_status.validation.required = `Date must be before ${this.max}!`;\n              }\n            }\n          }\n        }\n      } else if (this.required && !value) {\n        validation_status.status = true;\n        validation_status.validation.required = `Date is required!`;\n      }\n    } else if (this.type == 'datetime-local') {\n      if (typeof (value) == 'string' && value) {\n        console.log(value, \"value, datetime-local, isControlValid\")\n        // Validate datetime by parsing (no regex validation)\n        const parsedDate = Date.parse(value);\n        if (isNaN(parsedDate)) {\n          validation_status.status = true;\n          validation_status.validation.required = `Invalid datetime!`;\n        } else {\n          // Validate min datetime\n          if (this.min && typeof this.min === 'string') {\n            const minDate = Date.parse(this.min);\n            if (!isNaN(minDate) && parsedDate < minDate) {\n              validation_status.status = true;\n              validation_status.validation.required = `Datetime must be after ${this.min}!`;\n            }\n          }\n          // Validate max datetime\n          if (this.max && typeof this.max === 'string') {\n            const maxDate = Date.parse(this.max);\n            if (!isNaN(maxDate) && parsedDate > maxDate) {\n              validation_status.status = true;\n              validation_status.validation.required = `Datetime must be before ${this.max}!`;\n            }\n          }\n        }\n      } else if (this.required && !value) {\n        validation_status.status = true;\n        validation_status.validation.required = `Datetime is required!`;\n      }\n    }\n    console.log(validation_status, \"validation_status, isControlValid\");\n    // Use setTimeout to defer the change to next change detection cycle to avoid ExpressionChangedAfterItHasBeenCheckedError\n    const newIsValid = !validation_status.status;\n    const newErrorText = Object.values(validation_status.validation).at(0) || '';\n\n    if (this.isValid !== newIsValid || this.errorText !== newErrorText) {\n      // Defer the update to next tick to avoid ExpressionChangedAfterItHasBeenCheckedError\n      setTimeout(() => {\n        this.isValid = newIsValid;\n        this.errorText = newErrorText;\n        this.cdr.markForCheck();\n      }, 0);\n    }\n\n    return validation_status;\n  }\n\n  /** @description Allows Angular to disable the input. */\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n\n  /** @description Method for trailing Icon Click */\n  trailingIconClick() {\n    if (this.type === 'password') {\n      if (this.typeInternal === 'password') {\n        this.typeInternal = 'text';\n        this.trailingIconInternal = 'visibility';\n      } else {\n        this.typeInternal = 'password';\n        this.trailingIconInternal = 'visibility_off';\n      }\n    } else if (this.type === 'date') {\n      // Toggle custom date picker using portal service\n      this.showDatePicker = !this.showDatePicker;\n      console.log('🔍 Toggling date picker. New state:', this.showDatePicker);\n      if (this.showDatePicker) {\n        this.initializeDatePicker();\n        this.createDatePickerUsingPortal();\n      } else {\n        this.closeDatePicker();\n      }\n    } else if (this.type === 'time') {\n      // Toggle custom time picker using portal service\n      this.showTimePicker = !this.showTimePicker;\n      if (this.showTimePicker) {\n        this.initializeTimePicker();\n        this.createTimePickerUsingPortal();\n      } else {\n        this.closeTimePicker();\n      }\n    } else if (this.type === 'datetime-local') {\n      // Toggle custom datetime picker using portal service\n      this.showDateTimePicker = !this.showDateTimePicker;\n      if (this.showDateTimePicker) {\n        this.dateTimeStep = 'date'; // Start with date selection\n        this.initializeDateTimePicker();\n        this.createDateTimePickerUsingPortal();\n      } else {\n        this.closeDateTimePicker();\n      }\n    } else {\n      this.typeInternal = this.type;\n    }\n  }\n\n  /**\n   * Method to generate Random String\n   * @param setupPrarameter { lenght: number, prefix: string }\n   * default lenght is 10, prefox is \"\"\n   * @returns string\n   */\n  randomString(setupPrarameter: { lenght: number, prefix: string } = { lenght: 10, prefix: \"\" }): string {\n    //variable consisting alphabets in small and capital letter  \n    const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\n    //loop to select a new character in each iteration  \n    let random_string = setupPrarameter?.prefix || \"\";\n    for (let i = 0; i < setupPrarameter?.lenght; i++) {\n      const rnum = Math.floor(Math.random() * characters.length);\n      random_string += characters.substring(rnum, rnum + 1);\n    }\n    //return the generated string  \n    return random_string;\n  }\n\n  async getControlData() {\n    const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\n    if (cide_element_data) {\n      this.label = cide_element_data?.sype_label as string;\n      this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating') as labelPlacementType;\n      this.type = (cide_element_data?.sype_type || 'text') as controlType;\n\n      // Only set required from DB if not explicitly set (still undefined)\n      if (this.required === undefined) {\n        this.required = (cide_element_data?.sype_required || false) as boolean;\n      }\n\n      this.size = (cide_element_data?.sype_size || 'md') as themeSize;\n      this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false) as boolean;\n      this.maxlength = (cide_element_data?.sype_max_length) as number;\n      this.minlength = (cide_element_data?.sype_min_length) as number;\n      this.leadingIcon = (cide_element_data?.sype_leading_icon) as string;\n      this.labelHide = (cide_element_data?.sype_label_hide) as boolean;\n      this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text) as boolean;\n      this.detectTypeChange();\n      // Validate control\n      this.onValidate();\n    }\n  }\n\n  /**\n   * @description Helper to check if type is time (for template type narrowing)\n   */\n  isTimeType(): boolean {\n    return this.type === 'time';\n  }\n\n  /**\n   * @description use to detact the change in type if changes done this method is ued to run\n   */\n  detectTypeChange() {\n    if (this.type === 'password') {\n      this.typeInternal = \"password\";\n      this.trailingIconInternal = \"visibility_off\";\n      this.isTrailingIconAllwedClick = true;\n    } else if (this.type === 'date') {\n      this.typeInternal = \"date\";\n      // Set default calendar icon if no trailing icon specified\n      this.trailingIconInternal = this.trailingIcon || \"calendar_today\";\n      this.isTrailingIconAllwedClick = true; // Allow clicking calendar icon\n    } else if (this.type === 'time') {\n      this.typeInternal = \"time\";\n      // Set default schedule icon for time picker\n      this.trailingIconInternal = this.trailingIcon || \"schedule\";\n      this.isTrailingIconAllwedClick = true; // Allow clicking time icon\n    } else if (this.type === 'datetime-local') {\n      this.typeInternal = \"datetime-local\";\n      // Set default schedule icon if no trailing icon specified\n      this.trailingIconInternal = this.trailingIcon || \"event\";\n      this.isTrailingIconAllwedClick = true; // datetime-local now uses custom picker\n    } else if (this.type === 'url') {\n      this.typeInternal = \"url\";\n      // Set default link icon if no trailing icon specified\n      this.trailingIconInternal = this.trailingIcon || \"link\";\n      this.isTrailingIconAllwedClick = false; // URL type doesn't need clickable trailing icon\n    } else {\n      this.typeInternal = this.type;\n      this.trailingIconInternal = this.trailingIcon;\n    }\n  }\n\n  /**\n   * @description Format date to YYYY-MM-DD format (for form submission)\n   */\n  formatDate(date: Date | string): string {\n    if (typeof date === 'string') {\n      // Parse date string in YYYY-MM-DD format to avoid timezone issues\n      const [year, month, day] = date.split('-').map(Number);\n      date = new Date(year, month - 1, day); // month is 0-indexed\n    }\n    if (date instanceof Date && !isNaN(date.getTime())) {\n      const year = date.getFullYear();\n      const month = (date.getMonth() + 1).toString().padStart(2, '0');\n      const day = date.getDate().toString().padStart(2, '0');\n      return `${year}-${month}-${day}`;\n    }\n    return '';\n  }\n\n  /**\n   * @description Format date for display as \"DD/MMM/YYYY\" (e.g., \"20/Jun/2025\")\n   */\n  formatDateForDisplay(date: Date | string): string {\n    if (typeof date === 'string') {\n      // Parse date string in YYYY-MM-DD format to avoid timezone issues\n      const [year, month, day] = date.split('-').map(Number);\n      date = new Date(year, month - 1, day); // month is 0-indexed\n    }\n    if (date instanceof Date && !isNaN(date.getTime())) {\n      const day = date.getDate().toString().padStart(2, '0');\n      const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n      const month = monthNames[date.getMonth()];\n      const year = date.getFullYear();\n      return `${day}/${month}/${year}`;\n    }\n    return '';\n  }\n\n  /**\n   * @description Get display value for date input\n   */\n  getDateDisplayValue(): string {\n    if (this.ngModel && typeof this.ngModel === 'string') {\n      const formatted = this.formatDateForDisplay(this.ngModel);\n      // Return formatted date if valid, otherwise return the raw ngModel string\n      // This allows the user to see what they are typing even if it's invalid/incomplete\n      return formatted || this.ngModel;\n    }\n    return '';\n  }\n\n  /**\n   * @description Initialize date picker with current values\n   */\n  initializeDatePicker(): void {\n    // Set selected date from current value\n    if (this.ngModel && typeof this.ngModel === 'string') {\n      // Parse date string in YYYY-MM-DD format to avoid timezone issues\n      const [year, month, day] = this.ngModel.split('-').map(Number);\n      this.selectedDate = new Date(year, month - 1, day); // month is 0-indexed\n      if (!isNaN(this.selectedDate.getTime())) {\n        this.currentMonth = this.selectedDate.getMonth();\n        this.currentYear = this.selectedDate.getFullYear();\n      }\n    } else {\n      this.selectedDate = null;\n    }\n    this.generateCalendar();\n  }\n\n  /**\n   * @description Generate calendar days for current month\n   */\n  generateCalendar(): void {\n    const firstDay = new Date(this.currentYear, this.currentMonth, 1);\n    const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0);\n    const startDate = new Date(firstDay);\n    startDate.setDate(startDate.getDate() - firstDay.getDay()); // Start from Sunday\n\n    const today = new Date();\n    this.calendarDays = [];\n\n    // Generate 42 days (6 weeks)\n    for (let i = 0; i < 42; i++) {\n      const currentDate = new Date(startDate);\n      currentDate.setDate(startDate.getDate() + i);\n\n      const isCurrentMonth = currentDate.getMonth() === this.currentMonth;\n      const isSelected = this.selectedDate ?\n        currentDate.toDateString() === this.selectedDate.toDateString() : false;\n      const isToday = currentDate.toDateString() === today.toDateString();\n\n      this.calendarDays.push({\n        day: currentDate.getDate(),\n        isCurrentMonth,\n        isSelected,\n        isToday,\n        date: new Date(currentDate)\n      });\n    }\n  }\n\n  /**\n   * @description Create date picker using template-based portal service\n   */\n  private createDatePickerUsingPortal(): void {\n    // Reset to calendar view when opening\n    this.showMonthYearSelector = false;\n\n    // Get input element - use idRandom as fallback if id is not provided\n    const elementId = this.id || this.idRandom;\n    console.log('🔍 Creating date picker portal. Element ID:', elementId);\n\n    // Check if element exists directly\n    let inputElement = document.getElementById(elementId);\n\n    if (!inputElement) {\n      console.warn('⚠️ Element not found by ID. Attempting to find via ViewChild or fallback.');\n      return;\n    }\n\n    console.log('🔍 Input element found:', inputElement);\n\n    // Create template portal configuration\n    const portalConfig = {\n      triggerElement: inputElement,\n      template: this.datePickerTemplate,\n      viewContainerRef: this.viewContainerRef,\n      context: {}, // Template can access component properties directly\n      className: 'cide-date-picker-portal',\n      position: 'auto' as const, // Smart positioning - will auto-detect best position\n      align: 'left' as const,\n      offsetY: 4,\n      minWidth: 320,\n      maxHeight: 400,\n      closeOnClickOutside: true,\n      closeOnEscape: true\n    };\n\n    // Create the template portal\n    this.portalService.createTemplatePortal(this.datePickerPortalId, portalConfig);\n\n    // Register close callback\n    this.portalService.registerCloseCallback(this.datePickerPortalId, () => {\n      this.closeDatePicker();\n    });\n\n    // Set data attribute for click outside detection\n    inputElement.setAttribute('data-portal-trigger', this.datePickerPortalId);\n  }\n\n  /**\n   * @description Close date picker\n   */\n  closeDatePicker(): void {\n    this.showDatePicker = false;\n    this.showMonthYearSelector = false;\n    this.portalService.destroyPortal(this.datePickerPortalId);\n  }\n\n  /**\n   * @description Navigate to previous month\n   */\n  previousMonth(): void {\n    if (this.currentMonth === 0) {\n      this.currentMonth = 11;\n      this.currentYear--;\n    } else {\n      this.currentMonth--;\n    }\n    this.generateCalendar();\n  }\n\n  /**\n   * @description Navigate to next month\n   */\n  nextMonth(): void {\n    if (this.currentMonth === 11) {\n      this.currentMonth = 0;\n      this.currentYear++;\n    } else {\n      this.currentMonth++;\n    }\n    this.generateCalendar();\n  }\n\n  /**\n   * @description Navigate to previous year\n   */\n  previousYear(): void {\n    this.currentYear--;\n  }\n\n  /**\n   * @description Navigate to next year\n   */\n  nextYear(): void {\n    this.currentYear++;\n  }\n\n  /**\n   * @description Toggle between calendar and month/year selector\n   */\n  toggleMonthYearSelector(): void {\n    this.showMonthYearSelector = !this.showMonthYearSelector;\n  }\n\n  /**\n   * @description Select a month from the month selector\n   */\n  selectMonth(monthIndex: number): void {\n    this.currentMonth = monthIndex;\n    this.generateCalendar();\n    this.showMonthYearSelector = false; // Return to calendar view\n  }\n\n  /**\n   * @description Select a date from the calendar\n   */\n  selectDate(dayInfo: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }): void {\n    if (!dayInfo.isCurrentMonth) return;\n\n    // Set the selected date\n    this.selectedDate = dayInfo.date;\n\n    // Update the input value - Use local date formatting to avoid timezone issues\n    const year = dayInfo.date.getFullYear();\n    const month = String(dayInfo.date.getMonth() + 1).padStart(2, '0');\n    const day = String(dayInfo.date.getDate()).padStart(2, '0');\n    const formattedDate = `${year}-${month}-${day}`; // YYYY-MM-DD format\n\n    this.ngModel = formattedDate;\n    this.ngModelChange?.emit(formattedDate);\n    this.onChange(formattedDate);\n\n    // Mark as touched and validate\n    this.isTouched = true;\n    this.onTouched();\n    this.isControlValid(formattedDate);\n\n    // Regenerate calendar to update selection\n    this.generateCalendar();\n\n    // Close date picker\n    this.closeDatePicker();\n  }\n\n  // ==================== TIME PICKER METHODS ====================\n\n  /**\n   * @description Initialize time picker with current values\n   */\n  initializeTimePicker(): void {\n    if (this.ngModel) {\n      // Parse existing time value (format: HH:mm or HH:mm:ss)\n      const timeString = this.ngModel.toString();\n      const timeParts = timeString.split(':');\n\n      if (timeParts.length >= 2) {\n        let hours = parseInt(timeParts[0]);\n        const minutes = parseInt(timeParts[1]);\n        const seconds = timeParts[2] ? parseInt(timeParts[2]) : 0;\n\n        // Convert to 12-hour format\n        this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n        this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n        this.timeMinutes = minutes;\n        this.timeSeconds = seconds;\n      }\n    } else {\n      // Default to current time\n      const now = new Date();\n      let hours = now.getHours();\n      this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n      this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n      this.timeMinutes = now.getMinutes();\n      this.timeSeconds = now.getSeconds();\n    }\n  }\n\n  /**\n   * @description Create time picker using template-based portal service\n   */\n  private createTimePickerUsingPortal(): void {\n    const inputElement = document.getElementById(this.id || this.idRandom);\n    if (!inputElement) return;\n\n    const portalConfig = {\n      template: this.timePickerTemplate,\n      context: { $implicit: this },\n      triggerElement: inputElement,\n      viewContainerRef: this.viewContainerRef,\n      className: 'cide-time-picker-portal',\n      position: 'bottom' as 'bottom',\n      align: 'left' as 'left',\n      offset: { x: 0, y: 8 },\n      closeOnOutsideClick: true,\n      closeOnEscape: true\n    };\n\n    this.portalService.createTemplatePortal(this.timePickerPortalId, portalConfig);\n\n    // Register close callback\n    this.portalService.registerCloseCallback(this.timePickerPortalId, () => {\n      this.closeTimePicker();\n    });\n\n    inputElement.setAttribute('data-portal-trigger', this.timePickerPortalId);\n  }\n\n  /**\n   * @description Close time picker\n   */\n  closeTimePicker(): void {\n    this.showTimePicker = false;\n    this.portalService.destroyPortal(this.timePickerPortalId);\n  }\n\n  /**\n   * @description Increment/decrement time value\n   */\n  adjustTime(unit: 'hours' | 'minutes' | 'seconds', direction: 'up' | 'down'): void {\n    if (unit === 'hours') {\n      if (direction === 'up') {\n        this.timeHours = this.timeHours === 12 ? 1 : this.timeHours + 1;\n      } else {\n        this.timeHours = this.timeHours === 1 ? 12 : this.timeHours - 1;\n      }\n    } else if (unit === 'minutes') {\n      if (direction === 'up') {\n        this.timeMinutes = this.timeMinutes === 59 ? 0 : this.timeMinutes + 1;\n      } else {\n        this.timeMinutes = this.timeMinutes === 0 ? 59 : this.timeMinutes - 1;\n      }\n    } else if (unit === 'seconds') {\n      if (direction === 'up') {\n        this.timeSeconds = this.timeSeconds === 59 ? 0 : this.timeSeconds + 1;\n      } else {\n        this.timeSeconds = this.timeSeconds === 0 ? 59 : this.timeSeconds - 1;\n      }\n    }\n  }\n\n  /**\n   * @description Toggle AM/PM\n   */\n  toggleTimeFormat(): void {\n    this.timeFormat = this.timeFormat === 'AM' ? 'PM' : 'AM';\n  }\n\n  /**\n   * @description Apply selected time\n   */\n  applyTime(): void {\n    // Convert to 24-hour format\n    let hours = this.timeHours;\n    if (this.timeFormat === 'PM' && hours !== 12) {\n      hours += 12;\n    } else if (this.timeFormat === 'AM' && hours === 12) {\n      hours = 0;\n    }\n\n    // Format time as HH:mm:ss\n    const timeString = `${hours.toString().padStart(2, '0')}:${this.timeMinutes.toString().padStart(2, '0')}:${this.timeSeconds.toString().padStart(2, '0')}`;\n\n    this.ngModel = timeString;\n    this.ngModelChange.emit(timeString);\n    this.onChange(timeString);\n\n    // Mark as touched and validate\n    this.isTouched = true;\n    this.onTouched();\n    this.isControlValid(timeString);\n\n    this.closeTimePicker();\n  }\n\n  /**\n   * @description Get time display value for the input field\n   */\n  getTimeDisplayValue(): string {\n    if (!this.ngModel) return '';\n\n    const timeString = this.ngModel.toString();\n    const timeParts = timeString.split(':');\n\n    if (timeParts.length >= 2) {\n      let hours = parseInt(timeParts[0]);\n      const minutes = parseInt(timeParts[1]);\n      const seconds = timeParts[2] ? parseInt(timeParts[2]) : 0;\n\n      const format = hours >= 12 ? 'PM' : 'AM';\n      hours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n\n      return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')} ${format}`;\n    }\n\n    return timeString;\n  }\n\n  // ==================== DATETIME PICKER METHODS ====================\n\n  /**\n   * @description Initialize datetime picker\n   */\n  initializeDateTimePicker(): void {\n    if (this.ngModel) {\n      // Parse existing datetime value\n      const dateTimeString = this.ngModel.toString();\n\n      // Parse datetime string - handle both local format (YYYY-MM-DDTHH:mm:ss) and ISO format\n      let dateTime: Date;\n\n      // Check if it's in local format (no timezone indicator)\n      if (dateTimeString.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$/)) {\n        // Parse as local time (YYYY-MM-DDTHH:mm:ss)\n        const [datePart, timePart] = dateTimeString.split('T');\n        const [year, month, day] = datePart.split('-').map(Number);\n        const [hour, minute, second = 0] = timePart.split(':').map(Number);\n        dateTime = new Date(year, month - 1, day, hour, minute, second);\n      } else {\n        // Try parsing as ISO string or other format\n        dateTime = new Date(dateTimeString);\n      }\n\n      if (!isNaN(dateTime.getTime())) {\n        // Initialize date picker values\n        this.selectedDate = dateTime;\n        this.currentMonth = dateTime.getMonth();\n        this.currentYear = dateTime.getFullYear();\n        this.generateCalendar();\n\n        // Initialize time picker values\n        let hours = dateTime.getHours();\n        this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n        this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n        this.timeMinutes = dateTime.getMinutes();\n        this.timeSeconds = dateTime.getSeconds();\n      }\n    } else {\n      // Default to current date and time\n      const now = new Date();\n      this.selectedDate = now;\n      this.currentMonth = now.getMonth();\n      this.currentYear = now.getFullYear();\n      this.generateCalendar();\n\n      let hours = now.getHours();\n      this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n      this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n      this.timeMinutes = now.getMinutes();\n      this.timeSeconds = now.getSeconds();\n    }\n  }\n\n  /**\n   * @description Create datetime picker using portal service\n   */\n  private createDateTimePickerUsingPortal(): void {\n    const inputElement = document.getElementById(this.id || this.idRandom);\n    if (!inputElement) return;\n\n    // Use combined datetime picker template (shows date and time together)\n    const portalConfig = {\n      template: this.dateTimePickerTemplate,\n      context: { $implicit: this },\n      triggerElement: inputElement,\n      viewContainerRef: this.viewContainerRef,\n      className: 'cide-datetime-picker-portal',\n      position: 'bottom' as 'bottom',\n      align: 'left' as 'left',\n      offset: { x: 0, y: 8 },\n      closeOnOutsideClick: true,\n      closeOnEscape: true\n    };\n\n    this.portalService.createTemplatePortal(this.dateTimePickerPortalId, portalConfig);\n\n    this.portalService.registerCloseCallback(this.dateTimePickerPortalId, () => {\n      this.closeDateTimePicker();\n    });\n\n    inputElement.setAttribute('data-portal-trigger', this.dateTimePickerPortalId);\n  }\n\n  /**\n   * @description Close datetime picker\n   */\n  closeDateTimePicker(): void {\n    this.showDateTimePicker = false;\n    this.dateTimeStep = 'date';\n    this.showMonthYearSelector = false;\n    this.portalService.destroyPortal(this.dateTimePickerPortalId);\n  }\n\n  /**\n   * @description Select date in datetime picker (just updates the selected date, time stays visible)\n   */\n  selectDateTimeDate(dayInfo: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }): void {\n    if (!dayInfo.isCurrentMonth) return;\n\n    // Just update the selected date - time picker remains visible on the right\n    this.selectedDate = dayInfo.date;\n\n    // Regenerate calendar to update selection\n    this.generateCalendar();\n  }\n\n  /**\n   * @description Apply datetime (combines date and time)\n   */\n  applyDateTime(): void {\n    if (!this.selectedDate) return;\n\n    // Convert time to 24-hour format\n    let hours = this.timeHours;\n    if (this.timeFormat === 'PM' && hours !== 12) {\n      hours += 12;\n    } else if (this.timeFormat === 'AM' && hours === 12) {\n      hours = 0;\n    }\n\n    // Combine date and time\n    const dateTime = new Date(this.selectedDate);\n    dateTime.setHours(hours, this.timeMinutes, this.timeSeconds);\n\n    // Format as datetime-local string (YYYY-MM-DDTHH:mm) in LOCAL time, not UTC\n    // This prevents timezone conversion issues\n    const year = dateTime.getFullYear();\n    const month = String(dateTime.getMonth() + 1).padStart(2, '0');\n    const day = String(dateTime.getDate()).padStart(2, '0');\n    const hour = String(dateTime.getHours()).padStart(2, '0');\n    const minute = String(dateTime.getMinutes()).padStart(2, '0');\n    const second = String(dateTime.getSeconds()).padStart(2, '0');\n\n    // Format: YYYY-MM-DDTHH:mm:ss (local time, no timezone)\n    const dateTimeString = `${year}-${month}-${day}T${hour}:${minute}:${second}`;\n\n    this.ngModel = dateTimeString;\n    this.ngModelChange.emit(dateTimeString);\n    this.onChange(dateTimeString);\n\n    // Mark as touched and validate\n    this.isTouched = true;\n    this.onTouched();\n    this.isControlValid(dateTimeString);\n\n    this.closeDateTimePicker();\n  }\n\n  /**\n   * @description Get datetime display value\n   */\n  getDateTimeDisplayValue(): string {\n    if (!this.ngModel) return '';\n\n    const dateTimeString = this.ngModel.toString();\n\n    // Parse datetime string - handle both local format (YYYY-MM-DDTHH:mm:ss) and ISO format\n    let dateTime: Date;\n\n    // Check if it's in local format (no timezone indicator)\n    if (dateTimeString.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$/)) {\n      // Parse as local time (YYYY-MM-DDTHH:mm:ss)\n      const [datePart, timePart] = dateTimeString.split('T');\n      const [year, month, day] = datePart.split('-').map(Number);\n      const [hour, minute, second = 0] = timePart.split(':').map(Number);\n      dateTime = new Date(year, month - 1, day, hour, minute, second);\n    } else {\n      // Try parsing as ISO string or other format\n      dateTime = new Date(dateTimeString);\n    }\n\n    if (isNaN(dateTime.getTime())) return dateTimeString;\n\n    // Format: MMM DD, YYYY HH:mm AM/PM\n    const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n    const month = monthNames[dateTime.getMonth()];\n    const day = dateTime.getDate();\n    const year = dateTime.getFullYear();\n\n    let hours = dateTime.getHours();\n    const minutes = dateTime.getMinutes();\n    const format = hours >= 12 ? 'PM' : 'AM';\n    hours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n\n    return `${month} ${day}, ${year} ${hours}:${minutes.toString().padStart(2, '0')} ${format}`;\n  }\n\n  /**\n   * @description Back to date selection in datetime picker\n   */\n  backToDateSelection(): void {\n    this.dateTimeStep = 'date';\n\n    // Recreate portal with date picker template\n    this.portalService.destroyPortal(this.dateTimePickerPortalId);\n    this.createDateTimePickerUsingPortal();\n  }\n\n  /**\n   * @description Set current date and time (Now button)\n   */\n  setCurrentDateTime(): void {\n    const now = new Date();\n\n    // Set date\n    this.selectedDate = now;\n    this.currentMonth = now.getMonth();\n    this.currentYear = now.getFullYear();\n    this.generateCalendar();\n\n    // Set time\n    let hours = now.getHours();\n    this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n    this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n    this.timeMinutes = now.getMinutes();\n    this.timeSeconds = now.getSeconds();\n  }\n\n}\n","<div class=\"cide-input\">\n  <!------------------------------------------TEXT | PASSWORD | DATE | URL------------------------------------------>\n  @if (type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'tel' || type ===\n  'date' || type === 'datetime-local' || type === 'url') {\n  <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\n                'cide-element-size-xxs': (size === '2xs'),\n                'cide-element-size-xs': (size === 'xs'),\n                'cide-element-size-sm': (size === 'sm'),\n                'cide-element-size-md': (size === 'md'),\n                'cide-element-size-lg': (size === 'lg'),\n                'cide-element-leading-icon': leadingIcon,\n                'cide-element-trailing-icon': trailingIconInternal,\n                'cide-element-clear-input': clearInput,\n                'cide-element-input-label-floating': (labelPlacement === 'floating'),\n                'cide-element-input-label-start': (labelDir === 'start'),\n                'cide-element-input-label-end': (labelDir === 'end'),\n                'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\n                'cide-element-input-label-less': (!label || labelHide),\n                'cide-element-style-outline': (fill === 'outline'),\n                'cide-element-style-solid': (fill === 'solid'),\n                'cide-element-style-standard': (fill === 'standard'),\n                'cide-element-input-number': (type === 'number')\n            }\">\n    <!-- label -->\n    @if (label && !labelHide) {\n    <label [for]=\"id\" class=\"cide-input-label\">\n      {{label}}\n      @if (required) {\n      <span class=\"tw-text-red-500 tw-ml-1\">*</span>\n      }\n    </label>\n    }\n\n    <!-- all one line elemets which dose not affect with label and error text -->\n    <div class=\"cide-element-input-wrapper\">\n      <!-- Leading Icon -->\n      @if (leadingIcon) {\n      <span class=\"cide-input-leading-icon-wrapper\">\n        <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n      </span>\n      }\n\n      <!-- Trailing icon -->\n      @if (trailingIconInternal) {\n      <span class=\"tw-absolute cide-input-trailing-icon tw-select-none tw-right-0 tw-z-10\">\n        <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\n          [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\n          (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\n      </span>\n      }\n\n      <!-- Clear -->\n      @if (clearInput && ngModel) {\n      <button class=\"cide-input-clear\" (click)=\"ClearInputValue()\">\n        <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n      </button>\n      }\n\n      <!-- Date Input Wrapper -->\n      @if (type === 'date') {\n      <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\n        <!-- Date Input (read-only to prevent manual input) -->\n        <input [placeholder]=\"placeholder || 'DD/MM/YYYY'\" [id]=\"id || idRandom\" [disabled]=\"disabled\" [ngClass]=\"{\n                            'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n                            'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n                            'tw-pl-1': !leadingIcon,\n                            'tw-pr-8': trailingIconInternal,\n                            'tw-pr-1': !trailingIconInternal,\n                            'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n                            'tw-h-7': size === 'sm',\n                            '!tw-mt-0': labelHide,\n                            'tw-opacity-50 tw-cursor-not-allowed': disabled\n                        }\" [value]=\"getDateDisplayValue()\" type=\"text\" (focus)=\"focusControl()\"\n          (input)=\"onDateInput($event)\" [autocomplete]=\"autocomplete\"\n          class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\n\n        <!-- Placeholder overlay for empty date -->\n        @if (!ngModel && placeholder) {\n        <div class=\"cide-input-date-overlay\">\n          {{placeholder}}\n        </div>\n        }\n\n        <!-- Date picker is now rendered as a portal appended to body -->\n      </div>\n      }\n\n      <!-- Time Input Wrapper -->\n      @if (isTimeType()) {\n      <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\n        <!-- Time Input (read-only to prevent manual input) -->\n        <input [placeholder]=\"placeholder\" [id]=\"id || idRandom\" [disabled]=\"disabled\" [ngClass]=\"{\n                            'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n                            'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n                            'tw-pl-1': !leadingIcon,\n                            'tw-pr-8': trailingIconInternal,\n                            'tw-pr-1': !trailingIconInternal,\n                            'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n                            'tw-h-7': size === 'sm',\n                            '!tw-mt-0': labelHide,\n                            'tw-opacity-50 tw-cursor-not-allowed': disabled\n                        }\" [value]=\"getTimeDisplayValue()\" type=\"text\" readonly (focus)=\"focusControl()\"\n          (click)=\"trailingIconClick()\" [autocomplete]=\"autocomplete\"\n          class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none tw-cursor-pointer\" />\n\n        <!-- Placeholder overlay for empty time -->\n        @if (!ngModel && placeholder) {\n        <div class=\"cide-input-date-overlay\">\n          {{placeholder}}\n        </div>\n        }\n\n        <!-- Time picker is now rendered as a portal appended to body -->\n      </div>\n      }\n\n      <!-- DateTime Local Input -->\n      @if (type === 'datetime-local') {\n      <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\n        <!-- DateTime Input (read-only to prevent manual input) -->\n        <input [placeholder]=\"placeholder\" [id]=\"id || idRandom\" [disabled]=\"disabled\" [ngClass]=\"{\n                            'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n                            'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n                            'tw-pl-1': !leadingIcon,\n                            'tw-pr-8': trailingIconInternal,\n                            'tw-pr-1': !trailingIconInternal,\n                            'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n                            'tw-h-7': size === 'sm',\n                            '!tw-mt-0': labelHide,\n                            'tw-opacity-50 tw-cursor-not-allowed': disabled\n                        }\" [value]=\"getDateTimeDisplayValue()\" type=\"text\" readonly (focus)=\"focusControl()\"\n          (click)=\"trailingIconClick()\" [autocomplete]=\"autocomplete\"\n          class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none tw-cursor-pointer\" />\n\n        <!-- Placeholder overlay for empty datetime -->\n        @if (!ngModel && placeholder) {\n        <div class=\"cide-input-date-overlay\">\n          {{placeholder}}\n        </div>\n        }\n\n        <!-- DateTime picker is now rendered as a portal appended to body -->\n      </div>\n      }\n\n      <!-- Regular Input (non-date, non-time, non-datetime-local, non-url) -->\n      @if (type !== 'date' && !isTimeType() && type !== 'datetime-local' && type !== 'url') {\n      <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\" [ngClass]=\"{\n                        'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n                        'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n                        'tw-pl-1': !leadingIcon,\n                        'tw-pr-8': trailingIconInternal,\n                        'tw-pr-1': !trailingIconInternal,\n                        'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n                        'tw-h-7': size === 'sm',\n                        '!tw-mt-0': labelHide,\n                        'tw-opacity-50 tw-cursor-not-allowed': disabled\n                    }\" [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\"\n        (focus)=\"focusControl()\" [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\" [step]=\"step\"\n        class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\n      }\n\n      <!-- URL Input -->\n      @if (type === 'url') {\n      <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\" [ngClass]=\"{\n                        'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n                        'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n                        'tw-pl-1': !leadingIcon,\n                        'tw-pr-8': trailingIconInternal,\n                        'tw-pr-1': !trailingIconInternal,\n                        'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n                        'tw-h-7': size === 'sm',\n                        '!tw-mt-0': labelHide,\n                        'tw-opacity-50 tw-cursor-not-allowed': disabled\n                    }\" [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\"\n        (focus)=\"focusControl()\" [autocomplete]=\"autocomplete\"\n        class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\n      }\n    </div>\n    <!-- error text / helper text -->\n    @if ((errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText) {\n    <span class=\"cide-input-help-error-text\">{{\n      isValid\n      ? helperText : (errorText ?\n      (isTouched ? errorText : helperText)\n      : helperText)}}\n    </span>\n    }\n  </div>\n  }\n\n  <!-- Input with tralling icon -->\n  <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\n        <div class=\"tw-w-fullh-full tw-relative\">\n            <label\n                class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\n            <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\n                <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\n            </span>\n            <input\n                class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\n                value=\"Ankush Bhure\" />\n        </div>\n    </div> -->\n\n  <!-- Input with leading icon -->\n  <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\n        <div class=\"tw-w-fullh-full tw-relative\">\n            <label\n                class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\n            <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\n                <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\n            </span>\n            <input\n                class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\n                value=\"Ankush Bhure\" />\n        </div>\n    </div> -->\n\n  <!------------------------------------------CHECKBOX------------------------------------------>\n  @if (type === 'checkbox') {\n  <div class=\"tw-flex\">\n    <div class=\"cide-checkbox tw-relative\">\n      <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\" [disabled]=\"disabled\"\n        class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\n        [autocomplete]=\"autocomplete\" />\n      <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\n        <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\n          <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\n            <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\n          </svg>\n        </span>\n        @if (!labelHide) {\n        <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\">{{label}}</span>\n        }\n      </label>\n      <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\n        <!-- Element hidden and its xpath is used to display inside SVG -->\n        <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\n          <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\n        </symbol>\n      </svg>\n    </div>\n  </div>\n  }\n\n  <!-------------------------------------------SELECT------------------------------------------->\n  @if (type === 'select') {\n  <div>sas\n    <div class=\"tw-relative\">\n      <div class=\"tw-absolute\">\n        @for (item of option; track $index) {\n        <div class=\"tw-w-full\">\n          {{item}}\n        </div>\n        }\n      </div>\n    </div>\n  </div>\n  }\n</div>\n\n<!-- Date Picker Template -->\n<ng-template #datePickerTemplate>\n  <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4\">\n    <!-- Date Picker Header -->\n    <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-4\">\n      <button type=\"button\" class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n        (click)=\"previousMonth()\">\n        <span class=\"material-symbols-outlined tw-text-base\">chevron_left</span>\n      </button>\n\n      <button type=\"button\"\n        class=\"tw-text-sm tw-font-medium tw-text-gray-800 hover:tw-bg-gray-100 tw-px-3 tw-py-1 tw-rounded-md tw-transition-colors\"\n        (click)=\"toggleMonthYearSelector()\">\n        {{ monthNames[currentMonth] }} {{ currentYear }}\n      </button>\n\n      <button type=\"button\" class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n        (click)=\"nextMonth()\">\n        <span class=\"material-symbols-outlined tw-text-base\">chevron_right</span>\n      </button>\n    </div>\n\n    <!-- Month/Year Selector -->\n    @if (showMonthYearSelector) {\n    <div class=\"tw-mb-4\">\n      <!-- Year Navigation -->\n      <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n        <button type=\"button\" class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n          (click)=\"previousYear()\">\n          <span class=\"material-symbols-outlined tw-text-base\">keyboard_double_arrow_left</span>\n        </button>\n        <span class=\"tw-text-sm tw-font-medium tw-text-gray-800\">{{ currentYear }}</span>\n        <button type=\"button\" class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n          (click)=\"nextYear()\">\n          <span class=\"material-symbols-outlined tw-text-base\">keyboard_double_arrow_right</span>\n        </button>\n      </div>\n\n      <!-- Month Grid -->\n      <div class=\"tw-grid tw-grid-cols-3 tw-gap-2 tw-mb-3\">\n        @for (monthName of shortMonthNames; track $index) {\n        <button type=\"button\" class=\"tw-px-3 tw-py-2 tw-text-sm tw-rounded-md tw-transition-colors tw-text-center\"\n          [class.tw-bg-blue-500]=\"$index === currentMonth\" [class.tw-text-white]=\"$index === currentMonth\"\n          [class.tw-text-gray-700]=\"$index !== currentMonth\" [class.hover:tw-bg-blue-50]=\"$index !== currentMonth\"\n          (click)=\"selectMonth($index)\">\n          {{ monthName }}\n        </button>\n        }\n      </div>\n\n      <!-- Back to Calendar Button -->\n      <div class=\"tw-text-center\">\n        <button type=\"button\"\n          class=\"tw-px-3 tw-py-1 tw-text-sm tw-text-blue-600 hover:tw-bg-blue-50 tw-rounded-md tw-transition-colors\"\n          (click)=\"toggleMonthYearSelector()\">\n          Back to Calendar\n        </button>\n      </div>\n    </div>\n    } @else {\n    <!-- Calendar View -->\n    <div>\n      <!-- Days of Week Header -->\n      <div class=\"tw-grid tw-grid-cols-7 tw-gap-1 tw-mb-2\">\n        @for (dayName of ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; track dayName) {\n        <div class=\"tw-text-center tw-text-xs tw-font-medium tw-text-gray-500 tw-py-2\">\n          {{ dayName }}\n        </div>\n        }\n      </div>\n\n      <!-- Calendar Days -->\n      <div class=\"tw-grid tw-grid-cols-7 tw-gap-1\">\n        @for (dayInfo of calendarDays; track dayInfo.date.getTime()) {\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-text-sm tw-rounded-md tw-transition-colors tw-flex tw-items-center tw-justify-center\"\n          [class.tw-text-gray-400]=\"!dayInfo.isCurrentMonth\" [class.tw-text-gray-900]=\"dayInfo.isCurrentMonth\"\n          [class.tw-bg-blue-500]=\"dayInfo.isSelected\" [class.tw-text-white]=\"dayInfo.isSelected\"\n          [class.tw-bg-blue-100]=\"dayInfo.isToday && !dayInfo.isSelected\"\n          [class.tw-text-blue-800]=\"dayInfo.isToday && !dayInfo.isSelected\"\n          [class.hover:tw-bg-blue-50]=\"dayInfo.isCurrentMonth && !dayInfo.isSelected\"\n          (click)=\"showDateTimePicker ? selectDateTimeDate(dayInfo) : selectDate(dayInfo)\">\n          {{ dayInfo.day }}\n        </button>\n        }\n      </div>\n    </div>\n    }\n\n    <!-- Date Picker Footer -->\n    <div class=\"tw-flex tw-justify-between tw-mt-3 tw-pt-2 tw-border-t tw-border-gray-200\">\n      <button type=\"button\"\n        class=\"tw-px-3 tw-py-1 tw-text-xs tw-font-medium tw-text-gray-600 hover:tw-bg-gray-100 tw-rounded tw-transition-colors\"\n        (click)=\"closeDatePicker()\">\n        Cancel\n      </button>\n      <button type=\"button\"\n        class=\"tw-px-3 tw-py-1 tw-text-xs tw-font-medium tw-bg-blue-600 tw-text-white hover:tw-bg-blue-700 tw-rounded tw-transition-colors\"\n        (click)=\"closeDatePicker()\">\n        Done\n      </button>\n    </div>\n  </div>\n</ng-template>\n\n<!-- Time Picker Template -->\n<ng-template #timePickerTemplate>\n  <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4 tw-w-72\">\n    <!-- Time Picker Header -->\n    <div class=\"tw-text-center tw-mb-3\">\n      <h3 class=\"tw-text-base tw-font-semibold tw-text-gray-800 tw-m-0\">Time</h3>\n    </div>\n\n    <!-- Time Spinners Container -->\n    <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\n      <!-- Hours -->\n      <div class=\"tw-flex tw-flex-col tw-items-center\">\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n          (click)=\"adjustTime('hours', 'up')\">\n          <span class=\"material-symbols-outlined tw-text-lg\">expand_less</span>\n        </button>\n        <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-12 tw-text-center\">\n          {{ timeHours }}\n        </div>\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n          (click)=\"adjustTime('hours', 'down')\">\n          <span class=\"material-symbols-outlined tw-text-lg\">expand_more</span>\n        </button>\n        <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">hour</span>\n      </div>\n\n      <!-- Colon Separator -->\n      <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-mb-4\">:</div>\n\n      <!-- Minutes -->\n      <div class=\"tw-flex tw-flex-col tw-items-center\">\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n          (click)=\"adjustTime('minutes', 'up')\">\n          <span class=\"material-symbols-outlined tw-text-lg\">expand_less</span>\n        </button>\n        <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-12 tw-text-center\">\n          {{ timeMinutes.toString().padStart(2, '0') }}\n        </div>\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n          (click)=\"adjustTime('minutes', 'down')\">\n          <span class=\"material-symbols-outlined tw-text-lg\">expand_more</span>\n        </button>\n        <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">min</span>\n      </div>\n\n      <!-- Colon Separator -->\n      <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-mb-4\">:</div>\n\n      <!-- Seconds -->\n      <div class=\"tw-flex tw-flex-col tw-items-center\">\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n          (click)=\"adjustTime('seconds', 'up')\">\n          <span class=\"material-symbols-outlined tw-text-lg\">expand_less</span>\n        </button>\n        <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-12 tw-text-center\">\n          {{ timeSeconds.toString().padStart(2, '0') }}\n        </div>\n        <button type=\"button\"\n          class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n          (click)=\"adjustTime('seconds', 'down')\">\n          <span class=\"material-symbols-outlined tw-text-lg\">expand_more</span>\n        </button>\n        <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">sec</span>\n      </div>\n    </div>\n\n    <!-- AM/PM Toggle -->\n    <div class=\"tw-flex tw-justify-center tw-mb-3\">\n      <div class=\"tw-inline-flex tw-rounded-md tw-bg-gray-100 tw-p-0.5\">\n        <button type=\"button\"\n          class=\"tw-px-4 tw-py-1.5 tw-text-sm tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\n          [class.tw-bg-white]=\"timeFormat === 'AM'\" [class.tw-text-gray-800]=\"timeFormat === 'AM'\"\n          [class.tw-shadow]=\"timeFormat === 'AM'\" [class.tw-text-gray-600]=\"timeFormat !== 'AM'\"\n          (click)=\"timeFormat = 'AM'\">\n          AM\n        </button>\n        <button type=\"button\"\n          class=\"tw-px-4 tw-py-1.5 tw-text-sm tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\n          [class.tw-bg-white]=\"timeFormat === 'PM'\" [class.tw-text-gray-800]=\"timeFormat === 'PM'\"\n          [class.tw-shadow]=\"timeFormat === 'PM'\" [class.tw-text-gray-600]=\"timeFormat !== 'PM'\"\n          (click)=\"timeFormat = 'PM'\">\n          PM\n        </button>\n      </div>\n    </div>\n\n    <!-- Current Time Display -->\n    <div class=\"tw-text-center tw-mb-3\">\n      <span class=\"tw-text-sm tw-text-gray-600\">\n        {{ timeHours }}:{{ timeMinutes.toString().padStart(2, '0') }}:{{ timeSeconds.toString().padStart(2, '0') }} {{\n        timeFormat }}\n      </span>\n    </div>\n\n    <!-- Time Picker Footer -->\n    <div class=\"tw-flex tw-gap-2\">\n      <button type=\"button\"\n        class=\"tw-flex-1 tw-px-3 tw-py-1.5 tw-text-xs tw-font-medium tw-text-gray-700 tw-bg-white tw-border tw-border-gray-300 hover:tw-bg-gray-50 tw-rounded tw-transition-colors\"\n        (click)=\"showDateTimePicker ? closeDateTimePicker() : closeTimePicker()\">\n        Cancel\n      </button>\n      <button type=\"button\"\n        class=\"tw-flex-1 tw-px-3 tw-py-1.5 tw-text-xs tw-font-medium tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700 tw-rounded tw-transition-colors tw-border-0\"\n        (click)=\"showDateTimePicker ? applyDateTime() : applyTime()\">\n        OK\n      </button>\n    </div>\n\n  </div>\n</ng-template>\n\n<!-- DateTime Picker Template (Combined Date + Time) -->\n<ng-template #dateTimePickerTemplate>\n  <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4\">\n    <!-- DateTime Picker Header -->\n    <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-4\">\n      <button type=\"button\" class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n        (click)=\"previousMonth()\">\n        <span class=\"material-symbols-outlined tw-text-base\">chevron_left</span>\n      </button>\n\n      <button type=\"button\"\n        class=\"tw-text-sm tw-font-medium tw-text-gray-800 hover:tw-bg-gray-100 tw-px-3 tw-py-1 tw-rounded-md tw-transition-colors\"\n        (click)=\"toggleMonthYearSelector()\">\n        {{ monthNames[currentMonth] }} {{ currentYear }}\n      </button>\n\n      <button type=\"button\" class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n        (click)=\"nextMonth()\">\n        <span class=\"material-symbols-outlined tw-text-base\">chevron_right</span>\n      </button>\n    </div>\n\n    <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\n      <!-- Left Side: Calendar -->\n      <div>\n        <!-- Month/Year Selector -->\n        @if (showMonthYearSelector) {\n        <div class=\"tw-mb-4\">\n          <!-- Year Navigation -->\n          <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n            <button type=\"button\"\n              class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n              (click)=\"previousYear()\">\n              <span class=\"material-symbols-outlined tw-text-base\">keyboard_double_arrow_left</span>\n            </button>\n            <span class=\"tw-text-sm tw-font-medium tw-text-gray-800\">{{ currentYear }}</span>\n            <button type=\"button\"\n              class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n              (click)=\"nextYear()\">\n              <span class=\"material-symbols-outlined tw-text-base\">keyboard_double_arrow_right</span>\n            </button>\n          </div>\n\n          <!-- Month Grid -->\n          <div class=\"tw-grid tw-grid-cols-3 tw-gap-2 tw-mb-3\">\n            @for (monthName of shortMonthNames; track $index) {\n            <button type=\"button\" class=\"tw-px-2 tw-py-1.5 tw-text-xs tw-rounded-md tw-transition-colors tw-text-center\"\n              [class.tw-bg-blue-500]=\"$index === currentMonth\" [class.tw-text-white]=\"$index === currentMonth\"\n              [class.tw-text-gray-700]=\"$index !== currentMonth\" [class.hover:tw-bg-blue-50]=\"$index !== currentMonth\"\n              (click)=\"selectMonth($index)\">\n              {{ monthName }}\n            </button>\n            }\n          </div>\n\n          <!-- Back to Calendar Button -->\n          <div class=\"tw-text-center\">\n            <button type=\"button\"\n              class=\"tw-px-3 tw-py-1 tw-text-xs tw-text-blue-600 hover:tw-bg-blue-50 tw-rounded-md tw-transition-colors\"\n              (click)=\"toggleMonthYearSelector()\">\n              Back to Calendar\n            </button>\n          </div>\n        </div>\n        } @else {\n        <!-- Calendar View -->\n        <div>\n          <!-- Days of Week Header -->\n          <div class=\"tw-grid tw-grid-cols-7 tw-gap-1 tw-mb-2\">\n            @for (dayName of ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; track dayName) {\n            <div class=\"tw-text-center tw-text-xs tw-font-medium tw-text-gray-500 tw-py-1\">\n              {{ dayName }}\n            </div>\n            }\n          </div>\n\n          <!-- Calendar Days -->\n          <div class=\"tw-grid tw-grid-cols-7 tw-gap-1\">\n            @for (dayInfo of calendarDays; track dayInfo.date.getTime()) {\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-text-xs tw-rounded-md tw-transition-colors tw-flex tw-items-center tw-justify-center\"\n              [class.tw-text-gray-400]=\"!dayInfo.isCurrentMonth\" [class.tw-text-gray-900]=\"dayInfo.isCurrentMonth\"\n              [class.tw-bg-blue-500]=\"dayInfo.isSelected\" [class.tw-text-white]=\"dayInfo.isSelected\"\n              [class.tw-bg-blue-100]=\"dayInfo.isToday && !dayInfo.isSelected\"\n              [class.tw-text-blue-800]=\"dayInfo.isToday && !dayInfo.isSelected\"\n              [class.hover:tw-bg-blue-50]=\"dayInfo.isCurrentMonth && !dayInfo.isSelected\"\n              (click)=\"selectDateTimeDate(dayInfo)\">\n              {{ dayInfo.day }}\n            </button>\n            }\n          </div>\n        </div>\n        }\n      </div>\n\n      <!-- Right Side: Time Picker -->\n      <div class=\"tw-border-l tw-border-gray-200 tw-pl-4\">\n        <div class=\"tw-text-center tw-mb-2\">\n          <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-800 tw-m-0\">Time</h4>\n        </div>\n\n        <!-- Time Spinners -->\n        <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-mb-3\">\n          <!-- Hours -->\n          <div class=\"tw-flex tw-flex-col tw-items-center\">\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n              (click)=\"adjustTime('hours', 'up')\">\n              <span class=\"material-symbols-outlined tw-text-base\">expand_less</span>\n            </button>\n            <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-10 tw-text-center\">\n              {{ timeHours }}\n            </div>\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n              (click)=\"adjustTime('hours', 'down')\">\n              <span class=\"material-symbols-outlined tw-text-base\">expand_more</span>\n            </button>\n            <span class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">hour</span>\n          </div>\n\n          <!-- Colon -->\n          <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-mb-3\">:</div>\n\n          <!-- Minutes -->\n          <div class=\"tw-flex tw-flex-col tw-items-center\">\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n              (click)=\"adjustTime('minutes', 'up')\">\n              <span class=\"material-symbols-outlined tw-text-base\">expand_less</span>\n            </button>\n            <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-10 tw-text-center\">\n              {{ timeMinutes.toString().padStart(2, '0') }}\n            </div>\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n              (click)=\"adjustTime('minutes', 'down')\">\n              <span class=\"material-symbols-outlined tw-text-base\">expand_more</span>\n            </button>\n            <span class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">min</span>\n          </div>\n\n          <!-- Colon -->\n          <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-mb-3\">:</div>\n\n          <!-- Seconds -->\n          <div class=\"tw-flex tw-flex-col tw-items-center\">\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n              (click)=\"adjustTime('seconds', 'up')\">\n              <span class=\"material-symbols-outlined tw-text-base\">expand_less</span>\n            </button>\n            <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-10 tw-text-center\">\n              {{ timeSeconds.toString().padStart(2, '0') }}\n            </div>\n            <button type=\"button\"\n              class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n              (click)=\"adjustTime('seconds', 'down')\">\n              <span class=\"material-symbols-outlined tw-text-base\">expand_more</span>\n            </button>\n            <span class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">sec</span>\n          </div>\n        </div>\n\n        <!-- AM/PM Toggle -->\n        <div class=\"tw-flex tw-justify-center tw-mb-2\">\n          <div class=\"tw-inline-flex tw-rounded-md tw-bg-gray-100 tw-p-0.5\">\n            <button type=\"button\"\n              class=\"tw-px-3 tw-py-1 tw-text-xs tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\n              [class.tw-bg-white]=\"timeFormat === 'AM'\" [class.tw-text-gray-800]=\"timeFormat === 'AM'\"\n              [class.tw-shadow-sm]=\"timeFormat === 'AM'\" [class.tw-text-gray-600]=\"timeFormat !== 'AM'\"\n              (click)=\"timeFormat = 'AM'\">\n              AM\n            </button>\n            <button type=\"button\"\n              class=\"tw-px-3 tw-py-1 tw-text-xs tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\n              [class.tw-bg-white]=\"timeFormat === 'PM'\" [class.tw-text-gray-800]=\"timeFormat === 'PM'\"\n              [class.tw-shadow-sm]=\"timeFormat === 'PM'\" [class.tw-text-gray-600]=\"timeFormat !== 'PM'\"\n              (click)=\"timeFormat = 'PM'\">\n              PM\n            </button>\n          </div>\n        </div>\n\n        <!-- Current Time Display -->\n        <div class=\"tw-text-center tw-text-xs tw-text-gray-600\">\n          {{ timeHours }}:{{ timeMinutes.toString().padStart(2, '0') }}:{{ timeSeconds.toString().padStart(2, '0') }} {{\n          timeFormat }}\n        </div>\n      </div>\n    </div>\n\n    <!-- DateTime Picker Footer -->\n    <div class=\"tw-flex tw-gap-2 tw-mt-3 tw-pt-2 tw-border-t tw-border-gray-200\">\n      <button type=\"button\"\n        class=\"tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-text-blue-600 tw-bg-white tw-border tw-border-blue-300 hover:tw-bg-blue-50 tw-rounded tw-transition-colors\"\n        (click)=\"setCurrentDateTime()\">\n        Now\n      </button>\n      <button type=\"button\"\n        class=\"tw-flex-1 tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-text-gray-700 tw-bg-white tw-border tw-border-gray-300 hover:tw-bg-gray-50 tw-rounded tw-transition-colors\"\n        (click)=\"closeDateTimePicker()\">\n        Cancel\n      </button>\n      <button type=\"button\"\n        class=\"tw-flex-1 tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700 tw-rounded tw-transition-colors tw-border-0\"\n        (click)=\"applyDateTime()\">\n        OK\n      </button>\n    </div>\n  </div>\n</ng-template>","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ContentChildren, QueryList, AfterContentInit, ElementRef, ViewChild, OnDestroy, TemplateRef, ViewContainerRef, inject, input, effect, ChangeDetectorRef, forwardRef } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, ValidationErrors, Validator, NgControl, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType, selectSearchType } from 'cloud-ide-lms-model';\nimport { PortalService } from '../../services/portal.service';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\n\nexport interface SelectOption {\n  value: string | number;\n  label: string;\n  disabled?: boolean;\n}\n\n// Extended interface for object-based options\nexport interface SelectOptionObject {\n  [key: string]: any;\n  disabled?: boolean;\n}\n\n@Component({\n  selector: 'cide-ele-select-option',\n  standalone: true,\n  template: '<ng-content></ng-content>'\n})\nexport class CideSelectOptionComponent {\n  @Input() value: string | number = '';\n  @Input() disabled: boolean = false;\n\n  get label(): string {\n    return this.elementRef?.nativeElement?.textContent?.trim() || '';\n  }\n\n  constructor(private elementRef: ElementRef) { }\n}\n\n@Component({\n  selector: 'cide-ele-select',\n  standalone: true,\n  templateUrl: './select.component.html',\n  styleUrl: './select.component.scss',\n  imports: [CommonModule, FormsModule],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => CideSelectComponent),\n      multi: true\n    },\n    {\n      provide: NG_VALIDATORS,\n      multi: true,\n      useExisting: forwardRef(() => CideSelectComponent),\n    }\n  ]\n})\nexport class CideSelectComponent implements ControlValueAccessor, Validator, OnInit, OnChanges, AfterContentInit, OnDestroy {\n  @ContentChildren(CideSelectOptionComponent) optionComponents!: QueryList<CideSelectOptionComponent>;\n  @ViewChild('searchInput', { static: false }) searchInputRef!: ElementRef<HTMLInputElement>;\n\n  // Input signals\n  label = input<string>('');\n  labelHide = input<boolean>(false);\n  placeholder = input<string>('Select an option');\n  helperText = input<string>('');\n  errorText = input<string>('');\n  required = input<boolean>(false);\n  disabled = input<boolean>(false);\n  id = input<string>('');\n\n  // ngModel with @Input() for two-way binding support\n  private _ngModel: string | number | string[] = '';\n\n  @Input()\n  get ngModel(): string | number | string[] {\n    return this._ngModel;\n  }\n\n  set ngModel(value: string | number | string[]) {\n    if (this._ngModel !== value) {\n      this._ngModel = value;\n      // Update internal state and validate\n      this.validateValue(value);\n      // Note: We don't emit ngModelChange here to avoid double emissions\n      // The emission happens in selectOption() and clearSelection() when user interacts\n    }\n  }\n\n  size = input<themeSize>('md');\n  fill = input<elementStyleType>('outline');\n  labelPlacement = input<labelPlacementType>('floating');\n  labelDir = input<labelDirType>('start');\n  leadingIcon = input<string>('');\n  trailingIcon = input<string>('');\n  clearInput = input<boolean>(false);\n  options = input<(SelectOption | SelectOptionObject)[]>([]);\n  multiple = input<boolean>(false);\n  searchable = input<boolean>(false);\n  showSearchInput = input<boolean>(true);\n  loading = input<boolean>(false);\n\n  /** \n   * Key to extract the value from option objects. \n   * Default: 'value'. Use when options are objects with custom property names.\n   * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set valueKey = 'id'\n   */\n  valueKey = input<string>('value');\n\n  /** \n   * Key to extract the label from option objects. \n   * Default: 'label'. Use when options are objects with custom property names.\n   * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set labelKey = 'name'\n   */\n  labelKey = input<string>('label');\n\n  /**\n   * Tree/Hierarchy configuration for displaying options in a tree structure\n   * When enabled, options will be displayed with indentation and tree connectors\n   */\n  treeView = input<{\n    enabled: boolean;\n    primaryKey?: string; // Key for unique identifier (default: 'value' or valueKey)\n    foreignKey?: string; // Key for parent reference (e.g., 'parentId')\n    levelKey?: string; // Key to store level (default: 'level')\n  } | null>(null);\n\n  @Output() ngModelChange = new EventEmitter<string | number | string[]>();\n  // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n  @Output('change') selectionChange = new EventEmitter<any>();\n  @Output() searchChange = new EventEmitter<selectSearchType>();\n\n  isOpen: boolean = false;\n  isTouched = false;\n  isValid = true;\n  searchTerm: string = '';\n  filteredOptions: (SelectOption | SelectOptionObject)[] = [];\n  private searchDebounceTimeout: ReturnType<typeof setTimeout> | null = null;\n  private searchSubject = new Subject<string>();\n  private destroy$ = new Subject<void>();\n  private isUpdatingOptions: boolean = false;\n\n  // Portal-related properties\n  private portalService = inject(PortalService);\n  private dropdownPortalId: string = '';\n  @ViewChild('dropdownTemplate', { static: false }) dropdownTemplate!: TemplateRef<any>;\n  @ViewChild('dropdownContainer', { read: ViewContainerRef, static: false }) dropdownContainer!: ViewContainerRef;\n  dropdownPosition: 'bottom' | 'top' = 'bottom';\n  private isDropdownInteraction = false;\n  dropdownWidthConstraints: { minWidth: number; maxWidth: number } = { minWidth: 200, maxWidth: 400 };\n\n  // Debug tracking properties\n  private debugId = Math.random().toString(36).substr(2, 9);\n  private timeoutIds: ReturnType<typeof setTimeout>[] = [];\n  private interactionCount = 0;\n  private maxInteractionCount = 10; // Prevent infinite loops\n\n  constructor(private elementRef: ElementRef) {\n    // Watch for options changes (input signal) - effects must be in constructor\n    effect(() => {\n      const opts = this.options();\n      if (opts && opts.length >= 0) {\n        this.filterOptions();\n        // Update portal context if dropdown is open\n        if (this.isOpen && this.dropdownPortalId) {\n          setTimeout(() => {\n            this.updatePortalContext();\n          }, 0);\n        }\n      }\n    });\n\n    // Watch for loading changes\n    effect(() => {\n      const loading = this.loading();\n      if (this.isOpen && this.dropdownPortalId) {\n        setTimeout(() => {\n          this.updatePortalContext();\n        }, 0);\n      }\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  onChange = (value: string | number) => { };\n  onTouched = () => { };\n  onValidate = () => { };\n\n  ngOnInit(): void {\n    // Process options through filterOptions to build tree structure if needed\n    this.filterOptions();\n    this.validateValue(this.ngModel);\n    console.log(`🔍 SELECT [${this.debugId}] Initialized with ${this.options().length} options`);\n    window.addEventListener('resize', this.onWindowResize.bind(this));\n\n    // Setup debounced search\n    this.setupDebouncedSearch();\n  }\n\n  ngAfterContentInit(): void {\n    if (this.options().length === 0 && this.optionComponents) {\n      // Note: Cannot directly assign to input signal, options should be set from parent\n      // This code path may need to be handled differently\n      console.warn('Options should be provided via input signal, not set in ngAfterContentInit');\n    }\n    console.log(`🔍 SELECT [${this.debugId}] After content init with ${this.options().length} options`);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Only handle ngModel changes (still a regular property for ControlValueAccessor)\n    if (changes['ngModel']) {\n      this.validateValue(this.ngModel);\n      if (!this.options().find(option => this.getOptionValue(option) === this.ngModel)) {\n        this.searchChange.emit({\n          query: \"\",\n          value: this.ngModel as string | number // emit raw value for external handlers\n        });\n      }\n    }\n    // Note: options and loading changes are now handled by effect() in ngOnInit\n  }\n\n  writeValue(value: string | number | string[]): void {\n    // Only update if value actually changed to avoid infinite loops\n    if (this._ngModel !== value) {\n      this._ngModel = value;\n      if (this.searchable()) {\n        this.searchChange.emit({\n          query: \"\",\n          value: value as string | number // emit raw value for external handlers\n        });\n      }\n      this.validateValue(value);\n    }\n  }\n\n  registerOnChange(fn: (value: string | number) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    // Note: Cannot directly set input signal, this should be handled by parent component\n    // For ControlValueAccessor compatibility, we'll track disabled state separately\n    this._disabledState = isDisabled;\n  }\n\n  // Internal disabled state for ControlValueAccessor\n  private _disabledState: boolean = false;\n\n  // Getter to check disabled state (checks both input signal and internal state)\n  isDisabled(): boolean {\n    return this.disabled() || this._disabledState;\n  }\n\n  validate(control: AbstractControl): ValidationErrors | null {\n    return this.validateValue(control.value);\n  }\n\n  validateValue(value: string | number | string[]): ValidationErrors | null {\n    if (this.required()) {\n      const isEmpty = (v: unknown) => {\n        if (v === null || v === undefined) return true;\n        if (typeof v === 'string') return v.trim() === '';\n        if (Array.isArray(v)) return v.length === 0;\n        return false;\n      };\n      if (isEmpty(value)) {\n        this.isValid = false;\n        return { required: 'This field is required' };\n      }\n    }\n    this.isValid = true;\n    return null;\n  }\n\n  toggleDropdown(): void {\n    try {\n      this.logDebug('toggleDropdown called', { disabled: this.isDisabled(), isOpen: this.isOpen });\n      if (!this.isDisabled()) {\n        if (this.isOpen) {\n          this.closeDropdown();\n        } else {\n          this.openDropdown();\n        }\n      } else {\n        this.logDebug('Dropdown toggle blocked - component disabled');\n      }\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] toggleDropdown error:`, error);\n      this.isOpen = false;\n      this.closeDropdown(); // Close the portal on error\n      this.isDropdownInteraction = false;\n      this.interactionCount = 0;\n    }\n  }\n\n  private openDropdown(): void {\n    this.isOpen = true;\n    this.logDebug('Opening dropdown with portal');\n\n    // Clean up any orphaned portals before creating new one\n    this.cleanupOrphanedPortals();\n\n    this.calculateDropdownPosition();\n    this.focusControl();\n    this.searchTerm = '';\n    this.filterOptions();\n    this.createDropdownPortal();\n    this.logDebug('Dropdown opened, search term reset');\n  }\n\n  private closeDropdown(): void {\n    this.isOpen = false;\n    this.isDropdownInteraction = false;\n    this.interactionCount = 0;\n    this.logDebug('Closing dropdown portal');\n    this.destroyDropdownPortal();\n    this.logDebug('Dropdown closed, interaction flags reset');\n  }\n\n  // Cleanup method to prevent memory leaks\n  ngOnDestroy(): void {\n    this.clearTimeouts();\n    // Clear search debounce timeout\n    if (this.searchDebounceTimeout) {\n      clearTimeout(this.searchDebounceTimeout);\n      this.searchDebounceTimeout = null;\n    }\n\n    // Complete subjects to prevent memory leaks\n    this.destroy$.next();\n    this.destroy$.complete();\n    this.searchSubject.complete();\n\n    // Destroy dropdown portal\n    this.destroyDropdownPortal();\n\n    // Clean up any remaining portals from this component\n    console.log('🔍 Cleaning up all portals on destroy');\n    const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\n    console.log('🔍 Found portals to clean up:', allPortals.length);\n    allPortals.forEach(portal => {\n      const portalId = portal.getAttribute('id');\n      if (portalId) {\n        console.log('🔍 Cleaning up portal:', portalId);\n        this.portalService.destroyPortal(portalId);\n      }\n    });\n\n    window.removeEventListener('resize', this.onWindowResize.bind(this));\n    this.logDebug('Component destroyed, timeouts cleared');\n  }\n\n  private createDropdownPortal(): void {\n    try {\n      const triggerElement = this.elementRef?.nativeElement;\n      if (!triggerElement || !this.dropdownTemplate || !this.dropdownContainer) {\n        this.logDebug('Cannot create portal - missing elements');\n        return;\n      }\n\n      // Ensure filteredOptions is properly initialized\n      if (!this.filteredOptions || this.filteredOptions.length === 0) {\n        this.filterOptions(); // Make sure filteredOptions is populated\n      }\n\n      // Generate unique portal ID\n      this.dropdownPortalId = `select-dropdown-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n      console.log('🔍 Creating new portal with ID:', this.dropdownPortalId);\n\n      const portalConfig = {\n        triggerElement,\n        template: this.dropdownTemplate,\n        viewContainerRef: this.dropdownContainer,\n        context: {\n          options: this.filteredOptions,\n          isOpen: this.isOpen,\n          searchTerm: this.searchTerm,\n          searchable: this.searchable(),\n          multiple: this.multiple(),\n          loading: this.loading(),\n          dropdownPosition: this.dropdownPosition,\n          treeView: this.treeView(),\n          onSearchInput: this.onSearchInput.bind(this),\n          selectOption: this.selectOption.bind(this),\n          isOptionSelected: this.isOptionSelected.bind(this),\n          trackByValue: this.trackByValue.bind(this),\n          getOptionLabel: this.getOptionLabel.bind(this)\n        },\n        className: 'cide-select-dropdown-portal',\n        position: this.dropdownPosition,\n        align: 'left' as const,\n        offsetX: 0,\n        offsetY: 5,\n        maxHeight: 250,\n        minWidth: this.dropdownWidthConstraints.minWidth,\n        maxWidth: this.dropdownWidthConstraints.maxWidth,\n        closeOnClickOutside: true,\n        closeOnEscape: true\n      };\n\n      // Create the template portal\n      this.portalService.createTemplatePortal(this.dropdownPortalId, portalConfig);\n\n      // Register close callback\n      this.portalService.registerCloseCallback(this.dropdownPortalId, () => {\n        this.closeDropdown();\n      });\n\n      // Set data attribute for click outside detection\n      triggerElement.setAttribute('data-portal-trigger', this.dropdownPortalId);\n\n      this.logDebug('Dropdown portal created', {\n        portalId: this.dropdownPortalId,\n        filteredOptionsCount: this.filteredOptions.length,\n        allOptionsCount: this.options().length\n      });\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] createDropdownPortal error:`, error);\n    }\n  }\n\n  private destroyDropdownPortal(): void {\n    try {\n      if (this.dropdownPortalId) {\n        console.log('🔍 Destroying portal with ID:', this.dropdownPortalId);\n        this.portalService.destroyPortal(this.dropdownPortalId);\n        this.dropdownPortalId = '';\n        this.logDebug('Dropdown portal destroyed');\n        console.log('🔍 Portal destroyed, remaining portals:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\n      }\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] destroyDropdownPortal error:`, error);\n    }\n  }\n\n  private updatePortalContext(): void {\n    try {\n      if (!this.dropdownPortalId) {\n        return; // Portal not created yet\n      }\n\n      // Set flag to prevent blur during update\n      this.isUpdatingOptions = true;\n\n      // Store reference to search input before destroying portal\n      console.log('🔍 Looking for search input with portal ID:', this.dropdownPortalId);\n      const searchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\n      console.log('🔍 searchInput found:', searchInput);\n\n      // Try alternative selectors if the first one fails\n      let searchInputAlt = null;\n      if (!searchInput) {\n        searchInputAlt = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\n        console.log('🔍 searchInputAlt found:', searchInputAlt);\n      }\n\n      const finalSearchInput = searchInput || searchInputAlt;\n      const wasSearchInputFocused = finalSearchInput && document.activeElement === finalSearchInput;\n      const searchInputValue = finalSearchInput ? finalSearchInput.value : '';\n      const cursorPosition = finalSearchInput ? finalSearchInput.selectionStart || 0 : 0;\n\n      // Since the portal service doesn't have an update context method,\n      // we need to recreate the portal with updated context\n      this.destroyDropdownPortal();\n      this.createDropdownPortal();\n\n      // Restore focus and value to search input after recreation\n      if (wasSearchInputFocused && searchInputValue) {\n        // Use multiple timing strategies to ensure focus restoration works\n        const restoreFocus = () => {\n          let newSearchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\n          console.log('🔍 newSearchInput', newSearchInput);\n\n          // Try alternative selectors if the first one fails\n          if (!newSearchInput) {\n            newSearchInput = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\n            console.log('🔍 newSearchInputAlt', newSearchInput);\n          }\n\n          if (newSearchInput) {\n            newSearchInput.value = searchInputValue;\n            newSearchInput.focus();\n            // Set cursor position to the original position\n            newSearchInput.setSelectionRange(cursorPosition, cursorPosition);\n            return true;\n          }\n          return false;\n        };\n\n        // Try immediate restoration\n        if (!restoreFocus()) {\n          // Try with requestAnimationFrame\n          requestAnimationFrame(() => {\n            if (!restoreFocus()) {\n              // Try with setTimeout as fallback\n              setTimeout(() => {\n                restoreFocus();\n                // Clear the flag after restoration\n                this.isUpdatingOptions = false;\n              }, 10);\n            } else {\n              // Clear the flag after successful restoration\n              this.isUpdatingOptions = false;\n            }\n          });\n        } else {\n          // Clear the flag after successful restoration\n          this.isUpdatingOptions = false;\n        }\n      } else {\n        // Clear the flag if no focus restoration needed\n        this.isUpdatingOptions = false;\n      }\n\n      this.logDebug('Portal context updated', {\n        filteredOptionsCount: this.filteredOptions.length,\n        searchTerm: this.searchTerm\n      });\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] updatePortalContext error:`, error);\n      this.isUpdatingOptions = false;\n    }\n  }\n\n  private updateOptionsInDOM(): boolean {\n    try {\n      if (!this.dropdownPortalId) {\n        return false; // Portal not created yet\n      }\n\n      // Find the options container in the DOM\n      console.log('🔍 Looking for options container with portal ID:', this.dropdownPortalId);\n      let optionsContainer = document.querySelector(`#${this.dropdownPortalId} .tw-py-1`);\n      console.log('🔍 optionsContainer (.tw-py-1):', optionsContainer);\n\n      // Try alternative selectors if the first one fails\n      if (!optionsContainer) {\n        optionsContainer = document.querySelector(`#${this.dropdownPortalId}`);\n        console.log('🔍 optionsContainer (main):', optionsContainer);\n      }\n\n      if (!optionsContainer) {\n        optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] .tw-py-1`);\n        console.log('🔍 optionsContainer (alt .tw-py-1):', optionsContainer);\n      }\n\n      if (!optionsContainer) {\n        optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"]`);\n        console.log('🔍 optionsContainer (alt main):', optionsContainer);\n      }\n\n      if (!optionsContainer) {\n        console.log('🔍 No options container found, returning false');\n        return false;\n      }\n\n      console.log('🔍 optionsContainer found, clearing and updating with', this.filteredOptions.length, 'options');\n      console.log('🔍 Current optionsContainer HTML before clear:', optionsContainer.innerHTML);\n\n      // Find and clear only the option buttons and loading states, not the entire container\n      const existingOptions = optionsContainer.querySelectorAll('.cide-select-option, .tw-px-3.tw-py-2, .tw-px-3.tw-py-4');\n      console.log('🔍 Found existing options to remove:', existingOptions.length);\n      existingOptions.forEach(option => option.remove());\n\n      // Add filtered options directly to DOM\n      this.filteredOptions.forEach((option) => {\n        const button = document.createElement('button');\n        button.type = 'button';\n        button.className = `cide-select-option tw-w-full tw-text-left tw-px-3 tw-py-2 tw-text-sm tw-cursor-pointer tw-transition-colors hover:tw-bg-gray-100 tw-border-none tw-bg-transparent tw-outline-none ${this.isOptionSelected(option) ? 'tw-bg-blue-50 tw-text-blue-700' : ''\n          } ${option.disabled ? 'tw-text-gray-400 tw-cursor-not-allowed' : ''}`;\n        button.textContent = this.getOptionLabel(option);\n        button.disabled = option.disabled || false;\n\n        // Add event listeners\n        button.addEventListener('mousedown', (e) => {\n          e.preventDefault(); // Prevent blur from closing dropdown before click\n          this.onDropdownMouseDown();\n        });\n        button.addEventListener('click', (e) => {\n          e.preventDefault();\n          e.stopPropagation();\n          this.selectOption(option);\n        });\n        button.addEventListener('keyup', (e) => {\n          if (e.key === 'Enter' || e.key === ' ') {\n            e.preventDefault();\n            this.selectOption(option);\n          }\n        });\n\n        optionsContainer.appendChild(button);\n      });\n\n      // Add \"No options\" message if no options\n      if (this.filteredOptions.length === 0) {\n        const noOptionsDiv = document.createElement('div');\n        noOptionsDiv.className = 'tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic';\n        noOptionsDiv.textContent = this.searchable() && this.searchTerm ? 'No options found' : 'No options available';\n        optionsContainer.appendChild(noOptionsDiv);\n      }\n\n      console.log('🔍 Options added, final optionsContainer HTML:', optionsContainer.innerHTML);\n      console.log('🔍 Number of child elements in optionsContainer:', optionsContainer.children.length);\n\n      this.logDebug('Options updated directly in DOM', {\n        filteredOptionsCount: this.filteredOptions.length,\n        searchTerm: this.searchTerm\n      });\n\n      return true; // Success\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] updateOptionsInDOM error:`, error);\n      return false; // Failed\n    }\n  }\n\n  private setupDebouncedSearch(): void {\n    this.searchSubject\n      .pipe(\n        debounceTime(300), // 300ms debounce\n        distinctUntilChanged((prev, curr) => {\n          // Custom comparison to ensure empty strings are always emitted\n          return prev === curr;\n        }),\n        takeUntil(this.destroy$)\n      )\n      .subscribe(searchTerm => {\n        console.log(`🔍 SELECT [${this.debugId}] Debounced search triggered:`, `\"${searchTerm}\"`);\n        this.performSearch(searchTerm);\n      });\n  }\n\n  private performSearch(searchTerm: string): void {\n    const queryValue = searchTerm || '';\n\n    console.log(`🔍 SELECT [${this.debugId}] About to emit search:`, `query=\"${queryValue}\"`);\n\n    // Emit search change event for external API calls\n    // Note: selectSearchType interface requires both query and value\n    this.searchChange.emit({\n      query: queryValue,\n      value: '' // Empty value since this is just a search, not a selection\n    });\n\n    console.log(`🔍 SELECT [${this.debugId}] Search emitted successfully:`, `query=\"${queryValue}\"`);\n  }\n\n  private cleanupOrphanedPortals(): void {\n    try {\n      console.log('🔍 Cleaning up orphaned portals');\n      const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\n      console.log('🔍 Found portals before cleanup:', allPortals.length);\n\n      allPortals.forEach(portal => {\n        const portalId = portal.getAttribute('id');\n        if (portalId && portalId !== this.dropdownPortalId) {\n          console.log('🔍 Cleaning up orphaned portal:', portalId);\n          this.portalService.destroyPortal(portalId);\n        }\n      });\n\n      console.log('🔍 Orphaned portals cleaned up');\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] cleanupOrphanedPortals error:`, error);\n    }\n  }\n\n  private onWindowResize(): void {\n    if (this.isOpen) {\n      this.calculateDropdownPosition();\n    }\n  }\n\n  private calculateDropdownPosition(): void {\n    try {\n      const element = this.elementRef?.nativeElement;\n      if (!element) {\n        this.dropdownPosition = 'bottom';\n        console.log('No element found, defaulting to bottom');\n        return;\n      }\n      const rect = element.getBoundingClientRect();\n      const viewportHeight = window.innerHeight;\n      const viewportWidth = window.innerWidth;\n      const dropdownHeight = Math.min(this.options().length * 40 + 100, 250);\n      const spaceBelow = viewportHeight - rect.bottom;\n      const spaceAbove = rect.top;\n      const buffer = 30;\n\n      // Calculate dropdown width constraints\n      const triggerWidth = rect.width;\n      const maxDropdownWidth = Math.min(triggerWidth * 2, viewportWidth * 0.8); // Max 2x trigger width or 80% of viewport\n      const minDropdownWidth = Math.max(triggerWidth, 200); // At least trigger width or 200px\n\n      // Store width constraints for portal creation\n      this.dropdownWidthConstraints = {\n        minWidth: minDropdownWidth,\n        maxWidth: maxDropdownWidth\n      };\n\n      if (spaceBelow < (dropdownHeight + buffer) && spaceAbove > dropdownHeight) {\n        this.dropdownPosition = 'top';\n      } else {\n        this.dropdownPosition = 'bottom';\n      }\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] calculateDropdownPosition error:`, error);\n      this.dropdownPosition = 'bottom';\n    }\n  }\n\n  selectOption(option: SelectOption | SelectOptionObject): void {\n    try {\n      this.logDebug('selectOption called', { option, disabled: option.disabled, multiple: this.multiple() });\n      if (option.disabled) return;\n\n      const optionValue = this.getOptionValue(option);\n\n      if (this.multiple()) {\n        // Handle both array and CSV formats\n        let current: string[] = [];\n\n        if (Array.isArray(this.ngModel)) {\n          // Handle array values (new format)\n          current = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n        } else {\n          // Handle string values (legacy CSV format)\n          const currentCsv = this.ngModel as string || '';\n          current = currentCsv ? currentCsv.split(',').map(v => v.trim()).filter(Boolean) : [];\n        }\n\n        const idx = current.findIndex(v => v.toString() === optionValue.toString());\n\n        if (idx >= 0) {\n          current.splice(idx, 1);\n        } else {\n          current.push(optionValue.toString());\n        }\n\n        // For array-based form controls, emit array; for CSV-based, emit CSV\n        if (Array.isArray(this._ngModel)) {\n          this._ngModel = current;\n          this.onChange(current as any);\n          this.ngModelChange.emit(current);\n        } else {\n          const newCsv = current.join(',');\n          this._ngModel = newCsv;\n          this.onChange(newCsv);\n          this.ngModelChange.emit(newCsv);\n        }\n\n        this.selectionChange.emit(option as SelectOption);\n        this.validateValue(this._ngModel);\n        this.isTouched = true;\n        this.onTouched();\n        // Do not close dropdown in multi-select mode\n      } else {\n        this._ngModel = optionValue;\n        this.onChange(optionValue);\n        this.ngModelChange.emit(optionValue);\n        this.selectionChange.emit(option as SelectOption);\n        this.validateValue(optionValue);\n        this.isOpen = false;\n        this.closeDropdown(); // Close the portal when option is selected\n        this.isTouched = true;\n        this.onTouched();\n      }\n      this.isDropdownInteraction = false;\n      this.interactionCount = 0;\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] selectOption error:`, error);\n      this.isOpen = false;\n      this.closeDropdown(); // Close the portal on error as well\n      this.isDropdownInteraction = false;\n      this.interactionCount = 0;\n    }\n  }\n\n  onBlur(): void {\n    try {\n      this.logDebug('onBlur called', { isOpen: this.isOpen, isDropdownInteraction: this.isDropdownInteraction });\n      this.isTouched = true;\n      this.onTouched();\n      this.interactionCount++;\n      if (this.interactionCount > this.maxInteractionCount) {\n        this.isOpen = false;\n        this.closeDropdown(); // Close the portal when max interaction count exceeded\n        this.isDropdownInteraction = false;\n        this.interactionCount = 0;\n        return;\n      }\n      this.addTimeout(() => {\n        try {\n          if (!this.isDropdownInteraction && !this.multiple()) {\n            this.isOpen = false;\n            this.closeDropdown(); // Close the portal when dropdown interaction ends\n            this.searchTerm = '';\n            this.filterOptions();\n          }\n          this.interactionCount = 0;\n        } catch (error) {\n          this.isOpen = false;\n          this.closeDropdown(); // Close the portal on error\n          this.interactionCount = 0;\n        }\n      }, 150);\n    } catch {\n      this.isOpen = false;\n      this.closeDropdown(); // Close the portal on error\n      this.isDropdownInteraction = false;\n      this.interactionCount = 0;\n    }\n  }\n\n  focusControl(): void {\n    try {\n      if (this.searchable() && this.isOpen) {\n        this.addTimeout(() => {\n          try {\n            if (this.searchInputRef && this.searchInputRef.nativeElement) {\n              this.searchInputRef.nativeElement.focus();\n            }\n          } catch (error) {\n            console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\n          }\n        }, 100);\n      }\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\n    }\n  }\n\n  clearSelection(): void {\n    if (this.multiple() && Array.isArray(this._ngModel)) {\n      this._ngModel = [];\n      this.onChange([] as any);\n      this.ngModelChange.emit([]);\n      this.validateValue([]);\n    } else {\n      this._ngModel = '';\n      this.onChange('');\n      this.ngModelChange.emit('');\n      this.validateValue('');\n    }\n  }\n\n  getSelectedOptionLabel(): string {\n    if (this.multiple()) {\n      // Handle both string (CSV) and array values\n      let values: string[] = [];\n\n      if (Array.isArray(this.ngModel)) {\n        // Handle array values (new format)\n        values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n      } else {\n        // Handle string values (legacy CSV format)\n        const csvValue = this.ngModel as string || '';\n        if (!csvValue.trim()) return '';\n        values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n      }\n\n      const labels = values\n        .map(v => {\n          const option = this.filteredOptions.find(o => this.getOptionValue(o).toString() === v) ||\n            this.options().find(o => this.getOptionValue(o).toString() === v);\n          return option ? this.getSelectedDisplayLabel(option) : '';\n        })\n        .filter((l): l is string => typeof l === 'string');\n      return labels.join(', ');\n    }\n    const selectedOption = this.filteredOptions.find(option => this.getOptionValue(option) === this.ngModel) ||\n      this.options().find(option => this.getOptionValue(option) === this.ngModel);\n    return selectedOption ? this.getSelectedDisplayLabel(selectedOption) : '';\n  }\n\n  /**\n   * Get display label for selected option\n   * For tree view, shows the full path or abbreviated path if too long\n   */\n  private getSelectedDisplayLabel(option: SelectOption | SelectOptionObject): string {\n    const treeViewConfig = this.treeView();\n\n    // If tree view is enabled and option has path information\n    if (treeViewConfig?.enabled && typeof option === 'object') {\n      const opt = option as SelectOptionObject;\n\n      // Check if option has treePath (full path) or treePathArray\n      if (opt['treePath']) {\n        const fullPath = opt['treePath'] as string;\n        return this.abbreviatePath(fullPath);\n      } else if (opt['treePathArray'] && Array.isArray(opt['treePathArray'])) {\n        const pathArray = opt['treePathArray'] as string[];\n        return this.abbreviatePath(pathArray.join(' / '), pathArray);\n      }\n    }\n\n    // Fallback to regular label\n    return this.getOptionLabel(option);\n  }\n\n  /**\n   * Abbreviate long paths: \"Parent 1 /.../ Last Child\"\n   * Shows first and last segments with \"/.../\" in between if path is too long\n   */\n  private abbreviatePath(fullPath: string, pathArray?: string[]): string {\n    const maxLength = 50; // Maximum characters before abbreviation\n    const maxSegments = 3; // Maximum path segments to show before abbreviation\n\n    // If path is short enough, return as is\n    if (fullPath.length <= maxLength) {\n      return fullPath;\n    }\n\n    // Use pathArray if available, otherwise split by ' / '\n    const segments = pathArray || fullPath.split(' / ');\n\n    // If only 2 segments or less, show full path\n    if (segments.length <= 2) {\n      return fullPath;\n    }\n\n    // If more than maxSegments, abbreviate: \"First /.../ Last\"\n    if (segments.length > maxSegments) {\n      const first = segments[0];\n      const last = segments[segments.length - 1];\n      return `${first} /.../ ${last}`;\n    }\n\n    // Otherwise, return full path (even if slightly long)\n    return fullPath;\n  }\n\n  filterOptions(): void {\n    try {\n      let processedOptions = [...this.options()];\n\n      // Build tree structure if treeView is enabled\n      const treeViewConfig = this.treeView();\n      if (treeViewConfig?.enabled) {\n        processedOptions = this.buildTreeStructure(processedOptions);\n      }\n\n      if (!this.searchable() || !this.searchTerm) {\n        this.filteredOptions = processedOptions;\n      } else {\n        this.filteredOptions = processedOptions.filter(option => this.getOptionLabel(option).toLowerCase().includes(this.searchTerm.toLowerCase()));\n      }\n    } catch {\n      this.filteredOptions = [...this.options()];\n    }\n  }\n\n  /**\n   * Build tree structure from flat options and flatten with hierarchy visualization\n   */\n  private buildTreeStructure(options: (SelectOption | SelectOptionObject)[]): (SelectOption | SelectOptionObject)[] {\n    const treeViewConfig = this.treeView();\n    if (!treeViewConfig || !treeViewConfig.enabled || !treeViewConfig.foreignKey) {\n      return options;\n    }\n\n    const primaryKey = treeViewConfig.primaryKey || this.valueKey();\n    const foreignKey = treeViewConfig.foreignKey;\n    const levelKey = treeViewConfig.levelKey || 'level';\n\n    // Create a map for quick lookup\n    const optionMap = new Map<string | number, SelectOptionObject & { children?: SelectOptionObject[] }>();\n    const rootOptions: (SelectOptionObject & { children?: SelectOptionObject[] })[] = [];\n\n    // First pass: create all options with children array\n    options.forEach(option => {\n      const opt = option as SelectOptionObject;\n      const id = this.getNestedValue(opt, primaryKey);\n      if (id !== undefined && id !== null) {\n        const optionWithChildren = {\n          ...opt,\n          children: []\n        };\n        optionMap.set(String(id), optionWithChildren);\n      }\n    });\n\n    // Second pass: build parent-child relationships\n    options.forEach(option => {\n      const opt = option as SelectOptionObject;\n      const id = this.getNestedValue(opt, primaryKey);\n      if (id === undefined || id === null) return;\n\n      const optionWithChildren = optionMap.get(String(id));\n      if (!optionWithChildren) return;\n\n      const parentId = this.getNestedValue(opt, foreignKey);\n      if (parentId !== undefined && parentId !== null && parentId !== '') {\n        const parent = optionMap.get(String(parentId));\n        if (parent) {\n          if (!parent.children) {\n            parent.children = [];\n          }\n          parent.children.push(optionWithChildren);\n          parent['hasChildren'] = true;\n        } else {\n          // Parent not found, treat as root\n          rootOptions.push(optionWithChildren);\n        }\n      } else {\n        // This is a root option\n        rootOptions.push(optionWithChildren);\n      }\n    });\n\n    // Third pass: flatten tree with hierarchy visualization\n    const flattened: (SelectOption | SelectOptionObject)[] = [];\n\n    const flattenTree = (\n      node: SelectOptionObject & { children?: SelectOptionObject[] },\n      level: number = 0,\n      isLast: boolean = true,\n      prefix: string = '',\n      parentPath: string[] = []\n    ) => {\n      const label = this.getOptionLabel(node);\n\n      // Build full path for selected value display\n      const fullPath = [...parentPath, label];\n      const pathString = fullPath.join(' / ');\n\n      // Build tree visualization for dropdown\n      let displayLabel = '';\n      if (level === 0) {\n        displayLabel = label;\n      } else {\n        const connector = isLast ? '└─ ' : '├─ ';\n        const indent = '   '.repeat(level - 1);\n        displayLabel = `${prefix}${indent}${connector}${label}`;\n      }\n\n      // Create option with tree display label and path\n      const treeOption: SelectOptionObject = {\n        ...node,\n        [levelKey]: level,\n        displayLabel: displayLabel,\n        treePath: pathString, // Full path for selected value display\n        treePathArray: fullPath, // Array of path segments for abbreviation\n        hasChildren: node['hasChildren'] || (node.children && node.children.length > 0) || false\n      };\n\n      flattened.push(treeOption);\n\n      // Recursively add children\n      if (node.children && node.children.length > 0) {\n        const sortedChildren = [...node.children].sort((a, b) => {\n          const labelA = this.getOptionLabel(a).toLowerCase();\n          const labelB = this.getOptionLabel(b).toLowerCase();\n          return labelA.localeCompare(labelB);\n        });\n\n        const childPrefix = level === 0 ? '' : (isLast ? prefix + '   ' : prefix + '│  ');\n        sortedChildren.forEach((child, index) => {\n          const isLastChild = index === sortedChildren.length - 1;\n          flattenTree(child, level + 1, isLastChild, childPrefix, fullPath);\n        });\n      }\n    };\n\n    // Sort root options by label\n    const sortedRoots = rootOptions.sort((a, b) => {\n      const labelA = this.getOptionLabel(a).toLowerCase();\n      const labelB = this.getOptionLabel(b).toLowerCase();\n      return labelA.localeCompare(labelB);\n    });\n\n    // Flatten all root options and their children\n    sortedRoots.forEach((root, index) => {\n      const isLastRoot = index === sortedRoots.length - 1;\n      flattenTree(root, 0, isLastRoot, '', []);\n    });\n\n    return flattened;\n  }\n\n  /**\n   * Get nested value from object using dot notation\n   */\n  private getNestedValue(obj: any, path: string): any {\n    if (!path || !obj) return undefined;\n    const keys = path.split('.');\n    let value = obj;\n    for (const key of keys) {\n      if (value === null || value === undefined) return undefined;\n      value = value[key];\n    }\n    return value;\n  }\n\n  onSearchInput(event: Event): void {\n    try {\n      this.searchTerm = (event.target as HTMLInputElement).value;\n\n      console.log(`🔍 SELECT [${this.debugId}] Search input changed:`, `\"${this.searchTerm}\"`);\n\n      // If search term is empty, emit immediately without debounce\n      if (this.searchTerm === '' || this.searchTerm === null || this.searchTerm === undefined) {\n        console.log(`🔍 SELECT [${this.debugId}] Empty search - emitting immediately`);\n\n        // Update local filtering immediately\n        this.filterOptions();\n        this.updateOptionsInDOM();\n\n        this.performSearch('');\n      } else {\n        // Update local filtering immediately for better UX\n        this.filterOptions();\n        this.updateOptionsInDOM();\n\n        // For non-empty values, use debounced search for API calls\n        this.searchSubject.next(this.searchTerm);\n      }\n    } catch (error) {\n      console.error(`💥 SELECT [${this.debugId}] onSearchInput error:`, error);\n    }\n  }\n\n  onDropdownMouseDown(): void {\n    this.isDropdownInteraction = true;\n  }\n\n  onSearchInputBlur(event: Event): void {\n    // Prevent blur if we're updating options (to maintain focus during API updates)\n    if (this.isUpdatingOptions) {\n      event.preventDefault();\n      (event.target as HTMLInputElement).focus();\n    }\n  }\n\n  onDropdownMouseUp(): void {\n    this.addTimeout(() => {\n      this.isDropdownInteraction = false;\n    }, 200);\n  }\n\n  isOptionSelected(option: SelectOption | SelectOptionObject): boolean {\n    if (this.multiple()) {\n      // Handle both array and CSV formats\n      let values: string[] = [];\n\n      if (Array.isArray(this.ngModel)) {\n        // Handle array values (new format)\n        values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n      } else {\n        // Handle string values (legacy CSV format)\n        const csvValue = this.ngModel as string || '';\n        if (!csvValue.trim()) return false;\n        values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n      }\n\n      return values.includes(this.getOptionValue(option).toString());\n    }\n    return this.getOptionValue(option) === this.ngModel;\n  }\n\n  // Helper methods to extract values and labels from options\n  getOptionValue(option: SelectOption | SelectOptionObject): string | number {\n    if (this.isSelectOption(option)) {\n      return option.value;\n    }\n    return option[this.valueKey()] || '';\n  }\n\n  getOptionLabel(option: SelectOption | SelectOptionObject): string {\n    // For tree view, use displayLabel if available\n    const treeViewConfig = this.treeView();\n    if (treeViewConfig?.enabled && typeof option === 'object' && 'displayLabel' in option) {\n      return (option as SelectOptionObject)['displayLabel'] || '';\n    }\n\n    if (this.isSelectOption(option)) {\n      return option.label;\n    }\n    return option[this.labelKey()] || '';\n  }\n\n  private isSelectOption(option: SelectOption | SelectOptionObject): option is SelectOption {\n    return 'value' in option && 'label' in option;\n  }\n\n  trackByValue(index: number, option: SelectOption | SelectOptionObject): string | number {\n    return this.getOptionValue(option);\n  }\n\n  // Debug helpers\n  private logDebug(message: string, data?: unknown): void {\n    console.log(`🔍 SELECT [${this.debugId}] ${message}`, data || '');\n  }\n\n  private clearTimeouts(): void {\n    this.timeoutIds.forEach(id => { clearTimeout(id); });\n    this.timeoutIds = [];\n  }\n\n  private addTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout> {\n    const timeoutId = setTimeout(() => {\n      try {\n        callback();\n        // remove executed timeout from tracking\n        this.timeoutIds = this.timeoutIds.filter(id => id !== timeoutId);\n      } catch (error) {\n        console.error(`💥 SELECT [${this.debugId}] Timeout callback error:`, error);\n      }\n    }, delay);\n    this.timeoutIds.push(timeoutId);\n    return timeoutId;\n  }\n} ","<div class=\"cide-select\" [ngClass]=\"{\n  'cide-element-size-xxs': (size() === '2xs'),\n  'cide-element-size-xs': (size() === 'xs'),\n  'cide-element-size-sm': (size() === 'sm'),\n  'cide-element-size-md': (size() === 'md'),\n  'cide-element-size-lg': (size() === 'lg'),\n  'cide-element-leading-icon': leadingIcon(),\n  'cide-element-input-label-floating': (labelPlacement() === 'floating'),\n  'cide-element-input-label-start': (labelDir() === 'start'),\n  'cide-element-input-label-end': (labelDir() === 'end'),\n  'cide-element-input-label-fixed': (labelPlacement() === 'fixed'),\n  'cide-element-input-label-less': (!label() || labelHide()),\n  'cide-element-style-outline': (fill() === 'outline'),\n  'cide-element-style-solid': (fill() === 'solid'),\n  'cide-element-style-standard': (fill() === 'standard'),\n}\">\n  @if (label() && !labelHide()) {\n  <label [for]=\"id()\" class=\"cide-select-label\">\n    {{ label() }}\n    @if (required()) {\n    <span class=\"tw-text-red-500 tw-ml-1\">*</span>\n    }\n  </label>\n  }\n\n  <div class=\"cide-element-select-wrapper tw-relative\">\n    <!-- Leading Icon -->\n    @if (leadingIcon()) {\n    <span class=\"cide-input-leading-icon-wrapper\">\n      <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon()}}</span>\n    </span>\n    }\n\n    <!-- Select Button -->\n    <button type=\"button\" [id]=\"id()\" [disabled]=\"isDisabled()\" (click)=\"toggleDropdown()\" (blur)=\"onBlur()\" [ngClass]=\"{\n        'tw-rounded-e-md tw-rounded-es-md': label() && labelPlacement() === 'fixed',\n        'tw-rounded-md': !(label() && labelPlacement() === 'fixed'),\n        'tw-pl-1': !leadingIcon(),\n        'tw-pr-8': trailingIcon() || clearInput() || loading(),\n        'tw-pr-1': !trailingIcon() && !clearInput() && !loading(),\n        'tw-h-8 tw-pt-0.5 tw-pb-0': size() === 'md',\n        'tw-h-7': size() === 'sm',\n        '!tw-mt-0': labelHide(),\n        'tw-opacity-50 tw-cursor-not-allowed': isDisabled(),\n        'cide-select-button tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 tw-outline-none tw-text-left tw-cursor-pointer': true\n      }\" class=\"cide-select-button\">\n\n      <span class=\"cide-select-value\" [ngClass]=\"{'tw-text-gray-400': !ngModel}\">\n        {{ ngModel ? getSelectedOptionLabel() : placeholder() }}\n      </span>\n    </button>\n\n    <!-- Trailing Icon (Dropdown Arrow or Loading Spinner) -->\n    @if (!clearInput() || !ngModel || loading()) {\n    <span class=\"tw-absolute tw-top-1/2 tw-right-0 tw-transform -tw-translate-y-1/2 tw-select-none tw-z-10\">\n      <!-- Loading Spinner -->\n      @if (loading()) {\n      <span class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-text-gray-500\">\n        <svg class=\"tw-animate-spin tw-h-4 tw-w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n          <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n          <path class=\"tw-opacity-75\" fill=\"currentColor\"\n            d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\">\n          </path>\n        </svg>\n      </span>\n      }\n      <!-- Dropdown Arrow -->\n      @if (!loading()) {\n      <span\n        class=\"material-symbols-outlined tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center !tw-text-2xl tw-transition-transform tw-text-gray-500\"\n        [ngClass]=\"{'tw-rotate-180': isOpen}\">\n        expand_more\n      </span>\n      }\n    </span>\n    }\n\n    <!-- Clear Button -->\n    @if (clearInput() && ngModel) {\n    <button class=\"cide-input-clear\" (click)=\"clearSelection()\" type=\"button\">\n      <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n    </button>\n    }\n\n\n  </div>\n\n  <!-- Error/Helper Text -->\n  @if ((errorText() || helperText()) && !isValid) {\n  <span class=\"cide-select-help-error-text\">\n    {{ errorText() || helperText() }}\n  </span>\n  }\n  @if (helperText() && isValid) {\n  <span class=\"cide-select-help-error-text\">\n    {{ helperText() }}\n  </span>\n  }\n\n  <!-- Portal Container -->\n  <div #dropdownContainer></div>\n</div>\n\n<!-- Portal Template for Dropdown -->\n<ng-template #dropdownTemplate let-context=\"context\">\n  <div\n    class=\"cide-select-dropdown-portal tw-bg-white tw-border tw-border-gray-300 tw-rounded-md tw-shadow-lg tw-max-h-60 tw-overflow-y-auto tw-z-50\">\n    <!-- Search Input (if searchable and showSearchInput is true) -->\n    @if (context?.searchable && showSearchInput()) {\n    <div class=\"tw-p-2 tw-border-b tw-border-gray-200 tw-sticky tw-top-0 tw-z-20 tw-bg-white\">\n      <input #searchInput type=\"text\" placeholder=\"Search options...\" [value]=\"context?.searchTerm\"\n        (input)=\"context?.onSearchInput($event)\" (mousedown)=\"onDropdownMouseDown()\" (focus)=\"onDropdownMouseDown()\"\n        (click)=\"$event.stopPropagation()\" (blur)=\"onSearchInputBlur($event)\"\n        class=\"tw-w-full tw-px-2 tw-py-1 tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-outline-none focus:tw-border-blue-500\">\n    </div>\n    }\n\n    <!-- Options List -->\n    <div class=\"tw-py-1\">\n      <!-- Loading State -->\n      @if (context?.loading) {\n      <div class=\"tw-px-3 tw-py-4 tw-text-center\">\n        <div class=\"tw-flex tw-items-center tw-justify-center tw-space-x-2\">\n          <svg class=\"tw-animate-spin tw-h-4 tw-w-4 tw-text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"\n            viewBox=\"0 0 24 24\">\n            <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n            <path class=\"tw-opacity-75\" fill=\"currentColor\"\n              d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\">\n            </path>\n          </svg>\n          <span class=\"tw-text-sm tw-text-gray-500\">Loading...</span>\n        </div>\n      </div>\n      }\n      <!-- Options -->\n      @if (!context?.loading) {\n      @for (option of context?.options; track $index) {\n      <button type=\"button\" (mousedown)=\"onDropdownMouseDown()\" (click)=\"context?.selectOption(option)\"\n        (keyup.enter)=\"context?.selectOption(option)\" (keyup.space)=\"context?.selectOption(option)\"\n        [disabled]=\"option.disabled\" [ngClass]=\"{\n              'cide-select-option tw-w-full tw-text-left tw-px-3 tw-py-2 tw-text-sm tw-cursor-pointer tw-transition-colors hover:tw-bg-gray-100 tw-border-none tw-bg-transparent tw-outline-none': true,\n              'tw-bg-blue-50 tw-text-blue-700': context?.isOptionSelected(option),\n              'tw-text-gray-400 tw-cursor-not-allowed': option.disabled,\n              'cide-select-tree-option': context?.treeView?.enabled\n            }\" class=\"cide-select-option\" [style.white-space]=\"context?.treeView?.enabled ? 'pre' : 'normal'\"\n        [style.font-family]=\"context?.treeView?.enabled ? 'monospace' : 'inherit'\">\n        {{ context?.getOptionLabel(option) }}\n      </button>\n      }\n      }\n\n      <!-- No options message -->\n      @if (!context?.loading && context?.options.length === 0) {\n      <div class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic\">\n        {{ context?.searchable && context?.searchTerm ? 'No options found' : 'No options available' }}\n      </div>\n      }\n    </div>\n  </div>\n</ng-template>","/**\n * Load SVG icons directly from assets/icons/svg/*.svg files.\n * Add .svg files to projects/cloud-ide-element/src/lib/assets/icons/svg/\n */\n\nconst CACHE = new Map<string, string>();\nfunction getBase(): string {\n  if (typeof document === 'undefined') return '';\n  const base = document.querySelector('base')?.getAttribute('href') || '/';\n  return base.replace(/\\/$/, '') || '';\n}\n\nfunction findGradientIds(s: string): Set<string> {\n  const ids = new Set<string>();\n  const idRe = /id=\"([^\"]+)\"|url\\(#([^)]+)\\)/g;\n  let m;\n  while ((m = idRe.exec(s)) !== null) {\n    ids.add(m[1] || m[2]);\n  }\n  return ids;\n}\n\n/** Fetch SVG from assets/icons/svg/{name}.svg */\nexport async function fetchCideIcon(name: string): Promise<string> {\n  const cached = CACHE.get(name);\n  if (cached) return cached;\n  const base = getBase();\n  const url = `${base}/assets/icons/svg/${name}.svg`;\n  const res = await fetch(url);\n  if (!res.ok) throw new Error(`Icon not found: ${name}`);\n  const svg = await res.text();\n  CACHE.set(name, svg);\n  return svg;\n}\n\n/** Returns SVG with unique gradient ID to avoid conflicts when multiple instances. */\nexport async function getCideIconSvg(name: string, uniqueId?: string): Promise<string | undefined> {\n  try {\n    let svg = await fetchCideIcon(name);\n    const suffix = uniqueId ?? Math.random().toString(36).slice(2, 9);\n    for (const id of findGradientIds(svg)) {\n      svg = svg.split(id).join(`cide-${name}-${suffix}`);\n    }\n    return svg;\n  } catch {\n    return undefined;\n  }\n}\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectorRef, Component, input, Input, OnChanges } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { iconType, themeSize } from 'cloud-ide-lms-model';\r\nimport { getCideIconSvg } from '../../assets/icons/cide-icons';\r\n\r\n@Component({\r\n  selector: 'cide-ele-icon',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  templateUrl: './icon.component.html',\r\n  styleUrl: './icon.component.css',\r\n  host: {\r\n    '[class.mpro-icon-field]': \"type === 'box'\",\r\n    '[class.mpro-icon-field-active]': \"type === 'box' && active()\"\r\n  }\r\n})\r\nexport class CideIconComponent implements OnChanges {\r\n  @Input() size: themeSize = \"xs\";\r\n  @Input() type: iconType = \"round\";\r\n  @Input() toolTip: string = \"\";\r\n  /** When true (e.g. selected item in sidedrawer strip), shows active state: ::before background visible like hover. */\r\n  readonly active = input<boolean>(false);\r\n  /** Custom icon name with cide- prefix (e.g. 'cide-ai-sparkle'). When set, renders SVG from assets/icons/svg/*.svg. */\r\n  @Input() name: string = \"\";\r\n\r\n  customSvg: SafeHtml | null = null;\r\n\r\n  constructor(\r\n    private sanitizer: DomSanitizer,\r\n    private cdr: ChangeDetectorRef\r\n  ) {}\r\n\r\n  ngOnChanges(): void {\r\n    if (this.name?.startsWith('cide-')) {\r\n      const iconName = this.name.slice(5); // strip 'cide-' prefix\r\n      getCideIconSvg(iconName).then((svg) => {\r\n        this.customSvg = svg ? this.sanitizer.bypassSecurityTrustHtml(svg) : null;\r\n        this.cdr.detectChanges();\r\n      });\r\n    } else {\r\n      this.customSvg = null;\r\n    }\r\n  }\r\n}\r\n","<button class=\"cide-icon tw-m-1 tw-inline-flex tw-items-center tw-justify-center tw-outline-none tw-relative\" [ngClass]=\"{\r\n        'tw-h-[35px] tw-w-[35px]': (size === 'lg'), \r\n        'tw-h-[27px] tw-w-[27px]': (size === 'md'), \r\n        'tw-h-[23px] tw-w-[23px]': (size === 'sm'), \r\n        'tw-h-[19px] tw-w-[19px] !tw-m-[2px]': (size === 'xs'), \r\n        'tw-h-[14px] tw-w-[14px] !tw-m-[1px] cide-icon-2xs': (size === '2xs'), \r\n        'tw-h-[11px] tw-w-[11px] !tw-m-[1px] cide-icon-3xs': (size === '3xs'), \r\n        'tw-rounded-2xl' : (type === 'round'), 'tw-rounded-[0.2rem]' : (type === 'box') , \r\n        'tw-h-[15px] tw-w-[15px] none-type !tw-m-0': (type === 'none'),\r\n        'cide-tooltip': (toolTip),\r\n        }\" type=\"button\">\r\n    <span class=\"cide-tooltip-content\">{{toolTip}}</span>\r\n\r\n    @if (customSvg) {\r\n      <span class=\"cide-icon-custom tw-flex tw-items-center tw-justify-center tw-w-full tw-h-full\" [innerHTML]=\"customSvg\"></span>\r\n    } @else {\r\n      <span class=\"material-symbols-outlined tw-flex tw-items-center tw-justify-center tw-w-full tw-h-full\"\r\n          [ngClass]=\"{'tw-text-[28px]': (size === 'lg'), 'tw-text-[22px]': (size === 'md'), 'tw-text-[25px]': (size === 'sm'), 'tw-text-[18px]': (size === 'xs'), 'tw-text-[15px]': (size === '2xs'), 'tw-text-[11px]': (size === '3xs')}\">\r\n          <ng-content></ng-content>\r\n      </span>\r\n    }\r\n</button>","import { Component, Input, Output, EventEmitter, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from \"../icon/icon.component\";\r\n\r\nexport interface TabItem {\r\n  id: string;\r\n  label: string;\r\n  disabled?: boolean;\r\n  icon?: string;\r\n  badge?: string | number;\r\n}\r\n\r\n@Component({\r\n  selector: 'cide-ele-tab',\r\n  standalone: true,\r\n  imports: [CommonModule, CideIconComponent],\r\n  templateUrl: './cide-ele-tab.component.html',\r\n  styleUrls: ['./cide-ele-tab.component.scss']\r\n})\r\nexport class CideEleTabComponent implements OnInit {\r\n  @Input() tabs: TabItem[] = [];\r\n  @Input() activeTabId?: string;\r\n  @Input() size: 'xs' | 'sm' | 'md' | 'lg' = 'md';\r\n  @Input() variant: 'default' | 'pills' | 'underline' = 'default';\r\n  @Input() fullWidth = false;\r\n  @Input() disabled = false;\r\n\r\n  @Output() tabChange = new EventEmitter<TabItem>();\r\n\r\n  activeTab = signal<string>('');\r\n\r\n  ngOnInit() {\r\n    // Set initial active tab\r\n    if (this.activeTabId) {\r\n      this.activeTab.set(this.activeTabId);\r\n    } else if (this.tabs.length > 0) {\r\n      const firstEnabledTab = this.tabs.find(tab => !tab.disabled);\r\n      if (firstEnabledTab) {\r\n        this.activeTab.set(firstEnabledTab.id);\r\n      }\r\n    }\r\n  }\r\n\r\n  onTabClick(tab: TabItem) {\r\n    if (tab.disabled || this.disabled) return;\r\n    \r\n    this.activeTab.set(tab.id);\r\n    this.tabChange.emit(tab);\r\n  }\r\n\r\n  isActive(tabId: string): boolean {\r\n    return this.activeTab() === tabId;\r\n  }\r\n\r\n  getTabClasses(tab: TabItem): string {\r\n    const baseClasses = 'cide-tab-item';\r\n    const sizeClass = `cide-tab-${this.size}`;\r\n    const variantClass = `cide-tab-${this.variant}`;\r\n    const activeClass = this.isActive(tab.id) ? 'cide-tab-active' : '';\r\n    const disabledClass = (tab.disabled || this.disabled) ? 'cide-tab-disabled' : '';\r\n    \r\n    return [baseClasses, sizeClass, variantClass, activeClass, disabledClass]\r\n      .filter(Boolean)\r\n      .join(' ');\r\n  }\r\n\r\n  getContainerClasses(): string {\r\n    const baseClasses = 'cide-tab-container';\r\n    const variantClass = `cide-tab-container-${this.variant}`;\r\n    const fullWidthClass = this.fullWidth ? 'cide-tab-full-width' : '';\r\n    \r\n    return [baseClasses, variantClass, fullWidthClass]\r\n      .filter(Boolean)\r\n      .join(' ');\r\n  }\r\n} ","<div [class]=\"getContainerClasses()\">\r\n  @for (tab of tabs; track tab.id) {\r\n    <button\r\n      type=\"button\"\r\n      [class]=\"getTabClasses(tab)\"\r\n      [disabled]=\"tab.disabled || disabled\"\r\n      (click)=\"onTabClick(tab)\"\r\n      [attr.aria-selected]=\"isActive(tab.id)\"\r\n      [attr.aria-controls]=\"'panel-' + tab.id\"\r\n      role=\"tab\">\r\n      \r\n      @if (tab.icon) {\r\n        <cide-ele-icon class=\"cide-tab-icon\">{{ tab.icon }}</cide-ele-icon>\r\n      }\r\n      \r\n      <span class=\"cide-tab-label\">{{ tab.label }}</span>\r\n      \r\n      @if (tab.badge) {\r\n        <span class=\"cide-tab-badge\">{{ tab.badge }}</span>\r\n      }\r\n    </button>\r\n  }\r\n</div> ","/**\r\n * File Manager Interfaces\r\n * Based on core_file_manager table schema\r\n */\r\n\r\nexport interface ICoreCyfm {\r\n  _id?: string;\r\n  cyfm_name?: string;\r\n  cyfm_alt_text?: string;\r\n  cyfm_path?: string;\r\n  cyfm_size_in_byte?: number;\r\n  cyfm_type?: string;\r\n  cyfm_creation_dt?: string;\r\n  cyfm_id_user?: string;\r\n  cyfm_permissions?: string[];\r\n  cyfm_tags?: string[];\r\n  cyfm_version?: number;\r\n  cyfm_file_status_sygmt?: string;\r\n  cyfm_group_id?: string; // Group ID for multiple file uploads\r\n  cyfm_ismultiple?: boolean; // Whether the file is multiple\r\n  cyfm_isactive?: boolean;\r\n}\r\n\r\nexport interface ICoreFileManager extends ICoreCyfm {\r\n  _id: string;\r\n  cyfm_name: string;\r\n  cyfm_path: string;\r\n  cyfm_size_in_byte: number;\r\n  cyfm_type: string;\r\n  cyfm_creation_dt: string;\r\n  cyfm_id_user: string;\r\n  cyfm_permissions: string[];\r\n  cyfm_tags: string[];\r\n  cyfm_version: number;\r\n  cyfm_file_status_sygmt: string;\r\n  cyfm_group_id?: string; // Group ID for multiple file uploads\r\n  cyfm_ismultiple?: boolean; // Whether the file is multiple\r\n  cyfm_isactive: boolean;\r\n}\r\n\r\nexport interface controllerResponse {\r\n  success?: boolean; // true or false\r\n  error_code?: string; // general master error codes\r\n  message?: string; // special message we will connect this with general master in future for language achivment\r\n  data?: any; //custom data\r\n  code?: string; // like 200\r\n  action?: string; // code to take conditionla action on save erro code\r\n  total?: number; // for pagination calls\r\n  pageIndex?: number; //for pagination\r\n  pageSize?: number; //for pagination\r\n  controls?: { [key: string]: string }; // error controls name and message\r\n}\r\n\r\nexport type IFileManagerErrorLogger = {\r\n  [key in keyof MFileManager]: string;\r\n};\r\n\r\nexport class MFileManager {\r\n  public cyfm_id: string = \"\";\r\n\r\n  constructor(init: MFileManager) {\r\n    Object.assign(this, init);\r\n  }\r\n\r\n  Validate?(): Partial<IFileManagerErrorLogger> {\r\n    let errorLogger: Partial<IFileManagerErrorLogger> = {};\r\n    // Log errors here\r\n    if (!this.cyfm_id) {\r\n      errorLogger.cyfm_id = \"File ID is Required!\";\r\n    }\r\n\r\n    return errorLogger;\r\n  }\r\n}\r\n\r\nexport class ICoreCyfmSave implements ICoreCyfm {\r\n  _id?: string;\r\n  cyfm_name?: string;\r\n  cyfm_alt_text?: string;\r\n  cyfm_path?: string;\r\n  cyfm_size_in_byte?: number;\r\n  cyfm_type?: string;\r\n  cyfm_creation_dt?: string;\r\n  cyfm_id_user?: string;\r\n  cyfm_permissions?: string[];\r\n  cyfm_tags?: string[];\r\n  cyfm_version?: number;\r\n  cyfm_file_status_sygmt?: string;\r\n  cyfm_group_id?: string; // Group ID for multiple file uploads\r\n  cyfm_isactive?: boolean;\r\n  cyfm_ismultiple?: boolean;\r\n  cyfm_file_base64: string = \"\";\r\n  cyfm_temp_unique_id: string = \"\";\r\n\r\n  constructor(init: ICoreCyfmSave) {\r\n    Object.assign(this, init);\r\n  }\r\n}\r\n\r\nexport class CoreFileManagerInsertUpdatePayload {\r\n  core_file_manager_new: ICoreCyfmSave[] = [];\r\n  core_file_manager_update: ICoreCyfm[] = [];\r\n  core_file_manager_delete: ICoreCyfm[] = [];\r\n\r\n  constructor(init: CoreFileManagerInsertUpdatePayload) {\r\n    Object.assign(this, init);\r\n  }\r\n\r\n  Validate?(): Partial<IFileManagerErrorLogger> {\r\n    let errorLogger: Partial<IFileManagerErrorLogger> = {};\r\n    // Log errors here\r\n\r\n    return errorLogger;\r\n  }\r\n}\r\n\r\nexport interface fileManagerResponseData extends ICoreCyfm {\r\n  cyfm_file_base64: string\r\n}\r\n\r\nexport interface fileManagerControllerResponse extends controllerResponse {\r\n  data?: fileManagerResponseData[]\r\n}\r\n\r\nexport interface CoreFileManagerInsertUpdateResponse extends controllerResponse {\r\n  data?: {\r\n    core_file_manager: {\r\n      cyfm_id: string;\r\n      cyfm_temp_unique_id: string;\r\n    }[];\r\n  }\r\n}\r\n\r\nexport interface mongooseObjectIdCreateControllerResponse extends controllerResponse {\r\n  data?: {\r\n      objectId: string;\r\n  }\r\n}\r\n\r\nexport interface IFileUploadRequest {\r\n  file: File;\r\n  altText?: string;\r\n  tags?: string[];\r\n  permissions?: string[];\r\n  userId?: string;\r\n  groupId?: string;\r\n  [key: string]: string | number | string[] | File | undefined;\r\n}\r\n\r\nexport interface IFileUploadResponse {\r\n  success: boolean;\r\n  message: string;\r\n  data?: ICoreFileManager;\r\n  error?: string;\r\n}\r\n\r\nexport interface IFileListRequest {\r\n  pageIndex: number;\r\n  pageSize: number;\r\n  search?: string;\r\n  fileType?: string;\r\n  status?: string;\r\n  userId?: string;\r\n  tags?: string[];\r\n  sortBy?: string;\r\n  sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\nexport interface IFileListResponse {\r\n  success: boolean;\r\n  message: string;\r\n  data: ICoreFileManager[];\r\n  total: number;\r\n  pageIndex: number;\r\n  pageSize: number;\r\n}\r\n\r\nexport interface IFileDeleteResponse {\r\n  success: boolean;\r\n  message: string;\r\n  data?: string;\r\n}\r\n\r\nexport interface IFileUpdateRequest {\r\n  _id: string;\r\n  cyfm_name?: string;\r\n  cyfm_alt_text?: string;\r\n  cyfm_tags?: string[];\r\n  cyfm_permissions?: string[];\r\n  cyfm_file_status_sygmt?: string;\r\n  cyfm_isactive?: boolean;\r\n}\r\n\r\nexport interface IFileUpdateResponse {\r\n  success: boolean;\r\n  message: string;\r\n  data?: ICoreFileManager;\r\n}\r\n\r\nexport interface IFileUploadProgress {\r\n  fileId: string;\r\n  fileName: string;\r\n  progress: number;\r\n  status: 'pending' | 'uploading' | 'completed' | 'error' | 'cancelled';\r\n  error?: string;\r\n  uploadedFile?: any;\r\n}\r\n\r\nexport interface IFileUploadQueueItem extends IFileUploadProgress {\r\n  file: File;\r\n}\r\n\r\nexport interface IFileFilterOptions {\r\n  fileTypes: string[];\r\n  statuses: string[];\r\n  dateRange?: {\r\n    start: Date;\r\n    end: Date;\r\n  };\r\n  sizeRange?: {\r\n    min: number;\r\n    max: number;\r\n  };\r\n  tags: string[];\r\n}\r\n\r\nexport interface IFileGroupingOptions {\r\n  groupBy: 'type' | 'status' | 'date' | 'size' | 'user' | 'none';\r\n  sortBy: 'name' | 'size' | 'date' | 'type';\r\n  sortOrder: 'asc' | 'desc';\r\n}\r\n","import { Injectable, signal, computed, inject, DestroyRef } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse, HttpEventType } from '@angular/common/http';\r\nimport { Observable, BehaviorSubject, throwError, retry, catchError, finalize, map, of } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CoreFileManagerInsertUpdatePayload, CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData, ICoreCyfmSave, MFileManager, mongooseObjectIdCreateControllerResponse } from '../interfaces/core-file-manager.interface';\r\nimport { ICoreCyfm, MFileManagerListByGroupIdPayload, fileManagerListByGroupIdControllerResponse, generateStringFromObject } from 'cloud-ide-lms-model';\r\n\r\n\r\n\r\nexport interface FileUploadOptions {\r\n  altText?: string;\r\n  userId?: string;\r\n  permissions?: string[];\r\n  tags?: string[];\r\n  fileStatus?: string;\r\n  groupId?: string; // Group ID for multiple file uploads\r\n  isMultiple?: boolean;\r\n  retryAttempts?: number;\r\n  timeout?: number;\r\n  [key: string]: string | number | string[] | undefined | boolean; // Allow additional properties with proper typing\r\n}\r\n\r\nexport interface UploadProgress {\r\n  loaded: number;\r\n  total: number;\r\n  percentage: number;\r\n  stage: 'reading' | 'uploading' | 'complete' | 'error';\r\n  groupId?: string; // Group ID for filtering uploads by component\r\n}\r\n\r\nexport interface ServiceState {\r\n  isUploading: boolean;\r\n  uploadQueue: string[];\r\n  activeUploads: Map<string, UploadProgress>;\r\n  error: string | null;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CideEleFileManagerService {\r\n  // Angular 20: Modern dependency injection\r\n  private readonly http = inject(HttpClient);\r\n  private readonly destroyRef = inject(DestroyRef);\r\n\r\n  // Angular 20: Signal-based state management\r\n  private readonly _baseUrl = signal('/api');\r\n  private readonly _objectIdEndpoint = signal('/utility/generateObjectId');\r\n  private readonly _userId = signal<string>('');\r\n  private readonly _isUploading = signal(false);\r\n  private readonly _uploadQueue = signal<string[]>([]);\r\n  private readonly _activeUploads = signal<Map<string, UploadProgress>>(new Map());\r\n  private readonly _fetchedFiles = signal<Map<string, any[]>>(new Map()); // Group ID -> Files mapping\r\n  private readonly _fileIdMapping = signal<Map<string, string>>(new Map()); // Temp ID -> Actual ID mapping\r\n  private readonly _error = signal<string | null>(null);\r\n\r\n  // Angular 20: Computed values\r\n  readonly baseUrl = this._baseUrl.asReadonly();\r\n  readonly objectIdEndpoint = this._objectIdEndpoint.asReadonly();\r\n  readonly userId = this._userId.asReadonly();\r\n  readonly isUploading = this._isUploading.asReadonly();\r\n  readonly uploadQueue = this._uploadQueue.asReadonly();\r\n  readonly activeUploads = this._activeUploads.asReadonly();\r\n  readonly fetchedFiles = this._fetchedFiles.asReadonly();\r\n  readonly error = this._error.asReadonly();\r\n\r\n  readonly hasActiveUploads = computed(() => this._activeUploads().size > 0);\r\n  readonly queueLength = computed(() => this._uploadQueue().length);\r\n  readonly totalFetchedFiles = computed(() => {\r\n    let total = 0;\r\n    this._fetchedFiles().forEach(files => total += files.length);\r\n    return total;\r\n  });\r\n\r\n  // Optimized computed properties for file counting by group\r\n  readonly getFileCountByGroup = computed(() => {\r\n    const countMap = new Map<string, number>();\r\n\r\n    // Count files for each group using the same deduplication logic as getAllFilesForGroup\r\n    this._fetchedFiles().forEach((fetchedFiles, groupId) => {\r\n      const fileCount = this.getAllFilesForGroup(groupId).length;\r\n      countMap.set(groupId, fileCount);\r\n    });\r\n\r\n    // Also count groups that have active uploads but no fetched files yet\r\n    this._activeUploads().forEach((upload, fileId) => {\r\n      if (upload.groupId && !countMap.has(upload.groupId)) {\r\n        const fileCount = this.getAllFilesForGroup(upload.groupId).length;\r\n        countMap.set(upload.groupId, fileCount);\r\n      }\r\n    });\r\n\r\n    return countMap;\r\n  });\r\n\r\n  readonly serviceState = computed(() => ({\r\n    isUploading: this._isUploading(),\r\n    uploadQueue: this._uploadQueue(),\r\n    activeUploads: this._activeUploads(),\r\n    fetchedFiles: this._fetchedFiles(),\r\n    error: this._error()\r\n  }));\r\n\r\n  constructor() {\r\n    // Service initialized\r\n  }\r\n\r\n  /**\r\n   * Upload a file with base64 encoding and progress tracking\r\n   * Angular 20: Enhanced with better error handling, retry logic, and signal-based state\r\n   * @param file The file to upload\r\n   * @param options Upload options and additional data\r\n   * @param progressCallback Optional callback for progress updates\r\n   * @returns Observable with the upload response\r\n   */\r\n  uploadFile(file: File, options?: FileUploadOptions, progressCallback?: (progress: number) => void): Observable<CoreFileManagerInsertUpdateResponse> {\r\n    const fileId = this.generateFileId(file);\r\n    const uploadOptions = { retryAttempts: 3, timeout: 30000, ...options };\r\n\r\n    // Angular 20: Update service state\r\n    this._isUploading.set(true);\r\n    this._error.set(null);\r\n    this.addToUploadQueue(fileId);\r\n\r\n    // Upload started for file: ${file.name}\r\n\r\n    return new Observable<CoreFileManagerInsertUpdateResponse>(observer => {\r\n      const reader = new FileReader();\r\n\r\n      // Angular 20: Enhanced progress tracking with signals\r\n      reader.onprogress = (event) => {\r\n        if (event.lengthComputable && progressCallback) {\r\n          const progress = (event.loaded / event.total) * 50; // File reading is 50% of total progress\r\n          progressCallback(progress);\r\n          this.updateUploadProgress(fileId, {\r\n            loaded: event.loaded,\r\n            total: event.total,\r\n            percentage: progress,\r\n            stage: 'reading'\r\n          }, uploadOptions?.groupId);\r\n        }\r\n      };\r\n\r\n      reader.onload = () => {\r\n        try {\r\n          const base64String = reader.result as string;\r\n          const base64Data = base64String.split(',')[1]; // Remove data:image/jpeg;base64, prefix\r\n\r\n          // Update progress to 50% (file reading complete)\r\n          if (progressCallback) {\r\n            progressCallback(50);\r\n          }\r\n          this.updateUploadProgress(fileId, {\r\n            loaded: 50,\r\n            total: 100,\r\n            percentage: 50,\r\n            stage: 'uploading'\r\n          }, uploadOptions?.groupId);\r\n\r\n          // Create the file data object with proper typing\r\n          const fileData: ICoreCyfmSave = {\r\n            cyfm_name: file.name,\r\n            cyfm_alt_text: uploadOptions?.altText || file.name,\r\n            cyfm_path: '', // Will be set by backend\r\n            cyfm_size_in_byte: file.size,\r\n            cyfm_type: file.type,\r\n            cyfm_creation_dt: new Date().toISOString(),\r\n            cyfm_id_user: uploadOptions?.userId || this._userId() || '',\r\n            cyfm_permissions: [] as [], // Match the interface type\r\n            cyfm_tags: uploadOptions?.tags || [],\r\n            cyfm_version: 1,\r\n            cyfm_file_status_sygmt: uploadOptions?.fileStatus || 'file_manager_file_status_active',\r\n            cyfm_group_id: uploadOptions?.groupId, // Group ID for multiple file uploads\r\n            cyfm_isactive: true,\r\n            cyfm_ismultiple: uploadOptions?.isMultiple || false,\r\n            cyfm_file_base64: base64Data,\r\n            cyfm_temp_unique_id: fileId\r\n          };\r\n\r\n          // Create the payload with proper typing\r\n          const payload: CoreFileManagerInsertUpdatePayload = new CoreFileManagerInsertUpdatePayload({\r\n            core_file_manager_new: [fileData],\r\n            core_file_manager_update: [],\r\n            core_file_manager_delete: []\r\n          });\r\n\r\n          // Angular 20: Enhanced HTTP request with retry logic and better error handling\r\n          // Use proper API endpoint from cloud-ide-lms-model\r\n          this.http.post<CoreFileManagerInsertUpdateResponse>(`${this._baseUrl()}/upload`, payload, {\r\n            reportProgress: true,\r\n            observe: 'events'\r\n          }).pipe(\r\n            retry(uploadOptions.retryAttempts || 3),\r\n            catchError(this.handleError.bind(this)),\r\n            finalize(() => {\r\n              this.removeFromUploadQueue(fileId);\r\n              // Don't remove from activeUploads - keep completed files visible with their final progress\r\n              // The floating uploader will handle cleanup when user closes it\r\n              if (this._uploadQueue().length === 0) {\r\n                this._isUploading.set(false);\r\n              }\r\n            }),\r\n            takeUntilDestroyed(this.destroyRef)\r\n          ).subscribe({\r\n            next: (event: any) => {\r\n              if (event.type === HttpEventType.UploadProgress && progressCallback) {\r\n                const uploadProgress = (event.loaded / event.total) * 50; // Upload is remaining 50%\r\n                const totalProgress = 50 + uploadProgress; // Total progress (50% file reading + upload progress)\r\n                progressCallback(totalProgress);\r\n                this.updateUploadProgress(fileId, {\r\n                  loaded: event.loaded,\r\n                  total: event.total,\r\n                  percentage: totalProgress,\r\n                  stage: 'uploading'\r\n                }, uploadOptions?.groupId);\r\n              } else if (event.type === HttpEventType.Response) {\r\n                if (progressCallback) {\r\n                  progressCallback(100);\r\n                }\r\n                this.updateUploadProgress(fileId, {\r\n                  loaded: 100,\r\n                  total: 100,\r\n                  percentage: 100,\r\n                  stage: 'complete'\r\n                }, uploadOptions?.groupId);\r\n                // Handle the CoreFileManagerInsertUpdateResponse\r\n                const response = event.body as CoreFileManagerInsertUpdateResponse;\r\n\r\n                if (response.success) {\r\n                  // Map temp file ID to actual file ID from response\r\n                  const fileData = response.data?.core_file_manager?.[0];\r\n                  const actualFileId = fileData?.cyfm_id;\r\n                  if (actualFileId && actualFileId !== fileId) {\r\n                    // Store the mapping\r\n                    const currentMapping = new Map(this._fileIdMapping());\r\n                    currentMapping.set(fileId, actualFileId);\r\n                    this._fileIdMapping.set(currentMapping);\r\n                  }\r\n\r\n                  observer.next(response);\r\n                  observer.complete();\r\n                } else {\r\n                  console.error('❌ [FileManagerService] Upload failed with response:', response);\r\n                  observer.error(new Error(response.message || 'Upload failed'));\r\n                }\r\n              }\r\n            },\r\n            error: (error) => {\r\n              console.error('❌ [FileManagerService] Upload failed:', error);\r\n              this._error.set(error.message || 'Upload failed');\r\n              this.updateUploadProgress(fileId, {\r\n                loaded: 0,\r\n                total: 100,\r\n                percentage: 0,\r\n                stage: 'error'\r\n              }, uploadOptions?.groupId);\r\n              observer.error(error);\r\n            }\r\n          });\r\n        } catch (error) {\r\n          console.error('❌ [FileManagerService] File processing error:', error);\r\n          this._error.set('Failed to process file');\r\n          observer.error(error);\r\n        }\r\n      };\r\n\r\n      reader.onerror = () => {\r\n        console.error('❌ [FileManagerService] File reading failed');\r\n        this._error.set('Failed to read file');\r\n        observer.error(new Error('Failed to read file'));\r\n      };\r\n\r\n      reader.readAsDataURL(file);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Set the base URL for API calls\r\n   * Angular 20: Using signal-based state management\r\n   * @param url The base URL for the API\r\n   */\r\n  setBaseUrl(url: string): void {\r\n    console.log('🔍 [FileManagerService] Setting base URL:', url);\r\n    this._baseUrl.set(url);\r\n  }\r\n\r\n  /**\r\n   * Set the user ID for file uploads\r\n   * Angular 20: Using signal-based state management\r\n   * @param userId The user ID to associate with uploaded files\r\n   */\r\n  setUserId(userId: string): void {\r\n    console.log('🔍 [FileManagerService] Setting user ID:', userId);\r\n    this._userId.set(userId);\r\n  }\r\n\r\n  /**\r\n   * Set the object ID generation endpoint\r\n   * Angular 20: Using signal-based state management\r\n   * @param endpoint The endpoint for generating object IDs (e.g., '/utility/generateObjectId')\r\n   */\r\n  setObjectIdEndpoint(endpoint: string): void {\r\n    console.log('🔍 [FileManagerService] Setting object ID endpoint:', endpoint);\r\n    this._objectIdEndpoint.set(endpoint);\r\n  }\r\n\r\n  /**\r\n   * Generate Object ID for group uploads\r\n   * Calls the backend API to generate a unique ObjectId for grouping multiple files\r\n   * Uses the configurable object ID endpoint instead of hardcoded path\r\n   * @returns Observable with the generated ObjectId\r\n   */\r\n  generateObjectId(): Observable<mongooseObjectIdCreateControllerResponse> {\r\n    const url = `${this._objectIdEndpoint()}`;\r\n\r\n    console.log('🆔 [FileManagerService] Generating ObjectId from:', url);\r\n    console.log('🔧 [FileManagerService] Using object ID endpoint:', this._objectIdEndpoint());\r\n\r\n    return this.http.get<mongooseObjectIdCreateControllerResponse>(url).pipe(\r\n      catchError((error: HttpErrorResponse) => {\r\n        console.error('❌ [FileManagerService] Error generating ObjectId:', error);\r\n        this._error.set(`Failed to generate ObjectId: ${error.message}`);\r\n        return throwError(() => error);\r\n      }),\r\n      takeUntilDestroyed(this.destroyRef)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Angular 20: Helper methods for state management\r\n   */\r\n  private generateFileId(file: File): string {\r\n    return `${file.name}_${file.size}_${Date.now()}`;\r\n  }\r\n\r\n  private addToUploadQueue(fileId: string): void {\r\n    const currentQueue = this._uploadQueue();\r\n    this._uploadQueue.set([...currentQueue, fileId]);\r\n  }\r\n\r\n  private removeFromUploadQueue(fileId: string): void {\r\n    const currentQueue = this._uploadQueue();\r\n    this._uploadQueue.set(currentQueue.filter(id => id !== fileId));\r\n  }\r\n\r\n  private updateUploadProgress(fileId: string, progress: UploadProgress, groupId?: string): void {\r\n    const currentUploads = new Map(this._activeUploads());\r\n    const progressWithGroupId = { ...progress, groupId };\r\n\r\n    currentUploads.set(fileId, progressWithGroupId);\r\n    this._activeUploads.set(currentUploads);\r\n  }\r\n\r\n  private removeActiveUpload(fileId: string): void {\r\n    const currentUploads = new Map(this._activeUploads());\r\n    currentUploads.delete(fileId);\r\n    this._activeUploads.set(currentUploads);\r\n  }\r\n\r\n  /**\r\n   * Angular 20: Enhanced error handling\r\n   */\r\n  private handleError(error: HttpErrorResponse): Observable<never> {\r\n    let errorMessage = 'An unknown error occurred';\r\n\r\n    if (error.error instanceof ErrorEvent) {\r\n      // Client-side error\r\n      errorMessage = `Client Error: ${error.error.message}`;\r\n    } else {\r\n      // Server-side error\r\n      errorMessage = `Server Error: ${error.status} - ${error.message}`;\r\n    }\r\n\r\n    console.error('❌ [FileManagerService] HTTP Error:', errorMessage);\r\n    this._error.set(errorMessage);\r\n\r\n    return throwError(() => new Error(errorMessage));\r\n  }\r\n\r\n  /**\r\n   * Get file details by ID\r\n   * @param payload The file ID to fetch details for\r\n   * @returns Observable with file details\r\n   */\r\n  getFileDetails(payload: MFileManager): Observable<fileManagerControllerResponse> {\r\n    console.log('🔍 [FileManagerService] Fetching file details for ID:', payload.cyfm_id);\r\n\r\n    return this.http.post<fileManagerControllerResponse>(`${this._baseUrl()}`, payload).pipe(\r\n      retry(2),\r\n      catchError(this.handleError.bind(this)),\r\n      takeUntilDestroyed(this.destroyRef)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get files by group ID and store them in service state\r\n   * @param groupId The group ID to fetch files for\r\n   * @returns Observable with files list\r\n   */\r\n  getFilesByGroupId(groupId: string): Observable<fileManagerListByGroupIdControllerResponse> {\r\n    console.log('🔍 [FileManagerService] Fetching files for group ID:', groupId);\r\n\r\n    const payload: MFileManagerListByGroupIdPayload = {\r\n      cyfm_group_id: groupId\r\n    };\r\n\r\n    // Convert payload to string using generateStringFromObject\r\n    const queryString = generateStringFromObject(payload);\r\n    console.log('📝 [FileManagerService] Query string generated:', queryString);\r\n\r\n    return this.http.get<fileManagerListByGroupIdControllerResponse>(`${this._baseUrl()}/group/${queryString}`).pipe(\r\n      retry(2),\r\n      catchError(this.handleError.bind(this)),\r\n      takeUntilDestroyed(this.destroyRef)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Fetch and store files by group ID in service state\r\n   * @param groupId The group ID to fetch files for\r\n   * @returns Observable that completes when files are stored\r\n   */\r\n  fetchAndStoreFilesByGroupId(groupId: string): Observable<any[]> {\r\n    console.log('📡 [FileManagerService] Fetching and storing files for group:', groupId);\r\n\r\n    return this.getFilesByGroupId(groupId).pipe(\r\n      map(response => {\r\n        console.log('📡 [FileManagerService] API Response for group', groupId, ':', response);\r\n\r\n        if (response.success && response.data && response.data.files) {\r\n          // Store files in service state\r\n          const currentFetchedFiles = new Map(this._fetchedFiles());\r\n          currentFetchedFiles.set(groupId, response.data.files);\r\n          this._fetchedFiles.set(currentFetchedFiles);\r\n\r\n          console.log('📁 [FileManagerService] Stored', response.data.files.length, 'files for group:', groupId);\r\n          console.log('📁 [FileManagerService] Files stored:', response.data.files.map(f => ({ id: f._id, name: f.cyfm_name })));\r\n\r\n          // Debug: Check if files are actually stored\r\n          const storedFiles = this.getFetchedFilesByGroupId(groupId);\r\n          console.log('📁 [FileManagerService] Verification - files now in storage:', storedFiles.length);\r\n\r\n          return response.data.files;\r\n        } else {\r\n          console.log('📡 [FileManagerService] No files in response or response not successful:', {\r\n            success: response.success,\r\n            hasData: !!response.data,\r\n            hasFiles: !!(response.data && response.data.files)\r\n          });\r\n        }\r\n        return [];\r\n      }),\r\n      catchError(error => {\r\n        console.error('❌ [FileManagerService] Failed to fetch files for group:', groupId, error);\r\n        return of([]);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get fetched files for a specific group ID\r\n   * @param groupId The group ID to get files for\r\n   * @returns Array of files for the group\r\n   */\r\n  getFetchedFilesByGroupId(groupId: string): any[] {\r\n    console.log(\"getFetchedFilesByGroupId getFetchedFilesByGroupId\", groupId);\r\n    console.log(\"getFetchedFilesByGroupId this._fetchedFiles()\", this._fetchedFiles());\r\n    console.log(\"getFetchedFilesByGroupId this._fetchedFiles().get(groupId)\", this._fetchedFiles().get(groupId));\r\n    return this._fetchedFiles().get(groupId) || [];\r\n  }\r\n\r\n  /**\r\n   * Signal to trigger floating uploader visibility\r\n   */\r\n  private readonly _showFloatingUploader = signal(false);\r\n  private readonly _triggerGroupId = signal<string | null>(null);\r\n  readonly showFloatingUploader = this._showFloatingUploader.asReadonly();\r\n  readonly getTriggerGroupId = this._triggerGroupId.asReadonly();\r\n\r\n  /**\r\n   * Trigger floating uploader to show with group ID\r\n   * This is the ONLY way to pass group ID to floating uploader\r\n   */\r\n  triggerFloatingUploaderShow(groupId?: string): void {\r\n    console.log('🎬 [FileManagerService] Triggering floating uploader to show with groupId:', groupId);\r\n    this._triggerGroupId.set(groupId || null);\r\n    this._showFloatingUploader.set(true);\r\n    // Reset after a short delay to allow components to react\r\n    setTimeout(() => {\r\n      this._showFloatingUploader.set(false);\r\n      this._triggerGroupId.set(null);\r\n    }, 100);\r\n  }\r\n\r\n  /**\r\n   * Get all files (active uploads + fetched files) for a group ID\r\n   * @param groupId The group ID to get files for\r\n   * @returns Combined array of active and fetched files\r\n   */\r\n  getAllFilesForGroup(groupId: string): Array<{ fileId: string; fileName: string; stage: string; percentage?: number }> {\r\n    const files: Array<{ fileId: string; fileName: string; stage: string; percentage?: number }> = [];\r\n    const processedIds = new Set<string>(); // Track all processed IDs (temp and actual)\r\n    const fileNames = new Set<string>(); // Track file names to prevent duplicates by name\r\n    const fileIdMapping = this._fileIdMapping();\r\n\r\n    // Add active uploads for this group\r\n    this._activeUploads().forEach((upload, tempFileId) => {\r\n      if (upload.groupId === groupId) {\r\n        const fileName = this.getFileNameFromId(tempFileId);\r\n        const actualFileId = fileIdMapping.get(tempFileId) || tempFileId;\r\n\r\n        // Check if we've already processed this file (by actual ID or name)\r\n        if (!processedIds.has(actualFileId) && !fileNames.has(fileName)) {\r\n          processedIds.add(tempFileId); // Track temp ID\r\n          processedIds.add(actualFileId); // Track actual ID\r\n          fileNames.add(fileName);\r\n\r\n          files.push({\r\n            fileId: tempFileId, // Keep temp ID for UI consistency\r\n            fileName,\r\n            stage: upload.stage,\r\n            percentage: upload.percentage\r\n          });\r\n        }\r\n      }\r\n    });\r\n\r\n    // Add fetched files for this group (only if not already processed)\r\n    const fetchedFiles = this.getFetchedFilesByGroupId(groupId);\r\n    fetchedFiles.forEach(file => {\r\n      const fetchedFileId = file._id;\r\n      const fetchedFileName = file.cyfm_name || 'Unknown file';\r\n\r\n      // Check if this file was already processed (either as temp or actual ID)\r\n      const isAlreadyProcessed = processedIds.has(fetchedFileId) || fileNames.has(fetchedFileName);\r\n\r\n      if (!isAlreadyProcessed) {\r\n        processedIds.add(fetchedFileId);\r\n        fileNames.add(fetchedFileName);\r\n\r\n        files.push({\r\n          fileId: fetchedFileId,\r\n          fileName: fetchedFileName,\r\n          stage: 'complete' // Fetched files are already completed\r\n        });\r\n      }\r\n    });\r\n\r\n    // Smart deduplication completed for group: ${groupId}\r\n\r\n    return files;\r\n  }\r\n\r\n  /**\r\n   * Get file name from file ID (extract from the ID format)\r\n   */\r\n  private getFileNameFromId(fileId: string): string {\r\n    const parts = fileId.split('_');\r\n    if (parts.length >= 3) {\r\n      return parts.slice(0, -2).join('_');\r\n    }\r\n    return fileId;\r\n  }\r\n\r\n  /**\r\n   * Angular 20: Service utility methods\r\n   */\r\n  clearError(): void {\r\n    this._error.set(null);\r\n  }\r\n\r\n  getUploadProgress(fileId: string): UploadProgress | undefined {\r\n    return this._activeUploads().get(fileId);\r\n  }\r\n\r\n  cancelUpload(fileId: string): void {\r\n    this.removeFromUploadQueue(fileId);\r\n    this.removeActiveUpload(fileId);\r\n    console.log('🚫 [FileManagerService] Upload cancelled for:', fileId);\r\n  }\r\n\r\n  /**\r\n   * Clear all completed uploads from active uploads\r\n   * Called when the floating uploader is closed\r\n   */\r\n  clearCompletedUploads(): void {\r\n    const currentUploads = new Map(this._activeUploads());\r\n    let hasChanges = false;\r\n\r\n    currentUploads.forEach((upload, fileId) => {\r\n      if (upload.stage === 'complete') {\r\n        currentUploads.delete(fileId);\r\n        hasChanges = true;\r\n        // Cleared completed upload\r\n      }\r\n    });\r\n\r\n    if (hasChanges) {\r\n      this._activeUploads.set(currentUploads);\r\n      // Cleared all completed uploads\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a specific completed upload from active uploads\r\n   */\r\n  removeCompletedUpload(fileId: string): void {\r\n    const currentUploads = new Map(this._activeUploads());\r\n    const upload = currentUploads.get(fileId);\r\n\r\n    if (upload && upload.stage === 'complete') {\r\n      currentUploads.delete(fileId);\r\n      this._activeUploads.set(currentUploads);\r\n\r\n      // Also clean up the file ID mapping for this temp ID\r\n      const currentMapping = new Map(this._fileIdMapping());\r\n      if (currentMapping.has(fileId)) {\r\n        currentMapping.delete(fileId);\r\n        this._fileIdMapping.set(currentMapping);\r\n        // Cleaned up mapping\r\n      }\r\n\r\n      // Removed completed upload\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Optimized method to get file count for a specific group\r\n   * Uses computed property for better performance\r\n   */\r\n  getFileCountForGroup(groupId: string): number {\r\n    return this.getFileCountByGroup().get(groupId) || 0;\r\n  }\r\n\r\n  /**\r\n   * Optimized method to check if group has active uploads\r\n   */\r\n  hasActiveUploadsForGroup(groupId: string): boolean {\r\n    return Array.from(this._activeUploads().values())\r\n      .some(upload => upload.groupId === groupId && upload.stage !== 'complete');\r\n  }\r\n\r\n  /**\r\n   * Angular 20: File validation utility\r\n   */\r\n  validateFile(file: File, maxSizeMB: number = 10, allowedTypes: string[] = []): { valid: boolean; error?: string } {\r\n    // Check file size\r\n    const maxSizeBytes = maxSizeMB * 1024 * 1024; // Convert MB to bytes\r\n    if (file.size > maxSizeBytes) {\r\n      return { valid: false, error: `File size exceeds ${maxSizeMB}MB limit` };\r\n    }\r\n\r\n    // Check file type\r\n    if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\r\n      return { valid: false, error: `File type ${file.type} is not allowed` };\r\n    }\r\n\r\n    return { valid: true };\r\n  }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nexport interface NotificationOptions {\n  message: string;\n  type?: 'success' | 'error' | 'warning' | 'info';\n  duration?: number;\n  showUndo?: boolean;\n  undoAction?: () => void;\n  undoText?: string;\n  icon?: string;\n  title?: string;\n  progress?: number; // Progress percentage (0-100)\n  showProgress?: boolean; // Whether to show progress bar\n}\n\nexport interface NotificationItem {\n  id: string;\n  message: string;\n  type: 'success' | 'error' | 'warning' | 'info';\n  duration: number;\n  showUndo: boolean;\n  undoAction?: () => void;\n  undoText: string;\n  icon: string;\n  title?: string;\n  timestamp: number;\n  isVisible: boolean;\n  progress?: number; // Progress percentage (0-100)\n  showProgress?: boolean; // Whether to show progress bar\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class NotificationService {\n  private notifications = signal<NotificationItem[]>([]);\n  private maxNotifications = 5; // Maximum notifications to show at once\n\n  // Computed signals\n  activeNotifications = computed(() => \n    this.notifications().filter(n => n.isVisible)\n  );\n\n  constructor() {}\n\n  /**\n   * Show a success notification\n   */\n  success(message: string, options?: Partial<NotificationOptions>): string {\n    return this.show({\n      message,\n      type: 'success',\n      icon: 'done',\n      duration: 3000,\n      ...options\n    });\n  }\n\n  /**\n   * Show an error notification\n   */\n  error(message: string, options?: Partial<NotificationOptions>): string {\n    return this.show({\n      message,\n      type: 'error',\n      icon: 'error',\n      duration: 5000,\n      ...options\n    });\n  }\n\n  /**\n   * Show a warning notification\n   */\n  warning(message: string, options?: Partial<NotificationOptions>): string {\n    return this.show({\n      message,\n      type: 'warning',\n      icon: 'warning',\n      duration: 4000,\n      ...options\n    });\n  }\n\n  /**\n   * Show an info notification\n   */\n  info(message: string, options?: Partial<NotificationOptions>): string {\n    return this.show({\n      message,\n      type: 'info',\n      icon: 'info',\n      duration: 3000,\n      ...options\n    });\n  }\n\n  /**\n   * Show a notification with undo functionality\n   */\n  showWithUndo(\n    message: string, \n    undoAction: () => void, \n    options?: Partial<NotificationOptions>\n  ): string {\n    return this.show({\n      message,\n      type: 'info',\n      icon: 'info',\n      duration: 8000,\n      showUndo: true,\n      undoAction,\n      undoText: 'Undo',\n      ...options\n    });\n  }\n\n  /**\n   * Show a notification for reversible destructive actions\n   */\n  showReversibleAction(\n    action: string,\n    itemName: string,\n    undoAction: () => void,\n    options?: Partial<NotificationOptions>\n  ): string {\n    return this.showWithUndo(\n      `${action} \"${itemName}\"`,\n      undoAction,\n      {\n        type: 'warning',\n        icon: 'delete',\n        title: `${action} completed`,\n        ...options\n      }\n    );\n  }\n\n  /**\n   * Show a notification for background tasks\n   */\n  showBackgroundTask(\n    taskName: string,\n    isComplete: boolean = true,\n    options?: Partial<NotificationOptions>\n  ): string {\n    return this.show({\n      message: isComplete ? `${taskName} completed successfully` : `${taskName} in progress...`,\n      type: isComplete ? 'success' : 'info',\n      icon: isComplete ? 'done' : 'sync',\n      duration: isComplete ? 3000 : 0, // Don't auto-dismiss for in-progress tasks\n      ...options\n    });\n  }\n\n  /**\n   * Show a progress notification\n   */\n  showProgress(\n    message: string,\n    progress: number = 0,\n    options?: Partial<NotificationOptions>\n  ): string {\n    return this.show({\n      message,\n      type: 'info',\n      icon: 'upload',\n      duration: 0, // Don't auto-dismiss\n      progress,\n      showProgress: true,\n      ...options\n    });\n  }\n\n  /**\n   * Update progress for an existing notification\n   */\n  updateProgress(id: string, progress: number, message?: string): void {\n    this.notifications.update(notifications => \n      notifications.map(n => \n        n.id === id ? { \n          ...n, \n          progress: Math.max(0, Math.min(100, progress)),\n          ...(message && { message })\n        } : n\n      )\n    );\n  }\n\n  /**\n   * Core show method\n   */\n  private show(options: NotificationOptions): string {\n    const notification: NotificationItem = {\n      id: this.generateId(),\n      message: options.message,\n      type: options.type || 'info',\n      duration: options.duration || 3000,\n      showUndo: options.showUndo || false,\n      undoAction: options.undoAction,\n      undoText: options.undoText || 'Undo',\n      icon: options.icon || this.getDefaultIcon(options.type || 'info'),\n      title: options.title,\n      timestamp: Date.now(),\n      isVisible: true,\n      progress: options.progress,\n      showProgress: options.showProgress || false\n    };\n\n    this.addNotification(notification);\n    return notification.id;\n  }\n\n  /**\n   * Remove a specific notification\n   */\n  remove(id: string): void {\n    this.notifications.update(notifications => \n      notifications.map(n => \n        n.id === id ? { ...n, isVisible: false } : n\n      )\n    );\n\n    // Remove from array after animation\n    setTimeout(() => {\n      this.notifications.update(notifications => \n        notifications.filter(n => n.id !== id)\n      );\n    }, 300);\n  }\n\n  /**\n   * Remove all notifications\n   */\n  clearAll(): void {\n    this.notifications.update(notifications => \n      notifications.map(n => ({ ...n, isVisible: false }))\n    );\n\n    setTimeout(() => {\n      this.notifications.set([]);\n    }, 300);\n  }\n\n  /**\n   * Execute undo action for a notification\n   */\n  executeUndo(id: string): void {\n    const notification = this.notifications().find(n => n.id === id);\n    if (notification && notification.undoAction) {\n      notification.undoAction();\n      this.remove(id);\n    }\n  }\n\n  // Internal methods\n  private addNotification(notification: NotificationItem): void {\n    this.notifications.update(notifications => {\n      const newNotifications = [...notifications, notification];\n      \n      // Limit the number of visible notifications\n      if (newNotifications.length > this.maxNotifications) {\n        // Remove oldest notifications\n        const toRemove = newNotifications.length - this.maxNotifications;\n        for (let i = 0; i < toRemove; i++) {\n          if (newNotifications[i]) {\n            newNotifications[i] = { ...newNotifications[i], isVisible: false };\n          }\n        }\n      }\n      \n      return newNotifications;\n    });\n\n    // Auto-remove after duration (if not 0)\n    if (notification.duration > 0) {\n      setTimeout(() => {\n        this.remove(notification.id);\n      }, notification.duration);\n    }\n  }\n\n  private generateId(): string {\n    return `notification-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  private getDefaultIcon(type: 'success' | 'error' | 'warning' | 'info'): string {\n    const iconMap = {\n      success: 'done',\n      error: 'error',\n      warning: 'warning',\n      info: 'info'\n    };\n    return iconMap[type];\n  }\n\n  // Public getters for components\n  getNotifications() {\n    return this.notifications;\n  }\n\n  getActiveNotifications() {\n    return this.activeNotifications;\n  }\n}\n\n","import { Injectable, signal, computed, Type, ComponentRef, ViewContainerRef, Injector } from '@angular/core';\r\nimport { FloatingContainerConfig } from './floating-container.component';\r\n// Note: Avoid importing FloatingContainerShortcutsService here to prevent circular dependency\r\n\r\n// Re-export for external use\r\nexport type { FloatingContainerConfig } from './floating-container.component';\r\n\r\nexport interface FloatingComponentConfig {\r\n  componentId: string;\r\n  componentType?: Type<any>;\r\n  inputs?: { [key: string]: any };\r\n  outputs?: { [key: string]: (event: any) => void };\r\n}\r\n\r\nexport interface FloatingContainerInstance {\r\n  id: string;\r\n  config: FloatingContainerConfig;\r\n  isVisible: boolean;\r\n  isMinimized: boolean;\r\n  isMaximized: boolean;\r\n  zIndex: number;\r\n  // Instance management\r\n  instanceId: string; // Unique instance identifier\r\n  componentType: string; // Component type for grouping\r\n  createdAt: Date;\r\n  lastAccessed: Date;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CideEleFloatingContainerService {\r\n  private containers = signal<Map<string, FloatingContainerInstance>>(new Map());\r\n  private nextZIndex = signal(1000);\r\n  private instanceCounter = signal(0);\r\n\r\n  // Dynamic component management\r\n  private componentRegistry = new Map<string, Type<any>>();\r\n  private activeComponents = new Map<string, ComponentRef<any>>();\r\n\r\n  constructor(\r\n    private injector: Injector\r\n  ) {\r\n    // Keyboard shortcuts are registered by FloatingContainerShortcutsService independently\r\n  }\r\n\r\n  // Computed properties\r\n  visibleContainers = computed(() =>\r\n    Array.from(this.containers().values()).filter(container => container.isVisible)\r\n  );\r\n\r\n  minimizedContainers = computed(() =>\r\n    Array.from(this.containers().values()).filter(container => container.isMinimized)\r\n  );\r\n\r\n  maximizedContainers = computed(() =>\r\n    Array.from(this.containers().values()).filter(container => container.isMaximized)\r\n  );\r\n\r\n  // Container management methods\r\n  show(config: FloatingContainerConfig): string {\r\n    const containerId = config.id || this.generateId();\r\n    const instanceId = this.generateInstanceId(config.componentId || 'default');\r\n    // Get the highest z-index and add 1 to bring new container to front\r\n    const maxZIndex = this.getMaxZIndex();\r\n    const zIndex = maxZIndex + 1;\r\n    const now = new Date();\r\n\r\n    const container: FloatingContainerInstance = {\r\n      id: containerId,\r\n      config: { ...config, id: containerId },\r\n      isVisible: true,\r\n      isMinimized: false,\r\n      isMaximized: false,\r\n      zIndex,\r\n      instanceId,\r\n      componentType: config.componentId || 'default',\r\n      createdAt: now,\r\n      lastAccessed: now\r\n    };\r\n\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      newContainers.set(containerId, container);\r\n      return newContainers;\r\n    });\r\n\r\n    this.nextZIndex.update(z => z + 1);\r\n    return containerId;\r\n  }\r\n\r\n  hide(containerId: string): void {\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      const container = newContainers.get(containerId);\r\n      if (container) {\r\n        container.isVisible = false;\r\n        newContainers.set(containerId, container);\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get the maximum z-index among all visible containers\r\n   */\r\n  private getMaxZIndex(): number {\r\n    const containers = this.containers();\r\n    let maxZIndex = 1000; // Base z-index\r\n\r\n    for (const container of containers.values()) {\r\n      if (container.isVisible && container.zIndex > maxZIndex) {\r\n        maxZIndex = container.zIndex;\r\n      }\r\n    }\r\n\r\n    return maxZIndex;\r\n  }\r\n\r\n  /**\r\n   * Bring a container to the front (highest z-index)\r\n   */\r\n  bringToFront(containerId: string): void {\r\n    const maxZIndex = this.getMaxZIndex();\r\n    const newZIndex = maxZIndex + 1;\r\n    const baseZIndex = 1000;\r\n\r\n    console.log(`🎯 [FloatingContainer] Bringing container '${containerId}' to front`);\r\n    console.log(`🎯 [FloatingContainer] Current max z-index: ${maxZIndex}, new z-index: ${newZIndex}`);\r\n\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n\r\n      // First, decrement all other visible containers by 1 (clamped to base)\r\n      for (const [id, c] of newContainers) {\r\n        if (c.isVisible && id !== containerId) {\r\n          const decremented = Math.max(baseZIndex, (c.zIndex || baseZIndex) - 1);\r\n          if (decremented !== c.zIndex) {\r\n            c.zIndex = decremented;\r\n            c.lastAccessed = new Date();\r\n            newContainers.set(id, c);\r\n          }\r\n        }\r\n      }\r\n\r\n      // Then set the focused container to max + 1\r\n      const container = newContainers.get(containerId);\r\n      if (container) {\r\n        const oldZIndex = container.zIndex;\r\n        container.zIndex = newZIndex;\r\n        container.lastAccessed = new Date();\r\n        newContainers.set(containerId, container);\r\n        console.log(`🎯 [FloatingContainer] Container '${containerId}' z-index updated: ${oldZIndex} → ${newZIndex}`);\r\n      } else {\r\n        console.warn(`⚠️ [FloatingContainer] Container '${containerId}' not found!`);\r\n      }\r\n\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n\r\n  minimize(containerId: string): void {\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      const container = newContainers.get(containerId);\r\n      if (container) {\r\n        container.isMinimized = !container.isMinimized;\r\n        newContainers.set(containerId, container);\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n  maximize(containerId: string): void {\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      const container = newContainers.get(containerId);\r\n      if (container) {\r\n        container.isMaximized = !container.isMaximized;\r\n        newContainers.set(containerId, container);\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n\r\n  getContainer(containerId: string): FloatingContainerInstance | undefined {\r\n    return this.containers().get(containerId);\r\n  }\r\n\r\n  isVisible(containerId: string): boolean {\r\n    const container = this.getContainer(containerId);\r\n    return container ? container.isVisible : false;\r\n  }\r\n\r\n  isMinimized(containerId: string): boolean {\r\n    const container = this.getContainer(containerId);\r\n    return container ? container.isMinimized : false;\r\n  }\r\n\r\n  isMaximized(containerId: string): boolean {\r\n    const container = this.getContainer(containerId);\r\n    return container ? container.isMaximized : false;\r\n  }\r\n\r\n  hideAll(): void {\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      for (const [id, container] of newContainers) {\r\n        container.isVisible = false;\r\n        newContainers.set(id, container);\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n  minimizeAll(): void {\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      for (const [id, container] of newContainers) {\r\n        if (container.isVisible) {\r\n          container.isMinimized = true;\r\n          newContainers.set(id, container);\r\n        }\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n  private generateId(): string {\r\n    return `floating-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n  }\r\n\r\n  private generateInstanceId(componentType: string): string {\r\n    const counter = this.instanceCounter() + 1;\r\n    this.instanceCounter.update(c => c + 1);\r\n    return `${componentType}-instance-${counter}-${Date.now()}`;\r\n  }\r\n\r\n  // Multiple instance management methods\r\n  getInstancesByComponentType(componentType: string): FloatingContainerInstance[] {\r\n    return Array.from(this.containers().values())\r\n      .filter(container => container.componentType === componentType);\r\n  }\r\n\r\n  getActiveInstancesByComponentType(componentType: string): FloatingContainerInstance[] {\r\n    return Array.from(this.containers().values())\r\n      .filter(container => container.componentType === componentType && container.isVisible);\r\n  }\r\n\r\n  getInstanceCount(componentType: string): number {\r\n    return this.getInstancesByComponentType(componentType).length;\r\n  }\r\n\r\n  getActiveInstanceCount(componentType: string): number {\r\n    return this.getActiveInstancesByComponentType(componentType).length;\r\n  }\r\n\r\n  // Close all instances of a component type\r\n  closeAllInstancesOfType(componentType: string): void {\r\n    const instances = this.getInstancesByComponentType(componentType);\r\n    instances.forEach(instance => {\r\n      this.hide(instance.id);\r\n    });\r\n  }\r\n\r\n  // Minimize all instances of a component type\r\n  minimizeAllInstancesOfType(componentType: string): void {\r\n    const instances = this.getActiveInstancesByComponentType(componentType);\r\n    instances.forEach(instance => {\r\n      this.minimize(instance.id);\r\n    });\r\n  }\r\n\r\n  // Bring all instances of a component type to front\r\n  bringAllInstancesToFront(componentType: string): void {\r\n    const instances = this.getActiveInstancesByComponentType(componentType);\r\n    instances.forEach(instance => {\r\n      this.bringToFront(instance.id);\r\n    });\r\n  }\r\n\r\n  // Get instance by unique instance ID\r\n  getInstanceByInstanceId(instanceId: string): FloatingContainerInstance | undefined {\r\n    return Array.from(this.containers().values())\r\n      .find(container => container.instanceId === instanceId);\r\n  }\r\n\r\n  // Update last accessed time\r\n  updateLastAccessed(containerId: string): void {\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      const container = newContainers.get(containerId);\r\n      if (container) {\r\n        container.lastAccessed = new Date();\r\n        newContainers.set(containerId, container);\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n  // ===== DYNAMIC COMPONENT MANAGEMENT =====\r\n\r\n  /**\r\n   * Register a component for dynamic loading\r\n   */\r\n  registerComponent(componentId: string, componentType: Type<any>): void {\r\n    this.componentRegistry.set(componentId, componentType);\r\n  }\r\n\r\n  /**\r\n   * Unregister a component\r\n   */\r\n  unregisterComponent(componentId: string): void {\r\n    this.componentRegistry.delete(componentId);\r\n  }\r\n\r\n  /**\r\n   * Get registered component type\r\n   */\r\n  getComponentType(componentId: string): Type<any> | undefined {\r\n    return this.componentRegistry.get(componentId);\r\n  }\r\n\r\n  /**\r\n   * Check if component is registered\r\n   */\r\n  isComponentRegistered(componentId: string): boolean {\r\n    return this.componentRegistry.has(componentId);\r\n  }\r\n\r\n  /**\r\n   * Get registered component IDs\r\n   */\r\n  getRegisteredComponentIds(): string[] {\r\n    return Array.from(this.componentRegistry.keys());\r\n  }\r\n\r\n  /**\r\n   * Create and load component dynamically\r\n   */\r\n  loadComponent(\r\n    componentId: string,\r\n    viewContainer: ViewContainerRef,\r\n    config?: FloatingComponentConfig\r\n  ): ComponentRef<any> | null {\r\n    const componentType = this.componentRegistry.get(componentId);\r\n\r\n    if (!componentType) {\r\n      return null;\r\n    }\r\n\r\n    try {\r\n      viewContainer.clear();\r\n      const componentRef = viewContainer.createComponent(componentType, {\r\n        injector: this.injector\r\n      });\r\n\r\n      // Set inputs if provided\r\n      if (config?.inputs) {\r\n        Object.keys(config.inputs).forEach(key => {\r\n          if (componentRef.instance && typeof componentRef.instance === 'object' && key in componentRef.instance) {\r\n            (componentRef.instance as any)[key] = config.inputs![key];\r\n          }\r\n        });\r\n      }\r\n\r\n      // Set outputs if provided\r\n      if (config?.outputs) {\r\n        Object.keys(config.outputs).forEach(key => {\r\n          if (componentRef.instance && typeof componentRef.instance === 'object' && key in componentRef.instance) {\r\n            const output = (componentRef.instance as any)[key];\r\n            if (output && typeof output.subscribe === 'function') {\r\n              output.subscribe(config.outputs![key]);\r\n            }\r\n          }\r\n        });\r\n      }\r\n\r\n      this.activeComponents.set(componentId, componentRef);\r\n      return componentRef;\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroy component\r\n   */\r\n  destroyComponent(componentId: string): void {\r\n    const componentRef = this.activeComponents.get(componentId);\r\n    if (componentRef) {\r\n      componentRef.destroy();\r\n      this.activeComponents.delete(componentId);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get active component count\r\n   */\r\n  getActiveComponentCount(): number {\r\n    return this.activeComponents.size;\r\n  }\r\n\r\n  /**\r\n   * Clear all active components\r\n   */\r\n  clearActiveComponents(): void {\r\n    this.activeComponents.forEach(componentRef => componentRef.destroy());\r\n    this.activeComponents.clear();\r\n  }\r\n\r\n  // ===== CONTAINER MANAGER FUNCTIONALITY =====\r\n\r\n  /**\r\n   * Get config signal for a container\r\n   */\r\n  getConfigSignal(config: FloatingContainerConfig) {\r\n    return signal(config);\r\n  }\r\n\r\n  /**\r\n   * Get minimized signal for a container\r\n   */\r\n  getMinimizedSignal(containerId: string) {\r\n    return computed(() => {\r\n      const container = this.getContainer(containerId);\r\n      return container?.isMinimized || false;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get maximized signal for a container\r\n   */\r\n  getMaximizedSignal(containerId: string) {\r\n    return computed(() => {\r\n      const container = this.getContainer(containerId);\r\n      return container?.isMaximized || false;\r\n    });\r\n  }\r\n\r\n  getZIndexSignal(containerId: string) {\r\n    return computed(() => {\r\n      const container = this.getContainer(containerId);\r\n      const zIndex = container?.zIndex || 1000;\r\n      console.log(`🎯 [FloatingContainer] Z-index signal for '${containerId}': ${zIndex}`);\r\n      return zIndex;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Set z-index for a specific container\r\n   */\r\n  setZIndex(containerId: string, zIndex: number): void {\r\n    console.log(`🎯 [FloatingContainer] Setting z-index for '${containerId}' to ${zIndex}`);\r\n\r\n    this.containers.update(containers => {\r\n      const newContainers = new Map(containers);\r\n      const container = newContainers.get(containerId);\r\n      if (container) {\r\n        const oldZIndex = container.zIndex;\r\n        container.zIndex = zIndex;\r\n        container.lastAccessed = new Date();\r\n        newContainers.set(containerId, container);\r\n        console.log(`🎯 [FloatingContainer] Container '${containerId}' z-index updated: ${oldZIndex} → ${zIndex}`);\r\n      } else {\r\n        console.warn(`⚠️ [FloatingContainer] Container '${containerId}' not found for z-index update!`);\r\n      }\r\n      return newContainers;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get visible signal for a container\r\n   */\r\n  getVisibleSignal(containerId: string) {\r\n    return computed(() => {\r\n      const container = this.getContainer(containerId);\r\n      return container?.isVisible || false;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get component config for dynamic loading\r\n   */\r\n  getComponentConfig(config: FloatingContainerConfig) {\r\n    if (config.componentConfig) {\r\n      return {\r\n        componentId: config.componentId || config.id,\r\n        inputs: config.componentConfig.inputs,\r\n        outputs: config.componentConfig.outputs\r\n      };\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  /**\r\n   * Handle container close event\r\n   */\r\n  onClose(containerId: string): void {\r\n    this.hide(containerId);\r\n  }\r\n\r\n  /**\r\n   * Handle container minimize event\r\n   */\r\n  onMinimize(containerId: string): void {\r\n    this.minimize(containerId);\r\n  }\r\n\r\n  /**\r\n   * Handle container maximize event\r\n   */\r\n  onMaximize(containerId: string): void {\r\n    this.maximize(containerId);\r\n  }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from '../../components/floating-container/floating-container.service';\r\n\r\nexport interface FileUploaderData {\r\n  groupId?: string;\r\n  userId?: string;\r\n  allowedTypes?: string[];\r\n  maxFileSize?: number;\r\n  uploadPath?: string;\r\n  multiple?: boolean;\r\n  autoUpload?: boolean;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CideEleFloatingFileUploaderService {\r\n  private containerService = inject(CideEleFloatingContainerService);\r\n\r\n  constructor() {\r\n    // Auto-register file uploader component on service initialization\r\n    this.initializeFileUploader();\r\n  }\r\n\r\n  private async initializeFileUploader(): Promise<void> {\r\n    // Check if already registered to avoid duplicate registration\r\n    if (this.containerService.isComponentRegistered('file-uploader')) {\r\n      console.log('✅ File uploader component already registered');\r\n      return;\r\n    }\r\n\r\n    try {\r\n      // Use relative import to avoid circular dependency\r\n      const module = await import('./floating-file-uploader.component');\r\n      if (module.CideEleFloatingFileUploaderComponent) {\r\n        this.containerService.registerComponent('file-uploader', module.CideEleFloatingFileUploaderComponent);\r\n        console.log('✅ File uploader component registered successfully');\r\n      }\r\n    } catch (error) {\r\n      console.error('❌ Failed to register file uploader component:', error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Show file uploader in floating container\r\n   */\r\n  async show(data?: FileUploaderData): Promise<string> {\r\n    console.log('🚀 Showing file uploader...');\r\n    console.log('📋 Current registered components:', this.containerService.getRegisteredComponentIds());\r\n\r\n    // Ensure component is registered before showing\r\n    if (!this.containerService.isComponentRegistered('file-uploader')) {\r\n      console.log('📝 File uploader component not registered, registering now...');\r\n      await this.initializeFileUploader();\r\n      console.log('📋 Components after registration:', this.containerService.getRegisteredComponentIds());\r\n    } else {\r\n      console.log('✅ File uploader component already registered');\r\n    }\r\n\r\n    const config: FloatingContainerConfig = {\r\n      id: 'file-uploader-main',\r\n      title: 'File Uploader',\r\n      icon: 'cloud_upload',\r\n      width: '500px',\r\n      height: '400px',\r\n      minWidth: '400px',\r\n      minHeight: '300px',\r\n      resizable: true,\r\n      draggable: true,\r\n      closable: true,\r\n      minimizable: true,\r\n      maximizable: true,\r\n      componentId: 'file-uploader',\r\n      componentConfig: data ? {\r\n        inputs: { data },\r\n        outputs: {}\r\n      } : { inputs: ({} as any), outputs: ({} as any) }\r\n    };\r\n\r\n    const containerId = this.containerService.show(config);\r\n    console.log('✅ Container created with ID:', containerId);\r\n    return containerId;\r\n  }\r\n\r\n  /**\r\n   * Hide file uploader\r\n   */\r\n  hide(): void {\r\n    this.containerService.hide('file-uploader-main');\r\n  }\r\n\r\n  /**\r\n   * Show file uploader with specific group ID\r\n   */\r\n  async showWithGroupId(groupId: string, additionalData?: Partial<FileUploaderData>): Promise<string> {\r\n    const data: FileUploaderData = {\r\n      groupId,\r\n      ...additionalData\r\n    };\r\n    return this.show(data);\r\n  }\r\n\r\n  /**\r\n   * Show file uploader for user with specific settings\r\n   */\r\n  async showForUser(userId: string, settings?: Partial<FileUploaderData>): Promise<string> {\r\n    const data: FileUploaderData = {\r\n      userId,\r\n      allowedTypes: ['image/*', 'application/pdf', 'text/*'],\r\n      maxFileSize: 10485760, // 10MB\r\n      multiple: true,\r\n      autoUpload: false,\r\n      ...settings\r\n    };\r\n    return this.show(data);\r\n  }\r\n}\r\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  OnDestroy,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  inject,\n  signal,\n  computed,\n  effect,\n  DestroyRef,\n  afterRenderEffect,\n  afterNextRender,\n  PendingTasks\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule, Validator, NG_VALIDATORS, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CideIconComponent } from '../icon/icon.component';\nimport { CideEleFileManagerService, FileUploadOptions } from '../../services/file-manager.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\nimport { CideEleFloatingFileUploaderComponent } from '../floating-file-uploader/floating-file-uploader.component';\nimport { CideEleFloatingFileUploaderService } from '../floating-file-uploader/floating-file-uploader.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData } from '../../interfaces/core-file-manager.interface';\n\n/**\n * Angular 20: Proper TypeScript interface for file upload data\n * This interface defines the structure of additional data that can be sent with file uploads\n */\nexport interface FileUploadData {\n  /** Alternative text for the uploaded file (useful for accessibility) */\n  altText?: string;\n  /** User ID associated with the upload */\n  userId?: string;\n  /** Array of permissions for the uploaded file */\n  permissions?: string[];\n  /** Array of tags to categorize the uploaded file */\n  tags?: string[];\n  /** Status of the file (e.g., 'active', 'pending', 'archived') */\n  fileStatus?: \"file_manager_file_status_active\";\n  /** Group ID for multiple file uploads */\n  groupId?: string;\n  /** Allow additional properties with proper typing */\n  [key: string]: string | number | string[] | undefined;\n}\n\n@Component({\n  selector: 'cide-ele-file-input',\n  standalone: true,\n  templateUrl: './file-input.component.html',\n  styleUrl: './file-input.component.scss',\n  imports: [CommonModule, FormsModule, CideIconComponent],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: CideEleFileInputComponent,\n      multi: true\n    },\n    {\n      provide: NG_VALIDATORS,\n      useExisting: CideEleFileInputComponent,\n      multi: true\n    }\n  ]\n})\nexport class CideEleFileInputComponent implements ControlValueAccessor, OnDestroy, OnInit, OnChanges, Validator {\n  private readonly fileManagerService = inject(CideEleFileManagerService);\n  private readonly notificationService = inject(NotificationService);\n  private readonly elementService = inject(CideElementsService);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly floatingFileUploaderService = inject(CideEleFloatingFileUploaderService);\n  // private readonly pendingTasks = inject(PendingTasks); // TODO: Fix PendingTasks API usage\n\n  // Traditional @Input() decorators\n  @Input() label: string = 'Choose file';\n  @Input() accept: string = '';\n  @Input() multiple: boolean = false;\n  @Input() disabled: boolean = false;\n  @Input() required: boolean = false;\n  @Input() helperText: string = '';\n  @Input() errorText: string = '';\n  @Input() showPreview: boolean = false;\n  @Input() previewWidth: string = '200px';\n  @Input() previewHeight: string = '200px';\n  @Input() previewBoxMode: boolean = false;\n  @Input() showFileName: boolean = true;\n  @Input() placeholderText: string = 'Click to select image';\n  @Input() placeholderIcon: string = '📷';\n  @Input() autoUpload: boolean = false;\n  @Input() uploadData: FileUploadData = {};\n  @Input() showFloatingUploader: boolean = true;\n  @Input() floatingUploaderGroupId?: string;\n\n  // Traditional @Output() decorators\n  @Output() fileChange = new EventEmitter<FileList | null>();\n  @Output() uploadSuccess = new EventEmitter<string>();\n  @Output() uploadError = new EventEmitter<string>();\n  @Output() uploadProgressChange = new EventEmitter<number>();\n\n  // Readable signals created from @Input() decorator values\n  readonly labelSignal = signal(this.label);\n  readonly acceptSignal = signal(this.accept);\n  readonly multipleSignal = signal(this.multiple);\n  readonly disabledSignal = signal(this.disabled);\n  readonly requiredSignal = signal(this.required);\n  readonly helperTextSignal = signal(this.helperText);\n  readonly errorTextSignal = signal(this.errorText);\n  readonly showPreviewSignal = signal(this.showPreview);\n  readonly previewWidthSignal = signal(this.previewWidth);\n  readonly previewHeightSignal = signal(this.previewHeight);\n  readonly previewBoxModeSignal = signal(this.previewBoxMode);\n  readonly showFileNameSignal = signal(this.showFileName);\n  readonly placeholderTextSignal = signal(this.placeholderText);\n  readonly placeholderIconSignal = signal(this.placeholderIcon);\n  readonly autoUploadSignal = signal(this.autoUpload);\n  readonly uploadDataSignal = signal(this.uploadData);\n  readonly showFloatingUploaderSignal = signal(this.showFloatingUploader);\n  readonly floatingUploaderGroupIdSignal = signal(this.floatingUploaderGroupId);\n\n  // Reactive state with signals\n  readonly id = signal(Math.random().toString(36).substring(2, 10));\n  readonly isUploading = signal(false);\n  readonly uploadProgress = signal(0);\n  readonly uploadStatus = signal<'idle' | 'start' | 'uploading' | 'success' | 'error'>('idle');\n  readonly files = signal<FileList | null>(null);\n  readonly fileNames = signal<string[]>([]);\n  readonly previewUrls = signal<string[]>([]);\n  readonly downloadUrls = signal<string[]>([]);\n  readonly uploadNotificationId = signal<string | null>(null);\n  readonly isDragOver = signal(false);\n  readonly groupId = signal<string | null>(null); // Group ID for multiple file uploads\n  readonly isMultipleUploadMode = signal(false); // Flag to track if we're in multiple upload mode\n  readonly hasEverUploaded = signal(false); // Track if this component has ever uploaded files\n  readonly failedFile = signal<File | null>(null); // Store failed file for retry\n\n  // Computed signals for better relationships\n  readonly hasFiles = computed(() => (this.files() !== null && this.files()!.length > 0) || this.fileNames().length > 0);\n  readonly canUpload = computed(() => this.hasFiles() && !this.isUploading() && !this.disabledSignal());\n  readonly isInErrorState = computed(() => this.uploadStatus() === 'error');\n  readonly isInSuccessState = computed(() => this.uploadStatus() === 'success');\n  readonly canRetry = computed(() => this.isInErrorState() && this.failedFile() !== null && !this.isUploading() && !this.disabledSignal());\n\n  // Optimized computed values - only calculate when needed\n  readonly totalFileSize = computed(() => {\n    const files = this.files();\n    return files ? Array.from(files).reduce((total, file) => total + file.size, 0) : 0;\n  });\n\n  readonly fileSizeInMB = computed(() => (this.totalFileSize() / 1048576).toFixed(2)); // 1024^2 = 1048576\n\n  // ControlValueAccessor callbacks\n  private onChange = (value: FileList | string | null) => { };\n  private onTouched = () => { };\n  private onValidatorChange = () => { };\n\n  // Computed values\n  readonly hasImages = computed(() => this.previewUrls().length > 0);\n  readonly isPreviewBoxMode = computed(() => this.previewBoxModeSignal() && this.showPreviewSignal());\n  readonly isImagePreviewAvailable = computed(() => this.showPreviewSignal() && this.previewUrls().length > 0);\n\n  constructor() {\n    // Minimal DOM operations - only when necessary\n  }\n\n  ngOnInit() {\n    // Update signals with initial @Input() values\n    this.labelSignal.set(this.label);\n    this.acceptSignal.set(this.accept);\n    this.multipleSignal.set(this.multiple);\n    this.disabledSignal.set(this.disabled);\n    this.requiredSignal.set(this.required);\n    this.helperTextSignal.set(this.helperText);\n    this.errorTextSignal.set(this.errorText);\n    this.showPreviewSignal.set(this.showPreview);\n    this.previewWidthSignal.set(this.previewWidth);\n    this.previewHeightSignal.set(this.previewHeight);\n    this.previewBoxModeSignal.set(this.previewBoxMode);\n    this.showFileNameSignal.set(this.showFileName);\n    this.placeholderTextSignal.set(this.placeholderText);\n    this.placeholderIconSignal.set(this.placeholderIcon);\n    this.autoUploadSignal.set(this.autoUpload);\n    this.uploadDataSignal.set(this.uploadData);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Angular 20: Update signals when @Input() values change\n    if (changes['label']) this.labelSignal.set(this.label);\n    if (changes['accept']) this.acceptSignal.set(this.accept);\n    if (changes['multiple']) this.multipleSignal.set(this.multiple);\n    if (changes['disabled']) this.disabledSignal.set(this.disabled);\n    if (changes['required']) this.requiredSignal.set(this.required);\n    if (changes['helperText']) this.helperTextSignal.set(this.helperText);\n    if (changes['errorText']) this.errorTextSignal.set(this.errorText);\n    if (changes['showPreview']) this.showPreviewSignal.set(this.showPreview);\n    if (changes['previewWidth']) this.previewWidthSignal.set(this.previewWidth);\n    if (changes['previewHeight']) this.previewHeightSignal.set(this.previewHeight);\n    if (changes['previewBoxMode']) this.previewBoxModeSignal.set(this.previewBoxMode);\n    if (changes['showFileName']) this.showFileNameSignal.set(this.showFileName);\n    if (changes['placeholderText']) this.placeholderTextSignal.set(this.placeholderText);\n    if (changes['placeholderIcon']) this.placeholderIconSignal.set(this.placeholderIcon);\n    if (changes['autoUpload']) this.autoUploadSignal.set(this.autoUpload);\n    if (changes['uploadData']) this.uploadDataSignal.set(this.uploadData);\n  }\n\n  writeValue(value: FileList | string | null): void {\n    console.log('📝 [FileInput] writeValue called with:', value);\n\n    if (typeof value === 'string') {\n      // Check if this is a group ID for multiple files or single file ID\n      if (this.isMultipleFileMode()) {\n        // Multiple file mode - value is group ID\n        console.log('📁 [FileInput] Value is group ID for multiple files:', value);\n        this.groupId.set(value);\n        this.loadFilesFromGroupId(value);\n      } else {\n        // Single file mode - value is file ID\n        console.log('📝 [FileInput] Value is single file ID:', value);\n        this.files.set(null);\n        this.fileNames.set([]);\n        this.clearPreviews();\n\n        // Fetch file details to get base64 and set preview\n        this.loadFileDetailsFromId(value);\n      }\n    } else if (value instanceof FileList) {\n      // Value is a FileList\n      console.log('📝 [FileInput] Value is FileList:', Array.from(value).map(f => f.name));\n      this.files.set(value);\n      this.fileNames.set(Array.from(value).map(f => f.name));\n      this.generatePreviews();\n\n      // For multiple files, use group ID API to fetch files\n      if (value.length > 1) {\n        const groupId = this.groupId();\n        if (groupId) {\n          console.log('📁 [FileInput] Multiple files detected, fetching files for group:', groupId);\n          this.loadFilesFromGroupId(groupId);\n        }\n      }\n    } else {\n      // Value is null\n      console.log('📝 [FileInput] Value is null');\n      this.files.set(null);\n      this.fileNames.set([]);\n      this.clearPreviews();\n    }\n  }\n\n  registerOnChange(fn: (value: FileList | string | null) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  registerOnValidatorChange(fn: () => void): void {\n    this.onValidatorChange = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    // Note: With input signals, disabled state is controlled by the parent component\n    // This method is kept for ControlValueAccessor compatibility but doesn't modify the signal\n    console.log('🔧 [FileInput] setDisabledState called with:', isDisabled, '(controlled by parent component)');\n  }\n\n  onFileSelected(event: Event) {\n    const input = event.target as HTMLInputElement;\n    const selectedFiles = input.files;\n\n    if (selectedFiles) {\n      this.handleFileSelection(selectedFiles);\n    }\n  }\n\n  clearFiles() {\n    console.log('🗑️ [FileInput] clearFiles called');\n    this.files.set(null);\n    this.fileNames.set([]);\n    this.clearPreviews();\n    this.downloadUrls.set([]);\n    this.uploadStatus.set('idle');\n    this.failedFile.set(null); // Clear failed file when clearing files\n    console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n    this.onChange(null);\n    this.fileChange.emit(null);\n  }\n\n  /**\n   * Retry uploading the failed file\n   */\n  retryUpload(): void {\n    const failedFile = this.failedFile();\n    if (!failedFile) {\n      console.warn('⚠️ [FileInput] No failed file to retry');\n      return;\n    }\n\n    console.log('🔄 [FileInput] Retrying upload for file:', failedFile.name);\n\n    // Clear the failed file reference (will be set again if retry fails)\n    this.failedFile.set(null);\n\n    // Reset upload status and retry\n    this.uploadStatus.set('idle');\n    this.uploadFile(failedFile);\n  }\n\n  private uploadFile(file: File) {\n    console.log('🚨 [FileInput] uploadFile called for:', file.name, '- SINGLE UPLOAD INITIATED');\n\n    // Angular 20: Use PendingTasks for better loading state management\n    // const uploadTask = this.pendingTasks.add(); // TODO: Fix PendingTasks API usage\n    // console.log('⏳ [FileInput] Pending task added for upload tracking');\n\n    // Set upload status to 'start' before starting upload\n    this.uploadStatus.set('start');\n    console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n\n    this.isUploading.set(true);\n    this.uploadProgress.set(0);\n    this.uploadProgressChange.emit(0);\n    console.log('📊 [FileInput] Upload progress initialized to 0%');\n\n    // Make form control invalid during upload - this prevents form submission\n    this.onChange(null);\n    console.log('🚫 [FileInput] Form control value set to null to prevent submission');\n\n    // Show initial progress notification with spinner (persistent - no auto-dismiss)\n    const notificationId = this.notificationService.showProgress('🔄 Preparing file upload...', 0, { duration: 0 });\n    this.uploadNotificationId.set(notificationId);\n    console.log('🔔 [FileInput] Progress notification started with ID:', notificationId);\n\n    this.fileManagerService.uploadFile(file, this.uploadDataSignal(), (progress: number) => {\n      // Real progress callback from file manager service\n      this.uploadProgress.set(progress);\n      this.uploadProgressChange.emit(progress);\n      // Upload progress updated\n\n      // Set upload status to 'uploading' when progress starts\n      if (this.uploadStatus() === 'start') {\n        this.uploadStatus.set('uploading');\n        console.log('🔄 [FileInput] Upload status changed to:', this.uploadStatus());\n      }\n\n      // Update progress notification with spinner\n      const notificationId = this.uploadNotificationId();\n      if (notificationId) {\n        let progressMessage = '';\n        if (progress < 10) {\n          progressMessage = '🔄 Starting upload...';\n        } else if (progress < 25) {\n          progressMessage = '🔄 Uploading file...';\n        } else if (progress < 50) {\n          progressMessage = '🔄 Upload in progress...';\n        } else if (progress < 75) {\n          progressMessage = '🔄 Almost done...';\n        } else if (progress < 95) {\n          progressMessage = '🔄 Finishing upload...';\n        } else {\n          progressMessage = '🔄 Finalizing...';\n        }\n\n        this.notificationService.updateProgress(\n          notificationId,\n          progress,\n          progressMessage\n        );\n      }\n    }).pipe(\n      takeUntilDestroyed(this.destroyRef)\n    ).subscribe({\n      next: (response: CoreFileManagerInsertUpdateResponse) => {\n        console.log('🎉 [FileInput] Upload SUCCESS - Response received:', response);\n\n        // Angular 20: Complete the pending task\n        // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\n        // console.log('✅ [FileInput] Pending task completed for successful upload');\n\n        // Set upload status to 'success'\n        this.uploadStatus.set('success');\n        console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n\n        // Complete the progress\n        this.uploadProgress.set(100);\n        this.uploadProgressChange.emit(100);\n        console.log('📊 [FileInput] Upload progress completed: 100%');\n\n        // Update progress notification to complete\n        const notificationId = this.uploadNotificationId();\n        if (notificationId) {\n          this.notificationService.remove(notificationId);\n          console.log('🔔 [FileInput] Progress notification removed');\n        }\n        // Success notification removed for cleaner UX\n        this.uploadNotificationId.set(null);\n\n        // Extract ID from CoreFileManagerInsertUpdateResponse\n        const uploadedId = response?.data?.core_file_manager?.[0]?.cyfm_id;\n        if (uploadedId) {\n          console.log('✅ [FileInput] File uploaded successfully with ID:', uploadedId);\n\n          // Clear failed file on successful upload\n          this.failedFile.set(null);\n\n          // Set the uploaded ID as the form control value\n          this.onChange(uploadedId);\n          console.log('📝 [FileInput] Form control value set to uploaded ID:', uploadedId);\n\n          // Only emit individual uploadSuccess if not in multiple upload mode\n          if (!this.isMultipleUploadMode()) {\n            this.uploadSuccess.emit(uploadedId);\n            console.log('📝 [FileInput] Upload success event emitted with file ID:', uploadedId);\n          } else {\n            console.log('📝 [FileInput] Individual upload success suppressed (multiple upload mode) - file ID:', uploadedId);\n          }\n        } else {\n          console.error('❌ [FileInput] Upload successful but no ID returned:', response);\n          this.uploadError.emit('Upload successful but no ID returned');\n        }\n        this.isUploading.set(false);\n        console.log('🔄 [FileInput] isUploading set to false');\n      },\n      error: (error: any) => {\n        console.error('💥 [FileInput] Upload FAILED:', error);\n\n        // Angular 20: Complete the pending task even on error\n        // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\n        // console.log('❌ [FileInput] Pending task completed for failed upload');\n\n        // Store the failed file for retry\n        this.failedFile.set(file);\n        console.log('💾 [FileInput] Failed file stored for retry:', file.name);\n\n        // Set upload status to 'error' and remove upload validation error\n        this.uploadStatus.set('error');\n        console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n\n        // Remove progress notification and show error\n        const notificationId = this.uploadNotificationId();\n        if (notificationId) {\n          this.notificationService.remove(notificationId);\n          console.log('🔔 [FileInput] Progress notification removed due to error');\n        }\n        this.notificationService.error(`❌ File upload failed: ${error.message || error.error?.message || 'Unknown error occurred'}`, { duration: 0 });\n        this.uploadNotificationId.set(null);\n\n        this.uploadError.emit(error.message || error.error?.message || 'Upload failed');\n        this.isUploading.set(false);\n        this.uploadProgress.set(0);\n        this.uploadProgressChange.emit(0);\n        console.log('🔄 [FileInput] Upload state reset - isUploading: false, progress: 0%');\n      }\n    });\n  }\n\n  /**\n   * Upload multiple files with group ID support\n   * FLOW: 1) Generate group ID first, 2) Upload all files with same group ID, 3) Emit group ID on completion\n   */\n  private uploadMultipleFiles(files: File[]) {\n    console.log('🚨 [FileInput] uploadMultipleFiles called for:', files.length, 'files - MULTIPLE UPLOAD INITIATED');\n\n    // Set multiple upload mode flag\n    this.isMultipleUploadMode.set(true);\n\n    // Set upload status to 'start' before starting upload\n    this.uploadStatus.set('start');\n    this.isUploading.set(true);\n    this.uploadProgress.set(0);\n    this.uploadProgressChange.emit(0);\n\n    // Make form control invalid during upload\n    this.onChange(null);\n\n    // Show initial progress notification\n    const notificationId = this.notificationService.showProgress('🔄 Preparing multiple file upload...', 0, { duration: 0 });\n    this.uploadNotificationId.set(notificationId);\n\n    // STEP 1: Generate or get group ID BEFORE starting any file uploads\n    // Check if component already has a group ID or if one is provided in uploadData\n    const existingComponentGroupId = this.groupId();\n    const existingUploadDataGroupId = this.uploadDataSignal().groupId;\n\n    if (existingComponentGroupId) {\n      // Component already has its own group ID - use it\n      console.log('🆔 [FileInput] Using existing component group ID:', existingComponentGroupId);\n\n      // Open floating uploader with existing group ID\n      if (this.showFloatingUploaderSignal()) {\n        console.log('🔄 [FileInput] Opening floating uploader with existing group ID:', existingComponentGroupId);\n        this.fileManagerService.triggerFloatingUploaderShow(existingComponentGroupId);\n      }\n\n      this.startMulti(files, existingComponentGroupId);\n    } else if (existingUploadDataGroupId) {\n      // Use group ID from uploadData and set it as component's group ID\n      console.log('🆔 [FileInput] Using group ID from uploadData:', existingUploadDataGroupId);\n      this.groupId.set(existingUploadDataGroupId);\n\n      // Open floating uploader with group ID from uploadData\n      if (this.showFloatingUploaderSignal()) {\n        console.log('🔄 [FileInput] Opening floating uploader with uploadData group ID:', existingUploadDataGroupId);\n        this.fileManagerService.triggerFloatingUploaderShow(existingUploadDataGroupId);\n      }\n\n      this.startMulti(files, existingUploadDataGroupId);\n    } else {\n      // Generate new group ID just before upload\n      console.log('🆔 [FileInput] Generating new group ID just before upload...');\n      this.fileManagerService.generateObjectId().subscribe({\n        next: (response) => {\n          const newGroupId = response.data?.objectId as string;\n          console.log('🆔 [FileInput] Generated new group ID just before upload:', newGroupId);\n          // Set the group ID to this component so it can track its own files\n          this.groupId.set(newGroupId);\n\n          // Open floating uploader with newly generated group ID\n          if (this.showFloatingUploaderSignal()) {\n            console.log('🔄 [FileInput] Opening floating uploader with new group ID:', newGroupId);\n            this.fileManagerService.triggerFloatingUploaderShow(newGroupId);\n          }\n\n          this.startMulti(files, newGroupId);\n        },\n        error: (error: any) => {\n          console.error('❌ [FileInput] Failed to generate group ID:', error);\n          this.uploadError.emit('Failed to generate group ID');\n          this.isUploading.set(false);\n          this.uploadStatus.set('error');\n\n          const notificationId = this.uploadNotificationId();\n          if (notificationId) {\n            this.notificationService.remove(notificationId);\n          }\n          this.notificationService.error('❌ Failed to generate group ID for multiple file upload', { duration: 0 });\n          this.uploadNotificationId.set(null);\n        }\n      });\n    }\n  }\n\n  /**\n   * Start uploading multiple files with the provided group ID\n   * All files will be uploaded with the SAME group ID that was generated before this method\n   */\n  private startMulti(files: File[], groupId: string) {\n    console.log('🚀 [FileInput] STEP 2: Starting upload for', files.length, 'files with group ID:', groupId);\n    console.log('📋 [FileInput] All files will use the same group ID:', groupId);\n\n    // Mark that this component has ever uploaded files\n    this.hasEverUploaded.set(true);\n\n    let completedUploads = 0;\n    let failedUploads = 0;\n    const totalFiles = files.length;\n\n    // IMPORTANT: All files use the SAME group ID that was generated before starting uploads\n    const uploadDataWithGroupId: FileUploadOptions = {\n      ...this.uploadDataSignal(),\n      groupId: groupId,\n      isMultiple: true\n    };\n\n    files.forEach((file, index) => {\n      const componentId = this.id();\n      console.log(`📤 [FileInput-${componentId}] Uploading file ${index + 1}/${totalFiles}: \"${file.name}\" with group ID: ${groupId}`);\n      console.log(`📤 [FileInput-${componentId}] Upload data:`, uploadDataWithGroupId);\n\n      this.fileManagerService.uploadFile(file, uploadDataWithGroupId, (progress: number) => {\n        // Calculate overall progress\n        const fileProgress = progress / totalFiles;\n        const overallProgress = ((completedUploads * 100) + fileProgress) / totalFiles;\n        this.uploadProgress.set(overallProgress);\n        this.uploadProgressChange.emit(overallProgress);\n\n        // Update progress notification\n        const notificationId = this.uploadNotificationId();\n        if (notificationId) {\n          const progressMessage = `🔄 Uploading file ${index + 1} of ${totalFiles}...`;\n          this.notificationService.updateProgress(notificationId, overallProgress, progressMessage);\n        }\n      }).pipe(\n        takeUntilDestroyed(this.destroyRef)\n      ).subscribe({\n        next: (response: CoreFileManagerInsertUpdateResponse) => {\n          completedUploads++;\n          console.log(`✅ [FileInput] File ${index + 1}/${totalFiles} uploaded`);\n\n          // Check if all files are completed\n          if (completedUploads + failedUploads === totalFiles) {\n            this.handleMultipleUploadComplete(completedUploads, failedUploads, totalFiles, groupId);\n          }\n        },\n        error: (error: any) => {\n          failedUploads++;\n          console.error(`❌ [FileInput] File ${index + 1}/${totalFiles} upload failed:`, error);\n\n          // Check if all files are completed\n          if (completedUploads + failedUploads === totalFiles) {\n            this.handleMultipleUploadComplete(completedUploads, failedUploads, totalFiles, groupId);\n          }\n        }\n      });\n    });\n  }\n\n  /**\n   * Handle completion of multiple file upload\n   */\n  private handleMultipleUploadComplete(completed: number, failed: number, total: number, groupId: string) {\n    console.log(`📊 [FileInput] Multiple upload complete: ${completed}/${total} successful, ${failed} failed`);\n\n    this.isUploading.set(false);\n    this.uploadProgress.set(100);\n    this.uploadProgressChange.emit(100);\n\n    // Remove progress notification\n    const notificationId = this.uploadNotificationId();\n    if (notificationId) {\n      this.notificationService.remove(notificationId);\n    }\n    this.uploadNotificationId.set(null);\n\n    if (failed === 0) {\n      // All files uploaded successfully\n      this.uploadStatus.set('success');\n      // Success notification removed for cleaner UX\n\n      // STEP 3: For multiple file upload, emit the group ID (not individual file IDs)\n      this.onChange(groupId);\n      this.uploadSuccess.emit(groupId);\n      console.log('📝 [FileInput] Multiple upload completed with group ID:', groupId);\n    } else if (completed > 0) {\n      // Some files uploaded successfully\n      this.uploadStatus.set('error');\n      this.notificationService.warning(`⚠️ ${completed}/${total} files uploaded. ${failed} failed.`, { duration: 0 });\n      this.uploadError.emit(`${failed} out of ${total} files failed to upload`);\n    } else {\n      // All files failed\n      this.uploadStatus.set('error');\n      this.notificationService.error(`❌ All ${total} files failed to upload.`, { duration: 0 });\n      this.uploadError.emit('All files failed to upload');\n    }\n\n    // Reset multiple upload mode flag\n    this.isMultipleUploadMode.set(false);\n  }\n\n  private generatePreviews() {\n    // Clear existing previews\n    this.clearPreviews();\n\n    if (!this.showPreviewSignal() || !this.files()) {\n      return;\n    }\n\n    Array.from(this.files()!).forEach(file => {\n      if (this.isImageFile(file)) {\n        const reader = new FileReader();\n        reader.onload = (e) => {\n          if (e.target?.result) {\n            this.previewUrls.update(urls => [...urls, e.target!.result as string]);\n          }\n        };\n        reader.readAsDataURL(file);\n      }\n    });\n  }\n\n  private clearPreviews() {\n    // Revoke object URLs to prevent memory leaks\n    this.previewUrls().forEach(url => {\n      if (url.startsWith('blob:')) {\n        URL.revokeObjectURL(url);\n      }\n    });\n    this.previewUrls.set([]);\n\n    // Revoke download URLs as well\n    this.downloadUrls().forEach(url => {\n      if (url.startsWith('blob:')) {\n        URL.revokeObjectURL(url);\n      }\n    });\n    this.downloadUrls.set([]);\n  }\n\n  private generateDownloadUrls() {\n    // Clear existing download URLs\n    this.downloadUrls().forEach(url => {\n      if (url.startsWith('blob:')) {\n        URL.revokeObjectURL(url);\n      }\n    });\n    this.downloadUrls.set([]);\n\n    if (!this.files()) {\n      return;\n    }\n\n    const urls: string[] = [];\n    Array.from(this.files()!).forEach(file => {\n      const url = URL.createObjectURL(file);\n      urls.push(url);\n    });\n    this.downloadUrls.set(urls);\n    console.log('🔗 [FileInput] Generated local download URLs for selected files');\n  }\n\n  private isImageFile(file: File): boolean {\n    return file.type.startsWith('image/');\n  }\n\n  private loadFileDetailsFromId(fileId: string): void {\n    console.log('🔍 [FileInput] Loading file details for ID:', fileId, 'Component ID:', this.id());\n    if (!fileId) return;\n    this.fileManagerService?.getFileDetails({ cyfm_id: fileId })?.pipe(\n      takeUntilDestroyed(this.destroyRef)\n    ).subscribe({\n      next: (fileDetails: fileManagerControllerResponse) => {\n        console.log('📋 [FileInput] File details received for ID:', fileId);\n\n        if (fileDetails?.data?.length) {\n          const fileData = fileDetails.data[0];\n          console.log('📁 [FileInput] File name:', fileData.cyfm_name);\n\n          // Set file name from the details\n          if (fileData.cyfm_name) {\n            this.fileNames.set([fileData.cyfm_name]);\n            console.log('📝 [FileInput] File name set:', fileData.cyfm_name);\n          }\n\n          // Process base64 data for download and preview\n          if (fileData.cyfm_file_base64) {\n            const mimeType = fileData.cyfm_type || 'application/octet-stream';\n            let base64Data = fileData.cyfm_file_base64;\n            if (!base64Data.startsWith('data:')) {\n              base64Data = `data:${mimeType};base64,${base64Data}`;\n            }\n\n            console.log(`💾 [FileInput] Setting download URL for ${fileData.cyfm_name}, length: ${base64Data.length}`);\n\n            // Set download URL for all files\n            this.downloadUrls.set([base64Data]);\n\n            // If it's an image, set preview\n            if (this.showPreviewSignal()) {\n              // Check if it's an image file based on file name or type\n              const isImage = this.isImageFileFromName(fileData.cyfm_name || '') ||\n                this.isImageFileFromType(fileData.cyfm_type || '');\n\n              if (isImage) {\n                this.previewUrls.set([base64Data]);\n                console.log('🖼️ [FileInput] Preview set from base64 data');\n              }\n            }\n          }\n        } else {\n          console.warn('⚠️ [FileInput] No file data found for ID:', fileId);\n        }\n      },\n      error: (error: any) => {\n        console.error('❌ [FileInput] Error loading file details:', error);\n        this.notificationService.error(`Failed to load file details: ${error.message || 'Unknown error'}`, { duration: 0 });\n      }\n    });\n  }\n\n  /**\n   * Check if the component is in multiple file mode\n   */\n  private isMultipleFileMode(): boolean {\n    // Check if multiple attribute is set or if we have a group ID\n    return this.multiple || this.groupId() !== null;\n  }\n\n  /**\n   * Load files from group ID using the group API\n   */\n  private loadFilesFromGroupId(groupId: string): void {\n    console.log('🔍 [FileInput] Loading files for group ID:', groupId);\n    if (!groupId) return;\n\n    this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe({\n        next: (files) => {\n          console.log('📋 [FileInput] Files loaded for group:', files.length);\n\n          // Set file names to show count in input\n          if (files && files.length > 0) {\n            const fileNames = files.map(file => file.file_name || file.name || 'Unknown file');\n            this.fileNames.set(fileNames);\n            console.log('📝 [FileInput] File names set for display:', fileNames);\n          } else {\n            this.fileNames.set([]);\n          }\n\n          // Files are now stored in service state and will be displayed by floating uploader\n        },\n        error: (error: any) => {\n          console.error('❌ [FileInput] Failed to load files for group:', error);\n          this.fileNames.set([]);\n        }\n      });\n  }\n\n  private isImageFileFromName(fileName: string): boolean {\n    if (!fileName) return false;\n    const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg'];\n    const lowerFileName = fileName.toLowerCase();\n    return imageExtensions.some(ext => lowerFileName.endsWith(ext));\n  }\n\n  private isImageFileFromType(fileType: string): boolean {\n    if (!fileType) return false;\n    return fileType.startsWith('image/');\n  }\n\n  downloadFile(index: number = 0) {\n    const urls = this.downloadUrls();\n    const names = this.fileNames();\n\n    if (urls.length > index) {\n      const link = document.createElement('a');\n      link.href = urls[index];\n      link.download = names[index] || 'download';\n      link.target = '_blank';\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n    }\n  }\n\n  viewFile(index: number = 0) {\n    const urls = this.downloadUrls();\n    const names = this.fileNames();\n\n    console.log(`👁️ [FileInput] viewFile called for index ${index}`);\n    console.log(`👁️ [FileInput] Component ID: ${this.id()}`);\n    console.log(`👁️ [FileInput] URLs available: ${urls.length}`);\n\n    if (urls.length > index) {\n      const base64 = urls[index];\n      console.log(`👁️ [FileInput] Opening file: ${names[index] || 'unknown'}`);\n      console.log(`👁️ [FileInput] Content length: ${base64.length}`);\n\n      const win = window.open('about:blank');\n      if (win) {\n        win.document.write(`<iframe src=\"${base64}\" frameborder=\"0\" style=\"border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;\" allowfullscreen></iframe>`);\n        win.document.close();\n      } else {\n        console.error('❌ [FileInput] Failed to open new window');\n      }\n    } else {\n      console.error('❌ [FileInput] No URL found for index', index);\n    }\n  }\n\n  removePreview(index: number) {\n    const currentFiles = this.files();\n    const currentUrls = this.previewUrls();\n\n    if (currentFiles && currentFiles.length > index) {\n      // Handle FileList case - remove file from FileList\n      const dt = new DataTransfer();\n      Array.from(currentFiles).forEach((file, i) => {\n        if (i !== index) {\n          dt.items.add(file);\n        }\n      });\n\n      const newFiles = dt.files;\n      this.files.set(newFiles);\n      this.fileNames.set(Array.from(newFiles).map(f => f.name));\n\n      // Remove the preview URL\n      if (currentUrls[index] && currentUrls[index].startsWith('blob:')) {\n        URL.revokeObjectURL(currentUrls[index]);\n      }\n      this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\n\n      this.onChange(newFiles);\n      this.fileChange.emit(newFiles);\n    } else if (currentUrls.length > index) {\n      // Handle uploaded file ID case - clear the preview and set control value to null\n      console.log('🗑️ [FileInput] Removing preview for uploaded file ID');\n\n      // Clear preview\n      this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\n      this.fileNames.set([]);\n\n      // Set control value to null since we're removing the uploaded file\n      this.onChange(null);\n      this.fileChange.emit(null);\n    }\n  }\n\n  ngOnDestroy() {\n    // Clean up preview URLs to prevent memory leaks\n    this.clearPreviews();\n\n    // Clean up any active upload notification\n    const notificationId = this.uploadNotificationId();\n    if (notificationId) {\n      this.notificationService.remove(notificationId);\n      this.uploadNotificationId.set(null);\n    }\n  }\n\n  triggerFileSelect() {\n    const fileInput = document.getElementById('cide-file-input-' + this.id()) as HTMLInputElement;\n    if (fileInput && !this.disabledSignal()) {\n      fileInput.click();\n    }\n  }\n\n  /**\n   * Show floating uploader manually\n   * This can be called to show the floating uploader even when no files are selected\n   */\n  showUploader() {\n    console.log('👁️ [FileInput] Manually showing floating uploader');\n\n    if (!this.showFloatingUploaderSignal()) {\n      console.log('⚠️ [FileInput] Floating uploader is disabled');\n      return;\n    }\n\n    const groupId = this.groupId();\n    if (groupId) {\n      console.log(\"✅ [FileInput] Has existing group ID:\", groupId);\n      // Fetch files for the group and trigger floating uploader to show\n      this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\n        .pipe(takeUntilDestroyed(this.destroyRef))\n        .subscribe({\n          next: (files) => {\n            console.log('✅ [FileInput] Files fetched for floating uploader:', files.length);\n            // Trigger the floating uploader to show via service with group ID\n            this.fileManagerService.triggerFloatingUploaderShow(groupId);\n          },\n          error: (error: any) => {\n            console.error('❌ [FileInput] Failed to fetch files for floating uploader:', error);\n            // Still trigger show even if fetch fails, with group ID\n            this.fileManagerService.triggerFloatingUploaderShow(groupId);\n          }\n        });\n    } else {\n      console.log('⚠️ [FileInput] No group ID yet - floating uploader will open when user uploads files');\n      // No group ID yet - don't open floating uploader now\n      // It will open automatically when user uploads files and group ID is generated\n      // This prevents the \"No active files\" issue\n    }\n  }\n\n  /**\n   * Get total upload count from file manager service for this component's group ID\n   * Uses optimized service method for better performance\n   * Only counts files for this component's specific group ID\n   */\n  getUploadCount(): number {\n    const groupId = this.groupId();\n    const componentId = this.id();\n\n    if (!groupId) {\n      // No group ID yet - component hasn't uploaded anything, so count is 0\n      return 0;\n    }\n\n    const count = this.fileManagerService.getFileCountForGroup(groupId);\n    return count;\n  }\n\n  /**\n   * Check if there are active uploads for this component's group ID\n   * Uses optimized service method for better performance\n   * Only checks files for this component's specific group ID\n   */\n  hasActiveUploads(): boolean {\n    const groupId = this.groupId();\n\n    if (!groupId) {\n      // No group ID yet - component hasn't uploaded anything, so no active uploads\n      return false;\n    }\n\n    return this.fileManagerService.hasActiveUploadsForGroup(groupId);\n  }\n\n  /**\n   * Get count of active (non-completed) uploads for this component's group ID\n   * Only counts files for this component's specific group ID\n   */\n  getActiveUploadCount(): number {\n    const groupId = this.groupId();\n\n    if (!groupId) {\n      // No group ID yet - component hasn't uploaded anything, so no active uploads\n      return 0;\n    }\n\n    return this.fileManagerService.getAllFilesForGroup(groupId)\n      .filter(file => file.stage !== 'complete').length;\n  }\n\n  /**\n   * Show floating uploader (alias for showUploader for template)\n   */\n  async showFloatingUploaderDialog() {\n    console.log('👁️ [FileInput] Opening floating file uploader via dedicated service');\n\n    if (!this.showFloatingUploaderSignal()) {\n      console.log('⚠️ [FileInput] Floating uploader is disabled');\n      return;\n    }\n\n    const groupId = this.groupId();\n    if (groupId) {\n      console.log(\"✅ [FileInput] Has existing group ID:\", groupId);\n      // Use the dedicated floating file uploader service\n      try {\n        await this.floatingFileUploaderService.showWithGroupId(groupId, {\n          allowedTypes: this.acceptSignal() ? this.acceptSignal().split(',') : undefined,\n          multiple: this.multipleSignal(),\n          autoUpload: this.autoUploadSignal(),\n          userId: this.uploadDataSignal().userId\n        });\n        console.log('✅ [FileInput] Floating file uploader opened successfully');\n      } catch (error) {\n        console.error('❌ [FileInput] Failed to open floating file uploader:', error);\n        this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\n      }\n    } else {\n      console.log('⚠️ [FileInput] No group ID yet - generating one and opening uploader');\n      // Generate a new group ID and open the uploader\n      this.fileManagerService.generateObjectId().subscribe({\n        next: async (response) => {\n          const newGroupId = response.data?.objectId as string;\n          console.log('🆔 [FileInput] Generated new group ID for uploader:', newGroupId);\n          this.groupId.set(newGroupId);\n          // Use the dedicated floating file uploader service\n          try {\n            await this.floatingFileUploaderService.showWithGroupId(newGroupId, {\n              allowedTypes: this.acceptSignal() ? this.acceptSignal().split(',') : undefined,\n              multiple: this.multipleSignal(),\n              autoUpload: this.autoUploadSignal(),\n              userId: this.uploadDataSignal().userId\n            });\n            console.log('✅ [FileInput] Floating file uploader opened successfully');\n          } catch (error) {\n            console.error('❌ [FileInput] Failed to open floating file uploader:', error);\n            this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\n          }\n        },\n        error: (error: any) => {\n          console.error('❌ [FileInput] Failed to generate group ID for uploader:', error);\n          this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\n        }\n      });\n    }\n  }\n\n  /**\n   * Get dynamic classes for drag and drop zone\n   */\n  getDragDropZoneClasses(): string {\n    const classes = [];\n\n    if (this.isDragOver()) {\n      classes.push('!tw-border-blue-500', '!tw-bg-blue-100', 'dark:!tw-bg-blue-900/30', 'tw-scale-[1.01]');\n    }\n\n    if (this.disabledSignal()) {\n      classes.push('tw-opacity-50', 'tw-cursor-not-allowed', '!hover:tw-border-gray-300', '!hover:tw-bg-gray-50', 'dark:!hover:tw-bg-gray-800');\n    }\n\n    if (this.hasFiles()) {\n      classes.push('!tw-border-emerald-500', '!tw-bg-emerald-50', 'dark:!tw-bg-emerald-900/20', 'hover:!tw-border-emerald-600', 'hover:!tw-bg-emerald-100', 'dark:hover:!tw-bg-emerald-900/30');\n    }\n\n    return classes.join(' ');\n  }\n\n  /**\n   * Get dynamic classes for icon\n   */\n  getIconClasses(): string {\n    const classes = ['tw-text-gray-500', 'dark:tw-text-gray-400'];\n\n    if (this.isDragOver()) {\n      classes.push('!tw-text-blue-500', 'dark:!tw-text-blue-400');\n    } else if (this.hasFiles()) {\n      classes.push('!tw-text-emerald-500', 'dark:!tw-text-emerald-400');\n    }\n\n    return classes.join(' ');\n  }\n\n  /**\n   * Get dynamic classes for preview box\n   */\n  getPreviewBoxClasses(): string {\n    const classes = [];\n\n    if (this.isDragOver()) {\n      classes.push('!tw-border-blue-500', '!tw-bg-blue-100', 'dark:!tw-bg-blue-900/30');\n    }\n\n    if (this.disabledSignal()) {\n      classes.push('tw-opacity-50', 'tw-cursor-not-allowed', '!hover:tw-border-gray-300', '!hover:tw-bg-gray-50', 'dark:!hover:tw-bg-gray-800');\n    }\n\n    if (this.hasImages()) {\n      classes.push('!tw-border-emerald-500', '!tw-bg-emerald-50', 'dark:!tw-bg-emerald-900/20');\n    }\n\n    return classes.join(' ');\n  }\n\n  // Drag and Drop Event Handlers\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (!this.disabledSignal()) {\n      this.isDragOver.set(true);\n      console.log('🔄 [FileInput] Drag over detected');\n    }\n  }\n\n  onDragLeave(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n    console.log('🔄 [FileInput] Drag leave detected');\n  }\n\n  onDragEnter(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (!this.disabledSignal()) {\n      this.isDragOver.set(true);\n      console.log('🔄 [FileInput] Drag enter detected');\n    }\n  }\n\n  onDrop(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n\n    if (this.disabledSignal()) {\n      console.log('⏸️ [FileInput] Drop ignored - component is disabled');\n      return;\n    }\n\n    const files = event.dataTransfer?.files;\n    if (files && files.length > 0) {\n      console.log('📁 [FileInput] Files dropped:', Array.from(files).map(f => f.name));\n\n      // Validate file types if accept is specified\n      if (this.acceptSignal() && !this.validateFileTypes(files)) {\n        console.log('❌ [FileInput] Invalid file types dropped');\n        this.notificationService.error('❌ Invalid file type. Please select files of the correct type.', { duration: 0 });\n        return;\n      }\n\n      // Handle single vs multiple files\n      if (!this.multipleSignal() && files.length > 1) {\n        console.log('⚠️ [FileInput] Multiple files dropped but multiple is disabled');\n        this.notificationService.warning('⚠️ Only one file is allowed. Using the first file.', { duration: 0 });\n        // Create a new FileList with only the first file\n        const dt = new DataTransfer();\n        dt.items.add(files[0]);\n        this.handleFileSelection(dt.files);\n      } else {\n        this.handleFileSelection(files);\n      }\n    }\n  }\n\n  private validateFileTypes(files: FileList): boolean {\n    const acceptTypes = this.acceptSignal().split(',').map(type => type.trim());\n    if (acceptTypes.length === 0 || acceptTypes[0] === '') return true;\n\n    return Array.from(files).every(file => {\n      return acceptTypes.some(acceptType => {\n        if (acceptType.startsWith('.')) {\n          // Extension-based validation\n          return file.name.toLowerCase().endsWith(acceptType.toLowerCase());\n        } else if (acceptType.includes('/')) {\n          // MIME type validation\n          return file.type === acceptType || file.type.startsWith(acceptType.replace('*', ''));\n        }\n        return false;\n      });\n    });\n  }\n\n  private handleFileSelection(files: FileList) {\n    console.log('🔥 [FileInput] handleFileSelection called with:', files.length, 'files');\n\n    this.files.set(files);\n    this.fileNames.set(Array.from(files).map(f => f.name));\n    this.generatePreviews();\n    this.generateDownloadUrls();\n\n    // Reset upload status when new file is selected\n    this.uploadStatus.set('idle');\n\n    this.onChange(files);\n    this.fileChange.emit(files);\n    this.onTouched();\n\n    // Auto upload if enabled\n    if (this.autoUploadSignal() && files.length > 0) {\n      console.log('🔥 [FileInput] Auto upload is enabled, proceeding with upload...');\n      if (this.multipleSignal()) {\n        this.uploadMultipleFiles(Array.from(files));\n      } else {\n        this.uploadFile(files[0]);\n      }\n    } else {\n      console.log('🔥 [FileInput] Auto upload disabled or no files');\n    }\n  }\n\n  isRequired(): boolean {\n    return this.requiredSignal();\n  }\n\n  /**\n   * Angular 20: Utility method to get upload data with proper typing\n   * @returns Properly typed upload data\n   */\n  getUploadData(): FileUploadData {\n    return this.uploadDataSignal();\n  }\n\n  /**\n   * Angular 20: Utility method to update upload data with type safety\n   * @param data Partial upload data to merge with existing data\n   */\n  updateUploadData(data: Partial<FileUploadData>): void {\n    const currentData = this.uploadDataSignal();\n    const updatedData: FileUploadData = { ...currentData, ...data };\n    // Note: This would require the uploadData to be a writable signal\n    // For now, this method serves as a type-safe way to work with upload data\n    console.log('📝 [FileInput] Upload data updated:', updatedData);\n  }\n\n  getCurrentState() {\n    return {\n      id: this.id(),\n      label: this.labelSignal(),\n      required: this.requiredSignal(),\n      disabled: this.disabledSignal(),\n      accept: this.acceptSignal(),\n      multiple: this.multipleSignal(),\n      showPreview: this.showPreviewSignal(),\n      autoUpload: this.autoUploadSignal(),\n      uploadStatus: this.uploadStatus(),\n      isUploading: this.isUploading(),\n      uploadProgress: this.uploadProgress(),\n      files: this.files() ? Array.from(this.files()!).map(f => ({ name: f.name, size: f.size, type: f.type })) : null,\n      fileNames: this.fileNames(),\n      previewUrls: this.previewUrls().length,\n      helperText: this.helperTextSignal(),\n      errorText: this.errorTextSignal(),\n      placeholderText: this.placeholderTextSignal(),\n      placeholderIcon: this.placeholderIconSignal(),\n      previewWidth: this.previewWidthSignal(),\n      previewHeight: this.previewHeightSignal(),\n      previewBoxMode: this.previewBoxModeSignal(),\n      showFileName: this.showFileNameSignal(),\n      uploadData: this.uploadDataSignal()\n    };\n  }\n\n  async getControlData() {\n    console.log('🔍 [FileInput] getControlData called');\n    const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id() });\n    if (cide_element_data) {\n      console.log('📋 [FileInput] Element data loaded:', cide_element_data);\n\n      // Note: Since we're using input signals, we can't directly set their values\n      // This method would need to be refactored to work with the new signal-based approach\n      // For now, we'll log the data and trigger validation\n      console.log('✅ [FileInput] Control data received from element service');\n      console.log('⚠️ [FileInput] Note: Input signals cannot be modified after component initialization');\n\n      // Trigger validation update\n      this.onValidatorChange();\n    } else {\n      console.log('⚠️ [FileInput] No element data found for key:', this.id());\n    }\n  }\n\n  // Validator implementation\n  validate(control: AbstractControl): ValidationErrors | null {\n    console.log('🔍 [FileInput] validate() called - uploadStatus:', this.uploadStatus(), 'required:', this.requiredSignal(), 'files:', !!this.files(), 'control.value:', control.value);\n\n    // If upload is in progress (start or uploading status), return validation error\n    if (this.uploadStatus() === 'start' || this.uploadStatus() === 'uploading') {\n      console.log('⚠️ [FileInput] Validation ERROR: Upload in progress');\n      return { 'uploadInProgress': { message: 'File upload in progress. Please wait...' } };\n    }\n\n    // If required and no file is selected and no control value (uploaded file ID), return validation error\n    if (this.requiredSignal() && !this.files() && !control.value) {\n      console.log('⚠️ [FileInput] Validation ERROR: File required');\n      return { 'required': { message: 'Please select a file to upload.' } };\n    }\n\n    console.log('✅ [FileInput] Validation PASSED: No errors');\n    return null; // No validation errors\n  }\n\n} ","<div class=\"tw-flex tw-flex-col tw-gap-2\">\n  <!-- Label (shown when not in preview box mode or when preview box mode but no label override) -->\n  @if (labelSignal() && !isPreviewBoxMode()) {\n  <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-200 tw-mb-1.5 tw-leading-5\"\n    [attr.for]=\"'cide-file-input-' + id()\">\n    {{ labelSignal() }}@if (requiredSignal()) {<span class=\"tw-text-red-500 dark:tw-text-red-400\"> *</span>}\n  </label>\n  }\n\n  <!-- Preview Box Mode -->\n  @if (isPreviewBoxMode()) {\n  <div class=\"tw-relative\">\n    <!-- Hidden file input -->\n    <input type=\"file\" [attr.id]=\"'cide-file-input-' + id()\" [attr.accept]=\"acceptSignal()\"\n      [attr.multiple]=\"multipleSignal() ? true : null\" [disabled]=\"disabledSignal()\" (change)=\"onFileSelected($event)\"\n      class=\"tw-hidden\" />\n\n    <!-- Preview Box -->\n    <div\n      class=\"tw-border-2 tw-border-dashed tw-border-gray-300 dark:tw-border-gray-600 tw-rounded-lg tw-bg-gray-50 dark:tw-bg-gray-800 tw-cursor-pointer tw-transition-all tw-duration-200 tw-relative tw-overflow-hidden hover:tw-border-blue-500 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20\"\n      [class]=\"getPreviewBoxClasses()\" [style.width]=\"previewWidthSignal()\" [style.height]=\"previewHeightSignal()\"\n      (click)=\"triggerFileSelect()\" (dragover)=\"onDragOver($event)\" (dragenter)=\"onDragEnter($event)\"\n      (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\"\n      [attr.title]=\"disabledSignal() ? 'File selection disabled' : placeholderTextSignal()\">\n\n      <!-- No Image State -->\n      @if (!hasImages()) {\n      <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-h-full tw-p-4\">\n        <div class=\"tw-mb-2\">\n          <cide-ele-icon class=\"tw-text-gray-400 dark:tw-text-gray-500\" size=\"lg\">{{ isDragOver() ? '📁' :\n            placeholderIconSignal() }}</cide-ele-icon>\n        </div>\n        <div class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-text-center\">\n          {{ isDragOver() ? 'Drop files here...' : placeholderTextSignal() }}\n        </div>\n      </div>\n      }\n\n      <!-- Image Preview State -->\n      @if (hasImages()) {\n      <div class=\"tw-relative tw-w-full tw-h-full\">\n        <img [src]=\"previewUrls()[0]\" [alt]=\"fileNames()[0] || 'Preview image'\"\n          class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-lg\">\n        <div\n          class=\"tw-absolute tw-inset-0 tw-bg-black tw-bg-opacity-0 hover:tw-bg-opacity-30 tw-transition-all tw-duration-200 tw-flex tw-items-center tw-justify-center tw-rounded-lg\">\n          <div class=\"tw-text-white tw-text-sm tw-opacity-0 hover:tw-opacity-100 tw-transition-opacity tw-duration-200\">\n            Click to change</div>\n        </div>\n        @if (!disabledSignal()) {\n        <button type=\"button\"\n          class=\"tw-absolute tw-top-2 tw-right-2 tw-w-6 tw-h-6 tw-bg-red-500 hover:tw-bg-red-600 tw-text-white tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-sm tw-font-bold tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer\"\n          (click)=\"clearFiles(); $event.stopPropagation()\" title=\"Remove image\">\n          ×\n        </button>\n        }\n        @if (isInErrorState() && failedFile()) {\n        <button type=\"button\"\n          class=\"tw-absolute tw-bottom-2 tw-left-1/2 tw-transform tw--translate-x-1/2 tw-px-3 tw-py-1.5 tw-text-xs tw-font-medium tw-border-none tw-rounded tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white tw-cursor-pointer tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed tw-shadow-lg tw-z-10\"\n          (click)=\"retryUpload(); $event.stopPropagation()\" [disabled]=\"isUploading() || disabledSignal()\"\n          title=\"Retry upload\">\n          <cide-ele-icon size=\"xs\" class=\"tw-mr-1\">refresh</cide-ele-icon>\n          Retry Upload\n        </button>\n        }\n      </div>\n      }\n    </div>\n\n    <!-- File name display for preview box mode -->\n    @if (hasImages() && fileNames().length && showFileNameSignal()) {\n    <div class=\"tw-mt-2 tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-text-center tw-truncate\">\n      {{ fileNames()[0] }}\n    </div>\n    }\n    <!-- Error message and retry button for preview box mode -->\n    @if (isInErrorState() && failedFile() && !hasImages()) {\n    <div class=\"tw-mt-2 tw-flex tw-flex-col tw-items-center tw-gap-2\">\n      <span class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400\">Upload failed. Please retry.</span>\n      <button type=\"button\"\n        class=\"tw-flex tw-items-center tw-gap-1 tw-px-3 tw-py-1.5 tw-text-xs tw-font-medium tw-border-none tw-rounded tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white tw-cursor-pointer tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n        (click)=\"retryUpload()\" [disabled]=\"isUploading() || disabledSignal()\">\n        <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\n        Retry Upload\n      </button>\n    </div>\n    }\n  </div>\n  }\n\n  <!-- Standard Mode -->\n  @if (!isPreviewBoxMode()) {\n  <!-- Hidden file input -->\n  <input type=\"file\" [attr.id]=\"'cide-file-input-' + id()\" [attr.accept]=\"acceptSignal()\"\n    [attr.multiple]=\"multipleSignal() ? true : null\" [disabled]=\"disabledSignal()\" (change)=\"onFileSelected($event)\"\n    class=\"tw-hidden\" />\n\n  <!-- Modern Drag and Drop Zone -->\n  <div\n    class=\"tw-border-2 tw-border-dashed tw-border-gray-300 dark:tw-border-gray-600 tw-rounded-lg tw-bg-gray-50 dark:tw-bg-gray-800 tw-cursor-pointer tw-transition-all tw-duration-200 tw-min-h-[60px] hover:tw-border-blue-500 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20\"\n    [class]=\"getDragDropZoneClasses()\" (click)=\"triggerFileSelect()\" (dragover)=\"onDragOver($event)\"\n    (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event)\">\n\n    <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-gap-3\">\n      <!-- Icon and Text -->\n      <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-flex-1 tw-min-w-0\">\n        <cide-ele-icon class=\"tw-flex-shrink-0 tw-transition-colors tw-duration-200\" [class]=\"getIconClasses()\"\n          size=\"sm\">\n          {{ isDragOver() ? 'file_download' : (hasFiles() ? 'check_circle' : 'cloud_upload') }}\n        </cide-ele-icon>\n\n        <div class=\"tw-flex tw-flex-col tw-gap-0.5 tw-min-w-0\">\n          @if (isDragOver()) {\n          <span\n            class=\"tw-text-sm tw-font-medium tw-text-blue-700 dark:tw-text-blue-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">Drop\n            files here</span>\n          } @else if (hasFiles()) {\n          <span\n            class=\"tw-text-sm tw-font-medium tw-text-emerald-700 dark:tw-text-emerald-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">\n            @if (multipleSignal() && fileNames().length > 1) {\n            {{ fileNames().length }} files selected\n            } @else {\n            {{ fileNames()[0] }}\n            }\n          </span>\n          @if (totalFileSize() > 0) {\n          <span class=\"tw-text-xs tw-text-emerald-600 dark:tw-text-emerald-400\">{{ fileSizeInMB() }} MB</span>\n          }\n          } @else {\n          <span\n            class=\"tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">\n            {{ multipleSignal() ? 'Choose files or drag here' : 'Choose file or drag here' }}\n          </span>\n          }\n        </div>\n      </div>\n\n      <!-- Action Buttons -->\n      <div class=\"tw-flex tw-gap-1 tw-flex-shrink-0\">\n        <!-- Download Button -->\n        @if (hasFiles() && downloadUrls().length > 0) {\n        <button type=\"button\"\n          class=\"tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-border-none tw-rounded tw-bg-transparent tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-purple-600 hover:tw-bg-purple-50 dark:hover:tw-bg-purple-900/20 hover:tw-text-purple-700 tw-mr-1\"\n          (click)=\"viewFile(0); $event.stopPropagation()\" title=\"View file\">\n          <cide-ele-icon size=\"xs\">visibility</cide-ele-icon>\n        </button>\n        <button type=\"button\"\n          class=\"tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-border-none tw-rounded tw-bg-transparent tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-blue-600 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20 hover:tw-text-blue-700\"\n          (click)=\"downloadFile(0); $event.stopPropagation()\" title=\"Download file\">\n          <cide-ele-icon size=\"xs\">download</cide-ele-icon>\n        </button>\n        }\n\n        @if (isInErrorState() && failedFile()) {\n        <button type=\"button\"\n          class=\"tw-flex tw-items-center tw-justify-center tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-border-none tw-rounded tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white tw-cursor-pointer tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n          (click)=\"retryUpload(); $event.stopPropagation()\" [disabled]=\"isUploading() || disabledSignal()\"\n          title=\"Retry upload\">\n          <cide-ele-icon size=\"xs\" class=\"tw-mr-1\">refresh</cide-ele-icon>\n          Retry\n        </button>\n        }\n        @if (hasFiles()) {\n        <button type=\"button\"\n          class=\"tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-border-none tw-rounded tw-bg-transparent tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-red-600 hover:tw-bg-red-50 dark:hover:tw-bg-red-900/20 hover:tw-text-red-700\"\n          (click)=\"clearFiles(); $event.stopPropagation()\" title=\"Clear files\">\n          <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n        </button>\n        }\n      </div>\n    </div>\n  </div>\n  }\n\n  <!-- Image Preview Section (only for standard mode) -->\n  @if (isImagePreviewAvailable() && !isPreviewBoxMode()) {\n  <div class=\"tw-mt-3\">\n    <div class=\"tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-200 tw-mb-2\">Preview:</div>\n    <div class=\"tw-flex tw-flex-wrap tw-gap-3\">\n      @for (previewUrl of previewUrls(); track previewUrl; let i = $index) {\n      <div\n        class=\"tw-relative tw-border tw-border-gray-200 dark:tw-border-gray-600 tw-rounded-lg tw-overflow-hidden tw-bg-white dark:tw-bg-gray-800\"\n        [style.width]=\"previewWidthSignal()\" [style.height]=\"previewHeightSignal()\">\n        <button type=\"button\"\n          class=\"tw-absolute tw-top-1 tw-right-1 tw-w-5 tw-h-5 tw-bg-red-500 hover:tw-bg-red-600 tw-text-white tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-xs tw-font-bold tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer tw-z-10\"\n          (click)=\"removePreview(i)\" title=\"Remove image\">\n          ×\n        </button>\n        <img [src]=\"previewUrl\" [alt]=\"fileNames()[i] || 'Preview image'\" class=\"tw-w-full tw-h-full tw-object-cover\"\n          loading=\"lazy\">\n        <div\n          class=\"tw-absolute tw-bottom-0 tw-left-0 tw-right-0 tw-bg-black tw-bg-opacity-75 tw-text-white tw-text-xs tw-p-1 tw-truncate\">\n          {{ fileNames()[i] }}</div>\n      </div>\n      }\n    </div>\n  </div>\n  }\n\n  <!-- Upload Status and Show Files Button (only for multiple file inputs) -->\n  @if (multiple && showFloatingUploaderSignal() && (getUploadCount() > 0 || hasActiveUploads() || hasEverUploaded())) {\n  <div class=\"tw-flex tw-items-center tw-justify-between tw-py-1.5 tw-gap-2\">\n    <div class=\"tw-flex tw-items-center tw-gap-2\">\n      <cide-ele-icon class=\"tw-text-blue-600 dark:tw-text-blue-400\" size=\"sm\">cloud_upload</cide-ele-icon>\n      <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">\n        @if (hasActiveUploads()) {\n        {{ getActiveUploadCount() }} uploading\n        } @else if (getUploadCount() > 0) {\n        {{ getUploadCount() }} completed\n        } @else if (hasEverUploaded()) {\n        View uploads\n        }\n      </span>\n    </div>\n    <button type=\"button\"\n      class=\"tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-rounded-md tw-bg-gray-100 dark:tw-bg-gray-700 hover:tw-bg-gray-200 dark:hover:tw-bg-gray-600 tw-text-gray-600 dark:tw-text-gray-300 tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer\"\n      (click)=\"showFloatingUploaderDialog()\" title=\"View upload progress and history\">\n      <cide-ele-icon size=\"sm\">visibility</cide-ele-icon>\n    </button>\n  </div>\n  }\n\n  @if (errorTextSignal()) {\n  <div class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400 tw-mt-1\">{{ errorTextSignal() }}</div>\n  }\n  @if (isInErrorState() && failedFile() && !errorTextSignal()) {\n  <div class=\"tw-flex tw-items-center tw-gap-2 tw-mt-1\">\n    <span class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400\">Upload failed. Please retry.</span>\n    <button type=\"button\"\n      class=\"tw-flex tw-items-center tw-gap-1 tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-border-none tw-rounded tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white tw-cursor-pointer tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n      (click)=\"retryUpload()\" [disabled]=\"isUploading() || disabledSignal()\">\n      <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\n      Retry Upload\n    </button>\n  </div>\n  }\n  @if (helperTextSignal() && !errorTextSignal() && !isInErrorState()) {\n  <div class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-1\">{{ helperTextSignal() }}</div>\n  }\n</div>","import { Component, signal, computed, DestroyRef, inject, OnInit, OnDestroy, effect, Input } from '@angular/core';\r\nimport { ElementRef, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CideIconComponent } from '../icon/icon.component';\r\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\r\n\r\nexport interface FloatingFileUploaderData {\r\n  userId?: string;\r\n  groupId?: string;\r\n  title?: string;\r\n  description?: string;\r\n  maxFileSize?: number;\r\n  allowedFileTypes?: string[];\r\n  multiple?: boolean;\r\n}\r\n\r\n@Component({\r\n  selector: 'cide-ele-floating-file-uploader',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    CideIconComponent\r\n  ],\r\n  templateUrl: './floating-file-uploader.component.html',\r\n  styleUrls: []\r\n})\r\nexport class CideEleFloatingFileUploaderComponent implements OnInit, OnDestroy {\r\n  private destroyRef = inject(DestroyRef);\r\n  private fileManagerService = inject(CideEleFileManagerService);\r\n\r\n  @ViewChild('fileInput') fileInputRef!: ElementRef<HTMLInputElement>;\r\n\r\n  // Input data from floating container\r\n  @Input() data: FloatingFileUploaderData = {};\r\n\r\n  // Signals for reactive state (simplified for floating container)\r\n  isVisible = signal(true); // Set to true by default for floating containers\r\n  currentUserId = signal('');\r\n  currentGroupId = signal<string | null>(null);\r\n  \r\n  // Use file manager service as the single source of truth\r\n  uploadQueue = computed(() => this.fileManagerService.uploadQueue());\r\n  activeUploads = computed(() => this.fileManagerService.activeUploads());\r\n\r\n  // Computed values based on service state\r\n  hasUploads = computed(() => this.uploadQueue().length > 0 || this.activeUploads().size > 0);\r\n  hasActiveUploads = computed(() => this.uploadQueue().length > 0 || Array.from(this.activeUploads().values()).some(upload => upload.stage !== 'complete'));\r\n  pendingUploads = computed(() => this.uploadQueue().filter(fileId => !this.activeUploads().has(fileId)));\r\n  activeUploadsLocal = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'reading' || upload.stage === 'uploading'));\r\n  completedUploads = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'complete'));\r\n  failedUploads = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'error'));\r\n  \r\n  // Get all files for the current group (computed property for reactivity)\r\n  allFilesForGroup = computed(() => {\r\n    const groupId = this.currentGroupId();\r\n    if (!groupId) return [];\r\n    \r\n    return this.fileManagerService.getAllFilesForGroup(groupId);\r\n  });\r\n\r\n  // Check if there are any files to display (active uploads OR fetched files for current group)\r\n  hasFilesToShow = computed(() => {\r\n    return this.hasActiveUploads() || this.allFilesForGroup().length > 0;\r\n  });\r\n\r\n  // Count methods for template\r\n  getUploadingCount(): number {\r\n    return this.activeUploadsLocal().length;\r\n  }\r\n\r\n  getCompletedCount(): number {\r\n    return this.completedUploads().length;\r\n  }\r\n\r\n  getFailedCount(): number {\r\n    return this.failedUploads().length;\r\n  }\r\n\r\n  // Animation states\r\n  isAnimating = signal(false);\r\n\r\n  // Drag functionality removed - handled by floating container\r\n\r\n  // File drag and drop functionality\r\n  isDragOver = signal(false);\r\n\r\n  // Window resize handler removed - handled by floating container\r\n\r\n  // Cached dimensions for performance\r\n  // Cached dimensions removed - handled by floating container\r\n\r\n  constructor() {\r\n    console.log('🚀 [FloatingFileUploader] Component initialized');\r\n    \r\n    // Position initialization removed - handled by floating container\r\n    \r\n    // Consolidated effect for all visibility logic - SINGLE SOURCE OF TRUTH\r\n    effect(() => {\r\n      const hasActiveUploads = this.hasActiveUploads();\r\n      const shouldShow = this.fileManagerService.showFloatingUploader();\r\n      const triggerGroupId = this.fileManagerService.getTriggerGroupId();\r\n      const isCurrentlyVisible = this.isVisible();\r\n      \r\n      // Show due to active uploads\r\n      if (hasActiveUploads && !isCurrentlyVisible) {\r\n        this.showWithAnimation();\r\n        return;\r\n      }\r\n      \r\n      // Handle manual trigger (show OR switch group ID)\r\n      if (shouldShow) {\r\n        if (triggerGroupId) {\r\n          // Always switch to the new group ID (even if already visible)\r\n          console.log('🔄 [FloatingFileUploader] Switching to group ID:', triggerGroupId);\r\n          this.currentGroupId.set(triggerGroupId);\r\n          \r\n          // Fetch files for this group\r\n          this.fileManagerService.fetchAndStoreFilesByGroupId(triggerGroupId)\r\n            .pipe(takeUntilDestroyed(this.destroyRef))\r\n            .subscribe({\r\n              next: () => {\r\n                if (!isCurrentlyVisible) {\r\n                  this.showWithAnimation();\r\n                }\r\n              },\r\n              error: () => {\r\n                if (!isCurrentlyVisible) {\r\n                  this.showWithAnimation(); // Show anyway\r\n                }\r\n              }\r\n            });\r\n        } else if (!isCurrentlyVisible) {\r\n          this.showWithAnimation();\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnInit() {\r\n    // Initialize with input data\r\n    this.initializeWithData();\r\n    \r\n    // Set up drag and drop listeners\r\n    this.setupDragAndDrop();\r\n    \r\n    // Set up file input change listeners\r\n    this.setupFileInputListeners();\r\n    \r\n    // Window resize setup removed - handled by floating container\r\n  }\r\n\r\n  private initializeWithData() {\r\n    console.log('🚀 [FloatingFileUploader] Initializing with data:', this.data);\r\n    \r\n    // Set user ID if provided\r\n    if (this.data.userId) {\r\n      this.currentUserId.set(this.data.userId);\r\n      console.log('👤 [FloatingFileUploader] User ID set:', this.data.userId);\r\n    }\r\n    \r\n    // Set group ID if provided\r\n    if (this.data.groupId) {\r\n      this.currentGroupId.set(this.data.groupId);\r\n      console.log('🆔 [FloatingFileUploader] Group ID set:', this.data.groupId);\r\n      \r\n      // Load existing files for this group\r\n      this.loadExistingFiles();\r\n    }\r\n    \r\n    // Set visibility to true when component loads\r\n    this.isVisible.set(true);\r\n  }\r\n\r\n  private loadExistingFiles() {\r\n    const groupId = this.currentGroupId();\r\n    if (!groupId) return;\r\n    \r\n    console.log('📁 [FloatingFileUploader] Loading existing files for group:', groupId);\r\n    \r\n    this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\r\n      .pipe(takeUntilDestroyed(this.destroyRef))\r\n      .subscribe({\r\n        next: (files) => {\r\n          console.log('📋 [FloatingFileUploader] Files loaded:', files.length);\r\n        },\r\n        error: (error: any) => {\r\n          console.error('❌ [FloatingFileUploader] Failed to load files:', error);\r\n        }\r\n      });\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    console.log('🧹 [FloatingFileUploader] Component destroyed');\r\n    this.removeDragAndDropListeners();\r\n    this.removeFileInputListeners();\r\n    \r\n    // Window resize cleanup removed - handled by floating container\r\n  }\r\n\r\n  /**\r\n   * Set up drag and drop functionality\r\n   */\r\n  private setupDragAndDrop(): void {\r\n    document.addEventListener('dragover', this.handleDragOver.bind(this));\r\n    document.addEventListener('dragleave', this.handleDragLeave.bind(this));\r\n    document.addEventListener('drop', this.handleDrop.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove drag and drop listeners\r\n   */\r\n  private removeDragAndDropListeners(): void {\r\n    document.removeEventListener('dragover', this.handleDragOver.bind(this));\r\n    document.removeEventListener('dragleave', this.handleDragLeave.bind(this));\r\n    document.removeEventListener('drop', this.handleDrop.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Set up file input change listeners\r\n   */\r\n  private setupFileInputListeners(): void {\r\n    // Listen for file input change events globally\r\n    document.addEventListener('change', this.handleFileInputChange.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Remove file input listeners\r\n   */\r\n  private removeFileInputListeners(): void {\r\n    document.removeEventListener('change', this.handleFileInputChange.bind(this));\r\n  }\r\n\r\n  /**\r\n   * Handle file input change events\r\n   */\r\n  private handleFileInputChange(event: Event): void {\r\n    const target = event.target as HTMLInputElement;\r\n    \r\n    console.log('🔍 [FloatingFileUploader] File input change event detected:', {\r\n      type: target.type,\r\n      filesLength: target.files?.length || 0,\r\n      element: target\r\n    });\r\n    \r\n    // Check if this is a file input with files\r\n    if (target.type === 'file' && target.files && target.files.length > 0) {\r\n      console.log('📁 [FloatingFileUploader] File input change detected:', target.files.length, 'files');\r\n      \r\n      // Check if the input has a data-user-id attribute for user context\r\n      const userId = target.getAttribute('data-user-id');\r\n      if (userId && userId !== this.currentUserId()) {\r\n        this.setCurrentUserId(userId);\r\n      }\r\n      \r\n      // Handle the files\r\n      this.handleFiles(Array.from(target.files));\r\n      \r\n      // Reset the input to allow selecting the same files again\r\n      target.value = '';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle drag over event\r\n   */\r\n  private handleDragOver(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    \r\n    // Show floating uploader when files are dragged over\r\n    if (event.dataTransfer?.types.includes('Files')) {\r\n      this.showWithAnimation();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle drag leave event\r\n   */\r\n  private handleDragLeave(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    \r\n    // Only hide if leaving the entire document\r\n    if (!event.relatedTarget || event.relatedTarget === document.body) {\r\n      this.updateVisibility();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle drop event\r\n   */\r\n  private handleDrop(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    \r\n    const files = event.dataTransfer?.files;\r\n    if (files && files.length > 0) {\r\n      this.handleFiles(Array.from(files));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle files from drag and drop or file input\r\n   */\r\n  private handleFiles(files: File[]): void {\r\n    console.log('📁 [FloatingFileUploader] Handling files:', files.length);\r\n    \r\n    // Use handleFileSelection to avoid duplicate upload paths\r\n    this.handleFileSelection(files);\r\n  }\r\n\r\n  /**\r\n   * Update visibility - simplified for notification only\r\n   */\r\n  updateVisibility() {\r\n    // This is just a notification component now\r\n    // The actual uploads are handled by the global uploader\r\n  }\r\n\r\n  /**\r\n   * Show with animation\r\n   */\r\n  private showWithAnimation() {\r\n    console.log('🎬 [FloatingFileUploader] showWithAnimation called - setting isVisible to true');\r\n    this.isAnimating.set(true);\r\n    this.isVisible.set(true);\r\n    \r\n    // Remove animation class after animation completes\r\n    setTimeout(() => {\r\n      this.isAnimating.set(false);\r\n      console.log('🎬 [FloatingFileUploader] Animation completed, isVisible:', this.isVisible());\r\n    }, 300);\r\n  }\r\n\r\n  /**\r\n   * Hide with animation\r\n   */\r\n  private hideWithAnimation() {\r\n    this.isAnimating.set(true);\r\n    \r\n    // Wait for animation to complete before hiding\r\n    setTimeout(() => {\r\n      this.isVisible.set(false);\r\n      this.isAnimating.set(false);\r\n    }, 300);\r\n  }\r\n\r\n  // Minimize and close functionality removed - handled by floating container\r\n\r\n  /**\r\n   * Get upload summary text\r\n   */\r\n  getUploadSummary(): string {\r\n    const pending = this.pendingUploads();\r\n    const active = this.activeUploadsLocal();\r\n    const completed = this.completedUploads();\r\n    const failed = this.failedUploads();\r\n\r\n    if (active.length > 0) {\r\n      return `${active.length} uploading`;\r\n    } else if (pending.length > 0) {\r\n      return `${pending.length} pending`;\r\n    } else if (completed.length > 0 && failed.length === 0) {\r\n      return `${completed.length} completed`;\r\n    } else if (failed.length > 0) {\r\n      return `${completed.length} completed, ${failed.length} failed`;\r\n    }\r\n\r\n    return 'No uploads';\r\n  }\r\n\r\n  /**\r\n   * Get overall progress percentage\r\n   */\r\n  getOverallProgress(): number {\r\n    const allUploads = Array.from(this.activeUploads().values());\r\n    if (allUploads.length === 0) return 0;\r\n\r\n    const totalProgress = allUploads.reduce((sum, upload) => sum + (upload.percentage || 0), 0);\r\n    return Math.round(totalProgress / allUploads.length);\r\n  }\r\n\r\n  /**\r\n   * Get status icon based on upload stage\r\n   */\r\n  getStatusIcon(stage: string): string {\r\n    switch (stage) {\r\n      case 'reading': return 'schedule';\r\n      case 'uploading': return 'cloud_upload';\r\n      case 'complete': return 'check_circle';\r\n      case 'error': return 'error';\r\n      default: return 'help';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get status class based on upload stage\r\n   */\r\n  getStatusClass(stage: string): string {\r\n    switch (stage) {\r\n      case 'reading': return 'status-pending';\r\n      case 'uploading': return 'status-uploading';\r\n      case 'complete': return 'status-completed';\r\n      case 'error': return 'status-error';\r\n      default: return 'status-unknown';\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Cancel upload\r\n   */\r\n  cancelUpload(fileId: string) {\r\n    console.log('🚫 [FloatingFileUploader] Cancelling upload:', fileId);\r\n    this.fileManagerService.cancelUpload(fileId);\r\n  }\r\n\r\n  /**\r\n   * Get file name from file ID (extract from the ID format)\r\n   */\r\n  getFileNameFromId(fileId: string): string {\r\n    // Extract filename from the fileId format: filename_size_timestamp\r\n    const parts = fileId.split('_');\r\n    if (parts.length >= 3) {\r\n      // Remove the last two parts (size and timestamp) to get the filename\r\n      return parts.slice(0, -2).join('_');\r\n    }\r\n    return fileId;\r\n  }\r\n\r\n  /**\r\n   * Get all files from service state (pending + active uploads + fetched files)\r\n   * This method now uses the computed property for consistency\r\n   */\r\n  getAllFiles() {\r\n    return this.allFilesForGroup();\r\n  }\r\n\r\n\r\n  /**\r\n   * Set current user ID\r\n   */\r\n  setCurrentUserId(userId: string) {\r\n    this.currentUserId.set(userId);\r\n    this.fileManagerService.setUserId(userId);\r\n  }\r\n\r\n\r\n\r\n  /**\r\n   * Check if there are any uploads for the current group\r\n   */\r\n  hasUploadsForCurrentGroup(): boolean {\r\n    const groupId = this.currentGroupId();\r\n    if (!groupId) {\r\n      // If no group filter, show all uploads\r\n      return this.hasUploads();\r\n    }\r\n    \r\n    // Check if any uploads belong to the current group\r\n    // Note: This would need to be enhanced based on how group IDs are stored in the file manager service\r\n    return this.hasUploads();\r\n  }\r\n\r\n  /**\r\n   * Handle drag over event for file drop\r\n   */\r\n  onDragOver(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isDragOver.set(true);\r\n  }\r\n\r\n  /**\r\n   * Handle drag leave event for file drop\r\n   */\r\n  onDragLeave(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isDragOver.set(false);\r\n  }\r\n\r\n  /**\r\n   * Handle drop event for file drop\r\n   */\r\n  onDrop(event: DragEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.isDragOver.set(false);\r\n\r\n    const files = event.dataTransfer?.files;\r\n    if (files && files.length > 0) {\r\n      this.handleFileSelection(Array.from(files));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Trigger file input click\r\n   */\r\n  triggerFileInput(): void {\r\n    if (this.fileInputRef?.nativeElement) {\r\n      this.fileInputRef.nativeElement.click();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle file input change\r\n   */\r\n  onFileInputChange(event: Event): void {\r\n    const input = event.target as HTMLInputElement;\r\n    if (input.files && input.files.length > 0) {\r\n      this.handleFileSelection(Array.from(input.files));\r\n      input.value = ''; // Reset input\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle file selection from drag/drop or file input\r\n   */\r\n  private handleFileSelection(files: File[]): void {\r\n    const groupId = this.currentGroupId();\r\n    \r\n    // Group ID must be provided by the file input component\r\n    if (!groupId) {\r\n      console.error('❌ [FloatingFileUploader] No group ID available. Files cannot be uploaded without a group ID from the file input component.');\r\n      return;\r\n    }\r\n    \r\n    // Upload files using the file manager service\r\n    files.forEach((file) => {\r\n      this.fileManagerService.uploadFile(file, {\r\n        groupId: groupId,\r\n        isMultiple: true,\r\n        userId: this.currentUserId()\r\n      });\r\n    });\r\n  }\r\n\r\n\r\n  /**\r\n   * Update cached dimensions (throttled for performance)\r\n   */\r\n  // Cached dimensions functionality removed - handled by floating container\r\n\r\n  /**\r\n   * Start dragging the uploader\r\n   */\r\n  // Drag functionality removed - handled by floating container\r\n\r\n  /**\r\n   * Handle dragging movement\r\n   */\r\n  // All drag functionality removed - handled by floating container\r\n\r\n  /**\r\n   * Set up window resize listener to keep uploader within bounds\r\n   */\r\n  // Window resize functionality removed - handled by floating container\r\n\r\n  /**\r\n   * Initialize default position\r\n   */\r\n  // Position initialization removed - handled by floating container\r\n\r\n}\r\n","<!-- File Uploader Content (No absolute positioning - works within floating container) -->\r\n@if (isVisible()) {\r\n<div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden\">\r\n    <!-- Content starts directly - no header needed since floating container provides it -->\r\n\r\n  <!-- Content -->\r\n  <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-pb-4\">\r\n    \r\n    <!-- Drag and Drop Zone -->\r\n    <div class=\"tw-mb-4 tw-p-6 tw-border-2 tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-bg-gray-50 tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-center hover:tw-border-blue-500 hover:tw-bg-blue-50\" \r\n         [class.tw-border-blue-500]=\"isDragOver()\"\r\n         [class.tw-bg-blue-100]=\"isDragOver()\"\r\n         [class.tw-scale-105]=\"isDragOver()\"\r\n         (dragover)=\"onDragOver($event)\"\r\n         (dragleave)=\"onDragLeave($event)\" \r\n         (drop)=\"onDrop($event)\" \r\n         (click)=\"triggerFileInput()\">\r\n      \r\n      <!-- Hidden file input -->\r\n      <input #fileInput \r\n             type=\"file\" \r\n             [multiple]=\"data.multiple !== false\" \r\n             [accept]=\"data.allowedFileTypes?.join(',') || '*/*'\" \r\n             (change)=\"onFileInputChange($event)\" \r\n             class=\"tw-hidden\">\r\n      \r\n      <div class=\"tw-flex tw-flex-col tw-items-center tw-gap-2\">\r\n        <cide-ele-icon class=\"tw-text-gray-400 tw-transition-colors tw-duration-200\" \r\n                       [class.tw-text-blue-500]=\"isDragOver()\"\r\n                       size=\"sm\">cloud_upload</cide-ele-icon>\r\n        \r\n        <div>\r\n          <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">\r\n            {{ isDragOver() ? 'Drop files here' : 'Drag files here or click to browse' }}\r\n          </div>\r\n          @if (data.description) {\r\n          <div class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ data.description }}</div>\r\n          }\r\n        </div>\r\n      </div>\r\n    </div>\r\n    \r\n    <!-- Upload Queue - Show files from service state -->\r\n    @if (allFilesForGroup().length > 0) {\r\n    <div class=\"tw-space-y-2\">\r\n      <!-- Show all files from service state -->\r\n      @for (file of allFilesForGroup(); track file.fileId) {\r\n      <div class=\"tw-flex tw-items-center tw-px-4 tw-py-3 tw-rounded-lg tw-transition-colors tw-duration-200 tw-bg-white tw-border tw-border-gray-200 hover:tw-bg-gray-100 hover:tw-shadow-sm\"\r\n           [class.tw-bg-blue-50]=\"file.stage === 'uploading'\"\r\n           [class.tw-bg-green-50]=\"file.stage === 'complete'\"\r\n           [class.tw-bg-red-50]=\"file.stage === 'error'\">\r\n        <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-1 tw-min-w-0\">\r\n          <cide-ele-icon class=\"tw-flex-shrink-0\" size=\"xs\">{{ getStatusIcon(file.stage) }}</cide-ele-icon>\r\n          <div class=\"tw-min-w-0 tw-flex-1\">\r\n            <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\">{{ file.fileName }}</div>\r\n            <div class=\"tw-text-xs\">\r\n              @switch (file.stage) {\r\n              @case ('pending') {\r\n              <span class=\"tw-text-yellow-600 tw-font-medium\">Waiting...</span>\r\n              }\r\n              @case ('reading') {\r\n              <span class=\"tw-text-yellow-600 tw-font-medium\">Reading...</span>\r\n              }\r\n              @case ('uploading') {\r\n              <span class=\"tw-text-blue-600 tw-font-medium\">Uploading...</span>\r\n              }\r\n              @case ('complete') {\r\n              <span class=\"tw-text-green-600 tw-font-medium\">Completed</span>\r\n              }\r\n              @case ('error') {\r\n              <span class=\"tw-text-red-600 tw-font-medium\">Failed</span>\r\n              }\r\n              }\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Progress Bar (only for uploading files) -->\r\n        @if (file.stage === 'uploading' && file.percentage !== undefined) {\r\n        <div class=\"tw-flex tw-items-center tw-gap-2 tw-ml-2 tw-min-w-[80px]\">\r\n          <div class=\"tw-flex-1 tw-h-1 tw-bg-gray-200 tw-rounded-full tw-overflow-hidden\">\r\n            <div class=\"tw-h-full tw-bg-blue-500 tw-transition-all tw-duration-300\" [style.width.%]=\"file.percentage\"></div>\r\n          </div>\r\n          <span class=\"tw-text-xs tw-text-gray-500 tw-min-w-[24px] tw-text-right\">{{ file.percentage }}%</span>\r\n        </div>\r\n        }\r\n\r\n        <!-- Actions -->\r\n        <div class=\"tw-flex tw-gap-1 tw-ml-2\">\r\n          @switch (file.stage) {\r\n          @case ('pending') {\r\n          <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \r\n                  (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\r\n            <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n          </button>\r\n          }\r\n          @case ('reading') {\r\n          <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \r\n                  (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\r\n            <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n          </button>\r\n          }\r\n          @case ('uploading') {\r\n          <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \r\n                  (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\r\n            <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n          </button>\r\n          }\r\n          @case ('complete') {\r\n          <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-text-green-600\" title=\"Completed\">\r\n            <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n          </button>\r\n          }\r\n          @case ('error') {\r\n          <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-blue-50 hover:tw-text-blue-600\" \r\n                  title=\"Retry\">\r\n            <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\r\n          </button>\r\n          }\r\n          }\r\n        </div>\r\n      </div>\r\n      }\r\n    </div>\r\n    } @else {\r\n    <!-- No uploads message when manually opened -->\r\n    <div class=\"tw-py-8 tw-text-center tw-text-gray-500\">\r\n      <div class=\"tw-flex tw-flex-col tw-items-center tw-gap-4\">\r\n        <cide-ele-icon size=\"md\" class=\"tw-text-gray-300 tw-opacity-70\">cloud_upload</cide-ele-icon>\r\n        <div>\r\n          <h4 class=\"tw-text-lg tw-font-semibold tw-text-gray-700 tw-mb-2\">No active uploads</h4>\r\n          <p class=\"tw-text-sm tw-text-gray-500\">Upload files to see their progress here</p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n    }\r\n  </div>\r\n\r\n  <!-- Status summary - integrated into content -->\r\n  @if (hasActiveUploads()) {\r\n  <div class=\"tw-px-4 tw-py-2 tw-bg-gray-50\">\r\n    <div class=\"tw-flex tw-gap-3 tw-text-xs\">\r\n      <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-blue-600\">\r\n        <cide-ele-icon size=\"xs\">upload</cide-ele-icon>\r\n        <span>{{ getUploadingCount() }} uploading</span>\r\n      </div>\r\n      <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-green-600\">\r\n        <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n        <span>{{ getCompletedCount() }} completed</span>\r\n      </div>\r\n      <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-red-600\">\r\n        <cide-ele-icon size=\"xs\">error</cide-ele-icon>\r\n        <span>{{ getFailedCount() }} failed</span>\r\n      </div>\r\n    </div>\r\n  </div>\r\n  }\r\n</div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\r\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n  selector: 'cide-ele-textarea',\r\n  standalone: true,\r\n  templateUrl: './textarea.component.html',\r\n  styleUrl: './textarea.component.scss',\r\n  imports: [CommonModule, FormsModule],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => CideTextareaComponent),\r\n      multi: true\r\n    },\r\n    {\r\n      provide: NG_VALIDATORS,\r\n      multi: true,\r\n      useExisting: forwardRef(() => CideTextareaComponent),\r\n    }\r\n  ]\r\n})\r\nexport class CideTextareaComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {\r\n  @Input() label: string = '';\r\n  @Input() labelHide: boolean = false;\r\n  @Input() placeholder: string = '';\r\n  @Input() helperText: string = '';\r\n  @Input() errorText: string = '';\r\n  @Input() required: boolean = false;\r\n  @Input() disabled: boolean = false;\r\n  @Input() minlength: number = 0;\r\n  @Input() maxlength: number = 0;\r\n  @Input() rows: number | string = 3;\r\n  @Input() id: string = '';\r\n  @Input() ngModel: string = '';\r\n  @Input() size: themeSize = 'sm';\r\n  @Input() fill: elementStyleType = 'outline';\r\n  @Input() labelPlacement: labelPlacementType = 'fixed';\r\n  @Input() labelDir: labelDirType = 'start';\r\n  @Input() leadingIcon: string = '';\r\n  @Input() trailingIcon: string = '';\r\n  @Input() clearInput: boolean = false;\r\n  trailingIconInternal: string = '';\r\n  isTrailingIconAllwedClick: boolean = false;\r\n  @Output() ngModelChange = new EventEmitter<string>();\r\n\r\n  isTouched = false;\r\n  isValid = true;\r\n\r\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n  onChange = (value: string) => {};\r\n  onTouched = () => {};\r\n  onValidate = () => {};\r\n\r\n  ngOnInit(): void {\r\n    this.validateValue(this.ngModel);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['ngModel']) {\r\n      this.validateValue(this.ngModel);\r\n    }\r\n  }\r\n\r\n  writeValue(value: string): void {\r\n    this.ngModel = value;\r\n    this.validateValue(value);\r\n  }\r\n\r\n  registerOnChange(fn: (value: string) => void): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: () => void): 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  validate(control: AbstractControl): ValidationErrors | null {\r\n    return this.validateValue(control.value);\r\n  }\r\n\r\n  validateValue(value: string): ValidationErrors | null {\r\n    console.log('validateValue', value);\r\n    this.isValid = true;\r\n    return null;\r\n  }\r\n\r\n  onInput(event: Event) {\r\n    const value = (event.target as HTMLTextAreaElement).value;\r\n    this.ngModel = value;\r\n    this.onChange(value);\r\n    this.ngModelChange.emit(value);\r\n    this.validateValue(value);\r\n  }\r\n\r\n  onBlur() {\r\n    this.isTouched = true;\r\n    this.onTouched();\r\n  }\r\n\r\n  ClearInputValue() {\r\n    this.ngModel = '';\r\n    this.onChange('');\r\n    this.ngModelChange.emit('');\r\n    this.validateValue('');\r\n  }\r\n\r\n  trailingIconClick() {\r\n    // For future extensibility (e.g., password visibility)\r\n    // For now, just emit event or toggle icon if needed\r\n  }\r\n} ","<div class=\"cide-textarea\" [ngClass]=\"{\r\n  'cide-element-size-xxs': (size === '2xs'),\r\n  'cide-element-size-xs': (size === 'xs'),\r\n  'cide-element-size-sm': (size === 'sm'),\r\n  'cide-element-size-md': (size === 'md'),\r\n  'cide-element-size-lg': (size === 'lg'),\r\n  'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n  'cide-element-input-label-start': (labelDir === 'start'),\r\n  'cide-element-input-label-end': (labelDir === 'end'),\r\n  'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n  'cide-element-input-label-less': (!label || labelHide),\r\n  'cide-element-style-outline': (fill === 'outline'),\r\n  'cide-element-style-solid': (fill === 'solid'),\r\n  'cide-element-style-standard': (fill === 'standard'),\r\n}\">\r\n  <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-textarea-label\">\r\n    {{ label }}\r\n    <span *ngIf=\"required\" class=\"tw-text-red-500 tw-ml-1\">*</span>\r\n  </label>\r\n  <div class=\"cide-element-input-wrapper\">\r\n    <!-- Leading Icon -->\r\n    <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n      <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n    </span>\r\n    <!-- Trailing Icon -->\r\n    <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n      *ngIf=\"trailingIconInternal\">\r\n      <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n        [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n        (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n    </span>\r\n    <!-- Clear -->\r\n    <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n      <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n    </button>\r\n    <!-- Textarea -->\r\n    <textarea [id]=\"id\" [attr.placeholder]=\"placeholder\" [attr.rows]=\"rows\"\r\n      [attr.minlength]=\"minlength > 0 ? minlength : null\" [attr.maxlength]=\"maxlength > 0 ? maxlength : null\"\r\n      [disabled]=\"disabled\" [(ngModel)]=\"ngModel\" (input)=\"onInput($event)\" (blur)=\"onBlur()\"\r\n      [ngClass]=\"{\r\n        'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n        'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n        'tw-pl-1': !leadingIcon,\r\n        'tw-pr-8': trailingIconInternal,\r\n        'tw-pr-1': !trailingIconInternal,\r\n        'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n        '!tw-mt-0': labelHide,\r\n        'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n      }\"\r\n      class=\"cide-textarea-input tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-py-[1px] tw-outline-none\"></textarea>\r\n  </div>\r\n  <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-textarea-help-error-text\">{{ errorText || helperText\r\n    }}</span>\r\n  <span *ngIf=\"helperText && isValid\" class=\"cide-textarea-help-error-text\">{{ helperText }}</span>\r\n</div>","import { Component, Input, Output, EventEmitter, signal, computed, OnInit, OnDestroy, HostListener, inject, effect, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from '../icon/icon.component';\r\n// Breadcrumb service removed; component operates on inputs and local state only\r\n\r\nexport interface BreadcrumbItem {\r\n  id: string;\r\n  label: string;\r\n  icon?: string;\r\n  url?: string;\r\n  disabled?: boolean;\r\n  type?: 'root' | 'category' | 'entity' | 'custom';\r\n  metadata?: any;\r\n}\r\n\r\nexport interface BreadcrumbDropdownOption {\r\n  id: string;\r\n  label: string;\r\n  icon?: string;\r\n  disabled?: boolean;\r\n  action?: () => void;\r\n}\r\n\r\nexport interface BreadcrumbSeparator {\r\n  type: 'chevron' | 'slash' | 'arrow' | 'dot' | 'custom';\r\n  icon?: string;\r\n  text?: string;\r\n}\r\n\r\nexport type BreadcrumbStyle = 'modern' | 'classic' | 'minimal' | 'hierarchical';\r\n\r\nexport interface BreadcrumbConfig {\r\n  style: BreadcrumbStyle;\r\n  separator: BreadcrumbSeparator;\r\n  showHomeIcon: boolean;\r\n  homeIcon: string;\r\n  maxItems: number;\r\n  showDropdownOnOverflow: boolean;\r\n  dropdownOptions: BreadcrumbDropdownOption[];\r\n  clickableItems: boolean;\r\n  showTooltips: boolean;\r\n  responsive: boolean;\r\n  compact: boolean;\r\n  animated: boolean;\r\n}\r\n\r\n@Component({\r\n  selector: 'cide-ele-breadcrumb',\r\n  standalone: true,\r\n  imports: [CommonModule, CideIconComponent],\r\n  templateUrl: './breadcrumb.component.html',\r\n  styleUrl: './breadcrumb.component.scss',\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CideEleBreadcrumbComponent implements OnInit, OnDestroy {\r\n  // Input signals\r\n  items = input<BreadcrumbItem[]>([]);\r\n  style = input<BreadcrumbStyle>('modern');\r\n  separator = input<BreadcrumbSeparator>({ type: 'chevron' });\r\n  showHomeIcon = input<boolean>(true);\r\n  homeIcon = input<string>('home');\r\n  maxItems = input<number>(5);\r\n  showDropdownOnOverflow = input<boolean>(true);\r\n  dropdownOptions = input<BreadcrumbDropdownOption[]>([]);\r\n  clickableItems = input<boolean>(true);\r\n  showTooltips = input<boolean>(true);\r\n  responsive = input<boolean>(true);\r\n  compact = input<boolean>(false);\r\n  animated = input<boolean>(true);\r\n  loadingInput = input<boolean>(false);\r\n  disabled = input<boolean>(false);\r\n\r\n  // Optional context id when used inside tabs/popups; if omitted, uses service active context\r\n  contextId = input<string | undefined>(undefined);\r\n  // Optional pageCode input for auto-resolving via provided resolver (no service injection needed by consumer)\r\n  pageCode = input<string | undefined>(undefined);\r\n\r\n  // Output events\r\n  @Output() itemClick = new EventEmitter<BreadcrumbItem>();\r\n  @Output() dropdownOptionClick = new EventEmitter<BreadcrumbDropdownOption>();\r\n  @Output() homeClick = new EventEmitter<void>();\r\n\r\n  // Internal state\r\n  private showDropdown = signal(false);\r\n  private isOverflowing = signal(false);\r\n  private visibleItems = signal<BreadcrumbItem[]>([]);\r\n  private hiddenItems = signal<BreadcrumbItem[]>([]);\r\n  private localItems = signal<BreadcrumbItem[]>([]);\r\n  private localLoading = signal<boolean>(false);\r\n\r\n  // Computed properties\r\n  showDropdownSignal = computed(() => this.showDropdown());\r\n  isOverflowingSignal = computed(() => this.isOverflowing());\r\n  visibleItemsSignal = computed(() => this.visibleItems());\r\n  hiddenItemsSignal = computed(() => this.hiddenItems());\r\n\r\n  // Configuration based on style\r\n  config = computed(() => this.getConfigForStyle(this.style()));\r\n  effectiveLoading = computed(() => this.loadingInput() || this.localLoading());\r\n\r\n  // Service for auto-binding when inputs are not provided\r\n  // No service injection\r\n  private cleanupEffect?: { destroy: () => void };\r\n\r\n  constructor() {\r\n    // Mirror external input items into local state within injection context\r\n    const ref = effect(() => {\r\n      const inItems = this.items();\r\n      if (inItems && inItems.length > 0) {\r\n        this.localItems.set([...inItems]);\r\n        this.processItems();\r\n      }\r\n    });\r\n    this.cleanupEffect = { destroy: () => ref.destroy() };\r\n  }\r\n\r\n  ngOnInit() {\r\n    // Initial calculation\r\n    this.processItems();\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.cleanupEffect?.destroy();\r\n  }\r\n\r\n  @HostListener('document:click', ['$event'])\r\n  onDocumentClick(event: Event) {\r\n    const target = event.target as HTMLElement;\r\n    if (!target.closest('.breadcrumb-dropdown-container')) {\r\n      this.showDropdown.set(false);\r\n    }\r\n  }\r\n\r\n  // Process items based on maxItems and overflow\r\n  private processItems() {\r\n    const source = this.localItems();\r\n    const max = this.maxItems();\r\n    if (source.length <= max) {\r\n      this.visibleItems.set([...source]);\r\n      this.hiddenItems.set([]);\r\n      this.isOverflowing.set(false);\r\n    } else {\r\n      const visibleCount = this.showDropdownOnOverflow() ? max - 1 : max;\r\n      this.visibleItems.set(source.slice(0, visibleCount));\r\n      this.hiddenItems.set(source.slice(visibleCount));\r\n      this.isOverflowing.set(true);\r\n    }\r\n  }\r\n\r\n  // Get configuration based on style\r\n  private getConfigForStyle(style: BreadcrumbStyle): BreadcrumbConfig {\r\n    const configs: Record<BreadcrumbStyle, BreadcrumbConfig> = {\r\n      modern: {\r\n        style: 'modern',\r\n        separator: { type: 'chevron' },\r\n        showHomeIcon: true,\r\n        homeIcon: 'home',\r\n        maxItems: 5,\r\n        showDropdownOnOverflow: true,\r\n        dropdownOptions: [],\r\n        clickableItems: true,\r\n        showTooltips: true,\r\n        responsive: true,\r\n        compact: false,\r\n        animated: true\r\n      },\r\n      classic: {\r\n        style: 'classic',\r\n        separator: { type: 'slash' },\r\n        showHomeIcon: false,\r\n        homeIcon: 'home',\r\n        maxItems: 8,\r\n        showDropdownOnOverflow: false,\r\n        dropdownOptions: [],\r\n        clickableItems: true,\r\n        showTooltips: false,\r\n        responsive: false,\r\n        compact: true,\r\n        animated: false\r\n      },\r\n      minimal: {\r\n        style: 'minimal',\r\n        separator: { type: 'dot' },\r\n        showHomeIcon: false,\r\n        homeIcon: 'home',\r\n        maxItems: 3,\r\n        showDropdownOnOverflow: true,\r\n        dropdownOptions: [],\r\n        clickableItems: false,\r\n        showTooltips: true,\r\n        responsive: true,\r\n        compact: true,\r\n        animated: false\r\n      },\r\n  hierarchical: {\r\n    style: 'hierarchical',\r\n    separator: { type: 'chevron' },\r\n    showHomeIcon: true,\r\n    homeIcon: 'home',\r\n    maxItems: 4,\r\n    showDropdownOnOverflow: true,\r\n    dropdownOptions: [],\r\n    clickableItems: true,\r\n    showTooltips: false,\r\n    responsive: true,\r\n    compact: true,\r\n    animated: false\r\n  }\r\n    };\r\n\r\n    return configs[style];\r\n  }\r\n\r\n  // Event handlers\r\n  onItemClick(item: BreadcrumbItem) {\r\n    if (!item.disabled && this.clickableItems() && !this.disabled()) {\r\n      this.itemClick.emit(item);\r\n    }\r\n  }\r\n\r\n  onHomeClick() {\r\n    if (!this.disabled()) {\r\n      this.homeClick.emit();\r\n    }\r\n  }\r\n\r\n  onDropdownToggle() {\r\n    if (!this.disabled()) {\r\n      this.showDropdown.set(!this.showDropdown());\r\n    }\r\n  }\r\n\r\n  onDropdownOptionClick(option: BreadcrumbDropdownOption) {\r\n    if (!option.disabled && !this.disabled()) {\r\n      this.dropdownOptionClick.emit(option);\r\n      this.showDropdown.set(false);\r\n    }\r\n  }\r\n\r\n  // Utility methods\r\n  getItemClasses(item: BreadcrumbItem, isLast: boolean = false): string {\r\n    const classes = ['breadcrumb-item'];\r\n    \r\n    if (this.config().compact) classes.push('compact');\r\n    if (this.config().animated) classes.push('animated');\r\n    if (item.disabled) classes.push('disabled');\r\n    if (isLast) classes.push('last');\r\n    if (this.clickableItems() && !item.disabled) classes.push('clickable');\r\n    \r\n    return classes.join(' ');\r\n  }\r\n\r\n  getContainerClasses(): string {\r\n    const classes = ['breadcrumb-container'];\r\n    \r\n    classes.push(`style-${this.style()}`);\r\n    if (this.config().compact) classes.push('compact');\r\n    if (this.config().responsive) classes.push('responsive');\r\n    if (this.config().animated) classes.push('animated');\r\n    if (this.effectiveLoading()) classes.push('loading');\r\n    if (this.disabled()) classes.push('disabled');\r\n    \r\n    return classes.join(' ');\r\n  }\r\n\r\n  getSeparatorIcon(): string {\r\n    const separatorMap: Record<string, string> = {\r\n      'chevron': 'chevron_right',\r\n      'slash': 'keyboard_arrow_right',\r\n      'arrow': 'arrow_forward',\r\n      'dot': 'fiber_manual_record'\r\n    };\r\n    \r\n    const sep = this.separator();\r\n    return separatorMap[sep.type] || 'chevron_right';\r\n  }\r\n\r\n  getTooltipText(item: BreadcrumbItem): string {\r\n    if (!this.showTooltips) return '';\r\n    \r\n    let tooltip = item.label;\r\n    if (item.type) {\r\n      tooltip += ` (${item.type})`;\r\n    }\r\n    if (item.url) {\r\n      tooltip += ` - ${item.url}`;\r\n    }\r\n    \r\n    return tooltip;\r\n  }\r\n\r\n  // Public methods for external control\r\n  public toggleDropdown() {\r\n    this.onDropdownToggle();\r\n  }\r\n\r\n  public closeDropdown() {\r\n    this.showDropdown.set(false);\r\n  }\r\n\r\n  public updateItems(newItems: BreadcrumbItem[]) {\r\n    this.localItems.set(newItems);\r\n    this.processItems();\r\n  }\r\n\r\n  public addItem(item: BreadcrumbItem) {\r\n    this.localItems.set([...this.localItems(), item]);\r\n    this.processItems();\r\n  }\r\n\r\n  public removeItem(itemId: string) {\r\n    this.localItems.set(this.localItems().filter(item => item.id !== itemId));\r\n    this.processItems();\r\n  }\r\n\r\n  public setLoading(value: boolean) {\r\n    this.localLoading.set(value);\r\n  }\r\n}\r\n","<!-- Breadcrumb Component Template -->\n<div [class]=\"getContainerClasses()\" class=\"tw-flex tw-items-center tw-text-[8px] md:tw-text-xs tw-text-gray-700 tw-py-0 tw-leading-none breadcrumb-root\">\n\n  <!-- Loading State -->\n  @if (effectiveLoading()) {\n  <div class=\"breadcrumb-loading\">\n    <cide-ele-icon class=\"animate-spin\">refresh</cide-ele-icon>\n    <span>Loading...</span>\n  </div>\n  }\n\n  <!-- Main Breadcrumb Content -->\n  @if (!effectiveLoading()) {\n  <nav class=\"tw-flex tw-items-center tw-p-0 tw-min-w-0 tw-flex-1 tw-w-full tw-overflow-hidden\" role=\"navigation\"\n    aria-label=\"Breadcrumb\">\n    <ol class=\"tw-flex tw-items-center tw-list-none tw-m-0 tw-p-0 tw-gap-0 md:tw-gap-1 tw-flex-wrap tw-w-full tw-min-w-0 tw-overflow-hidden breadcrumb-list-el\">\n\n      <!-- Home Icon (if enabled) -->\n      @if (config().showHomeIcon) {\n      <li class=\"tw-flex tw-items-center tw-gap-0 md:tw-gap-1 tw-px-0 md:tw-px-1 tw-whitespace-nowrap tw-relative\"\n        [class.tw-cursor-pointer]=\"clickableItems() && !disabled()\" (click)=\"onHomeClick()\"\n        [title]=\"showTooltips() ? 'Go to Home' : ''\">\n        <cide-ele-icon class=\"tw-text-gray-500 max-sm:tw-w-[20px] tw-text-[8px] md:tw-text-xs breadcrumb-icon\">\n          {{ config().homeIcon }}\n        </cide-ele-icon>\n      </li>\n\n      <!-- Separator after home -->\n      @if (visibleItemsSignal().length > 0) {\n      <li class=\"tw-flex tw-items-center tw-text-gray-300 tw-mx-0 md:tw-mx-0.5 tw-flex-shrink-0\">\n        @if (separator().type === 'custom' && separator().text) {\n        <span class=\"tw-font-normal tw-text-gray-400 tw-text-[8px] md:tw-text-xs\">{{ separator().text }}</span>\n        } @else {\n        <cide-ele-icon class=\"tw-text-[8px] md:tw-text-xs breadcrumb-sep max-sm:tw-w-[10px]\">\n          {{ getSeparatorIcon() }}\n        </cide-ele-icon>\n        }\n      </li>\n      }\n      }\n\n      <!-- Visible Items -->\n      @for (item of visibleItemsSignal(); track item.id; let i = $index; let isLast = $last) {\n      <li class=\"tw-flex tw-items-center tw-gap-0 md:tw-gap-1 tw-px-0 md:tw-px-1 tw-relative breadcrumb-item-li\"\n        [class.tw-cursor-pointer]=\"clickableItems() && !disabled()\" [class.tw-text-gray-400]=\"isLast\"\n        [class.breadcrumb-item-last]=\"isLast\"\n        [class.tw-whitespace-nowrap]=\"!isLast\"\n        (click)=\"onItemClick(item)\" [title]=\"getTooltipText(item)\" [attr.aria-current]=\"isLast ? 'page' : null\">\n\n        <!-- Item Icon (if provided) -->\n        @if (item.icon) {\n        <cide-ele-icon class=\"tw-text-gray-500 tw-text-[8px] md:tw-text-xs tw-flex-shrink-0 breadcrumb-icon\">\n          {{ item.icon }}\n        </cide-ele-icon>\n        }\n\n        <!-- Item Label -->\n        <span class=\"tw-font-medium tw-text-[8px] md:tw-text-xs breadcrumb-label\" [class.tw-min-w-0]=\"isLast\"\n          [class.tw-truncate]=\"isLast\">\n          {{ item.label }}\n        </span>\n\n        <!-- Item Type Badge (for hierarchical style) -->\n        @if (style() === 'hierarchical' && item.type && item.type !== 'root') {\n        <span class=\"item-type-badge\" [class]=\"'type-' + item.type\">\n          {{ item.type }}\n        </span>\n        }\n      </li>\n\n      <!-- Separator (except for last item) -->\n      @if (!isLast || isOverflowingSignal()) {\n      <li class=\"tw-flex tw-items-center tw-text-gray-300 tw-mx-0 md:tw-mx-0.5 tw-flex-shrink-0\">\n        @if (separator().type === 'custom' && separator().text) {\n        <span class=\"tw-font-normal tw-text-gray-400 tw-text-[8px] md:tw-text-xs\">{{ separator().text }}</span>\n        } @else {\n        <cide-ele-icon class=\"tw-text-[8px] md:tw-text-xs breadcrumb-sep max-sm:tw-w-[10px]\">\n          {{ getSeparatorIcon() }}\n        </cide-ele-icon>\n        }\n      </li>\n      }\n      }\n\n      <!-- Overflow Dropdown -->\n      @if (isOverflowingSignal() && showDropdownOnOverflow()) {\n      <li class=\"breadcrumb-item overflow-item\">\n        <div class=\"breadcrumb-dropdown-container\">\n          <button type=\"button\" class=\"overflow-button\" (click)=\"onDropdownToggle()\" [disabled]=\"disabled()\"\n            [attr.aria-expanded]=\"showDropdownSignal()\" aria-haspopup=\"true\"\n            [title]=\"showTooltips() ? 'More items' : ''\">\n            <cide-ele-icon class=\"overflow-icon\">more_horiz</cide-ele-icon>\n            <span class=\"overflow-text\" [class.compact]=\"config().compact\">\n              {{ hiddenItemsSignal().length }}+ more\n            </span>\n          </button>\n\n          <!-- Dropdown Menu -->\n          @if (showDropdownSignal()) {\n          <div class=\"breadcrumb-dropdown\" role=\"menu\">\n            <div class=\"dropdown-header\">\n              <span>Hidden Items</span>\n            </div>\n\n            <!-- Hidden Items -->\n            @for (item of hiddenItemsSignal(); track item.id) {\n            <button type=\"button\" class=\"dropdown-item\" (click)=\"onItemClick(item)\"\n              [disabled]=\"item.disabled || disabled()\" role=\"menuitem\">\n              @if (item.icon) {\n              <cide-ele-icon class=\"dropdown-item-icon\">{{ item.icon }}</cide-ele-icon>\n              }\n              <span class=\"dropdown-item-label\">{{ item.label }}</span>\n            </button>\n            }\n\n            <!-- Custom Dropdown Options -->\n            @if (dropdownOptions().length > 0) {\n            <div class=\"dropdown-divider\"></div>\n            @for (option of dropdownOptions(); track option.id) {\n            <button type=\"button\" class=\"dropdown-option\" (click)=\"onDropdownOptionClick(option)\"\n              [disabled]=\"option.disabled || disabled()\" role=\"menuitem\">\n              @if (option.icon) {\n              <cide-ele-icon class=\"dropdown-option-icon\">{{ option.icon }}</cide-ele-icon>\n              }\n              <span class=\"dropdown-option-label\">{{ option.label }}</span>\n            </button>\n            }\n            }\n          </div>\n          }\n        </div>\n      </li>\n      }\n    </ol>\n  </nav>\n  }\n\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { spinnerType, themeSize } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n  selector: 'cide-ele-spinner',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  templateUrl: './spinner.component.html',\r\n  styleUrl: './spinner.component.scss'\r\n})\r\nexport class CideSpinnerComponent {\r\n  /**\r\n   * @description\r\n   * Holds the size of the component like Small, Extra small, Large\r\n   * by Default it takes small size\r\n   * or the size set by the project setup service\r\n   * or it will beset for individual component\r\n   * \r\n   * Size Appled \r\n   * Component level then setup service then finally default md\r\n   *  Options: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \r\n   */\r\n  @Input() size: themeSize = \"sm\";\r\n  @Input() type: spinnerType = \"pill-spinner\";\r\n}\r\n","@if (type === \"spinner\") {\r\n<svg class=\"cide-spinner tw-m-auto\"\r\n    [ngClass]=\"{'tw-max-w-6 tw-p-1': (size === 'xs'), 'tw-max-w-10 tw-p-2': (size === 'sm')}\" viewBox=\"0 0 24 24\">\r\n    <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n    <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n    <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n    <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n    <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n    <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n</svg>\r\n}\r\n@else {\r\n<div class=\"cide-pill-loader tw-select-none\" [ngClass]=\"{'tw-h-4': (size === 'xs')}\">\r\n    <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n    <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n    <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n    <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n</div>\r\n}","import { Injectable } from '@angular/core';\n\n/**\n * Export Service - Provides export functionality for Excel (XLSX) and PDF without third-party libraries\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class ExportService {\n\n  /**\n   * Export data to Excel format\n   * Uses HTML table with Excel MIME type for better compatibility\n   * This approach is more reliable than XML across different Excel versions\n   */\n  exportToExcel(data: any[], columns: { key: string; label: string }[], filename: string = 'export'): void {\n    if (!data || data.length === 0) {\n      console.warn('No data to export');\n      return;\n    }\n\n    // Create HTML table for Excel with UTF-8 BOM for proper encoding\n    try {\n      const htmlContent = this.generateExcelXML(data, columns);\n      \n      // Add UTF-8 BOM for Excel to recognize the file properly\n      const BOM = '\\uFEFF';\n      const blob = new Blob([BOM + htmlContent], { type: 'application/vnd.ms-excel;charset=utf-8;' });\n      this.downloadFile(blob, `${filename}.xls`);\n    } catch (error) {\n      console.error('Error exporting to Excel:', error);\n      // Fallback to CSV if Excel export fails\n      console.warn('Falling back to CSV export');\n      this.exportToCSV(data, columns, filename);\n    }\n  }\n\n  /**\n   * Export data to PDF format\n   * Uses browser's print functionality to generate PDF\n   */\n  exportToPDF(data: any[], columns: { key: string; label: string }[], filename: string = 'export'): void {\n    if (!data || data.length === 0) {\n      console.warn('No data to export');\n      return;\n    }\n\n    // Create HTML table for PDF\n    const htmlContent = this.generatePDFHTML(data, columns);\n    \n    // Open in new window and print\n    const printWindow = window.open('', '_blank');\n    if (printWindow) {\n      printWindow.document.write(htmlContent);\n      printWindow.document.close();\n      \n      // Wait for content to load then print\n      printWindow.onload = () => {\n        setTimeout(() => {\n          printWindow.print();\n        }, 250);\n      };\n    }\n  }\n\n  /**\n   * Export data to CSV format\n   */\n  exportToCSV(data: any[], columns: { key: string; label: string }[], filename: string = 'export'): void {\n    if (!data || data.length === 0) {\n      console.warn('No data to export');\n      return;\n    }\n\n    // Create CSV content\n    const headers = columns.map(col => this.escapeCSV(col.label)).join(',');\n    const rows = data.map(row => \n      columns.map(col => this.escapeCSV(row[col.key] || '')).join(',')\n    );\n    \n    const csvContent = [headers, ...rows].join('\\n');\n    \n    // Create blob and download\n    const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n    this.downloadFile(blob, `${filename}.csv`);\n  }\n\n  /**\n   * Generate Excel HTML format content\n   * This approach uses HTML tables with Excel-specific MIME type and namespace\n   * More compatible across Excel versions (2003, 2007, 2010, 2016, Office 365)\n   * Also works with Google Sheets and LibreOffice Calc\n   */\n  private generateExcelXML(data: any[], columns: { key: string; label: string }[]): string {\n    const currentDate = new Date().toLocaleDateString();\n    const currentTime = new Date().toLocaleTimeString();\n    \n    // Build table rows with proper Excel formatting\n    const headerCells = columns.map(col => `<th style=\"background-color: #4A90E2; color: white; font-weight: bold; padding: 8px; border: 1px solid #ddd;\">${col.label}</th>`).join('');\n    const dataRows = data.map(row => {\n      const cells = columns.map(col => {\n        const value = row[col.key] || '';\n        // Determine if value is numeric\n        const isNumber = !isNaN(Number(value)) && value !== '' && value !== null;\n        return `<td style=\"padding: 6px; border: 1px solid #ddd;\"${isNumber ? ' x:num' : ''}>${value}</td>`;\n      }).join('');\n      return `<tr>${cells}</tr>`;\n    }).join('');\n\n    const html = `<!DOCTYPE html>\n<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\">\n<head>\n  <meta charset=\"UTF-8\">\n  <!--[if gte mso 9]><xml>\n    <x:ExcelWorkbook>\n      <x:ExcelWorksheets>\n        <x:ExcelWorksheet>\n          <x:Name>Export</x:Name>\n          <x:WorksheetOptions>\n            <x:DefaultRowHeight>400</x:DefaultRowHeight>\n          </x:WorksheetOptions>\n        </x:ExcelWorksheet>\n      </x:ExcelWorksheets>\n    </x:ExcelWorkbook>\n  </xml><![endif]-->\n  <title>Data Export</title>\n</head>\n<body>\n  <table border=\"1\" style=\"font-family: Arial, sans-serif; font-size: 12px; border-collapse: collapse; width: 100%;\">\n    <thead>\n      <tr>\n        ${headerCells}\n      </tr>\n    </thead>\n    <tbody>\n      ${dataRows}\n    </tbody>\n  </table>\n  <div style=\"margin-top: 20px; font-size: 10px; color: #666;\">\n    Generated: ${currentDate} at ${currentTime} | Total Records: ${data.length}\n  </div>\n</body>\n</html>`;\n\n    return html;\n  }\n\n  /**\n   * Generate HTML content for PDF printing\n   */\n  private generatePDFHTML(data: any[], columns: { key: string; label: string }[]): string {\n    const currentDate = new Date().toLocaleDateString();\n    const currentTime = new Date().toLocaleTimeString();\n\n    // Build table rows\n    const headerCells = columns.map(col => `<th style=\"${this.getPDFHeaderStyle()}\">${col.label}</th>`).join('');\n    const dataRows = data.map(row => {\n      const cells = columns.map(col => `<td style=\"${this.getPDFCellStyle()}\">${row[col.key] || ''}</td>`).join('');\n      return `<tr>${cells}</tr>`;\n    }).join('');\n\n    const html = `<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Export</title>\n  <style>\n    body {\n      font-family: Arial, sans-serif;\n      margin: 20px;\n      font-size: 12px;\n    }\n    .header {\n      text-align: center;\n      margin-bottom: 20px;\n      border-bottom: 2px solid #333;\n      padding-bottom: 10px;\n    }\n    .header h1 {\n      margin: 0;\n      font-size: 18px;\n      color: #333;\n    }\n    .info {\n      margin-bottom: 15px;\n      font-size: 11px;\n      color: #666;\n    }\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      margin-top: 10px;\n    }\n    th {\n      background-color: #f0f0f0;\n      font-weight: bold;\n      padding: 8px;\n      text-align: left;\n      border: 1px solid #ccc;\n    }\n    td {\n      padding: 6px 8px;\n      border: 1px solid #ccc;\n    }\n    tr:nth-child(even) {\n      background-color: #f9f9f9;\n    }\n    .footer {\n      margin-top: 20px;\n      text-align: center;\n      font-size: 10px;\n      color: #666;\n      border-top: 1px solid #ccc;\n      padding-top: 10px;\n    }\n    @media print {\n      body {\n        margin: 0;\n      }\n      .no-print {\n        display: none;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"header\">\n    <h1>Data Export</h1>\n    <div class=\"info\">\n      <strong>Generated:</strong> ${currentDate} at ${currentTime}\n    </div>\n    <div class=\"info\">\n      <strong>Total Records:</strong> ${data.length}\n    </div>\n  </div>\n  \n  <table>\n    <thead>\n      <tr>\n        ${headerCells}\n      </tr>\n    </thead>\n    <tbody>\n      ${dataRows}\n    </tbody>\n  </table>\n  \n  <div class=\"footer\">\n    Page generated on ${currentDate} at ${currentTime}\n  </div>\n</body>\n</html>`;\n\n    return html;\n  }\n\n  /**\n   * Download file helper\n   */\n  private downloadFile(blob: Blob, filename: string): void {\n    const url = window.URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = filename;\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n    window.URL.revokeObjectURL(url);\n  }\n\n  /**\n   * Escape HTML special characters\n   */\n  private escapeHTML(text: any): string {\n    if (text === null || text === undefined) {\n      return '';\n    }\n    \n    const stringValue = String(text);\n    \n    return stringValue\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n  }\n\n  /**\n   * Escape CSV special characters\n   */\n  private escapeCSV(text: any): string {\n    if (text === null || text === undefined) {\n      return '';\n    }\n    \n    const stringValue = String(text);\n    \n    // If contains comma, quote, or newline, wrap in quotes and escape quotes\n    if (stringValue.includes(',') || stringValue.includes('\"') || stringValue.includes('\\n')) {\n      return `\"${stringValue.replace(/\"/g, '\"\"')}\"`;\n    }\n    \n    return stringValue;\n  }\n\n  /**\n   * Get PDF header cell style\n   */\n  private getPDFHeaderStyle(): string {\n    return 'background-color: #f0f0f0; font-weight: bold; padding: 8px; text-align: left; border: 1px solid #ccc;';\n  }\n\n  /**\n   * Get PDF cell style\n   */\n  private getPDFCellStyle(): string {\n    return 'padding: 6px 8px; border: 1px solid #ccc;';\n  }\n}\n\n","/**\n * Currency Display Format Options\n */\nexport type CurrencyDisplayFormat = \n  | 'symbol_before'  // $100\n  | 'symbol_after'   // 100$\n  | 'code_before'    // USD 100\n  | 'code_after';    // 100 USD\n\n/**\n * Currency Configuration Interface\n * Matches the structure from accounts library financial config\n */\nexport interface CurrencyConfig {\n  // Currency identification\n  currencyCode?: string;              // ISO currency code (USD, INR, EUR, etc.)\n  currencySymbol?: string;            // Currency symbol ($, ₹, €, etc.)\n  \n  // Display format\n  displayFormat?: CurrencyDisplayFormat;\n  showSymbol?: boolean;               // Whether to show currency symbol\n  showCode?: boolean;                 // Whether to show currency code\n  \n  // Number formatting\n  decimalPlaces?: number;             // Number of decimal places (0-4)\n  thousandSeparator?: string;         // Thousand separator (\",\", \".\", \" \", etc.)\n  decimalSeparator?: string;          // Decimal separator (\".\", \",\", etc.)\n  \n  // Additional options\n  locale?: string;                    // Locale for formatting (en-US, en-IN, etc.)\n  roundingMethod?: 'round' | 'floor' | 'ceiling' | 'none';\n  roundingPrecision?: number;\n}\n\n/**\n * Default Currency Configuration\n * Defaults to Indian Rupees (INR)\n */\nexport const DEFAULT_CURRENCY_CONFIG: CurrencyConfig = {\n  currencyCode: 'INR',\n  currencySymbol: '₹',\n  displayFormat: 'symbol_before',\n  showSymbol: true,\n  showCode: false,\n  decimalPlaces: 2,\n  thousandSeparator: ',',\n  decimalSeparator: '.',\n  locale: 'en-IN',\n  roundingMethod: 'round',\n  roundingPrecision: 0.01\n};\n\n","import { Injectable, signal, computed, effect, inject } from '@angular/core';\nimport { CurrencyConfig, DEFAULT_CURRENCY_CONFIG, CurrencyDisplayFormat } from './currency-config.interface';\n\n/**\n * Currency Service\n * \n * Manages global currency configuration with support for:\n * - Loading from financial config data (app must fetch data first)\n * - Override capabilities\n * - App state persistence\n * - Reactive updates using Angular Signals\n * - Default currency: Indian Rupees (INR, ₹)\n * \n * Note: This service does NOT call APIs. The app must fetch financial config\n * data and pass it to loadFromFinancialConfigData() method.\n * \n * @example\n * ```typescript\n * // In app initialization (e.g., after login)\n * // First, fetch financial config from your app's service\n * const response = await financialConfigService.getFinancialConfigById(...).toPromise();\n * if (response?.success && response?.data) {\n *   currencyService.loadFromFinancialConfigData(response.data);\n * }\n * \n * // In component\n * const formatted = currencyService.format(1000); // \"₹1,000.00\"\n * \n * // Override for specific use case\n * const formatted = currencyService.format(1000, { currencySymbol: '$' });\n * ```\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class CurrencyService {\n  // Global currency configuration (reactive signal)\n  private readonly configSignal = signal<CurrencyConfig>({ ...DEFAULT_CURRENCY_CONFIG });\n  \n  // Override configuration (temporary overrides)\n  private readonly overrideSignal = signal<Partial<CurrencyConfig> | null>(null);\n  \n  // Loading state\n  readonly loading = signal<boolean>(false);\n  readonly error = signal<string | null>(null);\n\n  // Computed: Active configuration (config + override)\n  readonly config = computed(() => {\n    const base = this.configSignal();\n    const override = this.overrideSignal();\n    return override ? { ...base, ...override } : base;\n  });\n\n  // Computed: Currency symbol\n  readonly currencySymbol = computed(() => this.config().currencySymbol || '₹');\n  \n  // Computed: Currency code\n  readonly currencyCode = computed(() => this.config().currencyCode || 'INR');\n\n  constructor() {\n    // Load from localStorage on initialization\n    this.loadFromLocalStorage();\n    \n    // Save to localStorage whenever config changes\n    effect(() => {\n      const config = this.configSignal();\n      this.saveToLocalStorage(config);\n    });\n  }\n\n  /**\n   * Set currency configuration\n   * @param config - Currency configuration to set\n   */\n  setConfig(config: CurrencyConfig): void {\n    this.configSignal.set({ ...DEFAULT_CURRENCY_CONFIG, ...config });\n    this.error.set(null);\n  }\n\n  /**\n   * Update currency configuration (partial update)\n   * @param updates - Partial currency configuration\n   */\n  updateConfig(updates: Partial<CurrencyConfig>): void {\n    this.configSignal.update(current => ({ ...current, ...updates }));\n  }\n\n  /**\n   * Set temporary override (takes precedence over base config)\n   * @param override - Partial currency configuration to override\n   */\n  setOverride(override: Partial<CurrencyConfig> | null): void {\n    this.overrideSignal.set(override);\n  }\n\n  /**\n   * Clear override (revert to base config)\n   */\n  clearOverride(): void {\n    this.overrideSignal.set(null);\n  }\n\n  /**\n   * Load currency configuration from financial config data\n   * This method accepts financial config data that should be fetched by the app\n   * The app is responsible for calling the API and passing the data here\n   * \n   * @param financialConfigData - Financial config data object from accounts library\n   * @example\n   * ```typescript\n   * // In your app, fetch financial config first\n   * const financialConfig = await financialConfigService.getFinancialConfigById(...);\n   * // Then pass it to currency service\n   * currencyService.loadFromFinancialConfigData(financialConfig.data);\n   * ```\n   */\n  loadFromFinancialConfigData(financialConfigData: any): void {\n    if (!financialConfigData) {\n      this.error.set('Financial config data is required');\n      return;\n    }\n\n    this.loading.set(true);\n    this.error.set(null);\n\n    try {\n      this.mapFinancialConfigToCurrencyConfig(financialConfigData);\n    } catch (error: any) {\n      console.error('Error loading financial config:', error);\n      this.error.set(error?.message || 'Failed to load financial configuration');\n      // Fallback to default config (INR)\n      this.configSignal.set({ ...DEFAULT_CURRENCY_CONFIG });\n    } finally {\n      this.loading.set(false);\n    }\n  }\n\n  /**\n   * Map financial config data to currency config\n   * This method expects the financial config data structure from accounts library\n   */\n  private mapFinancialConfigToCurrencyConfig(financialConfig: any): void {\n    // Extract currency info from populated currency object\n    let currencyCode = 'INR';\n    let currencySymbol = '₹';\n    \n    if (financialConfig.accfincfg_default_currency_id_sycr) {\n      const currency = financialConfig.accfincfg_default_currency_id_sycr;\n      if (typeof currency === 'object' && currency !== null) {\n        currencyCode = currency.sycr_code || currencyCode;\n        currencySymbol = currency.sycr_symbol || currencySymbol;\n      } else if (typeof currency === 'string') {\n        // If it's just an ID string, use defaults\n        currencyCode = 'INR';\n        currencySymbol = '₹';\n      }\n    }\n\n    const config: CurrencyConfig = {\n      currencyCode,\n      currencySymbol,\n      displayFormat: financialConfig.accfincfg_currency_display_format || 'symbol_before',\n      showSymbol: financialConfig.accfincfg_show_currency_symbol !== false,\n      showCode: financialConfig.accfincfg_show_currency_code === true,\n      decimalPlaces: financialConfig.accfincfg_currency_decimal_places ?? 2,\n      thousandSeparator: financialConfig.accfincfg_currency_thousand_separator || ',',\n      decimalSeparator: financialConfig.accfincfg_currency_decimal_separator || '.',\n      locale: this.getLocaleFromCurrency(currencyCode),\n      roundingMethod: financialConfig.accfincfg_rounding_method || 'round',\n      roundingPrecision: financialConfig.accfincfg_rounding_precision || 0.01\n    };\n\n    this.setConfig(config);\n  }\n\n  /**\n   * Get locale based on currency code\n   */\n  private getLocaleFromCurrency(currencyCode: string): string {\n    const localeMap: Record<string, string> = {\n      'USD': 'en-US',\n      'INR': 'en-IN',\n      'EUR': 'en-GB',\n      'GBP': 'en-GB',\n      'JPY': 'ja-JP',\n      'CNY': 'zh-CN',\n      'AUD': 'en-AU',\n      'CAD': 'en-CA'\n    };\n    return localeMap[currencyCode] || 'en-IN'; // Default to Indian locale\n  }\n\n  /**\n   * Format a number as currency\n   * @param value - Number to format\n   * @param override - Optional override configuration\n   * @returns Formatted currency string\n   */\n  format(value: number | string | null | undefined, override?: Partial<CurrencyConfig>): string {\n    if (value === null || value === undefined) {\n      return this.formatNumber(0, override);\n    }\n\n    const num = typeof value === 'string' ? parseFloat(value) : value;\n    if (isNaN(num)) {\n      return 'N/A';\n    }\n\n    return this.formatNumber(num, override);\n  }\n\n  /**\n   * Format number with currency configuration\n   */\n  private formatNumber(value: number, override?: Partial<CurrencyConfig>): string {\n    const config = override ? { ...this.config(), ...override } : this.config();\n    \n    // Apply rounding\n    let roundedValue = value;\n    if (config.roundingMethod && config.roundingMethod !== 'none' && config.roundingPrecision) {\n      const precision = config.roundingPrecision;\n      switch (config.roundingMethod) {\n        case 'round':\n          roundedValue = Math.round(value / precision) * precision;\n          break;\n        case 'floor':\n          roundedValue = Math.floor(value / precision) * precision;\n          break;\n        case 'ceiling':\n          roundedValue = Math.ceil(value / precision) * precision;\n          break;\n      }\n    }\n\n    // Format number with decimal places\n    const decimalPlaces = config.decimalPlaces ?? 2;\n    const formattedNumber = roundedValue.toFixed(decimalPlaces);\n    \n    // Apply custom separators if needed\n    let formatted = formattedNumber;\n    if (config.thousandSeparator || config.decimalSeparator) {\n      const parts = formattedNumber.split('.');\n      const integerPart = parts[0];\n      const decimalPart = parts[1] || '';\n      \n      // Apply thousand separator\n      let formattedInteger = integerPart;\n      if (config.thousandSeparator && config.thousandSeparator !== ',') {\n        formattedInteger = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, config.thousandSeparator);\n      } else {\n        formattedInteger = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n      }\n      \n      // Apply decimal separator\n      const separator = config.decimalSeparator || '.';\n      formatted = decimalPart ? `${formattedInteger}${separator}${decimalPart}` : formattedInteger;\n    }\n\n    // Apply currency symbol/code based on display format\n    const symbol = config.currencySymbol || '₹';\n    const code = config.currencyCode || 'INR';\n    const displayFormat = config.displayFormat || 'symbol_before';\n\n    let result = formatted;\n    \n    if (config.showCode && config.showSymbol) {\n      // Show both symbol and code\n      switch (displayFormat) {\n        case 'symbol_before':\n          result = `${symbol}${formatted} (${code})`;\n          break;\n        case 'symbol_after':\n          result = `${formatted}${symbol} (${code})`;\n          break;\n        case 'code_before':\n          result = `${code} ${formatted} (${symbol})`;\n          break;\n        case 'code_after':\n          result = `${formatted} ${code} (${symbol})`;\n          break;\n      }\n    } else if (config.showSymbol) {\n      // Show symbol only\n      switch (displayFormat) {\n        case 'symbol_before':\n          result = `${symbol}${formatted}`;\n          break;\n        case 'symbol_after':\n          result = `${formatted}${symbol}`;\n          break;\n        default:\n          result = `${symbol}${formatted}`;\n      }\n    } else if (config.showCode) {\n      // Show code only\n      switch (displayFormat) {\n        case 'code_before':\n          result = `${code} ${formatted}`;\n          break;\n        case 'code_after':\n          result = `${formatted} ${code}`;\n          break;\n        default:\n          result = `${code} ${formatted}`;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Load configuration from localStorage\n   */\n  private loadFromLocalStorage(): void {\n    try {\n      const stored = localStorage.getItem('cide_currency_config');\n      if (stored) {\n        const config = JSON.parse(stored) as CurrencyConfig;\n        this.configSignal.set({ ...DEFAULT_CURRENCY_CONFIG, ...config });\n      }\n    } catch (error) {\n      console.warn('Failed to load currency config from localStorage:', error);\n    }\n  }\n\n  /**\n   * Save configuration to localStorage\n   */\n  private saveToLocalStorage(config: CurrencyConfig): void {\n    try {\n      localStorage.setItem('cide_currency_config', JSON.stringify(config));\n    } catch (error) {\n      console.warn('Failed to save currency config to localStorage:', error);\n    }\n  }\n\n  /**\n   * Reset to default configuration\n   */\n  reset(): void {\n    this.configSignal.set({ ...DEFAULT_CURRENCY_CONFIG });\n    this.overrideSignal.set(null);\n    this.error.set(null);\n  }\n}\n\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { CurrencyService } from '../../../services/currency/currency.service';\nimport type { CurrencyConfig } from '../../../services/currency/currency-config.interface';\n\n/**\n * Currency Pipe\n * \n * Formats numbers as currency using global currency configuration.\n * Supports override for specific formatting needs.\n * \n * @example\n * ```html\n * <!-- Use global config -->\n * <span>{{ amount | currency }}</span>\n * \n * <!-- Override symbol -->\n * <span>{{ amount | currency: { currencySymbol: '₹' } }}</span>\n * \n * <!-- Override decimal places -->\n * <span>{{ amount | currency: { decimalPlaces: 0 } }}</span>\n * \n * <!-- Override display format -->\n * <span>{{ amount | currency: { displayFormat: 'symbol_after' } }}</span>\n * ```\n */\n@Pipe({\n  name: 'currency',\n  standalone: true,\n  pure: true // Pure pipe for better performance\n})\nexport class CurrencyPipe implements PipeTransform {\n  private readonly currencyService = inject(CurrencyService);\n\n  /**\n   * Transform number to formatted currency string\n   * @param value - Number to format\n   * @param override - Optional override configuration\n   * @returns Formatted currency string\n   */\n  transform(\n    value: number | string | null | undefined,\n    override?: Partial<CurrencyConfig>\n  ): string {\n    return this.currencyService.format(value, override);\n  }\n}\n\n","import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\n\r\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\r\nexport type TooltipType = 'default' | 'success' | 'warning' | 'error' | 'info' | 'light' | 'dark';\r\n\r\n@Directive({\r\n  selector: '[cideEleTooltip]',\r\n  standalone: true\r\n})\r\nexport class TooltipDirective implements OnInit, OnDestroy {\r\n  @Input() cideEleTooltip: string = '';\r\n  @Input() tooltipColor: string = '';\r\n  @Input() tooltipBg: string = '';\r\n  @Input() tooltipPlacement: TooltipPlacement = 'top';\r\n  @Input() tooltipType: TooltipType = 'default';\r\n  @Input() tooltipDelay: number = 300; // ms\r\n  @Input() tooltipDir: TooltipPlacement = 'top'; // Alias for tooltipPlacement for backward compatibility\r\n  @Input() tooltipShowArrow: boolean = false;\r\n  @Input() tooltipMultiline: boolean = false;\r\n  @Input() tooltipMaxWidth: string = '200px';\r\n  @Input() tooltipInteractive: boolean = false;\r\n  @Input() tooltipClass: string = '';\r\n  \r\n  private tooltipElement: HTMLElement | null = null;\r\n  private visible = false;\r\n  private showTimeout: number | null = null;\r\n  private hideTimeout: number | null = null;\r\n  private hideDelay = 150; // ms\r\n  private interactiveMouseLeaveHandler: (() => void) | null = null;\r\n\r\n  constructor(private el: ElementRef, private renderer: Renderer2) {}\r\n\r\n  ngOnInit(): void {\r\n    // Use tooltipDir as fallback if provided and tooltipPlacement is default\r\n    if (this.tooltipDir && this.tooltipPlacement === 'top') {\r\n      this.tooltipPlacement = this.tooltipDir;\r\n    }\r\n\r\n    // If user hasn't provided custom colors and is using a predefined type,\r\n    // we'll leave colors empty to use CSS class colors\r\n    if (this.tooltipType !== 'default' && !this.tooltipColor && !this.tooltipBg) {\r\n      this.tooltipColor = '';\r\n      this.tooltipBg = '';\r\n    }\r\n  }\r\n\r\n  @HostListener('mouseenter')\r\n  onMouseEnter(): void {\r\n    this.clearTimeouts();\r\n    this.showTimeout = window.setTimeout(() => {\r\n      this.show();\r\n    }, this.tooltipDelay);\r\n  }\r\n\r\n  @HostListener('focus')\r\n  onFocus(): void {\r\n    this.clearTimeouts();\r\n    this.showTimeout = window.setTimeout(() => {\r\n      this.show();\r\n    }, this.tooltipDelay);\r\n  }\r\n\r\n  @HostListener('mouseleave')\r\n  onMouseLeave(): void {\r\n    this.clearTimeouts();\r\n    \r\n    // Don't hide immediately if interactive\r\n    if (!this.tooltipInteractive) {\r\n      this.hide();\r\n    } else {\r\n      // For interactive tooltips, delay hiding to allow user to move to tooltip\r\n      this.hideTimeout = window.setTimeout(() => {\r\n        this.hide();\r\n      }, this.hideDelay);\r\n    }\r\n  }\r\n\r\n  @HostListener('blur')\r\n  onBlur(): void {\r\n    this.clearTimeouts();\r\n    this.hide();\r\n  }\r\n\r\n  @HostListener('click')\r\n  onClick(): void {\r\n    if (this.visible && !this.tooltipInteractive) {\r\n      this.hide();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.clearTimeouts();\r\n    this.destroyTooltip();\r\n  }\r\n\r\n  private clearTimeouts(): void {\r\n    if (this.showTimeout) {\r\n      clearTimeout(this.showTimeout);\r\n      this.showTimeout = null;\r\n    }\r\n    if (this.hideTimeout) {\r\n      clearTimeout(this.hideTimeout);\r\n      this.hideTimeout = null;\r\n    }\r\n  }\r\n\r\n  private show(): void {\r\n    if (!this.cideEleTooltip || this.visible) return;\r\n    \r\n    this.createTooltip();\r\n    this.styleTooltip();\r\n    this.positionTooltip();\r\n    \r\n    // Add animation with requestAnimationFrame for smoother transition\r\n    requestAnimationFrame(() => {\r\n      if (this.tooltipElement) {\r\n        this.renderer.addClass(this.tooltipElement, 'tooltip-visible');\r\n        \r\n        // Show arrow if enabled\r\n        if (this.tooltipShowArrow) {\r\n          this.renderer.addClass(this.tooltipElement, 'tooltip-arrow-visible');\r\n        }\r\n      }\r\n    });\r\n    \r\n    this.visible = true;\r\n\r\n    // Add mouseleave event listener if interactive\r\n    if (this.tooltipInteractive && this.tooltipElement) {\r\n      this.interactiveMouseLeaveHandler = () => {\r\n        this.clearTimeouts();\r\n        this.hide();\r\n      };\r\n      this.tooltipElement.addEventListener('mouseleave', this.interactiveMouseLeaveHandler);\r\n      \r\n      // Also add mouseenter to cancel any pending hide\r\n      this.tooltipElement.addEventListener('mouseenter', () => {\r\n        this.clearTimeouts();\r\n      });\r\n    }\r\n  }\r\n\r\n  private hide(): void {\r\n    if (!this.visible || !this.tooltipElement) return;\r\n\r\n    this.renderer.removeClass(this.tooltipElement, 'tooltip-visible');\r\n    this.renderer.removeClass(this.tooltipElement, 'tooltip-arrow-visible');\r\n    \r\n    // Use timeout for smoother hide animation\r\n    setTimeout(() => {\r\n      if (!this.visible) { // Double-check in case tooltip was reshown\r\n        this.destroyTooltip();\r\n      }\r\n    }, this.hideDelay);\r\n    \r\n    this.visible = false;\r\n  }\r\n\r\n  private createTooltip(): void {\r\n    this.destroyTooltip();\r\n\r\n    this.tooltipElement = this.renderer.createElement('div');\r\n    this.renderer.addClass(this.tooltipElement, 'tooltip');\r\n    \r\n    // Add placement class for arrow\r\n    this.renderer.addClass(this.tooltipElement, `tooltip-${this.tooltipPlacement}`);\r\n    \r\n    // Add type class if using a predefined type\r\n    if (this.tooltipType !== 'default') {\r\n      this.renderer.addClass(this.tooltipElement, `tooltip-${this.tooltipType}`);\r\n    }\r\n    \r\n    // Add multiline class if enabled\r\n    if (this.tooltipMultiline) {\r\n      this.renderer.addClass(this.tooltipElement, 'tooltip-multiline');\r\n    }\r\n    \r\n    // Add interactive class if enabled\r\n    if (this.tooltipInteractive) {\r\n      this.renderer.addClass(this.tooltipElement, 'tooltip-interactive');\r\n    }\r\n    \r\n    // Add custom classes if provided\r\n    if (this.tooltipClass) {\r\n      const classes = this.tooltipClass.split(' ');\r\n      classes.forEach(className => {\r\n        if (className.trim()) {\r\n          this.renderer.addClass(this.tooltipElement, className.trim());\r\n        }\r\n      });\r\n    }\r\n\r\n    // Create HTML content if multiline\r\n    if (this.tooltipMultiline) {\r\n      this.renderer.setProperty(this.tooltipElement, 'innerHTML', this.cideEleTooltip);\r\n    } else {\r\n      const textNode = this.renderer.createText(this.cideEleTooltip);\r\n      this.renderer.appendChild(this.tooltipElement, textNode);\r\n    }\r\n    \r\n    this.renderer.appendChild(document.body, this.tooltipElement);\r\n  }\r\n\r\n  private styleTooltip(): void {\r\n    if (!this.tooltipElement) return;\r\n\r\n    // Set custom CSS variables for the tooltip colors if provided\r\n    if (this.tooltipColor) {\r\n      this.renderer.setStyle(this.tooltipElement, '--tooltip-color', this.tooltipColor);\r\n    }\r\n    \r\n    if (this.tooltipBg) {\r\n      this.renderer.setStyle(this.tooltipElement, '--tooltip-bg', this.tooltipBg);\r\n    }\r\n    \r\n    // Set custom max width if provided\r\n    if (this.tooltipMaxWidth && this.tooltipMultiline) {\r\n      this.renderer.setStyle(this.tooltipElement, '--tooltip-max-width', this.tooltipMaxWidth);\r\n    }\r\n  }\r\n\r\n  private positionTooltip(): void {\r\n    if (!this.tooltipElement) return;\r\n\r\n    const hostRect = this.el.nativeElement.getBoundingClientRect();\r\n    const tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n    \r\n    // Account for page scroll\r\n    const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n    const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n    \r\n    let top = 0;\r\n    let left = 0;\r\n    \r\n    // Calculate position based on placement\r\n    switch (this.tooltipPlacement) {\r\n      case 'top':\r\n        top = hostRect.top + scrollTop - tooltipRect.height - 6;\r\n        left = hostRect.left + scrollLeft + (hostRect.width / 2) - (tooltipRect.width / 2);\r\n        break;\r\n      case 'bottom':\r\n        top = hostRect.bottom + scrollTop + 6;\r\n        left = hostRect.left + scrollLeft + (hostRect.width / 2) - (tooltipRect.width / 2);\r\n        break;\r\n      case 'left':\r\n        top = hostRect.top + scrollTop + (hostRect.height / 2) - (tooltipRect.height / 2);\r\n        left = hostRect.left + scrollLeft - tooltipRect.width - 6;\r\n        break;\r\n      case 'right':\r\n        top = hostRect.top + scrollTop + (hostRect.height / 2) - (tooltipRect.height / 2);\r\n        left = hostRect.right + scrollLeft + 6;\r\n        break;\r\n    }\r\n    \r\n    // Adjust if tooltip would be outside viewport\r\n    const viewportWidth = window.innerWidth;\r\n    const viewportHeight = window.innerHeight;\r\n    \r\n    // Top boundary check\r\n    if (top < scrollTop + 4) {\r\n      top = scrollTop + 4;\r\n    } else if (top + tooltipRect.height > scrollTop + viewportHeight - 4) {\r\n      top = scrollTop + viewportHeight - tooltipRect.height - 4;\r\n    }\r\n    \r\n    // Left boundary check\r\n    if (left < scrollLeft + 4) {\r\n      left = scrollLeft + 4;\r\n    } else if (left + tooltipRect.width > scrollLeft + viewportWidth - 4) {\r\n      left = scrollLeft + viewportWidth - tooltipRect.width - 4;\r\n    }\r\n    \r\n    this.renderer.setStyle(this.tooltipElement, 'position', 'absolute');\r\n    this.renderer.setStyle(this.tooltipElement, 'top', `${top}px`);\r\n    this.renderer.setStyle(this.tooltipElement, 'left', `${left}px`);\r\n  }\r\n\r\n  private destroyTooltip(): void {\r\n    if (this.tooltipElement) {\r\n      // Remove event listeners for interactive tooltips using the stored reference\r\n      if (this.tooltipInteractive && this.interactiveMouseLeaveHandler) {\r\n        this.tooltipElement.removeEventListener('mouseleave', this.interactiveMouseLeaveHandler);\r\n        this.interactiveMouseLeaveHandler = null;\r\n      }\r\n      \r\n      const parent = this.tooltipElement.parentNode;\r\n      if (parent) {\r\n        this.renderer.removeChild(parent, this.tooltipElement);\r\n      }\r\n      this.tooltipElement = null;\r\n    }\r\n  }\r\n}\r\n","import { Directive, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, Renderer2 } from '@angular/core';\n\nexport type CideEleResizerDirection = 'horizontal' | 'vertical';\nexport type CideEleResizerDirectionTo = \"right-to-left\" | \"left-to-right\" | \"\";\n\n@Directive({\n  selector: '[cideEleResizer]',\n  standalone: true\n})\n\n/**\n<!-- Basic horizontal (left-right) layout -->\n<div class=\"panel-container\">\n    <div class=\"left-panel\">\n        Left Panel Content\n    </div>\n\n    <div cideEleResizer direction=\"horizontal\" [minPrevSize]=\"100\" [minNextSize]=\"100\">resize\n    </div>\n\n    <div class=\"right-panel\">\n        Right Panel Content\n    </div>\n</div>\n\n<!-- Basic vertical (top-bottom) layout -->\n<div class=\"panel-container-vertical\">\n    <div class=\"top-panel\">\n        Top Panel Content\n    </div>\n\n    <div cideEleResizer direction=\"vertical\" [minPrevSize]=\"50\" [minNextSize]=\"50\">resize\n    </div>\n\n    <div class=\"bottom-panel\">\n        Bottom Panel Content\n    </div>\n</div>\n\n<!-- Using with custom selectors -->\n<div class=\"complex-layout\">\n    <div id=\"panel1\">Panel 1</div>\n    <div id=\"panel2\">Panel 2</div>\n\n    <div cideEleResizer direction=\"horizontal\" prevElementSelector=\"#panel1\" nextElementSelector=\"#panel2\"\n        [usePercentage]=\"true\">resize\n    </div>\n\n    <div id=\"panel3\">Panel 3</div>\n</div>\n */\nexport class CideEleResizerDirective implements OnInit {\n  @Input() direction: CideEleResizerDirection = 'horizontal';\n  @Input() to: CideEleResizerDirectionTo = \"\";\n  @Input() prevElementSelector = '';  // Selector for previous element\n  @Input() nextElementSelector = '';  // Selector for next element\n  @Input() parentElementSelector = '';  // Selector for parent element\n  @Input() minPrevSize = 0;           // Minimum size of previous element (px)\n  @Input() minNextSize = 0;           // Minimum size of next element (px)\n  @Input() usePercentage = false;     // Use percentage instead of pixels\n  @Output() resizeStart = new EventEmitter<void>();\n  @Output() resizing = new EventEmitter<{ prevSize: number, nextSize: number }>();\n  @Output() resizeEnd = new EventEmitter<{ prevSize: number, nextSize: number }>();\n\n  private isResizing = false;\n  private startPosition = 0;\n  private prevElement: HTMLElement | null = null;\n  private nextElement: HTMLElement | null = null;\n  private prevSize = 0;\n  private nextSize = 0;\n  private containerSize = 0;\n  private startPrevSize = 0;\n  private startNextSize = 0;\n\n  constructor(private el: ElementRef, private renderer: Renderer2) { }\n\n  ngOnInit() {\n    // Set cursor style based on direction\n    this.renderer.setStyle(\n      this.el.nativeElement,\n      'cursor',\n      this.direction === 'horizontal' ? 'ew-resize' : 'ns-resize'\n    );\n\n    // Add a class to help with styling\n    this.renderer.addClass(this.el.nativeElement, 'panel-resizer');\n    this.renderer.addClass(this.el.nativeElement, `panel-resizer-${this.direction}`);\n    this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}`);\n    if (this.to) {\n      this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}-${this.to}`);\n    }\n  }\n\n  @HostListener('mousedown', ['$event'])\n  onMouseDown(event: MouseEvent) {\n    event.preventDefault();\n\n    // Get the elements to resize\n    this.prevElement = this.getPrevElement();\n    this.nextElement = this.getNextElement();\n\n    // if (!this.prevElement || !this.nextElement) {\n    //   console.error('Could not find elements to resize');\n    //   return;\n    // }\n\n    // Get container size\n\n    const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\n    if (parent) {\n      console.log(parent.offsetWidth, \"parent.offsetWidth\")\n      this.containerSize = this.direction === 'horizontal'\n        ? parent.offsetWidth\n        : parent.offsetHeight;\n    }\n\n    \n    // Store initial positions and sizes\n    this.startPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;\n    if (this.prevElement) {\n      console.log(this.prevElement.offsetWidth, \"this.prevElement.offsetWidth\")\n      this.startPrevSize = this.direction === 'horizontal'\n        ? this.prevElement.offsetWidth\n        : this.prevElement.offsetHeight;\n      \n      // Disable transitions during resize for smooth dragging\n      const currentTransition = window.getComputedStyle(this.prevElement).transition;\n      this.renderer.setStyle(this.prevElement, 'transition', 'none');\n      // Add resizing class to disable CSS transitions\n      this.renderer.addClass(this.prevElement, 'resizing');\n      // Store original transition to restore later\n      (this.prevElement as any).__originalTransition = currentTransition;\n    }\n    if (this.nextElement) {\n      console.log(this.nextElement.offsetWidth, \"this.nextElement.offsetWidth\")\n      this.startNextSize = this.direction === 'horizontal'\n        ? this.nextElement.offsetWidth\n        : this.nextElement.offsetHeight;\n      \n      // Disable transitions during resize for smooth dragging\n      const currentTransition = window.getComputedStyle(this.nextElement).transition;\n      this.renderer.setStyle(this.nextElement, 'transition', 'none');\n      // Add resizing class to disable CSS transitions\n      this.renderer.addClass(this.nextElement, 'resizing');\n      // Store original transition to restore later\n      (this.nextElement as any).__originalTransition = currentTransition;\n    }\n\n    this.prevSize = this.startPrevSize;\n    this.nextSize = this.startNextSize;\n\n    this.isResizing = true;\n\n    // Add event listeners\n    document.addEventListener('mousemove', this.onMouseMove);\n    document.addEventListener('mouseup', this.onMouseUp);\n\n    // Disable text selection\n    document.body.style.userSelect = 'none';\n\n    // Emit resizeStart event\n    this.resizeStart.emit();\n\n    // Add visual feedback\n    this.renderer.addClass(this.el.nativeElement, 'resizing');\n  }\n\n  private onMouseMove = (event: MouseEvent) => {\n    if (!this.isResizing) return;\n\n    // Calculate movement\n    const currentPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;\n    const delta = currentPosition - this.startPosition;\n\n    // Calculate new sizes\n    let newPrevSize = this.startPrevSize + delta;\n    let newNextSize = this.startNextSize - delta;\n\n    // Apply constraints\n    if (newPrevSize < this.minPrevSize) {\n      const diff = this.minPrevSize - newPrevSize;\n      newPrevSize = this.minPrevSize;\n      newNextSize = this.startNextSize - delta + diff;\n      // skip if previsus size is equal to the minimum size, note above code is dark code which will not be executed\n      return;\n    }\n\n    if (newNextSize < this.minNextSize) {\n      const diff = this.minNextSize - newNextSize;\n      newNextSize = this.minNextSize;\n      newPrevSize = this.startPrevSize + delta - diff;\n      // skip if next size is equal to the minimum size, note above code is dark code which will not be executed\n      return;\n    }\n\n    // Update sizes\n    this.prevSize = newPrevSize;\n    this.nextSize = newNextSize;\n\n    // Apply new sizes with !important to override CSS rules\n    const sizeProperty = this.getSizeProperty();\n    if (this.usePercentage) {\n      const prevPercent = (newPrevSize / this.containerSize) * 100;\n      const nextPercent = (newNextSize / this.containerSize) * 100;\n\n      this.renderer.setStyle(this.prevElement, sizeProperty, `${prevPercent}%`, 2); // 2 = important flag\n      this.renderer.setStyle(this.nextElement, sizeProperty, `${nextPercent}%`, 2);\n    } else {\n      // Use setAttribute to set inline style with !important equivalent\n      if (this.prevElement) {\n        this.prevElement.style.setProperty(sizeProperty, `${newPrevSize}px`, 'important');\n      }\n      if (this.nextElement) {\n        this.nextElement.style.setProperty(sizeProperty, `${newNextSize}px`, 'important');\n      }\n    }\n\n    // Emit resizing event\n    this.resizing.emit({ prevSize: newPrevSize, nextSize: newNextSize });\n  }\n\n  private onMouseUp = () => {\n    this.isResizing = false;\n\n    // Remove event listeners\n    document.removeEventListener('mousemove', this.onMouseMove);\n    document.removeEventListener('mouseup', this.onMouseUp);\n\n    // Restore text selection\n    document.body.style.userSelect = '';\n\n    // Restore transitions\n    if (this.prevElement) {\n      if ((this.prevElement as any).__originalTransition !== undefined) {\n        this.renderer.setStyle(this.prevElement, 'transition', (this.prevElement as any).__originalTransition);\n        delete (this.prevElement as any).__originalTransition;\n      }\n      // Remove resizing class\n      this.renderer.removeClass(this.prevElement, 'resizing');\n    }\n    if (this.nextElement) {\n      if ((this.nextElement as any).__originalTransition !== undefined) {\n        this.renderer.setStyle(this.nextElement, 'transition', (this.nextElement as any).__originalTransition);\n        delete (this.nextElement as any).__originalTransition;\n      }\n      // Remove resizing class\n      this.renderer.removeClass(this.nextElement, 'resizing');\n    }\n\n    // Emit resizeEnd event\n    if (this.prevElement && this.nextElement) {\n      this.resizeEnd.emit({ prevSize: this.prevSize, nextSize: this.nextSize });\n    }\n\n    // Remove visual feedback\n    this.renderer.removeClass(this.el.nativeElement, 'resizing');\n  }\n\n  private getPrevElement(): HTMLElement | null {\n    if (this.prevElementSelector) {\n      const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\n      return parent?.querySelector(this.prevElementSelector) || null;\n    }\n    return this.el.nativeElement.previousElementSibling as HTMLElement;\n  }\n\n  private getNextElement(): HTMLElement | null {\n    if (this.nextElementSelector) {\n      const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\n      return parent?.querySelector(this.nextElementSelector) || null;\n    }\n    return this.el.nativeElement.nextElementSibling as HTMLElement;\n  }\n\n  private getSizeProperty(): string {\n    return this.direction === 'horizontal' ? 'width' : 'height';\n  }\n}","/**\r\n * Path Helper Utility\r\n * Cloned from cloud-ide-lms-model to avoid dependencies\r\n */\r\n\r\nexport const cidePath = {\r\n    join: (path: string[]): string => {\r\n        return path.join(\"/\");\r\n    }\r\n};\r\n\r\n","/**\r\n * Host Manager Routes\r\n * Cloned from cloud-ide-lms-model to avoid dependencies\r\n * \r\n * Base path for host name to interceptor and replace with actual URL\r\n * for more details refer https://docs.google.com/document/d/1CwB4evLsQuatG4jI0U1faRtmqtNmIfZOE4fDWiz9-sQ/edit?pli=1#bookmark=id.j3vzaryhajl1\r\n * __version__ need to add in future\r\n */\r\n\r\nconst hostManagerRoutesUrl = {\r\n    cideSuiteHost: \"__cloud_ide_suite_layout__\"\r\n};\r\n\r\nObject.freeze(hostManagerRoutesUrl);\r\n\r\nexport { hostManagerRoutesUrl };\r\n\r\n","/**\r\n * Notification Routes\r\n * Cloned from cloud-ide-lms-model to avoid dependencies\r\n */\r\n\r\nconst notificationRoutesUrl = {\r\n    module: 'notifications',\r\n    notifications: \"notifications\",\r\n    unreadCount: \"unread-count\",\r\n};\r\n\r\nObject.freeze(notificationRoutesUrl);\r\n\r\nexport { notificationRoutesUrl };\r\n\r\n","import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideElementsService } from '../../utils';\nimport { CideSpinnerComponent } from '../spinner/spinner.component';\nimport { NavigationExtras, Router } from '@angular/router';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'text' | 'link' | 'success' | 'danger' | 'warning' | 'info' | 'ghost';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type ButtonType = 'button' | 'submit' | 'reset';\nexport type ButtonShape = 'default' | 'rounded' | 'pill' | 'square';\nexport type ButtonElevation = 'none' | 'low' | 'medium' | 'high';\n\n/**\n * Advanced Angular button component that provides a comprehensive button implementation\n * with loading state, styling variants, animations, tooltips, and other features.\n * \n * This component uses proper Angular templating to avoid hydration issues (NG0500).\n */\n@Component({\n  // eslint-disable-next-line @angular-eslint/component-selector\n  selector: 'button[cideEleButton], a[cideEleButton], cide-ele-button',\n  standalone: true,\n  imports: [CommonModule, CideSpinnerComponent],\n  templateUrl: './cide-ele-button.component.html',\n  styleUrls: ['./cide-ele-button.component.scss'],\n  host: {\n    'class': 'cide-button tw-rounded-md tw-py-0.5 tw-select-none tw-flex tw-items-center tw-justify-center',\n    '[class.cide-button-disabled]': 'disabled || loading',\n    '[attr.disabled]': '(disabled || loading) ? true : null',\n    '[class.primary]': 'variant === \"primary\"',\n    '[class.secondary]': 'variant === \"secondary\"',\n    '[class.outline]': 'variant === \"outline\"',\n    '[class.text]': 'variant === \"text\"',\n    '[class.link]': 'variant === \"link\"',\n    '[class.success]': 'variant === \"success\"',\n    '[class.danger]': 'variant === \"danger\"',\n    '[class.warning]': 'variant === \"warning\"',\n    '[class.info]': 'variant === \"info\"',\n    '[class.xs]': 'size === \"xs\"',\n    '[class.sm]': 'size === \"sm\"',\n    '[class.md]': 'size === \"md\"',\n    '[class.lg]': 'size === \"lg\"',\n    '[class.xl]': 'size === \"xl\"',\n    '[class.rounded]': 'shape === \"rounded\"',\n    '[class.pill]': 'shape === \"pill\"',\n    '[class.square]': 'shape === \"square\"',\n    '[class.elevation-none]': 'elevation === \"none\"',\n    '[class.elevation-low]': 'elevation === \"low\"',\n    '[class.elevation-medium]': 'elevation === \"medium\"',\n    '[class.elevation-high]': 'elevation === \"high\"',\n    '[attr.type]': 'type',\n    '[attr.aria-label]': 'ariaLabel',\n    '[attr.aria-disabled]': 'disabled || loading',\n    '[attr.data-testid]': 'testId',\n    '[attr.title]': 'tooltip',\n    '[class.adaptive]': 'adaptive',\n    '[class]': 'customClass'\n  }\n\n})\n\nexport class CideEleButtonComponent implements OnInit, OnChanges, OnDestroy {\n  private destroy$ = new Subject<void>();\n  private clickCount = 0;\n  private clickDebouncer$ = new Subject<Event>();\n  isStandaloneElement = false;\n\n  constructor(\n    private elementService: CideElementsService,\n    private router: Router,\n    private renderer: Renderer2,\n    private elementRef: ElementRef\n  ) {\n    // Check if component is used as standalone element (<cide-ele-button>) or as attribute directive\n    this.isStandaloneElement = this.elementRef.nativeElement.tagName === 'CIDE-ELE-BUTTON';\n    // Setup debounced click handler to prevent double-clicks\n    this.clickDebouncer$\n      .pipe(\n        debounceTime(300),\n        takeUntil(this.destroy$)\n      )\n      .subscribe({\n        next: (event) => {\n          this.handleClick(event);\n        }\n      });\n  }\n\n  // INPUTS\n  /** \n   * @description Label of button like Submit, Update, Add, etc.  \n   * Note: it is only used in case you did not set label between tags (via ng-content)\n   */\n  @Input() label: string = \"\";\n\n  /** @description Button style variant */\n  @Input() variant: ButtonVariant = 'primary';\n\n  /** @description Button size */\n  @Input() size: ButtonSize = 'xs';\n\n  /** @description Button HTML type attribute */\n  @Input() type: ButtonType = 'button';\n\n  /** @description Button shape */\n  @Input() shape: ButtonShape = 'default';\n\n  /** @description Button shadow elevation */\n  @Input() elevation: ButtonElevation = 'medium';\n\n  /** @description Button disabled state */\n  @Input() disabled: boolean | null = false;\n\n  /** @description Unique ID of control, used to differentiate elements */\n  @Input() id: string = '';\n\n  /** @description Enables loading state with spinner */\n  @Input() loading: boolean = false;\n\n  /** @description Makes button take full width of container */\n  @Input() fullWidth: boolean = false;\n\n  /** @description Icon to display on the left side of the button */\n  @Input() leftIcon: string = '';\n\n  /** @description Icon to display on the right side of the button */\n  @Input() rightIcon: string = '';\n\n  /** @description Additional CSS classes to apply */\n  @Input() customClass: string = '';\n\n  /** @description Tooltip text to display on hover */\n  @Input() tooltip: string = '';\n\n  /** @description Aria label for accessibility */\n  @Input() ariaLabel: string = '';\n\n  /** @description Test ID for automated testing */\n  @Input() testId: string = '';\n\n  /** @description Route to navigate to when clicked (for link buttons) */\n  @Input() routerLink: string | unknown[] = '';\n\n  /** @description Router navigation extras */\n  @Input() routerExtras: NavigationExtras = {};\n\n  /** @description Prevent multiple rapid clicks (debounce) */\n  @Input() preventDoubleClick: boolean = true;\n\n  /** @description Animation on click */\n  @Input() animated: boolean = true;\n\n  /** @description Hides label on mobile (viewport < 768px) and shows only icon */\n  @Input() adaptive: boolean = false;\n\n\n\n  // OUTPUTS\n  /**\n   * @description Click event of button\n   */\n  @Output() btnClick: EventEmitter<Event> = new EventEmitter();\n\n  /**\n   * @description Double click event\n   */\n  @Output() doubleClick: EventEmitter<Event> = new EventEmitter();\n\n  @HostListener('click', ['$event'])\n  onClick(event: Event): void {\n    if (this.disabled || this.loading) {\n      event.preventDefault();\n      event.stopPropagation();\n      return;\n    }\n\n    if (this.animated) {\n      this.addClickAnimation();\n    }\n\n    if (this.preventDoubleClick) {\n      this.clickDebouncer$.next(event);\n    } else {\n      this.handleClick(event);\n    }\n  }\n\n  private handleClick(event: Event): void {\n    // Handle navigation for routerLink\n    if (this.routerLink && this.routerLink.length) {\n      event.preventDefault();\n      this.router.navigate(\n        Array.isArray(this.routerLink) ? this.routerLink : [this.routerLink],\n        this.routerExtras\n      );\n    }\n\n    // Handle double-click detection\n    this.clickCount++;\n    setTimeout(() => {\n      if (this.clickCount === 2) {\n        this.doubleClick.emit(event);\n      }\n      this.clickCount = 0;\n    }, 300);\n\n    // Emit standard click event\n    this.btnClick.emit(event);\n  }\n\n  private addClickAnimation(): void {\n    // Add ripple effect\n    const ripple = this.renderer.createElement('span');\n    this.renderer.addClass(ripple, 'ripple-effect');\n\n    // Position the ripple at click position\n    const rect = this.elementRef.nativeElement.getBoundingClientRect();\n    const size = Math.max(rect.width, rect.height);\n\n    // Set ripple style\n    this.renderer.setStyle(ripple, 'width', `${size}px`);\n    this.renderer.setStyle(ripple, 'height', `${size}px`);\n    this.renderer.setStyle(ripple, 'left', `${0}px`);\n    this.renderer.setStyle(ripple, 'top', `${0}px`);\n\n    // Add ripple to button\n    this.renderer.appendChild(this.elementRef.nativeElement, ripple);\n\n    // Modern ES2022+ pattern: Use Promise-based delay\n    const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n    delay(600).then(() => {\n      this.renderer.removeChild(this.elementRef.nativeElement, ripple);\n    });\n  }\n\n  ngOnInit(): void {\n    if (this.id) {\n      this.getControlData();\n    }\n\n    // Set aria-label if not explicitly provided\n    if (!this.ariaLabel && this.label) {\n      this.ariaLabel = this.label;\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Update aria-label when label changes\n    if (changes['label'] && !this.ariaLabel) {\n      this.ariaLabel = changes['label'].currentValue;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  async getControlData() {\n    const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\n    if (cide_element_data) {\n      this.label = cide_element_data?.sype_label as string;\n    }\n  }\n}\n","@if (isStandaloneElement) {\r\n<!-- When used as standalone element, render button element -->\r\n<button [type]=\"type\" [disabled]=\"disabled || loading\" [attr.aria-label]=\"ariaLabel\"\r\n  [attr.aria-disabled]=\"disabled || loading\" [attr.data-testid]=\"testId\" [attr.title]=\"tooltip\"\r\n  class=\"tw-flex tw-items-center tw-justify-center cide-ele-btn-content tw-w-full\">\r\n  <!-- Left icon -->\r\n  @if (leftIcon) {\r\n  <span class=\"tw-icon-container\" [ngClass]=\"size === 'xs' ? 'tw-mr-1' : 'tw-mr-2'\">\r\n    <i class=\"tw-text-base material-symbols-outlined\">{{leftIcon}}</i>\r\n  </span>\r\n  }\r\n\r\n  <!-- Loading spinner -->\r\n  @if (loading) {\r\n  <cide-ele-spinner class=\"tw-inline-block tw-my-1\" [ngClass]=\"{\r\n      'tw-mr-1': size === 'xs', \r\n      'tw-mr-2': size !== 'xs', \r\n      'cide-pill-disabled': (disabled || loading)\r\n    }\" size=\"xs\">\r\n  </cide-ele-spinner>\r\n  }\r\n\r\n  <!-- Button label or content -->\r\n  <span class=\"btn-label\">\r\n    @if (label) {\r\n    <span>{{ label }}</span>\r\n    } @else {\r\n    <span class=\"tw-flex tw-items-center tw-justify-center\">\r\n      <ng-content></ng-content>\r\n    </span>\r\n    }\r\n  </span>\r\n\r\n\r\n  <!-- Right icon -->\r\n  @if (rightIcon) {\r\n  <span class=\"tw-icon-container\" [ngClass]=\"size === 'xs' ? 'tw-ml-1' : 'tw-ml-2'\">\r\n    <i class=\"tw-text-base material-symbols-outlined\">{{rightIcon}}</i>\r\n  </span>\r\n  }\r\n\r\n  <!-- Spacer for spinner when loading to maintain button width -->\r\n  @if (loading) {\r\n  <span class=\"tw-p-1\" [ngClass]=\"size === 'xs' ? 'tw-w-4 tw-mr-1' : 'tw-w-6 tw-mr-2'\"></span>\r\n  }\r\n</button>\r\n} @else {\r\n<!-- When used as attribute directive, just render content -->\r\n<div class=\"tw-flex tw-items-center tw-justify-center cide-ele-btn-content tw-w-full\">\r\n  <!-- Left icon -->\r\n  @if (leftIcon) {\r\n  <span class=\"tw-icon-container\" [ngClass]=\"size === 'xs' ? 'tw-mr-1' : 'tw-mr-2'\">\r\n    <i class=\"tw-text-base material-symbols-outlined\">{{leftIcon}}</i>\r\n  </span>\r\n  }\r\n\r\n  <!-- Loading spinner -->\r\n  @if (loading) {\r\n  <cide-ele-spinner class=\"tw-inline-block tw-my-1\" [ngClass]=\"{\r\n      'tw-mr-1': size === 'xs', \r\n      'tw-mr-2': size !== 'xs', \r\n      'cide-pill-disabled': (disabled || loading)\r\n    }\" size=\"xs\">\r\n  </cide-ele-spinner>\r\n  }\r\n\r\n  <!-- Button label or content -->\r\n  <span class=\"btn-label\">\r\n    @if (label) {\r\n    <span>{{ label }}</span>\r\n    } @else {\r\n    <span class=\"tw-flex tw-items-center tw-justify-center\">\r\n      <ng-content></ng-content>\r\n    </span>\r\n    }\r\n  </span>\r\n\r\n\r\n  <!-- Right icon -->\r\n  @if (rightIcon) {\r\n  <span class=\"tw-icon-container\" [ngClass]=\"size === 'xs' ? 'tw-ml-1' : 'tw-ml-2'\">\r\n    <i class=\"tw-text-base material-symbols-outlined\">{{rightIcon}}</i>\r\n  </span>\r\n  }\r\n\r\n  <!-- Spacer for spinner when loading to maintain button width -->\r\n  @if (loading) {\r\n  <span class=\"tw-p-1\" [ngClass]=\"size === 'xs' ? 'tw-w-4 tw-mr-1' : 'tw-w-6 tw-mr-2'\"></span>\r\n  }\r\n</div>\r\n}","/**\n * CIDE Element Library - Theme Service\n * Independent theme management for the element library\n * Can be used standalone without parent application theme dependencies\n */\n\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport type CideTheme = 'light' | 'dark' | 'auto';\n\nexport interface CideThemeConfig {\n  /**\n   * Initial theme to use\n   * @default 'light'\n   */\n  theme?: CideTheme;\n\n  /**\n   * Target element to apply theme\n   * If not provided, will use document.documentElement (html tag)\n   * @default document.documentElement\n   */\n  targetElement?: HTMLElement;\n\n  /**\n   * Persist theme preference to localStorage\n   * @default true\n   */\n  persistPreference?: boolean;\n\n  /**\n   * LocalStorage key for theme preference\n   * @default 'cide-theme'\n   */\n  storageKey?: string;\n\n  /**\n   * Use data-theme attribute instead of class\n   * @default true\n   */\n  useDataAttribute?: boolean;\n\n  /**\n   * Use class name for theme\n   * @default true\n   */\n  useClassName?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CideThemeService {\n  private platformId = inject(PLATFORM_ID);\n  private isBrowser: boolean;\n\n  private currentTheme$ = new BehaviorSubject<CideTheme>('light');\n  private effectiveTheme$ = new BehaviorSubject<'light' | 'dark'>('light');\n\n  private config: Required<CideThemeConfig> = {\n    theme: 'light',\n    targetElement: null as any,\n    persistPreference: true,\n    storageKey: 'cide-theme',\n    useDataAttribute: true,\n    useClassName: true\n  };\n\n  constructor() {\n    this.isBrowser = isPlatformBrowser(this.platformId);\n\n    if (this.isBrowser) {\n      this.config.targetElement = document.documentElement;\n    }\n  }\n\n  /**\n   * Initialize the theme service with configuration\n   * This should be called once in the application, typically in main.ts or app config\n   */\n  initialize(config?: CideThemeConfig): void {\n    if (!this.isBrowser) {\n      return;\n    }\n\n    // Merge configuration\n    if (config) {\n      this.config = {\n        ...this.config,\n        ...config,\n        targetElement: config.targetElement || document.documentElement\n      };\n    }\n\n    // Load saved theme preference\n    const savedTheme = this.loadThemePreference();\n    const initialTheme = savedTheme || this.config.theme;\n\n    // Apply initial theme\n    this.setTheme(initialTheme);\n\n    // Listen for system theme changes if theme is set to 'auto'\n    if (initialTheme === 'auto') {\n      this.listenToSystemTheme();\n    }\n  }\n\n  /**\n   * Set the current theme\n   */\n  setTheme(theme: CideTheme): void {\n    if (!this.isBrowser) {\n      return;\n    }\n\n    this.currentTheme$.next(theme);\n\n    // Save preference if persistence is enabled\n    if (this.config.persistPreference) {\n      this.saveThemePreference(theme);\n    }\n\n    // Determine effective theme\n    let effectiveTheme: 'light' | 'dark';\n\n    if (theme === 'auto') {\n      effectiveTheme = this.getSystemTheme();\n      this.listenToSystemTheme();\n    } else {\n      effectiveTheme = theme;\n    }\n\n    this.effectiveTheme$.next(effectiveTheme);\n    this.applyTheme(effectiveTheme);\n  }\n\n  /**\n   * Get the current theme preference\n   */\n  getCurrentTheme(): CideTheme {\n    return this.currentTheme$.value;\n  }\n\n  /**\n   * Get the effective theme (actual theme being displayed)\n   */\n  getEffectiveTheme(): 'light' | 'dark' {\n    return this.effectiveTheme$.value;\n  }\n\n  /**\n   * Observable for current theme changes\n   */\n  getCurrentTheme$(): Observable<CideTheme> {\n    return this.currentTheme$.asObservable();\n  }\n\n  /**\n   * Observable for effective theme changes\n   */\n  getEffectiveTheme$(): Observable<'light' | 'dark'> {\n    return this.effectiveTheme$.asObservable();\n  }\n\n  /**\n   * Toggle between light and dark themes\n   */\n  toggleTheme(): void {\n    const currentEffective = this.effectiveTheme$.value;\n    const newTheme: CideTheme = currentEffective === 'light' ? 'dark' : 'light';\n    this.setTheme(newTheme);\n  }\n\n  /**\n   * Check if dark mode is currently active\n   */\n  isDarkMode(): boolean {\n    return this.effectiveTheme$.value === 'dark';\n  }\n\n  /**\n   * Apply theme to target element\n   */\n  private applyTheme(theme: 'light' | 'dark'): void {\n    if (!this.isBrowser || !this.config.targetElement) {\n      return;\n    }\n\n    const element = this.config.targetElement;\n\n    // Apply data-theme attribute\n    if (this.config.useDataAttribute) {\n      element.setAttribute('data-theme', theme);\n    }\n\n    // Apply class name\n    if (this.config.useClassName) {\n      if (theme === 'dark') {\n        element.classList.add('dark-mode', 'dark');\n        element.classList.remove('light-mode');\n      } else {\n        element.classList.add('light-mode');\n        element.classList.remove('dark-mode', 'dark');\n      }\n    }\n\n    // Also apply to body for better compatibility\n    if (element === document.documentElement && document.body) {\n      if (this.config.useDataAttribute) {\n        document.body.setAttribute('data-theme', theme);\n      }\n      if (this.config.useClassName) {\n        if (theme === 'dark') {\n          document.body.classList.add('dark-mode', 'dark');\n          document.body.classList.remove('light-mode');\n        } else {\n          document.body.classList.add('light-mode');\n          document.body.classList.remove('dark-mode', 'dark');\n        }\n      }\n    }\n  }\n\n  /**\n   * Get system theme preference\n   */\n  private getSystemTheme(): 'light' | 'dark' {\n    if (!this.isBrowser) {\n      return 'light';\n    }\n\n    if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n      return 'dark';\n    }\n\n    return 'light';\n  }\n\n  /**\n   * Listen to system theme changes\n   */\n  private listenToSystemTheme(): void {\n    if (!this.isBrowser || !window.matchMedia) {\n      return;\n    }\n\n    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n    const handler = (e: MediaQueryListEvent | MediaQueryList) => {\n      if (this.currentTheme$.value === 'auto') {\n        const effectiveTheme = e.matches ? 'dark' : 'light';\n        this.effectiveTheme$.next(effectiveTheme);\n        this.applyTheme(effectiveTheme);\n      }\n    };\n\n    // Modern browsers\n    if (mediaQuery.addEventListener) {\n      mediaQuery.addEventListener('change', handler);\n    } else if ((mediaQuery as any).addListener) {\n      // Legacy browsers\n      (mediaQuery as any).addListener(handler);\n    }\n  }\n\n  /**\n   * Save theme preference to localStorage\n   */\n  private saveThemePreference(theme: CideTheme): void {\n    if (!this.isBrowser) {\n      return;\n    }\n\n    try {\n      // Save in new format: 'light', 'dark', or 'auto'\n      localStorage.setItem(this.config.storageKey, theme);\n\n      // Also update old format for backward compatibility\n      // This allows old code that reads 'true'/'false' to still work\n      if (theme === 'dark') {\n        localStorage.setItem(this.config.storageKey, 'dark');\n      } else if (theme === 'light') {\n        localStorage.setItem(this.config.storageKey, 'light');\n      }\n    } catch (error) {\n      console.warn('Failed to save theme preference to localStorage:', error);\n    }\n  }\n\n  /**\n   * Load theme preference from localStorage\n   */\n  private loadThemePreference(): CideTheme | null {\n    if (!this.isBrowser) {\n      return null;\n    }\n\n    try {\n      const saved = localStorage.getItem(this.config.storageKey);\n\n      // Handle new format: 'light', 'dark', 'auto'\n      if (saved && ['light', 'dark', 'auto'].includes(saved)) {\n        return saved as CideTheme;\n      }\n\n      // Handle legacy format: 'true' (dark mode) or 'false' (light mode)\n      if (saved === 'true') {\n        // Migrate to new format\n        localStorage.setItem(this.config.storageKey, 'dark');\n        return 'dark';\n      } else if (saved === 'false') {\n        // Migrate to new format\n        localStorage.setItem(this.config.storageKey, 'light');\n        return 'light';\n      }\n    } catch (error) {\n      console.warn('Failed to load theme preference from localStorage:', error);\n    }\n\n    return null;\n  }\n\n  /**\n   * Clear saved theme preference\n   */\n  clearThemePreference(): void {\n    if (!this.isBrowser) {\n      return;\n    }\n\n    try {\n      localStorage.removeItem(this.config.storageKey);\n    } catch (error) {\n      console.warn('Failed to clear theme preference from localStorage:', error);\n    }\n  }\n}\n\n","import { Component, OnInit, OnDestroy, inject, signal, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideThemeService } from '../../services/theme.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DestroyRef } from '@angular/core';\n\nexport type ThemeToggleSize = 'small' | 'medium' | 'large';\n\n/**\n * Apple-inspired dark/light mode toggle component\n * \n * Features:\n * - Smooth animated toggle switch\n * - Apple-style design with rounded corners and shadows\n * - Works on pages without header/sidebar (dynamic website, login pages, auth project)\n * - Automatically syncs with system theme preference\n * - Persists user preference to localStorage\n * - Supports different sizes: small, medium (default), large\n */\n@Component({\n  selector: 'cide-ele-theme-toggle',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './theme-toggle.component.html',\n  styleUrl: './theme-toggle.component.scss'\n})\nexport class CideEleThemeToggleComponent implements OnInit, OnDestroy {\n  private readonly themeService = inject(CideThemeService);\n  private readonly destroyRef = inject(DestroyRef);\n\n  // Size input - defaults to 'medium' for backward compatibility\n  readonly size = input<ThemeToggleSize>('medium');\n\n  // Current theme state\n  readonly isDarkMode = signal<boolean>(false);\n  readonly isAnimating = signal<boolean>(false);\n\n  // Computed values\n  readonly togglePosition = computed(() => {\n    if (!this.isDarkMode()) {\n      return 'translate-x-0';\n    }\n    const sizeValue = this.size();\n    // Calculate translateX based on size: small (36px width - 19px thumb - 3px padding = ~14px), medium (52px - 28px - 4px = ~20px), large (68px - 36px - 5px = ~27px)\n    const translateX = sizeValue === 'small' ? '14px' : sizeValue === 'large' ? '27px' : '20px';\n    return `translateX(${translateX})`;\n  });\n  readonly toggleBgColor = computed(() => this.isDarkMode() \n    ? 'tw-bg-gradient-to-r tw-from-blue-500 tw-to-indigo-600' \n    : 'tw-bg-gray-200 dark:tw-bg-gray-700');\n\n  ngOnInit(): void {\n    // Subscribe to theme changes\n    this.themeService.getEffectiveTheme$()\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(theme => {\n        this.isDarkMode.set(theme === 'dark');\n      });\n\n    // Set initial state\n    this.isDarkMode.set(this.themeService.isDarkMode());\n  }\n\n  ngOnDestroy(): void {\n    // Cleanup handled by takeUntilDestroyed\n  }\n\n  /**\n   * Toggle between light and dark mode\n   */\n  toggleTheme(): void {\n    if (this.isAnimating()) {\n      return; // Prevent rapid clicking\n    }\n\n    this.isAnimating.set(true);\n    \n    // Toggle theme using the service\n    this.themeService.toggleTheme();\n\n    // Reset animation flag after transition\n    setTimeout(() => {\n      this.isAnimating.set(false);\n    }, 300);\n  }\n}\n\n\n\n","<div class=\"cide-theme-toggle-wrapper\" [class.size-small]=\"size() === 'small'\" [class.size-medium]=\"size() === 'medium'\" [class.size-large]=\"size() === 'large'\">\n  <button\n    type=\"button\"\n    class=\"cide-theme-toggle-button\"\n    [class.is-dark]=\"isDarkMode()\"\n    [class.is-animating]=\"isAnimating()\"\n    (click)=\"toggleTheme()\"\n    [attr.aria-label]=\"isDarkMode() ? 'Switch to light mode' : 'Switch to dark mode'\"\n    [attr.aria-pressed]=\"isDarkMode()\">\n    \n    <!-- Toggle Track -->\n    <span class=\"cide-theme-toggle-track\" [class]=\"toggleBgColor()\">\n      <!-- Sun Icon (Light Mode) -->\n      <span class=\"cide-theme-toggle-icon sun-icon\" [class.hidden]=\"isDarkMode()\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"currentColor\"/>\n          <path d=\"M12 2V4M12 20V22M4 12H2M22 12H20M19.07 4.93L17.66 6.34M6.34 17.66L4.93 19.07M19.07 19.07L17.66 17.66M6.34 6.34L4.93 4.93\" \n                stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n        </svg>\n      </span>\n      \n      <!-- Moon Icon (Dark Mode) -->\n      <span class=\"cide-theme-toggle-icon moon-icon\" [class.hidden]=\"!isDarkMode()\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" \n                stroke=\"currentColor\" stroke-width=\"2\" fill=\"currentColor\"/>\n        </svg>\n      </span>\n    </span>\n    \n    <!-- Toggle Thumb (Slider) -->\n    <span class=\"cide-theme-toggle-thumb\" [style.transform]=\"togglePosition()\">\n    </span>\n  </button>\n</div>\n\n\n\n","import { Component, Input, Output, EventEmitter, signal, computed, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideIconComponent } from '../icon/icon.component';\nimport { CideEleButtonComponent } from '../button/cide-ele-button.component';\n\nexport type CardVariant = 'default' | 'outlined' | 'elevated' | 'flat';\nexport type CardSize = 'sm' | 'md' | 'lg';\nexport type CardState = 'expanded' | 'collapsed' | 'minimized' | 'maximized';\n\nexport interface CardConfig {\n  collapsible?: boolean;\n  minimizable?: boolean;\n  maximizable?: boolean;\n  removable?: boolean;\n  defaultState?: CardState;\n  showHeader?: boolean;\n  showFooter?: boolean;\n  variant?: CardVariant;\n  size?: CardSize;\n  shadow?: boolean;\n  rounded?: boolean;\n  bordered?: boolean;\n}\n\n@Component({\n  selector: 'cide-ele-card',\n  standalone: true,\n  imports: [CommonModule, CideIconComponent],\n  template: `\n    <div \n      class=\"cide-card\"\n      [class.cide-card-collapsed]=\"isCollapsed()\"\n      [class.cide-card-minimized]=\"isMinimized()\"\n      [class.cide-card-maximized]=\"isMaximized()\"\n      [class.cide-card-outlined]=\"config().variant === 'outlined'\"\n      [class.cide-card-elevated]=\"config().variant === 'elevated'\"\n      [class.cide-card-flat]=\"config().variant === 'flat'\"\n      [class.cide-card-sm]=\"config().size === 'sm'\"\n      [class.cide-card-md]=\"config().size === 'md'\"\n      [class.cide-card-lg]=\"config().size === 'lg'\"\n      [class.cide-card-shadow]=\"config().shadow !== false\"\n      [class.cide-card-rounded]=\"config().rounded !== false\"\n      [class.cide-card-bordered]=\"config().bordered !== false\"\n      [style.max-height]=\"isMinimized() ? '60px' : (isMaximized() ? '100vh' : 'none')\"\n      [style.width]=\"isMaximized() ? '100vw' : '100%'\"\n      [style.position]=\"isMaximized() ? 'fixed' : 'relative'\"\n      [style.z-index]=\"isMaximized() ? '9999' : 'auto'\"\n      [style.top]=\"isMaximized() ? '0' : 'auto'\"\n      [style.left]=\"isMaximized() ? '0' : 'auto'\"\n      [style.right]=\"isMaximized() ? '0' : 'auto'\"\n      [style.bottom]=\"isMaximized() ? '0' : 'auto'\"\n    >\n      <!-- Header -->\n      @if (config().showHeader !== false) {\n        <div class=\"cide-card-header\" (click)=\"onHeaderClick()\">\n          <div class=\"cide-card-header-content\">\n            @if (title) {\n              <h3 class=\"cide-card-title\">{{ title }}</h3>\n            }\n            @if (subtitle) {\n              <p class=\"cide-card-subtitle\">{{ subtitle }}</p>\n            }\n            <ng-content select=\"[card-header]\"></ng-content>\n          </div>\n          <div class=\"cide-card-actions\">\n            <ng-content select=\"[card-actions]\"></ng-content>\n            @if (config().collapsible) {\n              <button \n                type=\"button\"\n                class=\"cide-card-action-btn\"\n                (click)=\"toggleCollapse($event)\"\n                [attr.aria-label]=\"isCollapsed() ? 'Expand card' : 'Collapse card'\"\n                [title]=\"isCollapsed() ? 'Expand' : 'Collapse'\">\n                <cide-ele-icon>{{ isCollapsed() ? 'expand_more' : 'expand_less' }}</cide-ele-icon>\n              </button>\n            }\n            @if (config().minimizable) {\n              <button \n                type=\"button\"\n                class=\"cide-card-action-btn\"\n                (click)=\"toggleMinimize($event)\"\n                [attr.aria-label]=\"isMinimized() ? 'Restore card' : 'Minimize card'\"\n                [title]=\"isMinimized() ? 'Restore' : 'Minimize'\">\n                <cide-ele-icon>{{ isMinimized() ? 'unfold_more' : 'unfold_less' }}</cide-ele-icon>\n              </button>\n            }\n            @if (config().maximizable) {\n              <button \n                type=\"button\"\n                class=\"cide-card-action-btn\"\n                (click)=\"toggleMaximize($event)\"\n                [attr.aria-label]=\"isMaximized() ? 'Restore card' : 'Maximize card'\"\n                [title]=\"isMaximized() ? 'Restore' : 'Maximize'\">\n                <cide-ele-icon>{{ isMaximized() ? 'fullscreen_exit' : 'fullscreen' }}</cide-ele-icon>\n              </button>\n            }\n            @if (config().removable) {\n              <button \n                type=\"button\"\n                class=\"cide-card-action-btn cide-card-action-remove\"\n                (click)=\"remove($event)\"\n                aria-label=\"Remove card\"\n                title=\"Remove\">\n                <cide-ele-icon>close</cide-ele-icon>\n              </button>\n            }\n          </div>\n        </div>\n      }\n\n      <!-- Content -->\n      <div \n        class=\"cide-card-content\"\n        [class.cide-card-content-collapsed]=\"isCollapsed()\"\n        [class.cide-card-content-minimized]=\"isMinimized()\"\n      >\n        <ng-content></ng-content>\n      </div>\n\n      <!-- Footer -->\n      @if (config().showFooter && !isMinimized()) {\n        <div class=\"cide-card-footer\">\n          <ng-content select=\"[card-footer]\"></ng-content>\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    .cide-card {\n      display: inline-block;\n      width: 100%;\n      background: white;\n      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      overflow: hidden;\n      position: relative;\n      vertical-align: top;\n    }\n    \n    .cide-card-header {\n      display: flex;\n    }\n\n    .cide-card-rounded {\n      border-radius: 0.75rem;\n    }\n\n    .cide-card-bordered {\n      border: 1px solid #e5e7eb;\n    }\n\n    .cide-card-shadow {\n      box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n    }\n\n    .cide-card-outlined {\n      border: 2px solid #e5e7eb;\n      box-shadow: none;\n    }\n\n    .cide-card-elevated {\n      box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n    }\n\n    .cide-card-flat {\n      border: none;\n      box-shadow: none;\n      background: transparent;\n    }\n\n    /* Sizes */\n    .cide-card-sm {\n      font-size: 0.875rem;\n    }\n\n    .cide-card-md {\n      font-size: 1rem;\n    }\n\n    .cide-card-lg {\n      font-size: 1.125rem;\n    }\n\n    /* Header */\n    .cide-card-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 0.5rem 1rem;\n      background: linear-gradient(to right, #f0f9ff, #e0f2fe);\n      border-bottom: 1px solid #e5e7eb;\n      min-height: 2rem;\n      cursor: pointer;\n      user-select: none;\n    }\n\n    .cide-card-header-content {\n      flex: 1;\n      min-width: 0;\n    }\n\n    .cide-card-title {\n      margin: 0;\n      font-size: 0.875rem;\n      font-weight: 600;\n      color: #1e40af;\n      line-height: 1.4;\n    }\n\n    .cide-card-subtitle {\n      margin: 0.125rem 0 0 0;\n      font-size: 0.75rem;\n      color: #64748b;\n      line-height: 1.3;\n    }\n\n    .cide-card-actions {\n      display: flex;\n      align-items: center;\n      gap: 0.25rem;\n      margin-left: 0.5rem;\n      flex-shrink: 0;\n      flex-wrap: wrap;\n      max-width: 60%;\n    }\n\n    .cide-card-action-btn {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 1.75rem;\n      height: 1.75rem;\n      padding: 0;\n      background: transparent;\n      border: none;\n      border-radius: 0.375rem;\n      color: #64748b;\n      cursor: pointer;\n      transition: all 0.2s ease;\n    }\n\n    .cide-card-action-btn:hover {\n      background: rgba(0, 0, 0, 0.05);\n      color: #1e40af;\n    }\n\n    .cide-card-action-btn:active {\n      transform: scale(0.95);\n    }\n\n    .cide-card-action-remove:hover {\n      background: rgba(239, 68, 68, 0.1);\n      color: #dc2626;\n    }\n\n    /* Content */\n    .cide-card-content {\n      padding: 1.25rem;\n      overflow: hidden;\n      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      max-height: none;\n    }\n\n    .cide-card-content-collapsed {\n      max-height: 0;\n      padding-top: 0;\n      padding-bottom: 0;\n      overflow: hidden;\n    }\n\n    .cide-card-content-minimized {\n      display: none;\n    }\n\n    /* Collapsed state */\n    .cide-card-collapsed .cide-card-content {\n      max-height: 0;\n      padding-top: 0;\n      padding-bottom: 0;\n    }\n\n    /* Minimized state */\n    .cide-card-minimized {\n      max-height: 60px;\n    }\n\n    .cide-card-minimized .cide-card-content {\n      display: none;\n    }\n\n    .cide-card-minimized .cide-card-footer {\n      display: none;\n    }\n\n    /* Maximized state */\n    .cide-card-maximized {\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      width: 100vw;\n      height: 100vh;\n      z-index: 9999;\n      border-radius: 0;\n      margin: 0;\n    }\n\n    .cide-card-maximized .cide-card-content {\n      flex: 1;\n      overflow-y: auto;\n    }\n\n    /* Footer */\n    .cide-card-footer {\n      padding: 0.75rem 1rem;\n      background: #f9fafb;\n      border-top: 1px solid #e5e7eb;\n      margin-top: auto;\n    }\n\n    /* Responsive */\n    @media (max-width: 640px) {\n      .cide-card-header {\n        padding: 0.5rem 0.875rem;\n        flex-wrap: wrap;\n      }\n\n      .cide-card-content {\n        padding: 0.875rem;\n      }\n\n      .cide-card-footer {\n        padding: 0.625rem 0.875rem;\n      }\n\n      .cide-card-actions {\n        margin-left: 0.375rem;\n        gap: 0.25rem;\n      }\n\n      .cide-card-action-btn {\n        width: 1.375rem;\n        height: 1.375rem;\n      }\n    }\n  `]\n})\nexport class CideEleCardComponent implements OnInit, OnChanges {\n  @Input() title?: string;\n  @Input() subtitle?: string;\n  @Input() cardConfig: CardConfig = {\n    collapsible: true,\n    minimizable: false,\n    maximizable: false,\n    removable: false,\n    defaultState: 'expanded',\n    showHeader: true,\n    showFooter: false,\n    variant: 'default',\n    size: 'md',\n    shadow: true,\n    rounded: true,\n    bordered: true\n  };\n\n  @Output() stateChange = new EventEmitter<CardState>();\n  @Output() collapsed = new EventEmitter<boolean>();\n  @Output() minimized = new EventEmitter<boolean>();\n  @Output() maximized = new EventEmitter<boolean>();\n  @Output() removed = new EventEmitter<void>();\n  @Output() headerClick = new EventEmitter<void>();\n\n  private currentState = signal<CardState>('expanded');\n  private configSignal = signal<CardConfig>({\n    collapsible: true,\n    minimizable: false,\n    maximizable: false,\n    removable: false,\n    defaultState: 'expanded',\n    showHeader: true,\n    showFooter: false,\n    variant: 'default',\n    size: 'md',\n    shadow: true,\n    rounded: true,\n    bordered: true\n  });\n\n  // Computed signals for state checks\n  isCollapsed = computed(() => this.currentState() === 'collapsed');\n  isMinimized = computed(() => this.currentState() === 'minimized');\n  isMaximized = computed(() => this.currentState() === 'maximized');\n  config = computed(() => this.configSignal());\n\n  ngOnInit(): void {\n    this.updateConfig();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['cardConfig']) {\n      this.updateConfig();\n    }\n  }\n\n  private updateConfig(): void {\n    // Merge with defaults\n    const mergedConfig: CardConfig = {\n      collapsible: true,\n      minimizable: false,\n      maximizable: false,\n      removable: false,\n      defaultState: 'expanded',\n      showHeader: true,\n      showFooter: false,\n      variant: 'default',\n      size: 'md',\n      shadow: true,\n      rounded: true,\n      bordered: true,\n      ...this.cardConfig\n    };\n    this.configSignal.set(mergedConfig);\n\n    // Set default state if not already set\n    if (this.currentState() === 'expanded' && mergedConfig.defaultState) {\n      this.currentState.set(mergedConfig.defaultState);\n    }\n  }\n\n  toggleCollapse(event: Event): void {\n    event.stopPropagation();\n    if (!this.configSignal().collapsible) return;\n\n    const newState = this.isCollapsed() ? 'expanded' : 'collapsed';\n    this.setState(newState);\n  }\n\n  toggleMinimize(event: Event): void {\n    event.stopPropagation();\n    if (!this.configSignal().minimizable) return;\n\n    const newState = this.isMinimized() ? 'expanded' : 'minimized';\n    this.setState(newState);\n  }\n\n  toggleMaximize(event: Event): void {\n    event.stopPropagation();\n    if (!this.configSignal().maximizable) return;\n\n    const newState = this.isMaximized() ? 'expanded' : 'maximized';\n    this.setState(newState);\n  }\n\n  remove(event: Event): void {\n    event.stopPropagation();\n    if (!this.configSignal().removable) return;\n    this.removed.emit();\n  }\n\n  onHeaderClick(): void {\n    if (this.configSignal().collapsible && this.configSignal().defaultState !== 'collapsed') {\n      this.toggleCollapse(new Event('click'));\n    }\n    this.headerClick.emit();\n  }\n\n  private setState(newState: CardState): void {\n    this.currentState.set(newState);\n    this.stateChange.emit(newState);\n    this.collapsed.emit(newState === 'collapsed');\n    this.minimized.emit(newState === 'minimized');\n    this.maximized.emit(newState === 'maximized');\n  }\n\n  // Public methods for programmatic control\n  expand(): void {\n    this.setState('expanded');\n  }\n\n  collapse(): void {\n    if (this.configSignal().collapsible) {\n      this.setState('collapsed');\n    }\n  }\n\n  minimize(): void {\n    if (this.configSignal().minimizable) {\n      this.setState('minimized');\n    }\n  }\n\n  maximize(): void {\n    if (this.configSignal().maximizable) {\n      this.setState('maximized');\n    }\n  }\n\n  getState(): CardState {\n    return this.currentState();\n  }\n}\n\n","/**\r\n * Notification API Service\r\n * HTTP client for notification API endpoints\r\n */\r\n\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { cidePath, hostManagerRoutesUrl, notificationRoutesUrl } from '../utils';\r\n\r\nexport interface ServerNotification {\r\n  _id: string;\r\n  not_id_user: string | {\r\n    _id?: string;\r\n    name?: string;\r\n    email?: string;\r\n  };\r\n  not_type: 'info' | 'success' | 'warning' | 'error' | 'system';\r\n  not_category: string;\r\n  not_title: string;\r\n  not_message: string;\r\n  not_data?: any;\r\n  not_action_url?: string;\r\n  not_action_label?: string;\r\n  not_status: 'pending' | 'sent' | 'delivered' | 'read' | 'archived';\r\n  not_priority: 'low' | 'normal' | 'high' | 'urgent';\r\n  not_read_at?: Date;\r\n  not_delivered_at?: Date;\r\n  not_archived_at?: Date;\r\n  not_channels?: {\r\n    in_app?: boolean;\r\n    email?: boolean;\r\n    sms?: boolean;\r\n  };\r\n  not_created_at: Date;\r\n  not_updated_at: Date;\r\n}\r\n\r\nexport interface NotificationListResponse {\r\n  success: boolean;\r\n  code: number;\r\n  message: string;\r\n  data: ServerNotification[];\r\n  total?: number;\r\n}\r\n\r\nexport interface NotificationResponse {\r\n  success: boolean;\r\n  code: number;\r\n  message: string;\r\n  data: ServerNotification;\r\n}\r\n\r\nexport interface UnreadCountResponse {\r\n  success: boolean;\r\n  code: number;\r\n  message: string;\r\n  data: {\r\n    count: number;\r\n  };\r\n}\r\n\r\nexport interface CreateNotificationDto {\r\n  not_id_user: string;\r\n  not_type?: 'info' | 'success' | 'warning' | 'error' | 'system';\r\n  not_category: string;\r\n  not_title: string;\r\n  not_message: string;\r\n  not_data?: any;\r\n  not_action_url?: string;\r\n  not_action_label?: string;\r\n  not_priority?: 'low' | 'normal' | 'high' | 'urgent';\r\n  not_channels?: {\r\n    in_app?: boolean;\r\n    email?: boolean;\r\n    sms?: boolean;\r\n  };\r\n  not_expires_at?: Date;\r\n  not_id_created_by?: string;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class NotificationApiService {\r\n  private readonly http = inject(HttpClient);\r\n  private readonly apiUrl = cidePath.join([\r\n    hostManagerRoutesUrl.cideSuiteHost,\r\n    notificationRoutesUrl.module\r\n  ]);\r\n\r\n  /**\r\n   * Get user notifications\r\n   */\r\n  getNotifications(params?: {\r\n    status?: string;\r\n    type?: string;\r\n    category?: string;\r\n    priority?: string;\r\n    pageIndex?: number;\r\n    pageSize?: number;\r\n    pagination?: boolean;\r\n  }): Observable<NotificationListResponse> {\r\n    let httpParams = new HttpParams();\r\n    \r\n    if (params) {\r\n      Object.keys(params).forEach(key => {\r\n        const value = params[key as keyof typeof params];\r\n        if (value !== undefined && value !== null) {\r\n          httpParams = httpParams.set(key, value.toString());\r\n        }\r\n      });\r\n    }\r\n    \r\n    // Debug: Log the URL being used\r\n    console.log('[NotificationApi] Request URL:', this.apiUrl);\r\n    console.log('[NotificationApi] Full URL with params:', `${this.apiUrl}?${httpParams.toString()}`);\r\n    \r\n    return this.http.get<NotificationListResponse>(this.apiUrl, { params: httpParams });\r\n  }\r\n\r\n  /**\r\n   * Get notification by ID\r\n   */\r\n  getNotificationById(id: string): Observable<NotificationResponse> {\r\n    return this.http.get<NotificationResponse>(`${this.apiUrl}/${id}`);\r\n  }\r\n\r\n  /**\r\n   * Get unread count\r\n   */\r\n  getUnreadCount(): Observable<UnreadCountResponse> {\r\n    return this.http.get<UnreadCountResponse>(`${this.apiUrl}/${notificationRoutesUrl.unreadCount}`);\r\n  }\r\n\r\n  /**\r\n   * Create notification\r\n   */\r\n  createNotification(payload: CreateNotificationDto): Observable<NotificationResponse> {\r\n    return this.http.post<NotificationResponse>(this.apiUrl, payload);\r\n  }\r\n\r\n  /**\r\n   * Mark notification as read\r\n   */\r\n  markAsRead(id: string): Observable<NotificationResponse> {\r\n    const url = `${this.apiUrl}/${id}/read`;\r\n    console.log('[NotificationApi] Mark as read URL:', url);\r\n    return this.http.put<NotificationResponse>(url, {});\r\n  }\r\n\r\n  /**\r\n   * Mark all notifications as read\r\n   */\r\n  markAllAsRead(): Observable<NotificationResponse> {\r\n    const url = `${this.apiUrl}/read-all`;\r\n    console.log('[NotificationApi] Mark all as read URL:', url);\r\n    return this.http.put<NotificationResponse>(url, {});\r\n  }\r\n\r\n  /**\r\n   * Archive notification\r\n   */\r\n  archiveNotification(id: string): Observable<NotificationResponse> {\r\n    return this.http.put<NotificationResponse>(`${this.apiUrl}/${id}/archive`, {});\r\n  }\r\n}\r\n\r\n","/**\r\n * WebSocket Notification Service\r\n * Socket.IO client for real-time notifications\r\n */\r\n\r\nimport { Injectable, signal, computed, inject, OnDestroy } from '@angular/core';\r\nimport { io, Socket } from 'socket.io-client';\r\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\r\nimport { hostManagerRoutesUrl } from '../utils';\r\n\r\nexport interface NotificationPayload {\r\n  id: string;\r\n  type: 'info' | 'success' | 'warning' | 'error' | 'system';\r\n  category: string;\r\n  title: string;\r\n  message: string;\r\n  data?: any;\r\n  action_url?: string;\r\n  action_label?: string;\r\n  priority: 'low' | 'normal' | 'high' | 'urgent';\r\n  created_at: Date;\r\n  timestamp: Date;\r\n}\r\n\r\nexport interface ConnectionStatus {\r\n  connected: boolean;\r\n  socketId?: string;\r\n  userId?: string;\r\n  timestamp?: Date;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class WebSocketNotificationService implements OnDestroy {\r\n  private socket: Socket | null = null;\r\n  private notificationSubject = new Subject<NotificationPayload>();\r\n  private connectionStatusSubject = new BehaviorSubject<ConnectionStatus>({\r\n    connected: false\r\n  });\r\n  \r\n  // Signals for reactive state\r\n  private notifications = signal<NotificationPayload[]>([]);\r\n  private unreadNotifications = signal<NotificationPayload[]>([]);\r\n  \r\n  // Public observables\r\n  public notification$ = this.notificationSubject.asObservable();\r\n  public connectionStatus$ = this.connectionStatusSubject.asObservable();\r\n  \r\n  // Computed signals\r\n  public allNotifications = computed(() => this.notifications());\r\n  public unreadNotificationsCount = computed(() => this.unreadNotifications().length);\r\n  public isConnected = computed(() => this.connectionStatusSubject.value.connected);\r\n  \r\n  /**\r\n   * Connect to Socket.IO server\r\n   */\r\n  connect(token: string, userId?: string): void {\r\n    if (this.socket?.connected) {\r\n      console.log('Socket already connected');\r\n      return;\r\n    }\r\n    \r\n    // Resolve actual API URL from placeholder\r\n    // The placeholder is replaced by host interceptor for HTTP, but WebSocket needs direct resolution\r\n    // Based on host-manager.json: \"__cloud_ide_suite_layout__\" -> \"http://localhost:3001\"\r\n    const placeholder = hostManagerRoutesUrl.cideSuiteHost;\r\n    let apiUrl = 'http://localhost:3001'; // Default from host-manager.json\r\n    \r\n    // Try to resolve from host-manager.json via fetch (same as HTTP interceptor)\r\n    if (typeof window !== 'undefined') {\r\n      // Try to fetch host-manager.json to get the actual URL\r\n      fetch('/routes/host-manager.json')\r\n        .then(res => res.json())\r\n        .then((hostManagerRoutes: any) => {\r\n          const hostManagerRoutesEntry = hostManagerRoutes?.hosts?.find((hostRoute: any) => \r\n            placeholder?.includes(hostRoute?.url)\r\n          );\r\n          \r\n          if (hostManagerRoutesEntry?.replace) {\r\n            apiUrl = hostManagerRoutesEntry.replace;\r\n          }\r\n          // Remove /api suffix if present (Socket.IO connects to base server)\r\n          apiUrl = apiUrl.replace(/\\/api\\/?$/, '');\r\n          this.connectWithUrl(apiUrl, token, userId);\r\n        })\r\n        .catch(() => {\r\n          // Fallback if fetch fails - use default or try localStorage\r\n          this.resolveUrlFallback(token, userId);\r\n        });\r\n    } else {\r\n      // Server-side or fallback\r\n      this.resolveUrlFallback(token, userId);\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * Fallback URL resolution\r\n   */\r\n  private resolveUrlFallback(token: string, userId?: string): void {\r\n    let apiUrl = 'http://localhost:3001'; // Default from host-manager.json\r\n    \r\n    // Try to get from current window location\r\n    if (typeof window !== 'undefined') {\r\n      const currentOrigin = window.location.origin;\r\n      \r\n      // Check if we're on localhost (development)\r\n      if (currentOrigin.includes('localhost') || currentOrigin.includes('127.0.0.1')) {\r\n        // Use localhost:3001 for development (from host-manager.json)\r\n        apiUrl = 'http://localhost:3001';\r\n      } else {\r\n        // In production, use the same origin (assuming API is on same domain)\r\n        apiUrl = currentOrigin || 'http://localhost:3001';\r\n      }\r\n      \r\n      // Try to get from localStorage (if set by app initialization)\r\n      const storedApiUrl = localStorage.getItem('api_base_url');\r\n      if (storedApiUrl) {\r\n        apiUrl = storedApiUrl.replace(/\\/api\\/?$/, '');\r\n      }\r\n    }\r\n    \r\n    this.connectWithUrl(apiUrl, token, userId);\r\n  }\r\n  \r\n  /**\r\n   * Connect with resolved URL\r\n   */\r\n  private connectWithUrl(apiUrl: string, token: string, userId?: string): void {\r\n    console.log('[WebSocket] Connecting to:', apiUrl);\r\n    \r\n    this.socket = io(apiUrl, {\r\n      path: '/notifications-socket',\r\n      transports: ['websocket', 'polling'],\r\n      auth: {\r\n        token: token\r\n      },\r\n      reconnection: true,\r\n      reconnectionDelay: 1000,\r\n      reconnectionAttempts: 5,\r\n      reconnectionDelayMax: 5000\r\n    });\r\n    \r\n    this.setupEventHandlers(userId);\r\n  }\r\n  \r\n  /**\r\n   * Setup Socket.IO event handlers\r\n   */\r\n  private setupEventHandlers(userId?: string): void {\r\n    if (!this.socket) return;\r\n    \r\n    // Connection established\r\n    this.socket.on('connect', () => {\r\n      console.log('Socket.IO connected:', this.socket?.id);\r\n      this.connectionStatusSubject.next({\r\n        connected: true,\r\n        socketId: this.socket?.id,\r\n        userId: userId,\r\n        timestamp: new Date()\r\n      });\r\n    });\r\n    \r\n    // Connection confirmation\r\n    this.socket.on('connected', (data: { userId: string; socketId: string; timestamp: Date }) => {\r\n      console.log('Notification service connected:', data);\r\n      this.connectionStatusSubject.next({\r\n        connected: true,\r\n        socketId: data.socketId,\r\n        userId: data.userId,\r\n        timestamp: data.timestamp\r\n      });\r\n    });\r\n    \r\n    // Receive notification\r\n    this.socket.on('notification', (notification: NotificationPayload) => {\r\n      console.log('Received notification:', notification);\r\n      \r\n      // Add to notifications list\r\n      this.notifications.update(notifications => [notification, ...notifications]);\r\n      \r\n      // Add to unread list\r\n      this.unreadNotifications.update(unread => [notification, ...unread]);\r\n      \r\n      // Emit to subscribers\r\n      this.notificationSubject.next(notification);\r\n      \r\n      // Acknowledge receipt\r\n      this.acknowledgeNotification(notification.id);\r\n    });\r\n    \r\n    // Disconnect\r\n    this.socket.on('disconnect', (reason: string) => {\r\n      console.log('Socket.IO disconnected:', reason);\r\n      this.connectionStatusSubject.next({\r\n        connected: false,\r\n        timestamp: new Date()\r\n      });\r\n    });\r\n    \r\n    // Connection error\r\n    this.socket.on('connect_error', (error: Error) => {\r\n      console.error('Socket.IO connection error:', error);\r\n      this.connectionStatusSubject.next({\r\n        connected: false,\r\n        timestamp: new Date()\r\n      });\r\n    });\r\n  }\r\n  \r\n  /**\r\n   * Acknowledge notification receipt\r\n   */\r\n  acknowledgeNotification(notificationId: string): void {\r\n    if (this.socket?.connected) {\r\n      this.socket.emit('notification:ack', { notificationId });\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * Mark notification as read\r\n   */\r\n  markAsRead(notificationId: string): void {\r\n    if (this.socket?.connected) {\r\n      this.socket.emit('notification:read', { notificationId });\r\n      \r\n      // Remove from unread list\r\n      this.unreadNotifications.update(unread => \r\n        unread.filter(n => n.id !== notificationId)\r\n      );\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * Mark all as read\r\n   */\r\n  markAllAsRead(): void {\r\n    const unreadIds = this.unreadNotifications().map(n => n.id);\r\n    unreadIds.forEach(id => this.markAsRead(id));\r\n  }\r\n  \r\n  /**\r\n   * Disconnect from server\r\n   */\r\n  disconnect(): void {\r\n    if (this.socket) {\r\n      this.socket.disconnect();\r\n      this.socket = null;\r\n      this.connectionStatusSubject.next({\r\n        connected: false,\r\n        timestamp: new Date()\r\n      });\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * Clear all notifications\r\n   */\r\n  clearNotifications(): void {\r\n    this.notifications.set([]);\r\n    this.unreadNotifications.set([]);\r\n  }\r\n  \r\n  /**\r\n   * Remove notification from list\r\n   */\r\n  removeNotification(notificationId: string): void {\r\n    this.notifications.update(notifications => \r\n      notifications.filter(n => n.id !== notificationId)\r\n    );\r\n    this.unreadNotifications.update(unread => \r\n      unread.filter(n => n.id !== notificationId)\r\n    );\r\n  }\r\n  \r\n  ngOnDestroy(): void {\r\n    this.disconnect();\r\n    this.notificationSubject.complete();\r\n    this.connectionStatusSubject.complete();\r\n  }\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpEvent, HttpEventType, HttpProgressEvent, HttpRequest } from '@angular/common/http';\r\nimport { Observable, throwError, BehaviorSubject, of } from 'rxjs';\r\nimport { catchError, tap, map } from 'rxjs/operators';\r\nimport { \r\n  cidePath, \r\n  coreRoutesUrl, \r\n  generateStringFromObject, \r\n  hostManagerRoutesUrl\r\n} from 'cloud-ide-lms-model';\r\nimport {\r\n  ICoreFileManager,\r\n  IFileUploadRequest,\r\n  IFileUploadResponse,\r\n  IFileListRequest,\r\n  IFileListResponse,\r\n  IFileDeleteResponse,\r\n  IFileUpdateRequest,\r\n  IFileUpdateResponse,\r\n  IFileUploadProgress\r\n} from '../interfaces/core-file-manager.interface';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CideCoreFileManagerService {\r\n  private apiUrl = `${coreRoutesUrl?.fileManager}`;\r\n  private fileListSubject = new BehaviorSubject<ICoreFileManager[]>([]);\r\n  public fileList$ = this.fileListSubject.asObservable();\r\n\r\n  constructor(private http: HttpClient) {\r\n    console.log('CideCoreFileManagerService initialized - using real API');\r\n  }\r\n\r\n  /**\r\n   * Get file list from API\r\n   */\r\n  getFileList(body: IFileListRequest): Observable<IFileListResponse> {\r\n    const query = generateStringFromObject(body);\r\n    return this.http?.get<IFileListResponse>(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]))\r\n      .pipe(\r\n        tap((response: IFileListResponse) => {\r\n          if (response?.success) {\r\n            this.fileListSubject.next(response?.data || []);\r\n          }\r\n        }),\r\n        catchError(error => {\r\n          console.error('CideCoreFileManagerService API error:', error);\r\n          return this.handleError(error);\r\n        })\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Get file list using mock data (deprecated - use getFileList instead)\r\n   */\r\n  getFileListWithMockData(_body: IFileListRequest): Observable<IFileListResponse> {\r\n    console.warn('getFileListWithMockData is deprecated. Use getFileList instead.');\r\n    return this.getFileList(_body);\r\n  }\r\n\r\n  /**\r\n   * Get file list from cache (if available)\r\n   */\r\n  getFileListFromCache(): ICoreFileManager[] {\r\n    return this.fileListSubject.value;\r\n  }\r\n\r\n  /**\r\n   * Upload file with progress tracking\r\n   */\r\n  uploadFile(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\r\n    const formData = new FormData();\r\n    formData.append('file', request.file);\r\n    formData.append('altText', request.altText || '');\r\n    formData.append('tags', JSON.stringify(request.tags || []));\r\n    formData.append('permissions', JSON.stringify(request.permissions || []));\r\n    formData.append('userId', request.userId || '');\r\n\r\n    const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'upload']);\r\n    const req = new HttpRequest('POST', url, formData, {\r\n      reportProgress: true\r\n    });\r\n\r\n    return this.http.request<IFileUploadResponse>(req).pipe(\r\n      catchError(this.handleError)\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Upload file with progress tracking (mock version - deprecated)\r\n   */\r\n  uploadFileWithMockData(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\r\n    console.warn('uploadFileWithMockData is deprecated. Use uploadFile instead.');\r\n    return this.uploadFile(request);\r\n  }\r\n\r\n  /**\r\n   * Update file metadata\r\n   */\r\n  updateFile(request: IFileUpdateRequest): Observable<IFileUpdateResponse> {\r\n    console.log('Updating file:', request);\r\n    \r\n    const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager]);\r\n    return this.http.post<IFileUpdateResponse>(url, request)\r\n      .pipe(\r\n        tap((response: IFileUpdateResponse) => {\r\n          if (response.success) {\r\n            this.refreshFileList();\r\n          }\r\n        }),\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Delete file\r\n   */\r\n  deleteFile(id: string): Observable<IFileDeleteResponse> {\r\n    const payload = { cyfm_id: id };\r\n    const query = generateStringFromObject(payload);\r\n    const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n    return this.http.delete<IFileDeleteResponse>(url)\r\n      .pipe(\r\n        tap((response: IFileDeleteResponse) => {\r\n          if (response.success) {\r\n            this.refreshFileList();\r\n          }\r\n        }),\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Delete multiple files\r\n   */\r\n  deleteMultipleFiles(ids: string[]): Observable<{ success: boolean; message?: string; data?: unknown }> {\r\n    console.log('Deleting multiple files:', ids);\r\n    const payload = { ids };\r\n    const query = generateStringFromObject(payload);\r\n    const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n    return this.http.delete<{ success: boolean; message?: string; data?: unknown }>(url)\r\n      .pipe(\r\n        tap((response: { success: boolean; message?: string; data?: unknown }) => {\r\n          if (response.success) {\r\n            this.refreshFileList();\r\n          }\r\n        }),\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Toggle file active status\r\n   */\r\n  toggleFileStatus(id: string): Observable<IFileListResponse> {\r\n    console.log('Toggling file status:', id);\r\n    const payload = { id };\r\n    const query = generateStringFromObject(payload);\r\n    const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n    return this.http.put<IFileListResponse>(url, {})\r\n      .pipe(\r\n        tap((response: IFileListResponse) => {\r\n          if (response.success) {\r\n            this.refreshFileList();\r\n          }\r\n        }),\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Get file by ID\r\n   */\r\n  getFileById(id: string): Observable<{ success: boolean; message: string; data?: ICoreFileManager }> {\r\n    console.log('Getting file by ID:', id);\r\n    const payload = { cyfm_id: id };\r\n    const query = generateStringFromObject(payload);\r\n    const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'byId', query]);\r\n    return this.http.get<{ success: boolean; message: string; data?: ICoreFileManager }>(url)\r\n      .pipe(\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n\r\n  /**\r\n   * Find file by ID\r\n   */\r\n  findFileById(id: string, items: ICoreFileManager[] = this.fileListSubject.value): ICoreFileManager | null {\r\n    for (const item of items) {\r\n      if (item._id === id) {\r\n        return item;\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Get file size in human readable format\r\n   */\r\n  getFileSizeDisplay(bytes: number): string {\r\n    if (bytes === 0) return '0 Bytes';\r\n    const k = 1024;\r\n    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n  }\r\n\r\n  /**\r\n   * Get file type icon\r\n   */\r\n  getFileTypeIcon(fileType: string): string {\r\n    const typeMap: Record<string, string> = {\r\n      'image/jpeg': 'image',\r\n      'image/png': 'image',\r\n      'image/gif': 'image',\r\n      'image/svg+xml': 'image',\r\n      'application/pdf': 'picture_as_pdf',\r\n      'text/plain': 'description',\r\n      'text/html': 'code',\r\n      'application/json': 'code',\r\n      'application/javascript': 'code',\r\n      'text/css': 'code',\r\n      'application/zip': 'folder_zip',\r\n      'application/x-zip-compressed': 'folder_zip',\r\n      'application/msword': 'description',\r\n      'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'description',\r\n      'application/vnd.ms-excel': 'table_chart',\r\n      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'table_chart',\r\n      'application/vnd.ms-powerpoint': 'slideshow',\r\n      'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'slideshow'\r\n    };\r\n    return typeMap[fileType] || 'insert_drive_file';\r\n  }\r\n\r\n  /**\r\n   * Refresh file list from server\r\n   */\r\n  private refreshFileList(): void {\r\n    const defaultBody: IFileListRequest = {\r\n      pageIndex: 1,\r\n      pageSize: 10\r\n    };\r\n    this.getFileList(defaultBody).subscribe({\r\n      next: () => {\r\n        console.log('File list refreshed successfully');\r\n      },\r\n      error: (error) => {\r\n        console.error('Error refreshing file list:', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Handle errors\r\n   */\r\n  private handleError(error: unknown): Observable<never> {\r\n    let errorMessage = 'An error occurred';\r\n\r\n    if (error instanceof Error) {\r\n      errorMessage = error.message;\r\n    } else if (typeof error === 'string') {\r\n      errorMessage = error;\r\n    }\r\n\r\n    console.error('CideCoreFileManagerService Error:', errorMessage);\r\n    return throwError(() => new Error(errorMessage));\r\n  }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport interface DropdownInstance {\r\n  id: string;\r\n  close: () => void;\r\n  element?: Element;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class DropdownManagerService {\r\n  private activeDropdowns = signal<Map<string, DropdownInstance>>(new Map());\r\n  private documentClickListener?: (event: Event) => void;\r\n  private escapeKeyListener?: (event: KeyboardEvent) => void;\r\n\r\n  constructor() {\r\n    this.initializeGlobalListeners();\r\n  }\r\n\r\n  private initializeGlobalListeners(): void {\r\n    // Global document click listener\r\n    this.documentClickListener = (event: Event) => {\r\n      this.handleDocumentClick(event);\r\n    };\r\n\r\n    // Global escape key listener\r\n    this.escapeKeyListener = (event: KeyboardEvent) => {\r\n      if (event.key === 'Escape') {\r\n        this.closeAllDropdowns();\r\n      }\r\n    };\r\n\r\n    // Add listeners\r\n    document.addEventListener('click', this.documentClickListener, true);\r\n    document.addEventListener('keydown', this.escapeKeyListener, true);\r\n  }\r\n\r\n  registerDropdown(dropdown: DropdownInstance): void {\r\n    // Close any existing dropdowns before opening a new one\r\n    this.closeAllDropdowns();\r\n    \r\n    this.activeDropdowns.update(map => {\r\n      const newMap = new Map(map);\r\n      newMap.set(dropdown.id, dropdown);\r\n      return newMap;\r\n    });\r\n  }\r\n\r\n  unregisterDropdown(id: string): void {\r\n    this.activeDropdowns.update(map => {\r\n      const newMap = new Map(map);\r\n      newMap.delete(id);\r\n      return newMap;\r\n    });\r\n  }\r\n\r\n  closeAllDropdowns(): void {\r\n    const dropdowns = this.activeDropdowns();\r\n    dropdowns.forEach(dropdown => {\r\n      dropdown.close();\r\n    });\r\n    this.activeDropdowns.set(new Map());\r\n  }\r\n\r\n  closeDropdown(id: string): void {\r\n    const dropdowns = this.activeDropdowns();\r\n    const dropdown = dropdowns.get(id);\r\n    if (dropdown) {\r\n      dropdown.close();\r\n      this.unregisterDropdown(id);\r\n    }\r\n  }\r\n\r\n  isDropdownOpen(id: string): boolean {\r\n    return this.activeDropdowns().has(id);\r\n  }\r\n\r\n  private handleDocumentClick(event: Event): void {\r\n    const dropdowns = this.activeDropdowns();\r\n    \r\n    if (dropdowns.size === 0) {\r\n      return;\r\n    }\r\n\r\n    // Check if click is inside any open dropdown\r\n    const target = event.target as Element;\r\n    let isClickInsideDropdown = false;\r\n\r\n    dropdowns.forEach(dropdown => {\r\n      if (dropdown.element && dropdown.element.contains(target)) {\r\n        isClickInsideDropdown = true;\r\n      }\r\n    });\r\n\r\n    // If click is outside all dropdowns, close them\r\n    if (!isClickInsideDropdown) {\r\n      this.closeAllDropdowns();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Clean up global listeners\r\n    if (this.documentClickListener) {\r\n      document.removeEventListener('click', this.documentClickListener, true);\r\n    }\r\n    if (this.escapeKeyListener) {\r\n      document.removeEventListener('keydown', this.escapeKeyListener, true);\r\n    }\r\n  }\r\n}\r\n","import { Injectable, OnDestroy } from '@angular/core';\n\nexport interface KeyboardShortcut {\n  id: string;\n  key: string;\n  ctrlKey?: boolean;\n  altKey?: boolean;\n  shiftKey?: boolean;\n  metaKey?: boolean;\n  description?: string;\n  title?: string; // Display title for the shortcut\n  featuredHTML?: string; // HTML content to display in shortcuts panel (sanitized)\n  category?: string; // Category for grouping shortcuts (e.g., 'navigation', 'editing', 'system')\n  isUserDefined?: boolean; // Whether this is a user-defined shortcut or system-defined\n  action: () => void;\n  preventDefault?: boolean;\n  stopPropagation?: boolean;\n}\n\nexport interface ShortcutOverride {\n  shortcutId: string;\n  newKey: string;\n  newCtrlKey?: boolean;\n  newAltKey?: boolean;\n  newShiftKey?: boolean;\n  newMetaKey?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class KeyboardShortcutService implements OnDestroy {\n  private shortcuts = new Map<string, KeyboardShortcut>();\n  private overrides = new Map<string, ShortcutOverride>();\n  private keydownListener?: (event: KeyboardEvent) => void;\n\n  constructor() {\n    this.setupGlobalListener();\n  }\n\n  ngOnDestroy(): void {\n    this.removeGlobalListener();\n  }\n\n  /**\n   * Register a new keyboard shortcut\n   */\n  register(shortcut: KeyboardShortcut): void {\n    this.shortcuts.set(shortcut.id, shortcut);\n    console.log(`⌨️ [KeyboardShortcut] Registered shortcut: ${shortcut.id} (${this.getKeyDescription(shortcut)})`);\n  }\n\n  /**\n   * Override an existing shortcut with new key combination\n   */\n  override(shortcutId: string, newKey: string, options?: {\n    ctrlKey?: boolean;\n    altKey?: boolean;\n    shiftKey?: boolean;\n    metaKey?: boolean;\n  }): void {\n    const originalShortcut = this.shortcuts.get(shortcutId);\n    if (!originalShortcut) {\n      console.warn(`⚠️ [KeyboardShortcut] Cannot override shortcut '${shortcutId}' - not found`);\n      return;\n    }\n\n    const override: ShortcutOverride = {\n      shortcutId,\n      newKey,\n      newCtrlKey: options?.ctrlKey,\n      newAltKey: options?.altKey,\n      newShiftKey: options?.shiftKey,\n      newMetaKey: options?.metaKey\n    };\n\n    this.overrides.set(shortcutId, override);\n    console.log(`🔄 [KeyboardShortcut] Override registered for '${shortcutId}': ${this.getKeyDescription({ ...originalShortcut, ...options, key: newKey })}`);\n  }\n\n  /**\n   * Remove a shortcut\n   */\n  unregister(shortcutId: string): void {\n    this.shortcuts.delete(shortcutId);\n    this.overrides.delete(shortcutId);\n    console.log(`🗑️ [KeyboardShortcut] Removed shortcut: ${shortcutId}`);\n  }\n\n  /**\n   * Remove override for a shortcut (restore original key combination)\n   */\n  removeOverride(shortcutId: string): void {\n    this.overrides.delete(shortcutId);\n    console.log(`🔄 [KeyboardShortcut] Override removed for: ${shortcutId}`);\n  }\n\n  /**\n   * Get all registered shortcuts\n   */\n  getAllShortcuts(): KeyboardShortcut[] {\n    return Array.from(this.shortcuts.values());\n  }\n\n  /**\n   * Get shortcuts by category or filter\n   */\n  getShortcuts(filter?: (shortcut: KeyboardShortcut) => boolean): KeyboardShortcut[] {\n    const shortcuts = this.getAllShortcuts();\n    return filter ? shortcuts.filter(filter) : shortcuts;\n  }\n\n  /**\n   * Check if a shortcut is registered\n   */\n  hasShortcut(shortcutId: string): boolean {\n    return this.shortcuts.has(shortcutId);\n  }\n\n  /**\n   * Get shortcut information\n   */\n  getShortcut(shortcutId: string): KeyboardShortcut | undefined {\n    return this.shortcuts.get(shortcutId);\n  }\n\n  /**\n   * Clear all shortcuts\n   */\n  clearAll(): void {\n    this.shortcuts.clear();\n    this.overrides.clear();\n    console.log(`🧹 [KeyboardShortcut] All shortcuts cleared`);\n  }\n\n  /**\n   * Set up global keyboard listener\n   */\n  private setupGlobalListener(): void {\n    this.keydownListener = (event: KeyboardEvent) => {\n      this.handleKeydown(event);\n    };\n    \n    document.addEventListener('keydown', this.keydownListener);\n    console.log(`🎧 [KeyboardShortcut] Global keyboard listener attached`);\n  }\n\n  /**\n   * Remove global keyboard listener\n   */\n  private removeGlobalListener(): void {\n    if (this.keydownListener) {\n      document.removeEventListener('keydown', this.keydownListener);\n      this.keydownListener = undefined;\n      console.log(`🎧 [KeyboardShortcut] Global keyboard listener removed`);\n    }\n  }\n\n  /**\n   * Handle keydown events\n   */\n  private handleKeydown(event: KeyboardEvent): void {\n    for (const [shortcutId, shortcut] of this.shortcuts) {\n      if (this.matchesShortcut(event, shortcut)) {\n        // Check for override\n        const override = this.overrides.get(shortcutId);\n        if (override && !this.matchesOverride(event, override)) {\n          continue; // Skip if override doesn't match\n        }\n\n        if (shortcut.preventDefault !== false) {\n          event.preventDefault();\n        }\n\n        if (shortcut.stopPropagation) {\n          event.stopPropagation();\n        }\n\n        console.log(`⌨️ [KeyboardShortcut] Executing shortcut: ${shortcutId}`);\n        shortcut.action();\n        break; // Only execute one shortcut per keydown\n      }\n    }\n  }\n\n  /**\n   * Check if event matches shortcut\n   */\n  private matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\n    return event.key === shortcut.key &&\n           (shortcut.ctrlKey === undefined || event.ctrlKey === shortcut.ctrlKey) &&\n           (shortcut.altKey === undefined || event.altKey === shortcut.altKey) &&\n           (shortcut.shiftKey === undefined || event.shiftKey === shortcut.shiftKey) &&\n           (shortcut.metaKey === undefined || event.metaKey === shortcut.metaKey);\n  }\n\n  /**\n   * Check if event matches override\n   */\n  private matchesOverride(event: KeyboardEvent, override: ShortcutOverride): boolean {\n    return event.key === override.newKey &&\n           (override.newCtrlKey === undefined || event.ctrlKey === override.newCtrlKey) &&\n           (override.newAltKey === undefined || event.altKey === override.newAltKey) &&\n           (override.newShiftKey === undefined || event.shiftKey === override.newShiftKey) &&\n           (override.newMetaKey === undefined || event.metaKey === override.newMetaKey);\n  }\n\n  /**\n   * Get human-readable key description\n   */\n  private getKeyDescription(shortcut: Partial<KeyboardShortcut>): string {\n    const modifiers = [];\n    if (shortcut.ctrlKey) modifiers.push('Ctrl');\n    if (shortcut.altKey) modifiers.push('Alt');\n    if (shortcut.shiftKey) modifiers.push('Shift');\n    if (shortcut.metaKey) modifiers.push('Meta');\n    \n    return [...modifiers, shortcut.key].join(' + ');\n  }\n\n  /**\n   * Get key description for a shortcut ID\n   */\n  getKeyDescriptionForShortcut(shortcutId: string): string {\n    const shortcut = this.shortcuts.get(shortcutId);\n    if (!shortcut) return 'Not found';\n    \n    const override = this.overrides.get(shortcutId);\n    if (override) {\n      return this.getKeyDescription({\n        key: override.newKey,\n        ctrlKey: override.newCtrlKey,\n        altKey: override.newAltKey,\n        shiftKey: override.newShiftKey,\n        metaKey: override.newMetaKey\n      });\n    }\n    \n    return this.getKeyDescription(shortcut);\n  }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n","import {\n  Injectable,\n  signal,\n  computed,\n  type TemplateRef,\n  type OnDestroy\n} from '@angular/core';\n\nexport interface ConfirmationRequest<T = unknown> {\n  id: string;\n  title: string;\n  message: string;\n  type: 'danger' | 'warning' | 'info' | 'success';\n  icon?: string;\n  confirmText?: string;\n  cancelText?: string;\n  customTemplate?: TemplateRef<unknown>;\n  customData?: T;\n  showInput?: boolean;\n  inputLabel?: string;\n  inputPlaceholder?: string;\n  inputRequired?: boolean;\n  inputValue?: string;\n  isHtml?: boolean;\n  resolve: (value: boolean | string | T) => void;\n  reject: (reason?: unknown) => void;\n}\n\nexport interface ConfirmationOptions<T = unknown> {\n  title: string;\n  message: string;\n  type?: 'danger' | 'warning' | 'info' | 'success';\n  icon?: string;\n  confirmText?: string;\n  cancelText?: string;\n  isHtml?: boolean;\n  customTemplate?: TemplateRef<unknown>;\n  customData?: T;\n  showInput?: boolean;\n  inputLabel?: string;\n  inputPlaceholder?: string;\n  inputRequired?: boolean;\n  inputValue?: string;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ConfirmationService implements OnDestroy {\n  // Modern signal-based state management\n  private readonly confirmationQueue = signal<ConfirmationRequest<unknown>[]>([]);\n  private readonly currentRequest = signal<ConfirmationRequest<unknown> | null>(null);\n\n  // Modern computed signals with proper typing\n  readonly hasActiveConfirmation = computed((): boolean => this.currentRequest() !== null);\n  readonly queueLength = computed((): number => this.confirmationQueue().length);\n\n  constructor() {\n    // Modern service initialization\n  }\n\n  ngOnDestroy(): void {\n    // Cleanup if needed\n  }\n\n  /**\n   * Ask for confirmation with a simple yes/no dialog\n   */\n  ask(options: ConfirmationOptions<unknown>): Promise<boolean | string> {\n    console.log('🔔 ConfirmationService.ask called with options:', options);\n    return new Promise<boolean | string>((resolve, reject) => {\n      const request: ConfirmationRequest<unknown> = {\n        id: this.generateId(),\n        title: options.title,\n        message: options.message,\n        type: options.type || 'warning',\n        icon: options.icon || this.getDefaultIcon(options.type || 'warning'),\n        confirmText: options.confirmText || 'Confirm',\n        cancelText: options.cancelText || 'Cancel',\n        showInput: options.showInput || false,\n        inputLabel: options.inputLabel || '',\n        inputPlaceholder: options.inputPlaceholder || '',\n        inputRequired: options.inputRequired || false,\n        inputValue: options.inputValue || '',\n        isHtml: options.isHtml || false,\n        resolve: (value: boolean | string | unknown) => resolve(value as boolean | string),\n        reject\n      };\n      console.log('🔽 Ask for confirmation', request);\n      this.addToQueue(request);\n    });\n  }\n\n  /**\n   * Ask for confirmation with custom template and return custom data\n   */\n  askWithTemplate<T = unknown>(options: ConfirmationOptions<T> & { customTemplate: TemplateRef<unknown> }): Promise<T> {\n    return new Promise<T>((resolve, reject) => {\n      const request: ConfirmationRequest<T> = {\n        id: this.generateId(),\n        title: options.title,\n        message: options.message,\n        type: options.type || 'info',\n        icon: options.icon || this.getDefaultIcon(options.type || 'info'),\n        confirmText: options.confirmText || 'Confirm',\n        cancelText: options.cancelText || 'Cancel',\n        customTemplate: options.customTemplate,\n        customData: options.customData,\n        resolve: (value: boolean | string | T) => resolve(value as T),\n        reject\n      };\n\n      // Cast to unknown for queue compatibility\n      this.addToQueue(request as ConfirmationRequest<unknown>);\n    });\n  }\n\n  /**\n   * Quick confirmation for dangerous actions\n   */\n  confirmDelete(itemName?: string): Promise<boolean | string> {\n    return this.ask({\n      title: 'Confirm Delete',\n      message: itemName ? `Are you sure you want to delete \"${itemName}\"? This action cannot be undone.` : 'Are you sure you want to delete this item? This action cannot be undone.',\n      type: 'danger',\n      icon: 'delete_forever',\n      confirmText: 'Delete',\n      cancelText: 'Cancel'\n    });\n  }\n\n  /**\n   * Quick confirmation for permanent actions\n   */\n  confirmPermanentAction(action: string, itemName?: string): Promise<boolean | string> {\n    return this.ask({\n      title: `Confirm ${action}`,\n      message: itemName ? `Are you sure you want to ${action.toLowerCase()} \"${itemName}\"? This action cannot be undone.` : `Are you sure you want to ${action.toLowerCase()}? This action cannot be undone.`,\n      type: 'danger',\n      icon: 'warning',\n      confirmText: action,\n      cancelText: 'Cancel'\n    });\n  }\n\n  /**\n   * Quick confirmation for safe actions\n   */\n  confirmSafeAction(action: string, itemName?: string): Promise<boolean | string> {\n    return this.ask({\n      title: `Confirm ${action}`,\n      message: itemName ? `Are you sure you want to ${action.toLowerCase()} \"${itemName}\"?` : `Are you sure you want to ${action.toLowerCase()}?`,\n      type: 'info',\n      icon: 'info',\n      confirmText: action,\n      cancelText: 'Cancel'\n    });\n  }\n\n  // Modern private methods with proper typing\n  private addToQueue(request: ConfirmationRequest<unknown>): void {\n    this.confirmationQueue.update(queue => [...queue, request]);\n    console.log('🔔 Added request to queue:', request);\n    this.processQueue();\n  }\n\n  private processQueue(): void {\n    console.log('🔔 Processing queue. Current request:', this.currentRequest(), 'Queue length:', this.confirmationQueue().length);\n    if (this.currentRequest() || this.confirmationQueue().length === 0) {\n      return;\n    }\n\n    const nextRequest = this.confirmationQueue()[0];\n    console.log('🔔 Setting current request:', nextRequest);\n    this.currentRequest.set(nextRequest);\n  }\n\n  // Modern public methods with proper typing\n  confirmCurrentRequest(data?: unknown): void {\n    const request = this.currentRequest();\n    if (!request) return;\n\n    // Always resolve with true for confirmation, unless custom data is explicitly provided\n    const resolvedValue = data !== undefined ? data : true;\n    console.log('🔔 Confirming request with value:', resolvedValue);\n    request.resolve(resolvedValue);\n    this.removeCurrentRequest();\n  }\n\n  cancelCurrentRequest(): void {\n    const request = this.currentRequest();\n    if (!request) return;\n\n    request.reject(new Error('User cancelled'));\n    this.removeCurrentRequest();\n  }\n\n  private removeCurrentRequest(): void {\n    this.confirmationQueue.update(queue => queue.slice(1));\n    this.currentRequest.set(null);\n\n    // Process next request if any\n    setTimeout(() => this.processQueue(), 100);\n  }\n\n  private generateId(): string {\n    return `confirmation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  // Modern private utility method with proper typing\n  private getDefaultIcon(type: 'danger' | 'warning' | 'info' | 'success'): string {\n    const iconMap: Record<string, string> = {\n      danger: 'error',\n      warning: 'warning',\n      info: 'info',\n      success: 'done'\n    };\n    return iconMap[type];\n  }\n\n  // Modern public getters with proper typing\n  getCurrentRequest() {\n    return this.currentRequest;\n  }\n\n  getHasActiveConfirmation() {\n    return this.hasActiveConfirmation;\n  }\n}\n","import { InjectionToken, Type } from '@angular/core';\n\n/**\n * Injection token for the \"open AI assistant\" action (e.g. Alt+A shortcut).\n * Provide in app to toggle AI in sidedrawer.\n */\nexport const OPEN_AI_ASSISTANT_ACTION = new InjectionToken<() => void>('OPEN_AI_ASSISTANT_ACTION');\n\n/**\n * Injection token for the AI drawer component.\n * Provide the component Type (e.g. AiDrawerComponent) in the app so that layout\n * can render it without importing the AI package (avoids circular dependencies).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const CIDE_AI_DRAWER_COMPONENT = new InjectionToken<Type<any>>('CIDE_AI_DRAWER_COMPONENT');\n\n","import { Directive, ElementRef, Input, OnInit, OnDestroy, OnChanges, SimpleChanges, inject, DestroyRef } from '@angular/core';\r\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { fileManagerControllerResponse } from '../../interfaces/core-file-manager.interface';\r\n\r\n/**\r\n * Directive to display images from file manager by ID\r\n * Usage: <img cideEleFileImage [fileId]=\"yourFileId\" [altText]=\"'Image'\" class=\"your-css-classes\" />\r\n */\r\n@Directive({\r\n  selector: '[cideEleFileImage]',\r\n  standalone: true\r\n})\r\nexport class CideEleFileImageDirective implements OnInit, OnDestroy, OnChanges {\r\n  @Input() fileId: string | null = null;\r\n  @Input() altText: string = 'Image';\r\n\r\n  private readonly fileManagerService = inject(CideEleFileManagerService);\r\n  private readonly elementRef = inject(ElementRef);\r\n  private readonly destroyRef = inject(DestroyRef);\r\n  private previousFileId: string | null = null;\r\n\r\n  ngOnInit(): void {\r\n    this.loadImage();\r\n    this.previousFileId = this.fileId;\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Check if fileId has changed\r\n    if (changes['fileId'] && !changes['fileId'].firstChange) {\r\n      const currentFileId = changes['fileId'].currentValue;\r\n      const previousFileId = changes['fileId'].previousValue;\r\n      \r\n      // Only reload if the fileId actually changed\r\n      if (currentFileId !== previousFileId) {\r\n        console.log('🔄 [FileImageDirective] File ID changed from', previousFileId, 'to', currentFileId);\r\n        this.previousFileId = currentFileId;\r\n        \r\n        // If fileId is null or empty, clear the image\r\n        if (!currentFileId || currentFileId.trim() === '') {\r\n          this.clearImage();\r\n        } else {\r\n          // Load the new image\r\n          this.loadImage();\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    // Cleanup handled by takeUntilDestroyed\r\n  }\r\n\r\n  private loadImage(): void {\r\n    if (!this.fileId || this.fileId.trim() === '') {\r\n      this.clearImage();\r\n      return;\r\n    }\r\n\r\n    console.log('🖼️ [FileImageDirective] Loading image for ID:', this.fileId);\r\n\r\n    this.fileManagerService.getFileDetails({ cyfm_id: this.fileId }).pipe(\r\n      takeUntilDestroyed(this.destroyRef)\r\n    ).subscribe({\r\n      next: (fileDetails: fileManagerControllerResponse) => {\r\n        console.log('📋 [FileImageDirective] File details received:', fileDetails);\r\n        \r\n        if (fileDetails?.data?.length) {\r\n          const fileData = fileDetails.data[0];\r\n          this.displayImage(fileData);\r\n        } else {\r\n          console.warn('⚠️ [FileImageDirective] No file data found for ID:', this.fileId);\r\n          this.clearImage();\r\n        }\r\n      },\r\n      error: (error: any) => {\r\n        console.error('❌ [FileImageDirective] Error loading file details:', error);\r\n        this.clearImage();\r\n      }\r\n    });\r\n  }\r\n\r\n  private clearImage(): void {\r\n    const imgElement = this.elementRef.nativeElement as HTMLImageElement;\r\n    imgElement.src = '';\r\n    imgElement.alt = this.altText;\r\n    console.log('🧹 [FileImageDirective] Image cleared');\r\n  }\r\n\r\n  private displayImage(fileData: any): void {\r\n    const imgElement = this.elementRef.nativeElement as HTMLImageElement;\r\n    \r\n    // Use base64 data directly\r\n    if (fileData.cyfm_file_base64) {\r\n      let base64Data = fileData.cyfm_file_base64;\r\n      if (!base64Data.startsWith('data:')) {\r\n        const mimeType = fileData.cyfm_type || 'image/jpeg';\r\n        base64Data = `data:${mimeType};base64,${base64Data}`;\r\n      }\r\n      imgElement.src = base64Data;\r\n      imgElement.alt = fileData.cyfm_alt_text || this.altText;\r\n      console.log('✅ [FileImageDirective] Image loaded from base64 data');\r\n    } else {\r\n      console.warn('⚠️ [FileImageDirective] No base64 data available for file');\r\n    }\r\n  }\r\n\r\n}","import { Component, Input, inject, signal, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\r\n\r\n@Component({\r\n  selector: 'cide-form-field-error',\r\n  standalone: true,\r\n  template: `\r\n    @if (isFormGroupMode()) {\r\n      <!-- Form Group Error Display -->\r\n      @if (formErrors().length > 0) {\r\n        <div class=\"tw-flex tw-items-center tw-gap-2 tw-text-red-600 tw-text-sm\">\r\n          <cide-ele-icon class=\"tw-text-red-500\">error</cide-ele-icon>\r\n          <span>{{ getFormGroupErrorMessage() }}</span>\r\n        </div>\r\n      }\r\n    } @else {\r\n      <!-- Individual Field Error Display -->\r\n      @if (control && control.invalid && (control.dirty || control.touched)) {\r\n        <div class=\"tw-text-red-500 tw-text-xs tw-mt-1 tw-flex tw-items-center tw-gap-1\">\r\n          <cide-ele-icon class=\"tw-text-xs\">error</cide-ele-icon>\r\n          <span>{{ getErrorMessage() }}</span>\r\n        </div>\r\n      }\r\n    }\r\n  `,\r\n  imports: [CideIconComponent]\r\n})\r\nexport class CideFormFieldErrorComponent implements OnInit, OnChanges {\r\n  @Input() control!: AbstractControl;\r\n  @Input() formGroup!: FormGroup;\r\n  @Input() fieldName: string = '';\r\n  @Input() customMessages: { [key: string]: string } = {};\r\n\r\n  // Map to store field labels for efficient lookup\r\n  private fieldLabelsMap = new Map<string, string>();\r\n  \r\n  // Inject the element service\r\n  private elementService = inject(CideElementsService);\r\n  \r\n  // Signal to hold form errors\r\n  formErrors = signal<string[]>([]);\r\n\r\n  ngOnInit(): void {\r\n    if (this.isFormGroupMode()) {\r\n      this.loadFormErrors();\r\n      this.setupFormChangeListener();\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['formGroup'] && this.isFormGroupMode()) {\r\n      this.loadFormErrors();\r\n      this.setupFormChangeListener();\r\n    }\r\n  }\r\n\r\n  private setupFormChangeListener(): void {\r\n    if (this.formGroup) {\r\n      // Listen to form value changes to update errors\r\n      this.formGroup.valueChanges.subscribe(() => {\r\n        this.updateFormErrors();\r\n      });\r\n      \r\n      // Listen to form status changes\r\n      this.formGroup.statusChanges.subscribe(() => {\r\n        this.updateFormErrors();\r\n      });\r\n    }\r\n  }\r\n\r\n  private updateFormErrors(): void {\r\n    if (this.isFormGroupMode()) {\r\n      this.loadFormErrors();\r\n    }\r\n  }\r\n\r\n  private loadFormErrors(): void {\r\n    this.getFormGroupErrors().then(errors => {\r\n      this.formErrors.set(errors);\r\n    });\r\n  }\r\n\r\n  isFormGroupMode(): boolean {\r\n    return !!this.formGroup && !this.control;\r\n  }\r\n\r\n  getFormGroupErrors(): Promise<string[]> {\r\n    if (!this.formGroup) return Promise.resolve([]);\r\n    \r\n    return this.buildFieldLabelsMap().then(() => {\r\n      const errors: string[] = [];\r\n      \r\n      Object.keys(this.formGroup.controls).forEach(key => {\r\n        const control = this.formGroup.get(key);\r\n        \r\n        if (control && control.invalid) {\r\n          const errorMessage = this.getControlErrorMessage(control, key);\r\n          if (errorMessage) {\r\n            errors.push(errorMessage);\r\n          }\r\n        }\r\n      });\r\n      \r\n      return errors;\r\n    });\r\n  }\r\n\r\n  private buildFieldLabelsMap(): Promise<void> {\r\n    if (this.fieldLabelsMap.size > 0) return Promise.resolve(); // Already built\r\n    \r\n    const promises = Object.keys(this.formGroup.controls).map(key => {\r\n      return this.elementService?.getElementData({ sype_key: key }).then(elementData => {\r\n        if (elementData?.sype_label) {\r\n          this.fieldLabelsMap.set(key, elementData.sype_label as string);\r\n        }\r\n      }).catch(error => {\r\n        // Silently handle errors - element data might not be available for all fields\r\n      });\r\n    });\r\n    \r\n    return Promise.all(promises).then(() => {\r\n      // All promises completed\r\n    });\r\n  }\r\n\r\n\r\n  getFormGroupErrorMessage(): string {\r\n    const errors = this.formErrors();\r\n    if (errors.length === 0) return '';\r\n    \r\n    if (errors.length === 1) {\r\n      return errors[0];\r\n    }\r\n    \r\n    return `Please fix the following errors: ${errors.join(', ')}`;\r\n  }\r\n\r\n  getControlErrorMessage(control: AbstractControl, fieldName: string): string {\r\n    if (!control || !control.errors) {\r\n      return '';\r\n    }\r\n\r\n    const errors = control.errors;\r\n    \r\n    // Get display name from map first, fallback to conversion\r\n    const displayName = this.fieldLabelsMap.get(fieldName) || this.convertToDisplayName(fieldName);\r\n    \r\n    // Check for custom messages first\r\n    for (const errorType in errors) {\r\n      if (this.customMessages[errorType]) {\r\n        return this.customMessages[errorType];\r\n      }\r\n    }\r\n\r\n    // Default error messages\r\n    if (errors['required']) {\r\n      return `${displayName} is required`;\r\n    }\r\n    \r\n    if (errors['email']) {\r\n      return `${displayName} must be a valid email address`;\r\n    }\r\n    \r\n    if (errors['minlength']) {\r\n      return `${displayName} must be at least ${errors['minlength'].requiredLength} characters`;\r\n    }\r\n    \r\n    if (errors['maxlength']) {\r\n      return `${displayName} must not exceed ${errors['maxlength'].requiredLength} characters`;\r\n    }\r\n    \r\n    if (errors['pattern']) {\r\n      return `${displayName} format is invalid`;\r\n    }\r\n\r\n    // Fallback to first error\r\n    const firstError = Object.keys(errors)[0];\r\n    return `${displayName} is invalid`;\r\n  }\r\n\r\n  getErrorMessage(): string {\r\n    if (!this.control || !this.control.errors) {\r\n      return '';\r\n    }\r\n\r\n    const errors = this.control.errors;\r\n    \r\n    // Check for custom messages first\r\n    for (const errorType in errors) {\r\n      if (this.customMessages[errorType]) {\r\n        return this.customMessages[errorType];\r\n      }\r\n    }\r\n\r\n    // Default error messages\r\n    if (errors['required']) {\r\n      return `${this.getFieldDisplayName()} is required`;\r\n    }\r\n    \r\n    if (errors['email']) {\r\n      return `${this.getFieldDisplayName()} must be a valid email address`;\r\n    }\r\n    \r\n    if (errors['minlength']) {\r\n      return `${this.getFieldDisplayName()} must be at least ${errors['minlength'].requiredLength} characters`;\r\n    }\r\n    \r\n    if (errors['maxlength']) {\r\n      return `${this.getFieldDisplayName()} must not exceed ${errors['maxlength'].requiredLength} characters`;\r\n    }\r\n    \r\n    if (errors['pattern']) {\r\n      return `${this.getFieldDisplayName()} format is invalid`;\r\n    }\r\n\r\n    // Fallback to first error\r\n    const firstError = Object.keys(errors)[0];\r\n    return `${this.getFieldDisplayName()} is invalid`;\r\n  }\r\n\r\n  private getFieldDisplayName(): string {\r\n    if (this.fieldName) {\r\n      return this.fieldName;\r\n    }\r\n    \r\n    // Convert field name to display name\r\n    if (this.control && this.control.parent) {\r\n      const fieldName = Object.keys(this.control.parent.controls).find(\r\n        key => this.control.parent!.get(key) === this.control\r\n      );\r\n      \r\n      if (fieldName) {\r\n        return this.convertToDisplayName(fieldName);\r\n      }\r\n    }\r\n    \r\n    return 'This field';\r\n  }\r\n\r\n  private convertToDisplayName(fieldName: string): string {\r\n    // Convert snake_case to Title Case\r\n    return fieldName\r\n      .split('_')\r\n      .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n      .join(' ');\r\n  }\r\n}\r\n","import {\n  Component,\n  signal,\n  computed,\n  inject,\n  type OnInit,\n  type OnDestroy\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { ConfirmationService } from '../../services/confirmation.service';\n\n// Types\ninterface ConfirmationRequest {\n  id: string;\n  title: string;\n  message: string;\n  type: 'danger' | 'warning' | 'info' | 'success';\n  icon?: string;\n  confirmText?: string;\n  cancelText?: string;\n  customTemplate?: any;\n  customData?: unknown;\n  showInput?: boolean;\n  inputLabel?: string;\n  inputPlaceholder?: string;\n  inputRequired?: boolean;\n  inputValue?: string;\n  isHtml?: boolean;\n  resolve: (value: boolean | unknown) => void;\n  reject: (reason?: unknown) => void;\n}\n\n@Component({\n  selector: 'cide-ele-confirmation-modal',\n  standalone: true,\n  imports: [CommonModule, CideIconComponent, FormsModule],\n  template: `\n    <!-- Backdrop -->\n    <div \n      *ngIf=\"hasActiveConfirmation()\"\n      class=\"confirmation-backdrop\"\n      (click)=\"onBackdropClick($event)\">\n    </div>\n\n    <!-- Modal -->\n    <div \n      *ngIf=\"hasActiveConfirmation()\"\n      class=\"confirmation-modal\">\n      \n      <!-- Modal Header -->\n      <div class=\"modal-header\" [class]=\"getHeaderClass()\">\n        <div class=\"header-content\">\n          <div class=\"icon-container\" [class]=\"getIconClass()\">\n            <cide-ele-icon \n              size=\"lg\">\n              {{ currentRequest()?.icon || 'info' }}\n            </cide-ele-icon>\n          </div>\n          <h2 class=\"modal-title\">{{ currentRequest()?.title }}</h2>\n        </div>\n      </div>\n\n      <!-- Modal Body -->\n      <div class=\"modal-body\">\n        <p *ngIf=\"!currentRequest()?.isHtml\" class=\"modal-message\">{{ currentRequest()?.message }}</p>\n        <p *ngIf=\"currentRequest()?.isHtml\" class=\"modal-message\" [innerHTML]=\"currentRequest()?.message\"></p>\n        \n        <!-- Prompt Input -->\n        <div *ngIf=\"currentRequest()?.showInput\" class=\"prompt-input-container\">\n          <label *ngIf=\"currentRequest()?.inputLabel\" class=\"prompt-label\">\n            {{ currentRequest()?.inputLabel }}\n            <span *ngIf=\"currentRequest()?.inputRequired\" class=\"tw-text-red-500\">*</span>\n          </label>\n          <input \n            type=\"text\" \n            class=\"prompt-input\" \n            [placeholder]=\"currentRequest()?.inputPlaceholder || ''\"\n            [(ngModel)]=\"promptValue\"\n            (keyup.enter)=\"onConfirm()\">\n        </div>\n\n        <!-- Custom Template Slot -->\n        <div *ngIf=\"currentRequest()?.customTemplate\" class=\"custom-content\">\n          <ng-container \n            *ngTemplateOutlet=\"currentRequest()?.customTemplate!; context: { $implicit: customData }\">\n          </ng-container>\n        </div>\n      </div>\n\n      <!-- Modal Footer -->\n      <div class=\"modal-footer\">\n        <button \n          type=\"button\"\n          class=\"btn btn-secondary\"\n          (click)=\"onCancel()\">\n          {{ currentRequest()?.cancelText || 'Cancel' }}\n        </button>\n        \n        <button \n          type=\"button\"\n          class=\"btn\"\n          [class]=\"getConfirmButtonClass()\"\n          (click)=\"onConfirm()\">\n          {{ currentRequest()?.confirmText || 'Confirm' }}\n        </button>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .confirmation-backdrop {\n      position: fixed;\n      top: 0;\n      left: 0;\n      right: 0;\n      bottom: 0;\n      background-color: rgba(0, 0, 0, 0.6);\n      backdrop-filter: blur(4px);\n      z-index: 10000;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n    \n    [data-theme=\"dark\"] .confirmation-backdrop,\n    .dark-mode .confirmation-backdrop {\n      background-color: rgba(0, 0, 0, 0.8);\n    }\n\n    .confirmation-modal {\n      background: var(--cide-ele-bg-primary, #ffffff);\n      border-radius: 12px;\n      box-shadow: var(--cide-ele-shadow-xl, 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04));\n      max-width: 480px;\n      width: 90%;\n      max-height: 90vh;\n      overflow-y: auto;\n      overflow-x: hidden;\n      z-index: 10001;\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      border: 1px solid var(--cide-ele-border-primary, #e5e7eb);\n      display: flex;\n      flex-direction: column;\n    }\n\n    .modal-header {\n      padding: 24px 24px 16px;\n      border-bottom: 1px solid var(--cide-ele-border-primary, #e5e7eb);\n      flex-shrink: 0;\n    }\n\n    .header-content {\n      display: flex;\n      align-items: center;\n      gap: 16px;\n    }\n\n    .icon-container {\n      width: 48px;\n      height: 48px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-shrink: 0;\n    }\n\n    .icon-container.danger {\n      background-color: var(--cide-ele-error-light, #fef2f2);\n      color: var(--cide-ele-error, #dc2626);\n    }\n\n    .icon-container.warning {\n      background-color: var(--cide-ele-warning-light, #fffbeb);\n      color: var(--cide-ele-warning, #d97706);\n    }\n\n    .icon-container.info {\n      background-color: var(--cide-ele-info-light, #eff6ff);\n      color: var(--cide-ele-info, #2563eb);\n    }\n\n    .icon-container.success {\n      background-color: var(--cide-ele-success-light, #f0fdf4);\n      color: var(--cide-ele-success, #16a34a);\n    }\n\n    .modal-title {\n      margin: 0;\n      font-size: 20px;\n      font-weight: 600;\n      color: var(--cide-ele-text-primary, #111827);\n      line-height: 1.4;\n    }\n\n    .modal-body {\n      padding: 16px 24px 24px;\n      flex: 1;\n      overflow-y: auto;\n      min-height: 0;\n    }\n\n    .modal-message {\n      margin: 0 0 16px 0;\n      font-size: 16px;\n      line-height: 1.5;\n      color: var(--cide-ele-text-secondary, #6b7280);\n    }\n\n    .custom-content {\n      margin-top: 16px;\n      padding-top: 16px;\n      border-top: 1px solid var(--cide-ele-border-primary, #f3f4f6);\n    }\n\n    .prompt-input-container {\n      margin-top: 16px;\n      display: flex;\n      flex-direction: column;\n      gap: 8px;\n    }\n\n    .prompt-label {\n      font-size: 14px;\n      font-weight: 500;\n      color: var(--cide-ele-text-primary, #374151);\n    }\n\n    .prompt-input {\n      width: 100%;\n      padding: 10px 12px;\n      border-radius: 8px;\n      border: 1px solid var(--cide-ele-border-secondary, #d1d5db);\n      background-color: var(--cide-ele-bg-primary, #ffffff);\n      color: var(--cide-ele-text-primary, #111827);\n      font-size: 14px;\n      transition: all 0.2s ease;\n    }\n\n    .prompt-input:focus {\n      outline: none;\n      border-color: var(--cide-ele-brand-primary, #2563eb);\n      box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);\n    }\n\n    .modal-footer {\n      padding: 16px 24px 24px;\n      display: flex;\n      gap: 12px;\n      justify-content: flex-end;\n      border-top: 1px solid var(--cide-ele-border-primary, #e5e7eb);\n      flex-shrink: 0;\n    }\n\n    .btn {\n      padding: 10px 20px;\n      border-radius: 8px;\n      font-size: 14px;\n      font-weight: 500;\n      border: none;\n      cursor: pointer;\n      transition: all 0.2s ease;\n      min-width: 80px;\n    }\n\n    .btn:hover {\n      transform: translateY(-1px);\n    }\n\n    .btn:active {\n      transform: translateY(0);\n    }\n\n    .btn-secondary {\n      background-color: var(--cide-ele-bg-secondary, #f9fafb);\n      color: var(--cide-ele-text-primary, #374151);\n      border: 1px solid var(--cide-ele-border-secondary, #d1d5db);\n    }\n\n    .btn-secondary:hover {\n      background-color: var(--cide-ele-bg-hover, #f3f4f6);\n      border-color: var(--cide-ele-border-hover, #9ca3af);\n    }\n\n    .btn-primary {\n      background-color: var(--cide-ele-brand-primary, #2563eb);\n      color: white;\n    }\n\n    .btn-primary:hover {\n      background-color: var(--cide-ele-brand-primary-hover, #1d4ed8);\n    }\n\n    .btn-danger {\n      background-color: var(--cide-ele-error, #dc2626);\n      color: white;\n    }\n\n    .btn-danger:hover {\n      background-color: #b91c1c;\n    }\n\n    .btn-warning {\n      background-color: var(--cide-ele-warning, #d97706);\n      color: white;\n    }\n\n    .btn-warning:hover {\n      background-color: #b45309;\n    }\n\n    .btn-success {\n      background-color: var(--cide-ele-success, #16a34a);\n      color: white;\n    }\n\n    .btn-success:hover {\n      background-color: #15803d;\n    }\n\n    /* Responsive Design */\n    @media (max-width: 640px) {\n      .confirmation-modal {\n        width: calc(100% - 2rem);\n        max-width: calc(100% - 2rem);\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        max-height: calc(100vh - 2rem);\n        position: fixed;\n      }\n\n      .modal-header {\n        padding: 16px 16px 12px;\n      }\n\n      .modal-body {\n        padding: 12px 16px 16px;\n        flex: 1;\n        overflow-y: auto;\n      }\n\n      .modal-footer {\n        padding: 12px 16px 16px;\n        flex-direction: column-reverse;\n        gap: 8px;\n        flex-shrink: 0;\n      }\n\n      .btn {\n        width: 100%;\n        justify-content: center;\n      }\n\n      .header-content {\n        flex-direction: column;\n        text-align: center;\n        gap: 12px;\n      }\n\n      .modal-title {\n        font-size: 18px;\n      }\n\n      .modal-message {\n        font-size: 14px;\n      }\n    }\n\n    /* Very small screens */\n    @media (max-width: 480px) {\n      .confirmation-modal {\n        width: calc(100% - 1rem);\n        max-width: calc(100% - 1rem);\n        border-radius: 8px;\n      }\n\n      .modal-header {\n        padding: 12px 12px 8px;\n      }\n\n      .modal-body {\n        padding: 8px 12px 12px;\n      }\n\n      .modal-footer {\n        padding: 8px 12px 12px;\n      }\n\n      .icon-container {\n        width: 40px;\n        height: 40px;\n      }\n\n      .modal-title {\n        font-size: 16px;\n      }\n\n      .modal-message {\n        font-size: 13px;\n      }\n    }\n\n    /* Focus styles for accessibility */\n    .btn:focus {\n      outline: 2px solid var(--cide-ele-brand-primary, #2563eb);\n      outline-offset: 2px;\n    }\n\n    /* Animation classes */\n    .modal-enter {\n      opacity: 0;\n      transform: scale(0.95) translateY(-10px);\n    }\n\n    .modal-enter-active {\n      opacity: 1;\n      transform: scale(1) translateY(0);\n      transition: all 0.2s ease-out;\n    }\n\n    .modal-exit {\n      opacity: 1;\n      transform: scale(1) translateY(0);\n    }\n\n    .modal-exit-active {\n      opacity: 0;\n      transform: scale(0.95) translateY(-10px);\n      transition: all 0.15s ease-in;\n    }\n  `]\n})\nexport class CideEleConfirmationModalComponent implements OnInit, OnDestroy {\n  // Modern Angular 20+ dependency injection\n  private readonly confirmationService = inject(ConfirmationService);\n\n  // Modern signal-based state management\n  readonly hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;\n  readonly currentRequest = this.confirmationService.getCurrentRequest();\n  readonly customData = signal<unknown>(null);\n  readonly promptValue = signal<string>('');\n\n  // Modern lifecycle management\n  ngOnInit(): void {\n    // Component initialized\n  }\n\n  ngOnDestroy(): void {\n    // Cleanup if needed\n  }\n\n  // Modern computed signals with proper typing\n  readonly getHeaderClass = computed((): string => {\n    const request = this.currentRequest();\n    return request ? `header-${request.type}` : '';\n  });\n\n  readonly getIconClass = computed((): string => {\n    const request = this.currentRequest();\n    return request ? request.type : 'info';\n  });\n\n  readonly getConfirmButtonClass = computed((): string => {\n    const request = this.currentRequest();\n    if (!request) return 'btn-primary';\n\n    const classMap: Record<string, string> = {\n      danger: 'btn-danger',\n      warning: 'btn-warning',\n      info: 'btn-primary',\n      success: 'btn-success'\n    };\n\n    return classMap[request.type] || 'btn-primary';\n  });\n\n  // Modern event handlers with proper typing\n  onBackdropClick(event: Event): void {\n    // Only close if clicking the backdrop itself, not its children\n    if (event.target === event.currentTarget) {\n      this.onCancel();\n    }\n  }\n\n  onCancel(): void {\n    this.confirmationService.cancelCurrentRequest();\n  }\n\n  onConfirm(): void {\n    const request = this.currentRequest();\n    if (!request) return;\n\n    // If showInput is true, we return the promptValue\n    if (request.showInput) {\n      if (request.inputRequired && !this.promptValue().trim()) {\n        // Simple validation - ideally we'd show an error message\n        return;\n      }\n      this.confirmationService.confirmCurrentRequest(this.promptValue());\n    } else {\n      // If there's custom data, pass it to the confirmation, otherwise pass true\n      const data = this.customData();\n      console.log('🔔 Modal onConfirm called with customData:', data);\n      this.confirmationService.confirmCurrentRequest(data !== null ? data : true);\n    }\n\n    this.customData.set(null); // Reset custom data\n    this.promptValue.set(''); // Reset prompt value\n  }\n\n  // Method to update custom data (called by custom templates)\n  updateCustomData(data: unknown): void {\n    this.customData.set(data);\n  }\n}\n","import { Component, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { NotificationService, NotificationItem } from '../../services/notification.service';\n\n@Component({\n  selector: 'cide-ele-toast-notification',\n  standalone: true,\n  imports: [CommonModule, CideIconComponent],\n  template: `\n    <!-- Toast Container -->\n    <div class=\"toast-container\">\n      <div \n        *ngFor=\"let notification of activeNotifications(); trackBy: trackByNotification\"\n        class=\"toast-notification\"\n        [class]=\"getToastClass(notification)\"\n        [@toastAnimation]>\n        \n        <!-- Toast Content -->\n        <div class=\"toast-content\">\n          <!-- Icon -->\n          <div class=\"toast-icon\" [class]=\"getIconClass(notification.type)\">\n            <cide-ele-icon size=\"sm\">\n              {{ notification.icon }}\n            </cide-ele-icon>\n          </div>\n          \n          <!-- Text Content -->\n          <div class=\"toast-text\">\n            <div *ngIf=\"notification.title\" class=\"toast-title\">\n              {{ notification.title }}\n            </div>\n            <div class=\"toast-message\">\n              {{ notification.message }}\n            </div>\n          </div>\n          \n          <!-- Close Button -->\n          <button \n            type=\"button\"\n            class=\"toast-close\"\n            (click)=\"removeNotification(notification.id)\"\n            aria-label=\"Close notification\">\n            <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n          </button>\n        </div>\n        \n        <!-- Undo Button -->\n        <div *ngIf=\"notification.showUndo\" class=\"toast-actions\">\n          <button \n            type=\"button\"\n            class=\"toast-undo-btn\"\n            (click)=\"executeUndo(notification.id)\">\n            {{ notification.undoText }}\n          </button>\n        </div>\n        \n        <!-- Progress Bar -->\n        <div \n          *ngIf=\"notification.duration > 0 && !notification.showProgress\"\n          class=\"toast-progress\"\n          [style.animation-duration]=\"notification.duration + 'ms'\">\n        </div>\n        \n        <!-- Custom Progress Bar -->\n        <div \n          *ngIf=\"notification.showProgress\"\n          class=\"toast-custom-progress\">\n          <div \n            class=\"toast-custom-progress-bar\"\n            [style.width.%]=\"notification.progress || 0\">\n          </div>\n        </div>\n      </div>\n    </div>\n  `,\n  styles: [`\n    .toast-container {\n      position: fixed;\n      top: auto;\n      bottom: 20px;\n      right: 20px;\n      z-index: 9990;\n      display: flex;\n      flex-direction: column-reverse;\n      gap: 12px;\n      max-width: 400px;\n      width: 100%;\n    }\n\n    .toast-notification {\n      background: var(--cide-ele-bg-primary, #ffffff);\n      border-radius: 8px;\n      box-shadow: var(--cide-ele-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05));\n      border: 1px solid var(--cide-ele-border-primary, #e5e7eb);\n      overflow: hidden;\n      position: relative;\n      animation: slideInRight 0.3s ease-out;\n    }\n\n    .toast-notification.success {\n      border-left: 4px solid var(--cide-ele-success, #16a34a);\n    }\n\n    .toast-notification.error {\n      border-left: 4px solid var(--cide-ele-error, #dc2626);\n    }\n\n    .toast-notification.warning {\n      border-left: 4px solid var(--cide-ele-warning, #d97706);\n    }\n\n    .toast-notification.info {\n      border-left: 4px solid var(--cide-ele-info, #2563eb);\n    }\n\n    .toast-content {\n      display: flex;\n      align-items: flex-start;\n      gap: 12px;\n      padding: 16px;\n    }\n\n    .toast-icon {\n      width: 24px;\n      height: 24px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-shrink: 0;\n      margin-top: 2px;\n    }\n\n    .toast-icon.success {\n      background-color: var(--cide-ele-success-light, #f0fdf4);\n      color: var(--cide-ele-success, #16a34a);\n    }\n\n    .toast-icon.error {\n      background-color: var(--cide-ele-error-light, #fef2f2);\n      color: var(--cide-ele-error, #dc2626);\n    }\n\n    .toast-icon.warning {\n      background-color: var(--cide-ele-warning-light, #fffbeb);\n      color: var(--cide-ele-warning, #d97706);\n    }\n\n    .toast-icon.info {\n      background-color: var(--cide-ele-info-light, #eff6ff);\n      color: var(--cide-ele-info, #2563eb);\n    }\n\n    .toast-text {\n      flex: 1;\n      min-width: 0;\n    }\n\n    .toast-title {\n      font-size: 14px;\n      font-weight: 600;\n      color: var(--cide-ele-text-primary, #111827);\n      margin-bottom: 4px;\n      line-height: 1.4;\n    }\n\n    .toast-message {\n      font-size: 14px;\n      color: var(--cide-ele-text-secondary, #6b7280);\n      line-height: 1.4;\n    }\n\n    .toast-close {\n      background: none;\n      border: none;\n      color: var(--cide-ele-text-tertiary, #9ca3af);\n      cursor: pointer;\n      padding: 4px;\n      border-radius: 4px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition: all 0.2s ease;\n      flex-shrink: 0;\n    }\n\n    .toast-close:hover {\n      background-color: var(--cide-ele-bg-hover, #f3f4f6);\n      color: var(--cide-ele-text-secondary, #6b7280);\n    }\n\n    .toast-actions {\n      padding: 0 16px 16px;\n      display: flex;\n      justify-content: flex-end;\n    }\n\n    .toast-undo-btn {\n      background: none;\n      border: none;\n      color: var(--cide-ele-brand-primary, #2563eb);\n      font-size: 14px;\n      font-weight: 500;\n      cursor: pointer;\n      padding: 8px 12px;\n      border-radius: 6px;\n      transition: all 0.2s ease;\n    }\n\n    .toast-undo-btn:hover {\n      background-color: var(--cide-ele-brand-primary-light, #eff6ff);\n    }\n\n    .toast-progress {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      height: 3px;\n      background-color: var(--cide-ele-border-primary, #e5e7eb);\n      animation: progressShrink linear forwards;\n    }\n\n    .toast-notification.success .toast-progress {\n      background-color: var(--cide-ele-success, #16a34a);\n    }\n\n    .toast-notification.error .toast-progress {\n      background-color: var(--cide-ele-error, #dc2626);\n    }\n\n    .toast-notification.warning .toast-progress {\n      background-color: var(--cide-ele-warning, #d97706);\n    }\n\n    .toast-notification.info .toast-progress {\n      background-color: var(--cide-ele-info, #2563eb);\n    }\n\n    /* Custom Progress Bar */\n    .toast-custom-progress {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      height: 3px;\n      background-color: var(--cide-ele-border-primary, #e5e7eb);\n      overflow: hidden;\n    }\n\n    .toast-custom-progress-bar {\n      height: 100%;\n      background-color: var(--cide-ele-info, #2563eb);\n      transition: width 0.3s ease;\n      border-radius: 0 3px 0 0;\n    }\n\n    .toast-notification.success .toast-custom-progress-bar {\n      background-color: var(--cide-ele-success, #16a34a);\n    }\n\n    .toast-notification.error .toast-custom-progress-bar {\n      background-color: var(--cide-ele-error, #dc2626);\n    }\n\n    .toast-notification.warning .toast-custom-progress-bar {\n      background-color: var(--cide-ele-warning, #d97706);\n    }\n\n    .toast-notification.info .toast-custom-progress-bar {\n      background-color: var(--cide-ele-info, #2563eb);\n    }\n\n    /* Animations */\n    @keyframes slideInRight {\n      from {\n        transform: translateX(100%);\n        opacity: 0;\n      }\n      to {\n        transform: translateX(0);\n        opacity: 1;\n      }\n    }\n\n    @keyframes slideOutRight {\n      from {\n        transform: translateX(0);\n        opacity: 1;\n      }\n      to {\n        transform: translateX(100%);\n        opacity: 0;\n      }\n    }\n\n    @keyframes progressShrink {\n      from {\n        width: 100%;\n      }\n      to {\n        width: 0%;\n      }\n    }\n\n    /* Responsive Design - Compact Mobile View */\n    @media (max-width: 640px) {\n      .toast-container {\n        top: auto;\n        bottom: 12px;\n        right: 12px;\n        left: 12px;\n        max-width: none;\n        flex-direction: column-reverse;\n        gap: 8px; /* Tighter gap between multiple toasts */\n      }\n\n      .toast-notification {\n        border-radius: 6px; /* Slightly less rounded for compact look */\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n      }\n\n      .toast-content {\n        padding: 8px 12px; /* Significantly reduced padding */\n        gap: 8px;\n        align-items: center;\n      }\n\n      .toast-title {\n        font-size: 12px;\n        margin-bottom: 0px;\n        line-height: 1.2;\n      }\n      \n      .toast-message {\n        font-size: 11.5px;\n        line-height: 1.25;\n      }\n\n      .toast-icon {\n        width: 18px;\n        height: 18px;\n        margin-top: 0; /* Centered with content */\n      }\n\n      .toast-close {\n        padding: 2px;\n      }\n\n      .toast-actions {\n        padding: 0 12px 8px;\n      }\n\n      .toast-undo-btn {\n        font-size: 12px;\n        padding: 4px 8px;\n      }\n    }\n\n    /* Focus styles for accessibility */\n    .toast-close:focus,\n    .toast-undo-btn:focus {\n      outline: 2px solid var(--cide-ele-brand-primary, #2563eb);\n      outline-offset: 2px;\n    }\n  `],\n  animations: [\n    trigger('toastAnimation', [\n      state('void', style({\n        transform: 'translateX(100%)',\n        opacity: 0\n      })),\n      state('*', style({\n        transform: 'translateX(0)',\n        opacity: 1\n      })),\n      transition('void => *', animate('300ms ease-out')),\n      transition('* => void', animate('200ms ease-in'))\n    ])\n  ]\n})\nexport class CideEleToastNotificationComponent {\n  private notificationService = inject(NotificationService);\n\n  // Signals\n  activeNotifications = this.notificationService.getActiveNotifications();\n\n  // Methods\n  getToastClass(notification: NotificationItem): string {\n    return `toast-${notification.type}`;\n  }\n\n  getIconClass(type: string): string {\n    return `toast-icon ${type}`;\n  }\n\n  removeNotification(id: string): void {\n    this.notificationService.remove(id);\n  }\n\n  executeUndo(id: string): void {\n    this.notificationService.executeUndo(id);\n  }\n\n  trackByNotification(index: number, notification: NotificationItem): string {\n    return notification.id;\n  }\n}\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideEleConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';\r\nimport { CideEleToastNotificationComponent } from '../toast-notification/toast-notification.component';\r\n\r\n@Component({\r\n  selector: 'cide-ele-global-notifications',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    CideEleConfirmationModalComponent,\r\n    CideEleToastNotificationComponent\r\n  ],\r\n  template: `\r\n    <!-- Global Confirmation Modal -->\r\n    <cide-ele-confirmation-modal></cide-ele-confirmation-modal>\r\n    \r\n    <!-- Global Toast Notifications -->\r\n    <cide-ele-toast-notification></cide-ele-toast-notification>\r\n  `,\r\n  styles: [`\r\n    /* Global styles for notifications */\r\n    :host {\r\n      display: contents;\r\n    }\r\n  `]\r\n})\r\nexport class CideEleGlobalNotificationsComponent {\r\n  // This component serves as a container for global notifications\r\n  // It doesn't need any logic as the services handle everything\r\n}\r\n\r\n","// Data Grid Configuration Types for CideEleDataGrid Component\r\n\r\nexport type ColumnType = 'text' | 'number' | 'date' | 'boolean' | 'status' | 'actions' | 'custom' | 'order';\r\nexport type ColumnWidth = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'auto' | string;\r\nexport type TextAlign = 'left' | 'center' | 'right';\r\nexport type DeviceType = 'mobile' | 'tablet' | 'desktop';\r\n\r\nexport interface GridColumn {\r\n  key: string;\r\n  header: string;\r\n  type: ColumnType;\r\n  width?: ColumnWidth;\r\n  sortable?: boolean;\r\n  searchable?: boolean;\r\n  truncate?: boolean;\r\n  align?: TextAlign;\r\n  renderer?: string; // For custom rendering\r\n  valueGetter?: string; // Path to nested property (e.g., 'contact.email') - used for display, filtering, and export\r\n  dataValueGetter?: string; // Path to value for filtering and export (CSV/Excel) - useful for template columns. If not set, uses valueGetter\r\n  formatter?: GridFormatter;\r\n  actions?: GridAction[];\r\n  statusConfig?: StatusConfig;\r\n  filterable?: boolean; // Enable column filtering\r\n  filterType?: 'text' | 'number' | 'date' | 'select' | 'custom'; // Filter type\r\n  filterOptions?: Array<{ label: string; value: unknown }>; // Options for select filters\r\n  filterRenderer?: string; // Custom filter template renderer\r\n  groupable?: boolean; // Enable grouping by this column\r\n  aggregatable?: boolean; // Enable aggregation for this column\r\n  aggregationType?: 'sum' | 'avg' | 'count' | 'min' | 'max'; // Aggregation type\r\n  resizable?: boolean; // Enable column resizing\r\n  hideable?: boolean; // Can be hidden/shown\r\n  hidden?: boolean; // Initial hidden state\r\n}\r\n\r\nexport interface GridFormatter {\r\n  type: 'date' | 'currency' | 'percentage' | 'custom';\r\n  format?: string; // Date format, currency code, etc.\r\n  customFunction?: string; // Name of custom formatter function\r\n}\r\n\r\nexport interface StatusConfig {\r\n  activeValue: string | number | boolean;\r\n  activeLabel: string;\r\n  inactiveLabel: string;\r\n  activeClass: string;\r\n  inactiveClass: string;\r\n}\r\n\r\nexport interface GridAction {\r\n  key: string;\r\n  label: string;\r\n  icon: string;\r\n  variant: 'ghost' | 'primary' | 'outline' | 'danger';\r\n  tooltip?: string;\r\n  condition?: string; // Condition to show action (e.g., 'entity.isActive')\r\n  onClick: string; // Function name to call\r\n}\r\n\r\nexport interface GridPaginationConfig {\r\n  enabled: boolean;\r\n  pageSize: number;\r\n  pageSizeOptions: number[];\r\n  showQuickJump: boolean;\r\n  showPageInfo: boolean;\r\n  showRefresh: boolean;\r\n  infiniteScroll?: boolean;\r\n  paginationDevices?: DeviceType[]; // Device types where pagination should be visible\r\n}\r\n\r\nexport interface GridSearchConfig {\r\n  enabled: boolean;\r\n  placeholder: string;\r\n  searchableColumns: string[]; // Column keys to search in\r\n  debounceMs?: number;\r\n}\r\n\r\nexport interface GridExportConfig {\r\n  enabled: boolean;\r\n  formats: ('csv' | 'excel' | 'pdf')[];\r\n  filename?: string;\r\n}\r\n\r\nexport interface GridLoadingConfig {\r\n  useDefer: boolean;\r\n  skeletonRows: number;\r\n  showOverlay: boolean;\r\n}\r\n\r\nexport interface GridScrollConfig {\r\n  enabled: boolean;\r\n  maxHeight?: string; // e.g., '400px', '50vh', 'calc(100vh - 200px)'\r\n  minHeight?: string; // e.g., '200px'\r\n  stickyHeader?: boolean; // Keep header visible when scrolling\r\n  virtualScroll?: boolean | 'auto'; // Enable virtual scrolling for large datasets (true/false to force, 'auto' for device-based)\r\n  virtualScrollDevices?: DeviceType[]; // Device types where virtual scroll should be enabled\r\n  rowHeight?: number; // Height of each row in pixels (for virtual scroll)\r\n}\r\n\r\nexport interface GridTreeConfig {\r\n  enabled: boolean;\r\n  primaryKey: string; // Primary key field name (e.g., '_id')\r\n  foreignKey: string; // Foreign key field name (e.g., 'syme_id_syme')\r\n  childrenKey?: string; // Children array field name (default: 'children')\r\n  levelKey?: string; // Level field name (default: 'level')\r\n  expandedKey?: string; // Expanded state field name (default: 'isExpanded')\r\n  hasChildrenKey?: string; // Has children field name (default: 'hasChildren')\r\n  /** When true, all tree nodes start expanded so child rows (e.g. child entities) are visible without clicking. */\r\n  defaultExpandAll?: boolean;\r\n}\r\n\r\nexport interface GridDragDropConfig {\r\n  enabled: boolean;\r\n  dragHandle?: string; // CSS selector for drag handle (default: 'tr')\r\n  orderField?: string; // Field name for storing order (default: 'order')\r\n  dragClass?: string; // CSS class to apply to dragged element\r\n  dropClass?: string; // CSS class to apply to drop target\r\n}\r\n\r\nexport interface GridMobileLayoutConfig {\r\n  enabled: boolean;\r\n  primaryColumn: string;    // Main title on card\r\n  secondaryColumn?: string; // Subtitle on card\r\n  detailColumns?: string[]; // Array of column keys to show as details\r\n  actionLayout?: 'menu' | 'buttons'; // How actions are displayed\r\n}\r\n\r\nexport interface GridColumnMenuConfig {\r\n  enabled: boolean;\r\n  showSort?: boolean; // Show sort options (Ascending/Descending)\r\n  showFilter?: boolean; // Show filter option\r\n  showAutosize?: boolean; // Show autosize option\r\n  showGroupBy?: boolean; // Show group by column option\r\n  showManageColumns?: boolean; // Show manage columns option\r\n  showResetColumns?: boolean; // Show reset columns option\r\n  showHideColumn?: boolean; // Show hide column option\r\n  showAggregation?: boolean; // Show aggregation select option\r\n}\r\n\r\nexport interface ColumnFilter {\r\n  columnKey: string;\r\n  value: unknown;\r\n  operator?: 'equals' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'lt' | 'gte' | 'lte' | 'in';\r\n}\r\n\r\nexport interface ColumnSort {\r\n  columnKey: string;\r\n  direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface ColumnGroup<T = Record<string, unknown>> {\r\n  columnKey: string;\r\n  groups: Map<unknown, T[]>;\r\n}\r\n\r\nexport interface GridConfiguration<T = Record<string, unknown>> {\r\n  // Basic Configuration\r\n  id: string;\r\n  title?: string;\r\n  subtitle?: string;\r\n  actionRenderer?: string; // Template for custom actions in the search bar\r\n  columns: GridColumn[];\r\n\r\n  // Data Configuration\r\n  data: T[];\r\n  trackBy?: string; // Property to track items by (default: 'id' or '_id')\r\n\r\n  // Feature Configuration\r\n  pagination: GridPaginationConfig;\r\n  search: GridSearchConfig;\r\n  export?: GridExportConfig;\r\n  loading: GridLoadingConfig;\r\n  scroll?: GridScrollConfig;\r\n  tree?: GridTreeConfig; // Tree structure configuration\r\n  dragDrop?: GridDragDropConfig; // Drag and drop configuration\r\n  columnMenu?: GridColumnMenuConfig; // Column menu configuration\r\n  mobileLayout?: GridMobileLayoutConfig; // Mobile card layout configuration\r\n\r\n  // Styling Configuration\r\n  responsive: boolean;\r\n  striped?: boolean;\r\n  bordered?: boolean;\r\n  compact?: boolean;\r\n  fullHeight?: boolean; // Enable full height mode for empty tables\r\n\r\n  // Event Handlers (function names)\r\n  onRowClick?: string;\r\n  onSort?: string;\r\n  onPageChange?: string;\r\n  onSearch?: string;\r\n  onRefresh?: string;\r\n  onExport?: string;\r\n  onRowReorder?: string; // Row reorder event handler\r\n\r\n  // Custom Classes\r\n  tableClass?: string;\r\n  headerClass?: string;\r\n  rowClass?: string;\r\n  cellClass?: string;\r\n}\r\n\r\nexport interface GridState<T = Record<string, unknown>> {\r\n  currentPage: number;\r\n  pageSize: number;\r\n  totalItems: number;\r\n  totalPages: number;\r\n  searchQuery: string;\r\n  sortColumn?: string;\r\n  sortDirection?: 'asc' | 'desc';\r\n  loading: boolean;\r\n  isRefreshing: boolean;\r\n  selectedRows: T[];\r\n}\r\n\r\nexport interface GridEvent<T = Record<string, unknown>> {\r\n  type: 'rowClick' | 'sort' | 'pageChange' | 'search' | 'refresh' | 'export' | 'action' | 'rowReorder' |\r\n  'columnFilter' | 'columnSort' | 'columnAutosize' | 'columnGroupBy' | 'columnHide' | 'columnShow' |\r\n  'columnReset' | 'columnAggregation' | 'manageColumns';\r\n  data: T | T[] | string | number | null | {\r\n    sourceItem: T;\r\n    sourceIndex: number;\r\n    targetItem: T;\r\n    targetIndex: number;\r\n    newOrder: T[];\r\n    allOrders?: T[]; // Complete order for reference when only changed orders are sent\r\n  } | ColumnFilter | ColumnFilter[] | ColumnSort | { columnKey: string; aggregationType: string };\r\n  column?: GridColumn;\r\n  action?: GridAction;\r\n  filters?: ColumnFilter[]; // Active filters\r\n  sorts?: ColumnSort[]; // Active sorts\r\n}\r\n\r\n// Default configurations\r\nexport const DEFAULT_GRID_CONFIG: Partial<GridConfiguration> = {\r\n  pagination: {\r\n    enabled: true,\r\n    pageSize: 10,\r\n    pageSizeOptions: [10, 25, 50, 100],\r\n    showQuickJump: true,\r\n    showPageInfo: true,\r\n    showRefresh: true,\r\n    infiniteScroll: false,\r\n    paginationDevices: ['tablet', 'desktop'] // Show pagination on tablet and desktop by default\r\n  },\r\n  search: {\r\n    enabled: true,\r\n    placeholder: 'Search...',\r\n    searchableColumns: [],\r\n    debounceMs: 300\r\n  },\r\n  loading: {\r\n    useDefer: true,\r\n    skeletonRows: 5,\r\n    showOverlay: false\r\n  },\r\n  scroll: {\r\n    enabled: false,\r\n    maxHeight: '400px',\r\n    minHeight: '200px',\r\n    stickyHeader: true,\r\n    virtualScroll: 'auto', // Auto-detect based on device type\r\n    virtualScrollDevices: ['mobile'], // Enable virtual scroll on mobile by default\r\n    rowHeight: 40\r\n  },\r\n  columnMenu: {\r\n    enabled: true,\r\n    showSort: true,\r\n    showFilter: true,\r\n    showAutosize: true,\r\n    showGroupBy: true,\r\n    showManageColumns: true,\r\n    showResetColumns: true,\r\n    showHideColumn: true,\r\n    showAggregation: true\r\n  },\r\n  mobileLayout: {\r\n    enabled: true,\r\n    primaryColumn: '',\r\n    actionLayout: 'menu'\r\n  },\r\n  responsive: true,\r\n  striped: false,\r\n  bordered: true,\r\n  compact: true,\r\n  fullHeight: true\r\n};\r\n\r\n// Utility types for type safety\r\nexport type GridEventHandler<T = Record<string, unknown>> = (event: GridEvent<T>) => void;\r\nexport type GridCustomRenderer<T = Record<string, unknown>> = (value: unknown, row: T, column: GridColumn) => string;\r\nexport type GridCustomFormatter = (value: unknown, format?: string) => string; ","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges, SimpleChange, signal, computed, TemplateRef } from '@angular/core';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { ScrollingModule } from '@angular/cdk/scrolling';\nimport {\n  GridConfiguration,\n  GridColumn,\n  GridEvent,\n  GridAction,\n  DEFAULT_GRID_CONFIG,\n  ColumnWidth,\n  StatusConfig,\n  ColumnFilter,\n  ColumnSort,\n  GridColumnMenuConfig\n} from './data-grid.types';\nimport { CideInputComponent } from '../../elements/input/input.component';\nimport { CideSelectComponent } from '../../elements/select/select.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { inputType } from 'cloud-ide-lms-model';\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\nimport { ExportService } from '../../utils/services/export.service';\nimport { inject } from '@angular/core';\n\n// Enhanced types for template support\nexport interface TemplateContext<T = Record<string, unknown>> {\n  $implicit: unknown;\n  row: T;\n  value: unknown;\n  column: GridColumn;\n}\n\nexport type TemplateRenderer<T = Record<string, unknown>> = TemplateRef<TemplateContext<T>>;\n\n@Component({\n  selector: 'cide-ele-data-grid',\n  standalone: true,\n  imports: [\n    CommonModule,\n    NgTemplateOutlet,\n    FormsModule,\n    CideInputComponent,\n    CideSelectComponent,\n    CideIconComponent,\n    CideEleButtonComponent,\n    ScrollingModule\n  ],\n  templateUrl: './data-grid.component.html',\n  styleUrls: ['./data-grid.component.scss']\n})\nexport class CideEleDataGridComponent<T = Record<string, unknown>> implements OnInit, OnChanges, OnDestroy {\n  @Input() config!: GridConfiguration<T>;\n  @Input() templateRenderers: Record<string, unknown> = {};\n  @Input() customFormatters: Record<string, (value: unknown, format?: string) => string> = {};\n  @Input() actionHandlers: Record<string, (data: T, action?: GridAction) => void> = {};\n  @Input() serverSidePagination = false;\n  @Input() totalServerItems = 0;\n  @Input() currentServerPage = 1;\n  @Input() currentServerPageSize = 10;\n  @Input() dragDropEnabled = false;\n\n  @Output() gridEvent = new EventEmitter<GridEvent<T>>();\n\n  // Internal state using Angular Signals\n  private internalData = signal<T[]>([]);\n  private filteredData = signal<T[]>([]);\n\n  // Grid state\n  currentPage = signal(1);\n  pageSize = signal(10);\n  totalItems = signal(0);\n  totalPages = signal(0);\n  searchQuery = signal('');\n  loading = signal(false);\n  isRefreshing = signal(false);\n  pageChangeLoading = signal(false);\n  jumpToPage = 1;\n  isDragOverRow: number | null = null;\n  isDragging = signal(false);\n  hasOrderChanged = signal(false);\n  private originalOrderIds: string[] = []; // Store only IDs for order tracking\n  private initialDataOrderIds: string[] = []; // Store only IDs for initial order\n  private rowOrderMap = new Map<string, { oldPosition: number; newPosition: number }>();\n  private localReorderedData: T[] = []; // Local data for visual reordering\n  private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n  private isDataUpdate = false;\n  private isAppendMode = false;\n\n  // Column menu state\n  openColumnMenu = signal<string | null>(null); // Column key of open menu\n  columnFilters = signal<ColumnFilter[]>([]); // Active column filters\n  columnSorts = signal<ColumnSort[]>([]); // Active column sorts\n  hiddenColumns = signal<string[]>([]); // Hidden column keys\n  showFilterPanel = signal<string | null>(null); // Column key for active filter panel\n  filterSearchTerm = signal<string>(''); // Search term for filter values\n  showManageColumnsModal = signal<boolean>(false); // Show manage columns modal\n  groupedColumns = signal<string[]>([]); // Columns to group by\n  expandedGroups = signal<Set<string>>(new Set()); // Expanded group keys\n  private hasAutoExpandedGroups = false; // Track if we've auto-expanded groups on initial load\n  private pendingExpandedGroupsUpdate: Set<string> | null = null; // Track pending expanded groups update\n\n  // Export menu state\n  showExportMenu = signal<boolean>(false); // Show/hide export format dropdown\n  showFilterDropdown = signal<boolean>(false); // Show/hide filter dropdown\n\n  // Export service\n  private exportService = inject(ExportService);\n\n  // Computed properties\n  hasNextPage = computed(() => this.currentPage() < this.totalPages());\n  hasPreviousPage = computed(() => this.currentPage() > 1);\n\n  // Merged configuration with defaults\n  mergedConfig = signal<GridConfiguration<T>>(this.config);\n\n  // Visible columns (excluding hidden)\n  visibleColumns = computed(() => {\n    const hidden = this.hiddenColumns();\n    return this.mergedConfig().columns.filter(col => !hidden.includes(col.key) && !col.hidden);\n  });\n\n  // Mobile Layout Helpers\n  isMobileView = signal<boolean>(window.innerWidth < 768);\n\n  getMobilePrimaryValue(item: T): string {\n    const mobileConfig = this.mergedConfig().mobileLayout;\n    if (mobileConfig?.primaryColumn) {\n      const val = this.getNestedValue(item, mobileConfig.primaryColumn);\n      const col = this.mergedConfig().columns.find(c => c.key === mobileConfig.primaryColumn);\n      return col ? this.formatValue(val, col) : String(val || '');\n    }\n    const firstCol = this.visibleColumns().find(c => c.type === 'text');\n    return firstCol ? this.formatValue(this.getNestedValue(item, firstCol.key), firstCol) : '';\n  }\n\n  virtualData = computed(() => {\n    const total = this.totalItems();\n    const data = this.displayedData;\n\n    // In infinite scroll mode, we want to pad the array to the total length\n    if (this.mergedConfig().pagination.infiniteScroll && total > data.length) {\n      const padding = new Array(total - data.length).fill(null);\n      return [...data, ...padding];\n    }\n    return data;\n  });\n\n  getMobileSecondaryValue(item: T): string {\n    const mobileConfig = this.mergedConfig().mobileLayout;\n    if (mobileConfig?.secondaryColumn) {\n      const val = this.getNestedValue(item, mobileConfig.secondaryColumn);\n      const col = this.mergedConfig().columns.find(c => c.key === mobileConfig.secondaryColumn);\n      return col ? this.formatValue(val, col) : String(val || '');\n    }\n    return '';\n  }\n\n  getMobileDetailColumns(): GridColumn[] {\n    const mobileConfig = this.mergedConfig().mobileLayout;\n    const primary = mobileConfig?.primaryColumn;\n    const secondary = mobileConfig?.secondaryColumn;\n\n    if (mobileConfig?.detailColumns && mobileConfig.detailColumns.length > 0) {\n      return this.mergedConfig().columns.filter(c => mobileConfig.detailColumns?.includes(c.key));\n    }\n    return this.visibleColumns()\n      .filter(c => c.key !== primary && c.key !== secondary && c.type !== 'actions' && c.type !== 'order')\n      .slice(0, 3);\n  }\n\n  getRowActions(): GridAction[] {\n    const actionsCol = this.visibleColumns().find(c => c.type === 'actions');\n    return actionsCol?.actions || [];\n  }\n\n  // Constants for height estimation\n  readonly DEFAULT_TABLE_ROW_HEIGHT = 48;\n  readonly DEFAULT_MOBILE_CARD_HEIGHT = 160;\n\n  virtualRowHeight = computed(() => {\n    return this.isMobileView()\n      ? this.DEFAULT_MOBILE_CARD_HEIGHT\n      : (this.mergedConfig().scroll?.rowHeight || this.DEFAULT_TABLE_ROW_HEIGHT);\n  });\n\n  isVirtualScrollerEnabled = computed(() => {\n    const scroll = this.mergedConfig().scroll;\n    // Only enable virtual scroll viewport if scroll is enabled AND virtualScroll is truthy\n    // AND we are not in full height mode (which usually implies page scrolling)\n    return scroll?.enabled === true && !!scroll?.virtualScroll;\n  });\n\n  getInfiniteScrollSpacerHeight(): number {\n    const total = this.totalItems();\n    const loaded = this.displayedData.length;\n    const remaining = total - loaded;\n\n    if (remaining <= 0 || !this.mergedConfig().pagination.infiniteScroll) {\n      return 0;\n    }\n\n    return remaining * this.virtualRowHeight();\n  }\n\n  ngOnInit() {\n    this.initializeGrid();\n    this.initializeOriginalOrder();\n\n    // Add global click listener to close menus when clicking outside\n    document.addEventListener('click', this.handleGlobalClick.bind(this));\n\n    // Add ESC key listener to close manage columns modal\n    document.addEventListener('keydown', this.handleKeyDown.bind(this));\n\n    // Add window resize listener for responsive layout\n    window.addEventListener('resize', this.handleResize.bind(this));\n  }\n\n  ngOnDestroy() {\n    // Clean up search debounce timer\n    if (this.searchDebounceTimer) {\n      clearTimeout(this.searchDebounceTimer);\n    }\n\n    // Remove global click listener\n    document.removeEventListener('click', this.handleGlobalClick.bind(this));\n\n    // Remove ESC key listener\n    document.removeEventListener('keydown', this.handleKeyDown.bind(this));\n\n    // Remove resize listener\n    window.removeEventListener('resize', this.handleResize.bind(this));\n  }\n\n  private handleResize() {\n    this.isMobileView.set(window.innerWidth < 768);\n  }\n\n  /**\n   * Get the current device type based on window width\n   * Mobile: < 768px\n   * Tablet: 768px - 1023px\n   * Desktop: >= 1024px\n   */\n  private getCurrentDeviceType(): 'mobile' | 'tablet' | 'desktop' {\n    const width = window.innerWidth;\n    if (width < 768) return 'mobile';\n    if (width < 1024) return 'tablet';\n    return 'desktop';\n  }\n\n  private handleKeyDown(event: KeyboardEvent) {\n    if (event.key === 'Escape' && this.showManageColumnsModal()) {\n      this.closeManageColumnsModal();\n    }\n  }\n\n  private handleGlobalClick(event: MouseEvent): void {\n    // Close column menu and filter panel when clicking outside\n    const target = event.target as HTMLElement;\n    const isInsideMenu = target.closest('.column-menu-dropdown');\n    const isMenuTrigger = target.closest('.column-menu-trigger');\n    const isInsideFilterDropdown = target.closest('.filter-dropdown');\n    const isFilterDropdownTrigger = target.closest('.filter-dropdown-trigger');\n\n    if (!isInsideMenu && !isMenuTrigger) {\n      this.closeColumnMenu();\n      this.closeFilterPanel();\n    }\n\n    if (!isInsideFilterDropdown && !isFilterDropdownTrigger) {\n      this.showFilterDropdown.set(false);\n    }\n  }\n\n  onScrolledIndexChange(index: number) {\n    const paginationConfig = this.mergedConfig().pagination;\n    if (!paginationConfig.infiniteScroll) return;\n\n    // If we've scrolled near the end of loaded items, trigger next page\n    const loadedCount = this.displayedData.length;\n    if (index > loadedCount - 10) {\n      if (this.hasNextPage() && !this.loading() && !this.pageChangeLoading()) {\n        console.log('🔄 Triggering next page via CDK Virtual Scroll index:', index);\n        this.nextPage();\n      }\n    }\n  }\n\n  onContentScroll(event: Event) {\n    const paginationConfig = this.mergedConfig().pagination;\n\n    // Only handle infinite scroll if enabled\n    if (!paginationConfig.infiniteScroll) {\n      return;\n    }\n\n    const target = event.target as HTMLElement;\n    const { scrollTop, clientHeight, scrollHeight } = target;\n\n    // Calculate height of already rendered items\n    // scrollHeight includes the phantom spacer\n    const spacerHeight = this.getInfiniteScrollSpacerHeight();\n    const renderedHeight = scrollHeight - spacerHeight;\n\n    // Trigger next page when we reach near the end of CURRENTLY LOADED items\n    if (scrollTop + clientHeight > renderedHeight - 100) {\n      if (this.hasNextPage() && !this.loading() && !this.pageChangeLoading()) {\n        console.log('🔄 Triggering next page for infinite scroll (stable scrollbar mode)');\n        this.nextPage();\n      }\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['config']) {\n      // Store current search query to preserve it during re-initialization\n      const currentSearchQuery = this.searchQuery();\n\n      this.mergeConfigWithDefaults();\n\n      // Check if this is a data-only update (same config except data)\n      const isDataOnlyUpdate = this.isDataOnlyUpdate(changes['config']);\n\n      if (isDataOnlyUpdate && this.serverSidePagination) {\n        console.log('🔄 DataGrid: isDataOnlyUpdate', isDataOnlyUpdate);\n        // For data-only updates, preserve search query and use updateDataOnly\n        this.updateDataOnly(changes['config'].currentValue.data || []);\n        if (currentSearchQuery) {\n          // this.searchQuery.set(currentSearchQuery);\n        }\n      } else {\n        // For full config changes, use initializeGrid\n        this.initializeGrid();\n\n        // Restore search query after initialization\n        if (currentSearchQuery) {\n          // this.searchQuery.set(currentSearchQuery);\n        }\n      }\n\n      // Reinitialize original order when data changes\n      this.initializeOriginalOrder();\n\n      // Also refresh order tracking to ensure it's up to date\n      this.refreshOrderTracking();\n    }\n\n    if (this.serverSidePagination) {\n      if (changes['totalServerItems']) {\n        // console.log('🔄 DataGrid: totalServerItems changed:', this.totalServerItems);\n        this.totalItems.set(this.totalServerItems);\n        this.updatePaginationState();\n      }\n\n      if (changes['currentServerPage']) {\n        // console.log('🔄 DataGrid: currentServerPage changed:', this.currentServerPage);\n        this.currentPage.set(this.currentServerPage);\n      }\n\n      if (changes['currentServerPageSize']) {\n        // console.log('🔄 DataGrid: currentServerPageSize changed:', this.currentServerPageSize);\n        this.pageSize.set(this.currentServerPageSize);\n        this.updatePaginationState();\n      }\n\n      // Clear page change loading when server-side data is updated\n      if (changes['config'] && this.pageChangeLoading()) {\n        this.clearPageChangeLoading();\n      }\n    }\n  }\n\n  /**\n   * Check if the config change is only a data update\n   */\n  private isDataOnlyUpdate(change: SimpleChange): boolean {\n    if (change.firstChange || !change.previousValue || !change.currentValue) {\n      return false;\n    }\n\n    const prev = change.previousValue;\n    const curr = change.currentValue;\n\n    // Check if all properties except 'data' are the same\n    const prevWithoutData = { ...prev };\n    const currWithoutData = { ...curr };\n    delete prevWithoutData.data;\n    delete currWithoutData.data;\n\n    return JSON.stringify(prevWithoutData) === JSON.stringify(currWithoutData);\n  }\n\n  /**\n   * Update only the data without triggering full grid re-initialization\n   * This prevents the search input and other UI state from being reset\n   */\n  private updateDataOnly(data: T[]) {\n    const paginationConfig = this.mergedConfig().pagination;\n    let processedData = data;\n\n    // Transform to tree structure if tree config is enabled\n    if (this.mergedConfig().tree?.enabled) {\n      // Preserve expansion state from current data before transforming\n      const currentData = this.internalData();\n      const expansionState = this.preserveTreeExpansionState(currentData);\n\n      processedData = this.transformToTree(processedData);\n\n      // Apply preserved expansion state to new tree data\n      processedData = this.applyTreeExpansionState(processedData, expansionState);\n      console.log('processedData with preserved expansion state', processedData);\n    }\n\n    if (this.isAppendMode && paginationConfig.infiniteScroll) {\n      console.log('🔄 DataGrid: Appending data in infinite scroll mode');\n\n      // Deduplicate by trackBy to prevent duplicate records\n      const trackBy = this.mergedConfig().trackBy || '_id';\n      const existingIds = new Set(\n        this.internalData().map(item => this.getNestedValue(item, trackBy))\n      );\n\n      const newUniqueData = processedData.filter(item =>\n        !existingIds.has(this.getNestedValue(item, trackBy))\n      );\n\n      console.log(`🔍 Deduplication: ${processedData.length} incoming, ${newUniqueData.length} unique, ${processedData.length - newUniqueData.length} duplicates removed`);\n\n      // For both client and server-side, we want to append to internalData\n      this.internalData.set([...this.internalData(), ...newUniqueData]);\n      this.isAppendMode = false;\n\n      // For server-side pagination, we also need to append to filteredData to show combined pages\n      if (this.serverSidePagination) {\n        this.filteredData.set([...this.filteredData(), ...newUniqueData]);\n      }\n    } else {\n      this.internalData.set(processedData);\n      // For server-side pagination, set filtered data directly\n      if (this.serverSidePagination) {\n        this.filteredData.set(processedData);\n      }\n    }\n\n    console.log('processedData', processedData);\n\n    // For client-side pagination, apply filters if not in append mode\n    if (!this.serverSidePagination && !this.isAppendMode) {\n      this.applyFilters();\n    }\n\n    // Refresh order tracking when data changes\n    this.refreshOrderTracking();\n\n    this.clearPageChangeLoading();\n  }\n\n  private mergeConfigWithDefaults() {\n    const deviceType = this.getCurrentDeviceType();\n\n    // Determine if virtual scroll should be enabled based on device type\n    const virtualScrollDevices = this.config.scroll?.virtualScrollDevices ?? DEFAULT_GRID_CONFIG.scroll!.virtualScrollDevices ?? [];\n    const shouldUseVirtualScroll = virtualScrollDevices.includes(deviceType);\n\n    // Allow explicit boolean override (true/false forces behavior, 'auto' uses device detection)\n    const configVirtualScroll = this.config.scroll?.virtualScroll;\n    const finalVirtualScroll = configVirtualScroll === true || configVirtualScroll === false\n      ? configVirtualScroll\n      : shouldUseVirtualScroll;\n\n    const mergedScrollConfig = {\n      ...DEFAULT_GRID_CONFIG.scroll!,\n      enabled: this.isMobileView() ? true : (this.config.scroll?.enabled ?? DEFAULT_GRID_CONFIG.scroll!.enabled),\n      ...this.config.scroll,\n      virtualScroll: finalVirtualScroll\n    };\n\n    this.mergedConfig.set({\n      ...DEFAULT_GRID_CONFIG,\n      ...this.config,\n      pagination: {\n        ...DEFAULT_GRID_CONFIG.pagination!,\n        ...this.config.pagination,\n        // Sync infiniteScroll with virtualScroll for seamless infinite loading\n        infiniteScroll: finalVirtualScroll ?? DEFAULT_GRID_CONFIG.pagination!.infiniteScroll\n      },\n      search: { ...DEFAULT_GRID_CONFIG.search!, ...this.config.search },\n      loading: { ...DEFAULT_GRID_CONFIG.loading!, ...this.config.loading },\n      scroll: mergedScrollConfig,\n      mobileLayout: { ...DEFAULT_GRID_CONFIG.mobileLayout!, ...this.config.mobileLayout }\n    } as GridConfiguration<T>);\n\n    // Clear grouping if showGroupBy is disabled\n    const columnMenuConfig = this.mergedConfig().columnMenu;\n    if (columnMenuConfig && columnMenuConfig.showGroupBy === false) {\n      if (this.groupedColumns().length > 0) {\n        this.groupedColumns.set([]);\n        this.expandedGroups.set(new Set());\n      }\n    }\n  }\n\n  private initializeGrid() {\n    // Ensure we have valid data\n    let data = this.config?.data || [];\n\n    // Auto-apply grouping for columns with groupable: true\n    this.initializeDefaultGrouping();\n\n    // Transform to tree structure if tree config is enabled\n    if (this.mergedConfig().tree?.enabled) {\n      // Preserve expansion state from current data before transforming\n      const currentData = this.internalData();\n      const expansionState = this.preserveTreeExpansionState(currentData);\n\n      data = this.transformToTree(data);\n\n      // Apply preserved expansion state to new tree data\n      data = this.applyTreeExpansionState(data, expansionState);\n    }\n\n    this.internalData.set(data);\n\n    // Set pagination values based on mode\n    if (this.serverSidePagination) {\n      this.currentPage.set(this.currentServerPage);\n      this.pageSize.set(this.currentServerPageSize);\n      this.totalItems.set(this.totalServerItems);\n      // For server-side pagination, set filtered data directly without applying filters\n      this.filteredData.set(data);\n    } else {\n      // Client-side pagination\n      const pageSize = this.mergedConfig().pagination?.pageSize || 10;\n      this.pageSize.set(pageSize);\n      // When tree is enabled, data is root nodes only; use full node count for \"X of Y\"\n      const totalCount = this.mergedConfig().tree?.enabled\n        ? this.flattenAllDataForOrderTracking(data).length\n        : data.length;\n      this.totalItems.set(totalCount);\n      // For client-side pagination, apply filters\n      this.applyFilters();\n    }\n\n    this.updatePaginationState();\n\n    // Initialize original order for drag and drop\n    this.initializeOriginalOrder();\n\n    // Also refresh order tracking to ensure it's up to date\n    this.refreshOrderTracking();\n  }\n\n  /**\n   * Initialize default grouping for columns with groupable: true\n   * Only groups visible columns (not hidden ones)\n   */\n  private initializeDefaultGrouping(): void {\n    // If grouping is disabled in column menu, clear any existing grouping\n    const columnMenuConfig = this.mergedConfig().columnMenu;\n    if (columnMenuConfig && columnMenuConfig.showGroupBy === false) {\n      // Clear any existing grouping when showGroupBy is disabled\n      if (this.groupedColumns().length > 0) {\n        this.groupedColumns.set([]);\n        this.expandedGroups.set(new Set());\n      }\n      return; // Don't initialize grouping if it's disabled\n    }\n\n    // Only initialize if groupedColumns is empty (not already set)\n    if (this.groupedColumns().length === 0) {\n      const columns = this.mergedConfig().columns || [];\n      const hidden = this.hiddenColumns();\n      // Only auto-group visible columns that are groupable (exclude hidden columns)\n      const groupableColumns = columns\n        .filter(col => col.groupable === true && !col.hidden && !hidden.includes(col.key))\n        .map(col => col.key);\n\n      if (groupableColumns.length > 0) {\n        console.log('🔍 Auto-applying grouping for visible columns:', groupableColumns);\n        this.groupedColumns.set(groupableColumns);\n        // Reset auto-expand flag so groups will be expanded on first render\n        this.hasAutoExpandedGroups = false;\n      }\n    }\n  }\n\n  /**\n   * Check if groups should be auto-expanded (only on initial load)\n   */\n  private shouldAutoExpandGroups(): boolean {\n    // Auto-expand only once on initial load when default grouping is applied\n    if (this.groupedColumns().length > 0) {\n      // Check if this is default grouping (all groupable columns are grouped)\n      const columns = this.mergedConfig().columns || [];\n      const groupableColumns = columns\n        .filter(col => col.groupable === true)\n        .map(col => col.key);\n      const grouped = this.groupedColumns();\n\n      // If all groupable columns are grouped, this is likely default grouping\n      const isDefaultGrouping = groupableColumns.length > 0 &&\n        groupableColumns.every(key => grouped.includes(key));\n\n      // Only auto-expand if it's default grouping and we haven't marked it as done yet\n      if (isDefaultGrouping && !this.hasAutoExpandedGroups) {\n        // Mark as done after first check, but allow all groups in this grouping pass to be expanded\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Get the unique identifier for an item\n   */\n  private getItemId(item: T): string | null {\n    if (item && typeof item === 'object') {\n      // Use trackBy from config, fallback to '_id' if not specified\n      const trackBy = this.mergedConfig().trackBy || '_id';\n      const id = this.getNestedValue(item, trackBy);\n      return id ? String(id) : null;\n    }\n    return null;\n  }\n\n  /**\n   * Get the order value for an item from the config\n   */\n  private getItemOrder(item: T): number {\n    const dragDropConfig = this.getDragDropConfig();\n    if (dragDropConfig?.orderField) {\n      const orderValue = this.getNestedValue(item, dragDropConfig.orderField);\n      return typeof orderValue === 'number' ? orderValue : 0;\n    }\n    return 0;\n  }\n\n  /**\n   * Initialize the original order for drag and drop\n   */\n  private initializeOriginalOrder(): void {\n    if (this.isDragDropEnabled()) {\n      // Get the full dataset from the config (not just displayedData)\n      const fullData = this.mergedConfig().data || [];\n\n      // Flatten the data to include all items (parents and children) for hierarchical structures\n      const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n\n      // Completely build the order tracking from current data\n      this.rowOrderMap.clear();\n      this.initialDataOrderIds = [];\n\n      // Build the order tracking with flattened data\n      flattenedData.forEach((item, index) => {\n        const itemId = this.getItemId(item);\n        if (itemId) {\n          const actualOrder = this.getItemOrder(item);\n          this.initialDataOrderIds.push(itemId);\n          this.rowOrderMap.set(itemId, {\n            oldPosition: actualOrder || (index + 1), // Use actual order or fallback to index\n            newPosition: actualOrder || (index + 1)\n          });\n        }\n      });\n\n      // Clear any existing local reordered data\n      this.localReorderedData = [];\n\n      console.log('🔍 Initial order tracking built from flattened dataset:', this.initialDataOrderIds.length, 'items (including children)');\n      console.log('🔍 Initial order map created with actual order values:', Array.from(this.rowOrderMap.entries()));\n    }\n  }\n\n  /**\n   * Refresh order tracking with current data (called when data updates)\n   */\n  private refreshOrderTracking(): void {\n    if (this.isDragDropEnabled()) {\n      // Get the current full dataset\n      const fullData = this.mergedConfig().data || [];\n\n      // Flatten the data to include all items (parents and children) for hierarchical structures\n      const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n\n      // Completely rebuild the order tracking from current data\n      this.rowOrderMap.clear();\n      this.initialDataOrderIds = [];\n\n      // Rebuild the order tracking with flattened data\n      flattenedData.forEach((item, index) => {\n        const itemId = this.getItemId(item);\n        if (itemId) {\n          const actualOrder = this.getItemOrder(item);\n          this.initialDataOrderIds.push(itemId);\n          this.rowOrderMap.set(itemId, {\n            oldPosition: actualOrder || (index + 1),\n            newPosition: actualOrder || (index + 1)\n          });\n        }\n      });\n\n      // Clear any local reordered data since data has changed\n      this.localReorderedData = [];\n      this.hasOrderChanged.set(false);\n\n      console.log('🔍 Order tracking completely rebuilt with current data:', this.initialDataOrderIds.length, 'items');\n    }\n  }\n\n  // ===== Data Processing =====\n\n  private applyFilters() {\n    let filtered = [...this.internalData()];\n    const query = this.searchQuery()?.toLowerCase();\n    const treeEnabled = this.mergedConfig().tree?.enabled;\n    const searchActive = !this.serverSidePagination && query && this.mergedConfig().search.enabled;\n\n    // Apply search filter only for client-side pagination\n    if (searchActive) {\n      if (treeEnabled) {\n        // Search in full tree (all levels) so child entities are findable\n        const fullFlat = this.flattenAllDataForOrderTracking(this.internalData());\n        filtered = fullFlat.filter(item =>\n          this.mergedConfig().search.searchableColumns.some(columnKey => {\n            const value = this.getNestedValue(item, columnKey);\n            return String(value || '')?.toLowerCase()?.includes(query);\n          })\n        );\n      } else {\n        filtered = filtered.filter(item =>\n          this.mergedConfig().search.searchableColumns.some(columnKey => {\n            const value = this.getNestedValue(item, columnKey);\n            return String(value || '')?.toLowerCase()?.includes(query);\n          })\n        );\n      }\n    }\n\n    // Flatten tree structure for display when tree is enabled (unless we already have flat search results)\n    if (treeEnabled && !searchActive) {\n      filtered = this.flattenTreeForDisplay(filtered);\n    }\n\n    // Apply column filters (when tree + search, pass matching count for totalItems)\n    const totalOverride = treeEnabled && searchActive ? filtered.length : undefined;\n    this.applyFiltersToData(filtered, totalOverride);\n\n    // Apply sorting\n    this.applySortsToData();\n  }\n\n  /**\n   * Apply sorting to filtered data\n   */\n  private applySortsToData() {\n    if (this.serverSidePagination) {\n      // For server-side pagination, sorting is handled by the server\n      return;\n    }\n\n    const sorts = this.columnSorts();\n    if (sorts.length === 0) {\n      return;\n    }\n\n    let sorted = [...this.filteredData()];\n\n    sorts.forEach(sort => {\n      const column = this.mergedConfig().columns.find(c => c.key === sort.columnKey);\n      if (!column) return;\n\n      // Use dataValueGetter if available, otherwise use valueGetter or column.key\n      const valueGetter = column.dataValueGetter || column.valueGetter || column.key;\n\n      sorted.sort((a, b) => {\n        let valueA: unknown;\n        let valueB: unknown;\n\n        if (valueGetter.includes('.') || valueGetter !== column.key) {\n          valueA = this.getNestedValue(a, valueGetter);\n          valueB = this.getNestedValue(b, valueGetter);\n        } else {\n          valueA = (a as Record<string, unknown>)[column.key];\n          valueB = (b as Record<string, unknown>)[column.key];\n        }\n\n        // Handle null/undefined values\n        if (valueA === null || valueA === undefined) valueA = '';\n        if (valueB === null || valueB === undefined) valueB = '';\n\n        // Handle objects - convert to string for comparison\n        // The consuming component should normalize data before passing to grid\n        if (typeof valueA === 'object' && valueA !== null && !Array.isArray(valueA) && !(valueA instanceof Date)) {\n          valueA = String(valueA);\n        }\n\n        if (typeof valueB === 'object' && valueB !== null && !Array.isArray(valueB) && !(valueB instanceof Date)) {\n          valueB = String(valueB);\n        }\n\n        // Convert to strings for comparison\n        const strA = String(valueA || '').toLowerCase();\n        const strB = String(valueB || '').toLowerCase();\n\n        // Compare\n        let comparison = 0;\n        if (strA < strB) {\n          comparison = -1;\n        } else if (strA > strB) {\n          comparison = 1;\n        }\n\n        return sort.direction === 'asc' ? comparison : -comparison;\n      });\n    });\n\n    this.filteredData.set(sorted);\n    this.totalItems.set(sorted.length);\n    this.updatePaginationState();\n  }\n\n  /**\n   * Preserve tree expansion state from current data\n   */\n  private preserveTreeExpansionState(currentData: T[]): Map<string, boolean> {\n    const expansionState = new Map<string, boolean>();\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return expansionState;\n\n    const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\n\n    const extractExpansionState = (items: T[]) => {\n      items.forEach(item => {\n        const itemId = String(this.getNestedValue(item, primaryKey) || '');\n        if (itemId) {\n          const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n          expansionState.set(itemId, isExpanded);\n        }\n\n        // Check for children recursively\n        const children = this.getNestedValue(item, treeConfig.childrenKey || 'children') as T[] || [];\n        if (children.length > 0) {\n          extractExpansionState(children);\n        }\n      });\n    };\n\n    extractExpansionState(currentData);\n    console.log('🔍 DataGrid: Preserved expansion state for', expansionState.size, 'items');\n    return expansionState;\n  }\n\n  /**\n   * Apply preserved tree expansion state to new data\n   */\n  private applyTreeExpansionState(data: T[], expansionState: Map<string, boolean>): T[] {\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return data;\n\n    const { expandedKey = 'isExpanded', primaryKey, childrenKey = 'children' } = treeConfig;\n\n    const applyToItems = (items: T[]): T[] => {\n      return items.map(item => {\n        const itemId = String(this.getNestedValue(item, primaryKey) || '');\n        const isExpanded = expansionState.get(itemId) || false;\n\n        const updatedItem = {\n          ...item,\n          [expandedKey]: isExpanded\n        } as T;\n\n        // Apply to children recursively\n        const children = this.getNestedValue(item, childrenKey) as T[] || [];\n        if (children.length > 0) {\n          this.setNestedValue(updatedItem, childrenKey, applyToItems(children));\n        }\n\n        return updatedItem;\n      });\n    };\n\n    return applyToItems(data);\n  }\n\n  /**\n   * Transform flat data to tree structure based on foreign key relationships\n   */\n  private transformToTree(data: T[]): T[] {\n    console.log('transformToTree - input data:', data.length, 'items');\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return data;\n\n    const { primaryKey, foreignKey, childrenKey = 'children', levelKey = 'level', expandedKey = 'isExpanded', hasChildrenKey = 'hasChildren' } = treeConfig;\n\n    // Always add level key to each row during processing\n\n    // Create a map for quick lookup\n    const itemMap = new Map<string, T>();\n    const processedItems = new Set<string>();\n    const rootItems: T[] = [];\n\n    const defaultExpanded = !!treeConfig.defaultExpandAll;\n    // First pass: create tree items with default properties and level key\n    data.forEach(item => {\n      const treeItem = {\n        ...item,\n        [levelKey]: 0,\n        level: 0,  // Always add 'level' property for consistent access\n        [expandedKey]: defaultExpanded,\n        [hasChildrenKey]: false,\n        [childrenKey]: []\n      } as T;\n      itemMap.set(String(this.getNestedValue(item, primaryKey) || ''), treeItem);\n    });\n\n    // Multi-pass hierarchy building to handle items in any order\n    let remainingItems = [...data];\n    const maxIterations = data.length; // Prevent infinite loops\n    let iteration = 0;\n\n    while (remainingItems.length > 0 && iteration < maxIterations) {\n      const itemsToProcess = [...remainingItems];\n      remainingItems = [];\n\n      console.log(`Iteration ${iteration + 1}: Processing ${itemsToProcess.length} items`);\n\n      itemsToProcess.forEach(item => {\n        const itemId = String(this.getNestedValue(item, primaryKey) || '');\n        const parentIdValue = this.getNestedValue(item, foreignKey);\n        // Extract parent ID generically - handle both string IDs and nested objects\n        const parentId = this.extractIdFromForeignKey(parentIdValue, primaryKey);\n        const treeItem = itemMap.get(itemId);\n\n        // Skip if already processed\n        if (processedItems.has(itemId)) {\n          return;\n        }\n\n        if (treeItem && parentId && itemMap.has(parentId)) {\n          // This is a child item - check if parent is processed or is a root\n          const parent = itemMap.get(parentId)!;\n          const parentParentIdValue = this.getNestedValue(parent, foreignKey);\n          const parentParentId = this.extractIdFromForeignKey(parentParentIdValue, primaryKey);\n          const isParentRoot = !parentParentId || parentParentId === null || parentParentId === undefined;\n\n          if (isParentRoot || processedItems.has(parentId)) {\n            // Parent is processed or is root, we can process this child\n            const parentChildren = this.getNestedValue(parent, childrenKey) as T[] || [];\n\n            // Avoid adding duplicates\n            const childExists = parentChildren.some(child =>\n              String(this.getNestedValue(child, primaryKey) || '') === itemId\n            );\n\n            if (!childExists) {\n              // Calculate level based on parent - automatically set level key\n              const parentLevel = this.getNestedValue(parent, levelKey) as number || 0;\n              const childLevel = parentLevel + 1;\n\n              // Update child item with correct level\n              const updatedTreeItem = {\n                ...treeItem,\n                [levelKey]: childLevel\n              } as T;\n              itemMap.set(itemId, updatedTreeItem);\n\n              // Add updated child to parent's children array\n              parentChildren.push(updatedTreeItem);\n\n              // Update parent properties\n              const updatedParent = {\n                ...parent,\n                [childrenKey]: parentChildren,\n                [hasChildrenKey]: true\n              } as T;\n              itemMap.set(parentId, updatedParent);\n\n              processedItems.add(itemId);\n            }\n          } else {\n            // Parent not processed yet, defer this item\n            remainingItems.push(item);\n          }\n        } else if (treeItem) {\n          // This is a root item - automatically set level to 0\n          const updatedRootItem = {\n            ...treeItem,\n            [levelKey]: 0\n          } as T;\n          itemMap.set(itemId, updatedRootItem);\n\n          if (!rootItems.some(rootItem =>\n            String(this.getNestedValue(rootItem, primaryKey) || '') === itemId\n          )) {\n            rootItems.push(updatedRootItem);\n            processedItems.add(itemId);\n          }\n        }\n      });\n\n      iteration++;\n    }\n\n    // Handle any remaining unprocessed items as roots (orphaned items)\n    remainingItems.forEach(item => {\n      const itemId = String(this.getNestedValue(item, primaryKey) || '');\n      if (!processedItems.has(itemId)) {\n        const treeItem = itemMap.get(itemId);\n        if (treeItem && !rootItems.includes(treeItem)) {\n          console.log(`Adding orphaned item ${itemId} as root`);\n          rootItems.push(treeItem);\n        }\n      }\n    });\n\n    // Final pass: Update hasChildren property for all items in the tree\n    const updateHasChildren = (items: T[]) => {\n      items.forEach((item, index) => {\n        const itemId = String(this.getNestedValue(item, primaryKey) || '');\n        const children = this.getNestedValue(item, childrenKey) as T[] || [];\n        const hasChildren = children.length > 0;\n\n        // Update the item with correct hasChildren property\n        const updatedItem = {\n          ...item,\n          [hasChildrenKey]: hasChildren\n        } as T;\n\n        // Update in the map\n        itemMap.set(itemId, updatedItem);\n\n        // Update the item in the array\n        items[index] = updatedItem;\n\n        // Recursively update children\n        if (children.length > 0) {\n          updateHasChildren(children);\n        }\n      });\n    };\n\n    // Get updated root items from the map to ensure we have the latest versions\n    const updatedRootItems = rootItems.map(rootItem => {\n      const rootId = String(this.getNestedValue(rootItem, primaryKey) || '');\n      return itemMap.get(rootId) || rootItem;\n    });\n\n    // Update all root items and their descendants\n    updateHasChildren(updatedRootItems);\n\n    console.log('transformToTree - root items:', updatedRootItems.length);\n    console.log('CC - processed items:', processedItems.size);\n    console.log('transformToTree - sample root item with level:', updatedRootItems[0]);\n    return updatedRootItems;\n  }\n\n  /**\n   * Recursively calculate item level in hierarchy for unlimited depth support\n   */\n  private calculateItemLevel(item: T, itemMap: Map<string, T>, primaryKey: string, foreignKey: string, levelKey: string): number {\n    // Check if level is already set correctly\n    const currentLevel = this.getNestedValue(item, levelKey) as number;\n    if (currentLevel !== undefined && currentLevel > 0) {\n      return currentLevel;\n    }\n\n    // Get parent information\n    const itemId = String(this.getNestedValue(item, primaryKey) || '');\n    const parentIdValue = this.getNestedValue(item, foreignKey);\n    // Extract parent ID generically - handle both string IDs and nested objects\n    const parentId = this.extractIdFromForeignKey(parentIdValue, primaryKey);\n\n    // If no parent, this is a root item (level 0)\n    if (!parentId || !itemMap.has(parentId)) {\n      return 0;\n    }\n\n    // Recursively calculate parent level and add 1\n    const parent = itemMap.get(parentId)!;\n    const parentLevel = this.calculateItemLevel(parent, itemMap, primaryKey, foreignKey, levelKey);\n\n    // Update the item's level in the map\n    const updatedItem = {\n      ...item,\n      [levelKey]: parentLevel + 1\n    } as T;\n    itemMap.set(itemId, updatedItem);\n\n    return parentLevel + 1;\n  }\n\n  /**\n   * Flatten tree structure for display, respecting expansion state with unlimited nesting\n   */\n  private flattenTreeForDisplay(treeItems: T[]): T[] {\n    const result: T[] = [];\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return treeItems;\n\n    const { childrenKey = 'children', expandedKey = 'isExpanded' } = treeConfig;\n\n    const flatten = (items: T[], currentLevel: number = 0) => {\n      items.forEach(item => {\n        result.push(item);\n        const children = this.getNestedValue(item, childrenKey) as T[] || [];\n        const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n\n        if (children.length > 0 && isExpanded) {\n          console.log(`Flattening children for item at level ${currentLevel}, children count: ${children.length}`);\n          flatten(children, currentLevel + 1);\n        }\n      });\n    };\n\n    flatten(treeItems);\n    console.log('flattenTreeForDisplay - result:', result.length, 'items');\n    return result;\n  }\n\n  /**\n   * Flatten tree structure for grouping while preserving parent-child relationships\n   */\n  private flattenTreeForGrouping(treeItems: T[]): T[] {\n    const result: T[] = [];\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return treeItems;\n\n    const { childrenKey = 'children' } = treeConfig;\n\n    // Flatten all items for grouping, but preserve the children structure in each parent\n    // This ensures that when we restore, we can show children when parent is expanded\n    const flatten = (items: T[]) => {\n      items.forEach(item => {\n        // Create a copy of the item to add to flat list\n        // But preserve the original children array in the item itself\n        const itemCopy = { ...item };\n        result.push(itemCopy);\n\n        // Recursively flatten children\n        // Note: The children remain in the original item's children array\n        // They are also added to the flat list for grouping\n        const children = this.getNestedValue(item, childrenKey) as T[] || [];\n        if (children.length > 0) {\n          flatten(children);\n        }\n      });\n    };\n\n    flatten(treeItems);\n    return result;\n  }\n\n  /**\n   * Restore tree structure within grouped data\n   * This method processes grouped data and restores parent-child relationships\n   */\n  private restoreTreeStructureInGroups(groupedData: T[]): T[] {\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return groupedData;\n\n    const { primaryKey, foreignKey, childrenKey = 'children', expandedKey = 'isExpanded', levelKey = 'level' } = treeConfig;\n    const result: T[] = [];\n    const itemMap = new Map<string, T>();\n\n    // First pass: build a map of all items and nest children under parents\n    groupedData.forEach(item => {\n      // If it's a group header, add it directly to result\n      if ((item as any)?._isGroupHeader) {\n        result.push(item);\n        return;\n      }\n\n      const itemId = String(this.getNestedValue(item, primaryKey) || '');\n      if (!itemId) {\n        result.push(item);\n        return;\n      }\n\n      // Store item in map\n      itemMap.set(itemId, item);\n\n      // Get parent ID\n      const parentIdValue = this.getNestedValue(item, foreignKey);\n      const parentId = this.extractIdFromForeignKey(parentIdValue, primaryKey);\n\n      if (parentId && itemMap.has(parentId)) {\n        // Item has a parent - add to parent's children\n        const parent = itemMap.get(parentId)!;\n        let children = this.getNestedValue(parent, childrenKey) as T[] || [];\n        if (!Array.isArray(children)) {\n          children = [];\n        }\n        // Check if already added\n        const exists = children.some(child =>\n          String(this.getNestedValue(child, primaryKey) || '') === itemId\n        );\n        if (!exists) {\n          children.push(item);\n          this.setNestedValue(parent, childrenKey, children);\n          this.setNestedValue(parent, 'hasChildren', true);\n        }\n      } else {\n        // No parent or parent not found - add as root\n        result.push(item);\n      }\n    });\n\n    // Second pass: flatten the tree structure for display, showing children when parent is expanded\n    const flattenedResult: T[] = [];\n    const processItem = (item: T, depth: number = 0): void => {\n      // If it's a group header, add it directly\n      if ((item as any)?._isGroupHeader) {\n        flattenedResult.push(item);\n        return;\n      }\n\n      // Add the item with its level\n      const itemWithLevel = {\n        ...item,\n        [levelKey]: depth\n      } as T;\n      flattenedResult.push(itemWithLevel);\n\n      // Check if item has children and is expanded\n      const children = this.getNestedValue(item, childrenKey) as T[] || [];\n      const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n\n      // If item is expanded and has children, recursively process children\n      if (isExpanded && Array.isArray(children) && children.length > 0) {\n        children.forEach(child => {\n          processItem(child, depth + 1);\n        });\n      }\n    };\n\n    // Process all root items (items that were added directly to result)\n    result.forEach(item => {\n      processItem(item);\n    });\n\n    return flattenedResult;\n  }\n\n  /**\n   * Toggle expand/collapse state of a tree item with unlimited nesting support\n   */\n  private toggleTreeExpand(item: T): void {\n    const treeConfig = this.mergedConfig().tree;\n    if (!treeConfig) return;\n\n    const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\n    const currentExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n    const itemId = String(this.getNestedValue(item, primaryKey) || '');\n\n    console.log(`toggleTreeExpand - item: ${itemId}, current expanded: ${currentExpanded}`);\n\n    // Update the expanded state\n    const updatedItem = {\n      ...item,\n      [expandedKey]: !currentExpanded\n    } as T;\n\n    // Update the item in the tree structure recursively\n    const updateItemInTree = (treeData: T[]): T[] => {\n      return treeData.map(treeItem => {\n        const treeItemId = String(this.getNestedValue(treeItem, primaryKey) || '');\n\n        if (treeItemId === itemId) {\n          console.log(`Found item to update: ${itemId}, new expanded state: ${!currentExpanded}`);\n          return updatedItem;\n        }\n\n        // Check children recursively\n        const { childrenKey = 'children' } = treeConfig;\n        const children = this.getNestedValue(treeItem, childrenKey) as T[] || [];\n        if (children.length > 0) {\n          const updatedChildren = updateItemInTree(children);\n          const updatedItem = {\n            ...treeItem\n          } as T;\n          this.setNestedValue(updatedItem, childrenKey, updatedChildren);\n          return updatedItem;\n        }\n\n        return treeItem;\n      });\n    };\n\n    // Update the internal data\n    const updatedData = updateItemInTree([...this.internalData()]);\n    this.internalData.set(updatedData);\n\n    // Re-apply filters to update the display\n    this.applyFilters();\n  }\n\n  private updatePaginationState() {\n    const total = Math.ceil(this.totalItems() / this.pageSize());\n    this.totalPages.set(total);\n\n    // Ensure current page is within bounds\n    if (total === 0) {\n      this.currentPage.set(1);\n    } else if (this.currentPage() > total) {\n      this.currentPage.set(total);\n    }\n  }\n\n  // ===== Pagination Methods =====\n\n  onPageChange(page: number | string) {\n    console.log('🔄 DataGrid: onPageChange called with page:', page);\n    const pageNum = typeof page === 'string' ? parseInt(page, 10) : page;\n    console.log('🔄 DataGrid: Parsed page number:', pageNum, 'Total pages:', this.totalPages());\n\n    if (pageNum >= 1 && pageNum <= this.totalPages()) {\n      // Set page change loading state\n      this.pageChangeLoading.set(true);\n      console.log('🔄 DataGrid: Set page change loading to true');\n\n      this.currentPage.set(pageNum);\n\n      if (this.serverSidePagination) {\n        const pageData = { page: pageNum, pageSize: this.pageSize() };\n        console.log('🔄 DataGrid: Emitting pageChange event for server-side pagination:', pageData);\n        // Emit page data object for server-side pagination\n        this.emitEvent('pageChange', pageData as unknown as T);\n        // Don't clear loading state here - let the parent component handle it\n        // The loading state will be cleared when new data arrives via ngOnChanges\n      } else {\n        console.log('🔄 DataGrid: Emitting pageChange event for client-side pagination:', pageNum);\n        // Emit simple page number for client-side pagination\n        this.emitEvent('pageChange', pageNum);\n        // Clear loading state for client-side pagination\n        this.clearPageChangeLoading();\n      }\n    } else {\n      console.log('🔄 DataGrid: Page number out of range, not emitting event');\n    }\n  }\n\n  onPageSizeChange() {\n    // Set page change loading state\n    this.pageChangeLoading.set(true);\n\n    this.currentPage.set(1);\n    this.updatePaginationState();\n\n    if (this.serverSidePagination) {\n      // Emit page data object for server-side pagination\n      this.emitEvent('pageChange', { page: 1, pageSize: this.pageSize() } as unknown as T);\n      // Don't clear loading state here - let the parent component handle it\n      // The loading state will be cleared when new data arrives via ngOnChanges\n    } else {\n      // Emit page and pageSize so parent can keep config in sync (prevents reset to default when data reloads)\n      this.emitEvent('pageChange', { page: 1, pageSize: this.pageSize() } as unknown as T);\n      // Clear loading state for client-side pagination\n      this.clearPageChangeLoading();\n    }\n  }\n\n  updatePageSize(value: string | number | string[]) {\n    // Handle array case (shouldn't happen for page size, but just in case)\n    const pageSizeValue = Array.isArray(value) ? value[0] : value;\n    this.pageSize.set(+pageSizeValue);\n    this.onPageSizeChange();\n  }\n\n  previousPage() {\n    if (this.hasPreviousPage()) {\n      this.onPageChange(this.currentPage() - 1);\n    }\n  }\n\n  nextPage() {\n    if (this.hasNextPage()) {\n      if (this.mergedConfig().pagination.infiniteScroll) {\n        this.isAppendMode = true;\n      }\n      this.onPageChange(this.currentPage() + 1);\n    }\n  }\n\n  onJumpToPage() {\n    if (this.jumpToPage >= 1 && this.jumpToPage <= this.totalPages()) {\n      this.onPageChange(this.jumpToPage);\n    }\n  }\n\n  getEnhancedPageNumbers(): (number | string)[] {\n    const total = this.totalPages();\n    const current = this.currentPage();\n    const pages: (number | string)[] = [];\n\n    if (total <= 7) {\n      for (let i = 1; i <= total; i++) {\n        pages.push(i);\n      }\n    } else {\n      pages.push(1);\n\n      if (current <= 4) {\n        for (let i = 2; i <= 5; i++) {\n          pages.push(i);\n        }\n        pages.push('...');\n        pages.push(total);\n      } else if (current >= total - 3) {\n        pages.push('...');\n        for (let i = total - 4; i <= total; i++) {\n          pages.push(i);\n        }\n      } else {\n        pages.push('...');\n        for (let i = current - 1; i <= current + 1; i++) {\n          pages.push(i);\n        }\n        pages.push('...');\n        pages.push(total);\n      }\n    }\n\n    return pages;\n  }\n\n  // ===== Search Methods =====\n\n  updateSearchQuery(value: inputType) {\n    console.log('updateSearchQuery', value);\n    const searchValue = value as string;\n    this.searchQuery.set(searchValue);\n\n    // Clear any existing debounce timer\n    if (this.searchDebounceTimer) {\n      clearTimeout(this.searchDebounceTimer);\n    }\n\n    // If search is cleared (empty), trigger search immediately without debounce\n    if (!searchValue || searchValue.trim() === '') {\n      console.log('Search cleared, triggering immediate search event');\n      this.currentPage.set(1);\n      if (this.serverSidePagination) {\n        this.emitEvent('search', searchValue);\n      } else {\n        this.onSearch();\n      }\n      return;\n    }\n\n    // Apply debounce for non-empty search queries\n    const debounceMs = this.mergedConfig().search.debounceMs || 300;\n    this.searchDebounceTimer = setTimeout(() => {\n      // Only emit search event for server-side pagination\n      // Don't trigger any client-side filtering that might cause re-renders\n      if (this.serverSidePagination) {\n        this.currentPage.set(1);\n        this.emitEvent('search', searchValue);\n      } else {\n        this.onSearch();\n      }\n    }, debounceMs);\n  }\n\n  onSearch() {\n    this.currentPage.set(1);\n\n    if (this.serverSidePagination) {\n      // For server-side pagination, only emit the search event\n      // Don't apply client-side filters as the server will handle the search\n      this.emitEvent('search', this.searchQuery());\n    } else {\n      // For client-side pagination, apply filters locally\n      this.applyFilters();\n      this.emitEvent('search', this.searchQuery());\n    }\n  }\n\n  // ===== Action Methods =====\n\n  onRefresh() {\n    this.isRefreshing.set(true);\n    this.emitEvent('refresh', null);\n\n    // The parent component should handle the actual refresh and call setRefreshing(false) when done\n    // We don't auto-reset here to allow the parent to control the refresh state\n  }\n\n  // Method to allow parent components to control the refreshing state\n  setRefreshing(isRefreshing: boolean) {\n    this.isRefreshing.set(isRefreshing);\n  }\n\n  // Method to clear page change loading state when new data is received\n  clearPageChangeLoading() {\n    this.pageChangeLoading.set(false);\n  }\n\n  // ===== Tree View Helper Methods =====\n\n  /**\n   * Check if tree view is enabled\n   */\n  isTreeEnabled(): boolean {\n    const enabled = this.mergedConfig().tree?.enabled || false;\n    return enabled;\n  }\n\n  /**\n   * Get tree configuration\n   */\n  getTreeConfig() {\n    return this.mergedConfig().tree;\n  }\n\n  /**\n   * Check if an item has children\n   */\n  hasChildren(item: T): boolean {\n    const treeConfig = this.getTreeConfig();\n    if (!treeConfig) return false;\n\n    const { hasChildrenKey = 'hasChildren', childrenKey = 'children' } = treeConfig;\n\n    // Check hasChildren property first\n    const hasChildren = this.getNestedValue(item, hasChildrenKey) as boolean;\n    if (hasChildren !== undefined) {\n      return hasChildren;\n    }\n\n    // Fallback to checking children array\n    const children = this.getNestedValue(item, childrenKey) as T[];\n    return children && children.length > 0;\n  }\n\n  /**\n   * Get item level in tree\n   */\n  getItemLevel(item: T): number {\n    // Get level from tree config level key\n    const treeConfig = this.getTreeConfig();\n    if (treeConfig) {\n      const { levelKey = 'level' } = treeConfig;\n      const itemLevel = this.getNestedValue(item, levelKey) as number;\n      return itemLevel !== undefined && itemLevel !== null ? itemLevel : 0;\n    }\n    return 0;\n  }\n\n  /**\n   * Check if item is expanded\n   */\n  isItemExpanded(item: T): boolean {\n    const treeConfig = this.getTreeConfig();\n    if (!treeConfig) return false;\n\n    const { expandedKey = 'isExpanded' } = treeConfig;\n    return this.getNestedValue(item, expandedKey) as boolean || false;\n  }\n\n  /**\n   * Get tree indent style\n   */\n  getTreeIndentStyle(item: T): string {\n    const level = this.getItemLevel(item);\n\n    // Specific padding progression: Level 1=12px, Level 2=22px, Level 3=32px, Level 4=52px\n    const basePadding = 12; // Base cell padding (replaces tw-px-3)\n    let levelPadding = 0;\n\n    switch (level) {\n      case 0: // Level 1 (root)\n        levelPadding = 0;\n        break;\n      case 1: // Level 2\n        levelPadding = 10;\n        break;\n      case 2: // Level 3\n        levelPadding = 20;\n        break;\n      case 3: // Level 4\n        levelPadding = 40;\n        break;\n      default: // Level 5+\n        levelPadding = 40 + ((level - 3) * 20); // Continue with 20px increments\n        break;\n    }\n\n    const totalPadding = `${basePadding + levelPadding}px`;\n    return totalPadding;\n  }\n\n  /**\n   * Get tree level background class for visual distinction\n   */\n  getTreeLevelClass(item: T): string {\n    const level = this.getItemLevel(item);\n    if (level === 0) return 'tree-level-0'; // Root level\n    if (level === 1) return 'tree-level-1'; // First child level  \n    if (level === 2) return 'tree-level-2'; // Second child level\n    return 'tree-level-deep'; // Deep nesting (3+ levels)\n  }\n\n  // ===== Drag and Drop Helper Methods =====\n\n  /**\n   * Check if drag and drop is enabled\n   */\n  isDragDropEnabled(): boolean {\n    return this.dragDropEnabled || this.mergedConfig().dragDrop?.enabled || false;\n  }\n\n  /**\n   * Get drag and drop configuration\n   */\n  getDragDropConfig() {\n    return this.mergedConfig().dragDrop;\n  }\n\n  /**\n   * Handle drag start event\n   */\n  onDragStart(event: DragEvent, item: T, index: number): void {\n    if (!this.isDragDropEnabled()) return;\n\n    this.isDragging.set(true);\n\n    // Store the current order IDs when drag starts for comparison\n    this.originalOrderIds = this.displayedData.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\n    console.log('🔍 Drag started, current order IDs stored:', this.originalOrderIds);\n\n    const dragConfig = this.getDragDropConfig();\n    const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\n\n    if (event.dataTransfer) {\n      event.dataTransfer.effectAllowed = 'move';\n      event.dataTransfer.setData('text/plain', JSON.stringify({ item, index }));\n    }\n\n    // Find the closest tr element and apply drag styles\n    const rowElement = (event.target as HTMLElement).closest('tr');\n    if (rowElement) {\n      dragClass.split(' ').forEach(cls => rowElement.classList.add(cls));\n      // Add additional visual feedback\n      rowElement.style.transform = 'scale(1.02)';\n      rowElement.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)';\n      rowElement.style.zIndex = '1000';\n    }\n  }\n\n  /**\n   * Handle drag over event\n   */\n  onDragOver(event: DragEvent): void {\n    if (!this.isDragDropEnabled()) return;\n\n    event.preventDefault();\n    event.dataTransfer!.dropEffect = 'move';\n\n    // Find the row index from the closest tr element\n    const rowElement = (event.target as HTMLElement).closest('tr');\n    if (rowElement) {\n      // Use data-index attribute to get absolute row index if available\n      const dataIndex = rowElement.getAttribute('data-index');\n      if (dataIndex !== null) {\n        this.isDragOverRow = Number(dataIndex);\n      } else {\n        const tbody = rowElement.closest('tbody');\n        if (tbody) {\n          const rowIndex = Array.from(tbody.children).indexOf(rowElement);\n          this.isDragOverRow = rowIndex;\n        }\n      }\n    }\n  }\n\n  /**\n   * Handle drag leave event\n   */\n  onDragLeave(event: DragEvent): void {\n    console.log('onDragLeave', event);\n    if (!this.isDragDropEnabled()) return;\n\n    // Clear drag over row tracking\n    this.isDragOverRow = null;\n  }\n\n  /**\n   * Handle drop event\n   */\n  onDrop(event: DragEvent, targetItem: T, targetIndex: number): void {\n    if (!this.isDragDropEnabled()) return;\n\n    event.preventDefault();\n\n    // Clear drag over row tracking\n    this.isDragOverRow = null;\n\n    try {\n      const data = JSON.parse(event.dataTransfer!.getData('text/plain'));\n      const sourceItem = data.item as T;\n      const sourceIndex = data.index as number;\n\n      if (sourceIndex !== targetIndex) {\n        const newOrder = this.getNewOrder(sourceIndex, targetIndex);\n        console.log('🔍 Drop completed, updating local order only:', { sourceItem, sourceIndex, targetItem, targetIndex, newOrder });\n\n        // Update the row order map with new positions (LOCAL ONLY)\n        this.updateRowOrderMap(newOrder);\n\n        // Update local data for visual reordering (LOCAL ONLY)\n        this.updateLocalDataOrder(newOrder);\n\n        // Check if any row has changed position\n        const hasActuallyChanged = this.checkIfOrderChanged();\n        this.hasOrderChanged.set(hasActuallyChanged);\n        console.log('🔍 Local order changed:', hasActuallyChanged);\n\n        // IMPORTANT: DO NOT emit reorder event here - only store locally\n        // External components will be updated only when \"Save Order\" is clicked\n        console.log('🔍 Order change stored locally - external components not updated until save');\n      } else {\n        console.log('Source and target index are the same, skipping reorder');\n      }\n    } catch (error) {\n      console.error('Error parsing drag data:', error);\n    }\n  }\n\n  /**\n   * Handle drag end event\n   */\n  onDragEnd(event: DragEvent): void {\n    if (!this.isDragDropEnabled()) return;\n\n    this.isDragging.set(false);\n\n    // Check if order has changed after drag ends\n    const hasActuallyChanged = this.checkIfOrderChanged();\n    this.hasOrderChanged.set(hasActuallyChanged);\n\n    const dragConfig = this.getDragDropConfig();\n    const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\n\n    // Clear drag over row tracking\n    this.isDragOverRow = null;\n\n    // Find the closest tr element and remove drag styles\n    const rowElement = (event.target as HTMLElement).closest('tr');\n    if (rowElement) {\n      dragClass.split(' ').forEach(cls => rowElement.classList.remove(cls));\n      // Remove additional visual feedback\n      rowElement.style.transform = '';\n      rowElement.style.boxShadow = '';\n      rowElement.style.zIndex = '';\n    }\n  }\n\n  /**\n   * Calculate new order after reordering\n   */\n  private getNewOrder(sourceIndex: number, targetIndex: number): T[] {\n    const data = [...this.displayedData];\n    const [movedItem] = data.splice(sourceIndex, 1);\n    data.splice(targetIndex, 0, movedItem);\n    return data;\n  }\n\n  /**\n   * Get the current order number for a specific item\n   */\n  getCurrentOrderNumber(item: T): number {\n    const itemId = this.getItemId(item);\n    if (itemId && this.rowOrderMap.has(itemId)) {\n      return this.rowOrderMap.get(itemId)!.newPosition;\n    }\n\n    // Fallback to actual order field value from config\n    const actualOrder = this.getItemOrder(item);\n    if (actualOrder > 0) {\n      return actualOrder;\n    }\n\n    // Final fallback to index-based calculation\n    const trackBy = this.mergedConfig().trackBy || '_id';\n    const currentIndex = this.displayedData.findIndex(currentItem => {\n      if (item && currentItem && typeof item === 'object' && typeof currentItem === 'object') {\n        const itemId = this.getNestedValue(item, trackBy);\n        const currentItemId = this.getNestedValue(currentItem, trackBy);\n        return itemId && currentItemId && itemId === currentItemId;\n      }\n      return item === currentItem;\n    });\n    return currentIndex >= 0 ? currentIndex + 1 : 0;\n  }\n\n  /**\n   * Update the row order map with new positions after reordering\n   */\n  private updateRowOrderMap(newOrder: T[]): void {\n    newOrder.forEach((item, index) => {\n      const itemId = this.getItemId(item);\n      if (itemId && this.rowOrderMap.has(itemId)) {\n        const currentEntry = this.rowOrderMap.get(itemId)!;\n        // Calculate new order value based on position and original order field\n        const dragDropConfig = this.getDragDropConfig();\n        if (dragDropConfig?.orderField) {\n          // Use the order field from config to calculate new order values\n          const baseOrder = Math.min(...this.displayedData.map(item => this.getItemOrder(item)));\n          const newOrderValue = baseOrder + index;\n          currentEntry.newPosition = newOrderValue;\n\n          // IMPORTANT: Update the actual sequence value in the item itself\n          this.setNestedValue(item, dragDropConfig.orderField, newOrderValue);\n        } else {\n          // Fallback to index-based position\n          const newOrderValue = index + 1;\n          currentEntry.newPosition = newOrderValue;\n\n          // Update the actual sequence value in the item itself\n          if (dragDropConfig?.orderField) {\n            this.setNestedValue(item, dragDropConfig.orderField, newOrderValue);\n          }\n        }\n        this.rowOrderMap.set(itemId, currentEntry);\n      }\n    });\n\n    console.log('🔍 Row order map updated with new order values:', Array.from(this.rowOrderMap.entries()));\n  }\n\n  /**\n   * Check if any row has changed position by comparing old vs new positions\n   */\n  private checkIfOrderChanged(): boolean {\n    for (const [itemId, orderInfo] of this.rowOrderMap) {\n      if (orderInfo.oldPosition !== orderInfo.newPosition) {\n        console.log('🔍 Order change detected for item:', itemId, orderInfo);\n        return true;\n      }\n    }\n    console.log('🔍 No order change detected');\n    return false;\n  }\n\n  /**\n   * Reset the row order map to original positions (for reset action)\n   * Includes all items from hierarchical structure (parents and children)\n   */\n  private resetRowOrderMap(): void {\n    // Get the current full dataset from the config (not cached data)\n    const fullData = this.mergedConfig().data || [];\n\n    // Flatten the data to include all items (parents and children) for hierarchical structures\n    const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n\n    // Completely rebuild the order tracking from current data\n    this.rowOrderMap.clear();\n    this.initialDataOrderIds = [];\n\n    // Rebuild the order tracking with flattened data\n    flattenedData.forEach((item, index) => {\n      const itemId = this.getItemId(item);\n      if (itemId) {\n        const actualOrder = this.getItemOrder(item);\n        this.initialDataOrderIds.push(itemId);\n        this.rowOrderMap.set(itemId, {\n          oldPosition: actualOrder || (index + 1),\n          newPosition: actualOrder || (index + 1)\n        });\n      }\n    });\n\n    // Clear any local reordered data\n    this.localReorderedData = [];\n    this.hasOrderChanged.set(false);\n\n    console.log('🔍 Row order map completely rebuilt from flattened data:', this.initialDataOrderIds.length, 'items (including children)');\n  }\n\n  /**\n   * Update the row order map baseline to current positions (for save action)\n   * Includes all items from hierarchical structure (parents and children)\n   */\n  private updateRowOrderMapBaseline(): void {\n    // Get the current full dataset from the config\n    const fullData = this.mergedConfig().data || [];\n\n    // Flatten the data to include all items (parents and children) for hierarchical structures\n    const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n\n    // Completely rebuild the order tracking from current data\n    this.rowOrderMap.clear();\n    this.initialDataOrderIds = [];\n\n    // Rebuild the order tracking with flattened data\n    flattenedData.forEach((item, index) => {\n      const itemId = this.getItemId(item);\n      if (itemId) {\n        const actualOrder = this.getItemOrder(item);\n        this.initialDataOrderIds.push(itemId);\n        this.rowOrderMap.set(itemId, {\n          oldPosition: actualOrder || (index + 1),\n          newPosition: actualOrder || (index + 1)\n        });\n      }\n    });\n\n    console.log('🔍 Row order map baseline completely rebuilt from flattened data:', this.initialDataOrderIds.length, 'items (including children)');\n  }\n\n  /**\n   * Get the current order array from the row order map\n   * Includes all items from hierarchical structure (parents and children)\n   */\n  private getCurrentOrderFromMap(): T[] {\n    const orderedItems: Array<{ item: T; newPosition: number }> = [];\n\n    // Get the full dataset from the config (not just displayedData)\n    const fullData = this.mergedConfig().data || [];\n\n    // Flatten the data to include all items (parents and children) for hierarchical structures\n    const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n\n    // Collect all items with their new positions from the flattened dataset\n    this.rowOrderMap.forEach((orderInfo, itemId) => {\n      const item = flattenedData.find(dataItem => this.getItemId(dataItem) === itemId);\n      if (item) {\n        orderedItems.push({ item, newPosition: orderInfo.newPosition });\n      }\n    });\n\n    // Sort by new position and return items in order\n    return orderedItems\n      .sort((a, b) => a.newPosition - b.newPosition)\n      .map(orderedItem => orderedItem.item);\n  }\n\n  /**\n   * Get only the items that have actually changed order\n   * Includes all items from hierarchical structure (parents and children)\n   */\n  private getChangedOrders(): T[] {\n    const changedItems: T[] = [];\n\n    // Get the full dataset from the config\n    const fullData = this.mergedConfig().data || [];\n\n    // Flatten the data to include all items (parents and children) for hierarchical structures\n    const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n\n    // Check each item to see if its position has changed\n    this.rowOrderMap.forEach((orderInfo, itemId) => {\n      const item = flattenedData.find(dataItem => this.getItemId(dataItem) === itemId);\n      if (item && orderInfo.oldPosition !== orderInfo.newPosition) {\n        changedItems.push(item);\n        console.log('🔍 Item changed order:', itemId, 'from', orderInfo.oldPosition, 'to', orderInfo.newPosition);\n      }\n    });\n\n    return changedItems;\n  }\n\n  /**\n   * Flatten all data for order tracking (includes all hierarchical children)\n   * This method ensures that all items (parents and children) are included in order tracking\n   */\n  private flattenAllDataForOrderTracking(data: T[]): T[] {\n    const flattenedItems: T[] = [];\n\n    const flattenItems = (items: T[]) => {\n      items.forEach(item => {\n        flattenedItems.push(item);\n\n        // Check if item has children (for hierarchical data)\n        const treeConfig = this.mergedConfig().tree;\n        if (treeConfig?.enabled) {\n          const childrenKey = treeConfig.childrenKey || 'children';\n          const children = this.getNestedValue(item, childrenKey) as T[] || [];\n          if (children.length > 0) {\n            flattenItems(children);\n          }\n        }\n      });\n    };\n\n    flattenItems(data);\n    console.log('🔍 Flattened data for order tracking:', flattenedItems.length, 'items (including children)');\n    return flattenedItems;\n  }\n\n  /**\n   * Update local data order for visual reordering (LOCAL ONLY)\n   */\n  private updateLocalDataOrder(newOrder: T[]): void {\n    // Store the reordered data locally for visual display\n    this.localReorderedData = [...newOrder];\n    console.log('🔍 Local data order updated for visual display:', this.localReorderedData.length, 'items');\n  }\n\n  /**\n   * Check if the current order has changed from the initial order\n   */\n  private checkOrderChanged(currentOrder: T[]): boolean {\n    if (this.initialDataOrderIds.length !== currentOrder.length) {\n      return true;\n    }\n\n    // Create arrays of IDs to compare order\n    const currentIds = currentOrder.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\n\n    // Compare the sequences\n    for (let i = 0; i < this.initialDataOrderIds.length; i++) {\n      if (this.initialDataOrderIds[i] !== currentIds[i]) {\n        console.log('🔍 Order changed detected:', {\n          position: i,\n          initial: this.initialDataOrderIds[i],\n          current: currentIds[i]\n        });\n        return true;\n      }\n    }\n\n    console.log('🔍 No order change detected');\n    return false;\n  }\n\n  onRowClick(item: T) {\n    if (this.mergedConfig().onRowClick) {\n      this.emitEvent('rowClick', item);\n    }\n  }\n\n  onActionClick(item: T | null, action: GridAction) {\n    // Handle tree expand/collapse actions\n    if (action.key === 'toggle-expand' && this.mergedConfig().tree?.enabled && item) {\n      this.toggleTreeExpand(item);\n    }\n\n    // Handle order management actions\n    if (action.key === 'reset-order') {\n      this.hasOrderChanged.set(false);\n      // Reset the row order map to current positions (LOCAL ONLY)\n      this.resetRowOrderMap();\n      // Clear local reordered data to revert to original display\n      this.localReorderedData = [];\n      console.log('🔍 Reset clicked, row order map reset locally, visual display reverted');\n    } else if (action.key === 'save-order') {\n      // Check if there are any actual changes before proceeding\n      const hasActualChanges = this.checkIfOrderChanged();\n      if (!hasActualChanges) {\n        console.log('🔍 No actual order changes detected, skipping save');\n        this.hasOrderChanged.set(false);\n        return;\n      }\n\n      // Get only the changed orders and emit them BEFORE clearing local data\n      const changedOrders = this.getChangedOrders();\n      if (changedOrders.length > 0) {\n        console.log('🔍 Emitting rowReorder event with changed orders only:', changedOrders);\n        console.log('🔍 Number of changed records:', changedOrders.length, 'out of', this.getCurrentOrderFromMap().length, 'total records');\n        // Use the expected GridEvent structure for rowReorder\n        this.emitEvent('rowReorder', {\n          sourceItem: changedOrders[0], // First changed item as source\n          sourceIndex: 0, // First position as source\n          targetItem: changedOrders[changedOrders.length - 1], // Last changed item as target\n          targetIndex: changedOrders.length - 1, // Last position as target\n          newOrder: changedOrders, // Only the records whose order actually changed\n          allOrders: this.getCurrentOrderFromMap() // Complete order for reference\n        });\n      }\n\n      // DON'T clear the local data or reset the order map here\n      // Let the parent component handle the data refresh after API call\n      // The local data will be cleared when new data arrives via ngOnChanges\n      console.log('🔍 Save clicked, rowReorder event emitted, preserving local data until API response');\n    }\n\n    if (this.actionHandlers[action.onClick]) {\n      this.actionHandlers[action.onClick](item as any, action);\n    }\n    this.emitEvent('action', item as any, undefined, action);\n  }\n\n  // ===== Column Menu Methods =====\n\n  toggleColumnMenu(columnKey: string, event?: Event) {\n    if (event) {\n      event.stopPropagation();\n    }\n    const current = this.openColumnMenu();\n    this.openColumnMenu.set(current === columnKey ? null : columnKey);\n  }\n\n  closeColumnMenu() {\n    this.openColumnMenu.set(null);\n  }\n\n  isColumnMenuOpen(columnKey: string): boolean {\n    return this.openColumnMenu() === columnKey;\n  }\n\n  onColumnSort(column: GridColumn, direction: 'asc' | 'desc') {\n    const sorts = this.columnSorts();\n    const existingIndex = sorts.findIndex(s => s.columnKey === column.key);\n\n    if (existingIndex !== -1) {\n      // Update existing sort\n      sorts[existingIndex].direction = direction;\n    } else {\n      // Add new sort (replace existing for single column sort, or add for multi-column)\n      sorts.push({ columnKey: column.key, direction });\n    }\n\n    this.columnSorts.set([...sorts]);\n    this.applySortsToData();\n    this.emitEvent('columnSort', { columnKey: column.key, direction }, column);\n    this.closeColumnMenu();\n  }\n\n  onColumnFilter(column: GridColumn, value: unknown, operator: ColumnFilter['operator'] = 'equals') {\n    const filters = this.columnFilters();\n    const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n\n    if (value === null || value === undefined || value === '') {\n      // Remove filter\n      if (existingIndex !== -1) {\n        filters.splice(existingIndex, 1);\n      }\n    } else {\n      const filter: ColumnFilter = { columnKey: column.key, value, operator };\n      if (existingIndex !== -1) {\n        // Update existing filter\n        filters[existingIndex] = filter;\n      } else {\n        // Add new filter\n        filters.push(filter);\n      }\n    }\n\n    this.columnFilters.set([...filters]);\n    this.emitEvent('columnFilter', filters, column);\n  }\n\n  onColumnAutosize(column: GridColumn) {\n    this.emitEvent('columnAutosize', column.key, column);\n    this.closeColumnMenu();\n  }\n\n  onColumnGroupBy(column: GridColumn) {\n    const grouped = this.groupedColumns();\n    const index = grouped.indexOf(column.key);\n\n    if (index !== -1) {\n      // Remove grouping\n      grouped.splice(index, 1);\n      this.groupedColumns.set([...grouped]);\n      // Clear expanded groups for this column\n      const expanded = this.expandedGroups();\n      const newExpanded = new Set(expanded);\n      expanded.forEach(key => {\n        if (key.startsWith(`${column.key}:`)) {\n          newExpanded.delete(key);\n        }\n      });\n      this.expandedGroups.set(newExpanded);\n    } else {\n      // Add grouping\n      this.groupedColumns.set([...grouped, column.key]);\n      // Expand all groups by default\n      this.expandAllGroupsForColumn(column.key);\n    }\n\n    this.emitEvent('columnGroupBy', column.key, column);\n    this.closeColumnMenu();\n  }\n\n  toggleGroupExpansion(groupKey: string) {\n    const expanded = this.expandedGroups();\n    const newExpanded = new Set(expanded);\n\n    if (newExpanded.has(groupKey)) {\n      newExpanded.delete(groupKey);\n    } else {\n      newExpanded.add(groupKey);\n    }\n\n    this.expandedGroups.set(newExpanded);\n  }\n\n  isGroupExpanded(groupKey: string): boolean {\n    return this.expandedGroups().has(groupKey);\n  }\n\n  private expandAllGroupsForColumn(columnKey: string) {\n    const data = this.filteredData();\n    const grouped = this.groupedColumns();\n    const columnIndex = grouped.indexOf(columnKey);\n    if (columnIndex === -1) return;\n\n    const column = this.mergedConfig().columns.find(c => c.key === columnKey);\n    if (!column) return;\n\n    // Expand all groups at this level and below\n    const expanded = this.expandedGroups();\n    const newExpanded = new Set(expanded);\n\n    // Recursively find all group keys for this column and nested columns\n    const findGroupKeys = (rows: T[], level: number): void => {\n      if (level >= grouped.length || rows.length === 0) return;\n\n      const currentColKey = grouped[level];\n      const currentCol = this.mergedConfig().columns.find(c => c.key === currentColKey);\n      if (!currentCol) return;\n\n      const valueGetter = currentCol.dataValueGetter || currentCol.valueGetter || currentCol.key;\n      const groups = new Map<string, T[]>();\n\n      rows.forEach(row => {\n        let rawValue: unknown;\n        if (valueGetter.includes('.') || valueGetter !== currentCol.key) {\n          rawValue = this.getNestedValue(row, valueGetter);\n        } else {\n          rawValue = (row as Record<string, unknown>)[currentCol.key];\n        }\n\n        const groupKey = `${currentColKey}:${this.getFilterValueKey(rawValue)}`;\n        const existing = groups.get(groupKey);\n        if (existing) {\n          existing.push(row);\n        } else {\n          groups.set(groupKey, [row]);\n        }\n      });\n\n      // Add all group keys at this level\n      groups.forEach((_, key) => {\n        newExpanded.add(key);\n      });\n\n      // Recursively process nested groups\n      if (level + 1 < grouped.length) {\n        groups.forEach((groupRows) => {\n          findGroupKeys(groupRows, level + 1);\n        });\n      }\n    };\n\n    findGroupKeys(data, columnIndex);\n    this.expandedGroups.set(newExpanded);\n  }\n\n  onColumnHide(column: GridColumn) {\n    const hidden = this.hiddenColumns();\n    if (!hidden.includes(column.key)) {\n      this.hiddenColumns.set([...hidden, column.key]);\n      this.emitEvent('columnHide', column.key, column);\n    }\n    this.closeColumnMenu();\n  }\n\n  onColumnShow(columnKey: string) {\n    const hidden = this.hiddenColumns();\n    const index = hidden.indexOf(columnKey);\n    if (index !== -1) {\n      hidden.splice(index, 1);\n      this.hiddenColumns.set([...hidden]);\n      const column = this.mergedConfig().columns.find(c => c.key === columnKey);\n      if (column) {\n        this.emitEvent('columnShow', columnKey, column);\n      }\n    }\n  }\n\n  onColumnReset() {\n    this.hiddenColumns.set([]);\n    this.columnFilters.set([]);\n    this.columnSorts.set([]);\n    // Reapply filters and sorting (which will be empty now)\n    this.applyFilters();\n    this.emitEvent('columnReset', null);\n    this.closeColumnMenu();\n  }\n\n  onColumnAggregation(column: GridColumn, aggregationType: 'sum' | 'avg' | 'count' | 'min' | 'max') {\n    this.emitEvent('columnAggregation', { columnKey: column.key, aggregationType }, column);\n    this.closeColumnMenu();\n  }\n\n  onManageColumns() {\n    this.showManageColumnsModal.set(true);\n    this.closeColumnMenu();\n    this.emitEvent('manageColumns', null);\n  }\n\n  closeManageColumnsModal() {\n    this.showManageColumnsModal.set(false);\n  }\n\n  toggleColumnVisibility(columnKey: string) {\n    const hidden = this.hiddenColumns();\n    const index = hidden.indexOf(columnKey);\n\n    if (index !== -1) {\n      // Show column\n      hidden.splice(index, 1);\n      this.hiddenColumns.set([...hidden]);\n      const column = this.mergedConfig().columns.find(c => c.key === columnKey);\n      if (column) {\n        this.emitEvent('columnShow', columnKey, column);\n      }\n    } else {\n      // Hide column\n      this.hiddenColumns.set([...hidden, columnKey]);\n      const column = this.mergedConfig().columns.find(c => c.key === columnKey);\n      if (column) {\n        this.emitEvent('columnHide', columnKey, column);\n      }\n    }\n  }\n\n  isColumnHidden(columnKey: string): boolean {\n    return this.hiddenColumns().includes(columnKey);\n  }\n\n  getColumnFilterValue(columnKey: string): unknown {\n    const filter = this.columnFilters().find(f => f.columnKey === columnKey);\n    return filter?.value;\n  }\n\n  getColumnSortDirection(columnKey: string): 'asc' | 'desc' | null {\n    // Access the signal to ensure reactivity\n    const sorts = this.columnSorts();\n    const sort = sorts.find(s => s.columnKey === columnKey);\n    return sort?.direction || null;\n  }\n\n  isColumnFiltered(columnKey: string): boolean {\n    return this.columnFilters().some(f => f.columnKey === columnKey);\n  }\n\n  getActiveFilterCount(columnKey: string): number {\n    const filter = this.columnFilters().find(f => f.columnKey === columnKey);\n    if (filter && filter.operator === 'in' && Array.isArray(filter.value)) {\n      return filter.value.length;\n    }\n    return 0;\n  }\n\n  toggleFilterPanel(columnKey: string, event?: Event) {\n    if (event) {\n      event.stopPropagation();\n    }\n    const current = this.showFilterPanel();\n    this.showFilterPanel.set(current === columnKey ? null : columnKey);\n    this.filterSearchTerm.set('');\n  }\n\n  closeFilterPanel() {\n    this.showFilterPanel.set(null);\n    this.filterSearchTerm.set('');\n  }\n\n  isFilterPanelOpen(columnKey: string): boolean {\n    return this.showFilterPanel() === columnKey;\n  }\n\n  getUniqueColumnValues(column: GridColumn): Array<{ value: unknown; label: string; count: number; checked: boolean }> {\n    const data = this.internalData();\n    const values = new Map<string, { value: unknown; count: number }>();\n\n    // Count occurrences of each value\n    data.forEach(row => {\n      // Use dataValueGetter if available (for filtering/export), otherwise use valueGetter or column.key\n      const valueGetter = column.dataValueGetter || column.valueGetter || column.key;\n      let rawValue = valueGetter.includes('.') || valueGetter !== column.key\n        ? this.getNestedValue(row, valueGetter)\n        : (row as Record<string, unknown>)[column.key];\n\n      // For template/custom columns, if value is undefined/null, try to extract from row\n      // This handles cases where column.key doesn't match actual data fields\n      if ((rawValue === undefined || rawValue === null) && column.type === 'custom' && !column.dataValueGetter && !column.valueGetter) {\n        rawValue = this.extractValueFromRowForTemplateColumn(row as Record<string, unknown>, column);\n      }\n\n      // Create a stable key for comparison (handle objects properly)\n      const valueKey = this.getFilterValueKey(rawValue);\n\n      const existing = values.get(valueKey);\n      if (existing) {\n        existing.count++;\n      } else {\n        values.set(valueKey, { value: rawValue, count: 1 });\n      }\n    });\n\n    // Get active filter for this column\n    const activeFilter = this.columnFilters().find(f => f.columnKey === column.key);\n    const activeValues = activeFilter?.operator === 'in' && Array.isArray(activeFilter.value)\n      ? activeFilter.value\n      : [];\n\n    // Convert to array and sort\n    const result = Array.from(values.values())\n      .map(({ value, count }) => {\n        const label = this.formatFilterValue(value, column);\n        // Check if this value is selected by comparing the value or its key\n        const valueKey = this.getFilterValueKey(value);\n        const isChecked = activeValues.length === 0 ||\n          activeValues.some(av => this.getFilterValueKey(av) === valueKey);\n\n        return {\n          value,\n          label,\n          count,\n          checked: isChecked\n        };\n      })\n      .sort((a, b) => {\n        // Sort by label\n        if (a.label < b.label) return -1;\n        if (a.label > b.label) return 1;\n        return 0;\n      });\n\n    // Filter by search term\n    const searchTerm = this.filterSearchTerm().toLowerCase();\n    if (searchTerm) {\n      return result.filter(item => item.label.toLowerCase().includes(searchTerm));\n    }\n\n    return result;\n  }\n\n  /**\n   * Extract value from row for template columns when column.key doesn't exist\n   * Tries common field patterns based on column key\n   */\n  private extractValueFromRowForTemplateColumn(row: Record<string, unknown>, column: GridColumn): unknown {\n    const rowData = row as Record<string, unknown>;\n\n    // Try to find a field that matches the column key pattern\n    // Try variations like: key, key_text, key_name, key_title, key_display\n    const keyVariations = [\n      column.key,\n      `${column.key}_text`,\n      `${column.key}_name`,\n      `${column.key}_title`,\n      `${column.key}_display`\n    ];\n\n    for (const variation of keyVariations) {\n      if (rowData[variation] !== undefined && rowData[variation] !== null) {\n        return rowData[variation];\n      }\n    }\n\n    // Try to find any string field in the row that might be a display value\n    // Skip ID fields using trackBy from config\n    const trackBy = this.mergedConfig().trackBy || '_id';\n    for (const key in rowData) {\n      if (rowData.hasOwnProperty(key)) {\n        const value = rowData[key];\n        if (value !== null && value !== undefined && typeof value === 'string' && value.trim() !== '') {\n          // Skip ID fields - use trackBy from config\n          if (key !== trackBy && !key.toLowerCase().includes('id')) {\n            return value;\n          }\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get a stable key for filter value comparison\n   * Handles objects by using trackBy/primaryKey or JSON stringification\n   */\n  getFilterValueKey(value: unknown): string {\n    if (value === null || value === undefined) return 'null';\n    if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n      const obj = value as Record<string, unknown>;\n      // Use trackBy or primaryKey from config for object comparison\n      const trackBy = this.mergedConfig().trackBy;\n      const treeConfig = this.mergedConfig().tree;\n      const primaryKey = treeConfig?.primaryKey || trackBy;\n\n      if (primaryKey && primaryKey in obj && obj[primaryKey] !== undefined) {\n        return `obj_${String(obj[primaryKey])}`;\n      }\n      // Otherwise use JSON string for comparison\n      try {\n        return `obj_${JSON.stringify(value)}`;\n      } catch {\n        return `obj_${String(value)}`;\n      }\n    }\n    return String(value);\n  }\n\n  formatFilterValue(value: unknown, column: GridColumn): string {\n    if (value === null || value === undefined) return '(Blank)';\n    if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n    if (value instanceof Date) return value.toLocaleDateString();\n\n    // Handle objects - convert to string generically\n    // The consuming component should normalize data before passing to grid\n    if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n      // Try to get first string property (excluding ID fields)\n      const obj = value as Record<string, unknown>;\n      for (const key in obj) {\n        if (obj.hasOwnProperty(key) && typeof obj[key] === 'string' && obj[key] !== '') {\n          // Skip ID fields\n          if (!key.toLowerCase().includes('id') && !key.toLowerCase().includes('_id')) {\n            return String(obj[key]);\n          }\n        }\n      }\n\n      // If no suitable string property found, convert to string\n      return String(value);\n    }\n\n    // Handle arrays\n    if (Array.isArray(value)) {\n      return value.length > 0 ? `${value.length} items` : '(Empty Array)';\n    }\n\n    return String(value);\n  }\n\n  toggleFilterValue(column: GridColumn, value: unknown, checked: boolean) {\n    const filters = this.columnFilters();\n    const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n\n    let selectedValues: unknown[] = [];\n\n    if (existingIndex !== -1) {\n      const existing = filters[existingIndex];\n      selectedValues = Array.isArray(existing.value) ? [...existing.value] : [];\n    } else {\n      // If no filter exists, start with all values\n      selectedValues = this.getUniqueColumnValues(column).map(v => v.value);\n    }\n\n    if (checked) {\n      // Add value if not present\n      if (!selectedValues.includes(value)) {\n        selectedValues.push(value);\n      }\n    } else {\n      // Remove value\n      selectedValues = selectedValues.filter(v => v !== value);\n    }\n\n    // Apply filter\n    if (selectedValues.length === 0 || selectedValues.length === this.getUniqueColumnValues(column).length) {\n      // Remove filter if all or none selected\n      if (existingIndex !== -1) {\n        filters.splice(existingIndex, 1);\n      }\n    } else {\n      const filter: ColumnFilter = {\n        columnKey: column.key,\n        value: selectedValues,\n        operator: 'in'\n      };\n\n      if (existingIndex !== -1) {\n        filters[existingIndex] = filter;\n      } else {\n        filters.push(filter);\n      }\n    }\n\n    this.columnFilters.set([...filters]);\n    this.emitEvent('columnFilter', filters, column);\n    this.applyFiltersToData();\n    // Reapply sorting after filtering\n    this.applySortsToData();\n  }\n\n  selectAllFilterValues(column: GridColumn) {\n    const filters = this.columnFilters();\n    const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n\n    if (existingIndex !== -1) {\n      filters.splice(existingIndex, 1);\n      this.columnFilters.set([...filters]);\n      this.emitEvent('columnFilter', filters, column);\n      this.applyFiltersToData();\n      // Reapply sorting after filtering\n      this.applySortsToData();\n    }\n  }\n\n  deselectAllFilterValues(column: GridColumn) {\n    const filters = this.columnFilters();\n    const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n\n    const filter: ColumnFilter = {\n      columnKey: column.key,\n      value: [],\n      operator: 'in'\n    };\n\n    if (existingIndex !== -1) {\n      filters[existingIndex] = filter;\n    } else {\n      filters.push(filter);\n    }\n\n    this.columnFilters.set([...filters]);\n    this.emitEvent('columnFilter', filters, column);\n    this.applyFiltersToData();\n    // Reapply sorting after filtering\n    this.applySortsToData();\n  }\n\n  applyFiltersToData(data?: T[], totalCountOverride?: number) {\n    let filtered = data ? [...data] : [...this.internalData()];\n\n    const filters = this.columnFilters();\n\n    filters.forEach(filter => {\n      const column = this.mergedConfig().columns.find(c => c.key === filter.columnKey);\n      if (!column) return;\n\n      filtered = filtered.filter(row => {\n        // Use dataValueGetter if available (for filtering/export), otherwise use valueGetter or column.key\n        const valueGetter = column.dataValueGetter || column.valueGetter || column.key;\n        let rawValue: unknown;\n\n        if (valueGetter.includes('.') || valueGetter !== column.key) {\n          rawValue = this.getNestedValue(row, valueGetter);\n        } else {\n          rawValue = (row as Record<string, unknown>)[column.key];\n        }\n\n        // For template/custom columns, if value is undefined/null, try to extract from row\n        if ((rawValue === undefined || rawValue === null) && column.type === 'custom' && !column.dataValueGetter && !column.valueGetter) {\n          rawValue = this.extractValueFromRowForTemplateColumn(row as Record<string, unknown>, column);\n        }\n\n        if (filter.operator === 'in' && Array.isArray(filter.value)) {\n          // Compare using filter value keys for proper object comparison\n          const valueKey = this.getFilterValueKey(rawValue);\n          return filter.value.some(fv => this.getFilterValueKey(fv) === valueKey);\n        }\n\n        return true;\n      });\n    });\n\n    this.filteredData.set(filtered);\n    // When tree is enabled, use full tree count for totalItems unless override (e.g. search result count) is provided\n    const totalCount = totalCountOverride !== undefined\n      ? totalCountOverride\n      : this.mergedConfig().tree?.enabled\n        ? this.flattenAllDataForOrderTracking(this.internalData()).length\n        : filtered.length;\n    this.totalItems.set(totalCount);\n    this.totalPages.set(Math.ceil(totalCount / this.pageSize()));\n  }\n\n  // ===== Utility Methods =====\n\n  private emitEvent(type: GridEvent<T>['type'], data: GridEvent<T>['data'], column?: GridColumn, action?: GridAction) {\n    this.gridEvent.emit({\n      type,\n      data,\n      column,\n      action,\n      filters: this.columnFilters(),\n      sorts: this.columnSorts()\n    } as GridEvent<T>);\n  }\n\n  /**\n   * Get nested value from an object\n   * @param obj - The object to get the nested value from\n   * @param path - The path to the nested value (e.g., 'contact.email')\n   * @returns The nested value or undefined if not found\n   * @example\n   * const obj = { contact: { email: 'test@example.com' } };\n   * const value = getNestedValue(obj, 'contact.email');\n   * // value === 'test@example.com'\n   */\n  getNestedValue(obj: T, path: string): unknown {\n    return path.split('.').reduce((current: unknown, key: string) => {\n      return current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined;\n    }, obj);\n  }\n\n  /**\n   * Extract ID from foreign key value generically\n   * Handles both string IDs and nested objects (e.g., { _id: \"...\", name: \"...\" })\n   * @param foreignKeyValue - The foreign key value (can be string, object, or null/undefined)\n   * @param primaryKey - The primary key field name (from tree config or defaults to trackBy or '_id')\n   * @returns The extracted ID as a string, or empty string if not found\n   */\n  private extractIdFromForeignKey(foreignKeyValue: unknown, primaryKey?: string): string {\n    // Get primary key from tree config or trackBy, fallback to '_id'\n    if (!primaryKey) {\n      const treeConfig = this.mergedConfig().tree;\n      primaryKey = treeConfig?.primaryKey || this.mergedConfig().trackBy || '_id';\n    }\n    if (foreignKeyValue === null || foreignKeyValue === undefined) {\n      return '';\n    }\n\n    // If it's already a string, return it\n    if (typeof foreignKeyValue === 'string') {\n      return foreignKeyValue.trim();\n    }\n\n    // If it's an object, extract the ID using the primary key\n    if (typeof foreignKeyValue === 'object' && foreignKeyValue !== null) {\n      const id = (foreignKeyValue as Record<string, unknown>)[primaryKey];\n      if (id !== null && id !== undefined) {\n        return String(id);\n      }\n    }\n\n    return '';\n  }\n\n  /**\n   * Set a nested value in an object using dot notation\n   * @param obj The object to modify\n   * @param path The dot notation path (e.g., 'contact.email')\n   * @param value The value to set\n   * @example\n   * const obj = { contact: { email: 'old@example.com' } };\n   * setNestedValue(obj, 'contact.email', 'new@example.com');\n   * // obj.contact.email === 'new@example.com'\n   */\n  setNestedValue(obj: T, path: string, value: unknown): void {\n    const keys = path.split('.');\n    const lastKey = keys.pop()!;\n    const target = keys.reduce((current: unknown, key: string) => {\n      if (current && typeof current === 'object') {\n        if (!(current as Record<string, unknown>)[key]) {\n          (current as Record<string, unknown>)[key] = {};\n        }\n        return (current as Record<string, unknown>)[key];\n      }\n      return undefined;\n    }, obj);\n\n    if (target && typeof target === 'object') {\n      (target as Record<string, unknown>)[lastKey] = value;\n    }\n  }\n\n  /**\n   * Compare two order arrays to check if they are different\n   * This method can be used by parent components to check if order has actually changed\n   * @param currentOrder Current order array\n   * @param originalOrder Original order array\n   * @returns true if orders are different, false if they are the same\n   */\n  compareOrders(currentOrder: Array<{ id: string | undefined, order: number | undefined }>, originalOrder: Array<{ id: string | undefined, order: number | undefined }>): boolean {\n    console.log('🔍 DataGrid: Comparing orders - current length:', currentOrder.length, 'original length:', originalOrder.length);\n\n    // If lengths are different, there are changes\n    if (currentOrder.length !== originalOrder.length) {\n      console.log('🔍 DataGrid: Lengths are different, returning true');\n      return true;\n    }\n\n    // Compare the order of items by their IDs (not just their sequence values)\n    // This will detect if items have been reordered even if sequence values are the same\n    for (let i = 0; i < currentOrder.length; i++) {\n      const currentItem = currentOrder[i];\n      const originalItem = originalOrder[i];\n\n      console.log('🔍 DataGrid: Position', i, '- Current ID:', currentItem.id, 'Original ID:', originalItem.id);\n\n      if (currentItem.id !== originalItem.id) {\n        console.log('🔍 DataGrid: Different item at position', i, 'returning true');\n        return true;\n      }\n    }\n\n    console.log('🔍 DataGrid: No differences found, returning false');\n    return false;\n  }\n\n  formatValue(value: unknown, column: GridColumn): string {\n    if (column.formatter) {\n      if (column.formatter.type === 'custom' && column.formatter.customFunction) {\n        const formatter = this.customFormatters[column.formatter.customFunction];\n        if (formatter) {\n          return formatter(value, column.formatter.format);\n        }\n      }\n\n      // Built-in formatters\n      switch (column.formatter.type) {\n        case 'date':\n          return this.formatDate(value);\n        case 'currency':\n          return this.formatCurrency(value, column.formatter.format);\n        case 'percentage':\n          return this.formatPercentage(value);\n        default:\n          return String(value || '');\n      }\n    }\n\n    return String(value || '');\n  }\n\n  private formatDate(value: unknown): string {\n    if (!value) return 'N/A';\n    const date = new Date(value as string);\n    return isNaN(date.getTime()) ? 'Invalid Date' : date.toLocaleDateString();\n  }\n\n  private formatCurrency(value: unknown, currency = 'USD'): string {\n    if (value === null || value === undefined) return 'N/A';\n    const num = Number(value);\n    return isNaN(num) ? 'N/A' : new Intl.NumberFormat('en-US', {\n      style: 'currency',\n      currency\n    }).format(num);\n  }\n\n  private formatPercentage(value: unknown): string {\n    if (value === null || value === undefined) return 'N/A';\n    const num = Number(value);\n    return isNaN(num) ? 'N/A' : `${num}%`;\n  }\n\n  // Template renderer methods\n  isTemplateRenderer(rendererKey: string): boolean {\n    return !!this.templateRenderers[rendererKey];\n  }\n\n  getTemplateRenderer(rendererKey: string): TemplateRenderer<T> | null {\n    return this.templateRenderers[rendererKey] as TemplateRenderer<T> | null;\n  }\n\n  getTemplateContext(value: unknown, row: T, column: GridColumn): TemplateContext<T> {\n    return {\n      $implicit: value,\n      row,\n      value,\n      column\n    };\n  }\n\n  getColumnWidthClass(width?: ColumnWidth): string {\n    if (!width || width === 'auto') return '';\n\n    const widthMap = {\n      'xs': 'tw-w-16',\n      'sm': 'tw-w-24',\n      'md': 'tw-w-32',\n      'lg': 'tw-w-48',\n      'xl': 'tw-w-64'\n    };\n\n    // If it's a predefined size, return the class\n    if (widthMap[width as keyof typeof widthMap]) {\n      return widthMap[width as keyof typeof widthMap];\n    }\n\n    // For custom pixel values, return empty class (we'll use inline style instead)\n    return '';\n  }\n\n  getColumnMaxWidthClass(width?: ColumnWidth): string {\n    if (!width || width === 'auto') return 'tw-max-w-xs';\n\n    const maxWidthMap = {\n      'xs': 'tw-max-w-16',\n      'sm': 'tw-max-w-24',\n      'md': 'tw-max-w-32',\n      'lg': 'tw-max-w-48',\n      'xl': 'tw-max-w-64'\n    };\n\n    // If it's a predefined size, return the class\n    if (maxWidthMap[width as keyof typeof maxWidthMap]) {\n      return maxWidthMap[width as keyof typeof maxWidthMap];\n    }\n\n    // For custom pixel values, return empty class (we'll use inline style instead)\n    return '';\n  }\n\n  getColumnWidthStyle(width?: ColumnWidth): string | null {\n    if (!width || width === 'auto') return null;\n\n    const predefinedSizes = ['xs', 'sm', 'md', 'lg', 'xl'];\n    // If it's a predefined size, return null (use class instead)\n    if (predefinedSizes.includes(width)) {\n      return null;\n    }\n\n    // For custom pixel/rem/em values, return the width as inline style\n    return width;\n  }\n\n  getColumnMaxWidthStyle(width?: ColumnWidth): string | null {\n    if (!width || width === 'auto') return null;\n\n    const predefinedSizes = ['xs', 'sm', 'md', 'lg', 'xl'];\n    // If it's a predefined size, return null (use class instead)\n    if (predefinedSizes.includes(width)) {\n      return null;\n    }\n\n    // For custom pixel/rem/em values, return the width as inline style\n    return width;\n  }\n\n  getStatusClass(value: unknown, statusConfig?: StatusConfig): string {\n    if (!statusConfig) return '';\n    return value === statusConfig.activeValue ? statusConfig.activeClass : statusConfig.inactiveClass;\n  }\n\n  getStatusText(value: unknown, statusConfig?: StatusConfig): string {\n    if (!statusConfig) return String(value || '');\n    return value === statusConfig.activeValue ? statusConfig.activeLabel : statusConfig.inactiveLabel;\n  }\n\n  getItemRangeText(): string {\n    const total = this.totalItems();\n\n    if (this.serverSidePagination) {\n      // For server-side pagination, calculate based on actual displayed data\n      const displayedCount = this.displayedData.length;\n      const start = (this.currentPage() - 1) * this.pageSize() + 1;\n      const end = start + displayedCount - 1;\n      return `${start}-${end} of ${total}`;\n    } else {\n      // For client-side pagination, use the original logic\n      const start = (this.currentPage() - 1) * this.pageSize() + 1;\n      const end = Math.min(this.currentPage() * this.pageSize(), total);\n      return `${start}-${end} of ${total}`;\n    }\n  }\n\n  getPageSizeOptions() {\n    return this.mergedConfig().pagination.pageSizeOptions.map(size => ({\n      value: size,\n      label: size.toString()\n    }));\n  }\n\n  trackByFn(index: number, item: T): unknown {\n    const trackBy = this.mergedConfig().trackBy || '_id';\n    return this.getNestedValue(item, trackBy) || index;\n  }\n\n  getSkeletonArray(): number[] {\n    return Array.from({ length: this.loadingConfig.skeletonRows }, (_, i) => i);\n  }\n\n  // ===== Template Helper Methods =====\n\n  get displayedData(): T[] {\n    // If we have local reordered data (from drag & drop), use that for visual display\n    if (this.localReorderedData.length > 0 && this.hasOrderChanged()) {\n      console.log('🔍 Using local reordered data for display:', this.localReorderedData.length, 'items');\n      return this.localReorderedData;\n    }\n\n    let data = this.filteredData();\n\n    // Check if grouping is disabled in column menu config\n    const columnMenuConfig = this.mergedConfig().columnMenu;\n    const groupingDisabled = columnMenuConfig && columnMenuConfig.showGroupBy === false;\n\n    // Apply grouping if any columns are grouped and grouping is not disabled\n    const grouped = this.groupedColumns();\n    if (grouped.length > 0 && !this.serverSidePagination && !groupingDisabled) {\n      // If tree is enabled, we need to flatten tree first for grouping, then preserve structure\n      const treeConfig = this.mergedConfig().tree;\n      if (treeConfig?.enabled) {\n        // Flatten tree structure completely for grouping (all items including children)\n        data = this.flattenTreeForGrouping(data);\n      }\n      // Apply grouping\n      data = this.getGroupedData(data, grouped);\n      // If tree is enabled, restore tree structure within groups and show children when expanded\n      if (treeConfig?.enabled) {\n        data = this.restoreTreeStructureInGroups(data);\n      }\n      return data;\n    }\n\n    // For server-side pagination, the server already provides the correct page of data\n    // For client-side pagination, we need to slice the data\n    if (this.serverSidePagination) {\n      return data;\n    } else {\n      // If pagination is disabled, return all data\n      if (!this.mergedConfig().pagination?.enabled) {\n        return data;\n      }\n      // If pagination is enabled, slice the data\n      if (this.mergedConfig().pagination.infiniteScroll) {\n        // Infinite scroll: show all pages from 1 to current\n        return data.slice(0, this.currentPage() * this.pageSize());\n      } else {\n        // Standard pagination: show only current page\n        const start = (this.currentPage() - 1) * this.pageSize();\n        const end = start + this.pageSize();\n        return data.slice(start, end);\n      }\n    }\n  }\n\n  /**\n   * Group data by specified columns (supports nested grouping)\n   */\n  private getGroupedData(data: T[], groupColumns: string[]): T[] {\n    if (groupColumns.length === 0) return data;\n\n    // Recursively group data by multiple columns\n    return this.groupDataRecursive(data, groupColumns, 0);\n  }\n\n  /**\n   * Recursively group data by columns (nested grouping support)\n   */\n  private groupDataRecursive(data: T[], groupColumns: string[], level: number): T[] {\n    if (level >= groupColumns.length || data.length === 0) {\n      return data;\n    }\n\n    const groupColumnKey = groupColumns[level];\n    const column = this.mergedConfig().columns.find(c => c.key === groupColumnKey);\n    if (!column) return data;\n\n    // Use valueGetter for display, dataValueGetter for grouping key\n    const displayValueGetter = column.valueGetter || column.key;\n    const groupKeyGetter = column.dataValueGetter || column.valueGetter || column.key;\n    const groups = new Map<string, { value: unknown; rows: T[]; level: number }>();\n\n    // Check if tree structure is enabled\n    const treeConfig = this.mergedConfig().tree;\n    const childrenKey = treeConfig?.childrenKey || 'children';\n\n    // Group the data by current column\n    data.forEach(row => {\n      // Get raw value for grouping key\n      let rawValue: unknown;\n      if (groupKeyGetter.includes('.') || groupKeyGetter !== column.key) {\n        rawValue = this.getNestedValue(row, groupKeyGetter);\n      } else {\n        rawValue = (row as Record<string, unknown>)[column.key];\n      }\n\n      // Get display value using valueGetter (for display in group header)\n      let displayValue: unknown;\n      if (displayValueGetter.includes('.') || displayValueGetter !== column.key) {\n        displayValue = this.getNestedValue(row, displayValueGetter);\n      } else {\n        displayValue = (row as Record<string, unknown>)[column.key];\n      }\n\n      // Format display value if formatter is provided\n      if (column.formatter) {\n        displayValue = this.formatValue(displayValue, column);\n      }\n\n      // If display value is still an object, convert to string\n      // The consuming component should normalize data before passing to grid\n      if (typeof displayValue === 'object' && displayValue !== null && !Array.isArray(displayValue) && !(displayValue instanceof Date)) {\n        displayValue = String(displayValue);\n      }\n\n      const groupKey = `${groupColumnKey}:${this.getFilterValueKey(rawValue)}`;\n      const existing = groups.get(groupKey);\n\n      if (existing) {\n        existing.rows.push(row);\n      } else {\n        groups.set(groupKey, { value: displayValue, rows: [row], level });\n      }\n    });\n\n    // Flatten groups into display array\n    const result: T[] = [];\n    const expanded = this.expandedGroups();\n    const newExpanded = new Set(expanded);\n    const shouldAutoExpand = this.shouldAutoExpandGroups();\n\n    groups.forEach((group, groupKey) => {\n      // Calculate actual row count - only count direct rows in this group, not nested children\n      // Nested children are part of the tree structure, not separate group rows\n      const actualRowCount = group.rows.length;\n\n      // Add group header row\n      const groupHeader = {\n        ...group.rows[0],\n        _isGroupHeader: true,\n        _groupKey: groupKey,\n        _groupValue: group.value,\n        _groupColumnKey: groupColumnKey,\n        _groupLevel: level,\n        _groupRowCount: actualRowCount,\n        _groupPath: level > 0 ? this.buildGroupPath(group.rows[0], groupColumns, level) : [],\n        _groupAggregations: this.calculateGroupAggregations(group.rows)\n      } as unknown as T;\n\n      result.push(groupHeader);\n\n      // Auto-expand groups by default if they're not explicitly collapsed\n      // This ensures groups are expanded on initial load\n      const isExpanded = expanded.has(groupKey);\n\n      if (shouldAutoExpand && !isExpanded) {\n        // Add to expanded set if auto-expanding\n        newExpanded.add(groupKey);\n      }\n\n      // Show group rows if expanded or should be auto-expanded\n      if (isExpanded || (shouldAutoExpand && !isExpanded)) {\n        // Process rows while preserving tree structure\n        const processedRows: T[] = [];\n\n        group.rows.forEach(row => {\n          // Check if this row has children (tree structure)\n          const children = treeConfig?.enabled ? (this.getNestedValue(row, childrenKey) as T[] | undefined) : undefined;\n\n          if (children && Array.isArray(children) && children.length > 0) {\n            // This row has children - check if children belong to the same group\n            const parentGroupValue = this.getGroupValueForRow(row, groupColumnKey, displayValueGetter, groupKeyGetter);\n\n            // Check if all children belong to the same group as parent\n            const childrenInSameGroup = children.every(child => {\n              const childGroupValue = this.getGroupValueForRow(child, groupColumnKey, displayValueGetter, groupKeyGetter);\n              return this.getFilterValueKey(childGroupValue) === this.getFilterValueKey(parentGroupValue);\n            });\n\n            // This row has children - preserve tree structure\n            const processedRow = { ...row };\n\n            if (childrenInSameGroup) {\n              // All children are in the same group as parent - don't create group headers for them\n              // Just preserve children structure without grouping\n              this.setNestedValue(processedRow, childrenKey, children);\n            } else {\n              // Children are in different groups - apply grouping to show group headers\n              if (level + 1 < groupColumns.length) {\n                // Apply grouping to children to create group headers\n                const groupedChildren = this.groupDataRecursive(children, groupColumns, level + 1);\n                // Update the row with grouped children\n                this.setNestedValue(processedRow, childrenKey, groupedChildren);\n              } else {\n                // No more grouping levels, but preserve children structure\n                this.setNestedValue(processedRow, childrenKey, children);\n              }\n            }\n\n            processedRows.push(processedRow);\n          } else {\n            // Regular row without children\n            processedRows.push(row);\n          }\n        });\n\n        // If there are more grouping levels, recursively group the processed rows\n        if (level + 1 < groupColumns.length) {\n          const nestedGroups = this.groupDataRecursive(processedRows, groupColumns, level + 1);\n          result.push(...nestedGroups);\n        } else {\n          // Last level, add the processed rows (with preserved tree structure)\n          result.push(...processedRows);\n        }\n      }\n    });\n\n    // Update expanded groups set if we auto-expanded any\n    // Defer signal update to avoid writing to signals during template rendering\n    if (shouldAutoExpand && newExpanded.size > expanded.size) {\n      // Store the update to apply after rendering\n      this.pendingExpandedGroupsUpdate = newExpanded;\n      // Mark that we've auto-expanded groups so we don't do it again on subsequent renders\n      this.hasAutoExpandedGroups = true;\n\n      // Defer the signal update using queueMicrotask to avoid writing during template rendering\n      queueMicrotask(() => {\n        if (this.pendingExpandedGroupsUpdate) {\n          this.expandedGroups.set(this.pendingExpandedGroupsUpdate);\n          this.pendingExpandedGroupsUpdate = null;\n        }\n      });\n    }\n\n    return result;\n  }\n\n  /**\n   * Get the group value for a row (helper for checking if parent and children are in same group)\n   */\n  private getGroupValueForRow(row: T, columnKey: string, displayValueGetter: string, groupKeyGetter: string): unknown {\n    let rawValue: unknown;\n    if (groupKeyGetter.includes('.') || groupKeyGetter !== columnKey) {\n      rawValue = this.getNestedValue(row, groupKeyGetter);\n    } else {\n      rawValue = (row as Record<string, unknown>)[columnKey];\n    }\n    return rawValue;\n  }\n\n  /**\n   * Get the group path for nested grouping display (internal method)\n   */\n  private buildGroupPath(row: T, groupColumns: string[], currentLevel: number): unknown[] {\n    const path: unknown[] = [];\n    for (let i = 0; i < currentLevel; i++) {\n      const colKey = groupColumns[i];\n      const column = this.mergedConfig().columns.find(c => c.key === colKey);\n      if (column) {\n        // Use valueGetter for display value in path\n        const displayValueGetter = column.valueGetter || column.key;\n        let displayValue: unknown;\n        if (displayValueGetter.includes('.') || displayValueGetter !== column.key) {\n          displayValue = this.getNestedValue(row, displayValueGetter);\n        } else {\n          displayValue = (row as Record<string, unknown>)[colKey];\n        }\n\n        // Format display value if formatter is provided\n        if (column.formatter) {\n          displayValue = this.formatValue(displayValue, column);\n        }\n\n        // If display value is still an object, convert to string\n        if (typeof displayValue === 'object' && displayValue !== null && !Array.isArray(displayValue) && !(displayValue instanceof Date)) {\n          displayValue = String(displayValue);\n        }\n\n        path.push(displayValue);\n      }\n    }\n    return path;\n  }\n\n  getGroupValue(columnKey: string): unknown {\n    // This is a helper to get the group value from a row\n    return (this.displayedData[0] as any)?._groupValue;\n  }\n\n  isGroupHeader(row: T): boolean {\n    return !!(row as any)?._isGroupHeader;\n  }\n\n  getGroupRowCount(row: T): number {\n    return (row as any)?._groupRowCount || 0;\n  }\n\n  getGroupColumnKey(row: T): string {\n    return (row as any)?._groupColumnKey || '';\n  }\n\n  getGroupLevel(row: T): number {\n    return (row as any)?._groupLevel ?? 0;\n  }\n\n  getGroupKey(item: T): string {\n    const groupColumnKey = this.getGroupColumnKey(item);\n    const groupValue = (item as any)?._groupValue;\n    return `${groupColumnKey}:${this.getFilterValueKey(groupValue)}`;\n  }\n\n  getGroupColumn(item: T): GridColumn | null {\n    const groupColumnKey = this.getGroupColumnKey(item);\n    return this.mergedConfig().columns.find(c => c.key === groupColumnKey) || null;\n  }\n\n  getGroupColumnHeader(item: T): string {\n    const groupCol = this.getGroupColumn(item);\n    return groupCol?.header || this.getGroupColumnKey(item) || '';\n  }\n\n  getGroupValueDisplay(item: T): string {\n    const groupValue = (item as any)?._groupValue;\n    const groupCol = this.getGroupColumn(item);\n    if (groupCol) {\n      return this.formatFilterValue(groupValue, groupCol);\n    }\n    return String(groupValue || '');\n  }\n\n  getGroupPath(item: T): unknown[] {\n    const path = (item as any)?._groupPath;\n    return Array.isArray(path) ? path : [];\n  }\n\n  get columns(): GridColumn[] {\n    const baseColumns = this.mergedConfig().columns || [];\n    return baseColumns;\n  }\n\n  get paginationConfig() {\n    return this.mergedConfig().pagination;\n  }\n\n  get searchConfig() {\n    return this.mergedConfig().search;\n  }\n\n  get loadingConfig() {\n    return this.mergedConfig().loading;\n  }\n\n  get scrollConfig() {\n    return this.mergedConfig().scroll;\n  }\n\n  // ===== Export Methods =====\n\n  /**\n   * Toggle export menu visibility\n   */\n  toggleExportMenu(event?: Event): void {\n    if (event) {\n      event.stopPropagation();\n    }\n    this.showExportMenu.set(!this.showExportMenu());\n  }\n\n  /**\n   * Close export menu\n   */\n  closeExportMenu(): void {\n    this.showExportMenu.set(false);\n  }\n\n  /**\n   * Toggle filter dropdown visibility\n   */\n  toggleFilterDropdown(event?: Event): void {\n    if (event) {\n      event.stopPropagation();\n    }\n    this.showFilterDropdown.set(!this.showFilterDropdown());\n  }\n\n  /**\n   * Clear all filters\n   */\n  clearAllFilters(): void {\n    this.columnFilters.set([]);\n    this.applyFiltersToData();\n    // Reapply sorting after clearing filters\n    this.applySortsToData();\n    this.emitEvent('columnFilter', [], undefined);\n  }\n\n  /**\n   * Get column header by key\n   */\n  getColumnHeader(columnKey: string): string {\n    const column = this.mergedConfig().columns.find(c => c.key === columnKey);\n    return column?.header || columnKey;\n  }\n\n  /**\n   * Remove a specific filter\n   */\n  removeFilter(columnKey: string): void {\n    const filters = this.columnFilters();\n    const filteredFilters = filters.filter(f => f.columnKey !== columnKey);\n    this.columnFilters.set(filteredFilters);\n    this.applyFiltersToData();\n    // Reapply sorting after removing filter\n    this.applySortsToData();\n    this.emitEvent('columnFilter', filteredFilters, undefined);\n  }\n\n  /**\n   * Check if value is an array (helper for template)\n   */\n  isArray(value: unknown): boolean {\n    return Array.isArray(value);\n  }\n\n  /**\n   * Get array length (helper for template)\n   */\n  getArrayLength(value: unknown): number {\n    return Array.isArray(value) ? value.length : 0;\n  }\n\n  /**\n   * Handle export format selection\n   */\n  exportData(format: 'csv' | 'excel' | 'pdf'): void {\n    const data = this.filteredData();\n    const visibleCols = this.visibleColumns();\n\n    // Filter out actions columns from export\n    const exportableCols = visibleCols.filter(col =>\n      col.type !== 'actions' && col.key !== 'actions'\n    );\n\n    // Build columns array with visible columns only (excluding actions)\n    const columns = exportableCols.map(col => ({\n      key: col.key,\n      label: col.header || col.key\n    }));\n\n    // Build data array with only visible column values (excluding actions)\n    const exportData = data.map(row => {\n      const exportRow: any = {};\n      exportableCols.forEach(col => {\n        // Use dataValueGetter if available (for filtering/export), otherwise use valueGetter or column.key\n        const valueGetter = col.dataValueGetter || col.valueGetter || col.key;\n        const rawValue = this.getNestedValue(row, valueGetter);\n\n        // Format the value for export (extract display text from objects)\n        exportRow[col.key] = this.formatExportValue(rawValue, col);\n      });\n      return exportRow;\n    });\n\n    const filename = this.mergedConfig().title || 'export';\n\n    // Export based on format\n    switch (format) {\n      case 'csv':\n        this.exportService.exportToCSV(exportData, columns, filename);\n        break;\n      case 'excel':\n        this.exportService.exportToExcel(exportData, columns, filename);\n        break;\n      case 'pdf':\n        this.exportService.exportToPDF(exportData, columns, filename);\n        break;\n    }\n\n    this.closeExportMenu();\n  }\n\n  /**\n   * Format value for export - extracts display text from objects\n   */\n  private formatExportValue(value: unknown, column: GridColumn): string {\n    if (value === null || value === undefined) return '';\n\n    // Handle objects - extract display text\n    if (typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {\n      const obj = value as Record<string, unknown>;\n\n      // Try to get first string property (excluding ID fields)\n      // The consuming component should normalize data before passing to grid\n      for (const key in obj) {\n        if (obj.hasOwnProperty(key) && typeof obj[key] === 'string' && obj[key] !== '') {\n          // Skip ID fields\n          if (!key.toLowerCase().includes('id') && !key.toLowerCase().includes('_id')) {\n            return String(obj[key]);\n          }\n        }\n      }\n\n      // If no suitable string property found, convert to string\n      return String(value);\n    }\n\n    // Handle arrays\n    if (Array.isArray(value)) {\n      return value.length > 0 ? `${value.length} items` : '';\n    }\n\n    // Handle dates\n    if (value instanceof Date) {\n      return value.toLocaleString();\n    }\n\n    // Handle booleans\n    if (typeof value === 'boolean') {\n      return value ? 'Yes' : 'No';\n    }\n\n    // Return string representation\n    return String(value);\n  }\n\n  /**\n   * Calculate aggregations for a set of rows based on column configuration\n   */\n  private calculateGroupAggregations(rows: T[]): Record<string, number | null> {\n    const aggregations: Record<string, number | null> = {};\n    const columns = this.mergedConfig().columns;\n\n    columns.forEach(column => {\n      if (column.aggregatable) {\n        const type = column.aggregationType || 'sum';\n        const valueGetter = column.dataValueGetter || column.valueGetter || column.key;\n\n        // Extract numeric values from rows\n        const values = rows.map(row => {\n          const val = this.getNestedValue(row, valueGetter);\n          if (typeof val === 'number') return val;\n          const strVal = String(val || '0').replace(/[^0-9.-]+/g, '');\n          const parsed = parseFloat(strVal);\n          return isNaN(parsed) ? 0 : parsed;\n        }).filter(v => typeof v === 'number');\n\n        if (values.length === 0) {\n          aggregations[column.key] = 0;\n          return;\n        }\n\n        switch (type) {\n          case 'sum':\n            aggregations[column.key] = values.reduce((acc, curr) => acc + curr, 0);\n            break;\n          case 'avg':\n            aggregations[column.key] = values.reduce((acc, curr) => acc + curr, 0) / values.length;\n            break;\n          case 'count':\n            aggregations[column.key] = values.length;\n            break;\n          case 'min':\n            aggregations[column.key] = Math.min(...values);\n            break;\n          case 'max':\n            aggregations[column.key] = Math.max(...values);\n            break;\n        }\n      }\n    });\n\n    return aggregations;\n  }\n\n  /**\n   * Get formatted aggregation text for a group header\n   */\n  getGroupAggregations(item: T): Array<{ label: string; value: string; key: string }> {\n    const aggregations = (item as any)?._groupAggregations as Record<string, number>;\n    if (!aggregations) return [];\n\n    const result: Array<{ label: string; value: string; key: string }> = [];\n    const columns = this.mergedConfig().columns;\n\n    Object.entries(aggregations).forEach(([key, value]) => {\n      const column = columns.find(c => c.key === key);\n      if (column) {\n        const formattedValue = column.formatter ? this.formatValue(value, column) : String(value);\n        result.push({\n          label: column.header,\n          value: formattedValue,\n          key: column.key\n        });\n      }\n    });\n\n    return result;\n  }\n}\n","<!-- Data Grid Component -->\n<div class=\"data-grid-container tw-bg-white tw-shadow tw-overflow-visible tw-flex tw-flex-col\" [ngClass]=\"[\n         mergedConfig().tableClass || '',\n         mergedConfig().fullHeight ? 'tw-h-full' : '',\n         isDragDropEnabled() ? 'drag-drop-enabled' : '',\n         isTreeEnabled() ? 'tree-enabled' : ''\n       ]\">\n\n  <!-- Header Section -->\n  @if (mergedConfig().title || mergedConfig().subtitle) {\n  <div class=\"tw-px-3 tw-py-2 tw-border-b tw-border-gray-200\">\n    @if (mergedConfig().title) {\n    <h3 class=\"tw-text-base tw-font-semibold tw-text-gray-900\">\n      {{ mergedConfig().title }}\n    </h3>\n    }\n    @if (mergedConfig().subtitle) {\n    <p class=\"tw-text-sm tw-text-gray-600 tw-mt-0.5\">\n      {{ mergedConfig().subtitle }}\n    </p>\n    }\n  </div>\n  }\n\n  <!-- Search Section -->\n  @if (searchConfig.enabled) {\n  <div class=\"tw-px-2 tw-py-1.5 sm:tw-px-3 sm:tw-py-2.5 tw-border-b tw-border-gray-200\">\n    <div class=\"tw-flex tw-items-center tw-justify-between\">\n      <!-- Left Side: Search Input and Action Icons -->\n      <div class=\"tw-flex tw-items-center tw-space-x-1.5\">\n        <!-- Search Input - Apple Style -->\n        <div\n          class=\"tw-w-28 focus-within:tw-w-48 sm:tw-w-auto sm:tw-flex-1 sm:tw-max-w-md tw-transition-all tw-duration-300 data-grid-search-input\">\n          <cide-ele-input [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\" id=\"search-input\" type=\"text\"\n            [ngModel]=\"searchQuery()\" (ngModelChange)=\"updateSearchQuery($event)\"\n            [placeholder]=\"searchConfig.placeholder\" [disabled]=\"loading() || isRefreshing()\" leadingIcon=\"search\"\n            fill=\"outline\" size=\"sm\">\n          </cide-ele-input>\n        </div>\n\n        <!-- Action Icons (Filter, Sort, Download) - Apple Style Compact -->\n        <div class=\"tw-flex tw-items-center tw-space-x-1 data-grid-action-buttons\">\n          <!-- Filter Button with Dropdown -->\n          <div class=\"tw-relative\">\n            <button type=\"button\"\n              class=\"filter-dropdown-trigger tw-hidden sm:tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 sm:tw-w-7 sm:tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-blue-600 hover:tw-bg-blue-50 tw-transition-all tw-duration-200 tw-relative !tw-border-0 sm:!tw-border sm:tw-border-gray-200/60\"\n              [class.tw-text-blue-600]=\"columnFilters().length > 0\" [class.tw-bg-blue-50]=\"columnFilters().length > 0\"\n              title=\"Filter\" (click)=\"toggleFilterDropdown()\">\n              <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">filter_list</cide-ele-icon>\n              @if (columnFilters().length > 0) {\n              <span\n                class=\"tw-absolute -tw-top-1 -tw-right-1 tw-inline-flex tw-items-center tw-justify-center tw-w-4 tw-h-4 tw-text-xs tw-font-semibold tw-text-white tw-bg-blue-600 tw-rounded-full tw-border tw-border-white\">\n                {{ columnFilters().length }}\n              </span>\n              }\n            </button>\n\n            <!-- Filter Dropdown Menu -->\n            @if (showFilterDropdown()) {\n            <div\n              class=\"filter-dropdown tw-absolute tw-left-0 tw-mt-2 tw-w-80 tw-bg-white tw-rounded-lg tw-shadow-xl tw-border tw-border-gray-200 tw-z-50 tw-overflow-hidden\"\n              (click)=\"$event.stopPropagation()\">\n              <div class=\"tw-py-1.5\">\n                <div\n                  class=\"tw-px-3 tw-py-2 tw-bg-gray-50 tw-border-b tw-border-gray-200 tw-flex tw-items-center tw-justify-between\">\n                  <span class=\"tw-text-xs tw-font-semibold tw-text-gray-500 tw-uppercase tw-tracking-wider\">Active\n                    Filters</span>\n                  @if (columnFilters().length > 0) {\n                  <button type=\"button\" class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-800 tw-font-medium\"\n                    (click)=\"clearAllFilters()\">\n                    Clear All\n                  </button>\n                  }\n                </div>\n                @if (columnFilters().length === 0) {\n                <div class=\"tw-px-4 tw-py-6 tw-text-center\">\n                  <cide-ele-icon class=\"tw-w-12 tw-h-12 tw-text-gray-300 tw-mx-auto tw-mb-2\">filter_list</cide-ele-icon>\n                  <p class=\"tw-text-sm tw-text-gray-500\">No filters applied</p>\n                  <p class=\"tw-text-xs tw-text-gray-400 tw-mt-1\">Use column filters to narrow down your results</p>\n                </div>\n                } @else {\n                <div class=\"tw-max-h-96 tw-overflow-y-auto\">\n                  @for (filter of columnFilters(); track filter.columnKey) {\n                  <div class=\"tw-px-4 tw-py-3 hover:tw-bg-gray-50 tw-border-b tw-border-gray-100 last:tw-border-b-0\">\n                    <div class=\"tw-flex tw-items-start tw-justify-between tw-gap-2\">\n                      <div class=\"tw-flex-1 tw-min-w-0\">\n                        <div class=\"tw-text-xs tw-font-semibold tw-text-gray-600 tw-mb-1\">{{\n                          getColumnHeader(filter.columnKey) }}</div>\n                        <div class=\"tw-text-sm tw-text-gray-700 tw-flex tw-items-center tw-gap-1\">\n                          @if (filter.operator === 'in' && isArray(filter.value)) {\n                          <span class=\"tw-inline-flex tw-items-center tw-gap-1\">\n                            <cide-ele-icon class=\"tw-w-3 tw-h-3\">check_circle</cide-ele-icon>\n                            {{ getArrayLength(filter.value) }} selected\n                          </span>\n                          } @else {\n                          <span>{{ $any(filter.value) }}</span>\n                          }\n                        </div>\n                      </div>\n                      <button type=\"button\"\n                        class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-rounded tw-text-gray-400 hover:tw-text-red-600 hover:tw-bg-red-50 tw-transition-colors\"\n                        (click)=\"removeFilter(filter.columnKey)\" title=\"Remove filter\">\n                        <cide-ele-icon class=\"tw-w-4 tw-h-4\">close</cide-ele-icon>\n                      </button>\n                    </div>\n                  </div>\n                  }\n                </div>\n                }\n              </div>\n            </div>\n            }\n          </div>\n\n          <!-- View Toggle Button (Mobile Only) -->\n          @if (mergedConfig().mobileLayout?.enabled) {\n          <button type=\"button\"\n            class=\"tw-hidden sm:tw-hidden tw-items-center tw-justify-center tw-w-6 tw-h-6 sm:tw-w-7 sm:tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-blue-600 hover:tw-bg-blue-50 tw-transition-all tw-duration-200 !tw-border-0\"\n            (click)=\"isMobileView.set(!isMobileView())\" [title]=\"isMobileView() ? 'Table View' : 'Card View'\">\n            <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">{{ isMobileView() ? 'table_chart' : 'view_agenda'\n              }}</cide-ele-icon>\n          </button>\n          }\n\n          <!-- Download/Export Button with Dropdown -->\n          <div class=\"tw-relative\">\n            <button type=\"button\"\n              class=\"tw-hidden sm:tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 sm:tw-w-7 sm:tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 !tw-border-0 sm:!tw-border sm:tw-border-gray-200/60\"\n              title=\"Export\" (click)=\"toggleExportMenu($event)\">\n              <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">file_download</cide-ele-icon>\n            </button>\n\n            <!-- Export Dropdown Menu - Improved Design -->\n            @if (showExportMenu()) {\n            <div\n              class=\"tw-absolute tw-right-0 tw-mt-2 tw-w-56 tw-bg-white tw-rounded-lg tw-shadow-xl tw-border tw-border-gray-200 tw-z-50 tw-overflow-hidden\"\n              (click)=\"$event.stopPropagation()\">\n              <div class=\"tw-py-1.5\">\n                <div class=\"tw-px-3 tw-py-2 tw-bg-gray-50 tw-border-b tw-border-gray-200\">\n                  <span class=\"tw-text-xs tw-font-semibold tw-text-gray-500 tw-uppercase tw-tracking-wider\">Export\n                    Options</span>\n                </div>\n                <button type=\"button\"\n                  class=\"tw-w-full tw-text-left tw-px-4 tw-py-3 tw-text-sm tw-text-gray-700 hover:tw-bg-green-50 hover:tw-text-green-700 tw-flex tw-items-center tw-transition-colors tw-duration-150\"\n                  (click)=\"exportData('csv')\">\n                  <div\n                    class=\"tw-w-8 tw-h-8 tw-rounded tw-bg-green-100 tw-flex tw-items-center tw-justify-center tw-mr-3\">\n                    <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-green-600\">description</cide-ele-icon>\n                  </div>\n                  <div class=\"tw-flex-1\">\n                    <div class=\"tw-font-medium\">CSV</div>\n                    <div class=\"tw-text-xs tw-text-gray-500\">Comma separated values</div>\n                  </div>\n                </button>\n                <button type=\"button\"\n                  class=\"tw-w-full tw-text-left tw-px-4 tw-py-3 tw-text-sm tw-text-gray-700 hover:tw-bg-blue-50 hover:tw-text-blue-700 tw-flex tw-items-center tw-transition-colors tw-duration-150\"\n                  (click)=\"exportData('excel')\">\n                  <div\n                    class=\"tw-w-8 tw-h-8 tw-rounded tw-bg-blue-100 tw-flex tw-items-center tw-justify-center tw-mr-3\">\n                    <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-600\">table_chart</cide-ele-icon>\n                  </div>\n                  <div class=\"tw-flex-1\">\n                    <div class=\"tw-font-medium\">Excel</div>\n                    <div class=\"tw-text-xs tw-text-gray-500\">Microsoft Excel format</div>\n                  </div>\n                </button>\n                <button type=\"button\"\n                  class=\"tw-w-full tw-text-left tw-px-4 tw-py-3 tw-text-sm tw-text-gray-700 hover:tw-bg-red-50 hover:tw-text-red-700 tw-flex tw-items-center tw-transition-colors tw-duration-150\"\n                  (click)=\"exportData('pdf')\">\n                  <div class=\"tw-w-8 tw-h-8 tw-rounded tw-bg-red-100 tw-flex tw-items-center tw-justify-center tw-mr-3\">\n                    <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-red-600\">picture_as_pdf</cide-ele-icon>\n                  </div>\n                  <div class=\"tw-flex-1\">\n                    <div class=\"tw-font-medium\">PDF</div>\n                    <div class=\"tw-text-xs tw-text-gray-500\">Portable document format</div>\n                  </div>\n                </button>\n              </div>\n            </div>\n            }\n          </div>\n        </div>\n      </div>\n\n      <!-- Right Side: Custom Actions and Drag Order Actions -->\n      <div class=\"tw-flex tw-items-center tw-space-x-2\">\n        <!-- Custom Action Template -->\n        @if (mergedConfig().actionRenderer && templateRenderers[mergedConfig().actionRenderer!]) {\n        <div class=\"data-grid-custom-actions\">\n          <ng-container [ngTemplateOutlet]=\"$any(templateRenderers[mergedConfig().actionRenderer!])\"\n            [ngTemplateOutletContext]=\"{ config: mergedConfig() }\">\n          </ng-container>\n        </div>\n        }\n\n        <!-- Drag Order Actions -->\n        @if (isDragDropEnabled() && (isDragging() || hasOrderChanged())) {\n        <button cideEleButton variant=\"outline\" size=\"xs\" type=\"button\"\n          (click)=\"onActionClick(null, { key: 'reset-order', label: 'Reset Order', icon: 'undo', variant: 'outline', onClick: 'resetOrder' })\"\n          class=\"tw-text-blue-700 tw-border-blue-300 hover:tw-bg-blue-100\">\n          <cide-ele-icon size=\"sm\" class=\"tw-w-4 tw-h-4 tw-mr-1\">undo</cide-ele-icon>\n          Reset Order\n        </button>\n        <button cideEleButton variant=\"primary\" size=\"xs\" type=\"button\"\n          (click)=\"onActionClick(null, { key: 'save-order', label: 'Save Order', icon: 'save', variant: 'primary', onClick: 'saveOrder' })\"\n          class=\"tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white\">\n          <cide-ele-icon size=\"sm\" class=\"tw-w-4 tw-h-4 tw-mr-1\">save</cide-ele-icon>\n          Save Order\n        </button>\n        }\n      </div>\n    </div>\n  </div>\n  }\n\n  <!-- Content Section (Table or Cards) -->\n  <!-- VIRTUAL SCROLL MODE -->\n  @if (isVirtualScrollerEnabled()) {\n  <cdk-virtual-scroll-viewport [itemSize]=\"virtualRowHeight()\" (scrolledIndexChange)=\"onScrolledIndexChange($event)\"\n    class=\"tw-overflow-x-auto tw-relative custom-scrollbar tw-flex-1 tw-min-h-0\" [ngClass]=\"{\n          'tw-overflow-y-auto': true,\n          'tw-max-h-full': true\n        }\"\n    [style.maxHeight]=\"scrollConfig?.enabled ? scrollConfig?.maxHeight : (mergedConfig().fullHeight ? 'none' : null)\"\n    [style.minHeight]=\"scrollConfig?.enabled ? scrollConfig?.minHeight : (mergedConfig().fullHeight ? '0' : null)\">\n\n    <!-- Container for items -->\n    <div class=\"tw-min-w-full\">\n      @if (!isMobileView() || !mergedConfig().mobileLayout?.enabled) {\n      <!-- Desktop Table (Virtual) -->\n      <table class=\"tw-w-full tw-border-collapse\">\n        <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n        <tbody class=\"tw-bg-white\">\n          <ng-container *cdkVirtualFor=\"let item of virtualData(); let i = index; trackBy: trackByFn\">\n            <ng-container *ngTemplateOutlet=\"rowContent; context: {$implicit: item, index: i}\"></ng-container>\n          </ng-container>\n        </tbody>\n      </table>\n      } @else {\n      <!-- Mobile Cards (Virtual) -->\n      <div *cdkVirtualFor=\"let item of virtualData(); let i = index; trackBy: trackByFn\" class=\"tw-mb-4\">\n        <ng-container *ngTemplateOutlet=\"cardContent; context: {$implicit: item, index: i}\"></ng-container>\n      </div>\n      }\n    </div>\n\n    <!-- Empty State -->\n    @if (displayedData.length === 0 && !loading() && !isRefreshing() && !pageChangeLoading()) {\n    <ng-container *ngTemplateOutlet=\"emptyState\"></ng-container>\n    }\n\n    <!-- Infinite Scroll Loader -->\n    @if (mergedConfig().pagination.infiniteScroll) {\n    @if ((loading() || pageChangeLoading()) && virtualData().length === 0) {\n    <ng-container *ngTemplateOutlet=\"loadingSpinner\"></ng-container>\n    }\n    }\n  </cdk-virtual-scroll-viewport>\n  }\n\n  <!-- STANDARD SCROLL MODE (Page Scroll) -->\n  @else {\n  <div class=\"tw-w-full tw-flex-1 tw-overflow-auto tw-min-h-0 tw-relative\">\n    @if (!isMobileView() || !mergedConfig().mobileLayout?.enabled) {\n    <!-- Desktop Table (Standard) -->\n    <table class=\"tw-w-full tw-border-collapse\">\n      <ng-container *ngTemplateOutlet=\"headerContent\"></ng-container>\n      <tbody class=\"tw-bg-white\">\n        @for (item of virtualData(); track trackByFn($index, item); let i = $index) {\n        <ng-container *ngTemplateOutlet=\"rowContent; context: {$implicit: item, index: i}\"></ng-container>\n        }\n      </tbody>\n    </table>\n    } @else {\n    <!-- Mobile Cards (Standard) -->\n    <div class=\"tw-p-4 tw-space-y-4\">\n      @for (item of virtualData(); track trackByFn($index, item); let i = $index) {\n      <ng-container *ngTemplateOutlet=\"cardContent; context: {$implicit: item, index: i}\"></ng-container>\n      }\n    </div>\n    }\n\n    <!-- Empty State -->\n    @if (displayedData.length === 0 && !loading() && !isRefreshing() && !pageChangeLoading()) {\n    <ng-container *ngTemplateOutlet=\"emptyState\"></ng-container>\n    }\n\n    <!-- Standard Loader -->\n    @if (mergedConfig().pagination.infiniteScroll && ((loading() || pageChangeLoading()) &&\n    virtualData().length === 0)) {\n    <ng-container *ngTemplateOutlet=\"loadingSpinner\"></ng-container>\n    }\n  </div>\n  }\n\n\n\n\n  <!-- Pagination Section -->\n  @if (mergedConfig().pagination.enabled) {\n  <div class=\"tw-px-3 tw-py-0 tw-border-t tw-border-gray-200 tw-bg-white tw-relative tw-z-20\"\n    [class.tw-hidden]=\"mergedConfig().scroll?.virtualScroll\" [class.tw-opacity-60]=\"isRefreshing()\">\n\n    <!-- Results Info and Pagination Controls -->\n    <div\n      class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-center tw-py-0.5 tw-space-y-3 sm:tw-space-y-0\">\n\n      <!-- Left Side: Results Info and Page Size -->\n      <div class=\"tw-flex tw-items-center tw-justify-between tw-w-full sm:tw-w-auto tw-gap-4\">\n        @if (paginationConfig.showPageInfo) {\n        <div class=\"tw-flex tw-items-center tw-gap-3\">\n          <p class=\"tw-text-xs tw-text-gray-700 tw-font-medium\">\n            {{ getItemRangeText() }}<span class=\"tw-hidden md:tw-inline\"> results</span>\n          </p>\n\n          <!-- Page Size Selector -->\n          <div class=\"tw-flex tw-items-center tw-space-x-1\">\n            <cide-ele-icon class=\"tw-w-3.5 tw-h-3.5 tw-text-gray-400\">view_list</cide-ele-icon>\n            <div class=\"tw-w-16 tw-relative\">\n              <cide-ele-select [labelHide]=\"true\" [ngModel]=\"pageSize()\" (ngModelChange)=\"updatePageSize($event)\"\n                [options]=\"getPageSizeOptions()\" [disabled]=\"isRefreshing()\" fill=\"outline\" size=\"sm\" class=\"tw-z-30\">\n              </cide-ele-select>\n            </div>\n          </div>\n        </div>\n        }\n      </div>\n\n      <!-- Right Side: Navigation and Quick Jump -->\n      <div class=\"tw-flex tw-flex-wrap tw-items-center tw-justify-center sm:tw-justify-end tw-gap-x-4 tw-gap-y-2\">\n        <!-- Navigation Buttons -->\n        <div class=\"tw-flex tw-items-center tw-space-x-1\">\n          <!-- First/Previous -->\n          <button type=\"button\" (click)=\"onPageChange(1)\" [disabled]=\"currentPage() === 1 || isRefreshing()\"\n            class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-lg tw-text-gray-500 hover:tw-bg-gray-100 disabled:tw-opacity-30\"\n            title=\"First page\">\n            <cide-ele-icon class=\"tw-w-4 tw-h-4\">first_page</cide-ele-icon>\n          </button>\n          <button type=\"button\" (click)=\"previousPage()\" [disabled]=\"!hasPreviousPage() || isRefreshing()\"\n            class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-lg tw-text-gray-500 hover:tw-bg-gray-100 disabled:tw-opacity-30\"\n            title=\"Previous page\">\n            <cide-ele-icon class=\"tw-w-4 tw-h-4\">chevron_left</cide-ele-icon>\n          </button>\n\n          <!-- Selected Page Display (Compact for Mobile) -->\n          <div class=\"tw-flex tw-items-center tw-bg-gray-50 tw-rounded-lg tw-px-2 tw-py-1 tw-border tw-border-gray-200\">\n            <span class=\"tw-text-xs tw-font-bold tw-text-blue-600\">Page {{ currentPage() }}</span>\n            <span class=\"tw-text-xs tw-text-gray-400 tw-mx-1\">of</span>\n            <span class=\"tw-text-xs tw-font-medium tw-text-gray-600\">{{ totalPages() }}</span>\n          </div>\n\n          <!-- Next/Last -->\n          <button type=\"button\" (click)=\"nextPage()\" [disabled]=\"!hasNextPage() || isRefreshing()\"\n            class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-lg tw-text-gray-500 hover:tw-bg-gray-100 disabled:tw-opacity-30\"\n            title=\"Next page\">\n            <cide-ele-icon class=\"tw-w-4 tw-h-4\">chevron_right</cide-ele-icon>\n          </button>\n          <button type=\"button\" (click)=\"onPageChange(totalPages())\"\n            class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-lg tw-text-gray-500 hover:tw-bg-gray-100 disabled:tw-opacity-30\"\n            title=\"Last page\">\n            <cide-ele-icon class=\"tw-w-4 tw-h-4\">last_page</cide-ele-icon>\n          </button>\n        </div>\n\n        <!-- Quick Jump and Refresh group -->\n        <div class=\"tw-flex tw-items-center tw-gap-2 sm:tw-border-l sm:tw-border-gray-200 sm:tw-pl-4\">\n          @if (paginationConfig.showQuickJump) {\n          <div class=\"tw-flex tw-items-center tw-gap-1\">\n            <div class=\"tw-w-12\">\n              <cide-ele-input id=\"jump-to-page-input\" type=\"number\" [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\"\n                [(ngModel)]=\"jumpToPage\" [min]=\"1\" [max]=\"totalPages()\" [disabled]=\"isRefreshing()\" size=\"sm\"\n                (keydown.enter)=\"onJumpToPage()\" placeholder=\"#\">\n              </cide-ele-input>\n            </div>\n            <button type=\"button\" (click)=\"onJumpToPage()\" [disabled]=\"isRefreshing()\"\n              class=\"tw-h-[24px] tw-flex tw-items-center tw-justify-center tw-text-[10px] tw-font-bold tw-px-2.5 tw-rounded-lg tw-bg-blue-50 tw-text-blue-600 hover:tw-bg-blue-100 tw-transition-all\">\n              GO\n            </button>\n          </div>\n          }\n\n          @if (paginationConfig.showRefresh) {\n          <button type=\"button\" (click)=\"onRefresh()\" [disabled]=\"isRefreshing()\"\n            class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-lg tw-text-gray-500 hover:tw-bg-blue-50 hover:tw-text-blue-600 tw-transition-colors\"\n            [class.tw-animate-spin]=\"isRefreshing()\" title=\"Refresh\">\n            <cide-ele-icon class=\"tw-w-4 tw-h-4\">refresh</cide-ele-icon>\n          </button>\n          }\n        </div>\n      </div>\n    </div>\n  </div>\n  }\n\n  <!-- Manage Columns Modal -->\n  @if (showManageColumnsModal()) {\n  <div class=\"tw-fixed tw-inset-0 tw-z-50 tw-overflow-y-auto\" (click)=\"closeManageColumnsModal()\"\n    style=\"background-color: rgba(0, 0, 0, 0.5);\">\n    <div class=\"tw-flex tw-items-center tw-justify-center tw-min-h-screen tw-p-4\">\n      <div\n        class=\"tw-bg-white tw-rounded-lg tw-shadow-xl tw-max-w-md tw-w-full tw-max-h-[80vh] tw-overflow-hidden tw-flex tw-flex-col\"\n        (click)=\"$event.stopPropagation()\">\n        <!-- Modal Header -->\n        <div class=\"tw-px-6 tw-py-4 tw-border-b tw-border-gray-200 tw-flex tw-items-center tw-justify-between\">\n          <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-900\">Manage Columns</h3>\n          <button type=\"button\" class=\"tw-text-gray-400 hover:tw-text-gray-600 tw-transition-colors\"\n            (click)=\"closeManageColumnsModal()\">\n            <cide-ele-icon class=\"tw-w-5 tw-h-5\">close</cide-ele-icon>\n          </button>\n        </div>\n\n        <!-- Modal Body -->\n        <div class=\"tw-px-6 tw-py-4 tw-overflow-y-auto tw-flex-1\">\n          <p class=\"tw-text-sm tw-text-gray-600 tw-mb-4\">Select columns to show or hide:</p>\n          <div class=\"tw-space-y-2\">\n            @for (column of mergedConfig().columns; track column.key) {\n            <label\n              class=\"tw-flex tw-items-center tw-px-3 tw-py-2 tw-rounded-md hover:tw-bg-gray-50 tw-cursor-pointer tw-transition-colors\">\n              <input type=\"checkbox\"\n                class=\"tw-mr-3 tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500\"\n                [checked]=\"!isColumnHidden(column.key)\"\n                (change)=\"toggleColumnVisibility(column.key); $event.stopPropagation()\">\n              <span class=\"tw-text-sm tw-text-gray-700 tw-flex-1\">{{ column.header }}</span>\n              @if (isColumnHidden(column.key)) {\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-400 tw-ml-2\">visibility_off</cide-ele-icon>\n              } @else {\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-400 tw-ml-2\">visibility</cide-ele-icon>\n              }\n            </label>\n            }\n          </div>\n        </div>\n\n        <!-- Modal Footer -->\n        <div class=\"tw-px-6 tw-py-4 tw-border-t tw-border-gray-200 tw-flex tw-items-center tw-justify-end tw-gap-3\">\n          <button type=\"button\"\n            class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-medium tw-text-gray-700 tw-bg-white tw-border tw-border-gray-300 tw-rounded-md hover:tw-bg-gray-50 tw-transition-colors\"\n            (click)=\"closeManageColumnsModal()\">\n            Close\n          </button>\n          <button type=\"button\"\n            class=\"tw-px-4 tw-py-2 tw-text-sm tw-font-medium tw-text-white tw-bg-blue-600 tw-border tw-border-transparent tw-rounded-md hover:tw-bg-blue-700 tw-transition-colors\"\n            (click)=\"onColumnReset(); closeManageColumnsModal()\">\n            Reset All\n          </button>\n        </div>\n      </div>\n    </div>\n  </div>\n  }\n</div>\n\n<!-- REUSABLE TEMPLATES -->\n\n<!-- 1. Header Template -->\n<ng-template #headerContent>\n  <thead class=\"tw-bg-gray-50 !tw-sticky tw-top-0 tw-z-10\" [ngClass]=\"[\n              mergedConfig().headerClass || ''\n            ]\">\n    <tr>\n      @for (column of visibleColumns(); track column.key) {\n      <th\n        class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wider tw-relative\"\n        [ngClass]=\"[\n                getColumnWidthClass(column.width),\n                getColumnMaxWidthClass(column.width),\n                column.align === 'center' ? 'tw-text-center' : '',\n                column.align === 'right' ? 'tw-text-right' : ''\n              ]\" [style.width]=\"getColumnWidthStyle(column.width)\"\n        [style.maxWidth]=\"getColumnMaxWidthStyle(column.width)\" [title]=\"column.header\">\n        <div class=\"tw-flex tw-items-center tw-justify-between tw-gap-1\">\n          <div class=\"tw-flex tw-items-center tw-gap-1 tw-truncate tw-flex-1\">\n            <span class=\"tw-truncate\">{{ column.header }}</span>\n            @if (getColumnSortDirection(column.key) === 'asc') {\n            <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-blue-600 tw-flex-shrink-0\"\n              title=\"Sorted Ascending\">arrow_upward</cide-ele-icon>\n            }\n            @if (getColumnSortDirection(column.key) === 'desc') {\n            <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-blue-600 tw-flex-shrink-0\"\n              title=\"Sorted Descending\">arrow_downward</cide-ele-icon>\n            }\n          </div>\n\n          <!-- Active Filter Indicator -->\n          @if (isColumnFiltered(column.key)) {\n          <div\n            class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded tw-bg-blue-100 tw-text-blue-700 tw-text-xs tw-font-medium tw-mr-1\">\n            <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-0.5\">filter_alt</cide-ele-icon>\n            {{ getActiveFilterCount(column.key) }}\n          </div>\n          }\n\n          <!-- Column Menu Trigger (Three Dots Icon) -->\n          @if (mergedConfig().columnMenu?.enabled) {\n          <button type=\"button\"\n            class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-rounded tw-text-gray-600 hover:tw-text-gray-800 hover:tw-bg-gray-100 tw-transition-all column-menu-trigger\"\n            [class.tw-text-blue-600]=\"isColumnMenuOpen(column.key) || isColumnFiltered(column.key)\"\n            [class.tw-bg-blue-50]=\"isColumnFiltered(column.key)\" (click)=\"toggleColumnMenu(column.key, $event)\"\n            title=\"Column options\">\n            <cide-ele-icon class=\"tw-w-5 tw-h-4\">more_vert</cide-ele-icon>\n          </button>\n          }\n        </div>\n\n        <!-- Column Menu Dropdown -->\n        @if (isColumnMenuOpen(column.key)) {\n        <div\n          class=\"column-menu-dropdown tw-absolute tw-z-[9999] tw-mt-2 tw-w-56 tw-rounded-lg tw-shadow-lg tw-bg-white tw-ring-1 tw-ring-black tw-ring-opacity-5\">\n          <div class=\"tw-py-1\">\n            <!-- Sort Options -->\n            @if (mergedConfig().columnMenu?.showSort && column.sortable !== false) {\n            @let sortDirection = getColumnSortDirection(column.key);\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-2 tw-text-sm tw-transition-colors\"\n              [class.tw-text-blue-700]=\"sortDirection === 'asc'\" [class.tw-bg-blue-50]=\"sortDirection === 'asc'\"\n              [class.tw-text-gray-700]=\"sortDirection !== 'asc'\" [class.hover:tw-bg-gray-50]=\"sortDirection !== 'asc'\"\n              (click)=\"onColumnSort(column, 'asc')\">\n              <div class=\"tw-flex tw-items-center\">\n                <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3\" [class.tw-text-blue-600]=\"sortDirection === 'asc'\"\n                  [class.tw-text-gray-400]=\"sortDirection !== 'asc'\">arrow_upward</cide-ele-icon>\n                Ascending\n              </div>\n              @if (sortDirection === 'asc') {\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-600\">check</cide-ele-icon>\n              }\n            </button>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-2 tw-text-sm tw-transition-colors\"\n              [class.tw-text-blue-700]=\"sortDirection === 'desc'\" [class.tw-bg-blue-50]=\"sortDirection === 'desc'\"\n              [class.tw-text-gray-700]=\"sortDirection !== 'desc'\" [class.hover:tw-bg-gray-50]=\"sortDirection !== 'desc'\"\n              (click)=\"onColumnSort(column, 'desc')\">\n              <div class=\"tw-flex tw-items-center\">\n                <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3\" [class.tw-text-blue-600]=\"sortDirection === 'desc'\"\n                  [class.tw-text-gray-400]=\"sortDirection !== 'desc'\">arrow_downward</cide-ele-icon>\n                Descending\n              </div>\n              @if (sortDirection === 'desc') {\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-600\">check</cide-ele-icon>\n              }\n            </button>\n            <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n            }\n\n            <!-- Filter Option -->\n            @if (mergedConfig().columnMenu?.showFilter && column.filterable !== false) {\n            <!-- Check if there's a custom filter renderer template -->\n            @if (column.filterRenderer && templateRenderers[column.filterRenderer]) {\n            <div class=\"tw-px-4 tw-py-2\">\n              <ng-container [ngTemplateOutlet]=\"$any(templateRenderers[column.filterRenderer])\"\n                [ngTemplateOutletContext]=\"{ $implicit: column, column: column, onFilter: onColumnFilter.bind(this) }\">\n              </ng-container>\n            </div>\n            } @else {\n            <!-- Excel-style Filter Button -->\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              [class.tw-bg-blue-50]=\"isFilterPanelOpen(column.key)\" (click)=\"toggleFilterPanel(column.key, $event)\">\n              <div class=\"tw-flex tw-items-center\">\n                <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">filter_list</cide-ele-icon>\n                Filter\n              </div>\n              <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-gray-400\">\n                {{ isFilterPanelOpen(column.key) ? 'expand_less' : 'expand_more' }}\n              </cide-ele-icon>\n            </button>\n\n            <!-- Excel-style Filter Panel -->\n            @if (isFilterPanelOpen(column.key)) {\n            <div class=\"tw-px-2 tw-py-2 tw-bg-gray-50\" (click)=\"$event.stopPropagation()\">\n              <!-- Search box -->\n              <div class=\"tw-px-2 tw-mb-2\">\n                <input type=\"text\"\n                  class=\"tw-w-full tw-px-2 tw-py-1 tw-text-xs tw-border tw-border-gray-300 tw-rounded focus:tw-outline-none focus:tw-ring-1 focus:tw-ring-blue-500\"\n                  placeholder=\"Search...\" [(ngModel)]=\"filterSearchTerm\" (click)=\"$event.stopPropagation()\">\n              </div>\n\n              <!-- Select All / Deselect All -->\n              <div class=\"tw-px-2 tw-mb-1 tw-flex tw-gap-2\">\n                <button type=\"button\" class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-700\"\n                  (click)=\"selectAllFilterValues(column); $event.stopPropagation()\">\n                  Select All\n                </button>\n                <span class=\"tw-text-xs tw-text-gray-400\">|</span>\n                <button type=\"button\" class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-700\"\n                  (click)=\"deselectAllFilterValues(column); $event.stopPropagation()\">\n                  Clear\n                </button>\n              </div>\n\n              <!-- Filter values list -->\n              <div class=\"tw-max-h-48 tw-overflow-y-auto\">\n                @for (item of getUniqueColumnValues(column); track item.value) {\n                <label\n                  class=\"tw-flex tw-items-center tw-px-2 tw-py-1 tw-text-xs hover:tw-bg-white tw-cursor-pointer tw-rounded\">\n                  <input type=\"checkbox\"\n                    class=\"tw-mr-2 tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500\"\n                    [checked]=\"item.checked\"\n                    (change)=\"toggleFilterValue(column, item.value, $any($event.target).checked)\"\n                    (click)=\"$event.stopPropagation()\">\n                  <span class=\"tw-flex-1 tw-truncate\">{{ item.label }}</span>\n                  <span class=\"tw-text-gray-400 tw-ml-1\">({{ item.count }})</span>\n                </label>\n                }\n              </div>\n            </div>\n            }\n            }\n            <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n            }\n\n            <!-- Autosize Option -->\n            @if (mergedConfig().columnMenu?.showAutosize) {\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnAutosize(column)\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">fit_screen</cide-ele-icon>\n              Autosize\n            </button>\n            }\n\n            <!-- Group By Column Option -->\n            @if (mergedConfig().columnMenu?.showGroupBy && column.groupable !== false) {\n            @let isGrouped = groupedColumns().includes(column.key);\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-2 tw-text-sm tw-transition-colors\"\n              [class.tw-text-blue-700]=\"isGrouped\" [class.tw-bg-blue-50]=\"isGrouped\"\n              [class.tw-text-gray-700]=\"!isGrouped\" [class.hover:tw-bg-gray-50]=\"!isGrouped\"\n              (click)=\"onColumnGroupBy(column)\">\n              <div class=\"tw-flex tw-items-center\">\n                <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3\" [class.tw-text-blue-600]=\"isGrouped\"\n                  [class.tw-text-gray-400]=\"!isGrouped\">group_work</cide-ele-icon>\n                Group By Column\n              </div>\n              @if (isGrouped) {\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-600\">check</cide-ele-icon>\n              }\n            </button>\n            }\n\n            <!-- Manage Columns Option -->\n            @if (mergedConfig().columnMenu?.showManageColumns) {\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onManageColumns()\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">view_column</cide-ele-icon>\n              Manage Columns\n            </button>\n            }\n\n            <!-- Reset Columns Option -->\n            @if (mergedConfig().columnMenu?.showResetColumns) {\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnReset()\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">refresh</cide-ele-icon>\n              Reset Columns\n            </button>\n            }\n\n            <!-- Hide Column Option -->\n            @if (mergedConfig().columnMenu?.showHideColumn && column.hideable !== false) {\n            <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnHide(column)\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">visibility_off</cide-ele-icon>\n              Hide Column\n            </button>\n            }\n\n            <!-- Aggregation Select Option -->\n            @if (mergedConfig().columnMenu?.showAggregation && column.aggregatable !== false) {\n            <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n            <div class=\"tw-px-4 tw-py-2 tw-text-xs tw-font-semibold tw-text-gray-500 tw-uppercase\">Aggregation\n            </div>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnAggregation(column, 'sum')\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">functions</cide-ele-icon>\n              Sum\n            </button>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnAggregation(column, 'avg')\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">analytics</cide-ele-icon>\n              Average\n            </button>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnAggregation(column, 'count')\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">tag</cide-ele-icon>\n              Count\n            </button>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnAggregation(column, 'min')\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_downward</cide-ele-icon>\n              Min\n            </button>\n            <button type=\"button\"\n              class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n              (click)=\"onColumnAggregation(column, 'max')\">\n              <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_upward</cide-ele-icon>\n              Max\n            </button>\n            }\n          </div>\n        </div>\n        }\n      </th>\n      }\n    </tr>\n  </thead>\n</ng-template>\n\n<!-- 2. Row Template -->\n<ng-template #rowContent let-item let-i=\"index\">\n  @if (item) {\n  @if (isGroupHeader(item)) {\n  <!-- Group Header Row -->\n  @let groupKey = getGroupKey(item);\n  @let groupLevel = getGroupLevel(item);\n  <tr class=\"data-grid-group-row tw-border-b-2 tw-border-gray-300 tw-font-semibold\"\n    [class.tw-bg-gray-50]=\"groupLevel === 0\" [class.tw-bg-gray-100]=\"groupLevel === 1\"\n    [class.tw-bg-gray-200]=\"groupLevel > 1\" (click)=\"toggleGroupExpansion(groupKey)\">\n    <td class=\"tw-px-3 tw-py-1 tw-cursor-pointer tw-transition-colors\" [attr.colspan]=\"visibleColumns().length\">\n      <div class=\"tw-flex tw-items-center tw-gap-2\" [style.padding-left.px]=\"groupLevel * 24\">\n        <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-600 tw-cursor-pointer\">\n          {{ isGroupExpanded(groupKey) ? 'expand_more' : 'chevron_right' }}\n        </cide-ele-icon>\n        <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-blue-600\">group_work</cide-ele-icon>\n        <span class=\"tw-text-sm tw-font-medium tw-text-gray-900\">\n          {{ getGroupColumnHeader(item) }}: {{ getGroupValueDisplay(item) }}\n        </span>\n        <span class=\"tw-text-xs tw-text-gray-500 tw-ml-2 tw-bg-gray-200 tw-px-2 tw-py-0.5 tw-rounded-full\">\n          {{ getGroupRowCount(item) }}\n        </span>\n\n        <!-- Group Aggregations -->\n        <div class=\"tw-flex tw-items-center tw-ml-auto tw-gap-4 tw-pr-4\">\n          @for (agg of getGroupAggregations(item); track agg.key) {\n          <div class=\"tw-flex tw-flex-col tw-items-end\">\n            <span class=\"tw-text-[10px] tw-text-gray-500 tw-uppercase tw-leading-none\">{{ agg.label }}</span>\n            <span class=\"tw-text-xs tw-font-bold tw-text-gray-900\">{{ agg.value }}</span>\n          </div>\n          }\n        </div>\n      </div>\n    </td>\n  </tr>\n  } @else {\n  <!-- Regular Data Row -->\n  <tr class=\"tw-group data-grid-row tw-border-b-2 tw-border-gray-200\" [attr.data-index]=\"i\" [ngClass]=\"[\n              mergedConfig().rowClass || '',\n              isRefreshing() ? 'tw-opacity-60 tw-pointer-events-none' : '',\n              isDragDropEnabled() ? 'tw-cursor-move tw-border-2 tw-border-transparent' : '',\n              !isDragDropEnabled() ? 'tw-transition-colors tw-duration-150' : '',\n              isTreeEnabled() ? getTreeLevelClass(item) : ''\n            ]\" [style.border-color]=\"isDragOverRow === i ? '#3b82f6' : 'transparent'\"\n    [style.background-color]=\"isDragOverRow === i ? '#eff6ff' : ''\" (click)=\"onRowClick(item)\"\n    (keydown.enter)=\"onRowClick(item)\" (keydown.space)=\"onRowClick(item)\"\n    [class.tw-cursor-pointer]=\"mergedConfig().onRowClick && !isDragDropEnabled()\"\n    [tabindex]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 0 : -1\"\n    [attr.role]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'button' : null\"\n    [attr.aria-label]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'Select row' : null\"\n    [draggable]=\"isDragDropEnabled()\" (dragstart)=\"onDragStart($event, item, i)\" (dragover)=\"onDragOver($event)\"\n    (dragleave)=\"onDragLeave($event)\" (drop)=\"onDrop($event, item, i)\" (dragend)=\"onDragEnd($event)\">\n\n    @for (column of visibleColumns(); track column.key) {\n    <td class=\"tw-pr-3 tw-py-1 tw-relative\" [ngClass]=\"[\n                  getColumnWidthClass(column.width),\n                  getColumnMaxWidthClass(column.width),\n                  mergedConfig().cellClass || '',\n                  column.align === 'center' ? 'tw-text-center' : '',\n                  column.align === 'right' ? 'tw-text-right' : '',\n                  column.truncate !== false ? 'tw-whitespace-nowrap' : 'tw-whitespace-normal'\n                ]\" [style.width]=\"getColumnWidthStyle(column.width)\"\n      [style.paddingLeft]=\"isTreeEnabled() && $index === 0 ? getTreeIndentStyle(item) : '12px'\"\n      [style.maxWidth]=\"getColumnMaxWidthStyle(column.width) || (getColumnMaxWidthClass(column.width) === 'tw-max-w-xs' ? '200px' : getColumnMaxWidthClass(column.width) === 'tw-max-w-sm' ? '300px' : getColumnMaxWidthClass(column.width) === 'tw-max-w-md' ? '400px' : null)\"\n      [style.minWidth]=\"isTreeEnabled() && $index === 0 ? '150px' : (getColumnWidthStyle(column.width) ? null : '100px')\">\n      <!-- Tree Expand/Collapse Button (only for first column when tree is enabled) -->\n      @if (isTreeEnabled() && $index === 0) {\n      <div class=\"tw-flex tw-items-center tw-space-x-2\">\n        <!-- Tree Indentation -->\n        <div class=\"tw-flex tw-items-center\">\n          @if (hasChildren(item)) {\n          <button variant=\"outline\" size=\"xs\" type=\"button\"\n            (click)=\"onActionClick(item, { key: 'toggle-expand', label: 'Toggle', icon: '', variant: 'ghost', onClick: 'toggle-expand' }); $event.stopPropagation()\"\n            class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-text-gray-500 hover:tw-text-gray-700 tw-rounded\"\n            [class.tw-transition-colors]=\"!isDragDropEnabled()\" [title]=\"isItemExpanded(item) ? 'Collapse' : 'Expand'\">\n            <cide-ele-icon class=\"tw-w-3 tw-h-3\" [class.tw-transition-transform]=\"!isDragDropEnabled()\"\n              [class.tw-rotate-90]=\"isItemExpanded(item)\" size=\"sm\">\n              chevron_right\n            </cide-ele-icon>\n          </button>\n          } @else {\n          <div class=\"tw-w-8 tw-h-5 tw-flex tw-items-center tw-justify-center\">\n            <!-- <div class=\"tw-w-1 tw-h-1 tw-bg-gray-300 tw-rounded-full\"></div> -->\n          </div>\n          }\n        </div>\n\n        <!-- Cell Content -->\n        <div class=\"tw-flex-1 tw-w-full\">\n          @if (column.type === 'text') {\n          <p class=\"tw-text-sm tw-text-gray-900\" [class.tw-truncate]=\"column.truncate\"\n            [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\n            {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n          </p>\n          } @else if (column.type === 'number') {\n          <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\n            {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n          </span>\n          } @else if (column.type === 'date') {\n          <span class=\"tw-text-sm tw-text-gray-600\">\n            {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n          </span>\n          } @else if (column.type === 'boolean') {\n          <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n            [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n            {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\n          </span>\n          } @else if (column.type === 'status' && column.statusConfig) {\n          <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n            [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\n            {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\n          </span>\n          } @else if (column.type === 'actions' && column.actions) {\n          <div class=\"tw-flex tw-items-center tw-space-x-2\">\n            @for (action of column.actions; track action.key) {\n            <button cideEleButton [variant]=\"action.variant || 'ghost'\" size=\"xs\" type=\"button\"\n              (click)=\"onActionClick(item, action); $event.stopPropagation()\" [title]=\"action.tooltip || action.label\"\n              [disabled]=\"isRefreshing()\"\n              class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\n              [class.tw-transition-colors]=\"!isDragDropEnabled()\" [ngClass]=\"{\n                                      'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\n                                      'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\n                                      'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\n                                      'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\n                                    }\">\n              @if (action.icon) {\n              <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n                <path d=\"M10 12l-5-5h10l-5 5z\" />\n              </svg>\n              }\n              {{ action.label }}\n            </button>\n            }\n          </div>\n          } @else if (column.type === 'custom') {\n          <!-- Template Renderer -->\n          @if (column.renderer && isTemplateRenderer(column.renderer)) {\n          <ng-container [ngTemplateOutlet]=\"getTemplateRenderer(column.renderer)!\"\n            [ngTemplateOutletContext]=\"getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n          </ng-container>\n          } @else {\n          <!-- Default rendering -->\n          <div>{{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}</div>\n          }\n          }\n        </div>\n      </div>\n      } @else {\n      <!-- Regular cell content (non-tree or non-first column) -->\n      @if (column.type === 'text') {\n      <p class=\"tw-text-sm tw-text-gray-900\" [class.tw-truncate]=\"column.truncate\"\n        [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\n        {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n      </p>\n      } @else if (column.type === 'number') {\n      <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\n        {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n      </span>\n      } @else if (column.type === 'date') {\n      <span class=\"tw-text-sm tw-text-gray-600\">\n        {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n      </span>\n      } @else if (column.type === 'boolean') {\n      <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n        [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n        {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\n      </span>\n      } @else if (column.type === 'status' && column.statusConfig) {\n      <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n        [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\n        {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\n      </span>\n      } @else if (column.type === 'actions' && column.actions) {\n      <div class=\"tw-flex tw-items-center tw-space-x-2\">\n        @for (action of column.actions; track action.key) {\n        <button cideEleButton [variant]=\"action.variant || 'ghost'\" size=\"xs\" type=\"button\"\n          (click)=\"onActionClick(item, action); $event.stopPropagation()\" [title]=\"action.tooltip || action.label\"\n          [disabled]=\"isRefreshing()\"\n          class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\n          [class.tw-transition-colors]=\"!isDragDropEnabled()\" [ngClass]=\"{\n                                    'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\n                                    'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\n                                    'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\n                                    'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\n                                  }\">\n          @if (action.icon) {\n          <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n            <path d=\"M10 12l-5-5h10l-5 5z\" />\n          </svg>\n          }\n          {{ action.label }}\n        </button>\n        }\n      </div>\n      } @else if (column.type === 'custom') {\n      <!-- Template Renderer -->\n      @if (column.renderer && isTemplateRenderer(column.renderer)) {\n      <ng-container [ngTemplateOutlet]=\"getTemplateRenderer(column.renderer)!\"\n        [ngTemplateOutletContext]=\"getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n      </ng-container>\n      } @else {\n      <!-- Default rendering -->\n      <div>{{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}</div>\n      }\n      }\n      }\n    </td>\n    }\n  </tr>\n  }\n  } @else {\n  <!-- Skeleton Row for Virtual Scroll -->\n  <tr class=\"tw-animate-pulse tw-border-b tw-border-gray-200\">\n    @for (column of visibleColumns(); track column.key) {\n    <td class=\"tw-px-3 tw-py-2 tw-whitespace-nowrap\" [ngClass]=\"[\n              getColumnWidthClass(column.width),\n              getColumnMaxWidthClass(column.width)\n            ]\" [style.width]=\"getColumnWidthStyle(column.width)\"\n      [style.maxWidth]=\"getColumnMaxWidthStyle(column.width)\">\n      <div class=\"tw-h-2 tw-bg-gray-200 tw-rounded tw-w-3/4\"></div>\n    </td>\n    }\n  </tr>\n  }\n</ng-template>\n\n<!-- 3. Mobile Card Template -->\n<ng-template #cardContent let-item let-i=\"index\">\n  @if (item) {\n  <div\n    class=\"data-grid-card tw-bg-white tw-rounded-xl tw-p-4 tw-shadow-sm tw-border tw-border-gray-100 active:tw-bg-gray-50 tw-transition-colors\"\n    (click)=\"onRowClick(item)\">\n    <div class=\"tw-flex tw-justify-between tw-items-start tw-mb-3\">\n      <div class=\"tw-flex-1 tw-min-w-0\">\n        <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-900 tw-mb-0.5 tw-truncate\">\n          {{ getMobilePrimaryValue(item) }}\n        </h4>\n        @if (getMobileSecondaryValue(item)) {\n        <p class=\"tw-text-xs tw-text-gray-500 tw-truncate\">\n          {{ getMobileSecondaryValue(item) }}\n        </p>\n        }\n      </div>\n\n      <!-- Card Actions -->\n      @if (getRowActions().length > 0) {\n      <div class=\"tw-flex tw-gap-1 tw-ml-2\">\n        @for (action of getRowActions().slice(0, 2); track action.key) {\n        <button type=\"button\" (click)=\"onActionClick(item, action); $event.stopPropagation()\"\n          class=\"tw-p-1.5 tw-rounded-lg hover:tw-bg-gray-100 tw-text-gray-500 tw-transition-colors\"\n          [class.tw-text-blue-600]=\"action.variant === 'primary'\" [class.tw-text-red-600]=\"action.variant === 'danger'\"\n          [title]=\"action.label\">\n          @if (action.icon) {\n          <cide-ele-icon class=\"tw-w-5 tw-h-5\">{{ action.icon }}</cide-ele-icon>\n          } @else {\n          <span class=\"tw-text-[10px] tw-font-bold\">{{ action.label.substring(0, 1) }}</span>\n          }\n        </button>\n        }\n      </div>\n      }\n    </div>\n\n    <!-- Card Details Grid -->\n    <div class=\"tw-grid tw-grid-cols-2 tw-gap-x-4 tw-gap-y-3\">\n      @for (col of getMobileDetailColumns(); track col.key) {\n      <div class=\"tw-flex tw-flex-col tw-min-w-0\">\n        <span class=\"tw-text-[10px] tw-font-medium tw-text-gray-400 tw-uppercase tw-tracking-wider tw-mb-0.5\">\n          {{ col.header }}\n        </span>\n        <span class=\"tw-font-medium tw-truncate\" [ngClass]=\"{\n            'tw-text-xs tw-text-gray-700': col.type !== 'status' && col.type !== 'boolean',\n            'tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-[10px] tw-w-fit': col.type === 'status' || col.type === 'boolean'\n          }\"\n          [ngClass]=\"col.type === 'status' ? getStatusClass(getNestedValue(item, col.valueGetter || col.key), col.statusConfig) : \n                     (col.type === 'boolean' ? (getNestedValue(item, col.valueGetter || col.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800') : '')\">\n          {{ col.type === 'status' ? getStatusText(getNestedValue(item, col.valueGetter || col.key),\n          col.statusConfig) :\n          (col.type === 'boolean' ? (getNestedValue(item, col.valueGetter || col.key) ? 'Yes' : 'No') :\n          formatValue(getNestedValue(item, col.valueGetter || col.key), col)) }}\n        </span>\n      </div>\n      }\n    </div>\n  </div>\n  } @else {\n  <!-- Skeleton Card for Virtual Scroll -->\n  <div class=\"tw-bg-white tw-rounded-xl tw-p-4 tw-shadow-sm tw-border tw-border-gray-100 tw-animate-pulse\">\n    <div class=\"tw-flex tw-justify-between tw-items-start tw-mb-4\">\n      <div class=\"tw-flex-1\">\n        <div class=\"tw-h-4 tw-bg-gray-200 tw-rounded tw-w-2/3 tw-mb-2\"></div>\n        <div class=\"tw-h-3 tw-bg-gray-100 tw-rounded tw-w-1/2\"></div>\n      </div>\n      <div class=\"tw-h-8 tw-w-8 tw-bg-gray-100 tw-rounded-lg\"></div>\n    </div>\n    <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\n      <div class=\"tw-space-y-2\">\n        <div class=\"tw-h-2 tw-bg-gray-50 tw-rounded tw-w-1/2\"></div>\n        <div class=\"tw-h-3 tw-bg-gray-100 tw-rounded tw-w-3/4\"></div>\n      </div>\n      <div class=\"tw-space-y-2\">\n        <div class=\"tw-h-2 tw-bg-gray-50 tw-rounded tw-w-1/2\"></div>\n        <div class=\"tw-h-3 tw-bg-gray-100 tw-rounded tw-w-3/4\"></div>\n      </div>\n    </div>\n  </div>\n  }\n</ng-template>\n\n<!-- 4. Empty State Template -->\n<ng-template #emptyState>\n  <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-py-16 tw-px-4\">\n    <svg class=\"tw-mx-auto tw-h-12 tw-w-12 tw-text-gray-300\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n      <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n        d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\">\n      </path>\n    </svg>\n    <h3 class=\"tw-mt-2 tw-text-sm tw-font-medium tw-text-gray-900\">No data found</h3>\n    <p class=\"tw-mt-1 tw-text-sm tw-text-gray-500\">\n      {{ searchQuery() ? 'No results match your search criteria.' : 'There are no items to display.' }}\n    </p>\n  </div>\n</ng-template>\n\n<!-- 5. Loading Spinner Template -->\n<ng-template #loadingSpinner>\n  <div class=\"tw-flex tw-justify-center tw-py-4\">\n    <div class=\"tw-animate-spin tw-rounded-full tw-h-6 tw-w-6 tw-border-2 tw-border-blue-500 tw-border-t-transparent\">\n    </div>\n  </div>\n</ng-template>","import { Component, Input, Output, EventEmitter, signal, viewChild, TemplateRef, ElementRef, HostListener, DestroyRef, inject, OnInit, OnDestroy, ViewContainerRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { DropdownManagerService, DropdownInstance } from '../../services/dropdown-manager.service';\r\nimport { PortalService } from '../../services/portal.service';\r\n\r\nexport interface DropdownItem {\r\n    id: string;\r\n    label: string;\r\n    icon?: string;\r\n    iconColor?: string;\r\n    textColor?: string;\r\n    hoverBgColor?: string;\r\n    disabled?: boolean;\r\n    divider?: boolean;\r\n}\r\n\r\nexport interface DropdownConfig {\r\n    triggerIcon?: string;\r\n    triggerSize?: 'xs' | 'sm' | 'md' | 'lg';\r\n    triggerColor?: string;\r\n    triggerHoverColor?: string;\r\n    triggerHoverBgColor?: string;\r\n    menuWidth?: string;\r\n    menuPosition?: 'left' | 'right' | 'auto';\r\n    showArrow?: boolean;\r\n    forcePosition?: 'top' | 'bottom' | 'left' | 'right';\r\n    offsetX?: number;\r\n    offsetY?: number;\r\n    minWidth?: number;\r\n    usePortal?: boolean; // New property to enable portal mode\r\n}\r\n\r\nexport interface DropdownPosition {\r\n    vertical: 'top' | 'bottom';\r\n    horizontal: 'left' | 'right';\r\n    spaceAvailable: {\r\n        top: number;\r\n        bottom: number;\r\n        left: number;\r\n        right: number;\r\n    };\r\n}\r\n\r\n@Component({\r\n    selector: 'cide-ele-dropdown',\r\n    standalone: true,\r\n    imports: [CommonModule, CideIconComponent],\r\n    template: `\r\n    <div class=\"tw-relative\" #dropdownContainer>\r\n      <!-- Trigger Button -->\r\n      <button \r\n        type=\"button\" \r\n        class=\"dropdown-trigger tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-text-gray-400 hover:tw-text-gray-600 hover:tw-bg-gray-100 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-offset-2 focus:tw-ring-blue-500 tw-transition-all tw-duration-150\"\r\n        [class]=\"getTriggerClasses()\"\r\n        (click)=\"toggleDropdown($event)\"\r\n        [title]=\"config.triggerIcon === 'more_vert' ? 'More actions' : 'Options'\">\r\n        \r\n                 <!-- Custom Trigger Template -->\r\n         @if (triggerTemplate) {\r\n           <ng-container *ngTemplateOutlet=\"triggerTemplate; context: { $implicit: isOpen() }\">\r\n           </ng-container>\r\n         } @else {\r\n           <!-- Default Trigger -->\r\n           <cide-ele-icon \r\n             [class]=\"getTriggerIconClasses()\"\r\n             [size]=\"config.triggerSize || 'sm'\">\r\n             {{ config.triggerIcon || 'more_vert' }}\r\n           </cide-ele-icon>\r\n         }\r\n      </button>\r\n      \r\n      <!-- Dropdown Menu (Non-Portal) -->\r\n      @if (isOpen() && !getSafeConfig().usePortal) {\r\n        <div \r\n          #dropdownMenu\r\n          class=\"dropdown-menu tw-absolute tw-z-50 tw-bg-white tw-shadow-lg tw-border tw-border-gray-200 tw-rounded-md tw-text-black\"\r\n          [class]=\"getMenuClasses()\"\r\n          [style]=\"getMenuStyles()\"\r\n          role=\"menu\">\r\n          <ng-container *ngTemplateOutlet=\"dropdownMenuTemplate; context: { $implicit: items }\">\r\n          </ng-container>\r\n        </div>\r\n      }\r\n    </div>\r\n   \r\n    <!-- Dropdown Menu Template (for both portal and non-portal) -->\r\n    <ng-template #dropdownMenuTemplate let-context=\"context\">\r\n      <!-- Custom Menu Template -->\r\n      @if (menuTemplate) {\r\n        <ng-container *ngTemplateOutlet=\"menuTemplate; context: { $implicit: context?.items }\">\r\n        </ng-container>\r\n      } @else {\r\n        <!-- Default Menu -->\r\n        <div class=\"tw-py-1\" role=\"none\">\r\n          @for (item of context?.items; track item.id) {\r\n            @if (item.divider) {\r\n              <!-- Divider Item -->\r\n              <hr class=\"tw-border-t tw-border-gray-200 tw-my-1\" role=\"separator\">\r\n            } @else {\r\n              <!-- Regular Menu Item -->\r\n              <button \r\n                type=\"button\"\r\n                [class]=\"getItemClasses(item)\"\r\n                [disabled]=\"item.disabled\"\r\n                (click)=\"onItemClick(item, $event)\"\r\n                [attr.data-item-id]=\"item.id\">\r\n                \r\n                <!-- Item Icon -->\r\n                @if (item.icon) {\r\n                  <cide-ele-icon \r\n                    class=\"tw-w-4 tw-h-4 tw-mr-2\"\r\n                    [class]=\"item.iconColor || 'tw-text-gray-400'\"\r\n                    size=\"xs\">\r\n                    {{ item.icon }}\r\n                  </cide-ele-icon>\r\n                }\r\n                \r\n                <!-- Item Label -->\r\n                <span [class]=\"item.textColor || 'tw-text-gray-700'\">\r\n                  {{ item.label }}\r\n                </span>\r\n              </button>\r\n            }\r\n          }\r\n        </div>\r\n      }\r\n    </ng-template>\r\n   `,\r\n    styles: [`\r\n    .dropdown-menu {\r\n      transform-origin: top right;\r\n    }\r\n  `]\r\n})\r\nexport class CideEleDropdownComponent implements OnInit, OnDestroy {\r\n    private destroyRef = inject(DestroyRef);\r\n    private dropdownManager = inject(DropdownManagerService);\r\n    private portalService = inject(PortalService);\r\n    private viewContainerRef = inject(ViewContainerRef);\r\n    private dropdownId = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\r\n    private portalId = `dropdown-portal-${this.dropdownId}`;\r\n\r\n    // ViewChild for container reference\r\n    dropdownContainer = viewChild.required<ElementRef>('dropdownContainer');\r\n    dropdownMenu = viewChild<ElementRef>('dropdownMenu');\r\n    dropdownMenuTemplate = viewChild<TemplateRef<any>>('dropdownMenuTemplate');\r\n\r\n    // Inputs\r\n    @Input() set items(value: DropdownItem[]) {\r\n        this._items = value;\r\n    }\r\n    get items(): DropdownItem[] {\r\n        return this._items;\r\n    }\r\n    private _items: DropdownItem[] = [];\r\n\r\n    @Input() config: DropdownConfig = {};\r\n    @Input() triggerTemplate?: TemplateRef<{ $implicit: boolean }>;\r\n    @Input() menuTemplate?: TemplateRef<{ $implicit: DropdownItem[] }>;\r\n\r\n    // Outputs\r\n    @Output() itemClick = new EventEmitter<DropdownItem>();\r\n    @Output() dropdownToggle = new EventEmitter<boolean>();\r\n\r\n    // Signals\r\n    isOpen = signal(false);\r\n    currentPosition = signal<DropdownPosition>({\r\n        vertical: 'bottom',\r\n        horizontal: 'right',\r\n        spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\r\n    });\r\n\r\n    ngOnInit(): void {\r\n        // Setup cleanup on destroy\r\n        this.destroyRef.onDestroy(() => {\r\n            this.dropdownManager.unregisterDropdown(this.dropdownId);\r\n        });\r\n    }\r\n\r\n    // Methods\r\n    getTriggerClasses(): string {\r\n        const baseClasses = 'tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-transition-all tw-duration-150 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-offset-2 focus:tw-ring-blue-500';\r\n\r\n        const colorClasses = this.config?.triggerColor || 'tw-text-gray-400';\r\n        const hoverColorClasses = this.config?.triggerHoverColor || 'hover:tw-text-gray-600';\r\n        const hoverBgClasses = this.config?.triggerHoverBgColor || 'hover:tw-bg-gray-100';\r\n\r\n        return `${baseClasses} ${colorClasses} ${hoverColorClasses} ${hoverBgClasses}`;\r\n    }\r\n\r\n    getTriggerIconClasses(): string {\r\n        return this.config?.triggerColor || 'tw-text-gray-400';\r\n    }\r\n\r\n    getMenuClasses(): string {\r\n        const baseClasses = 'tw-absolute tw-z-50 tw-rounded-md tw-bg-white tw-shadow-lg tw-ring-1 tw-ring-black tw-ring-opacity-5 focus:tw-outline-none tw-transition-all tw-duration-150';\r\n        const widthClass = this.config?.menuWidth || 'tw-w-44';\r\n\r\n        return `${baseClasses} ${widthClass}`;\r\n    }\r\n\r\n    getMenuStyles(): string {\r\n        const position = this.currentPosition();\r\n        const offsetX = this.config?.offsetX || 0;\r\n        const offsetY = this.config?.offsetY || 4;\r\n\r\n        let styles = 'position: absolute; z-index: 9999;';\r\n\r\n        // Vertical positioning\r\n        if (position.vertical === 'bottom') {\r\n            styles += `top: calc(100% + ${offsetY}px);`;\r\n        } else {\r\n            styles += `bottom: calc(100% + ${offsetY}px);`;\r\n        }\r\n\r\n        // Horizontal positioning\r\n        if (position.horizontal === 'right') {\r\n            styles += `right: ${offsetX}px;`;\r\n        } else {\r\n            styles += `left: ${offsetX}px;`;\r\n        }\r\n\r\n        // Safety for inline dropdowns: if it's too wide for the screen, clamp it\r\n        styles += 'max-width: calc(100vw - 32px);';\r\n\r\n        return styles;\r\n    }\r\n\r\n    calculatePosition(): DropdownPosition {\r\n        const container = this.dropdownContainer();\r\n        if (!container) {\r\n            return {\r\n                vertical: 'bottom',\r\n                horizontal: 'right',\r\n                spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\r\n            };\r\n        }\r\n\r\n        const rect = container.nativeElement.getBoundingClientRect();\r\n        const viewport = {\r\n            width: window.innerWidth,\r\n            height: window.innerHeight\r\n        };\r\n\r\n        // Calculate available space in each direction\r\n        const spaceAvailable = {\r\n            top: rect.top,\r\n            bottom: viewport.height - rect.bottom,\r\n            left: rect.left,\r\n            right: viewport.width - rect.right\r\n        };\r\n\r\n        // Estimated dropdown menu dimensions (adjust based on your needs)\r\n        const menuWidth = this.getMenuWidth();\r\n        const menuHeight = this.getEstimatedMenuHeight();\r\n\r\n        // Determine vertical position\r\n        let vertical: 'top' | 'bottom' = 'bottom';\r\n        if (this.config?.forcePosition === 'top' || this.config?.forcePosition === 'bottom') {\r\n            vertical = this.config.forcePosition;\r\n        } else {\r\n            // Check if there's enough space below\r\n            if (spaceAvailable.bottom < menuHeight && spaceAvailable.top > menuHeight) {\r\n                vertical = 'top';\r\n            }\r\n        }\r\n\r\n        // Determine horizontal position  \r\n        let horizontal: 'left' | 'right' = 'right';\r\n        if (this.config?.forcePosition === 'left' || this.config?.forcePosition === 'right') {\r\n            horizontal = this.config.forcePosition;\r\n        } else if (this.config?.menuPosition === 'left') {\r\n            horizontal = 'left';\r\n        } else {\r\n            // Auto-detect best horizontal position (default is 'right' aligned)\r\n            // Check if aligning to right (left edge of menu vs viewport)\r\n            if (spaceAvailable.right < menuWidth && spaceAvailable.left > menuWidth) {\r\n                horizontal = 'left';\r\n            }\r\n        }\r\n\r\n        return {\r\n            vertical,\r\n            horizontal,\r\n            spaceAvailable\r\n        };\r\n    }\r\n\r\n    private getMenuWidth(): number {\r\n        // Parse width from config or use default\r\n        const configWidth = this.config?.menuWidth || 'tw-w-44';\r\n        if (configWidth.includes('tw-w-')) {\r\n            const widthMap: { [key: string]: number } = {\r\n                'tw-w-32': 128, 'tw-w-36': 144, 'tw-w-40': 160,\r\n                'tw-w-44': 176, 'tw-w-48': 192, 'tw-w-52': 208,\r\n                'tw-w-56': 224, 'tw-w-60': 240, 'tw-w-64': 256\r\n            };\r\n            return widthMap[configWidth] || 176;\r\n        }\r\n        return 176; // Default width\r\n    }\r\n\r\n    protected getSafeConfig(): DropdownConfig {\r\n        return {\r\n            triggerIcon: 'more_vert',\r\n            triggerSize: 'sm',\r\n            menuWidth: 'tw-w-44',\r\n            menuPosition: 'auto',\r\n            showArrow: false,\r\n            offsetX: 0,\r\n            offsetY: 4,\r\n            usePortal: true, // Default to portal mode\r\n            ...this.config // Override with provided config\r\n        };\r\n    }\r\n\r\n    private getEstimatedMenuHeight(): number {\r\n        // Estimate height based on number of items\r\n        const itemHeight = 40; // Approximate height per item\r\n        const padding = 8; // Top and bottom padding\r\n        return (this.items.length * itemHeight) + padding;\r\n    }\r\n\r\n    toggleDropdown(event: Event): void {\r\n        console.log('🔵 toggleDropdown called, current state:', this.isOpen());\r\n        console.log('🔵 Items:', this.items);\r\n        console.log('🔵 Config:', this.getSafeConfig());\r\n        event.stopPropagation();\r\n\r\n        if (!this.isOpen()) {\r\n            this.openDropdown();\r\n        } else {\r\n            setTimeout(() => {\r\n                this.closeDropdown();\r\n            }, 100);\r\n        }\r\n    }\r\n\r\n    private openDropdown(): void {\r\n        console.log('🔵 openDropdown called');\r\n        console.log('🔵 Items:', this.items);\r\n        console.log('🔵 Config:', this.getSafeConfig());\r\n        console.log('🔵 Template available:', !!this.dropdownMenuTemplate());\r\n\r\n        // Calculate position before opening\r\n        const newPosition = this.calculatePosition();\r\n        this.currentPosition.set(newPosition);\r\n\r\n        this.isOpen.set(true);\r\n\r\n        // Create portal if usePortal is enabled\r\n        if (this.getSafeConfig().usePortal && this.dropdownMenuTemplate()) {\r\n            console.log('🔵 Creating portal dropdown...');\r\n            this.createPortalDropdown();\r\n        } else {\r\n            console.log('🔵 Not creating portal - usePortal:', this.getSafeConfig().usePortal, 'template:', !!this.dropdownMenuTemplate());\r\n        }\r\n\r\n        // Register with dropdown manager\r\n        const dropdownInstance: DropdownInstance = {\r\n            id: this.dropdownId,\r\n            close: () => this.closeDropdown(),\r\n            element: this.dropdownContainer().nativeElement\r\n        };\r\n\r\n        this.dropdownManager.registerDropdown(dropdownInstance);\r\n\r\n        console.log('🔵 Dropdown opened:', this.dropdownId);\r\n        console.log('🔵 Position:', this.currentPosition());\r\n        this.dropdownToggle.emit(true);\r\n    }\r\n\r\n    testMouseDown(item: DropdownItem): void {\r\n        console.log('🔵 Mouse down detected: ' + item.label);\r\n        // Don't close dropdown on mousedown\r\n    }\r\n\r\n    onItemClick(item: DropdownItem, event: Event): void {\r\n        console.log('🔵 Dropdown onItemClick called with:', item);\r\n\r\n        // Simple event handling\r\n        event.stopPropagation();\r\n\r\n        if (item.disabled || item.divider) {\r\n            console.log('🔵 Item is disabled or divider, returning');\r\n            return;\r\n        }\r\n\r\n        console.log('🔵 Emitting itemClick event');\r\n        this.itemClick.emit(item);\r\n\r\n        // Close dropdown after a small delay to ensure click is processed\r\n        setTimeout(() => {\r\n            this.closeDropdown();\r\n        }, 50);\r\n    }\r\n\r\n    private createPortalDropdown(): void {\r\n        const triggerElement = this.dropdownContainer().nativeElement;\r\n        const template = this.dropdownMenuTemplate();\r\n\r\n        if (!template) {\r\n            console.warn('🔵 Dropdown menu template not found for portal creation');\r\n            return;\r\n        }\r\n\r\n        console.log('🔵 Creating portal dropdown with items:', this.items);\r\n        console.log('🔵 Trigger element:', triggerElement);\r\n        console.log('🔵 Template:', template);\r\n        console.log('🔵 Config:', this.config);\r\n\r\n        try {\r\n            const safeConfig = this.getSafeConfig();\r\n            const portalElement = this.portalService.createTemplatePortal(this.portalId, {\r\n                triggerElement,\r\n                template,\r\n                viewContainerRef: this.viewContainerRef,\r\n                context: { items: this.items },\r\n                className: `dropdown-menu tw-bg-white tw-shadow-lg tw-border tw-border-gray-200 tw-rounded-md tw-text-black ${this.getMenuClasses()}`,\r\n                position: this.currentPosition().vertical === 'top' ? 'top' : 'bottom',\r\n                align: this.currentPosition().horizontal === 'left' ? 'left' : 'right',\r\n                offsetX: safeConfig.offsetX || 0,\r\n                offsetY: safeConfig.offsetY || 4,\r\n                minWidth: safeConfig.minWidth || this.getMenuWidth(),\r\n                maxHeight: 300,\r\n                closeOnClickOutside: true,\r\n                closeOnEscape: true\r\n            });\r\n\r\n            console.log('🔵 Portal dropdown created:', this.portalId);\r\n            console.log('🔵 Portal element:', portalElement);\r\n            console.log('🔵 Portal element styles:', {\r\n                position: portalElement.style.position,\r\n                top: portalElement.style.top,\r\n                left: portalElement.style.left,\r\n                zIndex: portalElement.style.zIndex,\r\n                display: portalElement.style.display,\r\n                visibility: portalElement.style.visibility\r\n            });\r\n        } catch (error) {\r\n            console.error('🔵 Failed to create portal dropdown:', error);\r\n        }\r\n    }\r\n\r\n    private destroyPortalDropdown(): void {\r\n        try {\r\n            this.portalService.destroyPortal(this.portalId);\r\n            console.log('🔵 Portal dropdown destroyed:', this.portalId);\r\n        } catch (error) {\r\n            console.error('🔵 Failed to destroy portal dropdown:', error);\r\n        }\r\n    }\r\n\r\n    closeDropdown(): void {\r\n        console.log('🔵 closeDropdown called, setting isOpen to false');\r\n        setTimeout(() => {\r\n            this.isOpen.set(false);\r\n\r\n            // Destroy portal if it exists\r\n            if (this.getSafeConfig().usePortal) {\r\n                this.destroyPortalDropdown();\r\n            }\r\n\r\n            this.dropdownManager.unregisterDropdown(this.dropdownId);\r\n            this.dropdownToggle.emit(false);\r\n        }, 100);\r\n    }\r\n\r\n    getItemClasses(item: DropdownItem): string {\r\n        const baseClasses = 'tw-flex tw-items-center tw-w-full tw-px-3 tw-py-2 tw-text-sm tw-transition-colors tw-duration-150';\r\n\r\n        if (item.disabled) {\r\n            return `${baseClasses} tw-text-gray-400 tw-cursor-not-allowed`;\r\n        }\r\n\r\n        const textColor = item.textColor || 'tw-text-gray-700';\r\n        const hoverBg = item.hoverBgColor || 'hover:tw-bg-gray-100';\r\n        const hoverText = item.textColor || 'hover:tw-text-gray-900';\r\n\r\n        return `${baseClasses} ${textColor} ${hoverBg} ${hoverText}`;\r\n    }\r\n\r\n    // Host listeners for window events (position recalculation only)\r\n    // Note: Click outside and escape key handling is now managed by DropdownManagerService\r\n\r\n    @HostListener('window:resize')\r\n    onWindowResize(): void {\r\n        if (this.isOpen()) {\r\n            // Recalculate position on window resize\r\n            const newPosition = this.calculatePosition();\r\n            this.currentPosition.set(newPosition);\r\n        }\r\n    }\r\n\r\n    @HostListener('window:scroll')\r\n    onWindowScroll(): void {\r\n        if (this.isOpen()) {\r\n            // Recalculate position on scroll\r\n            const newPosition = this.calculatePosition();\r\n            this.currentPosition.set(newPosition);\r\n        }\r\n    }\r\n\r\n    ngOnDestroy(): void {\r\n        // Cleanup portal if it exists\r\n        if (this.getSafeConfig().usePortal) {\r\n            this.destroyPortalDropdown();\r\n        }\r\n\r\n        // Close dropdown and unregister\r\n        if (this.isOpen()) {\r\n            this.closeDropdown();\r\n        }\r\n\r\n        // Ensure dropdown is unregistered\r\n        this.dropdownManager.unregisterDropdown(this.dropdownId);\r\n    }\r\n} ","import { Component, Input, Output, EventEmitter, signal, computed, ElementRef, ViewChild, AfterViewInit, OnDestroy, effect, Signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { CideSpinnerComponent } from '../../elements/spinner/spinner.component';\n\nexport interface FloatingContainerConfig {\n  id: string;\n  title: string;\n  icon?: string;\n  backdrop?: boolean; // if true, show a modal backdrop to block background\n  headerColor?: string;\n  width?: string;\n  height?: string;\n  minWidth?: string;\n  minHeight?: string;\n  maxWidth?: string;\n  maxHeight?: string;\n  resizable?: boolean;\n  draggable?: boolean;\n  closable?: boolean;\n  minimizable?: boolean;\n  maximizable?: boolean;\n  isMinimized?: boolean;\n  isMaximized?: boolean;\n  // Dynamic component support\n  componentId?: string;\n  componentConfig?: {\n    inputs?: { [key: string]: Signal<any> };\n    outputs?: { [key: string]: (event: Signal<any>) => void };\n  };\n}\n\n@Component({\n  selector: 'cide-ele-floating-container',\n  standalone: true,\n  imports: [CommonModule, CideEleButtonComponent, CideIconComponent, CideSpinnerComponent],\n  template: `\n    <div \n      #container\n      class=\"tw-fixed tw-bg-white dark:tw-bg-gray-900 tw-bg-opacity-90 dark:tw-bg-opacity-90 tw-backdrop-blur-sm tw-border tw-border-gray-200 dark:tw-border-gray-700 tw-border-opacity-50 dark:tw-border-opacity-50 tw-rounded-xl tw-shadow-lg tw-transition-all tw-duration-200 tw-flex tw-flex-col\"\n      [style.left.px]=\"isMaximized() ? 20 : position().x\"\n      [style.top.px]=\"isMaximized() ? 20 : position().y\"\n      [style.width]=\"isMaximized() ? 'calc(100vw - 40px)' : (config().width || '400px')\"\n      [style.height]=\"isMaximized() ? 'calc(100vh - 40px)' : (isMinimized() ? 'auto' : (savedHeight || config().height || '500px'))\"\n      [style.min-width]=\"config().minWidth || '300px'\"\n      [style.min-height]=\"isMinimized() ? 'auto' : (config().minHeight || '200px')\"\n      [style.max-width]=\"config().maxWidth || '90vw'\"\n      [style.max-height]=\"config().maxHeight || '90vh'\"\n      [style.z-index]=\"zIndex()\"\n      [style.pointer-events]=\"'auto'\"\n      [class.tw-cursor-move]=\"isDragging()\"\n      [class.tw-select-none]=\"isDragging()\">\n      \n      <!-- Header -->\n      <div \n        class=\"tw-flex tw-items-center tw-justify-between tw-px-3 tw-py-2 tw-border-b tw-border-gray-200 dark:tw-border-gray-700 tw-border-opacity-30 dark:tw-border-opacity-30 tw-rounded-t-xl tw-cursor-move tw-transition-all tw-duration-200 tw-shadow-sm tw-flex-shrink-0 tw-select-none\"\n        [style.background]=\"getHeaderBackground()\"\n        [style.user-select]=\"'none'\"\n        (mousedown)=\"startDrag($event)\"\n        (click)=\"onHeaderClick($event)\">\n        \n        <!-- Title Section -->\n        <div class=\"tw-flex tw-items-center tw-space-x-2 tw-text-white\">\n          @if (config().icon) {\n            <cide-ele-icon class=\"tw-w-4 tw-h-4\">{{ config().icon }}</cide-ele-icon>\n          }\n          <h2 class=\"tw-text-sm tw-font-medium tw-truncate\">{{ config().title }}</h2>\n          @if (isMinimized()) {\n            <span class=\"tw-text-xs tw-opacity-75\">(Click to restore)</span>\n          }\n        </div>\n        \n        <!-- Action Buttons -->\n        <div class=\"tw-flex tw-items-center tw-space-x-1\">\n          @if (config().minimizable !== false) {\n            <button \n              cideEleButton \n              variant=\"ghost\" \n              size=\"xs\" \n              type=\"button\" \n              (click)=\"minimize(); $event.stopPropagation()\" \n              class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\n              [title]=\"isMinimized() ? 'Restore' : 'Minimize'\">\n              <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">{{ isMinimized() ? 'open_in_full' : 'remove' }}</cide-ele-icon>\n            </button>\n          }\n          @if (config().maximizable !== false) {\n            <button \n              cideEleButton \n              variant=\"ghost\" \n              size=\"xs\" \n              type=\"button\" \n              (click)=\"toggleMaximize(); $event.stopPropagation()\" \n              class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\n              [title]=\"isMaximized() ? 'Restore' : 'Maximize'\">\n              <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">{{ isMaximized() ? 'fullscreen_exit' : 'fullscreen' }}</cide-ele-icon>\n            </button>\n          }\n          @if (config().closable !== false) {\n            <button \n              cideEleButton \n              variant=\"ghost\" \n              size=\"xs\" \n              type=\"button\" \n              (click)=\"close(); $event.stopPropagation()\" \n              class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\n              title=\"Close\">\n              <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">close</cide-ele-icon>\n            </button>\n          }\n        </div>\n      </div>\n      \n      <!-- Content with @defer for performance -->\n      @if (!isMinimized()) {\n      <div \n        class=\"tw-flex-1 tw-overflow-auto tw-overflow-x-hidden floating-container-content tw-bg-white dark:tw-bg-gray-900 tw-bg-opacity-90 dark:tw-bg-opacity-90\"\n        [style.height]=\"isMaximized() ? 'calc(100vh - 100px)' : 'auto'\"\n        [style.min-height]=\"'200px'\"\n        [style.pointer-events]=\"'auto'\"\n        [style.user-select]=\"'auto'\"\n        (mousedown)=\"$event.stopPropagation()\"\n        (click)=\"$event.stopPropagation()\">\n        @defer (when !isMinimized() && isVisible()) {\n          <div class=\"tw-p-0 tw-min-h-full\">\n            <ng-content></ng-content>\n          </div>\n        } @placeholder {\n          <div class=\"tw-flex tw-items-center tw-justify-center tw-p-4 tw-min-h-[200px]\">\n            <cide-ele-spinner size=\"sm\"></cide-ele-spinner>\n            <span class=\"tw-ml-2 tw-text-sm tw-text-gray-600\">Loading content...</span>\n          </div>\n        }\n      </div>\n      }\n      \n      <!-- Resize Handle (if resizable) -->\n      @if (config().resizable !== false) {\n        <div \n          class=\"tw-absolute tw-bottom-0 tw-right-0 tw-w-[1.38rem] tw-h-3 tw-cursor-se-resize tw-bg-gray-300 dark:tw-bg-gray-600 tw-opacity-50 dark:tw-opacity-50 hover:tw-opacity-100 dark:hover:tw-opacity-100\"\n          (mousedown)=\"startResize($event)\">\n        </div>\n      }\n    </div>\n  `,\n  styles: [`\n    .tw-cursor-move {\n      cursor: move !important;\n    }\n    .tw-cursor-se-resize {\n      cursor: se-resize !important;\n    }\n    .floating-container-content {\n      overflow-y: auto;\n      overflow-x: hidden;\n      scrollbar-width: thin;\n      scrollbar-color: var(--cide-ele-scrollbar-thumb, #d1d5db) var(--cide-ele-scrollbar-track, #f9fafb);\n      position: relative;\n      flex: 1;\n      display: flex;\n      flex-direction: column;\n    }\n    .floating-container-content::-webkit-scrollbar {\n      width: 8px;\n    }\n    .floating-container-content::-webkit-scrollbar-track {\n      background: var(--cide-ele-scrollbar-track, #f9fafb);\n      border-radius: 4px;\n      margin: 4px;\n    }\n    .floating-container-content::-webkit-scrollbar-thumb {\n      background: var(--cide-ele-scrollbar-thumb, #d1d5db);\n      border-radius: 4px;\n      transition: background-color 0.2s ease;\n      border: 1px solid var(--cide-ele-border-primary, #e5e7eb);\n    }\n    .floating-container-content::-webkit-scrollbar-thumb:hover {\n      background: var(--cide-ele-scrollbar-thumb-hover, #9ca3af);\n      border-color: var(--cide-ele-border-secondary, #d1d5db);\n    }\n    .floating-container-content::-webkit-scrollbar-thumb:active {\n      background: var(--cide-ele-scrollbar-thumb-hover, #9ca3af);\n    }\n  `]\n})\nexport class CideEleFloatingContainerComponent implements AfterViewInit, OnDestroy {\n  @Input() config = signal<FloatingContainerConfig>({\n    id: '',\n    title: 'Floating Container',\n    icon: 'widgets',\n    headerColor: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n    width: '400px',\n    height: 'auto',\n    minWidth: '300px',\n    minHeight: '200px',\n    maxWidth: '90vw',\n    maxHeight: '90vh',\n    resizable: true,\n    draggable: true,\n    closable: true,\n    minimizable: true,\n    maximizable: true\n  });\n  @Input() isMinimized!: Signal<boolean>;\n  @Input() isMaximized!: Signal<boolean>;\n  @Input() isVisible!: Signal<boolean>;\n  @Input() zIndex!: Signal<number>;\n\n  @Output() closeEvent = new EventEmitter<string>();\n  @Output() minimizeEvent = new EventEmitter<string>();\n  @Output() maximizeEvent = new EventEmitter<string>();\n  @Output() clickEvent = new EventEmitter<string>();\n\n  @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n\n  // State signals\n  position = signal({ x: 100, y: 100 });\n  isDragging = signal(false);\n  isResizing = signal(false);\n\n  // Computed properties\n  computedConfig = computed(() => this.config());\n\n  private dragStart = { x: 0, y: 0 };\n  private resizeStart = { x: 0, y: 0, width: 0, height: 0 };\n  private originalPosition = { x: 0, y: 0 };\n  private originalSize = { width: 0, height: 0 };\n  private savedPosition = { x: 100, y: 100 }; // Store position before maximizing\n  savedHeight = ''; // Store height before maximizing\n\n  ngAfterViewInit() {\n    // Only center the container if it's at the default position (100, 100)\n    // This prevents position jumping when containers are focused\n    const currentPos = this.position();\n    if (currentPos.x === 100 && currentPos.y === 100) {\n      this.centerContainer();\n    }\n  }\n\n  constructor() {\n    // Watch for maximize state changes\n    effect(() => {\n      const isMaximized = this.isMaximized();\n      if (isMaximized && !this.savedHeight) {\n        // Save current height when maximizing\n        this.savedHeight = this.containerRef?.nativeElement?.style.height || this.config().height || '500px';\n      } else if (!isMaximized && this.savedHeight) {\n        // Restore height when unmaximizing\n        this.savedHeight = '';\n      }\n    });\n  }\n\n  ngOnDestroy() {\n    // Clean up any event listeners if needed\n  }\n\n  centerContainer() {\n    if (this.containerRef?.nativeElement) {\n      if (this.isMaximized()) {\n        // For maximized state, position with equal margins (20px from all sides)\n        this.position.set({ x: 20, y: 20 });\n      } else {\n        // For normal state, center based on container size\n        const rect = this.containerRef.nativeElement.getBoundingClientRect();\n        const centerX = (window.innerWidth - rect.width) / 2;\n        const centerY = (window.innerHeight - rect.height) / 2;\n        this.position.set({ x: Math.max(0, centerX), y: Math.max(0, centerY) });\n      }\n    }\n  }\n\n  startDrag(event: MouseEvent) {\n    if (!this.computedConfig().draggable) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.isDragging.set(true);\n    this.dragStart = { x: event.clientX, y: event.clientY };\n    this.originalPosition = { ...this.position() };\n\n    document.addEventListener('mousemove', this.onDragMove.bind(this));\n    document.addEventListener('mouseup', this.onDragEnd.bind(this));\n  }\n\n  onDragMove(event: MouseEvent) {\n    if (!this.isDragging()) return;\n\n    const deltaX = event.clientX - this.dragStart.x;\n    const deltaY = event.clientY - this.dragStart.y;\n\n    const newX = Math.max(0, Math.min(window.innerWidth - 300, this.originalPosition.x + deltaX));\n    const newY = Math.max(0, Math.min(window.innerHeight - 100, this.originalPosition.y + deltaY));\n\n    this.position.set({ x: newX, y: newY });\n  }\n\n  onDragEnd() {\n    this.isDragging.set(false);\n    document.removeEventListener('mousemove', this.onDragMove.bind(this));\n    document.removeEventListener('mouseup', this.onDragEnd.bind(this));\n  }\n\n  startResize(event: MouseEvent) {\n    if (!this.computedConfig().resizable) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.isResizing.set(true);\n    this.resizeStart = {\n      x: event.clientX,\n      y: event.clientY,\n      width: this.containerRef.nativeElement.offsetWidth,\n      height: this.containerRef.nativeElement.offsetHeight\n    };\n    this.originalSize = { ...this.resizeStart };\n\n    document.addEventListener('mousemove', this.onResizeMove.bind(this));\n    document.addEventListener('mouseup', this.onResizeEnd.bind(this));\n  }\n\n  onResizeMove(event: MouseEvent) {\n    if (!this.isResizing()) return;\n\n    const deltaX = event.clientX - this.resizeStart.x;\n    const deltaY = event.clientY - this.resizeStart.y;\n\n    const newWidth = Math.max(300, this.originalSize.width + deltaX);\n    const newHeight = Math.max(200, this.originalSize.height + deltaY);\n\n    this.containerRef.nativeElement.style.width = `${newWidth}px`;\n    this.containerRef.nativeElement.style.height = `${newHeight}px`;\n  }\n\n  onResizeEnd() {\n    this.isResizing.set(false);\n    document.removeEventListener('mousemove', this.onResizeMove.bind(this));\n    document.removeEventListener('mouseup', this.onResizeEnd.bind(this));\n  }\n\n  // Mouse event handlers for container - removed to allow clicks in content area\n  // Only the header handles drag events now\n\n  // Action methods\n  onHeaderClick(event: MouseEvent) {\n    // Emit click event to bring container to front\n    this.clickEvent.emit(this.computedConfig().id);\n\n    // Only minimize if clicking on the header itself, not on buttons\n    if (this.isMinimized() && !(event.target as HTMLElement).closest('button')) {\n      this.minimize();\n    }\n  }\n\n  minimize() {\n    this.minimizeEvent.emit(this.computedConfig().id);\n  }\n\n  bringToFront() {\n    // This will be handled by the container service through the manager component\n    // The manager component will call the service's bringToFront method\n    console.log(`🎯 [FloatingContainer] Container '${this.computedConfig().id}' clicked - bringing to front`);\n\n    // Preserve current position to prevent jumping\n    const currentPos = this.position();\n    console.log(`🎯 [FloatingContainer] Preserving position: x=${currentPos.x}, y=${currentPos.y}`);\n  }\n\n  toggleMaximize() {\n    this.maximizeEvent.emit(this.computedConfig().id);\n  }\n\n  close() {\n    this.closeEvent.emit(this.computedConfig().id);\n  }\n\n  getHeaderBackground(): string {\n    return 'linear-gradient(135deg, var(--cide-theme-primary-color) 0%, var(--tw-blue-400) 100%)';\n  }\n}\n","import { Component, inject, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideEleFloatingContainerComponent } from './floating-container.component';\nimport { CideEleFloatingContainerService } from './floating-container.service';\nimport { CideEleFloatingContainerDynamicDirective } from './floating-container-dynamic.directive';\nimport { CideSpinnerComponent } from '../../elements/spinner/spinner.component';\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\n\n@Component({\n  selector: 'cide-ele-floating-container-manager',\n  standalone: true,\n  imports: [CommonModule, CideEleFloatingContainerComponent, CideEleFloatingContainerDynamicDirective, CideSpinnerComponent, CideEleButtonComponent, CideIconComponent],\n  template: `\n    @for (container of visibleContainers(); track container.id) {\n      @if (container.config.backdrop) {\n        <!-- Modal Backdrop for containers that request it -->\n        <div\n          class=\"tw-fixed tw-inset-0 tw-bg-black tw-bg-opacity-40 tw-backdrop-blur-[2px] tw-transition-opacity\"\n          [style.z-index]=\"(container.zIndex || 2000) - 1\">\n        </div>\n      }\n      <cide-ele-floating-container\n        [config]=\"containerService.getConfigSignal(container.config)\"\n        [isMinimized]=\"containerService.getMinimizedSignal(container.id)\"\n        [isMaximized]=\"containerService.getMaximizedSignal(container.id)\"\n        [isVisible]=\"containerService.getVisibleSignal(container.id)\"\n        [zIndex]=\"containerService.getZIndexSignal(container.id)\"\n        (closeEvent)=\"containerService.onClose($event)\"\n        (minimizeEvent)=\"containerService.onMinimize($event)\"\n        (maximizeEvent)=\"containerService.onMaximize($event)\"\n        (clickEvent)=\"containerService.bringToFront($event)\">\n        \n        <!-- Dynamic content loading with @defer for performance -->\n        @defer (when container.isVisible) {\n          <div \n            cideEleFloatingDynamic\n            [componentId]=\"container.config.componentId || container.config.id\"\n            [componentConfig]=\"containerService.getComponentConfig(container.config)\"\n            [isVisible]=\"container.isVisible\">\n          </div>\n        } @placeholder {\n          <div class=\"tw-flex tw-items-center tw-justify-center tw-p-4\">\n            <cide-ele-spinner size=\"sm\"></cide-ele-spinner>\n            <span class=\"tw-ml-2 tw-text-sm tw-text-gray-600\">Loading component...</span>\n          </div>\n        } @error {\n          <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-4 tw-text-center\">\n            <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500 tw-mb-2\">error</cide-ele-icon>\n            <p class=\"tw-text-red-600 tw-font-medium\">Failed to load component</p>\n            <p class=\"tw-text-gray-500 tw-text-sm\">Component \"{{ container.config.componentId || container.config.id }}\" is not available</p>\n            <button \n              cideEleButton \n              variant=\"outline\" \n              size=\"xs\" \n              (click)=\"containerService.onClose(container.id)\"\n              class=\"tw-mt-2\">\n              Close\n            </button>\n          </div>\n        }\n      </cide-ele-floating-container>\n    }\n  `,\n  styles: []\n})\nexport class CideEleFloatingContainerManagerComponent {\n  containerService = inject(CideEleFloatingContainerService);\n\n  // Computed properties\n  visibleContainers = computed(() => this.containerService.visibleContainers());\n}\n","import { Injectable, inject } from '@angular/core';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\nimport { OPEN_AI_ASSISTANT_ACTION } from '../../services/ai.tokens';\nimport { CideEleFloatingContainerService } from './floating-container.service';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class FloatingContainerShortcutsService {\n  private keyboardShortcutService = inject(KeyboardShortcutService);\n  private containerService = inject(CideEleFloatingContainerService);\n  private openAiAction = inject(OPEN_AI_ASSISTANT_ACTION, { optional: true });\n\n  // Z-index layers for different container states\n  private readonly Z_INDEX_LAYERS = {\n    HIDDEN: 100,        // Hidden containers (behind everything)\n    BACKGROUND: 1000,   // Background containers\n    NORMAL: 2000,       // Normal visible containers\n    FOCUSED: 3000,      // Focused containers\n    MODAL: 4000,        // Modal containers\n    TOOLTIP: 5000       // Tooltips and overlays\n  };\n\n  constructor() {\n    this.registerDefaultShortcuts();\n  }\n\n  /**\n   * Register default floating container shortcuts\n   */\n  private registerDefaultShortcuts(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Registering default shortcuts');\n\n    // Alt + 1, Alt + 2, etc. - Focus specific containers\n    this.registerNumberShortcuts();\n\n    // Alt + N - New container\n    this.keyboardShortcutService.register({\n      id: 'floating-container-new',\n      key: 'n',\n      altKey: true,\n      description: 'Create new floating container',\n      title: 'New Container',\n      category: 'Floating Containers',\n      action: () => this.openNewContainer(),\n      preventDefault: true\n    });\n\n    // Alt + P - Previous container\n    this.keyboardShortcutService.register({\n      id: 'floating-container-previous',\n      key: 'p',\n      altKey: true,\n      description: 'Focus previous container',\n      title: 'Previous Container',\n      category: 'Floating Containers',\n      action: () => this.focusPreviousContainer(),\n      preventDefault: true\n    });\n\n    // Alt + H - Hide all containers\n    this.keyboardShortcutService.register({\n      id: 'floating-container-hide-all',\n      key: 'h',\n      altKey: true,\n      description: 'Hide all containers',\n      title: 'Hide All Containers',\n      category: 'Floating Containers',\n      action: () => this.hideAllContainers(),\n      preventDefault: true\n    });\n\n    // Alt + S - Show all containers\n    this.keyboardShortcutService.register({\n      id: 'floating-container-show-all',\n      key: 's',\n      altKey: true,\n      description: 'Show all containers',\n      title: 'Show All Containers',\n      category: 'Floating Containers',\n      action: () => this.showAllContainers(),\n      preventDefault: true\n    });\n\n    // Alt + M - Minimize all containers\n    this.keyboardShortcutService.register({\n      id: 'floating-container-minimize-all',\n      key: 'm',\n      altKey: true,\n      description: 'Minimize all containers',\n      title: 'Minimize All Containers',\n      category: 'Floating Containers',\n      action: () => this.minimizeAllContainers(),\n      preventDefault: true\n    });\n\n    // Alt + W - Close current container\n    this.keyboardShortcutService.register({\n      id: 'floating-container-close-current',\n      key: 'w',\n      altKey: true,\n      description: 'Close current container',\n      title: 'Close Current Container',\n      category: 'Floating Containers',\n      action: () => this.closeCurrentContainer(),\n      preventDefault: true\n    });\n\n    // Alt + D - Duplicate current container\n    this.keyboardShortcutService.register({\n      id: 'floating-container-duplicate',\n      key: 'd',\n      altKey: true,\n      description: 'Duplicate current container',\n      title: 'Duplicate Container',\n      category: 'Floating Containers',\n      action: () => this.duplicateCurrentContainer(),\n      preventDefault: true\n    });\n\n    // Alt + T - Toggle container visibility\n    this.keyboardShortcutService.register({\n      id: 'floating-container-toggle-visibility',\n      key: 't',\n      altKey: true,\n      description: 'Toggle container visibility',\n      title: 'Toggle Container Visibility',\n      category: 'Floating Containers',\n      action: () => this.toggleContainerVisibility(),\n      preventDefault: true\n    });\n\n    // Alt + O - Open file uploader\n    this.keyboardShortcutService.register({\n      id: 'floating-container-open-file-uploader',\n      key: 'o',\n      altKey: true,\n      description: 'Open file uploader',\n      title: 'Open File Uploader',\n      category: 'Floating Containers',\n      action: () => this.openFileUploader(),\n      preventDefault: true\n    });\n\n    // Alt + R - Open entity rights sharing\n    this.keyboardShortcutService.register({\n      id: 'floating-container-open-entity-rights',\n      key: 'r',\n      altKey: true,\n      description: 'Open entity rights sharing',\n      title: 'Open Entity Rights',\n      category: 'Floating Containers',\n      action: () => this.openEntityRightsSharing(),\n      preventDefault: true\n    });\n\n    // Alt + A - Open AI Assistant (when OPEN_AI_ASSISTANT_ACTION is provided)\n    if (this.openAiAction) {\n      this.keyboardShortcutService.register({\n        id: 'cide-open-ai-assistant',\n        key: 'a',\n        altKey: true,\n        description: 'Open AI Assistant',\n        title: 'Open AI Assistant',\n        category: 'AI',\n        action: () => this.openAiAction!(),\n        preventDefault: true\n      });\n    }\n\n    console.log('✅ [FloatingContainerShortcuts] Default shortcuts registered');\n  }\n\n  /**\n   * Register number shortcuts (Alt + 1, Alt + 2, etc.)\n   */\n  private registerNumberShortcuts(): void {\n    for (let i = 1; i <= 9; i++) {\n      this.keyboardShortcutService.register({\n        id: `floating-container-focus-${i}`,\n        key: i.toString(),\n        altKey: true,\n        description: `Focus container ${i}`,\n        title: `Focus Container ${i}`,\n        category: 'Floating Containers',\n        action: () => this.focusContainerByIndex(i - 1),\n        preventDefault: true\n      });\n    }\n  }\n\n  /**\n   * Open new floating container\n   */\n  private openNewContainer(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Opening new container');\n    const containerId = this.containerService.show({\n      id: 'new-container-' + Date.now(),\n      title: 'New Container',\n      width: '400px',\n      height: '300px'\n    });\n    console.log('✅ [FloatingContainerShortcuts] New container created:', containerId);\n  }\n\n  /**\n   * Focus previous container\n   */\n  private focusPreviousContainer(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Focusing previous container');\n    const containers = this.containerService.visibleContainers();\n    if (containers.length > 0) {\n      // For now, just focus the last container\n      const previousIndex = containers.length - 1;\n      this.containerService.bringToFront(containers[previousIndex].id);\n    }\n  }\n\n  /**\n   * Hide all containers\n   */\n  private hideAllContainers(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Hiding all containers');\n    const containers = this.containerService.visibleContainers();\n    containers.forEach(container => {\n      this.containerService.setZIndex(container.id, this.Z_INDEX_LAYERS.HIDDEN);\n    });\n    console.log('✅ [FloatingContainerShortcuts] All containers hidden');\n  }\n\n  /**\n   * Show all containers\n   */\n  private showAllContainers(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Showing all containers');\n    const containers = this.containerService.visibleContainers();\n    containers.forEach((container, index) => {\n      this.containerService.setZIndex(container.id, this.Z_INDEX_LAYERS.NORMAL + index);\n    });\n    console.log('✅ [FloatingContainerShortcuts] All containers shown');\n  }\n\n  /**\n   * Minimize all containers\n   */\n  private minimizeAllContainers(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Minimizing all containers');\n    const containers = this.containerService.visibleContainers();\n    containers.forEach(container => {\n      // Implement minimize logic here\n      console.log('📦 [FloatingContainerShortcuts] Minimizing container:', container.id);\n    });\n    console.log('✅ [FloatingContainerShortcuts] All containers minimized');\n  }\n\n  /**\n   * Focus container by index\n   */\n  private focusContainerByIndex(index: number): void {\n    console.log('🎯 [FloatingContainerShortcuts] Focusing container at index:', index);\n    const containers = this.containerService.visibleContainers();\n    if (containers[index]) {\n      this.containerService.bringToFront(containers[index].id);\n      console.log('✅ [FloatingContainerShortcuts] Container focused:', containers[index].id);\n    } else {\n      console.warn('⚠️ [FloatingContainerShortcuts] Container not found at index:', index);\n    }\n  }\n\n  /**\n   * Open file uploader\n   */\n  private openFileUploader(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Opening file uploader');\n    // Implement file uploader opening logic here\n    console.log('✅ [FloatingContainerShortcuts] File uploader opened');\n  }\n\n  /**\n   * Open entity rights sharing\n   */\n  private openEntityRightsSharing(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Opening entity rights sharing');\n    // Implement entity rights sharing opening logic here\n    console.log('✅ [FloatingContainerShortcuts] Entity rights sharing opened');\n  }\n\n  /**\n   * Duplicate current container\n   */\n  private duplicateCurrentContainer(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Duplicating current container');\n    const containers = this.containerService.visibleContainers();\n    if (containers.length > 0) {\n      const containerToDuplicate = containers[containers.length - 1]; // Use last container\n      const newContainerId = this.containerService.show({\n        id: 'duplicate-' + Date.now(),\n        title: `${containerToDuplicate.config.title} (Copy)`,\n        width: containerToDuplicate.config.width,\n        height: containerToDuplicate.config.height\n      });\n      console.log('✅ [FloatingContainerShortcuts] Container duplicated:', newContainerId);\n    } else {\n      console.warn('⚠️ [FloatingContainerShortcuts] No container to duplicate');\n    }\n  }\n\n  /**\n   * Close current container\n   */\n  private closeCurrentContainer(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Closing current container');\n    const containers = this.containerService.visibleContainers();\n    if (containers.length > 0) {\n      const containerToClose = containers[containers.length - 1]; // Use last container\n      this.containerService.hide(containerToClose.id);\n      console.log('✅ [FloatingContainerShortcuts] Container closed:', containerToClose.id);\n    } else {\n      console.warn('⚠️ [FloatingContainerShortcuts] No container to close');\n    }\n  }\n\n  /**\n   * Toggle container visibility\n   */\n  private toggleContainerVisibility(): void {\n    console.log('🎯 [FloatingContainerShortcuts] Toggling container visibility');\n    const containers = this.containerService.visibleContainers();\n    if (containers.length > 0) {\n      const containerToToggle = containers[containers.length - 1]; // Use last container\n      const currentZIndex = this.containerService.getZIndexSignal(containerToToggle.id)();\n      if (currentZIndex === this.Z_INDEX_LAYERS.HIDDEN) {\n        this.containerService.setZIndex(containerToToggle.id, this.Z_INDEX_LAYERS.NORMAL);\n        console.log('✅ [FloatingContainerShortcuts] Container shown:', containerToToggle.id);\n      } else {\n        this.containerService.setZIndex(containerToToggle.id, this.Z_INDEX_LAYERS.HIDDEN);\n        console.log('✅ [FloatingContainerShortcuts] Container hidden:', containerToToggle.id);\n      }\n    } else {\n      console.warn('⚠️ [FloatingContainerShortcuts] No container to toggle');\n    }\n  }\n}\n","import { Injectable, inject } from '@angular/core';\r\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from './floating-container.service';\r\nimport { FloatingContainerShortcutsService } from './floating-container-shortcuts.service';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CideEleFloatingFeaturesService {\r\n  private containerService = inject(CideEleFloatingContainerService);\r\n  private shortcutsService = inject(FloatingContainerShortcutsService);\r\n\r\n  constructor() {\r\n    // File uploader is handled by its own dedicated service\r\n    // Entity rights sharing is handled by its own dedicated service\r\n  }\r\n\r\n\r\n\r\n  // Generic method to show any floating feature\r\n  showFeature(featureId: string, config: FloatingContainerConfig): string {\r\n    return this.containerService.show({ ...config, id: featureId });\r\n  }\r\n\r\n  // Generic method for showing any component dynamically\r\n  showComponent(\r\n    containerId: string,\r\n    componentId: string,\r\n    title: string,\r\n    componentType?: any,\r\n    config: Partial<FloatingContainerConfig> = {}\r\n  ): string {\r\n    const containerConfig: FloatingContainerConfig = {\r\n      id: containerId,\r\n      title,\r\n      icon: 'widgets',\r\n      width: '400px',\r\n      height: '500px',\r\n      minWidth: '300px',\r\n      minHeight: '200px',\r\n      resizable: true,\r\n      draggable: true,\r\n      closable: true,\r\n      minimizable: true,\r\n      maximizable: true,\r\n      componentId,\r\n      ...config\r\n    };\r\n\r\n    // Register component if provided\r\n    if (componentType) {\r\n      this.registerComponent(componentId, componentType);\r\n    }\r\n\r\n    return this.containerService.show(containerConfig);\r\n  }\r\n\r\n  /**\r\n   * Generic method for showing any component with input data\r\n   * \r\n   * @example\r\n   * // Pass data to a component\r\n   * this.floatingFeaturesService.showComponentWithData(\r\n   *   'my-component-container',\r\n   *   'my-component',\r\n   *   'My Component Title',\r\n   *   {\r\n   *     data: {\r\n   *       userId: '123',\r\n   *       userName: 'John Doe',\r\n   *       settings: { theme: 'dark' }\r\n   *     },\r\n   *     outputs: {\r\n   *       onSave: (data) => console.log('Save event:', data),\r\n   *       onCancel: () => console.log('Cancel clicked')\r\n   *     }\r\n   *   },\r\n   *   {\r\n   *     width: '600px',\r\n   *     height: '400px',\r\n   *     icon: 'settings'\r\n   *   }\r\n   * );\r\n   */\r\n  showComponentWithData(\r\n    containerId: string,\r\n    componentId: string,\r\n    title: string,\r\n    componentData: {\r\n      data: { [key: string]: any };\r\n      outputs?: { [key: string]: (event: any) => void };\r\n    },\r\n    containerConfig: Partial<FloatingContainerConfig> = {}\r\n  ): string {\r\n    const config: FloatingContainerConfig = {\r\n      id: containerId,\r\n      title,\r\n      icon: 'widgets',\r\n      width: '400px',\r\n      height: '500px',\r\n      minWidth: '300px',\r\n      minHeight: '200px',\r\n      resizable: true,\r\n      draggable: true,\r\n      closable: true,\r\n      minimizable: true,\r\n      maximizable: true,\r\n      componentId,\r\n      componentConfig: {\r\n        inputs: componentData.data,\r\n        outputs: componentData.outputs || {}\r\n      },\r\n      ...containerConfig\r\n    };\r\n\r\n    return this.containerService.show(config);\r\n  }\r\n\r\n  // Show multiple instances of the same component\r\n  showMultipleInstances(\r\n    componentId: string,\r\n    titlePrefix: string,\r\n    count: number,\r\n    config: Partial<FloatingContainerConfig> = {}\r\n  ): string[] {\r\n    const containerIds: string[] = [];\r\n    \r\n    for (let i = 1; i <= count; i++) {\r\n      const containerId = `${componentId}-instance-${i}-${Date.now()}`;\r\n      const title = `${titlePrefix} ${i}`;\r\n      \r\n      const containerConfig: FloatingContainerConfig = {\r\n        id: containerId,\r\n        title,\r\n        icon: 'widgets',\r\n        width: '400px',\r\n        height: '500px',\r\n        minWidth: '300px',\r\n        minHeight: '200px',\r\n        resizable: true,\r\n        draggable: true,\r\n        closable: true,\r\n        minimizable: true,\r\n        maximizable: true,\r\n        componentId,\r\n        ...config\r\n      };\r\n\r\n      const id = this.containerService.show(containerConfig);\r\n      containerIds.push(id);\r\n    }\r\n    \r\n    return containerIds;\r\n  }\r\n\r\n  // Get all instances of a component type\r\n  getInstancesOfType(componentType: string) {\r\n    return this.containerService.getInstancesByComponentType(componentType);\r\n  }\r\n\r\n  // Get active instances of a component type\r\n  getActiveInstancesOfType(componentType: string) {\r\n    return this.containerService.getActiveInstancesByComponentType(componentType);\r\n  }\r\n\r\n  // Close all instances of a component type\r\n  closeAllInstancesOfType(componentType: string): void {\r\n    this.containerService.closeAllInstancesOfType(componentType);\r\n  }\r\n\r\n  // Minimize all instances of a component type\r\n  minimizeAllInstancesOfType(componentType: string): void {\r\n    this.containerService.minimizeAllInstancesOfType(componentType);\r\n  }\r\n\r\n  // Get instance count for a component type\r\n  getInstanceCount(componentType: string): number {\r\n    return this.containerService.getInstanceCount(componentType);\r\n  }\r\n\r\n  // Get active instance count for a component type\r\n  getActiveInstanceCount(componentType: string): number {\r\n    return this.containerService.getActiveInstanceCount(componentType);\r\n  }\r\n\r\n  // Register a component for dynamic loading\r\n  registerComponent(componentId: string, componentType: any): void {\r\n    this.containerService.registerComponent(componentId, componentType);\r\n  }\r\n\r\n  // Unregister a component\r\n  unregisterComponent(componentId: string): void {\r\n    this.containerService.unregisterComponent(componentId);\r\n  }\r\n\r\n  hideFeature(featureId: string): void {\r\n    this.containerService.hide(featureId);\r\n  }\r\n\r\n  // Utility methods\r\n  bringToFront(featureId: string): void {\r\n    this.containerService.bringToFront(featureId);\r\n  }\r\n\r\n  minimize(featureId: string): void {\r\n    this.containerService.minimize(featureId);\r\n  }\r\n\r\n  maximize(featureId: string): void {\r\n    this.containerService.maximize(featureId);\r\n  }\r\n\r\n  isVisible(featureId: string): boolean {\r\n    return this.containerService.isVisible(featureId);\r\n  }\r\n\r\n  hideAll(): void {\r\n    this.containerService.hideAll();\r\n  }\r\n\r\n  minimizeAll(): void {\r\n    this.containerService.minimizeAll();\r\n  }\r\n\r\n}\r\n","import { Directive, Input, OnInit, OnDestroy, ViewContainerRef, ComponentRef } from '@angular/core';\r\nimport { CideEleFloatingContainerService, FloatingComponentConfig } from './floating-container.service';\r\n\r\n@Directive({\r\n  selector: '[cideEleFloatingDynamic]',\r\n  standalone: true\r\n})\r\nexport class CideEleFloatingContainerDynamicDirective implements OnInit, OnDestroy {\r\n  @Input() componentId!: string;\r\n  @Input() componentConfig?: FloatingComponentConfig;\r\n  @Input() isVisible: boolean = true;\r\n\r\n  private componentRef: ComponentRef<any> | null = null;\r\n\r\n  constructor(\r\n    private viewContainer: ViewContainerRef,\r\n    private containerService: CideEleFloatingContainerService\r\n  ) {}\r\n\r\n  ngOnInit(): void {\r\n    if (this.isVisible && this.componentId) {\r\n      this.loadComponent();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.destroyComponent();\r\n  }\r\n\r\n  ngOnChanges(): void {\r\n    if (this.isVisible && this.componentId && !this.componentRef) {\r\n      this.loadComponent();\r\n    } else if (!this.isVisible && this.componentRef) {\r\n      this.destroyComponent();\r\n    }\r\n  }\r\n\r\n  private loadComponent(): void {\r\n    if (this.componentId && this.containerService.isComponentRegistered(this.componentId)) {\r\n      this.componentRef = this.containerService.loadComponent(\r\n        this.componentId,\r\n        this.viewContainer,\r\n        this.componentConfig\r\n      );\r\n    } else {\r\n      console.warn(`Component '${this.componentId}' is not registered. Available components:`, this.containerService.getRegisteredComponentIds());\r\n      \r\n      // Retry after a short delay in case registration is still in progress\r\n      setTimeout(() => {\r\n        if (this.containerService.isComponentRegistered(this.componentId)) {\r\n          this.componentRef = this.containerService.loadComponent(\r\n            this.componentId,\r\n            this.viewContainer,\r\n            this.componentConfig\r\n          );\r\n        } else {\r\n          console.error(`Component '${this.componentId}' still not registered after retry`);\r\n        }\r\n      }, 100);\r\n    }\r\n  }\r\n\r\n  private destroyComponent(): void {\r\n    if (this.componentRef) {\r\n      this.componentRef.destroy();\r\n      this.componentRef = null;\r\n    }\r\n  }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, ElementRef, signal, computed, inject, DestroyRef, forwardRef, viewChild, WritableSignal, input, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FormsModule } from '@angular/forms';\n\nexport interface JsonEditorConfig {\n  /** Enable syntax highlighting */\n  syntaxHighlighting?: boolean;\n  /** Enable line numbers */\n  showLineNumbers?: boolean;\n  /** Enable auto-formatting */\n  autoFormat?: boolean;\n  /** Enable validation */\n  validateOnChange?: boolean;\n  /** Theme for the editor */\n  theme?: 'light' | 'dark';\n  /** Minimum height in pixels */\n  minHeight?: number;\n  /** Maximum height in pixels */\n  maxHeight?: number;\n  /** Placeholder text */\n  placeholder?: string;\n  /** Read-only mode */\n  readOnly?: boolean;\n  /** Show error messages */\n  showErrors?: boolean;\n}\n\nexport interface JsonEditorError {\n  line: number;\n  column: number;\n  message: string;\n  type: 'syntax' | 'validation';\n}\n\n@Component({\n  selector: 'cide-ele-json-editor',\n  standalone: true,\n  imports: [CommonModule, FormsModule],\n  template: `\n    <div class=\"tw-relative tw-w-full\" [class]=\"containerClass()\">\n      <!-- Label -->\n      @if (label) {\n        <label \n          [for]=\"editorId\" \n          class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\"\n          [class.tw-text-red-600]=\"hasErrors()\">\n          {{ label }}\n          @if (required) {\n            <span class=\"tw-text-red-500 tw-ml-1\">*</span>\n          }\n        </label>\n      }\n\n      <!-- Editor Container -->\n      <div \n        class=\"tw-relative tw-border tw-rounded-md tw-bg-white tw-overflow-hidden\"\n        [class.tw-border-red-300]=\"hasErrors()\"\n        [class.tw-border-gray-300]=\"!hasErrors()\"\n        [class.tw-focus-within:tw-border-blue-500]=\"!hasErrors()\"\n        [class.tw-focus-within:tw-ring-1]=\"!hasErrors()\"\n        [class.tw-focus-within:tw-ring-blue-500]=\"!hasErrors()\"\n        [class.tw-opacity-50]=\"disabledInput()\"\n        [class.tw-cursor-not-allowed]=\"disabledInput()\">\n        \n        <!-- Line Numbers -->\n        @if (configSignal().showLineNumbers) {\n          <div \n            class=\"tw-absolute tw-left-0 tw-top-0 tw-bottom-0 tw-w-12 tw-bg-gray-50 tw-border-r tw-border-gray-200 tw-text-xs tw-text-gray-500 tw-font-mono tw-select-none tw-overflow-hidden\"\n            [class.tw-bg-gray-800]=\"configSignal().theme === 'dark'\"\n            [class.tw-border-gray-600]=\"configSignal().theme === 'dark'\"\n            [class.tw-text-gray-400]=\"configSignal().theme === 'dark'\">\n            @for (line of lineNumbers(); track line) {\n              <div \n                class=\"tw-px-2 tw-py-1 tw-text-right\"\n                [class.tw-bg-red-100]=\"hasErrorOnLine(line)\"\n                [class.tw-text-red-600]=\"hasErrorOnLine(line)\"\n                [class.tw-bg-red-900]=\"configSignal().theme === 'dark' && hasErrorOnLine(line)\"\n                [class.tw-text-red-400]=\"configSignal().theme === 'dark' && hasErrorOnLine(line)\">\n                {{ line }}\n              </div>\n            }\n          </div>\n        }\n\n        <!-- Textarea -->\n        <textarea\n          #jsonTextarea\n          [id]=\"editorId\"\n          [value]=\"jsonString()\"\n          (input)=\"onInput($event)\"\n          (blur)=\"onBlur()\"\n          [placeholder]=\"configSignal().placeholder || 'Enter JSON configuration...'\"\n          [readonly]=\"configSignal().readOnly || disabledInput()\"\n          [disabled]=\"disabledInput()\"\n          class=\"tw-w-full tw-p-3 tw-text-sm tw-font-mono tw-leading-relaxed tw-resize-none tw-outline-none tw-bg-transparent\"\n          [class.tw-pl-12]=\"configSignal().showLineNumbers\"\n          [class.tw-text-gray-900]=\"configSignal().theme === 'light'\"\n          [class.tw-text-gray-100]=\"configSignal().theme === 'dark'\"\n          [class.tw-bg-gray-900]=\"configSignal().theme === 'dark'\"\n          [style.min-height.px]=\"configSignal().minHeight || 120\"\n          [style.max-height.px]=\"configSignal().maxHeight || 400\"\n          [attr.aria-describedby]=\"errorId()\"\n          [attr.aria-invalid]=\"hasErrors()\">\n        </textarea>\n\n        <!-- Format Button -->\n        @if (!configSignal().readOnly && !disabledInput()) {\n          <button\n            type=\"button\"\n            (click)=\"formatJson()\"\n            class=\"tw-absolute tw-top-2 tw-right-2 tw-p-1 tw-text-gray-400 hover:tw-text-gray-600 tw-rounded tw-transition-colors\"\n            [class.tw-text-gray-500]=\"configSignal().theme === 'dark'\"\n            [class.hover:tw-text-gray-300]=\"configSignal().theme === 'dark'\"\n            title=\"Format JSON\">\n            <svg class=\"tw-w-4 tw-h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h7\"></path>\n            </svg>\n          </button>\n        }\n      </div>\n\n      <!-- Helper Text -->\n      @if (helperText && !hasErrors()) {\n        <p class=\"tw-mt-1 tw-text-xs tw-text-gray-500\">{{ helperText }}</p>\n      }\n\n      <!-- Error Messages -->\n      @if (configSignal().showErrors && hasErrors()) {\n        <div [id]=\"errorId()\" class=\"tw-mt-1 tw-space-y-1\">\n          @for (error of errors(); track error.line + '-' + error.column) {\n            <p class=\"tw-text-xs tw-text-red-600 tw-flex tw-items-start tw-gap-1\">\n              <svg class=\"tw-w-3 tw-h-3 tw-mt-0.5 tw-flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n                <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"></path>\n              </svg>\n              <span>\n                Line {{ error.line }}, Column {{ error.column }}: {{ error.message }}\n              </span>\n            </p>\n          }\n        </div>\n      }\n\n      <!-- Character Count -->\n      @if (showCharacterCount) {\n        <p class=\"tw-mt-1 tw-text-xs tw-text-gray-400 tw-text-right\">\n          {{ jsonString().length }} characters\n        </p>\n      }\n    </div>\n  `,\n  styles: [`\n    :host {\n      display: block;\n    }\n    \n    textarea {\n      font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\n      tab-size: 2;\n    }\n    \n    textarea:focus {\n      box-shadow: none;\n    }\n    \n    .tw-cursor-not-allowed {\n      cursor: not-allowed;\n    }\n  `],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => CideEleJsonEditorComponent),\n      multi: true\n    }\n  ]\n})\nexport class CideEleJsonEditorComponent implements OnInit, ControlValueAccessor {\n  // Inputs\n  @Input() label?: string;\n  @Input() helperText?: string;\n  @Input() required = false;\n  public disabled = input<boolean>(false);\n  // Internal writable signal for ControlValueAccessor setDisabledState\n  private _disabledInternal = signal<boolean>(false);\n  // Computed signal that combines input and internal state (if either is true, component is disabled)\n  public disabledInput = computed(() => this._disabledInternal() || this.disabled());\n  @Input() showCharacterCount = false;\n  @Input() config: JsonEditorConfig = {};\n  configSignal = signal<JsonEditorConfig>({});\n\n  // Outputs\n  @Output() valueChange = new EventEmitter<string>();\n  @Output() objectChange = new EventEmitter<object | null>();\n  @Output() errorsChange = new EventEmitter<JsonEditorError[]>();\n  @Output() validChange = new EventEmitter<boolean>();\n\n  // ViewChild\n  jsonTextarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('jsonTextarea');\n\n  // Dependency injection\n  private destroyRef = inject(DestroyRef);\n\n  // Internal state\n  jsonString = signal('');\n  jsonObject = signal<object | null>(null);\n  errors = signal<JsonEditorError[]>([]);\n  editorId = `json-editor-${Math.random().toString(36).substr(2, 9)}`;\n\n  // Computed values\n  hasErrors = computed(() => this.errors().length > 0);\n  isValid = computed(() => !this.hasErrors() && this.jsonObject() !== null);\n  lineNumbers = computed(() => {\n    const lines = this.jsonString().split('\\n');\n    return Array.from({ length: Math.max(lines.length, 1) }, (_, i) => i + 1);\n  });\n  containerClass = computed(() => {\n    const classes = ['tw-w-full'];\n    if (this.disabledInput()) {\n      classes.push('tw-opacity-50');\n    }\n    return classes.join(' ');\n  });\n\n  // Default configuration\n  private defaultConfig: JsonEditorConfig = {\n    syntaxHighlighting: true,\n    showLineNumbers: true,\n    autoFormat: true,\n    validateOnChange: true,\n    theme: 'light',\n    minHeight: 120,\n    maxHeight: 400,\n    placeholder: 'Enter JSON configuration...',\n    readOnly: false,\n    showErrors: true\n  };\n\n  ngOnInit(): void {\n    // Merge default config with input config\n    const mergedConfig = { ...this.defaultConfig, ...this.config };\n    this.configSignal.set(mergedConfig);\n    \n    // Initial validation\n    if (mergedConfig.validateOnChange && this.jsonString()) {\n      this.validateJson();\n    }\n  }\n\n  /**\n   * Handle input changes\n   */\n  onInput(event: Event): void {\n    const target = event.target as HTMLTextAreaElement;\n    const value = target.value;\n    \n    this.jsonString.set(value);\n    this.valueChange.emit(value);\n    \n    // Call ControlValueAccessor onChange callback\n    this.onChange(value);\n    \n    if (this.configSignal().validateOnChange) {\n      this.validateJson();\n    }\n    \n    this.parseJson(value);\n  }\n\n  /**\n   * Handle blur event\n   */\n  onBlur(): void {\n    // Call ControlValueAccessor onTouched callback\n    this.onTouched();\n    \n    if (this.configSignal().autoFormat && this.isValid()) {\n      this.formatJson();\n    }\n  }\n\n  /**\n   * Parse JSON string and emit object\n   */\n  private parseJson(jsonStr: string): void {\n    if (!jsonStr.trim()) {\n      this.jsonObject.set(null);\n      this.objectChange.emit(null);\n      return;\n    }\n\n    try {\n      const parsed = JSON.parse(jsonStr);\n      this.jsonObject.set(parsed);\n      this.objectChange.emit(parsed);\n    } catch (error) {\n      // Error will be handled by validateJson\n      this.jsonObject.set(null);\n      this.objectChange.emit(null);\n    }\n  }\n\n  /**\n   * Validate JSON and update errors\n   */\n  private validateJson(): void {\n    const jsonStr = this.jsonString();\n    const newErrors: JsonEditorError[] = [];\n\n    if (!jsonStr.trim()) {\n      this.errors.set(newErrors);\n      this.errorsChange.emit(newErrors);\n      this.validChange.emit(true);\n      return;\n    }\n\n    try {\n      JSON.parse(jsonStr);\n      // JSON is valid\n      this.errors.set(newErrors);\n      this.errorsChange.emit(newErrors);\n      this.validChange.emit(true);\n    } catch (error) {\n      // Parse error - extract line and column information\n      const errorMessage = (error as Error).message;\n      const lineMatch = errorMessage.match(/position (\\d+)/);\n      \n      if (lineMatch) {\n        const position = parseInt(lineMatch[1]);\n        const lines = jsonStr.substring(0, position).split('\\n');\n        const line = lines.length;\n        const column = lines[lines.length - 1].length + 1;\n        \n        newErrors.push({\n          line,\n          column,\n          message: 'Invalid JSON syntax',\n          type: 'syntax'\n        });\n      } else {\n        newErrors.push({\n          line: 1,\n          column: 1,\n          message: 'Invalid JSON format',\n          type: 'syntax'\n        });\n      }\n      \n      this.errors.set(newErrors);\n      this.errorsChange.emit(newErrors);\n      this.validChange.emit(false);\n    }\n  }\n\n  /**\n   * Format JSON with proper indentation\n   */\n  formatJson(): void {\n    if (!this.jsonString().trim()) {\n      return;\n    }\n\n    try {\n      const parsed = JSON.parse(this.jsonString());\n      const formatted = JSON.stringify(parsed, null, 2);\n      this.jsonString.set(formatted);\n      this.valueChange.emit(formatted);\n      this.jsonObject.set(parsed);\n      this.objectChange.emit(parsed);\n      this.errors.set([]);\n      this.errorsChange.emit([]);\n      this.validChange.emit(true);\n    } catch (error) {\n      // Don't format if JSON is invalid\n      console.warn('Cannot format invalid JSON');\n    }\n  }\n\n  /**\n   * Check if there's an error on a specific line\n   */\n  hasErrorOnLine(line: number): boolean {\n    return this.errors().some(error => error.line === line);\n  }\n\n  /**\n   * Get error ID for accessibility\n   */\n  errorId(): string {\n    return `${this.editorId}-errors`;\n  }\n\n  /**\n   * Focus the editor\n   */\n  focus(): void {\n    this.jsonTextarea().nativeElement.focus();\n  }\n\n  /**\n   * Clear the editor\n   */\n  clear(): void {\n    this.jsonString.set('');\n    this.jsonObject.set(null);\n    this.errors.set([]);\n    this.valueChange.emit('');\n    this.objectChange.emit(null);\n    this.errorsChange.emit([]);\n    this.validChange.emit(true);\n  }\n\n  /**\n   * Get current JSON object\n   */\n  getValue(): object | null {\n    return this.jsonObject();\n  }\n\n  /**\n   * Get current JSON string\n   */\n  getStringValue(): string {\n    return this.jsonString();\n  }\n\n  /**\n   * Check if JSON is valid\n   */\n  isValidJson(): boolean {\n    return this.isValid();\n  }\n\n  /**\n   * Get validation errors\n   */\n  getErrors(): JsonEditorError[] {\n    return this.errors();\n  }\n\n  // ControlValueAccessor methods\n  writeValue(value: string | object | null | undefined): void {\n    if (value === null || value === undefined) {\n      this.jsonString.set('');\n      this.jsonObject.set(null);\n    } else if (typeof value === 'string') {\n      this.jsonString.set(value);\n      this.parseJson(value);\n    } else if (typeof value === 'object') {\n      this.jsonObject.set(value);\n      this.jsonString.set(JSON.stringify(value, null, 2));\n    }\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this._disabledInternal.set(isDisabled);\n  }\n\n  private onChange: (value: string) => void = () => {};\n  private onTouched: () => void = () => {};\n} ","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n  selector: 'cide-ele-skeleton-loader',\r\n  templateUrl: './skeleton-loader.component.html',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  styleUrls: ['./skeleton-loader.component.scss']\r\n})\r\nexport class CideEleSkeletonLoaderComponent {\r\n  @Input() width: string = '100%';\r\n  @Input() height: string = '1rem';\r\n  @Input() borderRadius: string = '0.375rem'; // rounded-md\r\n  @Input() count: number = 1;\r\n  @Input() circle: boolean = false;\r\n  @Input() animation: 'pulse' | 'wave' | 'none' = 'pulse';\r\n}\r\n","<ng-container *ngFor=\"let i of [].constructor(count)\">\r\n  <div\r\n    [ngClass]=\"[\r\n      'tw-bg-gray-200 tw-mx-auto',\r\n      animation === 'pulse' ? 'tw-animate-pulse' : '',\r\n      circle ? 'tw-rounded-full' : 'tw-rounded-md'\r\n    ]\"\r\n    [style.width]=\"width\"\r\n    [style.height]=\"height\"\r\n    [style.borderRadius]=\"circle ? '50%' : borderRadius\"\r\n    class=\"tw-mb-2\"\r\n  ></div>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i1.CideElementsService","cidePath","hostManagerRoutesUrl","catchError","i1.CideEleFloatingContainerService"],"mappings":"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"}