ngx-lite-form 1.4.8 → 1.4.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"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 hint?: string;\n\n constructor(label: string, formControl: FormControl, rows: number = 2, type: 'text' | 'number' = 'text', hint?: string) {\n this.label = label;\n this.formControl = formControl;\n this.rows = rows;\n this.type = type;\n this.hint = hint;\n }\n}\n\nexport abstract class BaseSelectFieldDto<T = any> {\n label: string;\n options: T[];\n displayWith: (_option: T) => string;\n hint?: string;\n \n constructor(\n label: string,\n options: T[],\n displayWith: (_option: T) => string,\n hint?: string\n ) {\n this.label = label;\n this.options = options;\n this.displayWith = displayWith;\n this.hint = hint;\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 hint?: string\n ) {\n super(label, options, displayWith, hint);\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 hint?: string\n ) {\n super(label, options, displayWith, hint);\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 hint?: string\n ) {\n super(label, options, displayWith, hint);\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 hint?: string;\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 hint?: string\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 this.hint = hint;\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</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\">{{ 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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</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\">{{ 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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\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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"}
1
+ {"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/lib/lite-badge/lite-badge.ts","../../../projects/lite-form/src/lib/lite-badge/lite-badge.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 hint?: string;\n\n constructor(label: string, formControl: FormControl, rows: number = 2, type: 'text' | 'number' = 'text', hint?: string) {\n this.label = label;\n this.formControl = formControl;\n this.rows = rows;\n this.type = type;\n this.hint = hint;\n }\n}\n\nexport abstract class BaseSelectFieldDto<T = any> {\n label: string;\n options: T[];\n displayWith: (_option: T) => string;\n hint?: string;\n \n constructor(\n label: string,\n options: T[],\n displayWith: (_option: T) => string,\n hint?: string\n ) {\n this.label = label;\n this.options = options;\n this.displayWith = displayWith;\n this.hint = hint;\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 hint?: string\n ) {\n super(label, options, displayWith, hint);\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 hint?: string\n ) {\n super(label, options, displayWith, hint);\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 hint?: string\n ) {\n super(label, options, displayWith, hint);\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 hint?: string;\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 hint?: string\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 this.hint = hint;\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\nexport type BadgeVariant = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\nexport type BadgeSize = 'small' | 'medium' | 'large';\n\nexport class BadgeFieldDto {\n label: string;\n variant?: BadgeVariant;\n size?: BadgeSize;\n removable?: boolean;\n icon?: string;\n\n constructor(\n label: string,\n variant: BadgeVariant = 'default',\n size: BadgeSize = 'medium',\n removable: boolean = false,\n icon?: string\n ) {\n this.label = label;\n this.variant = variant;\n this.size = size;\n this.removable = removable;\n this.icon = icon;\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</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\">{{ 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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</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\">{{ 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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\n }\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 @if (control().hint) {\n <div class=\"hint\">{{ control().hint }}</div>\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","import { Component, input, output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BadgeFieldDto } from '../field-dto';\n\n@Component({\n standalone: true,\n imports: [CommonModule],\n selector: 'lite-badge',\n templateUrl: './lite-badge.html',\n styleUrls: ['../lite-styles.scss']\n})\nexport class LiteBadge {\n badge = input.required<BadgeFieldDto>();\n remove = output<void>();\n\n onRemove(event: Event) {\n event.stopPropagation();\n this.remove.emit();\n }\n\n getVariantClass(): string {\n const variant = this.badge().variant || 'default';\n return `badge-${variant}`;\n }\n\n getSizeClass(): string {\n const size = this.badge().size || 'medium';\n return `badge-${size}`;\n }\n}\n","<div class=\"lite-badge\" [ngClass]=\"[getVariantClass(), getSizeClass(), badge().removable ? 'badge-removable' : '']\">\n @if (badge().icon) {\n <span class=\"badge-icon\" [innerHTML]=\"badge().icon\"></span>\n }\n <span class=\"badge-label\">{{ badge().label }}</span>\n @if (badge().removable) {\n <button type=\"button\" class=\"badge-remove\" (click)=\"onRemove($event)\" [attr.aria-label]=\"'Remove ' + badge().label\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\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 }\n</div>\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';\nexport * from './lib/lite-badge/lite-badge';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}