{"version":3,"file":"ngx-lite-form.mjs","sources":["../../../projects/lite-form/src/lib/field-dto.ts","../../../projects/lite-form/src/lib/form-utils.ts","../../../projects/lite-form/src/lib/lite-input/lite-input.ts","../../../projects/lite-form/src/lib/lite-input/lite-input.html","../../../projects/lite-form/src/lib/lite-textarea/lite-textarea.ts","../../../projects/lite-form/src/lib/lite-textarea/lite-textarea.html","../../../projects/lite-form/src/lib/lite-select/lite-select.ts","../../../projects/lite-form/src/lib/lite-select/lite-select.html","../../../projects/lite-form/src/lib/lite-multi-select/lite-multi-select.ts","../../../projects/lite-form/src/lib/lite-multi-select/lite-multi-select.html","../../../projects/lite-form/src/lib/lite-radio/lite-radio.ts","../../../projects/lite-form/src/lib/lite-radio/lite-radio.html","../../../projects/lite-form/src/lib/lite-checkbox/lite-checkbox.ts","../../../projects/lite-form/src/lib/lite-checkbox/lite-checkbox.html","../../../projects/lite-form/src/lib/lite-date/lite-date.ts","../../../projects/lite-form/src/lib/lite-date/lite-date.html","../../../projects/lite-form/src/lib/lite-datetime/lite-datetime.ts","../../../projects/lite-form/src/lib/lite-datetime/lite-datetime.html","../../../projects/lite-form/src/lib/lite-password/lite-password.ts","../../../projects/lite-form/src/lib/lite-password/lite-password.html","../../../projects/lite-form/src/lib/lite-file/lite-file.ts","../../../projects/lite-form/src/lib/lite-file/lite-file.html","../../../projects/lite-form/src/lib/lite-snackbar/lite-snackbar.service.ts","../../../projects/lite-form/src/lib/lite-paginator/lite-paginator.ts","../../../projects/lite-form/src/lib/lite-paginator/lite-paginator.html","../../../projects/lite-form/src/lib/lite-table/lite-table.ts","../../../projects/lite-form/src/lib/lite-table/lite-table.html","../../../projects/lite-form/src/lib/lite-panel/lite-panel.ts","../../../projects/lite-form/src/lib/lite-panel/lite-panel.html","../../../projects/lite-form/src/lib/lite-loading/lite-loading.ts","../../../projects/lite-form/src/lib/lite-loading/lite-loading.html","../../../projects/lite-form/src/lib/lite-tab-content.ts","../../../projects/lite-form/src/lib/lite-tab-group/lite-tab-group.ts","../../../projects/lite-form/src/lib/lite-tab-group/lite-tab-group.html","../../../projects/lite-form/src/public-api.ts","../../../projects/lite-form/src/ngx-lite-form.ts"],"sourcesContent":["import { FormControl } from \"@angular/forms\";\n\nexport class FieldDto {\n  label: string;\n  formControl: FormControl;\n  rows?: number;\n  type?: 'text' | 'number';\n\n  constructor(label: string, formControl: FormControl, rows: number = 2, type: 'text' | 'number' = 'text') {\n    this.label = label;\n    this.formControl = formControl;\n    this.rows = rows;\n    this.type = type;\n  }\n}\n\nexport abstract class BaseSelectFieldDto<T = any> {\n  label: string;\n  options: T[];\n  displayWith: (_option: T) => string;\n  \n  constructor(\n    label: string,\n    options: T[],\n    displayWith: (_option: T) => string\n  ) {\n    this.label = label;\n    this.options = options;\n    this.displayWith = displayWith;\n  }\n}\n\nexport class SelectFieldDto<T = any> extends BaseSelectFieldDto<T> {\n  formControl: FormControl<T>;\n  \n  constructor(\n    label: string,\n    formControl: FormControl<T>,\n    options: T[],\n    displayWith: (_option: T) => string\n  ) {\n    super(label, options, displayWith);\n    this.formControl = formControl;\n  }\n}\n\nexport class MultiSelectFieldDto<T = any> extends BaseSelectFieldDto<T> {\n  formControl: FormControl<T[]>;\n  \n  constructor(\n    label: string,\n    formControl: FormControl<T[]>,\n    options: T[],\n    displayWith: (_option: T) => string\n  ) {\n    super(label, options, displayWith);\n    this.formControl = formControl;\n  }\n}\n\nexport class RadioFieldDto<T = any> extends BaseSelectFieldDto<T> {\n  formControl: FormControl<T>;\n  \n  constructor(\n    label: string,\n    formControl: FormControl<T>,\n    options: T[],\n    displayWith: (_option: T) => string\n  ) {\n    super(label, options, displayWith);\n    this.formControl = formControl;\n  }\n}\n\nexport class FileFieldDto {\n  label: string;\n  formControl: FormControl;\n  multiple?: boolean;\n  accept?: string;\n  maxFileSize?: number;\n  maxFiles?: number;\n  showPreview?: boolean;\n\n  constructor(\n    label: string,\n    formControl: FormControl,\n    multiple: boolean = true,\n    accept: string = '*/*',\n    maxFileSize: number = 10 * 1024 * 1024, // 10MB\n    maxFiles: number = 10,\n    showPreview: boolean = true\n  ) {\n    this.label = label;\n    this.formControl = formControl;\n    this.multiple = multiple;\n    this.accept = accept;\n    this.maxFileSize = maxFileSize;\n    this.maxFiles = maxFiles;\n    this.showPreview = showPreview;\n  }\n}\n\nexport type SnackbarType = 'done' | 'warn' | 'error';\n\nexport class PaginatorFieldDto {\n  currentPage: number;\n  totalItems: number;\n  itemsPerPage: number;\n\n  constructor(\n    currentPage: number = 1,\n    totalItems: number = 0,\n    itemsPerPage: number = 10\n  ) {\n    this.currentPage = currentPage;\n    this.totalItems = totalItems;\n    this.itemsPerPage = itemsPerPage;\n  }\n}\n\nexport interface TableColumn {\n  key: string;\n  label: string;\n  flex?: string;\n  sortable?: boolean;\n  cellTemplate?: (_value: any, _row: any) => string;\n  // Optional type for special rendering. Defaults to 'text'.\n  type?: 'text' | 'menu' | 'select';\n  // When type is 'menu', provide menu items shown in the row actions dropdown.\n  menuItems?: Array<{ label: string; value: string; variant?: 'danger' | 'default' }>;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n  column: string;\n  direction: SortDirection;\n}\n\nexport class TableFieldDto<T = any> {\n  columns: TableColumn[];\n  data: T[];\n  showPaginator?: boolean;\n  paginatorConfig: PaginatorFieldDto;\n  sortState?: SortState;\n\n  constructor(\n    columns: TableColumn[],\n    data: T[],\n    showPaginator: boolean = false,\n    paginatorConfig: PaginatorFieldDto = new PaginatorFieldDto(),\n    sortState?: SortState\n  ) {\n    this.columns = columns;\n    this.data = data;\n    this.showPaginator = showPaginator;\n    this.paginatorConfig = paginatorConfig;\n    this.sortState = sortState;\n  }\n}\n","import { AbstractControl } from '@angular/forms';\n\n/**\n * Utility class for form-related helper functions\n */\nexport class FormUtils {\n  /**\n   * Check if a FormControl has the required validator\n   * @param control - The AbstractControl to check\n   * @returns true if the control has a required validator, false otherwise\n   */\n  static isRequired(control: AbstractControl): boolean {\n    if (control.validator) {\n      const validator = control.validator({} as any);\n      return validator && validator['required'];\n    }\n    return false;\n  }\n\n  /**\n   * Check if a FormControl has any validation errors\n   * @param control - The AbstractControl to check\n   * @returns true if the control has errors, false otherwise\n   */\n  static hasErrors(control: AbstractControl): boolean {\n    return control.invalid && (control.dirty || control.touched);\n  }\n\n  /**\n   * Get all error keys for a FormControl\n   * @param control - The AbstractControl to check\n   * @returns array of error keys or empty array if no errors\n   */\n  static getErrors(control: AbstractControl): string[] {\n    if (control.errors) {\n      return Object.keys(control.errors);\n    }\n    return [];\n  }\n\n  /**\n   * Get user-friendly error messages for a FormControl\n   * @param control - The AbstractControl to check\n   * @param fieldLabel - The label of the field for error messages\n   * @returns array of user-friendly error messages\n   */\n  static getErrorMessages(control: AbstractControl, fieldLabel: string): string[] {\n    const errorMessages: string[] = [];\n    \n    if (control.errors) {\n      if (control.errors['required']) {\n        errorMessages.push(`${fieldLabel} is required`);\n      }\n      if (control.errors['email']) {\n        errorMessages.push(`${fieldLabel} must be a valid email`);\n      }\n      if (control.errors['minlength']) {\n        errorMessages.push(`${fieldLabel} must be at least ${control.errors['minlength'].requiredLength} characters`);\n      }\n      if (control.errors['maxlength']) {\n        errorMessages.push(`${fieldLabel} must be no more than ${control.errors['maxlength'].requiredLength} characters`);\n      }\n      \n      // Handle any other validation errors\n      const allErrors = FormUtils.getErrors(control);\n      const handledErrors = ['required', 'email', 'minlength', 'maxlength'];\n      const unhandledErrors = allErrors.filter(error => !handledErrors.includes(error));\n      \n      unhandledErrors.forEach(error => {\n        errorMessages.push(`${fieldLabel} is invalid: ${error}`);\n      });\n    }\n    \n    return errorMessages;\n  }\n\n  /**\n   * Get the first error message for a FormControl\n   * @param control - The AbstractControl to check\n   * @returns the first error key or null if no errors\n   */\n  static getFirstError(control: AbstractControl): string | null {\n    if (control.errors) {\n      return Object.keys(control.errors)[0];\n    }\n    return null;\n  }\n\n  /**\n   * Get detailed password error messages for a FormControl\n   * @param control - The AbstractControl to check\n   * @param fieldLabel - The label of the field for error messages\n   * @returns array of detailed password error messages\n   */\n  static getPasswordErrorMessages(control: AbstractControl, fieldLabel: string): string[] {\n    const errorMessages: string[] = [];\n    \n    if (control.errors) {\n      // Required validation\n      if (control.errors['required']) {\n        errorMessages.push(`${fieldLabel} is required`);\n      }\n      \n      // Length validations\n      if (control.errors['minlength']) {\n        const requiredLength = control.errors['minlength'].requiredLength;\n        const actualLength = control.errors['minlength'].actualLength;\n        errorMessages.push(`${fieldLabel} must be at least ${requiredLength} characters (currently ${actualLength})`);\n      }\n      \n      if (control.errors['maxlength']) {\n        const requiredLength = control.errors['maxlength'].requiredLength;\n        const actualLength = control.errors['maxlength'].actualLength;\n        errorMessages.push(`${fieldLabel} must be no more than ${requiredLength} characters (currently ${actualLength})`);\n      }\n      \n      // Pattern validation with detailed feedback\n      if (control.errors['pattern']) {\n        const value = control.value || '';\n        const patternRequiredValue = control.errors['pattern'].requiredPattern;\n        \n        // Analyze the actual pattern to provide specific feedback\n        const missingRequirements: string[] = [];\n        \n        // Check what the actual pattern requires by analyzing the regex\n        if (patternRequiredValue) {\n          // Check if the pattern requires lowercase letters\n          if (patternRequiredValue.includes('(?=.*[a-z])') && !/[a-z]/.test(value)) {\n            missingRequirements.push('at least one lowercase letter (a-z)');\n          }\n          \n          // Check if the pattern requires uppercase letters\n          if (patternRequiredValue.includes('(?=.*[A-Z])') && !/[A-Z]/.test(value)) {\n            missingRequirements.push('at least one uppercase letter (A-Z)');\n          }\n          \n          // Check if the pattern requires digits\n          if ((patternRequiredValue.includes('(?=.*\\\\d)') || patternRequiredValue.includes('(?=.*[0-9])')) && !/\\d/.test(value)) {\n            missingRequirements.push('at least one number (0-9)');\n          }\n          \n          // Check if the pattern requires special characters\n          if (patternRequiredValue.includes('(?=.*[@$!%*?&]') && !/[@$!%*?&^()_+\\-=[]{}|;':\"\\\\|,.<>?`#~]/.test(value)) {\n            missingRequirements.push('at least one special character (!@#$%^&*()_+-=[]{}|;\\':\",./<>?)');\n          }\n          \n          // Check for minimum length in pattern (e.g., {8,} or {8,50})\n          const lengthMatch = patternRequiredValue.match(/\\{(\\d+),?\\d*\\}/);\n          if (lengthMatch) {\n            const minLength = parseInt(lengthMatch[1]);\n            if (value.length < minLength) {\n              missingRequirements.push(`at least ${minLength} characters`);\n            }\n          }\n          \n          // Check if spaces are not allowed\n          if (patternRequiredValue.includes('[A-Za-z\\\\d') && !patternRequiredValue.includes('\\\\s') && /\\s/.test(value)) {\n            missingRequirements.push('no spaces allowed');\n          }\n        }\n        \n        // Fallback to generic checks if pattern analysis didn't find specific requirements\n        if (missingRequirements.length === 0) {\n          // Check for common password requirements as fallback\n          if (!/[a-z]/.test(value)) {\n            missingRequirements.push('at least one lowercase letter (a-z)');\n          }\n          \n          if (!/[A-Z]/.test(value)) {\n            missingRequirements.push('at least one uppercase letter (A-Z)');\n          }\n          \n          if (!/\\d/.test(value)) {\n            missingRequirements.push('at least one number (0-9)');\n          }\n          \n          if (!/[@$!%*?&^()_+\\-=[]{}|;':\"\\\\|,.<>?`#~]/.test(value)) {\n            missingRequirements.push('at least one special character (!@#$%^&*()_+-=[]{}|;\\':\",./<>?)');\n          }\n        }\n        \n        if (missingRequirements.length > 0) {\n          errorMessages.push(`${fieldLabel} must contain ${missingRequirements.join(', ')}`);\n        } else {\n          // Show the actual pattern if we can't determine specific requirements\n          errorMessages.push(`${fieldLabel} does not match required pattern: ${patternRequiredValue}`);\n        }\n      }\n      \n      // Custom password complexity validator\n      if (control.errors['passwordComplexity']) {\n        const complexity = control.errors['passwordComplexity'];\n        const missing: string[] = [];\n        \n        if (!complexity.hasUpperCase) missing.push('uppercase letter');\n        if (!complexity.hasLowerCase) missing.push('lowercase letter');\n        if (!complexity.hasNumeric) missing.push('number');\n        if (!complexity.hasSpecial) missing.push('special character');\n        if (!complexity.minLength) missing.push('minimum length requirement');\n        \n        if (missing.length > 0) {\n          errorMessages.push(`${fieldLabel} is missing: ${missing.join(', ')}`);\n        }\n      }\n      \n      // Password mismatch (for confirm password fields)\n      if (control.errors['passwordMismatch']) {\n        errorMessages.push(`${fieldLabel} does not match the password`);\n      }\n      \n      // Common password validator\n      if (control.errors['commonPassword']) {\n        errorMessages.push(`${fieldLabel} is too common. Please choose a more secure password`);\n      }\n      \n      // Password history validator\n      if (control.errors['passwordHistory']) {\n        errorMessages.push(`${fieldLabel} has been used recently. Please choose a different password`);\n      }\n      \n      // Handle any other validation errors not specifically handled\n      const allErrors = FormUtils.getErrors(control);\n      const handledErrors = [\n        'required', 'minlength', 'maxlength', 'pattern', \n        'passwordComplexity', 'passwordMismatch', 'commonPassword', 'passwordHistory'\n      ];\n      const unhandledErrors = allErrors.filter(error => !handledErrors.includes(error));\n      \n      unhandledErrors.forEach(error => {\n        errorMessages.push(`${fieldLabel} validation error: ${error}`);\n      });\n    }\n    \n    return errorMessages;\n  }\n\n  /**\n   * Analyze password strength and return feedback\n   * @param password - The password string to analyze\n   * @returns object with strength score and detailed feedback\n   */\n  static analyzePasswordStrength(password: string): {\n    score: number;\n    level: 'Very Weak' | 'Weak' | 'Fair' | 'Good' | 'Strong';\n    feedback: string[];\n  } {\n    const feedback: string[] = [];\n    let score = 0;\n    \n    if (!password) {\n      return { score: 0, level: 'Very Weak', feedback: ['Password is required'] };\n    }\n    \n    // Length scoring\n    if (password.length >= 8) score += 1;\n    else feedback.push('Use at least 8 characters');\n    \n    if (password.length >= 12) score += 1;\n    else if (password.length >= 8) feedback.push('Consider using 12+ characters for better security');\n    \n    // Character variety scoring\n    if (/[a-z]/.test(password)) score += 1;\n    else feedback.push('Add lowercase letters');\n    \n    if (/[A-Z]/.test(password)) score += 1;\n    else feedback.push('Add uppercase letters');\n    \n    if (/\\d/.test(password)) score += 1;\n    else feedback.push('Add numbers');\n    \n    if (/[@$!%*?&^()_+\\-=[]{}|;':\"\\\\|,.<>?`#~]/.test(password)) score += 1;\n    else feedback.push('Add special characters');\n    \n    // Additional checks\n    if (!/(.)\\1{2,}/.test(password)) score += 1;\n    else feedback.push('Avoid repeating characters');\n    \n    if (!/^(.{1,2})\\1+$/.test(password)) score += 1;\n    else feedback.push('Avoid repetitive patterns');\n    \n    // Determine strength level\n    let level: 'Very Weak' | 'Weak' | 'Fair' | 'Good' | 'Strong';\n    if (score <= 2) level = 'Very Weak';\n    else if (score <= 4) level = 'Weak';\n    else if (score <= 5) level = 'Fair';\n    else if (score <= 6) level = 'Good';\n    else level = 'Strong';\n    \n    return { score, level, feedback };\n  }\n}\n","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-input',\n  templateUrl: `./lite-input.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteInput {\n  inEdit = input<boolean>(true);\n  control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n  \n  readonly FormUtils = FormUtils;\n\n  constructor() {\n    effect(() => {\n      // console.log('LiteInput initialized with control:', this.control());\n\n    });\n  }\n  isRequired() {\n    return this.FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n}\n","<div class=\"lite-input\" [ngClass]=\"{'in-edit': inEdit()}\">\n  @if (inEdit()) {\n    <input type=\"text\" [formControl]=\"control().formControl\" placeholder=\"\" [ngClass]=\"{'invalid': hasErrors()}\" />\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    @if (hasErrors()) {\n      <div class=\"error-messages\">\n        @for (errorMessage of getErrorMessage(); track errorMessage) {\n          <div class=\"error-message\">{{ errorMessage }}</div>\n        }\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">{{ control().formControl.value }}</div>\n  }\n</div>","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-textarea',\n  \n  templateUrl: `./lite-textarea.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteTextarea {\n  inEdit = input<boolean>(true);\n  control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n  \n  // Make FormUtils available to the template\n  readonly FormUtils = FormUtils;\n  \n  constructor() {\n    effect(() => {\n      // Initialization logic can go here if needed\n    });\n  }\n\n  isRequired(): boolean {\n    return FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n}\n","<div class=\"lite-textarea\" [ngClass]=\"{'in-edit': inEdit()}\">\n  @if (inEdit()) {\n    <textarea [formControl]=\"control().formControl\" placeholder=\"\" rows=\"{{ control().rows }}\" [ngClass]=\"{'invalid': hasErrors()}\"></textarea>\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    @if (hasErrors()) {\n      <div class=\"error-messages\">\n        @for (errorMessage of getErrorMessage(); track errorMessage) {\n          <div class=\"error-message\">{{ errorMessage }}</div>\n        }\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">{{ control().formControl.value }}</div>\n  }\n</div>","import { Component, effect, input, ElementRef, HostListener, computed, signal, DoCheck } from '@angular/core';\nimport { SelectFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-select',\n  \n  templateUrl: `./lite-select.html`,\n  styleUrls: [`../lite-styles.scss`],\n  animations: [\n    trigger('toggleView', [\n      state('collapse', style({ height: 0, opacity: 0 })),\n      state('expand', style({ height: '*', opacity: 1 })),\n      transition('collapse <=> expand', animate('300ms ease-in-out'))\n    ])\n  ]\n})\nexport class LiteSelect implements DoCheck {\n  inEdit = input<boolean>(true);\n  control = input<SelectFieldDto>({ label: '', formControl: new FormControl(null), options: [], displayWith: (option) => option });\n  showOptions = 'collapse';\n  \n  // Separate input text from FormControl value\n  inputText = signal('');\n  \n  // Track previous options array to detect mutations\n  private _previousOptionsLength = 0;\n  private _previousOptionsReference: any[] = [];\n  \n  // Internal signal that gets updated when options change\n  private _optionsVersion = signal(0);\n  \n  readonly FormUtils = FormUtils;\n  \n  // Computed signal for filtered options\n  filteredOptions = computed(() => {\n    const text = this.inputText();\n    // Force dependency on options version to trigger recalculation\n    this._optionsVersion();\n    const options = this.control().options;\n    // console.log('Filtered options computed:', options);\n    \n    if (!text.trim()) {\n      return options;\n    }\n    \n    return options.filter(option =>\n      this.control().displayWith(option).toLowerCase().includes(text.toLowerCase())\n    );\n  });\n  \n  ngDoCheck(): void {\n    // Manually check if options array has changed (by reference or length)\n    const currentOptions = this.control().options;\n    \n    if (currentOptions !== this._previousOptionsReference || \n        currentOptions.length !== this._previousOptionsLength) {\n      // console.log('Options changed detected in ngDoCheck:', currentOptions);\n      this._previousOptionsReference = currentOptions;\n      this._previousOptionsLength = currentOptions.length;\n      \n      // Increment version to trigger computed signal recalculation\n      this._optionsVersion.update(v => v + 1);\n    }\n  }\n\n  constructor(private _elementRef: ElementRef) {\n    \n    effect(() => {\n      // Sync inputText with FormControl value when it changes\n      const value = this.control().formControl.value;\n      if (value && typeof value === 'object') {\n        this.inputText.set(this.control().displayWith(value));\n      } else if (!value) {\n        this.inputText.set('');\n      }\n    }, { allowSignalWrites: true });\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: MouseEvent): void {\n    if (this.showOptions === 'expand') {\n      const target = event.target as HTMLElement;\n      if (!this._elementRef.nativeElement.contains(target)) {\n        this.showOptions = 'collapse';\n        this.handleInputValidation();\n      }\n    }\n  }\n  \n  private handleInputValidation(): void {\n    // If the typed text matches an option exactly, select it\n    const matchingOption = this.control().options.find(option => \n      this.control().displayWith(option).toLowerCase() === this.inputText().toLowerCase()\n    );\n    \n    if (matchingOption) {\n      this.control().formControl.setValue(matchingOption);\n      this.inputText.set(this.control().displayWith(matchingOption));\n    } else {\n      // If no match and FormControl has a value, reset inputText to show the current selection\n      const currentValue = this.control().formControl.value;\n      if (currentValue && typeof currentValue === 'object') {\n        this.inputText.set(this.control().displayWith(currentValue));\n      }\n      // If no current selection and no match, leave inputText as typed for user feedback\n    }\n  }\n\n  isRequired(): boolean {\n    return FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  optionSelected(option: any): void {\n    console.log(option);\n    this.control().formControl.setValue(option);\n    this.inputText.set(this.control().displayWith(option));\n    this.showOptions = 'collapse';\n  }\n\n  onInputChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    this.inputText.set(target.value);\n    \n    // Reset selection to initial state when input is cleared\n    if (!target.value.trim()) {\n      this.control().formControl.setValue(null);\n    }\n    // Note: FormControl value is only updated when a valid option is selected\n  }\n\n  getDisplayValue(): string {\n    return this.inputText();\n  }\n\n  hasTypedValue(): boolean {\n    // Check if user has typed something that doesn't match any option\n    if (!this.inputText().trim()) return false;\n    \n    // Check if the current inputText matches any valid option's display value\n    const matchesValidOption = this.control().options.some(option => \n      this.control().displayWith(option).toLowerCase() === this.inputText().toLowerCase()\n    );\n    \n    return !matchesValidOption;\n  }\n  toggleOptionPanel(): void {\n    console.log(this.filteredOptions());\n    this.showOptions = this.showOptions === 'expand' ? 'collapse' : 'expand';\n  }\n\n  shouldShowPlaceholder(): boolean {\n    // Only show placeholder when label is floating (not overlapping)\n    return this.showOptions === 'expand' || !!this.getDisplayValue() || this.hasTypedValue();\n  }\n}\n","<div class=\"lite-select\" [ngClass]=\"{'in-edit': inEdit()}\">\n  @if (inEdit()) {\n    <input type=\"text\" [value]=\"getDisplayValue()\" (input)=\"onInputChange($event)\" [ngClass]=\"{'selected': control().formControl.value, 'invalid': hasErrors()}\"\n      (focus)=\"showOptions = 'expand'\" \n      [placeholder]=\"shouldShowPlaceholder() ? 'Type to search...' : ''\" />\n    <div class=\"options\" [@toggleView]=\"showOptions\">\n      @for (option of filteredOptions(); track $index) {\n        <div class=\"option\" (mousedown)=\"optionSelected(option)\" [title]=\"control().displayWith(option)\">{{ control().displayWith(option) }}</div>\n      }\n    </div>\n    <div class=\"label\" [ngClass]=\"{float: showOptions=='expand' || getDisplayValue() || hasTypedValue()}\">{{ control().label }}\n      @if (isRequired()) {\n        <span>*</span>\n      }\n    </div>\n    <div class=\"arrow_box\" (click)=\"toggleOptionPanel()\"><div class=\"arrow\"></div></div>\n    @if (hasErrors()) {\n      <div class=\"error-messages\">\n        @for (errorMessage of getErrorMessage(); track errorMessage) {\n          <div class=\"error-message\">{{ errorMessage }}</div>\n        }\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}\n      @if (isRequired()) {\n        <span>*</span>\n      }\n    </div>\n    <div class=\"value\">{{ control().displayWith(control().formControl.value) }}</div>\n  }\n</div>","import { Component, effect, input, ElementRef, HostListener, ViewChild, AfterViewInit } from '@angular/core';\nimport { MultiSelectFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { trigger, state, style, transition, animate } from '@angular/animations';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-multi-select',\n  \n  templateUrl: `./lite-multi-select.html`,\n  styleUrls: [`../lite-styles.scss`],\n  animations: [\n    trigger('toggleView', [\n      state('collapse', style({ height: 0, opacity: 0 })),\n      state('expand', style({ height: '*', opacity: 1 })),\n      transition('collapse <=> expand', animate('300ms ease-in-out'))\n    ])\n  ]\n})\nexport class LiteMultiSelect implements AfterViewInit {\n  inEdit = input<boolean>(true);\n  control = input<MultiSelectFieldDto>({ \n    label: '', \n    formControl: new FormControl<any[]>([], { nonNullable: true }), \n    options: [], \n    displayWith: (option) => option \n  });\n  showOptions = 'collapse';\n  \n  // Separate input text for filtering from FormControl values\n  inputText = '';\n  isFocused = false;\n  \n  // Separate text for filtering options (different from display text)\n  private filterText = '';\n  \n  // Container height variable\n  containerHeight = '36px';\n  \n  @ViewChild('selectedItemsRef', { static: false }) selectedItemsRef?: ElementRef;\n  \n  readonly FormUtils = FormUtils;\n  \n  constructor(private _elementRef: ElementRef) {\n    effect(() => {\n      // Effect to react to FormControl value changes\n      // Selected items are now displayed inline, so no need to update inputText\n      const _values = this.control().formControl.value || [];\n      // Component will re-render automatically when values change\n    });\n    \n    // Subscribe to value changes to update container height\n    effect(() => {\n      const formControl = this.control().formControl;\n      if (formControl) {\n        formControl.valueChanges.subscribe(() => {\n          this.updateContainerHeight();\n        });\n      }\n    });\n  }\n\n  ngAfterViewInit(): void {\n    // ViewChild will be available after view init\n    // Set initial container height\n    this.updateContainerHeight();\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: MouseEvent): void {\n    if (this.showOptions === 'expand') {\n      const target = event.target as HTMLElement;\n      if (!this._elementRef.nativeElement.contains(target)) {\n        this.showOptions = 'collapse';\n        this.filterText = ''; // Clear filter when closing\n        // No need to update display text since selected items are shown inline\n      }\n    }\n  }\n\n  isRequired(): boolean {\n    return FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  optionToggled(option: any): void {\n    // Set flag to prevent dropdown from closing\n    const currentValues = this.control().formControl.value || [];\n    const isSelected = this.isOptionSelected(option);\n    let newValues: any[];\n    if (isSelected) {\n      // Remove option\n      newValues = currentValues.filter(value => \n        JSON.stringify(value) !== JSON.stringify(option)\n      );\n    } else {\n      // Add option\n      newValues = [...currentValues, option];\n    }\n    this.control().formControl.setValue(newValues);\n    // Height will be updated by valueChanges subscription\n  }\n\n  isOptionSelected(option: any): boolean {\n    const currentValues = this.control().formControl.value || [];\n    return currentValues.some(value => \n      JSON.stringify(value) === JSON.stringify(option)\n    );\n  }\n\n  onInputChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    this.inputText = target.value;\n    this.filterText = target.value;\n    // Input is used for filtering only - display is handled by selected items\n  }\n\n  onInputFocus(): void {\n    this.showOptions = 'expand';\n    this.isFocused = true;\n    this.inputText = '';\n    this.filterText = '';\n  }\n\n  onInputBlur(): void {\n    this.isFocused = false;\n  }\n\n  getDisplayValue(): string {\n    // Always return filter text for the input - selected items are shown separately\n    return this.filterText;\n  }\n\n  updateDisplayText(): void {\n    // No longer needed to update inputText since selected items are shown inline\n    // This method can be kept for compatibility but doesn't need to do anything\n  }\n\n  hasTypedValue(): boolean {\n    // Check if user is typing (for filtering)\n    if (!this.filterText.trim()) return false;\n    const values = this.control().formControl.value || [];\n    if (values.length === 0) return true;\n    if (values.length === 1) {\n      return this.filterText !== this.control().displayWith(values[0]);\n    }\n    return this.filterText !== `${values.length} items selected`;\n  }\n\n  getFilteredOptions(): any[] {\n    if (!this.filterText.trim()) {\n      return this.control().options;\n    }\n    return this.control().options.filter(option =>\n      this.control().displayWith(option).toLowerCase().includes(this.filterText.toLowerCase())\n    );\n  }\n\n  getSelectedCount(): number {\n    const values = this.control().formControl.value || [];\n    return values.length;\n  }\n\n  hasSelection(): boolean {\n    return this.getSelectedCount() > 0;\n  }\n\n  getSelectedItems(): any[] {\n    return this.control().formControl.value || [];\n  }\n\n  removeSelectedItem(item: any): void {\n    const currentValues = this.control().formControl.value || [];\n    const newValues = currentValues.filter(value => \n      JSON.stringify(value) !== JSON.stringify(item)\n    );\n    this.control().formControl.setValue(newValues);\n    // Height will be updated by valueChanges subscription\n  }\n\n  private updateContainerHeight(): void {\n    // Schedule height calculation for next tick to ensure DOM is updated\n    setTimeout(() => {\n      if (this.selectedItemsRef?.nativeElement) {\n        const naturalHeight = this.selectedItemsRef.nativeElement.getBoundingClientRect().height;\n        const baseHeight = 36;\n        const padding = 4;\n        this.containerHeight = `${Math.max(baseHeight, naturalHeight + padding)}px`;\n        console.log('Updated container height', this.containerHeight, naturalHeight);\n      } else if (!this.hasSelection()) {\n        this.containerHeight = '36px';\n      }\n    }, 0);\n  }\n  shouldFloat() {\n    return this.showOptions === 'expand' || this.hasSelection() || this.hasTypedValue();\n  }\n\n  shouldShowPlaceholder(): boolean {\n    // Show placeholder when filtering or when no items are selected\n    return (this.isFiltering() || !this.hasSelection()) && this.shouldFloat();\n  }\n\n  isFiltering(): boolean {\n    return !!this.filterText.trim();\n  }\n}\n","<div class=\"lite-multi-select\" [ngClass]=\"{'in-edit': inEdit()}\">\n  @if (inEdit()) {\n    <div class=\"input-container\" \n         [ngClass]=\"{'selected': hasSelection(), 'invalid': hasErrors()}\"\n         [style.height]=\"containerHeight\">\n      <!-- Selected items overlay on input -->\n      @if (hasSelection() && !isFiltering() && !isFocused) {\n        <div class=\"selected-items-inline\" #selectedItemsRef>\n          @for (item of getSelectedItems(); track item) {\n            <span class=\"selected-item-inline\">\n              {{ control().displayWith(item) }}\n              <button type=\"button\" class=\"remove-item-inline\" (click)=\"removeSelectedItem(item)\">&times;</button>\n            </span>\n          }\n        </div>\n      }\n      <input type=\"text\" [value]=\"getDisplayValue()\" (input)=\"onInputChange($event)\" \n             (focus)=\"onInputFocus()\" (blur)=\"onInputBlur()\"\n             [placeholder]=\"shouldShowPlaceholder() ? 'Type to filter options...' : ''\" \n             class=\"filter-input\" />\n    </div>\n    <div class=\"options\" [@toggleView]=\"showOptions\">\n      <!-- Options list -->\n      @for (option of getFilteredOptions(); track option) {\n        <div class=\"option multi-option\" \n             [ngClass]=\"{'selected': isOptionSelected(option)}\"\n             (click)=\"optionToggled(option)\">\n          <input type=\"checkbox\" [checked]=\"isOptionSelected(option)\" \n                 (click)=\"$event.stopPropagation(); optionToggled(option)\" readonly />\n          <span class=\"option-text\">{{ control().displayWith(option) }}</span>\n        </div>\n      }\n      @if (getFilteredOptions().length === 0) {\n        <div class=\"no-options\">No options found</div>\n      }\n    </div>\n    <div class=\"label\" [ngClass]=\"{float: shouldFloat()}\">\n      {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n    </div>\n    <div class=\"arrow_box\" (click)=\"showOptions = showOptions === 'expand' ? 'collapse' : 'expand'\">\n      <div class=\"arrow\"></div>\n    </div>\n    @if (hasErrors()) {\n      <div class=\"error-messages\">\n        @for (errorMessage of getErrorMessage(); track errorMessage) {\n          <div class=\"error-message\">{{ errorMessage }}</div>\n        }\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">\n      @for (item of getSelectedItems(); track item) {\n        <span class=\"item\">\n          {{ control().displayWith(item) }}\n        </span>\n      }\n    </div>\n  }\n</div>\n","import { Component, input } from '@angular/core';\nimport { RadioFieldDto } from '../field-dto';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-radio',\n  \n  templateUrl: './lite-radio.html',\n  styleUrls: ['../lite-styles.scss']\n})\nexport class LiteRadio {\n  inEdit = input<boolean>(true);\n  control = input<RadioFieldDto>({ \n    label: '', \n    formControl: new FormControl(''), \n    options: [], \n    displayWith: (option) => option \n  });\n  direction = input<'vertical' | 'horizontal'>('vertical');\n\n  readonly FormUtils = FormUtils;\n\n  isRequired(): boolean {\n    return FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  onRadioChange(value: any): void {\n    this.control().formControl.setValue(value);\n  }\n\n  isSelected(value: any): boolean {\n    return this.control().formControl.value === value;\n  }\n}\n","<div class=\"lite-radio\" [ngClass]=\"{'in-edit': inEdit()}\">\n  @if (inEdit()) {\n    <div class=\"radio-container\">\n      <div class=\"label\" [ngClass]=\"{'float': true}\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n      <div class=\"radio-options\" [ngClass]=\"{'horizontal': direction() === 'horizontal', 'vertical': direction() === 'vertical'}\">\n        @for (option of control().options; track option) {\n          <label class=\"radio-option\">\n            <input type=\"radio\" [value]=\"option\" [checked]=\"isSelected(option)\"\n              (change)=\"onRadioChange(option)\" [name]=\"control().label + '_radio'\" class=\"radio-input\" />\n            <span class=\"radio-label\">{{ control().displayWith(option) }}</span>\n          </label>\n        }\n      </div>\n    </div>\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">\n      @if (control().formControl.value) {\n        {{ control().displayWith(control().formControl.value) }}\n      } @else {\n        <span class=\"no-value\">Not selected</span>\n      }\n    </div>\n  }\n\n  @if (inEdit() && hasErrors()) {\n    <div class=\"error-messages\">\n      @for (error of getErrorMessage(); track error) {\n        <div class=\"error-message\">{{ error }}</div>\n      }\n    </div>\n  }\n</div>\n","import { Component, effect, input } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-checkbox',\n  \n  templateUrl: `./lite-checkbox.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteCheckbox {\n  inEdit = input<boolean>(true);\n  control = input<FieldDto>({ label: '', formControl: new FormControl<boolean>(false, { nonNullable: true }) });\n  \n  readonly FormUtils = FormUtils;\n\n  constructor() {\n    effect(() => {\n      // console.log('LiteCheckbox initialized with control:', this.control());\n    });\n  }\n\n  isRequired() {\n    return this.FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  onCheckboxChange(event: Event) {\n    const target = event.target as HTMLInputElement;\n    this.control().formControl.setValue(target.checked);\n    this.control().formControl.markAsDirty();\n    this.control().formControl.markAsTouched();\n  }\n}\n","<div class=\"lite-checkbox\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n  @if (inEdit()) {\n    <div class=\"checkbox-container\">\n      <label class=\"checkbox-label\">\n        <input type=\"checkbox\" \n               [checked]=\"control().formControl.value\" \n               (change)=\"onCheckboxChange($event)\"\n               class=\"checkbox-input\" />\n        <div class=\"checkbox-text\">{{ control().label }}<span *ngIf=\"isRequired()\" class=\"required\">*</span></div>\n\n      </label>\n    </div>\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">\n      @if (control().formControl.value) {\n        <span class=\"checked\">✓ Yes</span>\n      } @else {\n        <span class=\"unchecked\">✗ No</span>\n      }\n    </div>\n  }\n\n  @if (inEdit() && hasErrors()) {\n    <div class=\"error-messages\">\n      @for (error of getErrorMessage(); track error) {\n        <div class=\"error-message\">{{ error }}</div>\n      }\n    </div>\n  }\n</div>\n","import { Component, effect, input, signal, ElementRef, HostListener, computed } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { FieldDto } from '../field-dto';\n\ninterface CalendarDay {\n  date: Date;\n  day: number;\n  isOtherMonth: boolean;\n  isToday: boolean;\n  isSelected: boolean;\n  isRangeStart?: boolean;\n  isRangeEnd?: boolean;\n  isInRange?: boolean;\n}\n\nexport interface DateRangeFieldDto extends Omit<FieldDto, 'formControl'> {\n  formControl: FormControl<string[]>;\n}\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-date',\n  \n  templateUrl: `./lite-date.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteDate {\n  inEdit = input<boolean>(true);\n  control = input<FieldDto | DateRangeFieldDto>({ \n    label: '', \n    formControl: new FormControl<string>('', { nonNullable: true }),\n  });\n  format = input<string>('dd/MM/yyyy');\n  range = input<boolean>(false);\n  \n  // Calendar state\n  currentMonth = signal<Date>(new Date());\n  showCalendar = signal<boolean>(false);\n  calendarPosition = signal<'bottom' | 'top'>('bottom');\n  \n  // Signal to track form control value changes for reactivity\n  private formValueChangeSignal = signal<any>(null);\n  \n  // Second month for range selection\n  secondMonth = computed(() => {\n    const current = this.currentMonth();\n    return new Date(current.getFullYear(), current.getMonth() + 1, 1);\n  });\n  \n  // Computed calendar days - only recalculates when dependencies change\n  calendarDays = computed(() => {\n    // This makes the computed reactive to form value changes\n    this.formValueChangeSignal();\n    return this.getMonthDays(this.currentMonth());\n  });\n  \n  // Second month calendar days for range mode\n  secondCalendarDays = computed(() => {\n    // This makes the computed reactive to form value changes\n    this.formValueChangeSignal();\n    return this.range() ? this.getMonthDays(this.secondMonth()) : [];\n  });\n\n  private getMonthDays(monthDate: Date): CalendarDay[] {\n    const year = monthDate.getFullYear();\n    const month = monthDate.getMonth();\n    \n    // First day of the month\n    const firstDay = new Date(year, month, 1);\n    const lastDay = new Date(year, month + 1, 0);\n    \n    const days: CalendarDay[] = [];\n    const today = new Date();\n    const selectedValue = this.control().formControl.value;\n    \n    // Handle both single date and date range\n    let selectedDates: Date[] = [];\n    let rangeStart: Date | null = null;\n    let rangeEnd: Date | null = null;\n    \n    if (this.range()) {\n      // Range mode - value should be string[]\n      const rangeValue = selectedValue as string[];\n      if (rangeValue && rangeValue.length > 0) {\n        if (rangeValue[0]) {\n          const startDate = new Date(rangeValue[0]);\n          if (!isNaN(startDate.getTime())) {\n            selectedDates.push(startDate);\n            rangeStart = startDate;\n          }\n        }\n        if (rangeValue[1]) {\n          const endDate = new Date(rangeValue[1]);\n          if (!isNaN(endDate.getTime())) {\n            selectedDates.push(endDate);\n            rangeEnd = endDate;\n          }\n        }\n      }\n    } else {\n      // Single mode - value should be string\n      const singleValue = selectedValue as string;\n      if (singleValue) {\n        const date = new Date(singleValue);\n        if (!isNaN(date.getTime())) {\n          selectedDates.push(date);\n        }\n      }\n    }\n    \n    // Only add days from the current month\n    const previousMonth = new Date(firstDay);\n    while (previousMonth.getDay() !== 0) {\n      previousMonth.setDate(previousMonth.getDate() - 1);\n      days.unshift({\n        date: new Date(previousMonth),\n        day: previousMonth.getDate(),\n        isOtherMonth: true,\n        isToday: this.isSameDay(previousMonth, today),\n        isSelected: selectedDates.some(selectedDate => this.isSameDay(previousMonth, selectedDate)),\n      });\n    }\n    const currentDate = new Date(firstDay);\n    while (currentDate <= lastDay) {\n      const isToday = this.isSameDay(currentDate, today);\n      const isSelected = selectedDates.some(selectedDate => this.isSameDay(currentDate, selectedDate));\n      \n      // Range styling flags\n      const isRangeStart = rangeStart ? this.isSameDay(currentDate, rangeStart) : false;\n      const isRangeEnd = rangeEnd ? this.isSameDay(currentDate, rangeEnd) : false;\n      const isInRange = !!(rangeStart && rangeEnd && currentDate >= rangeStart && currentDate <= rangeEnd && !isRangeStart && !isRangeEnd);\n      \n      days.push({\n        date: new Date(currentDate),\n        day: currentDate.getDate(),\n        isOtherMonth: false,\n        isToday,\n        isSelected,\n        isRangeStart,\n        isRangeEnd,\n        isInRange\n      });\n      currentDate.setDate(currentDate.getDate() + 1);\n    }\n    const nextMonthDate = new Date(lastDay);\n    while (nextMonthDate.getDay() < 6) {\n      nextMonthDate.setDate(nextMonthDate.getDate() + 1);\n      days.push({\n        date: new Date(nextMonthDate),\n        day: nextMonthDate.getDate(),\n        isOtherMonth: true,\n        isToday: this.isSameDay(nextMonthDate, today),\n        isSelected: selectedDates.some(selectedDate => this.isSameDay(nextMonthDate, selectedDate)),\n      });\n    }\n    return days;\n  }\n  \n  readonly FormUtils = FormUtils;\n\n  constructor(private _elementRef: ElementRef) {\n    effect(() => {\n      const control = this.control();\n      // console.log('LiteDate initialized with control:', control);\n      \n      // Subscribe to form control value changes to trigger reactivity\n      if (control && control.formControl) {\n        const _subscription = control.formControl.valueChanges.subscribe(value => {\n          console.log('Form value changed:', value);\n          this.formValueChangeSignal.set(Date.now()); // Use timestamp to ensure change detection\n        });\n        \n        // Initial trigger\n        this.formValueChangeSignal.set(Date.now());\n      }\n    });\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: Event): void {\n    if (!this._elementRef.nativeElement.contains(event.target as Node)) {\n      this.showCalendar.set(false);\n    }\n  }\n\n  isRequired() {\n    return this.FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  onDateChange(event: Event) {\n    const target = event.target as HTMLInputElement;\n    const inputValue = target.value;\n    \n    if (!inputValue) {\n      if (this.range()) {\n        const newValue = ['', ''];\n        (this.control().formControl as FormControl<string[]>).setValue(newValue);\n        this.formValueChangeSignal.set(Date.now());\n      } else {\n        (this.control().formControl as FormControl<string>).setValue('');\n        this.formValueChangeSignal.set(Date.now());\n      }\n      this.control().formControl.markAsDirty();\n      this.control().formControl.markAsTouched();\n      return;\n    }\n    \n    if (this.range()) {\n      // Range mode - check if input contains \" - \" separator\n      if (inputValue.includes(' - ')) {\n        const rangeParts = inputValue.split(' - ');\n        if (rangeParts.length === 2) {\n          const startDateParsed = this.parseFormattedDate(rangeParts[0].trim(), this.format());\n          const endDateParsed = this.parseFormattedDate(rangeParts[1].trim(), this.format());\n          \n          if (startDateParsed && endDateParsed) {\n            // Store as ISO date strings for consistency\n            const startIso = this.toLocalISOString(startDateParsed);\n            const endIso = this.toLocalISOString(endDateParsed);\n            \n            // Ensure start date is before end date\n            let newValue: string[];\n            if (startDateParsed <= endDateParsed) {\n              newValue = [startIso, endIso];\n            } else {\n              newValue = [endIso, startIso];\n            }\n            (this.control().formControl as FormControl<string[]>).setValue(newValue);\n            this.formValueChangeSignal.set(Date.now());\n          } else {\n            // If parsing fails, store the raw input values\n            const newValue = [rangeParts[0].trim(), rangeParts[1].trim()];\n            (this.control().formControl as FormControl<string[]>).setValue(newValue);\n            this.formValueChangeSignal.set(Date.now());\n          }\n        } else {\n          // Invalid range format, store as single date\n          const parsedDate = this.parseFormattedDate(inputValue, this.format());\n          let newValue: string[];\n          if (parsedDate) {\n            const isoString = this.toLocalISOString(parsedDate);\n            newValue = [isoString, ''];\n          } else {\n            newValue = [inputValue, ''];\n          }\n          (this.control().formControl as FormControl<string[]>).setValue(newValue);\n          this.formValueChangeSignal.set(Date.now());\n        }\n      } else {\n        // Single date input in range mode\n        const parsedDate = this.parseFormattedDate(inputValue, this.format());\n        let newValue: string[];\n        if (parsedDate) {\n          const isoString = this.toLocalISOString(parsedDate);\n          newValue = [isoString, ''];\n        } else {\n          newValue = [inputValue, ''];\n        }\n        (this.control().formControl as FormControl<string[]>).setValue(newValue);\n        this.formValueChangeSignal.set(Date.now());\n      }\n    } else {\n      // Single mode - try to parse the formatted date input\n      const parsedDate = this.parseFormattedDate(inputValue, this.format());\n      let newValue: string;\n      if (parsedDate) {\n        // Store as ISO date string for consistency\n        newValue = this.toLocalISOString(parsedDate);\n      } else {\n        // If parsing fails, store the raw input value\n        newValue = inputValue;\n      }\n      (this.control().formControl as FormControl<string>).setValue(newValue);\n      this.formValueChangeSignal.set(Date.now());\n    }\n    \n    this.control().formControl.markAsDirty();\n    this.control().formControl.markAsTouched();\n  }\n\n  private parseFormattedDate(dateString: string, format: string): Date | null {\n    try {\n      // Create a regex pattern from the format\n      let pattern = format\n        .replace('dd', '(\\\\d{1,2})')\n        .replace('MM', '(\\\\d{1,2})')\n        .replace('yyyy', '(\\\\d{4})');\n      \n      const regex = new RegExp(`^${pattern}$`);\n      const match = dateString.match(regex);\n      \n      if (!match) return null;\n      \n      // Extract parts based on format\n      let day: number, month: number, year: number;\n      \n      if (format === 'dd/MM/yyyy') {\n        day = parseInt(match[1], 10);\n        month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n        year = parseInt(match[3], 10);\n      } else if (format === 'MM/dd/yyyy') {\n        month = parseInt(match[1], 10) - 1; // Month is 0-indexed\n        day = parseInt(match[2], 10);\n        year = parseInt(match[3], 10);\n      } else if (format === 'yyyy-MM-dd') {\n        year = parseInt(match[1], 10);\n        month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n        day = parseInt(match[3], 10);\n      } else {\n        // Default to dd/MM/yyyy\n        day = parseInt(match[1], 10);\n        month = parseInt(match[2], 10) - 1;\n        year = parseInt(match[3], 10);\n      }\n      \n      const date = new Date(year, month, day);\n      \n      // Validate the date\n      if (date.getFullYear() === year && \n          date.getMonth() === month && \n          date.getDate() === day) {\n        return date;\n      }\n      \n      return null;\n    } catch {\n      return null;\n    }\n  }\n\n  getFormattedValue(): string {\n    const value = this.control().formControl.value;\n    if (!value) return '';\n    \n    if (this.range()) {\n      // Range mode - value is string[]\n      const rangeValue = value as string[];\n      if (rangeValue && rangeValue.length >= 2) {\n        const dates = [];\n        if (rangeValue[0]) {\n          const startDate = new Date(rangeValue[0]);\n          if (!isNaN(startDate.getTime())) {\n            dates.push(this.formatDate(startDate, this.format()));\n          }\n        }\n        if (rangeValue[1]) {\n          const endDate = new Date(rangeValue[1]);\n          if (!isNaN(endDate.getTime())) {\n            dates.push(this.formatDate(endDate, this.format()));\n          }\n        }\n        if (dates.length === 2) {\n          return `${dates[0]} - ${dates[1]}`;\n        } else if (dates.length === 1) {\n          return dates[0];\n        }\n      }\n      return '';\n    } else {\n      // Single mode - value is string\n      const singleValue = value as string;\n      if (singleValue) {\n        const date = new Date(singleValue);\n        if (!isNaN(date.getTime())) {\n          return this.formatDate(date, this.format());\n        }\n        return singleValue; // Return original value if invalid date\n      }\n      return '';\n    }\n  }\n\n  getDisplayValue(): string {\n    const value = this.control().formControl.value;\n    if (!value) return 'Not selected';\n    \n    if (this.range()) {\n      // Range mode - value is string[]\n      const rangeValue = value as string[];\n      if (rangeValue && rangeValue.length >= 2) {\n        const dates = [];\n        if (rangeValue[0]) {\n          const startDate = new Date(rangeValue[0]);\n          if (!isNaN(startDate.getTime())) {\n            dates.push(this.formatDate(startDate, this.format()));\n          }\n        }\n        if (rangeValue[1]) {\n          const endDate = new Date(rangeValue[1]);\n          if (!isNaN(endDate.getTime())) {\n            dates.push(this.formatDate(endDate, this.format()));\n          }\n        }\n        if (dates.length === 2) {\n          return `${dates[0]} - ${dates[1]}`;\n        } else if (dates.length === 1) {\n          return dates[0];\n        }\n      }\n      return 'Not selected';\n    } else {\n      // Single mode - value is string\n      const singleValue = value as string;\n      if (singleValue) {\n        const date = new Date(singleValue);\n        if (!isNaN(date.getTime())) {\n          return this.formatDate(date, this.format());\n        }\n        return singleValue;\n      }\n      return 'Not selected';\n    }\n  }\n\n  private formatDate(date: Date, format: string): string {\n    const day = date.getDate().toString().padStart(2, '0');\n    const month = (date.getMonth() + 1).toString().padStart(2, '0');\n    const year = date.getFullYear().toString();\n    \n    return format\n      .replace('dd', day)\n      .replace('MM', month)\n      .replace('yyyy', year);\n  }\n\n  // Calendar methods\n  toggleCalendar(): void {\n    if (!this.showCalendar()) {\n      this.calculateCalendarPosition();\n      this.setCalendarToSelectedDate();\n    }\n    this.showCalendar.set(!this.showCalendar());\n  }\n\n  private setCalendarToSelectedDate(): void {\n    const selectedValue = this.control().formControl.value;\n    if (selectedValue) {\n      let selectedDate: Date | null = null;\n      \n      if (this.range()) {\n        // Range mode - use first date if available\n        const rangeValue = selectedValue as string[];\n        if (rangeValue && rangeValue.length > 0 && rangeValue[0]) {\n          selectedDate = new Date(rangeValue[0]);\n        }\n      } else {\n        // Single mode\n        const singleValue = selectedValue as string;\n        if (singleValue) {\n          selectedDate = new Date(singleValue);\n        }\n      }\n      \n      if (selectedDate && !isNaN(selectedDate.getTime())) {\n        // Set calendar to show the month of the selected date\n        const selectedMonth = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\n        this.currentMonth.set(selectedMonth);\n      }\n    }\n  }\n\n  private calculateCalendarPosition(): void {\n    const element = this._elementRef.nativeElement;\n    const rect = element.getBoundingClientRect();\n    const calendarHeight = 300; // Approximate height of calendar panel\n    const spaceBelow = window.innerHeight - rect.bottom;\n    const spaceAbove = rect.top;\n    \n    // If not enough space below and more space above, position on top\n    if (spaceBelow < calendarHeight && spaceAbove > spaceBelow) {\n      this.calendarPosition.set('top');\n    } else {\n      this.calendarPosition.set('bottom');\n    }\n  }\n\n  getMonthYearDisplay(): string {\n    const date = this.currentMonth();\n    return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n  }\n\n  getSecondMonthYearDisplay(): string {\n    const date = this.secondMonth();\n    return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n  }\n\n  previousMonth(): void {\n    const current = this.currentMonth();\n    const newDate = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n    this.currentMonth.set(newDate);\n  }\n\n  nextMonth(): void {\n    const current = this.currentMonth();\n    const newDate = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n    this.currentMonth.set(newDate);\n  }\n\n  selectDate(day: CalendarDay): void {\n    const dateString = this.toLocalISOString(day.date);\n    \n    if (this.range()) {\n      // Range mode - handle start and end date selection\n      const currentValue = this.control().formControl.value as string[];\n      const currentRange = currentValue || ['', ''];\n      \n      if (!currentRange[0] || (currentRange[0] && currentRange[1])) {\n        // Set start date if no start date or both dates are set (reset)\n        // Clear any existing range formatting by setting only the start date\n        const newValue = [dateString, ''];\n        (this.control().formControl as FormControl<string[]>).setValue(newValue);\n        this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n      } else {\n        // Set end date\n        const startDate = new Date(currentRange[0]);\n        const endDate = new Date(dateString);\n        \n        // Check if clicking the same date as start date\n        if (this.isSameDay(startDate, endDate)) {\n          // Reset to just the start date\n          const newValue = [dateString, ''];\n          (this.control().formControl as FormControl<string[]>).setValue(newValue);\n          this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n        } else {\n          // Ensure start date is before end date\n          let newValue: string[];\n          if (startDate <= endDate) {\n            newValue = [currentRange[0], dateString];\n          } else {\n            newValue = [dateString, currentRange[0]];\n          }\n          (this.control().formControl as FormControl<string[]>).setValue(newValue);\n          this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n          \n          // Auto-hide calendar after 1 second when second date is selected\n          setTimeout(() => {\n            this.showCalendar.set(false);\n          }, 1000);\n        }\n      }\n    } else {\n      // Single mode\n      (this.control().formControl as FormControl<string>).setValue(dateString);\n      this.formValueChangeSignal.set(Date.now()); // Trigger immediate update\n      this.showCalendar.set(false); // Close calendar after selection\n    }\n    \n    this.control().formControl.markAsDirty();\n    this.control().formControl.markAsTouched();\n  }\n\n  private isSameDay(date1: Date, date2: Date): boolean {\n    return date1.getFullYear() === date2.getFullYear() &&\n           date1.getMonth() === date2.getMonth() &&\n           date1.getDate() === date2.getDate();\n  }\n\n  // Helper method to convert Date to ISO date string without timezone conversion\n  private toLocalISOString(date: Date): string {\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\n}\n","<div class=\"lite-date\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n  @if (inEdit()) {\n    <input type=\"text\" \n            [value]=\"getFormattedValue()\" \n            (change)=\"onDateChange($event)\"\n            [class.invalid]=\"hasErrors()\"\n            [placeholder]=\"range() ? format() + ' - ' + format() : format()\" />\n    <label class=\"label\" [ngClass]=\"{'float': getFormattedValue()}\">\n      {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n    </label>\n    <div class=\"calendar_icon\" (click)=\"toggleCalendar()\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"calendar\" viewBox=\"0 0 16 16\">\n        <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1.5A1.5 1.5 0 0 1 16 2.5v11A1.5 1.5 0 0 1 14.5 15H1.5A1.5 1.5 0 0 1 0 13.5v-11A1.5 1.5 0 0 1 1.5 1H3V.5a.5.5 0 0 1 .5-.5zM1.5 2a.5.5 0 0 0-.5.5V4h14V2.5a.5.5 0 0 0-.5-.5H13v.5a.5.5 0 0 1-1 0V2H4v.5a.5.5 0 0 1-1 0V2H1.5zM15 5H1v8.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5V5z\"/>\n      </svg>\n    </div>\n    \n    @if (showCalendar()) {\n      <div class=\"calendar-overlay\" [ngClass]=\"'position-' + calendarPosition()\">\n        <ng-container *ngTemplateOutlet=\"calendarPanel\"></ng-container>\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">\n      {{ getDisplayValue() }}\n    </div>\n  }\n\n  @if (inEdit() && hasErrors()) {\n    <div class=\"error-messages\">\n      @for (error of getErrorMessage(); track error) {\n        <div class=\"error-message\">{{ error }}</div>\n      }\n    </div>\n  }\n</div>\n<ng-template #calendarPanel>\n  <div class=\"calendar-panel\" [ngClass]=\"{'range-mode': range()}\">\n    @if (range()) {\n      <!-- Range mode: Two month calendars side by side -->\n      <div class=\"dual-calendar\">\n        <!-- First month -->\n        <div class=\"calendar-month\">\n          <div class=\"calendar-header\">\n            <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n            <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n            <div class=\"nav-spacer\"></div>\n          </div>\n          <div class=\"calendar-grid\">\n            <div class=\"weekdays\">\n              <div class=\"weekday\">Su</div>\n              <div class=\"weekday\">Mo</div>\n              <div class=\"weekday\">Tu</div>\n              <div class=\"weekday\">We</div>\n              <div class=\"weekday\">Th</div>\n              <div class=\"weekday\">Fr</div>\n              <div class=\"weekday\">Sa</div>\n            </div>\n            <div class=\"calendar-days\">\n              @for (day of calendarDays(); track day.date) {\n                <div class=\"calendar-day\" [ngClass]=\"{ \n                  'today': day.isToday, \n                  'selected': day.isSelected,\n                  'dim': day.isOtherMonth,\n                  'range-start': day.isRangeStart,\n                  'range-end': day.isRangeEnd,\n                  'in-range': day.isInRange\n                }\" (click)=\"selectDate(day)\">\n                  {{ day.day }}\n                </div>\n              }\n            </div>\n          </div>\n        </div>\n        \n        <!-- Second month -->\n        <div class=\"calendar-month\">\n          <div class=\"calendar-header\">\n            <div class=\"nav-spacer\"></div>\n            <span class=\"month-year\">{{ getSecondMonthYearDisplay() }}</span>\n            <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n          </div>\n          <div class=\"calendar-grid\">\n            <div class=\"weekdays\">\n              <div class=\"weekday\">Su</div>\n              <div class=\"weekday\">Mo</div>\n              <div class=\"weekday\">Tu</div>\n              <div class=\"weekday\">We</div>\n              <div class=\"weekday\">Th</div>\n              <div class=\"weekday\">Fr</div>\n              <div class=\"weekday\">Sa</div>\n            </div>\n            <div class=\"calendar-days\">\n              @for (day of secondCalendarDays(); track day.date) {\n                <div class=\"calendar-day\" [ngClass]=\"{ \n                  'today': day.isToday, \n                  'selected': day.isSelected,\n                  'dim': day.isOtherMonth,\n                  'range-start': day.isRangeStart,\n                  'range-end': day.isRangeEnd,\n                  'in-range': day.isInRange\n                }\" (click)=\"selectDate(day)\">\n                  {{ day.day }}\n                </div>\n              }\n            </div>\n          </div>\n        </div>\n      </div>\n    } @else {\n      <!-- Single month mode -->\n      <div class=\"calendar-header\">\n        <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n        <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n        <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n      </div>\n      <div class=\"calendar-grid\">\n        <div class=\"weekdays\">\n          <div class=\"weekday\">Su</div>\n          <div class=\"weekday\">Mo</div>\n          <div class=\"weekday\">Tu</div>\n          <div class=\"weekday\">We</div>\n          <div class=\"weekday\">Th</div>\n          <div class=\"weekday\">Fr</div>\n          <div class=\"weekday\">Sa</div>\n        </div>\n        <div class=\"calendar-days\">\n          @for (day of calendarDays(); track day.date) {\n            <div class=\"calendar-day\" [ngClass]=\"{ \n              'today': day.isToday, \n              'selected': day.isSelected,\n              'dim': day.isOtherMonth,\n              'range-start': day.isRangeStart,\n              'range-end': day.isRangeEnd,\n              'in-range': day.isInRange\n            }\" (click)=\"selectDate(day)\">\n              {{ day.day }}\n            </div>\n          }\n        </div>\n      </div>\n    }\n  </div>\n</ng-template>\n","import { Component, effect, input, signal, ElementRef, HostListener, computed } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { FieldDto } from '../field-dto';\n\ninterface CalendarDateTime {\n  date: Date;\n  day: number;\n  isOtherMonth: boolean;\n  isToday: boolean;\n  isSelected: boolean;\n}\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-datetime',\n  \n  templateUrl: `./lite-datetime.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteDateTime {\n  inEdit = input<boolean>(true);\n  control = input<FieldDto>({ \n    label: '', \n    formControl: new FormControl<string>('', { nonNullable: true }),\n  });\n  format = input<string>('dd/MM/yyyy HH:mm');\n  \n  // Calendar state\n  currentMonth = signal<Date>(new Date());\n  showCalendar = signal<boolean>(false);\n  calendarPosition = signal<'bottom' | 'top'>('bottom');\n  formattedValue = signal<string>('');\n  hourSet = new Array(24).fill(0).map((_, i) => i);\n  minSet = new Array(12).fill(0).map((_, i) => i * 5);\n  selectedHour = new Date().getHours();\n  selectedMinute = 0;\n  selectedDateTime: CalendarDateTime | null = null;\n  // Signal to track selection changes for reactivity\n  private selectionChangeSignal = signal<number>(0);\n  \n  // Computed calendar days - only recalculates when dependencies change\n  calendarDays = computed(() => {\n    // This makes the computed reactive to selection changes\n    this.selectionChangeSignal();\n    return this.getMonthDays(this.currentMonth());\n  });\n\n  private getMonthDays(monthDate: Date): CalendarDateTime[] {\n    const year = monthDate.getFullYear();\n    const month = monthDate.getMonth();\n    \n    // First day of the month\n    const firstDay = new Date(year, month, 1);\n    const lastDay = new Date(year, month + 1, 0);\n    \n    const days: CalendarDateTime[] = [];\n    const today = new Date();\n    const value = this.control().formControl.value;\n\n    // Single mode - value should be string\n    if (value) {\n      const date = new Date(value);\n      if (!isNaN(date.getTime())) {\n        this.selectedDateTime = {\n          date,\n          day: date.getDate(),\n          isOtherMonth: false,\n          isToday: this.isSameDay(date, today),\n          isSelected: true,\n        };\n      }\n    }\n    \n    // Only add days from the current month\n    const previousMonthDate = new Date(firstDay);\n    while (previousMonthDate.getDay() !== 0) {\n      previousMonthDate.setDate(previousMonthDate.getDate() - 1);\n      days.unshift({\n        date: new Date(previousMonthDate),\n        day: previousMonthDate.getDate(),\n        isOtherMonth: true,\n        isToday: this.isSameDay(previousMonthDate, today),\n        isSelected: this.isSameDay(previousMonthDate, this.selectedDateTime ? this.selectedDateTime.date : null),\n      });\n    }\n    const currentDate = new Date(firstDay);\n    while (currentDate <= lastDay) {\n      const isToday = this.isSameDay(currentDate, today);\n      const isSelected = this.isSameDay(currentDate, this.selectedDateTime ? this.selectedDateTime.date : null);\n      days.push({\n        date: new Date(currentDate),\n        day: currentDate.getDate(),\n        isOtherMonth: false,\n        isToday,\n        isSelected,\n      });\n      currentDate.setDate(currentDate.getDate() + 1);\n    }\n    const nextMonthDate = new Date(lastDay);\n    while (nextMonthDate.getDay() < 6) {\n      nextMonthDate.setDate(nextMonthDate.getDate() + 1);\n      days.push({\n        date: new Date(nextMonthDate),\n        day: nextMonthDate.getDate(),\n        isOtherMonth: true,\n        isToday: this.isSameDay(nextMonthDate, today),\n        isSelected: this.isSameDay(nextMonthDate, this.selectedDateTime ? this.selectedDateTime.date : null),\n      });\n    }\n    return days;\n  }\n  \n  readonly FormUtils = FormUtils;\n\n  constructor(private _elementRef: ElementRef) {\n    effect(() => {\n      const control = this.control();\n      // console.log('LiteDateTime with control:', control);\n      \n      // Subscribe to form control value changes to trigger reactivity\n      if (control && control.formControl) {\n        control.formControl.valueChanges.subscribe(value => {\n          if (value) {\n            const date = new Date(value);\n            // console.log('Form value changed:', value, date, isNaN(date.getTime()));\n            if (!isNaN(date.getTime())) {\n              // console.log('Formatted Date:', this.formatDate(date, this.format()))\n              this.formattedValue.set(this.formatDate(date, this.format()));\n            } else {\n              this.formattedValue.set(value);\n            }\n          }\n        });\n      }\n    });\n  }\n\n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: Event): void {\n    if (!this._elementRef.nativeElement.contains(event.target as Node)) {\n      this.showCalendar.set(false);\n    }\n  }\n\n  isRequired() {\n    return this.FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  onDateChange(event: Event) {\n    const target = event.target as HTMLInputElement;\n    const inputValue = target.value;\n    \n    if (!inputValue) {\n      (this.control().formControl as FormControl<string>).setValue('');\n      // this.formValueChangeSignal.set(Date.now());\n      this.control().formControl.markAsDirty();\n      this.control().formControl.markAsTouched();\n      return;\n    }\n    \n\n    // Single mode - try to parse the formatted date input\n    const parsedDate = this.parseFormattedDate(inputValue, this.format());\n    let newValue: string;\n    if (parsedDate) {\n      // Store as ISO date string for consistency\n      newValue = this.toLocalISOString(parsedDate);\n    } else {\n      // If parsing fails, store the raw input value\n      newValue = inputValue;\n    }\n    (this.control().formControl as FormControl<string>).setValue(newValue);\n    // this.formValueChangeSignal.set(Date.now());\n  \n    this.control().formControl.markAsDirty();\n    this.control().formControl.markAsTouched();\n  }\n  onSelectHour(hour: number) {\n    this.selectedHour = hour;\n    this.setDateTimeSelected(this.selectedDateTime ? this.selectedDateTime.date : new Date());\n  }\n  onSelectMinute(minute: number) {\n    this.selectedMinute = minute;\n    this.setDateTimeSelected(this.selectedDateTime ? this.selectedDateTime.date : new Date());\n  }\n  private setDateTimeSelected(date: Date): void {\n    this.selectedDateTime = {\n      date,\n      day: date.getDate(),\n      isOtherMonth: false,\n      isToday: date.getDate() === new Date().getDate(),\n      isSelected: true,\n    };\n    const dateString = this.toLocalISOString(this.selectedDateTime.date);\n    (this.control().formControl as FormControl<string>).setValue(dateString);\n  }\n  private parseFormattedDate(dateString: string, format: string): Date | null {\n    try {\n      // Create a regex pattern from the format\n      let pattern = format\n        .replace('dd', '(\\\\d{1,2})')\n        .replace('MM', '(\\\\d{1,2})')\n        .replace('yyyy', '(\\\\d{4})');\n      \n      const regex = new RegExp(`^${pattern}$`);\n      const match = dateString.match(regex);\n      \n      if (!match) return null;\n      \n      // Extract parts based on format\n      let day: number, month: number, year: number;\n      \n      if (format === 'dd/MM/yyyy') {\n        day = parseInt(match[1], 10);\n        month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n        year = parseInt(match[3], 10);\n      } else if (format === 'MM/dd/yyyy') {\n        month = parseInt(match[1], 10) - 1; // Month is 0-indexed\n        day = parseInt(match[2], 10);\n        year = parseInt(match[3], 10);\n      } else if (format === 'yyyy-MM-dd') {\n        year = parseInt(match[1], 10);\n        month = parseInt(match[2], 10) - 1; // Month is 0-indexed\n        day = parseInt(match[3], 10);\n      } else {\n        // Default to dd/MM/yyyy\n        day = parseInt(match[1], 10);\n        month = parseInt(match[2], 10) - 1;\n        year = parseInt(match[3], 10);\n      }\n      \n      const date = new Date(year, month, day);\n      \n      // Validate the date\n      if (date.getFullYear() === year && \n          date.getMonth() === month && \n          date.getDate() === day) {\n        return date;\n      }\n      \n      return null;\n    } catch {\n      return null;\n    }\n  }\n  getDisplayValue(): string {\n    const value = this.control().formControl.value;\n    if (!value) return 'Not selected';\n\n    // Single mode - value is string\n    const singleValue = value as string;\n    if (singleValue) {\n      const date = new Date(singleValue);\n      if (!isNaN(date.getTime())) {\n        return this.formatDate(date, this.format());\n      }\n      return singleValue;\n    }\n    return 'Not selected';\n  }\n\n  private formatDate(date: Date, format: string): string {\n    const day = date.getDate().toString().padStart(2, '0');\n    const month = (date.getMonth() + 1).toString().padStart(2, '0');\n    const year = date.getFullYear().toString();\n    \n    return format\n      .replace('dd', day)\n      .replace('MM', month)\n      .replace('yyyy', year)\n      .replace('HH', (this.selectedHour < 10 ? '0' : '') + this.selectedHour)\n      .replace('mm', (this.selectedMinute < 10 ? '0' : '') + this.selectedMinute);\n  }\n\n  // Calendar methods\n  toggleCalendar(): void {\n    if (!this.showCalendar()) {\n      this.calculateCalendarPosition();\n      this.setCalendarToSelectedDate();\n    }\n    this.showCalendar.set(!this.showCalendar());\n  }\n\n  closeCalendar(): void {\n    this.showCalendar.set(false);\n  }\n\n  private setCalendarToSelectedDate(): void {\n    const selectedValue = this.control().formControl.value;\n    if (selectedValue) {\n      let selectedDate: Date | null = null;\n\n      // Single mode\n      const singleValue = selectedValue as string;\n      if (singleValue) {\n        selectedDate = new Date(singleValue);\n      }\n      \n      if (selectedDate && !isNaN(selectedDate.getTime())) {\n        // Set calendar to show the month of the selected date\n        const selectedMonth = new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1);\n        this.currentMonth.set(selectedMonth);\n      }\n    }\n  }\n\n  private calculateCalendarPosition(): void {\n    const element = this._elementRef.nativeElement;\n    const rect = element.getBoundingClientRect();\n    const calendarHeight = 300; // Approximate height of calendar panel\n    const spaceBelow = window.innerHeight - rect.bottom;\n    const spaceAbove = rect.top;\n    \n    // If not enough space below and more space above, position on top\n    if (spaceBelow < calendarHeight && spaceAbove > spaceBelow) {\n      this.calendarPosition.set('top');\n    } else {\n      this.calendarPosition.set('bottom');\n    }\n  }\n\n  getMonthYearDisplay(): string {\n    const date = this.currentMonth();\n    return date.toLocaleDateString('en-US', { month: 'long', year: 'numeric' });\n  }\n\n  previousMonth(): void {\n    const current = this.currentMonth();\n    const newDate = new Date(current.getFullYear(), current.getMonth() - 1, 1);\n    this.currentMonth.set(newDate);\n  }\n\n  nextMonth(): void {\n    const current = this.currentMonth();\n    const newDate = new Date(current.getFullYear(), current.getMonth() + 1, 1);\n    this.currentMonth.set(newDate);\n  }\n\n  selectDate(day: CalendarDateTime): void {\n    // Clear previous selection\n    if (this.selectedDateTime) {\n      this.selectedDateTime.isSelected = false;\n    }\n    \n    // Set new selection\n    this.setDateTimeSelected(day.date);\n    \n    // Trigger calendar re-render to clear previous visual selection\n    this.selectionChangeSignal.update(v => v + 1);\n    \n    this.control().formControl.markAsDirty();\n    this.control().formControl.markAsTouched();\n  }\n\n  private isSameDay(date1: Date, date2: Date | null): boolean {\n    if (!date2) return false;\n    return date1.getFullYear() === date2.getFullYear() &&\n           date1.getMonth() === date2.getMonth() &&\n           date1.getDate() === date2.getDate();\n  }\n\n  // Helper method to convert Date to ISO date string without timezone conversion\n  private toLocalISOString(date: Date): string {\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    const hh = (this.selectedHour < 10 ? '0' : '') + this.selectedHour;\n    const mm = (this.selectedMinute < 10 ? '0' : '') + this.selectedMinute;\n    return `${year}-${month}-${day}T${hh}:${mm}:00`;\n  }\n\n}\n","<div class=\"lite-date\" [ngClass]=\"{'in-edit': inEdit(), 'invalid': hasErrors()}\">\n  @if (inEdit()) {\n    <input type=\"text\" \n            [value]=\"formattedValue()\" \n            (change)=\"onDateChange($event)\"\n            [class.invalid]=\"hasErrors()\"\n            [placeholder]=\"format()\" />\n    <label class=\"label\" [ngClass]=\"{'float': formattedValue()}\">\n      {{ control().label }}<span *ngIf=\"isRequired()\">*</span>\n    </label>\n    <div class=\"calendar_icon\" (click)=\"toggleCalendar()\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"calendar\" viewBox=\"0 0 16 16\">\n        <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1.5A1.5 1.5 0 0 1 16 2.5v11A1.5 1.5 0 0 1 14.5 15H1.5A1.5 1.5 0 0 1 0 13.5v-11A1.5 1.5 0 0 1 1.5 1H3V.5a.5.5 0 0 1 .5-.5zM1.5 2a.5.5 0 0 0-.5.5V4h14V2.5a.5.5 0 0 0-.5-.5H13v.5a.5.5 0 0 1-1 0V2H4v.5a.5.5 0 0 1-1 0V2H1.5zM15 5H1v8.5a.5.5 0 0 0 .5.5h13a.5.5 0 0 0 .5-.5V5z\"/>\n      </svg>\n    </div>\n    \n    @if (showCalendar()) {\n      <div class=\"calendar-overlay\" [ngClass]=\"'position-' + calendarPosition()\">\n        <ng-container *ngTemplateOutlet=\"calendarPanel\"></ng-container>\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">\n      {{ getDisplayValue() }}\n    </div>\n  }\n\n  @if (inEdit() && hasErrors()) {\n    <div class=\"error-messages\">\n      @for (error of getErrorMessage(); track error) {\n        <div class=\"error-message\">{{ error }}</div>\n      }\n    </div>\n  }\n</div>\n<ng-template #calendarPanel>\n  <div class=\"calendar-panel datetime\">\n    <div class=\"date-panel\">\n      <div class=\"calendar-header\">\n        <button type=\"button\" class=\"nav-button\" (click)=\"previousMonth()\">‹</button>\n        <span class=\"month-year\">{{ getMonthYearDisplay() }}</span>\n        <button type=\"button\" class=\"nav-button\" (click)=\"nextMonth()\">›</button>\n      </div>\n      <div class=\"calendar-grid\">\n        <div class=\"weekdays\">\n          <div class=\"weekday\">Su</div>\n          <div class=\"weekday\">Mo</div>\n          <div class=\"weekday\">Tu</div>\n          <div class=\"weekday\">We</div>\n          <div class=\"weekday\">Th</div>\n          <div class=\"weekday\">Fr</div>\n          <div class=\"weekday\">Sa</div>\n        </div>\n        <div class=\"calendar-days\">\n          @for (day of calendarDays(); track day.date) {\n            <div class=\"calendar-day\" [ngClass]=\"{'today': day.isToday, 'selected': day.isSelected, 'dim': day.isOtherMonth}\" (click)=\"selectDate(day)\">\n              {{ day.day }}\n            </div>\n          }\n        </div>\n      </div>\n    </div>\n    <div class=\"time-panel\">\n      <div class=\"control-header\">\n        <button type=\"button\" class=\"close-button\" (click)=\"closeCalendar()\" aria-label=\"Close\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\">\n            <path d=\"M2.146 2.146a.5.5 0 0 1 .708 0L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854a.5.5 0 0 1 0-.708z\"/>\n          </svg>\n        </button>\n      </div>\n      <div class=\"time-header\">HOURS</div>\n      <div class=\"hh-grid\">\n          @for (hh of hourSet; track hh) {\n            <div class=\"hh-slot\" [ngClass]=\"{'selected': selectedHour === hh}\" (click)=\"onSelectHour(hh)\">\n                {{ hh < 10 ? '0' + hh : hh }}\n            </div>\n          }\n      </div>\n      <div class=\"time-header\">MINUTES</div>\n      <div class=\"hh-grid\">\n          @for (mm of minSet; track mm) {\n            <div class=\"hh-slot\" [ngClass]=\"{'selected': selectedMinute === mm}\" (click)=\"onSelectMinute(mm)\">\n                {{ mm < 10 ? '0' + mm : mm }}\n            </div>\n          }\n      </div>\n    </div>\n  </div>\n</ng-template>\n","import { Component, effect, input, signal, computed } from '@angular/core';\nimport { FieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-password',\n  \n  templateUrl: `./lite-password.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LitePassword {\n  inEdit = input<boolean>(true);\n  control = input<FieldDto>({ label: '', formControl: new FormControl('') });\n  showToggle = input<boolean>(true);\n  showStrengthIndicator = input<boolean>(false);\n  \n  readonly FormUtils = FormUtils;\n  showPassword = signal<boolean>(false);\n\n  // Computed password strength analysis\n  passwordStrength = computed(() => {\n    const password = this.control().formControl.value || '';\n    return FormUtils.analyzePasswordStrength(password);\n  });\n\n  constructor() {\n    effect(() => {\n      // console.log('LitePassword initialized with control:', this.control());\n    });\n  }\n\n  isRequired() {\n    return this.FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getPasswordErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  togglePasswordVisibility() {\n    this.showPassword.set(!this.showPassword());\n  }\n\n  getInputType(): string {\n    return this.showPassword() ? 'text' : 'password';\n  }\n\n  getDisplayValue(): string {\n    const value = this.control().formControl.value;\n    return value ? '••••••••' : '';\n  }\n}\n","<div class=\"lite-password\" [ngClass]=\"{'in-edit': inEdit()}\">\n  @if (inEdit()) {\n    <div class=\"input-container\">\n      <input \n        [type]=\"getInputType()\" \n        [formControl]=\"control().formControl\" \n        placeholder=\"\" \n        [ngClass]=\"{'invalid': hasErrors()}\" />\n      <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n      @if (showToggle() && control().formControl.value) {\n        <button \n          type=\"button\" \n          class=\"toggle-button\" \n          (click)=\"togglePasswordVisibility()\"\n          [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\">\n          @if (showPassword()) {\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\"/>\n              <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\"/>\n            </svg>\n          } @else {\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n              <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n            </svg>\n          }\n        </button>\n      }\n    </div>\n    @if (showStrengthIndicator() && control().formControl.value) {\n      <div class=\"password-strength\">\n        <div class=\"strength-bar\">\n          <div class=\"strength-fill\" [ngClass]=\"'strength-' + passwordStrength().level.toLowerCase().replace(' ', '-')\"></div>\n        </div>\n        <div class=\"strength-info\">\n          <span class=\"strength-level\" [ngClass]=\"'level-' + passwordStrength().level.toLowerCase().replace(' ', '-')\">\n            {{ passwordStrength().level }}\n          </span>\n          <span class=\"strength-score\">({{ passwordStrength().score }}/8)</span>\n        </div>\n        @if (passwordStrength().feedback.length > 0) {\n          <div class=\"strength-feedback\">\n            @for (tip of passwordStrength().feedback; track tip) {\n              <div class=\"feedback-tip\">• {{ tip }}</div>\n            }\n          </div>\n        }\n      </div>\n    }\n    @if (hasErrors()) {\n      <div class=\"error-messages\">\n        @for (errorMessage of getErrorMessage(); track errorMessage) {\n          <div class=\"error-message\">{{ errorMessage }}</div>\n        }\n      </div>\n    }\n  } @else {\n    <div class=\"label\">{{ control().label }}<span *ngIf=\"isRequired()\">*</span></div>\n    <div class=\"value\">{{ getDisplayValue() }}</div>\n  }\n</div>\n","import { Component, effect, input, signal, computed, ViewChild, ElementRef } from '@angular/core';\nimport { FileFieldDto } from '../field-dto';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { FormUtils } from '../form-utils';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nexport interface FileItem {\n  id: string;\n  file: File;\n  name: string;\n  size: number;\n  type: string;\n  url?: string;\n  uploadProgress?: number;\n  isUploading?: boolean;\n  error?: string;\n}\n\n@Component({\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule],\n  selector: 'lite-file',\n  \n  templateUrl: `./lite-file.html`,\n  styleUrls: [`../lite-styles.scss`]\n})\nexport class LiteFile {\n  file_icon = `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"file-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n      <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n      <polyline points=\"14,2 14,8 20,8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line>\n      <polyline points=\"10,9 9,9 8,9\"></polyline></svg>`\n  @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n  @ViewChild('cameraInput') cameraInput!: ElementRef<HTMLInputElement>;\n\n  inEdit = input<boolean>(true);\n  control = input<FileFieldDto>({ label: '', formControl: new FormControl<FileItem[]>([]) });\n  \n  readonly FormUtils = FormUtils;\n  \n  // State signals\n  files = signal<FileItem[]>([]);\n  showPanel = signal<boolean>(false);\n  isDragOver = signal<boolean>(false);\n  isUploading = signal<boolean>(false);\n\n  // Computed values\n  fileCount = computed(() => this.files().length);\n  totalSize = computed(() => \n    this.files().reduce((total, file) => total + file.size, 0)\n  );\n  hasErrors = computed(() => \n    this.files().some(file => file.error)\n  );\n  \n  // Get configuration from control\n  multiple = computed(() => this.control().multiple ?? true);\n  accept = computed(() => this.control().accept ?? '*/*');\n  maxFileSize = computed(() => this.control().maxFileSize ?? 10 * 1024 * 1024);\n  maxFiles = computed(() => this.control().maxFiles ?? 10);\n  showPreview = computed(() => this.control().showPreview ?? true);\n\n  constructor(private _sanitizer: DomSanitizer) {\n    effect(() => {\n      // console.log('LiteFile initialized with control:', this.control());\n      \n      // Sync files with form control\n      const controlValue = this.control().formControl.value || [];\n      if (Array.isArray(controlValue)) {\n        this.files.set(controlValue);\n      }\n    });\n\n    // Watch files changes and update form control\n    effect(() => {\n      const currentFiles = this.files();\n      this.control().formControl.setValue(currentFiles);\n    });\n  }\n\n  isRequired() {\n    return this.FormUtils.isRequired(this.control().formControl);\n  }\n\n  hasFormErrors(): boolean {\n    return FormUtils.hasErrors(this.control().formControl);\n  }\n\n  getErrorMessage(): string[] {\n    return FormUtils.getErrorMessages(this.control().formControl, this.control().label);\n  }\n\n  // File operations\n  onFileSelect(event: Event) {\n    const input = event.target as HTMLInputElement;\n    if (input.files) {\n      this.handleFiles(Array.from(input.files));\n    }\n    // Reset input\n    input.value = '';\n  }\n\n  onCameraCapture(event: Event) {\n    const input = event.target as HTMLInputElement;\n    if (input.files) {\n      this.handleFiles(Array.from(input.files));\n    }\n    // Reset input\n    input.value = '';\n  }\n\n  onDragOver(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(true);\n  }\n\n  onDragLeave(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n  }\n\n  onDrop(event: DragEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.isDragOver.set(false);\n\n    const files = Array.from(event.dataTransfer?.files || []);\n    this.handleFiles(files);\n  }\n  svgToBase64DataUrl(svgString: string): SafeHtml {\n    const base64 = btoa(svgString);\n    const img = `data:image/svg+xml;base64,${base64}`;\n    return this._sanitizer.bypassSecurityTrustUrl(img);\n  }\n\n  private handleFiles(newFiles: File[]) {\n    const currentFiles = this.files();\n    const processedFiles: FileItem[] = [];\n\n    for (const file of newFiles) {\n      // Check file count limit\n      if (!this.multiple() && currentFiles.length >= 1) {\n        console.warn('Multiple files not allowed');\n        break;\n      }\n\n      if (currentFiles.length + processedFiles.length >= this.maxFiles()) {\n        console.warn(`Maximum ${this.maxFiles()} files allowed`);\n        break;\n      }\n\n      // Validate file\n      const validation = this.validateFile(file);\n      \n      const fileItem: FileItem = {\n        id: this.generateFileId(),\n        file,\n        name: file.name,\n        size: file.size,\n        type: file.type,\n        error: validation.error\n      };\n\n      // Create preview URL for images\n      if (this.showPreview() && file.type.startsWith('image/')) {\n        fileItem.url = URL.createObjectURL(file);\n      }\n\n      processedFiles.push(fileItem);\n    }\n\n    // Update files\n    if (this.multiple()) {\n      this.files.set([...currentFiles, ...processedFiles]);\n    } else {\n      this.files.set(processedFiles.slice(0, 1));\n    }\n  }\n\n  private validateFile(file: File): { valid: boolean; error?: string } {\n    // Check file size\n    if (file.size > this.maxFileSize()) {\n      return {\n        valid: false,\n        error: `File size exceeds ${this.formatFileSize(this.maxFileSize())}`\n      };\n    }\n\n    // Check file type if accept is specified\n    const acceptTypes = this.accept();\n    if (acceptTypes && acceptTypes !== '*/*') {\n      const allowedTypes = acceptTypes.split(',').map((type: string) => type.trim());\n      const isAllowed = allowedTypes.some((allowedType: string) => {\n        if (allowedType.startsWith('.')) {\n          return file.name.toLowerCase().endsWith(allowedType.toLowerCase());\n        }\n        return file.type.match(new RegExp(allowedType.replace('*', '.*')));\n      });\n\n      if (!isAllowed) {\n        return {\n          valid: false,\n          error: `File type not allowed. Accepted: ${acceptTypes}`\n        };\n      }\n    }\n\n    return { valid: true };\n  }\n\n  removeFile(fileId: string) {\n    const currentFiles = this.files();\n    const fileToRemove = currentFiles.find(f => f.id === fileId);\n    \n    // Revoke object URL to prevent memory leaks\n    if (fileToRemove?.url) {\n      URL.revokeObjectURL(fileToRemove.url);\n    }\n\n    this.files.set(currentFiles.filter(f => f.id !== fileId));\n  }\n\n  clearAllFiles() {\n    // Revoke all object URLs\n    this.files().forEach(file => {\n      if (file.url) {\n        URL.revokeObjectURL(file.url);\n      }\n    });\n\n    this.files.set([]);\n  }\n\n  // UI actions\n  togglePanel() {\n    this.showPanel.set(!this.showPanel());\n  }\n\n  closePanel() {\n    this.showPanel.set(false);\n  }\n\n  openFileDialog() {\n    this.fileInput.nativeElement.click();\n  }\n\n  openCameraDialog() {\n    this.cameraInput.nativeElement.click();\n  }\n\n  // Utility methods\n  private generateFileId(): string {\n    return Math.random().toString(36).substr(2, 9);\n  }\n\n  formatFileSize(bytes: number): string {\n    if (bytes === 0) return '0 Bytes';\n    const k = 1024;\n    const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n  }\n\n  getFileIcon(fileType: string): string {\n    if (fileType.startsWith('image/')) return '🖼️';\n    if (fileType.startsWith('video/')) return '🎥';\n    if (fileType.startsWith('audio/')) return '🎵';\n    if (fileType.includes('pdf')) return '📄';\n    if (fileType.includes('word')) return '📝';\n    if (fileType.includes('excel') || fileType.includes('spreadsheet')) return '📊';\n    if (fileType.includes('powerpoint') || fileType.includes('presentation')) return '📋';\n    if (fileType.includes('zip') || fileType.includes('rar')) return '🗜️';\n    return '📁';\n  }\n\n  isImage(fileType: string): boolean {\n    return fileType.startsWith('image/');\n  }\n\n  getTotalSizeFormatted(): string {\n    return this.formatFileSize(this.totalSize());\n  }\n}\n","<div class=\"lite-file\" [class.in-edit]=\"inEdit()\">\n  <label class=\"label\" [class.required]=\"isRequired()\">{{ control().label }}</label>\n  <button [class.has-files]=\"fileCount() > 0\" [class.has-errors]=\"hasErrors()\" (click)=\"togglePanel()\">\n    <img [src]=\"svgToBase64DataUrl(file_icon)\" alt=\"file icon\">\n    <!-- Badge -->\n    <span class=\"file-badge\">\n      {{ fileCount() }}\n    </span>\n  </button>\n\n</div>\n<!-- Panel overlay -->\n<div class=\"panel-overlay\" \n      [class.visible]=\"showPanel()\" \n      (click)=\"closePanel()\">\n</div>\n<!-- Management panel -->\n<div class=\"file-panel\" [class.visible]=\"showPanel()\">\n  <div class=\"panel-header\">\n    <h3>File Management</h3>\n    <button (click)=\"closePanel()\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n        <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n        <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n      </svg>\n    </button>\n  </div>\n\n  <div class=\"panel-content\">\n    <!-- File upload area -->\n    <div class=\"upload-area\" \n          [class.drag-over]=\"isDragOver()\"\n          [class.uploading]=\"isUploading()\"\n          (dragover)=\"onDragOver($event)\"\n          (dragleave)=\"onDragLeave($event)\"\n          (drop)=\"onDrop($event)\"\n          (click)=\"openFileDialog()\">\n      \n      <div class=\"upload-content\">\n        <svg class=\"upload-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n          <polyline points=\"7,10 12,15 17,10\"></polyline>\n          <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\n        </svg>\n        <p>Drop files here or click to browse</p>\n        <small>Max {{ maxFiles() }} files, {{ formatFileSize(maxFileSize()) }} each</small>\n      </div>\n\n      <!-- Hidden file inputs -->\n      <input #fileInput\n              type=\"file\"\n              [multiple]=\"multiple()\"\n              [accept]=\"accept()\"\n              (change)=\"onFileSelect($event)\"\n              style=\"display: none;\">\n\n      <input #cameraInput\n              type=\"file\"\n              accept=\"image/*\"\n              capture=\"environment\"\n              (change)=\"onCameraCapture($event)\"\n              style=\"display: none;\">\n    </div>\n\n    <!-- Action buttons -->\n    <div class=\"action-buttons\">\n      <button type=\"button\" class=\"action-btn upload-btn\" (click)=\"openFileDialog()\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\n          <polyline points=\"17,8 12,3 7,8\"></polyline>\n          <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"></line>\n        </svg>\n        Upload Files\n      </button>\n\n      <button type=\"button\" class=\"action-btn camera-btn\" (click)=\"openCameraDialog()\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"></path>\n          <circle cx=\"12\" cy=\"13\" r=\"4\"></circle>\n        </svg>\n        Take Picture\n      </button>\n\n      <button type=\"button\" class=\"action-btn close-btn\" (click)=\"closePanel()\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n          <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n          <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n        </svg>\n        Close\n      </button>\n    </div>\n\n    <!-- File list -->\n    <div class=\"file-list\" *ngIf=\"fileCount() > 0\">\n      <div class=\"file-list-header\">\n        <span>Files ({{ fileCount() }})</span>\n        <span class=\"total-size\">{{ getTotalSizeFormatted() }}</span>\n        <button type=\"button\" class=\"clear-all-btn\" (click)=\"clearAllFiles()\">\n          Clear All\n        </button>\n      </div>\n\n      <div class=\"file-items\">\n        <div class=\"file-item\" \n              *ngFor=\"let file of files()\" \n              [class.has-error]=\"file.error\"\n              [class.uploading]=\"file.isUploading\">\n          \n          <!-- File preview/icon -->\n          <div class=\"file-preview\">\n            <img *ngIf=\"file.url && isImage(file.type)\" \n                  [src]=\"file.url\" \n                  [alt]=\"file.name\"\n                  class=\"preview-image\">\n            <span *ngIf=\"!file.url || !isImage(file.type)\" \n                  class=\"file-type-icon\">\n              {{ getFileIcon(file.type) }}\n            </span>\n          </div>\n\n          <!-- File info -->\n          <div class=\"file-info\">\n            <div class=\"file-name\" [title]=\"file.name\">{{ file.name }}</div>\n            <div class=\"file-details\">\n              <span class=\"file-size\">{{ formatFileSize(file.size) }}</span>\n              <span class=\"file-type\">{{ file.type || 'Unknown' }}</span>\n            </div>\n            <div class=\"file-error\" *ngIf=\"file.error\">{{ file.error }}</div>\n            \n            <!-- Upload progress -->\n            <div class=\"upload-progress\" *ngIf=\"file.isUploading && file.uploadProgress !== undefined\">\n              <div class=\"progress-bar\">\n                <div class=\"progress-fill\" [style.width.%]=\"file.uploadProgress\"></div>\n              </div>\n              <span class=\"progress-text\">{{ file.uploadProgress }}%</span>\n            </div>\n          </div>\n\n          <!-- Remove button -->\n          <button type=\"button\" \n                  class=\"remove-file-btn\" \n                  (click)=\"removeFile(file.id)\"\n                  [disabled]=\"file.isUploading\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n              <polyline points=\"3,6 5,6 21,6\"></polyline>\n              <path d=\"M19,6v14a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6m3,0V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2V6\"></path>\n              <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\"></line>\n              <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\"></line>\n            </svg>\n          </button>\n        </div>\n      </div>\n    </div>\n\n    <!-- Empty state -->\n    <div class=\"empty-state\" *ngIf=\"fileCount() === 0\">\n      <svg class=\"empty-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1\">\n        <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path>\n        <polyline points=\"14,2 14,8 20,8\"></polyline>\n      </svg>\n      <p>No files uploaded yet</p>\n      <small>Click upload or drag files to get started</small>\n    </div>\n  </div>\n</div>\n\n<!-- Error messages -->\n<div class=\"error-messages\" *ngIf=\"hasFormErrors()\">\n  <div class=\"error-message\" *ngFor=\"let error of getErrorMessage()\">{{ error }}</div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { SnackbarType } from '../field-dto';\n\n@Injectable({ providedIn: 'root' })\nexport class LiteSnackbarService {\n  private timeoutId: any;\n  private snackbarElem: HTMLElement | null = null;\n\n  show(text: string, type: SnackbarType = 'done', duration: number = 3000) {\n    this.clear();\n    this.snackbarElem = document.createElement('div');\n    this.snackbarElem.className = `lite-snackbar ${type}`;\n    this.snackbarElem.innerHTML = `\n      <div class=\"icon\">${this.getIcon(type)}</div>\n      <div class=\"text\">${this.escapeHtml(text)}</div>\n    `;\n    this.injectStyles();\n    document.body.appendChild(this.snackbarElem);\n    this.timeoutId = setTimeout(() => this.clear(), duration);\n  }\n\n  clear() {\n    if (this.timeoutId) clearTimeout(this.timeoutId);\n    if (this.snackbarElem && this.snackbarElem.parentNode) {\n      this.snackbarElem.parentNode.removeChild(this.snackbarElem);\n    }\n    this.snackbarElem = null;\n  }\n\n  private getIcon(type: SnackbarType) {\n    if (type === 'done') {\n      return `<svg width=\"30\" height=\"30\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M6 10.5L9 13.5L14 8.5\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n    }\n    if (type === 'warn') {\n      return `<svg width=\"30\" height=\"30\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M10 6V11\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\"/><circle cx=\"10\" cy=\"14\" r=\"1\" fill=\"#fff\"/></svg>`;\n    }\n    if (type === 'error') {\n      return `<svg width=\"30\" height=\"30\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"10\" cy=\"10\" r=\"10\"/><path d=\"M7 7L13 13M13 7L7 13\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\"/></svg>`;\n    }\n    return '';\n  }\n\n  private injectStyles() {\n    if (document.getElementById('lite-snackbar-style')) return;\n    const style = document.createElement('style');\n    style.id = 'lite-snackbar-style';\n    style.innerHTML = `\n      .lite-snackbar {\n        position: fixed;\n        left: 50%;\n        top: 20px;\n        transform: translateX(-50%);\n        min-width: 200px;\n        max-width: 90vw;\n        padding: 8px 15px 8px 5px;\n        border-radius: 6px;\n        color: #fff;\n        font-size: 1rem;\n        display: flex;\n        align-items: center;\n        box-shadow: 0 2px 12px rgba(0,0,0,0.18);\n        z-index: 9999;\n        opacity: 0.9;\n        animation: snackbar-in 0.2s;\n      }\n      .lite-snackbar.done { background: #3a82eeff; }\n      .lite-snackbar.warn { background: #f7b731; }\n      .lite-snackbar.error { background: #e74c3c; }\n      .lite-snackbar .icon { margin-right: 5px; height: 30px; }\n      @keyframes snackbar-in {\n        from { opacity: 0; transform: translateX(-50%) translateY(-30px); }\n        to { opacity: 0.9; transform: translateX(-50%) translateY(0); }\n      }\n    `;\n    document.head.appendChild(style);\n  }\n\n  private escapeHtml(text: string) {\n    return text.replace(/[&<>'\"]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\\'':'&#39;','\"':'&quot;'}[c]||c));\n  }\n}\n","import { Component, input, computed, output, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PaginatorFieldDto } from '../field-dto';\n\n@Component({\n  selector: 'lite-paginator',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './lite-paginator.html',\n  styleUrls: ['../lite-styles.scss']\n})\nexport class LitePaginator {\n  paginator = input.required<PaginatorFieldDto>();\n  pageChange = output<number>();\n  itemsPerPageChange = output<number>();\n\n  // Computed properties that react to input changes\n  totalPages = computed(() => Math.ceil(this.paginator().totalItems / this.paginator().itemsPerPage));\n  hasPrevious = computed(() => this.paginator().currentPage > 1);\n  hasNext = computed(() => this.paginator().currentPage < this.totalPages());\n\n  // Start and end item numbers for display\n  startItem = computed(() => {\n    const page = this.paginator().currentPage;\n    const perPage = this.paginator().itemsPerPage;\n    return Math.min((page - 1) * perPage + 1, this.paginator().totalItems);\n  });\n\n  endItem = computed(() => {\n    const page = this.paginator().currentPage;\n    const perPage = this.paginator().itemsPerPage;\n    return Math.min(page * perPage, this.paginator().totalItems);\n  });\n\n  constructor() {\n    // Effect to log changes for debugging\n    effect(() => {\n      console.log('Paginator updated:', {\n        currentPage: this.paginator().currentPage,\n        itemsPerPage: this.paginator().itemsPerPage,\n        totalItems: this.paginator().totalItems,\n        totalPages: this.totalPages()\n      });\n    });\n  }\n\n  // Methods\n  goToPrevious() {\n    if (this.hasPrevious()) {\n      const newPage = this.paginator().currentPage - 1;\n      this.pageChange.emit(newPage);\n    }\n  }\n\n  goToNext() {\n    if (this.hasNext()) {\n      const newPage = this.paginator().currentPage + 1;\n      this.pageChange.emit(newPage);\n    }\n  }\n\n  goToPage(page: number) {\n    if (page >= 1 && page <= this.totalPages()) {\n      this.pageChange.emit(page);\n    }\n  }\n\n  changeItemsPerPage(itemsPerPage: number) {\n    this.itemsPerPageChange.emit(itemsPerPage);\n  }\n\n  // Helper methods for template\n  getPageNumbers(): number[] {\n    const currentPage = this.paginator().currentPage;\n    const totalPages = this.totalPages();\n    const pages: number[] = [];\n\n    // Show max 5 page numbers, centered around current page\n    const start = Math.max(1, Math.min(currentPage - 2, totalPages - 4));\n    const end = Math.min(totalPages, start + 4);\n\n    for (let i = start; i <= end; i++) {\n      pages.push(i);\n    }\n\n    return pages;\n  }\n}\n","<div class=\"lite-paginator\">\n  <!-- Previous Button -->\n  <button\n    class=\"paginator-btn previous-btn\"\n    [disabled]=\"!hasPrevious()\"\n    (click)=\"goToPrevious()\"\n    [title]=\"'Previous page'\"\n    type=\"button\">\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n    </svg>\n  </button>\n\n  <!-- Page Numbers -->\n  <div class=\"page-numbers\">\n    @for (page of getPageNumbers(); track page) {\n      <button\n        class=\"page-number\"\n        [class.active]=\"page === paginator().currentPage\"\n        (click)=\"goToPage(page)\"\n        type=\"button\">\n        {{ page }}\n      </button>\n    }\n  </div>\n\n  <!-- Next Button -->\n  <button\n    class=\"paginator-btn next-btn\"\n    [disabled]=\"!hasNext()\"\n    (click)=\"goToNext()\"\n    [title]=\"'Next page'\"\n    type=\"button\">\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n    </svg>\n  </button>\n\n  <!-- Items per page selector -->\n  <div class=\"items-per-page\">\n    <select\n      [value]=\"paginator().itemsPerPage\"\n      (change)=\"changeItemsPerPage(+$any($event.target).value)\"\n      class=\"items-select\">\n      <option value=\"5\">5</option>\n      <option value=\"10\">10</option>\n      <option value=\"25\">25</option>\n      <option value=\"50\">50</option>\n      <option value=\"100\">100</option>\n    </select>\n    <span class=\"items-label\">per page</span>\n  </div>\n\n  <!-- Total items info -->\n  <div class=\"total-info\">\n    <span class=\"total-text\">\n      {{ startItem() }}-{{ endItem() }} of {{ paginator().totalItems }}\n    </span>\n  </div>\n</div>\n","import { Component, input, computed, output, HostListener, signal, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TableFieldDto, TableColumn, SortDirection, SortState } from '../field-dto';\nimport { LitePaginator } from '../lite-paginator/lite-paginator';\n\n@Component({\n  selector: 'lite-table',\n  standalone: true,\n  imports: [CommonModule, LitePaginator],\n  templateUrl: './lite-table.html',\n  styleUrls: ['../lite-styles.scss']\n})\nexport class LiteTable<T = any> {\n  table = input.required<TableFieldDto<T>>();\n  pageChange = output<number>();\n  itemsPerPageChange = output<number>();\n  // Emits when a row menu action is selected\n  menuAction = output<{ action: string; row: T }>();\n  // Emits when sort state changes\n  sortChange = output<{ column: string; direction: SortDirection }>();\n  // Emits when selection changes with array of selected rows\n  selectionChange = output<T[]>();\n  // Emits when a row is clicked\n  rowClick = output<T>();\n\n  // Internal sort state signal for reliable reactivity\n  private internalSortState = signal<SortState | undefined>(undefined);\n\n  // Track selected rows\n  private selectedRows = new Set<T>();\n\n  // Track which row's menu is open (by paginated row index)\n  openMenuIndex: number | null = null;\n  // Track if menu should open upward\n  menuOpenUpward = false;\n\n  constructor() {\n    // Sync internal sort state with input\n    effect(() => {\n      const inputSortState = this.table().sortState;\n      this.internalSortState.set(inputSortState);\n    });\n  }\n\n  // Sort helper that sorts the provided rows array based on current sort state\n  private sortRows(rows: T[], tableData: TableFieldDto<T>): T[] {\n    const sortState = this.internalSortState();\n    if (!sortState || !sortState.direction) {\n      return rows;\n    }\n    const column = tableData.columns.find((col: TableColumn) => col.key === sortState.column);\n    if (!column) {\n      return rows;\n    }\n    const sorted = [...rows];\n    sorted.sort((a, b) => {\n      // Prefer raw values for type-aware comparisons\n      const aRaw = this.getValue(a, column.key);\n      const bRaw = this.getValue(b, column.key);\n\n      // Handle null/undefined values first\n      if (aRaw == null && bRaw == null) return 0;\n      if (aRaw == null) return 1;\n      if (bRaw == null) return -1;\n\n      // Date comparison (Date objects or parseable date strings)\n      const aTime = aRaw instanceof Date\n        ? aRaw.getTime()\n        : (typeof aRaw === 'string' && !isNaN(Date.parse(aRaw)) ? Date.parse(aRaw) : NaN);\n      const bTime = bRaw instanceof Date\n        ? bRaw.getTime()\n        : (typeof bRaw === 'string' && !isNaN(Date.parse(bRaw)) ? Date.parse(bRaw) : NaN);\n      if (!isNaN(aTime) && !isNaN(bTime)) {\n        const comp = aTime - bTime;\n        return sortState.direction === 'asc' ? comp : -comp;\n      }\n\n      // Number comparison (numbers or numeric strings)\n      const aNum = typeof aRaw === 'number' ? aRaw : Number(aRaw as any);\n      const bNum = typeof bRaw === 'number' ? bRaw : Number(bRaw as any);\n      if (!isNaN(aNum) && !isNaN(bNum)) {\n        const comp = aNum - bNum;\n        return sortState.direction === 'asc' ? comp : -comp;\n      }\n\n      // Fallback: compare display strings. For objects, use getCellValue()\n      const aStr = typeof aRaw === 'object' ? this.getCellValue(a, column) : String(aRaw);\n      const bStr = typeof bRaw === 'object' ? this.getCellValue(b, column) : String(bRaw);\n      const comp = aStr.localeCompare(bStr);\n      return sortState.direction === 'asc' ? comp : -comp;\n    });\n    return sorted;\n  }\n\n  // Computed properties for pagination (sort what is visible on the current page)\n  paginatedData = computed(() => {\n    const tableData = this.table();\n    const all = tableData.data;\n    if (!tableData.showPaginator) {\n      // No paginator: sort the visible (entire) set\n      return this.sortRows(all, tableData);\n    }\n    const paginator = tableData.paginatorConfig;\n    const startIndex = (paginator.currentPage - 1) * paginator.itemsPerPage;\n    const endIndex = startIndex + paginator.itemsPerPage;\n    const pageSlice = all.slice(startIndex, endIndex);\n    return this.sortRows(pageSlice, tableData);\n  });\n\n  // Helper method to get cell value\n  getCellValue(row: any, column: TableColumn): string {\n    if (column.cellTemplate) {\n      return column.cellTemplate(this.getValue(row, column.key), row);\n    }\n    const value = this.getValue(row, column.key);\n\n    // Special handling for name field from Random User API\n    if (column.key === 'name' && value && typeof value === 'object') {\n      const nameObj = value as any;\n      return `${nameObj.first || ''} ${nameObj.last || ''}`.trim();\n    }\n\n    return value?.toString() || '';\n  }\n\n  // Helper method to extract value from row (supports nested properties)\n  private getValue(row: any, key: string): any {\n    if (!row || typeof row !== 'object') {\n      return row;\n    }\n\n    // Support dot notation for nested properties\n    const keys = key.split('.');\n    let value = row;\n\n    for (const k of keys) {\n      if (value && typeof value === 'object' && k in value) {\n        value = value[k];\n      } else {\n        return undefined;\n      }\n    }\n\n    return value;\n  }\n\n  // Event handlers for paginator\n  onPageChange(page: number) {\n    this.pageChange.emit(page);\n  }\n\n  onItemsPerPageChange(itemsPerPage: number) {\n    this.itemsPerPageChange.emit(itemsPerPage);\n  }\n\n  // Selection helpers\n  isRowSelected(row: T): boolean {\n    return this.selectedRows.has(row);\n  }\n\n  toggleRow(row: T, checked: boolean) {\n    if (checked) this.selectedRows.add(row); else this.selectedRows.delete(row);\n    this.selectionChange.emit(Array.from(this.selectedRows));\n  }\n\n  areAllVisibleSelected(): boolean {\n    const page = this.paginatedData();\n    return page.length > 0 && page.every(r => this.selectedRows.has(r));\n  }\n\n  isSomeVisibleSelected(): boolean {\n    const page = this.paginatedData();\n    const any = page.some(r => this.selectedRows.has(r));\n    return any && !this.areAllVisibleSelected();\n  }\n\n  toggleSelectAllVisible(checked: boolean) {\n    const page = this.paginatedData();\n    if (checked) {\n      page.forEach(r => this.selectedRows.add(r));\n    } else {\n      page.forEach(r => this.selectedRows.delete(r));\n    }\n    this.selectionChange.emit(Array.from(this.selectedRows));\n  }\n\n  // Row click handler\n  onRowClick(row: T) {\n    this.rowClick.emit(row);\n  }\n\n  // Row menu handlers\n  toggleMenu(rowIndex: number, event?: MouseEvent) {\n    event?.stopPropagation();\n    \n    if (this.openMenuIndex === rowIndex) {\n      this.openMenuIndex = null;\n      this.menuOpenUpward = false;\n      return;\n    }\n    \n    this.openMenuIndex = rowIndex;\n    \n    // Check if button is near bottom of viewport\n    if (event?.target) {\n      const button = event.target as HTMLElement;\n      const rect = button.getBoundingClientRect();\n      const viewportHeight = window.innerHeight;\n      const spaceBelow = viewportHeight - rect.bottom;\n      const menuHeight = 150; // Approximate menu height\n      \n      // Open upward if not enough space below\n      this.menuOpenUpward = spaceBelow < menuHeight && rect.top > menuHeight;\n    }\n  }\n\n  onMenuItemClick(action: string, row: T, event?: MouseEvent) {\n    event?.stopPropagation();\n    this.menuAction.emit({ action, row });\n    this.openMenuIndex = null;\n  }\n\n  // Close any open menu when clicking outside\n  @HostListener('document:click')\n  onDocumentClick() {\n    this.openMenuIndex = null;\n  }\n\n  // Sort handler\n  onSort(column: TableColumn) {\n    if (!column.sortable) {\n      return;\n    }\n\n    const currentSort = this.internalSortState();\n    let newDirection: SortDirection;\n\n    if (!currentSort || currentSort.column !== column.key || !currentSort.direction) {\n      // First click on this column, different column, or direction is null - sort ascending\n      newDirection = 'asc';\n    } else if (currentSort.direction === 'asc') {\n      // Second click - sort descending\n      newDirection = 'desc';\n    } else {\n      // Third click (desc) - clear sort\n      newDirection = null;\n    }\n\n    this.sortChange.emit({ column: column.key, direction: newDirection });\n  }\n\n  // Get sort direction for a column\n  getSortDirection(columnKey: string): SortDirection {\n    const sortState = this.internalSortState();\n    if (sortState && sortState.column === columnKey) {\n      return sortState.direction;\n    }\n    return null;\n  }\n}\n","<div class=\"lite-table\">\n  <!-- Table Header -->\n  <div class=\"table-header\">\n    <div class=\"header-row\">\n      @for (column of table().columns; track column.key) {\n        <div\n          class=\"header-cell\"\n          [style.flex]=\"column.flex || '1'\"\n          [class.sortable]=\"column.sortable\"\n          [class.sorted-asc]=\"getSortDirection(column.key) === 'asc'\"\n          [class.sorted-desc]=\"getSortDirection(column.key) === 'desc'\"\n          (click)=\"onSort(column)\">\n          @if (column.type === 'select') {\n            <input type=\"checkbox\"\n              class=\"checkbox-input\" \n              (click)=\"$event.stopPropagation()\"\n              [checked]=\"areAllVisibleSelected()\"\n              [indeterminate]=\"isSomeVisibleSelected()\"\n              (change)=\"toggleSelectAllVisible($any($event.target).checked)\" />\n          } @else {\n            <span class=\"header-label\">{{ column.label }}</span>\n            @if (column.sortable) {\n              <span class=\"sort-indicator\">\n                <svg class=\"sort-arrow sort-arrow-up\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                  <path d=\"M6 3L9 7H3L6 3Z\" fill=\"currentColor\"/>\n                </svg>\n                <svg class=\"sort-arrow sort-arrow-down\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                  <path d=\"M6 9L3 5H9L6 9Z\" fill=\"currentColor\"/>\n                </svg>\n              </span>\n            }\n          }\n        </div>\n      }\n    </div>\n  </div>\n\n  <!-- Table Body -->\n  <div class=\"table-body\">\n    @for (row of paginatedData(); track $index; let rowIndex = $index) {\n      <div class=\"data-row\" (click)=\"onRowClick(row)\">\n        @for (column of table().columns; track column.key) {\n          <div class=\"data-cell\" [style.flex]=\"column.flex || '1'\">\n            @if (column.type === 'menu') {\n              @if ((column.menuItems || []).length === 1) {\n                <button\n                  class=\"single-action-button\"\n                  [class.danger]=\"column.menuItems![0].variant === 'danger'\"\n                  (click)=\"onMenuItemClick(column.menuItems![0].value, row, $event)\">\n                  {{ column.menuItems![0].label }}\n                </button>\n              } @else {\n                <div class=\"row-menu\">\n                  <button\n                    class=\"menu-button\"\n                    aria-label=\"Row actions\"\n                    [attr.aria-expanded]=\"openMenuIndex === rowIndex\"\n                    (click)=\"toggleMenu(rowIndex, $event)\">\n                    <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                      <circle cx=\"10\" cy=\"4\" r=\"1.5\" fill=\"currentColor\"/>\n                      <circle cx=\"10\" cy=\"10\" r=\"1.5\" fill=\"currentColor\"/>\n                      <circle cx=\"10\" cy=\"16\" r=\"1.5\" fill=\"currentColor\"/>\n                    </svg>\n                  </button>\n                  @if (openMenuIndex === rowIndex) {\n                    <div class=\"menu-dropdown\" [class.menu-dropdown--upward]=\"menuOpenUpward\" (click)=\"$event.stopPropagation()\">\n                      @for (mi of column.menuItems || []; track mi.value) {\n                        <button\n                          class=\"menu-item\"\n                          [class.danger]=\"mi.variant === 'danger'\"\n                          (click)=\"onMenuItemClick(mi.value, row, $event)\">{{ mi.label }}</button>\n                      }\n                    </div>\n                  }\n                </div>\n              }\n            } @else if (column.type === 'select') {\n              <input type=\"checkbox\"\n                class=\"checkbox-input\" \n                (click)=\"$event.stopPropagation()\"\n                [checked]=\"isRowSelected(row)\"\n                (change)=\"toggleRow(row, $any($event.target).checked)\" />\n            } @else {\n              <span [innerHTML]=\"getCellValue(row, column)\"></span>\n            }\n          </div>\n        }\n      </div>\n    }\n    @if (paginatedData().length === 0) {\n      <div class=\"empty-row\">\n        <div\n          class=\"empty-cell\"\n          [style.flex]=\"'1'\">\n          No data available\n        </div>\n      </div>\n    }\n  </div>\n\n  <!-- Paginator -->\n  @if (table().showPaginator) {\n    <div class=\"table-paginator\">\n      <lite-paginator\n        [paginator]=\"table().paginatorConfig\"\n        (pageChange)=\"onPageChange($event)\"\n        (itemsPerPageChange)=\"onItemsPerPageChange($event)\">\n      </lite-paginator>\n    </div>\n  }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, TemplateRef, Type, ViewContainerRef, ViewChild, ComponentRef, AfterViewInit, OnDestroy, computed, input, output, ViewChildren, QueryList } from '@angular/core';\nimport { FormGroup, FormGroupDirective } from '@angular/forms';\n\nexport interface LitePanelAction {\n  label: string;\n  value?: unknown;\n  /**\n   * Adds a CSS modifier class `lite-panel__action--${variant}` to let consumers style the action button.\n   */\n  variant?: 'primary' | 'secondary' | 'danger';\n  /**\n   * Controls action interactivity. Use a boolean literal or return `true` from a function to disable.\n   */\n  disabled?: boolean | (() => boolean);\n}\n\nlet panelIdCounter = 0;\n\n@Component({\n  standalone: true,\n  selector: 'lite-panel',\n  imports: [CommonModule],\n  templateUrl: './lite-panel.html',\n  styleUrls: ['../lite-styles.scss', './lite-panel.scss']\n})\nexport class LitePanel implements AfterViewInit, OnDestroy {\n  title = input<string | null>(null);\n  content = input<string | TemplateRef<unknown> | Type<any> | null>(null);\n  contentInputs = input<Record<string, any> | null>(null);\n  formGroup = input<FormGroup | null>(null);\n  actions = input<LitePanelAction[] | null>(null);\n  closeOnOverlayClick = input<boolean>(true);\n  width = input<string | number | null>(null);\n  height = input<string | number | null>(null);\n  maxWidth = input<string | number | null>(null);\n  maxHeight = input<string | number | null>(null);\n\n  closed = output<unknown | null>();\n\n  @ViewChild('dynamicComponentContainer', { read: ViewContainerRef }) dynamicComponentContainer?: ViewContainerRef;\n  @ViewChildren(FormGroupDirective) formGroupDirectives?: QueryList<FormGroupDirective>;\n\n  readonly panelTitleId = `lite-panel-title-${++panelIdCounter}`;\n  private componentRef?: ComponentRef<any>;\n  private detectedFormGroup: FormGroup | null = null;\n\n  private readonly defaultActions: LitePanelAction[] = [{ label: 'OK', value: null, variant: 'primary' }];\n\n  readonly resolvedActions = computed(() => {\n    const provided = this.actions();\n    return provided && provided.length ? provided : this.defaultActions;\n  });\n\n  readonly contentTemplate = computed(() => {\n    const value = this.content();\n    return value instanceof TemplateRef ? value : null;\n  });\n\n  readonly contentText = computed(() => {\n    const value = this.content();\n    return typeof value === 'string' ? value : null;\n  });\n\n  readonly contentComponent = computed(() => {\n    const value = this.content();\n    // Check if it's a component type (function/class but not TemplateRef)\n    return value && typeof value === 'function' && !(value instanceof TemplateRef) ? value : null;\n  });\n\n  readonly templateContext: { panel: LitePanel; close: (_value?: unknown) => void } = {\n    panel: this,\n    close: (_value?: unknown) => this.close(_value ?? null)\n  };\n\n  readonly panelStyles = computed(() => {\n    const styles: Record<string, string> = {};\n    const candidates: Array<[string, string | number | null | undefined]> = [\n      ['width', this.width()],\n      ['height', this.height()],\n      ['max-width', this.maxWidth()],\n      ['max-height', this.maxHeight()]\n    ];\n\n    for (const [prop, value] of candidates) {\n      if (!this.isNilOrEmpty(value)) {\n        styles[prop] = this.toCssLength(value as string | number);\n      }\n    }\n\n    return styles;\n  });\n\n  close(value: unknown | null = null): void {\n    this.closed.emit(value ?? null);\n  }\n\n  onBackdropClick(): void {\n    if (this.closeOnOverlayClick()) {\n      this.close(null);\n    }\n  }\n\n  onAction(action: LitePanelAction): void {\n    let emitted = Object.prototype.hasOwnProperty.call(action, 'value') ? action.value : null;\n    \n    // If there's a dynamic component with a getData method, include its data\n    if (this.componentRef?.instance && typeof this.componentRef.instance.getData === 'function') {\n      const componentData = this.componentRef.instance.getData();\n      emitted = { action: emitted, data: componentData };\n    }\n    \n    this.close(emitted as unknown | null);\n  }\n\n  getActionClasses(action: LitePanelAction): Record<string, boolean> {\n    return {\n      'lite-panel__action': true,\n      [`lite-panel__action--${action.variant}`]: !!action.variant\n    };\n  }\n\n  isActionDisabled(action: LitePanelAction): boolean {\n    if (typeof action.disabled === 'function') {\n      try {\n        return !!action.disabled();\n      } catch (error) {\n        console.error('[LitePanel] Failed to evaluate action.disabled()', error);\n        return false;\n      }\n    }\n    if (typeof action.disabled === 'boolean') {\n      return action.disabled;\n    }\n\n    if (!this.shouldRespectComponentValidity(action)) {\n      return false;\n    }\n\n    const componentValid = this.getComponentValidity();\n    if (componentValid === null) {\n      return false;\n    }\n\n    return !componentValid;\n  }\n\n  private shouldRespectComponentValidity(action: LitePanelAction): boolean {\n    // Check if we have either a component instance, explicit FormGroup, or detected FormGroup\n    const hasValidationSource = this.componentRef?.instance || this.formGroup() || this.detectedFormGroup;\n    if (!hasValidationSource) {\n      return false;\n    }\n\n    if (action.value === 'submit') {\n      return true;\n    }\n\n    if (action.variant === 'primary' && action.value === undefined) {\n      return true;\n    }\n\n    return false;\n  }\n\n  private getComponentValidity(): boolean | null {\n    // Check for explicitly provided FormGroup (for ng-template forms)\n    const providedFormGroup = this.formGroup();\n    if (providedFormGroup) {\n      return providedFormGroup.valid;\n    }\n    \n    // Check for detected FormGroup from ng-template\n    if (this.detectedFormGroup) {\n      return this.detectedFormGroup.valid;\n    }\n\n    const instance = this.componentRef?.instance as { isValid?: () => unknown } | undefined;\n    if (!instance) {\n      return null;\n    }\n\n    if (typeof instance.isValid === 'function') {\n      try {\n        return !!instance.isValid();\n      } catch (error) {\n        console.warn('[LitePanel] Failed to evaluate content component isValid()', error);\n        return null;\n      }\n    }\n\n    const formGroup = this.findFormGroup(instance);\n    if (formGroup) {\n      return formGroup.valid;\n    }\n\n    return null;\n  }\n\n  private findFormGroup(instance: Record<string, unknown>): FormGroup | null {\n    for (const key of Object.keys(instance)) {\n      const value = instance[key];\n      if (value instanceof FormGroup) {\n        return value;\n      }\n    }\n    return null;\n  }\n\n  private detectFormInTemplate(): void {\n    // FormGroupDirective query happens automatically via @ContentChildren\n    // We'll check it in ngAfterContentInit\n  }\n\n  private toCssLength(value: string | number): string {\n    if (typeof value === 'number') {\n      return `${value}px`;\n    }\n\n    return value.trim();\n  }\n\n  private isNilOrEmpty(value: string | number | null | undefined): value is null | undefined | '' {\n    if (value === null || value === undefined) {\n      return true;\n    }\n\n    if (typeof value === 'string' && value.trim() === '') {\n      return true;\n    }\n\n    return false;\n  }\n\n  ngAfterViewInit(): void {\n    this.loadDynamicComponent();\n    \n    // Detect FormGroup in template after view init\n    setTimeout(() => {\n      if (this.formGroupDirectives && this.formGroupDirectives.length > 0) {\n        const firstDirective = this.formGroupDirectives.first;\n        if (firstDirective && firstDirective.form) {\n          this.detectedFormGroup = firstDirective.form;\n        }\n      }\n    }, 0);\n    \n    // Subscribe to changes in case FormGroupDirective appears later\n    if (this.formGroupDirectives) {\n      this.formGroupDirectives.changes.subscribe(() => {\n        if (this.formGroupDirectives && this.formGroupDirectives.length > 0) {\n          const firstDirective = this.formGroupDirectives.first;\n          if (firstDirective && firstDirective.form) {\n            this.detectedFormGroup = firstDirective.form;\n          }\n        }\n      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.componentRef?.destroy();\n  }\n\n  private loadDynamicComponent(): void {\n    const component = this.contentComponent();\n    if (component && this.dynamicComponentContainer) {\n      this.dynamicComponentContainer.clear();\n      this.componentRef = this.dynamicComponentContainer.createComponent(component);\n      \n      // Apply inputs if provided\n      const inputs = this.contentInputs();\n      if (inputs) {\n        Object.entries(inputs).forEach(([key, value]) => {\n          if (this.componentRef) {\n            // Use setInput to properly handle both input signals and @Input decorators\n            this.componentRef.setInput(key, value);\n          }\n        });\n      }\n      \n      this.componentRef.changeDetectorRef.detectChanges();\n    }\n  }\n}\n","<div class=\"lite-panel__backdrop\" (click)=\"onBackdropClick()\"></div>\n\n<div\n  class=\"lite-panel\"\n  role=\"dialog\"\n  aria-modal=\"true\"\n  [ngStyle]=\"panelStyles()\"\n  [attr.aria-labelledby]=\"title() ? panelTitleId : null\">\n  @if (title()) {\n    <header class=\"lite-panel__header\">\n      <h2 class=\"lite-panel__title\" [id]=\"panelTitleId\">{{ title() }}</h2>\n      <button type=\"button\" class=\"lite-panel__close\" (click)=\"close(null)\" aria-label=\"Close\">\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n    </header>\n  }\n\n  <section class=\"lite-panel__content\">\n    @if (contentComponent()) {\n      <ng-container #dynamicComponentContainer></ng-container>\n    } @else if (contentTemplate()) {\n      <ng-container *ngTemplateOutlet=\"contentTemplate(); context: templateContext\"></ng-container>\n    } @else if (contentText()) {\n      <p class=\"lite-panel__content-text\">{{ contentText() }}</p>\n    } @else {\n      <ng-content></ng-content>\n    }\n  </section>\n\n  <footer class=\"lite-panel__actions\">\n    @for (action of resolvedActions(); track action) {\n      <button\n        type=\"button\"\n        [ngClass]=\"getActionClasses(action)\"\n        [disabled]=\"isActionDisabled(action)\"\n        (click)=\"onAction(action)\"\n      >\n        {{ action.label }}\n      </button>\n    }\n  </footer>\n</div>\n","import { Component, input, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type LoadingView = 'spinner' | 'progress';\n\n@Component({\n  selector: 'lite-loading',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './lite-loading.html',\n  styleUrls: ['../lite-styles.scss', './lite-loading.scss']\n})\nexport class LiteLoading {\n  /**\n   * The view type: 'spinner' for loading wheel, 'progress' for progress bar\n   */\n  view = input<LoadingView>('spinner');\n\n  /**\n   * Progress percentage (0-100). If undefined, shows indeterminate progress.\n   * Only applies when view is 'progress'.\n   */\n  progress = input<number | undefined>(undefined);\n\n  /**\n   * Optional message to display below the loading indicator\n   */\n  message = input<string | undefined>(undefined);\n\n  /**\n   * Size of the spinner (only applies to spinner view)\n   */\n  size = input<'small' | 'medium' | 'large'>('medium');\n\n  /**\n   * Whether the loading indicator is visible\n   */\n  visible = input<boolean>(true);\n\n  /**\n   * Computed property to determine if progress is defined\n   */\n  isProgressDefined = computed(() => {\n    const progressValue = this.progress();\n    return progressValue !== undefined && progressValue !== null;\n  });\n\n  /**\n   * Computed property to get clamped progress value (0-100)\n   */\n  progressValue = computed(() => {\n    const progressValue = this.progress();\n    if (progressValue === undefined || progressValue === null) {\n      return 0;\n    }\n    return Math.max(0, Math.min(100, progressValue));\n  });\n\n  /**\n   * Computed property for spinner size class\n   */\n  spinnerSizeClass = computed(() => {\n    return `lite-loading__spinner--${this.size()}`;\n  });\n}\n","@if (visible()) {\n  <div class=\"lite-loading\">\n    @if (view() === 'spinner') {\n      <div class=\"lite-loading__spinner-container\">\n        <div class=\"lite-loading__spinner\" [ngClass]=\"spinnerSizeClass()\">\n          <div class=\"lite-loading__spinner-circle\"></div>\n        </div>\n      </div>\n    } @else if (view() === 'progress') {\n      <div class=\"lite-loading__progress-container\">\n        @if (isProgressDefined()) {\n          <!-- Defined progress bar -->\n          <div class=\"lite-loading__progress-bar\">\n            <div \n              class=\"lite-loading__progress-fill\" \n              [style.width.%]=\"progressValue()\"\n              role=\"progressbar\"\n              [attr.aria-valuenow]=\"progressValue()\"\n              aria-valuemin=\"0\"\n              aria-valuemax=\"100\">\n            </div>\n          </div>\n          <div class=\"lite-loading__progress-text\">{{ progressValue() }}%</div>\n        } @else {\n          <!-- Indeterminate progress bar -->\n          <div class=\"lite-loading__progress-bar lite-loading__progress-bar--indeterminate\">\n            <div class=\"lite-loading__progress-fill-indeterminate\"></div>\n          </div>\n        }\n      </div>\n    }\n    \n    @if (message()) {\n      <div class=\"lite-loading__message\">{{ message() }}</div>\n    }\n  </div>\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n@Directive({\n  selector: '[libLiteTabContent]',\n  standalone: true\n})\nexport class LiteTabContent {\n  // eslint-disable-next-line no-unused-vars\n  constructor(public template: TemplateRef<unknown>) {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, input, output, signal, effect, TemplateRef, ContentChildren, QueryList, ViewChild, ElementRef, AfterViewInit, HostListener, OnDestroy } from '@angular/core';\nimport { LiteTabContent } from '../lite-tab-content';\n\nexport interface LiteTabItem {\n  label: string;\n  content?: string; // simple HTML content support via innerHTML\n}\n\n@Component({\n  selector: 'lite-tab-group',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './lite-tab-group.html',\n  styleUrls: ['../lite-styles.scss']\n})\nexport class LiteTabGroup implements AfterViewInit, OnDestroy {\n  @ContentChildren(LiteTabContent) tabContents!: QueryList<LiteTabContent>;\n  @ViewChild('tabWrapper') tabWrapper?: ElementRef<HTMLDivElement>;\n  tabs = input.required<LiteTabItem[]>();\n  activeIndex = input<number>(0);\n  tabChange = output<number>();\n\n\n  // Internal state mirrors activeIndex input to allow local interaction\n  private internalActiveIndex = signal(0);\n  private wrapperWidth = signal(0);\n  private resizeObserver?: ResizeObserver;\n\n  constructor() {\n    effect(() => {\n      // keep internal index in sync with input\n      const idx = this.activeIndex();\n      if (typeof idx === 'number') {\n        this.internalActiveIndex.set(idx);\n      }\n    });\n\n    // Re-measure when tab labels array changes (e.g., count or visibility changes)\n    effect(() => {\n      // Access length to create dependency\n      const _len = this.tabs()?.length ?? 0;\n      // Schedule measure next tick (layout stable)\n      queueMicrotask(() => this.measure());\n    });\n  }\n\n  ngAfterViewInit(): void {\n    this.measure();\n    queueMicrotask(() => this.measure());\n\n    // Observe wrapper size changes\n    const el = this.tabWrapper?.nativeElement;\n    if (el && 'ResizeObserver' in window) {\n      this.resizeObserver = new ResizeObserver(() => this.measure());\n      this.resizeObserver.observe(el);\n    }\n\n    // Observe content changes\n    this.tabContents?.changes?.subscribe(() => this.measure());\n  }\n\n  @HostListener('window:resize')\n  onResize(): void {\n    this.measure();\n  }\n\n  private measure(): void {\n    const w = this.tabWrapper?.nativeElement?.clientWidth ?? 0;\n    if (w && w !== this.wrapperWidth()) this.wrapperWidth.set(w);\n  }\n\n  isActive(index: number): boolean {\n    return this.internalActiveIndex() === index;\n  }\n\n  onTabClick(index: number) {\n    if (index === this.internalActiveIndex()) return;\n    this.internalActiveIndex.set(index);\n    this.tabChange.emit(index);\n  }\n\n  currentContent(): string | undefined {\n    const items = this.tabs();\n    const idx = this.internalActiveIndex();\n    return items?.[idx]?.content;\n  }\n\n  getTabTemplate(index: number): TemplateRef<unknown> | null {\n    const contents = this.tabContents?.toArray();\n    return contents?.[index]?.template || null;\n  }\n\n  get activeSlideIndex(): number {\n    return this.internalActiveIndex();\n  }\n\n  get paneWidthPx(): string {\n    return `${this.wrapperWidth()}px`;\n  }\n\n  get tabTransformPx(): string {\n    return `translateX(-${this.internalActiveIndex() * this.wrapperWidth()}px)`;\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n  }\n}\n","<div class=\"lite-tab-group\">\n  <div class=\"tab-header\">\n    @for (tab of tabs(); track $index; let i = $index) {\n      <button class=\"tab-item\" [class.tab-item--active]=\"isActive(i)\" (click)=\"onTabClick(i)\">{{ tab.label }}</button>\n    }\n  </div>\n  <div class=\"tab-content-wrapper\" #tabWrapper>\n    <div class=\"tab-contents\" [style.transform]=\"tabTransformPx\">\n      @for (tab of tabs(); track $index; let i = $index) {\n        <div class=\"tab-content\" [style.flex]=\"'0 0 ' + paneWidthPx\" [style.width]=\"paneWidthPx\">\n          @if (getTabTemplate(i); as template) {\n            <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n          } @else {\n            <div [innerHTML]=\"tab.content\"></div>\n          }\n        </div>\n      }\n    </div>\n  </div>\n</div>\n\n\n","/*\n * Public API Surface of lite-form\n */\n\nexport * from './lib/field-dto';\nexport * from './lib/form-utils';\nexport * from './lib/lite-input/lite-input';\nexport * from './lib/lite-textarea/lite-textarea';\nexport * from './lib/lite-select/lite-select';\nexport * from './lib/lite-multi-select/lite-multi-select';\nexport * from './lib/lite-radio/lite-radio';\nexport * from './lib/lite-checkbox/lite-checkbox';\nexport * from './lib/lite-date/lite-date';\nexport * from './lib/lite-datetime/lite-datetime';\nexport * from './lib/lite-password/lite-password';\nexport * from './lib/lite-file/lite-file';\nexport * from './lib/lite-snackbar/lite-snackbar.service';\nexport * from './lib/lite-paginator/lite-paginator';\nexport * from './lib/lite-table/lite-table';\nexport * from './lib/lite-panel/lite-panel';\nexport * from './lib/lite-loading/lite-loading';\nexport * from './lib/lite-tab-group/lite-tab-group';\nexport * from './lib/lite-tab-content';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}